Skip to content

fix(plugin-grid,plugin-kanban): publish the stylesheet their themed utilities need - #6403

Merged
os-support-ai merged 4 commits into
mainfrom
claude/issue-4929-plugin-published-stylesheets
Aug 25, 2026
Merged

fix(plugin-grid,plugin-kanban): publish the stylesheet their themed utilities need#6403
os-support-ai merged 4 commits into
mainfrom
claude/issue-4929-plugin-published-stylesheets

Conversation

@claude

@claude claude Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Fixes #4929

Maintainer ruling 2026-08-17, Direction 1: each of the two plugins with measured classes gains the scripts/build-css.mjs step and a "./style.css": "./dist/index.css" export, built in the subtraction shape @object-ui/fields established (objectui#4059).

What was broken

@object-ui/components and @object-ui/fields were the only packages shipping CSS, and each scans its own src only — so a class used exclusively by a plugin could not appear in either sheet by construction. A published-state Vite app that installed @object-ui/plugin-grid / plugin-kanban and followed the quick-start rendered the grid or the board with themed utilities that had no producer anywhere in the world: they resolve @theme tokens declared in packages/components/src/index.css, which that package does not publish.

Re-derived measurement — the card's numbers vs this tree

The card measured at 40d3a3318 by literal grep over source. I re-derived on the merged tree by compiling each package's entry and diffing the emitted classes against both published sheets, which is the same question asked of the artifact rather than of string literals.

card (40d3a3318, grep) this branch (compiled diff)
themed, plugin-only 21 25
plain, plugin-only ~140 103
split not given grid 7 themed / 76 plain · kanban 19 themed / 28 plain (2 classes shared)

All 21 of the card's themed utilities still hold — each is used by one of the two plugins and is in neither published sheet. Four more turned up that a literal grep cannot see: [&>h3]:text-foreground/80 (arbitrary variant), border-l-primary/40, border-primary/30, hover:text-primary. The plain count is lower than the card's because the two methods count different things: a compiled diff drops literals that never resolve to a rule and dedupes variants, and it credits the base sheets with every class they actually emit rather than with the strings that happen to appear in their source. The premise is intact — the themed count is 25, not zero.

The shape, and the division of labour between its two halves

Each package gains src/index.css, which @references the components entry — theme tokens, the class-based dark variant and the tailwindcss-animate plugin become available for resolution while emitting nothing — and scripts/build-css.mjs, which subtracts every rule components' built sheet already ships.

package compiled entry published sheet rules kept dropped
plugin-grid 171.7 kB 16.30 kB 128 rules / 126 classes 1356 rules + 75 at-rules
plugin-kanban 164.2 kB 11.41 kB 52 rules / 50 classes 1356 rules + 75 at-rules

The build step is sharedscripts/build-plugin-stylesheet.mjs at the repo root, with a thin per-package wrapper holding only that package's sentinels and ceiling — because the ruling says the step is "the pattern any future plugin inherits", and a pattern that has to be copy-pasted is not inherited. Repo-root modules imported by a package's build are existing practice here (scripts/vite-dts-*.ts). postcss / @tailwindcss/postcss are injected by the wrapper rather than imported at the root, so each package declares exactly what it imports.

packages/fields/scripts/build-css.mjs is deliberately left alone: rewriting a published package's build belongs in its own change with its own byte-for-byte verification. Filed as #6405.

Tests, and the ghost-assertion guard

scripts/__tests__/plugin-published-stylesheet.test.ts — 14 assertions, node project, ~2.6 s. It compiles rather than reading dist/, because CI runs the suite on an unbuilt worktree; a test that read the artifact would pass vacuously or skip.

Against unmodified origin/main (faa863dce), the test file copied into a clean worktree:

FAIL scripts/__tests__/plugin-published-stylesheet.test.ts
Error: Cannot find module '../../packages/plugin-grid/scripts/build-css.mjs'
Test Files  1 failed (1)      exit 1

That is the defect itself — on main there is no build step and no sheet to assert about. Because an import-level failure proves only that the subject is absent, every assertion group was then driven red individually by mutating the fix on this branch. Baseline first, then one leg per group; each mutation was proved on disk by grep count and blob hash, and each restore by git checkout HEAD -- on the path plus a byte-identical hash and a clean git diff HEAD:

leg mutation reading
baseline none 14 passed, exit 0
themed drop @reference + empty the builder's own MUST_SURVIVE 4 failed — card coverage, themed emitted, theme-token resolution, control
subtraction subtraction skips rules whose selector contains flex 2 failed — the degenerate control, in both packages
export remove "./style.css" from plugin-grid/package.json 1 failed — "declares the export AND the step that produces it"
source-none drop source(none) from the grid entry 1 failed — "compiles the same bytes from any working directory"
theme-leak inject a :root { --color-ghost-4929 } block into the grid entry 1 failed — "carries utilities only, no preflight, no theme block"
reference (builder guard) drop @reference only build throws: "removed 3 utility(ies) that only this build can produce"

Degenerate control. flex, text-sm, rounded-md, bg-background, sr-only are all carried by components' sheet. The test asserts each is present in the plugin's pre-subtraction compile and absent from the published sheet — so the absence cannot be explained by the plugin never using the class, and "the sheet has the class" cannot pass for the subtraction working. Under the subtraction mutation this is exactly what goes red: expected [ 'flex' ] to deeply equal [].

One honest negative result. A sixth leg — swapping the narrow entry for a plain @import 'tailwindcss' — left the suite green. That is not a ghost: the subtraction removes the duplicated preflight and theme too, and the published artifact comes out the same size (11.26 kB vs 11.41 kB). The narrow entry stays because it makes a :root theme block impossible to emit at all, and such a block loaded after the base sheet would override a consumer's own token overrides. The in-source comments originally claimed the wide entry would ship ~170 kB of duplication; that claim was measured, found false, and corrected in commit 2 rather than left standing.

An earlier run of this same matrix was thrown away: every leg exited 1 through --reporter=basic, which vitest 4 does not have, so the whole matrix had measured nothing while reading as five confirmations. The table above is from the re-run, and the baseline row exists so a non-zero exit means an assertion.

CI came back red three times on the first push (372bb5d61) — what changed

All three were this PR's own, all three in code this PR adds, and all three point the same way as the card itself: a build step nobody hashes, or one that silently decides not to run, is the stale-or-absent stylesheet #4929 is about. Each was reproduced locally, fixed, and shown green before this second push.

1. Lintcheck:entry-guard. scripts/build-plugin-stylesheet.mjs hand-typed its own entry guard (process.argv[1], twice in one expression — hence the gate's two reports at one line). Node leaves argv[1] as the caller typed it, so a script reached through a symlink compares two different paths, answers false and does nothing, with exit 0 and no output — a silent no-op build step. Both wrappers now call isEntrypoint(import.meta.url) from scripts/invoked-as.mjs, the one predicate in this tree, and the shared module carries no guard at all. KNOWN_HAND_TYPED_GUARDS is untouched; it is shrink-only.

The guard was then checked in both directions rather than inferred, because its failure mode is invisible. With both dist/index.css deleted: importing the wrappers (the whole test suite does) leaves them absent, and turbo run build recreates them at 16696 and 11684 bytes.

2. Test (shard 1/4)turbo-build-inputs. The two build programs read scripts/build-plugin-stylesheet.mjs — and, after fix 1, scripts/invoked-as.mjs — from outside their package directories, which turbo was not hashing; it would replay a stale verdict and hand a stale dist/ to everything downstream. Both paths are now in turbo.json's build inputs, which tightens the cache key. Derived, not guessed: dropping either line reds the gate naming that exact path.

3. Test (shard 4/4)package-files-exist, the exports-surface discovery pin. This one moves a pin, so it carries its three parts.

Old value, verbatim:

expect(generatedCssExports.map((e) => e.pkg.name).sort()).toEqual(['@object-ui/components', '@object-ui/fields']);

New value, verbatim:

expect(generatedCssExports.map((e) => e.pkg.name).sort()).toEqual([
  '@object-ui/components',
  '@object-ui/fields',
  '@object-ui/plugin-grid',
  '@object-ui/plugin-kanban',
]);

The clause that moves it — the maintainer ruling of 2026-08-17 on #4929:

Ruled: Direction 1 — every @object-ui/plugin-* ships its own stylesheet. [...] Scope today: plugin-grid + plugin-kanban (the two with measured classes); the build step is the pattern any future plugin inherits.

The list grew because the ruling grew the capability, not because it was in the way: it is a discovery assertion ("guard cannot pass by finding nothing"), so it records which packages ship a generated CSS export, and leaving it at two would make the guard assert a world that no longer exists. The comment beside it now carries all three parts plus the direction that still means a defect — shrinking this list means a package stopped producing a sheet it still promises, which is objectui#4059 returning.

Verification, all at 820631805 (the pushed HEAD)

run verdict
turbo run build --filter=plugin-grid --filter=plugin-kanban, both sheets deleted first 15/15 tasks; ✓ built dist/index.css (16.30 kB) / (11.41 kB), files back on disk
vitest run packages/plugin-grid packages/plugin-kanban scripts/__tests__ 188 files, 3245 tests passed
pnpm lint (full turbo lint, 47 tasks) plus lint:root and both packages' lint 0 errors (pre-existing warnings only)
type-check:scripts, plugin-grid+plugin-kanban type-check exit 0; --listFiles confirms all four new files are in the scripts program
check:entry-guard (--self-test and the real run) · check:control-bytes · check:doc-fences · check:doc-types · check:phantom-deps · docs:check-links · changeset:check · lint:coverage · type-check:coverage · check-changeset-presence · check-cross-repo-closer-outcome all exit 0

Not measured locally, named rather than glossed: check:doc-snippets exits 2, PRECONDITION NOT MET — it needs most packages built, which this worktree is not; it says nothing either way and CI runs it. check:readme-exports fails on an unbuilt worktree for ~20 other packages ("type entry not on disk — run pnpm build first") with zero findings against the two packages touched here.

Docs

The one-line import per plugin is added to the quick-start, theming, troubleshooting and plugins guides, to both plugin pages and to both package READMEs. The objectui#4858 correction — do not scan node_modules, do not hand-declare @theme — is untouched and stays true: it now holds for plugins too, because the sheets exist. Every doc addition says explicitly that only these two plugin packages publish a sheet, so nobody imports a subpath that is not there.

Reported, not fixed here

⛔ Draft on purpose — the PM lands it.


Generated by Claude Code


Generated by Claude Code

claude added 3 commits August 25, 2026 20:13
…tilities need

Only @object-ui/components and @object-ui/fields shipped CSS, and each scans its
own `src` only, so a class used exclusively by a plugin could not appear in
either sheet by construction. A published-state app that installed one of these
two plugins and followed the quick-start rendered the grid or the board with 25
themed utilities that had no source anywhere — `bg-muted/10`, `bg-card/60`,
`text-muted-foreground/60` and friends — plus ~103 plain ones.

Each package now gains `src/index.css` and `scripts/build-css.mjs`, plus a
`"./style.css": "./dist/index.css"` export, built in the subtraction shape
@object-ui/fields established: `@reference` the components entry so the
compilation gets its theme tokens, class-based `dark` variant and animate plugin
without emitting a byte of them, then subtract every rule that package's
published sheet already ships. 16.30 kB and 11.41 kB rather than ~170 kB each.

The build step is shared (scripts/build-plugin-stylesheet.mjs) so the next
plugin inherits the pattern instead of copying it, and it refuses to write a
sheet that fails any of its four assertions.

objectui#4929, maintainer ruling 2026-08-17 (Direction 1).
…tion run disproved

The entry headers said a plain `@import 'tailwindcss'` entry "would re-emit
preflight, the theme and the ~1350 utilities the consumer already got". Measured
on the sibling plugin, it does not: the subtraction removes those too, and the
published artifact comes out the same size (11.26 kB vs 11.41 kB).

The narrow entry is still the shape we use, for the reason that survives the
measurement — it makes a `:root` theme block impossible to emit at all, and such
a block loaded after the base sheet would override a consumer's own token
overrides. The comments now say that instead of the claim that is not true.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3230.7 KB 3266.6 KB
Main entry chunk (gzip) 156.1 KB 350 KB
Entry file index-9yiiG-P-.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 11.30KB 4.28KB
app-shell (runtime-config.js) 18.10KB 6.51KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 505.84KB 114.57KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.18KB 47.97KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.55KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.66KB 12.84KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.46KB 34.48KB
plugin-designer (index.js) 211.95KB 42.75KB
plugin-detail (index.js) 245.10KB 62.31KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.05KB 31.92KB
plugin-gantt (index.js) 164.14KB 39.87KB
plugin-grid (index.js) 201.79KB 54.60KB
plugin-kanban (index.js) 52.87KB 14.57KB
plugin-list (index.js) 112.63KB 27.45KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.70KB 7.69KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.55KB 20.74KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 54.84KB 18.43KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.35KB 0.70KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…and hash it

Three gates on the first push, all of them about the new build step and all of
them pointing the same way — a build step nobody hashes, or one that silently
decides not to run, is the stale-or-absent stylesheet this card is about.

1. `check:entry-guard` — `scripts/build-plugin-stylesheet.mjs` hand-typed its
   own `process.argv[1]` entry guard. Node leaves `argv[1]` as the caller typed
   it, so a script reached through a symlink compares two different paths,
   answers false and does nothing with exit 0. Both wrappers now call
   `isEntrypoint(import.meta.url)` from `scripts/invoked-as.mjs`, the one
   predicate in this tree, and the shared module no longer carries a guard.
   `KNOWN_HAND_TYPED_GUARDS` untouched — it is shrink-only.

2. `scripts/__tests__/turbo-build-inputs.test.ts` — the two plugins' build
   programs read `scripts/build-plugin-stylesheet.mjs` and, after fix 1,
   `scripts/invoked-as.mjs` from outside their package directories, which turbo
   was not hashing. Both are added to `turbo.json`'s `build` inputs, which
   tightens the cache key. Verified derived rather than guessed: dropping either
   line reds the gate with that exact path named.

3. `scripts/__tests__/package-files-exist.test.ts` — the exports-surface
   discovery pin listed the two packages that ship a generated `style.css`. It
   now lists four. That list records reality and grew because the capability
   grew (maintainer ruling 2026-08-17 on objectui#4929, Direction 1, scoped to
   plugin-grid + plugin-kanban); the comment beside it carries the old value,
   the clause that moved it, and the direction that still means a defect.

Behaviour of the guard checked in both directions rather than inferred: with
both `dist/index.css` deleted, importing the wrappers (the test suite) leaves
them absent, and `turbo run build` recreates them at 16696 and 11684 bytes.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3230.7 KB 3266.6 KB
Main entry chunk (gzip) 156.1 KB 350 KB
Entry file index-9yiiG-P-.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 11.30KB 4.28KB
app-shell (runtime-config.js) 18.10KB 6.51KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 505.84KB 114.57KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.18KB 47.97KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.55KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.66KB 12.84KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.46KB 34.48KB
plugin-designer (index.js) 211.95KB 42.75KB
plugin-detail (index.js) 245.10KB 62.31KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.05KB 31.92KB
plugin-gantt (index.js) 164.14KB 39.87KB
plugin-grid (index.js) 201.79KB 54.60KB
plugin-kanban (index.js) 52.87KB 14.57KB
plugin-list (index.js) 112.63KB 27.45KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.49KB 11.93KB
plugin-timeline (index.js) 26.70KB 7.69KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.55KB 20.74KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 54.84KB 18.43KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.35KB 0.70KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-support-ai
os-support-ai marked this pull request as ready for review August 25, 2026 20:57
@os-support-ai
os-support-ai added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 062943f Aug 25, 2026
28 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-4929-plugin-published-stylesheets branch August 25, 2026 21:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

发布态消费者渲染插件组件没有样式路径:插件包不发 style.css,两张已发布表也不含插件的 21 个主题化 utility

2 participants