@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,313 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { Children, isValidElement, useEffect, useRef, useState } from 'react';
|
|
4
|
-
import type {
|
|
5
|
-
CSSProperties,
|
|
6
|
-
KeyboardEvent as ReactKeyboardEvent,
|
|
7
|
-
PointerEvent as ReactPointerEvent,
|
|
8
|
-
ReactElement,
|
|
9
|
-
ReactNode,
|
|
10
|
-
} from 'react';
|
|
11
|
-
import styles from './Resizable.module.css';
|
|
12
|
-
|
|
13
|
-
export type ResizableDirection = 'horizontal' | 'vertical';
|
|
14
|
-
|
|
15
|
-
export interface ResizablePanelProps {
|
|
16
|
-
/** Initial size as a percentage of the group's main axis. Defaults to an
|
|
17
|
-
* equal split across all panels in the group. */
|
|
18
|
-
defaultSize?: number;
|
|
19
|
-
/** Minimum size as a percentage. Defaults to 10. */
|
|
20
|
-
minSize?: number;
|
|
21
|
-
/** Maximum size as a percentage. Defaults to 90. */
|
|
22
|
-
maxSize?: number;
|
|
23
|
-
children?: ReactNode;
|
|
24
|
-
className?: string;
|
|
25
|
-
/** Injected by ResizablePanelGroup — not part of the public API. */
|
|
26
|
-
style?: CSSProperties;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** One pane of a ResizablePanelGroup. Sizing is computed and injected by the
|
|
30
|
-
* group (via defaultSize/minSize/maxSize read off this element's props) —
|
|
31
|
-
* this component only renders the scrollable content box. */
|
|
32
|
-
export function ResizablePanel({ children, className, style }: ResizablePanelProps) {
|
|
33
|
-
return (
|
|
34
|
-
<div className={[styles.panel, className].filter(Boolean).join(' ')} style={style}>
|
|
35
|
-
{children}
|
|
36
|
-
</div>
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface ResizableHandleProps {
|
|
41
|
-
'aria-label'?: string;
|
|
42
|
-
/** Injected by ResizablePanelGroup — not part of the public API. */
|
|
43
|
-
direction?: ResizableDirection;
|
|
44
|
-
onPointerDown?: (e: ReactPointerEvent<HTMLDivElement>) => void;
|
|
45
|
-
onKeyDown?: (e: ReactKeyboardEvent<HTMLDivElement>) => void;
|
|
46
|
-
'aria-valuenow'?: number;
|
|
47
|
-
'aria-valuemin'?: number;
|
|
48
|
-
'aria-valuemax'?: number;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** The draggable divider between two ResizablePanels. Placed directly
|
|
52
|
-
* between the two ResizablePanel elements it resizes — the group pairs each
|
|
53
|
-
* handle with its preceding and following panel by position.
|
|
54
|
-
*
|
|
55
|
-
* A `div` with `role="separator"` and `tabIndex=0` (the WAI-ARIA "window
|
|
56
|
-
* splitter" pattern), not a `<button>` — `separator` is a non-interactive
|
|
57
|
-
* role, and a native button's implicit role can't be overridden to it. */
|
|
58
|
-
export function ResizableHandle({
|
|
59
|
-
'aria-label': ariaLabel = 'Resize panels',
|
|
60
|
-
direction = 'horizontal',
|
|
61
|
-
onPointerDown,
|
|
62
|
-
onKeyDown,
|
|
63
|
-
'aria-valuenow': valueNow,
|
|
64
|
-
'aria-valuemin': valueMin,
|
|
65
|
-
'aria-valuemax': valueMax,
|
|
66
|
-
}: ResizableHandleProps) {
|
|
67
|
-
return (
|
|
68
|
-
/* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex -- WAI-ARIA "window splitter" pattern: a focusable, keyboard-operable separator is the documented exception to role="separator" being non-interactive (https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/). */
|
|
69
|
-
<div
|
|
70
|
-
className={[styles.handle, direction === 'vertical' ? styles.handleVertical : '']
|
|
71
|
-
.filter(Boolean)
|
|
72
|
-
.join(' ')}
|
|
73
|
-
role="separator"
|
|
74
|
-
tabIndex={0}
|
|
75
|
-
aria-orientation={direction === 'horizontal' ? 'vertical' : 'horizontal'}
|
|
76
|
-
aria-label={ariaLabel}
|
|
77
|
-
aria-valuenow={valueNow !== undefined ? Math.round(valueNow) : undefined}
|
|
78
|
-
aria-valuemin={valueMin}
|
|
79
|
-
aria-valuemax={valueMax}
|
|
80
|
-
onPointerDown={onPointerDown}
|
|
81
|
-
onKeyDown={onKeyDown}
|
|
82
|
-
/>
|
|
83
|
-
/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export interface ResizablePanelGroupProps {
|
|
88
|
-
direction: ResizableDirection;
|
|
89
|
-
/** Alternating ResizablePanel / ResizableHandle elements — N panels
|
|
90
|
-
* separated by N-1 handles. */
|
|
91
|
-
children: ReactNode;
|
|
92
|
-
className?: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
interface PanelConstraint {
|
|
96
|
-
defaultSize: number;
|
|
97
|
-
minSize: number;
|
|
98
|
-
maxSize: number;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* ResizablePanelGroup — a row or column of resizable panes (editor layouts,
|
|
105
|
-
* multi-pane inspectors). Each handle resizes only its two immediate
|
|
106
|
-
* neighbor panels (drag redistributes size between them, clamped to both
|
|
107
|
-
* panels' own min/max, so their combined size is a fixed invariant for the
|
|
108
|
-
* duration of one drag) — the same handle-local model most resizable-panel
|
|
109
|
-
* implementations use, rather than redistributing across the whole group.
|
|
110
|
-
*
|
|
111
|
-
* Desktop-oriented, like NavigationMenu — a drag handle has no direct touch
|
|
112
|
-
* equivalent; panels render at their default sizes on touch rather than
|
|
113
|
-
* attempting a redesign no consumer has asked for yet. For a two-pane
|
|
114
|
-
* layout that also needs a mobile single-column fallback, use SplitPane
|
|
115
|
-
* instead.
|
|
116
|
-
*
|
|
117
|
-
* `direction="vertical"` needs a definite-height ancestor — percentage
|
|
118
|
-
* flex-basis on a column's children only resolves against one.
|
|
119
|
-
*/
|
|
120
|
-
export function ResizablePanelGroup({ direction, children, className }: ResizablePanelGroupProps) {
|
|
121
|
-
const elements = Children.toArray(children).filter(isValidElement) as ReactElement<
|
|
122
|
-
ResizablePanelProps | ResizableHandleProps
|
|
123
|
-
>[];
|
|
124
|
-
const panelCount = elements.filter((el) => el.type === ResizablePanel).length;
|
|
125
|
-
|
|
126
|
-
const constraints: PanelConstraint[] = elements
|
|
127
|
-
.filter((el) => el.type === ResizablePanel)
|
|
128
|
-
.map((el) => {
|
|
129
|
-
const props = el.props as ResizablePanelProps;
|
|
130
|
-
return {
|
|
131
|
-
defaultSize: props.defaultSize ?? 100 / panelCount,
|
|
132
|
-
minSize: props.minSize ?? 10,
|
|
133
|
-
maxSize: props.maxSize ?? 90,
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
const [sizes, setSizes] = useState<number[]>(() => constraints.map((c) => c.defaultSize));
|
|
138
|
-
|
|
139
|
-
// A different set of panels rendered (count changed) — re-derive rather
|
|
140
|
-
// than keep stale entries. Legal "adjust state during render" pattern;
|
|
141
|
-
// sizes.length matches constraints.length again on the next render, so
|
|
142
|
-
// this cannot loop.
|
|
143
|
-
if (sizes.length !== constraints.length) {
|
|
144
|
-
setSizes(constraints.map((c) => c.defaultSize));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const containerRef = useRef<HTMLDivElement>(null);
|
|
148
|
-
// Always-latest refs so the window-level pointer listeners (registered
|
|
149
|
-
// once, see below) never read stale values without needing to be
|
|
150
|
-
// re-registered on every render.
|
|
151
|
-
const constraintsRef = useRef(constraints);
|
|
152
|
-
constraintsRef.current = constraints;
|
|
153
|
-
const directionRef = useRef(direction);
|
|
154
|
-
directionRef.current = direction;
|
|
155
|
-
|
|
156
|
-
const dragState = useRef<{
|
|
157
|
-
handleIndex: number;
|
|
158
|
-
pointerId: number;
|
|
159
|
-
startPos: number;
|
|
160
|
-
startA: number;
|
|
161
|
-
combined: number;
|
|
162
|
-
} | null>(null);
|
|
163
|
-
|
|
164
|
-
function applyResize(handleIndex: number, nextA: number, combined: number) {
|
|
165
|
-
const a = constraintsRef.current[handleIndex];
|
|
166
|
-
const b = constraintsRef.current[handleIndex + 1];
|
|
167
|
-
if (!a || !b) return;
|
|
168
|
-
const clampedA = clamp(
|
|
169
|
-
nextA,
|
|
170
|
-
Math.max(a.minSize, combined - b.maxSize),
|
|
171
|
-
Math.min(a.maxSize, combined - b.minSize),
|
|
172
|
-
);
|
|
173
|
-
setSizes((prev) => {
|
|
174
|
-
const next = [...prev];
|
|
175
|
-
next[handleIndex] = clampedA;
|
|
176
|
-
next[handleIndex + 1] = combined - clampedA;
|
|
177
|
-
return next;
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
useEffect(() => {
|
|
182
|
-
function handlePointerMove(event: globalThis.PointerEvent) {
|
|
183
|
-
const drag = dragState.current;
|
|
184
|
-
const rect = containerRef.current?.getBoundingClientRect();
|
|
185
|
-
if (!drag || !rect || event.pointerId !== drag.pointerId) return;
|
|
186
|
-
const size = directionRef.current === 'horizontal' ? rect.width : rect.height;
|
|
187
|
-
if (size === 0) return;
|
|
188
|
-
const pos = directionRef.current === 'horizontal' ? event.clientX : event.clientY;
|
|
189
|
-
const deltaPercent = ((pos - drag.startPos) / size) * 100;
|
|
190
|
-
applyResize(drag.handleIndex, drag.startA + deltaPercent, drag.combined);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function stopDragging(event: globalThis.PointerEvent) {
|
|
194
|
-
if (!dragState.current || event.pointerId !== dragState.current.pointerId) return;
|
|
195
|
-
dragState.current = null;
|
|
196
|
-
document.body.style.cursor = '';
|
|
197
|
-
document.body.style.userSelect = '';
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
window.addEventListener('pointermove', handlePointerMove);
|
|
201
|
-
window.addEventListener('pointerup', stopDragging);
|
|
202
|
-
window.addEventListener('pointercancel', stopDragging);
|
|
203
|
-
return () => {
|
|
204
|
-
window.removeEventListener('pointermove', handlePointerMove);
|
|
205
|
-
window.removeEventListener('pointerup', stopDragging);
|
|
206
|
-
window.removeEventListener('pointercancel', stopDragging);
|
|
207
|
-
document.body.style.cursor = '';
|
|
208
|
-
document.body.style.userSelect = '';
|
|
209
|
-
};
|
|
210
|
-
// Registered once — handlePointerMove reads live state via refs instead
|
|
211
|
-
// of closing over props/state that would otherwise need to be deps.
|
|
212
|
-
}, []);
|
|
213
|
-
|
|
214
|
-
function startDragging(handleIndex: number, event: ReactPointerEvent<HTMLDivElement>) {
|
|
215
|
-
const startA = sizes[handleIndex] ?? 0;
|
|
216
|
-
const startB = sizes[handleIndex + 1] ?? 0;
|
|
217
|
-
dragState.current = {
|
|
218
|
-
handleIndex,
|
|
219
|
-
pointerId: event.pointerId,
|
|
220
|
-
startPos: direction === 'horizontal' ? event.clientX : event.clientY,
|
|
221
|
-
startA,
|
|
222
|
-
combined: startA + startB,
|
|
223
|
-
};
|
|
224
|
-
document.body.style.cursor = direction === 'horizontal' ? 'col-resize' : 'row-resize';
|
|
225
|
-
document.body.style.userSelect = 'none';
|
|
226
|
-
event.currentTarget.setPointerCapture(event.pointerId);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function resizeWithKeyboard(handleIndex: number, event: ReactKeyboardEvent<HTMLDivElement>) {
|
|
230
|
-
const step = event.shiftKey ? 10 : 5;
|
|
231
|
-
const forwardKey = direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown';
|
|
232
|
-
const backwardKey = direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';
|
|
233
|
-
const sizeA = sizes[handleIndex] ?? 0;
|
|
234
|
-
const sizeB = sizes[handleIndex + 1] ?? 0;
|
|
235
|
-
const combined = sizeA + sizeB;
|
|
236
|
-
if (event.key === forwardKey) {
|
|
237
|
-
event.preventDefault();
|
|
238
|
-
applyResize(handleIndex, sizeA + step, combined);
|
|
239
|
-
} else if (event.key === backwardKey) {
|
|
240
|
-
event.preventDefault();
|
|
241
|
-
applyResize(handleIndex, sizeA - step, combined);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
let panelIndex = -1;
|
|
246
|
-
let handleIndex = -1;
|
|
247
|
-
|
|
248
|
-
return (
|
|
249
|
-
<div
|
|
250
|
-
ref={containerRef}
|
|
251
|
-
className={[styles.group, direction === 'vertical' ? styles.groupVertical : '', className]
|
|
252
|
-
.filter(Boolean)
|
|
253
|
-
.join(' ')}
|
|
254
|
-
>
|
|
255
|
-
{elements.map((element, key) => {
|
|
256
|
-
if (element.type === ResizablePanel) {
|
|
257
|
-
panelIndex += 1;
|
|
258
|
-
const size = sizes[panelIndex] ?? constraints[panelIndex]?.defaultSize ?? 0;
|
|
259
|
-
return (
|
|
260
|
-
<ResizablePanelClone
|
|
261
|
-
key={key}
|
|
262
|
-
element={element as ReactElement<ResizablePanelProps>}
|
|
263
|
-
flexBasis={size}
|
|
264
|
-
/>
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
if (element.type === ResizableHandle) {
|
|
268
|
-
handleIndex += 1;
|
|
269
|
-
const index = handleIndex;
|
|
270
|
-
const constraint = constraints[index];
|
|
271
|
-
return (
|
|
272
|
-
<ResizableHandleClone
|
|
273
|
-
key={key}
|
|
274
|
-
element={element as ReactElement<ResizableHandleProps>}
|
|
275
|
-
direction={direction}
|
|
276
|
-
aria-valuenow={sizes[index]}
|
|
277
|
-
aria-valuemin={constraint?.minSize}
|
|
278
|
-
aria-valuemax={constraint?.maxSize}
|
|
279
|
-
onPointerDown={(e) => startDragging(index, e)}
|
|
280
|
-
onKeyDown={(e) => resizeWithKeyboard(index, e)}
|
|
281
|
-
/>
|
|
282
|
-
);
|
|
283
|
-
}
|
|
284
|
-
return element;
|
|
285
|
-
})}
|
|
286
|
-
</div>
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function ResizablePanelClone({
|
|
291
|
-
element,
|
|
292
|
-
flexBasis,
|
|
293
|
-
}: {
|
|
294
|
-
element: ReactElement<ResizablePanelProps>;
|
|
295
|
-
flexBasis: number;
|
|
296
|
-
}) {
|
|
297
|
-
const style: CSSProperties = {
|
|
298
|
-
...element.props.style,
|
|
299
|
-
flexBasis: `${flexBasis}%`,
|
|
300
|
-
flexGrow: 0,
|
|
301
|
-
flexShrink: 0,
|
|
302
|
-
};
|
|
303
|
-
return <ResizablePanel {...element.props} style={style} />;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function ResizableHandleClone({
|
|
307
|
-
element,
|
|
308
|
-
...injected
|
|
309
|
-
}: {
|
|
310
|
-
element: ReactElement<ResizableHandleProps>;
|
|
311
|
-
} & ResizableHandleProps) {
|
|
312
|
-
return <ResizableHandle {...element.props} {...injected} />;
|
|
313
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
|
-
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
|
|
4
|
-
import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../Resizable';
|
|
5
|
-
|
|
6
|
-
afterEach(cleanup);
|
|
7
|
-
|
|
8
|
-
describe('ResizablePanelGroup', () => {
|
|
9
|
-
it('renders each panel and a separator between them', () => {
|
|
10
|
-
render(
|
|
11
|
-
<ResizablePanelGroup direction="horizontal">
|
|
12
|
-
<ResizablePanel>
|
|
13
|
-
<p>Left</p>
|
|
14
|
-
</ResizablePanel>
|
|
15
|
-
<ResizableHandle aria-label="Resize sidebar" />
|
|
16
|
-
<ResizablePanel>
|
|
17
|
-
<p>Right</p>
|
|
18
|
-
</ResizablePanel>
|
|
19
|
-
</ResizablePanelGroup>,
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
expect(screen.getByText('Left')).toBeDefined();
|
|
23
|
-
expect(screen.getByText('Right')).toBeDefined();
|
|
24
|
-
expect(screen.getByRole('separator', { name: 'Resize sidebar' })).toBeDefined();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('splits panels evenly by default', () => {
|
|
28
|
-
render(
|
|
29
|
-
<ResizablePanelGroup direction="horizontal">
|
|
30
|
-
<ResizablePanel>
|
|
31
|
-
<p>Left</p>
|
|
32
|
-
</ResizablePanel>
|
|
33
|
-
<ResizableHandle aria-label="Resize" />
|
|
34
|
-
<ResizablePanel>
|
|
35
|
-
<p>Right</p>
|
|
36
|
-
</ResizablePanel>
|
|
37
|
-
</ResizablePanelGroup>,
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const separator = screen.getByRole('separator', { name: 'Resize' });
|
|
41
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('50');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('resizes the pair of neighboring panels with the keyboard, redistributing their combined size', () => {
|
|
45
|
-
render(
|
|
46
|
-
<ResizablePanelGroup direction="horizontal">
|
|
47
|
-
<ResizablePanel defaultSize={50} minSize={20} maxSize={80}>
|
|
48
|
-
<p>Left</p>
|
|
49
|
-
</ResizablePanel>
|
|
50
|
-
<ResizableHandle aria-label="Resize" />
|
|
51
|
-
<ResizablePanel defaultSize={50} minSize={20} maxSize={80}>
|
|
52
|
-
<p>Right</p>
|
|
53
|
-
</ResizablePanel>
|
|
54
|
-
</ResizablePanelGroup>,
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const separator = screen.getByRole('separator', { name: 'Resize' });
|
|
58
|
-
fireEvent.keyDown(separator, { key: 'ArrowRight' });
|
|
59
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('55');
|
|
60
|
-
|
|
61
|
-
fireEvent.keyDown(separator, { key: 'ArrowLeft', shiftKey: true });
|
|
62
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('45');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('clamps keyboard resizing to minSize/maxSize', () => {
|
|
66
|
-
render(
|
|
67
|
-
<ResizablePanelGroup direction="horizontal">
|
|
68
|
-
<ResizablePanel defaultSize={50} minSize={45} maxSize={55}>
|
|
69
|
-
<p>Left</p>
|
|
70
|
-
</ResizablePanel>
|
|
71
|
-
<ResizableHandle aria-label="Resize" />
|
|
72
|
-
<ResizablePanel defaultSize={50} minSize={45} maxSize={55}>
|
|
73
|
-
<p>Right</p>
|
|
74
|
-
</ResizablePanel>
|
|
75
|
-
</ResizablePanelGroup>,
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
const separator = screen.getByRole('separator', { name: 'Resize' });
|
|
79
|
-
fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
|
|
80
|
-
fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
|
|
81
|
-
fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
|
|
82
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('55');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('only affects the pair of panels adjacent to the handle that moved', () => {
|
|
86
|
-
render(
|
|
87
|
-
<ResizablePanelGroup direction="horizontal">
|
|
88
|
-
<ResizablePanel defaultSize={34}>
|
|
89
|
-
<p>A</p>
|
|
90
|
-
</ResizablePanel>
|
|
91
|
-
<ResizableHandle aria-label="Resize A-B" />
|
|
92
|
-
<ResizablePanel defaultSize={33}>
|
|
93
|
-
<p>B</p>
|
|
94
|
-
</ResizablePanel>
|
|
95
|
-
<ResizableHandle aria-label="Resize B-C" />
|
|
96
|
-
<ResizablePanel defaultSize={33}>
|
|
97
|
-
<p>C</p>
|
|
98
|
-
</ResizablePanel>
|
|
99
|
-
</ResizablePanelGroup>,
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
const first = screen.getByRole('separator', { name: 'Resize A-B' });
|
|
103
|
-
const second = screen.getByRole('separator', { name: 'Resize B-C' });
|
|
104
|
-
fireEvent.keyDown(first, { key: 'ArrowRight' });
|
|
105
|
-
expect(second.getAttribute('aria-valuenow')).toBe('28');
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it('uses ArrowDown/ArrowUp for vertical groups instead of ArrowRight/ArrowLeft', () => {
|
|
109
|
-
render(
|
|
110
|
-
<ResizablePanelGroup direction="vertical">
|
|
111
|
-
<ResizablePanel defaultSize={50}>
|
|
112
|
-
<p>Top</p>
|
|
113
|
-
</ResizablePanel>
|
|
114
|
-
<ResizableHandle aria-label="Resize" />
|
|
115
|
-
<ResizablePanel defaultSize={50}>
|
|
116
|
-
<p>Bottom</p>
|
|
117
|
-
</ResizablePanel>
|
|
118
|
-
</ResizablePanelGroup>,
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
const separator = screen.getByRole('separator', { name: 'Resize' });
|
|
122
|
-
expect(separator.getAttribute('aria-orientation')).toBe('horizontal');
|
|
123
|
-
fireEvent.keyDown(separator, { key: 'ArrowRight' });
|
|
124
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('50');
|
|
125
|
-
fireEvent.keyDown(separator, { key: 'ArrowDown' });
|
|
126
|
-
expect(separator.getAttribute('aria-valuenow')).toBe('55');
|
|
127
|
-
});
|
|
128
|
-
});
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
import { useResponsiveLayout } from '../../hooks/useResponsiveLayout';
|
|
3
|
-
|
|
4
|
-
export interface ResponsiveSurfaceProps {
|
|
5
|
-
web: ReactNode;
|
|
6
|
-
mobile: ReactNode;
|
|
7
|
-
breakpointPx?: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* ResponsiveSurface — thin JSX convenience wrapper around
|
|
12
|
-
* `useResponsiveLayout` for the common two-tree case: render an entirely
|
|
13
|
-
* different component tree below the breakpoint, not a CSS squeeze of the
|
|
14
|
-
* same one. Renders only whichever side is active — the other tree is never
|
|
15
|
-
* mounted.
|
|
16
|
-
*
|
|
17
|
-
* This does not replace a plugin's own shell component (e.g. a
|
|
18
|
-
* `MobileAwareShell` that also threads plugin-specific props like a refresh
|
|
19
|
-
* signal) — those stay a thin per-plugin wrapper around this.
|
|
20
|
-
*/
|
|
21
|
-
export function ResponsiveSurface({ web, mobile, breakpointPx }: ResponsiveSurfaceProps) {
|
|
22
|
-
const { value } = useResponsiveLayout({ web, mobile, breakpointPx });
|
|
23
|
-
return <>{value}</>;
|
|
24
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
// @vitest-environment jsdom
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { act, cleanup, render, screen } from '@testing-library/react';
|
|
4
|
-
import { ResponsiveSurface } from '../ResponsiveSurface';
|
|
5
|
-
|
|
6
|
-
let changeHandler: ((e: MediaQueryListEvent) => void) | null = null;
|
|
7
|
-
let matches = false;
|
|
8
|
-
|
|
9
|
-
function installMatchMedia() {
|
|
10
|
-
changeHandler = null;
|
|
11
|
-
vi.stubGlobal(
|
|
12
|
-
'matchMedia',
|
|
13
|
-
vi.fn().mockImplementation((query: string) => ({
|
|
14
|
-
matches,
|
|
15
|
-
media: query,
|
|
16
|
-
addEventListener: (_: string, cb: (e: MediaQueryListEvent) => void) => {
|
|
17
|
-
changeHandler = cb;
|
|
18
|
-
},
|
|
19
|
-
removeEventListener: vi.fn(),
|
|
20
|
-
addListener: vi.fn(),
|
|
21
|
-
removeListener: vi.fn(),
|
|
22
|
-
dispatchEvent: vi.fn(),
|
|
23
|
-
})),
|
|
24
|
-
);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
describe('ResponsiveSurface', () => {
|
|
28
|
-
beforeEach(() => {
|
|
29
|
-
matches = false;
|
|
30
|
-
installMatchMedia();
|
|
31
|
-
});
|
|
32
|
-
afterEach(() => {
|
|
33
|
-
vi.unstubAllGlobals();
|
|
34
|
-
cleanup();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('renders the web tree by default and never mounts the mobile tree', () => {
|
|
38
|
-
render(
|
|
39
|
-
<ResponsiveSurface
|
|
40
|
-
web={<div data-testid="web">web</div>}
|
|
41
|
-
mobile={<div data-testid="mobile">mobile</div>}
|
|
42
|
-
/>,
|
|
43
|
-
);
|
|
44
|
-
expect(screen.getByTestId('web')).toBeDefined();
|
|
45
|
-
expect(screen.queryByTestId('mobile')).toBeNull();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('renders only the mobile tree below the breakpoint', () => {
|
|
49
|
-
matches = true;
|
|
50
|
-
installMatchMedia();
|
|
51
|
-
render(
|
|
52
|
-
<ResponsiveSurface
|
|
53
|
-
web={<div data-testid="web">web</div>}
|
|
54
|
-
mobile={<div data-testid="mobile">mobile</div>}
|
|
55
|
-
/>,
|
|
56
|
-
);
|
|
57
|
-
expect(screen.getByTestId('mobile')).toBeDefined();
|
|
58
|
-
expect(screen.queryByTestId('web')).toBeNull();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('swaps trees live when the viewport crosses the breakpoint', () => {
|
|
62
|
-
render(
|
|
63
|
-
<ResponsiveSurface
|
|
64
|
-
web={<div data-testid="web">web</div>}
|
|
65
|
-
mobile={<div data-testid="mobile">mobile</div>}
|
|
66
|
-
/>,
|
|
67
|
-
);
|
|
68
|
-
expect(screen.getByTestId('web')).toBeDefined();
|
|
69
|
-
act(() => changeHandler?.({ matches: true } as MediaQueryListEvent));
|
|
70
|
-
expect(screen.getByTestId('mobile')).toBeDefined();
|
|
71
|
-
expect(screen.queryByTestId('web')).toBeNull();
|
|
72
|
-
});
|
|
73
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/* A definite height, not min-height: ThreeColumnLayout/HeaderFooterLayout's
|
|
2
|
-
own .shell use height: 100% internally (fixed box, independently-
|
|
3
|
-
scrolling children via overflow-y: auto) — a percentage height only
|
|
4
|
-
resolves against an ancestor with a definite (not min-constrained)
|
|
5
|
-
height, so min-height here would leave their .shell unable to resolve
|
|
6
|
-
and collapse to content size. This doesn't clip taller content on its
|
|
7
|
-
own — nothing here sets overflow: hidden, so content taller than the
|
|
8
|
-
box simply overflows past it rather than being cut off. */
|
|
9
|
-
.root {
|
|
10
|
-
width: 100%;
|
|
11
|
-
height: 100%;
|
|
12
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { RootLayout } from './RootLayout';
|
|
3
|
-
|
|
4
|
-
function Block({ label }: { label: string }) {
|
|
5
|
-
return (
|
|
6
|
-
<div
|
|
7
|
-
style={{
|
|
8
|
-
display: 'flex',
|
|
9
|
-
alignItems: 'center',
|
|
10
|
-
justifyContent: 'center',
|
|
11
|
-
height: '100%',
|
|
12
|
-
padding: 'var(--sv-space-4)',
|
|
13
|
-
fontFamily: 'var(--sv-font-family)',
|
|
14
|
-
fontSize: 'var(--sv-font-size-sm)',
|
|
15
|
-
fontWeight: 600,
|
|
16
|
-
color: 'var(--sv-color-text-primary)',
|
|
17
|
-
background: 'var(--sv-color-surface-raised)',
|
|
18
|
-
}}
|
|
19
|
-
>
|
|
20
|
-
{label}
|
|
21
|
-
</div>
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const meta = {
|
|
26
|
-
title: 'Components/RootLayout',
|
|
27
|
-
component: RootLayout,
|
|
28
|
-
parameters: {
|
|
29
|
-
layout: 'fullscreen',
|
|
30
|
-
docs: {
|
|
31
|
-
description: {
|
|
32
|
-
component:
|
|
33
|
-
"The root-level layout a plugin's page tree sits in. Enforces only structure and dimensions — content always comes from children. Each variant is a fixed web+mobile pairing, not two independent axes; resize the viewport (or check the Mobile story) to see the fork. 'header' keeps the same header+main structure on both breakpoints, but headerHeight (48px, web) and mobileHeaderHeight (60px, mobile) are deliberately different — matching how real shell: minimal plugins do this in production.",
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
args: {
|
|
38
|
-
children: <Block label="Main" />,
|
|
39
|
-
},
|
|
40
|
-
} satisfies Meta<typeof RootLayout>;
|
|
41
|
-
|
|
42
|
-
export default meta;
|
|
43
|
-
type Story = StoryObj<typeof meta>;
|
|
44
|
-
|
|
45
|
-
/** variant="plain" is the prop's own default — a single child, no chrome. */
|
|
46
|
-
export const Default: Story = {
|
|
47
|
-
render: () => (
|
|
48
|
-
<div style={{ height: '100vh' }}>
|
|
49
|
-
<RootLayout variant="plain">
|
|
50
|
-
<Block label="Main" />
|
|
51
|
-
</RootLayout>
|
|
52
|
-
</div>
|
|
53
|
-
),
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export const Sidebar: Story = {
|
|
57
|
-
render: () => (
|
|
58
|
-
<div style={{ height: '100vh' }}>
|
|
59
|
-
<RootLayout variant="sidebar">
|
|
60
|
-
<Block label="Sidebar" />
|
|
61
|
-
<Block label="Main" />
|
|
62
|
-
</RootLayout>
|
|
63
|
-
</div>
|
|
64
|
-
),
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
export const SidebarMobile: Story = {
|
|
68
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
69
|
-
render: () => (
|
|
70
|
-
<div style={{ height: '100vh' }}>
|
|
71
|
-
<RootLayout variant="sidebar">
|
|
72
|
-
<Block label="Sidebar (hidden on mobile)" />
|
|
73
|
-
<Block label="Main" />
|
|
74
|
-
</RootLayout>
|
|
75
|
-
</div>
|
|
76
|
-
),
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export const Header: Story = {
|
|
80
|
-
render: () => (
|
|
81
|
-
<div style={{ height: '100vh' }}>
|
|
82
|
-
<RootLayout variant="header">
|
|
83
|
-
<Block label="Header (48px)" />
|
|
84
|
-
<Block label="Main" />
|
|
85
|
-
</RootLayout>
|
|
86
|
-
</div>
|
|
87
|
-
),
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
export const HeaderMobile: Story = {
|
|
91
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
92
|
-
render: () => (
|
|
93
|
-
<div style={{ height: '100vh' }}>
|
|
94
|
-
<RootLayout variant="header">
|
|
95
|
-
<Block label="Header (60px)" />
|
|
96
|
-
<Block label="Main" />
|
|
97
|
-
</RootLayout>
|
|
98
|
-
</div>
|
|
99
|
-
),
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
export const Shell: Story = {
|
|
103
|
-
render: () => (
|
|
104
|
-
<div style={{ height: '100vh' }}>
|
|
105
|
-
<RootLayout variant="shell">
|
|
106
|
-
<Block label="Header (mobile only)" />
|
|
107
|
-
<Block label="Main" />
|
|
108
|
-
<Block label="Footer (mobile only)" />
|
|
109
|
-
</RootLayout>
|
|
110
|
-
</div>
|
|
111
|
-
),
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
export const ShellMobile: Story = {
|
|
115
|
-
parameters: { viewport: { defaultViewport: 'mobile1' } },
|
|
116
|
-
render: () => (
|
|
117
|
-
<div style={{ height: '100vh' }}>
|
|
118
|
-
<RootLayout variant="shell">
|
|
119
|
-
<Block label="Header" />
|
|
120
|
-
<Block label="Main" />
|
|
121
|
-
<Block label="Footer" />
|
|
122
|
-
</RootLayout>
|
|
123
|
-
</div>
|
|
124
|
-
),
|
|
125
|
-
};
|