@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,32 +0,0 @@
1
- .chip {
2
- display: inline-flex;
3
- align-items: center;
4
- max-width: 100%;
5
- min-height: 24px;
6
- padding: 2px var(--sv-space-2);
7
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
8
- border-radius: var(--sv-radius-full);
9
- font-family: var(--sv-font-family);
10
- font-size: var(--sv-font-size-xs);
11
- font-weight: var(--sv-font-weight-semibold);
12
- line-height: 1.2;
13
- white-space: nowrap;
14
- }
15
-
16
- .owed {
17
- color: var(--sv-color-success-text);
18
- background: var(--sv-color-success-surface);
19
- border-color: var(--sv-color-success-border);
20
- }
21
-
22
- .owes {
23
- color: var(--sv-color-error-text);
24
- background: var(--sv-color-error-surface);
25
- border-color: var(--sv-color-error-border);
26
- }
27
-
28
- .settled {
29
- color: var(--sv-color-text-muted);
30
- background: var(--sv-color-surface-sunken);
31
- border-color: var(--sv-color-border);
32
- }
@@ -1,45 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { BalanceChip } from './BalanceChip';
3
-
4
- const meta = {
5
- title: 'Components/BalanceChip',
6
- component: BalanceChip,
7
- parameters: {
8
- layout: 'centered',
9
- docs: {
10
- description: {
11
- component:
12
- 'Inline net-balance indicator — green when owed to them, red when they owe, neutral when settled. Not tied to expense-splitting specifically: any plugin tracking a signed balance between people can use it.',
13
- },
14
- },
15
- },
16
- args: {
17
- amountCents: 2500,
18
- currency: 'USD',
19
- },
20
- } satisfies Meta<typeof BalanceChip>;
21
-
22
- export default meta;
23
- type Story = StoryObj<typeof meta>;
24
-
25
- export const Owed: Story = {
26
- args: { amountCents: 2500, currency: 'USD' },
27
- };
28
-
29
- export const Owes: Story = {
30
- args: { amountCents: -1350, currency: 'USD' },
31
- };
32
-
33
- export const SettledUp: Story = {
34
- args: { amountCents: 0, currency: 'USD' },
35
- };
36
-
37
- export const AllStates: Story = {
38
- render: () => (
39
- <div style={{ display: 'flex', gap: 'var(--sv-space-2)' }}>
40
- <BalanceChip amountCents={2500} currency="USD" />
41
- <BalanceChip amountCents={-1350} currency="USD" />
42
- <BalanceChip amountCents={0} currency="USD" />
43
- </div>
44
- ),
45
- };
@@ -1,33 +0,0 @@
1
- import styles from './BalanceChip.module.css';
2
-
3
- export interface BalanceChipProps {
4
- /** Smallest currency unit (cents). Positive = owed to them, negative = they owe, zero = settled. */
5
- amountCents: number;
6
- /** ISO 4217 currency code, e.g. "USD". */
7
- currency: string;
8
- className?: string;
9
- }
10
-
11
- function formatAbsCents(cents: number): string {
12
- return (Math.abs(cents) / 100).toFixed(2);
13
- }
14
-
15
- /**
16
- * BalanceChip — inline balance indicator (green = owed to them, red = they
17
- * owe, neutral = settled up). For any plugin tracking who-owes-whom — not
18
- * Tally-specific despite the naming; "amountCents" is a generic signed net
19
- * balance, not tied to expense-splitting semantics.
20
- */
21
- export function BalanceChip({ amountCents, currency, className }: BalanceChipProps) {
22
- const direction = amountCents > 0 ? 'owed' : amountCents < 0 ? 'owes' : 'settled';
23
- const text =
24
- direction === 'settled'
25
- ? 'Settled up'
26
- : `${direction === 'owed' ? 'Owed' : 'Owes'} ${currency} ${formatAbsCents(amountCents)}`;
27
-
28
- return (
29
- <span className={[styles.chip, styles[direction], className].filter(Boolean).join(' ')}>
30
- {text}
31
- </span>
32
- );
33
- }
@@ -1,49 +0,0 @@
1
- .nav {
2
- min-width: 0;
3
- }
4
-
5
- .list {
6
- display: flex;
7
- flex-wrap: wrap;
8
- align-items: center;
9
- gap: var(--sv-space-1);
10
- margin: 0;
11
- padding: 0;
12
- list-style: none;
13
- }
14
-
15
- .item {
16
- display: inline-flex;
17
- align-items: center;
18
- gap: var(--sv-space-1);
19
- }
20
-
21
- .link {
22
- font-size: var(--sv-font-size-sm);
23
- color: var(--sv-color-text-muted);
24
- text-decoration: none;
25
- }
26
-
27
- @media (hover: hover) {
28
- .link:hover {
29
- color: var(--sv-color-text-primary);
30
- text-decoration: underline;
31
- }
32
- }
33
-
34
- .link:focus-visible {
35
- outline: 2px solid var(--sv-color-focus-ring);
36
- outline-offset: 2px;
37
- border-radius: var(--sv-radius-sm);
38
- }
39
-
40
- .current {
41
- font-size: var(--sv-font-size-sm);
42
- font-weight: var(--sv-font-weight-medium);
43
- color: var(--sv-color-text-primary);
44
- }
45
-
46
- .separator {
47
- color: var(--sv-color-text-muted);
48
- flex-shrink: 0;
49
- }
@@ -1,47 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Breadcrumb } from './Breadcrumb';
3
-
4
- const meta = {
5
- title: 'Components/Breadcrumb',
6
- component: Breadcrumb,
7
- parameters: {
8
- layout: 'padded',
9
- docs: {
10
- description: {
11
- component:
12
- 'Link trail. The last item (no href) renders as plain text with aria-current="page". Pass renderLink to use a client-side router Link instead of a plain <a> — matters inside overlay-shell plugins, where a full page reload breaks the dismiss flow.',
13
- },
14
- },
15
- },
16
- args: {
17
- items: [
18
- { label: 'Console', href: '/console' },
19
- { label: 'Plugins', href: '/console/plugins' },
20
- { label: 'sovereign-tasks' },
21
- ],
22
- },
23
- } satisfies Meta<typeof Breadcrumb>;
24
-
25
- export default meta;
26
- type Story = StoryObj<typeof meta>;
27
-
28
- // ---------------------------------------------------------------------------
29
-
30
- export const Default: Story = {};
31
-
32
- export const TwoLevels: Story = {
33
- args: {
34
- items: [{ label: 'Console', href: '/console' }, { label: 'Settings' }],
35
- },
36
- };
37
-
38
- export const WithRenderLink: Story = {
39
- name: 'With custom renderLink',
40
- args: {
41
- renderLink: (item, children) => (
42
- <a href={item.href} data-client-side-nav="true">
43
- {children}
44
- </a>
45
- ),
46
- },
47
- };
@@ -1,57 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import { Icon } from '../Icon/Icon';
3
- import styles from './Breadcrumb.module.css';
4
-
5
- export interface BreadcrumbItem {
6
- label: string;
7
- /** Omit for the current page — rendered as plain text with aria-current. */
8
- href?: string;
9
- }
10
-
11
- export interface BreadcrumbProps {
12
- items: BreadcrumbItem[];
13
- /** Renders a linked item. Defaults to a plain `<a href>`, which causes a
14
- * full page reload — pass Next's `<Link>` (or equivalent) to keep
15
- * navigation client-side, which matters inside overlay-shell plugins
16
- * where a full reload breaks the router.back()-driven dismiss flow. */
17
- renderLink?: (item: BreadcrumbItem, children: ReactNode) => ReactNode;
18
- className?: string;
19
- 'aria-label'?: string;
20
- }
21
-
22
- export function Breadcrumb({
23
- items,
24
- renderLink,
25
- className,
26
- 'aria-label': ariaLabel = 'Breadcrumb',
27
- }: BreadcrumbProps) {
28
- return (
29
- <nav aria-label={ariaLabel} className={[styles.nav, className].filter(Boolean).join(' ')}>
30
- <ol className={styles.list}>
31
- {items.map((item, index) => {
32
- const isLast = index === items.length - 1;
33
- return (
34
- <li key={item.label + index} className={styles.item}>
35
- {item.href ? (
36
- renderLink ? (
37
- renderLink(item, item.label)
38
- ) : (
39
- <a href={item.href} className={styles.link}>
40
- {item.label}
41
- </a>
42
- )
43
- ) : (
44
- <span className={styles.current} aria-current="page">
45
- {item.label}
46
- </span>
47
- )}
48
- {!isLast && (
49
- <Icon name="chevron-right" size="xs" aria-hidden className={styles.separator} />
50
- )}
51
- </li>
52
- );
53
- })}
54
- </ol>
55
- </nav>
56
- );
57
- }
@@ -1,52 +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 { Breadcrumb } from '../Breadcrumb';
5
-
6
- afterEach(cleanup);
7
-
8
- const items = [
9
- { label: 'Console', href: '/console' },
10
- { label: 'Plugins', href: '/console/plugins' },
11
- { label: 'sovereign-tasks' },
12
- ];
13
-
14
- describe('Breadcrumb', () => {
15
- it('renders a link for every item with an href', () => {
16
- render(<Breadcrumb items={items} />);
17
- expect(screen.getByRole('link', { name: 'Console' })).toHaveProperty(
18
- 'href',
19
- expect.stringContaining('/console'),
20
- );
21
- expect(screen.getByRole('link', { name: 'Plugins' })).toBeDefined();
22
- });
23
-
24
- it('renders the item without href as plain text with aria-current', () => {
25
- render(<Breadcrumb items={items} />);
26
- expect(screen.queryByRole('link', { name: 'sovereign-tasks' })).toBeNull();
27
- expect(screen.getByText('sovereign-tasks').getAttribute('aria-current')).toBe('page');
28
- });
29
-
30
- it('uses a caller-supplied renderLink instead of a plain <a> when given', () => {
31
- render(
32
- <Breadcrumb
33
- items={items}
34
- renderLink={(item, children) => (
35
- <button type="button" data-href={item.href}>
36
- {children}
37
- </button>
38
- )}
39
- />,
40
- );
41
- expect(screen.queryByRole('link', { name: 'Console' })).toBeNull();
42
- expect(screen.getByRole('button', { name: 'Console' })).toHaveProperty(
43
- 'dataset.href',
44
- '/console',
45
- );
46
- });
47
-
48
- it('defaults to an accessible nav label', () => {
49
- render(<Breadcrumb items={items} />);
50
- expect(screen.getByRole('navigation', { name: 'Breadcrumb' })).toBeDefined();
51
- });
52
- });
@@ -1,169 +0,0 @@
1
- .button {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- gap: var(--sv-space-2);
6
- border: var(--sv-border-width-hairline) solid transparent;
7
- border-radius: var(--sv-radius-md);
8
- font-family: var(--sv-font-family);
9
- font-weight: var(--sv-font-weight-medium);
10
- line-height: 1;
11
- cursor: pointer;
12
- /* Removes the ~300ms double-tap-to-zoom delay on touch — this is a tap
13
- target, never a pinch-zoom surface. */
14
- touch-action: manipulation;
15
- /* --sv-button-shadow defaults to `none` (semantic.css) — this box-shadow
16
- line is a no-op for every theme that doesn't set it (RFC 0094). */
17
- box-shadow: var(--sv-button-shadow);
18
- transition:
19
- background-color 0.15s ease,
20
- border-color 0.15s ease,
21
- color 0.15s ease,
22
- transform 0.1s ease,
23
- box-shadow 0.1s ease;
24
- }
25
-
26
- .button:focus-visible {
27
- outline: 2px solid var(--sv-color-focus-ring);
28
- outline-offset: 2px;
29
- }
30
-
31
- .button:disabled {
32
- opacity: 0.5;
33
- cursor: not-allowed;
34
- }
35
-
36
- /* --sv-button-press-x/-y default to 0 (semantic.css) — translate(0, 0) is a
37
- no-op, so this rule only produces a visible "press into shadow" effect
38
- for a theme preset that sets non-zero values (RFC 0094). Unguarded by
39
- (hover: hover) deliberately: :active press feedback is wanted on every
40
- input type, the same reasoning documented for Button's existing
41
- color-mix() :active background changes below. */
42
- .button:active:not(:disabled) {
43
- transform: translate(var(--sv-button-press-x), var(--sv-button-press-y));
44
- box-shadow: none;
45
- }
46
-
47
- /* Touch target: gated to (pointer: coarse) — the *primary* pointer, not
48
- (any-pointer: coarse) — so a touchscreen laptop with mouse/trackpad as
49
- primary keeps desktop density (see mobile design-system plan, Part 4 #5). */
50
- @media (pointer: coarse) {
51
- .button {
52
- min-height: var(--sv-touch-target-min, 44px);
53
- }
54
- }
55
-
56
- /* Sizes — 32px / 36px / 40px rendered height (font-size + padding*2 + border*2).
57
- Vertical padding is hardcoded where the --sv-space-* scale can't hit the
58
- exact target height; horizontal padding stays token-based, growing with
59
- size for visual rhythm with the rest of this scale. */
60
- .sm {
61
- padding: var(--sv-space-2) var(--sv-space-3);
62
- font-size: var(--sv-font-size-sm);
63
- }
64
-
65
- .md {
66
- padding: 10px var(--sv-space-4);
67
- font-size: var(--sv-font-size-sm);
68
- font-weight: var(--sv-font-weight-semibold);
69
- }
70
-
71
- .lg {
72
- padding: var(--sv-space-3) var(--sv-space-5);
73
- font-size: var(--sv-font-size-sm);
74
- font-weight: var(--sv-font-weight-semibold);
75
- }
76
-
77
- /* Loading spinner — a self-contained token-only spinner rather than reusing
78
- the Spinner component: Spinner's border colors are semantic-fixed
79
- (`--sv-color-accent`), which would be invisible against a primary button's
80
- accent background, and overriding a second CSS module's rule on the same
81
- element is a cross-module cascade-order gamble (see ConfirmDialog's
82
- `.destructiveConfirm` comment for the same tradeoff). `currentColor` picks
83
- up each variant's own text color for free. */
84
- .spinner {
85
- display: inline-block;
86
- width: var(--sv-icon-size-sm);
87
- height: var(--sv-icon-size-sm);
88
- flex-shrink: 0;
89
- border: 2px solid currentColor;
90
- border-top-color: transparent;
91
- border-radius: var(--sv-radius-full);
92
- opacity: 0.7;
93
- animation: button-spin 0.7s linear infinite;
94
- }
95
-
96
- @keyframes button-spin {
97
- to {
98
- transform: rotate(360deg);
99
- }
100
- }
101
-
102
- @media (prefers-reduced-motion: reduce) {
103
- .spinner {
104
- animation-play-state: paused;
105
- }
106
- }
107
-
108
- /* Variants */
109
- .primary {
110
- background-color: var(--sv-color-accent);
111
- color: var(--sv-color-text-on-accent);
112
- }
113
-
114
- @media (hover: hover) {
115
- .primary:hover:not(:disabled) {
116
- background-color: var(--sv-color-accent-hover);
117
- }
118
- }
119
-
120
- .primary:active:not(:disabled) {
121
- background-color: color-mix(in srgb, var(--sv-color-accent) 80%, black);
122
- }
123
-
124
- .secondary {
125
- background-color: var(--sv-color-surface);
126
- color: var(--sv-color-text-primary);
127
- border-color: var(--sv-color-border-strong);
128
- }
129
-
130
- @media (hover: hover) {
131
- .secondary:hover:not(:disabled) {
132
- background-color: var(--sv-color-surface-sunken);
133
- }
134
- }
135
-
136
- .secondary:active:not(:disabled) {
137
- background-color: color-mix(in srgb, var(--sv-color-surface-sunken) 85%, black);
138
- }
139
-
140
- .ghost {
141
- background-color: transparent;
142
- color: var(--sv-color-text-primary);
143
- }
144
-
145
- @media (hover: hover) {
146
- .ghost:hover:not(:disabled) {
147
- background-color: var(--sv-color-surface-sunken);
148
- }
149
- }
150
-
151
- .ghost:active:not(:disabled) {
152
- background-color: color-mix(in srgb, var(--sv-color-surface-sunken) 85%, black);
153
- }
154
-
155
- .destructive {
156
- background-color: transparent;
157
- color: var(--sv-color-error-text);
158
- border-color: var(--sv-color-error-border);
159
- }
160
-
161
- @media (hover: hover) {
162
- .destructive:hover:not(:disabled) {
163
- background-color: var(--sv-color-error-surface);
164
- }
165
- }
166
-
167
- .destructive:active:not(:disabled) {
168
- background-color: color-mix(in srgb, var(--sv-color-error-surface) 85%, black);
169
- }
@@ -1,83 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Icon } from '../Icon/Icon';
3
- import { Button } from './Button';
4
-
5
- const meta = {
6
- title: 'Components/Button',
7
- component: Button,
8
- parameters: {
9
- layout: 'centered',
10
- docs: {
11
- description: {
12
- component:
13
- 'The primitive interactive control. RSC-safe (no state, forwards props). All styling references `--sv-*` tokens; no hardcoded values.',
14
- },
15
- },
16
- },
17
- argTypes: {
18
- variant: { control: 'select', options: ['primary', 'secondary', 'ghost', 'destructive'] },
19
- size: { control: 'select', options: ['sm', 'md', 'lg'] },
20
- disabled: { control: 'boolean' },
21
- loading: { control: 'boolean' },
22
- children: { control: 'text' },
23
- },
24
- args: {
25
- children: 'Button',
26
- },
27
- } satisfies Meta<typeof Button>;
28
-
29
- export default meta;
30
- type Story = StoryObj<typeof meta>;
31
-
32
- // ---------------------------------------------------------------------------
33
-
34
- export const Primary: Story = { args: { variant: 'primary' } };
35
- export const Secondary: Story = { args: { variant: 'secondary' } };
36
- export const Ghost: Story = { args: { variant: 'ghost' } };
37
- export const Destructive: Story = { args: { variant: 'destructive', children: 'Delete account' } };
38
-
39
- export const Small: Story = { args: { size: 'sm' } };
40
- export const Medium: Story = { args: { size: 'md' } };
41
- export const Large: Story = { args: { size: 'lg' } };
42
-
43
- export const Disabled: Story = { args: { disabled: true } };
44
- export const DisabledSecondary: Story = { args: { variant: 'secondary', disabled: true } };
45
-
46
- export const Loading: Story = { args: { loading: true, children: 'Saving…' } };
47
- export const LoadingSecondary: Story = {
48
- args: { variant: 'secondary', loading: true, children: 'Saving…' },
49
- };
50
-
51
- export const WithLeadingIcon: Story = {
52
- args: {
53
- children: (
54
- <>
55
- <Icon name="plus" size="sm" aria-hidden />
56
- Add item
57
- </>
58
- ),
59
- },
60
- };
61
-
62
- export const IconOnly: Story = {
63
- args: {
64
- variant: 'ghost',
65
- 'aria-label': 'Settings',
66
- children: <Icon name="settings" size="sm" aria-hidden />,
67
- },
68
- };
69
-
70
- /** All variant × size combinations at a glance. */
71
- export const AllVariants: Story = {
72
- render: (_args) => (
73
- <div style={{ display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start' }}>
74
- {(['primary', 'secondary', 'ghost', 'destructive'] as const).map((v) =>
75
- (['lg', 'md', 'sm'] as const).map((s) => (
76
- <Button key={`${v}-${s}`} variant={v} size={s}>
77
- {v} / {s}
78
- </Button>
79
- )),
80
- )}
81
- </div>
82
- ),
83
- };
@@ -1,52 +0,0 @@
1
- import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
- import styles from './Button.module.css';
3
-
4
- export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';
5
- export type ButtonSize = 'sm' | 'md' | 'lg';
6
-
7
- export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
- variant?: ButtonVariant;
9
- size?: ButtonSize;
10
- /** Shows a spinner and disables the button while an async action is pending. */
11
- loading?: boolean;
12
- children: ReactNode;
13
- }
14
-
15
- /**
16
- * Button — the primitive interactive control. Presentational and RSC-safe: it
17
- * holds no state and simply forwards props to the underlying `<button>`, so it
18
- * renders in both Server and Client Components. All styling references `--sv-*`
19
- * tokens via CSS Modules; there are no hardcoded values.
20
- */
21
- export function Button({
22
- variant = 'primary',
23
- size = 'md',
24
- type = 'button',
25
- loading = false,
26
- disabled,
27
- className,
28
- children,
29
- ...rest
30
- }: ButtonProps) {
31
- const classes = [styles.button, styles[variant], styles[size], className]
32
- .filter(Boolean)
33
- .join(' ');
34
-
35
- return (
36
- <button
37
- type={type}
38
- className={classes}
39
- disabled={disabled || loading}
40
- aria-busy={loading || undefined}
41
- {...rest}
42
- >
43
- {loading && (
44
- // aria-hidden: the button's own accessible name (its visible children,
45
- // unchanged below) plus aria-busy already communicate the pending
46
- // state — an unhidden Spinner-style status region would double-narrate it.
47
- <span className={styles.spinner} aria-hidden="true" />
48
- )}
49
- {children}
50
- </button>
51
- );
52
- }
@@ -1,66 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, expect, it } from 'vitest';
3
- import { render, screen } from '@testing-library/react';
4
- import { Button } from '../Button';
5
-
6
- describe('Button', () => {
7
- it('renders its children', () => {
8
- render(<Button>Click me</Button>);
9
- expect(screen.getByRole('button', { name: 'Click me' })).toBeDefined();
10
- });
11
-
12
- it('applies the variant and size classes', () => {
13
- render(
14
- <Button variant="ghost" size="sm">
15
- Go
16
- </Button>,
17
- );
18
- const button = screen.getByRole('button', { name: 'Go' });
19
- expect(button.className).toContain('ghost');
20
- expect(button.className).toContain('sm');
21
- });
22
-
23
- it('applies the lg size class', () => {
24
- render(<Button size="lg">Upgrade</Button>);
25
- expect(screen.getByRole('button', { name: 'Upgrade' }).className).toContain('lg');
26
- });
27
-
28
- it('defaults to the md size class', () => {
29
- render(<Button>Confirm</Button>);
30
- expect(screen.getByRole('button', { name: 'Confirm' }).className).toContain('md');
31
- });
32
-
33
- it('defaults to type="button"', () => {
34
- render(<Button>Save</Button>);
35
- expect(screen.getByRole('button', { name: 'Save' }).getAttribute('type')).toBe('button');
36
- });
37
-
38
- it('forwards native button props', () => {
39
- render(<Button disabled>Nope</Button>);
40
- expect((screen.getByRole('button', { name: 'Nope' }) as HTMLButtonElement).disabled).toBe(true);
41
- });
42
-
43
- it('applies destructive variant class', () => {
44
- render(<Button variant="destructive">Delete</Button>);
45
- expect(screen.getByRole('button', { name: 'Delete' }).className).toContain('destructive');
46
- });
47
-
48
- it('disables the button and sets aria-busy when loading', () => {
49
- render(<Button loading>Submit</Button>);
50
- const button = screen.getByRole('button', { name: 'Submit' }) as HTMLButtonElement;
51
- expect(button.disabled).toBe(true);
52
- expect(button.getAttribute('aria-busy')).toBe('true');
53
- });
54
-
55
- it('does not set aria-busy when not loading', () => {
56
- render(<Button>Continue</Button>);
57
- expect(screen.getByRole('button', { name: 'Continue' }).getAttribute('aria-busy')).toBeNull();
58
- });
59
-
60
- it('respects an explicit disabled prop independent of loading', () => {
61
- render(<Button disabled>Archive</Button>);
62
- const button = screen.getByRole('button', { name: 'Archive' }) as HTMLButtonElement;
63
- expect(button.disabled).toBe(true);
64
- expect(button.getAttribute('aria-busy')).toBeNull();
65
- });
66
- });