Repository navigation
fix(plugin-detail, app-shell, components): the record page's controls are 44 px touch targets at phone width, and Back after 「‹」 leaves the record - #29210
Merged
Conversation
… 44 px at phone width Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE
… param dialog at 44 px Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE
…'s history entry; top-bar steppers and View all reach 44 px Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE
… the record top bar grows past its border at phone width Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE
…into claude/project-thread-amh4li
…44 px target on a phone Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE
This was referenced Nov 2, 2026
Contributor
Author
|
domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y 席位核对 · ACCEPT · 2026-11-02T09:51ZHead-sha:
Generated by Claude Code |
9 tasks done
Merged
9 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Steedos · project thread
Fixes #29071
Clause-②: no
Metadata-protocol: none
维护者速读
className字符串和一个<Link replace>;sm以上尺寸全部不变(e2e 用例在 1280 px 钉住 36 / 24 / 28 px 和悬停才显示的铅笔)。不加键、prop、导出或断点。回滚即回退本 PR。ui/packages/app-shell/src/views/RecordDetailView.tsx(phoneBack的replace);ui/packages/components/src/custom/record-top-bar.tsx;ui/packages/plugin-detail/src/RelatedList.tsx;ui/e2e/record-flow-phone-targets.spec.ts。cd ui && npx playwright test e2e/record-flow-phone-targets.spec.ts --project=chromium(5 个用例通过);pnpm --dir ui exec vitest run packages/app-shell/src/views/RecordDetailView.phoneFace-27058.test.tsx(含新的「后退不回到记录」用例)。What changes
The mobile app hosts the Console in a WebView, so a phone user gets the record page at 375 or 390 px. Driven there on six records, the page did not scroll sideways, its dialogs and menus fit the screen and the keyboard left the focused field in view, but most of the page's own controls were smaller than a finger, the inline-edit pencil was invisible on a touch screen, and the back link left the record behind it in the history.
sm, through the spellings the code already uses for its phone faces (h-11 sm:h-N,min-h-[44px] sm:min-h-0,min-w-11 sm:min-w-0):plugin-detail:RecordTabRow(tabs and the+Ntrigger),RelatedList(card head, New / Add, rows and their name buttons, footer "View all", the enlarged view's filter, chips, New / Add / Export, sort and paging, Enlarge),RelatedCardMenu(⋯ and the reorder handle),RelatedListEmptyFoldandEmptySectionsFold(the fold toggles and Expand),DetailSection(pencil, empty toggle, title row),HeaderHighlight(the strip's pencil),InlineEditSaveBar(Cancel / Save),RecordActivityTimeline("Write a note…", the filter chips and select),RichTextCommentInput(the toolbar, which now wraps),RecordTimelinePanel(head),record-reference-rail(View All).app-shell:RecordDetailView(the phone's 「‹」),DeclaredActionsBar(the declared decision buttons and the override menu trigger),ActionParamDialog(footer Cancel / Confirm),RecordAttachmentsPanel(Upload).components:record-top-bar(↓ ↑ and the bar's other icon buttons; the bar grows fromh-10to its content,min-h-11, so a 44 px control does not spill past its border),containers.tsx(the phone header bar's action buttons and ⋯),RecordTitleChip(copy record ID).pointer-coarse:opacity-100). With a mouse it still waits for hover or focus.<Link to={to} replace>), so the browser's Back after it leaves for the entry below and never opens the record again. A page pushed from a parent record (a related row or a lookup) already went back withnavigate(-1)and is unchanged.No key, prop, export or breakpoint is added.
useIsMobile/usePhoneViewportand the existing phone layouts are untouched.Run record
Six records, each at 375×812 and 390×844 (Chromium,
isMobile+hasTouch), on the real Console (Vite source console againstexamples/app-crmand the showcase backend, signed in as the seeded admin):/apps/com.example.crm/crm_lead/record/AsRu1Po-1-Fob7D-/apps/com.example.crm/crm_account/record/ZE2x6eRx2CNUIEf1/apps/com.example.crm/crm_opportunity/record/MY5BwNPGtULohScT/apps/showcase_app/showcase_account/record/2OeMEsWhxzpXuMYa/apps/showcase_app/showcase_project/record/9aZqRnYBQ6EY225w/apps/showcase_app/sys_approval_request/record/areq_214e57da-…On each: load, every tab, the tab overflow menu, inline edit, the related New dialog, the related ⋯ menu, View all, Enlarge, a declared action's dialog, the action bar's ⋯ and the Edit action.
0e43df23), 375 and 390+N32×36; card ⋯ / New 24×24, reorder 20×24, card rows 18.8 tall; footer "View all" 20 tall; Enlarge 36; enlarged chips / Export 32; timeline chips 24, "Write a note…" 32; comment toolbar 28×28; "Show N empty fields" 28, Expand 16; Save / Cancel 36; action bar Edit 40, ⋯ 40×40; 「‹」 92×28 (seat), 69–153×28 measured; ↓ ↑ 28×28 (seat); copy ID 20×20; New 36; decision buttons 36 tall; param dialog Cancel / Confirm 40 tall; the pencil 20×20 at opacity 0.[0,0,W,H]; the tab overflow, related ⋯ and action ⋯ menus sit inside; the declared action dialog[0,92,375,720].Back after 「‹」 (seat input): from the lead list at 375 and 390, tap a row, step ↓ once, tap 「‹」, press the browser's Back. Before (the seat's reading): Back opened the record again. After: Back lands on the list (
/apps/com.example.crm/crm_lead), the record is not reopened; history length 2 → 3 (the row's push only; ↓ and 「‹」 each replace).CPU throttling and the keyboard are measured here only, per the card. Screenshots of every step (before and after) are in the project folder, not on GitHub.
Findings (not fixed here)
Each is measured in the after run and left to the card named.
DropdownMenuItem, 32 px tall — every menu on the page (tab overflow items, related ⋯ Hide, action ⋯ Refresh / Add to favorites / Share / Delete). The cause is the shared primitiveui/dropdown-menu.tsx, used app-wide. reach: cross-flow, the menu primitive (the parent Console at phone width: audit and fix the key flows at 375px (the mobile app now hosts the Console) #29040 to place).Tabson an authored page, 38 px tall — the project's and the approval request's Details / Tasks / Related / Timeline tabs come fromui/tabs.tsx, notRecordTabRow. reach: shared primitive (the parent Console at phone width: audit and fix the key flows at 375px (the mobile app now hosts the Console) #29040 to place).dialog.tsx; per the seat, not this card.managed-by-badge, 119.6×18 — a tooltip chip on the approval request, not a control. Note only.sheet.tsx(Console at phone width: Dashboards flow audit and fixes at 375 and 390 px #29078).[list, list]instead of[list, record, list]): Back after 「‹」 shows the list the reader is already on. A clean pop needs the list's row navigation to mark its push as the related rows do (recordPagePushState), which is inObjectView.tsx/record-list-face.tsx(Record open: the drawer is the default and the split pane retires — the list keeps its full width, and a record opens only as the drawer or the page #28915's files, landed in feat(ui)!: a record opened from a list opens in the drawer by default, and the split pane retires #29108). reach: Console at phone width: Lists flow audit and fixes at 375 and 390 px #29074 (Lists, the row navigation). The drawer has no phone face (a phone opens no drawer; feat(ui)!: a record opened from a list opens in the drawer by default, and the split pane retires #29108 made it the desktop default), so there is no drawer Back to fix at phone width.Tests
ui/e2e/record-flow-phone-targets.spec.ts(new, Chromium): reads each control's class string from its source file, compiles Tailwind, and lays out a transcription of the record page (top bar with 「‹」 and ↓ ↑, tabs and+N, a section field with its pencil, the strip pencil, a related card head, menu, handle and rows, the comment toolbar, the save bar, the action bar). At 375×812 and 390×844 with touch: every control is at least 44×44, ends inside the viewport and is drawn at opacity 1; the page is no wider than the viewport; the top bar is at least 45 px. The mobile dialog fills the viewport and its close is 44 px. At 1280 with a mouse: a tab is 36, the card ⋯ 24, Save 36, ↓ 28, the strip pencil 20, and both pencils are at opacity 0. 5 passed.RecordDetailView.phoneFace-27058.test.tsx: a new case, "「‹」 does not leave the record behind it in the history" (home → list → record, tap 「‹」, Back lands on the list with no record, Back again reaches home).Acceptance notes
smup every control keeps its size; a mouse still reveals the pencil on hover (pinned in the spec at 1280).components/src/custom/record-top-bar.tsx,components/src/custom/RecordTitleChip.tsx,components/src/renderers/layout/containers.tsx. Each is the record header's own control (the top bar, the copy-ID chip, the phone header's action bar), changed in class strings only, so no exported type moves and Clause-② stays no.navigation-overlay.tsx,record-list-face.tsx,ObjectView.tsx,recordOpenPreference.ts— feat(ui)!: a record opened from a list opens in the drawer by default, and the split pane retires #29108 changed them on main and merged in cleanly —ui/packages/mobile/**, the console'smain/App/AppContent.tsx,sheet.tsx,dialog.tsx).Verification
Head
a8949249mergesorigin/mainat104cd1a5. #29055 landed as6ada509dand was merged in before the strip pencil was changed. The suites and gates below ran at67398c1f(main at4550091a); the last merge (104cd1a5, including #29108's drawer default) touched none of this PR's files, and ata8949249the record-page phone, top-bar, recordPagePush and strip unit files (7 files, 48 tests), the e2e spec (5), the live Back check,check-sdui-manifestand the five PR-body gates were re-run: all green.Tests
pnpm --dir ui exec vitest run packages/plugin-detail/in three chunks under the verify lock,--maxWorkers=2: 367 files passed, 1 skipped; 3227 tests passed, 18 skipped.RecordDetailView,DeclaredActionsBar,ActionParamDialog,RecordAttachmentsPanel,recordPagePushor the top bar, plus the 24 components test files that importrecord-top-bar,RecordTitleChiporrenderers/layout: 295 files, 2552 tests passed.npx playwright test e2e/record-flow-phone-targets.spec.ts --project=chromium: 5 passed.scripts/ablation-replace.mjs, each restored to blob == HEAD with an emptygit diff HEAD):TAB_CLASSgivenmax-h-9→ the spec fails "tab Overview is 36px tall";<Link to={to} replace→<Link to={to}→ the new unit case fails (Back returned/apps/demo/crm_lead/record/r-1).Type-check and lint
pnpm --filter @object-ui/{plugin-detail,app-shell,components} run type-check: exit 0 each (app-shell after rebuilding@object-ui/plugin-list's dist, which main's fix(plugin-list, app-shell): "Reset to view default" clears the stored list setting instead of copying the view into it #29044 had moved).--no-inline-config, fromui/) on the 21 changed source, test and spec files: 4 errors, all present on main at the same lines (react-hooks"Cannot create components during render", 3 inRelatedList.tsx, 1 incontainers.tsx); none added.Derived gates
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran: 34 derived families, 34 run, 0 NOT-MEASURED, every one exit 0. That includescheck-sdui-manifestand its--self-test,pnpm --dir ui exec vitest run scripts/(169 files passed, 2 skipped; 4900 tests passed),check:query-options-erasureandcheck:type-check-debtunder the verify lock (0 raw tsc errors above the ledger). The PR-body gates (check-changeset-no-major,check-closing-keyword-parity,check-adr-0087-registration,check-empty-changeset) ran on this body throughGITHUB_EVENT_PATH.🤖 Generated with Claude Code
https://claude.ai/code/session_01QsR2jTg5fAobG4y7DkFwUE