@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,27 +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 { AspectRatio } from '../AspectRatio';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('AspectRatio', () => {
9
- it('applies the ratio as inline CSS aspect-ratio', () => {
10
- render(
11
- <AspectRatio ratio={16 / 9}>
12
- <img src="/x.png" alt="Preview" />
13
- </AspectRatio>,
14
- );
15
- const root = screen.getByRole('img').parentElement;
16
- expect(root?.style.aspectRatio).toContain(String(16 / 9));
17
- });
18
-
19
- it('renders children', () => {
20
- render(
21
- <AspectRatio ratio={1}>
22
- <div>content</div>
23
- </AspectRatio>,
24
- );
25
- expect(screen.getByText('content')).toBeDefined();
26
- });
27
- });
@@ -1,38 +0,0 @@
1
- .avatar {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- border-radius: 50%;
6
- background: var(--sv-color-surface-raised);
7
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
8
- overflow: hidden;
9
- flex-shrink: 0;
10
- font-weight: var(--sv-font-weight-medium);
11
- color: var(--sv-color-text-primary);
12
- font-family: var(--sv-font-family);
13
- }
14
-
15
- .sm {
16
- width: 24px;
17
- height: 24px;
18
- font-size: var(--sv-font-size-label);
19
- }
20
-
21
- .md {
22
- width: 32px;
23
- height: 32px;
24
- font-size: var(--sv-font-size-xs);
25
- }
26
-
27
- .lg {
28
- width: 40px;
29
- height: 40px;
30
- font-size: var(--sv-font-size-sm);
31
- }
32
-
33
- .img {
34
- width: 100%;
35
- height: 100%;
36
- object-fit: cover;
37
- display: block;
38
- }
@@ -1,42 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import styles from './Avatar.module.css';
5
-
6
- export interface AvatarProps {
7
- name: string;
8
- src?: string;
9
- size?: 'sm' | 'md' | 'lg';
10
- className?: string;
11
- }
12
-
13
- function initials(name: string): string {
14
- const parts = name.trim().split(/\s+/);
15
- if (parts.length === 1) return (parts[0] ?? '').slice(0, 2).toUpperCase();
16
- return ((parts[0]?.[0] ?? '') + (parts[parts.length - 1]?.[0] ?? '')).toUpperCase();
17
- }
18
-
19
- const sizeClass: Record<NonNullable<AvatarProps['size']>, string> = {
20
- sm: styles.sm as string,
21
- md: styles.md as string,
22
- lg: styles.lg as string,
23
- };
24
-
25
- export function Avatar({ name, src, size = 'md', className }: AvatarProps) {
26
- const [imgFailed, setImgFailed] = useState(false);
27
- const cls = [styles.avatar, sizeClass[size], className].filter(Boolean).join(' ');
28
-
29
- if (src && !imgFailed) {
30
- return (
31
- <span className={cls} aria-label={name}>
32
- <img src={src} alt={name} className={styles.img} onError={() => setImgFailed(true)} />
33
- </span>
34
- );
35
- }
36
-
37
- return (
38
- <span className={cls} aria-label={name}>
39
- {initials(name)}
40
- </span>
41
- );
42
- }
@@ -1,177 +0,0 @@
1
- .badge {
2
- display: inline-flex;
3
- align-items: center;
4
- gap: var(--sv-space-1);
5
- border-radius: var(--sv-radius-sm);
6
- font-family: var(--sv-font-family);
7
- line-height: 1;
8
- white-space: nowrap;
9
- user-select: none;
10
- }
11
-
12
- /* Applied by default (uppercase=true) — opt out for a title-case badge that
13
- renders children exactly as passed in. */
14
- .uppercase {
15
- text-transform: uppercase;
16
- letter-spacing: 0.05em;
17
- }
18
-
19
- /* role — neutral fill, border */
20
- .role {
21
- background: var(--sv-color-surface-sunken);
22
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
23
- color: var(--sv-color-text-primary);
24
- font-weight: var(--sv-font-weight-semibold);
25
- }
26
-
27
- /* status — tinted chip with leading colour dot; colour set by chip* classes below */
28
- .status {
29
- font-weight: var(--sv-font-weight-medium);
30
- }
31
-
32
- .chipGreen {
33
- background: var(--sv-color-success-surface);
34
- border: var(--sv-border-width-hairline) solid var(--sv-color-success-border);
35
- color: var(--sv-color-success-text);
36
- }
37
-
38
- .chipAmber {
39
- background: var(--sv-color-warning-surface);
40
- border: var(--sv-border-width-hairline) solid var(--sv-color-warning-border);
41
- color: var(--sv-color-warning-text);
42
- }
43
-
44
- .chipRed {
45
- background: var(--sv-color-error-surface);
46
- border: var(--sv-border-width-hairline) solid var(--sv-color-error-border);
47
- color: var(--sv-color-error-text);
48
- }
49
-
50
- .chipNeutral {
51
- background: var(--sv-color-surface-sunken);
52
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
53
- color: var(--sv-color-text-muted);
54
- }
55
-
56
- /* mono — monospace font, neutral surface, for type tags / versions */
57
- .mono {
58
- background: var(--sv-color-surface-sunken);
59
- border: var(--sv-border-width-hairline) solid var(--sv-color-border);
60
- color: var(--sv-color-text-muted);
61
- font-family: var(--sv-font-family-mono);
62
- }
63
-
64
- /* Size × variant — font-size and padding are the two axes that change
65
- together, so each combination is one compound rule rather than two
66
- composed partials fighting over the same properties. `.role.md`,
67
- `.status.md`, and `.mono.md` reproduce the badge's original (and, until
68
- now, only) sizing exactly, so the default (no `size` prop) renders
69
- pixel-identical to before this scale existed. `xs` was added later, for a
70
- badge sitting inline next to larger text where `sm` (already the smallest
71
- type-scale token, `--sv-font-size-label`) still read oversized — it needed
72
- a new, smaller primitive (`--sv-font-size-2xs`) rather than reusing one. */
73
- .role.xs {
74
- padding: 1px 3px;
75
- font-size: var(--sv-font-size-2xs);
76
- }
77
-
78
- .role.sm {
79
- padding: 1px var(--sv-space-1);
80
- font-size: var(--sv-font-size-label);
81
- }
82
-
83
- .role.md {
84
- padding: 2px var(--sv-space-2);
85
- font-size: var(--sv-font-size-label);
86
- }
87
-
88
- .role.lg {
89
- padding: 3px var(--sv-space-3);
90
- font-size: var(--sv-font-size-sm);
91
- }
92
-
93
- .mono.xs {
94
- padding: 1px 3px;
95
- font-size: var(--sv-font-size-2xs);
96
- }
97
-
98
- .mono.sm {
99
- padding: 1px var(--sv-space-1);
100
- font-size: var(--sv-font-size-label);
101
- }
102
-
103
- .mono.md {
104
- padding: 2px var(--sv-space-2);
105
- font-size: var(--sv-font-size-xs);
106
- }
107
-
108
- .mono.lg {
109
- padding: 3px var(--sv-space-3);
110
- font-size: var(--sv-font-size-sm);
111
- }
112
-
113
- /* status keeps a tighter left edge than right at every size — the dot +
114
- gap already read as space before the text, so a full padding-inline-start
115
- would double it up. */
116
- .status.xs {
117
- padding: 1px 3px 1px 2px;
118
- font-size: var(--sv-font-size-2xs);
119
- }
120
-
121
- .status.sm {
122
- padding: 1px var(--sv-space-1) 1px 3px;
123
- font-size: var(--sv-font-size-label);
124
- }
125
-
126
- .status.md {
127
- padding: 2px var(--sv-space-2) 2px var(--sv-space-1);
128
- font-size: var(--sv-font-size-xs);
129
- }
130
-
131
- .status.lg {
132
- padding: 3px var(--sv-space-3) 3px var(--sv-space-2);
133
- font-size: var(--sv-font-size-sm);
134
- }
135
-
136
- /* Status dot — scales with size */
137
- .dot {
138
- display: inline-block;
139
- border-radius: var(--sv-radius-full);
140
- flex-shrink: 0;
141
- }
142
-
143
- .xs .dot {
144
- width: 4px;
145
- height: 4px;
146
- }
147
-
148
- .sm .dot {
149
- width: 5px;
150
- height: 5px;
151
- }
152
-
153
- .md .dot {
154
- width: 6px;
155
- height: 6px;
156
- }
157
-
158
- .lg .dot {
159
- width: 8px;
160
- height: 8px;
161
- }
162
-
163
- .dotGreen {
164
- background: var(--sv-color-success-text);
165
- }
166
-
167
- .dotRed {
168
- background: var(--sv-color-error-text);
169
- }
170
-
171
- .dotAmber {
172
- background: var(--sv-color-warning-text);
173
- }
174
-
175
- .dotGrey {
176
- background: var(--sv-color-text-muted);
177
- }
@@ -1,238 +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`). Four sizes (`xs`/`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: ['xs', '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
- /** xs / 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="xs">
69
- Owner
70
- </Badge>
71
- <Badge variant="role" size="sm">
72
- Owner
73
- </Badge>
74
- <Badge variant="role" size="md">
75
- Owner
76
- </Badge>
77
- <Badge variant="role" size="lg">
78
- Owner
79
- </Badge>
80
- </div>
81
- <div style={rowStyle}>
82
- <Badge variant="status" status="active" size="xs">
83
- Active
84
- </Badge>
85
- <Badge variant="status" status="active" size="sm">
86
- Active
87
- </Badge>
88
- <Badge variant="status" status="active" size="md">
89
- Active
90
- </Badge>
91
- <Badge variant="status" status="active" size="lg">
92
- Active
93
- </Badge>
94
- </div>
95
- <div style={rowStyle}>
96
- <Badge variant="mono" size="xs">
97
- v0.1.0
98
- </Badge>
99
- <Badge variant="mono" size="sm">
100
- v0.1.0
101
- </Badge>
102
- <Badge variant="mono" size="md">
103
- v0.1.0
104
- </Badge>
105
- <Badge variant="mono" size="lg">
106
- v0.1.0
107
- </Badge>
108
- </div>
109
- </div>
110
- </div>
111
- );
112
- },
113
- };
114
-
115
- /** uppercase (default) vs. title case — same text, `uppercase={false}` on the right. */
116
- export const TitleCase: Story = {
117
- render: () => {
118
- const rowStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', gap: 8 };
119
- return (
120
- <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
121
- <div style={rowStyle}>
122
- <Badge variant="role">Owner</Badge>
123
- <Badge variant="role" uppercase={false}>
124
- Owner
125
- </Badge>
126
- </div>
127
- <div style={rowStyle}>
128
- <Badge variant="status" status="active">
129
- Active
130
- </Badge>
131
- <Badge variant="status" status="active" uppercase={false}>
132
- Active
133
- </Badge>
134
- </div>
135
- <div style={rowStyle}>
136
- <Badge variant="mono">Serve Route</Badge>
137
- <Badge variant="mono" uppercase={false}>
138
- Serve Route
139
- </Badge>
140
- </div>
141
- </div>
142
- );
143
- },
144
- };
145
-
146
- /** All variants and statuses at a glance. */
147
- export const AllVariants: Story = {
148
- render: (_args) => {
149
- const roleLabels = ['Owner', 'Admin', 'User', 'Auditor'];
150
- const statuses: { status: BadgeStatus; label: string }[] = [
151
- { status: 'active', label: 'Active' },
152
- { status: 'enabled', label: 'Enabled' },
153
- { status: 'deactivated', label: 'Deactivated' },
154
- { status: 'failed', label: 'Failed' },
155
- { status: 'invited', label: 'Invited' },
156
- { status: 'pending', label: 'Pending' },
157
- { status: 'neutral', label: 'Neutral' },
158
- ];
159
- const monoLabels = ['platform', 'community', 'serve-route', 'v0.1.0', 'admin-only'];
160
-
161
- const groupStyle: React.CSSProperties = { display: 'flex', flexWrap: 'wrap', gap: 8 };
162
- const sectionStyle: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 8 };
163
- const headingStyle: React.CSSProperties = {
164
- fontSize: 11,
165
- fontWeight: 600,
166
- letterSpacing: '0.05em',
167
- textTransform: 'uppercase',
168
- color: 'var(--sv-color-text-muted)',
169
- fontFamily: 'var(--sv-font-family)',
170
- };
171
-
172
- return (
173
- <div style={{ display: 'flex', flexDirection: 'column', gap: 24, padding: 16 }}>
174
- <div style={sectionStyle}>
175
- <span style={headingStyle}>Role</span>
176
- <div style={groupStyle}>
177
- {roleLabels.map((l) => (
178
- <Badge key={l} variant="role">
179
- {l}
180
- </Badge>
181
- ))}
182
- </div>
183
- </div>
184
- <div style={sectionStyle}>
185
- <span style={headingStyle}>Status</span>
186
- <div style={groupStyle}>
187
- {statuses.map(({ status, label }) => (
188
- <Badge key={status} variant="status" status={status}>
189
- {label}
190
- </Badge>
191
- ))}
192
- </div>
193
- </div>
194
- <div style={sectionStyle}>
195
- <span style={headingStyle}>Mono</span>
196
- <div style={groupStyle}>
197
- {monoLabels.map((l) => (
198
- <Badge key={l} variant="mono">
199
- {l}
200
- </Badge>
201
- ))}
202
- </div>
203
- </div>
204
- <div style={sectionStyle}>
205
- <span style={headingStyle}>Sizes (xs / sm / md / lg)</span>
206
- <div style={{ ...groupStyle, alignItems: 'center' }}>
207
- <Badge variant="role" size="xs">
208
- Owner
209
- </Badge>
210
- <Badge variant="role" size="sm">
211
- Owner
212
- </Badge>
213
- <Badge variant="role" size="md">
214
- Owner
215
- </Badge>
216
- <Badge variant="role" size="lg">
217
- Owner
218
- </Badge>
219
- </div>
220
- </div>
221
- <div style={sectionStyle}>
222
- <span style={headingStyle}>Title case (uppercase=false)</span>
223
- <div style={{ ...groupStyle, alignItems: 'center' }}>
224
- <Badge variant="role" uppercase={false}>
225
- Owner
226
- </Badge>
227
- <Badge variant="status" status="active" uppercase={false}>
228
- Active
229
- </Badge>
230
- <Badge variant="mono" uppercase={false}>
231
- Serve Route
232
- </Badge>
233
- </div>
234
- </div>
235
- </div>
236
- );
237
- },
238
- };
@@ -1,84 +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 = 'xs' | 'sm' | 'md' | 'lg';
6
- export type BadgeStatus =
7
- 'active' | 'enabled' | 'deactivated' | 'failed' | 'invited' | 'pending' | 'neutral';
8
-
9
- export interface BadgeProps {
10
- variant?: BadgeVariant;
11
- /** 'xs' | 'sm' | 'md' (default) | 'lg'. 'md' is the badge's original — and
12
- * until now, only — size, so the default renders unchanged. 'xs' is the
13
- * smallest tier (`--sv-font-size-2xs`, 10px) — for a badge sitting inline
14
- * next to larger text (e.g. a status chip beside a card's headline value)
15
- * where even 'sm' still reads oversized next to it. */
16
- size?: BadgeSize;
17
- /** Only relevant when variant="status" — determines the dot colour. */
18
- status?: BadgeStatus;
19
- /** Forces ALL CAPS display regardless of the case `children` is passed
20
- * in. Defaults to `true` — every existing badge in the app relies on
21
- * this. Set `false` for a title-case badge that renders exactly the text
22
- * passed in (e.g. "Owner" instead of "OWNER"). */
23
- uppercase?: boolean;
24
- children: ReactNode;
25
- }
26
-
27
- const STATUS_DOT_CLASS: Record<BadgeStatus, string> = {
28
- active: styles.dotGreen as string,
29
- enabled: styles.dotGreen as string,
30
- deactivated: styles.dotRed as string,
31
- failed: styles.dotRed as string,
32
- invited: styles.dotAmber as string,
33
- pending: styles.dotAmber as string,
34
- neutral: styles.dotGrey as string,
35
- };
36
-
37
- const STATUS_CHIP_CLASS: Record<BadgeStatus, string> = {
38
- active: styles.chipGreen as string,
39
- enabled: styles.chipGreen as string,
40
- deactivated: styles.chipRed as string,
41
- failed: styles.chipRed as string,
42
- invited: styles.chipAmber as string,
43
- pending: styles.chipAmber as string,
44
- neutral: styles.chipNeutral as string,
45
- };
46
-
47
- /**
48
- * Badge — compact label for roles, lifecycle states, and type/version tags.
49
- *
50
- * - `role` neutral surface + border, semibold — for Owner / Admin / User
51
- * - `status` tinted chip with leading colour dot — for Active / Deactivated / etc.
52
- * - `mono` monospace font, neutral surface — for platform / community / v0.1.0
53
- *
54
- * Four sizes (`xs`/`sm`/`md`/`lg`, default `md`). ALL CAPS by default
55
- * (`uppercase`) — set `uppercase={false}` for a title-case badge instead.
56
- */
57
- export function Badge({
58
- variant = 'role',
59
- size = 'md',
60
- status = 'neutral',
61
- uppercase = true,
62
- children,
63
- }: BadgeProps) {
64
- const isStatus = variant === 'status';
65
- const dotClass = isStatus ? STATUS_DOT_CLASS[status] : undefined;
66
- const chipClass = isStatus ? STATUS_CHIP_CLASS[status] : undefined;
67
-
68
- return (
69
- <span
70
- className={[
71
- styles.badge,
72
- styles[variant],
73
- styles[size],
74
- chipClass,
75
- uppercase && styles.uppercase,
76
- ]
77
- .filter(Boolean)
78
- .join(' ')}
79
- >
80
- {isStatus && <span className={[styles.dot, dotClass].join(' ')} aria-hidden />}
81
- {children}
82
- </span>
83
- );
84
- }
@@ -1,90 +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 xs, sm, and lg size classes', () => {
73
- const { rerender } = render(<Badge size="xs">Admin</Badge>);
74
- expect(screen.getByText('Admin').closest('span')?.className).toContain('xs');
75
- rerender(<Badge size="sm">Admin</Badge>);
76
- expect(screen.getByText('Admin').closest('span')?.className).toContain('sm');
77
- rerender(<Badge size="lg">Admin</Badge>);
78
- expect(screen.getByText('Admin').closest('span')?.className).toContain('lg');
79
- });
80
-
81
- it('defaults to uppercase display', () => {
82
- render(<Badge>Owner</Badge>);
83
- expect(screen.getByText('Owner').closest('span')?.className).toContain('uppercase');
84
- });
85
-
86
- it('omits the uppercase class when uppercase is false', () => {
87
- render(<Badge uppercase={false}>Owner</Badge>);
88
- expect(screen.getByText('Owner').closest('span')?.className).not.toContain('uppercase');
89
- });
90
- });