@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,62 +0,0 @@
1
- .alert {
2
- display: flex;
3
- align-items: flex-start;
4
- gap: var(--sv-space-2);
5
- padding: var(--sv-space-3) var(--sv-space-4);
6
- border: 1px solid transparent;
7
- border-radius: var(--sv-radius-md);
8
- font-size: var(--sv-font-size-sm);
9
- }
10
-
11
- .icon {
12
- flex-shrink: 0;
13
- /* Optically align to the first line of text rather than the box's
14
- vertical center — matches how the heading/body cap-height sits. */
15
- margin-top: 2px;
16
- }
17
-
18
- .content {
19
- display: flex;
20
- flex-direction: column;
21
- gap: var(--sv-space-1);
22
- min-width: 0;
23
- }
24
-
25
- .heading {
26
- margin: 0;
27
- font-weight: var(--sv-font-weight-semibold);
28
- }
29
-
30
- .body {
31
- margin: 0;
32
- }
33
-
34
- .info {
35
- background: var(--sv-color-info-surface);
36
- border-color: var(--sv-color-info-border);
37
- color: var(--sv-color-info-text);
38
- }
39
-
40
- .success {
41
- background: var(--sv-color-success-surface);
42
- border-color: var(--sv-color-success-border);
43
- color: var(--sv-color-success-text);
44
- }
45
-
46
- .warning {
47
- background: var(--sv-color-warning-surface);
48
- border-color: var(--sv-color-warning-border);
49
- color: var(--sv-color-warning-text);
50
- }
51
-
52
- .error {
53
- background: var(--sv-color-error-surface);
54
- border-color: var(--sv-color-error-border);
55
- color: var(--sv-color-error-text);
56
- }
57
-
58
- .neutral {
59
- background: var(--sv-color-surface-sunken);
60
- border-color: var(--sv-color-border);
61
- color: var(--sv-color-text-primary);
62
- }
@@ -1,96 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Alert } from './Alert';
3
-
4
- const meta = {
5
- title: 'Components/Alert',
6
- component: Alert,
7
- parameters: {
8
- layout: 'padded',
9
- docs: {
10
- description: {
11
- component:
12
- 'Inline, non-dismissible banner. Distinct from Toast (transient) and SystemBanner (instance-wide) — for form-level errors or explaining an empty/blocked state. A leading icon defaults per variant (none for neutral) — pass `icon` to override it or `icon={false}` to suppress it.',
13
- },
14
- },
15
- },
16
- argTypes: {
17
- variant: { control: 'select', options: ['info', 'success', 'warning', 'error', 'neutral'] },
18
- },
19
- args: {
20
- variant: 'info',
21
- children: 'This is an informational message.',
22
- },
23
- } satisfies Meta<typeof Alert>;
24
-
25
- export default meta;
26
- type Story = StoryObj<typeof meta>;
27
-
28
- // ---------------------------------------------------------------------------
29
-
30
- export const Info: Story = {
31
- args: { variant: 'info' },
32
- };
33
-
34
- export const Success: Story = {
35
- args: { variant: 'success', children: 'Your changes have been saved.' },
36
- };
37
-
38
- export const Warning: Story = {
39
- args: { variant: 'warning', children: 'This action cannot be undone.' },
40
- };
41
-
42
- export const ErrorVariant: Story = {
43
- name: 'Error',
44
- args: { variant: 'error', children: 'Select a size to continue.' },
45
- };
46
-
47
- export const Neutral: Story = {
48
- args: { variant: 'neutral', children: 'This project has no members yet.' },
49
- };
50
-
51
- export const WithHeading: Story = {
52
- args: {
53
- variant: 'error',
54
- heading: 'Something went wrong',
55
- children: 'We couldn’t save your changes. Check your connection and try again.',
56
- },
57
- };
58
-
59
- export const WithoutHeading: Story = {
60
- args: { variant: 'success', children: 'Invite sent.' },
61
- };
62
-
63
- /** Icon + heading + body — the pattern most alert examples use. */
64
- export const IconHeadingAndBody: Story = {
65
- args: {
66
- variant: 'success',
67
- heading: 'Payment successful',
68
- children:
69
- 'Your payment of $29.99 has been processed. A receipt has been sent to your email address.',
70
- },
71
- };
72
-
73
- export const CustomIcon: Story = {
74
- args: { variant: 'neutral', icon: 'bell', children: 'You have 3 unread notifications.' },
75
- };
76
-
77
- export const NoIcon: Story = {
78
- args: { variant: 'success', icon: false, children: 'Your changes have been saved.' },
79
- };
80
-
81
- /** Every variant with its default icon, at a glance. */
82
- export const AllVariants: Story = {
83
- render: () => (
84
- <div style={{ display: 'flex', flexDirection: 'column', gap: 12, maxWidth: 480 }}>
85
- <Alert variant="info" heading="New feature available">
86
- We’ve added dark mode support. You can enable it in your account settings.
87
- </Alert>
88
- <Alert variant="success" heading="Payment successful">
89
- Your payment of $29.99 has been processed. A receipt has been sent to your email address.
90
- </Alert>
91
- <Alert variant="warning">This action cannot be undone.</Alert>
92
- <Alert variant="error">Select a size to continue.</Alert>
93
- <Alert variant="neutral">This project has no members yet.</Alert>
94
- </div>
95
- ),
96
- };
@@ -1,58 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import { Icon, type IconName } from '../Icon/Icon';
3
- import styles from './Alert.module.css';
4
-
5
- export type AlertVariant = 'info' | 'success' | 'warning' | 'error' | 'neutral';
6
-
7
- /** Sensible default icon per variant. `neutral` has none — there's no
8
- * universal "neutral" glyph, so it stays icon-less unless `icon` is set
9
- * explicitly. */
10
- const DEFAULT_ICON: Record<AlertVariant, IconName | undefined> = {
11
- info: 'info',
12
- success: 'circle-check',
13
- warning: 'alert-triangle',
14
- error: 'circle-x',
15
- neutral: undefined,
16
- };
17
-
18
- export interface AlertProps {
19
- variant: AlertVariant;
20
- heading?: string;
21
- /** Leading icon next to the heading. Defaults to a per-variant icon (see
22
- * `DEFAULT_ICON`) — pass an `IconName` to override it, or `false` to
23
- * suppress the icon entirely. Purely decorative: the variant's colour and
24
- * `heading`/`children` text already carry the meaning. */
25
- icon?: IconName | false;
26
- children: ReactNode;
27
- id?: string;
28
- className?: string;
29
- }
30
-
31
- /**
32
- * Alert — inline, non-dismissible banner.
33
- *
34
- * Distinct from `Toast` (transient, auto-dismissing) and `SystemBanner`
35
- * (instance-wide): Alert is for in-context messaging — form-level errors,
36
- * or explaining an empty/blocked state.
37
- *
38
- * `role="alert"` for `error` (interrupts screen readers immediately, since
39
- * an error demands attention); `role="status"` for the other variants
40
- * (announced politely, without interrupting).
41
- */
42
- export function Alert({ variant, heading, icon, children, id, className }: AlertProps) {
43
- const resolvedIcon = icon === undefined ? DEFAULT_ICON[variant] : icon || undefined;
44
-
45
- return (
46
- <div
47
- id={id}
48
- role={variant === 'error' ? 'alert' : 'status'}
49
- className={[styles.alert, styles[variant], className].filter(Boolean).join(' ')}
50
- >
51
- {resolvedIcon && <Icon name={resolvedIcon} size="sm" className={styles.icon} aria-hidden />}
52
- <div className={styles.content}>
53
- {heading && <p className={styles.heading}>{heading}</p>}
54
- <div className={styles.body}>{children}</div>
55
- </div>
56
- </div>
57
- );
58
- }
@@ -1,75 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { Alert } from '../Alert';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('Alert', () => {
9
- it('uses role="alert" for the error variant', () => {
10
- render(<Alert variant="error">Something went wrong.</Alert>);
11
- expect(screen.getByRole('alert')).toBeDefined();
12
- });
13
-
14
- it.each(['info', 'success', 'warning', 'neutral'] as const)(
15
- 'uses role="status" for the %s variant',
16
- (variant) => {
17
- render(<Alert variant={variant}>Message</Alert>);
18
- expect(screen.getByRole('status')).toBeDefined();
19
- },
20
- );
21
-
22
- it('renders a heading when given one', () => {
23
- render(
24
- <Alert variant="warning" heading="Heads up">
25
- Body text.
26
- </Alert>,
27
- );
28
- expect(screen.getByText('Heads up')).toBeDefined();
29
- expect(screen.getByText('Body text.')).toBeDefined();
30
- });
31
-
32
- it('renders without a heading', () => {
33
- render(<Alert variant="info">Just the body.</Alert>);
34
- expect(screen.getByText('Just the body.')).toBeDefined();
35
- });
36
-
37
- it('renders a default icon for info, success, warning, and error, but none for neutral', () => {
38
- const info = render(<Alert variant="info">Message</Alert>);
39
- expect(info.container.querySelector('svg')).not.toBeNull();
40
- info.unmount();
41
-
42
- const success = render(<Alert variant="success">Message</Alert>);
43
- expect(success.container.querySelector('svg')).not.toBeNull();
44
- success.unmount();
45
-
46
- const warning = render(<Alert variant="warning">Message</Alert>);
47
- expect(warning.container.querySelector('svg')).not.toBeNull();
48
- warning.unmount();
49
-
50
- const error = render(<Alert variant="error">Message</Alert>);
51
- expect(error.container.querySelector('svg')).not.toBeNull();
52
- error.unmount();
53
-
54
- const neutral = render(<Alert variant="neutral">Message</Alert>);
55
- expect(neutral.container.querySelector('svg')).toBeNull();
56
- });
57
-
58
- it('suppresses the default icon when icon={false}', () => {
59
- const { container } = render(
60
- <Alert variant="success" icon={false}>
61
- Message
62
- </Alert>,
63
- );
64
- expect(container.querySelector('svg')).toBeNull();
65
- });
66
-
67
- it('overrides the default icon when icon is set explicitly', () => {
68
- const { container } = render(
69
- <Alert variant="neutral" icon="info">
70
- Message
71
- </Alert>,
72
- );
73
- expect(container.querySelector('svg')).not.toBeNull();
74
- });
75
- });
@@ -1,15 +0,0 @@
1
- .root {
2
- position: relative;
3
- width: 100%;
4
- overflow: hidden;
5
- border-radius: var(--sv-radius-md);
6
- }
7
-
8
- /* A single direct child (img/video/iframe) fills the ratio box. */
9
- .root > :global(*) {
10
- position: absolute;
11
- inset: 0;
12
- width: 100%;
13
- height: 100%;
14
- object-fit: cover;
15
- }
@@ -1,78 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { AspectRatio } from './AspectRatio';
3
-
4
- const meta = {
5
- title: 'Components/AspectRatio',
6
- component: AspectRatio,
7
- parameters: { layout: 'padded' },
8
- args: {
9
- ratio: 16 / 9,
10
- children: (
11
- <div
12
- style={{
13
- width: '100%',
14
- height: '100%',
15
- background: 'var(--sv-color-surface-sunken)',
16
- display: 'flex',
17
- alignItems: 'center',
18
- justifyContent: 'center',
19
- color: 'var(--sv-color-text-muted)',
20
- fontSize: 'var(--sv-font-size-sm)',
21
- }}
22
- >
23
- 16:9
24
- </div>
25
- ),
26
- },
27
- } satisfies Meta<typeof AspectRatio>;
28
-
29
- export default meta;
30
- type Story = StoryObj<typeof meta>;
31
-
32
- // ---------------------------------------------------------------------------
33
-
34
- export const Widescreen: Story = {};
35
-
36
- export const Square: Story = {
37
- args: {
38
- ratio: 1,
39
- children: (
40
- <div
41
- style={{
42
- width: '100%',
43
- height: '100%',
44
- background: 'var(--sv-color-surface-sunken)',
45
- display: 'flex',
46
- alignItems: 'center',
47
- justifyContent: 'center',
48
- color: 'var(--sv-color-text-muted)',
49
- fontSize: 'var(--sv-font-size-sm)',
50
- }}
51
- >
52
- 1:1
53
- </div>
54
- ),
55
- },
56
- };
57
-
58
- export const Portrait: Story = {
59
- args: {
60
- ratio: 3 / 4,
61
- children: (
62
- <div
63
- style={{
64
- width: '100%',
65
- height: '100%',
66
- background: 'var(--sv-color-surface-sunken)',
67
- display: 'flex',
68
- alignItems: 'center',
69
- justifyContent: 'center',
70
- color: 'var(--sv-color-text-muted)',
71
- fontSize: 'var(--sv-font-size-sm)',
72
- }}
73
- >
74
- 3:4
75
- </div>
76
- ),
77
- },
78
- };
@@ -1,21 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './AspectRatio.module.css';
3
-
4
- export interface AspectRatioProps {
5
- /** Width / height, e.g. 16 / 9 or 1. */
6
- ratio: number;
7
- children: ReactNode;
8
- className?: string;
9
- }
10
-
11
- /** AspectRatio — constrains content (image, video, embed) to a fixed ratio. */
12
- export function AspectRatio({ ratio, children, className }: AspectRatioProps) {
13
- return (
14
- <div
15
- className={[styles.root, className].filter(Boolean).join(' ')}
16
- style={{ aspectRatio: ratio }}
17
- >
18
- {children}
19
- </div>
20
- );
21
- }
@@ -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: 1px 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,154 +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: 1px 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: 1px 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: 1px 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: 1px 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: 1px 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: 1px 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. */
70
- .role.sm {
71
- padding: 1px var(--sv-space-1);
72
- font-size: var(--sv-font-size-label);
73
- }
74
-
75
- .role.md {
76
- padding: 2px var(--sv-space-2);
77
- font-size: var(--sv-font-size-label);
78
- }
79
-
80
- .role.lg {
81
- padding: 3px var(--sv-space-3);
82
- font-size: var(--sv-font-size-sm);
83
- }
84
-
85
- .mono.sm {
86
- padding: 1px var(--sv-space-1);
87
- font-size: var(--sv-font-size-label);
88
- }
89
-
90
- .mono.md {
91
- padding: 2px var(--sv-space-2);
92
- font-size: var(--sv-font-size-xs);
93
- }
94
-
95
- .mono.lg {
96
- padding: 3px var(--sv-space-3);
97
- font-size: var(--sv-font-size-sm);
98
- }
99
-
100
- /* status keeps a tighter left edge than right at every size — the dot +
101
- gap already read as space before the text, so a full padding-inline-start
102
- would double it up. */
103
- .status.sm {
104
- padding: 1px var(--sv-space-1) 1px 3px;
105
- font-size: var(--sv-font-size-label);
106
- }
107
-
108
- .status.md {
109
- padding: 2px var(--sv-space-2) 2px var(--sv-space-1);
110
- font-size: var(--sv-font-size-xs);
111
- }
112
-
113
- .status.lg {
114
- padding: 3px var(--sv-space-3) 3px var(--sv-space-2);
115
- font-size: var(--sv-font-size-sm);
116
- }
117
-
118
- /* Status dot — scales with size */
119
- .dot {
120
- display: inline-block;
121
- border-radius: var(--sv-radius-full);
122
- flex-shrink: 0;
123
- }
124
-
125
- .sm .dot {
126
- width: 5px;
127
- height: 5px;
128
- }
129
-
130
- .md .dot {
131
- width: 6px;
132
- height: 6px;
133
- }
134
-
135
- .lg .dot {
136
- width: 8px;
137
- height: 8px;
138
- }
139
-
140
- .dotGreen {
141
- background: var(--sv-color-success-text);
142
- }
143
-
144
- .dotRed {
145
- background: var(--sv-color-error-text);
146
- }
147
-
148
- .dotAmber {
149
- background: var(--sv-color-warning-text);
150
- }
151
-
152
- .dotGrey {
153
- background: var(--sv-color-text-muted);
154
- }