@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
package/NOTICE CHANGED
@@ -22,3 +22,11 @@ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
22
22
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
23
23
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
24
24
  PERFORMANCE OF THIS SOFTWARE.
25
+
26
+ ---
27
+
28
+ This package includes the Hanken Grotesk typeface (src/fonts, Fontsource's build of the Google Fonts release).
29
+
30
+ Copyright 2021 The Hanken Grotesk Project Authors (https://github.com/marcologous/hanken-grotesk)
31
+
32
+ SIL Open Font License, Version 1.1. The full text is in fonts/OFL.txt, and at https://openfontlicense.org.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @sovereignfs/ui
2
2
 
3
- Sovereign Design System — design tokens and React components for building [Sovereign](https://github.com/sovereignfs/sovereign) plugins.
3
+ Sovereign Design System — design tokens and React components for building [Sovereign](https://github.com/sovereignfs) apps.
4
4
 
5
5
  ## Installation
6
6
 
@@ -51,7 +51,7 @@ Primitive tokens --sv-grey-50 … --sv-grey-950 / --sv-space-1 … --sv-spac
51
51
  Semantic tokens --sv-color-surface / --sv-color-text-primary / --sv-shadow-card
52
52
  ```
53
53
 
54
- Plugin developers reference **semantic tokens** — never primitive colours directly. Dark mode and instance theming work by swapping semantic token values; no component changes required.
54
+ App developers reference **semantic tokens** — never primitive colours directly. Dark mode and instance theming work by swapping semantic token values; no component changes required.
55
55
 
56
56
  ## Icon component
57
57
 
@@ -66,10 +66,8 @@ Available icon names: `activity`, `alert-triangle`, `bell`, `check`, `chevron-do
66
66
  ## Documentation
67
67
 
68
68
  - [Storybook — live component & token gallery](https://sovereignfs.github.io/storybook)
69
- - [Design system reference](https://github.com/sovereignfs/sovereign/blob/main/docs/design-system.md)
70
- - [Plugin development guide](https://github.com/sovereignfs/sovereign/blob/main/docs/plugin-development.md)
71
- - [SDK stability & semver policy](https://github.com/sovereignfs/sovereign/blob/main/docs/sdk-stability.md)
69
+ - [Design system reference](../../docs/design-system.md)
72
70
 
73
71
  ## License
74
72
 
75
- AGPL-3.0-or-later
73
+ [MPL-2.0](LICENSE). The icons are derived from Lucide (ISC); see [NOTICE](NOTICE).
@@ -1,3 +1,3 @@
1
1
  .root {
2
- border-top: 1px solid var(--sv-color-border);
2
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
3
3
  }
@@ -3,7 +3,7 @@
3
3
  align-items: flex-start;
4
4
  gap: var(--sv-space-2);
5
5
  padding: var(--sv-space-3) var(--sv-space-4);
6
- border: 1px solid transparent;
6
+ border: var(--sv-border-width-hairline) solid transparent;
7
7
  border-radius: var(--sv-radius-md);
8
8
  font-size: var(--sv-font-size-sm);
9
9
  }
@@ -0,0 +1,102 @@
1
+ .trigger {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ flex-shrink: 0;
6
+ width: 28px;
7
+ height: 28px;
8
+ padding: 0;
9
+ border: none;
10
+ border-radius: var(--sv-radius-md);
11
+ background: transparent;
12
+ color: var(--sv-color-text-primary);
13
+ cursor: pointer;
14
+ }
15
+
16
+ @media (hover: hover) {
17
+ .trigger:hover {
18
+ background: var(--sv-color-surface-sunken);
19
+ }
20
+ }
21
+
22
+ .header {
23
+ padding: var(--sv-space-4) var(--sv-space-3) var(--sv-space-1);
24
+ font-size: var(--sv-font-size-sm);
25
+ font-weight: var(--sv-font-weight-semibold);
26
+ color: var(--sv-color-text-primary);
27
+ }
28
+
29
+ .loading {
30
+ display: flex;
31
+ justify-content: center;
32
+ padding: var(--sv-space-6);
33
+ }
34
+
35
+ .error {
36
+ margin: 0;
37
+ padding: 0 var(--sv-space-3) var(--sv-space-3);
38
+ color: var(--sv-color-error-text);
39
+ font-size: var(--sv-font-size-sm);
40
+ }
41
+
42
+ .grid {
43
+ display: grid;
44
+ /* minmax(0, 1fr), not a plain 1fr — a plain 1fr track can grow past the
45
+ grid's own available width to fit a tile name's min-content size
46
+ (nowrap), blowing the grid out past the popover's own width instead of
47
+ letting the name truncate with ellipsis as intended. */
48
+ grid-template-columns: repeat(3, minmax(0, 1fr));
49
+ gap: var(--sv-space-1);
50
+ padding: var(--sv-space-2);
51
+ max-height: 60vh;
52
+ overflow-y: auto;
53
+ }
54
+
55
+ .tile {
56
+ display: flex;
57
+ flex-direction: column;
58
+ align-items: center;
59
+ gap: var(--sv-space-2);
60
+ padding: var(--sv-space-2);
61
+ border: none;
62
+ border-radius: var(--sv-radius-md);
63
+ background: transparent;
64
+ text-decoration: none;
65
+ color: var(--sv-color-text-primary);
66
+ text-align: center;
67
+ font: inherit;
68
+ cursor: pointer;
69
+ }
70
+
71
+ @media (hover: hover) {
72
+ .tile:hover {
73
+ background: var(--sv-color-surface-sunken);
74
+ }
75
+ }
76
+
77
+ .tileIcon {
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: 32px;
82
+ height: 32px;
83
+ border-radius: var(--sv-radius-md);
84
+ background: var(--sv-color-surface-sunken);
85
+ font-size: var(--sv-font-size-xs);
86
+ font-weight: var(--sv-font-weight-semibold);
87
+ overflow: hidden;
88
+ }
89
+
90
+ .tileName {
91
+ font-size: var(--sv-font-size-caption);
92
+ overflow: hidden;
93
+ text-overflow: ellipsis;
94
+ white-space: nowrap;
95
+ max-width: 100%;
96
+ }
97
+
98
+ .trigger:focus-visible,
99
+ .tile:focus-visible {
100
+ outline: 2px solid var(--sv-color-focus-ring);
101
+ outline-offset: 2px;
102
+ }
@@ -4,7 +4,7 @@
4
4
  justify-content: center;
5
5
  border-radius: 50%;
6
6
  background: var(--sv-color-surface-raised);
7
- border: 1px solid var(--sv-color-border);
7
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
8
8
  overflow: hidden;
9
9
  flex-shrink: 0;
10
10
  font-weight: var(--sv-font-weight-medium);
@@ -19,7 +19,7 @@
19
19
  /* role — neutral fill, border */
20
20
  .role {
21
21
  background: var(--sv-color-surface-sunken);
22
- border: 1px solid var(--sv-color-border);
22
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
23
23
  color: var(--sv-color-text-primary);
24
24
  font-weight: var(--sv-font-weight-semibold);
25
25
  }
@@ -31,32 +31,32 @@
31
31
 
32
32
  .chipGreen {
33
33
  background: var(--sv-color-success-surface);
34
- border: 1px solid var(--sv-color-success-border);
34
+ border: var(--sv-border-width-hairline) solid var(--sv-color-success-border);
35
35
  color: var(--sv-color-success-text);
36
36
  }
37
37
 
38
38
  .chipAmber {
39
39
  background: var(--sv-color-warning-surface);
40
- border: 1px solid var(--sv-color-warning-border);
40
+ border: var(--sv-border-width-hairline) solid var(--sv-color-warning-border);
41
41
  color: var(--sv-color-warning-text);
42
42
  }
43
43
 
44
44
  .chipRed {
45
45
  background: var(--sv-color-error-surface);
46
- border: 1px solid var(--sv-color-error-border);
46
+ border: var(--sv-border-width-hairline) solid var(--sv-color-error-border);
47
47
  color: var(--sv-color-error-text);
48
48
  }
49
49
 
50
50
  .chipNeutral {
51
51
  background: var(--sv-color-surface-sunken);
52
- border: 1px solid var(--sv-color-border);
52
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
53
53
  color: var(--sv-color-text-muted);
54
54
  }
55
55
 
56
56
  /* mono — monospace font, neutral surface, for type tags / versions */
57
57
  .mono {
58
58
  background: var(--sv-color-surface-sunken);
59
- border: 1px solid var(--sv-color-border);
59
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
60
60
  color: var(--sv-color-text-muted);
61
61
  font-family: var(--sv-font-family-mono);
62
62
  }
@@ -66,7 +66,15 @@
66
66
  composed partials fighting over the same properties. `.role.md`,
67
67
  `.status.md`, and `.mono.md` reproduce the badge's original (and, until
68
68
  now, only) sizing exactly, so the default (no `size` prop) renders
69
- pixel-identical to before this scale existed. */
69
+ pixel-identical to before this scale existed. `xs` was added later, for a
70
+ badge sitting inline next to larger text where `sm` (already the smallest
71
+ type-scale token, `--sv-font-size-label`) still read oversized — it needed
72
+ a new, smaller primitive (`--sv-font-size-2xs`) rather than reusing one. */
73
+ .role.xs {
74
+ padding: 1px 3px;
75
+ font-size: var(--sv-font-size-2xs);
76
+ }
77
+
70
78
  .role.sm {
71
79
  padding: 1px var(--sv-space-1);
72
80
  font-size: var(--sv-font-size-label);
@@ -82,6 +90,11 @@
82
90
  font-size: var(--sv-font-size-sm);
83
91
  }
84
92
 
93
+ .mono.xs {
94
+ padding: 1px 3px;
95
+ font-size: var(--sv-font-size-2xs);
96
+ }
97
+
85
98
  .mono.sm {
86
99
  padding: 1px var(--sv-space-1);
87
100
  font-size: var(--sv-font-size-label);
@@ -100,6 +113,11 @@
100
113
  /* status keeps a tighter left edge than right at every size — the dot +
101
114
  gap already read as space before the text, so a full padding-inline-start
102
115
  would double it up. */
116
+ .status.xs {
117
+ padding: 1px 3px 1px 2px;
118
+ font-size: var(--sv-font-size-2xs);
119
+ }
120
+
103
121
  .status.sm {
104
122
  padding: 1px var(--sv-space-1) 1px 3px;
105
123
  font-size: var(--sv-font-size-label);
@@ -122,6 +140,11 @@
122
140
  flex-shrink: 0;
123
141
  }
124
142
 
143
+ .xs .dot {
144
+ width: 4px;
145
+ height: 4px;
146
+ }
147
+
125
148
  .sm .dot {
126
149
  width: 5px;
127
150
  height: 5px;
@@ -4,7 +4,7 @@
4
4
  max-width: 100%;
5
5
  min-height: 24px;
6
6
  padding: 2px var(--sv-space-2);
7
- border: 1px solid var(--sv-color-border);
7
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
8
8
  border-radius: var(--sv-radius-full);
9
9
  font-family: var(--sv-font-family);
10
10
  font-size: var(--sv-font-size-xs);
@@ -3,7 +3,7 @@
3
3
  align-items: center;
4
4
  justify-content: center;
5
5
  gap: var(--sv-space-2);
6
- border: 1px solid transparent;
6
+ border: var(--sv-border-width-hairline) solid transparent;
7
7
  border-radius: var(--sv-radius-md);
8
8
  font-family: var(--sv-font-family);
9
9
  font-weight: var(--sv-font-weight-medium);
@@ -12,10 +12,15 @@
12
12
  /* Removes the ~300ms double-tap-to-zoom delay on touch — this is a tap
13
13
  target, never a pinch-zoom surface. */
14
14
  touch-action: manipulation;
15
+ /* --sv-button-shadow defaults to `none` (semantic.css) — this box-shadow
16
+ line is a no-op for every theme that doesn't set it (RFC 0094). */
17
+ box-shadow: var(--sv-button-shadow);
15
18
  transition:
16
19
  background-color 0.15s ease,
17
20
  border-color 0.15s ease,
18
- color 0.15s ease;
21
+ color 0.15s ease,
22
+ transform 0.1s ease,
23
+ box-shadow 0.1s ease;
19
24
  }
20
25
 
21
26
  .button:focus-visible {
@@ -28,6 +33,17 @@
28
33
  cursor: not-allowed;
29
34
  }
30
35
 
36
+ /* --sv-button-press-x/-y default to 0 (semantic.css) — translate(0, 0) is a
37
+ no-op, so this rule only produces a visible "press into shadow" effect
38
+ for a theme preset that sets non-zero values (RFC 0094). Unguarded by
39
+ (hover: hover) deliberately: :active press feedback is wanted on every
40
+ input type, the same reasoning documented for Button's existing
41
+ color-mix() :active background changes below. */
42
+ .button:active:not(:disabled) {
43
+ transform: translate(var(--sv-button-press-x), var(--sv-button-press-y));
44
+ box-shadow: none;
45
+ }
46
+
31
47
  /* Touch target: gated to (pointer: coarse) — the *primary* pointer, not
32
48
  (any-pointer: coarse) — so a touchscreen laptop with mouse/trackpad as
33
49
  primary keeps desktop density (see mobile design-system plan, Part 4 #5). */
@@ -151,3 +167,8 @@
151
167
  .destructive:active:not(:disabled) {
152
168
  background-color: color-mix(in srgb, var(--sv-color-error-surface) 85%, black);
153
169
  }
170
+
171
+ /* A `ButtonLink` is an anchor in a button's clothes: no underline, and the same height as the button beside it. */
172
+ .link {
173
+ text-decoration: none;
174
+ }
@@ -6,7 +6,7 @@
6
6
  exists. */
7
7
  .card {
8
8
  background: var(--sv-color-surface-raised);
9
- border: 1px solid var(--sv-color-border);
9
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
10
10
  border-radius: var(--sv-radius-lg);
11
11
  box-shadow: var(--sv-shadow-card);
12
12
  }
@@ -40,3 +40,9 @@
40
40
  outline: 2px solid var(--sv-color-focus-ring);
41
41
  outline-offset: 2px;
42
42
  }
43
+
44
+ @media (prefers-reduced-motion: reduce) {
45
+ .interactive {
46
+ transition: none;
47
+ }
48
+ }
@@ -0,0 +1,187 @@
1
+ .grid {
2
+ display: grid;
3
+ grid-template-columns: repeat(auto-fill, minmax(var(--sv-card-tile-min-width, 200px), 1fr));
4
+ gap: var(--sv-space-4);
5
+ }
6
+
7
+ /* A fixed column width (not `1fr`, and — as important — not `max-content`
8
+ either) — every real consumer of `dense` mode (Docs' folder/document
9
+ tiles, this file's own Storybook gallery) pairs it with `variant="icon"`
10
+ tiles carrying a name of unpredictable length that must ellipsis-truncate
11
+ past a point. `max-content` was tried first, on the reasoning that "a
12
+ tile keeps its own natural width instead of stretching to fill leftover
13
+ row space, so the empty area around a small icon tile stays roughly
14
+ square" — but `max-content` track sizing through this grid's nested
15
+ grid → flex → block(/inline-block) → text chain did not reliably account
16
+ for a descendant label's true content width in practice: measured live,
17
+ a 110px-wide label landed in a track that resolved to 97px, silently
18
+ overflowing with no ellipsis ever triggering (not the intended "grows to
19
+ fit," and not truncated either — just broken). A uniform fixed width
20
+ sidesteps that whole class of bug: every tile in a `dense` grid is
21
+ exactly `--sv-card-tile-min-width` wide, full stop, and the descendant
22
+ label (an `overflow: hidden; text-overflow: ellipsis` `inline-block` with
23
+ `max-width: 100%`) truncates reliably against that always-known width —
24
+ short names still read as compact/square, long ones truncate cleanly
25
+ instead of bleeding past their tile. Tighter gap to match. */
26
+ .gridDense {
27
+ grid-template-columns: repeat(auto-fill, var(--sv-card-tile-min-width, 200px));
28
+ gap: var(--sv-space-2);
29
+ }
30
+
31
+ /* Chrome (border/radius/shadow/background) lives on this outer box, same
32
+ tokens `Card` itself uses — but padding-free, so `.banner` below can
33
+ bleed all the way to the edges, which `Card`'s single padded box can't
34
+ do. */
35
+ .tile {
36
+ display: flex;
37
+ flex-direction: column;
38
+ height: 100%;
39
+ overflow: hidden;
40
+ border: 1px solid var(--sv-color-border);
41
+ border-radius: var(--sv-radius-lg);
42
+ background: var(--sv-color-surface-raised);
43
+ box-shadow: var(--sv-shadow-card);
44
+ }
45
+
46
+ .banner {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ height: 40px;
51
+ color: var(--sv-color-text-subtle);
52
+ /* Neutral default when no `bannerColor` is supplied — an inline style
53
+ on the element overrides this. */
54
+ background-color: var(--sv-color-surface-sunken);
55
+ }
56
+
57
+ .footer {
58
+ padding: var(--sv-space-3) var(--sv-space-4);
59
+ }
60
+
61
+ /* `variant="icon"` modifier — a plain "Finder icon" tile: no card chrome,
62
+ just a large centered icon with a label beneath it. `.banner`/`.footer`
63
+ are the same two elements the card variant uses, restyled here rather
64
+ than duplicated, so both variants stay structurally identical. */
65
+ .tileIcon {
66
+ align-items: center;
67
+ border: none;
68
+ border-radius: var(--sv-radius-md);
69
+ background: none;
70
+ box-shadow: none;
71
+ padding: var(--sv-space-3) var(--sv-space-2);
72
+ }
73
+
74
+ @media (hover: hover) {
75
+ .tileIcon:hover {
76
+ background: var(--sv-color-surface-sunken);
77
+ }
78
+ }
79
+
80
+ .tileIcon .banner {
81
+ height: auto;
82
+ background: none;
83
+ color: var(--sv-color-text-muted);
84
+ }
85
+
86
+ .tileIcon .banner svg {
87
+ width: 48px;
88
+ height: 48px;
89
+ }
90
+
91
+ /* `width: 100%` is load-bearing, not decorative — `.tile` sets
92
+ `align-items: center` (so the icon banner centers itself horizontally),
93
+ and cross-axis `center` alignment sizes a flex item to its own preferred
94
+ (content-based) width and centers *that* within the container, rather
95
+ than clamping it to the container's width the way `stretch` would.
96
+ Without an explicit width here, a `nowrap` + `text-overflow: ellipsis`
97
+ label inside (a consumer's own truncation CSS) keeps its full
98
+ content-driven preferred width and gets centered straddling both edges of
99
+ `.tile` — `overflow: hidden` on `.tile` doesn't help, since this child's
100
+ box is genuinely laid out wider than its own container, not merely
101
+ painting past an already-settled one. `min-width: 0` alone (the more
102
+ common flex-truncation fix) does NOT fix this specific case: that only
103
+ lifts the auto-min-size floor that blocks *shrinking under stretch*, and
104
+ this axis was never being stretched to begin with. Confirmed live at a
105
+ viewport narrow enough that `.tile`'s own resolved width is well under
106
+ the label's preferred width — only `width: 100%` actually constrains it;
107
+ a wider test viewport had accidentally masked the bug by giving `.tile`
108
+ enough natural room that the oversized `.footer` fit anyway. */
109
+ .tileIcon .footer {
110
+ width: 100%;
111
+ min-width: 0;
112
+ padding: var(--sv-space-2) 0 0;
113
+ color: var(--sv-color-text-primary);
114
+ text-align: center;
115
+ text-decoration: none;
116
+ }
117
+
118
+ /* Plain centered placeholder — no banner strip, so a ghost "add new" tile
119
+ reads as an empty slot rather than mimicking a real tile's anatomy.
120
+ `min-height` matches a real `.tile`'s own natural height (banner +
121
+ single-line footer) so the two read as the same size. */
122
+ .newTile {
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ gap: var(--sv-space-2);
127
+ min-height: 87px;
128
+ width: 100%;
129
+ height: 100%;
130
+ color: var(--sv-color-text-muted);
131
+ border: 1px dashed var(--sv-color-border-strong);
132
+ border-radius: var(--sv-radius-lg);
133
+ background: none;
134
+ cursor: pointer;
135
+ transition:
136
+ border-color 0.15s ease,
137
+ color 0.15s ease;
138
+ }
139
+
140
+ @media (hover: hover) {
141
+ .newTile:hover {
142
+ border-color: var(--sv-color-text-muted);
143
+ color: var(--sv-color-text-primary);
144
+ }
145
+ }
146
+
147
+ .newTile:focus-visible {
148
+ outline: 2px solid var(--sv-color-focus-ring);
149
+ outline-offset: 2px;
150
+ }
151
+
152
+ /* `variant="icon"` modifier — matches a `variant="icon"` `CardTile`'s own
153
+ footprint. Icon-only, no visible label (see `NewCardTile`'s own doc
154
+ comment) — a plain "+" at the DS's own `size="md"` (unlike
155
+ `.tileIcon .banner svg`'s real-content 48px override, deliberately not
156
+ repeated here) reads as self-explanatory once every sibling tile in the
157
+ grid is already an unlabeled icon.
158
+ `width`/`height: 100%` (not `auto`, despite this being a "shrink to
159
+ content" variant conceptually) — a real `CardTile` sibling in the same
160
+ `dense` grid fills its grid cell via the grid's own item-stretch, which
161
+ only reaches an `auto`-sized *direct* grid child; wrapping this trigger
162
+ in a `Menu`/`Popover` (`HomeWorkbooksList.tsx`'s "add workbook" tile)
163
+ inserts an intermediate `display: inline-flex` container between this
164
+ button and the grid, and a flex container's default cross/main-axis
165
+ sizing does not itself relay grid-stretch through to a `width: auto`
166
+ flex child — confirmed live: the button rendered full-height but only
167
+ as wide as its own icon+padding (~38px) inside a 160px cell. Explicit
168
+ 100% percentages resolve against whichever immediate parent box is
169
+ sized to the grid cell — the grid track directly, or the intermediate
170
+ flex container once IT has already been stretched to that width — so
171
+ this works correctly either way, unlike relying on stretch alone. */
172
+ .newTileIcon {
173
+ flex-direction: column;
174
+ justify-content: center;
175
+ gap: 0;
176
+ width: 100%;
177
+ height: 100%;
178
+ min-height: 0;
179
+ padding: var(--sv-space-3) var(--sv-space-2);
180
+ border-radius: var(--sv-radius-md);
181
+ }
182
+
183
+ @media (prefers-reduced-motion: reduce) {
184
+ .newTile {
185
+ transition: none;
186
+ }
187
+ }
@@ -93,3 +93,11 @@
93
93
  .trailing {
94
94
  flex-shrink: 0;
95
95
  }
96
+
97
+ @media (prefers-reduced-motion: reduce) {
98
+ .box,
99
+ .label,
100
+ .label::after {
101
+ transition: none;
102
+ }
103
+ }
@@ -109,3 +109,11 @@
109
109
  opacity: 0.5;
110
110
  cursor: not-allowed;
111
111
  }
112
+
113
+ @media (prefers-reduced-motion: reduce) {
114
+ .box,
115
+ .label,
116
+ .label::after {
117
+ transition: none;
118
+ }
119
+ }
@@ -13,7 +13,7 @@
13
13
  overflow: auto;
14
14
  resize: vertical;
15
15
  background: var(--sv-color-surface);
16
- border: 1px solid var(--sv-color-border-strong);
16
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
17
17
  border-radius: var(--sv-radius-md);
18
18
  transition:
19
19
  border-color 0.15s ease,
@@ -51,3 +51,9 @@
51
51
  border-color: var(--sv-color-error-border);
52
52
  box-shadow: 0 0 0 2px var(--sv-color-error-border);
53
53
  }
54
+
55
+ @media (prefers-reduced-motion: reduce) {
56
+ .textarea {
57
+ transition: none;
58
+ }
59
+ }
@@ -1,5 +1,5 @@
1
1
  .root {
2
- border-bottom: 1px solid var(--sv-color-border);
2
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
3
3
  }
4
4
 
5
5
  .trigger {