@sovereignfs/ui 0.45.0 → 0.83.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.
Files changed (323) hide show
  1. package/dist/Accordion.module.css +1 -1
  2. package/dist/Alert.module.css +1 -1
  3. package/dist/AppsLauncher.module.css +96 -0
  4. package/dist/Avatar.module.css +1 -1
  5. package/dist/Badge.module.css +30 -7
  6. package/dist/BalanceChip.module.css +1 -1
  7. package/dist/Button.module.css +18 -2
  8. package/dist/Card.module.css +1 -1
  9. package/dist/CardTile.module.css +181 -0
  10. package/dist/CodeTextarea.module.css +1 -1
  11. package/dist/Collapsible.module.css +1 -1
  12. package/dist/ColorPicker.module.css +132 -0
  13. package/dist/Combobox.module.css +2 -2
  14. package/dist/Command.module.css +1 -1
  15. package/dist/ConfirmDialog.module.css +2 -2
  16. package/dist/ConsentPrompt.module.css +21 -0
  17. package/dist/DatePicker.module.css +1 -1
  18. package/dist/Dialog.module.css +130 -21
  19. package/dist/Drawer.module.css +36 -7
  20. package/dist/Header.module.css +62 -0
  21. package/dist/HeaderFooterLayout.module.css +21 -0
  22. package/dist/IconPicker.module.css +1 -1
  23. package/dist/Input.module.css +1 -1
  24. package/dist/Kbd.module.css +1 -1
  25. package/dist/LegalLinks.module.css +24 -0
  26. package/dist/Markdown.module.css +73 -0
  27. package/dist/Menu.module.css +1 -0
  28. package/dist/Message.module.css +1 -1
  29. package/dist/MessageScroller.module.css +12 -1
  30. package/dist/MobileAppsDrawer.module.css +82 -0
  31. package/dist/MobileFooter.module.css +73 -0
  32. package/dist/MobileHeader.module.css +76 -0
  33. package/dist/NavList.module.css +130 -0
  34. package/dist/NavTabs.module.css +1 -1
  35. package/dist/NotificationsPanel.module.css +258 -0
  36. package/dist/OverlayHeader.module.css +1 -1
  37. package/dist/PageContainer.module.css +82 -0
  38. package/dist/PageHeader.module.css +54 -0
  39. package/dist/PageLayout.module.css +51 -0
  40. package/dist/Popover.module.css +1 -1
  41. package/dist/QuantityStepper.module.css +1 -1
  42. package/dist/Resizable.module.css +3 -3
  43. package/dist/RootLayout.module.css +12 -0
  44. package/dist/SegmentedControl.module.css +1 -1
  45. package/dist/Select.module.css +1 -1
  46. package/dist/Sheet.module.css +4 -1
  47. package/dist/SplitPane.module.css +4 -4
  48. package/dist/StatusBadge.module.css +1 -1
  49. package/dist/StepStrip.module.css +53 -0
  50. package/dist/SuggestionInput.module.css +2 -2
  51. package/dist/SwipableMobileCarousel.module.css +64 -0
  52. package/dist/SwipableMobileCarouselDots.module.css +64 -0
  53. package/dist/SwipableMobileCarouselSlideParts.module.css +29 -0
  54. package/dist/SwipeStack.module.css +101 -0
  55. package/dist/SystemBanner.module.css +10 -0
  56. package/dist/Table.module.css +2 -2
  57. package/dist/Tabs.module.css +1 -1
  58. package/dist/TagInput.module.css +2 -2
  59. package/dist/Textarea.module.css +9 -1
  60. package/dist/ThreeColumnLayout.module.css +35 -0
  61. package/dist/Toast.module.css +62 -3
  62. package/dist/Tooltip.module.css +1 -1
  63. package/dist/UserMenu.module.css +90 -0
  64. package/dist/index.d.ts +1680 -30
  65. package/dist/index.js +4618 -1443
  66. package/dist/tokens/primitives.css +36 -0
  67. package/dist/tokens/semantic.css +32 -0
  68. package/dist/tokens/theme-presets.css +33 -0
  69. package/package.json +32 -12
  70. package/src/__tests__/package-json.test.ts +8 -0
  71. package/src/components/Accordion/Accordion.module.css +1 -1
  72. package/src/components/Alert/Alert.module.css +1 -1
  73. package/src/components/AppsLauncher/AppsLauncher.module.css +96 -0
  74. package/src/components/AppsLauncher/AppsLauncher.stories.tsx +58 -0
  75. package/src/components/AppsLauncher/AppsLauncher.tsx +117 -0
  76. package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +52 -0
  77. package/src/components/Avatar/Avatar.module.css +1 -1
  78. package/src/components/Badge/Badge.module.css +30 -7
  79. package/src/components/Badge/Badge.stories.tsx +16 -4
  80. package/src/components/Badge/Badge.tsx +8 -11
  81. package/src/components/Badge/__tests__/Badge.test.tsx +4 -2
  82. package/src/components/BalanceChip/BalanceChip.module.css +1 -1
  83. package/src/components/Button/Button.module.css +18 -2
  84. package/src/components/Card/Card.module.css +1 -1
  85. package/src/components/CardTile/CardTile.module.css +181 -0
  86. package/src/components/CardTile/CardTile.stories.tsx +86 -0
  87. package/src/components/CardTile/CardTile.tsx +128 -0
  88. package/src/components/CardTile/__tests__/CardTile.test.tsx +56 -0
  89. package/src/components/CodeTextarea/CodeTextarea.module.css +1 -1
  90. package/src/components/Collapsible/Collapsible.module.css +1 -1
  91. package/src/components/ColorPicker/ColorPicker.module.css +132 -0
  92. package/src/components/ColorPicker/ColorPicker.stories.tsx +80 -0
  93. package/src/components/ColorPicker/ColorPicker.tsx +157 -0
  94. package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +117 -0
  95. package/src/components/Combobox/Combobox.module.css +2 -2
  96. package/src/components/Command/Command.module.css +1 -1
  97. package/src/components/ConfirmDialog/ConfirmDialog.module.css +2 -2
  98. package/src/components/ConfirmDialog/ConfirmDialog.tsx +28 -2
  99. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +71 -3
  100. package/src/components/ConsentPrompt/ConsentPrompt.module.css +21 -0
  101. package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +31 -0
  102. package/src/components/ConsentPrompt/ConsentPrompt.tsx +66 -0
  103. package/src/components/ContextMenu/ContextMenu.tsx +1 -1
  104. package/src/components/DatePicker/DatePicker.module.css +1 -1
  105. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +58 -0
  106. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +45 -0
  107. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +100 -0
  108. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +119 -0
  109. package/src/components/Dialog/Dialog.module.css +130 -21
  110. package/src/components/Dialog/Dialog.stories.tsx +179 -2
  111. package/src/components/Dialog/Dialog.tsx +137 -94
  112. package/src/components/Dialog/__tests__/Dialog.test.tsx +190 -9
  113. package/src/components/DragHandleRow/DragHandleRow.tsx +2 -21
  114. package/src/components/Drawer/Drawer.module.css +36 -7
  115. package/src/components/Drawer/Drawer.stories.tsx +44 -0
  116. package/src/components/Drawer/Drawer.tsx +27 -66
  117. package/src/components/Drawer/__tests__/Drawer.test.tsx +55 -6
  118. package/src/components/GripIcon/GripIcon.tsx +27 -0
  119. package/src/components/Header/Header.module.css +62 -0
  120. package/src/components/Header/Header.stories.tsx +452 -0
  121. package/src/components/Header/Header.tsx +102 -0
  122. package/src/components/Header/__tests__/Header.test.tsx +104 -0
  123. package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +21 -0
  124. package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +111 -0
  125. package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +54 -0
  126. package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +58 -0
  127. package/src/components/Icon/icons/arrow-left-right.tsx +23 -0
  128. package/src/components/Icon/icons/bold.tsx +20 -0
  129. package/src/components/Icon/icons/calendar.tsx +4 -4
  130. package/src/components/Icon/icons/carrot.tsx +3 -3
  131. package/src/components/Icon/icons/circle-chevron-left.tsx +21 -0
  132. package/src/components/Icon/icons/code.tsx +21 -0
  133. package/src/components/Icon/icons/copy.tsx +21 -0
  134. package/src/components/Icon/icons/credit-card.tsx +21 -0
  135. package/src/components/Icon/icons/database.tsx +22 -0
  136. package/src/components/Icon/icons/download.tsx +22 -0
  137. package/src/components/Icon/icons/file-text.tsx +24 -0
  138. package/src/components/Icon/icons/folder-closed.tsx +21 -0
  139. package/src/components/Icon/icons/folder-open.tsx +20 -0
  140. package/src/components/Icon/icons/folder.tsx +20 -0
  141. package/src/components/Icon/icons/folders.tsx +21 -0
  142. package/src/components/Icon/icons/hat-glasses.tsx +24 -0
  143. package/src/components/Icon/icons/history.tsx +22 -0
  144. package/src/components/Icon/icons/inbox.tsx +21 -0
  145. package/src/components/Icon/icons/index.ts +169 -1
  146. package/src/components/Icon/icons/italic.tsx +22 -0
  147. package/src/components/Icon/icons/layers.tsx +22 -0
  148. package/src/components/Icon/icons/layout-dashboard.tsx +23 -0
  149. package/src/components/Icon/icons/layout-grid.tsx +23 -0
  150. package/src/components/Icon/icons/link.tsx +21 -0
  151. package/src/components/Icon/icons/list-ordered.tsx +25 -0
  152. package/src/components/Icon/icons/list.tsx +25 -0
  153. package/src/components/Icon/icons/luggage.tsx +24 -0
  154. package/src/components/Icon/icons/map-pin.tsx +21 -0
  155. package/src/components/Icon/icons/menu.tsx +22 -0
  156. package/src/components/Icon/icons/minus.tsx +20 -0
  157. package/src/components/Icon/icons/paint-bucket.tsx +23 -0
  158. package/src/components/Icon/icons/panel-left.tsx +21 -0
  159. package/src/components/Icon/icons/pin.tsx +21 -0
  160. package/src/components/Icon/icons/rectangle-ellipsis.tsx +23 -0
  161. package/src/components/Icon/icons/refresh-cw.tsx +23 -0
  162. package/src/components/Icon/icons/rotate-cw.tsx +21 -0
  163. package/src/components/Icon/icons/route.tsx +22 -0
  164. package/src/components/Icon/icons/send.tsx +21 -0
  165. package/src/components/Icon/icons/share-2.tsx +24 -0
  166. package/src/components/Icon/icons/sheet.tsx +24 -0
  167. package/src/components/Icon/icons/smartphone.tsx +21 -0
  168. package/src/components/Icon/icons/square-kanban.tsx +23 -0
  169. package/src/components/Icon/icons/table.tsx +23 -0
  170. package/src/components/Icon/icons/user-round-plus.tsx +23 -0
  171. package/src/components/Icon/icons/users.tsx +23 -0
  172. package/src/components/IconPicker/IconPicker.module.css +1 -1
  173. package/src/components/Input/Input.module.css +1 -1
  174. package/src/components/Input/Input.tsx +8 -2
  175. package/src/components/Kbd/Kbd.module.css +1 -1
  176. package/src/components/LegalLinks/LegalLinks.module.css +24 -0
  177. package/src/components/LegalLinks/LegalLinks.stories.tsx +22 -0
  178. package/src/components/LegalLinks/LegalLinks.tsx +40 -0
  179. package/src/components/Markdown/Markdown.module.css +73 -0
  180. package/src/components/Markdown/Markdown.stories.tsx +40 -0
  181. package/src/components/Markdown/Markdown.tsx +305 -0
  182. package/src/components/Markdown/__tests__/Markdown.test.tsx +144 -0
  183. package/src/components/Menu/Menu.module.css +1 -0
  184. package/src/components/Menu/Menu.tsx +72 -22
  185. package/src/components/Menu/__tests__/Menu.test.tsx +30 -0
  186. package/src/components/Menubar/Menubar.tsx +1 -1
  187. package/src/components/Message/Message.module.css +1 -1
  188. package/src/components/MessageScroller/MessageScroller.module.css +12 -1
  189. package/src/components/MessageScroller/MessageScroller.tsx +12 -0
  190. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +82 -0
  191. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +78 -0
  192. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +80 -0
  193. package/src/components/MobileFooter/MobileFooter.module.css +73 -0
  194. package/src/components/MobileFooter/MobileFooter.stories.tsx +47 -0
  195. package/src/components/MobileFooter/MobileFooter.tsx +122 -0
  196. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +129 -0
  197. package/src/components/MobileHeader/MobileHeader.module.css +76 -0
  198. package/src/components/MobileHeader/MobileHeader.stories.tsx +57 -0
  199. package/src/components/MobileHeader/MobileHeader.tsx +90 -0
  200. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +113 -0
  201. package/src/components/NavList/NavList.module.css +130 -0
  202. package/src/components/NavList/NavList.tsx +136 -0
  203. package/src/components/NavList/__tests__/NavList.test.tsx +109 -0
  204. package/src/components/NavTabs/NavTabs.module.css +1 -1
  205. package/src/components/NavTabs/NavTabs.tsx +39 -11
  206. package/src/components/NotificationsPanel/NotificationsPanel.module.css +258 -0
  207. package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +61 -0
  208. package/src/components/NotificationsPanel/NotificationsPanel.tsx +187 -0
  209. package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +78 -0
  210. package/src/components/OfflineGate/OfflineGate.tsx +44 -0
  211. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +66 -0
  212. package/src/components/OverlayHeader/OverlayHeader.module.css +1 -1
  213. package/src/components/OverlayHeader/OverlayHeader.tsx +19 -4
  214. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +18 -0
  215. package/src/components/PageContainer/PageContainer.module.css +82 -0
  216. package/src/components/PageContainer/PageContainer.tsx +64 -0
  217. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +70 -0
  218. package/src/components/PageHeader/PageHeader.module.css +54 -0
  219. package/src/components/PageHeader/PageHeader.tsx +157 -2
  220. package/src/components/PageHeader/__tests__/PageHeader.test.tsx +103 -0
  221. package/src/components/PageLayout/PageLayout.module.css +51 -0
  222. package/src/components/PageLayout/PageLayout.stories.tsx +73 -0
  223. package/src/components/PageLayout/PageLayout.tsx +51 -0
  224. package/src/components/PageLayout/__tests__/PageLayout.test.tsx +34 -0
  225. package/src/components/Popover/Popover.module.css +1 -1
  226. package/src/components/Popover/Popover.tsx +86 -4
  227. package/src/components/Popover/__tests__/Popover.test.tsx +165 -0
  228. package/src/components/QuantityStepper/QuantityStepper.module.css +1 -1
  229. package/src/components/Resizable/Resizable.module.css +3 -3
  230. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +24 -0
  231. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +73 -0
  232. package/src/components/RootLayout/RootLayout.module.css +12 -0
  233. package/src/components/RootLayout/RootLayout.stories.tsx +125 -0
  234. package/src/components/RootLayout/RootLayout.tsx +185 -0
  235. package/src/components/RootLayout/__tests__/RootLayout.test.tsx +161 -0
  236. package/src/components/SegmentedControl/SegmentedControl.module.css +1 -1
  237. package/src/components/Select/Select.module.css +1 -1
  238. package/src/components/Sheet/Sheet.module.css +4 -1
  239. package/src/components/Sheet/Sheet.tsx +14 -56
  240. package/src/components/SplitPane/SplitPane.module.css +4 -4
  241. package/src/components/StatusBadge/StatusBadge.module.css +1 -1
  242. package/src/components/StepStrip/StepStrip.module.css +53 -0
  243. package/src/components/StepStrip/StepStrip.tsx +74 -0
  244. package/src/components/SuggestionInput/SuggestionInput.module.css +2 -2
  245. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +64 -0
  246. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +243 -0
  247. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +35 -0
  248. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +42 -0
  249. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +18 -0
  250. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +21 -0
  251. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +29 -0
  252. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +214 -0
  253. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +61 -0
  254. package/src/components/SwipableMobileCarousel/context.ts +13 -0
  255. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +64 -0
  256. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +73 -0
  257. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +63 -0
  258. package/src/components/SwipeStack/SwipeStack.module.css +101 -0
  259. package/src/components/SwipeStack/SwipeStack.tsx +199 -0
  260. package/src/components/SwipeStack/SwipeStackCard.tsx +22 -0
  261. package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +169 -0
  262. package/src/components/SystemBanner/SystemBanner.module.css +10 -0
  263. package/src/components/Table/Table.module.css +2 -2
  264. package/src/components/Tabs/Tabs.module.css +1 -1
  265. package/src/components/TagInput/TagInput.module.css +2 -2
  266. package/src/components/Textarea/Textarea.module.css +9 -1
  267. package/src/components/Textarea/Textarea.tsx +28 -5
  268. package/src/components/Textarea/__tests__/Textarea.test.tsx +23 -1
  269. package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +35 -0
  270. package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +152 -0
  271. package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +87 -0
  272. package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +78 -0
  273. package/src/components/Toast/Toast.module.css +62 -3
  274. package/src/components/Toast/Toast.stories.tsx +1 -1
  275. package/src/components/Tooltip/Tooltip.module.css +1 -1
  276. package/src/components/UserMenu/UserMenu.module.css +90 -0
  277. package/src/components/UserMenu/UserMenu.stories.tsx +49 -0
  278. package/src/components/UserMenu/UserMenu.tsx +132 -0
  279. package/src/components/UserMenu/__tests__/UserMenu.test.tsx +77 -0
  280. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +126 -0
  281. package/src/hooks/__tests__/useIsOffline.test.tsx +53 -0
  282. package/src/hooks/__tests__/useOfflineTileState.test.tsx +69 -0
  283. package/src/hooks/__tests__/usePublishShellChromeHeight.test.tsx +118 -0
  284. package/src/hooks/__tests__/useReorderSensors.test.ts +26 -0
  285. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +87 -0
  286. package/src/hooks/__tests__/useSnapCarousel.test.tsx +175 -0
  287. package/src/hooks/__tests__/useSwipeReveal.test.tsx +110 -0
  288. package/src/hooks/__tests__/useSwipeStack.test.tsx +155 -0
  289. package/src/hooks/index.ts +27 -0
  290. package/src/hooks/useCarouselRouteSync.ts +92 -0
  291. package/src/hooks/useIsOffline.ts +41 -0
  292. package/src/hooks/useOfflineTileState.ts +45 -0
  293. package/src/hooks/usePublishShellChromeHeight.ts +96 -0
  294. package/src/hooks/useReorderSensors.ts +88 -0
  295. package/src/hooks/useResponsiveLayout.ts +36 -0
  296. package/src/hooks/useSnapCarousel.ts +284 -0
  297. package/src/hooks/useSwipeReveal.ts +107 -0
  298. package/src/hooks/useSwipeStack.ts +235 -0
  299. package/src/index.ts +124 -3
  300. package/src/overlay-shell.ts +159 -0
  301. package/src/stories/DesignSystemOverview.stories.tsx +933 -6
  302. package/src/stories/DeviceOnlyGate.stories.tsx +35 -0
  303. package/src/stories/DeviceStorageKeyGate.stories.tsx +57 -0
  304. package/src/stories/GripIcon.stories.tsx +29 -0
  305. package/src/stories/InteractionHooks.stories.tsx +483 -0
  306. package/src/stories/LayoutSystem.stories.tsx +639 -0
  307. package/src/stories/MenuEntries.stories.tsx +86 -0
  308. package/src/stories/MobilePatterns.stories.tsx +247 -2
  309. package/src/stories/NavList.stories.tsx +147 -0
  310. package/src/stories/NavTabs.stories.tsx +18 -0
  311. package/src/stories/OfflineGate.stories.tsx +42 -0
  312. package/src/stories/PageContainer.stories.tsx +82 -0
  313. package/src/stories/PageHeader.stories.tsx +65 -1
  314. package/src/stories/ResponsiveSurface.stories.tsx +47 -0
  315. package/src/stories/StepStrip.stories.tsx +76 -0
  316. package/src/stories/SwipableMobileCarousel.stories.tsx +362 -0
  317. package/src/stories/SwipeStack.stories.tsx +200 -0
  318. package/src/stories/Textarea.stories.tsx +12 -0
  319. package/src/stories/TokenGallery.stories.tsx +115 -0
  320. package/src/tokens/primitives.css +36 -0
  321. package/src/tokens/semantic.css +32 -0
  322. package/src/tokens/theme-presets.css +33 -0
  323. package/src/tokens/theme-presets.ts +72 -0
package/src/index.ts CHANGED
@@ -1,3 +1,9 @@
1
+ export { LegalLinks } from './components/LegalLinks/LegalLinks';
2
+ export type { LegalLinksProps } from './components/LegalLinks/LegalLinks';
3
+ export { ConsentPrompt } from './components/ConsentPrompt/ConsentPrompt';
4
+ export type { ConsentPromptProps } from './components/ConsentPrompt/ConsentPrompt';
5
+ export { Markdown } from './components/Markdown/Markdown';
6
+ export type { MarkdownProps } from './components/Markdown/Markdown';
1
7
  export { Badge } from './components/Badge/Badge';
2
8
  export type { BadgeProps, BadgeVariant, BadgeStatus } from './components/Badge/Badge';
3
9
  export { Icon } from './components/Icon/Icon';
@@ -49,22 +55,60 @@ export type {
49
55
  MenuSeparator,
50
56
  MenuEntry,
51
57
  } from './components/Menu/Menu';
58
+ export { UserMenu } from './components/UserMenu/UserMenu';
59
+ export type { UserMenuProps, UserMenuItem } from './components/UserMenu/UserMenu';
60
+ export { AppsLauncher } from './components/AppsLauncher/AppsLauncher';
61
+ export type { AppsLauncherProps, AppsLauncherItem } from './components/AppsLauncher/AppsLauncher';
62
+ export { NotificationsPanel } from './components/NotificationsPanel/NotificationsPanel';
63
+ export type {
64
+ NotificationsPanelProps,
65
+ NotificationsPanelItem,
66
+ } from './components/NotificationsPanel/NotificationsPanel';
52
67
  export { ToastProvider, useToast } from './components/Toast/Toast';
53
68
  export type { ToastItem, ToastContextValue } from './components/Toast/Toast';
54
69
  export { Card } from './components/Card/Card';
55
70
  export type { CardProps } from './components/Card/Card';
71
+
72
+ export { CardTile, CardTileGrid, NewCardTile } from './components/CardTile/CardTile';
73
+ export type {
74
+ CardTileProps,
75
+ CardTileGridProps,
76
+ NewCardTileProps,
77
+ } from './components/CardTile/CardTile';
56
78
  export { FormField } from './components/FormField/FormField';
57
79
  export type { FormFieldProps, FormFieldRenderProps } from './components/FormField/FormField';
58
80
  export { PageHeader } from './components/PageHeader/PageHeader';
59
81
  export type { PageHeaderProps } from './components/PageHeader/PageHeader';
82
+ export { PageContainer } from './components/PageContainer/PageContainer';
83
+ export type { PageContainerProps } from './components/PageContainer/PageContainer';
84
+ export { Header } from './components/Header/Header';
85
+ export type { HeaderProps, HeaderPlugin } from './components/Header/Header';
86
+ export { MobileHeader } from './components/MobileHeader/MobileHeader';
87
+ export type { MobileHeaderProps } from './components/MobileHeader/MobileHeader';
88
+ export { MobileFooter } from './components/MobileFooter/MobileFooter';
89
+ export type { MobileFooterProps, FooterIcon } from './components/MobileFooter/MobileFooter';
90
+ export { MobileAppsDrawer } from './components/MobileAppsDrawer/MobileAppsDrawer';
91
+ export type {
92
+ MobileAppsDrawerProps,
93
+ MobileAppsDrawerItem,
94
+ } from './components/MobileAppsDrawer/MobileAppsDrawer';
60
95
  export { EmptyState } from './components/EmptyState/EmptyState';
61
96
  export type { EmptyStateProps } from './components/EmptyState/EmptyState';
97
+ export { OfflineGate } from './components/OfflineGate/OfflineGate';
98
+ export type { OfflineGateProps } from './components/OfflineGate/OfflineGate';
99
+ export { DeviceOnlyGate } from './components/DeviceOnlyGate/DeviceOnlyGate';
100
+ export type { DeviceOnlyGateProps } from './components/DeviceOnlyGate/DeviceOnlyGate';
101
+ export { DeviceStorageKeyGate } from './components/DeviceStorageKeyGate/DeviceStorageKeyGate';
102
+ export type {
103
+ DeviceStorageKeyGateProps,
104
+ DeviceStorageKeyGateStatus,
105
+ } from './components/DeviceStorageKeyGate/DeviceStorageKeyGate';
62
106
  export { Spinner } from './components/Spinner/Spinner';
63
107
  export type { SpinnerProps } from './components/Spinner/Spinner';
64
108
  export { Avatar } from './components/Avatar/Avatar';
65
109
  export type { AvatarProps } from './components/Avatar/Avatar';
66
110
  export { NavTabs } from './components/NavTabs/NavTabs';
67
- export type { NavTabsProps, NavTabItem } from './components/NavTabs/NavTabs';
111
+ export type { NavTabsProps, NavTabItem, NavTabLinkProps } from './components/NavTabs/NavTabs';
68
112
  export { Tooltip } from './components/Tooltip/Tooltip';
69
113
  export type { TooltipProps } from './components/Tooltip/Tooltip';
70
114
  export { Checkbox } from './components/Checkbox/Checkbox';
@@ -148,6 +192,10 @@ export { Combobox } from './components/Combobox/Combobox';
148
192
  export type { ComboboxProps, ComboboxOption } from './components/Combobox/Combobox';
149
193
  export { DragHandleRow } from './components/DragHandleRow/DragHandleRow';
150
194
  export type { DragHandleRowProps } from './components/DragHandleRow/DragHandleRow';
195
+ export { GripIcon } from './components/GripIcon/GripIcon';
196
+ export type { GripIconProps } from './components/GripIcon/GripIcon';
197
+ export { StepStrip } from './components/StepStrip/StepStrip';
198
+ export type { StepStripProps, StepStripItem } from './components/StepStrip/StepStrip';
151
199
  export { FileDropzone } from './components/FileDropzone/FileDropzone';
152
200
  export type { FileDropzoneProps } from './components/FileDropzone/FileDropzone';
153
201
  export { Calendar } from './components/Calendar/Calendar';
@@ -161,6 +209,8 @@ export type {
161
209
  } from './components/SuggestionInput/SuggestionInput';
162
210
  export { IconPicker } from './components/IconPicker/IconPicker';
163
211
  export type { IconPickerProps } from './components/IconPicker/IconPicker';
212
+ export { ColorPicker } from './components/ColorPicker/ColorPicker';
213
+ export type { ColorPickerProps, ColorPickerSwatch } from './components/ColorPicker/ColorPicker';
164
214
  export { QuantityStepper } from './components/QuantityStepper/QuantityStepper';
165
215
  export type { QuantityStepperProps } from './components/QuantityStepper/QuantityStepper';
166
216
  export { CheckableListRow } from './components/CheckableListRow/CheckableListRow';
@@ -184,7 +234,78 @@ export {
184
234
  useDoubleTapHandler,
185
235
  useSingleOrDoubleTap,
186
236
  useIsMobile,
237
+ useIsOffline,
238
+ useOfflineTileState,
187
239
  useCommitOnEnterOrBlur,
240
+ useSwipeReveal,
241
+ useSnapCarousel,
242
+ useResponsiveLayout,
243
+ useCarouselRouteSync,
244
+ useReorderSensors,
245
+ shouldHandleDndEvent,
246
+ useSwipeStack,
188
247
  } from './hooks';
189
- export { MOBILE_BREAKPOINT_PX } from './hooks';
190
- export type { UseLongPressOptions, LongPressHandlers, CommitOnEnterOrBlurHandlers } from './hooks';
248
+ export type { OfflineTileState } from './hooks';
249
+ export { MOBILE_BREAKPOINT_PX, SWIPE_STACK_TRANSITION_MS } from './hooks';
250
+ export type {
251
+ UseLongPressOptions,
252
+ LongPressHandlers,
253
+ CommitOnEnterOrBlurHandlers,
254
+ UseSwipeRevealOptions,
255
+ UseSwipeRevealHandlers,
256
+ UseSwipeRevealResult,
257
+ UseSnapCarouselOptions,
258
+ UseSnapCarouselResult,
259
+ UseResponsiveLayoutOptions,
260
+ UseResponsiveLayoutResult,
261
+ UseCarouselRouteSyncOptions,
262
+ UseCarouselRouteSyncResult,
263
+ UseReorderSensorsOptions,
264
+ SwipeDirection,
265
+ UseSwipeStackOptions,
266
+ UseSwipeStackHandlers,
267
+ UseSwipeStackResult,
268
+ } from './hooks';
269
+ export { ResponsiveSurface } from './components/ResponsiveSurface/ResponsiveSurface';
270
+ export type { ResponsiveSurfaceProps } from './components/ResponsiveSurface/ResponsiveSurface';
271
+ export { SwipableMobileCarouselDots } from './components/SwipableMobileCarouselDots/SwipableMobileCarouselDots';
272
+ export type { SwipableMobileCarouselDotsProps } from './components/SwipableMobileCarouselDots/SwipableMobileCarouselDots';
273
+ export { SwipableMobileCarousel } from './components/SwipableMobileCarousel/SwipableMobileCarousel';
274
+ export type {
275
+ SwipableMobileCarouselProps,
276
+ SwipableMobileCarouselIndicatorProps,
277
+ } from './components/SwipableMobileCarousel/SwipableMobileCarousel';
278
+ export { SwipableMobileCarouselSlide } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlide';
279
+ export type { SwipableMobileCarouselSlideProps } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlide';
280
+ export { SwipableMobileCarouselSlideHeader } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader';
281
+ export type { SwipableMobileCarouselSlideHeaderProps } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader';
282
+ export { SwipableMobileCarouselSlideBody } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody';
283
+ export type { SwipableMobileCarouselSlideBodyProps } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody';
284
+ export { SwipableMobileCarouselSlideFooter } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter';
285
+ export type { SwipableMobileCarouselSlideFooterProps } from './components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter';
286
+ export { SwipeStack } from './components/SwipeStack/SwipeStack';
287
+ export type { SwipeStackProps, SwipeDirectionMeta } from './components/SwipeStack/SwipeStack';
288
+ export { SwipeStackCard } from './components/SwipeStack/SwipeStackCard';
289
+ export type { SwipeStackCardProps } from './components/SwipeStack/SwipeStackCard';
290
+ export { ThreeColumnLayout } from './components/ThreeColumnLayout/ThreeColumnLayout';
291
+ export type { ThreeColumnLayoutProps } from './components/ThreeColumnLayout/ThreeColumnLayout';
292
+ export { HeaderFooterLayout } from './components/HeaderFooterLayout/HeaderFooterLayout';
293
+ export type { HeaderFooterLayoutProps } from './components/HeaderFooterLayout/HeaderFooterLayout';
294
+ export { RootLayout } from './components/RootLayout/RootLayout';
295
+ export type { RootLayoutProps, RootLayoutVariant } from './components/RootLayout/RootLayout';
296
+ export { PageLayout } from './components/PageLayout/PageLayout';
297
+ export type { PageLayoutProps, PageLayoutPadding } from './components/PageLayout/PageLayout';
298
+ export { NavList } from './components/NavList/NavList';
299
+ export type {
300
+ NavListProps,
301
+ NavListGroup,
302
+ NavListItem,
303
+ NavListLinkProps,
304
+ } from './components/NavList/NavList';
305
+
306
+ // Theme presets (RFC 0094) — the closed, built-in preset data. Consumed
307
+ // directly by runtime/src/instance-style.ts (RFC 0095); Storybook and
308
+ // standalone consumers instead import the generated
309
+ // '@sovereignfs/ui/tokens/theme-presets.css'.
310
+ export { THEME_PRESETS, THEME_PRESET_NAMES } from './tokens/theme-presets';
311
+ export type { ThemePresetName, ThemePresetTokens } from './tokens/theme-presets';
@@ -0,0 +1,159 @@
1
+ 'use client';
2
+
3
+ import { type RefObject, useEffect, useRef } from 'react';
4
+ import { lockBodyScroll, unlockBodyScroll } from './scroll-lock';
5
+
6
+ // Internal to the design system — not exported from `index.ts`. Shared by
7
+ // Dialog, Drawer, and Sheet, which independently implemented identical
8
+ // scrim/focus-trap/Escape/scroll-lock logic before this consolidation
9
+ // (RFC 0079, epic task 9.19). ConfirmDialog is deliberately not migrated
10
+ // here — it stays on the native `<dialog>` element, which already provides
11
+ // equivalent focus-trap/backdrop semantics more reliably for its use case.
12
+
13
+ export const OVERLAY_FOCUSABLE_SELECTOR =
14
+ 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
15
+
16
+ // Matches --sv-motion-duration-base (Dialog/Drawer/Sheet's own .module.css
17
+ // files) — kept as a plain JS constant rather than read from the CSS custom
18
+ // property so the unmount timer and the CSS transition duration can't
19
+ // silently drift apart at build time; change both together if this value
20
+ // ever changes. Single shared export (not one copy per component) so a
21
+ // future edit to one component's own local copy can't silently desync from
22
+ // the other two — previously hand-copied identically into all three files.
23
+ export const OVERLAY_MOTION_DURATION_MS = 250;
24
+
25
+ // A LIFO stack of currently-open overlay ids, used only to decide which
26
+ // overlay's Escape handler should act when more than one is open at once —
27
+ // e.g. a ConfirmDialog opened from inside a Dialog. Module-level, not React
28
+ // state: precedence is a synchronous fact resolved at keydown time, not
29
+ // something that needs to trigger a render. Every overlay that wants a say
30
+ // in Escape precedence registers here, including ConfirmDialog (native
31
+ // `<dialog>`, not built on `useOverlayKeyboardTrap` — see this file's own
32
+ // top comment) — it participates in this stack purely so a `Dialog`
33
+ // underneath it knows to defer, without adopting any of the other hooks.
34
+ let openOverlayIds: string[] = [];
35
+ let nextOverlayId = 0;
36
+
37
+ /** Call on open; returns an id to pass to `unregisterOpenOverlay`. */
38
+ export function registerOpenOverlay(): string {
39
+ const id = `overlay-${nextOverlayId++}`;
40
+ openOverlayIds.push(id);
41
+ return id;
42
+ }
43
+
44
+ /** Call on close/unmount, with the id `registerOpenOverlay` returned. */
45
+ export function unregisterOpenOverlay(id: string): void {
46
+ openOverlayIds = openOverlayIds.filter((existing) => existing !== id);
47
+ }
48
+
49
+ /** Whether `id` is the most-recently-registered still-open overlay. */
50
+ export function isTopmostOpenOverlay(id: string): boolean {
51
+ return openOverlayIds.at(-1) === id;
52
+ }
53
+
54
+ /**
55
+ * Locks document scroll for the whole mounted lifetime of an overlay
56
+ * (including its exit animation), not just while `open` — so the background
57
+ * can't scroll while the panel is still visibly sliding/fading away.
58
+ * Ref-counted via `scroll-lock.ts` so nested overlays (e.g. a confirmation
59
+ * dialog inside an overlay-shell plugin) don't release the lock while a
60
+ * sibling is still open.
61
+ */
62
+ export function useOverlayScrollLock(mounted: boolean): void {
63
+ useEffect(() => {
64
+ if (!mounted) return;
65
+ lockBodyScroll();
66
+ return unlockBodyScroll;
67
+ }, [mounted]);
68
+ }
69
+
70
+ /**
71
+ * Captures the element focused before the overlay opened, moves focus into
72
+ * the panel when `active` becomes true, and restores the original focus on
73
+ * cleanup. Callers pass whichever prop should trigger the capture — `open`
74
+ * for Dialog/Drawer, `mounted` for Sheet (which restores focus on unmount
75
+ * rather than on the raw `open` transition).
76
+ */
77
+ export function useOverlayFocusCapture(
78
+ panelRef: RefObject<HTMLElement | null>,
79
+ active: boolean,
80
+ ): void {
81
+ const previouslyFocused = useRef<HTMLElement | null>(null);
82
+ useEffect(() => {
83
+ if (!active) return;
84
+ previouslyFocused.current = document.activeElement as HTMLElement | null;
85
+ const panel = panelRef.current;
86
+ const first = panel?.querySelector<HTMLElement>(OVERLAY_FOCUSABLE_SELECTOR);
87
+ (first ?? panel)?.focus();
88
+ return () => previouslyFocused.current?.focus();
89
+ }, [active, panelRef]);
90
+ }
91
+
92
+ /**
93
+ * Escape-to-close plus a Tab focus trap cycling within the panel. Attached
94
+ * at `document` level so no keyboard listener is needed on the overlay's own
95
+ * element (which would trigger `jsx-a11y/no-noninteractive-element-interactions`).
96
+ *
97
+ * Registers with the module's open-overlay stack (see above) for the
98
+ * lifetime of `open`, and only actually calls `onClose` on Escape when this
99
+ * overlay is the topmost one. Without this, a Dialog whose descendant opens
100
+ * its own nested overlay (a ConfirmDialog, another Dialog) would react to
101
+ * every Escape press itself — closing the wrong, outer surface, and doing so
102
+ * before the actually-topmost overlay (e.g. a native `<dialog>`, whose own
103
+ * Escape handling is asynchronous per spec) gets a chance to process the key
104
+ * itself. Registration is a separate effect keyed only on `open`, not on
105
+ * `onClose`/`panelRef` — those change identity on unrelated re-renders, and
106
+ * re-registering on every one of them would keep bumping this overlay to the
107
+ * top of the stack, which is wrong when nothing about its open/closed state
108
+ * actually changed.
109
+ */
110
+ export function useOverlayKeyboardTrap(
111
+ panelRef: RefObject<HTMLElement | null>,
112
+ open: boolean,
113
+ onClose: () => void,
114
+ ): void {
115
+ const overlayIdRef = useRef<string | null>(null);
116
+
117
+ useEffect(() => {
118
+ if (!open) return;
119
+ const id = registerOpenOverlay();
120
+ overlayIdRef.current = id;
121
+ return () => {
122
+ unregisterOpenOverlay(id);
123
+ overlayIdRef.current = null;
124
+ };
125
+ }, [open]);
126
+
127
+ useEffect(() => {
128
+ if (!open) return;
129
+ function handleKeyDown(e: KeyboardEvent) {
130
+ if (e.key === 'Escape') {
131
+ const id = overlayIdRef.current;
132
+ if (id !== null && !isTopmostOpenOverlay(id)) return;
133
+ e.stopPropagation();
134
+ onClose();
135
+ return;
136
+ }
137
+ if (e.key !== 'Tab') return;
138
+ const panel = panelRef.current;
139
+ if (!panel) return;
140
+ const focusable = [...panel.querySelectorAll<HTMLElement>(OVERLAY_FOCUSABLE_SELECTOR)];
141
+ const first = focusable[0];
142
+ const last = focusable.at(-1);
143
+ if (!first || !last) {
144
+ e.preventDefault();
145
+ return;
146
+ }
147
+ const active = document.activeElement;
148
+ if (e.shiftKey && active === first) {
149
+ e.preventDefault();
150
+ last.focus();
151
+ } else if (!e.shiftKey && active === last) {
152
+ e.preventDefault();
153
+ first.focus();
154
+ }
155
+ }
156
+ document.addEventListener('keydown', handleKeyDown);
157
+ return () => document.removeEventListener('keydown', handleKeyDown);
158
+ }, [open, onClose, panelRef]);
159
+ }