@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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* Hanken Grotesk, the Sovereign typeface, shipped with the design system so that no instance has to supply it and
|
|
2
|
+
none has to ask another site for it (a page that loads its font from a third party tells that party who is reading).
|
|
3
|
+
One variable file for each script, weights 100 to 900, chosen by the browser from the characters on the page.
|
|
4
|
+
The files and their licence (SIL Open Font License 1.1) are in ../fonts; the family is named as the
|
|
5
|
+
`--sv-font-family` token names it, so a component never has to know where the font comes from.
|
|
6
|
+
Fontsource's build of the Google Fonts release, https://fontsource.org/fonts/hanken-grotesk. */
|
|
7
|
+
|
|
8
|
+
/* hanken-grotesk-cyrillic-ext-wght-normal */
|
|
9
|
+
@font-face {
|
|
10
|
+
font-family: 'Hanken Grotesk';
|
|
11
|
+
font-style: normal;
|
|
12
|
+
font-display: swap;
|
|
13
|
+
font-weight: 100 900;
|
|
14
|
+
src: url(../fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2) format('woff2-variations');
|
|
15
|
+
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* hanken-grotesk-vietnamese-wght-normal */
|
|
19
|
+
@font-face {
|
|
20
|
+
font-family: 'Hanken Grotesk';
|
|
21
|
+
font-style: normal;
|
|
22
|
+
font-display: swap;
|
|
23
|
+
font-weight: 100 900;
|
|
24
|
+
src: url(../fonts/hanken-grotesk-vietnamese-wght-normal.woff2) format('woff2-variations');
|
|
25
|
+
unicode-range:
|
|
26
|
+
U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301,
|
|
27
|
+
U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* hanken-grotesk-latin-ext-wght-normal */
|
|
31
|
+
@font-face {
|
|
32
|
+
font-family: 'Hanken Grotesk';
|
|
33
|
+
font-style: normal;
|
|
34
|
+
font-display: swap;
|
|
35
|
+
font-weight: 100 900;
|
|
36
|
+
src: url(../fonts/hanken-grotesk-latin-ext-wght-normal.woff2) format('woff2-variations');
|
|
37
|
+
unicode-range:
|
|
38
|
+
U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329,
|
|
39
|
+
U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
|
|
40
|
+
U+A720-A7FF;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* hanken-grotesk-latin-wght-normal */
|
|
44
|
+
@font-face {
|
|
45
|
+
font-family: 'Hanken Grotesk';
|
|
46
|
+
font-style: normal;
|
|
47
|
+
font-display: swap;
|
|
48
|
+
font-weight: 100 900;
|
|
49
|
+
src: url(../fonts/hanken-grotesk-latin-wght-normal.woff2) format('woff2-variations');
|
|
50
|
+
unicode-range:
|
|
51
|
+
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329,
|
|
52
|
+
U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
|
53
|
+
}
|
|
@@ -56,14 +56,16 @@
|
|
|
56
56
|
--sv-space-16: 4rem;
|
|
57
57
|
|
|
58
58
|
/* Typography
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
The Sovereign typeface is Hanken Grotesk, bundled with the design system (fonts.css, loaded by tokens.css),
|
|
60
|
+
with JetBrains Mono for code and identifiers, which an instance may supply. Every component takes its
|
|
61
|
+
family from these tokens and nothing else (`pnpm design:tokens:check`), so the typeface is the same
|
|
62
|
+
wherever the design system is used; the stack after it applies only while the font loads. */
|
|
62
63
|
--sv-font-family:
|
|
63
64
|
'Hanken Grotesk', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial,
|
|
64
65
|
sans-serif;
|
|
65
66
|
--sv-font-family-mono:
|
|
66
67
|
'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
68
|
+
--sv-font-size-2xs: 0.625rem; /* 10px — smallest badge size (Badge size="xs") */
|
|
67
69
|
--sv-font-size-label: 0.6875rem; /* 11px — all-caps section labels */
|
|
68
70
|
--sv-font-size-xs: 0.75rem; /* 12px — mono identifiers */
|
|
69
71
|
--sv-font-size-caption: 0.8125rem; /* 13px — secondary / supporting copy */
|
|
@@ -72,17 +74,21 @@
|
|
|
72
74
|
--sv-font-size-lg: 1.125rem; /* 18px */
|
|
73
75
|
--sv-font-size-xl: 1.25rem; /* 20px */
|
|
74
76
|
--sv-font-size-2xl: 1.5rem; /* 24px */
|
|
77
|
+
--sv-font-size-3xl: 2rem; /* 32px — document title style (RichTextEditor "Title" paragraph style). A
|
|
78
|
+
modest step above 2xl reads too close to Heading 1 at a glance (both
|
|
79
|
+
bold, only 4px apart) — this keeps roughly the same ~1.3x jump Google
|
|
80
|
+
Docs itself uses between its own Title and Heading 1 sizes. */
|
|
75
81
|
--sv-font-weight-regular: 400;
|
|
76
82
|
--sv-font-weight-medium: 500;
|
|
77
83
|
--sv-font-weight-semibold: 600;
|
|
78
84
|
--sv-font-weight-bold: 700;
|
|
79
85
|
|
|
80
|
-
/* In-app text-size control
|
|
81
|
-
accessibility debt
|
|
86
|
+
/* In-app text-size control, discharging the pinch-zoom-disabled
|
|
87
|
+
accessibility debt of an app that sets userScalable: false.
|
|
82
88
|
Every --sv-font-size-* above is rem-based, so scaling the root font size
|
|
83
89
|
scales the whole type system with no per-component changes. Driven by
|
|
84
|
-
[data-text-size] on <html>, set pre-paint by
|
|
85
|
-
|
|
90
|
+
[data-text-size] on <html>, set pre-paint by the app — same mechanism as
|
|
91
|
+
[data-theme]. Like
|
|
86
92
|
--sv-radius-scale, this is a theme-stable scale token with no separate
|
|
87
93
|
semantic tier. */
|
|
88
94
|
--sv-text-size-scale: 1;
|
|
@@ -94,11 +100,10 @@
|
|
|
94
100
|
--sv-icon-size-lg: 1.5rem; /* 24px — prominent / standalone */
|
|
95
101
|
|
|
96
102
|
/* Border radii (v3.1 spec values). --sv-radius-scale is the one
|
|
97
|
-
instance-controllable exception to "scale tokens are theme-stable"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
Every corner token below is proportional to it, so a plugin author never
|
|
103
|
+
instance-controllable exception to "scale tokens are theme-stable" —
|
|
104
|
+
an operator's corner-radius preset (None/XS/S/M/L) overrides it at
|
|
105
|
+
:root, same pipeline as --sv-color-accent.
|
|
106
|
+
Every corner token below is proportional to it, so an app author never
|
|
102
107
|
references --sv-radius-scale directly — they keep using --sv-radius-sm
|
|
103
108
|
etc. exactly as before. --sv-radius-full is deliberately NOT derived
|
|
104
109
|
from the scale: it's a shape token (circle/pill), not a corner-rounding
|
|
@@ -116,6 +121,12 @@
|
|
|
116
121
|
); /* 20px @ scale 1 — bottom sheet (Drawer top corners) */
|
|
117
122
|
--sv-radius-full: 9999px; /* pill / avatar — unaffected by --sv-radius-scale */
|
|
118
123
|
|
|
124
|
+
/* Border width (RFC 0094). Theme-stable like the other scale tokens above —
|
|
125
|
+
a theme preset can override it (e.g. neobrutalism's thicker outline), but
|
|
126
|
+
it has no separate semantic tier. Every component references this by
|
|
127
|
+
name instead of a literal `1px`, the way --sv-radius-* etc. do. */
|
|
128
|
+
--sv-border-width-hairline: 1px;
|
|
129
|
+
|
|
119
130
|
/* Touch targets — minimum hit-area dimension for interactive controls.
|
|
120
131
|
44px follows the WCAG 2.5.5 / Apple HIG / Material guideline for reliable
|
|
121
132
|
touch without a pointing device. Applied to icon-only controls on mobile
|
package/dist/tokens/semantic.css
CHANGED
|
@@ -19,6 +19,17 @@
|
|
|
19
19
|
--sv-color-text-muted: var(--sv-grey-500);
|
|
20
20
|
--sv-color-text-subtle: var(--sv-grey-400);
|
|
21
21
|
--sv-color-text-on-accent: var(--sv-white);
|
|
22
|
+
/* Guaranteed-contrast text pair for content painted directly on a
|
|
23
|
+
plugin-supplied literal background colour (data, not a design-system
|
|
24
|
+
token — e.g. a kanban board's own canvas colour). A consumer picks
|
|
25
|
+
whichever member actually contrasts with its own literal background;
|
|
26
|
+
neither can be theme-reactive the way --sv-color-text-primary is,
|
|
27
|
+
since the background itself doesn't react to the app's theme either.
|
|
28
|
+
Intentionally NOT overridden under [data-theme='dark'] below — same
|
|
29
|
+
"reads the same regardless of overall page theme" reasoning as
|
|
30
|
+
--sv-color-text-on-error/-success. */
|
|
31
|
+
--sv-color-text-on-light-fill: var(--sv-grey-950);
|
|
32
|
+
--sv-color-text-on-dark-fill: var(--sv-grey-50);
|
|
22
33
|
|
|
23
34
|
--sv-color-border: var(--sv-grey-200);
|
|
24
35
|
--sv-color-border-strong: var(--sv-grey-300);
|
|
@@ -68,6 +79,14 @@
|
|
|
68
79
|
elevation shadow. Composed rgba layers, like --sv-shadow-card. */
|
|
69
80
|
--sv-color-scrim: rgba(0, 0, 0, 0.5);
|
|
70
81
|
|
|
82
|
+
/* High-contrast shadow colour (RFC 0094). Distinct from --sv-color-border-strong
|
|
83
|
+
even though they resolve to the same monochrome scale — a theme preset's
|
|
84
|
+
hard offset shadows (e.g. neobrutalism) need a bolder, more saturated value
|
|
85
|
+
than a border does to read as "authentic," so this is its own token rather
|
|
86
|
+
than reusing border-strong. Unused by the default theme's soft rgba()
|
|
87
|
+
shadows above; only a preset that opts in (theme-presets.ts) references it. */
|
|
88
|
+
--sv-color-shadow-strong: var(--sv-grey-950);
|
|
89
|
+
|
|
71
90
|
--sv-shadow-card: 0 1px 2px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
72
91
|
--sv-shadow-hover: 0 2px 6px rgba(0, 0, 0, 0.08); /* e1 — card hover lift */
|
|
73
92
|
--sv-shadow-popover:
|
|
@@ -75,6 +94,17 @@
|
|
|
75
94
|
--sv-shadow-overlay: 0 10px 38px rgba(0, 0, 0, 0.18), 0 6px 12px rgba(0, 0, 0, 0.12);
|
|
76
95
|
--sv-shadow-control: 0 1px 3px rgba(0, 0, 0, 0.2); /* small interactive-control shadows, e.g. Toggle thumb */
|
|
77
96
|
|
|
97
|
+
/* Button press-interaction tokens (RFC 0094). Consumed unconditionally by
|
|
98
|
+
Button.module.css's :active rule — these defaults (none/0/0) make that
|
|
99
|
+
rule a no-op for today's default look. A theme preset (e.g.
|
|
100
|
+
neobrutalism) sets non-zero values to get a tactile "press into shadow"
|
|
101
|
+
effect. Not overridden under [data-theme='dark'] below — like the
|
|
102
|
+
shadow tokens above, a theme preset's own light/dark variants set these
|
|
103
|
+
directly rather than this file deriving a dark-mode default for them. */
|
|
104
|
+
--sv-button-shadow: none;
|
|
105
|
+
--sv-button-press-x: 0;
|
|
106
|
+
--sv-button-press-y: 0;
|
|
107
|
+
|
|
78
108
|
/*
|
|
79
109
|
* Instance identity tokens (RFC 0027 / RFC 0032 rename). Distinct namespace from --sv-color-*:
|
|
80
110
|
* these hold URLs (not colours) and are set once by the operator, not swapped
|
|
@@ -122,6 +152,8 @@
|
|
|
122
152
|
|
|
123
153
|
--sv-color-scrim: rgba(0, 0, 0, 0.65);
|
|
124
154
|
|
|
155
|
+
--sv-color-shadow-strong: var(--sv-grey-50);
|
|
156
|
+
|
|
125
157
|
--sv-shadow-card: 0 1px 2px rgba(0, 0, 0, 0.4), 0 1px 3px rgba(0, 0, 0, 0.5);
|
|
126
158
|
--sv-shadow-hover: 0 2px 6px rgba(0, 0, 0, 0.3);
|
|
127
159
|
--sv-shadow-popover: 0 4px 16px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Generated by scripts/generate-theme-presets-css.ts — do not edit.
|
|
3
|
+
* Source of truth: packages/ui/src/tokens/theme-presets.ts
|
|
4
|
+
*
|
|
5
|
+
* For Storybook / standalone (non-runtime) use only — set data-theme-preset
|
|
6
|
+
* on the document root element (<html>), never a nested wrapper. See the
|
|
7
|
+
* generator script's doc comment for why.
|
|
8
|
+
*/
|
|
9
|
+
[data-theme-preset='neobrutalism'] {
|
|
10
|
+
--sv-radius-scale: 0;
|
|
11
|
+
--sv-border-width-hairline: 2px;
|
|
12
|
+
--sv-shadow-card: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
13
|
+
--sv-shadow-hover: 6px 6px 0 0 var(--sv-color-shadow-strong);
|
|
14
|
+
--sv-shadow-popover: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
15
|
+
--sv-shadow-overlay: 8px 8px 0 0 var(--sv-color-shadow-strong);
|
|
16
|
+
--sv-shadow-control: 2px 2px 0 0 var(--sv-color-shadow-strong);
|
|
17
|
+
--sv-button-shadow: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
18
|
+
--sv-button-press-x: 4px;
|
|
19
|
+
--sv-button-press-y: 4px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
[data-theme-preset='neobrutalism'][data-theme='dark'] {
|
|
23
|
+
--sv-radius-scale: 0;
|
|
24
|
+
--sv-border-width-hairline: 2px;
|
|
25
|
+
--sv-shadow-card: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
26
|
+
--sv-shadow-hover: 6px 6px 0 0 var(--sv-color-shadow-strong);
|
|
27
|
+
--sv-shadow-popover: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
28
|
+
--sv-shadow-overlay: 8px 8px 0 0 var(--sv-color-shadow-strong);
|
|
29
|
+
--sv-shadow-control: 2px 2px 0 0 var(--sv-color-shadow-strong);
|
|
30
|
+
--sv-button-shadow: 4px 4px 0 0 var(--sv-color-shadow-strong);
|
|
31
|
+
--sv-button-press-x: 4px;
|
|
32
|
+
--sv-button-press-y: 4px;
|
|
33
|
+
}
|
package/dist/tokens.css
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
/* Convenience entry that loads both token tiers. The runtime shell imports this
|
|
1
|
+
/* Convenience entry that loads the typeface and both token tiers. The runtime shell imports this
|
|
2
2
|
* once so --sv-* variables are available globally (primitives first, then the
|
|
3
3
|
* semantic layer that maps them). */
|
|
4
|
+
@import './tokens/fonts.css';
|
|
4
5
|
@import './tokens/primitives.css';
|
|
5
6
|
@import './tokens/semantic.css';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sovereignfs/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.89.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Sovereign Design System — design tokens and React components.",
|
|
6
6
|
"keywords": [
|
|
@@ -10,10 +10,22 @@
|
|
|
10
10
|
"components",
|
|
11
11
|
"css-modules",
|
|
12
12
|
"tokens",
|
|
13
|
-
"
|
|
13
|
+
"app",
|
|
14
14
|
"self-hosted"
|
|
15
15
|
],
|
|
16
|
-
"license": "
|
|
16
|
+
"license": "MPL-2.0",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/sovereignfs/sovereign.git",
|
|
20
|
+
"directory": "packages/ui"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/sovereignfs/sovereign/tree/main/packages/ui#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/sovereignfs/sovereign/issues"
|
|
25
|
+
},
|
|
26
|
+
"sideEffects": [
|
|
27
|
+
"**/*.css"
|
|
28
|
+
],
|
|
17
29
|
"publishConfig": {
|
|
18
30
|
"access": "public"
|
|
19
31
|
},
|
|
@@ -24,32 +36,47 @@
|
|
|
24
36
|
},
|
|
25
37
|
"./tokens.css": "./dist/tokens.css",
|
|
26
38
|
"./tokens/primitives.css": "./dist/tokens/primitives.css",
|
|
27
|
-
"./tokens/semantic.css": "./dist/tokens/semantic.css"
|
|
39
|
+
"./tokens/semantic.css": "./dist/tokens/semantic.css",
|
|
40
|
+
"./tokens/theme-presets.css": "./dist/tokens/theme-presets.css"
|
|
28
41
|
},
|
|
29
42
|
"files": [
|
|
30
43
|
"dist",
|
|
31
|
-
"
|
|
32
|
-
"NOTICE"
|
|
44
|
+
"LICENSE",
|
|
45
|
+
"NOTICE",
|
|
46
|
+
"README.md"
|
|
33
47
|
],
|
|
34
48
|
"peerDependencies": {
|
|
49
|
+
"@dnd-kit/core": "^6.3.1",
|
|
50
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
35
51
|
"react": "^19.0.0",
|
|
36
52
|
"react-dom": "^19.0.0"
|
|
37
53
|
},
|
|
54
|
+
"peerDependenciesMeta": {
|
|
55
|
+
"@dnd-kit/core": {
|
|
56
|
+
"optional": true
|
|
57
|
+
},
|
|
58
|
+
"@dnd-kit/sortable": {
|
|
59
|
+
"optional": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
38
62
|
"devDependencies": {
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"@
|
|
42
|
-
"@
|
|
63
|
+
"@dnd-kit/core": "^6.3.1",
|
|
64
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
65
|
+
"@playwright/test": "^1.64.0",
|
|
66
|
+
"@sovereignfs/tsconfig": "0.0.0",
|
|
67
|
+
"@storybook/addon-a11y": "^10.6.0",
|
|
68
|
+
"@storybook/addon-themes": "^10.6.0",
|
|
69
|
+
"@storybook/react-vite": "^10.6.0",
|
|
43
70
|
"@testing-library/dom": "^10.4.1",
|
|
44
|
-
"@testing-library/react": "^16.3.
|
|
45
|
-
"@types/
|
|
46
|
-
"@types/react
|
|
47
|
-
"react": "^19.
|
|
48
|
-
"react
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
71
|
+
"@testing-library/react": "^16.3.3",
|
|
72
|
+
"@types/node": "^24.19.2",
|
|
73
|
+
"@types/react": "^19.3.0",
|
|
74
|
+
"@types/react-dom": "^19.3.0",
|
|
75
|
+
"react": "^19.3.1",
|
|
76
|
+
"react-dom": "^19.3.1",
|
|
77
|
+
"storybook": "^10.6.0",
|
|
78
|
+
"tsup": "^9.0.0",
|
|
79
|
+
"typescript": "~6.0.3"
|
|
53
80
|
},
|
|
54
81
|
"scripts": {
|
|
55
82
|
"build": "tsup",
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { act, cleanup, render } from '@testing-library/react';
|
|
4
|
-
import { useMountTransition, usePrefersReducedMotion } from '../motion';
|
|
5
|
-
|
|
6
|
-
let matches = false;
|
|
7
|
-
function installMatchMedia() {
|
|
8
|
-
vi.stubGlobal(
|
|
9
|
-
'matchMedia',
|
|
10
|
-
vi.fn().mockImplementation((query: string) => ({
|
|
11
|
-
matches,
|
|
12
|
-
media: query,
|
|
13
|
-
addEventListener: vi.fn(),
|
|
14
|
-
removeEventListener: vi.fn(),
|
|
15
|
-
addListener: vi.fn(),
|
|
16
|
-
removeListener: vi.fn(),
|
|
17
|
-
dispatchEvent: vi.fn(),
|
|
18
|
-
})),
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function MountTransitionHarness({ open, durationMs }: { open: boolean; durationMs: number }) {
|
|
23
|
-
const { mounted, phase } = useMountTransition(open, durationMs);
|
|
24
|
-
return <span data-testid="out">{mounted ? phase : 'unmounted'}</span>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
describe('useMountTransition', () => {
|
|
28
|
-
beforeEach(() => vi.useFakeTimers());
|
|
29
|
-
afterEach(() => {
|
|
30
|
-
vi.useRealTimers();
|
|
31
|
-
cleanup();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('animates the entrance even on a fresh mount that starts open (e.g. a route-driven overlay)', () => {
|
|
35
|
-
const { getByTestId } = render(<MountTransitionHarness open durationMs={250} />);
|
|
36
|
-
// Renders 'entering' first — the closed-position styles — so the CSS
|
|
37
|
-
// transition has somewhere to animate from; the effect below flips it to
|
|
38
|
-
// 'open' one frame later, same as a prop-driven open transition would.
|
|
39
|
-
expect(getByTestId('out').textContent).toBe('entering');
|
|
40
|
-
act(() => void vi.advanceTimersByTime(16)); // flush the requestAnimationFrame callback
|
|
41
|
-
expect(getByTestId('out').textContent).toBe('open');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('starts unmounted when closed from the first render', () => {
|
|
45
|
-
const { getByTestId } = render(<MountTransitionHarness open={false} durationMs={250} />);
|
|
46
|
-
expect(getByTestId('out').textContent).toBe('unmounted');
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('animates entrance: entering on the same frame, open one frame later', () => {
|
|
50
|
-
const { getByTestId, rerender } = render(
|
|
51
|
-
<MountTransitionHarness open={false} durationMs={250} />,
|
|
52
|
-
);
|
|
53
|
-
rerender(<MountTransitionHarness open durationMs={250} />);
|
|
54
|
-
expect(getByTestId('out').textContent).toBe('entering');
|
|
55
|
-
act(() => {
|
|
56
|
-
vi.advanceTimersByTime(16); // flush the requestAnimationFrame callback
|
|
57
|
-
});
|
|
58
|
-
expect(getByTestId('out').textContent).toBe('open');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('stays mounted through "closing" for durationMs, then unmounts', () => {
|
|
62
|
-
const { getByTestId, rerender } = render(<MountTransitionHarness open durationMs={250} />);
|
|
63
|
-
rerender(<MountTransitionHarness open={false} durationMs={250} />);
|
|
64
|
-
// Still mounted immediately after `open` flips false — this is the whole
|
|
65
|
-
// point: the exit transition needs to actually play, not jump-cut.
|
|
66
|
-
expect(getByTestId('out').textContent).toBe('closing');
|
|
67
|
-
act(() => void vi.advanceTimersByTime(249));
|
|
68
|
-
expect(getByTestId('out').textContent).toBe('closing');
|
|
69
|
-
act(() => void vi.advanceTimersByTime(1));
|
|
70
|
-
expect(getByTestId('out').textContent).toBe('unmounted');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('honours a near-zero durationMs (the reduced-motion path)', () => {
|
|
74
|
-
const { getByTestId, rerender } = render(<MountTransitionHarness open durationMs={0} />);
|
|
75
|
-
rerender(<MountTransitionHarness open={false} durationMs={0} />);
|
|
76
|
-
act(() => void vi.advanceTimersByTime(0));
|
|
77
|
-
expect(getByTestId('out').textContent).toBe('unmounted');
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
function ReducedMotionHarness() {
|
|
82
|
-
const reduced = usePrefersReducedMotion();
|
|
83
|
-
return <span data-testid="out">{String(reduced)}</span>;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
describe('usePrefersReducedMotion', () => {
|
|
87
|
-
afterEach(() => {
|
|
88
|
-
vi.unstubAllGlobals();
|
|
89
|
-
cleanup();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('defaults to false and reflects a true matchMedia result after mount', () => {
|
|
93
|
-
matches = true;
|
|
94
|
-
installMatchMedia();
|
|
95
|
-
const { getByTestId } = render(<ReducedMotionHarness />);
|
|
96
|
-
expect(getByTestId('out').textContent).toBe('true');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('reflects a false matchMedia result', () => {
|
|
100
|
-
matches = false;
|
|
101
|
-
installMatchMedia();
|
|
102
|
-
const { getByTestId } = render(<ReducedMotionHarness />);
|
|
103
|
-
expect(getByTestId('out').textContent).toBe('false');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { useState } from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
-
import { expect, userEvent, within } from 'storybook/test';
|
|
4
|
-
import { Accordion } from './Accordion';
|
|
5
|
-
|
|
6
|
-
const meta = {
|
|
7
|
-
title: 'Components/Accordion',
|
|
8
|
-
component: Accordion,
|
|
9
|
-
parameters: {
|
|
10
|
-
layout: 'padded',
|
|
11
|
-
docs: {
|
|
12
|
-
description: {
|
|
13
|
-
component:
|
|
14
|
-
'One or more Collapsible sections. type="single" closes other sections when one opens; type="multiple" allows any number open at once.',
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
args: { items: [], type: 'single', openIds: [], onOpenIdsChange: () => {} },
|
|
19
|
-
} satisfies Meta<typeof Accordion>;
|
|
20
|
-
|
|
21
|
-
export default meta;
|
|
22
|
-
type Story = StoryObj<typeof meta>;
|
|
23
|
-
|
|
24
|
-
// ---------------------------------------------------------------------------
|
|
25
|
-
|
|
26
|
-
const FAQ_ITEMS = [
|
|
27
|
-
{
|
|
28
|
-
id: 'plugins',
|
|
29
|
-
trigger: 'What plugins ship by default?',
|
|
30
|
-
content: 'Only the platform plugins (Console, Launcher, Account) plus Sovereign Tasks.',
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
id: 'hosting',
|
|
34
|
-
trigger: 'Can I self-host this?',
|
|
35
|
-
content: 'Yes — Sovereign is designed to be self-hosted via Docker Compose.',
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: 'pricing',
|
|
39
|
-
trigger: 'Is it free?',
|
|
40
|
-
content: 'The platform is open source. Individual plugins may have their own pricing.',
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
export const Default: Story = {
|
|
45
|
-
render: () => {
|
|
46
|
-
const [openIds, setOpenIds] = useState<string[]>(['plugins']);
|
|
47
|
-
return (
|
|
48
|
-
<Accordion items={FAQ_ITEMS} type="single" openIds={openIds} onOpenIdsChange={setOpenIds} />
|
|
49
|
-
);
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export const MultipleOpen: Story = {
|
|
54
|
-
render: () => {
|
|
55
|
-
const [openIds, setOpenIds] = useState<string[]>(['plugins', 'hosting']);
|
|
56
|
-
return (
|
|
57
|
-
<Accordion items={FAQ_ITEMS} type="multiple" openIds={openIds} onOpenIdsChange={setOpenIds} />
|
|
58
|
-
);
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export const LongContent: Story = {
|
|
63
|
-
render: () => {
|
|
64
|
-
const [openIds, setOpenIds] = useState<string[]>(['changelog']);
|
|
65
|
-
return (
|
|
66
|
-
<Accordion
|
|
67
|
-
items={[
|
|
68
|
-
{
|
|
69
|
-
id: 'changelog',
|
|
70
|
-
trigger: 'Full changelog',
|
|
71
|
-
content: (
|
|
72
|
-
<ul style={{ margin: 0, paddingLeft: 20 }}>
|
|
73
|
-
<li>Added component sizing alignment across the design system</li>
|
|
74
|
-
<li>Added RadioGroup, Slider, Progress, Table, Alert primitives</li>
|
|
75
|
-
<li>Added Breadcrumb, Pagination, and Kbd primitives</li>
|
|
76
|
-
<li>Added Accordion and Collapsible primitives</li>
|
|
77
|
-
</ul>
|
|
78
|
-
),
|
|
79
|
-
},
|
|
80
|
-
]}
|
|
81
|
-
type="single"
|
|
82
|
-
openIds={openIds}
|
|
83
|
-
onOpenIdsChange={setOpenIds}
|
|
84
|
-
/>
|
|
85
|
-
);
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
export const KeyboardInteraction: Story = {
|
|
90
|
-
render: () => {
|
|
91
|
-
const [openIds, setOpenIds] = useState<string[]>([]);
|
|
92
|
-
return (
|
|
93
|
-
<Accordion items={FAQ_ITEMS} type="single" openIds={openIds} onOpenIdsChange={setOpenIds} />
|
|
94
|
-
);
|
|
95
|
-
},
|
|
96
|
-
play: async ({ canvasElement }) => {
|
|
97
|
-
const canvas = within(canvasElement);
|
|
98
|
-
const trigger = canvas.getByRole('button', { name: 'What plugins ship by default?' });
|
|
99
|
-
|
|
100
|
-
await expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
101
|
-
|
|
102
|
-
trigger.focus();
|
|
103
|
-
await userEvent.keyboard('{Enter}');
|
|
104
|
-
await expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
105
|
-
await expect(canvas.getByText(/Only the platform plugins/)).toBeVisible();
|
|
106
|
-
|
|
107
|
-
await userEvent.keyboard(' ');
|
|
108
|
-
await expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
109
|
-
},
|
|
110
|
-
};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import { Collapsible } from '../Collapsible/Collapsible';
|
|
3
|
-
import styles from './Accordion.module.css';
|
|
4
|
-
|
|
5
|
-
export interface AccordionItem {
|
|
6
|
-
id: string;
|
|
7
|
-
trigger: ReactNode;
|
|
8
|
-
content: ReactNode;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface AccordionProps {
|
|
12
|
-
items: AccordionItem[];
|
|
13
|
-
/** `single` closes other sections when one opens. `multiple` allows any
|
|
14
|
-
* number of sections open at once. */
|
|
15
|
-
type: 'single' | 'multiple';
|
|
16
|
-
openIds: string[];
|
|
17
|
-
onOpenIdsChange: (openIds: string[]) => void;
|
|
18
|
-
className?: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Accordion — one or more `Collapsible` sections.
|
|
23
|
-
*
|
|
24
|
-
* Keyboard support (Enter/Space toggles the focused trigger) comes from
|
|
25
|
-
* `Collapsible`'s real `<button>` — no arrow-key roving-tabindex handling
|
|
26
|
-
* here, since accordion sections aren't a roving-tabindex widget per the
|
|
27
|
-
* WAI-ARIA accordion pattern (each trigger is independently Tab-focusable).
|
|
28
|
-
*/
|
|
29
|
-
export function Accordion({ items, type, openIds, onOpenIdsChange, className }: AccordionProps) {
|
|
30
|
-
function handleOpenChange(id: string, open: boolean) {
|
|
31
|
-
if (type === 'single') {
|
|
32
|
-
onOpenIdsChange(open ? [id] : []);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
onOpenIdsChange(open ? [...openIds, id] : openIds.filter((openId) => openId !== id));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<div className={[styles.root, className].filter(Boolean).join(' ')}>
|
|
40
|
-
{items.map((item) => (
|
|
41
|
-
<Collapsible
|
|
42
|
-
key={item.id}
|
|
43
|
-
id={item.id}
|
|
44
|
-
trigger={item.trigger}
|
|
45
|
-
open={openIds.includes(item.id)}
|
|
46
|
-
onOpenChange={(open) => handleOpenChange(item.id, open)}
|
|
47
|
-
>
|
|
48
|
-
{item.content}
|
|
49
|
-
</Collapsible>
|
|
50
|
-
))}
|
|
51
|
-
</div>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { cleanup, render, screen, fireEvent } from '@testing-library/react';
|
|
4
|
-
import { Accordion } from '../Accordion';
|
|
5
|
-
|
|
6
|
-
afterEach(cleanup);
|
|
7
|
-
|
|
8
|
-
const items = [
|
|
9
|
-
{ id: 'a', trigger: 'Section A', content: 'Content A' },
|
|
10
|
-
{ id: 'b', trigger: 'Section B', content: 'Content B' },
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
describe('Accordion', () => {
|
|
14
|
-
it('renders a trigger button per item', () => {
|
|
15
|
-
render(<Accordion items={items} type="single" openIds={[]} onOpenIdsChange={() => {}} />);
|
|
16
|
-
expect(screen.getByRole('button', { name: 'Section A' })).toBeDefined();
|
|
17
|
-
expect(screen.getByRole('button', { name: 'Section B' })).toBeDefined();
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it('type="single": opening one section replaces the open set entirely', () => {
|
|
21
|
-
const onOpenIdsChange = vi.fn();
|
|
22
|
-
render(
|
|
23
|
-
<Accordion items={items} type="single" openIds={['a']} onOpenIdsChange={onOpenIdsChange} />,
|
|
24
|
-
);
|
|
25
|
-
fireEvent.click(screen.getByRole('button', { name: 'Section B' }));
|
|
26
|
-
expect(onOpenIdsChange).toHaveBeenCalledWith(['b']);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('type="multiple": opening a section adds to the open set', () => {
|
|
30
|
-
const onOpenIdsChange = vi.fn();
|
|
31
|
-
render(
|
|
32
|
-
<Accordion items={items} type="multiple" openIds={['a']} onOpenIdsChange={onOpenIdsChange} />,
|
|
33
|
-
);
|
|
34
|
-
fireEvent.click(screen.getByRole('button', { name: 'Section B' }));
|
|
35
|
-
expect(onOpenIdsChange).toHaveBeenCalledWith(['a', 'b']);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('type="multiple": closing an open section removes only that id', () => {
|
|
39
|
-
const onOpenIdsChange = vi.fn();
|
|
40
|
-
render(
|
|
41
|
-
<Accordion
|
|
42
|
-
items={items}
|
|
43
|
-
type="multiple"
|
|
44
|
-
openIds={['a', 'b']}
|
|
45
|
-
onOpenIdsChange={onOpenIdsChange}
|
|
46
|
-
/>,
|
|
47
|
-
);
|
|
48
|
-
fireEvent.click(screen.getByRole('button', { name: 'Section A' }));
|
|
49
|
-
expect(onOpenIdsChange).toHaveBeenCalledWith(['b']);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('reflects openIds via aria-expanded on each trigger', () => {
|
|
53
|
-
render(<Accordion items={items} type="single" openIds={['a']} onOpenIdsChange={() => {}} />);
|
|
54
|
-
expect(screen.getByRole('button', { name: 'Section A' }).getAttribute('aria-expanded')).toBe(
|
|
55
|
-
'true',
|
|
56
|
-
);
|
|
57
|
-
expect(screen.getByRole('button', { name: 'Section B' }).getAttribute('aria-expanded')).toBe(
|
|
58
|
-
'false',
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
});
|