@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,52 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { Breadcrumb } from '../Breadcrumb';
5
-
6
- afterEach(cleanup);
7
-
8
- const items = [
9
- { label: 'Console', href: '/console' },
10
- { label: 'Plugins', href: '/console/plugins' },
11
- { label: 'sovereign-tasks' },
12
- ];
13
-
14
- describe('Breadcrumb', () => {
15
- it('renders a link for every item with an href', () => {
16
- render(<Breadcrumb items={items} />);
17
- expect(screen.getByRole('link', { name: 'Console' })).toHaveProperty(
18
- 'href',
19
- expect.stringContaining('/console'),
20
- );
21
- expect(screen.getByRole('link', { name: 'Plugins' })).toBeDefined();
22
- });
23
-
24
- it('renders the item without href as plain text with aria-current', () => {
25
- render(<Breadcrumb items={items} />);
26
- expect(screen.queryByRole('link', { name: 'sovereign-tasks' })).toBeNull();
27
- expect(screen.getByText('sovereign-tasks').getAttribute('aria-current')).toBe('page');
28
- });
29
-
30
- it('uses a caller-supplied renderLink instead of a plain <a> when given', () => {
31
- render(
32
- <Breadcrumb
33
- items={items}
34
- renderLink={(item, children) => (
35
- <button type="button" data-href={item.href}>
36
- {children}
37
- </button>
38
- )}
39
- />,
40
- );
41
- expect(screen.queryByRole('link', { name: 'Console' })).toBeNull();
42
- expect(screen.getByRole('button', { name: 'Console' })).toHaveProperty(
43
- 'dataset.href',
44
- '/console',
45
- );
46
- });
47
-
48
- it('defaults to an accessible nav label', () => {
49
- render(<Breadcrumb items={items} />);
50
- expect(screen.getByRole('navigation', { name: 'Breadcrumb' })).toBeDefined();
51
- });
52
- });
@@ -1,153 +0,0 @@
1
- .button {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- gap: var(--sv-space-2);
6
- border: 1px solid transparent;
7
- border-radius: var(--sv-radius-md);
8
- font-family: var(--sv-font-family);
9
- font-weight: var(--sv-font-weight-medium);
10
- line-height: 1;
11
- cursor: pointer;
12
- /* Removes the ~300ms double-tap-to-zoom delay on touch — this is a tap
13
- target, never a pinch-zoom surface. */
14
- touch-action: manipulation;
15
- transition:
16
- background-color 0.15s ease,
17
- border-color 0.15s ease,
18
- color 0.15s ease;
19
- }
20
-
21
- .button:focus-visible {
22
- outline: 2px solid var(--sv-color-focus-ring);
23
- outline-offset: 2px;
24
- }
25
-
26
- .button:disabled {
27
- opacity: 0.5;
28
- cursor: not-allowed;
29
- }
30
-
31
- /* Touch target: gated to (pointer: coarse) — the *primary* pointer, not
32
- (any-pointer: coarse) — so a touchscreen laptop with mouse/trackpad as
33
- primary keeps desktop density (see mobile design-system plan, Part 4 #5). */
34
- @media (pointer: coarse) {
35
- .button {
36
- min-height: var(--sv-touch-target-min, 44px);
37
- }
38
- }
39
-
40
- /* Sizes — 32px / 36px / 40px rendered height (font-size + padding*2 + border*2).
41
- Vertical padding is hardcoded where the --sv-space-* scale can't hit the
42
- exact target height; horizontal padding stays token-based, growing with
43
- size for visual rhythm with the rest of this scale. */
44
- .sm {
45
- padding: var(--sv-space-2) var(--sv-space-3);
46
- font-size: var(--sv-font-size-sm);
47
- }
48
-
49
- .md {
50
- padding: 10px var(--sv-space-4);
51
- font-size: var(--sv-font-size-sm);
52
- font-weight: var(--sv-font-weight-semibold);
53
- }
54
-
55
- .lg {
56
- padding: var(--sv-space-3) var(--sv-space-5);
57
- font-size: var(--sv-font-size-sm);
58
- font-weight: var(--sv-font-weight-semibold);
59
- }
60
-
61
- /* Loading spinner — a self-contained token-only spinner rather than reusing
62
- the Spinner component: Spinner's border colors are semantic-fixed
63
- (`--sv-color-accent`), which would be invisible against a primary button's
64
- accent background, and overriding a second CSS module's rule on the same
65
- element is a cross-module cascade-order gamble (see ConfirmDialog's
66
- `.destructiveConfirm` comment for the same tradeoff). `currentColor` picks
67
- up each variant's own text color for free. */
68
- .spinner {
69
- display: inline-block;
70
- width: var(--sv-icon-size-sm);
71
- height: var(--sv-icon-size-sm);
72
- flex-shrink: 0;
73
- border: 2px solid currentColor;
74
- border-top-color: transparent;
75
- border-radius: var(--sv-radius-full);
76
- opacity: 0.7;
77
- animation: button-spin 0.7s linear infinite;
78
- }
79
-
80
- @keyframes button-spin {
81
- to {
82
- transform: rotate(360deg);
83
- }
84
- }
85
-
86
- @media (prefers-reduced-motion: reduce) {
87
- .spinner {
88
- animation-play-state: paused;
89
- }
90
- }
91
-
92
- /* Variants */
93
- .primary {
94
- background-color: var(--sv-color-accent);
95
- color: var(--sv-color-text-on-accent);
96
- }
97
-
98
- @media (hover: hover) {
99
- .primary:hover:not(:disabled) {
100
- background-color: var(--sv-color-accent-hover);
101
- }
102
- }
103
-
104
- .primary:active:not(:disabled) {
105
- background-color: color-mix(in srgb, var(--sv-color-accent) 80%, black);
106
- }
107
-
108
- .secondary {
109
- background-color: var(--sv-color-surface);
110
- color: var(--sv-color-text-primary);
111
- border-color: var(--sv-color-border-strong);
112
- }
113
-
114
- @media (hover: hover) {
115
- .secondary:hover:not(:disabled) {
116
- background-color: var(--sv-color-surface-sunken);
117
- }
118
- }
119
-
120
- .secondary:active:not(:disabled) {
121
- background-color: color-mix(in srgb, var(--sv-color-surface-sunken) 85%, black);
122
- }
123
-
124
- .ghost {
125
- background-color: transparent;
126
- color: var(--sv-color-text-primary);
127
- }
128
-
129
- @media (hover: hover) {
130
- .ghost:hover:not(:disabled) {
131
- background-color: var(--sv-color-surface-sunken);
132
- }
133
- }
134
-
135
- .ghost:active:not(:disabled) {
136
- background-color: color-mix(in srgb, var(--sv-color-surface-sunken) 85%, black);
137
- }
138
-
139
- .destructive {
140
- background-color: transparent;
141
- color: var(--sv-color-error-text);
142
- border-color: var(--sv-color-error-border);
143
- }
144
-
145
- @media (hover: hover) {
146
- .destructive:hover:not(:disabled) {
147
- background-color: var(--sv-color-error-surface);
148
- }
149
- }
150
-
151
- .destructive:active:not(:disabled) {
152
- background-color: color-mix(in srgb, var(--sv-color-error-surface) 85%, black);
153
- }
@@ -1,83 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Icon } from '../Icon/Icon';
3
- import { Button } from './Button';
4
-
5
- const meta = {
6
- title: 'Components/Button',
7
- component: Button,
8
- parameters: {
9
- layout: 'centered',
10
- docs: {
11
- description: {
12
- component:
13
- 'The primitive interactive control. RSC-safe (no state, forwards props). All styling references `--sv-*` tokens; no hardcoded values.',
14
- },
15
- },
16
- },
17
- argTypes: {
18
- variant: { control: 'select', options: ['primary', 'secondary', 'ghost', 'destructive'] },
19
- size: { control: 'select', options: ['sm', 'md', 'lg'] },
20
- disabled: { control: 'boolean' },
21
- loading: { control: 'boolean' },
22
- children: { control: 'text' },
23
- },
24
- args: {
25
- children: 'Button',
26
- },
27
- } satisfies Meta<typeof Button>;
28
-
29
- export default meta;
30
- type Story = StoryObj<typeof meta>;
31
-
32
- // ---------------------------------------------------------------------------
33
-
34
- export const Primary: Story = { args: { variant: 'primary' } };
35
- export const Secondary: Story = { args: { variant: 'secondary' } };
36
- export const Ghost: Story = { args: { variant: 'ghost' } };
37
- export const Destructive: Story = { args: { variant: 'destructive', children: 'Delete account' } };
38
-
39
- export const Small: Story = { args: { size: 'sm' } };
40
- export const Medium: Story = { args: { size: 'md' } };
41
- export const Large: Story = { args: { size: 'lg' } };
42
-
43
- export const Disabled: Story = { args: { disabled: true } };
44
- export const DisabledSecondary: Story = { args: { variant: 'secondary', disabled: true } };
45
-
46
- export const Loading: Story = { args: { loading: true, children: 'Saving…' } };
47
- export const LoadingSecondary: Story = {
48
- args: { variant: 'secondary', loading: true, children: 'Saving…' },
49
- };
50
-
51
- export const WithLeadingIcon: Story = {
52
- args: {
53
- children: (
54
- <>
55
- <Icon name="plus" size="sm" aria-hidden />
56
- Add item
57
- </>
58
- ),
59
- },
60
- };
61
-
62
- export const IconOnly: Story = {
63
- args: {
64
- variant: 'ghost',
65
- 'aria-label': 'Settings',
66
- children: <Icon name="settings" size="sm" aria-hidden />,
67
- },
68
- };
69
-
70
- /** All variant × size combinations at a glance. */
71
- export const AllVariants: Story = {
72
- render: (_args) => (
73
- <div style={{ display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start' }}>
74
- {(['primary', 'secondary', 'ghost', 'destructive'] as const).map((v) =>
75
- (['lg', 'md', 'sm'] as const).map((s) => (
76
- <Button key={`${v}-${s}`} variant={v} size={s}>
77
- {v} / {s}
78
- </Button>
79
- )),
80
- )}
81
- </div>
82
- ),
83
- };
@@ -1,52 +0,0 @@
1
- import type { ButtonHTMLAttributes, ReactNode } from 'react';
2
- import styles from './Button.module.css';
3
-
4
- export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';
5
- export type ButtonSize = 'sm' | 'md' | 'lg';
6
-
7
- export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
- variant?: ButtonVariant;
9
- size?: ButtonSize;
10
- /** Shows a spinner and disables the button while an async action is pending. */
11
- loading?: boolean;
12
- children: ReactNode;
13
- }
14
-
15
- /**
16
- * Button — the primitive interactive control. Presentational and RSC-safe: it
17
- * holds no state and simply forwards props to the underlying `<button>`, so it
18
- * renders in both Server and Client Components. All styling references `--sv-*`
19
- * tokens via CSS Modules; there are no hardcoded values.
20
- */
21
- export function Button({
22
- variant = 'primary',
23
- size = 'md',
24
- type = 'button',
25
- loading = false,
26
- disabled,
27
- className,
28
- children,
29
- ...rest
30
- }: ButtonProps) {
31
- const classes = [styles.button, styles[variant], styles[size], className]
32
- .filter(Boolean)
33
- .join(' ');
34
-
35
- return (
36
- <button
37
- type={type}
38
- className={classes}
39
- disabled={disabled || loading}
40
- aria-busy={loading || undefined}
41
- {...rest}
42
- >
43
- {loading && (
44
- // aria-hidden: the button's own accessible name (its visible children,
45
- // unchanged below) plus aria-busy already communicate the pending
46
- // state — an unhidden Spinner-style status region would double-narrate it.
47
- <span className={styles.spinner} aria-hidden="true" />
48
- )}
49
- {children}
50
- </button>
51
- );
52
- }
@@ -1,66 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, expect, it } from 'vitest';
3
- import { render, screen } from '@testing-library/react';
4
- import { Button } from '../Button';
5
-
6
- describe('Button', () => {
7
- it('renders its children', () => {
8
- render(<Button>Click me</Button>);
9
- expect(screen.getByRole('button', { name: 'Click me' })).toBeDefined();
10
- });
11
-
12
- it('applies the variant and size classes', () => {
13
- render(
14
- <Button variant="ghost" size="sm">
15
- Go
16
- </Button>,
17
- );
18
- const button = screen.getByRole('button', { name: 'Go' });
19
- expect(button.className).toContain('ghost');
20
- expect(button.className).toContain('sm');
21
- });
22
-
23
- it('applies the lg size class', () => {
24
- render(<Button size="lg">Upgrade</Button>);
25
- expect(screen.getByRole('button', { name: 'Upgrade' }).className).toContain('lg');
26
- });
27
-
28
- it('defaults to the md size class', () => {
29
- render(<Button>Confirm</Button>);
30
- expect(screen.getByRole('button', { name: 'Confirm' }).className).toContain('md');
31
- });
32
-
33
- it('defaults to type="button"', () => {
34
- render(<Button>Save</Button>);
35
- expect(screen.getByRole('button', { name: 'Save' }).getAttribute('type')).toBe('button');
36
- });
37
-
38
- it('forwards native button props', () => {
39
- render(<Button disabled>Nope</Button>);
40
- expect((screen.getByRole('button', { name: 'Nope' }) as HTMLButtonElement).disabled).toBe(true);
41
- });
42
-
43
- it('applies destructive variant class', () => {
44
- render(<Button variant="destructive">Delete</Button>);
45
- expect(screen.getByRole('button', { name: 'Delete' }).className).toContain('destructive');
46
- });
47
-
48
- it('disables the button and sets aria-busy when loading', () => {
49
- render(<Button loading>Submit</Button>);
50
- const button = screen.getByRole('button', { name: 'Submit' }) as HTMLButtonElement;
51
- expect(button.disabled).toBe(true);
52
- expect(button.getAttribute('aria-busy')).toBe('true');
53
- });
54
-
55
- it('does not set aria-busy when not loading', () => {
56
- render(<Button>Continue</Button>);
57
- expect(screen.getByRole('button', { name: 'Continue' }).getAttribute('aria-busy')).toBeNull();
58
- });
59
-
60
- it('respects an explicit disabled prop independent of loading', () => {
61
- render(<Button disabled>Archive</Button>);
62
- const button = screen.getByRole('button', { name: 'Archive' }) as HTMLButtonElement;
63
- expect(button.disabled).toBe(true);
64
- expect(button.getAttribute('aria-busy')).toBeNull();
65
- });
66
- });
@@ -1,29 +0,0 @@
1
- .root {
2
- display: inline-flex;
3
- }
4
-
5
- .root > :global(button),
6
- .root > :global(a) {
7
- border-radius: 0;
8
- margin-left: -1px;
9
- }
10
-
11
- .root > :global(button):first-child,
12
- .root > :global(a):first-child {
13
- margin-left: 0;
14
- border-top-left-radius: var(--sv-radius-md);
15
- border-bottom-left-radius: var(--sv-radius-md);
16
- }
17
-
18
- .root > :global(button):last-child,
19
- .root > :global(a):last-child {
20
- border-top-right-radius: var(--sv-radius-md);
21
- border-bottom-right-radius: var(--sv-radius-md);
22
- }
23
-
24
- /* Keep the focus ring above sibling borders instead of being clipped by them. */
25
- .root > :global(button):focus-visible,
26
- .root > :global(a):focus-visible {
27
- position: relative;
28
- z-index: 1;
29
- }
@@ -1,57 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { ButtonGroup } from './ButtonGroup';
4
- import { Button } from '../Button/Button';
5
-
6
- const meta = {
7
- title: 'Components/ButtonGroup',
8
- component: ButtonGroup,
9
- parameters: { layout: 'padded' },
10
- args: { children: null },
11
- } satisfies Meta<typeof ButtonGroup>;
12
-
13
- export default meta;
14
- type Story = StoryObj<typeof meta>;
15
-
16
- // ---------------------------------------------------------------------------
17
-
18
- export const Default: Story = {
19
- render: () => (
20
- <ButtonGroup aria-label="View">
21
- <Button variant="secondary" size="sm">
22
- Day
23
- </Button>
24
- <Button variant="secondary" size="sm">
25
- Week
26
- </Button>
27
- <Button variant="secondary" size="sm">
28
- Month
29
- </Button>
30
- </ButtonGroup>
31
- ),
32
- };
33
-
34
- export const WithActiveSelection: Story = {
35
- render: () => {
36
- const [view, setView] = useState<'day' | 'week' | 'month'>('week');
37
- const options: { value: typeof view; label: string }[] = [
38
- { value: 'day', label: 'Day' },
39
- { value: 'week', label: 'Week' },
40
- { value: 'month', label: 'Month' },
41
- ];
42
- return (
43
- <ButtonGroup aria-label="View">
44
- {options.map((option) => (
45
- <Button
46
- key={option.value}
47
- variant={option.value === view ? 'primary' : 'secondary'}
48
- size="sm"
49
- onClick={() => setView(option.value)}
50
- >
51
- {option.label}
52
- </Button>
53
- ))}
54
- </ButtonGroup>
55
- );
56
- },
57
- };
@@ -1,27 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './ButtonGroup.module.css';
3
-
4
- export interface ButtonGroupProps {
5
- /** Adjacent Button elements. */
6
- children: ReactNode;
7
- className?: string;
8
- 'aria-label'?: string;
9
- }
10
-
11
- /**
12
- * ButtonGroup — visually joins adjacent `Button`s into one control (shared
13
- * border, connected corners). Targets its children's rendered `<button>`/
14
- * `<a>` elements directly rather than requiring a special child component,
15
- * so it works with plain `Button`.
16
- */
17
- export function ButtonGroup({ children, className, 'aria-label': ariaLabel }: ButtonGroupProps) {
18
- return (
19
- <div
20
- role="group"
21
- aria-label={ariaLabel}
22
- className={[styles.root, className].filter(Boolean).join(' ')}
23
- >
24
- {children}
25
- </div>
26
- );
27
- }
@@ -1,29 +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 { ButtonGroup } from '../ButtonGroup';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('ButtonGroup', () => {
9
- it('exposes a group role with the given aria-label', () => {
10
- render(
11
- <ButtonGroup aria-label="View">
12
- <button type="button">Day</button>
13
- <button type="button">Week</button>
14
- </ButtonGroup>,
15
- );
16
- expect(screen.getByRole('group', { name: 'View' })).toBeDefined();
17
- });
18
-
19
- it('renders every child button', () => {
20
- render(
21
- <ButtonGroup aria-label="View">
22
- <button type="button">Day</button>
23
- <button type="button">Week</button>
24
- <button type="button">Month</button>
25
- </ButtonGroup>,
26
- );
27
- expect(screen.getAllByRole('button').length).toBe(3);
28
- });
29
- });
@@ -1,126 +0,0 @@
1
- /* Calendar — month grid. Tokens only. Grid columns are equal-width via
2
- * `1fr` repeated 7 times rather than a fixed px size, so the component
3
- * scales cleanly inside both a Popover panel (desktop) and a full-width
4
- * Drawer sheet (mobile). */
5
-
6
- .calendar {
7
- display: flex;
8
- flex-direction: column;
9
- gap: var(--sv-space-3);
10
- font-family: var(--sv-font-family);
11
- }
12
-
13
- .header {
14
- display: flex;
15
- align-items: center;
16
- justify-content: space-between;
17
- gap: var(--sv-space-2);
18
- }
19
-
20
- .navButton {
21
- display: inline-flex;
22
- align-items: center;
23
- justify-content: center;
24
- width: var(--sv-touch-target-min, 44px);
25
- height: var(--sv-touch-target-min, 44px);
26
- flex-shrink: 0;
27
- border: none;
28
- border-radius: var(--sv-radius-md);
29
- background: transparent;
30
- color: var(--sv-color-text-muted);
31
- cursor: pointer;
32
- }
33
-
34
- @media (hover: hover) {
35
- .navButton:hover {
36
- background: var(--sv-color-surface-sunken);
37
- color: var(--sv-color-text-primary);
38
- }
39
- }
40
-
41
- .navButton:focus-visible {
42
- outline: 2px solid var(--sv-color-focus-ring);
43
- outline-offset: -2px;
44
- }
45
-
46
- .monthLabel {
47
- font-size: var(--sv-font-size-sm);
48
- font-weight: var(--sv-font-weight-semibold);
49
- color: var(--sv-color-text-primary);
50
- }
51
-
52
- .grid {
53
- display: flex;
54
- flex-direction: column;
55
- gap: var(--sv-space-1);
56
- }
57
-
58
- .weekdayRow,
59
- .week {
60
- display: grid;
61
- grid-template-columns: repeat(7, 1fr);
62
- }
63
-
64
- .weekday {
65
- display: flex;
66
- align-items: center;
67
- justify-content: center;
68
- height: var(--sv-space-6);
69
- font-size: var(--sv-font-size-xs);
70
- font-weight: var(--sv-font-weight-medium);
71
- color: var(--sv-color-text-subtle);
72
- text-transform: uppercase;
73
- }
74
-
75
- .day {
76
- display: flex;
77
- align-items: center;
78
- justify-content: center;
79
- width: 100%;
80
- /* Square-ish cell that also clears the touch-target minimum — height
81
- drives the grid's row size; width fills its 1fr column. */
82
- min-height: var(--sv-touch-target-min, 44px);
83
- border: none;
84
- border-radius: var(--sv-radius-md);
85
- background: transparent;
86
- color: var(--sv-color-text-primary);
87
- font-size: var(--sv-font-size-sm);
88
- cursor: pointer;
89
- }
90
-
91
- @media (hover: hover) {
92
- .day:hover:not(:disabled) {
93
- background: var(--sv-color-surface-sunken);
94
- }
95
- }
96
-
97
- .day:focus-visible {
98
- outline: 2px solid var(--sv-color-focus-ring);
99
- outline-offset: -2px;
100
- }
101
-
102
- .day:disabled {
103
- color: var(--sv-color-text-subtle);
104
- cursor: not-allowed;
105
- }
106
-
107
- .dayOutside {
108
- color: var(--sv-color-text-subtle);
109
- }
110
-
111
- .dayToday {
112
- font-weight: var(--sv-font-weight-semibold);
113
- box-shadow: inset 0 0 0 1px var(--sv-color-border-strong);
114
- }
115
-
116
- .daySelected,
117
- .daySelected:disabled {
118
- background: var(--sv-color-accent);
119
- color: var(--sv-color-text-on-accent);
120
- }
121
-
122
- @media (hover: hover) {
123
- .daySelected:hover:not(:disabled) {
124
- background: var(--sv-color-accent-hover);
125
- }
126
- }