@sovereignfs/ui 0.54.0 → 0.89.1
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/LICENSE +373 -661
- package/NOTICE +8 -0
- package/README.md +4 -6
- package/dist/Accordion.module.css +1 -1
- package/dist/Alert.module.css +1 -1
- package/dist/AppsLauncher.module.css +102 -0
- package/dist/Avatar.module.css +1 -1
- package/dist/Badge.module.css +30 -7
- package/dist/BalanceChip.module.css +1 -1
- package/dist/Button.module.css +23 -2
- package/dist/Card.module.css +7 -1
- package/dist/CardTile.module.css +187 -0
- package/dist/CheckableListRow.module.css +8 -0
- package/dist/Checkbox.module.css +8 -0
- package/dist/CodeTextarea.module.css +7 -1
- package/dist/Collapsible.module.css +1 -1
- package/dist/ColorPicker.module.css +138 -0
- package/dist/Combobox.module.css +8 -2
- package/dist/Command.module.css +7 -1
- package/dist/ConfirmDialog.module.css +8 -2
- package/dist/ConsentPrompt.module.css +21 -0
- package/dist/DatePicker.module.css +7 -1
- package/dist/Dialog.module.css +130 -21
- package/dist/DragHandleRow.module.css +6 -0
- package/dist/Drawer.module.css +36 -7
- package/dist/FileDropzone.module.css +25 -1
- package/dist/Header.module.css +68 -0
- package/dist/HeaderFooterLayout.module.css +21 -0
- package/dist/IconPicker.module.css +15 -5
- package/dist/Input.module.css +7 -1
- package/dist/Kbd.module.css +1 -1
- package/dist/LegalLinks.module.css +9 -2
- package/dist/Markdown.module.css +29 -0
- package/dist/Menu.module.css +1 -0
- package/dist/Message.module.css +10 -1
- package/dist/MessageScroller.module.css +12 -1
- package/dist/MobileAppsDrawer.module.css +19 -14
- package/dist/MobileFooter.module.css +7 -1
- package/dist/MobileHeader.module.css +14 -1
- package/dist/NavList.module.css +139 -0
- package/dist/NavTabs.module.css +8 -2
- package/dist/NotificationsPanel.module.css +268 -0
- package/dist/OverlayHeader.module.css +1 -1
- package/dist/PageContainer.module.css +62 -0
- package/dist/PageHeader.module.css +54 -0
- package/dist/PageLayout.module.css +51 -0
- package/dist/Popover.module.css +1 -1
- package/dist/QrCode.module.css +17 -0
- package/dist/QuantityStepper.module.css +5 -3
- package/dist/RadioGroup.module.css +6 -0
- package/dist/Resizable.module.css +3 -3
- package/dist/RootLayout.module.css +12 -0
- package/dist/SegmentedControl.module.css +7 -1
- package/dist/Select.module.css +7 -1
- package/dist/Sheet.module.css +20 -2
- package/dist/SplitPane.module.css +5 -5
- package/dist/StatusBadge.module.css +1 -1
- package/dist/StepStrip.module.css +55 -0
- package/dist/SuggestionInput.module.css +14 -3
- package/dist/SwipableMobileCarousel.module.css +12 -3
- package/dist/SwipableMobileCarouselDots.module.css +21 -0
- package/dist/SwipeStack.module.css +101 -0
- package/dist/SystemBanner.module.css +16 -0
- package/dist/Table.module.css +2 -2
- package/dist/Tabs.module.css +7 -1
- package/dist/TagInput.module.css +8 -2
- package/dist/Textarea.module.css +15 -1
- package/dist/ThreeColumnLayout.module.css +35 -0
- package/dist/Toast.module.css +67 -3
- package/dist/Toggle.module.css +7 -0
- package/dist/Tooltip.module.css +7 -1
- package/dist/UserMenu.module.css +95 -0
- package/dist/fonts/OFL.txt +93 -0
- package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
- package/dist/index.d.ts +1156 -76
- package/dist/index.js +4223 -1513
- package/dist/tokens/fonts.css +53 -0
- package/dist/tokens/primitives.css +23 -12
- package/dist/tokens/semantic.css +32 -0
- package/dist/tokens/theme-presets.css +33 -0
- package/dist/tokens.css +2 -1
- package/package.json +46 -19
- package/src/__tests__/motion.test.tsx +0 -105
- package/src/components/Accordion/Accordion.module.css +0 -3
- package/src/components/Accordion/Accordion.stories.tsx +0 -110
- package/src/components/Accordion/Accordion.tsx +0 -53
- package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
- package/src/components/Alert/Alert.module.css +0 -62
- package/src/components/Alert/Alert.stories.tsx +0 -96
- package/src/components/Alert/Alert.tsx +0 -58
- package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
- package/src/components/AspectRatio/AspectRatio.module.css +0 -15
- package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
- package/src/components/AspectRatio/AspectRatio.tsx +0 -21
- package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
- package/src/components/Avatar/Avatar.module.css +0 -38
- package/src/components/Avatar/Avatar.tsx +0 -42
- package/src/components/Badge/Badge.module.css +0 -154
- package/src/components/Badge/Badge.stories.tsx +0 -226
- package/src/components/Badge/Badge.tsx +0 -81
- package/src/components/Badge/__tests__/Badge.test.tsx +0 -88
- package/src/components/BalanceChip/BalanceChip.module.css +0 -32
- package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
- package/src/components/BalanceChip/BalanceChip.tsx +0 -33
- package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
- package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
- package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
- package/src/components/Button/Button.module.css +0 -153
- package/src/components/Button/Button.stories.tsx +0 -83
- package/src/components/Button/Button.tsx +0 -52
- package/src/components/Button/__tests__/Button.test.tsx +0 -66
- package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
- package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
- package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
- package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
- package/src/components/Calendar/Calendar.module.css +0 -126
- package/src/components/Calendar/Calendar.tsx +0 -213
- package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
- package/src/components/Calendar/dateUtils.ts +0 -97
- package/src/components/Card/Card.module.css +0 -42
- package/src/components/Card/Card.tsx +0 -34
- package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
- package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
- package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
- package/src/components/Checkbox/Checkbox.module.css +0 -111
- package/src/components/Checkbox/Checkbox.tsx +0 -78
- package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
- package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
- package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
- package/src/components/Collapsible/Collapsible.module.css +0 -70
- package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
- package/src/components/Collapsible/Collapsible.tsx +0 -66
- package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
- package/src/components/Combobox/Combobox.module.css +0 -122
- package/src/components/Combobox/Combobox.stories.tsx +0 -79
- package/src/components/Combobox/Combobox.tsx +0 -186
- package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
- package/src/components/Command/Command.module.css +0 -80
- package/src/components/Command/Command.stories.tsx +0 -104
- package/src/components/Command/Command.tsx +0 -168
- package/src/components/Command/__tests__/Command.test.tsx +0 -162
- package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -124
- package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -146
- package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
- package/src/components/ContextMenu/ContextMenu.tsx +0 -100
- package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
- package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
- package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
- package/src/components/DataTable/DataTable.module.css +0 -28
- package/src/components/DataTable/DataTable.stories.tsx +0 -74
- package/src/components/DataTable/DataTable.tsx +0 -154
- package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
- package/src/components/DatePicker/DatePicker.module.css +0 -61
- package/src/components/DatePicker/DatePicker.tsx +0 -103
- package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
- package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
- package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
- package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
- package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
- package/src/components/Dialog/Dialog.module.css +0 -226
- package/src/components/Dialog/Dialog.stories.tsx +0 -147
- package/src/components/Dialog/Dialog.tsx +0 -160
- package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -137
- package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
- package/src/components/DragHandleRow/DragHandleRow.tsx +0 -61
- package/src/components/Drawer/Drawer.module.css +0 -92
- package/src/components/Drawer/Drawer.stories.tsx +0 -132
- package/src/components/Drawer/Drawer.tsx +0 -176
- package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -199
- package/src/components/EmptyState/EmptyState.module.css +0 -27
- package/src/components/EmptyState/EmptyState.tsx +0 -27
- package/src/components/FileDropzone/FileDropzone.module.css +0 -63
- package/src/components/FileDropzone/FileDropzone.tsx +0 -109
- package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
- package/src/components/FormField/FormField.module.css +0 -33
- package/src/components/FormField/FormField.tsx +0 -78
- package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
- package/src/components/HoverCard/HoverCard.module.css +0 -3
- package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
- package/src/components/HoverCard/HoverCard.tsx +0 -111
- package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
- package/src/components/Icon/Icon.module.css +0 -27
- package/src/components/Icon/Icon.stories.tsx +0 -95
- package/src/components/Icon/Icon.tsx +0 -43
- package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
- package/src/components/Icon/icons/activity.tsx +0 -20
- package/src/components/Icon/icons/alert-triangle.tsx +0 -22
- package/src/components/Icon/icons/apple.tsx +0 -21
- package/src/components/Icon/icons/banana.tsx +0 -21
- package/src/components/Icon/icons/beef.tsx +0 -22
- package/src/components/Icon/icons/beer.tsx +0 -24
- package/src/components/Icon/icons/bell.tsx +0 -21
- package/src/components/Icon/icons/calendar.tsx +0 -23
- package/src/components/Icon/icons/candy.tsx +0 -24
- package/src/components/Icon/icons/carrot.tsx +0 -22
- package/src/components/Icon/icons/check.tsx +0 -20
- package/src/components/Icon/icons/chevron-down.tsx +0 -20
- package/src/components/Icon/icons/chevron-left.tsx +0 -20
- package/src/components/Icon/icons/chevron-right.tsx +0 -20
- package/src/components/Icon/icons/chevron-up.tsx +0 -20
- package/src/components/Icon/icons/circle-check.tsx +0 -21
- package/src/components/Icon/icons/circle-x.tsx +0 -22
- package/src/components/Icon/icons/coffee.tsx +0 -23
- package/src/components/Icon/icons/cookie.tsx +0 -25
- package/src/components/Icon/icons/croissant.tsx +0 -24
- package/src/components/Icon/icons/cup-soda.tsx +0 -23
- package/src/components/Icon/icons/drumstick.tsx +0 -21
- package/src/components/Icon/icons/egg.tsx +0 -20
- package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
- package/src/components/Icon/icons/external-link.tsx +0 -22
- package/src/components/Icon/icons/eye-off.tsx +0 -23
- package/src/components/Icon/icons/eye.tsx +0 -21
- package/src/components/Icon/icons/file.tsx +0 -21
- package/src/components/Icon/icons/fish.tsx +0 -25
- package/src/components/Icon/icons/grid-2x2.tsx +0 -22
- package/src/components/Icon/icons/house.tsx +0 -21
- package/src/components/Icon/icons/index.ts +0 -234
- package/src/components/Icon/icons/info.tsx +0 -22
- package/src/components/Icon/icons/lock.tsx +0 -21
- package/src/components/Icon/icons/log-out.tsx +0 -22
- package/src/components/Icon/icons/mail.tsx +0 -21
- package/src/components/Icon/icons/menu.tsx +0 -22
- package/src/components/Icon/icons/milk.tsx +0 -22
- package/src/components/Icon/icons/package.tsx +0 -23
- package/src/components/Icon/icons/pencil.tsx +0 -21
- package/src/components/Icon/icons/pizza.tsx +0 -24
- package/src/components/Icon/icons/plus.tsx +0 -21
- package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
- package/src/components/Icon/icons/salad.tsx +0 -24
- package/src/components/Icon/icons/search.tsx +0 -21
- package/src/components/Icon/icons/settings.tsx +0 -21
- package/src/components/Icon/icons/shield.tsx +0 -20
- package/src/components/Icon/icons/shopping-basket.tsx +0 -26
- package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
- package/src/components/Icon/icons/smartphone.tsx +0 -21
- package/src/components/Icon/icons/snowflake.tsx +0 -31
- package/src/components/Icon/icons/spray-can.tsx +0 -29
- package/src/components/Icon/icons/trash-2.tsx +0 -24
- package/src/components/Icon/icons/upload.tsx +0 -22
- package/src/components/Icon/icons/user.tsx +0 -21
- package/src/components/Icon/icons/wine.tsx +0 -23
- package/src/components/Icon/icons/x.tsx +0 -21
- package/src/components/IconPicker/IconPicker.module.css +0 -63
- package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
- package/src/components/IconPicker/IconPicker.tsx +0 -90
- package/src/components/Input/Input.module.css +0 -52
- package/src/components/Input/Input.stories.tsx +0 -86
- package/src/components/Input/Input.tsx +0 -14
- package/src/components/Input/__tests__/Input.test.tsx +0 -22
- package/src/components/Item/Item.module.css +0 -70
- package/src/components/Item/Item.stories.tsx +0 -62
- package/src/components/Item/Item.tsx +0 -54
- package/src/components/Item/__tests__/Item.test.tsx +0 -39
- package/src/components/Kbd/Kbd.module.css +0 -14
- package/src/components/Kbd/Kbd.stories.tsx +0 -32
- package/src/components/Kbd/Kbd.tsx +0 -12
- package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
- package/src/components/Label/Label.module.css +0 -11
- package/src/components/Label/Label.stories.tsx +0 -40
- package/src/components/Label/Label.tsx +0 -24
- package/src/components/Label/__tests__/Label.test.tsx +0 -32
- package/src/components/LegalLinks/LegalLinks.module.css +0 -24
- package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
- package/src/components/LegalLinks/LegalLinks.tsx +0 -40
- package/src/components/Markdown/Markdown.module.css +0 -49
- package/src/components/Markdown/Markdown.stories.tsx +0 -30
- package/src/components/Markdown/Markdown.tsx +0 -168
- package/src/components/Marker/Marker.module.css +0 -33
- package/src/components/Marker/Marker.stories.tsx +0 -39
- package/src/components/Marker/Marker.tsx +0 -34
- package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
- package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
- package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
- package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
- package/src/components/Menu/Menu.module.css +0 -89
- package/src/components/Menu/Menu.tsx +0 -159
- package/src/components/Menu/__tests__/Menu.test.tsx +0 -197
- package/src/components/Menubar/Menubar.stories.tsx +0 -52
- package/src/components/Menubar/Menubar.tsx +0 -42
- package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
- package/src/components/Message/Message.module.css +0 -99
- package/src/components/Message/Message.stories.tsx +0 -79
- package/src/components/Message/Message.tsx +0 -41
- package/src/components/Message/__tests__/Message.test.tsx +0 -46
- package/src/components/MessageScroller/MessageScroller.module.css +0 -54
- package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
- package/src/components/MessageScroller/MessageScroller.tsx +0 -72
- package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
- package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -81
- package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
- package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
- package/src/components/MobileFooter/MobileFooter.module.css +0 -73
- package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
- package/src/components/MobileFooter/MobileFooter.tsx +0 -109
- package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -71
- package/src/components/MobileHeader/MobileHeader.module.css +0 -63
- package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
- package/src/components/MobileHeader/MobileHeader.tsx +0 -77
- package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -58
- package/src/components/NavTabs/NavTabs.module.css +0 -50
- package/src/components/NavTabs/NavTabs.tsx +0 -61
- package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
- package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
- package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
- package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
- package/src/components/OfflineGate/OfflineGate.tsx +0 -44
- package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
- package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
- package/src/components/OverlayHeader/OverlayHeader.tsx +0 -62
- package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -51
- package/src/components/PageContainer/PageContainer.module.css +0 -20
- package/src/components/PageContainer/PageContainer.tsx +0 -31
- package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -37
- package/src/components/PageHeader/PageHeader.module.css +0 -32
- package/src/components/PageHeader/PageHeader.tsx +0 -35
- package/src/components/Pagination/Pagination.module.css +0 -98
- package/src/components/Pagination/Pagination.stories.tsx +0 -49
- package/src/components/Pagination/Pagination.tsx +0 -87
- package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
- package/src/components/Popover/Popover.module.css +0 -74
- package/src/components/Popover/Popover.stories.tsx +0 -357
- package/src/components/Popover/Popover.tsx +0 -208
- package/src/components/Popover/__tests__/Popover.test.tsx +0 -98
- package/src/components/Progress/Progress.module.css +0 -20
- package/src/components/Progress/Progress.stories.tsx +0 -40
- package/src/components/Progress/Progress.tsx +0 -35
- package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
- package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
- package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
- package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
- package/src/components/RadioGroup/RadioGroup.module.css +0 -88
- package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
- package/src/components/RadioGroup/RadioGroup.tsx +0 -99
- package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
- package/src/components/Resizable/Resizable.module.css +0 -70
- package/src/components/Resizable/Resizable.stories.tsx +0 -82
- package/src/components/Resizable/Resizable.tsx +0 -313
- package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
- package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
- package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
- package/src/components/ScrollArea/ScrollArea.module.css +0 -20
- package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
- package/src/components/ScrollArea/ScrollArea.tsx +0 -27
- package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
- package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
- package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
- package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
- package/src/components/Select/Select.module.css +0 -82
- package/src/components/Select/Select.stories.tsx +0 -115
- package/src/components/Select/Select.tsx +0 -48
- package/src/components/Select/__tests__/Select.test.tsx +0 -59
- package/src/components/Sheet/Sheet.module.css +0 -55
- package/src/components/Sheet/Sheet.tsx +0 -109
- package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
- package/src/components/Slider/Slider.module.css +0 -95
- package/src/components/Slider/Slider.stories.tsx +0 -64
- package/src/components/Slider/Slider.tsx +0 -77
- package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
- package/src/components/Spinner/Spinner.module.css +0 -39
- package/src/components/Spinner/Spinner.tsx +0 -23
- package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
- package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
- package/src/components/SplitPane/SplitPane.module.css +0 -85
- package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
- package/src/components/SplitPane/SplitPane.tsx +0 -149
- package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
- package/src/components/StatusBadge/StatusBadge.module.css +0 -59
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
- package/src/components/StatusBadge/StatusBadge.tsx +0 -65
- package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
- package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
- package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
- package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -55
- package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -227
- package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
- package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
- package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
- package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
- package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
- package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -133
- package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
- package/src/components/SwipableMobileCarousel/context.ts +0 -13
- package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -49
- package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -62
- package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
- package/src/components/SystemBanner/SystemBanner.module.css +0 -69
- package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
- package/src/components/SystemBanner/SystemBanner.tsx +0 -50
- package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
- package/src/components/Table/Table.module.css +0 -45
- package/src/components/Table/Table.stories.tsx +0 -125
- package/src/components/Table/Table.tsx +0 -51
- package/src/components/Table/__tests__/Table.test.tsx +0 -50
- package/src/components/Tabs/Tabs.module.css +0 -56
- package/src/components/Tabs/Tabs.stories.tsx +0 -100
- package/src/components/Tabs/Tabs.tsx +0 -46
- package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
- package/src/components/TagInput/TagInput.module.css +0 -141
- package/src/components/TagInput/TagInput.stories.tsx +0 -109
- package/src/components/TagInput/TagInput.tsx +0 -174
- package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
- package/src/components/Textarea/Textarea.module.css +0 -39
- package/src/components/Textarea/Textarea.tsx +0 -15
- package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -29
- package/src/components/Toast/Toast.module.css +0 -132
- package/src/components/Toast/Toast.stories.tsx +0 -191
- package/src/components/Toast/Toast.tsx +0 -139
- package/src/components/Toggle/Toggle.module.css +0 -57
- package/src/components/Toggle/Toggle.stories.tsx +0 -95
- package/src/components/Toggle/Toggle.tsx +0 -39
- package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
- package/src/components/Tooltip/Tooltip.module.css +0 -56
- package/src/components/Tooltip/Tooltip.tsx +0 -30
- package/src/components/Typography/Typography.module.css +0 -47
- package/src/components/Typography/Typography.stories.tsx +0 -62
- package/src/components/Typography/Typography.tsx +0 -30
- package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
- package/src/css-modules.d.ts +0 -4
- package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
- package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
- package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
- package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
- package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
- package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
- package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
- package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -93
- package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
- package/src/hooks/index.ts +0 -24
- package/src/hooks/useCarouselRouteSync.ts +0 -92
- package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
- package/src/hooks/useDoubleTap.ts +0 -91
- package/src/hooks/useIsMobile.ts +0 -33
- package/src/hooks/useIsOffline.ts +0 -41
- package/src/hooks/useLongPress.ts +0 -185
- package/src/hooks/useOfflineTileState.ts +0 -45
- package/src/hooks/useResponsiveLayout.ts +0 -36
- package/src/hooks/useSnapCarousel.ts +0 -79
- package/src/hooks/useSwipeReveal.ts +0 -107
- package/src/index.ts +0 -251
- package/src/motion.ts +0 -78
- package/src/overlay-shell.ts +0 -94
- package/src/scroll-lock.ts +0 -22
- package/src/stories/Avatar.stories.tsx +0 -44
- package/src/stories/Card.stories.tsx +0 -35
- package/src/stories/Checkbox.stories.tsx +0 -45
- package/src/stories/DesignSystemOverview.stories.tsx +0 -3187
- package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
- package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
- package/src/stories/DragHandleRow.stories.tsx +0 -41
- package/src/stories/EmptyState.stories.tsx +0 -33
- package/src/stories/FileDropzone.stories.tsx +0 -69
- package/src/stories/FormField.stories.tsx +0 -47
- package/src/stories/InteractionHooks.stories.tsx +0 -925
- package/src/stories/MobilePatterns.stories.tsx +0 -1536
- package/src/stories/NavTabs.stories.tsx +0 -53
- package/src/stories/OfflineGate.stories.tsx +0 -42
- package/src/stories/PageContainer.stories.tsx +0 -37
- package/src/stories/PageHeader.stories.tsx +0 -42
- package/src/stories/ResponsiveSurface.stories.tsx +0 -47
- package/src/stories/Spinner.stories.tsx +0 -25
- package/src/stories/SwipableMobileCarousel.stories.tsx +0 -304
- package/src/stories/Textarea.stories.tsx +0 -51
- package/src/stories/TokenGallery.stories.tsx +0 -602
- package/src/stories/Tooltip.stories.tsx +0 -59
- package/src/tokens/primitives.css +0 -157
- package/src/tokens/semantic.css +0 -130
- package/src/tokens.css +0 -5
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { NavTabs } from '../components/NavTabs/NavTabs';
|
|
3
|
-
|
|
4
|
-
const items = [
|
|
5
|
-
{ label: 'Overview', href: '#overview', active: true },
|
|
6
|
-
{ label: 'Users', href: '#users' },
|
|
7
|
-
{ label: 'Plugins', href: '#plugins' },
|
|
8
|
-
{ label: 'Settings', href: '#settings' },
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
const meta = {
|
|
12
|
-
title: 'Components/NavTabs',
|
|
13
|
-
component: NavTabs,
|
|
14
|
-
parameters: { layout: 'padded' },
|
|
15
|
-
args: { items },
|
|
16
|
-
} satisfies Meta<typeof NavTabs>;
|
|
17
|
-
|
|
18
|
-
export default meta;
|
|
19
|
-
type Story = StoryObj<typeof meta>;
|
|
20
|
-
|
|
21
|
-
export const Default: Story = {};
|
|
22
|
-
|
|
23
|
-
export const ManyTabs: Story = {
|
|
24
|
-
args: {
|
|
25
|
-
items: [
|
|
26
|
-
{ label: 'Profile', href: '#profile', active: true },
|
|
27
|
-
{ label: 'Security', href: '#security' },
|
|
28
|
-
{ label: 'Notifications', href: '#notifications' },
|
|
29
|
-
{ label: 'Preferences', href: '#preferences' },
|
|
30
|
-
{ label: 'Data & Privacy', href: '#data' },
|
|
31
|
-
{ label: 'Sessions', href: '#sessions' },
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
parameters: { viewport: { defaultViewport: 'mobile' } },
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/** Simulates a consumer swapping in a client-side router link (e.g. Next's
|
|
38
|
-
* `<Link replace>` inside an overlay-shell plugin) instead of a plain `<a>`. */
|
|
39
|
-
export const WithCustomLinkRenderer: Story = {
|
|
40
|
-
args: {
|
|
41
|
-
renderLink: (item, linkProps) => (
|
|
42
|
-
<button
|
|
43
|
-
type="button"
|
|
44
|
-
className={linkProps.className}
|
|
45
|
-
aria-current={linkProps['aria-current']}
|
|
46
|
-
onClick={() => console.log(`client-side navigate to ${item.href}`)}
|
|
47
|
-
style={{ background: 'none', border: 'none', cursor: 'pointer', font: 'inherit' }}
|
|
48
|
-
>
|
|
49
|
-
{linkProps.children}
|
|
50
|
-
</button>
|
|
51
|
-
),
|
|
52
|
-
},
|
|
53
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { OfflineGate } from '../components/OfflineGate/OfflineGate';
|
|
3
|
-
import { EmptyState } from '../components/EmptyState/EmptyState';
|
|
4
|
-
|
|
5
|
-
const sampleContent = (
|
|
6
|
-
<div style={{ padding: 'var(--sv-space-4)' }}>
|
|
7
|
-
<p style={{ margin: 0, fontFamily: 'var(--sv-font-family)' }}>
|
|
8
|
-
The wrapped content — a user list, a settings form, anything that shouldn’t operate
|
|
9
|
-
against a stale cached snapshot.
|
|
10
|
-
</p>
|
|
11
|
-
</div>
|
|
12
|
-
);
|
|
13
|
-
|
|
14
|
-
const meta = {
|
|
15
|
-
title: 'Components/OfflineGate',
|
|
16
|
-
component: OfflineGate,
|
|
17
|
-
parameters: { layout: 'padded' },
|
|
18
|
-
} satisfies Meta<typeof OfflineGate>;
|
|
19
|
-
|
|
20
|
-
export default meta;
|
|
21
|
-
type Story = StoryObj<typeof meta>;
|
|
22
|
-
|
|
23
|
-
// `OfflineGate` reads the live `useIsOffline()` hook, which Storybook can't
|
|
24
|
-
// drive via args — toggle DevTools > Network > Offline (or throttling) in this
|
|
25
|
-
// preview to see it swap `children` for the blocked state below.
|
|
26
|
-
export const Default: Story = {
|
|
27
|
-
args: { children: sampleContent, surfaceName: 'Console' },
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// The offline state is not independently controllable here (same reason as
|
|
31
|
-
// Default), so this renders the exact EmptyState output OfflineGate produces
|
|
32
|
-
// when useIsOffline() is true, for visual review without a live toggle.
|
|
33
|
-
export const OfflineState: Story = {
|
|
34
|
-
args: { children: sampleContent, surfaceName: 'Console' },
|
|
35
|
-
render: () => (
|
|
36
|
-
<EmptyState
|
|
37
|
-
icon="alert-triangle"
|
|
38
|
-
heading="You're offline"
|
|
39
|
-
description="Console needs a connection — reconnect to continue."
|
|
40
|
-
/>
|
|
41
|
-
),
|
|
42
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { PageContainer } from '../components/PageContainer/PageContainer';
|
|
3
|
-
|
|
4
|
-
const demoBlock = (
|
|
5
|
-
<div
|
|
6
|
-
style={{
|
|
7
|
-
background: 'var(--sv-color-surface-raised)',
|
|
8
|
-
border: '1px dashed var(--sv-color-border)',
|
|
9
|
-
borderRadius: 'var(--sv-radius-md)',
|
|
10
|
-
padding: 'var(--sv-space-4)',
|
|
11
|
-
}}
|
|
12
|
-
>
|
|
13
|
-
Page content goes here. The runtime shell already pads this area — this component only
|
|
14
|
-
constrains and centers width, it adds no padding of its own.
|
|
15
|
-
</div>
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
const meta = {
|
|
19
|
-
title: 'Components/PageContainer',
|
|
20
|
-
component: PageContainer,
|
|
21
|
-
parameters: { layout: 'fullscreen' },
|
|
22
|
-
args: { children: demoBlock },
|
|
23
|
-
} satisfies Meta<typeof PageContainer>;
|
|
24
|
-
|
|
25
|
-
export default meta;
|
|
26
|
-
type Story = StoryObj<typeof meta>;
|
|
27
|
-
|
|
28
|
-
export const Medium: Story = {};
|
|
29
|
-
|
|
30
|
-
export const Small: Story = { args: { maxWidth: 'sm' } };
|
|
31
|
-
export const Large: Story = { args: { maxWidth: 'lg' } };
|
|
32
|
-
export const Full: Story = { args: { maxWidth: 'full' } };
|
|
33
|
-
|
|
34
|
-
export const MobileViewport: Story = {
|
|
35
|
-
args: { maxWidth: 'md' },
|
|
36
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
37
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { PageHeader } from '../components/PageHeader/PageHeader';
|
|
3
|
-
import { Button } from '../components/Button/Button';
|
|
4
|
-
|
|
5
|
-
const meta = {
|
|
6
|
-
title: 'Components/PageHeader',
|
|
7
|
-
component: PageHeader,
|
|
8
|
-
parameters: { layout: 'padded' },
|
|
9
|
-
} satisfies Meta<typeof PageHeader>;
|
|
10
|
-
|
|
11
|
-
export default meta;
|
|
12
|
-
type Story = StoryObj<typeof meta>;
|
|
13
|
-
|
|
14
|
-
export const Default: Story = {
|
|
15
|
-
args: { title: 'Users' },
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export const WithDescription: Story = {
|
|
19
|
-
args: {
|
|
20
|
-
title: 'Users',
|
|
21
|
-
description: 'Manage who has access to this instance.',
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export const WithAction: Story = {
|
|
26
|
-
args: {
|
|
27
|
-
title: 'Users',
|
|
28
|
-
description: 'Manage who has access to this instance.',
|
|
29
|
-
action: <Button size="sm">Invite user</Button>,
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/** For use under a shell/plugin that already renders its own `<h1>` — e.g.
|
|
34
|
-
* Console's per-page headers sitting below `<h1>Console</h1>`. Visually
|
|
35
|
-
* identical to the default story; only the rendered tag changes. */
|
|
36
|
-
export const NestedHeadingLevel: Story = {
|
|
37
|
-
args: {
|
|
38
|
-
title: 'Users',
|
|
39
|
-
description: 'Manage who has access to this instance.',
|
|
40
|
-
headingLevel: 2,
|
|
41
|
-
},
|
|
42
|
-
};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { ResponsiveSurface } from '../components/ResponsiveSurface/ResponsiveSurface';
|
|
3
|
-
|
|
4
|
-
function demoTree(label: string) {
|
|
5
|
-
return (
|
|
6
|
-
<div
|
|
7
|
-
style={{
|
|
8
|
-
padding: 'var(--sv-space-6)',
|
|
9
|
-
textAlign: 'center',
|
|
10
|
-
fontFamily: 'var(--sv-font-family)',
|
|
11
|
-
fontSize: 'var(--sv-font-size-sm)',
|
|
12
|
-
color: 'var(--sv-color-text-primary)',
|
|
13
|
-
border: '1px dashed var(--sv-color-border)',
|
|
14
|
-
borderRadius: 'var(--sv-radius-md)',
|
|
15
|
-
}}
|
|
16
|
-
>
|
|
17
|
-
{label}
|
|
18
|
-
</div>
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const meta = {
|
|
23
|
-
title: 'Components/ResponsiveSurface',
|
|
24
|
-
component: ResponsiveSurface,
|
|
25
|
-
parameters: {
|
|
26
|
-
layout: 'padded',
|
|
27
|
-
docs: {
|
|
28
|
-
description: {
|
|
29
|
-
component:
|
|
30
|
-
'Renders an entirely different component tree below a breakpoint, not a CSS squeeze of the same one — only the active side is ever mounted. See also the useResponsiveLayout hook for non-JSX values.',
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
args: {
|
|
35
|
-
web: demoTree('Web tree — e.g. a three-column layout'),
|
|
36
|
-
mobile: demoTree('Mobile tree — an entirely different component'),
|
|
37
|
-
},
|
|
38
|
-
} satisfies Meta<typeof ResponsiveSurface>;
|
|
39
|
-
|
|
40
|
-
export default meta;
|
|
41
|
-
type Story = StoryObj<typeof meta>;
|
|
42
|
-
|
|
43
|
-
export const Default: Story = {};
|
|
44
|
-
|
|
45
|
-
export const MobileViewport: Story = {
|
|
46
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
47
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { Spinner } from '../components/Spinner/Spinner';
|
|
3
|
-
|
|
4
|
-
const meta = {
|
|
5
|
-
title: 'Components/Spinner',
|
|
6
|
-
component: Spinner,
|
|
7
|
-
parameters: { layout: 'centered' },
|
|
8
|
-
} satisfies Meta<typeof Spinner>;
|
|
9
|
-
|
|
10
|
-
export default meta;
|
|
11
|
-
type Story = StoryObj<typeof meta>;
|
|
12
|
-
|
|
13
|
-
export const Default: Story = {};
|
|
14
|
-
export const Small: Story = { args: { size: 'sm' } };
|
|
15
|
-
export const Large: Story = { args: { size: 'lg' } };
|
|
16
|
-
|
|
17
|
-
export const AllSizes: Story = {
|
|
18
|
-
render: () => (
|
|
19
|
-
<div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
|
|
20
|
-
<Spinner size="sm" />
|
|
21
|
-
<Spinner size="md" />
|
|
22
|
-
<Spinner size="lg" />
|
|
23
|
-
</div>
|
|
24
|
-
),
|
|
25
|
-
};
|
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import { SwipableMobileCarousel } from '../components/SwipableMobileCarousel/SwipableMobileCarousel';
|
|
4
|
-
import { SwipableMobileCarouselSlide } from '../components/SwipableMobileCarousel/SwipableMobileCarouselSlide';
|
|
5
|
-
import { SwipableMobileCarouselSlideHeader } from '../components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader';
|
|
6
|
-
import { SwipableMobileCarouselSlideBody } from '../components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody';
|
|
7
|
-
import { SwipableMobileCarouselSlideFooter } from '../components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter';
|
|
8
|
-
import { SwipableMobileCarouselDots } from '../components/SwipableMobileCarouselDots/SwipableMobileCarouselDots';
|
|
9
|
-
|
|
10
|
-
const SLIDES = [
|
|
11
|
-
{ key: 'lists', label: 'Lists' },
|
|
12
|
-
{ key: 'groceries', label: 'Groceries' },
|
|
13
|
-
{ key: 'errands', label: 'Errands' },
|
|
14
|
-
{ key: 'work', label: 'Work' },
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
function slideBodyStyle(): React.CSSProperties {
|
|
18
|
-
return {
|
|
19
|
-
display: 'flex',
|
|
20
|
-
alignItems: 'center',
|
|
21
|
-
justifyContent: 'center',
|
|
22
|
-
height: '100%',
|
|
23
|
-
fontFamily: 'var(--sv-font-family)',
|
|
24
|
-
color: 'var(--sv-color-text-primary)',
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function headerStyle(): React.CSSProperties {
|
|
29
|
-
return {
|
|
30
|
-
padding: 'var(--sv-space-4)',
|
|
31
|
-
fontFamily: 'var(--sv-font-family)',
|
|
32
|
-
fontWeight: 'var(--sv-font-weight-semibold)',
|
|
33
|
-
color: 'var(--sv-color-text-primary)',
|
|
34
|
-
borderBottom: '1px solid var(--sv-color-border)',
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function CarouselFrame({ children }: { children: React.ReactNode }) {
|
|
39
|
-
return (
|
|
40
|
-
<div
|
|
41
|
-
style={{
|
|
42
|
-
height: 480,
|
|
43
|
-
maxWidth: 375,
|
|
44
|
-
margin: '0 auto',
|
|
45
|
-
border: '1px solid var(--sv-color-border)',
|
|
46
|
-
borderRadius: 'var(--sv-radius-md)',
|
|
47
|
-
overflow: 'hidden',
|
|
48
|
-
}}
|
|
49
|
-
>
|
|
50
|
-
{children}
|
|
51
|
-
</div>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function DefaultDemo() {
|
|
56
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
57
|
-
return (
|
|
58
|
-
<CarouselFrame>
|
|
59
|
-
<SwipableMobileCarousel
|
|
60
|
-
activeIndex={activeIndex}
|
|
61
|
-
onSettle={setActiveIndex}
|
|
62
|
-
aria-label="Task lists"
|
|
63
|
-
>
|
|
64
|
-
{SLIDES.map((slide) => (
|
|
65
|
-
<SwipableMobileCarouselSlide key={slide.key} slideKey={slide.key} label={slide.label}>
|
|
66
|
-
<SwipableMobileCarouselSlideHeader>
|
|
67
|
-
<div style={headerStyle()}>{slide.label}</div>
|
|
68
|
-
</SwipableMobileCarouselSlideHeader>
|
|
69
|
-
<SwipableMobileCarouselSlideBody>
|
|
70
|
-
<div style={slideBodyStyle()}>{slide.label} content</div>
|
|
71
|
-
</SwipableMobileCarouselSlideBody>
|
|
72
|
-
</SwipableMobileCarouselSlide>
|
|
73
|
-
))}
|
|
74
|
-
</SwipableMobileCarousel>
|
|
75
|
-
</CarouselFrame>
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function LazyLoadingBodyDemo() {
|
|
80
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
81
|
-
const [loadedKeys, setLoadedKeys] = useState<Set<string>>(new Set(['lists']));
|
|
82
|
-
|
|
83
|
-
function simulateLoad(key: string) {
|
|
84
|
-
setTimeout(() => setLoadedKeys((s) => new Set(s).add(key)), 1200);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<CarouselFrame>
|
|
89
|
-
<SwipableMobileCarousel
|
|
90
|
-
activeIndex={activeIndex}
|
|
91
|
-
onSettle={(i) => {
|
|
92
|
-
setActiveIndex(i);
|
|
93
|
-
const key = SLIDES[i]?.key;
|
|
94
|
-
if (key && !loadedKeys.has(key)) simulateLoad(key);
|
|
95
|
-
}}
|
|
96
|
-
aria-label="Task lists (simulated fetch)"
|
|
97
|
-
>
|
|
98
|
-
{SLIDES.map((slide) => (
|
|
99
|
-
<SwipableMobileCarouselSlide key={slide.key} slideKey={slide.key} label={slide.label}>
|
|
100
|
-
{/* The title renders immediately from already-known metadata —
|
|
101
|
-
only the Body below waits on its own simulated 1.2s fetch. */}
|
|
102
|
-
<SwipableMobileCarouselSlideHeader>
|
|
103
|
-
<div style={headerStyle()}>{slide.label}</div>
|
|
104
|
-
</SwipableMobileCarouselSlideHeader>
|
|
105
|
-
<SwipableMobileCarouselSlideBody loading={!loadedKeys.has(slide.key)}>
|
|
106
|
-
<div style={slideBodyStyle()}>{slide.label} content (loaded)</div>
|
|
107
|
-
</SwipableMobileCarouselSlideBody>
|
|
108
|
-
</SwipableMobileCarouselSlide>
|
|
109
|
-
))}
|
|
110
|
-
</SwipableMobileCarousel>
|
|
111
|
-
</CarouselFrame>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function CustomIndicatorDemo() {
|
|
116
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
117
|
-
return (
|
|
118
|
-
<CarouselFrame>
|
|
119
|
-
<SwipableMobileCarousel
|
|
120
|
-
activeIndex={activeIndex}
|
|
121
|
-
onSettle={setActiveIndex}
|
|
122
|
-
aria-label="Task lists"
|
|
123
|
-
renderIndicator={({ count, activeIndex: i, onJump }) => (
|
|
124
|
-
<div
|
|
125
|
-
style={{
|
|
126
|
-
position: 'absolute',
|
|
127
|
-
top: 8,
|
|
128
|
-
right: 8,
|
|
129
|
-
fontFamily: 'var(--sv-font-family)',
|
|
130
|
-
fontSize: 'var(--sv-font-size-sm)',
|
|
131
|
-
color: 'var(--sv-color-text-primary)',
|
|
132
|
-
background: 'var(--sv-color-surface-raised)',
|
|
133
|
-
borderRadius: 'var(--sv-radius-md)',
|
|
134
|
-
padding: 'var(--sv-space-1) var(--sv-space-2)',
|
|
135
|
-
}}
|
|
136
|
-
>
|
|
137
|
-
<button type="button" onClick={() => onJump(Math.max(0, i - 1))}>
|
|
138
|
-
‹
|
|
139
|
-
</button>{' '}
|
|
140
|
-
{i + 1} / {count}{' '}
|
|
141
|
-
<button type="button" onClick={() => onJump(Math.min(count - 1, i + 1))}>
|
|
142
|
-
›
|
|
143
|
-
</button>
|
|
144
|
-
</div>
|
|
145
|
-
)}
|
|
146
|
-
>
|
|
147
|
-
{SLIDES.map((slide) => (
|
|
148
|
-
<SwipableMobileCarouselSlide key={slide.key} slideKey={slide.key} label={slide.label}>
|
|
149
|
-
<SwipableMobileCarouselSlideHeader>
|
|
150
|
-
<div style={headerStyle()}>{slide.label}</div>
|
|
151
|
-
</SwipableMobileCarouselSlideHeader>
|
|
152
|
-
<SwipableMobileCarouselSlideBody>
|
|
153
|
-
<div style={slideBodyStyle()}>{slide.label} content</div>
|
|
154
|
-
</SwipableMobileCarouselSlideBody>
|
|
155
|
-
</SwipableMobileCarouselSlide>
|
|
156
|
-
))}
|
|
157
|
-
</SwipableMobileCarousel>
|
|
158
|
-
</CarouselFrame>
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function NoIndicatorDemo() {
|
|
163
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
164
|
-
return (
|
|
165
|
-
<CarouselFrame>
|
|
166
|
-
<SwipableMobileCarousel
|
|
167
|
-
activeIndex={activeIndex}
|
|
168
|
-
onSettle={setActiveIndex}
|
|
169
|
-
aria-label="Task lists"
|
|
170
|
-
renderIndicator={null}
|
|
171
|
-
>
|
|
172
|
-
{SLIDES.map((slide) => (
|
|
173
|
-
<SwipableMobileCarouselSlide key={slide.key} slideKey={slide.key} label={slide.label}>
|
|
174
|
-
<SwipableMobileCarouselSlideHeader>
|
|
175
|
-
<div style={headerStyle()}>{slide.label}</div>
|
|
176
|
-
</SwipableMobileCarouselSlideHeader>
|
|
177
|
-
<SwipableMobileCarouselSlideBody>
|
|
178
|
-
<div style={slideBodyStyle()}>{slide.label} content</div>
|
|
179
|
-
</SwipableMobileCarouselSlideBody>
|
|
180
|
-
</SwipableMobileCarouselSlide>
|
|
181
|
-
))}
|
|
182
|
-
</SwipableMobileCarousel>
|
|
183
|
-
</CarouselFrame>
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function FooterDemo() {
|
|
188
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
189
|
-
return (
|
|
190
|
-
<CarouselFrame>
|
|
191
|
-
<SwipableMobileCarousel
|
|
192
|
-
activeIndex={activeIndex}
|
|
193
|
-
onSettle={setActiveIndex}
|
|
194
|
-
aria-label="Task lists"
|
|
195
|
-
>
|
|
196
|
-
{SLIDES.map((slide) => (
|
|
197
|
-
<SwipableMobileCarouselSlide key={slide.key} slideKey={slide.key} label={slide.label}>
|
|
198
|
-
<SwipableMobileCarouselSlideHeader>
|
|
199
|
-
<div style={headerStyle()}>{slide.label}</div>
|
|
200
|
-
</SwipableMobileCarouselSlideHeader>
|
|
201
|
-
<SwipableMobileCarouselSlideBody>
|
|
202
|
-
<div style={slideBodyStyle()}>{slide.label} content</div>
|
|
203
|
-
</SwipableMobileCarouselSlideBody>
|
|
204
|
-
<SwipableMobileCarouselSlideFooter>
|
|
205
|
-
<div
|
|
206
|
-
style={{
|
|
207
|
-
padding: 'var(--sv-space-3) var(--sv-space-4)',
|
|
208
|
-
borderTop: '1px solid var(--sv-color-border)',
|
|
209
|
-
fontFamily: 'var(--sv-font-family)',
|
|
210
|
-
fontSize: 'var(--sv-font-size-sm)',
|
|
211
|
-
color: 'var(--sv-color-text-muted)',
|
|
212
|
-
}}
|
|
213
|
-
>
|
|
214
|
-
+ Add to {slide.label}
|
|
215
|
-
</div>
|
|
216
|
-
</SwipableMobileCarouselSlideFooter>
|
|
217
|
-
</SwipableMobileCarouselSlide>
|
|
218
|
-
))}
|
|
219
|
-
</SwipableMobileCarousel>
|
|
220
|
-
</CarouselFrame>
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function DotsStandaloneDemo() {
|
|
225
|
-
const [activeIndex, setActiveIndex] = useState(0);
|
|
226
|
-
return (
|
|
227
|
-
<SwipableMobileCarouselDots
|
|
228
|
-
count={4}
|
|
229
|
-
activeIndex={activeIndex}
|
|
230
|
-
onJump={setActiveIndex}
|
|
231
|
-
labels={['Lists', 'Groceries', 'Errands', 'Work']}
|
|
232
|
-
aria-label="Task lists"
|
|
233
|
-
/>
|
|
234
|
-
);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const meta = {
|
|
238
|
-
title: 'Components/SwipableMobileCarousel',
|
|
239
|
-
component: SwipableMobileCarousel,
|
|
240
|
-
parameters: {
|
|
241
|
-
layout: 'padded',
|
|
242
|
-
docs: {
|
|
243
|
-
description: {
|
|
244
|
-
component:
|
|
245
|
-
"A compound component for swiping between full-width slides (each an independent route/view on mobile), wrapping useSnapCarousel. Owns rendering and mount-window mechanics only — it has no opinion on where slide data lives. Do NOT aggregate cross-slide data or mount a detail overlay (Sheet, Dialog) inside a Slide's children; see docs/design-system.md's carousel section.",
|
|
246
|
-
},
|
|
247
|
-
},
|
|
248
|
-
},
|
|
249
|
-
// Every story below supplies its own render(), which is stateful (activeIndex
|
|
250
|
-
// lives in useState) — these args only satisfy the required-prop typing.
|
|
251
|
-
args: {
|
|
252
|
-
activeIndex: 0,
|
|
253
|
-
onSettle: () => {},
|
|
254
|
-
'aria-label': 'Task lists',
|
|
255
|
-
children: null,
|
|
256
|
-
},
|
|
257
|
-
} satisfies Meta<typeof SwipableMobileCarousel>;
|
|
258
|
-
|
|
259
|
-
export default meta;
|
|
260
|
-
type Story = StoryObj<typeof meta>;
|
|
261
|
-
|
|
262
|
-
export const Default: Story = { render: () => <DefaultDemo /> };
|
|
263
|
-
|
|
264
|
-
export const LazyLoadingBody: Story = {
|
|
265
|
-
render: () => <LazyLoadingBodyDemo />,
|
|
266
|
-
parameters: {
|
|
267
|
-
docs: {
|
|
268
|
-
description: {
|
|
269
|
-
story:
|
|
270
|
-
'Swipe to a new slide — its title renders immediately from already-known metadata, while only the Body region shows a brief loading placeholder for its simulated 1.2s fetch. This is the fix for the "whole slide blanks out, title included, until its own fetch resolves" bug.',
|
|
271
|
-
},
|
|
272
|
-
},
|
|
273
|
-
},
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
export const CustomIndicator: Story = { render: () => <CustomIndicatorDemo /> };
|
|
277
|
-
|
|
278
|
-
export const NoIndicator: Story = { render: () => <NoIndicatorDemo /> };
|
|
279
|
-
|
|
280
|
-
export const WithFooter: Story = { render: () => <FooterDemo /> };
|
|
281
|
-
|
|
282
|
-
export const MobileViewport: Story = {
|
|
283
|
-
render: () => <DefaultDemo />,
|
|
284
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
// ---------------------------------------------------------------------------
|
|
288
|
-
// SwipableMobileCarouselDots — standalone, also this carousel's default
|
|
289
|
-
// indicator. Grouped in this file rather than its own (Table's sub-parts
|
|
290
|
-
// share one story file too), though it has its own component subfolder and
|
|
291
|
-
// barrel export for independent reuse.
|
|
292
|
-
// ---------------------------------------------------------------------------
|
|
293
|
-
|
|
294
|
-
export const DotsStandalone: Story = {
|
|
295
|
-
render: () => <DotsStandaloneDemo />,
|
|
296
|
-
parameters: {
|
|
297
|
-
docs: {
|
|
298
|
-
description: {
|
|
299
|
-
story:
|
|
300
|
-
'SwipableMobileCarouselDots used on its own, outside a carousel — a real role="tablist"/role="tab" component (tappable, labeled, focusable), unlike the aria-hidden decorative dots both sovereign-tasks and sovereign-shopper currently hand-roll.',
|
|
301
|
-
},
|
|
302
|
-
},
|
|
303
|
-
},
|
|
304
|
-
};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { Textarea } from '../components/Textarea/Textarea';
|
|
3
|
-
|
|
4
|
-
// Wrap in a label so a11y checks pass (Textarea is a bare <textarea> — no
|
|
5
|
-
// built-in label association).
|
|
6
|
-
function Labeled({ label, ...props }: React.ComponentProps<typeof Textarea> & { label: string }) {
|
|
7
|
-
return (
|
|
8
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 6, width: 280 }}>
|
|
9
|
-
<label
|
|
10
|
-
htmlFor="sb-textarea"
|
|
11
|
-
style={{ fontSize: 14, color: 'var(--sv-color-text-primary)', fontFamily: 'system-ui' }}
|
|
12
|
-
>
|
|
13
|
-
{label}
|
|
14
|
-
</label>
|
|
15
|
-
<Textarea id="sb-textarea" {...props} />
|
|
16
|
-
</div>
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const meta = {
|
|
21
|
-
title: 'Components/Textarea',
|
|
22
|
-
component: Textarea,
|
|
23
|
-
parameters: {
|
|
24
|
-
layout: 'centered',
|
|
25
|
-
docs: {
|
|
26
|
-
description: {
|
|
27
|
-
component:
|
|
28
|
-
'The primitive multi-line text field. RSC-safe; forwards all native `<textarea>` props. No label is built-in — always pair with a `<label>` (or `FormField`) for accessibility.',
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
} satisfies Meta<typeof Textarea>;
|
|
33
|
-
|
|
34
|
-
export default meta;
|
|
35
|
-
type Story = StoryObj<typeof meta>;
|
|
36
|
-
|
|
37
|
-
export const Default: Story = {
|
|
38
|
-
render: (_args) => <Labeled label="Description" placeholder="Add a description…" />,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export const WithValue: Story = {
|
|
42
|
-
render: (_args) => <Labeled label="Notes" defaultValue="Follow up next week." />,
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export const CustomRows: Story = {
|
|
46
|
-
render: (_args) => <Labeled label="Message" rows={8} placeholder="Write your message…" />,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export const Disabled: Story = {
|
|
50
|
-
render: (_args) => <Labeled label="Read-only field" defaultValue="Cannot be changed" disabled />,
|
|
51
|
-
};
|