Skip to content

fix(studio): the api-name chip gives way before the item title (objectui#12791) - #12872

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-12791-item-title-floor
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-12791-item-title-floor

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #12791
Clause-②: no

What changed

In Studio's item header the api-name chip was shrink-0, so a long machine name kept its whole width and cut the item title to a few characters. Live on main, the draft object "Service Territory Assignment 105" (probe_service_territory_assignment_105) read "Servi…" at 65.94 px in a 560 px row.

Two tokens in studio-tokens.ts change:

  • STUDIO_ITEM_TITLE: basis-[200px] max-w-max grow-[1000000], keeping min-w-0 truncate.
  • STUDIO_API_CHIP: basis-[14ch] max-w-max grow-[1000] shrink-[100000] min-w-[5ch] truncate, now a block element.

StudioItemHeader wraps the chip in the status chip's tooltip mechanism from objectui#12631: a focusable trigger, with the full name as the tooltip text. The chip's own text stays the whole name. The chip keeps its place (objectui#11665, objectui#7254), the chips slot is untouched, and so are the tab row, the meta and status folds and their thresholds, every other token and every existing test id.

Give-way order

The title and the chip share the row in steps:

  1. The title gets 200 px, or its whole label if shorter.
  2. The chip gets 14 characters, or its whole name if shorter.
  3. The title grows to its whole label.
  4. The chip grows to its whole name.
  5. The meta gets whatever is left.

When the row narrows, the meta folds and the status text folds at their existing thresholds. On a row too narrow even for those minimums, the chip shrinks first, down to 5ch, and only then does the title go below 200 px. The row never overflows. The weights are large so the other item's share stays far below a pixel.

The 14-character step reconciles two pins. One is "chip before title". The other is the card's CONTROL that a short api name stays whole at 560 px: with the card's long title, a strict order cut account to one letter.

Measured widths (title / api chip)

Live: HotCRM under objectstack dev --fresh, console from this branch.

row main this branch
560 px 65.94 / 260.16 whole 233.66 / 92.44 cut
736 px (1024 px viewport) 261.94 cut / 260.16 whole 284.41 whole / 237.55 cut
360 px 0 / 260.16, row overflows by 28 px 187 / 33, no overflow

Geometry spec (Chromium, fixture fonts):

  • 560 px row, 30-character name: main 53.73, this branch 200.
  • 736 px row: main 217.73 cut, this branch 284.41 whole.
  • 360 px row: main title 0 with the row 409 px wide (49 px overflow), this branch 131.67 with no overflow.

Deviations

  • The title's floor is a flex basis, not a min-width: a min-width would overflow a 360 px row.
  • The chip keeps 14 characters before a long title grows past 200 px. At a 736 px row with a kind chip, the spec reads the title at 270.63 of 284 px and the chip at 92.48 px.
  • The status chip's text still shows down to a 480 px row (that threshold is unchanged). Between 480 px and the point where the title reaches 200 px, the title can be under 200 px while the status text shows.

Screenshots (light; evidence branch, not merged)

Test evidence (at 0250fa5)

  • e2e/studio-item-header-title-width.spec.ts, Chromium: 7 passed. It bundles the real StudioItemHeader from source and compiles the real theme with Tailwind. Cases: the 560 px floor with the chip cut and its tooltip, short-name and short-title CONTROLs, 736 px and 1024 px CONTROLs, kind chips staying whole, and no overflow at 360 px.
  • StudioItemHeader.apiChip-12791.test.tsx: 5 passed (whole name, hover and focus tooltip, DOM order title then api chip then chips).
  • All studio-design tests plus the permission-matrix tests that render the header: 237 files, 1700 tests passed (run at 44d1dc3; the only later commit touches just the e2e spec).
  • On 0250fa5, the three StudioItemHeader* files: 18 of 18 passed.
  • Ablations, each restored with git diff HEAD empty afterwards:
    • main's two token values put back: 5 of 7 spec cases red; the two CONTROLs stay green.
    • tooltip removed: 2 vitest cases red.
    • chips moved before the api chip: the order case red.
  • Exit 0 for @object-ui/app-shell type-check, eslint on the touched files and build, plus pnpm type-check:e2e, pnpm check:i18n-keys, pnpm check:i18n-drift, node scripts/check-changeset-presence.mjs and pnpm check:new-line-citations.

Session: https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952

🤖 Generated with Claude Code

https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952


Generated by Claude Code

…tui#12791)

A long machine name kept its whole width (`shrink-0`) and cut the Studio
item title to a few characters. The title and the chip now share the row in
steps: the title gets 200 px, the chip 14 characters, then the title its
whole text, then the chip its whole name, then the meta. On a row too narrow
for both the chip truncates first, and the title goes below 200 px last with
no overflow. A cut chip shows its full name in its tooltip, the status chip's
mechanism. A Chromium geometry spec measures the widths.

Claude-Session: https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952
Co-authored-by: Claude <noreply@anthropic.com>
…tui#12791)

Adds the vitest pin beside the header (the chip keeps the whole name, its
tooltip says it on hover and on focus, the identity order is unchanged) and
the app-shell patch changeset.

Claude-Session: https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952
Co-authored-by: Claude <noreply@anthropic.com>
…c (objectui#12791)

Claude-Session: https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 76 chunks) 3138.0 KB 3744.1 KB
Main entry chunk (gzip) 78.6 KB 350 KB
Entry file index-C56Sp0oy.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) 21.42KB 7.85KB
app-shell (runtime-config.js) 23.60KB 8.19KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 606.28KB 146.84KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.36KB 74.46KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 210.60KB 49.94KB
plugin-dashboard (index.js) 146.23KB 39.59KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.79KB 69.75KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.22KB 46.59KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 271.96KB 75.43KB
plugin-kanban (index.js) 62.17KB 19.22KB
plugin-list (index.js) 138.78KB 35.68KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 120.23KB 39.46KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#12791 · head 0250fa5 · 2026-10-17T09:09Z

Seat domain:ui#4, session session_01SJn1GEkrbbBQkhGC26wEDw. Checked against GitHub and the diff, not against the report (relayed on the card, 6232099947). The seat opened this PR from the dev's drafts (degraded channel). The body and the title are the dev's drafts verbatim.

Checklist

  • Form:

    • Draft → main, assignee os-sales.
    • The first line is Fixes #12791, and the second is Clause-②: no, as the claim declares (6231423024).
    • Three commits, each carrying only the model-free trailer pair.
    • git merge-tree against current main is clean. 5 files, +600 / −3, all inside the claim's surface. No PNG. Not a governed surface.
  • The fix, read in the diff:

    • STUDIO_ITEM_TITLE takes a 200 px flex basis capped at its own text (basis-[200px] max-w-max grow-[1000000]), keeping min-w-0 truncate.
    • STUDIO_API_CHIP becomes a block with basis-[14ch] grow-[1000] shrink-[100000] min-w-[5ch] truncate, so it shrinks long before the title does.
    • The chip is wrapped in the status chip's tooltip mechanism (objectui#12631): a focusable trigger, with the whole name as the tooltip text. It gains the test id studio-item-api-name, and no existing test id changes.
    • The chip keeps its place before the chips slot (objectui#11665, objectui#7254). The tab row, the meta and status folds, their thresholds and every other token are unchanged.
  • Live (hotcrm objectstack dev --fresh; draft object "Service Territory Assignment 105", probe_service_territory_assignment_105), title / api chip:

    row main 473e5a0 this branch
    560 px 65.94 px ("Servi…") / whole 233.66 px / cut
    736 px (1024 px viewport) 261.94 px cut / whole 284.41 px whole / cut
    360 px 0 px, the row overflows by 28 px 187 px / cut, no overflow
  • Screenshots, read by the seat (light; never-merged claude/issue-12791-evidence at 7034312, PNGs only):

    • at 560 px, main reads "Servi…" beside the whole machine name, and the branch reads "Service Territory Assign…" beside probe_serv…;
    • at 1024 px the branch shows the whole title "Service Territory Assignment 105";
    • at 360 px the branch still reads "Service Territory A…", with the chip at a few characters and the status chip folded to its icon.

    Sent to the maintainer at 2026-10-17T09:09Z.

  • Tests:

    • e2e/studio-item-header-title-width.spec.ts (Chromium) bundles the real StudioItemHeader from source with the real theme. 7 cases: the 560 px floor with the cut chip and its tooltip, the short-name and short-title CONTROLs, the 736 px and 1024 px CONTROLs, the kind chips staying whole, and no overflow at 360 px.
    • StudioItemHeader.apiChip-12791.test.tsx: 5 cases, covering the whole name, the hover and focus tooltip, and the DOM order.
    • Ablations: main's two token values put back turn 5 of 7 spec cases red, and the two CONTROLs stay green. Removing the tooltip turns 2 red, and swapping the order turns 1 red. Each was restored.
    • Gates: 237 studio-design and permission-matrix files (1700 tests) passed. type-check, build, eslint, type-check:e2e, check:i18n-keys, check:i18n-drift, changeset presence and check:new-line-citations all exit 0.
  • Changeset: @object-ui/app-shell patch; user-facing prose.

  • CI: running at this record. Landing waits for green.

Rulings

  1. The four-step share: A, as built. The dispatch's strict "chip before title" order cut the short name account to one letter at 560 px with the card's long title, which fails the card's own acceptance 2. The four steps are:

    1. the title gets 200 px (or its label);
    2. the chip gets 14 characters (or its name);
    3. the title grows to its label;
    4. the chip grows to its name.

    This meets the card's floor and both CONTROLs, and below the bases the chip still shrinks first. The cost, a long chip keeping 14 characters while a long title above 200 px is still cut, is measured in the PR (270.63 of 284 px at 736 px with a kind chip) and accepted.

  2. The degraded channel over os-dev.md's write steps: A. The relay answers 403 in that container, and the dispatch names the substitute.

  3. The status text's 480 px threshold stays: A. The card's 560 px case holds 233.66 px live. A fold-before-the-floor rule would move a threshold ruling 7 kept, and nothing measured pulls for it.

  4. The geometry spec follows dashboard-metric-tile-height.spec.ts, bundling the real component, rather than the record header's class-string transcription. Accepted: it is the "real components bundled from source" the dispatch asked for.

Implemented-by: cloud session session_01Hi3YhZSf1g3MAVLbmNm952, branch claude/issue-12791-item-title-floor


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

CI red · Build & E2E · head 0250fa5 · 2026-10-17T09:13Z

  • Failing: two of the seven cases in this PR's own e2e/studio-item-header-title-width.spec.ts, red on all three retries. The rest of the job passed (49 passed, 23 skipped).
    • :381, the short-name CONTROL at 560 px: chip 55.39px for 62px of name.
    • :389, the whole-title CONTROL at 736 px: title 326.86px for 333px of text.
  • Cause: font metrics. The runner's fallback font renders the long title at 333 px, against 284.41 px in the dev container. Both CONTROLs assert pixel outcomes that hold only for one font. The rule itself behaved as ruled: the chip gave way first.
  • This PR's to fix: the dev session is making the two CONTROLs font-independent, deriving them from widths measured on the same page, as e2e/dashboard-metric-tile-height.spec.ts does. It will reproduce the wider font before pushing. Landing waits for green.

Generated by Claude Code

…i#12791)

CI's fallback font draws the title about 17% wider than the container that
calibrated the spec, so the two CONTROLs that asserted one font's pixels
failed there. They now read the steps from the browser, assert the row's
rule from widths measured on the same page, and assert "whole" at the
narrowest row that holds the item.

Claude-Session: https://claude.ai/code/session_01Hi3YhZSf1g3MAVLbmNm952
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 76 chunks) 3138.0 KB 3744.1 KB
Main entry chunk (gzip) 78.6 KB 350 KB
Entry file index-C56Sp0oy.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) 21.42KB 7.85KB
app-shell (runtime-config.js) 23.60KB 8.19KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 606.28KB 146.84KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.36KB 74.46KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 210.60KB 49.94KB
plugin-dashboard (index.js) 146.23KB 39.59KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.79KB 69.75KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.22KB 46.59KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 271.96KB 75.43KB
plugin-kanban (index.js) 62.17KB 19.22KB
plugin-list (index.js) 138.78KB 35.68KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 120.23KB 39.46KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Landing · head b8056fb · 2026-10-17T09:31Z

  • Head since the ACCEPT: 0250fa5 → b8056fb. One commit, from the CI-red round (6232158615), changes only e2e/studio-item-header-title-width.spec.ts. The product code is the same as at the ACCEPT (6232124572), so its rulings and measured widths stand.
  • The fix: the two CONTROLs no longer assert one font's pixels. They read the bases from the computed style, predict both widths from the room on the same page, and assert "whole" at the narrowest row that holds the item.
    • In the dev's wide-font simulation (letter-spacing .085em), both were red at 0250fa5 and are green at b8056fb.
    • At b8056fb all 7 cases pass in both the default font and the wide one.
    • With main's token values put back, 6 of 7 cases are red.
  • Checks on b8056fb: 36 runs, 33 green and 3 expected skips, none red. Build & E2E (the job that was red) is green, along with Repo Gates, all 16 test shards, Type Check, Lint and Bundle Analysis.
  • Merge state: clean against main 8d6e435.
  • Commit messages: four commits carry only the model-free trailer pair.
  • Action: mark it ready for review and enable auto-merge through the merge queue. Fixes #12791 closes the card on merge.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 09:32
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 09:32
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit 0c511f7 Oct 17, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12791-item-title-floor branch October 17, 2026 09:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants