Skip to content

feat(List): a touch press hides the dividers beside the pressed row - #8079

Closed
vjeux wants to merge 860 commits into
meta:mainfrom
vjeux:uikit/c11-list-dividers
Closed

vjeux wants to merge 860 commits into
meta:mainfrom
vjeux:uikit/c11-list-dividers

Conversation

@vjeux

@vjeux vjeux commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Review only this PR's change: vjeux/astryx@01b48e5...2121d8f (depends on #8077; the same change also rides in #8082).

The dividers are pending the owner's decision (see her note on #8139); nothing changes here until she decides.

User impact

Pressing a row of a divided List (hasDividers) under a finger: the dividers above and below stayed drawn across the highlight, cutting it with two hairlines. Now both hide while the press is on and return at the lift while the highlight fades, as a highlighted UIKit cell's separators do.

Under a coarse pointer only (spec:AST-094 FR13): an Android finger gets the same, and a mouse keeps today's dividers.

Size (gzip, the size report's tool, base → head): ListItem JS +34 B and CSS +79 B.

Visual authority

Reference: iOS 26.2 UITableView and UICollectionView lists, where a highlighted cell hides its own separator and the one above it, and both return in the first frame of the deselect.

Before and after

The pressed row's edges, before | after (Chromium under a finger, ×4, contrast stretched): the divider crossed the press as a lighter seam; now the highlight is one band.

Before | after, magnified

iOS 26.2 Safari (simulator, real touch):

Path Clip
A held press: both hide; at the lift they return as the highlight fades Press
The last row hides only the divider above it Last row
A press taken for a scroll: both return as the highlight drops Scroll

Android 15, Chrome 124 (emulator): the same two hide, and return at the lift.

Android press

State matrix

Where Dividers under a press
Under a finger (Chromium, WebKit, the iOS simulator, the Android emulator) middle row: its own and the one above hide; last row: the one above
Mouse stay drawn (tested)
No dividers, dark mode, RTL unchanged / same two hide (tested)

Scope

  • Appearance is the primary intent.
  • Behavior, API, interaction model, and unrelated layout changes were removed or split.
  • The evidence shows the changed pixels actively running, not only source or computed styles.
  • Public text and artifacts contain no internal Meta context.

Testing

Red first: an Android finger's press hides the same two dividers (browser, one touch model).

Green on #8076 3fb31dd and main 6aea9bd: root build and pnpm typecheck on this head and its List, Item and TreeList suites (275); the stack's top, which carries it, passes the ui project's 16,168 tests (load timeouts pass alone), Chromium 91 and WebKit 74.

@vercel

vercel Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
astryx Ready Ready Preview Oct 27, 2026 11:38am UTC

Request Review

@github-actions github-actions Bot added the needs:design-review Affects visuals — Design should review label Oct 24, 2026
@astracat-bot

astracat-bot Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

AI review status for this pull request.

Review status Updated
❓ Needs maintainer input (for maintainers only) Oct 28, 2026, 2:42 AM UTC

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the detailed evidence. This needs an engineering-owner decision before it can be approved: no current spec covers hiding the dividers beside a touch-pressed List row, and the draft spec:AST-094 this branch adds (FR1–FR23, DEC-1, DEC-2) proposes amendments to current records that have to be approved or rejected. An engineering owner records that decision by commenting /approve-spec followed by this head's full commit SHA; you can do that yourself as an engineering owner, or the divider behavior can first be written into the List component spec. Separately, the diff should shrink to the 321-line divider commit by landing the predecessor PRs first (it is 12,777 authored lines today).

  • AST-094 FR7 cites spec:AST-090, which does not exist on main yet.

[Automated review]

follows.
- **FR7 — Exits animate as UIKit's do.** A touch presentation MUST play the
exit its UIKit counterpart plays. **Proposed; pending owner review:** this
departs from the draft `spec:AST-090` FR1 (exits off by default) and FR10

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no spec:AST-090 record on main or at this head, so a reader cannot see the exit rule FR7 departs from. Cite it once it lands, or state that rule here in its own words.

* tap-to-click, long press, double tap and the start of a page scroll, so
* many guesses can be settled by measuring Safari itself.
*
* SYNC: When modified, update packages/core/src/gestures/README.md (the

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

packages/core/src/gestures/ is not in this tree: neither the gesture system line 7 mentions nor this README exists yet. Point the note at what exists, or land it with the recognizers.

@github-actions

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

PR Analysis Report

📚 Storybook Preview

View Storybook for this PR

🧪 Sandbox Preview

View Sandbox for this PR

Modified Components

Item (@astryxdesign/core) · View in Storybook
Metric Before After Delta
Entry File (ESM) 284B 284B 0B
Lines of Code 1372 1374 -
Complexity Very High Very High (122) -
TreeList (@astryxdesign/core) · View in Storybook
Metric Before After Delta
Entry File (ESM) 648B 648B 0B
Lines of Code 872 875 -
Complexity Very High Very High (100) -

Component Size

Component Import before Import after Delta CSS before CSS after Delta
core/AlertDialog 56.9KB 57.2KB +282B 12.4KB 12.5KB +24B
core/AppShell 57.9KB 58.1KB +233B 11.6KB 11.7KB +22B
core/AspectRatio 3.7KB 3.8KB +66B 3.5KB 3.5KB +40B
core/Avatar 37.5KB 37.5KB +54B 6.3KB 6.3KB +23B
core/AvatarGroup 39.8KB 39.8KB +50B 6.4KB 6.5KB +22B
core/AvatarGroupOverflow 39.9KB 40.2KB +296B 6.4KB 6.4KB +23B
core/AvatarStatusDot 7.1KB 7.1KB +61B 3.4KB 3.4KB +41B
core/Badge 3.9KB 4.0KB +64B 3.8KB 3.9KB +39B
core/Banner 47.8KB 48.1KB +291B 9.9KB 10.0KB +22B
core/BaseTypeahead 54.3KB 54.6KB +244B 9.9KB 9.9KB +22B
core/Blockquote 3.5KB 3.6KB +66B 3.4KB 3.4KB +39B
core/BottomSheet 34.0KB 34.0KB +69B 7.9KB 7.9KB +24B
core/BottomSheetSwitcher 14.8KB 14.8KB +67B 3.3KB 3.3KB +41B
core/BreadcrumbItem 66.4KB 67.1KB +724B 11.0KB 11.4KB +360B
core/Breadcrumbs 22.4KB 22.5KB +71B 3.3KB 3.3KB +40B
core/Button 43.3KB 43.5KB +271B 9.2KB 9.2KB +21B
core/ButtonGroup 8.4KB 8.5KB +67B 3.3KB 3.3KB +40B
core/Calendar 54.9KB 55.2KB +274B 10.0KB 10.0KB +22B
core/Card 6.4KB 6.5KB +66B 6.3KB 6.4KB +42B
core/Carousel 50.2KB 50.4KB +220B 10.2KB 10.2KB +21B
core/Center 4.2KB 4.2KB +63B 4.6KB 4.6KB +42B
core/ChatComposer 60.6KB 60.9KB +255B 10.8KB 10.8KB +19B
core/ChatComposerDrawer 23.9KB 23.9KB +66B 4.5KB 4.6KB +39B
core/ChatComposerInput 55.7KB 56.0KB +250B 10.1KB 10.1KB +21B
core/ChatComposerTokenElement 55.7KB 56.0KB +251B 10.1KB 10.1KB +21B
core/ChatDictationButton 46.5KB 46.8KB +264B 9.5KB 9.5KB +20B
core/ChatLayout 48.8KB 49.1KB +265B 9.9KB 10.0KB +20B
core/ChatLayoutScrollButton 46.4KB 46.6KB +250B 9.6KB 9.6KB +20B
core/ChatMessage 23.1KB 23.1KB +59B 3.5KB 3.6KB +39B
core/ChatMessageBubble 7.0KB 7.1KB +67B 3.6KB 3.6KB +42B
core/ChatMessageList 28.9KB 29.0KB +71B 7.8KB 7.8KB +21B
core/ChatMessageMetadata 25.8KB 25.9KB +60B 3.9KB 3.9KB +23B
core/ChatSendButton 45.8KB 46.1KB +280B 9.2KB 9.2KB +21B
core/ChatSystemMessage 6.7KB 6.8KB +71B 3.7KB 3.7KB +39B
core/ChatTokenizedText 6.9KB 7.0KB +63B 3.9KB 3.9KB +40B
core/ChatToolCalls 31.9KB 31.9KB +65B 8.9KB 8.9KB +22B
core/CheckIndicator 9.0KB 9.1KB +68B 3.6KB 3.6KB +39B
core/CheckboxIndicator 4.1KB 4.1KB +65B 3.8KB 3.8KB +22B
core/CheckboxInput 49.9KB 50.2KB +270B 9.3KB 9.3KB +22B
core/CheckboxList 46.0KB 46.1KB +63B 8.1KB 8.2KB +22B
core/CheckboxListItem 54.0KB 54.7KB +645B 10.5KB 10.9KB +419B
core/Citation 25.9KB 26.0KB +69B 4.1KB 4.2KB +41B
core/ClickableCard 12.8KB 13.1KB +300B 6.9KB 7.0KB +46B
core/Code 3.5KB 3.6KB +63B 3.4KB 3.4KB +41B
core/CodeBlock 60.5KB 60.8KB +277B 10.7KB 10.7KB +27B
core/Collapsible 11.7KB 12.0KB +278B 4.2KB 4.3KB +39B
core/CollapsibleGroup 6.4KB 6.4KB +71B 3.2KB 3.2KB +40B
core/CommandPalette 50.9KB 51.2KB +259B 11.8KB 11.8KB +23B
core/CommandPaletteEmpty 6.1KB 6.2KB +64B 3.3KB 3.4KB +42B
core/CommandPaletteFooter 23.3KB 23.3KB +68B 3.5KB 3.6KB +39B
core/CommandPaletteGroup 3.5KB 3.5KB +64B 3.3KB 3.4KB +39B
core/CommandPaletteInput 32.3KB 32.4KB +60B 8.1KB 8.1KB +22B
core/CommandPaletteItem 8.4KB 8.7KB +272B 3.5KB 3.5KB +40B
core/CommandPaletteList 22.4KB 22.5KB +65B 3.3KB 3.3KB +41B
core/ComplexSelector 55.8KB 56.1KB +292B 10.6KB 10.7KB +20B
core/ContextMenu 77.7KB 78.4KB +650B 14.6KB 15.1KB +437B
core/ContextMenuItem 16.6KB 17.1KB +578B 5.2KB 5.6KB +369B
core/DateInput 99.9KB 100.1KB +208B 14.8KB 14.8KB +20B
core/DateRangeInput 69.4KB 69.6KB +250B 11.2KB 11.2KB +21B
core/DateTimeInput 110.1KB 110.3KB +218B 15.2KB 15.2KB +20B
core/Dialog 16.2KB 16.3KB +64B 7.1KB 7.1KB +23B
core/DialogHeader 48.8KB 49.1KB +271B 9.8KB 9.8KB +20B
core/Divider 6.5KB 6.5KB +64B 3.6KB 3.6KB +43B
core/Drawer 31.6KB 31.7KB +85B 8.0KB 8.1KB +23B
core/DrawerHeader 48.9KB 49.2KB +255B 11.2KB 11.2KB +22B
core/DropdownMenu 72.7KB 73.3KB +662B 14.7KB 15.2KB +435B
core/DropdownMenuCheckboxItem 16.1KB 16.8KB +688B 5.6KB 5.9KB +350B
core/DropdownMenuDivider 6.6KB 6.6KB +61B 3.6KB 3.6KB +42B
core/DropdownMenuGroup 6.1KB 6.1KB +69B 3.3KB 3.3KB +39B
core/DropdownMenuItem 15.4KB 16.1KB +709B 5.2KB 5.5KB +370B
core/DropdownMenuRadioGroup 6.0KB 6.1KB +62B 3.2KB 3.2KB +43B
core/DropdownMenuRadioItem 16.2KB 16.9KB +694B 5.6KB 5.9KB +350B
core/DropdownMenuSubMenu 58.1KB 58.8KB +701B 9.5KB 9.9KB +357B
core/EmptyState 7.7KB 7.8KB +64B 3.5KB 3.6KB +42B
core/Field 44.2KB 44.3KB +71B 8.0KB 8.0KB +22B
core/FieldLabel 39.8KB 39.8KB +58B 6.5KB 6.5KB +23B
core/FieldStatus 10.4KB 10.5KB +74B 4.2KB 4.3KB +23B
core/FileInput 54.1KB 54.3KB +252B 10.3KB 10.4KB +23B
core/FormLayout 6.3KB 6.3KB +66B 3.4KB 3.4KB +40B
core/Grid 4.3KB 4.4KB +67B 3.7KB 3.7KB +40B
core/GridSpan 3.4KB 3.5KB +63B 3.2KB 3.3KB +40B
core/HStack 7.3KB 7.3KB +62B 4.9KB 4.9KB +44B
core/Heading 9.1KB 9.2KB +64B 6.8KB 6.8KB +23B
core/Icon 8.8KB 8.9KB +60B 3.6KB 3.6KB +39B
core/IconButton 43.3KB 43.6KB +276B 9.2KB 9.2KB +21B
core/InputGroup 44.8KB 44.9KB +61B 8.0KB 8.1KB +21B
core/InputGroupText 6.3KB 6.4KB +66B 3.7KB 3.8KB +40B
core/Item 11.4KB 12.0KB +625B 4.7KB 5.0KB +372B
core/Kbd 6.7KB 6.7KB +67B 3.5KB 3.5KB +40B
core/LayerProvider 63.3KB 63.6KB +271B 10.1KB 10.1KB +23B
core/Layout 8.1KB 8.2KB +63B 5.5KB 5.5KB +43B
core/LayoutContent 7.4KB 7.5KB +64B 4.9KB 5.0KB +43B
core/LayoutFooter 7.3KB 7.4KB +68B 4.8KB 4.9KB +42B
core/LayoutHeader 7.4KB 7.4KB +65B 4.8KB 4.9KB +42B
core/LayoutPanel 7.6KB 7.6KB +65B 4.8KB 4.9KB +43B
core/Lightbox 51.2KB 51.4KB +242B 9.8KB 9.8KB +21B
core/Link 43.5KB 43.8KB +262B 7.6KB 7.6KB +25B
core/List 6.7KB 6.8KB +59B 3.4KB 3.5KB +40B
core/ListItem 53.5KB 54.1KB +622B 10.5KB 10.9KB +419B
core/Markdown 144.5KB 145.1KB +653B 17.4KB 17.8KB +423B
core/MetadataList 23.1KB 23.2KB +67B 3.6KB 3.6KB +42B
core/MetadataListItem 6.5KB 6.5KB +64B 3.4KB 3.4KB +43B
core/MobileNav 51.0KB 51.2KB +225B 10.1KB 10.1KB +22B
core/MobileNavToggle 46.2KB 46.5KB +261B 9.4KB 9.4KB +20B
core/MoreMenu 72.9KB 73.6KB +662B 14.7KB 15.2KB +435B
core/MultiSelector 76.2KB 76.4KB +260B 14.6KB 14.7KB +24B
core/NavHeadingMenu 8.9KB 9.0KB +65B 3.2KB 3.3KB +42B
core/NavIcon 3.4KB 3.5KB +63B 3.3KB 3.3KB +42B
core/NumberInput 55.7KB 56.0KB +276B 10.7KB 10.7KB +31B
core/Outline 28.6KB 28.9KB +263B 4.0KB 4.1KB +40B
core/OverflowList 8.5KB 8.6KB +67B 3.5KB 3.5KB +40B
core/Overlay 19.5KB 19.6KB +43B 3.8KB 3.9KB +17B
core/Pagination 87.7KB 88.4KB +654B 15.3KB 15.7KB +348B
core/Popover 49.8KB 50.0KB +206B 12.1KB 12.1KB +20B
core/PowerSearch 155.1KB 155.7KB +665B 18.6KB 19.0KB +354B
core/ProgressBar 7.7KB 7.8KB +66B 6.6KB 6.6KB +20B
core/RadioIndicator 3.8KB 3.9KB +61B 3.7KB 3.7KB +20B
core/RadioList 45.6KB 45.6KB +61B 8.0KB 8.0KB +22B
core/RadioListItem 52.1KB 52.8KB +633B 9.7KB 10.0KB +351B
core/ResizeHandle 25.1KB 25.2KB +73B 3.9KB 3.9KB +41B
core/Section 7.5KB 7.6KB +67B 6.2KB 6.2KB +42B
core/SegmentedControl 38.8KB 38.9KB +73B 6.3KB 6.4KB +22B
core/SegmentedControlItem 8.6KB 8.9KB +277B 3.9KB 3.9KB +41B
core/SelectableCard 12.8KB 13.0KB +284B 7.1KB 7.2KB +46B
core/Selector 79.1KB 79.8KB +715B 15.0KB 15.3KB +355B
core/SelectorOption 14.5KB 15.1KB +605B 5.1KB 5.4KB +370B
core/SideNav 58.0KB 58.2KB +245B 10.6KB 10.6KB +21B
core/SideNavCollapseButton 46.6KB 46.9KB +245B 9.5KB 9.5KB +20B
core/SideNavHeading 54.7KB 55.0KB +252B 10.1KB 10.2KB +22B
core/SideNavItem 54.5KB 54.8KB +260B 10.1KB 10.1KB +22B
core/SideNavSection 6.5KB 6.6KB +59B 3.6KB 3.6KB +38B
core/Skeleton 3.8KB 3.8KB +60B 3.6KB 3.6KB +22B
core/Slider 48.5KB 48.5KB +58B 8.5KB 8.5KB +21B
core/Spinner 26.3KB 26.4KB +58B 7.5KB 7.5KB +19B
core/Stack 7.1KB 7.1KB +62B 4.9KB 4.9KB +44B
core/StackItem 6.0KB 6.1KB +63B 3.3KB 3.3KB +38B
core/StatusDot 19.0KB 19.0KB +59B 6.2KB 6.2KB +19B
core/Step 32.4KB 32.7KB +271B 5.3KB 5.3KB +22B
core/Stepper 47.4KB 47.6KB +253B 9.6KB 9.6KB +20B
core/Switch 48.4KB 48.7KB +271B 9.3KB 9.4KB +21B
core/Tab 9.7KB 10.0KB +278B 4.1KB 4.1KB +41B
core/TabList 40.2KB 40.3KB +63B 7.2KB 7.2KB +23B
core/TabMenu 51.6KB 51.9KB +245B 10.0KB 10.0KB +21B
core/Table 84.0KB 84.6KB +644B 15.1KB 15.5KB +420B
core/TableBody 3.3KB 3.3KB +63B 3.2KB 3.2KB +42B
core/TableCell 78.8KB 79.4KB +663B 14.8KB 15.3KB +419B
core/TableFooter 3.3KB 3.3KB +63B 3.2KB 3.2KB +42B
core/TableHeader 3.3KB 3.3KB +63B 3.2KB 3.2KB +42B
core/TableHeaderCell 78.6KB 79.2KB +654B 14.8KB 15.2KB +432B
core/TableRow 6.2KB 6.3KB +66B 3.5KB 3.6KB +40B
core/TableSelectionToolbar 52.4KB 52.6KB +269B 11.2KB 11.2KB +21B
core/Text 8.6KB 8.6KB +66B 6.8KB 6.8KB +23B
core/TextArea 49.4KB 49.5KB +68B 9.4KB 9.4KB +21B
core/TextInput 53.5KB 53.8KB +261B 10.5KB 10.5KB +22B
core/Thumbnail 50.7KB 50.9KB +278B 11.0KB 11.0KB +25B
core/TimeInput 86.8KB 87.1KB +227B 13.8KB 13.8KB +21B
core/Timer 9.2KB 9.3KB +70B 6.8KB 6.8KB +23B
core/Timestamp 27.5KB 27.6KB +76B 9.5KB 9.6KB +21B
core/Toast 59.8KB 60.1KB +261B 9.7KB 9.7KB +22B
core/ToggleButton 44.1KB 44.4KB +254B 9.3KB 9.3KB +21B
core/ToggleButtonGroup 6.3KB 6.4KB +68B 3.2KB 3.3KB +42B
core/Token 29.6KB 29.9KB +281B 4.5KB 4.5KB +42B
core/Tokenizer 64.8KB 65.1KB +290B 11.7KB 11.7KB +21B
core/Toolbar 39.8KB 39.8KB +63B 7.7KB 7.8KB +46B
core/TopNav 51.9KB 52.1KB +238B 10.4KB 10.4KB +23B
core/TopNavHeading 54.2KB 54.4KB +246B 9.9KB 10.0KB +20B
core/TopNavItem 9.0KB 9.3KB +279B 3.8KB 3.9KB +39B
core/TopNavMegaMenu 54.2KB 54.4KB +272B 10.8KB 10.9KB +21B
core/TopNavMegaMenuFeaturedCard 6.7KB 6.8KB +66B 3.4KB 3.4KB +38B
core/TopNavMegaMenuItem 9.1KB 9.4KB +282B 4.1KB 4.1KB +38B
core/TopNavMenu 53.6KB 53.8KB +258B 10.1KB 10.1KB +23B
core/TreeList 32.5KB 33.1KB +556B 4.7KB 5.0KB +372B
core/Typeahead 61.5KB 61.7KB +251B 11.3KB 11.3KB +21B
core/TypeaheadItem 6.2KB 6.3KB +60B 3.4KB 3.5KB +39B
core/VStack 7.3KB 7.3KB +61B 4.9KB 4.9KB +44B

Sizes are gzip. Import counts the JavaScript the import loads eagerly; CSS counts the package stylesheet rules referenced by the modules it can load from its own package, lazily loaded ones included.

Bundle Size Summary

Gzip figures measure each package's entry file, not the code an import pulls in.

Package Entry (ESM) Entry gzip before Entry gzip after Delta
@astryxdesign/core 4.9KB 1.2KB 1.2KB 0B
Package stylesheet Gzip before Gzip after Delta
@astryxdesign/core 34.6KB 35.0KB +431B

Accessibility Audit

Status: 2 accessibility violation(s) found — 2 serious.

Radio group pattern - 1 issue(s)
  • 🟠 serious: Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds
    • Rule: color-contrast · Affects 3/11 stories · Learn more
    • WCAG: 1.4.3 (Level AA)
RadioList - 1 issue(s)
  • 🟠 serious: Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds
    • Rule: color-contrast · Affects 3/14 stories · Learn more
    • WCAG: 1.4.3 (Level AA)

Visual Regression

55 of 502 shot(s) changed.

A change here is a question, not a failure: check whether the after is the
picture you intended. Record that review on the PR. Baseline maintenance is an
explicit dispatch of CI; this report never rewrites the baseline or adds a release gate.

component story theme mode pixels
Selector Indicator Space Bottom Sheet Narrow End RTL neutral light 753,933
Selector Indicator Space Bottom Sheet Wide Start neutral light 740,072
RichTextEditor Markdown parity: side by side probe dark 558,840
RichTextEditor Markdown parity: side by side probe light 540,756
Chat Full AI Chat probe light 230,823
Chat Full AI Chat probe dark 229,805
AppShell With Mobile Nav probe light 217,010
AppShell With Mobile Nav probe dark 216,960
Collapsible Dividers probe dark 66,445
Collapsible Dividers probe light 66,445
AppShell Playground neutral dark 65,198
AppShell Playground neutral light 63,788
Chat Default neutral dark 36,304
Chat Default neutral light 35,767
Chat Empty State probe light 23,531
Chat Empty State probe dark 22,622
ChatAutoScroll Scroll Behavior Comparison neutral dark 15,378
ChatAutoScroll Scroll Behavior Comparison neutral light 14,107
Chat With Attachments probe light 13,406
Chat With Attachments probe dark 11,232

and 35 more.


Generated by PR Enrichment workflow | Storybook | Sandbox | View full report

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs an engineering-owner decision before it can be approved: no current spec covers hiding the dividers beside a touch-pressed List row, and the draft spec:AST-094 this branch adds (FR1–FR23, DEC-1, DEC-2) proposes amendments to current records that have to be approved or rejected. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, and you can do that yourself as an engineering owner; otherwise the divider behavior can first be written into the List component spec, with AST-094 settled in its own spec PR. Separately, the diff should shrink to the 321-line divider commit by landing the predecessor PRs first: it is 13,697 authored lines today.

  • AST-094 FR7 cites spec:AST-090, which does not exist on main yet, and a few motion-table notes point at files this branch does not contain (packages/core/src/gestures/, uikit/switch.ts, uikit/contextMenu.ts, sources.test.ts).

[Automated review]

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs an engineering-owner decision before it can be approved: no current spec covers hiding the dividers beside a touch-pressed List row or moving the touch press release of interactive Item and TreeList rows onto a compositor layer, and the draft spec:AST-094 this branch adds (FR1–FR23, DEC-1, DEC-2) proposes amendments to current records that have to be approved or rejected. An engineering owner records that decision by commenting /approve-spec <full head SHA> on this pull request, and you can do that yourself as an engineering owner; otherwise the divider behavior can first be written into the List component spec, with AST-094 settled in its own spec PR. Separately, the diff should shrink to the 500-line divider commit by landing the predecessor PRs first: it is 14,032 authored lines today.

  • AST-094 FR7 cites spec:AST-090, which does not exist on main yet, and a few motion-table notes point at files this branch does not contain (packages/core/src/gestures/, uikit/switch.ts, uikit/contextMenu.ts, sources.test.ts).
  • The pr-a11y failure comes from the branch predating a main test file (ReorderGripPinchZoom.a11y.chromium.spec.ts); rebasing onto main clears it.

[Automated review]

vjeux added a commit to vjeux/astryx that referenced this pull request Oct 24, 2026
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 24, 2026
@vjeux
vjeux force-pushed the uikit/c11-list-dividers branch from c2edd43 to 01ce8b1 Compare October 24, 2026 22:24
vjeux and others added 16 commits October 26, 2026 19:10
… that finger until it lifts (spec:AST-094 FR14)

A recognition that claimed its touches and was then cancelled gave them
back to the browser unless another recognition owned them, so a finger
resting there could pinch-zoom the page. A gesture that cancels itself on
a finger's move, a long press dragged past its tolerance after it began,
gave back a finger that was dragging: the host stopped cancelling its moves
and the page scrolled the rest of the drag, a hand change FR14 forbids and
UIKit never makes (its scroll view never takes a touch another recognizer
had). A cancel during a finger's move now keeps that finger claimed until
it lifts; a resting finger is given back as before, and a waiting
recognition that fails still gives its claim back.

The new arena case fails on the previous code: the dragging finger reads
unclaimed right after the cancel.
…edge-zone strip decides at UIKit's 15 px

The host's arena environment had no viewSize, so under the real host a
screen-edge pan never saw its edge zone while a touch was down and decided
at 10 px, while its attach-time touch-action (read through the default
environment) had already claimed the axis (spec:AST-094 FR18).

Co-authored-by: Christopher Chedeau <vjeux@users.noreply.github.com>
…fter layout rounding

Lane 0's real-host browser spec found a strip authored at the 40.2 px edge
region lays out at 40.203 px (layout snaps to 1/64 px), so the strict
comparison read it as off the zone and the pan decided at 10 px instead of
UIKit's 15 (spec:AST-094 FR18). The zone takes half a pixel of tolerance:
the rounded strip is the zone, a view a pixel wider still is not.
Failing-first test at 40.203 px: it claims pan-x and decides at 15.

Co-authored-by: Christopher Chedeau <vjeuxx@gmail.com>
Main's meta#8521 is its head 25b468c squashed, which this pull request already
carries: every file it touches is byte-identical to 25b468c. In the two
files that conflicted (the motion README and animator.ts), the resolution is
this side's version, main's merged meta#8521 with this pull request's later work
on top. Nothing of main is dropped.
An attach reads the element's own will-change in a task of its own. A
shared animator (animatorFor) is never detached, so its node can leave the
document with that read still waiting, and the read then forces a style
pass on a node with no style: a test run that mounts and unmounts many
pagers piled up such reads until a later wait timed out. The read now
skips a node out of the document; a promotion that needs it reads it then,
as one on a node attached in the same task does. A detach and dispose
already cancel it.

The new test fails on the previous code (one read of a removed node); the
in-task read test now puts its element in the document, where the read
happens.
…(spec:AST-094 FR18, DEC-13)

A screen-edge pan attached to a stack container, as wide as the screen,
with a touch 4 px from its edge: inside the 40.2 px band the pan decides at
UIKit's 15 px whatever the element's width, and then tracks the travel past
it. From several edges too. Both fail while a wider element decides at
FR19's 10 px.
…'s width (spec:AST-094 FR18, DEC-13)

FR18: inside the 40.2 px band a screen-edge pan decides at UIKit's 15 px
screen-edge hysteresis; outside it the author's scrolling is untouched and
FR19's 10 px governs every other claim. The pan decided at 10 px on any
element wider than the band, so NavigationStack's edge pan, attached to the
stack container, began 5 px early. The edge zone still decides only the
touch-action; a touch outside every band still fails at once. The two
cases that pinned the 10 px decision go.
… 15 px whatever the element's width) into the experimental touch exports
…er's move keeps that finger until it lifts) into the experimental touch exports
…than the band (spec:AST-094 FR18, DEC-22)

FR18 as amended in meta#8631 (DEC-22): the band's pan-x claim and 15 px start
hold only where the screen-edge pan is attached to an element within the
band; on an element that reaches beyond it, whose touch-action cannot
claim per touch, a touch in the band decides at FR19's 10 px like every
other claim. This restores the 10 px decision 3d85c30 removed and keeps
15 px on an element within the band. The cases pin DEC-22 both ways (a wide
element with a touch at x=4 begins at 10, an in-band strip at 15, and from
several edges at 10 on a wide element); the 10 px cases fail on 3d85c30.
…an the edge band decides at 10 px again, DEC-22) into the experimental touch exports
…xperimental touch exports

The motion README's Files table is the union: main's rows, with meta#8663's
resolveSnapPoint.ts and selectPage.ts, plus this branch's, in main's
order.

# Conflicts:
#	packages/core/src/motion/README.md
… rows united) into the row press release change

@astracat-bot astracat-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approval waits on an engineering-owner decision: no current spec covers hiding a List row's dividers under a touch press (component:List covers only the edge treatments, and design:user-states lists no list rows), and the open change request pauses this pull request until that is settled. An engineering owner can provide or identify the governing spec, or record approval of this behavior for this exact head by commenting /approve-spec 2121d8f641730a9d9c9adf7a1b0002ba44a74fdf; the author may do so as an engineering owner. Whatever the decision:

  • Land #8076 and #8077 first, then rebase, so this pull request carries only the 671-line divider change instead of 18,311 authored lines.
  • Report component sizes against this pull request's base (after the rebase, the ListItem figures are the whole report), and point the press-layer comments in ListItem.tsx and the ListDividers spec header at utils/rowPressLayer.ts.

[Automated review]

Comment on lines +196 to +203
borderBlockEndColor: {
default: colorVars['--color-border'],
'@media (pointer: coarse)': {
default: null,
'[data-astryx-press="on"]': 'transparent',
':has(+ [data-astryx-press="on"])': 'transparent',
},
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Under a coarse pointer this hides the pressed row's divider and the one above it. No current spec covers divider behavior during a press (component:List covers only the edge treatments, and design:user-states lists no list rows), so it needs an engineering owner's decision for this head before it can be approved.

Comment on lines +211 to +212
// While its divider is hidden, the press layer (the `cell` style of
// utils/interactionOverlay.stylex.ts) reaches over it, so the whole row

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The layer this stretches is rowPressLayerStyles.cell in utils/rowPressLayer.ts; utils/interactionOverlay.stylex.ts has no cell. The ListDividers spec header (L13–14) points at the same wrong module.

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Cindy decided to keep today's pressed overlay with no new press treatment, so "dividers hide on press" won't land. Could you close this PR, and rebase the PRs stacked on it (#8082, #8085, #8106, #8359, and the #8139 line) off it? If that's not done by about 10:56 PT, we'll add one revert commit (behavior, changeset, tests and story) at the lowest PR stacked on this one so the rest of the line can move, keeping your authorship. If a theme-owned pressed treatment is wanted later, it can come back as its own proposal.

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Correction to my comment above: I was wrong that an earlier decision rules this out. That decision covered a different control. Whether List dividers hide next to a pressed row is a new question for Cindy, and it's pending her decision. Please don't close or rebase anything for now; nothing will be reverted until she decides. Sorry for the noise.

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

Thanks for the iOS research here. Cindy decided to keep List dividers drawn while a row is pressed (today's behavior), with no new theme setting for hiding them. Could you close this PR and rebase the PRs stacked on it (#8082, #8085, #8106, #8359 and the #8139 line) off it? That includes #8082's selection hold, which also hides the dividers; that part should go too. If this stays idle for about 30 minutes, we'll add one revert commit at the lowest PR stacked on this one, covering behavior, changeset, tests and story, so the rest of the line can move. Your authorship stays.

@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf.

One more ask while you rebase: please also move #8082 (the selection hold) and #8114 (NavigationStack's use of it) off the middle of the line and onto the top of the stack. Whether a tapped row stays selected through a navigation is still an open question for Cindy. With those two on top, the rest of the line (#8085, #8106, #8359, #8139 and the reorder PRs) can land without waiting on it.

@vjeux

vjeux commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Closing per Cindy's decision: List dividers stay drawn while a row is pressed. Thanks for the review; the branch stays.

@vjeux vjeux closed this Oct 28, 2026
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 28, 2026
Per the maintainer's decisions on meta#8079 and meta#8082: List dividers stay
drawn while a row is pressed, with no theme setting, and a row's
selection through a navigation stays the product's call through
ListItem's existing `isSelected`, so Core gains no selection hold.

This removes, from the touch row target change, everything meta#8079 and
meta#8082 brought into it: the divider arms under a touch press, the press
layer's reach over the divider, the hold and its export, their
changesets, tests and stories. The touch target itself is unchanged. Two
test helpers the touch target's own tests read stay: the story opener
under a finger (touchStory.ts) and the rules split by the touch gate in
List.test.tsx.

Red first: the build-css test that every press state leaves the dividers
drawn fails on the change before this one.
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 28, 2026
…his branch

meta#8082 (a pushed row stays selected until the pop) and meta#8079 (a touch
press hides the dividers beside the row) are closed, so their code
leaves this branch: the selection hold and its tests, the divider
hiding and its tests, their changesets, and their edits to List, Item,
TreeListItem, the motion table, the row press layer and the coverage
and CSS tests, each back to meta#8077's text.
vjeux added a commit to vjeux/astryx that referenced this pull request Oct 29, 2026
…le uses

From review on meta#8085: the exemption let a file that paints a press pass
the guard whenever it rendered a marked component through `xstyle`. It
came with ListItem's divider arms, which the revert of meta#8079 took out,
so no file at this head reaches it, and in place it would wave through a
file whose press styles never reach that component's root. The guard is
again exactly as on the line below; it passes without the exemption.

This branch was successfully deployed

1 active deployment
Preview — 2121d8f6 Deployed Oct 27, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot. needs:design-review Affects visuals — Design should review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants