Skip to content

fix(detail): a credential field is never inline-editable on the record page - #4228

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-4221-inline-credential-gate
Aug 11, 2026
Merged

fix(detail): a credential field is never inline-editable on the record page#4228
yinlianghui merged 2 commits into
mainfrom
claude/issue-4221-inline-credential-gate

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#4221

A password or secret field on the record detail page is no longer inline-editable: no pencil, no double-click affordance, no editor — on both hosts (the DetailSection body row and the HeaderHighlight strip).

The defect, as measured

InlineFieldInput has no branch for either type, so both reached the terminal raw text input at the end of the component. The hosts' editability gate excluded only readonly / computed / system fields, so nothing held a credential row back.

Both types are masked on readgetCellRenderer returns a fixed bullet run for password and secret alike — so the value the row could hand an editor was never the credential. It was whatever the payload carries: a server-side mask, or, for secret, an opaque reference into an encrypted store (ADR-0100). That placeholder was seeded into a plain input[type="text"], rendered in clear, selectable and copyable, in a control the user reads as holding their credential; committing the row wrote it back verbatim over the field.

Reverting only the two host gates on this branch reproduces it exactly (27 tests red), and the assertion output is the defect itself:

FAIL DetailSection — a credential field offers no inline editor (#4221)
produces no editor for a `password` even with the section in edit mode
AssertionError: expected input …(3) /input to be null
+ Received:
type="text"
value="••••••"
FAIL HeaderHighlight — a credential highlight offers no inline editor (#4221)
produces no editor for a `secret` even inside the edit session
+ Received:
type="text"
value="sec_ref_9f2a41"

One refinement to the issue's wording, since it is load-bearing for how bad this is: the editor is not seeded from the mask renderer — it is seeded from the row's payload value. The mask renderer ignores its value entirely. So the box shows whatever the API actually sent for that field, and the write-back destroys it. For secret that is the ADR-0100 reference, i.e. the pointer into the encrypted store, not merely a displayed value.

The fix

The decision was already written down one package over. INLINE_EXCLUDED_FIELD_TYPES in @object-ui/fields excludes both types with exactly this reasoning, and the grid honours it through isInlineExcludedFieldType() (plugin-grid/src/inline-edit-options.ts). Both detail hosts now consult that same alias-aware contract via a new isInlineExcludedDetailFieldType() in fieldEnrichment.ts — the module the two gates already share — instead of growing a second hand-maintained list.

No export had to be added: packages/fields/src/index.tsx already does export * from './FieldEditWidget', which is how plugin-grid imports the helper today. packages/fields is untouched, so the changeset is @object-ui/plugin-detail alone.

The helper is a narrow-only union of the authored view type and the object type, matching isComputedFieldType under objectui#3355: an authored display type can lock a field but never unlock one. An image authored over an object secret stays locked, because the exemption below is consulted per type, before the union.

Blast radius of the consultation

Every member of INLINE_EXCLUDED_FIELD_TYPES, plus the spec spellings that resolve into it through the form alias table. "Before" is measured on this branch with the gates reverted, not inferred.

TypeResolves toDetail beforeDetail afterWhy
passworditselfeditableexcludedmasked on read; the card
secretitselfeditableexcludedmasked on read + ADR-0100 ref; the card
objectitselfeditableexcludedobject-shaped value into a text box (#4220 container half)
compositeobjecteditableexcludedsame, alias
recordobjecteditableexcludedsame, alias
griditselfeditableexcludedsame
repeatergrideditableexcludedsame, alias
vectoritselfeditableexcludedembedding vector into a text box
markdownitselfeditableexcludedheavy editor; a one-line text box is lossy
htmlitselfeditableexcludedsame
richtextitselfeditableexcludedsame
object-refitselfeditableexcludedauthored in the record form (depends on a loaded catalog)
filter-conditionitselfeditableexcludedsame
recipient-pickeritselfeditableexcludedsame
autonumberauto_numbereditableexcludedthe detail computed gate only knows the auto_number spelling
auto_numberitselfalready lockedunchangeddetail computed gate
formulaitselfalready lockedunchangeddetail computed gate
summaryitselfalready lockedunchangeddetail computed gate
fileitselfeditablekept (exempt)InlineFieldInput routes FileField
videofileeditablekept (exempt)same, alias
audiofileeditablekept (exempt)same, alias
imageitselfeditablekept (exempt)InlineFieldInput routes ImageField
avataritselfeditablekept (exempt)InlineFieldInput routes AvatarField
signatureitselfeditablekept (exempt)InlineFieldInput routes SignatureField

Why the binary family is exempt rather than gated

This is the one place a blind consultation would have removed a working editor, so it is gated selectively and the exemption is justified from the shared set's own text. The set carries several different arguments under one name, and only some are about the value:

  • The binary/attachment entries are excluded there for a grid-cell reason — the set's own comment reads "edited from the record form, shown read-only in the grid" — because a cell cannot host an upload dropzone. A detail row can, and does: InlineFieldInput routes image / avatar / signature / file (and the video / audio spellings) to the very widgets the record form uses, added deliberately so inline edit could preview, replace and remove files instead of showing a bare storage URL. Gating them would be an unrelated feature regression riding a credential-safety fix.
  • The credential and container entries are excluded for a value reason — masked on read, or object-shaped. That argument transfers to the detail page verbatim, because the detail fallback is the same plain text input the grid's is.

The exemption is not a second free-floating list: inlineCredentialGate.test.tsx pins every entry twice — it must be a real member of the shared set, and InlineFieldInput must really render something other than the terminal text input for it. An exemption that outlives its routing fails the suite instead of silently re-opening the plain-text path.

Overlap with the neighbouring cards (reported, not expanded)

Verification

  • pnpm exec vitest run packages/plugin-detail/src/__tests__/inlineCredentialGate.test.tsx75 passed. Red-first: the same file was 27 failed / 48 passed before the hosts were wired.
  • Reverse verification: git checkout origin/main -- DetailSection.tsx HeaderHighlight.tsx → predicted RED, got 27 red with the excerpt above; restored from the commit → 75 green.
  • pnpm exec vitest run packages/plugin-detail/ packages/fields/ — 1805 passed, 143 files. One pre-existing failure, recordDetailsInputs.spec-parity.test.ts, which reproduces with this branch's source files reverted to origin/main and is unrelated to this change: its fixture authors layout: 'custom', a record:details property @objectstack/spec 17.0.0-rc.6 removed (objectstack#6946, ADR-0087 D2), so safeParse now rejects it with expected: "never". main is red on it as of 6314e87f2. Reported on record:detailslayout 发布了 auto|custom 语义,渲染器唯一的读点只认 spec 已退役的 inline|compact —— auto/custom 从未被实装 #3818, whose subject is that same key.
  • pnpm --filter @object-ui/plugin-detail type-check — clean. eslint on the touched files — 0 errors.
  • pnpm check:control-bytes — OK (3924 tracked files); plus a targeted self-scan of the touched files, no hits.
  • No new user-visible strings, so no i18n work: the change only withholds affordances that already existed, and the one string involved (detail.editInlineHint) is untouched.

Serialization: branched after #4222 (fix(detail): inline-edit an address as sub-fields) and rebased onto it — the two changes touch disjoint files (#4222 is InlineFieldInput.tsx + its own test + changeset; this is fieldEnrichment.ts / DetailSection.tsx / HeaderHighlight.tsx + its own test + changeset). address / location / geolocation are not in the shared exclusion, so #4222's new routing is unaffected, and it is pinned as a control here.

Re-authoring a credential is unchanged and still belongs in the record form, which has the widget for it (PasswordField).


Generated by Claude Code

…d page
`InlineFieldInput` has no branch for `password` or `secret`, so both reached the
terminal raw text input at the end of the component. Both types are masked on
read, so the value the row could seed an editor with was never the credential:
it was the payload's placeholder — a server-side mask, or, for `secret`, an
opaque reference into an encrypted store (ADR-0100). The detail hosts' gate
excluded only readonly / computed / system fields, so the pencil appeared, the
placeholder was rendered in clear in a `type="text"` box, and committing the
row wrote it back verbatim over the credential.
The decision was already written down one package over: `INLINE_EXCLUDED_FIELD_TYPES`
excludes both types with exactly this reasoning and the grid honours it through
`isInlineExcludedFieldType()`. Both detail hosts now consult that same
alias-aware contract — a narrow-only union of the authored and the object type,
matching the computed gate (#3355) — instead of a second hand-maintained list.
Consulting the set closes the container family (`object`/`composite`/`record`/
`grid`/`repeater`/`vector`) and the spec `autonumber` spelling with it. The
binary/attachment family is exempt and keeps its detail editor: it is in the
shared set for a grid-cell reason, while `InlineFieldInput` routes it to the
form's own upload widgets. The exemption is pinned against that routing.
Fixes#4221
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 11, 2026 5:43am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.3 KB350 KB
Entry fileindex-Uzohd74h.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.88KB3.25KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)486.47KB107.53KB
core (index.js)3.04KB1.15KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)143.81KB37.39KB
fields (index.js)228.33KB56.58KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.87KB10.80KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.23KB12.45KB
plugin-charts (index.js)61.52KB17.49KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.52KB30.68KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)238.53KB59.65KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.58KB27.68KB
plugin-gantt (index.js)164.14KB39.98KB
plugin-grid (index.js)187.97KB49.90KB
plugin-kanban (index.js)48.60KB13.41KB
plugin-list (index.js)110.18KB26.70KB
plugin-map (index.js)17.00KB5.32KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)26.21KB7.52KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)23.71KB7.95KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.23KB0.66KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@yinlianghui
yinlianghui marked this pull request as ready for review August 11, 2026 05:43
@yinlianghui
yinlianghui added this pull request to the merge queueAug 11, 2026
Merged via the queue into main with commit 5e2e9faAug 11, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-4221-inline-credential-gate branch August 11, 2026 05:44
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.3 KB350 KB
Entry fileindex-CVKWc6gY.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.88KB3.25KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)488.60KB108.25KB
core (index.js)3.04KB1.15KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)145.46KB37.89KB
fields (index.js)228.33KB56.58KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.23KB12.45KB
plugin-charts (index.js)61.52KB17.49KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.58KB30.71KB
plugin-designer (index.js)210.85KB42.64KB
plugin-detail (index.js)238.53KB59.65KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.58KB27.68KB
plugin-gantt (index.js)164.14KB39.98KB
plugin-grid (index.js)187.97KB49.90KB
plugin-kanban (index.js)48.60KB13.41KB
plugin-list (index.js)110.31KB26.76KB
plugin-map (index.js)17.00KB5.32KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)26.21KB7.52KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)23.71KB7.96KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.23KB0.66KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

Sign up for freeto 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.

Inline-editing a password / secret field on the detail page renders the mask as the value and writes it straight back

2 participants

@yinlianghui@claude