@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.
Files changed (556) hide show
  1. package/LICENSE +373 -661
  2. package/NOTICE +8 -0
  3. package/README.md +4 -6
  4. package/dist/AppsLauncher.module.css +6 -0
  5. package/dist/Button.module.css +5 -0
  6. package/dist/Card.module.css +6 -0
  7. package/dist/CardTile.module.css +6 -0
  8. package/dist/CheckableListRow.module.css +8 -0
  9. package/dist/Checkbox.module.css +8 -0
  10. package/dist/CodeTextarea.module.css +6 -0
  11. package/dist/ColorPicker.module.css +6 -0
  12. package/dist/Combobox.module.css +6 -0
  13. package/dist/Command.module.css +6 -0
  14. package/dist/ConfirmDialog.module.css +6 -0
  15. package/dist/DatePicker.module.css +6 -0
  16. package/dist/Dialog.module.css +1 -1
  17. package/dist/DragHandleRow.module.css +6 -0
  18. package/dist/FileDropzone.module.css +25 -1
  19. package/dist/Header.module.css +6 -0
  20. package/dist/IconPicker.module.css +14 -4
  21. package/dist/Input.module.css +6 -0
  22. package/dist/LegalLinks.module.css +9 -2
  23. package/dist/Markdown.module.css +5 -0
  24. package/dist/Message.module.css +9 -0
  25. package/dist/MobileAppsDrawer.module.css +9 -5
  26. package/dist/MobileFooter.module.css +6 -0
  27. package/dist/NavList.module.css +11 -2
  28. package/dist/NavTabs.module.css +7 -1
  29. package/dist/NotificationsPanel.module.css +10 -0
  30. package/dist/QrCode.module.css +17 -0
  31. package/dist/QuantityStepper.module.css +4 -2
  32. package/dist/RadioGroup.module.css +6 -0
  33. package/dist/SegmentedControl.module.css +6 -0
  34. package/dist/Select.module.css +6 -0
  35. package/dist/Sheet.module.css +16 -1
  36. package/dist/SplitPane.module.css +1 -1
  37. package/dist/StepStrip.module.css +5 -3
  38. package/dist/SuggestionInput.module.css +12 -1
  39. package/dist/SwipableMobileCarouselDots.module.css +6 -0
  40. package/dist/SystemBanner.module.css +6 -0
  41. package/dist/Tabs.module.css +6 -0
  42. package/dist/TagInput.module.css +6 -0
  43. package/dist/Textarea.module.css +6 -0
  44. package/dist/Toast.module.css +5 -0
  45. package/dist/Toggle.module.css +7 -0
  46. package/dist/Tooltip.module.css +6 -0
  47. package/dist/UserMenu.module.css +5 -0
  48. package/dist/fonts/OFL.txt +93 -0
  49. package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
  50. package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
  51. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  52. package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
  53. package/dist/index.d.ts +121 -43
  54. package/dist/index.js +1410 -1152
  55. package/dist/tokens/fonts.css +53 -0
  56. package/dist/tokens/primitives.css +12 -12
  57. package/dist/tokens.css +2 -1
  58. package/package.json +24 -13
  59. package/src/__tests__/motion.test.tsx +0 -105
  60. package/src/__tests__/package-json.test.ts +0 -8
  61. package/src/components/Accordion/Accordion.module.css +0 -3
  62. package/src/components/Accordion/Accordion.stories.tsx +0 -110
  63. package/src/components/Accordion/Accordion.tsx +0 -53
  64. package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
  65. package/src/components/Alert/Alert.module.css +0 -62
  66. package/src/components/Alert/Alert.stories.tsx +0 -96
  67. package/src/components/Alert/Alert.tsx +0 -58
  68. package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
  69. package/src/components/AppsLauncher/AppsLauncher.module.css +0 -96
  70. package/src/components/AppsLauncher/AppsLauncher.stories.tsx +0 -58
  71. package/src/components/AppsLauncher/AppsLauncher.tsx +0 -117
  72. package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +0 -52
  73. package/src/components/AspectRatio/AspectRatio.module.css +0 -15
  74. package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
  75. package/src/components/AspectRatio/AspectRatio.tsx +0 -21
  76. package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
  77. package/src/components/Avatar/Avatar.module.css +0 -38
  78. package/src/components/Avatar/Avatar.tsx +0 -42
  79. package/src/components/Badge/Badge.module.css +0 -177
  80. package/src/components/Badge/Badge.stories.tsx +0 -238
  81. package/src/components/Badge/Badge.tsx +0 -84
  82. package/src/components/Badge/__tests__/Badge.test.tsx +0 -90
  83. package/src/components/BalanceChip/BalanceChip.module.css +0 -32
  84. package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
  85. package/src/components/BalanceChip/BalanceChip.tsx +0 -33
  86. package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
  87. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
  88. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
  89. package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
  90. package/src/components/Button/Button.module.css +0 -169
  91. package/src/components/Button/Button.stories.tsx +0 -83
  92. package/src/components/Button/Button.tsx +0 -52
  93. package/src/components/Button/__tests__/Button.test.tsx +0 -66
  94. package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
  95. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
  96. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
  97. package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
  98. package/src/components/Calendar/Calendar.module.css +0 -126
  99. package/src/components/Calendar/Calendar.tsx +0 -213
  100. package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
  101. package/src/components/Calendar/dateUtils.ts +0 -97
  102. package/src/components/Card/Card.module.css +0 -42
  103. package/src/components/Card/Card.tsx +0 -34
  104. package/src/components/CardTile/CardTile.module.css +0 -181
  105. package/src/components/CardTile/CardTile.stories.tsx +0 -86
  106. package/src/components/CardTile/CardTile.tsx +0 -128
  107. package/src/components/CardTile/__tests__/CardTile.test.tsx +0 -56
  108. package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
  109. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
  110. package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
  111. package/src/components/Checkbox/Checkbox.module.css +0 -111
  112. package/src/components/Checkbox/Checkbox.tsx +0 -78
  113. package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
  114. package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
  115. package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
  116. package/src/components/Collapsible/Collapsible.module.css +0 -70
  117. package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
  118. package/src/components/Collapsible/Collapsible.tsx +0 -66
  119. package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
  120. package/src/components/ColorPicker/ColorPicker.module.css +0 -132
  121. package/src/components/ColorPicker/ColorPicker.stories.tsx +0 -80
  122. package/src/components/ColorPicker/ColorPicker.tsx +0 -157
  123. package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +0 -117
  124. package/src/components/Combobox/Combobox.module.css +0 -122
  125. package/src/components/Combobox/Combobox.stories.tsx +0 -79
  126. package/src/components/Combobox/Combobox.tsx +0 -186
  127. package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
  128. package/src/components/Command/Command.module.css +0 -80
  129. package/src/components/Command/Command.stories.tsx +0 -104
  130. package/src/components/Command/Command.tsx +0 -168
  131. package/src/components/Command/__tests__/Command.test.tsx +0 -162
  132. package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
  133. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -150
  134. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -214
  135. package/src/components/ConsentPrompt/ConsentPrompt.module.css +0 -21
  136. package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +0 -31
  137. package/src/components/ConsentPrompt/ConsentPrompt.tsx +0 -66
  138. package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
  139. package/src/components/ContextMenu/ContextMenu.tsx +0 -100
  140. package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
  141. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
  142. package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
  143. package/src/components/DataTable/DataTable.module.css +0 -28
  144. package/src/components/DataTable/DataTable.stories.tsx +0 -74
  145. package/src/components/DataTable/DataTable.tsx +0 -154
  146. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
  147. package/src/components/DatePicker/DatePicker.module.css +0 -61
  148. package/src/components/DatePicker/DatePicker.tsx +0 -103
  149. package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
  150. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
  151. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
  152. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
  153. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
  154. package/src/components/Dialog/Dialog.module.css +0 -335
  155. package/src/components/Dialog/Dialog.stories.tsx +0 -324
  156. package/src/components/Dialog/Dialog.tsx +0 -254
  157. package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -318
  158. package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
  159. package/src/components/DragHandleRow/DragHandleRow.tsx +0 -42
  160. package/src/components/Drawer/Drawer.module.css +0 -121
  161. package/src/components/Drawer/Drawer.stories.tsx +0 -132
  162. package/src/components/Drawer/Drawer.tsx +0 -175
  163. package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -226
  164. package/src/components/EmptyState/EmptyState.module.css +0 -27
  165. package/src/components/EmptyState/EmptyState.tsx +0 -27
  166. package/src/components/FileDropzone/FileDropzone.module.css +0 -63
  167. package/src/components/FileDropzone/FileDropzone.tsx +0 -109
  168. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
  169. package/src/components/FormField/FormField.module.css +0 -33
  170. package/src/components/FormField/FormField.tsx +0 -78
  171. package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
  172. package/src/components/GripIcon/GripIcon.tsx +0 -27
  173. package/src/components/Header/Header.module.css +0 -62
  174. package/src/components/Header/Header.stories.tsx +0 -452
  175. package/src/components/Header/Header.tsx +0 -102
  176. package/src/components/Header/__tests__/Header.test.tsx +0 -104
  177. package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +0 -21
  178. package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +0 -111
  179. package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +0 -54
  180. package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +0 -58
  181. package/src/components/HoverCard/HoverCard.module.css +0 -3
  182. package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
  183. package/src/components/HoverCard/HoverCard.tsx +0 -111
  184. package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
  185. package/src/components/Icon/Icon.module.css +0 -27
  186. package/src/components/Icon/Icon.stories.tsx +0 -95
  187. package/src/components/Icon/Icon.tsx +0 -43
  188. package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
  189. package/src/components/Icon/icons/activity.tsx +0 -20
  190. package/src/components/Icon/icons/alert-triangle.tsx +0 -22
  191. package/src/components/Icon/icons/apple.tsx +0 -21
  192. package/src/components/Icon/icons/arrow-left-right.tsx +0 -23
  193. package/src/components/Icon/icons/banana.tsx +0 -21
  194. package/src/components/Icon/icons/beef.tsx +0 -22
  195. package/src/components/Icon/icons/beer.tsx +0 -24
  196. package/src/components/Icon/icons/bell.tsx +0 -21
  197. package/src/components/Icon/icons/bold.tsx +0 -20
  198. package/src/components/Icon/icons/calendar.tsx +0 -23
  199. package/src/components/Icon/icons/candy.tsx +0 -24
  200. package/src/components/Icon/icons/carrot.tsx +0 -22
  201. package/src/components/Icon/icons/check.tsx +0 -20
  202. package/src/components/Icon/icons/chevron-down.tsx +0 -20
  203. package/src/components/Icon/icons/chevron-left.tsx +0 -20
  204. package/src/components/Icon/icons/chevron-right.tsx +0 -20
  205. package/src/components/Icon/icons/chevron-up.tsx +0 -20
  206. package/src/components/Icon/icons/circle-check.tsx +0 -21
  207. package/src/components/Icon/icons/circle-chevron-left.tsx +0 -21
  208. package/src/components/Icon/icons/circle-x.tsx +0 -22
  209. package/src/components/Icon/icons/code.tsx +0 -21
  210. package/src/components/Icon/icons/coffee.tsx +0 -23
  211. package/src/components/Icon/icons/cookie.tsx +0 -25
  212. package/src/components/Icon/icons/copy.tsx +0 -21
  213. package/src/components/Icon/icons/credit-card.tsx +0 -21
  214. package/src/components/Icon/icons/croissant.tsx +0 -24
  215. package/src/components/Icon/icons/cup-soda.tsx +0 -23
  216. package/src/components/Icon/icons/database.tsx +0 -22
  217. package/src/components/Icon/icons/download.tsx +0 -22
  218. package/src/components/Icon/icons/drumstick.tsx +0 -21
  219. package/src/components/Icon/icons/egg.tsx +0 -20
  220. package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
  221. package/src/components/Icon/icons/external-link.tsx +0 -22
  222. package/src/components/Icon/icons/eye-off.tsx +0 -23
  223. package/src/components/Icon/icons/eye.tsx +0 -21
  224. package/src/components/Icon/icons/file-text.tsx +0 -24
  225. package/src/components/Icon/icons/file.tsx +0 -21
  226. package/src/components/Icon/icons/fish.tsx +0 -25
  227. package/src/components/Icon/icons/folder-closed.tsx +0 -21
  228. package/src/components/Icon/icons/folder-open.tsx +0 -20
  229. package/src/components/Icon/icons/folder.tsx +0 -20
  230. package/src/components/Icon/icons/folders.tsx +0 -21
  231. package/src/components/Icon/icons/grid-2x2.tsx +0 -22
  232. package/src/components/Icon/icons/hat-glasses.tsx +0 -24
  233. package/src/components/Icon/icons/history.tsx +0 -22
  234. package/src/components/Icon/icons/house.tsx +0 -21
  235. package/src/components/Icon/icons/inbox.tsx +0 -21
  236. package/src/components/Icon/icons/index.ts +0 -394
  237. package/src/components/Icon/icons/info.tsx +0 -22
  238. package/src/components/Icon/icons/italic.tsx +0 -22
  239. package/src/components/Icon/icons/layers.tsx +0 -22
  240. package/src/components/Icon/icons/layout-dashboard.tsx +0 -23
  241. package/src/components/Icon/icons/layout-grid.tsx +0 -23
  242. package/src/components/Icon/icons/link.tsx +0 -21
  243. package/src/components/Icon/icons/list-ordered.tsx +0 -25
  244. package/src/components/Icon/icons/list.tsx +0 -25
  245. package/src/components/Icon/icons/lock.tsx +0 -21
  246. package/src/components/Icon/icons/log-out.tsx +0 -22
  247. package/src/components/Icon/icons/luggage.tsx +0 -24
  248. package/src/components/Icon/icons/mail.tsx +0 -21
  249. package/src/components/Icon/icons/map-pin.tsx +0 -21
  250. package/src/components/Icon/icons/menu.tsx +0 -22
  251. package/src/components/Icon/icons/milk.tsx +0 -22
  252. package/src/components/Icon/icons/minus.tsx +0 -20
  253. package/src/components/Icon/icons/package.tsx +0 -23
  254. package/src/components/Icon/icons/paint-bucket.tsx +0 -23
  255. package/src/components/Icon/icons/panel-left.tsx +0 -21
  256. package/src/components/Icon/icons/pencil.tsx +0 -21
  257. package/src/components/Icon/icons/pin.tsx +0 -21
  258. package/src/components/Icon/icons/pizza.tsx +0 -24
  259. package/src/components/Icon/icons/plus.tsx +0 -21
  260. package/src/components/Icon/icons/rectangle-ellipsis.tsx +0 -23
  261. package/src/components/Icon/icons/refresh-cw.tsx +0 -23
  262. package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
  263. package/src/components/Icon/icons/rotate-cw.tsx +0 -21
  264. package/src/components/Icon/icons/route.tsx +0 -22
  265. package/src/components/Icon/icons/salad.tsx +0 -24
  266. package/src/components/Icon/icons/search.tsx +0 -21
  267. package/src/components/Icon/icons/send.tsx +0 -21
  268. package/src/components/Icon/icons/settings.tsx +0 -21
  269. package/src/components/Icon/icons/share-2.tsx +0 -24
  270. package/src/components/Icon/icons/sheet.tsx +0 -24
  271. package/src/components/Icon/icons/shield.tsx +0 -20
  272. package/src/components/Icon/icons/shopping-basket.tsx +0 -26
  273. package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
  274. package/src/components/Icon/icons/smartphone.tsx +0 -21
  275. package/src/components/Icon/icons/snowflake.tsx +0 -31
  276. package/src/components/Icon/icons/spray-can.tsx +0 -29
  277. package/src/components/Icon/icons/square-kanban.tsx +0 -23
  278. package/src/components/Icon/icons/table.tsx +0 -23
  279. package/src/components/Icon/icons/trash-2.tsx +0 -24
  280. package/src/components/Icon/icons/upload.tsx +0 -22
  281. package/src/components/Icon/icons/user-round-plus.tsx +0 -23
  282. package/src/components/Icon/icons/user.tsx +0 -21
  283. package/src/components/Icon/icons/users.tsx +0 -23
  284. package/src/components/Icon/icons/wine.tsx +0 -23
  285. package/src/components/Icon/icons/x.tsx +0 -21
  286. package/src/components/IconPicker/IconPicker.module.css +0 -63
  287. package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
  288. package/src/components/IconPicker/IconPicker.tsx +0 -90
  289. package/src/components/Input/Input.module.css +0 -52
  290. package/src/components/Input/Input.stories.tsx +0 -86
  291. package/src/components/Input/Input.tsx +0 -20
  292. package/src/components/Input/__tests__/Input.test.tsx +0 -22
  293. package/src/components/Item/Item.module.css +0 -70
  294. package/src/components/Item/Item.stories.tsx +0 -62
  295. package/src/components/Item/Item.tsx +0 -54
  296. package/src/components/Item/__tests__/Item.test.tsx +0 -39
  297. package/src/components/Kbd/Kbd.module.css +0 -14
  298. package/src/components/Kbd/Kbd.stories.tsx +0 -32
  299. package/src/components/Kbd/Kbd.tsx +0 -12
  300. package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
  301. package/src/components/Label/Label.module.css +0 -11
  302. package/src/components/Label/Label.stories.tsx +0 -40
  303. package/src/components/Label/Label.tsx +0 -24
  304. package/src/components/Label/__tests__/Label.test.tsx +0 -32
  305. package/src/components/LegalLinks/LegalLinks.module.css +0 -24
  306. package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
  307. package/src/components/LegalLinks/LegalLinks.tsx +0 -40
  308. package/src/components/Markdown/Markdown.module.css +0 -73
  309. package/src/components/Markdown/Markdown.stories.tsx +0 -40
  310. package/src/components/Markdown/Markdown.tsx +0 -305
  311. package/src/components/Markdown/__tests__/Markdown.test.tsx +0 -144
  312. package/src/components/Marker/Marker.module.css +0 -33
  313. package/src/components/Marker/Marker.stories.tsx +0 -39
  314. package/src/components/Marker/Marker.tsx +0 -34
  315. package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
  316. package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
  317. package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
  318. package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
  319. package/src/components/Menu/Menu.module.css +0 -90
  320. package/src/components/Menu/Menu.tsx +0 -209
  321. package/src/components/Menu/__tests__/Menu.test.tsx +0 -227
  322. package/src/components/Menubar/Menubar.stories.tsx +0 -52
  323. package/src/components/Menubar/Menubar.tsx +0 -42
  324. package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
  325. package/src/components/Message/Message.module.css +0 -99
  326. package/src/components/Message/Message.stories.tsx +0 -79
  327. package/src/components/Message/Message.tsx +0 -41
  328. package/src/components/Message/__tests__/Message.test.tsx +0 -46
  329. package/src/components/MessageScroller/MessageScroller.module.css +0 -65
  330. package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
  331. package/src/components/MessageScroller/MessageScroller.tsx +0 -84
  332. package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
  333. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -82
  334. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
  335. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
  336. package/src/components/MobileFooter/MobileFooter.module.css +0 -73
  337. package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
  338. package/src/components/MobileFooter/MobileFooter.tsx +0 -122
  339. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -129
  340. package/src/components/MobileHeader/MobileHeader.module.css +0 -76
  341. package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
  342. package/src/components/MobileHeader/MobileHeader.tsx +0 -90
  343. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -113
  344. package/src/components/NavList/NavList.module.css +0 -130
  345. package/src/components/NavList/NavList.tsx +0 -136
  346. package/src/components/NavList/__tests__/NavList.test.tsx +0 -109
  347. package/src/components/NavTabs/NavTabs.module.css +0 -50
  348. package/src/components/NavTabs/NavTabs.tsx +0 -61
  349. package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
  350. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
  351. package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
  352. package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
  353. package/src/components/NotificationsPanel/NotificationsPanel.module.css +0 -258
  354. package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +0 -61
  355. package/src/components/NotificationsPanel/NotificationsPanel.tsx +0 -187
  356. package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +0 -78
  357. package/src/components/OfflineGate/OfflineGate.tsx +0 -44
  358. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
  359. package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
  360. package/src/components/OverlayHeader/OverlayHeader.tsx +0 -77
  361. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -69
  362. package/src/components/PageContainer/PageContainer.module.css +0 -82
  363. package/src/components/PageContainer/PageContainer.tsx +0 -64
  364. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -70
  365. package/src/components/PageHeader/PageHeader.module.css +0 -86
  366. package/src/components/PageHeader/PageHeader.tsx +0 -176
  367. package/src/components/PageHeader/__tests__/PageHeader.test.tsx +0 -103
  368. package/src/components/PageLayout/PageLayout.module.css +0 -51
  369. package/src/components/PageLayout/PageLayout.stories.tsx +0 -73
  370. package/src/components/PageLayout/PageLayout.tsx +0 -51
  371. package/src/components/PageLayout/__tests__/PageLayout.test.tsx +0 -34
  372. package/src/components/Pagination/Pagination.module.css +0 -98
  373. package/src/components/Pagination/Pagination.stories.tsx +0 -49
  374. package/src/components/Pagination/Pagination.tsx +0 -87
  375. package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
  376. package/src/components/Popover/Popover.module.css +0 -74
  377. package/src/components/Popover/Popover.stories.tsx +0 -357
  378. package/src/components/Popover/Popover.tsx +0 -290
  379. package/src/components/Popover/__tests__/Popover.test.tsx +0 -263
  380. package/src/components/Progress/Progress.module.css +0 -20
  381. package/src/components/Progress/Progress.stories.tsx +0 -40
  382. package/src/components/Progress/Progress.tsx +0 -35
  383. package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
  384. package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
  385. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
  386. package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
  387. package/src/components/RadioGroup/RadioGroup.module.css +0 -88
  388. package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
  389. package/src/components/RadioGroup/RadioGroup.tsx +0 -99
  390. package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
  391. package/src/components/Resizable/Resizable.module.css +0 -70
  392. package/src/components/Resizable/Resizable.stories.tsx +0 -82
  393. package/src/components/Resizable/Resizable.tsx +0 -313
  394. package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
  395. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
  396. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
  397. package/src/components/RootLayout/RootLayout.module.css +0 -12
  398. package/src/components/RootLayout/RootLayout.stories.tsx +0 -125
  399. package/src/components/RootLayout/RootLayout.tsx +0 -185
  400. package/src/components/RootLayout/__tests__/RootLayout.test.tsx +0 -161
  401. package/src/components/ScrollArea/ScrollArea.module.css +0 -20
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
  403. package/src/components/ScrollArea/ScrollArea.tsx +0 -27
  404. package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
  405. package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
  406. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
  407. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
  408. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
  409. package/src/components/Select/Select.module.css +0 -82
  410. package/src/components/Select/Select.stories.tsx +0 -115
  411. package/src/components/Select/Select.tsx +0 -48
  412. package/src/components/Select/__tests__/Select.test.tsx +0 -59
  413. package/src/components/Sheet/Sheet.module.css +0 -58
  414. package/src/components/Sheet/Sheet.tsx +0 -109
  415. package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
  416. package/src/components/Slider/Slider.module.css +0 -95
  417. package/src/components/Slider/Slider.stories.tsx +0 -64
  418. package/src/components/Slider/Slider.tsx +0 -77
  419. package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
  420. package/src/components/Spinner/Spinner.module.css +0 -39
  421. package/src/components/Spinner/Spinner.tsx +0 -23
  422. package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
  423. package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
  424. package/src/components/SplitPane/SplitPane.module.css +0 -85
  425. package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
  426. package/src/components/SplitPane/SplitPane.tsx +0 -149
  427. package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
  428. package/src/components/StatusBadge/StatusBadge.module.css +0 -59
  429. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
  430. package/src/components/StatusBadge/StatusBadge.tsx +0 -65
  431. package/src/components/StepStrip/StepStrip.module.css +0 -53
  432. package/src/components/StepStrip/StepStrip.tsx +0 -74
  433. package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
  434. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
  435. package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
  436. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -64
  437. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -243
  438. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
  439. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
  440. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
  441. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
  442. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
  443. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -214
  444. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
  445. package/src/components/SwipableMobileCarousel/context.ts +0 -13
  446. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -64
  447. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -73
  448. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
  449. package/src/components/SwipeStack/SwipeStack.module.css +0 -101
  450. package/src/components/SwipeStack/SwipeStack.tsx +0 -199
  451. package/src/components/SwipeStack/SwipeStackCard.tsx +0 -22
  452. package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +0 -169
  453. package/src/components/SystemBanner/SystemBanner.module.css +0 -79
  454. package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
  455. package/src/components/SystemBanner/SystemBanner.tsx +0 -50
  456. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
  457. package/src/components/Table/Table.module.css +0 -45
  458. package/src/components/Table/Table.stories.tsx +0 -125
  459. package/src/components/Table/Table.tsx +0 -51
  460. package/src/components/Table/__tests__/Table.test.tsx +0 -50
  461. package/src/components/Tabs/Tabs.module.css +0 -56
  462. package/src/components/Tabs/Tabs.stories.tsx +0 -100
  463. package/src/components/Tabs/Tabs.tsx +0 -46
  464. package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
  465. package/src/components/TagInput/TagInput.module.css +0 -141
  466. package/src/components/TagInput/TagInput.stories.tsx +0 -109
  467. package/src/components/TagInput/TagInput.tsx +0 -174
  468. package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
  469. package/src/components/Textarea/Textarea.module.css +0 -47
  470. package/src/components/Textarea/Textarea.tsx +0 -38
  471. package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -51
  472. package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +0 -35
  473. package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +0 -152
  474. package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +0 -87
  475. package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +0 -78
  476. package/src/components/Toast/Toast.module.css +0 -191
  477. package/src/components/Toast/Toast.stories.tsx +0 -191
  478. package/src/components/Toast/Toast.tsx +0 -139
  479. package/src/components/Toggle/Toggle.module.css +0 -57
  480. package/src/components/Toggle/Toggle.stories.tsx +0 -95
  481. package/src/components/Toggle/Toggle.tsx +0 -39
  482. package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
  483. package/src/components/Tooltip/Tooltip.module.css +0 -56
  484. package/src/components/Tooltip/Tooltip.tsx +0 -30
  485. package/src/components/Typography/Typography.module.css +0 -47
  486. package/src/components/Typography/Typography.stories.tsx +0 -62
  487. package/src/components/Typography/Typography.tsx +0 -30
  488. package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
  489. package/src/components/UserMenu/UserMenu.module.css +0 -90
  490. package/src/components/UserMenu/UserMenu.stories.tsx +0 -49
  491. package/src/components/UserMenu/UserMenu.tsx +0 -132
  492. package/src/components/UserMenu/__tests__/UserMenu.test.tsx +0 -77
  493. package/src/css-modules.d.ts +0 -4
  494. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
  495. package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
  496. package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
  497. package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
  498. package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
  499. package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
  500. package/src/hooks/__tests__/usePublishShellChromeHeight.test.tsx +0 -118
  501. package/src/hooks/__tests__/useReorderSensors.test.ts +0 -26
  502. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
  503. package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -175
  504. package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
  505. package/src/hooks/__tests__/useSwipeStack.test.tsx +0 -155
  506. package/src/hooks/index.ts +0 -33
  507. package/src/hooks/useCarouselRouteSync.ts +0 -92
  508. package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
  509. package/src/hooks/useDoubleTap.ts +0 -91
  510. package/src/hooks/useIsMobile.ts +0 -33
  511. package/src/hooks/useIsOffline.ts +0 -41
  512. package/src/hooks/useLongPress.ts +0 -185
  513. package/src/hooks/useOfflineTileState.ts +0 -45
  514. package/src/hooks/usePublishShellChromeHeight.ts +0 -96
  515. package/src/hooks/useReorderSensors.ts +0 -88
  516. package/src/hooks/useResponsiveLayout.ts +0 -36
  517. package/src/hooks/useSnapCarousel.ts +0 -284
  518. package/src/hooks/useSwipeReveal.ts +0 -107
  519. package/src/hooks/useSwipeStack.ts +0 -235
  520. package/src/index.ts +0 -311
  521. package/src/motion.ts +0 -78
  522. package/src/overlay-shell.ts +0 -159
  523. package/src/scroll-lock.ts +0 -22
  524. package/src/stories/Avatar.stories.tsx +0 -44
  525. package/src/stories/Card.stories.tsx +0 -35
  526. package/src/stories/Checkbox.stories.tsx +0 -45
  527. package/src/stories/DesignSystemOverview.stories.tsx +0 -3793
  528. package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
  529. package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
  530. package/src/stories/DragHandleRow.stories.tsx +0 -41
  531. package/src/stories/EmptyState.stories.tsx +0 -33
  532. package/src/stories/FileDropzone.stories.tsx +0 -69
  533. package/src/stories/FormField.stories.tsx +0 -47
  534. package/src/stories/GripIcon.stories.tsx +0 -29
  535. package/src/stories/InteractionHooks.stories.tsx +0 -925
  536. package/src/stories/LayoutSystem.stories.tsx +0 -639
  537. package/src/stories/MenuEntries.stories.tsx +0 -86
  538. package/src/stories/MobilePatterns.stories.tsx +0 -1536
  539. package/src/stories/NavList.stories.tsx +0 -147
  540. package/src/stories/NavTabs.stories.tsx +0 -53
  541. package/src/stories/OfflineGate.stories.tsx +0 -42
  542. package/src/stories/PageContainer.stories.tsx +0 -82
  543. package/src/stories/PageHeader.stories.tsx +0 -95
  544. package/src/stories/ResponsiveSurface.stories.tsx +0 -47
  545. package/src/stories/Spinner.stories.tsx +0 -25
  546. package/src/stories/StepStrip.stories.tsx +0 -76
  547. package/src/stories/SwipableMobileCarousel.stories.tsx +0 -362
  548. package/src/stories/SwipeStack.stories.tsx +0 -200
  549. package/src/stories/Textarea.stories.tsx +0 -63
  550. package/src/stories/TokenGallery.stories.tsx +0 -652
  551. package/src/stories/Tooltip.stories.tsx +0 -59
  552. package/src/tokens/primitives.css +0 -168
  553. package/src/tokens/semantic.css +0 -162
  554. package/src/tokens/theme-presets.css +0 -33
  555. package/src/tokens/theme-presets.ts +0 -72
  556. package/src/tokens.css +0 -5
@@ -1,152 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { useState } from 'react';
3
- import { ThreeColumnLayout } from './ThreeColumnLayout';
4
-
5
- function Block({
6
- title,
7
- children,
8
- padded = true,
9
- }: {
10
- title: string;
11
- children?: React.ReactNode;
12
- padded?: boolean;
13
- }) {
14
- return (
15
- <div
16
- style={{
17
- height: '100%',
18
- padding: padded ? 'var(--sv-space-4)' : 0,
19
- fontFamily: 'var(--sv-font-family)',
20
- }}
21
- >
22
- <h3
23
- style={{
24
- margin: '0 0 var(--sv-space-2)',
25
- fontSize: 'var(--sv-font-size-sm)',
26
- color: 'var(--sv-color-text-primary)',
27
- }}
28
- >
29
- {title}
30
- </h3>
31
- {children}
32
- </div>
33
- );
34
- }
35
-
36
- const meta = {
37
- title: 'Components/ThreeColumnLayout',
38
- component: ThreeColumnLayout,
39
- parameters: {
40
- layout: 'fullscreen',
41
- docs: {
42
- description: {
43
- component:
44
- 'Sidebar + main + optional detail column, for the common "list app" shape. Purely positional: pass 2 children for sidebar+main, or 3 for sidebar+main+detail. The layout has no awareness of what is inside each slot and no responsive behavior of its own.',
45
- },
46
- },
47
- },
48
- args: {
49
- children: [<Block key="sidebar" title="Sidebar" />, <Block key="main" title="Main" />],
50
- },
51
- } satisfies Meta<typeof ThreeColumnLayout>;
52
-
53
- export default meta;
54
- type Story = StoryObj<typeof meta>;
55
-
56
- /** The canonical two-child usage — sidebar + main, no detail column. */
57
- export const Default: Story = {
58
- render: () => (
59
- <div style={{ height: '480px' }}>
60
- <ThreeColumnLayout>
61
- <Block title="Sidebar">
62
- <ul style={{ margin: 0, paddingLeft: 'var(--sv-space-4)' }}>
63
- <li>Groceries</li>
64
- <li>Work</li>
65
- <li>Personal</li>
66
- </ul>
67
- </Block>
68
- <Block title="Main">No item selected — main fills the full remaining width.</Block>
69
- </ThreeColumnLayout>
70
- </div>
71
- ),
72
- };
73
-
74
- export const ThreeColumns: Story = {
75
- render: () => (
76
- <div style={{ height: '480px' }}>
77
- <ThreeColumnLayout>
78
- <Block title="Sidebar">
79
- <ul style={{ margin: 0, paddingLeft: 'var(--sv-space-4)' }}>
80
- <li>Groceries</li>
81
- <li>Work</li>
82
- <li>Personal</li>
83
- </ul>
84
- </Block>
85
- <Block title="Main">
86
- <ul style={{ margin: 0, paddingLeft: 'var(--sv-space-4)' }}>
87
- <li>Buy milk</li>
88
- <li>Buy eggs</li>
89
- </ul>
90
- </Block>
91
- <Block title="Detail">Editing "Buy milk" — notes, due date, etc.</Block>
92
- </ThreeColumnLayout>
93
- </div>
94
- ),
95
- };
96
-
97
- export const CustomWidths: Story = {
98
- render: () => (
99
- <div style={{ height: '480px' }}>
100
- <ThreeColumnLayout sidebarWidth={200} detailWidth={440}>
101
- <Block title="Sidebar (200px)">Narrower nav column.</Block>
102
- <Block title="Main">Fills whatever space is left.</Block>
103
- <Block title="Detail (440px)">Wider detail column for a richer editor.</Block>
104
- </ThreeColumnLayout>
105
- </div>
106
- ),
107
- };
108
-
109
- /** Demonstrates the intended usage: the detail column appears only once
110
- * something is selected, by conditionally including the third child. */
111
- export const ConditionalDetail: Story = {
112
- render: function Render() {
113
- const [selectedId, setSelectedId] = useState<string | null>(null);
114
- const items = ['Buy milk', 'Buy eggs', 'Call plumber'];
115
-
116
- return (
117
- <div style={{ height: '480px' }}>
118
- <ThreeColumnLayout>
119
- <Block title="Sidebar">Lists</Block>
120
- <Block title="Main" padded={false}>
121
- <div style={{ padding: 'var(--sv-space-4)' }}>
122
- {items.map((item) => (
123
- <button
124
- key={item}
125
- type="button"
126
- onClick={() => setSelectedId(item)}
127
- style={{
128
- display: 'block',
129
- width: '100%',
130
- textAlign: 'left',
131
- padding: 'var(--sv-space-2)',
132
- marginBottom: 'var(--sv-space-1)',
133
- background:
134
- selectedId === item ? 'var(--sv-color-accent-subtle)' : 'transparent',
135
- border: 'none',
136
- borderRadius: 'var(--sv-radius-sm)',
137
- cursor: 'pointer',
138
- font: 'inherit',
139
- color: 'var(--sv-color-text-primary)',
140
- }}
141
- >
142
- {item}
143
- </button>
144
- ))}
145
- </div>
146
- </Block>
147
- {selectedId && <Block title="Detail">Editing "{selectedId}"</Block>}
148
- </ThreeColumnLayout>
149
- </div>
150
- );
151
- },
152
- };
@@ -1,87 +0,0 @@
1
- 'use client';
2
-
3
- import { Children } from 'react';
4
- import type { ReactNode } from 'react';
5
- import styles from './ThreeColumnLayout.module.css';
6
-
7
- export interface ThreeColumnLayoutProps {
8
- /**
9
- * Exactly 2 (sidebar, main) or 3 (sidebar, main, detail) elements. Omit
10
- * the third child entirely to render two columns — e.g.
11
- * `{selected && <Detail />}` — React.Children.toArray drops falsy
12
- * children, so no separate `detail` prop is needed to make that
13
- * conditional.
14
- */
15
- children: ReactNode;
16
- /** px. Fixed width of the first (leftmost) column. Default 280. */
17
- sidebarWidth?: number;
18
- /** px. Fixed width of the third column, when present. Default 360. */
19
- detailWidth?: number;
20
- /**
21
- * Hides the sidebar column entirely — no width, no border, no layout box
22
- * — while keeping it mounted and every sibling in its own stable position.
23
- *
24
- * Prefer this over conditionally omitting the sidebar child, or swapping
25
- * to a different wrapper when collapsed. Omitting it shifts `main` into
26
- * the sidebar slot, and swapping the surrounding element type unmounts
27
- * `main`'s entire subtree — silently discarding its React state (a live
28
- * stream, unsent composer text, an in-memory-only conversation) on every
29
- * collapse toggle. Found live in Warden, whose chat column lost all of
30
- * that each time the sidebar was shown or hidden.
31
- */
32
- sidebarHidden?: boolean;
33
- className?: string;
34
- }
35
-
36
- /**
37
- * ThreeColumnLayout — sidebar + main + optional detail column, for the
38
- * common "list app" shape (a list sidebar, a primary content list, and a
39
- * detail pane that only takes up space once something is selected).
40
- *
41
- * Purely positional and structural — it has no awareness of what's inside
42
- * each slot (no injected landmarks/labels; those belong to the children
43
- * themselves) and no responsive behavior of its own. Collapsing further at
44
- * narrow desktop/tablet widths (e.g. swapping the detail column for an
45
- * overlay) is the consuming plugin's decision; below the mobile breakpoint,
46
- * compose with ResponsiveSurface to fork to a different tree entirely.
47
- */
48
- export function ThreeColumnLayout({
49
- children,
50
- sidebarWidth = 280,
51
- detailWidth = 360,
52
- sidebarHidden = false,
53
- className,
54
- }: ThreeColumnLayoutProps) {
55
- const items = Children.toArray(children);
56
-
57
- if (process.env.NODE_ENV !== 'production' && (items.length < 2 || items.length > 3)) {
58
- console.warn(
59
- `[ThreeColumnLayout] Expects 2 or 3 children (sidebar, main, optional detail); received ${items.length}.`,
60
- );
61
- }
62
-
63
- const [sidebar, main, detail] = items;
64
-
65
- return (
66
- <div className={[styles.shell, className].filter(Boolean).join(' ')}>
67
- {/* `hidden` (not just the class) so the column leaves the
68
- accessibility tree and the tab order too, rather than staying
69
- reachable by keyboard while invisible. */}
70
- <div
71
- className={[styles.sidebar, sidebarHidden && styles.sidebarHidden]
72
- .filter(Boolean)
73
- .join(' ')}
74
- style={sidebarHidden ? undefined : { width: sidebarWidth }}
75
- hidden={sidebarHidden}
76
- >
77
- {sidebar}
78
- </div>
79
- <div className={styles.main}>{main}</div>
80
- {detail && (
81
- <div className={styles.detail} style={{ width: detailWidth }}>
82
- {detail}
83
- </div>
84
- )}
85
- </div>
86
- );
87
- }
@@ -1,78 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it, vi } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { ThreeColumnLayout } from '../ThreeColumnLayout';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('ThreeColumnLayout', () => {
9
- it('renders two columns and no detail column when only sidebar + main are given', () => {
10
- render(
11
- <ThreeColumnLayout>
12
- <nav>Sidebar</nav>
13
- <main>Main</main>
14
- </ThreeColumnLayout>,
15
- );
16
-
17
- expect(screen.getByText('Sidebar')).toBeDefined();
18
- expect(screen.getByText('Main')).toBeDefined();
19
- });
20
-
21
- it('renders the detail column when a third child is given', () => {
22
- render(
23
- <ThreeColumnLayout>
24
- <nav>Sidebar</nav>
25
- <main>Main</main>
26
- <aside>Detail</aside>
27
- </ThreeColumnLayout>,
28
- );
29
-
30
- expect(screen.getByText('Detail')).toBeDefined();
31
- });
32
-
33
- it('omits the detail column when the third child is conditionally falsy', () => {
34
- const selected = false;
35
- render(
36
- <ThreeColumnLayout>
37
- <nav>Sidebar</nav>
38
- <main>Main</main>
39
- {selected && <aside>Detail</aside>}
40
- </ThreeColumnLayout>,
41
- );
42
-
43
- expect(screen.queryByText('Detail')).toBeNull();
44
- });
45
-
46
- it('applies sidebarWidth and detailWidth as inline widths', () => {
47
- render(
48
- <ThreeColumnLayout sidebarWidth={240} detailWidth={320}>
49
- <nav>Sidebar</nav>
50
- <main>Main</main>
51
- <aside>Detail</aside>
52
- </ThreeColumnLayout>,
53
- );
54
-
55
- expect(screen.getByText('Sidebar').parentElement?.style.width).toBe('240px');
56
- expect(screen.getByText('Detail').parentElement?.style.width).toBe('320px');
57
- });
58
-
59
- it('warns in development when given fewer than 2 or more than 3 children', () => {
60
- const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
61
-
62
- render(<ThreeColumnLayout>{[<main key="only">Only</main>]}</ThreeColumnLayout>);
63
- expect(warn).toHaveBeenCalledWith(expect.stringContaining('received 1'));
64
-
65
- warn.mockClear();
66
- render(
67
- <ThreeColumnLayout>
68
- <nav>A</nav>
69
- <main>B</main>
70
- <aside>C</aside>
71
- <aside>D</aside>
72
- </ThreeColumnLayout>,
73
- );
74
- expect(warn).toHaveBeenCalledWith(expect.stringContaining('received 4'));
75
-
76
- warn.mockRestore();
77
- });
78
- });
@@ -1,191 +0,0 @@
1
- /* Toast — transient notification snackbar.
2
- *
3
- * Desktop: fixed top-right, 320px, slides in from above. Mobile floats
4
- * bottom-center instead (see the media query near the bottom of this file
5
- * for why). Each toast auto-dismisses after `duration` ms. Leading status
6
- * icon reinforces category at a glance.
7
- *
8
- * Category variants map to the semantic status tokens (info/success/warning/
9
- * error) so the visual language is consistent with banners and badges.
10
- * The announcement category uses the accent colour (neutral brand highlight).
11
- * `security` matches the error palette — draws maximum attention. */
12
-
13
- .region {
14
- position: fixed;
15
- top: var(--sv-space-4);
16
- right: var(--sv-space-4);
17
- z-index: 200;
18
- display: flex;
19
- flex-direction: column;
20
- gap: var(--sv-space-2);
21
- width: 320px;
22
- max-width: calc(100vw - var(--sv-space-8));
23
- pointer-events: none;
24
- }
25
-
26
- .toast {
27
- display: flex;
28
- align-items: flex-start;
29
- gap: var(--sv-space-3);
30
- padding: var(--sv-space-3) var(--sv-space-4);
31
- background: var(--sv-color-surface-raised);
32
- color: var(--sv-color-text-primary);
33
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
34
- border-radius: var(--sv-radius-md);
35
- box-shadow: var(--sv-shadow-overlay);
36
- pointer-events: all;
37
- animation: toastIn 200ms ease-out;
38
- }
39
-
40
- .toast.exiting {
41
- animation: toastOut 200ms ease-in forwards;
42
- }
43
-
44
- /* Leading status icon */
45
- .icon {
46
- flex: 0 0 auto;
47
- display: flex;
48
- align-items: center;
49
- padding-top: 1px;
50
- color: var(--sv-color-border-strong);
51
- }
52
-
53
- .toast.info .icon,
54
- .toast.announcement .icon {
55
- color: var(--sv-color-accent);
56
- }
57
-
58
- .toast.success .icon {
59
- color: var(--sv-color-success-text);
60
- }
61
-
62
- .toast.warning .icon {
63
- color: var(--sv-color-warning-text);
64
- }
65
-
66
- .toast.error .icon,
67
- .toast.security .icon {
68
- color: var(--sv-color-error-text);
69
- }
70
-
71
- .body {
72
- flex: 1 1 auto;
73
- min-width: 0;
74
- }
75
-
76
- .title {
77
- font-size: var(--sv-font-size-sm);
78
- font-weight: 600;
79
- line-height: 1.4;
80
- color: var(--sv-color-text-primary);
81
- }
82
-
83
- .message {
84
- font-size: var(--sv-font-size-sm);
85
- color: var(--sv-color-text-muted);
86
- margin-top: var(--sv-space-1);
87
- line-height: 1.4;
88
- }
89
-
90
- .close {
91
- flex: 0 0 auto;
92
- background: none;
93
- border: none;
94
- padding: 0;
95
- cursor: pointer;
96
- color: var(--sv-color-text-subtle);
97
- line-height: 1;
98
- font-size: var(--sv-font-size-md);
99
- }
100
-
101
- @media (hover: hover) {
102
- .close:hover {
103
- color: var(--sv-color-text-primary);
104
- }
105
- }
106
-
107
- @keyframes toastIn {
108
- from {
109
- opacity: 0;
110
- transform: translateY(-8px);
111
- }
112
- to {
113
- opacity: 1;
114
- transform: translateY(0);
115
- }
116
- }
117
-
118
- @keyframes toastOut {
119
- from {
120
- opacity: 1;
121
- transform: translateY(0);
122
- }
123
- to {
124
- opacity: 0;
125
- transform: translateY(-8px);
126
- }
127
- }
128
-
129
- /* Mobile (<=768px, the design system's canonical breakpoint): float
130
- * bottom-center instead of top-right. Clears any mobile footer/tab bar
131
- * (--sv-shell-footer-height) and the home-indicator safe area, plus extra
132
- * breathing room so it visibly floats above the edge rather than sitting
133
- * flush against it — matches the platform convention (Android Toast,
134
- * Material 3's "floating" Snackbar). Deliberately not threaded through
135
- * --sv-shell-header-height instead: a toast can appear on a page with or
136
- * without a self-rendered mobile header, and bottom-anchoring sidesteps that
137
- * entirely rather than requiring every call site to account for it.
138
- * Each toast is centered and content-sized (capped at 360px) rather than
139
- * stretched to the region's full width, and slides up from below instead of
140
- * down from above to match its new anchor. */
141
- @media (max-width: 768px) {
142
- .region {
143
- top: auto;
144
- left: var(--sv-space-4);
145
- right: var(--sv-space-4);
146
- bottom: calc(
147
- var(--sv-shell-footer-height, 0px) + env(safe-area-inset-bottom, 0px) + var(--sv-space-4)
148
- );
149
- width: auto;
150
- align-items: center;
151
- }
152
-
153
- .toast {
154
- width: 100%;
155
- max-width: 360px;
156
- animation-name: toastInMobile;
157
- }
158
-
159
- .toast.exiting {
160
- animation-name: toastOutMobile;
161
- }
162
- }
163
-
164
- @keyframes toastInMobile {
165
- from {
166
- opacity: 0;
167
- transform: translateY(8px);
168
- }
169
- to {
170
- opacity: 1;
171
- transform: translateY(0);
172
- }
173
- }
174
-
175
- @keyframes toastOutMobile {
176
- from {
177
- opacity: 1;
178
- transform: translateY(0);
179
- }
180
- to {
181
- opacity: 0;
182
- transform: translateY(8px);
183
- }
184
- }
185
-
186
- @media (prefers-reduced-motion: reduce) {
187
- .toast,
188
- .toast.exiting {
189
- animation: none;
190
- }
191
- }
@@ -1,191 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { ToastProvider, useToast } from './Toast';
4
-
5
- const meta = {
6
- title: 'Components/Toast',
7
- component: ToastProvider,
8
- parameters: {
9
- layout: 'centered',
10
- docs: {
11
- description: {
12
- component:
13
- 'Fixed top-right notification stack on desktop; floats bottom-center on mobile (<=768px), clearing any mobile footer/tab bar and the home-indicator safe area. Use `<ToastProvider>` at the app root and `useToast()` to imperatively show toasts. Each toast has a leading status icon matched to its category. Switch the viewport toolbar to a mobile width to see the bottom-center placement.',
14
- },
15
- },
16
- },
17
- args: {
18
- children: null,
19
- },
20
- } satisfies Meta<typeof ToastProvider>;
21
-
22
- export default meta;
23
- type Story = StoryObj<typeof meta>;
24
-
25
- // ---------------------------------------------------------------------------
26
-
27
- function ToastTrigger({ category, label }: { category: string; label: string }) {
28
- const { show } = useToast();
29
- return (
30
- <button
31
- type="button"
32
- onClick={() =>
33
- show({
34
- title: label,
35
- message: `This is a ${category} toast notification.`,
36
- category,
37
- })
38
- }
39
- style={{
40
- padding: '8px 16px',
41
- borderRadius: 'var(--sv-radius-md)',
42
- border: '1px solid var(--sv-color-border)',
43
- background: 'var(--sv-color-surface)',
44
- color: 'var(--sv-color-text-primary)',
45
- fontFamily: 'var(--sv-font-family)',
46
- fontSize: 'var(--sv-font-size-sm)',
47
- cursor: 'pointer',
48
- }}
49
- >
50
- {label}
51
- </button>
52
- );
53
- }
54
-
55
- /** All toast categories — each button fires a toast with the matching leading icon. */
56
- export const AllCategories: Story = {
57
- render: (_args) => (
58
- <ToastProvider>
59
- <div
60
- style={{
61
- display: 'flex',
62
- flexDirection: 'column',
63
- gap: 8,
64
- alignItems: 'flex-start',
65
- }}
66
- >
67
- <ToastTrigger category="info" label="Info toast" />
68
- <ToastTrigger category="success" label="Success toast" />
69
- <ToastTrigger category="warning" label="Warning toast" />
70
- <ToastTrigger category="error" label="Error toast" />
71
- <ToastTrigger category="security" label="Security toast" />
72
- <ToastTrigger category="announcement" label="Announcement toast" />
73
- </div>
74
- </ToastProvider>
75
- ),
76
- };
77
-
78
- /** Toast with no body — title only. */
79
- export const TitleOnly: Story = {
80
- render: (_args) => {
81
- function Trigger() {
82
- const { show } = useToast();
83
- return (
84
- <button
85
- type="button"
86
- onClick={() => show({ title: 'Session expires in 5 minutes', category: 'warning' })}
87
- style={{
88
- padding: '8px 16px',
89
- borderRadius: 'var(--sv-radius-md)',
90
- border: '1px solid var(--sv-color-border)',
91
- background: 'var(--sv-color-surface)',
92
- color: 'var(--sv-color-text-primary)',
93
- fontFamily: 'var(--sv-font-family)',
94
- fontSize: 'var(--sv-font-size-sm)',
95
- cursor: 'pointer',
96
- }}
97
- >
98
- Show title-only toast
99
- </button>
100
- );
101
- }
102
- return (
103
- <ToastProvider>
104
- <Trigger />
105
- </ToastProvider>
106
- );
107
- },
108
- };
109
-
110
- /** Persistent toast — pass `duration: 0` to disable auto-dismiss. */
111
- export const Persistent: Story = {
112
- render: (_args) => {
113
- function Trigger() {
114
- const { show } = useToast();
115
- return (
116
- <button
117
- type="button"
118
- onClick={() =>
119
- show({
120
- title: 'Maintenance mode active',
121
- message: 'Platform is in read-only mode. Dismiss when resolved.',
122
- category: 'error',
123
- duration: 0,
124
- })
125
- }
126
- style={{
127
- padding: '8px 16px',
128
- borderRadius: 'var(--sv-radius-md)',
129
- border: '1px solid var(--sv-color-border)',
130
- background: 'var(--sv-color-surface)',
131
- color: 'var(--sv-color-text-primary)',
132
- fontFamily: 'var(--sv-font-family)',
133
- fontSize: 'var(--sv-font-size-sm)',
134
- cursor: 'pointer',
135
- }}
136
- >
137
- Show persistent toast
138
- </button>
139
- );
140
- }
141
- return (
142
- <ToastProvider>
143
- <Trigger />
144
- </ToastProvider>
145
- );
146
- },
147
- };
148
-
149
- /** Multiple toasts stack vertically below the first. */
150
- export const Stacked: Story = {
151
- render: (_args) => {
152
- function Trigger() {
153
- const { show } = useToast();
154
- const [fired, setFired] = useState(false);
155
- return (
156
- <button
157
- type="button"
158
- disabled={fired}
159
- onClick={() => {
160
- show({ title: 'Plugin installed', category: 'success' });
161
- show({
162
- title: 'License warning',
163
- message: 'Expires in 3 days.',
164
- category: 'warning',
165
- });
166
- show({ title: 'Backup failed', message: 'Check storage quota.', category: 'error' });
167
- setFired(true);
168
- }}
169
- style={{
170
- padding: '8px 16px',
171
- borderRadius: 'var(--sv-radius-md)',
172
- border: '1px solid var(--sv-color-border)',
173
- background: 'var(--sv-color-surface)',
174
- color: 'var(--sv-color-text-primary)',
175
- fontFamily: 'var(--sv-font-family)',
176
- fontSize: 'var(--sv-font-size-sm)',
177
- cursor: fired ? 'default' : 'pointer',
178
- opacity: fired ? 0.5 : 1,
179
- }}
180
- >
181
- Fire 3 toasts
182
- </button>
183
- );
184
- }
185
- return (
186
- <ToastProvider>
187
- <Trigger />
188
- </ToastProvider>
189
- );
190
- },
191
- };