Skip to content

fix(plugin-calendar): the refusal screen names a remedy both doors can act on (objectui#8170) - #10029

Merged
os-tesla merged 1 commit into
mainfrom
claude/issue-8170-calendar-refusal-door-aware
Sep 19, 2026
Merged

os-tesla merged 1 commit into
mainfrom
claude/issue-8170-calendar-refusal-door-aware

Conversation

@os-tesla

Copy link
Copy Markdown
Collaborator

Fixes #8170

ObjectCalendar's unconfigured-view refusal screen used to read:

Calendar configuration required. Please specify startDateField and titleField.

The first clause was right. The second was wrong twice — it demanded an optional key, and it
named keys without saying where they go, which is unactionable on the interface-page door. It
now reads:

Calendar configuration required. Please specify startDateField, the calendar's one required
key; the event title resolves without titleField.

It belongs on the view's calendar block. An interface page has no calendar slot of its own:
point its sourceView at a view that declares one.

The three spec legs, re-measured in this worktree

Installed artifact is @objectstack/spec 17.4.0, not the 17.3.0 the card's comment measured.
Run from the worktree root, importing CalendarConfigSchema from @objectstack/spec/ui (the
package root does not export it):

installed @objectstack/spec: 17.4.0
safeParse({})                      -> invalid_type @ [startDateField]
safeParse({ titleField: 't' })     -> invalid_type @ [startDateField]
safeParse({ startDateField: 'd' }) -> CLEAN
positive control {startDateField,bogusKey} -> unrecognized_keys @ []

Identical to the card's 17.3.0 reading, one version later. The declared shape is a strict object
of startDateField (required) plus optional endDateField / titleField / colorField, and the
spec's own note on that schema names this renderer as the reason titleField is optional:
resolveTitle takes an explicit key when present and otherwise resolves through the ADR-0079
record display-name chain.

Fact number 1 reproduces — with one number corrected

configRequired and configurationRequired are zero in packages/i18n/src/locales/en.ts, and
the sentence sits in the JSX as plain text. Confirmed.

The companion number does not survive. A naive grep -c for useObjectTranslation or a t( call
returns 15 lines, but that pattern also matches const t = def.type; and every ordinary call
whose name ends in t( such as handleDateClickDefault(. The real i18n census of that file is
three translated strings — two through useSafeTranslate (errors.unauthorized,
table.saveFailed) and one through useObjectTranslation (calendar.unscheduled) — plus the two
hook imports and the two hook calls. The conclusion still holds: the component is i18n-aware
elsewhere and this one string is not. That is a separate, separable defect and it is
deliberately NOT fixed here; see Acceptance notes.

The design question this card decides

The card offered three shapes. All three were measured and all three are refused, on measurement
rather than on convenience.

Passed as a prop — out of fence, by measurement. Two producers emit an object-calendar node:
the calendar branch of plugin-list's ListView, and the one in plugin-view's ObjectView.
app-shell reaches the first from BOTH InterfaceListPage (the interface-page door) and its own
ObjectView (the object-view door). A door prop therefore has to be declared on the node's
published schema and threaded through four packages, three of which this card's fence excludes.

Inferred from the schema — nothing to infer from. Every one of those producers hands this
component the same shared baseProps bag (objectName, fields, filter, sort, className, showSearch,
onRowClick, rowHeight, hideRowHeightToggle, and the two optional column-state keys) plus whichever
of startDateField / endDateField / titleField the author declared. Nothing on the node names
the door. Inference is unavailable until the marker exists, which collapses into the prop option.

There is a tempting near-miss: ask whether the object carries a date field, since
InterfaceListPage.defaultCalendarFromObject derives a binding from the first one it finds, so
this screen is only reachable on that door when the derivation came back empty. That is a
correlation, not an identity — the deriver only runs when calendar is whitelisted in
appearance.allowedVisualizations — and pinning user-facing copy to a predicate that lives in
another package is the "the gate and the seam must answer one question" failure this repo has
already recorded on map, chart and kanban.

Split into two keys — the premise is false. That shape presupposes a locale key. Fact number 1
measures a hard-coded English literal with no key behind it. There are no keys to split.

So the copy is door-COMPLETE rather than door-AWARE: it names the one place every door reads
the binding from — the view's calendar block — and then states the page door's indirection
outright, because that door genuinely has no slot. Measured: InterfaceListPage reads columns,
sort, filterBy, userFilters, appearance, addRecord, userActions, showRecordCount,
source, sourceView, buttons and recordAction off interfaceConfig, and no calendar key at
all (occurrences of cfg.calendar = 0; positive control cfg.columns = 1).

This is an implementation shape, not a product-semantics fork, so the card's stop-and-report clause
did not fire. The user-visible outcome is the same on both doors: an author is told the one key to
write and where it lives.

Every quoter of the sentence, and what happened to each

Eight files quote it. The fence admits four of them.

Changed, in fence:

  • ObjectCalendar.tsx — the literal itself, plus the retirement note on getCalendarConfig whose
    citation is now clipped to the surviving clause with the reason kept.
  • ObjectCalendar.unconfiguredRefusal-7029.test.tsx — header citation clipped; its statement that
    the objectui#7029 card did not redesign the screen is kept and annotated.
  • ObjectCalendar.filterIsNotAConfigSlot-7711.test.tsx — same treatment.
  • packages/plugin-calendar/README.md — its quote was already clipped to the surviving clause, so
    nothing went stale; a paragraph documenting the new remedy was added.

Reported, not touched — each is outside the declared file surface, and each is listed in the
report so the seat can decide:

  • packages/types/src/zod/objectql.zod.ts — the dateField alias tombstone's binding consequence
    string quotes the sentence verbatim in a user-facing authoring diagnostic. Its load-bearing
    claim ("a screen that names the canonical keys and never the key you wrote") survives this change;
    only the illustrative quote drifts. Its pin asserts on the first clause only, so it stays green.
  • packages/app-shell/src/views/ObjectView.tsx and its ObjectView.calendarBinding-7029.test.tsx
    comment citations only. That test reads ObjectView.tsx from disk, not this file, so it is
    unaffected.
  • .changeset/7711-calendar-filter-is-not-a-config-slot.md — a pending release note quoting the
    sentence verbatim. It publishes into the CHANGELOG at the next release and will then describe a
    screen that never shipped that way. .changeset/8355-... quotes the first clause only and stays
    true.

Three more suites pin the screen with the first clause only and are unaffected:
calendarUnionReads-8651.test.tsx, calendar-date-alias-refusal-8355.test.ts, and the two REFUSAL
matchers already listed. Not one pin was deleted.

Control reading — the new pin fails against today's wording

The fix was committed first, then the refusal block was reverted to the pre-card wording on disk,
with the mutation proved by occurrence count before the run and the restore proved by blob hash
afterwards. No build or dist is involved: the test imports the component by relative path inside
its own package.

HEAD blob  = 1a357226dc13b0ca115071eb45bf2ce7e3aaa7b4
injected old sentence  count = 1
removed  new remedy    count = 0
on-disk hash now       = 13fd0e7e17bb69100d994d098544030b6f273703

ABLATION command-exit = 1
  Tests  3 failed | 3 passed (6)
    FAIL  ... no longer demands `titleField` alongside the date key
          expected ... not to match /startDateField\s+and\s+titleField/i
    FAIL  ... names a remedy the INTERFACE-PAGE door can actually act on
          expected ... to contain 'sourceView'
    FAIL  ... names the place the OBJECT-VIEW door writes the binding
          expected ... to match /calendar block/i

RESTORE: on-disk hash = 1a357226dc13b0ca115071eb45bf2ce7e3aaa7b4
RESTORE: 'git diff HEAD' for the path -> EMPTY

Against the new wording the same file is Tests 6 passed (6), exit 0. The asymmetry is the point:
the three cases that move are exactly the three clauses this card adds, and the three that hold in
both worlds are the unchanged first clause plus the two render controls — so a change that simply
refused everything would not pass this file.

The strongest of those controls is the one that makes the screen's new promise checkable: a
calendar with a date binding and no titleField renders real record titles through the ADR-0079
chain. If that ever regresses, the sentence on the refusal screen becomes a lie and the case says so.

Validation

All commands run from the worktree root, exit codes captured before any pipe.

what reading
dependency closure build, --filter '@object-ui/plugin-calendar^...' VERDICT command-exit 0 (under the shared verify lock)
pnpm exec vitest run packages/plugin-calendar/ Test Files 38 passed (38), Tests 283 passed (283)
pnpm --filter @object-ui/plugin-calendar type-check command-exit 0; --listFiles confirms the new test is inside the program (1 hit, positive control 1, negative control 0)
control-bytes, changeset-claims, changeset-presence, changeset-no-major, new-line-citations, doc-fences, doc-example-ids, doc-types, test-path-roots, vi-mock-specifiers, pending-changeset-literals, comment-mask-corpus, i18n-keys, i18n-dead-keys, registry-bare-names, element-data-source-declaration, unreferenced-sources, doc-example-readers exit 0, all
check:doc-snippets, check:doc-examples exit 2 = PRECONDITION NOT MET, the gate's own words: it needs 34 packages built. After building @object-ui/plugin-calendar itself, this package produces zero findings; the rest is a whole-tree build and belongs to CI
check:readme-exports exit 1 with "the population COLLAPSED — this run proves nothing" for the same reason. After building this package, its README produces zero findings
check:sdui-registration-pins exit 2 = PRECONDITION NOT MET, needs an apps/console bundle. This diff does not touch packages/plugin-calendar/src/index.tsx at all
eslint, --no-inline-config, on the four changed source files command-exit 0, 4 files linted, 0 errors, 52 warnings — every one pre-existing no-explicit-any / react-hooks noise of the same kind the sibling tests already carry

The eslint run is a declared narrowing, and here is why it is a measurement rather than a
shortcut. The judged population comes from eslint.config.js itself, which declares no
parserOptions.project and no projectService (grep exit 1, positive control exit 0) — type-aware
linting is off. The file count, 4, is read from the --format json output, not estimated. And with
no type-aware linting, a file's verdict is a function of that file's own bytes plus the shared
config; this diff moves neither for any untouched file, so it cannot change an untouched file's
verdict. The repo-wide pnpm lint is CI's run.

Acceptance notes

Findings met along the way, none of them fixed here.

  1. A shipped un-localized user-visible string. This refusal screen is a hard-coded English
    literal in a component that translates three other strings. Adding a key would need no locale
    pack, because useSafeTranslate carries the English fallback — but it is a second, separable
    defect and the dispatching seat reserved the call.
  2. A pending release note will publish a quote of a screen that never shipped.
    .changeset/7711-calendar-filter-is-not-a-config-slot.md quotes the retired sentence verbatim.
  3. A user-facing authoring diagnostic quotes the retired sentence verbatim. The dateField
    alias tombstone's binding consequence string in packages/types/src/zod/objectql.zod.ts.
  4. Noted, not filed: two comment-only citations in app-shell, both of which merely quote the
    retired clause and neither of which any instrument reads.

Session: session_018HrVaotisyhgmot9o2MLRq.


Generated by Claude Code

…n act on

`ObjectCalendar`'s unconfigured-view screen read "Calendar configuration
required. Please specify startDateField and titleField." The first clause was
right and is unchanged; the second was wrong twice.

It demanded an optional key. `@objectstack/spec`'s `CalendarConfigSchema` is a
strict object whose one required key is `startDateField` — re-measured on the
installed 17.4.0, three legs: `{}` and `{ titleField: 't' }` both fail
`invalid_type` at `startDateField`, `{ startDateField: 'd' }` parses clean. The
spec's own note on that schema names this renderer as the reason: `resolveTitle`
takes an explicit `titleField` when present and otherwise resolves through the
ADR-0079 display-name chain.

And it named keys without saying where they go, which is unactionable on the
interface-page door: that surface's `interfaceConfig` carries no calendar key at
all, so its only lever is `sourceView` — which the screen never mentioned.

The copy is door-COMPLETE rather than door-AWARE, and that is measured rather
than chosen for convenience. Two producers emit an `object-calendar` node (the
calendar branches of `plugin-list`'s `ListView` and `plugin-view`'s
`ObjectView`), reached from both app-shell faces, and every one hands this
component the same `baseProps` bag plus the declared binding keys — nothing on
the node names the door. A door prop would have to be declared on the published
node schema and threaded through four packages; inferring the door from the
object's date fields only correlates with it, because `InterfaceListPage`'s
deriver runs solely when `calendar` is whitelisted.

The first clause is untouched on purpose: five suites pin this screen with
`/Calendar configuration required/i` and `@object-ui/types`' alias tombstones
assert on the same phrase. Citations of the retired second clause inside this
package are clipped to the surviving clause rather than deleted.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin tests labels Sep 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 5 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/7313-object-calendar-record-source.md

  • names plugin-calendar/src/ObjectCalendar.tsxpackages/plugin-calendar/src/ObjectCalendar.tsx — edited by this change

    ObjectCalendar resolves its records through the shared ladder (resolveRecordSourceConfig in @object-ui/core, called from plugin-calendar/src/ObjectCalendar.tsx): data first, then staticData, then objectName. The published TypeScript interface REQUIRED objectName and declared neither data nor staticData; the published Zod mirror did the same. So an object-calendar node authored on staticData — the route the plugin page documents twice — rendered correctly and was refused by safeValidateSchema, and could not be annotated with its own type (TS2741: Property 'objectName' is missing).

.changeset/7712-kanban-calendar-filter-input.md

  • names ObjectCalendar.tsxpackages/plugin-calendar/src/ObjectCalendar.tsx — edited by this change

    ObjectKanban.tsx sends the authored key to the query as $filter: schema.filter and ObjectCalendar.tsx does the same, and @objectstack/spec's ComponentPropsMap declares filter on both blocks (measured: safeParse accepts it, and refuses an undeclared key by name on the same call). But none of the four registrations that publish those two renderers listed filter in inputs, and sdui-parser's validateTree reports unknown-prop for every key no inputs entry claims. So an author writing the one spelling that WORKS was told it was unknown — objectui#6678's shape, where a correct write draws the same diagnostic as a write that does nothing. That is worse than an inert key: it actively punishes the correct behaviour, and the honest response to it is to delete working metadata.

.changeset/8171-calendar-sort-input.md

  • names ObjectCalendar.tsxpackages/plugin-calendar/src/ObjectCalendar.tsx — edited by this change

    objectui#7712's defect, one key over. ObjectCalendar.tsx lowers the authored key onto its own query as $orderby: convertSortToQueryParams(schema.sort), and @objectstack/spec's ComponentPropsMap['object-calendar'] declares sort (measured on 17.2.0: safeParse({ objectName, sort }) returns success: true, while the same strict schema on the same call refuses bogusProp by name — that control is what makes the acceptance a verdict). But neither of the two registrations that publish this renderer — plugin-calendar:object-calendar and view:calendar — listed sort in inputs, and sdui-parser's validateTree reports unknown-prop for every key no inputs entry claims. So an author writing the one spelling that WORKS was told it was unknown — objectui#6678's shape, where a correct write draws the same diagnostic as a write that does nothing.

.changeset/8174-kanban-calendar-filter-sort.md

  • names ObjectCalendar.tsxpackages/plugin-calendar/src/ObjectCalendar.tsx — edited by this change

    filter had four declaration faces and only three of them named it: @objectstack/spec declares it (ComponentPropsMap['object-kanban'] and ['object-calendar']), both plugins' registration inputs publish it, and both renderers read it — ObjectKanban.tsx lowers schema.filter onto $filter, ObjectCalendar.tsx lowers schema.filter onto $filter and schema.sort onto $orderby through convertSortToQueryParams. This package's own published faces (the TypeScript interface and its zod mirror) named none of them, so an authored value reached the renderer only through BaseSchema's index signature and the mirror's .passthrough() — admitted, never examined. That is the same reasoning finding(types,plugin-kanban): ObjectKanbanSchema requires groupField (zero read sites) and declares neither groupBy nor limit — no working object-kanban node is assignable to any declared type #7322 used to move groupBy and limit into this same interface.

.changeset/8466-calendar-color-allday-fields.md

  • names ObjectCalendar.tsxpackages/plugin-calendar/src/ObjectCalendar.tsx — edited by this change

    ObjectCalendar.tsx's getCalendarConfig reads FIVE flat keys off the node, and packages/plugin-calendar/README.md teaches all five in one sentence — "point titleField / startDateField / endDateField / allDayField / colorField at your own fields when they differ." Only three of the five were declared. The other two reached the renderer through BaseSchema's [key: string]: any on the TypeScript face and its .passthrough() on the zod mirror: admitted, never examined. A misspelling therefore left the calendar silently colourless while every published gate passed.

  • names packages/plugin-calendar/README.mdpackages/plugin-calendar/README.md — edited by this change

    ObjectCalendar.tsx's getCalendarConfig reads FIVE flat keys off the node, and packages/plugin-calendar/README.md teaches all five in one sentence — "point titleField / startDateField / endDateField / allDayField / colorField at your own fields when they differ." Only three of the five were declared. The other two reached the renderer through BaseSchema's [key: string]: any on the TypeScript face and its .passthrough() on the zod mirror: admitted, never examined. A misspelling therefore left the calendar silently colourless while every published gate passed.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 79ac2d632 (merge-base with origin/main): 5 file(s) changed outside .changeset/, read against 1214 pending declaration(s) that publish a body (1773 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3056.4 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-C366c8_4.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) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
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) 11.08KB 4.58KB
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) 545.92KB 130.72KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 216.90KB 60.15KB
fields (index.js) 249.62KB 63.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
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.99KB 0.87KB
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 (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 50.26KB 14.36KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 198.20KB 47.14KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 255.18KB 66.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 139.56KB 35.40KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 213.44KB 58.21KB
plugin-kanban (index.js) 48.71KB 15.17KB
plugin-list (index.js) 113.55KB 27.99KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.18KB 21.05KB
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) 109.04KB 36.08KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 15.71KB 5.30KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
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.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The calendar refusal screen names keys an interface page cannot author — reword it for the page door (objectui#7547's highest-value remaining piece)

2 participants