@sovereignfs/ui 0.54.0 → 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 (473) hide show
  1. package/LICENSE +373 -661
  2. package/NOTICE +8 -0
  3. package/README.md +4 -6
  4. package/dist/Accordion.module.css +1 -1
  5. package/dist/Alert.module.css +1 -1
  6. package/dist/AppsLauncher.module.css +102 -0
  7. package/dist/Avatar.module.css +1 -1
  8. package/dist/Badge.module.css +30 -7
  9. package/dist/BalanceChip.module.css +1 -1
  10. package/dist/Button.module.css +23 -2
  11. package/dist/Card.module.css +7 -1
  12. package/dist/CardTile.module.css +187 -0
  13. package/dist/CheckableListRow.module.css +8 -0
  14. package/dist/Checkbox.module.css +8 -0
  15. package/dist/CodeTextarea.module.css +7 -1
  16. package/dist/Collapsible.module.css +1 -1
  17. package/dist/ColorPicker.module.css +138 -0
  18. package/dist/Combobox.module.css +8 -2
  19. package/dist/Command.module.css +7 -1
  20. package/dist/ConfirmDialog.module.css +8 -2
  21. package/dist/ConsentPrompt.module.css +21 -0
  22. package/dist/DatePicker.module.css +7 -1
  23. package/dist/Dialog.module.css +130 -21
  24. package/dist/DragHandleRow.module.css +6 -0
  25. package/dist/Drawer.module.css +36 -7
  26. package/dist/FileDropzone.module.css +25 -1
  27. package/dist/Header.module.css +68 -0
  28. package/dist/HeaderFooterLayout.module.css +21 -0
  29. package/dist/IconPicker.module.css +15 -5
  30. package/dist/Input.module.css +7 -1
  31. package/dist/Kbd.module.css +1 -1
  32. package/dist/LegalLinks.module.css +9 -2
  33. package/dist/Markdown.module.css +29 -0
  34. package/dist/Menu.module.css +1 -0
  35. package/dist/Message.module.css +10 -1
  36. package/dist/MessageScroller.module.css +12 -1
  37. package/dist/MobileAppsDrawer.module.css +19 -14
  38. package/dist/MobileFooter.module.css +7 -1
  39. package/dist/MobileHeader.module.css +14 -1
  40. package/dist/NavList.module.css +139 -0
  41. package/dist/NavTabs.module.css +8 -2
  42. package/dist/NotificationsPanel.module.css +268 -0
  43. package/dist/OverlayHeader.module.css +1 -1
  44. package/dist/PageContainer.module.css +62 -0
  45. package/dist/PageHeader.module.css +54 -0
  46. package/dist/PageLayout.module.css +51 -0
  47. package/dist/Popover.module.css +1 -1
  48. package/dist/QrCode.module.css +17 -0
  49. package/dist/QuantityStepper.module.css +5 -3
  50. package/dist/RadioGroup.module.css +6 -0
  51. package/dist/Resizable.module.css +3 -3
  52. package/dist/RootLayout.module.css +12 -0
  53. package/dist/SegmentedControl.module.css +7 -1
  54. package/dist/Select.module.css +7 -1
  55. package/dist/Sheet.module.css +20 -2
  56. package/dist/SplitPane.module.css +5 -5
  57. package/dist/StatusBadge.module.css +1 -1
  58. package/dist/StepStrip.module.css +55 -0
  59. package/dist/SuggestionInput.module.css +14 -3
  60. package/dist/SwipableMobileCarousel.module.css +12 -3
  61. package/dist/SwipableMobileCarouselDots.module.css +21 -0
  62. package/dist/SwipeStack.module.css +101 -0
  63. package/dist/SystemBanner.module.css +16 -0
  64. package/dist/Table.module.css +2 -2
  65. package/dist/Tabs.module.css +7 -1
  66. package/dist/TagInput.module.css +8 -2
  67. package/dist/Textarea.module.css +15 -1
  68. package/dist/ThreeColumnLayout.module.css +35 -0
  69. package/dist/Toast.module.css +67 -3
  70. package/dist/Toggle.module.css +7 -0
  71. package/dist/Tooltip.module.css +7 -1
  72. package/dist/UserMenu.module.css +95 -0
  73. package/dist/fonts/OFL.txt +93 -0
  74. package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
  75. package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
  76. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  77. package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
  78. package/dist/index.d.ts +1156 -76
  79. package/dist/index.js +4223 -1513
  80. package/dist/tokens/fonts.css +53 -0
  81. package/dist/tokens/primitives.css +23 -12
  82. package/dist/tokens/semantic.css +32 -0
  83. package/dist/tokens/theme-presets.css +33 -0
  84. package/dist/tokens.css +2 -1
  85. package/package.json +46 -19
  86. package/src/__tests__/motion.test.tsx +0 -105
  87. package/src/components/Accordion/Accordion.module.css +0 -3
  88. package/src/components/Accordion/Accordion.stories.tsx +0 -110
  89. package/src/components/Accordion/Accordion.tsx +0 -53
  90. package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
  91. package/src/components/Alert/Alert.module.css +0 -62
  92. package/src/components/Alert/Alert.stories.tsx +0 -96
  93. package/src/components/Alert/Alert.tsx +0 -58
  94. package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
  95. package/src/components/AspectRatio/AspectRatio.module.css +0 -15
  96. package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
  97. package/src/components/AspectRatio/AspectRatio.tsx +0 -21
  98. package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
  99. package/src/components/Avatar/Avatar.module.css +0 -38
  100. package/src/components/Avatar/Avatar.tsx +0 -42
  101. package/src/components/Badge/Badge.module.css +0 -154
  102. package/src/components/Badge/Badge.stories.tsx +0 -226
  103. package/src/components/Badge/Badge.tsx +0 -81
  104. package/src/components/Badge/__tests__/Badge.test.tsx +0 -88
  105. package/src/components/BalanceChip/BalanceChip.module.css +0 -32
  106. package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
  107. package/src/components/BalanceChip/BalanceChip.tsx +0 -33
  108. package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
  109. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
  110. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
  111. package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
  112. package/src/components/Button/Button.module.css +0 -153
  113. package/src/components/Button/Button.stories.tsx +0 -83
  114. package/src/components/Button/Button.tsx +0 -52
  115. package/src/components/Button/__tests__/Button.test.tsx +0 -66
  116. package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
  117. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
  118. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
  119. package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
  120. package/src/components/Calendar/Calendar.module.css +0 -126
  121. package/src/components/Calendar/Calendar.tsx +0 -213
  122. package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
  123. package/src/components/Calendar/dateUtils.ts +0 -97
  124. package/src/components/Card/Card.module.css +0 -42
  125. package/src/components/Card/Card.tsx +0 -34
  126. package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
  127. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
  128. package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
  129. package/src/components/Checkbox/Checkbox.module.css +0 -111
  130. package/src/components/Checkbox/Checkbox.tsx +0 -78
  131. package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
  132. package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
  133. package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
  134. package/src/components/Collapsible/Collapsible.module.css +0 -70
  135. package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
  136. package/src/components/Collapsible/Collapsible.tsx +0 -66
  137. package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
  138. package/src/components/Combobox/Combobox.module.css +0 -122
  139. package/src/components/Combobox/Combobox.stories.tsx +0 -79
  140. package/src/components/Combobox/Combobox.tsx +0 -186
  141. package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
  142. package/src/components/Command/Command.module.css +0 -80
  143. package/src/components/Command/Command.stories.tsx +0 -104
  144. package/src/components/Command/Command.tsx +0 -168
  145. package/src/components/Command/__tests__/Command.test.tsx +0 -162
  146. package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
  147. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -124
  148. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -146
  149. package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
  150. package/src/components/ContextMenu/ContextMenu.tsx +0 -100
  151. package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
  152. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
  153. package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
  154. package/src/components/DataTable/DataTable.module.css +0 -28
  155. package/src/components/DataTable/DataTable.stories.tsx +0 -74
  156. package/src/components/DataTable/DataTable.tsx +0 -154
  157. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
  158. package/src/components/DatePicker/DatePicker.module.css +0 -61
  159. package/src/components/DatePicker/DatePicker.tsx +0 -103
  160. package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
  161. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
  162. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
  163. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
  164. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
  165. package/src/components/Dialog/Dialog.module.css +0 -226
  166. package/src/components/Dialog/Dialog.stories.tsx +0 -147
  167. package/src/components/Dialog/Dialog.tsx +0 -160
  168. package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -137
  169. package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
  170. package/src/components/DragHandleRow/DragHandleRow.tsx +0 -61
  171. package/src/components/Drawer/Drawer.module.css +0 -92
  172. package/src/components/Drawer/Drawer.stories.tsx +0 -132
  173. package/src/components/Drawer/Drawer.tsx +0 -176
  174. package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -199
  175. package/src/components/EmptyState/EmptyState.module.css +0 -27
  176. package/src/components/EmptyState/EmptyState.tsx +0 -27
  177. package/src/components/FileDropzone/FileDropzone.module.css +0 -63
  178. package/src/components/FileDropzone/FileDropzone.tsx +0 -109
  179. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
  180. package/src/components/FormField/FormField.module.css +0 -33
  181. package/src/components/FormField/FormField.tsx +0 -78
  182. package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
  183. package/src/components/HoverCard/HoverCard.module.css +0 -3
  184. package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
  185. package/src/components/HoverCard/HoverCard.tsx +0 -111
  186. package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
  187. package/src/components/Icon/Icon.module.css +0 -27
  188. package/src/components/Icon/Icon.stories.tsx +0 -95
  189. package/src/components/Icon/Icon.tsx +0 -43
  190. package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
  191. package/src/components/Icon/icons/activity.tsx +0 -20
  192. package/src/components/Icon/icons/alert-triangle.tsx +0 -22
  193. package/src/components/Icon/icons/apple.tsx +0 -21
  194. package/src/components/Icon/icons/banana.tsx +0 -21
  195. package/src/components/Icon/icons/beef.tsx +0 -22
  196. package/src/components/Icon/icons/beer.tsx +0 -24
  197. package/src/components/Icon/icons/bell.tsx +0 -21
  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-x.tsx +0 -22
  208. package/src/components/Icon/icons/coffee.tsx +0 -23
  209. package/src/components/Icon/icons/cookie.tsx +0 -25
  210. package/src/components/Icon/icons/croissant.tsx +0 -24
  211. package/src/components/Icon/icons/cup-soda.tsx +0 -23
  212. package/src/components/Icon/icons/drumstick.tsx +0 -21
  213. package/src/components/Icon/icons/egg.tsx +0 -20
  214. package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
  215. package/src/components/Icon/icons/external-link.tsx +0 -22
  216. package/src/components/Icon/icons/eye-off.tsx +0 -23
  217. package/src/components/Icon/icons/eye.tsx +0 -21
  218. package/src/components/Icon/icons/file.tsx +0 -21
  219. package/src/components/Icon/icons/fish.tsx +0 -25
  220. package/src/components/Icon/icons/grid-2x2.tsx +0 -22
  221. package/src/components/Icon/icons/house.tsx +0 -21
  222. package/src/components/Icon/icons/index.ts +0 -234
  223. package/src/components/Icon/icons/info.tsx +0 -22
  224. package/src/components/Icon/icons/lock.tsx +0 -21
  225. package/src/components/Icon/icons/log-out.tsx +0 -22
  226. package/src/components/Icon/icons/mail.tsx +0 -21
  227. package/src/components/Icon/icons/menu.tsx +0 -22
  228. package/src/components/Icon/icons/milk.tsx +0 -22
  229. package/src/components/Icon/icons/package.tsx +0 -23
  230. package/src/components/Icon/icons/pencil.tsx +0 -21
  231. package/src/components/Icon/icons/pizza.tsx +0 -24
  232. package/src/components/Icon/icons/plus.tsx +0 -21
  233. package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
  234. package/src/components/Icon/icons/salad.tsx +0 -24
  235. package/src/components/Icon/icons/search.tsx +0 -21
  236. package/src/components/Icon/icons/settings.tsx +0 -21
  237. package/src/components/Icon/icons/shield.tsx +0 -20
  238. package/src/components/Icon/icons/shopping-basket.tsx +0 -26
  239. package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
  240. package/src/components/Icon/icons/smartphone.tsx +0 -21
  241. package/src/components/Icon/icons/snowflake.tsx +0 -31
  242. package/src/components/Icon/icons/spray-can.tsx +0 -29
  243. package/src/components/Icon/icons/trash-2.tsx +0 -24
  244. package/src/components/Icon/icons/upload.tsx +0 -22
  245. package/src/components/Icon/icons/user.tsx +0 -21
  246. package/src/components/Icon/icons/wine.tsx +0 -23
  247. package/src/components/Icon/icons/x.tsx +0 -21
  248. package/src/components/IconPicker/IconPicker.module.css +0 -63
  249. package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
  250. package/src/components/IconPicker/IconPicker.tsx +0 -90
  251. package/src/components/Input/Input.module.css +0 -52
  252. package/src/components/Input/Input.stories.tsx +0 -86
  253. package/src/components/Input/Input.tsx +0 -14
  254. package/src/components/Input/__tests__/Input.test.tsx +0 -22
  255. package/src/components/Item/Item.module.css +0 -70
  256. package/src/components/Item/Item.stories.tsx +0 -62
  257. package/src/components/Item/Item.tsx +0 -54
  258. package/src/components/Item/__tests__/Item.test.tsx +0 -39
  259. package/src/components/Kbd/Kbd.module.css +0 -14
  260. package/src/components/Kbd/Kbd.stories.tsx +0 -32
  261. package/src/components/Kbd/Kbd.tsx +0 -12
  262. package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
  263. package/src/components/Label/Label.module.css +0 -11
  264. package/src/components/Label/Label.stories.tsx +0 -40
  265. package/src/components/Label/Label.tsx +0 -24
  266. package/src/components/Label/__tests__/Label.test.tsx +0 -32
  267. package/src/components/LegalLinks/LegalLinks.module.css +0 -24
  268. package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
  269. package/src/components/LegalLinks/LegalLinks.tsx +0 -40
  270. package/src/components/Markdown/Markdown.module.css +0 -49
  271. package/src/components/Markdown/Markdown.stories.tsx +0 -30
  272. package/src/components/Markdown/Markdown.tsx +0 -168
  273. package/src/components/Marker/Marker.module.css +0 -33
  274. package/src/components/Marker/Marker.stories.tsx +0 -39
  275. package/src/components/Marker/Marker.tsx +0 -34
  276. package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
  277. package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
  278. package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
  279. package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
  280. package/src/components/Menu/Menu.module.css +0 -89
  281. package/src/components/Menu/Menu.tsx +0 -159
  282. package/src/components/Menu/__tests__/Menu.test.tsx +0 -197
  283. package/src/components/Menubar/Menubar.stories.tsx +0 -52
  284. package/src/components/Menubar/Menubar.tsx +0 -42
  285. package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
  286. package/src/components/Message/Message.module.css +0 -99
  287. package/src/components/Message/Message.stories.tsx +0 -79
  288. package/src/components/Message/Message.tsx +0 -41
  289. package/src/components/Message/__tests__/Message.test.tsx +0 -46
  290. package/src/components/MessageScroller/MessageScroller.module.css +0 -54
  291. package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
  292. package/src/components/MessageScroller/MessageScroller.tsx +0 -72
  293. package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
  294. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -81
  295. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
  296. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
  297. package/src/components/MobileFooter/MobileFooter.module.css +0 -73
  298. package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
  299. package/src/components/MobileFooter/MobileFooter.tsx +0 -109
  300. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -71
  301. package/src/components/MobileHeader/MobileHeader.module.css +0 -63
  302. package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
  303. package/src/components/MobileHeader/MobileHeader.tsx +0 -77
  304. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -58
  305. package/src/components/NavTabs/NavTabs.module.css +0 -50
  306. package/src/components/NavTabs/NavTabs.tsx +0 -61
  307. package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
  308. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
  309. package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
  310. package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
  311. package/src/components/OfflineGate/OfflineGate.tsx +0 -44
  312. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
  313. package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
  314. package/src/components/OverlayHeader/OverlayHeader.tsx +0 -62
  315. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -51
  316. package/src/components/PageContainer/PageContainer.module.css +0 -20
  317. package/src/components/PageContainer/PageContainer.tsx +0 -31
  318. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -37
  319. package/src/components/PageHeader/PageHeader.module.css +0 -32
  320. package/src/components/PageHeader/PageHeader.tsx +0 -35
  321. package/src/components/Pagination/Pagination.module.css +0 -98
  322. package/src/components/Pagination/Pagination.stories.tsx +0 -49
  323. package/src/components/Pagination/Pagination.tsx +0 -87
  324. package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
  325. package/src/components/Popover/Popover.module.css +0 -74
  326. package/src/components/Popover/Popover.stories.tsx +0 -357
  327. package/src/components/Popover/Popover.tsx +0 -208
  328. package/src/components/Popover/__tests__/Popover.test.tsx +0 -98
  329. package/src/components/Progress/Progress.module.css +0 -20
  330. package/src/components/Progress/Progress.stories.tsx +0 -40
  331. package/src/components/Progress/Progress.tsx +0 -35
  332. package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
  333. package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
  334. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
  335. package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
  336. package/src/components/RadioGroup/RadioGroup.module.css +0 -88
  337. package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
  338. package/src/components/RadioGroup/RadioGroup.tsx +0 -99
  339. package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
  340. package/src/components/Resizable/Resizable.module.css +0 -70
  341. package/src/components/Resizable/Resizable.stories.tsx +0 -82
  342. package/src/components/Resizable/Resizable.tsx +0 -313
  343. package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
  344. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
  345. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
  346. package/src/components/ScrollArea/ScrollArea.module.css +0 -20
  347. package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
  348. package/src/components/ScrollArea/ScrollArea.tsx +0 -27
  349. package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
  350. package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
  351. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
  352. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
  353. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
  354. package/src/components/Select/Select.module.css +0 -82
  355. package/src/components/Select/Select.stories.tsx +0 -115
  356. package/src/components/Select/Select.tsx +0 -48
  357. package/src/components/Select/__tests__/Select.test.tsx +0 -59
  358. package/src/components/Sheet/Sheet.module.css +0 -55
  359. package/src/components/Sheet/Sheet.tsx +0 -109
  360. package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
  361. package/src/components/Slider/Slider.module.css +0 -95
  362. package/src/components/Slider/Slider.stories.tsx +0 -64
  363. package/src/components/Slider/Slider.tsx +0 -77
  364. package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
  365. package/src/components/Spinner/Spinner.module.css +0 -39
  366. package/src/components/Spinner/Spinner.tsx +0 -23
  367. package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
  368. package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
  369. package/src/components/SplitPane/SplitPane.module.css +0 -85
  370. package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
  371. package/src/components/SplitPane/SplitPane.tsx +0 -149
  372. package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
  373. package/src/components/StatusBadge/StatusBadge.module.css +0 -59
  374. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
  375. package/src/components/StatusBadge/StatusBadge.tsx +0 -65
  376. package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
  377. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
  378. package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
  379. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -55
  380. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -227
  381. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
  382. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
  383. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
  384. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
  385. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
  386. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -133
  387. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
  388. package/src/components/SwipableMobileCarousel/context.ts +0 -13
  389. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -49
  390. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -62
  391. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
  392. package/src/components/SystemBanner/SystemBanner.module.css +0 -69
  393. package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
  394. package/src/components/SystemBanner/SystemBanner.tsx +0 -50
  395. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
  396. package/src/components/Table/Table.module.css +0 -45
  397. package/src/components/Table/Table.stories.tsx +0 -125
  398. package/src/components/Table/Table.tsx +0 -51
  399. package/src/components/Table/__tests__/Table.test.tsx +0 -50
  400. package/src/components/Tabs/Tabs.module.css +0 -56
  401. package/src/components/Tabs/Tabs.stories.tsx +0 -100
  402. package/src/components/Tabs/Tabs.tsx +0 -46
  403. package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
  404. package/src/components/TagInput/TagInput.module.css +0 -141
  405. package/src/components/TagInput/TagInput.stories.tsx +0 -109
  406. package/src/components/TagInput/TagInput.tsx +0 -174
  407. package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
  408. package/src/components/Textarea/Textarea.module.css +0 -39
  409. package/src/components/Textarea/Textarea.tsx +0 -15
  410. package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -29
  411. package/src/components/Toast/Toast.module.css +0 -132
  412. package/src/components/Toast/Toast.stories.tsx +0 -191
  413. package/src/components/Toast/Toast.tsx +0 -139
  414. package/src/components/Toggle/Toggle.module.css +0 -57
  415. package/src/components/Toggle/Toggle.stories.tsx +0 -95
  416. package/src/components/Toggle/Toggle.tsx +0 -39
  417. package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
  418. package/src/components/Tooltip/Tooltip.module.css +0 -56
  419. package/src/components/Tooltip/Tooltip.tsx +0 -30
  420. package/src/components/Typography/Typography.module.css +0 -47
  421. package/src/components/Typography/Typography.stories.tsx +0 -62
  422. package/src/components/Typography/Typography.tsx +0 -30
  423. package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
  424. package/src/css-modules.d.ts +0 -4
  425. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
  426. package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
  427. package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
  428. package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
  429. package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
  430. package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
  431. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
  432. package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -93
  433. package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
  434. package/src/hooks/index.ts +0 -24
  435. package/src/hooks/useCarouselRouteSync.ts +0 -92
  436. package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
  437. package/src/hooks/useDoubleTap.ts +0 -91
  438. package/src/hooks/useIsMobile.ts +0 -33
  439. package/src/hooks/useIsOffline.ts +0 -41
  440. package/src/hooks/useLongPress.ts +0 -185
  441. package/src/hooks/useOfflineTileState.ts +0 -45
  442. package/src/hooks/useResponsiveLayout.ts +0 -36
  443. package/src/hooks/useSnapCarousel.ts +0 -79
  444. package/src/hooks/useSwipeReveal.ts +0 -107
  445. package/src/index.ts +0 -251
  446. package/src/motion.ts +0 -78
  447. package/src/overlay-shell.ts +0 -94
  448. package/src/scroll-lock.ts +0 -22
  449. package/src/stories/Avatar.stories.tsx +0 -44
  450. package/src/stories/Card.stories.tsx +0 -35
  451. package/src/stories/Checkbox.stories.tsx +0 -45
  452. package/src/stories/DesignSystemOverview.stories.tsx +0 -3187
  453. package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
  454. package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
  455. package/src/stories/DragHandleRow.stories.tsx +0 -41
  456. package/src/stories/EmptyState.stories.tsx +0 -33
  457. package/src/stories/FileDropzone.stories.tsx +0 -69
  458. package/src/stories/FormField.stories.tsx +0 -47
  459. package/src/stories/InteractionHooks.stories.tsx +0 -925
  460. package/src/stories/MobilePatterns.stories.tsx +0 -1536
  461. package/src/stories/NavTabs.stories.tsx +0 -53
  462. package/src/stories/OfflineGate.stories.tsx +0 -42
  463. package/src/stories/PageContainer.stories.tsx +0 -37
  464. package/src/stories/PageHeader.stories.tsx +0 -42
  465. package/src/stories/ResponsiveSurface.stories.tsx +0 -47
  466. package/src/stories/Spinner.stories.tsx +0 -25
  467. package/src/stories/SwipableMobileCarousel.stories.tsx +0 -304
  468. package/src/stories/Textarea.stories.tsx +0 -51
  469. package/src/stories/TokenGallery.stories.tsx +0 -602
  470. package/src/stories/Tooltip.stories.tsx +0 -59
  471. package/src/tokens/primitives.css +0 -157
  472. package/src/tokens/semantic.css +0 -130
  473. package/src/tokens.css +0 -5
@@ -1,226 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Badge } from './Badge';
3
- import type { BadgeStatus } from './Badge';
4
-
5
- const meta = {
6
- title: 'Components/Badge',
7
- component: Badge,
8
- parameters: {
9
- layout: 'centered',
10
- docs: {
11
- description: {
12
- component:
13
- 'Compact label for roles (`role`), lifecycle states (`status`), and type/version tags (`mono`). Three sizes (`sm`/`md`/`lg`); ALL CAPS by default, or set `uppercase={false}` for title case. RSC-safe — no state.',
14
- },
15
- },
16
- },
17
- argTypes: {
18
- variant: { control: 'select', options: ['role', 'status', 'mono'] },
19
- size: { control: 'select', options: ['sm', 'md', 'lg'] },
20
- status: {
21
- control: 'select',
22
- options: ['active', 'enabled', 'deactivated', 'failed', 'invited', 'pending', 'neutral'],
23
- },
24
- uppercase: { control: 'boolean' },
25
- },
26
- args: { children: 'Badge' },
27
- } satisfies Meta<typeof Badge>;
28
-
29
- export default meta;
30
- type Story = StoryObj<typeof meta>;
31
-
32
- // ---------------------------------------------------------------------------
33
-
34
- export const Role: Story = { args: { variant: 'role', children: 'Owner' } };
35
- export const RoleAdmin: Story = { args: { variant: 'role', children: 'Admin' } };
36
- export const RoleUser: Story = { args: { variant: 'role', children: 'User' } };
37
- export const RoleAuditor: Story = { args: { variant: 'role', children: 'Auditor' } };
38
-
39
- export const StatusActive: Story = {
40
- args: { variant: 'status', status: 'active', children: 'Active' },
41
- };
42
- export const StatusDeactivated: Story = {
43
- args: { variant: 'status', status: 'deactivated', children: 'Deactivated' },
44
- };
45
- export const StatusInvited: Story = {
46
- args: { variant: 'status', status: 'invited', children: 'Invited' },
47
- };
48
- export const StatusFailed: Story = {
49
- args: { variant: 'status', status: 'failed', children: 'Failed' },
50
- };
51
- export const StatusPending: Story = {
52
- args: { variant: 'status', status: 'pending', children: 'Pending' },
53
- };
54
-
55
- export const MonoPlatform: Story = { args: { variant: 'mono', children: 'platform' } };
56
- export const MonoCommunity: Story = { args: { variant: 'mono', children: 'community' } };
57
- export const MonoVersion: Story = { args: { variant: 'mono', children: 'v0.1.0' } };
58
-
59
- /** sm / md (default) / lg side by side, across all three variants. */
60
- export const Sizes: Story = {
61
- render: () => {
62
- const rowStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', gap: 8 };
63
- const sectionStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8 };
64
- return (
65
- <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
66
- <div style={sectionStyle}>
67
- <div style={rowStyle}>
68
- <Badge variant="role" size="sm">
69
- Owner
70
- </Badge>
71
- <Badge variant="role" size="md">
72
- Owner
73
- </Badge>
74
- <Badge variant="role" size="lg">
75
- Owner
76
- </Badge>
77
- </div>
78
- <div style={rowStyle}>
79
- <Badge variant="status" status="active" size="sm">
80
- Active
81
- </Badge>
82
- <Badge variant="status" status="active" size="md">
83
- Active
84
- </Badge>
85
- <Badge variant="status" status="active" size="lg">
86
- Active
87
- </Badge>
88
- </div>
89
- <div style={rowStyle}>
90
- <Badge variant="mono" size="sm">
91
- v0.1.0
92
- </Badge>
93
- <Badge variant="mono" size="md">
94
- v0.1.0
95
- </Badge>
96
- <Badge variant="mono" size="lg">
97
- v0.1.0
98
- </Badge>
99
- </div>
100
- </div>
101
- </div>
102
- );
103
- },
104
- };
105
-
106
- /** uppercase (default) vs. title case — same text, `uppercase={false}` on the right. */
107
- export const TitleCase: Story = {
108
- render: () => {
109
- const rowStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', gap: 8 };
110
- return (
111
- <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
112
- <div style={rowStyle}>
113
- <Badge variant="role">Owner</Badge>
114
- <Badge variant="role" uppercase={false}>
115
- Owner
116
- </Badge>
117
- </div>
118
- <div style={rowStyle}>
119
- <Badge variant="status" status="active">
120
- Active
121
- </Badge>
122
- <Badge variant="status" status="active" uppercase={false}>
123
- Active
124
- </Badge>
125
- </div>
126
- <div style={rowStyle}>
127
- <Badge variant="mono">Serve Route</Badge>
128
- <Badge variant="mono" uppercase={false}>
129
- Serve Route
130
- </Badge>
131
- </div>
132
- </div>
133
- );
134
- },
135
- };
136
-
137
- /** All variants and statuses at a glance. */
138
- export const AllVariants: Story = {
139
- render: (_args) => {
140
- const roleLabels = ['Owner', 'Admin', 'User', 'Auditor'];
141
- const statuses: { status: BadgeStatus; label: string }[] = [
142
- { status: 'active', label: 'Active' },
143
- { status: 'enabled', label: 'Enabled' },
144
- { status: 'deactivated', label: 'Deactivated' },
145
- { status: 'failed', label: 'Failed' },
146
- { status: 'invited', label: 'Invited' },
147
- { status: 'pending', label: 'Pending' },
148
- { status: 'neutral', label: 'Neutral' },
149
- ];
150
- const monoLabels = ['platform', 'community', 'serve-route', 'v0.1.0', 'admin-only'];
151
-
152
- const groupStyle: React.CSSProperties = { display: 'flex', flexWrap: 'wrap', gap: 8 };
153
- const sectionStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8 };
154
- const headingStyle: React.CSSProperties = {
155
- fontSize: 11,
156
- fontWeight: 600,
157
- letterSpacing: '0.05em',
158
- textTransform: 'uppercase',
159
- color: 'var(--sv-color-text-muted)',
160
- fontFamily: 'var(--sv-font-family)',
161
- };
162
-
163
- return (
164
- <div style={{ display: 'flex', flexDirection: 'column', gap: 24, padding: 16 }}>
165
- <div style={sectionStyle}>
166
- <span style={headingStyle}>Role</span>
167
- <div style={groupStyle}>
168
- {roleLabels.map((l) => (
169
- <Badge key={l} variant="role">
170
- {l}
171
- </Badge>
172
- ))}
173
- </div>
174
- </div>
175
- <div style={sectionStyle}>
176
- <span style={headingStyle}>Status</span>
177
- <div style={groupStyle}>
178
- {statuses.map(({ status, label }) => (
179
- <Badge key={status} variant="status" status={status}>
180
- {label}
181
- </Badge>
182
- ))}
183
- </div>
184
- </div>
185
- <div style={sectionStyle}>
186
- <span style={headingStyle}>Mono</span>
187
- <div style={groupStyle}>
188
- {monoLabels.map((l) => (
189
- <Badge key={l} variant="mono">
190
- {l}
191
- </Badge>
192
- ))}
193
- </div>
194
- </div>
195
- <div style={sectionStyle}>
196
- <span style={headingStyle}>Sizes (sm / md / lg)</span>
197
- <div style={{ ...groupStyle, alignItems: 'center' }}>
198
- <Badge variant="role" size="sm">
199
- Owner
200
- </Badge>
201
- <Badge variant="role" size="md">
202
- Owner
203
- </Badge>
204
- <Badge variant="role" size="lg">
205
- Owner
206
- </Badge>
207
- </div>
208
- </div>
209
- <div style={sectionStyle}>
210
- <span style={headingStyle}>Title case (uppercase=false)</span>
211
- <div style={{ ...groupStyle, alignItems: 'center' }}>
212
- <Badge variant="role" uppercase={false}>
213
- Owner
214
- </Badge>
215
- <Badge variant="status" status="active" uppercase={false}>
216
- Active
217
- </Badge>
218
- <Badge variant="mono" uppercase={false}>
219
- Serve Route
220
- </Badge>
221
- </div>
222
- </div>
223
- </div>
224
- );
225
- },
226
- };
@@ -1,81 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './Badge.module.css';
3
-
4
- export type BadgeVariant = 'role' | 'status' | 'mono';
5
- export type BadgeSize = 'sm' | 'md' | 'lg';
6
- export type BadgeStatus =
7
- 'active' | 'enabled' | 'deactivated' | 'failed' | 'invited' | 'pending' | 'neutral';
8
-
9
- export interface BadgeProps {
10
- variant?: BadgeVariant;
11
- /** 'sm' | 'md' (default) | 'lg'. 'md' is the badge's original — and until
12
- * now, only — size, so the default renders unchanged. */
13
- size?: BadgeSize;
14
- /** Only relevant when variant="status" — determines the dot colour. */
15
- status?: BadgeStatus;
16
- /** Forces ALL CAPS display regardless of the case `children` is passed
17
- * in. Defaults to `true` — every existing badge in the app relies on
18
- * this. Set `false` for a title-case badge that renders exactly the text
19
- * passed in (e.g. "Owner" instead of "OWNER"). */
20
- uppercase?: boolean;
21
- children: ReactNode;
22
- }
23
-
24
- const STATUS_DOT_CLASS: Record<BadgeStatus, string> = {
25
- active: styles.dotGreen as string,
26
- enabled: styles.dotGreen as string,
27
- deactivated: styles.dotRed as string,
28
- failed: styles.dotRed as string,
29
- invited: styles.dotAmber as string,
30
- pending: styles.dotAmber as string,
31
- neutral: styles.dotGrey as string,
32
- };
33
-
34
- const STATUS_CHIP_CLASS: Record<BadgeStatus, string> = {
35
- active: styles.chipGreen as string,
36
- enabled: styles.chipGreen as string,
37
- deactivated: styles.chipRed as string,
38
- failed: styles.chipRed as string,
39
- invited: styles.chipAmber as string,
40
- pending: styles.chipAmber as string,
41
- neutral: styles.chipNeutral as string,
42
- };
43
-
44
- /**
45
- * Badge — compact label for roles, lifecycle states, and type/version tags.
46
- *
47
- * - `role` neutral surface + border, semibold — for Owner / Admin / User
48
- * - `status` tinted chip with leading colour dot — for Active / Deactivated / etc.
49
- * - `mono` monospace font, neutral surface — for platform / community / v0.1.0
50
- *
51
- * Three sizes (`sm`/`md`/`lg`, default `md`). ALL CAPS by default
52
- * (`uppercase`) — set `uppercase={false}` for a title-case badge instead.
53
- */
54
- export function Badge({
55
- variant = 'role',
56
- size = 'md',
57
- status = 'neutral',
58
- uppercase = true,
59
- children,
60
- }: BadgeProps) {
61
- const isStatus = variant === 'status';
62
- const dotClass = isStatus ? STATUS_DOT_CLASS[status] : undefined;
63
- const chipClass = isStatus ? STATUS_CHIP_CLASS[status] : undefined;
64
-
65
- return (
66
- <span
67
- className={[
68
- styles.badge,
69
- styles[variant],
70
- styles[size],
71
- chipClass,
72
- uppercase && styles.uppercase,
73
- ]
74
- .filter(Boolean)
75
- .join(' ')}
76
- >
77
- {isStatus && <span className={[styles.dot, dotClass].join(' ')} aria-hidden />}
78
- {children}
79
- </span>
80
- );
81
- }
@@ -1,88 +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 { Badge } from '../Badge';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('Badge', () => {
9
- it('renders its children', () => {
10
- render(<Badge>Owner</Badge>);
11
- expect(screen.getByText('Owner')).toBeDefined();
12
- });
13
-
14
- it('defaults to role variant', () => {
15
- render(<Badge>Admin</Badge>);
16
- expect(screen.getByText('Admin').closest('span')?.className).toContain('role');
17
- });
18
-
19
- it('applies mono variant class', () => {
20
- render(<Badge variant="mono">platform</Badge>);
21
- expect(screen.getByText('platform').closest('span')?.className).toContain('mono');
22
- });
23
-
24
- it('renders status variant with a dot element', () => {
25
- const { container } = render(
26
- <Badge variant="status" status="active">
27
- Active
28
- </Badge>,
29
- );
30
- const dots = container.querySelectorAll('[aria-hidden]');
31
- expect(dots.length).toBe(1);
32
- expect(dots.item(0).className).toContain('dotGreen');
33
- });
34
-
35
- it('uses red dot for deactivated status', () => {
36
- const { container } = render(
37
- <Badge variant="status" status="deactivated">
38
- Deactivated
39
- </Badge>,
40
- );
41
- expect(container.querySelector('[aria-hidden]')?.className).toContain('dotRed');
42
- });
43
-
44
- it('uses amber dot for invited status', () => {
45
- const { container } = render(
46
- <Badge variant="status" status="invited">
47
- Invited
48
- </Badge>,
49
- );
50
- expect(container.querySelector('[aria-hidden]')?.className).toContain('dotAmber');
51
- });
52
-
53
- it('uses grey dot for neutral status', () => {
54
- const { container } = render(
55
- <Badge variant="status" status="neutral">
56
- Neutral
57
- </Badge>,
58
- );
59
- expect(container.querySelector('[aria-hidden]')?.className).toContain('dotGrey');
60
- });
61
-
62
- it('does not render a dot for role variant', () => {
63
- const { container } = render(<Badge variant="role">Owner</Badge>);
64
- expect(container.querySelectorAll('[aria-hidden]').length).toBe(0);
65
- });
66
-
67
- it('defaults to md size', () => {
68
- render(<Badge>Admin</Badge>);
69
- expect(screen.getByText('Admin').closest('span')?.className).toContain('md');
70
- });
71
-
72
- it('applies sm and lg size classes', () => {
73
- const { rerender } = render(<Badge size="sm">Admin</Badge>);
74
- expect(screen.getByText('Admin').closest('span')?.className).toContain('sm');
75
- rerender(<Badge size="lg">Admin</Badge>);
76
- expect(screen.getByText('Admin').closest('span')?.className).toContain('lg');
77
- });
78
-
79
- it('defaults to uppercase display', () => {
80
- render(<Badge>Owner</Badge>);
81
- expect(screen.getByText('Owner').closest('span')?.className).toContain('uppercase');
82
- });
83
-
84
- it('omits the uppercase class when uppercase is false', () => {
85
- render(<Badge uppercase={false}>Owner</Badge>);
86
- expect(screen.getByText('Owner').closest('span')?.className).not.toContain('uppercase');
87
- });
88
- });
@@ -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: 1px 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
- }