@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,96 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Alert } from './Alert';
3
-
4
- const meta = {
5
- title: 'Components/Alert',
6
- component: Alert,
7
- parameters: {
8
- layout: 'padded',
9
- docs: {
10
- description: {
11
- component:
12
- 'Inline, non-dismissible banner. Distinct from Toast (transient) and SystemBanner (instance-wide) — for form-level errors or explaining an empty/blocked state. A leading icon defaults per variant (none for neutral) — pass `icon` to override it or `icon={false}` to suppress it.',
13
- },
14
- },
15
- },
16
- argTypes: {
17
- variant: { control: 'select', options: ['info', 'success', 'warning', 'error', 'neutral'] },
18
- },
19
- args: {
20
- variant: 'info',
21
- children: 'This is an informational message.',
22
- },
23
- } satisfies Meta<typeof Alert>;
24
-
25
- export default meta;
26
- type Story = StoryObj<typeof meta>;
27
-
28
- // ---------------------------------------------------------------------------
29
-
30
- export const Info: Story = {
31
- args: { variant: 'info' },
32
- };
33
-
34
- export const Success: Story = {
35
- args: { variant: 'success', children: 'Your changes have been saved.' },
36
- };
37
-
38
- export const Warning: Story = {
39
- args: { variant: 'warning', children: 'This action cannot be undone.' },
40
- };
41
-
42
- export const ErrorVariant: Story = {
43
- name: 'Error',
44
- args: { variant: 'error', children: 'Select a size to continue.' },
45
- };
46
-
47
- export const Neutral: Story = {
48
- args: { variant: 'neutral', children: 'This project has no members yet.' },
49
- };
50
-
51
- export const WithHeading: Story = {
52
- args: {
53
- variant: 'error',
54
- heading: 'Something went wrong',
55
- children: 'We couldn’t save your changes. Check your connection and try again.',
56
- },
57
- };
58
-
59
- export const WithoutHeading: Story = {
60
- args: { variant: 'success', children: 'Invite sent.' },
61
- };
62
-
63
- /** Icon + heading + body — the pattern most alert examples use. */
64
- export const IconHeadingAndBody: Story = {
65
- args: {
66
- variant: 'success',
67
- heading: 'Payment successful',
68
- children:
69
- 'Your payment of $29.99 has been processed. A receipt has been sent to your email address.',
70
- },
71
- };
72
-
73
- export const CustomIcon: Story = {
74
- args: { variant: 'neutral', icon: 'bell', children: 'You have 3 unread notifications.' },
75
- };
76
-
77
- export const NoIcon: Story = {
78
- args: { variant: 'success', icon: false, children: 'Your changes have been saved.' },
79
- };
80
-
81
- /** Every variant with its default icon, at a glance. */
82
- export const AllVariants: Story = {
83
- render: () => (
84
- <div style={{ display: 'flex', flexDirection: 'column', gap: 12, maxWidth: 480 }}>
85
- <Alert variant="info" heading="New feature available">
86
- We’ve added dark mode support. You can enable it in your account settings.
87
- </Alert>
88
- <Alert variant="success" heading="Payment successful">
89
- Your payment of $29.99 has been processed. A receipt has been sent to your email address.
90
- </Alert>
91
- <Alert variant="warning">This action cannot be undone.</Alert>
92
- <Alert variant="error">Select a size to continue.</Alert>
93
- <Alert variant="neutral">This project has no members yet.</Alert>
94
- </div>
95
- ),
96
- };
@@ -1,58 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import { Icon, type IconName } from '../Icon/Icon';
3
- import styles from './Alert.module.css';
4
-
5
- export type AlertVariant = 'info' | 'success' | 'warning' | 'error' | 'neutral';
6
-
7
- /** Sensible default icon per variant. `neutral` has none — there's no
8
- * universal "neutral" glyph, so it stays icon-less unless `icon` is set
9
- * explicitly. */
10
- const DEFAULT_ICON: Record<AlertVariant, IconName | undefined> = {
11
- info: 'info',
12
- success: 'circle-check',
13
- warning: 'alert-triangle',
14
- error: 'circle-x',
15
- neutral: undefined,
16
- };
17
-
18
- export interface AlertProps {
19
- variant: AlertVariant;
20
- heading?: string;
21
- /** Leading icon next to the heading. Defaults to a per-variant icon (see
22
- * `DEFAULT_ICON`) — pass an `IconName` to override it, or `false` to
23
- * suppress the icon entirely. Purely decorative: the variant's colour and
24
- * `heading`/`children` text already carry the meaning. */
25
- icon?: IconName | false;
26
- children: ReactNode;
27
- id?: string;
28
- className?: string;
29
- }
30
-
31
- /**
32
- * Alert — inline, non-dismissible banner.
33
- *
34
- * Distinct from `Toast` (transient, auto-dismissing) and `SystemBanner`
35
- * (instance-wide): Alert is for in-context messaging — form-level errors,
36
- * or explaining an empty/blocked state.
37
- *
38
- * `role="alert"` for `error` (interrupts screen readers immediately, since
39
- * an error demands attention); `role="status"` for the other variants
40
- * (announced politely, without interrupting).
41
- */
42
- export function Alert({ variant, heading, icon, children, id, className }: AlertProps) {
43
- const resolvedIcon = icon === undefined ? DEFAULT_ICON[variant] : icon || undefined;
44
-
45
- return (
46
- <div
47
- id={id}
48
- role={variant === 'error' ? 'alert' : 'status'}
49
- className={[styles.alert, styles[variant], className].filter(Boolean).join(' ')}
50
- >
51
- {resolvedIcon && <Icon name={resolvedIcon} size="sm" className={styles.icon} aria-hidden />}
52
- <div className={styles.content}>
53
- {heading && <p className={styles.heading}>{heading}</p>}
54
- <div className={styles.body}>{children}</div>
55
- </div>
56
- </div>
57
- );
58
- }
@@ -1,75 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { Alert } from '../Alert';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('Alert', () => {
9
- it('uses role="alert" for the error variant', () => {
10
- render(<Alert variant="error">Something went wrong.</Alert>);
11
- expect(screen.getByRole('alert')).toBeDefined();
12
- });
13
-
14
- it.each(['info', 'success', 'warning', 'neutral'] as const)(
15
- 'uses role="status" for the %s variant',
16
- (variant) => {
17
- render(<Alert variant={variant}>Message</Alert>);
18
- expect(screen.getByRole('status')).toBeDefined();
19
- },
20
- );
21
-
22
- it('renders a heading when given one', () => {
23
- render(
24
- <Alert variant="warning" heading="Heads up">
25
- Body text.
26
- </Alert>,
27
- );
28
- expect(screen.getByText('Heads up')).toBeDefined();
29
- expect(screen.getByText('Body text.')).toBeDefined();
30
- });
31
-
32
- it('renders without a heading', () => {
33
- render(<Alert variant="info">Just the body.</Alert>);
34
- expect(screen.getByText('Just the body.')).toBeDefined();
35
- });
36
-
37
- it('renders a default icon for info, success, warning, and error, but none for neutral', () => {
38
- const info = render(<Alert variant="info">Message</Alert>);
39
- expect(info.container.querySelector('svg')).not.toBeNull();
40
- info.unmount();
41
-
42
- const success = render(<Alert variant="success">Message</Alert>);
43
- expect(success.container.querySelector('svg')).not.toBeNull();
44
- success.unmount();
45
-
46
- const warning = render(<Alert variant="warning">Message</Alert>);
47
- expect(warning.container.querySelector('svg')).not.toBeNull();
48
- warning.unmount();
49
-
50
- const error = render(<Alert variant="error">Message</Alert>);
51
- expect(error.container.querySelector('svg')).not.toBeNull();
52
- error.unmount();
53
-
54
- const neutral = render(<Alert variant="neutral">Message</Alert>);
55
- expect(neutral.container.querySelector('svg')).toBeNull();
56
- });
57
-
58
- it('suppresses the default icon when icon={false}', () => {
59
- const { container } = render(
60
- <Alert variant="success" icon={false}>
61
- Message
62
- </Alert>,
63
- );
64
- expect(container.querySelector('svg')).toBeNull();
65
- });
66
-
67
- it('overrides the default icon when icon is set explicitly', () => {
68
- const { container } = render(
69
- <Alert variant="neutral" icon="info">
70
- Message
71
- </Alert>,
72
- );
73
- expect(container.querySelector('svg')).not.toBeNull();
74
- });
75
- });
@@ -1,96 +0,0 @@
1
- .trigger {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- flex-shrink: 0;
6
- width: 28px;
7
- height: 28px;
8
- padding: 0;
9
- border: none;
10
- border-radius: var(--sv-radius-md);
11
- background: transparent;
12
- color: var(--sv-color-text-primary);
13
- cursor: pointer;
14
- }
15
-
16
- @media (hover: hover) {
17
- .trigger:hover {
18
- background: var(--sv-color-surface-sunken);
19
- }
20
- }
21
-
22
- .header {
23
- padding: var(--sv-space-4) var(--sv-space-3) var(--sv-space-1);
24
- font-size: var(--sv-font-size-sm);
25
- font-weight: var(--sv-font-weight-semibold);
26
- color: var(--sv-color-text-primary);
27
- }
28
-
29
- .loading {
30
- display: flex;
31
- justify-content: center;
32
- padding: var(--sv-space-6);
33
- }
34
-
35
- .error {
36
- margin: 0;
37
- padding: 0 var(--sv-space-3) var(--sv-space-3);
38
- color: var(--sv-color-error-text);
39
- font-size: var(--sv-font-size-sm);
40
- }
41
-
42
- .grid {
43
- display: grid;
44
- /* minmax(0, 1fr), not a plain 1fr — a plain 1fr track can grow past the
45
- grid's own available width to fit a tile name's min-content size
46
- (nowrap), blowing the grid out past the popover's own width instead of
47
- letting the name truncate with ellipsis as intended. */
48
- grid-template-columns: repeat(3, minmax(0, 1fr));
49
- gap: var(--sv-space-1);
50
- padding: var(--sv-space-2);
51
- max-height: 60vh;
52
- overflow-y: auto;
53
- }
54
-
55
- .tile {
56
- display: flex;
57
- flex-direction: column;
58
- align-items: center;
59
- gap: var(--sv-space-2);
60
- padding: var(--sv-space-2);
61
- border: none;
62
- border-radius: var(--sv-radius-md);
63
- background: transparent;
64
- text-decoration: none;
65
- color: var(--sv-color-text-primary);
66
- text-align: center;
67
- font: inherit;
68
- cursor: pointer;
69
- }
70
-
71
- @media (hover: hover) {
72
- .tile:hover {
73
- background: var(--sv-color-surface-sunken);
74
- }
75
- }
76
-
77
- .tileIcon {
78
- display: flex;
79
- align-items: center;
80
- justify-content: center;
81
- width: 32px;
82
- height: 32px;
83
- border-radius: var(--sv-radius-md);
84
- background: var(--sv-color-surface-sunken);
85
- font-size: var(--sv-font-size-xs);
86
- font-weight: var(--sv-font-weight-semibold);
87
- overflow: hidden;
88
- }
89
-
90
- .tileName {
91
- font-size: var(--sv-font-size-caption);
92
- overflow: hidden;
93
- text-overflow: ellipsis;
94
- white-space: nowrap;
95
- max-width: 100%;
96
- }
@@ -1,58 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { AppsLauncher } from './AppsLauncher';
3
- import { Icon } from '../Icon/Icon';
4
-
5
- const items = [
6
- {
7
- key: 'home',
8
- icon: <Icon name="house" size="md" aria-hidden />,
9
- label: 'Home',
10
- href: '/launcher',
11
- },
12
- {
13
- key: 'console',
14
- icon: <Icon name="layout-dashboard" size="md" aria-hidden />,
15
- label: 'Console',
16
- href: '/console',
17
- },
18
- {
19
- key: 'notes',
20
- icon: <Icon name="file" size="md" aria-hidden />,
21
- label: 'Notes',
22
- href: '/notes',
23
- },
24
- ];
25
-
26
- const meta = {
27
- title: 'Components/AppsLauncher',
28
- component: AppsLauncher,
29
- parameters: {
30
- layout: 'centered',
31
- docs: {
32
- description: {
33
- component:
34
- "The desktop 'Apps' switcher — a 28px grid trigger opening a Popover tile grid. The desktop counterpart to MobileAppsDrawer: same items shape, different chrome. Presentational only — items are supplied already resolved.",
35
- },
36
- },
37
- },
38
- args: {
39
- items,
40
- },
41
- } satisfies Meta<typeof AppsLauncher>;
42
-
43
- export default meta;
44
- type Story = StoryObj<typeof meta>;
45
-
46
- export const Default: Story = {};
47
-
48
- export const Loading: Story = {
49
- args: {
50
- loading: true,
51
- },
52
- };
53
-
54
- export const ErrorState: Story = {
55
- args: {
56
- error: true,
57
- },
58
- };
@@ -1,117 +0,0 @@
1
- 'use client';
2
-
3
- import { useState, type ReactNode } from 'react';
4
- import { Icon } from '../Icon/Icon';
5
- import { Popover } from '../Popover/Popover';
6
- import { Spinner } from '../Spinner/Spinner';
7
- import styles from './AppsLauncher.module.css';
8
-
9
- export interface AppsLauncherItem {
10
- /** Stable identity for this tile — used as the React key. */
11
- key: string;
12
- icon: ReactNode;
13
- label: string;
14
- /** Renders an `<a>` when set; otherwise a `<button>` calling `onClick` —
15
- * same dual-mode convention as `MobileAppsDrawer`'s items. */
16
- href?: string;
17
- onClick?: () => void;
18
- }
19
-
20
- export interface AppsLauncherProps {
21
- items: AppsLauncherItem[];
22
- /** Shows a spinner in place of the grid — e.g. while the tile list is
23
- * still being fetched. */
24
- loading?: boolean;
25
- /** Shows an error message in place of the grid. */
26
- error?: boolean;
27
- errorMessage?: string;
28
- /** Trigger button's icon. Defaults to a generic grid glyph — pass the
29
- * real Launcher plugin's own icon for pixel parity with the platform. */
30
- triggerIcon?: ReactNode;
31
- /** Trigger button's accessible label, and the popover's own. Defaults to "Apps". */
32
- 'aria-label'?: string;
33
- align?: 'left' | 'right';
34
- }
35
-
36
- function AppsLauncherTile({ icon, label, href, onClick }: Omit<AppsLauncherItem, 'key'>) {
37
- const content = (
38
- <>
39
- <span className={styles.tileIcon} aria-hidden="true">
40
- {icon}
41
- </span>
42
- <span className={styles.tileName}>{label}</span>
43
- </>
44
- );
45
- if (href) {
46
- return (
47
- <a href={href} className={styles.tile} onClick={onClick}>
48
- {content}
49
- </a>
50
- );
51
- }
52
- return (
53
- <button type="button" className={styles.tile} onClick={onClick}>
54
- {content}
55
- </button>
56
- );
57
- }
58
-
59
- /**
60
- * AppsLauncher — the desktop "Apps" switcher: a 28px grid-icon trigger that
61
- * opens a `Popover` with a 3-column tile grid. The desktop counterpart to
62
- * `MobileAppsDrawer` — same `items` shape (`key`/`icon`/`label`/`href`/
63
- * `onClick`), different chrome (floating panel vs. bottom sheet), matching
64
- * how `Header`/`MobileHeader` already split the same way.
65
- *
66
- * Presentational only — no plugin-list fetching of its own. The consumer
67
- * supplies `items` already resolved (and `loading`/`error` while it isn't
68
- * yet), matching `MobileAppsDrawer`'s own boundary.
69
- */
70
- export function AppsLauncher({
71
- items,
72
- loading,
73
- error,
74
- errorMessage = "Couldn't load apps. Try again.",
75
- triggerIcon,
76
- 'aria-label': ariaLabel = 'Apps',
77
- align = 'right',
78
- }: AppsLauncherProps) {
79
- const [open, setOpen] = useState(false);
80
-
81
- return (
82
- <Popover
83
- align={align}
84
- width={320}
85
- aria-label={ariaLabel}
86
- open={open}
87
- onClose={() => setOpen(false)}
88
- trigger={
89
- <button
90
- type="button"
91
- aria-label={ariaLabel}
92
- aria-haspopup="true"
93
- aria-expanded={open}
94
- onClick={() => setOpen((v) => !v)}
95
- className={styles.trigger}
96
- >
97
- {triggerIcon ?? <Icon name="layout-grid" size="md" aria-hidden />}
98
- </button>
99
- }
100
- >
101
- <div className={styles.header}>{ariaLabel}</div>
102
- {loading ? (
103
- <div className={styles.loading}>
104
- <Spinner size="md" label="Loading apps…" />
105
- </div>
106
- ) : error ? (
107
- <p className={styles.error}>{errorMessage}</p>
108
- ) : (
109
- <div className={styles.grid}>
110
- {items.map(({ key, ...item }) => (
111
- <AppsLauncherTile key={key} {...item} />
112
- ))}
113
- </div>
114
- )}
115
- </Popover>
116
- );
117
- }
@@ -1,52 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it, vi } from 'vitest';
3
- import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
- import { AppsLauncher } from '../AppsLauncher';
5
-
6
- afterEach(() => {
7
- cleanup();
8
- });
9
-
10
- const items = [
11
- { key: 'home', icon: <span>home-icon</span>, label: 'Home', href: '/launcher' },
12
- { key: 'notes', icon: <span>notes-icon</span>, label: 'Notes', onClick: vi.fn() },
13
- ];
14
-
15
- describe('AppsLauncher', () => {
16
- it('renders a closed trigger by default', () => {
17
- render(<AppsLauncher items={items} />);
18
- expect(screen.getByRole('button', { name: 'Apps' })).toBeTruthy();
19
- expect(screen.queryByText('Home')).toBeNull();
20
- });
21
-
22
- it('opens the tile grid on trigger click', () => {
23
- render(<AppsLauncher items={items} />);
24
- fireEvent.click(screen.getByRole('button', { name: 'Apps' }));
25
- expect(screen.getByText('Home')).toBeTruthy();
26
- expect(screen.getByText('Notes')).toBeTruthy();
27
- });
28
-
29
- it('renders an href item as a link and an onClick item as a button', () => {
30
- render(<AppsLauncher items={items} />);
31
- fireEvent.click(screen.getByRole('button', { name: 'Apps' }));
32
- expect(screen.getByText('Home').closest('a')).toHaveProperty(
33
- 'href',
34
- expect.stringContaining('/launcher'),
35
- );
36
- expect(screen.getByText('Notes').closest('button')).toBeTruthy();
37
- });
38
-
39
- it('shows a loading state instead of the grid', () => {
40
- render(<AppsLauncher items={items} loading />);
41
- fireEvent.click(screen.getByRole('button', { name: 'Apps' }));
42
- expect(screen.queryByText('Home')).toBeNull();
43
- expect(screen.getByRole('status', { name: /Loading apps/ })).toBeTruthy();
44
- });
45
-
46
- it('shows an error state instead of the grid', () => {
47
- render(<AppsLauncher items={items} error errorMessage="Nope" />);
48
- fireEvent.click(screen.getByRole('button', { name: 'Apps' }));
49
- expect(screen.queryByText('Home')).toBeNull();
50
- expect(screen.getByText('Nope')).toBeTruthy();
51
- });
52
- });
@@ -1,15 +0,0 @@
1
- .root {
2
- position: relative;
3
- width: 100%;
4
- overflow: hidden;
5
- border-radius: var(--sv-radius-md);
6
- }
7
-
8
- /* A single direct child (img/video/iframe) fills the ratio box. */
9
- .root > :global(*) {
10
- position: absolute;
11
- inset: 0;
12
- width: 100%;
13
- height: 100%;
14
- object-fit: cover;
15
- }
@@ -1,78 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { AspectRatio } from './AspectRatio';
3
-
4
- const meta = {
5
- title: 'Components/AspectRatio',
6
- component: AspectRatio,
7
- parameters: { layout: 'padded' },
8
- args: {
9
- ratio: 16 / 9,
10
- children: (
11
- <div
12
- style={{
13
- width: '100%',
14
- height: '100%',
15
- background: 'var(--sv-color-surface-sunken)',
16
- display: 'flex',
17
- alignItems: 'center',
18
- justifyContent: 'center',
19
- color: 'var(--sv-color-text-muted)',
20
- fontSize: 'var(--sv-font-size-sm)',
21
- }}
22
- >
23
- 16:9
24
- </div>
25
- ),
26
- },
27
- } satisfies Meta<typeof AspectRatio>;
28
-
29
- export default meta;
30
- type Story = StoryObj<typeof meta>;
31
-
32
- // ---------------------------------------------------------------------------
33
-
34
- export const Widescreen: Story = {};
35
-
36
- export const Square: Story = {
37
- args: {
38
- ratio: 1,
39
- children: (
40
- <div
41
- style={{
42
- width: '100%',
43
- height: '100%',
44
- background: 'var(--sv-color-surface-sunken)',
45
- display: 'flex',
46
- alignItems: 'center',
47
- justifyContent: 'center',
48
- color: 'var(--sv-color-text-muted)',
49
- fontSize: 'var(--sv-font-size-sm)',
50
- }}
51
- >
52
- 1:1
53
- </div>
54
- ),
55
- },
56
- };
57
-
58
- export const Portrait: Story = {
59
- args: {
60
- ratio: 3 / 4,
61
- children: (
62
- <div
63
- style={{
64
- width: '100%',
65
- height: '100%',
66
- background: 'var(--sv-color-surface-sunken)',
67
- display: 'flex',
68
- alignItems: 'center',
69
- justifyContent: 'center',
70
- color: 'var(--sv-color-text-muted)',
71
- fontSize: 'var(--sv-font-size-sm)',
72
- }}
73
- >
74
- 3:4
75
- </div>
76
- ),
77
- },
78
- };
@@ -1,21 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './AspectRatio.module.css';
3
-
4
- export interface AspectRatioProps {
5
- /** Width / height, e.g. 16 / 9 or 1. */
6
- ratio: number;
7
- children: ReactNode;
8
- className?: string;
9
- }
10
-
11
- /** AspectRatio — constrains content (image, video, embed) to a fixed ratio. */
12
- export function AspectRatio({ ratio, children, className }: AspectRatioProps) {
13
- return (
14
- <div
15
- className={[styles.root, className].filter(Boolean).join(' ')}
16
- style={{ aspectRatio: ratio }}
17
- >
18
- {children}
19
- </div>
20
- );
21
- }