@multiplatform.one/components 7.11.0 → 7.16.0
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/README.md +2 -2
- package/dist/cjs/Accordion/index.cjs +2 -6
- package/dist/cjs/Accordion/index.native.js +3 -7
- package/dist/cjs/Accordion/index.native.js.map +1 -1
- package/dist/cjs/Alert/index.native.js.map +1 -1
- package/dist/cjs/AnimateHeight/index.cjs +1 -3
- package/dist/cjs/AnimateHeight/index.native.js +1 -3
- package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
- package/dist/cjs/Avatar/getInitials.native.js.map +1 -1
- package/dist/cjs/Avatar/index.native.js.map +1 -1
- package/dist/cjs/Badge/index.native.js.map +1 -1
- package/dist/cjs/Button.native.js.map +1 -1
- package/dist/cjs/Card.native.js.map +1 -1
- package/dist/cjs/CardFooter.native.js.map +1 -1
- package/dist/cjs/CardHeader.native.js.map +1 -1
- package/dist/cjs/Carousel/index.cjs +2 -1
- package/dist/cjs/Carousel/index.native.js +3 -2
- package/dist/cjs/Carousel/index.native.js.map +1 -1
- package/dist/cjs/Chip/index.cjs +13 -3
- package/dist/cjs/Chip/index.native.js +13 -3
- package/dist/cjs/Chip/index.native.js.map +1 -1
- package/dist/cjs/Collapsible.native.js.map +1 -1
- package/dist/cjs/ContextMenu/index.native.js.map +1 -1
- package/dist/cjs/CopyField/index.native.js.map +1 -1
- package/dist/cjs/DotIndicator/index.native.js.map +1 -1
- package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
- package/dist/cjs/ErrorBoundary/index.native.js.map +1 -1
- package/dist/cjs/Heading.native.js.map +1 -1
- package/dist/cjs/Meter/index.native.js +1 -1
- package/dist/cjs/Meter/index.native.js.map +1 -1
- package/dist/cjs/Meter/meter.native.js.map +1 -1
- package/dist/cjs/Pagination.native.js +1 -1
- package/dist/cjs/Pagination.native.js.map +1 -1
- package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
- package/dist/cjs/Quote/index.native.js.map +1 -1
- package/dist/cjs/ScrollView/index.cjs +28 -0
- package/dist/cjs/ScrollView/index.native.js +72 -0
- package/dist/cjs/ScrollView/index.native.js.map +1 -0
- package/dist/cjs/Separator/index.native.js.map +1 -1
- package/dist/cjs/SheetModal/detents.native.js.map +1 -1
- package/dist/cjs/SheetModal/index.native.js +70 -22
- package/dist/cjs/SheetModal/index.native.js.map +1 -1
- package/dist/cjs/Skeleton/index.cjs +1 -13
- package/dist/cjs/Skeleton/index.native.js +1 -13
- package/dist/cjs/Skeleton/index.native.js.map +1 -1
- package/dist/cjs/SkipLink/index.native.js.map +1 -1
- package/dist/cjs/SortableList/SortableHandle.native.js.map +1 -1
- package/dist/cjs/SortableList/index.native.js.map +1 -1
- package/dist/cjs/SortableList/useSortableRows.native.js.map +1 -1
- package/dist/cjs/Tabs/index.cjs +4 -7
- package/dist/cjs/Tabs/index.native.js +4 -7
- package/dist/cjs/Tabs/index.native.js.map +1 -1
- package/dist/cjs/Text.cjs +2 -0
- package/dist/cjs/Text.native.js +2 -0
- package/dist/cjs/Text.native.js.map +1 -1
- package/dist/cjs/Toast/index.native.js.map +1 -1
- package/dist/cjs/Toast/store.native.js.map +1 -1
- package/dist/cjs/Tooltip/nativePress.native.js.map +1 -1
- package/dist/cjs/Tooltip/tooltipShared.native.js.map +1 -1
- package/dist/cjs/TreeSelect/index.cjs +55 -52
- package/dist/cjs/TreeSelect/index.native.js +56 -53
- package/dist/cjs/TreeSelect/index.native.js.map +1 -1
- package/dist/cjs/TreeSelect/treeSelectModel.native.js.map +1 -1
- package/dist/cjs/Video/PlayerChrome.cjs +3 -9
- package/dist/cjs/Video/PlayerChrome.native.js +3 -9
- package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
- package/dist/cjs/Video/VideoFrame.native.js.map +1 -1
- package/dist/cjs/Video/types.native.js.map +1 -1
- package/dist/cjs/Wheel/index.native.js.map +1 -1
- package/dist/cjs/Wizard/index.native.js +2 -2
- package/dist/cjs/Wizard/index.native.js.map +1 -1
- package/dist/cjs/actions/ActionBar.native.js.map +1 -1
- package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
- package/dist/cjs/actions/devWarn.native.js.map +1 -1
- package/dist/cjs/actions/index.native.js.map +1 -1
- package/dist/cjs/actions/severity.native.js.map +1 -1
- package/dist/cjs/charts/Axis.native.js.map +1 -1
- package/dist/cjs/charts/BarChart.native.js.map +1 -1
- package/dist/cjs/charts/ChartDataView.native.js.map +1 -1
- package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
- package/dist/cjs/charts/LineChart.native.js.map +1 -1
- package/dist/cjs/charts/PieChart.native.js.map +1 -1
- package/dist/cjs/charts/Sparkline.native.js.map +1 -1
- package/dist/cjs/charts/accessibility.native.js.map +1 -1
- package/dist/cjs/charts/composeChart.native.js.map +1 -1
- package/dist/cjs/charts/index.native.js.map +1 -1
- package/dist/cjs/charts/math.cjs +18 -0
- package/dist/cjs/charts/math.native.js +18 -0
- package/dist/cjs/charts/math.native.js.map +1 -1
- package/dist/cjs/charts/series.cjs +17 -8
- package/dist/cjs/charts/series.native.js +17 -8
- package/dist/cjs/charts/series.native.js.map +1 -1
- package/dist/cjs/charts/svg.cjs +6 -0
- package/dist/cjs/charts/svg.native.js +6 -0
- package/dist/cjs/charts/svg.native.js.map +1 -1
- package/dist/cjs/charts/types.native.js.map +1 -1
- package/dist/cjs/charts/useChartTheme.cjs +3 -9
- package/dist/cjs/charts/useChartTheme.native.js +4 -10
- package/dist/cjs/charts/useChartTheme.native.js.map +1 -1
- package/dist/cjs/code/Code/index.cjs +6 -0
- package/dist/cjs/code/Code/index.native.js +7 -4
- package/dist/cjs/code/Code/index.native.js.map +1 -1
- package/dist/cjs/code/CodeBlock/index.cjs +4 -5
- package/dist/cjs/code/CodeBlock/index.native.js +10 -11
- package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
- package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
- package/dist/cjs/code/Highlighter/index.native.js.map +1 -1
- package/dist/cjs/code/Pre/index.native.js.map +1 -1
- package/dist/cjs/code/index.native.js +5 -5
- package/dist/cjs/code/index.native.js.map +1 -1
- package/dist/cjs/componentColors.native.js.map +1 -1
- package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
- package/dist/cjs/feedback/NotifyHost.native.js +2 -2
- package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
- package/dist/cjs/feedback/copy.native.js.map +1 -1
- package/dist/cjs/feedback/index.native.js.map +1 -1
- package/dist/cjs/feedback/notify.native.js.map +1 -1
- package/dist/cjs/feedback/route.native.js.map +1 -1
- package/dist/cjs/feedback/store.native.js.map +1 -1
- package/dist/cjs/hooks/index.native.js +1 -1
- package/dist/cjs/hooks/index.native.js.map +1 -1
- package/dist/cjs/hooks/useClipboard.native.js.map +1 -1
- package/dist/cjs/hooks/useDocumentTitle.native.js.map +1 -1
- package/dist/cjs/icons/CheckRegular.native.js.map +1 -1
- package/dist/cjs/icons/MinusRegular.native.js.map +1 -1
- package/dist/cjs/icons/index.native.js.map +1 -1
- package/dist/cjs/icons/lucide.native.js.map +1 -1
- package/dist/cjs/icons/themed.cjs +2 -1
- package/dist/cjs/icons/themed.native.js +2 -1
- package/dist/cjs/icons/themed.native.js.map +1 -1
- package/dist/cjs/images/Image/ImageFrame.native.js +1 -1
- package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
- package/dist/cjs/images/Image/index.native.js +1 -1
- package/dist/cjs/images/Image/shared.native.js +1 -1
- package/dist/cjs/images/Image/shared.native.js.map +1 -1
- package/dist/cjs/images/Image/types.native.js.map +1 -1
- package/dist/cjs/images/index.native.js.map +1 -1
- package/dist/cjs/index.native.js +29 -29
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/knobImmuneExports.cjs +3 -3
- package/dist/cjs/knobImmuneExports.native.js +3 -3
- package/dist/cjs/knobImmuneExports.native.js.map +1 -1
- package/dist/cjs/layouts/AsyncBoundary.native.js +2 -2
- package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
- package/dist/cjs/layouts/Debug/index.native.js.map +1 -1
- package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
- package/dist/cjs/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
- package/dist/cjs/layouts/PageTemplates.native.js.map +1 -1
- package/dist/cjs/layouts/PaneScaffold.cjs +70 -42
- package/dist/cjs/layouts/PaneScaffold.native.js +75 -48
- package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
- package/dist/cjs/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
- package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
- package/dist/cjs/layouts/attachments.cjs +2 -1
- package/dist/cjs/layouts/attachments.native.js +3 -2
- package/dist/cjs/layouts/attachments.native.js.map +1 -1
- package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
- package/dist/cjs/layouts/index.native.js +3 -3
- package/dist/cjs/layouts/index.native.js.map +1 -1
- package/dist/cjs/layouts/page.cjs +2 -1
- package/dist/cjs/layouts/page.native.js +2 -1
- package/dist/cjs/layouts/page.native.js.map +1 -1
- package/dist/cjs/layouts/pageHeadingScope.native.js.map +1 -1
- package/dist/cjs/layouts/sidebar.cjs +1 -3
- package/dist/cjs/layouts/sidebar.native.js +1 -3
- package/dist/cjs/layouts/sidebar.native.js.map +1 -1
- package/dist/cjs/layouts/tags.native.js +1 -1
- package/dist/cjs/layouts/tags.native.js.map +1 -1
- package/dist/cjs/layouts/timeline.cjs +9 -1
- package/dist/cjs/layouts/timeline.native.js +11 -3
- package/dist/cjs/layouts/timeline.native.js.map +1 -1
- package/dist/cjs/layouts/toolbar.native.js.map +1 -1
- package/dist/cjs/shared/actionScan.native.js.map +1 -1
- package/dist/cjs/shared/i18n.native.js.map +1 -1
- package/dist/cjs/shared/t.native.js.map +1 -1
- package/dist/cjs/shared/textRidesText.native.js.map +1 -1
- package/dist/cjs/shared/useReturnFocusOnClose.native.js.map +1 -1
- package/dist/cjs/surfaces.cjs +0 -32
- package/dist/cjs/surfaces.native.js +1 -33
- package/dist/cjs/surfaces.native.js.map +1 -1
- package/dist/cjs/tamagui.cjs +2 -1
- package/dist/cjs/tamagui.native.js +2 -1
- package/dist/cjs/tamagui.native.js.map +1 -1
- package/dist/cjs/testSetup.native.js.map +1 -1
- package/dist/cjs/utils/setTinted.native.js.map +1 -1
- package/dist/cjs/utils/unwrapText.native.js.map +1 -1
- package/dist/cjs/views/Calendar.native.js.map +1 -1
- package/dist/cjs/views/Dashboard.native.js +1 -1
- package/dist/cjs/views/Dashboard.native.js.map +1 -1
- package/dist/cjs/views/Gantt.native.js +1 -1
- package/dist/cjs/views/Gantt.native.js.map +1 -1
- package/dist/cjs/views/ImageGrid.native.js +1 -1
- package/dist/cjs/views/ImageGrid.native.js.map +1 -1
- package/dist/cjs/views/Kanban.cjs +1 -0
- package/dist/cjs/views/Kanban.native.js +3 -1
- package/dist/cjs/views/Kanban.native.js.map +1 -1
- package/dist/cjs/views/List.cjs +4 -4
- package/dist/cjs/views/List.native.js +7 -7
- package/dist/cjs/views/List.native.js.map +1 -1
- package/dist/cjs/views/Matrix.cjs +568 -0
- package/dist/cjs/views/Matrix.native.js +612 -0
- package/dist/cjs/views/Matrix.native.js.map +1 -0
- package/dist/cjs/views/ReportBuilder.native.js +1 -1
- package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
- package/dist/cjs/views/TreeView.native.js.map +1 -1
- package/dist/cjs/views/calendarMath.native.js.map +1 -1
- package/dist/cjs/views/ganttMath.cjs +2 -0
- package/dist/cjs/views/ganttMath.native.js +2 -0
- package/dist/cjs/views/ganttMath.native.js.map +1 -1
- package/dist/cjs/views/index.cjs +16 -0
- package/dist/cjs/views/index.native.js +17 -1
- package/dist/cjs/views/index.native.js.map +1 -1
- package/dist/cjs/views/kanbanDnd.native.js.map +1 -1
- package/dist/cjs/views/matrixMath.cjs +157 -0
- package/dist/cjs/views/matrixMath.native.js +229 -0
- package/dist/cjs/views/matrixMath.native.js.map +1 -0
- package/dist/cjs/views/treeViewDnd.native.js.map +1 -1
- package/dist/cjs/views/treeViewLayout.native.js.map +1 -1
- package/dist/cjs/views/treeViewMotion.native.js.map +1 -1
- package/dist/cjs/views/treeViewReveal.native.js.map +1 -1
- package/dist/esm/Accordion/index.mjs +3 -7
- package/dist/esm/Accordion/index.mjs.map +1 -1
- package/dist/esm/Accordion/index.native.js +3 -7
- package/dist/esm/Accordion/index.native.js.map +1 -1
- package/dist/esm/AnimateHeight/index.mjs +2 -4
- package/dist/esm/AnimateHeight/index.mjs.map +1 -1
- package/dist/esm/AnimateHeight/index.native.js +2 -4
- package/dist/esm/AnimateHeight/index.native.js.map +1 -1
- package/dist/esm/Avatar/getInitials.native.js.map +1 -1
- package/dist/esm/Avatar/index.native.js.map +1 -1
- package/dist/esm/Badge/index.native.js.map +1 -1
- package/dist/esm/Button.native.js.map +1 -1
- package/dist/esm/Carousel/index.mjs +2 -1
- package/dist/esm/Carousel/index.mjs.map +1 -1
- package/dist/esm/Carousel/index.native.js +2 -1
- package/dist/esm/Carousel/index.native.js.map +1 -1
- package/dist/esm/Chip/index.mjs +15 -5
- package/dist/esm/Chip/index.mjs.map +1 -1
- package/dist/esm/Chip/index.native.js +15 -5
- package/dist/esm/Chip/index.native.js.map +1 -1
- package/dist/esm/Collapsible.native.js.map +1 -1
- package/dist/esm/ContextMenu/index.native.js.map +1 -1
- package/dist/esm/CopyField/index.native.js.map +1 -1
- package/dist/esm/DotIndicator/index.native.js.map +1 -1
- package/dist/esm/DropdownMenu/index.native.js.map +1 -1
- package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
- package/dist/esm/Heading.native.js.map +1 -1
- package/dist/esm/Meter/index.native.js.map +1 -1
- package/dist/esm/Meter/meter.native.js.map +1 -1
- package/dist/esm/Pagination.native.js.map +1 -1
- package/dist/esm/ProgressSteps/index.native.js.map +1 -1
- package/dist/esm/Quote/index.native.js.map +1 -1
- package/dist/esm/ScrollView/index.mjs +3 -0
- package/dist/esm/ScrollView/index.mjs.map +1 -0
- package/dist/esm/ScrollView/index.native.js +44 -0
- package/dist/esm/ScrollView/index.native.js.map +1 -0
- package/dist/esm/Separator/index.native.js.map +1 -1
- package/dist/esm/SheetModal/detents.native.js.map +1 -1
- package/dist/esm/SheetModal/index.native.js +71 -23
- package/dist/esm/SheetModal/index.native.js.map +1 -1
- package/dist/esm/Skeleton/index.mjs +1 -13
- package/dist/esm/Skeleton/index.mjs.map +1 -1
- package/dist/esm/Skeleton/index.native.js +1 -13
- package/dist/esm/Skeleton/index.native.js.map +1 -1
- package/dist/esm/SkipLink/index.native.js.map +1 -1
- package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
- package/dist/esm/SortableList/index.native.js.map +1 -1
- package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
- package/dist/esm/Tabs/index.mjs +5 -8
- package/dist/esm/Tabs/index.mjs.map +1 -1
- package/dist/esm/Tabs/index.native.js +5 -8
- package/dist/esm/Tabs/index.native.js.map +1 -1
- package/dist/esm/Text.mjs +3 -1
- package/dist/esm/Text.mjs.map +1 -1
- package/dist/esm/Text.native.js +3 -1
- package/dist/esm/Text.native.js.map +1 -1
- package/dist/esm/Toast/index.native.js.map +1 -1
- package/dist/esm/Toast/store.native.js.map +1 -1
- package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
- package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
- package/dist/esm/TreeSelect/index.mjs +56 -53
- package/dist/esm/TreeSelect/index.mjs.map +1 -1
- package/dist/esm/TreeSelect/index.native.js +56 -53
- package/dist/esm/TreeSelect/index.native.js.map +1 -1
- package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
- package/dist/esm/Video/PlayerChrome.mjs +4 -10
- package/dist/esm/Video/PlayerChrome.mjs.map +1 -1
- package/dist/esm/Video/PlayerChrome.native.js +4 -10
- package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
- package/dist/esm/Video/VideoFrame.native.js.map +1 -1
- package/dist/esm/Video/types.native.js.map +1 -1
- package/dist/esm/Wheel/index.native.js.map +1 -1
- package/dist/esm/Wizard/index.native.js.map +1 -1
- package/dist/esm/actions/ActionBar.native.js.map +1 -1
- package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
- package/dist/esm/actions/devWarn.native.js.map +1 -1
- package/dist/esm/actions/index.native.js.map +1 -1
- package/dist/esm/actions/severity.native.js.map +1 -1
- package/dist/esm/charts/Axis.native.js.map +1 -1
- package/dist/esm/charts/BarChart.native.js.map +1 -1
- package/dist/esm/charts/ChartDataView.native.js.map +1 -1
- package/dist/esm/charts/ChartSurface.native.js.map +1 -1
- package/dist/esm/charts/LineChart.native.js.map +1 -1
- package/dist/esm/charts/PieChart.native.js.map +1 -1
- package/dist/esm/charts/Sparkline.native.js.map +1 -1
- package/dist/esm/charts/accessibility.native.js.map +1 -1
- package/dist/esm/charts/composeChart.native.js.map +1 -1
- package/dist/esm/charts/index.native.js.map +1 -1
- package/dist/esm/charts/math.mjs +18 -1
- package/dist/esm/charts/math.mjs.map +1 -1
- package/dist/esm/charts/math.native.js +18 -1
- package/dist/esm/charts/math.native.js.map +1 -1
- package/dist/esm/charts/series.mjs +19 -10
- package/dist/esm/charts/series.mjs.map +1 -1
- package/dist/esm/charts/series.native.js +19 -10
- package/dist/esm/charts/series.native.js.map +1 -1
- package/dist/esm/charts/svg.mjs +6 -1
- package/dist/esm/charts/svg.mjs.map +1 -1
- package/dist/esm/charts/svg.native.js +6 -1
- package/dist/esm/charts/svg.native.js.map +1 -1
- package/dist/esm/charts/types.native.js.map +1 -1
- package/dist/esm/charts/useChartTheme.mjs +4 -10
- package/dist/esm/charts/useChartTheme.mjs.map +1 -1
- package/dist/esm/charts/useChartTheme.native.js +5 -11
- package/dist/esm/charts/useChartTheme.native.js.map +1 -1
- package/dist/esm/code/Code/index.mjs +6 -0
- package/dist/esm/code/Code/index.mjs.map +1 -1
- package/dist/esm/code/Code/index.native.js +10 -7
- package/dist/esm/code/Code/index.native.js.map +1 -1
- package/dist/esm/code/CodeBlock/index.mjs +5 -6
- package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
- package/dist/esm/code/CodeBlock/index.native.js +5 -6
- package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
- package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
- package/dist/esm/code/Highlighter/index.native.js.map +1 -1
- package/dist/esm/code/Pre/index.native.js.map +1 -1
- package/dist/esm/code/index.native.js.map +1 -1
- package/dist/esm/componentColors.native.js.map +1 -1
- package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
- package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
- package/dist/esm/feedback/copy.native.js.map +1 -1
- package/dist/esm/feedback/index.native.js.map +1 -1
- package/dist/esm/feedback/notify.native.js.map +1 -1
- package/dist/esm/feedback/route.native.js.map +1 -1
- package/dist/esm/feedback/store.native.js.map +1 -1
- package/dist/esm/hooks/index.native.js.map +1 -1
- package/dist/esm/hooks/useClipboard.native.js.map +1 -1
- package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
- package/dist/esm/icons/CheckRegular.native.js.map +1 -1
- package/dist/esm/icons/MinusRegular.native.js.map +1 -1
- package/dist/esm/icons/index.native.js.map +1 -1
- package/dist/esm/icons/lucide.native.js.map +1 -1
- package/dist/esm/icons/themed.mjs +3 -2
- package/dist/esm/icons/themed.mjs.map +1 -1
- package/dist/esm/icons/themed.native.js +3 -2
- package/dist/esm/icons/themed.native.js.map +1 -1
- package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
- package/dist/esm/images/Image/shared.native.js.map +1 -1
- package/dist/esm/images/Image/types.native.js.map +1 -1
- package/dist/esm/images/index.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/knobImmuneExports.mjs +3 -3
- package/dist/esm/knobImmuneExports.native.js +3 -3
- package/dist/esm/knobImmuneExports.native.js.map +1 -1
- package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
- package/dist/esm/layouts/Debug/index.native.js.map +1 -1
- package/dist/esm/layouts/EmptyState.native.js.map +1 -1
- package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
- package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
- package/dist/esm/layouts/PaneScaffold.mjs +70 -42
- package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
- package/dist/esm/layouts/PaneScaffold.native.js +75 -48
- package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
- package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
- package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
- package/dist/esm/layouts/attachments.mjs +3 -2
- package/dist/esm/layouts/attachments.mjs.map +1 -1
- package/dist/esm/layouts/attachments.native.js +3 -2
- package/dist/esm/layouts/attachments.native.js.map +1 -1
- package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
- package/dist/esm/layouts/index.native.js.map +1 -1
- package/dist/esm/layouts/page.mjs +3 -2
- package/dist/esm/layouts/page.mjs.map +1 -1
- package/dist/esm/layouts/page.native.js +3 -2
- package/dist/esm/layouts/page.native.js.map +1 -1
- package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
- package/dist/esm/layouts/sidebar.mjs +2 -4
- package/dist/esm/layouts/sidebar.mjs.map +1 -1
- package/dist/esm/layouts/sidebar.native.js +2 -4
- package/dist/esm/layouts/sidebar.native.js.map +1 -1
- package/dist/esm/layouts/tags.native.js.map +1 -1
- package/dist/esm/layouts/timeline.mjs +11 -3
- package/dist/esm/layouts/timeline.mjs.map +1 -1
- package/dist/esm/layouts/timeline.native.js +11 -3
- package/dist/esm/layouts/timeline.native.js.map +1 -1
- package/dist/esm/layouts/toolbar.native.js.map +1 -1
- package/dist/esm/shared/actionScan.native.js.map +1 -1
- package/dist/esm/shared/i18n.native.js.map +1 -1
- package/dist/esm/shared/t.native.js.map +1 -1
- package/dist/esm/shared/textRidesText.native.js.map +1 -1
- package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
- package/dist/esm/surfaces.mjs +1 -33
- package/dist/esm/surfaces.mjs.map +1 -1
- package/dist/esm/surfaces.native.js +1 -33
- package/dist/esm/surfaces.native.js.map +1 -1
- package/dist/esm/tamagui.mjs +2 -1
- package/dist/esm/tamagui.mjs.map +1 -1
- package/dist/esm/tamagui.native.js +2 -1
- package/dist/esm/tamagui.native.js.map +1 -1
- package/dist/esm/testSetup.native.js.map +1 -1
- package/dist/esm/utils/setTinted.native.js.map +1 -1
- package/dist/esm/utils/unwrapText.native.js.map +1 -1
- package/dist/esm/views/Calendar.native.js.map +1 -1
- package/dist/esm/views/Dashboard.native.js.map +1 -1
- package/dist/esm/views/Gantt.native.js.map +1 -1
- package/dist/esm/views/ImageGrid.native.js.map +1 -1
- package/dist/esm/views/Kanban.mjs +1 -0
- package/dist/esm/views/Kanban.mjs.map +1 -1
- package/dist/esm/views/Kanban.native.js +3 -1
- package/dist/esm/views/Kanban.native.js.map +1 -1
- package/dist/esm/views/List.mjs +5 -5
- package/dist/esm/views/List.mjs.map +1 -1
- package/dist/esm/views/List.native.js +8 -8
- package/dist/esm/views/List.native.js.map +1 -1
- package/dist/esm/views/Matrix.mjs +543 -0
- package/dist/esm/views/Matrix.mjs.map +1 -0
- package/dist/esm/views/Matrix.native.js +573 -0
- package/dist/esm/views/Matrix.native.js.map +1 -0
- package/dist/esm/views/ReportBuilder.native.js.map +1 -1
- package/dist/esm/views/TreeView.native.js.map +1 -1
- package/dist/esm/views/calendarMath.native.js.map +1 -1
- package/dist/esm/views/ganttMath.mjs +1 -1
- package/dist/esm/views/ganttMath.mjs.map +1 -1
- package/dist/esm/views/ganttMath.native.js +1 -1
- package/dist/esm/views/ganttMath.native.js.map +1 -1
- package/dist/esm/views/index.mjs +4 -2
- package/dist/esm/views/index.mjs.map +1 -1
- package/dist/esm/views/index.native.js +4 -2
- package/dist/esm/views/index.native.js.map +1 -1
- package/dist/esm/views/kanbanDnd.native.js.map +1 -1
- package/dist/esm/views/matrixMath.mjs +122 -0
- package/dist/esm/views/matrixMath.mjs.map +1 -0
- package/dist/esm/views/matrixMath.native.js +191 -0
- package/dist/esm/views/matrixMath.native.js.map +1 -0
- package/dist/esm/views/treeViewDnd.native.js.map +1 -1
- package/dist/esm/views/treeViewLayout.native.js.map +1 -1
- package/dist/esm/views/treeViewMotion.native.js.map +1 -1
- package/dist/esm/views/treeViewReveal.native.js.map +1 -1
- package/dist/jsx/Accordion/index.mjs +3 -7
- package/dist/jsx/Accordion/index.mjs.map +1 -1
- package/dist/jsx/Accordion/index.native.js +2 -6
- package/dist/jsx/Accordion/index.native.js.map +1 -1
- package/dist/jsx/AnimateHeight/index.mjs +2 -4
- package/dist/jsx/AnimateHeight/index.mjs.map +1 -1
- package/dist/jsx/AnimateHeight/index.native.js +1 -3
- package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
- package/dist/jsx/Carousel/index.mjs +2 -1
- package/dist/jsx/Carousel/index.mjs.map +1 -1
- package/dist/jsx/Carousel/index.native.js +2 -1
- package/dist/jsx/Carousel/index.native.js.map +1 -1
- package/dist/jsx/Chip/index.mjs +15 -5
- package/dist/jsx/Chip/index.mjs.map +1 -1
- package/dist/jsx/Chip/index.native.js +13 -3
- package/dist/jsx/Chip/index.native.js.map +1 -1
- package/dist/jsx/ScrollView/index.mjs +3 -0
- package/dist/jsx/ScrollView/index.mjs.map +1 -0
- package/dist/jsx/ScrollView/index.native.js +72 -0
- package/dist/jsx/ScrollView/index.native.js.map +1 -0
- package/dist/jsx/SheetModal/index.native.js +70 -22
- package/dist/jsx/SheetModal/index.native.js.map +1 -1
- package/dist/jsx/Skeleton/index.mjs +1 -13
- package/dist/jsx/Skeleton/index.mjs.map +1 -1
- package/dist/jsx/Skeleton/index.native.js +1 -13
- package/dist/jsx/Skeleton/index.native.js.map +1 -1
- package/dist/jsx/Tabs/index.mjs +5 -8
- package/dist/jsx/Tabs/index.mjs.map +1 -1
- package/dist/jsx/Tabs/index.native.js +4 -7
- package/dist/jsx/Tabs/index.native.js.map +1 -1
- package/dist/jsx/Text.mjs +3 -1
- package/dist/jsx/Text.mjs.map +1 -1
- package/dist/jsx/Text.native.js +2 -0
- package/dist/jsx/Text.native.js.map +1 -1
- package/dist/jsx/TreeSelect/index.mjs +56 -53
- package/dist/jsx/TreeSelect/index.mjs.map +1 -1
- package/dist/jsx/TreeSelect/index.native.js +55 -52
- package/dist/jsx/TreeSelect/index.native.js.map +1 -1
- package/dist/jsx/Video/PlayerChrome.mjs +4 -10
- package/dist/jsx/Video/PlayerChrome.mjs.map +1 -1
- package/dist/jsx/Video/PlayerChrome.native.js +3 -9
- package/dist/jsx/Video/PlayerChrome.native.js.map +1 -1
- package/dist/jsx/charts/math.mjs +18 -1
- package/dist/jsx/charts/math.mjs.map +1 -1
- package/dist/jsx/charts/math.native.js +18 -0
- package/dist/jsx/charts/math.native.js.map +1 -1
- package/dist/jsx/charts/series.mjs +19 -10
- package/dist/jsx/charts/series.mjs.map +1 -1
- package/dist/jsx/charts/series.native.js +17 -8
- package/dist/jsx/charts/series.native.js.map +1 -1
- package/dist/jsx/charts/svg.mjs +6 -1
- package/dist/jsx/charts/svg.mjs.map +1 -1
- package/dist/jsx/charts/svg.native.js +6 -0
- package/dist/jsx/charts/svg.native.js.map +1 -1
- package/dist/jsx/charts/useChartTheme.mjs +4 -10
- package/dist/jsx/charts/useChartTheme.mjs.map +1 -1
- package/dist/jsx/charts/useChartTheme.native.js +4 -10
- package/dist/jsx/charts/useChartTheme.native.js.map +1 -1
- package/dist/jsx/code/Code/index.mjs +6 -0
- package/dist/jsx/code/Code/index.mjs.map +1 -1
- package/dist/jsx/code/Code/index.native.js +7 -4
- package/dist/jsx/code/Code/index.native.js.map +1 -1
- package/dist/jsx/code/CodeBlock/index.mjs +5 -6
- package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
- package/dist/jsx/code/CodeBlock/index.native.js +4 -5
- package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
- package/dist/jsx/icons/themed.mjs +3 -2
- package/dist/jsx/icons/themed.mjs.map +1 -1
- package/dist/jsx/icons/themed.native.js +2 -1
- package/dist/jsx/icons/themed.native.js.map +1 -1
- package/dist/jsx/knobImmuneExports.mjs +3 -3
- package/dist/jsx/knobImmuneExports.native.js +3 -3
- package/dist/jsx/layouts/PaneScaffold.mjs +70 -42
- package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
- package/dist/jsx/layouts/PaneScaffold.native.js +75 -48
- package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
- package/dist/jsx/layouts/attachments.mjs +3 -2
- package/dist/jsx/layouts/attachments.mjs.map +1 -1
- package/dist/jsx/layouts/attachments.native.js +2 -1
- package/dist/jsx/layouts/attachments.native.js.map +1 -1
- package/dist/jsx/layouts/page.mjs +3 -2
- package/dist/jsx/layouts/page.mjs.map +1 -1
- package/dist/jsx/layouts/page.native.js +2 -1
- package/dist/jsx/layouts/page.native.js.map +1 -1
- package/dist/jsx/layouts/sidebar.mjs +2 -4
- package/dist/jsx/layouts/sidebar.mjs.map +1 -1
- package/dist/jsx/layouts/sidebar.native.js +1 -3
- package/dist/jsx/layouts/sidebar.native.js.map +1 -1
- package/dist/jsx/layouts/timeline.mjs +11 -3
- package/dist/jsx/layouts/timeline.mjs.map +1 -1
- package/dist/jsx/layouts/timeline.native.js +9 -1
- package/dist/jsx/layouts/timeline.native.js.map +1 -1
- package/dist/jsx/surfaces.mjs +1 -33
- package/dist/jsx/surfaces.mjs.map +1 -1
- package/dist/jsx/surfaces.native.js +0 -32
- package/dist/jsx/surfaces.native.js.map +1 -1
- package/dist/jsx/tamagui.mjs +2 -1
- package/dist/jsx/tamagui.mjs.map +1 -1
- package/dist/jsx/tamagui.native.js +2 -1
- package/dist/jsx/tamagui.native.js.map +1 -1
- package/dist/jsx/views/Kanban.mjs +1 -0
- package/dist/jsx/views/Kanban.mjs.map +1 -1
- package/dist/jsx/views/Kanban.native.js +3 -1
- package/dist/jsx/views/Kanban.native.js.map +1 -1
- package/dist/jsx/views/List.mjs +5 -5
- package/dist/jsx/views/List.mjs.map +1 -1
- package/dist/jsx/views/List.native.js +7 -7
- package/dist/jsx/views/List.native.js.map +1 -1
- package/dist/jsx/views/Matrix.mjs +543 -0
- package/dist/jsx/views/Matrix.mjs.map +1 -0
- package/dist/jsx/views/Matrix.native.js +612 -0
- package/dist/jsx/views/Matrix.native.js.map +1 -0
- package/dist/jsx/views/ganttMath.mjs +1 -1
- package/dist/jsx/views/ganttMath.mjs.map +1 -1
- package/dist/jsx/views/ganttMath.native.js +2 -0
- package/dist/jsx/views/ganttMath.native.js.map +1 -1
- package/dist/jsx/views/index.mjs +4 -2
- package/dist/jsx/views/index.mjs.map +1 -1
- package/dist/jsx/views/index.native.js +16 -0
- package/dist/jsx/views/index.native.js.map +1 -1
- package/dist/jsx/views/matrixMath.mjs +122 -0
- package/dist/jsx/views/matrixMath.mjs.map +1 -0
- package/dist/jsx/views/matrixMath.native.js +229 -0
- package/dist/jsx/views/matrixMath.native.js.map +1 -0
- package/package.json +10 -10
- package/src/Accordion/Accordion.spec.tsx +20 -0
- package/src/Accordion/index.tsx +7 -3
- package/src/AnimateHeight/index.tsx +143 -142
- package/src/Carousel/index.tsx +2 -1
- package/src/Chip/Chip.borderLadder.spec.tsx +54 -0
- package/src/Chip/Chip.pressSlop.spec.tsx +57 -0
- package/src/Chip/Chip.spec.tsx +21 -16
- package/src/Chip/index.tsx +25 -3
- package/src/Heading.native.spec.tsx +1 -1
- package/src/ScrollView/ScrollView.native.spec.tsx +157 -0
- package/src/ScrollView/index.native.tsx +45 -0
- package/src/ScrollView/index.tsx +2 -0
- package/src/Separator/index.tsx +3 -3
- package/src/SheetModal/SheetModal.detentLayout.spec.tsx +173 -0
- package/src/SheetModal/SheetModal.touch.spec.tsx +63 -0
- package/src/SheetModal/index.native.tsx +95 -17
- package/src/Skeleton/Skeleton.spec.tsx +3 -3
- package/src/Skeleton/index.tsx +2 -15
- package/src/Tabs/Tabs.hydration.spec.tsx +123 -0
- package/src/Tabs/index.tsx +4 -3
- package/src/Text.spec.tsx +32 -2
- package/src/Text.tsx +7 -6
- package/src/Toast/Toast.spec.tsx +50 -0
- package/src/Tooltip/Tooltip.spec.tsx +55 -2
- package/src/TreeSelect/TreeSelect.spec.tsx +15 -15
- package/src/TreeSelect/index.tsx +53 -50
- package/src/Video/PlayerChrome.tsx +4 -3
- package/src/Wheel/Wheel.spec.tsx +4 -4
- package/src/adjacency.l1.spec.tsx +175 -0
- package/src/charts/charts.spec.tsx +49 -6
- package/src/charts/math.spec.ts +30 -0
- package/src/charts/math.ts +36 -0
- package/src/charts/series.tsx +14 -9
- package/src/charts/svg.ts +13 -0
- package/src/charts/useChartTheme.ts +14 -15
- package/src/code/Code/code.spec.tsx +2 -19
- package/src/code/Code/index.tsx +0 -6
- package/src/code/CodeBlock/index.tsx +5 -3
- package/src/code/highlightedCode.spec.tsx +2 -2
- package/src/code/hostProps.spec.tsx +55 -0
- package/src/icons/themed.hydration.spec.tsx +60 -0
- package/src/icons/themed.tsx +3 -6
- package/src/knobImmuneExports.ts +3 -3
- package/src/layouts/PaneScaffold.spec.tsx +148 -2
- package/src/layouts/PaneScaffold.stories.tsx +33 -1
- package/src/layouts/PaneScaffold.tsx +101 -48
- package/src/layouts/attachments.radius.spec.tsx +74 -0
- package/src/layouts/attachments.tsx +3 -1
- package/src/layouts/page.designLaw.spec.tsx +20 -0
- package/src/layouts/page.tsx +2 -0
- package/src/layouts/sidebar.tsx +2 -3
- package/src/layouts/timeline-radius.spec.tsx +38 -0
- package/src/layouts/timeline.tsx +16 -1
- package/src/overlayElevation.spec.tsx +39 -51
- package/src/surfaces.spec.tsx +13 -10
- package/src/surfaces.tsx +4 -33
- package/src/tamagui.spec.ts +4 -3
- package/src/tamagui.ts +4 -1
- package/src/textAccentSecondary.spec.tsx +100 -2
- package/src/views/Kanban.native.tsx +3 -1
- package/src/views/Kanban.spec.tsx +15 -0
- package/src/views/Kanban.tsx +1 -0
- package/src/views/List.spec.tsx +50 -0
- package/src/views/List.tsx +13 -5
- package/src/views/Matrix.spec.tsx +339 -0
- package/src/views/Matrix.stories.spec.tsx +68 -0
- package/src/views/Matrix.stories.tsx +153 -0
- package/src/views/Matrix.tsx +738 -0
- package/src/views/ganttMath.ts +4 -2
- package/src/views/index.ts +30 -0
- package/src/views/matrixMath.spec.ts +237 -0
- package/src/views/matrixMath.ts +251 -0
- package/src/views/views.spec.tsx +3 -1
- package/types/Accordion/index.d.ts.map +1 -1
- package/types/AnimateHeight/index.d.ts.map +1 -1
- package/types/Carousel/index.d.ts.map +1 -1
- package/types/Chip/index.d.ts.map +1 -1
- package/types/ScrollView/index.d.ts +3 -0
- package/types/ScrollView/index.d.ts.map +1 -0
- package/types/ScrollView/index.native.d.ts +4 -0
- package/types/ScrollView/index.native.d.ts.map +1 -0
- package/types/Separator/index.d.ts +3 -3
- package/types/SheetModal/index.native.d.ts.map +1 -1
- package/types/Skeleton/index.d.ts.map +1 -1
- package/types/Tabs/index.d.ts.map +1 -1
- package/types/Text.d.ts.map +1 -1
- package/types/TreeSelect/index.d.ts.map +1 -1
- package/types/Video/PlayerChrome.d.ts.map +1 -1
- package/types/charts/math.d.ts +18 -0
- package/types/charts/math.d.ts.map +1 -1
- package/types/charts/series.d.ts +2 -1
- package/types/charts/series.d.ts.map +1 -1
- package/types/charts/svg.d.ts +8 -0
- package/types/charts/svg.d.ts.map +1 -1
- package/types/charts/useChartTheme.d.ts +4 -3
- package/types/charts/useChartTheme.d.ts.map +1 -1
- package/types/code/Code/index.d.ts.map +1 -1
- package/types/code/CodeBlock/index.d.ts.map +1 -1
- package/types/icons/themed.d.ts.map +1 -1
- package/types/layouts/PaneScaffold.d.ts +14 -1
- package/types/layouts/PaneScaffold.d.ts.map +1 -1
- package/types/layouts/attachments.d.ts.map +1 -1
- package/types/layouts/page.d.ts.map +1 -1
- package/types/layouts/sidebar.d.ts.map +1 -1
- package/types/layouts/timeline.d.ts.map +1 -1
- package/types/surfaces.d.ts.map +1 -1
- package/types/tamagui.d.ts +2 -1
- package/types/tamagui.d.ts.map +1 -1
- package/types/views/Kanban.native.d.ts.map +1 -1
- package/types/views/List.d.ts.map +1 -1
- package/types/views/Matrix.d.ts +102 -0
- package/types/views/Matrix.d.ts.map +1 -0
- package/types/views/ganttMath.d.ts +4 -0
- package/types/views/ganttMath.d.ts.map +1 -1
- package/types/views/index.d.ts +3 -1
- package/types/views/index.d.ts.map +1 -1
- package/types/views/matrixMath.d.ts +114 -0
- package/types/views/matrixMath.d.ts.map +1 -0
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
* height with a large-detent cap. LC-71: the frame is not a control.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
useCallback,
|
|
15
|
+
useContext,
|
|
16
|
+
useEffect,
|
|
17
|
+
useLayoutEffect,
|
|
18
|
+
useMemo,
|
|
19
|
+
useRef,
|
|
20
|
+
useState,
|
|
21
|
+
} from "react";
|
|
14
22
|
import {
|
|
15
23
|
Animated,
|
|
16
24
|
Easing,
|
|
@@ -23,6 +31,7 @@ import {
|
|
|
23
31
|
View as RNView,
|
|
24
32
|
useWindowDimensions,
|
|
25
33
|
} from "react-native";
|
|
34
|
+
import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
|
|
26
35
|
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
27
36
|
import { minSheetHeight, resolveSheetDetents } from "./detents";
|
|
28
37
|
import { useTranslation } from "../shared/i18n";
|
|
@@ -62,6 +71,7 @@ export function SheetModal({
|
|
|
62
71
|
const { knobProps } = useResolvedKnobs();
|
|
63
72
|
const { height: windowHeight } = useWindowDimensions();
|
|
64
73
|
const keyboardInset = useKeyboardInset();
|
|
74
|
+
const topInset = useContext(SafeAreaInsetsContext)?.top ?? initialWindowMetrics?.insets.top ?? 0;
|
|
65
75
|
const [backdropArmed, setBackdropArmed] = useState(false);
|
|
66
76
|
const armTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
67
77
|
|
|
@@ -71,11 +81,12 @@ export function SheetModal({
|
|
|
71
81
|
if (backdropArmed) close();
|
|
72
82
|
}, [backdropArmed, close]);
|
|
73
83
|
|
|
74
|
-
// MPO-64: the sheet ends above the keyboard rather than running under it
|
|
84
|
+
// MPO-64: the sheet ends above the keyboard rather than running under it,
|
|
85
|
+
// and below the status bar with a strip of backdrop still showing.
|
|
75
86
|
const available = Math.max(0, windowHeight - keyboardInset);
|
|
76
87
|
const maxHeight = Math.max(
|
|
77
88
|
minSheetHeight,
|
|
78
|
-
Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - backdropStrip)),
|
|
89
|
+
Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - topInset - backdropStrip)),
|
|
79
90
|
);
|
|
80
91
|
|
|
81
92
|
/*
|
|
@@ -127,8 +138,59 @@ export function SheetModal({
|
|
|
127
138
|
const presentationRef = useRef(0);
|
|
128
139
|
const activeRef = useRef(false);
|
|
129
140
|
|
|
141
|
+
/*
|
|
142
|
+
* MPO-68 / MPO-299: a sheet at rest below full height is LAID OUT at that
|
|
143
|
+
* height. Translating a full-height frame down pushed its bottom off the
|
|
144
|
+
* screen, or under the keyboard, and the scroll owner inside still measured
|
|
145
|
+
* the full height, so the tail could never be scrolled into view.
|
|
146
|
+
*
|
|
147
|
+
* `frameCap` rides the same Animated.View as `translateY`, so the swap
|
|
148
|
+
* between "full height, translated" and "detent height, at 0" lands in one
|
|
149
|
+
* commit and the top edge does not move. `restHeightRef` is null at full
|
|
150
|
+
* height; a gesture always runs uncapped, in `travel` coordinates.
|
|
151
|
+
*/
|
|
152
|
+
const frameCap = useRef(new Animated.Value(maxHeight)).current;
|
|
153
|
+
const maxHeightRef = useRef(maxHeight);
|
|
154
|
+
const restHeightRef = useRef<number | null>(null);
|
|
155
|
+
// The last uncapped layout, and whether it filled the max height. A capped
|
|
156
|
+
// frame measures only its cap, so when the keyboard moves the max height
|
|
157
|
+
// under a resting sheet, its full height is re-derived from these.
|
|
158
|
+
const naturalRef = useRef(0);
|
|
159
|
+
const filledRef = useRef(false);
|
|
160
|
+
|
|
161
|
+
useLayoutEffect(() => {
|
|
162
|
+
maxHeightRef.current = maxHeight;
|
|
163
|
+
const rest = restHeightRef.current;
|
|
164
|
+
frameCap.setValue(rest === null ? maxHeight : Math.min(maxHeight, rest));
|
|
165
|
+
if (rest !== null && naturalRef.current > 0) {
|
|
166
|
+
setMeasuredHeight(filledRef.current ? maxHeight : Math.min(naturalRef.current, maxHeight));
|
|
167
|
+
}
|
|
168
|
+
}, [frameCap, maxHeight]);
|
|
169
|
+
|
|
170
|
+
const restAt = useCallback(
|
|
171
|
+
(height: number) => {
|
|
172
|
+
restHeightRef.current = height;
|
|
173
|
+
frameCap.setValue(Math.min(maxHeightRef.current, height));
|
|
174
|
+
restRef.current = 0;
|
|
175
|
+
translateY.setValue(0);
|
|
176
|
+
},
|
|
177
|
+
[frameCap, translateY],
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const releaseRest = useCallback(() => {
|
|
181
|
+
const rest = restHeightRef.current;
|
|
182
|
+
if (rest === null) return;
|
|
183
|
+
restHeightRef.current = null;
|
|
184
|
+
const offset = Math.max(0, travelRef.current - Math.min(maxHeightRef.current, rest));
|
|
185
|
+
frameCap.setValue(maxHeightRef.current);
|
|
186
|
+
restRef.current = offset;
|
|
187
|
+
translateY.setValue(offset);
|
|
188
|
+
}, [frameCap, translateY]);
|
|
189
|
+
|
|
130
190
|
const settleTo = useCallback(
|
|
131
|
-
(
|
|
191
|
+
(height: number, velocity = 0) => {
|
|
192
|
+
const presentation = presentationRef.current;
|
|
193
|
+
const toValue = Math.max(0, travelRef.current - height);
|
|
132
194
|
restRef.current = toValue;
|
|
133
195
|
Animated.spring(translateY, {
|
|
134
196
|
toValue,
|
|
@@ -141,9 +203,12 @@ export function SheetModal({
|
|
|
141
203
|
// Modal does not advance on the New Architecture, and the drag path
|
|
142
204
|
// already writes this value from JS.
|
|
143
205
|
useNativeDriver: false,
|
|
144
|
-
}).start()
|
|
206
|
+
}).start(({ finished }) => {
|
|
207
|
+
if (!finished || toValue === 0) return;
|
|
208
|
+
if (activeRef.current && presentation === presentationRef.current) restAt(height);
|
|
209
|
+
});
|
|
145
210
|
},
|
|
146
|
-
[translateY],
|
|
211
|
+
[restAt, translateY],
|
|
147
212
|
);
|
|
148
213
|
|
|
149
214
|
const dismiss = useCallback(
|
|
@@ -171,10 +236,15 @@ export function SheetModal({
|
|
|
171
236
|
PanResponder.create({
|
|
172
237
|
onStartShouldSetPanResponder: () => true,
|
|
173
238
|
onMoveShouldSetPanResponder: (_evt, g) => Math.abs(g.dy) > 2,
|
|
239
|
+
// Lifting a rest cap can scroll the list inside, and a scroll lets
|
|
240
|
+
// any ancestor ScrollView the finger started under claim the touch,
|
|
241
|
+
// ending the drag and blurring a focused input on release.
|
|
242
|
+
onPanResponderTerminationRequest: () => false,
|
|
174
243
|
onPanResponderGrant: () => {
|
|
175
244
|
translateY.stopAnimation((value) => {
|
|
176
245
|
if (typeof value === "number" && Number.isFinite(value)) restRef.current = value;
|
|
177
246
|
});
|
|
247
|
+
releaseRest();
|
|
178
248
|
},
|
|
179
249
|
onPanResponderMove: (_evt, g) => {
|
|
180
250
|
const next = restRef.current + g.dy;
|
|
@@ -199,11 +269,11 @@ export function SheetModal({
|
|
|
199
269
|
best = height;
|
|
200
270
|
}
|
|
201
271
|
}
|
|
202
|
-
settleTo(
|
|
272
|
+
settleTo(best, g.vy);
|
|
203
273
|
},
|
|
204
|
-
onPanResponderTerminate: () => settleTo(restRef.current),
|
|
274
|
+
onPanResponderTerminate: () => settleTo(travelRef.current - restRef.current),
|
|
205
275
|
}),
|
|
206
|
-
[dismiss, settleTo, translateY],
|
|
276
|
+
[dismiss, releaseRest, settleTo, translateY],
|
|
207
277
|
);
|
|
208
278
|
|
|
209
279
|
/*
|
|
@@ -246,6 +316,8 @@ export function SheetModal({
|
|
|
246
316
|
useEffect(() => {
|
|
247
317
|
presentationRef.current += 1;
|
|
248
318
|
activeRef.current = open;
|
|
319
|
+
restHeightRef.current = null;
|
|
320
|
+
frameCap.setValue(maxHeightRef.current);
|
|
249
321
|
if (open) {
|
|
250
322
|
enter();
|
|
251
323
|
} else {
|
|
@@ -265,7 +337,7 @@ export function SheetModal({
|
|
|
265
337
|
}
|
|
266
338
|
translateY.stopAnimation();
|
|
267
339
|
};
|
|
268
|
-
}, [open, enter, translateY]);
|
|
340
|
+
}, [open, enter, frameCap, translateY]);
|
|
269
341
|
|
|
270
342
|
return (
|
|
271
343
|
<Modal
|
|
@@ -287,8 +359,12 @@ export function SheetModal({
|
|
|
287
359
|
</Pressable>
|
|
288
360
|
<Animated.View
|
|
289
361
|
onLayout={(e) => {
|
|
362
|
+
if (restHeightRef.current !== null) return;
|
|
290
363
|
const h = Math.round(e.nativeEvent.layout.height);
|
|
291
|
-
if (h
|
|
364
|
+
if (h <= 0) return;
|
|
365
|
+
naturalRef.current = h;
|
|
366
|
+
filledRef.current = h >= maxHeightRef.current - 1;
|
|
367
|
+
if (h !== measuredHeight) setMeasuredHeight(h);
|
|
292
368
|
}}
|
|
293
369
|
testID="sheet-modal-frame"
|
|
294
370
|
style={{
|
|
@@ -296,10 +372,10 @@ export function SheetModal({
|
|
|
296
372
|
// the sheet cannot give way to the keyboard.
|
|
297
373
|
flexShrink: 1,
|
|
298
374
|
minHeight: 0,
|
|
299
|
-
maxHeight,
|
|
375
|
+
maxHeight: frameCap,
|
|
300
376
|
// The cap is already keyboard- and window-aware; fill only asks
|
|
301
377
|
// for it as a definite height rather than an upper bound.
|
|
302
|
-
...(fill ? { height:
|
|
378
|
+
...(fill ? { height: frameCap } : null),
|
|
303
379
|
transform: [{ translateY }],
|
|
304
380
|
}}
|
|
305
381
|
>
|
|
@@ -311,13 +387,15 @@ export function SheetModal({
|
|
|
311
387
|
borderBottomRightRadius={0}
|
|
312
388
|
elevation={knobProps.elevation}
|
|
313
389
|
maxHeight={maxHeight}
|
|
314
|
-
{
|
|
390
|
+
flexShrink={1}
|
|
391
|
+
minHeight={0}
|
|
392
|
+
{...(fill ? fillSlot : null)}
|
|
315
393
|
paddingTop="$2"
|
|
316
394
|
paddingBottom={keyboardInset > 0 ? 8 : bottomInset}
|
|
317
395
|
overflow="hidden"
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
396
|
+
// No focus or press pseudo on this surface: on native tamagui
|
|
397
|
+
// turns one into a touch-responder claim, and a responder here
|
|
398
|
+
// takes every drag from the ScrollView inside (MPO-299).
|
|
321
399
|
accessibilityViewIsModal
|
|
322
400
|
onAccessibilityEscape={close}
|
|
323
401
|
>
|
|
@@ -108,14 +108,14 @@ describe("Skeleton — LC-20 / LC-61 announcer and motion", () => {
|
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
describe("Skeleton — radius classes (LC-20 / LC-60)", () => {
|
|
111
|
-
it("text bones
|
|
111
|
+
it("text bones ride DEFAULT: square at radius:none, the token at full (MPO-56)", () => {
|
|
112
112
|
const none = renderWithProviders(
|
|
113
113
|
<Preset overrides={{ borderRadius: "none" }}>
|
|
114
114
|
<Skeleton variant="text" width={120} />
|
|
115
115
|
</Preset>,
|
|
116
116
|
);
|
|
117
117
|
expect(radiusClasses(none.container.querySelector("[data-skeleton]") as Element)).toEqual([
|
|
118
|
-
"_btlr-
|
|
118
|
+
"_btlr-t-radius-0",
|
|
119
119
|
]);
|
|
120
120
|
cleanup();
|
|
121
121
|
|
|
@@ -125,7 +125,7 @@ describe("Skeleton — radius classes (LC-20 / LC-60)", () => {
|
|
|
125
125
|
</Preset>,
|
|
126
126
|
);
|
|
127
127
|
expect(radiusClasses(full.container.querySelector("[data-skeleton]") as Element)).toEqual([
|
|
128
|
-
"_btlr-t-radius-
|
|
128
|
+
"_btlr-t-radius-12",
|
|
129
129
|
]);
|
|
130
130
|
});
|
|
131
131
|
|
package/src/Skeleton/index.tsx
CHANGED
|
@@ -4,16 +4,6 @@ import { radiusClassProps, sizeRecipeForToken, useResolvedKnobs } from "@multipl
|
|
|
4
4
|
import type { GetProps } from "tamagui";
|
|
5
5
|
import { View, styled, isWeb } from "tamagui";
|
|
6
6
|
|
|
7
|
-
function clampTextRadius(radiusToken: string | undefined) {
|
|
8
|
-
if (!radiusToken) return "$2";
|
|
9
|
-
if (radiusToken === "$0") return 0;
|
|
10
|
-
if (radiusToken.startsWith("$")) {
|
|
11
|
-
const num = Number.parseInt(radiusToken.slice(1), 10);
|
|
12
|
-
return Number.isFinite(num) && num > 2 ? "$2" : radiusToken;
|
|
13
|
-
}
|
|
14
|
-
return radiusToken;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
7
|
export type SkeletonVariant = "text" | "circular" | "rectangular" | "rounded";
|
|
18
8
|
export type SkeletonTextSize = "body" | "display";
|
|
19
9
|
|
|
@@ -106,7 +96,7 @@ export function Skeleton({
|
|
|
106
96
|
if (isWeb) ensureShimmerStyles();
|
|
107
97
|
|
|
108
98
|
const decorative = props["aria-hidden"] === true || !shouldAnnounce;
|
|
109
|
-
// Corner-smoothing is an R-SCALE
|
|
99
|
+
// Corner-smoothing is an R-SCALE arc. Circular is R-PILL (a
|
|
110
100
|
// squircle would break 1:1); rectangular is square by variant.
|
|
111
101
|
const smoothingClass =
|
|
112
102
|
variant === "text" || variant === "rounded" ? knobProps.borderRadius.className : undefined;
|
|
@@ -119,15 +109,12 @@ export function Skeleton({
|
|
|
119
109
|
.filter(Boolean)
|
|
120
110
|
.join(" ");
|
|
121
111
|
|
|
122
|
-
const textRadius = knobProps.pointy ? 0 : clampTextRadius(knobProps.borderRadius.borderRadius);
|
|
123
112
|
const radiusProps =
|
|
124
113
|
variant === "circular"
|
|
125
114
|
? { borderRadius: 1000, ...radiusClassProps("R-PILL", "SkeletonCircle") }
|
|
126
115
|
: variant === "rectangular"
|
|
127
116
|
? { borderRadius: 0 }
|
|
128
|
-
:
|
|
129
|
-
? { borderRadius: knobProps.borderRadius.borderRadius }
|
|
130
|
-
: { borderRadius: textRadius };
|
|
117
|
+
: { borderRadius: knobProps.borderRadius.borderRadius };
|
|
131
118
|
|
|
132
119
|
return (
|
|
133
120
|
<SkeletonFrame
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
/**
|
|
3
|
+
* MPO-279: on touch mobile web the server cannot know the device, so it renders
|
|
4
|
+
* pointer-sized tabs. Hydration has to reproduce that markup, then adopt the
|
|
5
|
+
* touch floor; a first client render at touch size is an attribute mismatch
|
|
6
|
+
* React never patches.
|
|
7
|
+
*/
|
|
8
|
+
import { TestProviders } from "@multiplatform.one/test-utils";
|
|
9
|
+
import { act } from "react";
|
|
10
|
+
import { hydrateRoot, type Root } from "react-dom/client";
|
|
11
|
+
import { renderToString } from "react-dom/server";
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
13
|
+
import { Tabs } from "./index";
|
|
14
|
+
|
|
15
|
+
const host = vi.hoisted(() => {
|
|
16
|
+
vi.stubGlobal("matchMedia", () => ({
|
|
17
|
+
matches: false,
|
|
18
|
+
addEventListener() {},
|
|
19
|
+
removeEventListener() {},
|
|
20
|
+
addListener() {},
|
|
21
|
+
removeListener() {},
|
|
22
|
+
}));
|
|
23
|
+
return { web: true, touch: false };
|
|
24
|
+
});
|
|
25
|
+
vi.mock("@multiplatform.one/platform", async (importOriginal) => ({
|
|
26
|
+
...(await importOriginal<typeof import("@multiplatform.one/platform")>()),
|
|
27
|
+
get isWeb() {
|
|
28
|
+
return host.web;
|
|
29
|
+
},
|
|
30
|
+
get isTouchable() {
|
|
31
|
+
return !host.web && host.touch;
|
|
32
|
+
},
|
|
33
|
+
get isWebTouchable() {
|
|
34
|
+
return host.web && host.touch;
|
|
35
|
+
},
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
const items = [
|
|
39
|
+
{ value: "address", label: "Address & Contact", content: <>address panel</> },
|
|
40
|
+
{ value: "settings", label: "Settings", content: <>settings panel</> },
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
function Fixture() {
|
|
44
|
+
return (
|
|
45
|
+
<TestProviders>
|
|
46
|
+
<Tabs items={items} defaultValue="address" />
|
|
47
|
+
</TestProviders>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Every `_h-` height atom painted inside each tab, in document order. */
|
|
52
|
+
function tabHeights(root: ParentNode): string[][] {
|
|
53
|
+
return [...root.querySelectorAll('[role="tab"]')].map((tab) =>
|
|
54
|
+
[tab, ...tab.querySelectorAll("*")].flatMap((node) =>
|
|
55
|
+
[...node.classList].filter((name) => /^_h-\d/.test(name)),
|
|
56
|
+
),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let container: HTMLDivElement;
|
|
61
|
+
let root: Root | undefined;
|
|
62
|
+
let errors: unknown[];
|
|
63
|
+
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
host.web = true;
|
|
66
|
+
host.touch = false;
|
|
67
|
+
errors = [];
|
|
68
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
69
|
+
vi.spyOn(console, "error").mockImplementation((...args) => errors.push(args));
|
|
70
|
+
container = document.createElement("div");
|
|
71
|
+
document.body.append(container);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
afterEach(async () => {
|
|
75
|
+
if (root) await act(async () => root?.unmount());
|
|
76
|
+
root = undefined;
|
|
77
|
+
container.remove();
|
|
78
|
+
vi.restoreAllMocks();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
async function hydrate() {
|
|
82
|
+
await act(async () => {
|
|
83
|
+
root = hydrateRoot(container, <Fixture />, {
|
|
84
|
+
onRecoverableError: (error) => errors.push(error),
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const hydrationErrors = () =>
|
|
90
|
+
errors.filter((error) => /hydration|hydrated|didn't match/i.test(String(error)));
|
|
91
|
+
|
|
92
|
+
describe("Tabs sizing through hydration (MPO-279)", () => {
|
|
93
|
+
it("keeps the server's pointer-sized tabs through hydration, then adopts the touch floor", async () => {
|
|
94
|
+
container.innerHTML = renderToString(<Fixture />);
|
|
95
|
+
const serverTabs = [...container.querySelectorAll('[role="tab"]')];
|
|
96
|
+
const serverHeights = tabHeights(container);
|
|
97
|
+
expect(serverHeights.flat()).not.toHaveLength(0);
|
|
98
|
+
|
|
99
|
+
host.touch = true;
|
|
100
|
+
await hydrate();
|
|
101
|
+
|
|
102
|
+
expect(hydrationErrors()).toEqual([]);
|
|
103
|
+
expect([...container.querySelectorAll('[role="tab"]')]).toEqual(serverTabs);
|
|
104
|
+
const clientHeights = tabHeights(container);
|
|
105
|
+
expect(clientHeights).not.toEqual(serverHeights);
|
|
106
|
+
for (const heights of clientHeights) expect(heights).toContain("_h-48px");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("leaves pointer sizing alone on a pointer device", async () => {
|
|
110
|
+
container.innerHTML = renderToString(<Fixture />);
|
|
111
|
+
const serverHeights = tabHeights(container);
|
|
112
|
+
await hydrate();
|
|
113
|
+
expect(hydrationErrors()).toEqual([]);
|
|
114
|
+
expect(tabHeights(container)).toEqual(serverHeights);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("sizes native tabs to the touch floor on the first render", () => {
|
|
118
|
+
host.web = false;
|
|
119
|
+
host.touch = true;
|
|
120
|
+
container.innerHTML = renderToString(<Fixture />);
|
|
121
|
+
for (const heights of tabHeights(container)) expect(heights).toContain("_h-48px");
|
|
122
|
+
});
|
|
123
|
+
});
|
package/src/Tabs/index.tsx
CHANGED
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
useResolvedKnobs,
|
|
38
38
|
wasKeyboardFocus,
|
|
39
39
|
type GroupPosition,
|
|
40
|
+
transitionProps,
|
|
40
41
|
} from "@multiplatform.one/theme";
|
|
41
42
|
import type { ReactNode } from "react";
|
|
42
43
|
import React from "react";
|
|
@@ -45,7 +46,6 @@ import { useTranslation } from "../shared/i18n";
|
|
|
45
46
|
import { wrapBareTextChildren } from "../shared/textRidesText";
|
|
46
47
|
import type { GetProps, ThemeName } from "tamagui";
|
|
47
48
|
import {
|
|
48
|
-
ScrollView,
|
|
49
49
|
Tabs as TamaguiTabs,
|
|
50
50
|
Text,
|
|
51
51
|
Theme,
|
|
@@ -56,6 +56,7 @@ import {
|
|
|
56
56
|
withStaticProperties,
|
|
57
57
|
} from "tamagui";
|
|
58
58
|
import { componentColors } from "../componentColors";
|
|
59
|
+
import { ScrollView } from "../ScrollView";
|
|
59
60
|
|
|
60
61
|
// ── Types ─────────────────────────────────────────────────────
|
|
61
62
|
|
|
@@ -492,7 +493,7 @@ function TabsRoot({
|
|
|
492
493
|
x={activeLayout.x}
|
|
493
494
|
width={activeLayout.width}
|
|
494
495
|
data-tabs-indicator="underline"
|
|
495
|
-
{...(transition
|
|
496
|
+
{...transitionProps(transition)}
|
|
496
497
|
/>
|
|
497
498
|
</Theme>
|
|
498
499
|
) : (
|
|
@@ -508,7 +509,7 @@ function TabsRoot({
|
|
|
508
509
|
{...(knobProps.elevation !== undefined
|
|
509
510
|
? { elevation: knobProps.elevation }
|
|
510
511
|
: undefined)}
|
|
511
|
-
{...(transition
|
|
512
|
+
{...transitionProps(transition)}
|
|
512
513
|
/>
|
|
513
514
|
</Theme>
|
|
514
515
|
)
|
package/src/Text.spec.tsx
CHANGED
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { cleanup, screen } from "@testing-library/react";
|
|
23
23
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
24
|
-
import { Preset } from "@multiplatform.one/theme";
|
|
24
|
+
import { Preset, useAccentOnSurface } from "@multiplatform.one/theme";
|
|
25
25
|
import { XStack } from "tamagui";
|
|
26
26
|
import { afterEach, describe, expect, it } from "vitest";
|
|
27
|
-
import { Text } from "./Text";
|
|
27
|
+
import { Anchor, Text } from "./Text";
|
|
28
28
|
|
|
29
29
|
afterEach(cleanup);
|
|
30
30
|
|
|
@@ -181,6 +181,36 @@ describe("house Text — fontWeight and bodyFont reach the text node", () => {
|
|
|
181
181
|
});
|
|
182
182
|
});
|
|
183
183
|
|
|
184
|
+
describe("house Anchor — link chrome is house Text's, in the accent (MPO-21 G11-A)", () => {
|
|
185
|
+
function AccentProbe({ onInk }: { onInk: (ink: string) => void }) {
|
|
186
|
+
onInk(useAccentOnSurface());
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
it("paints the AA-safe accent ink, not tamagui's link colour", () => {
|
|
191
|
+
let ink = "";
|
|
192
|
+
const anchor = renderTextClasses(
|
|
193
|
+
<>
|
|
194
|
+
<AccentProbe onInk={(value) => (ink = value)} />
|
|
195
|
+
<Anchor href="#">{LABEL}</Anchor>
|
|
196
|
+
</>,
|
|
197
|
+
["_col-"],
|
|
198
|
+
);
|
|
199
|
+
expect(ink).not.toBe("");
|
|
200
|
+
const accented = renderTextClasses(<Anchor color={ink as never}>{LABEL}</Anchor>, ["_col-"]);
|
|
201
|
+
const body = renderTextClasses(<Text>{LABEL}</Text>, ["_col-"]);
|
|
202
|
+
expect(anchor).not.toHaveLength(0);
|
|
203
|
+
expect(anchor).toEqual(accented);
|
|
204
|
+
expect(anchor).not.toEqual(body);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("a consumer colour still ejects (STD-EJECT-LAST)", () => {
|
|
208
|
+
const ejected = renderTextClasses(<Anchor color="$color9">{LABEL}</Anchor>, ["_col-"]);
|
|
209
|
+
const explicit = renderTextClasses(<Text color="$color9">{LABEL}</Text>, ["_col-"]);
|
|
210
|
+
expect(ejected).toEqual(explicit);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
184
214
|
// The NATIVE arm lives in ./Text.native.spec.tsx. It used to sit here as a
|
|
185
215
|
// `vi.resetModules()` + dynamic-import block, but that returned a SPLIT module
|
|
186
216
|
// graph — a fresh `renderWithProviders` over a stale `useResolvedKnobs` — and
|
package/src/Text.tsx
CHANGED
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
* 500/600 are not label weights; see tamagui-rendered-reference.md §9)
|
|
25
25
|
* - textAccent → knobProps.textAccentColor (high $color / medium+low
|
|
26
26
|
* $color11, the AA legibility floor) on Text/SizableText/Paragraph.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* - link ink → Anchor paints the accent, as the most chromatic step of the
|
|
28
|
+
* theme's accent ramp that still clears AA on both page surfaces
|
|
29
|
+
* (`useAccentOnSurface`). House Text owns link chrome (Clay 2026-09-26,
|
|
30
|
+
* MPO-21 G11-A); a consumer `color` still ejects.
|
|
31
31
|
*
|
|
32
32
|
* Default body/label ramp (tamagui-rendered-reference.md §9, the $4 / $true
|
|
33
33
|
* stop): 14px / 25px / 400. createInterFont's size+10 table yields 14/24;
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
* Raw primitives stay reachable as TamaguiText / TamaguiSizableText /
|
|
39
39
|
* TamaguiParagraph / TamaguiAnchor (./tamagui.ts escape hatches, LC-45).
|
|
40
40
|
*/
|
|
41
|
-
import { useResolvedKnobs } from "@multiplatform.one/theme";
|
|
41
|
+
import { useAccentOnSurface, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
42
42
|
import {
|
|
43
43
|
Anchor as RawAnchor,
|
|
44
44
|
type AnchorProps,
|
|
@@ -81,5 +81,6 @@ export function Paragraph(props: ParagraphProps) {
|
|
|
81
81
|
|
|
82
82
|
export function Anchor(props: AnchorProps) {
|
|
83
83
|
const { knobProps } = useResolvedKnobs();
|
|
84
|
-
|
|
84
|
+
const linkInk = useAccentOnSurface();
|
|
85
|
+
return <RawAnchor {...knobProps.body} color={linkInk} {...props} />;
|
|
85
86
|
}
|
package/src/Toast/Toast.spec.tsx
CHANGED
|
@@ -735,6 +735,56 @@ describe("Toast data attributes reach the DOM", () => {
|
|
|
735
735
|
});
|
|
736
736
|
});
|
|
737
737
|
|
|
738
|
+
describe("Toast density moves padX and gap on the host (MPO-42)", () => {
|
|
739
|
+
afterEach(cleanup);
|
|
740
|
+
|
|
741
|
+
const padX = ["_px-", "_pl-", "_pr-"];
|
|
742
|
+
const gap = ["_gap-"];
|
|
743
|
+
|
|
744
|
+
function hostAtoms(node: ReactElement) {
|
|
745
|
+
renderWithProviders(node);
|
|
746
|
+
const host = screen.getByTestId("toast");
|
|
747
|
+
const measured = {
|
|
748
|
+
density: host.getAttribute("data-density"),
|
|
749
|
+
padX: classesByPrefix(host, padX),
|
|
750
|
+
gap: classesByPrefix(host, gap),
|
|
751
|
+
};
|
|
752
|
+
cleanup();
|
|
753
|
+
return measured;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
it("the density knob changes padX and gap between the two stops", () => {
|
|
757
|
+
const comfortable = hostAtoms(
|
|
758
|
+
<Preset overrides={{ density: "comfortable" }}>
|
|
759
|
+
<Toast title="Saved" onDismiss={() => {}} />
|
|
760
|
+
</Preset>,
|
|
761
|
+
);
|
|
762
|
+
const compact = hostAtoms(
|
|
763
|
+
<Preset overrides={{ density: "compact" }}>
|
|
764
|
+
<Toast title="Saved" onDismiss={() => {}} />
|
|
765
|
+
</Preset>,
|
|
766
|
+
);
|
|
767
|
+
expect(comfortable.density).toBe("comfortable");
|
|
768
|
+
expect(compact.density).toBe("compact");
|
|
769
|
+
expect(comfortable.padX.length).toBeGreaterThan(0);
|
|
770
|
+
expect(comfortable.gap.length).toBeGreaterThan(0);
|
|
771
|
+
expect(compact.padX).not.toEqual(comfortable.padX);
|
|
772
|
+
expect(compact.gap).not.toEqual(comfortable.gap);
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
it("the compact prop lands the same padX and gap as the density knob", () => {
|
|
776
|
+
const knob = hostAtoms(
|
|
777
|
+
<Preset overrides={{ density: "compact" }}>
|
|
778
|
+
<Toast title="Saved" onDismiss={() => {}} />
|
|
779
|
+
</Preset>,
|
|
780
|
+
);
|
|
781
|
+
const prop = hostAtoms(<Toast compact title="Saved" onDismiss={() => {}} />);
|
|
782
|
+
expect(prop.density).toBe("compact");
|
|
783
|
+
expect(prop.padX).toEqual(knob.padX);
|
|
784
|
+
expect(prop.gap).toEqual(knob.gap);
|
|
785
|
+
});
|
|
786
|
+
});
|
|
787
|
+
|
|
738
788
|
describe("Toast action label weight and contrast (TEXT NODE)", () => {
|
|
739
789
|
it("Undo is weight 400 on the TEXT NODE, never 600 (R7 / §6.1)", () => {
|
|
740
790
|
const action = renderActionWeight(
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @vitest-environment jsdom
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { fireEvent } from "@testing-library/react";
|
|
6
|
-
import { OVERLAY_ANCHOR_GAP, __resetDevWarnSeen } from "@multiplatform.one/theme";
|
|
5
|
+
import { act, fireEvent } from "@testing-library/react";
|
|
6
|
+
import { OVERLAY_ANCHOR_GAP, Preset, __resetDevWarnSeen } from "@multiplatform.one/theme";
|
|
7
7
|
import { renderWithProviders } from "@multiplatform.one/test-utils";
|
|
8
8
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
9
9
|
import { Button } from "@multiplatform.one/forms";
|
|
@@ -99,6 +99,59 @@ describe("Tooltip interaction", () => {
|
|
|
99
99
|
});
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
+
describe("Tooltip content rides the border, elevation and animation knobs", () => {
|
|
103
|
+
const stops = [
|
|
104
|
+
{ borderWidth: "none", elevation: "none", animation: "none" },
|
|
105
|
+
{ borderWidth: "small", elevation: "small", animation: "quick" },
|
|
106
|
+
{ borderWidth: "large", elevation: "large", animation: "slow" },
|
|
107
|
+
] as const;
|
|
108
|
+
|
|
109
|
+
async function measure(stop: (typeof stops)[number]) {
|
|
110
|
+
const result = renderWithProviders(
|
|
111
|
+
<Preset overrides={stop}>
|
|
112
|
+
<Tooltip content="Hint" open>
|
|
113
|
+
<Button>Edit</Button>
|
|
114
|
+
</Tooltip>
|
|
115
|
+
</Preset>,
|
|
116
|
+
);
|
|
117
|
+
await act(async () => {
|
|
118
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
119
|
+
});
|
|
120
|
+
const content = document.querySelector<HTMLElement>("[data-tooltip='content']");
|
|
121
|
+
const classes = content?.className.split(/\s+/) ?? [];
|
|
122
|
+
const measured = {
|
|
123
|
+
mounted: content !== null,
|
|
124
|
+
border: classes.find((c) => c.startsWith("_btw-")),
|
|
125
|
+
shadow: classes.find((c) => c.startsWith("_bxsh-"))?.match(/^_bxsh-\d+px\d+px\d+px/)?.[0],
|
|
126
|
+
transition: content?.style.transition.match(/^all \d+ms/)?.[0],
|
|
127
|
+
};
|
|
128
|
+
result.unmount();
|
|
129
|
+
return measured;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
it("follows each stop on the mounted bubble, and none carries no border, shadow or motion", async () => {
|
|
133
|
+
const none = await measure(stops[0]);
|
|
134
|
+
const small = await measure(stops[1]);
|
|
135
|
+
const large = await measure(stops[2]);
|
|
136
|
+
expect(none).toEqual({
|
|
137
|
+
mounted: true,
|
|
138
|
+
border: "_btw-0px",
|
|
139
|
+
shadow: undefined,
|
|
140
|
+
transition: undefined,
|
|
141
|
+
});
|
|
142
|
+
expect(small).toMatchObject({
|
|
143
|
+
mounted: true,
|
|
144
|
+
border: "_btw-0--5px",
|
|
145
|
+
shadow: "_bxsh-0px3px6px",
|
|
146
|
+
});
|
|
147
|
+
// Overlay large is the ladder's own $5 dialog stop, not the control $4 (MPO-99).
|
|
148
|
+
expect(large).toMatchObject({ mounted: true, border: "_btw-2px", shadow: "_bxsh-0px12px24px" });
|
|
149
|
+
expect(small.transition).toMatch(/^all \d+ms$/);
|
|
150
|
+
expect(large.transition).toMatch(/^all \d+ms$/);
|
|
151
|
+
expect(large.transition).not.toBe(small.transition);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
102
155
|
describe("Tooltip native long-press open path", () => {
|
|
103
156
|
beforeEach(() => {
|
|
104
157
|
vi.useFakeTimers();
|