@astryxdesign/core 0.7.5-canary.fccd771 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +211 -10
- package/README.md +15 -12
- package/dist/AlertDialog/AlertDialog.js +1 -1
- package/dist/AppShell/AppShell.d.ts +0 -22
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +155 -1
- package/dist/Avatar/AvatarStatusDot.js +2 -2
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +18 -2
- package/dist/Banner/Banner.d.ts +1 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +64 -9
- package/dist/BottomSheet/BottomSheet.d.ts +53 -5
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +435 -198
- package/dist/BottomSheet/BottomSheetHostContext.d.ts +8 -0
- package/dist/BottomSheet/BottomSheetHostContext.d.ts.map +1 -0
- package/dist/BottomSheet/BottomSheetHostContext.js +35 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts +9 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +77 -23
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts +53 -14
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +229 -27
- package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +6 -0
- package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetEscape.d.ts +3 -0
- package/dist/BottomSheet/bottomSheetEscape.d.ts.map +1 -0
- package/dist/BottomSheet/bottomSheetEscape.js +20 -0
- package/dist/BottomSheet/bottomSheetStack.d.ts +262 -0
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -0
- package/dist/BottomSheet/bottomSheetStack.js +1675 -0
- package/dist/BottomSheet/useSheetGestures.d.ts +19 -3
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +43 -14
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +36 -3
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +18 -7
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +25 -32
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +55 -16
- package/dist/Chat/ChatMessageMetadata.js +2 -2
- package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
- package/dist/Chat/ChatPastedTextToken.js +7 -6
- package/dist/Chat/ChatToolCalls.js +4 -4
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +10 -6
- package/dist/CodeBlock/CodeBlock.d.ts +25 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +58 -19
- package/dist/CodeBlock/grammar.d.ts +134 -0
- package/dist/CodeBlock/grammar.d.ts.map +1 -0
- package/dist/CodeBlock/grammar.js +219 -0
- package/dist/CodeBlock/index.d.ts +2 -0
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/CodeBlock/index.js +1 -0
- package/dist/CodeBlock/languages/dockerfile.d.ts +3 -0
- package/dist/CodeBlock/languages/dockerfile.d.ts.map +1 -0
- package/dist/CodeBlock/languages/dockerfile.js +45 -0
- package/dist/CodeBlock/languages/graphql.d.ts +3 -0
- package/dist/CodeBlock/languages/graphql.d.ts.map +1 -0
- package/dist/CodeBlock/languages/graphql.js +27 -0
- package/dist/CodeBlock/languages/java.d.ts +3 -0
- package/dist/CodeBlock/languages/java.d.ts.map +1 -0
- package/dist/CodeBlock/languages/java.js +24 -0
- package/dist/CodeBlock/languages/lua.d.ts +3 -0
- package/dist/CodeBlock/languages/lua.d.ts.map +1 -0
- package/dist/CodeBlock/languages/lua.js +21 -0
- package/dist/CodeBlock/languages/objective-c.d.ts +3 -0
- package/dist/CodeBlock/languages/objective-c.d.ts.map +1 -0
- package/dist/CodeBlock/languages/objective-c.js +27 -0
- package/dist/CodeBlock/languages/powershell.d.ts +3 -0
- package/dist/CodeBlock/languages/powershell.d.ts.map +1 -0
- package/dist/CodeBlock/languages/powershell.js +30 -0
- package/dist/CodeBlock/languages/ruby.d.ts +3 -0
- package/dist/CodeBlock/languages/ruby.d.ts.map +1 -0
- package/dist/CodeBlock/languages/ruby.js +24 -0
- package/dist/CodeBlock/languages/thrift.d.ts +3 -0
- package/dist/CodeBlock/languages/thrift.d.ts.map +1 -0
- package/dist/CodeBlock/languages/thrift.js +18 -0
- package/dist/CodeBlock/languages/toml.d.ts +3 -0
- package/dist/CodeBlock/languages/toml.d.ts.map +1 -0
- package/dist/CodeBlock/languages/toml.js +53 -0
- package/dist/CodeBlock/tokenizer.d.ts +8 -4
- package/dist/CodeBlock/tokenizer.d.ts.map +1 -1
- package/dist/CodeBlock/tokenizer.js +158 -8
- package/dist/Collapsible/Collapsible.d.ts +8 -1
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +84 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +15 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +1 -0
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +14 -2
- package/dist/CommandPalette/busyStartSettle.d.ts +4 -0
- package/dist/CommandPalette/busyStartSettle.d.ts.map +1 -0
- package/dist/CommandPalette/busyStartSettle.js +23 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts +20 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +42 -7
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +48 -13
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -5
- package/dist/DateInput/NativeDateField.d.ts.map +1 -1
- package/dist/DateInput/NativeDateField.js +2 -1
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +2 -1
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +1 -1
- package/dist/Dialog/Dialog.d.ts +4 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +20 -8
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +18 -13
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +34 -30
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts +7 -4
- package/dist/DropdownMenu/DropdownMenuGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuGroup.js +10 -4
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +10 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +13 -5
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +6 -6
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +0 -3
- package/dist/DropdownMenu/MenuBottomSheet.d.ts +11 -4
- package/dist/DropdownMenu/MenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheet.js +35 -9
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +3 -3
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +2 -0
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +25 -3
- package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts +23 -0
- package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts.map +1 -0
- package/dist/DropdownMenu/menuBottomSheet.stylex.js +29 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +3 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemHover.js +14 -1
- package/dist/DropdownMenu/menuTouchAction.stylex.d.ts +25 -0
- package/dist/DropdownMenu/menuTouchAction.stylex.d.ts.map +1 -0
- package/dist/DropdownMenu/menuTouchAction.stylex.js +29 -0
- package/dist/DropdownMenu/useMenuDrillIn.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuDrillIn.js +7 -5
- package/dist/EmptyState/EmptyState.d.ts +4 -2
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +6 -4
- package/dist/Field/Field.js +1 -1
- package/dist/Field/FieldLabel.js +1 -1
- package/dist/Field/PanelSearchInput.d.ts +9 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +31 -22
- package/dist/Field/inputDisabledFocus.d.ts +14 -0
- package/dist/Field/inputDisabledFocus.d.ts.map +1 -0
- package/dist/Field/inputDisabledFocus.js +19 -0
- package/dist/Field/inputStyles.stylex.d.ts +9 -9
- package/dist/Field/inputStyles.stylex.js +9 -9
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +7 -3
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +22 -12
- package/dist/Icon/Icon.d.ts +37 -5
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +65 -11
- package/dist/Icon/IconSize.stylex.d.ts +16 -11
- package/dist/Icon/IconSize.stylex.d.ts.map +1 -1
- package/dist/Icon/IconSize.stylex.js +27 -11
- package/dist/Icon/globalIconRegistry.d.ts +71 -4
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +163 -23
- package/dist/Icon/index.d.ts +26 -2
- package/dist/Icon/index.d.ts.map +1 -1
- package/dist/Icon/index.js +24 -1
- package/dist/Icon/useIcon.d.ts +5 -1
- package/dist/Icon/useIcon.d.ts.map +1 -1
- package/dist/Icon/useIcon.js +5 -1
- package/dist/InputGroup/InputGroup.d.ts +1 -1
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +46 -36
- package/dist/InputGroup/InputGroupInternalContext.d.ts +4 -0
- package/dist/InputGroup/InputGroupInternalContext.d.ts.map +1 -0
- package/dist/InputGroup/InputGroupInternalContext.js +15 -0
- package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupText.js +2 -0
- package/dist/InputGroup/groupStyles.d.ts +9 -0
- package/dist/InputGroup/groupStyles.d.ts.map +1 -1
- package/dist/InputGroup/groupStyles.js +28 -14
- package/dist/Item/Item.d.ts +5 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +23 -7
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts +2 -0
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts.map +1 -0
- package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.js +132 -0
- package/dist/Item/ItemMarkerColumnsContext.d.ts +14 -0
- package/dist/Item/ItemMarkerColumnsContext.d.ts.map +1 -0
- package/dist/Item/ItemMarkerColumnsContext.js +18 -0
- package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
- package/dist/Item/ItemSwipeLayer.js +3 -0
- package/dist/Item/useSwipeAction.d.ts.map +1 -1
- package/dist/Item/useSwipeAction.js +60 -5
- package/dist/Kbd/Kbd.d.ts +2 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +18 -11
- package/dist/Layer/layerAnimations.stylex.d.ts +9 -5
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +23 -10
- package/dist/Layer/layerSlideRules.d.ts +62 -2
- package/dist/Layer/layerSlideRules.d.ts.map +1 -1
- package/dist/Layer/layerSlideRules.js +124 -3
- package/dist/Layer/layerStack.d.ts +12 -9
- package/dist/Layer/layerStack.d.ts.map +1 -1
- package/dist/Layer/layerStack.js +116 -53
- package/dist/Layer/modalOutlet.d.ts +44 -6
- package/dist/Layer/modalOutlet.d.ts.map +1 -1
- package/dist/Layer/modalOutlet.js +150 -14
- package/dist/Layer/preserveAnimations.d.ts +11 -0
- package/dist/Layer/preserveAnimations.d.ts.map +1 -0
- package/dist/Layer/preserveAnimations.js +245 -0
- package/dist/Layer/useLayer.d.ts +19 -2
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +531 -44
- package/dist/Layer/useLayerDismissal.d.ts +10 -7
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +8 -8
- package/dist/Layer/useTouchTrigger.d.ts +14 -1
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +72 -17
- package/dist/Layout/Layout.d.ts.map +1 -1
- package/dist/Layout/Layout.js +4 -0
- package/dist/Layout/LayoutContent.d.ts.map +1 -1
- package/dist/Layout/LayoutContent.js +2 -2
- package/dist/Layout/LayoutFooter.d.ts.map +1 -1
- package/dist/Layout/LayoutFooter.js +2 -1
- package/dist/Layout/LayoutHeader.d.ts.map +1 -1
- package/dist/Layout/LayoutHeader.js +2 -1
- package/dist/Layout/layoutEdges.stylex.d.ts +20 -0
- package/dist/Layout/layoutEdges.stylex.d.ts.map +1 -0
- package/dist/Layout/layoutEdges.stylex.js +28 -0
- package/dist/Lightbox/Lightbox.d.ts +5 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +111 -89
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts +2 -0
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts.map +1 -0
- package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.js +78 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts +2 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts.map +1 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +65 -0
- package/dist/List/List.d.ts +2 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +9 -2
- package/dist/List/ListContext.d.ts +16 -4
- package/dist/List/ListContext.d.ts.map +1 -1
- package/dist/List/ListContext.js +10 -5
- package/dist/List/ListItem.d.ts +7 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +52 -8
- package/dist/List/ListMarkers.a11y.chromium.spec.d.ts +2 -0
- package/dist/List/ListMarkers.a11y.chromium.spec.d.ts.map +1 -0
- package/dist/List/ListMarkers.a11y.chromium.spec.js +677 -0
- package/dist/Markdown/Markdown.d.ts +11 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.bench.js +3 -1
- package/dist/Markdown/Markdown.fr23.sampling.d.ts +16 -0
- package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -1
- package/dist/Markdown/Markdown.fr23.sampling.js +13 -4
- package/dist/Markdown/Markdown.js +41 -14
- package/dist/Markdown/MarkdownTable.a11y.chromium.spec.js +1 -0
- package/dist/MobileNav/MobileNav.d.ts +2 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +46 -37
- package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.js +1 -0
- package/dist/MobileNav/MobileNavToggle.d.ts +7 -3
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +11 -3
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +53 -6
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.js +1 -0
- package/dist/MultiSelector/MultiSelector.js +21 -5
- package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +1 -0
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +29 -5
- package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenuItem.js +51 -7
- package/dist/NavMenu/NavMenuContext.d.ts +9 -0
- package/dist/NavMenu/NavMenuContext.d.ts.map +1 -1
- package/dist/NavMenu/NavMenuContext.js +9 -0
- package/dist/NumberInput/NumberInput.d.ts +4 -4
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +61 -24
- package/dist/Overlay/Overlay.d.ts +3 -3
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +12 -5
- package/dist/Popover/Popover.d.ts +41 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +276 -44
- package/dist/Popover/index.d.ts +1 -1
- package/dist/Popover/index.d.ts.map +1 -1
- package/dist/Popover/lazyPopoverBottomSheet.d.ts +23 -0
- package/dist/Popover/lazyPopoverBottomSheet.d.ts.map +1 -0
- package/dist/Popover/lazyPopoverBottomSheet.js +40 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +11 -5
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +7 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +8 -0
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +10 -2
- package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
- package/dist/ScrollableArea/ScrollableArea.js +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +6 -2
- package/dist/SelectableCard/SelectableCard.d.ts +5 -5
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +15 -11
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +27 -8
- package/dist/Selector/hooks.d.ts +52 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +145 -2
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +58 -2
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +79 -3
- package/dist/SideNav/SideNavItem.d.ts +5 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +36 -13
- package/dist/SideNav/railMotion.d.ts +54 -0
- package/dist/SideNav/railMotion.d.ts.map +1 -0
- package/dist/SideNav/railMotion.js +253 -0
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +12 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +52 -15
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +12 -0
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +10 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +5 -5
- package/dist/Switch/switch.markers.stylex.d.ts +7 -2
- package/dist/Switch/switch.markers.stylex.d.ts.map +1 -1
- package/dist/Switch/switch.markers.stylex.js +8 -3
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +5 -1
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +25 -3
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +5 -1
- package/dist/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.js +1 -0
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +3 -0
- package/dist/Table/glidingDivider.d.ts +96 -0
- package/dist/Table/glidingDivider.d.ts.map +1 -0
- package/dist/Table/glidingDivider.js +275 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -2
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +8 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +374 -13
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +244 -6
- package/dist/Table/rowDivider.d.ts +34 -0
- package/dist/Table/rowDivider.d.ts.map +1 -0
- package/dist/Table/rowDivider.js +118 -0
- package/dist/TextArea/TextArea.d.ts +6 -4
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +15 -12
- package/dist/TextInput/TextInput.d.ts +7 -5
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +43 -22
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +45 -11
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +12 -4
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +2 -1
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +62 -6
- package/dist/Tokenizer/Tokenizer.d.ts +71 -4
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +430 -45
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +98 -0
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerBottomSheet.js +721 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +9 -3
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +26 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +4 -4
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +32 -4
- package/dist/TreeList/TreeList.d.ts +8 -23
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +175 -3
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +7 -5
- package/dist/TreeList/TreeListItem.d.ts +7 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +5 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts.map +1 -0
- package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.js +118 -0
- package/dist/Typeahead/BaseTypeahead.js +27 -11
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +31 -14
- package/dist/astryx.css +164 -41
- package/dist/gestures/GestureArena.d.ts +175 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -0
- package/dist/gestures/GestureArena.js +816 -0
- package/dist/gestures/GestureRecognizer.d.ts +239 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/GestureRecognizer.js +487 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts +32 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/LongPressGestureRecognizer.js +135 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +117 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PanGestureRecognizer.js +349 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +39 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/TapGestureRecognizer.js +151 -0
- package/dist/gestures/VelocityTracker.d.ts +51 -0
- package/dist/gestures/VelocityTracker.d.ts.map +1 -0
- package/dist/gestures/VelocityTracker.js +186 -0
- package/dist/gestures/geometry.d.ts +17 -0
- package/dist/gestures/geometry.d.ts.map +1 -0
- package/dist/gestures/geometry.js +55 -0
- package/dist/gestures/types.d.ts +139 -0
- package/dist/gestures/types.d.ts.map +1 -0
- package/dist/gestures/types.js +67 -0
- package/dist/hooks/AnnounceRenderedText.d.ts +17 -0
- package/dist/hooks/AnnounceRenderedText.d.ts.map +1 -0
- package/dist/hooks/AnnounceRenderedText.js +32 -0
- package/dist/hooks/ModalAnnounceProvider.d.ts +41 -0
- package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -0
- package/dist/hooks/ModalAnnounceProvider.js +133 -0
- package/dist/hooks/actionGroupTracker.d.ts +98 -0
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -0
- package/dist/hooks/actionGroupTracker.js +338 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/menuPressOnItems.d.ts +19 -0
- package/dist/hooks/menuPressOnItems.d.ts.map +1 -0
- package/dist/hooks/menuPressOnItems.js +32 -0
- package/dist/hooks/modalAnnounce.d.ts +18 -0
- package/dist/hooks/modalAnnounce.d.ts.map +1 -0
- package/dist/hooks/modalAnnounce.js +382 -0
- package/dist/hooks/scrollGeometry.d.ts +28 -0
- package/dist/hooks/scrollGeometry.d.ts.map +1 -1
- package/dist/hooks/scrollGeometry.js +36 -2
- package/dist/hooks/useAdaptivePresentation.d.ts +9 -1
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +33 -8
- package/dist/hooks/useAnimatedLayout.d.ts +42 -0
- package/dist/hooks/useAnimatedLayout.d.ts.map +1 -0
- package/dist/hooks/useAnimatedLayout.js +46 -0
- package/dist/hooks/useAnnounce.d.ts +132 -1
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +356 -27
- package/dist/hooks/useAnnounceRenderedText.d.ts +19 -2
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +52 -11
- package/dist/hooks/useBusyAnnouncement.d.ts +9 -5
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +58 -46
- package/dist/hooks/useFocusTrap.d.ts +1 -1
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +57 -26
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +6 -2
- package/dist/hooks/useMenuPress.d.ts +4 -2
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +58 -33
- package/dist/hooks/usePressFeedback.d.ts +5 -2
- package/dist/hooks/usePressFeedback.d.ts.map +1 -1
- package/dist/hooks/usePressFeedback.js +5 -2
- package/dist/hooks/useScrollableArea.d.ts +5 -0
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +104 -11
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +33 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +33 -0
- package/dist/internal/tokenizer-presentation.d.ts +21 -0
- package/dist/internal/tokenizer-presentation.d.ts.map +1 -0
- package/dist/internal/tokenizer-presentation.js +21 -0
- package/dist/internal/touch.d.ts +26 -0
- package/dist/internal/touch.d.ts.map +1 -0
- package/dist/internal/touch.js +28 -0
- package/dist/motion/LayoutChangeSnapshot.d.ts +33 -0
- package/dist/motion/LayoutChangeSnapshot.d.ts.map +1 -0
- package/dist/motion/LayoutChangeSnapshot.js +37 -0
- package/dist/motion/animatedLayout.d.ts +190 -0
- package/dist/motion/animatedLayout.d.ts.map +1 -0
- package/dist/motion/animatedLayout.js +1502 -0
- package/dist/motion/animator.d.ts +240 -0
- package/dist/motion/animator.d.ts.map +1 -0
- package/dist/motion/animator.js +2203 -0
- package/dist/motion/bezier.d.ts +18 -0
- package/dist/motion/bezier.d.ts.map +1 -0
- package/dist/motion/bezier.js +60 -0
- package/dist/motion/coast.d.ts +61 -0
- package/dist/motion/coast.d.ts.map +1 -0
- package/dist/motion/coast.js +107 -0
- package/dist/motion/decay.d.ts +41 -0
- package/dist/motion/decay.d.ts.map +1 -0
- package/dist/motion/decay.js +90 -0
- package/dist/motion/projection.d.ts +36 -0
- package/dist/motion/projection.d.ts.map +1 -0
- package/dist/motion/projection.js +92 -0
- package/dist/motion/reducedMotion.d.ts +25 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -0
- package/dist/motion/reducedMotion.js +85 -0
- package/dist/motion/reducedMotion.stylex.d.ts +19 -0
- package/dist/motion/reducedMotion.stylex.d.ts.map +1 -0
- package/dist/motion/reducedMotion.stylex.js +37 -0
- package/dist/motion/reducedMotionPlan.d.ts +89 -0
- package/dist/motion/reducedMotionPlan.d.ts.map +1 -0
- package/dist/motion/reducedMotionPlan.js +194 -0
- package/dist/motion/resolveSnapPoint.d.ts +52 -0
- package/dist/motion/resolveSnapPoint.d.ts.map +1 -0
- package/dist/motion/resolveSnapPoint.js +135 -0
- package/dist/motion/roleValue.d.ts +33 -0
- package/dist/motion/roleValue.d.ts.map +1 -0
- package/dist/motion/roleValue.js +84 -0
- package/dist/motion/roles.d.ts +79 -0
- package/dist/motion/roles.d.ts.map +1 -0
- package/dist/motion/roles.js +199 -0
- package/dist/motion/rubberBand.d.ts +20 -0
- package/dist/motion/rubberBand.d.ts.map +1 -0
- package/dist/motion/rubberBand.js +91 -0
- package/dist/motion/selectPage.d.ts +26 -0
- package/dist/motion/selectPage.d.ts.map +1 -0
- package/dist/motion/selectPage.js +55 -0
- package/dist/motion/spring.d.ts +193 -0
- package/dist/motion/spring.d.ts.map +1 -0
- package/dist/motion/spring.js +442 -0
- package/dist/motion/transientCopy.d.ts +33 -0
- package/dist/motion/transientCopy.d.ts.map +1 -0
- package/dist/motion/transientCopy.js +314 -0
- package/dist/motion/uikit/gestures.d.ts +642 -0
- package/dist/motion/uikit/gestures.d.ts.map +1 -0
- package/dist/motion/uikit/gestures.js +428 -0
- package/dist/motion/uikit/index.d.ts +24 -0
- package/dist/motion/uikit/index.d.ts.map +1 -0
- package/dist/motion/uikit/index.js +26 -0
- package/dist/motion/uikit/navigation.d.ts +54 -0
- package/dist/motion/uikit/navigation.d.ts.map +1 -0
- package/dist/motion/uikit/navigation.js +83 -0
- package/dist/motion/uikit/scroll.d.ts +116 -0
- package/dist/motion/uikit/scroll.d.ts.map +1 -0
- package/dist/motion/uikit/scroll.js +146 -0
- package/dist/motion/uikit/springs.d.ts +545 -0
- package/dist/motion/uikit/springs.d.ts.map +1 -0
- package/dist/motion/uikit/springs.js +548 -0
- package/dist/motion/uikit/timing.d.ts +202 -0
- package/dist/motion/uikit/timing.d.ts.map +1 -0
- package/dist/motion/uikit/timing.js +201 -0
- package/dist/reset.a11y.chromium.spec.js +1 -0
- package/dist/reset.until-found.a11y.browser.spec.js +1 -0
- package/dist/theme/declarationBoundary.d.ts +13 -0
- package/dist/theme/declarationBoundary.d.ts.map +1 -1
- package/dist/theme/declarationBoundary.js +264 -1
- package/dist/theme/defineTheme.d.ts +111 -11
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +97 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +9 -0
- package/dist/theme/generateThemeRules.d.ts +6 -2
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +468 -24
- package/dist/theme/index.d.ts +2 -2
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/statusColor.d.ts +48 -0
- package/dist/theme/statusColor.d.ts.map +1 -0
- package/dist/theme/statusColor.js +203 -0
- package/dist/theme/statusRoleDerivation.d.ts +11 -0
- package/dist/theme/statusRoleDerivation.d.ts.map +1 -0
- package/dist/theme/statusRoleDerivation.js +236 -0
- package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
- package/dist/theme/syntax/SyntaxTheme.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +1 -1
- package/dist/theme/syntax/presets.d.ts +1 -1
- package/dist/theme/syntax/presets.js +1 -1
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.js +1 -1
- package/dist/theme/themeAdaptations.d.ts +25 -1
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +30 -1
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +16 -1
- package/dist/theme/tokens.stylex.d.ts +42 -2
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +54 -3
- package/dist/theme/useTheme.d.ts +4 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +10 -4
- package/dist/utils/edgeAutoscroll.d.ts +53 -0
- package/dist/utils/edgeAutoscroll.d.ts.map +1 -0
- package/dist/utils/edgeAutoscroll.js +81 -0
- package/dist/utils/hitArea.d.ts +72 -0
- package/dist/utils/hitArea.d.ts.map +1 -0
- package/dist/utils/hitArea.js +681 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +4 -1
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +4 -1
- package/dist/utils/pressFeedback.d.ts +5 -1
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +285 -54
- package/dist/utils/pressGesture.d.ts +13 -1
- package/dist/utils/pressGesture.d.ts.map +1 -1
- package/dist/utils/pressGesture.js +40 -1
- package/dist/utils/touchPresentation.d.ts +48 -0
- package/dist/utils/touchPresentation.d.ts.map +1 -0
- package/dist/utils/touchPresentation.js +133 -0
- package/locales/af-ZA.json +1 -1
- package/locales/ar-SA.json +1 -1
- package/locales/ca-ES.json +1 -1
- package/locales/cs-CZ.json +1 -1
- package/locales/da-DK.json +1 -1
- package/locales/de-DE.json +1 -1
- package/locales/el-GR.json +1 -1
- package/locales/en.json +132 -0
- package/locales/es-ES.json +1 -1
- package/locales/fi-FI.json +1 -1
- package/locales/fr-FR.json +1 -1
- package/locales/he-IL.json +1 -1
- package/locales/hu-HU.json +1 -1
- package/locales/it-IT.json +1 -1
- package/locales/ja-JP.json +1 -1
- package/locales/ko-KR.json +1 -1
- package/locales/nl-NL.json +1 -1
- package/locales/no-NO.json +1 -1
- package/locales/pl-PL.json +1 -1
- package/locales/pseudo.json +99 -0
- package/locales/pt-BR.json +1 -1
- package/locales/pt-PT.json +1 -1
- package/locales/ro-RO.json +1 -1
- package/locales/ru-RU.json +1 -1
- package/locales/sr-SP.json +1 -1
- package/locales/sv-SE.json +1 -1
- package/locales/tr-TR.json +1 -1
- package/locales/uk-UA.json +1 -1
- package/locales/vi-VN.json +1 -1
- package/locales/zh-CN.json +1 -1
- package/locales/zh-TW.json +1 -1
- package/package.json +63 -8
- package/src/AlertDialog/AlertDialog.spec.md +85 -31
- package/src/AlertDialog/AlertDialog.tsx +1 -1
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +1 -0
- package/src/AppShell/AppShell.spec.md +334 -0
- package/src/AppShell/AppShell.tsx +170 -2
- package/src/AspectRatio/AspectRatio.spec.md +179 -0
- package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +1 -0
- package/src/Avatar/Avatar.spec.md +253 -0
- package/src/Avatar/AvatarStatusDot.spec.md +93 -79
- package/src/Avatar/AvatarStatusDot.test.tsx +22 -0
- package/src/Avatar/AvatarStatusDot.tsx +2 -2
- package/src/AvatarGroup/AvatarGroup.spec.md +205 -0
- package/src/AvatarGroup/AvatarGroupOverflow.spec.md +123 -120
- package/src/Badge/Badge.spec.md +207 -0
- package/src/Badge/Badge.test.tsx +13 -0
- package/src/Badge/Badge.tsx +38 -2
- package/src/Banner/Banner.spec.md +41 -28
- package/src/Banner/Banner.test.tsx +118 -16
- package/src/Banner/Banner.tsx +94 -7
- package/src/Blockquote/Blockquote.spec.md +171 -0
- package/src/BottomSheet/BottomSheet.doc.mjs +106 -24
- package/src/BottomSheet/BottomSheet.spec.md +271 -40
- package/src/BottomSheet/BottomSheet.test.tsx +491 -5
- package/src/BottomSheet/BottomSheet.tsx +544 -145
- package/src/BottomSheet/BottomSheetHostContext.ts +44 -0
- package/src/BottomSheet/BottomSheetPanel.test.tsx +73 -19
- package/src/BottomSheet/BottomSheetPanel.tsx +178 -63
- package/src/BottomSheet/BottomSheetReplace.test.tsx +1638 -0
- package/src/BottomSheet/BottomSheetStacking.announce.test.tsx +246 -0
- package/src/BottomSheet/BottomSheetStacking.test.tsx +3184 -0
- package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +27 -31
- package/src/BottomSheet/BottomSheetSwitcher.spec.md +138 -43
- package/src/BottomSheet/BottomSheetSwitcher.tsx +275 -26
- package/src/BottomSheet/BottomSheetSwitcherContext.ts +6 -0
- package/src/BottomSheet/__tests__/BottomSheetDrag.a11y.chromium.spec.ts +1 -0
- package/src/BottomSheet/__tests__/BottomSheetFocusReturn.a11y.browser.spec.ts +1 -0
- package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +4 -1
- package/src/BottomSheet/__tests__/BottomSheetNativeModal.a11y.browser.spec.ts +1 -0
- package/src/BottomSheet/__tests__/BottomSheetPinchZoom.a11y.chromium.spec.ts +1 -0
- package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +83 -0
- package/src/BottomSheet/bottomSheetEscape.ts +21 -0
- package/src/BottomSheet/bottomSheetStack.ts +2054 -0
- package/src/BottomSheet/useSheetGestures.ts +68 -12
- package/src/Breadcrumbs/BreadcrumbItem.spec.md +104 -60
- package/src/Breadcrumbs/BreadcrumbItem.tsx +30 -1
- package/src/Breadcrumbs/Breadcrumbs.spec.md +165 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +90 -0
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +1 -0
- package/src/Button/Button.spec.md +322 -0
- package/src/Button/Button.test.tsx +8 -1
- package/src/Button/Button.tsx +36 -7
- package/src/Button/__tests__/Button.a11y.chromium.spec.ts +1 -0
- package/src/ButtonGroup/ButtonGroup.spec.md +220 -0
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +1 -0
- package/src/Card/Card.spec.md +205 -0
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +1 -0
- package/src/Center/Center.spec.md +104 -124
- package/src/Chat/ChatComposer.test.tsx +54 -0
- package/src/Chat/ChatComposer.tsx +41 -27
- package/src/Chat/ChatComposerInput.test.tsx +165 -21
- package/src/Chat/ChatComposerInput.tsx +73 -16
- package/src/Chat/ChatMessageMetadata.tsx +1 -1
- package/src/Chat/ChatPastedTextToken.test.tsx +71 -0
- package/src/Chat/ChatPastedTextToken.tsx +8 -7
- package/src/Chat/ChatToolCalls.tsx +5 -5
- package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +22 -4
- package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +1 -0
- package/src/Chat/__tests__/useChatStreamScroll.a11y.chromium.spec.ts +1 -0
- package/src/CheckboxInput/CheckboxInput.spec.md +97 -66
- package/src/CheckboxInput/__tests__/Checkbox.a11y.chromium.spec.ts +1 -0
- package/src/CheckboxList/CheckboxList.spec.md +92 -78
- package/src/CheckboxList/CheckboxListItem.spec.md +86 -60
- package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +1 -0
- package/src/ClickableCard/ClickableCard.doc.mjs +1 -2
- package/src/ClickableCard/ClickableCard.spec.md +124 -128
- package/src/ClickableCard/ClickableCard.test.tsx +14 -3
- package/src/ClickableCard/ClickableCard.tsx +44 -28
- package/src/Code/Code.spec.md +30 -32
- package/src/CodeBlock/CodeBlock.doc.mjs +21 -4
- package/src/CodeBlock/CodeBlock.spec.md +96 -61
- package/src/CodeBlock/CodeBlock.test.tsx +97 -1
- package/src/CodeBlock/CodeBlock.tsx +132 -22
- package/src/CodeBlock/CodeLanguage.test.tsx +173 -0
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +290 -0
- package/src/CodeBlock/__tests__/CodeBlockLanguages.a11y.chromium.spec.ts +64 -0
- package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +1 -0
- package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +1 -0
- package/src/CodeBlock/grammar.ts +291 -0
- package/src/CodeBlock/index.ts +7 -0
- package/src/CodeBlock/languages/dockerfile.ts +43 -0
- package/src/CodeBlock/languages/graphql.ts +30 -0
- package/src/CodeBlock/languages/java.ts +28 -0
- package/src/CodeBlock/languages/lua.ts +21 -0
- package/src/CodeBlock/languages/objective-c.ts +26 -0
- package/src/CodeBlock/languages/powershell.ts +31 -0
- package/src/CodeBlock/languages/ruby.ts +29 -0
- package/src/CodeBlock/languages/thrift.ts +32 -0
- package/src/CodeBlock/languages/toml.ts +36 -0
- package/src/CodeBlock/languages.test.ts +402 -0
- package/src/CodeBlock/tokenizer.ts +176 -16
- package/src/CodeBlock/tokenizerBudget.test.ts +112 -0
- package/src/Collapsible/Collapsible.doc.mjs +6 -0
- package/src/Collapsible/Collapsible.spec.md +26 -23
- package/src/Collapsible/Collapsible.tsx +121 -2
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +1 -0
- package/src/Collapsible/__tests__/CollapsibleGroup.a11y.chromium.spec.ts +1 -0
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +1 -0
- package/src/CommandPalette/CommandPalette.perf.test.ts +8 -4
- package/src/CommandPalette/CommandPalette.tsx +17 -1
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +6 -3
- package/src/CommandPalette/CommandPaletteEmpty.spec.md +190 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +4 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +21 -2
- package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +1 -0
- package/src/CommandPalette/__tests__/CommandPaletteEmptyAudit.a11y.chromium.spec.ts +715 -0
- package/src/CommandPalette/__tests__/CommandPaletteFooter.a11y.chromium.spec.ts +3 -2
- package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +1 -0
- package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +1 -0
- package/src/CommandPalette/busyStartSettle.ts +26 -0
- package/src/ComplexSelector/ComplexSelector.doc.mjs +1 -1
- package/src/ComplexSelector/ComplexSelector.focusableDisabled.test.tsx +1 -1
- package/src/ComplexSelector/ComplexSelector.fr10.test.tsx +9 -9
- package/src/ComplexSelector/ComplexSelector.spec.md +161 -107
- package/src/ComplexSelector/ComplexSelector.test.tsx +236 -17
- package/src/ComplexSelector/ComplexSelector.tsx +69 -4
- package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +965 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.spec.md +38 -30
- package/src/ContextMenu/ContextMenu.test.tsx +189 -11
- package/src/ContextMenu/ContextMenu.tsx +75 -17
- package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +1 -0
- package/src/ContextMenu/__tests__/ContextMenuCursorAnchor.a11y.browser.spec.ts +1 -0
- package/src/ContextMenu/__tests__/ContextMenuLongPress.a11y.chromium.spec.ts +117 -0
- package/src/DateInput/DateInput.tsx +9 -4
- package/src/DateInput/DateInputTouch.test.tsx +10 -1
- package/src/DateInput/NativeDateField.tsx +2 -1
- package/src/DateInput/TouchDateField.tsx +2 -1
- package/src/DateInput/Wheel.tsx +4 -1
- package/src/DateInput/__tests__/DateInputAudit.a11y.chromium.spec.ts +1 -0
- package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +171 -0
- package/src/Dialog/Dialog.doc.mjs +201 -47
- package/src/Dialog/Dialog.spec.md +20 -4
- package/src/Dialog/Dialog.tsx +37 -10
- package/src/Dialog/__tests__/Dialog.a11y.browser.spec.ts +1 -0
- package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +1 -0
- package/src/Dialog/__tests__/Dialog.reduced-motion.a11y.browser.spec.ts +252 -0
- package/src/Divider/Divider.spec.md +79 -70
- package/src/Drawer/Drawer.tsx +38 -35
- package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +1 -0
- package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/DropdownMenu.spec.md +14 -6
- package/src/DropdownMenu/DropdownMenu.ssr.test.tsx +44 -8
- package/src/DropdownMenu/DropdownMenu.test.tsx +107 -5
- package/src/DropdownMenu/DropdownMenu.tsx +51 -34
- package/src/DropdownMenu/DropdownMenuGroup.doc.mjs +2 -2
- package/src/DropdownMenu/DropdownMenuGroup.tsx +12 -6
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -5
- package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +5 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +226 -0
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +32 -16
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +158 -0
- package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +72 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +9 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +225 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +105 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +6 -6
- package/src/DropdownMenu/MenuBottomSheet.tsx +42 -7
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +3 -3
- package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuDrillIn.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuFocusReturn.a11y.browser.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuGroupAudit.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuItemAudit.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuRadioGroupAudit.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +540 -0
- package/src/DropdownMenu/__tests__/DropdownMenuSubMenuAudit.a11y.chromium.spec.ts +671 -0
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/MenuHoverFocus.a11y.chromium.spec.ts +238 -0
- package/src/DropdownMenu/__tests__/MenuPinchZoom.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/__tests__/SubMenuHeaderFooter.a11y.chromium.spec.ts +1 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +28 -2
- package/src/DropdownMenu/menuBottomSheet.stylex.ts +33 -0
- package/src/DropdownMenu/menuItemHover.ts +13 -1
- package/src/DropdownMenu/menuTouchAction.stylex.ts +28 -0
- package/src/DropdownMenu/modules/useMenuPress.spec.md +90 -62
- package/src/DropdownMenu/useMenuDrillIn.tsx +7 -5
- package/src/EmptyState/EmptyState.announce.test.tsx +227 -0
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/EmptyState/EmptyState.spec.md +22 -14
- package/src/EmptyState/EmptyState.test.tsx +8 -8
- package/src/EmptyState/EmptyState.tsx +7 -5
- package/src/Field/Field.spec.md +57 -48
- package/src/Field/Field.tsx +1 -1
- package/src/Field/FieldLabel.spec.md +70 -59
- package/src/Field/FieldLabel.tsx +1 -1
- package/src/Field/PanelSearchInput.tsx +23 -13
- package/src/Field/__tests__/FieldLabelAudit.a11y.chromium.spec.ts +1 -0
- package/src/Field/inputDisabledFocus.ts +28 -0
- package/src/Field/inputStyles.stylex.ts +15 -15
- package/src/FieldStatus/FieldStatus.test.tsx +12 -0
- package/src/FieldStatus/FieldStatus.tsx +12 -3
- package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +1 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FileInput/FileInput.test.tsx +102 -0
- package/src/FileInput/FileInput.tsx +18 -12
- package/src/FormLayout/FormLayout.spec.md +69 -51
- package/src/Grid/Grid.spec.md +72 -69
- package/src/Grid/GridSpan.spec.md +158 -0
- package/src/Heading/Heading.spec.md +198 -0
- package/src/HoverCard/HoverCard.spec.md +244 -0
- package/src/HoverCard/HoverCard.test.tsx +93 -3
- package/src/Icon/Icon.doc.mjs +67 -5
- package/src/Icon/Icon.test.tsx +548 -9
- package/src/Icon/Icon.tsx +79 -15
- package/src/Icon/IconSize.stylex.ts +27 -11
- package/src/Icon/globalIconRegistry.test.tsx +395 -3
- package/src/Icon/globalIconRegistry.tsx +184 -36
- package/src/Icon/index.ts +29 -1
- package/src/Icon/useIcon.ts +5 -1
- package/src/IconButton/IconButton.spec.md +197 -0
- package/src/IconButton/IconButton.test.tsx +5 -2
- package/src/InputGroup/InputGroup.spec.md +199 -0
- package/src/InputGroup/InputGroup.test.tsx +120 -0
- package/src/InputGroup/InputGroup.tsx +59 -52
- package/src/InputGroup/InputGroupInternalContext.ts +15 -0
- package/src/InputGroup/InputGroupText.spec.md +139 -0
- package/src/InputGroup/InputGroupText.tsx +2 -0
- package/src/InputGroup/groupStyles.ts +22 -11
- package/src/Item/Item.test.tsx +158 -1
- package/src/Item/Item.tsx +42 -7
- package/src/Item/ItemMarkerColumns.a11y.chromium.spec.ts +211 -0
- package/src/Item/ItemMarkerColumnsContext.tsx +20 -0
- package/src/Item/ItemSwipeLayer.tsx +9 -0
- package/src/Item/__tests__/ItemSwipeActions.a11y.chromium.spec.ts +1 -0
- package/src/Item/__tests__/ItemSwipePinchZoom.a11y.chromium.spec.ts +186 -0
- package/src/Item/useSwipeAction.ts +71 -5
- package/src/Kbd/Kbd.test.tsx +95 -0
- package/src/Kbd/Kbd.tsx +30 -23
- package/src/Layer/LayerProvider.spec.md +149 -0
- package/src/Layer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts +176 -0
- package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +200 -0
- package/src/Layer/layerAnimations.stylex.ts +22 -2
- package/src/Layer/layerDismissalInvariants.test.tsx +9 -0
- package/src/Layer/layerSlideRules.ts +141 -8
- package/src/Layer/layerStack.ts +129 -62
- package/src/Layer/modalOutlet.ts +156 -15
- package/src/Layer/preserveAnimations.ts +304 -0
- package/src/Layer/useLayer.doc.mjs +1 -1
- package/src/Layer/useLayer.test.tsx +850 -0
- package/src/Layer/useLayer.tsx +644 -58
- package/src/Layer/useLayerDismissal.test.tsx +85 -2
- package/src/Layer/useLayerDismissal.ts +12 -9
- package/src/Layer/useTouchTrigger.ts +95 -41
- package/src/Layout/Layout.tsx +18 -0
- package/src/Layout/LayoutContent.tsx +5 -14
- package/src/Layout/LayoutFooter.tsx +2 -0
- package/src/Layout/LayoutHeader.tsx +2 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +1 -0
- package/src/Layout/layoutEdges.stylex.ts +25 -0
- package/src/Lightbox/Lightbox.spec.md +9 -8
- package/src/Lightbox/Lightbox.test.tsx +83 -0
- package/src/Lightbox/Lightbox.tsx +149 -125
- package/src/Lightbox/LightboxKeyboard.a11y.browser.spec.ts +78 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +70 -0
- package/src/Link/Link.spec.md +229 -0
- package/src/Link/LinkProvider.spec.md +167 -0
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +1 -0
- package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +1 -0
- package/src/List/List.spec.md +113 -34
- package/src/List/List.tsx +13 -1
- package/src/List/ListContext.tsx +19 -5
- package/src/List/ListItem.doc.mjs +3 -3
- package/src/List/ListItem.tsx +97 -28
- package/src/List/ListMarkers.a11y.chromium.spec.ts +904 -0
- package/src/Markdown/Markdown.codeLanguages.test.tsx +137 -0
- package/src/Markdown/Markdown.doc.mjs +12 -0
- package/src/Markdown/Markdown.fr23.bench.ts +3 -1
- package/src/Markdown/Markdown.fr23.perf.test.ts +45 -3
- package/src/Markdown/Markdown.fr23.sampling.ts +13 -4
- package/src/Markdown/Markdown.spec.md +71 -59
- package/src/Markdown/Markdown.test.tsx +50 -0
- package/src/Markdown/Markdown.tsx +61 -8
- package/src/Markdown/MarkdownTable.a11y.chromium.spec.ts +1 -0
- package/src/Markdown/__tests__/MarkdownNesting.a11y.chromium.spec.ts +1 -0
- package/src/MobileNav/MobileNav.doc.mjs +2 -2
- package/src/MobileNav/MobileNav.spec.md +161 -64
- package/src/MobileNav/MobileNav.test.tsx +27 -10
- package/src/MobileNav/MobileNav.tsx +51 -38
- package/src/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.ts +1 -0
- package/src/MobileNav/MobileNavToggle.test.tsx +63 -0
- package/src/MobileNav/MobileNavToggle.tsx +13 -5
- package/src/MobileNav/__tests__/MobileNavWidth.a11y.chromium.spec.ts +103 -0
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -2
- package/src/MoreMenu/MoreMenu.spec.md +88 -53
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +67 -9
- package/src/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.ts +1 -0
- package/src/MultiSelector/MultiSelector.test.tsx +122 -10
- package/src/MultiSelector/MultiSelector.tsx +24 -4
- package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +1 -0
- package/src/MultiSelector/__tests__/MultiSelector.a11y.chromium.spec.ts +1 -0
- package/src/NavIcon/NavIcon.spec.md +66 -38
- package/src/NavMenu/NavHeadingMenu.spec.md +104 -46
- package/src/NavMenu/NavHeadingMenu.test.tsx +276 -2
- package/src/NavMenu/NavHeadingMenu.tsx +42 -4
- package/src/NavMenu/NavHeadingMenuItem.tsx +60 -6
- package/src/NavMenu/NavMenuContext.tsx +11 -0
- package/src/NavMenu/__tests__/NavMenusSlideSelection.a11y.chromium.spec.ts +137 -0
- package/src/NumberInput/NumberInput.doc.mjs +6 -6
- package/src/NumberInput/NumberInput.spec.md +248 -0
- package/src/NumberInput/NumberInput.test.tsx +187 -14
- package/src/NumberInput/NumberInput.tsx +86 -24
- package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +1 -0
- package/src/Overlay/Overlay.doc.mjs +2 -2
- package/src/Overlay/Overlay.test.tsx +72 -4
- package/src/Overlay/Overlay.tsx +18 -8
- package/src/Pagination/Pagination.test.tsx +2 -2
- package/src/Popover/Popover.doc.mjs +38 -2
- package/src/Popover/Popover.spec.md +90 -11
- package/src/Popover/Popover.test.tsx +340 -2
- package/src/Popover/Popover.tsx +401 -35
- package/src/Popover/PopoverPresentation.test.tsx +952 -0
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +205 -0
- package/src/Popover/index.ts +5 -1
- package/src/Popover/lazyPopoverBottomSheet.ts +57 -0
- package/src/Popover/usePopover.tsx +11 -5
- package/src/PowerSearch/PowerSearch.spec.md +423 -53
- package/src/PowerSearch/PowerSearch.test.tsx +77 -1
- package/src/PowerSearch/PowerSearch.tsx +7 -5
- package/src/ProgressBar/ProgressBar.test.tsx +12 -0
- package/src/ProgressBar/ProgressBar.tsx +18 -0
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +1 -0
- package/src/RadioList/RadioList.spec.md +227 -0
- package/src/RadioList/RadioList.test.tsx +34 -7
- package/src/RadioList/RadioListItem.press.source-build.test.mjs +80 -0
- package/src/RadioList/RadioListItem.spec.md +223 -0
- package/src/RadioList/RadioListItem.tsx +26 -12
- package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +1 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +1 -0
- package/src/ScrollableArea/ScrollableArea.spec.md +6 -5
- package/src/ScrollableArea/ScrollableArea.test.tsx +5 -0
- package/src/ScrollableArea/ScrollableArea.tsx +4 -0
- package/src/Section/Section.spec.md +102 -44
- package/src/SegmentedControl/SegmentedControl.spec.md +162 -53
- package/src/SegmentedControl/SegmentedControl.test.tsx +46 -0
- package/src/SegmentedControl/SegmentedControl.tsx +7 -3
- package/src/SegmentedControl/SegmentedControlItem.spec.md +206 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +7 -6
- package/src/SelectableCard/SelectableCard.spec.md +230 -0
- package/src/SelectableCard/SelectableCard.test.tsx +11 -1
- package/src/SelectableCard/SelectableCard.tsx +49 -33
- package/src/Selector/Selector.sheetActiveDescendant.test.tsx +95 -0
- package/src/Selector/Selector.spec.md +12 -4
- package/src/Selector/Selector.test.tsx +114 -8
- package/src/Selector/Selector.tsx +30 -6
- package/src/Selector/__tests__/ComboboxField.a11y.chromium.spec.ts +458 -0
- package/src/Selector/__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts +1 -0
- package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +1 -0
- package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +1 -0
- package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +1 -0
- package/src/Selector/hooks.ts +234 -10
- package/src/Selector/useCombobox.doc.mjs +156 -9
- package/src/Selector/useCombobox.public.test.tsx +89 -0
- package/src/Selector/useCombobox.test.tsx +444 -0
- package/src/SideNav/SideNav.spec.md +50 -30
- package/src/SideNav/SideNav.test.tsx +425 -25
- package/src/SideNav/SideNav.tsx +85 -1
- package/src/SideNav/SideNavCollapseButton.spec.md +161 -0
- package/src/SideNav/SideNavHeading.spec.md +226 -0
- package/src/SideNav/SideNavHeading.tsx +102 -6
- package/src/SideNav/SideNavItem.spec.md +246 -0
- package/src/SideNav/SideNavItem.tsx +40 -9
- package/src/SideNav/SideNavRailMotion.test.tsx +620 -0
- package/src/SideNav/SideNavSection.spec.md +153 -0
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +417 -0
- package/src/SideNav/railMotion.ts +315 -0
- package/src/Skeleton/Skeleton.spec.md +99 -42
- package/src/Skeleton/Skeleton.test.tsx +108 -1
- package/src/Skeleton/Skeleton.tsx +30 -2
- package/src/Slider/Slider.fr10.test.tsx +34 -0
- package/src/Slider/Slider.test.tsx +172 -0
- package/src/Slider/Slider.tsx +70 -14
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +1 -0
- package/src/Spinner/Spinner.spec.md +231 -0
- package/src/Stack/Stack.spec.md +104 -56
- package/src/StatusDot/StatusDot.spec.md +139 -51
- package/src/StatusDot/StatusDot.test.tsx +13 -0
- package/src/StatusDot/StatusDot.tsx +27 -0
- package/src/Stepper/Step.spec.md +206 -0
- package/src/Stepper/Step.tsx +19 -3
- package/src/Stepper/Stepper.test.tsx +50 -0
- package/src/Switch/Switch.focusRing.source-build.test.mjs +81 -0
- package/src/Switch/Switch.spec.md +150 -66
- package/src/Switch/Switch.tsx +11 -9
- package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +1 -0
- package/src/Switch/switch.markers.stylex.ts +7 -2
- package/src/TabList/Tab.spec.md +201 -0
- package/src/TabList/Tab.tsx +7 -1
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +27 -0
- package/src/TabList/TabMenu.spec.md +198 -0
- package/src/TabList/TabMenu.tsx +24 -1
- package/src/TabList/__tests__/TabListOverflow.interaction.browser.spec.ts +99 -0
- package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +1 -0
- package/src/Table/Table.spec.md +54 -30
- package/src/Table/TableCell.tsx +9 -0
- package/src/Table/TableHeaderCell.tsx +2 -0
- package/src/Table/TableRow.tsx +3 -0
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +129 -0
- package/src/Table/__tests__/Table.a11y.contracts.ts +35 -0
- package/src/Table/__tests__/Table.a11y.renders.tsx +112 -0
- package/src/Table/__tests__/Table.a11y.states.ts +140 -0
- package/src/Table/__tests__/Table.a11y.test.tsx +198 -0
- package/src/Table/__tests__/TableMinWidth.a11y.chromium.spec.ts +1 -0
- package/src/Table/__tests__/TableRowGlide.a11y.browser.spec.ts +382 -0
- package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +1 -0
- package/src/Table/__tests__/TableStickyDividers.a11y.browser.spec.ts +560 -0
- package/src/Table/glidingDivider.ts +336 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +23 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.glide.test.tsx +280 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +91 -9
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +471 -10
- package/src/Table/plugins/rowStatus/useTableRowStatus.spec.md +4 -4
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.test.tsx +174 -0
- package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.ts +86 -0
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +0 -12
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +51 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +312 -12
- package/src/Table/rowDivider.ts +154 -0
- package/src/Table/useTableRowExpansion.doc.mjs +8 -0
- package/src/Text/Text.spec.md +114 -127
- package/src/TextArea/TextArea.doc.mjs +6 -6
- package/src/TextArea/TextArea.spec.md +164 -64
- package/src/TextArea/TextArea.test.tsx +65 -6
- package/src/TextArea/TextArea.tsx +27 -15
- package/src/TextInput/TextInput.doc.mjs +8 -8
- package/src/TextInput/TextInput.spec.md +260 -0
- package/src/TextInput/TextInput.test.tsx +126 -10
- package/src/TextInput/TextInput.tsx +57 -23
- package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +1 -0
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -2
- package/src/Thumbnail/Thumbnail.spec.md +244 -0
- package/src/Thumbnail/Thumbnail.test.tsx +120 -7
- package/src/Thumbnail/Thumbnail.tsx +77 -31
- package/src/TimeInput/TimeInput.spec.md +273 -0
- package/src/TimeInput/TimeInput.tsx +12 -4
- package/src/TimeInput/TouchTimeField.tsx +2 -1
- package/src/Timestamp/Timestamp.spec.md +252 -0
- package/src/Toast/Toast.spec.md +300 -0
- package/src/Toast/ToastViewport.modalHost.test.tsx +630 -5
- package/src/Toast/ToastViewport.test.tsx +137 -0
- package/src/Toast/ToastViewport.tsx +63 -6
- package/src/ToggleButton/ToggleButton.spec.md +256 -0
- package/src/ToggleButton/ToggleButtonGroup.spec.md +195 -0
- package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +1 -0
- package/src/Token/Token.spec.md +271 -0
- package/src/Token/__tests__/TokenRemoveTarget.a11y.chromium.spec.ts +1 -0
- package/src/Tokenizer/Tokenizer.props-type.test.tsx +126 -0
- package/src/Tokenizer/Tokenizer.spec.md +313 -72
- package/src/Tokenizer/Tokenizer.ssr.test.tsx +196 -0
- package/src/Tokenizer/Tokenizer.test.tsx +44 -8
- package/src/Tokenizer/Tokenizer.tsx +586 -41
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +2719 -0
- package/src/Tokenizer/TokenizerBottomSheet.tsx +957 -0
- package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +61 -27
- package/src/Toolbar/Toolbar.spec.md +103 -49
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +1 -0
- package/src/Tooltip/Tooltip.spec.md +161 -36
- package/src/Tooltip/Tooltip.test.tsx +171 -3
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +1 -0
- package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +2 -2
- package/src/Tooltip/__tests__/TooltipFocusReturn.a11y.chromium.spec.ts +1 -0
- package/src/Tooltip/__tests__/TooltipHoverBridge.a11y.chromium.spec.ts +1 -0
- package/src/Tooltip/__tests__/TooltipTallContent.a11y.browser.spec.ts +673 -0
- package/src/Tooltip/__tests__/TooltipTallContentTracking.a11y.browser.spec.ts +1162 -0
- package/src/Tooltip/useTooltip.tsx +7 -2
- package/src/TopNav/TopNav.spec.md +190 -0
- package/src/TopNav/TopNav.test.tsx +89 -0
- package/src/TopNav/TopNavHeading.spec.md +211 -0
- package/src/TopNav/TopNavHeading.tsx +35 -2
- package/src/TopNav/TopNavItem.spec.md +189 -0
- package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +83 -0
- package/src/TopNav/TopNavMegaMenu.spec.md +190 -0
- package/src/TopNav/TopNavMegaMenu.tsx +21 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.spec.md +150 -0
- package/src/TopNav/TopNavMegaMenuItem.spec.md +155 -0
- package/src/TopNav/TopNavMenu.spec.md +202 -0
- package/src/TopNav/TopNavMenu.test.tsx +65 -1
- package/src/TopNav/TopNavMenu.tsx +30 -1
- package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +1 -0
- package/src/TreeList/TreeList.doc.mjs +13 -0
- package/src/TreeList/TreeList.spec.md +54 -35
- package/src/TreeList/TreeList.tsx +234 -2
- package/src/TreeList/TreeListBranches.tsx +8 -6
- package/src/TreeList/TreeListItem.tsx +12 -6
- package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +19 -6
- package/src/TreeList/__tests__/TreeListGuideAlignment.interaction.browser.spec.ts +127 -0
- package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +1 -0
- package/src/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.ts +138 -0
- package/src/Typeahead/BaseTypeahead.test.tsx +201 -4
- package/src/Typeahead/BaseTypeahead.tsx +26 -10
- package/src/Typeahead/Typeahead.test.tsx +114 -1
- package/src/Typeahead/Typeahead.tsx +34 -16
- package/src/VisuallyHidden/VisuallyHidden.spec.md +170 -0
- package/src/__tests__/BusyOwnerAnnouncement.test.tsx +66 -5
- package/src/__tests__/CardPress.a11y.chromium.spec.ts +353 -0
- package/src/__tests__/DisabledTriggerFocus.a11y.chromium.spec.ts +2 -1
- package/src/__tests__/PressModality.a11y.chromium.spec.ts +392 -0
- package/src/__tests__/PressedState.a11y.chromium.spec.ts +1 -0
- package/src/__tests__/pressState.ts +43 -1
- package/src/__tests__/unthemedLength.ts +34 -0
- package/src/gestures/GestureArena.ts +966 -0
- package/src/gestures/GestureRecognizer.ts +626 -0
- package/src/gestures/LongPressGestureRecognizer.ts +186 -0
- package/src/gestures/PanGestureRecognizer.ts +410 -0
- package/src/gestures/TapGestureRecognizer.ts +192 -0
- package/src/gestures/VelocityTracker.ts +194 -0
- package/src/gestures/__tests__/LongPressGestureRecognizer.test.ts +141 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +327 -0
- package/src/gestures/__tests__/TapGestureRecognizer.test.ts +154 -0
- package/src/gestures/__tests__/VelocityTracker.streams.test.ts +243 -0
- package/src/gestures/__tests__/VelocityTracker.test.ts +261 -0
- package/src/gestures/__tests__/arena.test.ts +824 -0
- package/src/gestures/__tests__/arenaContinuous.test.ts +207 -0
- package/src/gestures/__tests__/arenaTapLongPress.test.ts +211 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/README.md +82 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-fling.json +130 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-slow.json +860 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-stop-release.json +357 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-fling.json +66 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-slow.json +268 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-stop-release.json +128 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/capture.html +123 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-fling.json +64 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-slow.json +268 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-stop-release.json +124 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-fling.json +64 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-slow.json +268 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-stop-release.json +124 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-fling.json +84 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-slow.json +381 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-stop-release.json +171 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-fling.json +45 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-slow.json +101 -0
- package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-stop-release.json +130 -0
- package/src/gestures/__tests__/harness.ts +204 -0
- package/src/gestures/geometry.ts +55 -0
- package/src/gestures/types.ts +161 -0
- package/src/hooks/AnnounceRenderedText.tsx +27 -0
- package/src/hooks/ModalAnnounceProvider.tsx +155 -0
- package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +98 -4
- package/src/hooks/__tests__/menuLinkClicks.ts +71 -0
- package/src/hooks/actionGroupTracker.exports.test.ts +28 -0
- package/src/hooks/actionGroupTracker.test.ts +510 -0
- package/src/hooks/actionGroupTracker.ts +449 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/menuPressOnItems.ts +40 -0
- package/src/hooks/modalAnnounce.ts +439 -0
- package/src/hooks/scrollGeometry.ts +71 -4
- package/src/hooks/useAdaptivePresentation.ts +46 -9
- package/src/hooks/useAnimatedLayout.doc.mjs +101 -0
- package/src/hooks/useAnimatedLayout.ts +61 -0
- package/src/hooks/useAnnounce.doc.mjs +4 -4
- package/src/hooks/useAnnounce.modal.test.tsx +1291 -0
- package/src/hooks/useAnnounce.test.tsx +64 -4
- package/src/hooks/useAnnounce.ts +452 -28
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +226 -0
- package/src/hooks/useAnnounceRenderedText.ts +81 -11
- package/src/hooks/useBusyAnnouncement.adopters.test.tsx +69 -0
- package/src/hooks/useBusyAnnouncement.test.tsx +112 -0
- package/src/hooks/useBusyAnnouncement.ts +64 -54
- package/src/hooks/useFocusTrap.doc.mjs +3 -3
- package/src/hooks/useFocusTrap.test.tsx +135 -2
- package/src/hooks/useFocusTrap.ts +59 -27
- package/src/hooks/useMenuHover.ts +6 -2
- package/src/hooks/useMenuPress.doc.mjs +2 -2
- package/src/hooks/useMenuPress.test.tsx +5 -2
- package/src/hooks/useMenuPress.ts +72 -37
- package/src/hooks/usePressFeedback.doc.mjs +4 -4
- package/src/hooks/usePressFeedback.ts +5 -2
- package/src/hooks/useScrollableArea.test.tsx +344 -3
- package/src/hooks/useScrollableArea.ts +120 -12
- package/src/i18n/generated-locales/en.generated.ts +35 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +37 -0
- package/src/internal/tokenizer-presentation.test.ts +29 -0
- package/src/internal/tokenizer-presentation.ts +25 -0
- package/src/internal/touch.test.ts +44 -0
- package/src/internal/touch.ts +41 -0
- package/src/motion/LayoutChangeSnapshot.tsx +50 -0
- package/src/motion/MEASUREMENTS.md +271 -0
- package/src/motion/README.md +218 -0
- package/src/motion/__tests__/animatedLayout.interaction.browser.spec.ts +1613 -0
- package/src/motion/__tests__/animatedLayoutAdopters.interaction.browser.spec.ts +217 -0
- package/src/motion/__tests__/animatedLayoutBundle.ts +17 -0
- package/src/motion/animatedLayout.boundary.test.ts +155 -0
- package/src/motion/animatedLayout.swap.test.ts +827 -0
- package/src/motion/animatedLayout.test.ts +1154 -0
- package/src/motion/animatedLayout.ts +1801 -0
- package/src/motion/animatedLayoutAdopters.test.tsx +500 -0
- package/src/motion/animator.test.ts +2653 -0
- package/src/motion/animator.ts +2794 -0
- package/src/motion/bezier.test.ts +52 -0
- package/src/motion/bezier.ts +64 -0
- package/src/motion/coast.test.ts +99 -0
- package/src/motion/coast.ts +150 -0
- package/src/motion/decay.test.ts +120 -0
- package/src/motion/decay.ts +126 -0
- package/src/motion/projection.test.ts +107 -0
- package/src/motion/projection.ts +116 -0
- package/src/motion/reducedMotion.stylex.ts +41 -0
- package/src/motion/reducedMotion.test.ts +129 -0
- package/src/motion/reducedMotion.ts +94 -0
- package/src/motion/reducedMotionPlan.test.ts +182 -0
- package/src/motion/reducedMotionPlan.ts +263 -0
- package/src/motion/resolveSnapPoint.test.ts +189 -0
- package/src/motion/resolveSnapPoint.ts +169 -0
- package/src/motion/roleValue.ts +105 -0
- package/src/motion/roles.test.ts +256 -0
- package/src/motion/roles.ts +262 -0
- package/src/motion/rubberBand.test.ts +88 -0
- package/src/motion/rubberBand.ts +115 -0
- package/src/motion/selectPage.test.ts +31 -0
- package/src/motion/selectPage.ts +55 -0
- package/src/motion/spring.test.ts +650 -0
- package/src/motion/spring.ts +551 -0
- package/src/motion/transientCopy.ts +374 -0
- package/src/motion/uikit/gestures.test.ts +89 -0
- package/src/motion/uikit/gestures.ts +359 -0
- package/src/motion/uikit/index.ts +80 -0
- package/src/motion/uikit/navigation.ts +83 -0
- package/src/motion/uikit/scroll.ts +141 -0
- package/src/motion/uikit/springRows.test.ts +71 -0
- package/src/motion/uikit/springs.ts +514 -0
- package/src/motion/uikit/timing.ts +210 -0
- package/src/motion/uikit/uikit.test.ts +364 -0
- package/src/motion/uikit/values.test.ts +110 -0
- package/src/reset.a11y.chromium.spec.ts +1 -0
- package/src/reset.until-found.a11y.browser.spec.ts +1 -0
- package/src/serverSafeComponents.test.ts +10 -0
- package/src/tailwind-theme.css +51 -1
- package/src/tailwind-theme.test.ts +51 -0
- package/src/theme/Theme.test.tsx +28 -0
- package/src/theme/__tests__/SpacingRootFontSize.a11y.chromium.spec.ts +1 -0
- package/src/theme/declarationBoundary.ts +282 -1
- package/src/theme/defineTheme.test.ts +529 -12
- package/src/theme/defineTheme.ts +231 -19
- package/src/theme/derivedVarRegistry.test.ts +34 -5
- package/src/theme/derivedVarRegistry.ts +4 -0
- package/src/theme/expandMotionScale.test.ts +17 -0
- package/src/theme/extensibleAxes.test.ts +74 -29
- package/src/theme/generateThemeRules.ts +772 -35
- package/src/theme/index.ts +3 -0
- package/src/theme/onMediaTokens.test.ts +186 -0
- package/src/theme/statusColor.ts +189 -0
- package/src/theme/statusRoleDerivation.ts +289 -0
- package/src/theme/syntax/SyntaxTheme.tsx +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +1 -1
- package/src/theme/syntax/presets.ts +1 -1
- package/src/theme/syntax/tokens.ts +1 -1
- package/src/theme/themeAdaptations.test.ts +412 -0
- package/src/theme/themeAdaptations.ts +43 -1
- package/src/theme/tokens.stylex.ts +36 -2
- package/src/theme/tokens.test.ts +111 -1
- package/src/theme/tokens.ts +23 -1
- package/src/theme/useTheme.ts +10 -4
- package/src/utils/customPropertyArmLayering.test.ts +131 -0
- package/src/utils/edgeAutoscroll.test.ts +192 -0
- package/src/utils/edgeAutoscroll.ts +111 -0
- package/src/utils/hitArea.test.ts +628 -0
- package/src/utils/hitArea.ts +770 -0
- package/src/utils/interactionOverlay.stylex.ts +4 -1
- package/src/utils/pressFeedback.test.ts +310 -2
- package/src/utils/pressFeedback.ts +306 -54
- package/src/utils/pressGesture.test.ts +50 -0
- package/src/utils/pressGesture.ts +40 -2
- package/src/utils/touchPresentation.test.ts +323 -0
- package/src/utils/touchPresentation.ts +153 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Motion measurements
|
|
2
|
+
|
|
3
|
+
The one list of UIKit reference captures the touch presentations need. Every
|
|
4
|
+
`GUESS` or `webkit` value in `uikit/` names one of these IDs (`@measure`), and
|
|
5
|
+
`uikit/uikit.test.ts` fails if a named ID is missing here. When a capture
|
|
6
|
+
lands, its values replace the guesses in `uikit/` (tagged
|
|
7
|
+
`@source measured: <app>, iOS <version>, <method>, <date>`).
|
|
8
|
+
|
|
9
|
+
Run everything on the newest iOS simulator runtime (iOS 26.x, and 27.x when
|
|
10
|
+
installed); rows marked † also on iOS 18 for the pre-glass delta. iPhone
|
|
11
|
+
16-class device, 3× scale, real HID touches with logged timestamps.
|
|
12
|
+
|
|
13
|
+
## Methods
|
|
14
|
+
|
|
15
|
+
- **A, animation dump** (exact parameters): an instrumented UIKit app logs
|
|
16
|
+
every `CAAnimation` added to a layer (`-[CALayer addAnimation:forKey:]`):
|
|
17
|
+
view class, key, key path, class, from / to / by, additive, begin time,
|
|
18
|
+
duration, timing-function control points, and for `CASpringAnimation` mass,
|
|
19
|
+
stiffness, damping, initialVelocity, settlingDuration, allowsOverdamping.
|
|
20
|
+
Works for everything UIKit animates in process.
|
|
21
|
+
- **B, recording** (ground truth on built-in apps): a 60 fps recording (120
|
|
22
|
+
where available), the moving edge tracked per frame into x(t), fitted to a
|
|
23
|
+
spring (response, damping ratio) or a curve by least squares and compared
|
|
24
|
+
with A.
|
|
25
|
+
- **C, per-frame log**: a `CADisplayLink` logger writes time
|
|
26
|
+
(`CACurrentMediaTime()`), the touch stream (`UIWindow.sendEvent`),
|
|
27
|
+
`contentOffset` and the presentation frames / transforms / alphas of the
|
|
28
|
+
views under test, while a UI test drives drags of known velocity
|
|
29
|
+
(`press(forDuration:thenDragTo:withVelocity:thenHoldForDuration:)`).
|
|
30
|
+
- **D, read**: print an SDK constant, a computed property or a private
|
|
31
|
+
style-provider value directly (harness or debugger).
|
|
32
|
+
- **H, haptics log**: swizzle the trigger methods of `UIFeedbackGenerator` and
|
|
33
|
+
its subclasses (`impactOccurred`, `impactOccurredWithIntensity:`,
|
|
34
|
+
`selectionChanged`, `notificationOccurred:`, and private subclasses' methods)
|
|
35
|
+
and `AudioServicesPlaySystemSound*`; log class, style, timestamp. Record
|
|
36
|
+
audio.
|
|
37
|
+
|
|
38
|
+
## Shared (foundation)
|
|
39
|
+
|
|
40
|
+
| ID | What | App and gesture | Extract | Method | Feeds |
|
|
41
|
+
| ----- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
42
|
+
| M-S1 | Deceleration rates | none | `UIScrollView.DecelerationRate.normal.rawValue`, `.fast.rawValue` | D | `scroll.decelerationRate` |
|
|
43
|
+
| M-S2 | Momentum coast | A long list (Contacts, or a probe table of 500 rows): flicks released at 1000, 2500, 5000 pt/s | contentOffset(t) from release to rest; decay constant; per-millisecond vs per-frame model; the speed at which it stops | C | `scroll.decelerationRate` |
|
|
44
|
+
| M-S3 | Bounce-back spring | Same list: drag 120 pt past the top, hold still, release; a flick into the top edge at 3000 pt/s | contentOffset(t) after release and after edge contact; spring response and damping ratio; velocity hand-off | C | `scroll.bounce` |
|
|
45
|
+
| M-S5 | Rubber band | Same list on an 852 pt view: drag 100, 300, 600 pt past the top; a horizontal pager | displayed overflow against finger overflow; confirm c = 0.55 and d = the view's size on the axis | C | `scroll.rubberBand` |
|
|
46
|
+
| M-PG1 | Paging | Photos full-screen swipes; a probe paging scroll view | page chosen per release position × velocity (thresholds; at most one page?); contentOffset(t) onto the page | B, C | `scroll.paging` |
|
|
47
|
+
| M-ST1 | Scroll to top | Settings scrolled down 500, 2000, 8000 pt; tap the status bar | contentOffset(t); duration against distance; curve or spring fit | B, C | `scroll.scrollToTopRate` |
|
|
48
|
+
| M-N1 | Navigation push | Settings: tap General | incoming leading edge x(t), outgoing x(t) (parallax fraction), dimming alpha(t); animation parameters | A, B | `springs.navigationPush` |
|
|
49
|
+
| M-N2 | Navigation pop | General: back button | same as M-N1 | A, B | `springs.navigationPop` |
|
|
50
|
+
| M-N3 | Interactive pop | Settings ▸ General: edge swipe released at 40 % of the width at 600 pt/s (finishes) and at 30 % at rest (cancels) | x(t) after release; spring parameters; the finish / cancel rule (position, velocity) | A, B | `springs.navigationInteractivePopFinish` |
|
|
51
|
+
| M-A1 | Alert | Probe app: `UIAlertController(.alert)` presented and dismissed | scale(t), alpha(t) of the alert and the dimming view; animation parameters | A | `springs.alertPresent`, `.alertDismiss` |
|
|
52
|
+
| M-AS1 | Action sheet and menu | Probe app: `.actionSheet`; a button with a `UIMenu` as its primary action; Files: the … menu | scale, alpha, position (t) on open and close; animation parameters | A, B | `springs.actionSheet*`, `.menu*` |
|
|
53
|
+
| M-CM1 | Context menu | Files: long-press an item; dismiss by tapping outside | preview scale(t) on lift, backdrop blur and dim (t), menu scale(t); the preview's return on dismiss | A, B | `springs.contextMenu*` |
|
|
54
|
+
| M-K1 | UIKit legacy spring | Probe app: `UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:)`, durations 0.3, 0.5, 1 × ratios 0.5, 0.8, 1 × velocities 0, 2 | the `CASpringAnimation` UIKit attaches: mass, stiffness, damping, initialVelocity, duration, settlingDuration | A | `springs.ts` (UIKit's legacy springs) |
|
|
55
|
+
| M-K2 | Default spring, keyboard | Probe app: an animator with `UISpringTimingParameters()`; focus and blur a text field | both springs' parameters and allowsOverdamping; the keyboard notification's duration and curve | A, D | `springs.viewChange`, `.keyboard`, `timing.keyboard*` |
|
|
56
|
+
| M-CA1 | Settling duration | none: `CASpringAnimation` mass 1, stiffness 100, damping 5, 10, 15, 20, 40 × initialVelocity 0, 5, −5 × allowsOverdamping on, off | `settlingDuration` of each (checks the critically damped and overdamped branches) | D | `springs.ts` (settling) |
|
|
57
|
+
| M-T1 | Banner | A notification pushed to the simulator while an app is in the foreground | banner y(t) in and out; time on screen | B | `springs.banner` |
|
|
58
|
+
| M-RM1 | Reduced Motion | Reduce Motion on, Prefer Cross-Fade Transitions on and off: Settings push and pop, an alert (sheets: M-SH13; controls: M-SW11, M-SL12, M-SG15) | which transitions become cross-fades; alpha(t), duration and curve; what still moves | B | `timing.reducedMotionCrossFadeMs` (played at 200 ms: `design:reduced-motion` DR2 caps it, DEC-1 of 2026-10-24, departing from the measured 0.5 s) |
|
|
59
|
+
| M-PR1 | Press release curve | Settings and Contacts: a row tapped and released (the deselect cross-fade) | the timing function Core Animation attaches to the deselect fade (control points) | A | `timing.press.highlightOutCurve` |
|
|
60
|
+
| M-NB1 | Navigation bar hide / show | none | `UINavigationController.hideShowBarDuration` | D | `timing.navigationBarHideShowMs` |
|
|
61
|
+
|
|
62
|
+
Done (UIKit lab, iOS 26.2 simulator, Oct 23 2026; values in `uikit/` tagged
|
|
63
|
+
`measured:`): M-S1, M-NB1, M-K2, M-CA1 (underdamped grid matched to the last
|
|
64
|
+
digit; critically damped within 0.02 %), M-K1 (ratios 0.1–1 in 0.05 steps),
|
|
65
|
+
M-N1, M-N2, M-N3, M-S2, M-S5, M-ST1, M-RM1; and the springs of M-SH07, M-SH08, M-SH09, M-A1, M-AS1 and
|
|
66
|
+
M-CM1 (their non-spring values are the components' to record). Findings that
|
|
67
|
+
shape the math: every spring UIKit attaches
|
|
68
|
+
has `allowsOverdamping` off (clamped to critical) except
|
|
69
|
+
`UIView.animate(springDuration:bounce:)`; with it on, Core Animation renders
|
|
70
|
+
"overdamped" springs with the two exponentials' coefficients swapped and the
|
|
71
|
+
initial velocity's sign flipped, a curve that overshoots. Push and pop are
|
|
72
|
+
not Core Animation animations on iOS 26.2: UIKit writes presentation
|
|
73
|
+
modifiers every frame from the main thread.
|
|
74
|
+
|
|
75
|
+
## Gestures (UIKit gesture recognizers)
|
|
76
|
+
|
|
77
|
+
Thresholds the gesture system reads (`uikit/gestures.ts`). Safari on iOS runs
|
|
78
|
+
UIKit's own recognizers for tap-to-click, long press, double tap and the start
|
|
79
|
+
of a page scroll, so many of these can be read off Safari itself.
|
|
80
|
+
|
|
81
|
+
| ID | Feeds | Capture | Method |
|
|
82
|
+
| ----- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------ |
|
|
83
|
+
| M-G01 | `UIKIT_GESTURES.tap.allowableMovement` | Safari (UIKit tap -> click): on a touch-action:none box, HID touch down, move N px over 100 ms, lift; binary-search the largest N that still fires click. | C |
|
|
84
|
+
| M-G02 | `UIKIT_GESTURES.tap.maximumIntervalBetweenTaps` | Safari with user-scalable=no (UIKit double-tap -> dblclick): two HID taps T ms apart; binary-search the largest T that fires dblclick. | C |
|
|
85
|
+
| M-G03 | `UIKIT_GESTURES.tap.allowableSeparation` | Safari with user-scalable=no: two HID taps 150 ms apart, the second D px away; binary-search the largest D that fires dblclick. | C |
|
|
86
|
+
| M-G04 | `UIKIT_GESTURES.tap.maximumTapDuration` | Safari: HID hold on a <button> for 0.5, 1, 2, 4 s then lift; record which fire click. | C |
|
|
87
|
+
| M-G05 | `UIKIT_GESTURES.pan.hysteresis` | Settings list (UIScrollView pan): slow HID drag at 20 px/s filmed at 60 fps; touch travel at the first frame the content moves. | B, C |
|
|
88
|
+
| M-G06 | `UIKIT_GESTURES.swipe.minimumDistance` | Needs a UIKit app that uses UISwipeGestureRecognizer (no built-in candidate known): HID swipes of increasing length at 600 px/s. | C |
|
|
89
|
+
| M-G07 | `UIKIT_GESTURES.swipe.maximumDuration` | Same rig as minimumDistance: 120 px swipes at decreasing speed; longest duration that still recognizes. | C |
|
|
90
|
+
| M-G08 | `UIKIT_GESTURES.swipe.maximumSecondaryMovement` | Same rig: 120 px swipes at increasing angles; largest angle that still recognizes. | C |
|
|
91
|
+
| M-G09 | `UIKIT_GESTURES.pinch.hysteresis` | Photos (zoomable image): two HID touches spreading at 20 px/s filmed at 60 fps; span change at the first frame the image scales. | B, C |
|
|
92
|
+
| M-G10 | `UIKIT_GESTURES.rotation.hysteresis` | Maps: two touches rotating at 10 deg/s filmed at 60 fps; angle at the first frame the map turns. The simulator HID cannot rotate two fingers: a device run or an XCUITest rotate. | B, C |
|
|
93
|
+
| M-G11 | `UIKIT_GESTURES.screenEdgePan.edgeRegion` | Settings > General (UINavigationController pop): HID drags inward starting at x = 5, 10 ... 40 pt; largest x that still pops. | C |
|
|
94
|
+
| M-G12 | `UIKIT_GESTURES.control.trackingExpansion` | Calculator (UIButton): HID press, drag away at 20 px/s filmed at 60 fps; distance from the frame at which the highlight turns off, then back on. | B, C |
|
|
95
|
+
| M-G14 | `UIKIT_GESTURES.velocity.scrollReleaseWeight` | Safari page scroll (UIScrollView): HID flings with known speed profiles; back out the release velocity from the coast distance (0.998/ms decay) and compare with this blend on the same samples. | C |
|
|
96
|
+
| M-G16 | `UIKIT_GESTURES.velocity.stillness` | Safari page scroll: HID drag, pause P ms, lift; smallest P after which the page does not coast. | C |
|
|
97
|
+
| M-G17 | `UIKIT_GESTURES.click.strayClickWindow` | Not a parity value: confirm in Safari and Chromium that the click follows touchend within one frame. | C |
|
|
98
|
+
| M-G18 | `HAPTIC_VIBRATION_PATTERNS` (every kind) | On an Android device, compare against the platform HapticFeedbackConstants for the same moments. | C |
|
|
99
|
+
| M-G19 | `UIKIT_GESTURES.press.momentumMemory` | Safari page, hardest HID flick: time from the lift to the last scroll event. | C |
|
|
100
|
+
| M-G20 | `LongPressGestureRecognizer` taps phase | Probe app: a UILongPressGestureRecognizer with numberOfTapsRequired 1: HID taps held 0.2, 0.5, 1, 2 s, then the press after gaps of 100 to 600 ms; record which recognize. | C |
|
|
101
|
+
|
|
102
|
+
Done (UIKit lab, iOS 26.2 simulator, Oct 23 2026: the recognizers' ivars read
|
|
103
|
+
in process, each confirmed with HID touches and the state log; values in
|
|
104
|
+
`uikit/gestures.ts` tagged `measured:`): M-G01 to M-G09, M-G11 (the band
|
|
105
|
+
only: simulator HID touches carry no edge flag, so an edge pan cannot begin)
|
|
106
|
+
and M-G12. Findings that shape the code: the pan's hysteresis applies per
|
|
107
|
+
axis and is left out of `translation(in:)`; the pinch measures its scale
|
|
108
|
+
from the starting span moved by its hysteresis; the swipe is recognized
|
|
109
|
+
during the motion; `velocity(in:)` is 0.2 × the newest event's
|
|
110
|
+
instantaneous velocity + 0.8 × the previous one's (it reproduces every value
|
|
111
|
+
UIKit reported on six recorded streams), does not decay through a rest and
|
|
112
|
+
ignores the lift: the table keeps that one filter and no least-squares
|
|
113
|
+
estimator (`spec:AST-100` FR2); a sheet over a scrolled list leaves the whole
|
|
114
|
+
drag to the list (no mid-gesture handoff), so the table carries no handoff
|
|
115
|
+
slop (`spec:AST-094` FR14).
|
|
116
|
+
|
|
117
|
+
## Switch (UISwitch)
|
|
118
|
+
|
|
119
|
+
Subject "switch S": the first switch in Settings ▸ Accessibility ▸ Display &
|
|
120
|
+
Text Size (Bold Text row); a minimal host app holds a UISwitch on a plain view
|
|
121
|
+
where a switch outside any scroll view is needed.
|
|
122
|
+
|
|
123
|
+
Captured (iOS 26.2 simulator, Oct 23 2026), with their values landing in the
|
|
124
|
+
switch's own table: M-SW02, M-SW03, M-SW04, M-SW05, M-SW06, M-SW09 (UISwitch
|
|
125
|
+
makes no haptic call), M-SW11 (Reduce Motion: the lift stays, the stretch
|
|
126
|
+
goes), M-SW16 (iOS 26.2). Until that table lands they stay open here, and
|
|
127
|
+
`springs.switchThumbMove` and `switchThumbStretch` keep WebKit's values.
|
|
128
|
+
Partly: M-SW07 (a single tap only). Still open: M-SW17, and M-SW11's On/Off
|
|
129
|
+
labels, Reduce Transparency and Bold Text.
|
|
130
|
+
|
|
131
|
+
| ID | Scene | Gesture | Extract | Method |
|
|
132
|
+
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
|
|
133
|
+
| M-SW01 | † Display & Text Size; light, dark, Increase Contrast on and off | none (static, off and on) | track w / h / radius, thumb w / h / inset, shadow profile, off / on colors | B, D |
|
|
134
|
+
| M-SW02 | † switch S | tap: down and up 50 ms apart at the thumb center | per frame for 600 ms: thumb edges, track center color (fit `thumbMove`; is the color a smoothstep over 488 ms?; does a quick tap stretch?) | A, B, C |
|
|
135
|
+
| M-SW03 | † switch S; and the host-app switch outside any scroll view | down on the thumb, hold 1.0 s, release | per frame from down to +1.6 s: thumb edges (stretch, lift scale), track color; onset (0 / 150 / 200 ms); `thumbPress` fit | A, B, C |
|
|
136
|
+
| M-SW04 | † switch S (off) | hold 300 ms, drag right at 50 pt/s to 40 pt past the end, back to 40 pt before the start, release; b: press at 80 % of the width and drag right; c: quick 40 pt swipes without a hold | finger x per event, thumb edges per frame, color: flip line(s), discrete vs following, hysteresis, commit rule, far-side offset 0.4 w | C |
|
|
137
|
+
| M-SW05 | † switch S | hold 300 ms, move straight down 30, 60, 100, 150 pt (separate runs), release; then flip right and continue 150 pt down | final value per run: slide-off abort rule, tracking slop, does a flip survive leaving the bounds | C |
|
|
138
|
+
| M-SW06 | † Display & Text Size list | a: quick swipe up starting on S; b: hold 300 ms on S then drag up 200 pt; c: fling the list, touch S while decelerating; d: quick horizontal swipe on S; e: hold 1 s on a row with a context menu | list offset per frame, S value, stretch frames: scroll hand-off, brake, horizontal capture, context menu vs tracking | C |
|
|
139
|
+
| M-SW07 | † switch S | double tap 120 ms apart; tap, then re-press at +80 ms and hold | thumb edges per frame: retarget and velocity continuity, re-grab from the presentation value | B, C |
|
|
140
|
+
| M-SW08 | switch S | hold the thumb with finger 1, tap / hold finger 2 elsewhere, drag finger 1 across | value, flips: second-finger rule | C |
|
|
141
|
+
| M-SW09 | host app with a UISwitch and a web view holding `<input type=checkbox switch>`, its `<label>`, and a div whose click handler calls `label.click()` | tap, hold-release, drag flips, drag back, on both | haptic log per event, audio: kind and moments for UISwitch; Safari's rules on the rig's WebKit; sounds | H |
|
|
142
|
+
| M-SW10 | Settings S with VoiceOver; Safari showing the Astryx switch story | swipe to focus, double-tap | Accessibility Inspector label, value, traits, hint, actions; VoiceOver caption transcript; swipe stops for the Astryx row | D |
|
|
143
|
+
| M-SW11 | † switch S with On/Off Labels, Reduce Motion, Reduce Transparency, Bold Text (one at a time) | tap and hold as M-SW02 / M-SW03 | screenshots and per-frame traces: glyph geometry, Reduce Motion substitution, lens under Reduce Transparency | B, C |
|
|
144
|
+
| M-SW12 | host app forced right-to-left, or Settings in Hebrew | M-SW02 / M-SW03 / M-SW04, short | mirrored edges: RTL stretch and flip | B, C |
|
|
145
|
+
| M-SW13 | Settings at AX5 Dynamic Type | static | switch size, row layout | B |
|
|
146
|
+
| M-SW14 | host app with a UISwitch at the screen center | taps at 2, 5, 10, 15, 20, 30 pt outside each edge; b: iPad pointer hover | which taps toggle: hit slop and UIControl tracking slop; hover visuals | C |
|
|
147
|
+
| M-SW15 | Safari: a page with `<input type=checkbox switch>` in a tall scrolling page; the same page blocking script 600 ms right after a tap | tap, hold, drag flips; a pan starting on the switch; a busy tap | frames and page scroll offset: native switch look, press, scroll blocking, behavior under a frozen main thread | B |
|
|
148
|
+
| M-SW16 | switch S on iOS 26.x (and 27) | hold 1 s; tap; hold and drag slowly across; release mid-track | per frame: lens bounds (w / h / scale, overflow beyond the track), translucency, does it follow the finger 1:1, the snap on release | A, B, C |
|
|
149
|
+
| M-SW17 | host app calling `setOn(true, animated: true)` | programmatic | thumb edges per frame: is the programmatic animation the tap animation? | A, C |
|
|
150
|
+
|
|
151
|
+
## Slider (UISlider)
|
|
152
|
+
|
|
153
|
+
Lab app scenes: L1 a plain `UISlider` 0…1, 300 pt wide, centered, no scroller;
|
|
154
|
+
L2 L1 in a vertical list cell; L3 L1 in a horizontal paging scroll view; L4
|
|
155
|
+
`TrackConfiguration(numberOfTicks: 5)` with `allowsTickValuesOnly` true, L5
|
|
156
|
+
false; L6 `neutralValue` 0.5; L7 `enabledRange` 0…0.75; L8 `.thumbless`; L9
|
|
157
|
+
min / max images; L10 L1 forced right-to-left; L11 SwiftUI
|
|
158
|
+
`Slider(value:in:0...100, step: 25)` and `step: 1`.
|
|
159
|
+
|
|
160
|
+
| ID | Scene | Gesture | Extract | Method |
|
|
161
|
+
| ------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------ |
|
|
162
|
+
| M-SL01 | † L1, L9; Settings brightness | none | `intrinsicContentSize`, `trackRect(forBounds:)`, `thumbRect(…)` at 0 / 0.5 / 1, thumb and track colors, shadow, disabled alpha | D, B |
|
|
163
|
+
| M-SL02 | L1 | touch-down at the thumb center + (dx, dy) on a 2 pt grid out to ±30 pt; release | `isTracking` after down; the thumb hit insets | C, D |
|
|
164
|
+
| M-SL03 | † L1 | touch-down on the thumb, hold 800 ms, release, wait 800 ms | thumb width, height, scale and opacity per frame after down and after release: lift and release springs | A, C |
|
|
165
|
+
| M-SL04 | L1 | drags at 200 / 800 / 2000 pt/s over 150 pt; a sudden stop; a release while moving at 1500 pt/s | per frame: finger x, thumb center x, thumb width; value and events after touch-up: momentum, stretch, lag | A, C |
|
|
166
|
+
| M-SL05 | L1 | drag from the thumb at 0.9 to 80 pt past the max end, hold, release | thumb frame and track per frame: edge squash and over-drag mapping (rubber band?) | A, C |
|
|
167
|
+
| M-SL06 | L8 | touch-down, drag, release | track thickness per frame; when growth starts and ends | A, C |
|
|
168
|
+
| M-SL07 | L4, L5, L6, L7, L11 | slow (100 pt/s) and fast (1000 pt/s) drags across all ticks; a release between ticks | thumb x vs finger per frame; `valueChanged` values and times; tick appearance: tick snapping rule and spring | A, C |
|
|
169
|
+
| M-SL08 | L1 | a: down 8 pt right of the thumb center, drag 60 pt; b: tap the track at 20 % and 80 %; c: during a drag, move 120 pt above the slider; d: re-grab 40 ms after `setValue(0.2, animated: true)` | finger − thumb per frame; `valueChanged` count and values; tracking while outside; re-grab offset | C |
|
|
170
|
+
| M-SL09 | L1 | `setValue(0.8, animated: true)` from 0.2 | thumb x per frame: duration and curve of an animated value change | A, C |
|
|
171
|
+
| M-SL10 | L1, L4, L7 | drags into and out of min and max (re-enter 3×); slow and fast drags across ticks; a 50-tick fast sweep | haptic log with timestamps, audio: moments, kinds, re-arm, rate limit | H |
|
|
172
|
+
| M-SL11 | L2, L3, Settings ▸ Display & Brightness, Settings ▸ Accessibility ▸ Display & Text Size ▸ Larger Text | from the thumb: quick horizontal swipe, quick vertical swipe, hold 300 ms then vertical, diagonals at 30° / 45° / 60°; from the track: vertical and horizontal swipes; in L3: horizontal from the thumb vs from the track | content offset per frame; thumb x vs finger for the first 150 ms; which recognizer wins: delay, pan hysteresis, parallel rule | C |
|
|
173
|
+
| M-SL12 | L1, L4 under Reduce Motion, Reduce Transparency, Increase Contrast, Show Borders, AX5 | M-SL03 and M-SL04 gestures | same traces and screenshots: accessibility substitutions | B, C |
|
|
174
|
+
| M-SL13 | Accessibility Inspector on L1, L4; Safari on the probe page (ltr and rtl sliders); iPad keyboard and pointer | Increment ×3; hardware-keyboard arrows with Full Keyboard Access; pointer hover and click on the track | value string, traits, hint, value deltas (animated?); the RTL increment direction | D |
|
|
175
|
+
| M-SL14 | Safari showing the slider stories, side by side with L1 / L2 | the slider storyboards scripted identically | paired 60 fps recordings (parity proof) | B |
|
|
176
|
+
|
|
177
|
+
## Segmented control (UISegmentedControl)
|
|
178
|
+
|
|
179
|
+
Harness scenes (UIKit, no SwiftUI): S1 three equal text segments in a plain
|
|
180
|
+
view; S2 the same in a vertical scroll view with tall content; S3 in a
|
|
181
|
+
horizontal scroll view; S4 `apportionsSegmentWidthsByContent` with unequal
|
|
182
|
+
labels; S5 `isMomentary`; S6 segment 1 disabled; S7 forced right-to-left; S8
|
|
183
|
+
five icon segments; S9 a button setting `selectedSegmentIndex = 2` (plain and
|
|
184
|
+
inside `UIView.animate`); S10 no initial selection. The harness logs
|
|
185
|
+
`valueChanged` with `CACurrentMediaTime()`. Built-in fallbacks: Health's chart
|
|
186
|
+
range control (in a scroll view), Calendar's New Event sheet, Safari's
|
|
187
|
+
Bookmarks sheet.
|
|
188
|
+
|
|
189
|
+
| ID | Scene | Gesture or action | Extract | Method |
|
|
190
|
+
| ------ | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
|
|
191
|
+
| M-SG00 | setup | report the installed runtimes and devices | runtimes (iOS 27.x, 26.x, 18.x), an iPhone 6.1–6.3" class device, an iPad | D |
|
|
192
|
+
| M-SG01 | † harness or debugger | read the iPhone style provider: selection scale and hiding scale factors, `mostlyInsideMargin`, indicator inset, corner radius, divider width, default heights, spacings, paddings, fonts and colors per state, the behavior flags; the class-level highlight / hidden selection scales and default height; the liquid lens spec defaults (lift / unlift springs, hang time, displacements, blur) | exact constants, no curve fitting | D |
|
|
193
|
+
| M-SG02 | S1, S5, S9, S10 with the animation dump | a: tap seg0 → seg2; b: hold the selected segment 600 ms, lift; c: hold an unselected one 600 ms, lift; d: slow drag seg0 → seg2 over 1 s, hold, lift; e: tap seg2 then seg1 at +100 ms; f: momentary tap; g: no-selection pop-in; h: programmatic set, plain and animated | every animation's parameters: which properties animate (position, bounds, transform, opacity, shadow, label) and their springs | A |
|
|
194
|
+
| M-SG03 | S1, 120 fps if possible | tap seg2 (down 60 ms, no movement) | per frame 0–800 ms: thumb left / right x, scale, label weight per segment, highlight alpha under seg2, divider alpha (iOS 18) | B, C |
|
|
195
|
+
| M-SG04 | S1 vs S2 (Calendar vs Health fallback) | hold unselected seg1 600 ms, lift; a 40 ms tap in S2 | highlight onset, color, fade in / out; slide start vs touch-up; `valueChanged` time: does the scroll view's touch delay apply? | B, C |
|
|
196
|
+
| M-SG05 | † S1 and S2 | hold the selected segment 600 ms, lift | thumb and label scale per frame; iOS 26 / 27 lens size, displacement, blur, glass per frame; hang time after the lift | A, C |
|
|
197
|
+
| M-SG06 | S1, S4 | drag from selected seg0 to seg2 at 200 pt/s, hold 300 ms, lift; then a 1500 pt/s flick | per frame: finger x, thumb x / width / scale, bold label, highlight; `valueChanged` timing: step vs free model, hysteresis, release target and spring | C |
|
|
198
|
+
| M-SG07 | S1 | drag the thumb 80 pt past the trailing edge and before the leading edge; drag to seg1 then 100 pt up and lift; 30 / 60 / 100 pt down | thumb at the ends (clamp or band); commit vs revert; the distance at which tracking counts as outside | C |
|
|
199
|
+
| M-SG08 | S1 | touch unselected seg1, drag to seg2, lift; touch seg1, drag 100 pt up, lift | which segment highlights during the drag; which gets selected | C |
|
|
200
|
+
| M-SG09 | S2, S3; an iOS 26 app with a navigation stack | S2: vertical 40 pt in 150 ms from seg1 and from the selected seg0, a 30° diagonal; S3: horizontal drag starting on the thumb vs on an unselected segment; a back-swipe from the control | which recognizer wins; cancel visuals | C |
|
|
201
|
+
| M-SG10 | S1 | tap seg2, at +80 ms tap seg1; tap seg2, at +80 ms touch down on the moving thumb and hold 500 ms | trajectory continuity; does the thumb stop under the finger (retarget, re-grab) | B, C |
|
|
202
|
+
| M-SG11 | S1 | finger A holds seg0; finger B taps seg2; A drags while B taps | ignored or not | C |
|
|
203
|
+
| M-SG12 | harness with the haptics log | tap; hold and lift the selected segment; drag across two segments; momentary tap | calls and timestamps relative to the touches; confirm no sound | H |
|
|
204
|
+
| M-SG13 | Accessibility Inspector (VoiceOver on a device if available) | inspect S1, S5, S6, S8, and Safari showing the Astryx story | label, value, traits, hint, frame, container type; spoken strings | D |
|
|
205
|
+
| M-SG14 | Larger Text: default, xxxL, AX1, AX3, AX5 | screenshots of S1, Health, Calendar; at AX sizes long-press a segment | font size and height per size; the large-text popover look, press duration, selection inside | B |
|
|
206
|
+
| M-SG15 | Bold Text; Increase Contrast; Reduce Transparency; Reduce Motion (+ Prefer Cross-Fade); iOS 27 glass at More Clear / More Tinted; dark mode | rest screenshots and M-SG03 tap frames | appearance deltas; the Reduce Motion substitute (slide vs fade, duration) | B, C |
|
|
207
|
+
| M-SG16 | S7; Arabic system language for a built-in | M-SG06 drag | mirrored order and drag | C |
|
|
208
|
+
| M-SG17 | S5 momentary | tap; hold 600 ms | highlight, thumb pop, hide scale and fade, timings | A, C |
|
|
209
|
+
| M-SG18 | iPad S1 (touch; pointer if available) | tap, hold, drag; hover | differences from iPhone | B |
|
|
210
|
+
| M-SG19 | Safari showing the segmented stories vs S1 | the segmented storyboards side by side | synced recordings (parity proof) | B |
|
|
211
|
+
|
|
212
|
+
## Sheets (UISheetPresentationController)
|
|
213
|
+
|
|
214
|
+
Probe app "SheetProbe" on an iPhone 16 Pro (iPad Pro 11" for M-SH11 / M-SH20 /
|
|
215
|
+
M-SH21): a display-link logger of the sheet container's presentation frame and
|
|
216
|
+
corner radius, the dimming view's alpha, the presenting view's transform and
|
|
217
|
+
corner radius, the grabber frame; the animation dump at the start of each
|
|
218
|
+
transition; the haptics log; drags driven with known velocity and the touch
|
|
219
|
+
stream logged. Built-in apps are recorded too, to check that system sheets
|
|
220
|
+
match the probe.
|
|
221
|
+
|
|
222
|
+
| ID | Scene | Gesture or action | Extract | Method |
|
|
223
|
+
| ------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
224
|
+
| M-SH01 | SheetProbe: detents `[.medium, .large]`, `[.large]`, a custom 0.25 · max | present; read frames at rest | sheet top y at each detent; `maximumDetentValue`; safe areas | C, D |
|
|
225
|
+
| M-SH01B | SheetProbe: content with a bottom-pinned toolbar | drag medium → large slowly | per frame: presented view height and toolbar y (relayout or translate?) | C |
|
|
226
|
+
| M-SH02 | SheetProbe and Maps (iOS 26) | rest at small / medium / large; slow drag between | corner radius, side and bottom inset, material per frame against height; iOS 18 baseline | B, C |
|
|
227
|
+
| M-SH02B | SheetProbe with `Detent.backgroundEffect` set and unset (26.1) | rest at each detent | effect per detent and the transition between | B, C |
|
|
228
|
+
| M-SH03 | SheetProbe `prefersGrabberVisible` | rest; tap the grabber | grabber frame, colors (light / dark / increased contrast), touch target (hit-test grid) | C, D |
|
|
229
|
+
| M-SH04 | SheetProbe default and `largestUndimmedDetentIdentifier = .medium`; Notes' format sheet | drag medium → large and large → dismissed at 300 pt/s | dimming color, alpha per frame against sheet y | C |
|
|
230
|
+
| M-SH04B | SheetProbe at medium and large; the share sheet | tap the dimmed area | dismisses or not | C |
|
|
231
|
+
| M-SH05 | Contacts + (page sheet); SheetProbe `[.medium, .large]` | present; drag medium ⇄ large | presenting view scale, translateY, corner radius per frame against sheet y | B, C |
|
|
232
|
+
| M-SH06 | SheetProbe: a sheet presenting a sheet (both large; medium over large) | present the second; drag it down | the covered sheet's transform per frame | C |
|
|
233
|
+
| M-SH07 | SheetProbe | present and `dismiss(animated:)` at medium and large | spring parameters (dump) and y per frame 0–800 ms | A, C |
|
|
234
|
+
| M-SH08 | SheetProbe | `animateChanges { selectedDetentIdentifier = … }` both ways | spring parameters; the presenting view's recede timing | A, C |
|
|
235
|
+
| M-SH09 | SheetProbe `[.medium, .large]` | drags released at 0, 200, 500, 1000, 2000, 4000 pt/s from 10 positions between and below the detents; a slow 1:1 drag in 4 pt steps | target per (position, velocity); release spring incl. initialVelocity; finger vs sheet (magnet?); dismiss / cancel boundary; minimum travel for a throw | A, C |
|
|
236
|
+
| M-SH09B | SheetProbe | touch down 80 ms into a present, a detent change, a cancel | sheet y at the touch frame vs before (grab from the presentation value) | C |
|
|
237
|
+
| M-SH09C | SheetProbe | a second finger lands during a drag (still; moving apart) | sheet behavior | C |
|
|
238
|
+
| M-SH10 | SheetProbe at large | drag up 50 … 600 pt slowly; release | displacement against finger; fitted d for the rubber band; the return spring | A, C |
|
|
239
|
+
| M-SH11 | SheetProbe `isModalInPresentation = true` | drag down 50 … 600 pt; release slow and fast | the resistance curve; when `presentationControllerDidAttemptToDismiss` fires | C |
|
|
240
|
+
| M-SH12 | SheetProbe text field at medium; Calendar new event | focus, blur | sheet y per frame against the keyboard frame; the curve (notification curve 7, dump) | A, C |
|
|
241
|
+
| M-SH12B | same | drag the sheet with the keyboard up | does editing end? interactive keyboard? | C |
|
|
242
|
+
| M-SH13 | SheetProbe with Reduce Motion on | present, detent change, dismiss, drag release | the substitution (cross-fade, slide, duration) | B, C |
|
|
243
|
+
| M-SH14 | SheetProbe `[.medium, .large]`, a long list at its top; again with `prefersScrollingExpandsWhenScrolledToEdge = false` | swipe up 400 pt in one gesture | sheet travel vs content offset per frame (does scrolling continue in the same gesture?) | C |
|
|
244
|
+
| M-SH15 | SheetProbe at large, list scrolled 300 pt | one continuous 600 pt downward swipe | content offset, then sheet y, per frame | C |
|
|
245
|
+
| M-SH15B | SheetProbe with a horizontal collection view and long-pressable text | diagonal swipes at 20° / 45° / 70°; long-press then drag | which recognizer wins | C |
|
|
246
|
+
| M-SH16 | SheetProbe | every transition above | haptics log | H |
|
|
247
|
+
| M-SH17 | SheetProbe with the Accessibility Inspector and VoiceOver | present; inspect the grabber; double-tap; swipe up / down; Z-scrub; at an undimmed detent, swipe past the sheet | label, traits, value, hint, custom actions, focus on present, escape result, reachability of content behind | D |
|
|
248
|
+
| M-SH18 | SheetProbe with Reduce Transparency / Increase Contrast / Bold Text | rest at each detent | material and border changes | B |
|
|
249
|
+
| M-SH20 | Files or Mail on iPad portrait (overlay sidebar); SheetProbe split view | edge-swipe to reveal; swipe to dismiss; tap the dimmed area | sidebar x per frame, spring parameters, dim alpha, width | A, B, C |
|
|
250
|
+
| M-SH20B | SheetProbe `UISplitViewController` with an inspector column, compact width | show the inspector | presentation in compact width (sheet? detents?) | B, C |
|
|
251
|
+
| M-SH21 | SheetProbe on iPad, iOS 27 `preferredPlacement` each case, RTL | present | placement geometry and motion | B, C |
|
|
252
|
+
| M-SH22 | SheetProbe iOS 26 `preferredTransition = .zoom` from a bar button | present, dismiss | morph geometry per frame | A, C |
|
|
253
|
+
|
|
254
|
+
## Context menu (UIContextMenuInteraction)
|
|
255
|
+
|
|
256
|
+
Values the context menu reads from its own table, which lands with the
|
|
257
|
+
context menu; its springs are `springs.contextMenuLift` and
|
|
258
|
+
`springs.contextMenuDismiss`.
|
|
259
|
+
|
|
260
|
+
Captured (iOS 26.2 simulator, Oct 23 2026; the values land with the context
|
|
261
|
+
menu's table): M-CM4.
|
|
262
|
+
Under Reduce Motion the pressed copy does not grow at all and only its shadow
|
|
263
|
+
fades in, with Prefer Cross-Fade Transitions on or off.
|
|
264
|
+
|
|
265
|
+
| ID | What | App and gesture | Extract | Method |
|
|
266
|
+
| ----- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
|
|
267
|
+
| M-CM2 | Press feedback by size | Probe app: context-menu interactions on views of several sizes (60 × 60, 200 × 120, 400 × 300 pt); long press | the platter's target scale ramp (per second) before and after the commit, by size, and the spring its presentation follows | A, C |
|
|
268
|
+
| M-CM3 | Click-driver movement allowance | Probe app: long presses that drift N pt before the commit; binary search | the largest drift that still commits | C |
|
|
269
|
+
| M-CM4 | Reduce Motion press feedback | Probe app with Reduce Motion on: long press, then dismiss | press feedback, lift and dismiss animations under Reduce Motion | A, B |
|
|
270
|
+
| M-CM5 | Commit haptic stand-in | An Android device: `navigator.vibrate` patterns against the platform's HapticFeedbackConstants for the context-click moment | the pattern that matches; not a UIKit parity value (as M-G18) | H |
|
|
271
|
+
| M-CM6 | Press thresholds | Probe app: repeated long presses at random vsync phases | from touch receipt and from the HID timestamp, the tick before and the tick at the press observer's began and at the click commit; the intersection pins the 150 ms and 400 ms thresholds | C |
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Motion
|
|
2
|
+
|
|
3
|
+
Internal motion foundation for the touch presentations of core components: the
|
|
4
|
+
UIKit constants table (every spring, duration, deceleration rate, rubber-band
|
|
5
|
+
constant, curve and gesture threshold a touch presentation uses, each with its
|
|
6
|
+
source), the spring, decay, rubber-band and projection math UIKit uses, and a
|
|
7
|
+
compositor animator that plays it. Nothing here is exported from the package
|
|
8
|
+
entry point. Core's motion and gesture modules read the table by path;
|
|
9
|
+
components read touch motion through its internal motion roles (`roles.ts`),
|
|
10
|
+
so each keeps its measured value; no shipped component reads the roles yet.
|
|
11
|
+
|
|
12
|
+
## Files
|
|
13
|
+
|
|
14
|
+
| File | What it is |
|
|
15
|
+
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
16
|
+
| `uikit/` | THE constants table: every spring, duration, deceleration rate, rubber-band constant and curve, with its source. |
|
|
17
|
+
| `uikit/springs.ts` | Interaction springs (navigation, sheets, alerts, menus, controls, keyboard, banners) and the SwiftUI / UIKit presets. |
|
|
18
|
+
| `uikit/scroll.ts` | UIScrollView: deceleration rates, rubber band, bounce-back spring, paging, `delaysContentTouches`, scroll to top. |
|
|
19
|
+
| `uikit/timing.ts` | Non-spring clocks and curves: press highlight, Core Animation's named curves, keyboard, Reduced Motion cross-fade. |
|
|
20
|
+
| `uikit/navigation.ts` | UINavigationController: push velocity, parallax, dimming, transition clock, interactive pop finish rule. |
|
|
21
|
+
| `uikit/gestures.ts` | Gesture recognizer thresholds, the velocity filter and haptic stand-ins, as `{value, unit}` entries (sources in JSDoc). |
|
|
22
|
+
| `MEASUREMENTS.md` | The UIKit reference captures each unconfirmed value still needs. |
|
|
23
|
+
| `spring.ts` | Closed-form damped spring, every Apple parameterization, settling duration, a spring chasing a moving target. |
|
|
24
|
+
| `decay.ts` | UIScrollView's momentum coast. |
|
|
25
|
+
| `coast.ts` | A release's momentum curves for `animator.decay`: the coast, the edge spring, a release past an edge. |
|
|
26
|
+
| `rubberBand.ts` | UIScrollView's resistance past an edge, and its inverse. |
|
|
27
|
+
| `projection.ts` | Release targets: the rest point nearest the projected coast. |
|
|
28
|
+
| `resolveSnapPoint.ts` | Release policy: the snap point a release lands on (flick, back-out cancel, step limit), on `selectSnapPoint`. Internal. |
|
|
29
|
+
| `selectPage.ts` | Paging: at most one page per release, on `resolveSnapPoint`. |
|
|
30
|
+
| `bezier.ts` | Cubic-bézier timing functions (Core Animation's named curves). |
|
|
31
|
+
| `animator.ts` | Compositor animator: springs, coasts and any closed-form curve compiled to Web Animations, read back analytically. |
|
|
32
|
+
| `reducedMotionPlan.ts` | The animator's Reduce Motion planner: what one call becomes, a cross-fade whose travel lands while transparent or at once. |
|
|
33
|
+
|
|
34
|
+
Component-specific values (a sheet's detents, a switch's geometry, a context
|
|
35
|
+
menu's timeline) live in a domain file per component, `uikit/<component>.ts`,
|
|
36
|
+
under the same rules.
|
|
37
|
+
|
|
38
|
+
## Animator
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
import {createAnimator} from '../motion/animator';
|
|
42
|
+
import {coast} from '../motion/coast';
|
|
43
|
+
import {solveSpringTowardRamp, toSpring} from '../motion/spring';
|
|
44
|
+
import {springs} from '../motion/uikit';
|
|
45
|
+
|
|
46
|
+
const animator = createAnimator(sheet);
|
|
47
|
+
|
|
48
|
+
// A drag writes one style per frame and never renders:
|
|
49
|
+
animator.set({y: offset});
|
|
50
|
+
|
|
51
|
+
// The finger lifts: spring to the detent with the release velocity (px/s).
|
|
52
|
+
const handle = animator.animate({y: detent}, {spring: springs.sheetDetent, velocity: {y: 1200}});
|
|
53
|
+
|
|
54
|
+
// A finger lands mid-flight: where is the sheet right now, how fast?
|
|
55
|
+
const y = animator.get('y', event.timeStamp);
|
|
56
|
+
const v = animator.getVelocity('y', event.timeStamp);
|
|
57
|
+
animator.stop(['y']); // freezes at the value on screen
|
|
58
|
+
|
|
59
|
+
// A throw on a scroll-like surface, with an edge (coast.ts builds the curves):
|
|
60
|
+
animator.decay(coast(animator, {x: velocityX}, {bounds: {x: {min: -maxScroll, max: 0}}}));
|
|
61
|
+
|
|
62
|
+
// Any closed-form curve, here a press that keeps deepening: the target
|
|
63
|
+
// scale falls at 0.16/s and the platter follows it on a spring. Press
|
|
64
|
+
// feedback has no fade of its own, so it is skipped under Reduce Motion.
|
|
65
|
+
if (animator.reducedMotion() === 'off') {
|
|
66
|
+
const ramp = solveSpringTowardRamp(toSpring(springs.contextMenuLift), {
|
|
67
|
+
from: 1,
|
|
68
|
+
target: 1,
|
|
69
|
+
slope: -0.16,
|
|
70
|
+
});
|
|
71
|
+
animator.play({scale: {duration: 0.266, at: ramp.value, velocity: ramp.velocity}});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await handle.finished; // true if it ran to the end, false if interrupted
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- Drives `x`, `y`, `rotate`, `scaleX`, `scaleY` (`scale` sets both) and
|
|
78
|
+
`opacity`, through the individual CSS properties `translate`, `rotate`,
|
|
79
|
+
`scale` and `opacity`. The element's `transform` stays the component's.
|
|
80
|
+
- `get` / `getVelocity` evaluate the curves; the DOM is never read.
|
|
81
|
+
- Promotion: every animation the animator creates, and every `set`, gives its
|
|
82
|
+
channels a compositing layer in the same task (inline `will-change`, merged
|
|
83
|
+
with the element's own), cleared 500 ms after the last motion. Mobile Safari
|
|
84
|
+
needs it to run a curve through a blocked main thread.
|
|
85
|
+
- `atRest(properties)` resolves once none of them is moving, after the last
|
|
86
|
+
curve ends, whoever started it.
|
|
87
|
+
- `rebase({y: -shift})` moves properties at once, as a layout shift does; a
|
|
88
|
+
property moving on a spring keeps its spring, velocity and target.
|
|
89
|
+
- `play` bakes any curve given as value and velocity functions of time (a
|
|
90
|
+
spring chasing a moving target from `solveSpringTowardRamp`, a fitted UIKit
|
|
91
|
+
curve) exactly like a spring.
|
|
92
|
+
- `animate` always starts from the presentation value with the presentation
|
|
93
|
+
velocity unless a velocity is handed in, so retargeting is continuous
|
|
94
|
+
(`handle.retarget(to)` keeps the call's spring).
|
|
95
|
+
- A call from rest gets no start time, so the browser starts it when it
|
|
96
|
+
commits it, as Core Animation does: in Chromium a block before that frame
|
|
97
|
+
delays the motion instead of skipping into it (WebKit starts it at the
|
|
98
|
+
frame before the block). Everything the call starts shares that start
|
|
99
|
+
(`handle.started`); a retarget keeps an explicit one, and `{at}` puts
|
|
100
|
+
several animators on one clock.
|
|
101
|
+
- Reduced Motion (`prefers-reduced-motion: reduce`, design:reduced-motion):
|
|
102
|
+
every `animate` and `play` is replaced and nothing moves, scales or
|
|
103
|
+
springs. On a coarse primary pointer, or for a call started by a touch
|
|
104
|
+
drag's release (`{touchRelease: true}`), it is an opacity-only cross-fade
|
|
105
|
+
of `timing.reducedMotionCrossFadeMs` (200 ms): an entrance from 0 lands and
|
|
106
|
+
fades in, an exit to 0 fades out then lands, an opacity change fades, any
|
|
107
|
+
other move dips (fade out, land, fade in). Travel lands with a plain style write while
|
|
108
|
+
the element is transparent, never as an animated transform. On any other
|
|
109
|
+
pointer it completes at once.
|
|
110
|
+
`{crossfadeAs: 'entrance'}` or `'exit'` gives a slide that changes no
|
|
111
|
+
opacity its direction. No option or theme value lengthens the fade or keeps
|
|
112
|
+
travel. For motion the animator does not drive, `reducedMotionFade()`
|
|
113
|
+
answers the same policy, and `reducedMotion.stylex.ts` holds its CSS
|
|
114
|
+
constants and the two media queries a StyleX transition spells.
|
|
115
|
+
A decay's momentum keeps its motion under Reduce Motion: momentum that
|
|
116
|
+
continues a throw is direct movement (DR2, DEC-2). A curve marked
|
|
117
|
+
`isTransition` (a coast's spring back from past an edge), like a spring a
|
|
118
|
+
component starts on release toward a target it picks, plays through the
|
|
119
|
+
Reduce Motion policy: a cross-fade on a coarse pointer or after a touch
|
|
120
|
+
release (`decay(curves, {touchRelease: true})`), at once elsewhere.
|
|
121
|
+
- `animatorFor(element)` returns the one animator for an element, so code
|
|
122
|
+
that animates it from several places (a swipe on x, a removal on y)
|
|
123
|
+
composes in one `translate` track.
|
|
124
|
+
|
|
125
|
+
### How it stays on the compositor
|
|
126
|
+
|
|
127
|
+
Each curve is baked into keyframes, sampled adaptively until linear
|
|
128
|
+
interpolation is within 0.05 px, and played with `easing: linear` on one
|
|
129
|
+
start time. The element's inline style already holds the end values,
|
|
130
|
+
and the keyframes hold the end state for a few seconds past the curve's end;
|
|
131
|
+
the main thread drops the animation as soon as it runs after that end. So the
|
|
132
|
+
frame an animation ends needs no main thread and shows no flicker, even when
|
|
133
|
+
the main thread is blocked as the curve ends (WebKit's compositor otherwise
|
|
134
|
+
falls back to the last value its main thread committed, mid-flight).
|
|
135
|
+
|
|
136
|
+
Keyframes rather than one `linear()` easing: measured in Chromium, both are
|
|
137
|
+
composited and, for the same samples, equally precise; but WebKit's Core
|
|
138
|
+
Animation path does not accelerate an effect whose easing is `linear()` with
|
|
139
|
+
points (`KeyframeEffect::canBeAccelerated`) unless its newer threaded
|
|
140
|
+
animations are on, so on older iOS Safari a `linear()` spring would run on the
|
|
141
|
+
main thread. Linear segments between keyframes map directly onto Core
|
|
142
|
+
Animation keyframe animations.
|
|
143
|
+
|
|
144
|
+
## Math
|
|
145
|
+
|
|
146
|
+
`spring.ts` solves m·x″ + c·x′ + k·x = 0 in closed form in all three regimes:
|
|
147
|
+
the model behind SwiftUI's `Spring`, `CASpringAnimation` and
|
|
148
|
+
`UISpringTimingParameters`. A spring description stays in its source's
|
|
149
|
+
vocabulary (mass, stiffness and damping; duration and bounce; response and
|
|
150
|
+
damping ratio) and `toSpring` normalizes it. A mass, stiffness and damping
|
|
151
|
+
description that does not allow overdamping is clamped to critical, as Core
|
|
152
|
+
Animation does for every spring UIKit attaches. The tests hold it to an
|
|
153
|
+
independent fourth-order Runge-Kutta integration over a sweep of damping
|
|
154
|
+
ratios, responses and release velocities; to a port of WebKit's own spring
|
|
155
|
+
solver; to the WWDC23 "Animate with springs" conversion equations; and to
|
|
156
|
+
values read from UIKit on the iOS 26.2 simulator: `settlingDuration` for a
|
|
157
|
+
grid of springs and velocities, and the durations UIKit gives its spring APIs,
|
|
158
|
+
which the settling formula reproduces to the last digit (underdamped) or within
|
|
159
|
+
0.02 % (critically damped). `decay.ts` is held to a literal per-millisecond
|
|
160
|
+
simulation of the deceleration rate and to WWDC18's projection function;
|
|
161
|
+
`rubberBand.ts` to UIScrollView's overscroll measured on the simulator.
|
|
162
|
+
`uikit/values.test.ts` plays the table's values through this math.
|
|
163
|
+
|
|
164
|
+
## Sources
|
|
165
|
+
|
|
166
|
+
Every value in `uikit/` carries its source next to it, as a JSDoc tag on the
|
|
167
|
+
entry:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
/**
|
|
171
|
+
* What the value is, in UIKit's words.
|
|
172
|
+
* @source apple-docs https://developer.apple.com/documentation/…
|
|
173
|
+
*/
|
|
174
|
+
key: value,
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Allowed source kinds:
|
|
178
|
+
|
|
179
|
+
- `@source apple-docs <developer.apple.com URL>`
|
|
180
|
+
- `@source wwdc <year>-<session> "<title>": <what it says>`
|
|
181
|
+
- `@source webkit Source/<path> <what it says>` (Apple's engine, matched to
|
|
182
|
+
UIKit in its own comments; confirmed by a measurement)
|
|
183
|
+
- `@source measured: <app>, iOS <version>, <method>, <date>`
|
|
184
|
+
- `@source GUESS — <what it is based on>`
|
|
185
|
+
|
|
186
|
+
A `GUESS` or `webkit` value also names the measurement that will confirm or
|
|
187
|
+
replace it (`@measure M-…`, listed in MEASUREMENTS.md). An entry may carry
|
|
188
|
+
several sources when different parts come from different places.
|
|
189
|
+
The sources are documentation and stay out of the bundle: no value carries
|
|
190
|
+
them, `uikit/gestures.ts` included (its entries ship only `{value, unit}`).
|
|
191
|
+
`uikit/uikit.test.ts` enforces all of it on every domain file: an unsourced
|
|
192
|
+
value, an unknown kind, a guess without a task, a task missing from
|
|
193
|
+
MEASUREMENTS.md, or a source in a value fails the build.
|
|
194
|
+
|
|
195
|
+
Measurements come from the iOS simulator: built-in apps (Settings, Maps,
|
|
196
|
+
Photos, Files, Contacts, Calendar, Reminders, Safari's own chrome) or a UIKit
|
|
197
|
+
host app that reads the animations, recognizers and haptics UIKit attaches.
|
|
198
|
+
Each names its iOS version; iOS 26.2 is the reference.
|
|
199
|
+
|
|
200
|
+
### Adding a constant
|
|
201
|
+
|
|
202
|
+
1. Find the source: Apple's documentation, a WWDC session, or a measurement on
|
|
203
|
+
the iOS simulator.
|
|
204
|
+
2. Add the entry to the domain file it belongs to, in the vocabulary of its
|
|
205
|
+
source (a spring published as response and damping ratio stays
|
|
206
|
+
`{response, dampingRatio}`).
|
|
207
|
+
3. Tag it with its `@source`. No source yet: write the best-founded `GUESS`,
|
|
208
|
+
say what it is based on, add a measurement task to MEASUREMENTS.md and tag
|
|
209
|
+
the entry with it.
|
|
210
|
+
4. When a measurement lands, replace the value, tag it
|
|
211
|
+
`@source measured: …`, and drop the `@measure` tag.
|
|
212
|
+
|
|
213
|
+
## Measurements
|
|
214
|
+
|
|
215
|
+
[MEASUREMENTS.md](MEASUREMENTS.md) is the one list of UIKit reference captures:
|
|
216
|
+
what each value still needs from the iOS simulator, the app and gesture to
|
|
217
|
+
capture, the value to extract and the method. Every `@measure` ID in `uikit/`
|
|
218
|
+
resolves there.
|