Repository navigation
feat(app-shell): one page header for every Setup page — sys_* lists, metadata types, settings and component pages (objectui#12606) - #12662
Conversation
Inside the Setup app the console page header takes a Setup posture: a 32px icon tile, the title with the kind chip after it, the description under the title, Refresh as an icon button and the primary action rightmost. The posture is read off the route's :appName, so pages outside Setup keep the one-row header. - ConsolePageHeader gains badge, breadcrumb and refresh. - The metadata-type page under Setup drops the breadcrumb and the stat tiles, says the count in the description, makes the source select a filter chip and the per-row source chip a tooltip. - Record lists under Setup open without row numbers and draw Display only for an object with more than four views (two ListView host props). - Settings pages take "All settings" as the header's first crumb. - Packages, Packaged automation, Approvals Inbox, Audit Log Browser and App Marketplace draw their title row through the same header. Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF Co-authored-by: Claude <noreply@anthropic.com>
…st (objectui#12606) The Packages toolbar no longer carries a top margin when it is the body's first child, and the metadata list's status select is a filter chip under Setup like the source select beside it. Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF Co-authored-by: Claude <noreply@anthropic.com>
…tup-page-header # Conflicts: # packages/app-shell/src/views/setup/PackagedAutomationPage.tsx
✅ Console Performance Budget
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
Size Limits
|
|
…ectui#12606) The maintainer's ruling C on objectui#12606 withdraws the Display hide rule: a Setup record list drops only the `#` row-number column. ListView's `showDisplayControl` host prop and ObjectView's view-count gate are removed with their pins; `defaultRowNumbers` stays. Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
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
Size Limits
|
席位核对 — ACCEPT · objectui#12606 · head
|
Contract reviewServed-tier: Face: the ① Derived judgments
② Semver levelThe changeset bumps ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Landing · head
|
Fixes #12606
Clause-②: yes
What changed
One header component, extended once: the console page header (
ConsolePageHeader,packages/app-shell/src/layout/PageHeader.tsx, the objectui#12553 base). No second Setup header was built.:appName(setuporcom.objectstack.setup) through a newuseInSetupApp()inconsole/setupApp.ts, so no page passes a prop for it. Outside Setup the header keeps the objectui#12423 one row. Three new optional props:badge(the kind chip, e.g.ManagedByBadge, words unchanged),breadcrumb(leading crumbs on the description line) andrefresh(onRefresh,label,busy). The Setup description line is always drawn, so a page without a description keeps the same title position.data-testids.sys_*record lists under Setup. There is no#row-number column. ObjectView reads the same route:appNameand passes one newListViewhost prop,defaultRowNumbers. It is a React prop, not a view key, so no authored metadata changes. Per the maintainer's ruling on the card (option C), the Display control stays on every list, Setup included.Deviations
SETUP_APP_PACKAGE_IDandSETUP_APP_NAMEmoved fromconsole/ConsoleShell.tsxtoconsole/setupApp.ts, so the header can read them without importing the console shell. ConsoleShell re-exports them, so the package root is unchanged.metadata-admin/PageShell.tsxnow exportsWritabilityBadge. Metadata types have nomanagedBybucket, so the existing writability badge (create-only / read-only / writable) is their kind chip.metadata-admin/i18n.ts:engine.list.itemCountandengine.list.itemCountOne.packages/plugin-list/src/ListView.tsxgets thedefaultRowNumbershost prop, because a plugin package cannot read the route.metadata-admin/PackagesPage.tsx, not underviews/setup/.page:headernode drawn bypackages/components, which is outside this card's file surface.SettingsView.pageHeader-12553.test.tsxis updated because 'All settings' moved from the body into the header.Screenshots (HotCRM, fresh local backend, captured at 4803770)
#columnTitle
getBoundingClientRect(), read from the DOM at capture time: x = 324, y = 60 on Users, Positions, Mail Delivery and Packages, the same at 1280 light, 1280 dark and 1024 light. The title is 18px / 600 and the description 13px. Each page has 1 header component and one h1, and no row-number cells. Sessions reads the same x and y, has the Display trigger, and has 0 row-number cells across 3 rows.Test evidence (head 4803770, origin/main 023087f merged)
@object-ui/app-shellsuite as 8 foreground shards (pnpm exec vitest run packages/app-shell/ --shard=K/8), every shard exit 0. Files: 1458 passed, 1 skipped. Tests: 13740 passed, 9 skipped.packages/plugin-list/: 141 files, 1464 tests passed. Console settings and system pages: 47 files, 339 tests passed.PageHeader.setupPosture-12606,ResourceListPage.setupPosture-12606,ObjectView.setupListChrome-12606(no#column under Setup, Display present) andListView.setupChrome-12606. Each was ablated once and turned red. For example: the Setup posture forced off gave 3 failed; ObjectView passing row numbers on gave 2 failed; the Display panel suppressed gave 5 failed. Each was restored withgit diff HEADempty.type-check(app-shell, plugin-list, console),build(console and its dependencies), eslint on the changed files (0 errors),check:i18n-keys,check:i18n-designer-parity,check:new-line-citationsand the changeset-presence check: all exit 0.Acceptance notes
sm, the one-row posture hides the description line. Outside Setup, a phone therefore does not show the 'All settings' crumb. The Setup posture keeps it.Session:
https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJFGenerated by Claude Code