Skip to content

feat(List): editingControl="delete", UIKit's delete control in edit mode - #8393

Closed
vjeux wants to merge 1320 commits into
meta:mainfrom
vjeux:uikit/c11-list-editing-delete
Closed

vjeux wants to merge 1320 commits into
meta:mainfrom
vjeux:uikit/c11-list-editing-delete

Conversation

@vjeux

@vjeux vjeux commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Review only this PR's change: vjeux/astryx@3b4885d...9e116b7 (depends on #8369 and #8375; 3b4885d merges their heads).

User need

An iOS table in edit mode shows a red minus on each deletable row that opens its Delete action; a List cannot.

Problem and solution fit

  • editingControl="delete", UIKit's .delete style: under a finger, each row whose trailing swipe actions can rest open shows a disc in the theme's error colour with a bar across it (21.6 pt), the disc the control itself, the bar its ::before.
  • A row without trailing actions, or with swipeBehavior="commit" (nothing rests open), keeps the indent alone, as UIKit's .none.
  • A tap opens the row's trailing actions through its own swipe (chore(Item): a control in the row opens the row's swipe actions (internal seam) #8375); a tap on the row, or Done, closes them, as UIKit does. It never runs the row's action.
  • A touch accelerator, like the swipe: hidden from assistive tech, no tab stop.
  • Touch gate: useTouchPresentation().isTouch (spec:AST-094 FR13).

Size (gzip, against its parent, by the size report's tool): ListItem JS +1,020 B and CSS +103 B, List +31 B; no module added.

Current specification

None governs it. Proposed public API, pending owner review (component:List). Open owner question: a fine pointer has no swipe actions, so it gets no delete control (desktop unchanged, spec:AST-017 FR59).

Public delta and caller burden

<List isEditing editingControl="delete">; rows pass swipeActions.trailing. No new exports.

Evidence

Recorded on the iOS 26.2 simulator (Mobile Safari, its touch input); a real-device check is the release gate.

Path Clip
Edit; open Sent, tap the row to close it Open and close
Open Drafts and delete it, then Done Delete
Open Sent, then Done closes it Done

Scope

  • One capability is added.
  • Unrelated fixes, cleanup, and policy changes were removed or split.
  • Consumer docs, focused tests, and migration evidence ship with the feature.
  • Public text and artifacts contain no internal Meta context.

Testing

Written first and red: 7 unit tests (which rows show it, none with a mouse, semantics, the slide, opening, closing, Done), then a commit row shows none (unit, with the seam mocked and through the real row); the browser spec covers the geometry, real touch, Done, reduced motion and a mouse.

Green on #8076 62ecda1: root build and pnpm typecheck, Storybook typecheck, eslint, build-css, CLI, CI duration guard, the ui project's 16,120 tests (load timeouts pass alone), and the edit-mode stories with a mouse. Interaction proofs: Chromium 96 and WebKit 77, TreeList's Reduce Motion case included. Story core-list--editing-delete.

@vercel

vercel Bot commented Oct 25, 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 26, 2026 8:40pm UTC

Request Review

@astracat-bot

astracat-bot Bot commented Oct 25, 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:41 AM UTC

@github-actions github-actions Bot added needs:spec-owner-review Current knowledge records await owner approval needs:design-review Affects visuals — Design should review labels Oct 25, 2026

@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's decision before it can be approved: no current spec governs the new editingControl="delete" value, and the diff also adds the spec:AST-094 record, which has no exact-head owner approval yet. An engineering owner can record approval of the proposed direction by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner; the decision should also say which record will state the delete control, including what keyboard and fine-pointer users get. Independent of that decision, these changes are still needed:

  • Land #8369, #8375 and their chain first, then rebase so this pull request's diff against main is the delete-control commit alone.
  • The swipe release rule carried in from that chain no longer fires on a fling, which spec:AST-057 FR5 requires, so settle it in its own pull request.
  • Gate the delete disc on the same conditions Item uses to serve a swipe, so disabled and interactiveRef rows do not show a control that does nothing.
  • Read the touch state from ListContext instead of subscribing to media queries in every ListItem.

[Automated review]

const isTouch = useTouchPresentation().isTouch;
const controlKind =
ctx?.editingControl === 'delete'
? isTouch && (restProps.swipeActions?.trailing?.length ?? 0) > 0

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 shows the delete disc on every touch row with trailing actions, but Item serves a swipe only when the row is not disabled, has no interactiveRef and has role listitem or none (Item.tsx:651-657). On a disabled or delegate row useItemSwipeReveal() is null, so the disc renders at full strength and its tap returns at line 468. Gating 'delete' on the same conditions (at least !isDisabled and no interactiveRef) and adding a disabled-row test would fix it.

// a finger only, so with a mouse there is none (desktop unchanged), and a
// row with nothing to reveal keeps the indent alone.
const CheckboxControl = useIndicator('checkbox');
const isTouch = useTouchPresentation().isTouch;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Every ListItem now holds its own (pointer: coarse) and compact-viewport subscriptions through useTouchPresentation(), in every list, editing or not. List already resolves the same fact once (List.tsx:299); publishing it in ListContext would avoid the per-row fan-out that react-component-runtime INV7 rules out.

if (isConfirmed) {
return 'perform';
}
if (behavior === 'commit' || wasConfirmed) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

With this rule a fling opens or closes the row and never fires the outermost entry, under commit too. spec:AST-057 FR5 on main still says "a drag past the commit point or a fling MUST fire the outermost entry". This comes from the #8375 chain, so it needs FR5 amended by an owner, or the rule conformed, in that pull request.

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Oct 25, 2026
@vjeux
vjeux force-pushed the uikit/c11-list-editing-delete branch from c7cb859 to ecb585b Compare October 25, 2026 12:30

@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's decision before it can be approved: no current spec governs the new editingControl="delete" value, and the diff also adds the spec:AST-094 record, which has no owner approval on this head and is being decided in #8378. An engineering owner can record approval of the proposed direction by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner; the decision should also name the record that will state the delete control, including what keyboard and fine-pointer users get. Independent of that decision, these changes are still needed:

  • Land #8369, #8375 and their chain first, then rebase so this pull request's diff against main is the delete-control commit alone.
  • The swipe release rule carried in from that chain no longer fires on a fling, which spec:AST-057 FR5 requires, so settle it in that chain's pull request.
  • Gate the delete disc on the same conditions Item uses to serve a swipe, so disabled and interactiveRef rows do not show a control that does nothing.
  • Read the touch state from ListContext instead of subscribing to media queries in every ListItem.

[Automated review]

@github-actions github-actions Bot removed the needs:spec-owner-review Current knowledge records await owner approval label Oct 25, 2026

@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's decision before it can be approved: no current spec governs the new editingControl="delete" value, so an engineering owner needs to provide or identify the record that states it, including what keyboard and fine-pointer users get and, because the disc is an element rows render only under touch, the exception spec:AST-017 FR60 requires with before-and-after element counts. An engineering owner can record approval of the proposed direction by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner. Independent of that decision, these changes are still needed:

  • Land #8369, #8375 and their chain first, then rebase so this pull request's diff against main is the delete-control commit alone.
  • The swipe release rule carried in from that chain no longer fires on a fling, which spec:AST-057 FR5 requires, so settle it in that chain's pull request.
  • Gate the delete disc on the same conditions Item uses to serve a swipe, so disabled and interactiveRef rows do not show a control that does nothing.
  • Read the touch state from ListContext instead of subscribing to media queries in every ListItem.

[Automated review]

edge === 'bleed' && editingStyles.controlBleed,
];
const editingControl = !showsControl ? null : controlKind === 'delete' ? (
<ListDeleteControl isEditing={isEditing} xstyle={controlStyles} />

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 span exists only under a coarse pointer, so each row with trailing actions has one more element under a finger than with a mouse. spec:AST-017 FR60 on main keeps list items at the strict budget ("Under touch, a component renders no more elements than under a fine pointer"; "Anything beyond this needs an owner exception with before and after counts"), so this needs that exception with the story's fine- and coarse-pointer element counts, or the disc drawn on an existing element.

vjeux and others added 9 commits October 26, 2026 02:54
…meta#8067, meta#8056 and meta#8055 fixes) into the presented start

Four files both sides changed: the animator's attach flushes waiting
presented calls before the element changes and leaves demotion to her later
step after the landing's commit; dispose flushes them, then lands pending
moves as her version does; the test's style stub takes her pseudo-element
stylesheet and keeps this side's live-animation hold; the README and the
browser spec's header take her wording, with this side's added proofs.
…by the merge

The previous merge commit kept conflict markers in GestureHost.ts's
imports. The host keeps this branch's type-only imports of the hover and
pan recognizers (its guards duck-type them, so a page ships only the
recognizers it constructs).
…eps flag goes

Under the Reduce Motion plan no segment is a step function: a waiting move
is a landing, and stop() lands it through cancelLanding('opacity'). The
step-segment landing block meta#8055 adds to stop() never runs here, nor does
the steps flag's sampling branch; both go.
…te waits) into the storyboards

# Conflicts:
#	internal/interaction-harness/README.md
…egan-elsewhere; a recognizer's own scroll is not the browser taking the finger

From CodeBunny on meta#8195, fixed once here where the host enters:
- spec:AST-094 FR28: a touch with no recognizer or consumer on its path
  never reached the arena, so a recognizer tracking a finger was never
  told about a second finger beside it (a menu press could not end on
  one). GestureArena.untrackedBegan reports such a touch to recognizers
  that are tracking touches; it creates no record, claim or lock, and its
  moves and end stay the page's.
- spec:AST-094 FR30: a recognizer that scrolls a scroller itself (a menu's
  edge autoscroll) was cancelled by its own write. The internal
  GestureHost.ownScroll(scroller) makes onScroll skip that scroller until
  two frames pass; a real pan in that window still reports itself through
  pointercancel or touchcancel.
Three tests; two fail on the previous head.
vjeux and others added 22 commits October 26, 2026 11:55
# Conflicts:
#	packages/core/src/motion/README.md

@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's decision before it can be approved: no current spec governs the new editingControl="delete" value, so an engineering owner needs to provide or identify the record that states it, including what keyboard and fine-pointer users get and, because the disc is an element rows render only under touch, the spec:AST-017 FR60 exception with before-and-after element counts. An engineering owner can record approval of the proposed direction by commenting /approve-spec <full head SHA> on this pull request, and the author may do so if they are an engineering owner. Independent of that decision, these changes are still needed:

  • Land #8369, #8375 and their chain first, then rebase so this pull request's diff against main is the delete-control change alone.
  • The swipe release rule carried in from that chain no longer fires on a fling, which spec:AST-057 FR5 requires, so settle it in that chain's pull request.
  • That chain also imports Item's swipe layer, with the gesture system and animator, statically where main loads it lazily; CI measures Item's import at about 31 KB gzip larger, so keep it lazy or flag and justify the cost there.
  • Read the touch state from ListContext instead of subscribing to media queries in every ListItem, and add tests showing no delete disc on disabled and interactiveRef rows.

[Automated review]

@github-actions

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 1816 -
Complexity Very High Very High (115) -
TreeList (@astryxdesign/core) · View in Storybook
Metric Before After Delta
Entry File (ESM) 648B 648B 0B
Lines of Code 872 1056 -
Complexity Very High Very High (101) -

Component Size

Component Import before Import after Delta CSS before CSS after Delta
core/AlertDialog 54.6KB 55.0KB +442B 12.4KB 12.5KB +24B
core/AppShell 55.7KB 56.1KB +425B 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.4KB +465B 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.3KB +452B 9.9KB 10.0KB +22B
core/BaseTypeahead 53.8KB 54.3KB +449B 9.9KB 9.9KB +22B
core/Blockquote 3.5KB 3.6KB +66B 3.4KB 3.4KB +39B
core/BottomSheet 26.0KB 26.0KB +63B 7.7KB 7.8KB +23B
core/BottomSheetSwitcher 9.2KB 9.3KB +71B 3.3KB 3.3KB +41B
core/BreadcrumbItem 65.9KB 97.0KB +31.1KB ⚠️ 11.0KB 11.5KB +480B
core/Breadcrumbs 22.4KB 22.5KB +71B 3.3KB 3.3KB +40B
core/Button 43.3KB 43.7KB +447B 9.2KB 9.2KB +21B
core/ButtonGroup 8.4KB 8.5KB +67B 3.3KB 3.3KB +40B
core/Calendar 54.9KB 55.3KB +463B 10.0KB 10.0KB +22B
core/Card 6.4KB 6.5KB +66B 6.3KB 6.4KB +42B
core/Carousel 50.2KB 50.7KB +472B 10.2KB 10.2KB +21B
core/Center 4.2KB 4.2KB +63B 4.6KB 4.6KB +42B
core/ChatComposer 60.4KB 60.8KB +437B 10.8KB 10.8KB +19B
core/ChatComposerDrawer 23.9KB 23.9KB +66B 4.5KB 4.6KB +39B
core/ChatComposerInput 55.5KB 55.9KB +439B 10.1KB 10.1KB +21B
core/ChatComposerTokenElement 55.5KB 55.9KB +435B 10.1KB 10.1KB +21B
core/ChatDictationButton 46.5KB 46.9KB +436B 9.5KB 9.5KB +20B
core/ChatLayout 48.8KB 49.3KB +443B 9.9KB 10.0KB +20B
core/ChatLayoutScrollButton 46.4KB 46.8KB +421B 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.4KB 28.5KB +70B 7.8KB 7.8KB +21B
core/ChatMessageMetadata 25.8KB 25.9KB +60B 3.9KB 3.9KB +23B
core/ChatSendButton 45.8KB 46.3KB +438B 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.4KB 49.9KB +456B 9.3KB 9.3KB +22B
core/CheckboxList 46.0KB 60.7KB +14.7KB ⚠️ 8.1KB 8.2KB +79B
core/CheckboxListItem 53.6KB 85.9KB +32.3KB ⚠️ 10.5KB 11.4KB +904B
core/Citation 25.9KB 26.0KB +69B 4.1KB 4.2KB +41B
core/ClickableCard 12.8KB 13.3KB +470B 6.9KB 7.0KB +46B
core/Code 3.5KB 3.6KB +63B 3.4KB 3.4KB +41B
core/CodeBlock 60.5KB 60.9KB +446B 10.7KB 10.7KB +27B
core/Collapsible 11.7KB 12.1KB +452B 4.2KB 4.3KB +39B
core/CollapsibleGroup 6.4KB 6.4KB +71B 3.2KB 3.2KB +40B
core/CommandPalette 49.2KB 49.7KB +495B 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 31.9KB 31.9KB +67B 8.1KB 8.1KB +22B
core/CommandPaletteItem 8.4KB 8.9KB +449B 3.5KB 3.5KB +40B
core/CommandPaletteList 22.4KB 22.5KB +65B 3.3KB 3.3KB +41B
core/ComplexSelector 55.3KB 55.8KB +494B 10.6KB 10.7KB +20B
core/ContextMenu 77.3KB 113.2KB +35.9KB ⚠️ 14.5KB 15.4KB +943B
core/ContextMenuItem 16.6KB 47.5KB +30.9KB ⚠️ 5.2KB 5.7KB +448B
core/DateInput 92.5KB 92.8KB +379B 14.6KB 14.7KB +23B
core/DateRangeInput 69.0KB 69.4KB +423B 11.2KB 11.2KB +21B
core/DateTimeInput 102.6KB 103.0KB +442B 15.1KB 15.1KB +22B
core/Dialog 13.7KB 13.8KB +69B 7.1KB 7.1KB +23B
core/DialogHeader 48.8KB 49.3KB +452B 9.8KB 9.8KB +20B
core/Divider 6.5KB 6.5KB +64B 3.6KB 3.6KB +43B
core/Drawer 29.3KB 29.4KB +68B 8.0KB 8.1KB +23B
core/DrawerHeader 48.9KB 49.3KB +424B 11.2KB 11.2KB +22B
core/DropdownMenu 72.2KB 103.2KB +30.9KB ⚠️ 14.6KB 15.5KB +934B
core/DropdownMenuCheckboxItem 16.1KB 46.7KB +30.6KB ⚠️ 5.6KB 6.0KB +436B
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 45.9KB +30.5KB ⚠️ 5.2KB 5.6KB +446B
core/DropdownMenuRadioGroup 6.0KB 6.1KB +62B 3.2KB 3.2KB +43B
core/DropdownMenuRadioItem 16.2KB 46.8KB +30.6KB ⚠️ 5.6KB 6.0KB +436B
core/DropdownMenuSubMenu 57.5KB 88.1KB +30.5KB ⚠️ 9.5KB 10.0KB +446B
core/EmptyState 7.6KB 7.7KB +66B 3.5KB 3.6KB +42B
core/Field 44.2KB 44.2KB +73B 8.0KB 8.0KB +22B
core/FieldLabel 39.8KB 39.8KB +58B 6.5KB 6.5KB +23B
core/FieldStatus 10.3KB 10.4KB +65B 4.2KB 4.3KB +23B
core/FileInput 53.7KB 54.2KB +439B 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.8KB +453B 9.2KB 9.2KB +21B
core/InputGroup 44.8KB 44.8KB +63B 8.0KB 8.1KB +21B
core/InputGroupText 6.3KB 6.4KB +66B 3.7KB 3.8KB +40B
core/Item 11.4KB 41.9KB +30.5KB ⚠️ 4.7KB 5.1KB +440B
core/Kbd 6.7KB 6.7KB +67B 3.5KB 3.5KB +40B
core/LayerProvider 63.2KB 63.6KB +475B 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 49.5KB 49.9KB +439B 9.8KB 9.8KB +21B
core/Link 43.5KB 43.9KB +453B 7.6KB 7.6KB +25B
core/List 6.7KB 21.8KB +15.0KB ⚠️ 3.4KB 3.6KB +184B
core/ListItem 53.0KB 85.4KB +32.4KB ⚠️ 10.5KB 11.4KB +904B
core/Markdown 143.9KB 180.2KB +36.3KB ⚠️ 17.2KB 18.1KB +897B
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 48.8KB 49.2KB +424B 10.1KB 10.1KB +22B
core/MobileNavToggle 46.2KB 46.6KB +426B 9.4KB 9.4KB +20B
core/MoreMenu 72.5KB 103.4KB +30.9KB ⚠️ 14.6KB 15.5KB +934B
core/MultiSelector 75.7KB 76.1KB +448B 14.5KB 14.5KB +23B
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.6KB 56.1KB +452B 10.7KB 10.7KB +31B
core/Outline 28.6KB 29.1KB +452B 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.3KB 118.1KB +30.8KB ⚠️ 15.2KB 15.6KB +369B
core/Popover 49.8KB 50.2KB +399B 12.0KB 12.0KB +21B
core/PowerSearch 147.7KB 180.9KB +33.2KB ⚠️ 18.5KB 18.9KB +459B
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.5KB 45.6KB +68B 8.0KB 8.0KB +22B
core/RadioListItem 52.1KB 83.1KB +30.9KB ⚠️ 9.7KB 10.1KB +411B
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 9.0KB +450B 3.9KB 3.9KB +41B
core/SelectableCard 12.8KB 13.2KB +464B 7.1KB 7.2KB +46B
core/Selector 78.7KB 110.3KB +31.6KB ⚠️ 14.8KB 15.2KB +418B
core/SelectorOption 14.5KB 45.1KB +30.6KB ⚠️ 5.1KB 5.5KB +442B
core/SideNav 55.8KB 56.2KB +435B 10.6KB 10.6KB +21B
core/SideNavCollapseButton 46.6KB 47.1KB +425B 9.5KB 9.5KB +20B
core/SideNavHeading 54.7KB 55.1KB +415B 10.1KB 10.2KB +22B
core/SideNavItem 54.4KB 54.8KB +431B 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.4KB 48.5KB +59B 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.9KB +453B 5.3KB 5.3KB +22B
core/Stepper 47.4KB 47.8KB +416B 9.6KB 9.6KB +20B
core/Switch 48.4KB 48.8KB +450B 9.3KB 9.4KB +21B
core/Tab 9.7KB 10.2KB +472B 4.1KB 4.1KB +41B
core/TabList 40.2KB 40.3KB +63B 7.2KB 7.2KB +23B
core/TabMenu 51.6KB 52.0KB +422B 10.0KB 10.0KB +21B
core/Table 83.5KB 119.5KB +36.0KB ⚠️ 15.0KB 15.9KB +923B
core/TableBody 3.3KB 3.3KB +63B 3.2KB 3.2KB +42B
core/TableCell 78.4KB 114.3KB +35.9KB ⚠️ 14.6KB 15.6KB +933B
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.1KB 114.0KB +35.9KB ⚠️ 14.6KB 15.5KB +942B
core/TableRow 6.2KB 6.3KB +66B 3.5KB 3.6KB +40B
core/TableSelectionToolbar 52.4KB 52.8KB +457B 11.2KB 11.2KB +21B
core/Text 8.6KB 8.6KB +66B 6.8KB 6.8KB +23B
core/TextArea 48.9KB 49.0KB +71B 9.4KB 9.4KB +21B
core/TextInput 53.1KB 53.6KB +447B 10.5KB 10.5KB +22B
core/Thumbnail 50.1KB 50.5KB +460B 11.0KB 11.0KB +25B
core/TimeInput 79.3KB 79.7KB +446B 13.6KB 13.6KB +23B
core/Timer 9.2KB 9.3KB +70B 6.8KB 6.8KB +23B
core/Timestamp 27.5KB 27.6KB +75B 9.5KB 9.6KB +21B
core/Toast 59.8KB 60.3KB +417B 9.7KB 9.7KB +22B
core/ToggleButton 44.1KB 44.5KB +415B 9.3KB 9.3KB +21B
core/ToggleButtonGroup 6.3KB 6.4KB +68B 3.2KB 3.3KB +42B
core/Token 29.6KB 30.1KB +463B 4.5KB 4.5KB +42B
core/Tokenizer 64.3KB 64.8KB +454B 11.7KB 11.7KB +21B
core/Toolbar 39.8KB 39.8KB +63B 7.7KB 7.8KB +46B
core/TopNav 49.7KB 50.1KB +419B 10.4KB 10.4KB +23B
core/TopNavHeading 54.2KB 54.5KB +396B 9.9KB 10.0KB +20B
core/TopNavItem 9.0KB 9.5KB +455B 3.8KB 3.9KB +39B
core/TopNavMegaMenu 54.2KB 54.6KB +427B 10.7KB 10.8KB +21B
core/TopNavMegaMenuFeaturedCard 6.7KB 6.8KB +66B 3.4KB 3.4KB +38B
core/TopNavMegaMenuItem 9.1KB 9.6KB +456B 4.1KB 4.1KB +38B
core/TopNavMenu 53.6KB 54.0KB +414B 10.1KB 10.1KB +23B
core/TreeList 32.5KB 46.2KB +13.7KB ⚠️ 4.7KB 5.1KB +439B
core/Typeahead 61.0KB 61.4KB +447B 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.

⚠️ Touch-only size budget

These components grew past the touch-only budget (2 KB gzip JavaScript or 1 KB gzip CSS per component). If the growth runs only on a coarse pointer, load its JavaScript lazily so the import does not carry it, or justify the cost in the pull request description; CSS stays in the package stylesheet, so justify it.

Component JavaScript CSS
core/BreadcrumbItem +31.1KB ⚠️ +480B
core/CheckboxList +14.7KB ⚠️ +79B
core/CheckboxListItem +32.3KB ⚠️ +904B
core/ContextMenu +35.9KB ⚠️ +943B
core/ContextMenuItem +30.9KB ⚠️ +448B
core/DropdownMenu +30.9KB ⚠️ +934B
core/DropdownMenuCheckboxItem +30.6KB ⚠️ +436B
core/DropdownMenuItem +30.5KB ⚠️ +446B
core/DropdownMenuRadioItem +30.6KB ⚠️ +436B
core/DropdownMenuSubMenu +30.5KB ⚠️ +446B
core/Item +30.5KB ⚠️ +440B
core/List +15.0KB ⚠️ +184B
core/ListItem +32.4KB ⚠️ +904B
core/Markdown +36.3KB ⚠️ +897B
core/MoreMenu +30.9KB ⚠️ +934B
core/Pagination +30.8KB ⚠️ +369B
core/PowerSearch +33.2KB ⚠️ +459B
core/RadioListItem +30.9KB ⚠️ +411B
core/Selector +31.6KB ⚠️ +418B
core/SelectorOption +30.6KB ⚠️ +442B
core/Table +36.0KB ⚠️ +923B
core/TableCell +35.9KB ⚠️ +933B
core/TableHeaderCell +35.9KB ⚠️ +942B
core/TreeList +13.7KB ⚠️ +439B

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.3KB 35.1KB +852B

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)

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

@cixzhang cixzhang closed this Oct 28, 2026
@cixzhang cixzhang reopened this Oct 28, 2026
@cixzhang

Copy link
Copy Markdown
Contributor

Posted by Cindy's agent on her behalf: closed and reopened only to restart this PR's CI on the current workflow after tonight's queue-wide cancel; nothing in the PR changed.

@vjeux

vjeux commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Closing per Cindy's decision on #8687: edit experiences compose through startContent/endContent and the animated-layout handle instead. Thanks for the review.

@vjeux vjeux closed this Oct 28, 2026

This branch was successfully deployed

1 active deployment
Preview — 9e116b7d Deployed Oct 26, 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