@sovereignfs/ui 0.83.1 → 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/AppsLauncher.module.css +6 -0
- package/dist/Button.module.css +5 -0
- package/dist/Card.module.css +6 -0
- package/dist/CardTile.module.css +6 -0
- package/dist/CheckableListRow.module.css +8 -0
- package/dist/Checkbox.module.css +8 -0
- package/dist/CodeTextarea.module.css +6 -0
- package/dist/ColorPicker.module.css +6 -0
- package/dist/Combobox.module.css +6 -0
- package/dist/Command.module.css +6 -0
- package/dist/ConfirmDialog.module.css +6 -0
- package/dist/DatePicker.module.css +6 -0
- package/dist/Dialog.module.css +1 -1
- package/dist/DragHandleRow.module.css +6 -0
- package/dist/FileDropzone.module.css +25 -1
- package/dist/Header.module.css +6 -0
- package/dist/IconPicker.module.css +14 -4
- package/dist/Input.module.css +6 -0
- package/dist/LegalLinks.module.css +9 -2
- package/dist/Markdown.module.css +5 -0
- package/dist/Message.module.css +9 -0
- package/dist/MobileAppsDrawer.module.css +9 -5
- package/dist/MobileFooter.module.css +6 -0
- package/dist/NavList.module.css +11 -2
- package/dist/NavTabs.module.css +7 -1
- package/dist/NotificationsPanel.module.css +10 -0
- package/dist/QrCode.module.css +17 -0
- package/dist/QuantityStepper.module.css +4 -2
- package/dist/RadioGroup.module.css +6 -0
- package/dist/SegmentedControl.module.css +6 -0
- package/dist/Select.module.css +6 -0
- package/dist/Sheet.module.css +16 -1
- package/dist/SplitPane.module.css +1 -1
- package/dist/StepStrip.module.css +5 -3
- package/dist/SuggestionInput.module.css +12 -1
- package/dist/SwipableMobileCarouselDots.module.css +6 -0
- package/dist/SystemBanner.module.css +6 -0
- package/dist/Tabs.module.css +6 -0
- package/dist/TagInput.module.css +6 -0
- package/dist/Textarea.module.css +6 -0
- package/dist/Toast.module.css +5 -0
- package/dist/Toggle.module.css +7 -0
- package/dist/Tooltip.module.css +6 -0
- package/dist/UserMenu.module.css +5 -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 +121 -43
- package/dist/index.js +1410 -1152
- package/dist/tokens/fonts.css +53 -0
- package/dist/tokens/primitives.css +12 -12
- package/dist/tokens.css +2 -1
- package/package.json +24 -13
- package/src/__tests__/motion.test.tsx +0 -105
- package/src/__tests__/package-json.test.ts +0 -8
- 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/AppsLauncher/AppsLauncher.module.css +0 -96
- package/src/components/AppsLauncher/AppsLauncher.stories.tsx +0 -58
- package/src/components/AppsLauncher/AppsLauncher.tsx +0 -117
- package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +0 -52
- 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 -177
- package/src/components/Badge/Badge.stories.tsx +0 -238
- package/src/components/Badge/Badge.tsx +0 -84
- package/src/components/Badge/__tests__/Badge.test.tsx +0 -90
- 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 -169
- 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/CardTile/CardTile.module.css +0 -181
- package/src/components/CardTile/CardTile.stories.tsx +0 -86
- package/src/components/CardTile/CardTile.tsx +0 -128
- package/src/components/CardTile/__tests__/CardTile.test.tsx +0 -56
- 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/ColorPicker/ColorPicker.module.css +0 -132
- package/src/components/ColorPicker/ColorPicker.stories.tsx +0 -80
- package/src/components/ColorPicker/ColorPicker.tsx +0 -157
- package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +0 -117
- 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 -150
- package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -214
- package/src/components/ConsentPrompt/ConsentPrompt.module.css +0 -21
- package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +0 -31
- package/src/components/ConsentPrompt/ConsentPrompt.tsx +0 -66
- 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 -335
- package/src/components/Dialog/Dialog.stories.tsx +0 -324
- package/src/components/Dialog/Dialog.tsx +0 -254
- package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -318
- package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
- package/src/components/DragHandleRow/DragHandleRow.tsx +0 -42
- package/src/components/Drawer/Drawer.module.css +0 -121
- package/src/components/Drawer/Drawer.stories.tsx +0 -132
- package/src/components/Drawer/Drawer.tsx +0 -175
- package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -226
- 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/GripIcon/GripIcon.tsx +0 -27
- package/src/components/Header/Header.module.css +0 -62
- package/src/components/Header/Header.stories.tsx +0 -452
- package/src/components/Header/Header.tsx +0 -102
- package/src/components/Header/__tests__/Header.test.tsx +0 -104
- package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +0 -21
- package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +0 -111
- package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +0 -54
- package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +0 -58
- 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/arrow-left-right.tsx +0 -23
- 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/bold.tsx +0 -20
- 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-chevron-left.tsx +0 -21
- package/src/components/Icon/icons/circle-x.tsx +0 -22
- package/src/components/Icon/icons/code.tsx +0 -21
- package/src/components/Icon/icons/coffee.tsx +0 -23
- package/src/components/Icon/icons/cookie.tsx +0 -25
- package/src/components/Icon/icons/copy.tsx +0 -21
- package/src/components/Icon/icons/credit-card.tsx +0 -21
- package/src/components/Icon/icons/croissant.tsx +0 -24
- package/src/components/Icon/icons/cup-soda.tsx +0 -23
- package/src/components/Icon/icons/database.tsx +0 -22
- package/src/components/Icon/icons/download.tsx +0 -22
- 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-text.tsx +0 -24
- package/src/components/Icon/icons/file.tsx +0 -21
- package/src/components/Icon/icons/fish.tsx +0 -25
- package/src/components/Icon/icons/folder-closed.tsx +0 -21
- package/src/components/Icon/icons/folder-open.tsx +0 -20
- package/src/components/Icon/icons/folder.tsx +0 -20
- package/src/components/Icon/icons/folders.tsx +0 -21
- package/src/components/Icon/icons/grid-2x2.tsx +0 -22
- package/src/components/Icon/icons/hat-glasses.tsx +0 -24
- package/src/components/Icon/icons/history.tsx +0 -22
- package/src/components/Icon/icons/house.tsx +0 -21
- package/src/components/Icon/icons/inbox.tsx +0 -21
- package/src/components/Icon/icons/index.ts +0 -394
- package/src/components/Icon/icons/info.tsx +0 -22
- package/src/components/Icon/icons/italic.tsx +0 -22
- package/src/components/Icon/icons/layers.tsx +0 -22
- package/src/components/Icon/icons/layout-dashboard.tsx +0 -23
- package/src/components/Icon/icons/layout-grid.tsx +0 -23
- package/src/components/Icon/icons/link.tsx +0 -21
- package/src/components/Icon/icons/list-ordered.tsx +0 -25
- package/src/components/Icon/icons/list.tsx +0 -25
- package/src/components/Icon/icons/lock.tsx +0 -21
- package/src/components/Icon/icons/log-out.tsx +0 -22
- package/src/components/Icon/icons/luggage.tsx +0 -24
- package/src/components/Icon/icons/mail.tsx +0 -21
- package/src/components/Icon/icons/map-pin.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/minus.tsx +0 -20
- package/src/components/Icon/icons/package.tsx +0 -23
- package/src/components/Icon/icons/paint-bucket.tsx +0 -23
- package/src/components/Icon/icons/panel-left.tsx +0 -21
- package/src/components/Icon/icons/pencil.tsx +0 -21
- package/src/components/Icon/icons/pin.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/rectangle-ellipsis.tsx +0 -23
- package/src/components/Icon/icons/refresh-cw.tsx +0 -23
- package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
- package/src/components/Icon/icons/rotate-cw.tsx +0 -21
- package/src/components/Icon/icons/route.tsx +0 -22
- package/src/components/Icon/icons/salad.tsx +0 -24
- package/src/components/Icon/icons/search.tsx +0 -21
- package/src/components/Icon/icons/send.tsx +0 -21
- package/src/components/Icon/icons/settings.tsx +0 -21
- package/src/components/Icon/icons/share-2.tsx +0 -24
- package/src/components/Icon/icons/sheet.tsx +0 -24
- 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/square-kanban.tsx +0 -23
- package/src/components/Icon/icons/table.tsx +0 -23
- 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-round-plus.tsx +0 -23
- package/src/components/Icon/icons/user.tsx +0 -21
- package/src/components/Icon/icons/users.tsx +0 -23
- 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 -20
- 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 -73
- package/src/components/Markdown/Markdown.stories.tsx +0 -40
- package/src/components/Markdown/Markdown.tsx +0 -305
- package/src/components/Markdown/__tests__/Markdown.test.tsx +0 -144
- 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 -90
- package/src/components/Menu/Menu.tsx +0 -209
- package/src/components/Menu/__tests__/Menu.test.tsx +0 -227
- 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 -65
- package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
- package/src/components/MessageScroller/MessageScroller.tsx +0 -84
- package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
- package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -82
- 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 -122
- package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -129
- package/src/components/MobileHeader/MobileHeader.module.css +0 -76
- package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
- package/src/components/MobileHeader/MobileHeader.tsx +0 -90
- package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -113
- package/src/components/NavList/NavList.module.css +0 -130
- package/src/components/NavList/NavList.tsx +0 -136
- package/src/components/NavList/__tests__/NavList.test.tsx +0 -109
- 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/NotificationsPanel/NotificationsPanel.module.css +0 -258
- package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +0 -61
- package/src/components/NotificationsPanel/NotificationsPanel.tsx +0 -187
- package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +0 -78
- 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 -77
- package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -69
- package/src/components/PageContainer/PageContainer.module.css +0 -82
- package/src/components/PageContainer/PageContainer.tsx +0 -64
- package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -70
- package/src/components/PageHeader/PageHeader.module.css +0 -86
- package/src/components/PageHeader/PageHeader.tsx +0 -176
- package/src/components/PageHeader/__tests__/PageHeader.test.tsx +0 -103
- package/src/components/PageLayout/PageLayout.module.css +0 -51
- package/src/components/PageLayout/PageLayout.stories.tsx +0 -73
- package/src/components/PageLayout/PageLayout.tsx +0 -51
- package/src/components/PageLayout/__tests__/PageLayout.test.tsx +0 -34
- 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 -290
- package/src/components/Popover/__tests__/Popover.test.tsx +0 -263
- 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/RootLayout/RootLayout.module.css +0 -12
- package/src/components/RootLayout/RootLayout.stories.tsx +0 -125
- package/src/components/RootLayout/RootLayout.tsx +0 -185
- package/src/components/RootLayout/__tests__/RootLayout.test.tsx +0 -161
- 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 -58
- 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/StepStrip/StepStrip.module.css +0 -53
- package/src/components/StepStrip/StepStrip.tsx +0 -74
- 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 -64
- package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -243
- 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 -214
- 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 -64
- package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -73
- package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
- package/src/components/SwipeStack/SwipeStack.module.css +0 -101
- package/src/components/SwipeStack/SwipeStack.tsx +0 -199
- package/src/components/SwipeStack/SwipeStackCard.tsx +0 -22
- package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +0 -169
- package/src/components/SystemBanner/SystemBanner.module.css +0 -79
- 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 -47
- package/src/components/Textarea/Textarea.tsx +0 -38
- package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -51
- package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +0 -35
- package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +0 -152
- package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +0 -87
- package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +0 -78
- package/src/components/Toast/Toast.module.css +0 -191
- 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/components/UserMenu/UserMenu.module.css +0 -90
- package/src/components/UserMenu/UserMenu.stories.tsx +0 -49
- package/src/components/UserMenu/UserMenu.tsx +0 -132
- package/src/components/UserMenu/__tests__/UserMenu.test.tsx +0 -77
- 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__/usePublishShellChromeHeight.test.tsx +0 -118
- package/src/hooks/__tests__/useReorderSensors.test.ts +0 -26
- package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
- package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -175
- package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
- package/src/hooks/__tests__/useSwipeStack.test.tsx +0 -155
- package/src/hooks/index.ts +0 -33
- 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/usePublishShellChromeHeight.ts +0 -96
- package/src/hooks/useReorderSensors.ts +0 -88
- package/src/hooks/useResponsiveLayout.ts +0 -36
- package/src/hooks/useSnapCarousel.ts +0 -284
- package/src/hooks/useSwipeReveal.ts +0 -107
- package/src/hooks/useSwipeStack.ts +0 -235
- package/src/index.ts +0 -311
- package/src/motion.ts +0 -78
- package/src/overlay-shell.ts +0 -159
- 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 -3793
- 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/GripIcon.stories.tsx +0 -29
- package/src/stories/InteractionHooks.stories.tsx +0 -925
- package/src/stories/LayoutSystem.stories.tsx +0 -639
- package/src/stories/MenuEntries.stories.tsx +0 -86
- package/src/stories/MobilePatterns.stories.tsx +0 -1536
- package/src/stories/NavList.stories.tsx +0 -147
- package/src/stories/NavTabs.stories.tsx +0 -53
- package/src/stories/OfflineGate.stories.tsx +0 -42
- package/src/stories/PageContainer.stories.tsx +0 -82
- package/src/stories/PageHeader.stories.tsx +0 -95
- package/src/stories/ResponsiveSurface.stories.tsx +0 -47
- package/src/stories/Spinner.stories.tsx +0 -25
- package/src/stories/StepStrip.stories.tsx +0 -76
- package/src/stories/SwipableMobileCarousel.stories.tsx +0 -362
- package/src/stories/SwipeStack.stories.tsx +0 -200
- package/src/stories/Textarea.stories.tsx +0 -63
- package/src/stories/TokenGallery.stories.tsx +0 -652
- package/src/stories/Tooltip.stories.tsx +0 -59
- package/src/tokens/primitives.css +0 -168
- package/src/tokens/semantic.css +0 -162
- package/src/tokens/theme-presets.css +0 -33
- package/src/tokens/theme-presets.ts +0 -72
- package/src/tokens.css +0 -5
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/* Sizing audit: reviewed padding/radius against this scale's other
|
|
2
|
-
surfaces. Left unchanged rather than edited: Card is consumed across
|
|
3
|
-
most first-party plugin screens, and changing its padding/radius
|
|
4
|
-
site-wide has a blast radius no visual regression tooling exists yet to
|
|
5
|
-
verify (see epic task 9.14, not landed). Revisit once that tooling
|
|
6
|
-
exists. */
|
|
7
|
-
.card {
|
|
8
|
-
background: var(--sv-color-surface-raised);
|
|
9
|
-
border: var(--sv-border-width-hairline) solid var(--sv-color-border);
|
|
10
|
-
border-radius: var(--sv-radius-lg);
|
|
11
|
-
box-shadow: var(--sv-shadow-card);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
.paddingSm {
|
|
15
|
-
padding: var(--sv-space-3);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.paddingMd {
|
|
19
|
-
padding: var(--sv-space-5);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.paddingLg {
|
|
23
|
-
padding: var(--sv-space-8);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
.interactive {
|
|
27
|
-
cursor: pointer;
|
|
28
|
-
text-decoration: none;
|
|
29
|
-
display: block;
|
|
30
|
-
transition: border-color 0.15s ease;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@media (hover: hover) {
|
|
34
|
-
.interactive:hover {
|
|
35
|
-
border-color: var(--sv-color-border-strong);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.interactive:focus-visible {
|
|
40
|
-
outline: 2px solid var(--sv-color-focus-ring);
|
|
41
|
-
outline-offset: 2px;
|
|
42
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
-
import styles from './Card.module.css';
|
|
3
|
-
|
|
4
|
-
export interface CardProps extends HTMLAttributes<HTMLElement> {
|
|
5
|
-
as?: 'div' | 'article' | 'li';
|
|
6
|
-
interactive?: boolean;
|
|
7
|
-
padding?: 'sm' | 'md' | 'lg';
|
|
8
|
-
children: ReactNode;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const paddingClass: Record<NonNullable<CardProps['padding']>, string> = {
|
|
12
|
-
sm: styles.paddingSm as string,
|
|
13
|
-
md: styles.paddingMd as string,
|
|
14
|
-
lg: styles.paddingLg as string,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export function Card({
|
|
18
|
-
as: Tag = 'div',
|
|
19
|
-
interactive = false,
|
|
20
|
-
padding = 'md',
|
|
21
|
-
className,
|
|
22
|
-
children,
|
|
23
|
-
...rest
|
|
24
|
-
}: CardProps) {
|
|
25
|
-
const cls = [styles.card, paddingClass[padding], interactive && styles.interactive, className]
|
|
26
|
-
.filter(Boolean)
|
|
27
|
-
.join(' ');
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<Tag className={cls} {...rest}>
|
|
31
|
-
{children}
|
|
32
|
-
</Tag>
|
|
33
|
-
);
|
|
34
|
-
}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
.grid {
|
|
2
|
-
display: grid;
|
|
3
|
-
grid-template-columns: repeat(auto-fill, minmax(var(--sv-card-tile-min-width, 200px), 1fr));
|
|
4
|
-
gap: var(--sv-space-4);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/* A fixed column width (not `1fr`, and — as important — not `max-content`
|
|
8
|
-
either) — every real consumer of `dense` mode (Docs' folder/document
|
|
9
|
-
tiles, this file's own Storybook gallery) pairs it with `variant="icon"`
|
|
10
|
-
tiles carrying a name of unpredictable length that must ellipsis-truncate
|
|
11
|
-
past a point. `max-content` was tried first, on the reasoning that "a
|
|
12
|
-
tile keeps its own natural width instead of stretching to fill leftover
|
|
13
|
-
row space, so the empty area around a small icon tile stays roughly
|
|
14
|
-
square" — but `max-content` track sizing through this grid's nested
|
|
15
|
-
grid → flex → block(/inline-block) → text chain did not reliably account
|
|
16
|
-
for a descendant label's true content width in practice: measured live,
|
|
17
|
-
a 110px-wide label landed in a track that resolved to 97px, silently
|
|
18
|
-
overflowing with no ellipsis ever triggering (not the intended "grows to
|
|
19
|
-
fit," and not truncated either — just broken). A uniform fixed width
|
|
20
|
-
sidesteps that whole class of bug: every tile in a `dense` grid is
|
|
21
|
-
exactly `--sv-card-tile-min-width` wide, full stop, and the descendant
|
|
22
|
-
label (an `overflow: hidden; text-overflow: ellipsis` `inline-block` with
|
|
23
|
-
`max-width: 100%`) truncates reliably against that always-known width —
|
|
24
|
-
short names still read as compact/square, long ones truncate cleanly
|
|
25
|
-
instead of bleeding past their tile. Tighter gap to match. */
|
|
26
|
-
.gridDense {
|
|
27
|
-
grid-template-columns: repeat(auto-fill, var(--sv-card-tile-min-width, 200px));
|
|
28
|
-
gap: var(--sv-space-2);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* Chrome (border/radius/shadow/background) lives on this outer box, same
|
|
32
|
-
tokens `Card` itself uses — but padding-free, so `.banner` below can
|
|
33
|
-
bleed all the way to the edges, which `Card`'s single padded box can't
|
|
34
|
-
do. */
|
|
35
|
-
.tile {
|
|
36
|
-
display: flex;
|
|
37
|
-
flex-direction: column;
|
|
38
|
-
height: 100%;
|
|
39
|
-
overflow: hidden;
|
|
40
|
-
border: 1px solid var(--sv-color-border);
|
|
41
|
-
border-radius: var(--sv-radius-lg);
|
|
42
|
-
background: var(--sv-color-surface-raised);
|
|
43
|
-
box-shadow: var(--sv-shadow-card);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.banner {
|
|
47
|
-
display: flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
justify-content: center;
|
|
50
|
-
height: 40px;
|
|
51
|
-
color: var(--sv-color-text-subtle);
|
|
52
|
-
/* Neutral default when no `bannerColor` is supplied — an inline style
|
|
53
|
-
on the element overrides this. */
|
|
54
|
-
background-color: var(--sv-color-surface-sunken);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.footer {
|
|
58
|
-
padding: var(--sv-space-3) var(--sv-space-4);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/* `variant="icon"` modifier — a plain "Finder icon" tile: no card chrome,
|
|
62
|
-
just a large centered icon with a label beneath it. `.banner`/`.footer`
|
|
63
|
-
are the same two elements the card variant uses, restyled here rather
|
|
64
|
-
than duplicated, so both variants stay structurally identical. */
|
|
65
|
-
.tileIcon {
|
|
66
|
-
align-items: center;
|
|
67
|
-
border: none;
|
|
68
|
-
border-radius: var(--sv-radius-md);
|
|
69
|
-
background: none;
|
|
70
|
-
box-shadow: none;
|
|
71
|
-
padding: var(--sv-space-3) var(--sv-space-2);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@media (hover: hover) {
|
|
75
|
-
.tileIcon:hover {
|
|
76
|
-
background: var(--sv-color-surface-sunken);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.tileIcon .banner {
|
|
81
|
-
height: auto;
|
|
82
|
-
background: none;
|
|
83
|
-
color: var(--sv-color-text-muted);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.tileIcon .banner svg {
|
|
87
|
-
width: 48px;
|
|
88
|
-
height: 48px;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/* `width: 100%` is load-bearing, not decorative — `.tile` sets
|
|
92
|
-
`align-items: center` (so the icon banner centers itself horizontally),
|
|
93
|
-
and cross-axis `center` alignment sizes a flex item to its own preferred
|
|
94
|
-
(content-based) width and centers *that* within the container, rather
|
|
95
|
-
than clamping it to the container's width the way `stretch` would.
|
|
96
|
-
Without an explicit width here, a `nowrap` + `text-overflow: ellipsis`
|
|
97
|
-
label inside (a consumer's own truncation CSS) keeps its full
|
|
98
|
-
content-driven preferred width and gets centered straddling both edges of
|
|
99
|
-
`.tile` — `overflow: hidden` on `.tile` doesn't help, since this child's
|
|
100
|
-
box is genuinely laid out wider than its own container, not merely
|
|
101
|
-
painting past an already-settled one. `min-width: 0` alone (the more
|
|
102
|
-
common flex-truncation fix) does NOT fix this specific case: that only
|
|
103
|
-
lifts the auto-min-size floor that blocks *shrinking under stretch*, and
|
|
104
|
-
this axis was never being stretched to begin with. Confirmed live at a
|
|
105
|
-
viewport narrow enough that `.tile`'s own resolved width is well under
|
|
106
|
-
the label's preferred width — only `width: 100%` actually constrains it;
|
|
107
|
-
a wider test viewport had accidentally masked the bug by giving `.tile`
|
|
108
|
-
enough natural room that the oversized `.footer` fit anyway. */
|
|
109
|
-
.tileIcon .footer {
|
|
110
|
-
width: 100%;
|
|
111
|
-
min-width: 0;
|
|
112
|
-
padding: var(--sv-space-2) 0 0;
|
|
113
|
-
color: var(--sv-color-text-primary);
|
|
114
|
-
text-align: center;
|
|
115
|
-
text-decoration: none;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/* Plain centered placeholder — no banner strip, so a ghost "add new" tile
|
|
119
|
-
reads as an empty slot rather than mimicking a real tile's anatomy.
|
|
120
|
-
`min-height` matches a real `.tile`'s own natural height (banner +
|
|
121
|
-
single-line footer) so the two read as the same size. */
|
|
122
|
-
.newTile {
|
|
123
|
-
display: flex;
|
|
124
|
-
align-items: center;
|
|
125
|
-
justify-content: center;
|
|
126
|
-
gap: var(--sv-space-2);
|
|
127
|
-
min-height: 87px;
|
|
128
|
-
width: 100%;
|
|
129
|
-
height: 100%;
|
|
130
|
-
color: var(--sv-color-text-muted);
|
|
131
|
-
border: 1px dashed var(--sv-color-border-strong);
|
|
132
|
-
border-radius: var(--sv-radius-lg);
|
|
133
|
-
background: none;
|
|
134
|
-
cursor: pointer;
|
|
135
|
-
transition:
|
|
136
|
-
border-color 0.15s ease,
|
|
137
|
-
color 0.15s ease;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
@media (hover: hover) {
|
|
141
|
-
.newTile:hover {
|
|
142
|
-
border-color: var(--sv-color-text-muted);
|
|
143
|
-
color: var(--sv-color-text-primary);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
.newTile:focus-visible {
|
|
148
|
-
outline: 2px solid var(--sv-color-focus-ring);
|
|
149
|
-
outline-offset: 2px;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/* `variant="icon"` modifier — matches a `variant="icon"` `CardTile`'s own
|
|
153
|
-
footprint. Icon-only, no visible label (see `NewCardTile`'s own doc
|
|
154
|
-
comment) — a plain "+" at the DS's own `size="md"` (unlike
|
|
155
|
-
`.tileIcon .banner svg`'s real-content 48px override, deliberately not
|
|
156
|
-
repeated here) reads as self-explanatory once every sibling tile in the
|
|
157
|
-
grid is already an unlabeled icon.
|
|
158
|
-
`width`/`height: 100%` (not `auto`, despite this being a "shrink to
|
|
159
|
-
content" variant conceptually) — a real `CardTile` sibling in the same
|
|
160
|
-
`dense` grid fills its grid cell via the grid's own item-stretch, which
|
|
161
|
-
only reaches an `auto`-sized *direct* grid child; wrapping this trigger
|
|
162
|
-
in a `Menu`/`Popover` (`HomeWorkbooksList.tsx`'s "add workbook" tile)
|
|
163
|
-
inserts an intermediate `display: inline-flex` container between this
|
|
164
|
-
button and the grid, and a flex container's default cross/main-axis
|
|
165
|
-
sizing does not itself relay grid-stretch through to a `width: auto`
|
|
166
|
-
flex child — confirmed live: the button rendered full-height but only
|
|
167
|
-
as wide as its own icon+padding (~38px) inside a 160px cell. Explicit
|
|
168
|
-
100% percentages resolve against whichever immediate parent box is
|
|
169
|
-
sized to the grid cell — the grid track directly, or the intermediate
|
|
170
|
-
flex container once IT has already been stretched to that width — so
|
|
171
|
-
this works correctly either way, unlike relying on stretch alone. */
|
|
172
|
-
.newTileIcon {
|
|
173
|
-
flex-direction: column;
|
|
174
|
-
justify-content: center;
|
|
175
|
-
gap: 0;
|
|
176
|
-
width: 100%;
|
|
177
|
-
height: 100%;
|
|
178
|
-
min-height: 0;
|
|
179
|
-
padding: var(--sv-space-3) var(--sv-space-2);
|
|
180
|
-
border-radius: var(--sv-radius-md);
|
|
181
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { Icon } from '../Icon/Icon';
|
|
3
|
-
import { CardTile, CardTileGrid, NewCardTile } from './CardTile';
|
|
4
|
-
|
|
5
|
-
const meta = {
|
|
6
|
-
title: 'Components/CardTile',
|
|
7
|
-
component: CardTile,
|
|
8
|
-
parameters: {
|
|
9
|
-
layout: 'padded',
|
|
10
|
-
docs: {
|
|
11
|
-
description: {
|
|
12
|
-
component:
|
|
13
|
-
'A colored/iconed banner over a footer label, used as a grid of navigable tiles (projects, boards, and similar top-level entities). Pair with `CardTileGrid` for layout and `NewCardTile` for the grid\'s "add new" affordance. Not link-aware — wrap a tile in the host framework\'s own link component to make it navigable.',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
args: {
|
|
18
|
-
children: 'Q4 Planning',
|
|
19
|
-
},
|
|
20
|
-
} satisfies Meta<typeof CardTile>;
|
|
21
|
-
|
|
22
|
-
export default meta;
|
|
23
|
-
type Story = StoryObj<typeof meta>;
|
|
24
|
-
|
|
25
|
-
export const Default: Story = {};
|
|
26
|
-
|
|
27
|
-
export const WithBannerIcon: Story = {
|
|
28
|
-
args: {
|
|
29
|
-
banner: <Icon name="folder" size="lg" aria-hidden={true} />,
|
|
30
|
-
children: 'Q4 Planning',
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export const WithBannerColor: Story = {
|
|
35
|
-
args: {
|
|
36
|
-
bannerColor: '#c7d8ff',
|
|
37
|
-
children: 'Marketing site',
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export const Grid: Story = {
|
|
42
|
-
render: () => (
|
|
43
|
-
<CardTileGrid>
|
|
44
|
-
<CardTile banner={<Icon name="folder" size="lg" aria-hidden={true} />}>Q4 Planning</CardTile>
|
|
45
|
-
<CardTile bannerColor="#ffd8c7">Design reviews</CardTile>
|
|
46
|
-
<CardTile bannerColor="#c7ffd9">Onboarding</CardTile>
|
|
47
|
-
<NewCardTile label="New project" />
|
|
48
|
-
</CardTileGrid>
|
|
49
|
-
),
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/** `variant="icon"` — a plain "Finder icon" tile: no card chrome, just a large centered icon with a label beneath it. */
|
|
53
|
-
export const IconVariant: Story = {
|
|
54
|
-
args: {
|
|
55
|
-
variant: 'icon',
|
|
56
|
-
banner: <Icon name="folder-closed" size="lg" aria-hidden={true} />,
|
|
57
|
-
children: 'Handbook',
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/** `dense` — natural-width tiles (no stretch-to-fill) with a tighter gap, the pairing `variant="icon"` tiles normally want. `NewCardTile`'s own `variant="icon"` matches the same footprint, so the "add new" tile sits naturally alongside the rest instead of stretching into a wide pill. */
|
|
62
|
-
export const IconVariantGrid: Story = {
|
|
63
|
-
render: () => (
|
|
64
|
-
<CardTileGrid dense minTileWidth={100}>
|
|
65
|
-
<CardTile variant="icon" banner={<Icon name="folder-closed" size="lg" aria-hidden={true} />}>
|
|
66
|
-
Handbook
|
|
67
|
-
</CardTile>
|
|
68
|
-
<CardTile variant="icon" banner={<Icon name="folder-closed" size="lg" aria-hidden={true} />}>
|
|
69
|
-
Q4 Planning
|
|
70
|
-
</CardTile>
|
|
71
|
-
<CardTile variant="icon" banner={<Icon name="folder-closed" size="lg" aria-hidden={true} />}>
|
|
72
|
-
Design reviews
|
|
73
|
-
</CardTile>
|
|
74
|
-
<NewCardTile variant="icon" label="New" />
|
|
75
|
-
</CardTileGrid>
|
|
76
|
-
),
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export const NewTile: StoryObj<typeof NewCardTile> = {
|
|
80
|
-
render: () => <NewCardTile label="New document" />,
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
/** `variant="icon"` — matches a `variant="icon"` `CardTile`'s footprint (icon above a short label) instead of the default horizontal pill. */
|
|
84
|
-
export const NewTileIconVariant: StoryObj<typeof NewCardTile> = {
|
|
85
|
-
render: () => <NewCardTile variant="icon" label="New" />,
|
|
86
|
-
};
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import type { ButtonHTMLAttributes, CSSProperties, HTMLAttributes, ReactNode } from 'react';
|
|
2
|
-
import { Icon } from '../Icon/Icon';
|
|
3
|
-
import type { IconName } from '../Icon/Icon';
|
|
4
|
-
import styles from './CardTile.module.css';
|
|
5
|
-
|
|
6
|
-
export interface CardTileGridProps {
|
|
7
|
-
children: ReactNode;
|
|
8
|
-
/** Minimum tile width (px) before the grid wraps to fewer columns. */
|
|
9
|
-
minTileWidth?: number;
|
|
10
|
-
className?: string;
|
|
11
|
-
/**
|
|
12
|
-
* Tight spacing with tiles that keep their natural width instead of
|
|
13
|
-
* stretching to fill the row — for small `variant="icon"` tiles (e.g. a
|
|
14
|
-
* folder grid), where the default grid's spacious gap and `1fr`-stretched
|
|
15
|
-
* columns leave a lot of empty space around a tile that's really just an
|
|
16
|
-
* icon + short label.
|
|
17
|
-
*/
|
|
18
|
-
dense?: boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/** Responsive grid of `CardTile`/`NewCardTile` children — `repeat(auto-fill, minmax(minTileWidth, 1fr))`, or `minmax(minTileWidth, max-content)` with a tighter gap when `dense`. */
|
|
22
|
-
export function CardTileGrid({
|
|
23
|
-
children,
|
|
24
|
-
minTileWidth = 200,
|
|
25
|
-
className,
|
|
26
|
-
dense = false,
|
|
27
|
-
}: CardTileGridProps) {
|
|
28
|
-
const style = { '--sv-card-tile-min-width': `${minTileWidth}px` } as CSSProperties;
|
|
29
|
-
return (
|
|
30
|
-
<div
|
|
31
|
-
className={[styles.grid, dense && styles.gridDense, className].filter(Boolean).join(' ')}
|
|
32
|
-
style={style}
|
|
33
|
-
>
|
|
34
|
-
{children}
|
|
35
|
-
</div>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface CardTileProps extends HTMLAttributes<HTMLDivElement> {
|
|
40
|
-
/** Content centered in the tile's full-bleed top banner — typically an `<Icon>`. Omit for a plain strip. */
|
|
41
|
-
banner?: ReactNode;
|
|
42
|
-
/** Banner background color (applied inline). Falls back to a neutral sunken-surface strip when omitted. Ignored by `variant="icon"`, which has no banner box. */
|
|
43
|
-
bannerColor?: string;
|
|
44
|
-
/** Tile footer content — typically the item's name. */
|
|
45
|
-
children: ReactNode;
|
|
46
|
-
/**
|
|
47
|
-
* `"card"` (default): a bordered card with a colored/iconed banner strip
|
|
48
|
-
* over a footer label. `"icon"`: a plain "Finder icon" tile — no card
|
|
49
|
-
* chrome at all, just a large centered icon with a label beneath it. Use
|
|
50
|
-
* `"icon"` for entities that read as a single glyph + name (e.g. a
|
|
51
|
-
* folder), where a bordered card reads as heavier than the content needs.
|
|
52
|
-
*/
|
|
53
|
-
variant?: 'card' | 'icon';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* A colored/iconed banner over a footer label — a card shape `Card` can't
|
|
58
|
-
* express, since `Card`'s `padding` prop always pads its single box with no
|
|
59
|
-
* way for a top region to bleed to the edges. Not link-aware: wrap it in the
|
|
60
|
-
* host framework's own link component (e.g. Next's `<Link>`) to make it
|
|
61
|
-
* navigable, same as every existing consumer of this pattern does.
|
|
62
|
-
*/
|
|
63
|
-
export function CardTile({
|
|
64
|
-
banner,
|
|
65
|
-
bannerColor,
|
|
66
|
-
children,
|
|
67
|
-
className,
|
|
68
|
-
variant = 'card',
|
|
69
|
-
...rest
|
|
70
|
-
}: CardTileProps) {
|
|
71
|
-
const isIcon = variant === 'icon';
|
|
72
|
-
return (
|
|
73
|
-
<div
|
|
74
|
-
className={[styles.tile, isIcon && styles.tileIcon, className].filter(Boolean).join(' ')}
|
|
75
|
-
{...rest}
|
|
76
|
-
>
|
|
77
|
-
<div
|
|
78
|
-
className={styles.banner}
|
|
79
|
-
aria-hidden="true"
|
|
80
|
-
style={!isIcon && bannerColor ? { backgroundColor: bannerColor } : undefined}
|
|
81
|
-
>
|
|
82
|
-
{banner}
|
|
83
|
-
</div>
|
|
84
|
-
<div className={styles.footer}>{children}</div>
|
|
85
|
-
</div>
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export interface NewCardTileProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
90
|
-
/** Icon shown beside the label (`"card"`) or alone (`"icon"`). Defaults to `"plus"`. */
|
|
91
|
-
icon?: IconName;
|
|
92
|
-
/** Visible next to the icon for `"card"`. For `"icon"`, not rendered as text — used as the button's `aria-label` instead, since the tile is icon-only. */
|
|
93
|
-
label: string;
|
|
94
|
-
/**
|
|
95
|
-
* `"card"` (default): a dashed box matching a `variant="card"` `CardTile`'s
|
|
96
|
-
* footprint — icon beside a visible label. `"icon"`: matches a
|
|
97
|
-
* `variant="icon"` `CardTile`'s footprint instead, but icon-only, no
|
|
98
|
-
* visible label — a plain "+" reads as self-explanatory once every
|
|
99
|
-
* sibling tile in the same `dense` grid is already an unlabeled icon
|
|
100
|
-
* (the dashed border alone marks it as the "add new" affordance).
|
|
101
|
-
*/
|
|
102
|
-
variant?: 'card' | 'icon';
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Dashed ghost tile matching a real `CardTile`'s footprint — the grid's own "add new" affordance. */
|
|
106
|
-
export function NewCardTile({
|
|
107
|
-
icon = 'plus',
|
|
108
|
-
label,
|
|
109
|
-
type = 'button',
|
|
110
|
-
variant = 'card',
|
|
111
|
-
className,
|
|
112
|
-
...rest
|
|
113
|
-
}: NewCardTileProps) {
|
|
114
|
-
const isIcon = variant === 'icon';
|
|
115
|
-
return (
|
|
116
|
-
<button
|
|
117
|
-
type={type}
|
|
118
|
-
className={[styles.newTile, isIcon && styles.newTileIcon, className]
|
|
119
|
-
.filter(Boolean)
|
|
120
|
-
.join(' ')}
|
|
121
|
-
{...rest}
|
|
122
|
-
aria-label={isIcon ? label : undefined}
|
|
123
|
-
>
|
|
124
|
-
<Icon name={icon} size={isIcon ? 'md' : 'sm'} aria-hidden={true} />
|
|
125
|
-
{!isIcon && label}
|
|
126
|
-
</button>
|
|
127
|
-
);
|
|
128
|
-
}
|
|
@@ -1,56 +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
|
-
|
|
5
|
-
afterEach(cleanup);
|
|
6
|
-
import { CardTile, CardTileGrid, NewCardTile } from '../CardTile';
|
|
7
|
-
|
|
8
|
-
describe('CardTile', () => {
|
|
9
|
-
it('renders the footer content', () => {
|
|
10
|
-
render(<CardTile>Q4 Planning</CardTile>);
|
|
11
|
-
expect(screen.getByText('Q4 Planning')).toBeDefined();
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('renders optional banner content', () => {
|
|
15
|
-
render(<CardTile banner={<span>icon</span>}>Q4 Planning</CardTile>);
|
|
16
|
-
expect(screen.getByText('icon')).toBeDefined();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('applies bannerColor as an inline background-color', () => {
|
|
20
|
-
const { container } = render(<CardTile bannerColor="#c7d8ff">Q4 Planning</CardTile>);
|
|
21
|
-
const banner = container.querySelector('[aria-hidden="true"]') as HTMLElement;
|
|
22
|
-
expect(banner.style.backgroundColor).toBe('rgb(199, 216, 255)');
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('hides the banner from assistive tech', () => {
|
|
26
|
-
const { container } = render(<CardTile>Q4 Planning</CardTile>);
|
|
27
|
-
expect(container.querySelector('[aria-hidden="true"]')).not.toBeNull();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('CardTileGrid', () => {
|
|
32
|
-
it('renders its children', () => {
|
|
33
|
-
render(
|
|
34
|
-
<CardTileGrid>
|
|
35
|
-
<CardTile>One</CardTile>
|
|
36
|
-
<CardTile>Two</CardTile>
|
|
37
|
-
</CardTileGrid>,
|
|
38
|
-
);
|
|
39
|
-
expect(screen.getByText('One')).toBeDefined();
|
|
40
|
-
expect(screen.getByText('Two')).toBeDefined();
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
describe('NewCardTile', () => {
|
|
45
|
-
it('renders the given label', () => {
|
|
46
|
-
render(<NewCardTile label="New project" />);
|
|
47
|
-
expect(screen.getByRole('button', { name: /New project/ })).toBeDefined();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('calls onClick when clicked', () => {
|
|
51
|
-
const onClick = vi.fn();
|
|
52
|
-
render(<NewCardTile label="New project" onClick={onClick} />);
|
|
53
|
-
fireEvent.click(screen.getByRole('button', { name: /New project/ }));
|
|
54
|
-
expect(onClick).toHaveBeenCalledTimes(1);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
.row {
|
|
2
|
-
display: flex;
|
|
3
|
-
align-items: center;
|
|
4
|
-
gap: var(--sv-space-3);
|
|
5
|
-
width: 100%;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.tapTarget {
|
|
9
|
-
display: flex;
|
|
10
|
-
align-items: center;
|
|
11
|
-
gap: var(--sv-space-2);
|
|
12
|
-
flex: 1;
|
|
13
|
-
min-width: 0;
|
|
14
|
-
min-height: var(--sv-touch-target-min);
|
|
15
|
-
cursor: pointer;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.tapTarget:focus-visible {
|
|
19
|
-
outline: 2px solid var(--sv-color-focus-ring);
|
|
20
|
-
outline-offset: 2px;
|
|
21
|
-
border-radius: var(--sv-radius-sm);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/* Visual box — matches Checkbox.module.css's .box/.checked/.tick. */
|
|
25
|
-
.box {
|
|
26
|
-
--checkbox-box-size: 18px;
|
|
27
|
-
flex-shrink: 0;
|
|
28
|
-
width: var(--checkbox-box-size);
|
|
29
|
-
height: var(--checkbox-box-size);
|
|
30
|
-
border-radius: var(--sv-radius-sm);
|
|
31
|
-
border: 1.5px solid var(--sv-color-border-strong);
|
|
32
|
-
background: var(--sv-color-surface);
|
|
33
|
-
transition:
|
|
34
|
-
background-color 0.15s ease,
|
|
35
|
-
border-color 0.15s ease;
|
|
36
|
-
display: flex;
|
|
37
|
-
align-items: center;
|
|
38
|
-
justify-content: center;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.checked {
|
|
42
|
-
background-color: var(--sv-color-accent);
|
|
43
|
-
border-color: var(--sv-color-accent);
|
|
44
|
-
color: var(--sv-white);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.tick {
|
|
48
|
-
width: 10px;
|
|
49
|
-
height: 8px;
|
|
50
|
-
pointer-events: none;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.icon {
|
|
54
|
-
display: flex;
|
|
55
|
-
align-items: center;
|
|
56
|
-
flex-shrink: 0;
|
|
57
|
-
color: var(--sv-color-text-muted);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.label {
|
|
61
|
-
flex: 1;
|
|
62
|
-
min-width: 0;
|
|
63
|
-
font-size: var(--sv-font-size-sm);
|
|
64
|
-
color: var(--sv-color-text-primary);
|
|
65
|
-
overflow: hidden;
|
|
66
|
-
text-overflow: ellipsis;
|
|
67
|
-
white-space: nowrap;
|
|
68
|
-
transition: color 0.15s ease;
|
|
69
|
-
position: relative;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.label::after {
|
|
73
|
-
content: '';
|
|
74
|
-
position: absolute;
|
|
75
|
-
left: 0;
|
|
76
|
-
top: 50%;
|
|
77
|
-
width: 100%;
|
|
78
|
-
height: 1.5px;
|
|
79
|
-
background: var(--sv-color-text-muted);
|
|
80
|
-
transform: scaleX(0);
|
|
81
|
-
transform-origin: left center;
|
|
82
|
-
transition: transform 0.2s ease;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.struck {
|
|
86
|
-
color: var(--sv-color-text-muted);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
.struck::after {
|
|
90
|
-
transform: scaleX(1);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.trailing {
|
|
94
|
-
flex-shrink: 0;
|
|
95
|
-
}
|