@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,185 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
-
import type {
|
|
5
|
-
CSSProperties,
|
|
6
|
-
MouseEvent as ReactMouseEvent,
|
|
7
|
-
PointerEvent as ReactPointerEvent,
|
|
8
|
-
} from 'react';
|
|
9
|
-
|
|
10
|
-
export interface UseLongPressOptions {
|
|
11
|
-
/** Called once the press has been held for `delay` without exceeding `moveTolerance`. */
|
|
12
|
-
onLongPress: () => void;
|
|
13
|
-
/** Hold duration in ms before `onLongPress` fires. Default 500. */
|
|
14
|
-
delay?: number;
|
|
15
|
-
/** Accumulated pointer movement (px) that cancels a pending press. Default 10 —
|
|
16
|
-
* a real finger jitters a couple of px on a still hold; this must be forgiving
|
|
17
|
-
* of that or the gesture never fires. */
|
|
18
|
-
moveTolerance?: number;
|
|
19
|
-
/** How long (ms) after firing to swallow the click that may or may not follow.
|
|
20
|
-
* Default 700. Time-boxed rather than "clear on next click" — iOS frequently
|
|
21
|
-
* sends no click at all after a long hold, so a flag that only clears on the
|
|
22
|
-
* next click stays armed forever and silently eats the user's next real tap. */
|
|
23
|
-
suppressClickMs?: number;
|
|
24
|
-
/** Fire `navigator.vibrate(10)` when the press triggers, where supported. Default true. */
|
|
25
|
-
vibrate?: boolean;
|
|
26
|
-
/** Skip entirely (hooks can't be called conditionally, so this is the escape hatch
|
|
27
|
-
* for a caller whose long-press action isn't available in the current state). */
|
|
28
|
-
disabled?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface LongPressHandlers {
|
|
32
|
-
onPointerDown: (e: ReactPointerEvent) => void;
|
|
33
|
-
onPointerMove: (e: ReactPointerEvent) => void;
|
|
34
|
-
onPointerUp: (e: ReactPointerEvent) => void;
|
|
35
|
-
onPointerCancel: (e: ReactPointerEvent) => void;
|
|
36
|
-
onPointerLeave: (e: ReactPointerEvent) => void;
|
|
37
|
-
onContextMenu: (e: ReactMouseEvent) => void;
|
|
38
|
-
onClick: (e: ReactMouseEvent) => void;
|
|
39
|
-
/** Spread onto the target element. Empty on devices whose primary pointer
|
|
40
|
-
* isn't coarse (desktop mouse/trackpad) — see the coarse-pointer gate below. */
|
|
41
|
-
style: CSSProperties;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const DEFAULT_DELAY_MS = 500;
|
|
45
|
-
const DEFAULT_MOVE_TOLERANCE_PX = 10;
|
|
46
|
-
const DEFAULT_SUPPRESS_CLICK_MS = 700;
|
|
47
|
-
|
|
48
|
-
// SSR-safe, same defer-to-client-mount pattern as useIsMobile: defaults to
|
|
49
|
-
// false (no suppression styles) until the client can actually read the
|
|
50
|
-
// device's primary pointer, avoiding a hydration mismatch.
|
|
51
|
-
function usePrefersCoarsePointer(): boolean {
|
|
52
|
-
const [coarse, setCoarse] = useState(false);
|
|
53
|
-
|
|
54
|
-
useEffect(() => {
|
|
55
|
-
const mql = window.matchMedia('(pointer: coarse)');
|
|
56
|
-
setCoarse(mql.matches);
|
|
57
|
-
function handleChange(e: MediaQueryListEvent) {
|
|
58
|
-
setCoarse(e.matches);
|
|
59
|
-
}
|
|
60
|
-
mql.addEventListener('change', handleChange);
|
|
61
|
-
return () => mql.removeEventListener('change', handleChange);
|
|
62
|
-
}, []);
|
|
63
|
-
|
|
64
|
-
return coarse;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* useLongPress — touch-and-hold gesture with the full suppression recipe a
|
|
69
|
-
* long-press needs to behave, not just a bare timer.
|
|
70
|
-
*
|
|
71
|
-
* A naive `setTimeout` started on `pointerdown` and cleared on `pointermove`
|
|
72
|
-
* fails in three specific ways this hook exists to fix:
|
|
73
|
-
* 1. Any movement at all cancels it — but a real finger jitters a few px even
|
|
74
|
-
* on a "still" hold, so the gesture misfires constantly. `moveTolerance`
|
|
75
|
-
* requires deliberate movement before cancelling.
|
|
76
|
-
* 2. `pointercancel` (the browser converting the touch into a scroll) isn't
|
|
77
|
-
* handled — the timer survives and fires mid-scroll. Handled here.
|
|
78
|
-
* 3. Nothing suppresses the OS's own reaction to a long touch-hold: iOS shows
|
|
79
|
-
* its link-preview callout, Android starts text selection or opens a
|
|
80
|
-
* context menu, and either can fire *alongside* the gesture this hook
|
|
81
|
-
* triggers. `onContextMenu` + the returned `style` (touch-callout,
|
|
82
|
-
* user-select, touch-action) close all three, gated to coarse-pointer
|
|
83
|
-
* devices only — unconditionally disabling `user-select` would break
|
|
84
|
-
* mouse text selection on desktop, which never held this long-press to
|
|
85
|
-
* begin with (see `onPointerDown`'s own `pointerType` check).
|
|
86
|
-
*
|
|
87
|
-
* The click that may or may not follow a fired long-press (iOS often sends
|
|
88
|
-
* none at all) is swallowed for `suppressClickMs`, not indefinitely — an
|
|
89
|
-
* unbounded suppression flag left armed by a browser that never sends that
|
|
90
|
-
* click silently eats the user's *next* unrelated tap on the same element.
|
|
91
|
-
*/
|
|
92
|
-
export function useLongPress({
|
|
93
|
-
onLongPress,
|
|
94
|
-
delay = DEFAULT_DELAY_MS,
|
|
95
|
-
moveTolerance = DEFAULT_MOVE_TOLERANCE_PX,
|
|
96
|
-
suppressClickMs = DEFAULT_SUPPRESS_CLICK_MS,
|
|
97
|
-
vibrate = true,
|
|
98
|
-
disabled = false,
|
|
99
|
-
}: UseLongPressOptions): LongPressHandlers {
|
|
100
|
-
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
101
|
-
const startRef = useRef<{ x: number; y: number } | null>(null);
|
|
102
|
-
const suppressUntilRef = useRef(0);
|
|
103
|
-
|
|
104
|
-
const clearTimer = useCallback(() => {
|
|
105
|
-
if (timerRef.current) {
|
|
106
|
-
clearTimeout(timerRef.current);
|
|
107
|
-
timerRef.current = null;
|
|
108
|
-
}
|
|
109
|
-
}, []);
|
|
110
|
-
|
|
111
|
-
// A press pending when the component unmounts (its target left the view
|
|
112
|
-
// mid-hold — e.g. the row it's on was deleted by a sync elsewhere) must not
|
|
113
|
-
// fire onLongPress against state that's no longer there.
|
|
114
|
-
useEffect(() => clearTimer, [clearTimer]);
|
|
115
|
-
|
|
116
|
-
const onPointerDown = useCallback(
|
|
117
|
-
(e: ReactPointerEvent) => {
|
|
118
|
-
if (disabled || e.pointerType !== 'touch') return;
|
|
119
|
-
startRef.current = { x: e.clientX, y: e.clientY };
|
|
120
|
-
clearTimer();
|
|
121
|
-
timerRef.current = setTimeout(() => {
|
|
122
|
-
timerRef.current = null;
|
|
123
|
-
suppressUntilRef.current = Date.now() + suppressClickMs;
|
|
124
|
-
if (vibrate && typeof navigator !== 'undefined' && navigator.vibrate) {
|
|
125
|
-
navigator.vibrate(10);
|
|
126
|
-
}
|
|
127
|
-
onLongPress();
|
|
128
|
-
}, delay);
|
|
129
|
-
},
|
|
130
|
-
[disabled, delay, suppressClickMs, vibrate, onLongPress, clearTimer],
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
const onPointerMove = useCallback(
|
|
134
|
-
(e: ReactPointerEvent) => {
|
|
135
|
-
const start = startRef.current;
|
|
136
|
-
if (!start || !timerRef.current) return;
|
|
137
|
-
const dx = e.clientX - start.x;
|
|
138
|
-
const dy = e.clientY - start.y;
|
|
139
|
-
if (Math.hypot(dx, dy) > moveTolerance) clearTimer();
|
|
140
|
-
},
|
|
141
|
-
[moveTolerance, clearTimer],
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
const cancelPress = useCallback(() => {
|
|
145
|
-
clearTimer();
|
|
146
|
-
startRef.current = null;
|
|
147
|
-
}, [clearTimer]);
|
|
148
|
-
|
|
149
|
-
// Preempts the OS's own long-press menu (Android's link/image context menu)
|
|
150
|
-
// whenever our gesture is pending or has just fired — either way, this
|
|
151
|
-
// hook's action is the one that should win, not a native menu appearing on
|
|
152
|
-
// top of (or instead of) it. iOS's equivalent (the touch-callout link
|
|
153
|
-
// preview) isn't a JS event at all — that one is closed by `style` below.
|
|
154
|
-
const onContextMenu = useCallback((e: ReactMouseEvent) => {
|
|
155
|
-
if (timerRef.current || Date.now() < suppressUntilRef.current) e.preventDefault();
|
|
156
|
-
}, []);
|
|
157
|
-
|
|
158
|
-
const onClick = useCallback((e: ReactMouseEvent) => {
|
|
159
|
-
if (Date.now() < suppressUntilRef.current) {
|
|
160
|
-
e.preventDefault();
|
|
161
|
-
e.stopPropagation();
|
|
162
|
-
}
|
|
163
|
-
}, []);
|
|
164
|
-
|
|
165
|
-
const isCoarsePointer = usePrefersCoarsePointer();
|
|
166
|
-
const style: CSSProperties = isCoarsePointer
|
|
167
|
-
? {
|
|
168
|
-
WebkitTouchCallout: 'none',
|
|
169
|
-
WebkitUserSelect: 'none',
|
|
170
|
-
userSelect: 'none',
|
|
171
|
-
touchAction: 'manipulation',
|
|
172
|
-
}
|
|
173
|
-
: {};
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
onPointerDown,
|
|
177
|
-
onPointerMove,
|
|
178
|
-
onPointerUp: cancelPress,
|
|
179
|
-
onPointerCancel: cancelPress,
|
|
180
|
-
onPointerLeave: cancelPress,
|
|
181
|
-
onContextMenu,
|
|
182
|
-
onClick,
|
|
183
|
-
style,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useIsOffline } from './useIsOffline';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The two reasons an app tile can be non-interactive, kept structurally
|
|
7
|
-
* distinct because they have different causes and must never read as the same
|
|
8
|
-
* thing to a user (research 0012, epic task 2.33):
|
|
9
|
-
*
|
|
10
|
-
* - `'connectivity-dimmed'` — a no-offline-tier app, dimmed only while the
|
|
11
|
-
* device is **actually offline right now**. Reactive and temporary; clears
|
|
12
|
-
* the instant connectivity returns.
|
|
13
|
-
* - `'capability-restricted'` — a `device-only` app on a surface without the
|
|
14
|
-
* durable, encrypted, device-auth-gated store it needs. Static and
|
|
15
|
-
* unrelated to connectivity — it stays restricted even when fully online,
|
|
16
|
-
* and must never say "offline" to a user who plainly isn't.
|
|
17
|
-
*/
|
|
18
|
-
export type OfflineTileState = 'connectivity-dimmed' | 'capability-restricted' | null;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Which of the two states, if any, applies to an app tile given its declared
|
|
22
|
-
* offline tier.
|
|
23
|
-
*
|
|
24
|
-
* `deviceOnlyAvailable` is the caller's own
|
|
25
|
-
* `isDeviceOnlyTierAvailable()` result (from
|
|
26
|
-
* `@sovereignfs/sdk/device-client`) — deliberately taken as a plain boolean
|
|
27
|
-
* parameter rather than computed inside this hook, so `@sovereignfs/ui` never
|
|
28
|
-
* depends on `@sovereignfs/sdk` (this package must stay usable standalone,
|
|
29
|
-
* outside the plugin runtime — RFC 0073).
|
|
30
|
-
*
|
|
31
|
-
* An `offline-first` app is never restricted by either state: that tier's
|
|
32
|
-
* whole point is working with no network, so it stays fully interactive both
|
|
33
|
-
* online and offline. A `device-only` app that *is* available behaves the
|
|
34
|
-
* same way — the restriction is about availability, not connectivity.
|
|
35
|
-
*/
|
|
36
|
-
export function useOfflineTileState(
|
|
37
|
-
offline: 'offline-first' | 'device-only' | undefined,
|
|
38
|
-
deviceOnlyAvailable: boolean,
|
|
39
|
-
): OfflineTileState {
|
|
40
|
-
const isOffline = useIsOffline();
|
|
41
|
-
|
|
42
|
-
if (offline === 'device-only' && !deviceOnlyAvailable) return 'capability-restricted';
|
|
43
|
-
if (offline === undefined && isOffline) return 'connectivity-dimmed';
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useLayoutEffect } from 'react';
|
|
4
|
-
import type { RefObject } from 'react';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Internal implementation detail of `MobileHeader`/`MobileFooter` — not part
|
|
8
|
-
* of the package's public surface (not re-exported from `hooks/index.ts`).
|
|
9
|
-
*
|
|
10
|
-
* Measures `ref`'s own rendered height and publishes it as an inline
|
|
11
|
-
* `var(--sv-shell-header-height|--sv-shell-footer-height)` override on
|
|
12
|
-
* `#sv-app-shell` (the runtime shell's stable root id, `runtime/app/
|
|
13
|
-
* (platform)/layout.tsx`), removing it on unmount. This is what makes a
|
|
14
|
-
* *self-rendered* `MobileHeader`/`MobileFooter` — the sanctioned pattern for
|
|
15
|
-
* a plugin that opts out of the platform's own chrome via
|
|
16
|
-
* `shellConfig.mobileHeader`/`mobileFooter: false` (RFC 0075/0088) — work
|
|
17
|
-
* correctly with `Sheet`/`Drawer`/`Dialog`, which all size themselves against
|
|
18
|
-
* these same two variables so they stop above/below the chrome instead of
|
|
19
|
-
* sliding underneath it.
|
|
20
|
-
*
|
|
21
|
-
* Before this existed, only the *platform's own* header/footer had its
|
|
22
|
-
* height accounted for (a fixed CSS `calc()` in `shell.module.css`, driven by
|
|
23
|
-
* `data-mobile-header-hidden`/`data-mobile-footer-hidden`, which collapses
|
|
24
|
-
* the variable to `0px` whenever a plugin hides that chrome) — a plugin
|
|
25
|
-
* self-rendering its own via this same component instead had no path to tell
|
|
26
|
-
* the shell what its real height was, and silently inherited that `0px`.
|
|
27
|
-
* `Sheet`/`Drawer` then extended full-height, and since the header/footer's
|
|
28
|
-
* own `z-index` (101) beats an overlay's (100), the chrome visibly covered
|
|
29
|
-
* the overlay's last ~60px. First found and fixed ad hoc in `sovereign-tasks`
|
|
30
|
-
* (measuring in the plugin itself, `getBoundingClientRect()` in a
|
|
31
|
-
* `useLayoutEffect`); moved here so every consumer of these two components —
|
|
32
|
-
* present and future, in this repo or externally maintained — gets it for
|
|
33
|
-
* free, without having to know the mechanism exists. See
|
|
34
|
-
* `docs/architecture-rules.md` for the full rule.
|
|
35
|
-
*
|
|
36
|
-
* Deliberately **not** `ResizeObserver`: in live testing (both this repo's
|
|
37
|
-
* own Chromium-based browser-preview tooling and a real WebKit iOS Simulator
|
|
38
|
-
* session) a freshly created `ResizeObserver` never fired its callback even
|
|
39
|
-
* once for an already-rendered, stably-sized, non-zero element — cause not
|
|
40
|
-
* fully root-caused. A synchronous `getBoundingClientRect()` read in
|
|
41
|
-
* `useLayoutEffect`, re-run on `window`'s `resize` event, worked immediately
|
|
42
|
-
* and reliably in both environments instead.
|
|
43
|
-
*
|
|
44
|
-
* No-ops safely wherever `#sv-app-shell` doesn't exist (Storybook, a unit
|
|
45
|
-
* test, or any host other than the platform's own runtime shell) — every CSS
|
|
46
|
-
* consumer reads these variables with a `60px` fallback, so an absent
|
|
47
|
-
* override is harmless.
|
|
48
|
-
*
|
|
49
|
-
* For `--sv-shell-header-height` specifically, this also mirrors the same
|
|
50
|
-
* measured height onto `--sv-dialog-inset-top` on `:root` (`document.
|
|
51
|
-
* documentElement`, not `#sv-app-shell`) — `Dialog`'s mobile `.scrim` is
|
|
52
|
-
* `position: fixed` and reads that variable for its own `top` offset, and
|
|
53
|
-
* per `globals.css`'s own comment, iOS Safari has a documented quirk where a
|
|
54
|
-
* `position: fixed` element inherits custom properties from `:root` rather
|
|
55
|
-
* than from its DOM ancestors, so a value set only on `#sv-app-shell` (an
|
|
56
|
-
* ancestor, not `:root`) silently never reaches it there. The platform's own
|
|
57
|
-
* header already keeps `--sv-dialog-inset-top` correct this way, via
|
|
58
|
-
* `ClientShell.tsx`'s own `syncViewport()` — but that function is part of
|
|
59
|
-
* `(platform)/layout.tsx` and never runs for a `shell: minimal` plugin, so a
|
|
60
|
-
* self-rendered `MobileHeader` (this hook's entire reason to exist) had no
|
|
61
|
-
* equivalent, and `--sv-dialog-inset-top` silently kept `globals.css`'s
|
|
62
|
-
* hardcoded platform-header-height fallback (60px) regardless of this
|
|
63
|
-
* header's real height. Found live in `sovereign-plugin-kanban`: its
|
|
64
|
-
* self-rendered header measures 69px, so its card-detail `Dialog` opened
|
|
65
|
-
* with a real, reproducible ~9px misalignment against that header's own
|
|
66
|
-
* bottom edge — confirmed via `getBoundingClientRect()` on both elements,
|
|
67
|
-
* not just visually. */
|
|
68
|
-
export function usePublishShellChromeHeight(
|
|
69
|
-
ref: RefObject<HTMLElement | null>,
|
|
70
|
-
cssVariable: '--sv-shell-header-height' | '--sv-shell-footer-height',
|
|
71
|
-
) {
|
|
72
|
-
useLayoutEffect(() => {
|
|
73
|
-
const el = ref.current;
|
|
74
|
-
if (!el) return;
|
|
75
|
-
|
|
76
|
-
function publish() {
|
|
77
|
-
const shell = document.getElementById('sv-app-shell');
|
|
78
|
-
if (!shell || !el) return;
|
|
79
|
-
const height = `${el.getBoundingClientRect().height}px`;
|
|
80
|
-
shell.style.setProperty(cssVariable, height);
|
|
81
|
-
if (cssVariable === '--sv-shell-header-height') {
|
|
82
|
-
document.documentElement.style.setProperty('--sv-dialog-inset-top', height);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
publish();
|
|
87
|
-
window.addEventListener('resize', publish);
|
|
88
|
-
return () => {
|
|
89
|
-
window.removeEventListener('resize', publish);
|
|
90
|
-
document.getElementById('sv-app-shell')?.style.removeProperty(cssVariable);
|
|
91
|
-
if (cssVariable === '--sv-shell-header-height') {
|
|
92
|
-
document.documentElement.style.removeProperty('--sv-dialog-inset-top');
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
}, [ref, cssVariable]);
|
|
96
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
KeyboardSensor,
|
|
5
|
-
MouseSensor as LibMouseSensor,
|
|
6
|
-
TouchSensor as LibTouchSensor,
|
|
7
|
-
useSensor,
|
|
8
|
-
useSensors,
|
|
9
|
-
} from '@dnd-kit/core';
|
|
10
|
-
import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
|
|
11
|
-
import type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from 'react';
|
|
12
|
-
|
|
13
|
-
/** Plain pointer drag (desktop, handle-initiated). */
|
|
14
|
-
const DEFAULT_MOUSE_ACTIVATION_DISTANCE_PX = 8;
|
|
15
|
-
|
|
16
|
-
/** Long-press-to-lift on touch. `delay` is how long a still hold takes before
|
|
17
|
-
* the row lifts; `tolerance` is how far the finger may drift during that
|
|
18
|
-
* hold before it's treated as a scroll instead — a finger that moves further
|
|
19
|
-
* than this within the delay window cancels activation and the native
|
|
20
|
-
* vertical scroll wins. */
|
|
21
|
-
const DEFAULT_TOUCH_ACTIVATION_DELAY_MS = 300;
|
|
22
|
-
const DEFAULT_TOUCH_ACTIVATION_TOLERANCE_PX = 8;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* True when a drag should be allowed to start from `target`. Refused when
|
|
26
|
-
* `target` sits inside an element marked `data-no-dnd` — a nested control
|
|
27
|
-
* (e.g. a visibility toggle) opts out so tapping it fires its own handler
|
|
28
|
-
* instead of lifting the row. Exported standalone so it's unit-testable
|
|
29
|
-
* without spinning up dnd-kit.
|
|
30
|
-
*/
|
|
31
|
-
export function shouldHandleDndEvent(target: EventTarget | null): boolean {
|
|
32
|
-
if (!(target instanceof Element)) return true;
|
|
33
|
-
return target.closest('[data-no-dnd]') === null;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface UseReorderSensorsOptions {
|
|
37
|
-
mouseActivationDistancePx?: number;
|
|
38
|
-
touchActivationDelayMs?: number;
|
|
39
|
-
touchActivationTolerancePx?: number;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// dnd-kit's documented pattern for scoping sensor activation to specific
|
|
43
|
-
// elements: subclass the built-in sensor and replace its static `activators`
|
|
44
|
-
// with a handler that inspects the originating event's target before
|
|
45
|
-
// deferring to the base activation logic (distance/delay/tolerance), which
|
|
46
|
-
// dnd-kit re-checks internally regardless of what this returns.
|
|
47
|
-
class MouseSensor extends LibMouseSensor {
|
|
48
|
-
static override activators = [
|
|
49
|
-
{
|
|
50
|
-
eventName: 'onMouseDown' as const,
|
|
51
|
-
handler: ({ nativeEvent: event }: ReactMouseEvent) => shouldHandleDndEvent(event.target),
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
class TouchSensor extends LibTouchSensor {
|
|
57
|
-
static override activators = [
|
|
58
|
-
{
|
|
59
|
-
eventName: 'onTouchStart' as const,
|
|
60
|
-
handler: ({ nativeEvent: event }: ReactTouchEvent) => shouldHandleDndEvent(event.target),
|
|
61
|
-
},
|
|
62
|
-
];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Sensor set for a `data-no-dnd`-aware drag-reorder list — MouseSensor for
|
|
67
|
-
* desktop's handle-initiated drag, TouchSensor for mobile's long-press lift
|
|
68
|
-
* (fixes reordering being unusable on iOS PWA/Safari, which never implements
|
|
69
|
-
* the native HTML5 Drag-and-Drop API for touch input), KeyboardSensor
|
|
70
|
-
* unchanged. A bare call keeps the historical 8px/300ms/8px defaults.
|
|
71
|
-
*/
|
|
72
|
-
export function useReorderSensors(options: UseReorderSensorsOptions = {}) {
|
|
73
|
-
const {
|
|
74
|
-
mouseActivationDistancePx = DEFAULT_MOUSE_ACTIVATION_DISTANCE_PX,
|
|
75
|
-
touchActivationDelayMs = DEFAULT_TOUCH_ACTIVATION_DELAY_MS,
|
|
76
|
-
touchActivationTolerancePx = DEFAULT_TOUCH_ACTIVATION_TOLERANCE_PX,
|
|
77
|
-
} = options;
|
|
78
|
-
return useSensors(
|
|
79
|
-
useSensor(MouseSensor, { activationConstraint: { distance: mouseActivationDistancePx } }),
|
|
80
|
-
useSensor(TouchSensor, {
|
|
81
|
-
activationConstraint: {
|
|
82
|
-
delay: touchActivationDelayMs,
|
|
83
|
-
tolerance: touchActivationTolerancePx,
|
|
84
|
-
},
|
|
85
|
-
}),
|
|
86
|
-
useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
|
|
87
|
-
);
|
|
88
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useIsMobile } from './useIsMobile';
|
|
4
|
-
|
|
5
|
-
export interface UseResponsiveLayoutOptions<TWeb, TMobile> {
|
|
6
|
-
web: TWeb;
|
|
7
|
-
mobile: TMobile;
|
|
8
|
-
breakpointPx?: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface UseResponsiveLayoutResult<TWeb, TMobile> {
|
|
12
|
-
isMobile: boolean;
|
|
13
|
-
value: TWeb | TMobile;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* useResponsiveLayout — picks between a `web` and `mobile` value for the
|
|
18
|
-
* current viewport, built on `useIsMobile` (same breakpoint/SSR-safe-default
|
|
19
|
-
* behavior, not reimplemented here). Generic over the value type so it works
|
|
20
|
-
* for JSX (the common case — forking an entire component tree, not just a
|
|
21
|
-
* class name) or any other per-breakpoint value a plugin wants to pick
|
|
22
|
-
* without repeating the isMobile-ternary boilerplate every call site.
|
|
23
|
-
*
|
|
24
|
-
* This formalizes the `if (isMobile) return <mobile/>; return <web/>;` fork
|
|
25
|
-
* plugins have hand-rolled per-plugin (e.g. a `MobileAwareShell` component
|
|
26
|
-
* that swaps an entire routed page tree for a client-only mobile one) —
|
|
27
|
-
* see `ResponsiveSurface` for the equivalent as a plain JSX component.
|
|
28
|
-
*/
|
|
29
|
-
export function useResponsiveLayout<TWeb, TMobile>({
|
|
30
|
-
web,
|
|
31
|
-
mobile,
|
|
32
|
-
breakpointPx,
|
|
33
|
-
}: UseResponsiveLayoutOptions<TWeb, TMobile>): UseResponsiveLayoutResult<TWeb, TMobile> {
|
|
34
|
-
const isMobile = useIsMobile(breakpointPx);
|
|
35
|
-
return { isMobile, value: isMobile ? mobile : web };
|
|
36
|
-
}
|