@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
@@ -0,0 +1,138 @@
1
+ .row {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ gap: var(--sv-space-2);
5
+ }
6
+
7
+ .swatch {
8
+ width: var(--sv-space-8);
9
+ height: var(--sv-space-8);
10
+ border-radius: var(--sv-radius-md);
11
+ border: 2px solid transparent;
12
+ padding: 0;
13
+ cursor: pointer;
14
+ }
15
+
16
+ .swatch:disabled {
17
+ opacity: 0.5;
18
+ cursor: not-allowed;
19
+ }
20
+
21
+ .swatchSelected {
22
+ border-color: var(--sv-color-accent);
23
+ outline: 2px solid var(--sv-color-focus-ring);
24
+ outline-offset: 1px;
25
+ }
26
+
27
+ /* Dashed/outlined rather than filled — there's no real color value to paint
28
+ for "no color". */
29
+ .swatchNone {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ background-color: var(--sv-color-surface-sunken);
34
+ border: 2px dashed var(--sv-color-border-strong);
35
+ color: var(--sv-color-text-muted);
36
+ }
37
+
38
+ .swatchNone.swatchSelected {
39
+ border-style: solid;
40
+ }
41
+
42
+ /* Wraps the native color input so a decorative "+" glyph can sit on top of
43
+ it while it's empty (a native `<input type="color">` can't have DOM
44
+ children of its own) and so the same `.swatchSelected` ring used above can
45
+ be applied to the wrapper without fighting the input's own default
46
+ focus/border rendering. */
47
+ .customWrapper {
48
+ position: relative;
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ width: var(--sv-space-8);
53
+ height: var(--sv-space-8);
54
+ border-radius: var(--sv-radius-md);
55
+ border: 2px solid transparent;
56
+ }
57
+
58
+ .customWrapper.swatchSelected {
59
+ /* Same visual treatment as .swatchSelected, but scoped to the wrapper —
60
+ the input itself is styled borderless below, so this is the only
61
+ border/outline actually rendered for the custom trigger. */
62
+ border-color: var(--sv-color-accent);
63
+ }
64
+
65
+ /* Before a custom color is actually chosen — same dashed/outlined treatment
66
+ as .swatchNone, since there's equally no real color value to paint yet. */
67
+ .customWrapperEmpty {
68
+ background-color: var(--sv-color-surface-sunken);
69
+ border-style: dashed;
70
+ border-color: var(--sv-color-border-strong);
71
+ }
72
+
73
+ /* Reset the native control to a plain color swatch matching the curated
74
+ ones above — browsers default `<input type="color">` to its own chrome
75
+ (a bordered box with visible padding around the swatch). */
76
+ .customInput {
77
+ width: 100%;
78
+ height: 100%;
79
+ padding: 0;
80
+ border: none;
81
+ border-radius: var(--sv-radius-md);
82
+ cursor: pointer;
83
+ background: none;
84
+ }
85
+
86
+ /* Invisible but still clickable/focusable while empty — the input always
87
+ holds *some* real hex internally (no true empty state), but that value
88
+ was never actually chosen by the user, so it must never render as this
89
+ trigger's own swatch color. Becomes visible again the moment a real
90
+ choice makes it into `value` (`.customWrapperEmpty` stops applying). */
91
+ .customWrapperEmpty .customInput {
92
+ opacity: 0;
93
+ }
94
+
95
+ .customInput:disabled {
96
+ opacity: 0.5;
97
+ cursor: not-allowed;
98
+ }
99
+
100
+ .customWrapperEmpty .customInput:disabled {
101
+ opacity: 0;
102
+ }
103
+
104
+ .customInput::-webkit-color-swatch-wrapper {
105
+ padding: 0;
106
+ border-radius: var(--sv-radius-md);
107
+ }
108
+
109
+ .customInput::-webkit-color-swatch {
110
+ border: none;
111
+ border-radius: var(--sv-radius-md);
112
+ }
113
+
114
+ .customInput::-moz-color-swatch {
115
+ border: none;
116
+ border-radius: var(--sv-radius-md);
117
+ }
118
+
119
+ /* `inset: 0` alone doesn't center this — the icon already has an explicit
120
+ width/height (its own size class), so an absolutely positioned box with
121
+ all four insets pinned to 0 resolves against top/left rather than
122
+ stretching to let flex centering do anything, landing the glyph in the
123
+ corner instead of the middle. `top/left: 50%` + `translate(-50%, -50%)`
124
+ centers a fixed-size element regardless of its own dimensions. */
125
+ .customPlusIcon {
126
+ position: absolute;
127
+ top: 50%;
128
+ left: 50%;
129
+ transform: translate(-50%, -50%);
130
+ color: var(--sv-color-text-muted);
131
+ pointer-events: none;
132
+ }
133
+
134
+ .swatch:focus-visible,
135
+ .customWrapper:has(.customInput:focus-visible) {
136
+ outline: 2px solid var(--sv-color-focus-ring);
137
+ outline-offset: 2px;
138
+ }
@@ -15,7 +15,7 @@
15
15
  line-height: 1.5;
16
16
  color: var(--sv-color-text-primary);
17
17
  background-color: var(--sv-color-surface);
18
- border: 1px solid var(--sv-color-border-strong);
18
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
19
19
  border-radius: var(--sv-radius-md);
20
20
  cursor: pointer;
21
21
  transition:
@@ -61,7 +61,7 @@
61
61
  flex-shrink: 0;
62
62
  width: 100%;
63
63
  border: none;
64
- border-bottom: 1px solid var(--sv-color-border);
64
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
65
65
  background: transparent;
66
66
  color: var(--sv-color-text-primary);
67
67
  font: inherit;
@@ -120,3 +120,9 @@
120
120
  font-size: var(--sv-font-size-sm);
121
121
  text-align: center;
122
122
  }
123
+
124
+ @media (prefers-reduced-motion: reduce) {
125
+ .trigger {
126
+ transition: none;
127
+ }
128
+ }
@@ -13,7 +13,7 @@
13
13
  flex-shrink: 0;
14
14
  width: 100%;
15
15
  border: none;
16
- border-bottom: 1px solid var(--sv-color-border);
16
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
17
17
  background: transparent;
18
18
  color: var(--sv-color-text-primary);
19
19
  font: inherit;
@@ -78,3 +78,9 @@
78
78
  font-size: var(--sv-font-size-sm);
79
79
  text-align: center;
80
80
  }
81
+
82
+ .input:focus-visible,
83
+ .item:focus-visible {
84
+ outline: 2px solid var(--sv-color-focus-ring);
85
+ outline-offset: -2px;
86
+ }
@@ -41,7 +41,7 @@
41
41
  font-size: var(--sv-font-size-xs);
42
42
  color: var(--sv-color-error-text);
43
43
  padding: var(--sv-space-2) var(--sv-space-3);
44
- border: 1px solid var(--sv-color-error-border);
44
+ border: var(--sv-border-width-hairline) solid var(--sv-color-error-border);
45
45
  border-radius: var(--sv-radius-sm);
46
46
  background-color: var(--sv-color-error-surface);
47
47
  }
@@ -70,7 +70,7 @@
70
70
  Button). Matches Button's md padding, updated alongside it (10px,
71
71
  36px rendered height). */
72
72
  padding: 10px var(--sv-space-4);
73
- border: 1px solid transparent;
73
+ border: var(--sv-border-width-hairline) solid transparent;
74
74
  border-radius: var(--sv-radius-md);
75
75
  font-family: var(--sv-font-family);
76
76
  font-size: var(--sv-font-size-sm);
@@ -111,3 +111,9 @@
111
111
  opacity: 0.5;
112
112
  cursor: not-allowed;
113
113
  }
114
+
115
+ @media (prefers-reduced-motion: reduce) {
116
+ .destructiveConfirm {
117
+ transition: none;
118
+ }
119
+ }
@@ -0,0 +1,21 @@
1
+ .root {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--sv-space-2);
5
+ }
6
+
7
+ .title {
8
+ font-size: var(--sv-font-size-sm);
9
+ color: var(--sv-color-text-primary);
10
+ }
11
+
12
+ .description {
13
+ font-size: var(--sv-font-size-sm);
14
+ color: var(--sv-color-text-muted);
15
+ }
16
+
17
+ .actions {
18
+ display: flex;
19
+ gap: var(--sv-space-2);
20
+ margin-top: var(--sv-space-1);
21
+ }
@@ -17,7 +17,7 @@
17
17
  line-height: 1.5;
18
18
  color: var(--sv-color-text-primary);
19
19
  background-color: var(--sv-color-surface);
20
- border: 1px solid var(--sv-color-border-strong);
20
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
21
21
  border-radius: var(--sv-radius-md);
22
22
  cursor: pointer;
23
23
  transition:
@@ -59,3 +59,9 @@
59
59
  padding: var(--sv-space-4);
60
60
  padding-bottom: max(var(--sv-space-4), env(safe-area-inset-bottom));
61
61
  }
62
+
63
+ @media (prefers-reduced-motion: reduce) {
64
+ .trigger {
65
+ transition: none;
66
+ }
67
+ }
@@ -1,13 +1,31 @@
1
1
  /* Dialog — scrim + centered panel. Tokens only (z-index is structural, not a
2
2
  * theming value, so it has no token).
3
3
  *
4
- * Each size is a FIXED box (width AND height) — the panel never grows or
5
- * shrinks with its content, so switching views inside it (e.g. overlay-plugin
6
- * tabs) keeps the dialog the exact same size. Overflow scrolls inside `.content`
7
- * while the panel and its close button stay put. The scrim's padding is the
8
- * fixed margin `lg` leaves around the viewport; `sm`/`md` are centered and cap
9
- * to that available space on short screens. On mobile every size becomes a
10
- * full-screen sheet.
4
+ * `sm`/`md` are a fixed WIDTH but a content-driven height, capped at a
5
+ * per-size max-height: the panel grows to fit its content and shrinks when
6
+ * content is sparse, only hitting the cap (and scrolling internally, inside
7
+ * `.content`) once content actually exceeds it. Before this, height was
8
+ * fixed too, which left short-content consumers (e.g. a two-field form in
9
+ * the Console) looking like a near-empty
10
+ * skeleton — see docs/architecture-rules.md. `auto` goes further — content-
11
+ * driven on BOTH width and height, each independently capped rather than
12
+ * either being fixed — for content whose natural footprint varies enough
13
+ * (a card detail modal with an optional checklist/comments section) that a
14
+ * single fixed width doesn't fit it well either short or long. `lg` is a
15
+ * true fixed box (100%/100% of the scrim's available area) — no current
16
+ * overlay-shell plugin renders into it (Console did until workstream 0022
17
+ * moved it to `shell: "default"`; Account never resized off `overlaySize:
18
+ * "lg"`'s original default until epic task 14.5, see `fixed` below).
19
+ * `fixed` (named after its own behavior, not after this file's always-
20
+ * applied `.panel` wrapper class below) is also a true fixed box, width
21
+ * AND height both set — same "content never resizes it" guarantee as `lg`
22
+ * — but capped rather than filling the viewport, for a plugin whose
23
+ * settings-panel-shaped content doesn't warrant `lg`'s full-screen footprint
24
+ * (Account's own case, epic task 14.5 round 3). The close button stays
25
+ * pinned top-right regardless. The scrim's padding is the fixed margin
26
+ * `lg`/`fixed` leave around the viewport; `sm`/`md`/`auto` are centered and
27
+ * cap to that available space on short screens too. On mobile every size
28
+ * becomes a full-screen sheet.
11
29
  *
12
30
  * `--sv-dialog-inset-left` lets a host inset the scrim past a fixed left nav
13
31
  * rail (e.g. the platform sidebar) so the overlay's left margin is measured
@@ -50,7 +68,7 @@
50
68
  overflow: hidden;
51
69
  background: var(--sv-color-surface-raised);
52
70
  color: var(--sv-color-text-primary);
53
- border: 1px solid var(--sv-color-border);
71
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
54
72
  border-radius: var(--sv-radius-lg);
55
73
  box-shadow: var(--sv-shadow-overlay);
56
74
  /* Desktop entrance: fade + gentle scale-up. Same two-phase-mount pattern as
@@ -86,7 +104,21 @@
86
104
  flex: 1 1 auto;
87
105
  overflow-y: auto;
88
106
  overflow-x: hidden;
107
+ /* Same slim, token-colored scrollbar as `ScrollArea`/`MessageScroller` —
108
+ without this, a `sm`/`md` dialog whose content exceeds its max-height
109
+ cap (e.g. on a short viewport where the cap itself shrinks to fit) gets
110
+ the browser's default OS scrollbar, which on non-overlay-scrollbar
111
+ platforms is wide enough to visually cut into `.panel`'s rounded
112
+ corner right where `.content` starts, reading as a layout bug rather
113
+ than an intentional scroll affordance. */
114
+ scrollbar-width: thin;
115
+ scrollbar-color: var(--sv-color-border-strong) transparent;
89
116
  padding: var(--sv-space-6);
117
+ /* This region already supplies the page gutter, so a PageContainer rendered
118
+ inside it stands its own down (see PageContainer.module.css). Without
119
+ this, an overlay plugin — one page tree rendered into both the Dialog and
120
+ the full-page shell fallback — would be padded twice here. */
121
+ --sv-page-gutter: 0px;
90
122
  /* Disable elastic overscroll within the dialog: `none` stops both scroll-
91
123
  chaining to the parent and the iOS rubber-band bounce inside the panel.
92
124
  `contain` only prevents chaining — the panel itself still bounces, which
@@ -96,33 +128,94 @@
96
128
  overscroll-behavior: none;
97
129
  }
98
130
 
99
- /* Fixed sizes. `max-*: 100%` caps to the scrim's content box (viewport minus
100
- * margin) so a size never overflows a small viewport. */
131
+ .content::-webkit-scrollbar {
132
+ width: 8px;
133
+ }
134
+
135
+ .content::-webkit-scrollbar-track {
136
+ background: transparent;
137
+ }
138
+
139
+ .content::-webkit-scrollbar-thumb {
140
+ background: var(--sv-color-border-strong);
141
+ border-radius: var(--sv-radius-full);
142
+ }
143
+
144
+ /* `sm`/`md`: fixed width, content-driven height up to the size's own cap
145
+ * (28rem/42rem — the box's old fixed heights, now a ceiling rather than a
146
+ * floor). `min(<cap>, 100%)` also still caps to the scrim's content box
147
+ * (viewport minus margin) so a size never overflows a short viewport. No
148
+ * explicit `height` — the panel's flex column sizes to `.content`'s natural
149
+ * height on its own; see the file-level comment above. */
101
150
  .sm {
102
151
  width: 24rem;
103
- height: 28rem;
104
152
  max-width: 100%;
105
- max-height: 100%;
153
+ max-height: min(28rem, 100%);
106
154
  }
107
155
 
108
156
  .md {
109
157
  width: 36rem;
110
- height: 42rem;
111
158
  max-width: 100%;
112
- max-height: 100%;
159
+ max-height: min(42rem, 100%);
113
160
  }
114
161
 
115
- .lg,
116
- .full {
162
+ /* Content-driven on both axes, unlike `sm`/`md` (width fixed, only height
163
+ * content-driven) — for a dialog whose natural footprint varies a lot (a
164
+ * card detail modal with labels/due-date/assignees/description/checklist/
165
+ * comments, the case that originally motivated the now-removed `xl` size
166
+ * this replaces). `width: fit-content` shrink-wraps to the panel's own
167
+ * content (bounded by min/max-width below) the same way a flex item
168
+ * centered in `.scrim` naturally would with no explicit `width` at all —
169
+ * `min-width` just keeps sparse content (e.g. a short message) from reading
170
+ * as an oddly narrow sliver. Caps chosen to span roughly what `sm`/`xl`
171
+ * used to cover between them. */
172
+ .auto {
173
+ width: fit-content;
174
+ min-width: min(24rem, 100%);
175
+ max-width: min(48rem, 100%);
176
+ max-height: min(48rem, 100%);
177
+ }
178
+
179
+ /* `lg`: a true fixed box, unaffected by the above — see the file-level
180
+ * comment. */
181
+ .lg {
117
182
  width: 100%;
118
183
  height: 100%;
119
184
  }
120
185
 
186
+ /* `fixed`: also a true fixed box (width AND height both set, like `lg`) but
187
+ * capped rather than filling the viewport — see the file-level comment.
188
+ * Named distinctly from the dialog's own always-applied `.panel` wrapper
189
+ * class above (every size gets `styles.panel` + `styles[size]` together —
190
+ * see Dialog.tsx) to avoid colliding with it. `max-width`/`max-height` are
191
+ * still needed despite `width`/`height` being fixed rem values, exactly
192
+ * like `sm`/`md`'s own `max-width: 100%` — a short or narrow viewport (a
193
+ * resized desktop window, not yet at the mobile breakpoint) must still be
194
+ * able to shrink this below its rem values instead of overflowing the
195
+ * scrim. */
196
+ .fixed {
197
+ width: 64rem;
198
+ max-width: 100%;
199
+ height: 44rem;
200
+ max-height: 100%;
201
+ }
202
+
121
203
  .close {
122
204
  position: absolute;
123
205
  top: var(--sv-space-3);
124
206
  right: var(--sv-space-3);
125
- z-index: 1;
207
+ /* 2, not 1: a plugin's own sticky in-body header (e.g. a card detail
208
+ modal's title row) needs to paint above ordinary scrolling content, so
209
+ it sits at z-index: 1 — if `.close` also sat at 1, tree order would
210
+ decide the tie, and `.close` (rendered earlier in this component's own
211
+ JSX, before `.content` and everything a plugin nests inside it) would
212
+ lose to the plugin's later-in-tree header, disappearing underneath it
213
+ once they overlap on scroll. 2 keeps `.close` unambiguously on top
214
+ without relying on a tie-break plugin authors have no visibility into.
215
+ Found live in `sovereign-plugin-kanban`'s card detail modal — see that
216
+ repo's `kanban.module.css` `.cardHeader` comment for the matching half
217
+ of this fix and the Popover-stacking bug that motivated it. */
218
+ z-index: 2;
126
219
  display: inline-flex;
127
220
  align-items: center;
128
221
  justify-content: center;
@@ -132,8 +225,6 @@
132
225
  border-radius: var(--sv-radius-md);
133
226
  background: transparent;
134
227
  color: var(--sv-color-text-muted);
135
- font-size: var(--sv-font-size-xl);
136
- line-height: 1;
137
228
  cursor: pointer;
138
229
  }
139
230
 
@@ -151,11 +242,27 @@
151
242
 
152
243
  /* Hidden on desktop; shown only on mobile where it replaces the close button.
153
244
  * OverlayHeader owns its own background/border/padding — this wrapper class
154
- * only toggles visibility per breakpoint. */
245
+ * only toggles visibility per breakpoint. Not used at all when the `header`
246
+ * prop is active — that OverlayHeader instance renders with no wrapper
247
+ * class, so it shows unconditionally on both breakpoints (see Dialog.tsx). */
155
248
  .mobileHeader {
156
249
  display: none;
157
250
  }
158
251
 
252
+ /* The optional `footer` prop's row — shown on both desktop and mobile (no
253
+ * breakpoint gating, unlike `.mobileHeader`), a flex sibling after `.content`
254
+ * so it never scrolls, mirroring OverlayHeader's own `.header`/`.row`
255
+ * treatment (border on the opposite edge, same padding scale) so header and
256
+ * footer read as a matched pair when both are present. Layout-agnostic
257
+ * beyond that — the footer's own content decides its internal arrangement
258
+ * (e.g. a flex row with `justify-content: flex-end` for action buttons). */
259
+ .footer {
260
+ flex-shrink: 0;
261
+ background: var(--sv-color-surface);
262
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
263
+ padding: var(--sv-space-3) var(--sv-space-4);
264
+ }
265
+
159
266
  /* Mobile: full-screen sheet (RFC 0001 §3, breakpoint unified to 768px per
160
267
  * RFC 0013). Every size fills the scrim's available area (which is already
161
268
  * inset from the top by --sv-dialog-inset-top when a fixed header is shown).
@@ -177,9 +284,11 @@
177
284
  .sm,
178
285
  .md,
179
286
  .lg,
180
- .full {
287
+ .auto,
288
+ .fixed {
181
289
  width: 100%;
182
290
  height: 100%;
291
+ min-width: 0;
183
292
  max-width: none;
184
293
  max-height: none;
185
294
  border: none;
@@ -55,3 +55,9 @@
55
55
  .dragging {
56
56
  opacity: 0.5;
57
57
  }
58
+
59
+ @media (prefers-reduced-motion: reduce) {
60
+ .handle {
61
+ transition: none;
62
+ }
63
+ }
@@ -7,8 +7,10 @@
7
7
  .scrim {
8
8
  position: fixed;
9
9
  inset: 0;
10
- /* When the shell declares --sv-shell-footer-height (mobile nav bar), stop the
11
- scrim above the footer so the panel never hides behind it. */
10
+ /* When --sv-shell-footer-height is set (mobile nav bar — by the platform
11
+ shell, or by a self-rendered MobileFooter via usePublishShellChromeHeight
12
+ for a shellConfig.mobileFooter: false plugin), stop the scrim above the
13
+ footer so the panel never hides behind it. */
12
14
  bottom: var(--sv-shell-footer-height, 0);
13
15
  z-index: 100;
14
16
  display: flex;
@@ -27,14 +29,21 @@
27
29
  .panel {
28
30
  width: 100%;
29
31
  max-height: 80dvh;
30
- overflow-y: auto;
31
- overscroll-behavior: contain;
32
+ /* The panel itself no longer scrolls — see .body below. display: flex
33
+ (column) lets .handle (and OverlayHeader, when title is set) stay
34
+ fixed while .body's own overflow-y handles content taller than the
35
+ 80dvh cap, the same fixed-header/scrollable-body split Sheet.module.css
36
+ already establishes (its .panel/.content pair). Before this, the whole
37
+ .panel scrolled as one block, so a tall drawer (e.g. many installed
38
+ plugins in the Apps grid) scrolled the grab handle itself out of view
39
+ along with the content — reachable in the DOM, invisible on screen. */
40
+ display: flex;
41
+ flex-direction: column;
42
+ overflow: hidden;
32
43
  background: var(--sv-color-surface-raised);
33
- border-top: 1px solid var(--sv-color-border);
44
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
34
45
  border-radius: var(--sv-radius-3xl) var(--sv-radius-3xl) 0 0;
35
46
  box-shadow: var(--sv-shadow-overlay);
36
- /* Pull content above the home indicator / bottom bar in standalone mode. */
37
- padding-bottom: env(safe-area-inset-bottom);
38
47
  outline: none;
39
48
  /* Slide up from below the viewport. Always a bottom sheet, so unlike Dialog
40
49
  there's no desktop-vs-mobile fork here. */
@@ -42,6 +51,26 @@
42
51
  transition: transform var(--sv-motion-duration-base) var(--sv-motion-ease-out);
43
52
  }
44
53
 
54
+ /* The scroll container — everything below the fixed handle/OverlayHeader.
55
+ Scrollbar hidden (not overflow removed) the same way Tabs.module.css's
56
+ .tablist already does for this design system; scroll-driven UI here reads
57
+ as a native swipe list, not a document needing a visible scroll affordance. */
58
+ .body {
59
+ flex: 1 1 auto;
60
+ min-height: 0;
61
+ overflow-y: auto;
62
+ overscroll-behavior: contain;
63
+ scrollbar-width: none;
64
+ /* Pull content above the home indicator / bottom bar in standalone mode —
65
+ moved here from .panel now that this is the element whose bottom edge
66
+ is the actual scrollable content boundary. */
67
+ padding-bottom: env(safe-area-inset-bottom);
68
+ }
69
+
70
+ .body::-webkit-scrollbar {
71
+ display: none;
72
+ }
73
+
45
74
  .panelOpen {
46
75
  transform: translateY(0);
47
76
  }
@@ -1,4 +1,5 @@
1
1
  .dropzone {
2
+ position: relative;
2
3
  display: flex;
3
4
  align-items: center;
4
5
  gap: var(--sv-space-4);
@@ -58,6 +59,29 @@
58
59
  color: var(--sv-color-text-muted);
59
60
  }
60
61
 
62
+ /* Hidden to the eye and not to the keyboard: `display: none` would take the input out of the tab order, and the dropzone with
63
+ it. The label around it is the visible control, and shows the focus ring above. */
61
64
  .hiddenInput {
62
- display: none;
65
+ position: absolute;
66
+ width: 1px;
67
+ height: 1px;
68
+ margin: -1px;
69
+ padding: 0;
70
+ overflow: hidden;
71
+ clip-path: inset(50%);
72
+ white-space: nowrap;
73
+ border: 0;
74
+ opacity: 0;
75
+ pointer-events: none;
76
+ }
77
+
78
+ .dropzone:has(.hiddenInput:focus-visible) {
79
+ outline: 2px solid var(--sv-color-focus-ring);
80
+ outline-offset: 2px;
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .dropzone {
85
+ transition: none;
86
+ }
63
87
  }
@@ -0,0 +1,68 @@
1
+ .header {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: space-between;
5
+ min-height: 48px;
6
+ padding: var(--sv-space-2) var(--sv-space-4);
7
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
8
+ background-color: var(--sv-color-surface);
9
+ }
10
+
11
+ .left {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--sv-space-2);
15
+ min-width: 0;
16
+ }
17
+
18
+ .right {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--sv-space-1);
22
+ flex-shrink: 0;
23
+ }
24
+
25
+ .brandBadge {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ flex-shrink: 0;
30
+ width: 28px;
31
+ height: 28px;
32
+ border-radius: var(--sv-radius-md);
33
+ background-color: var(--sv-color-accent);
34
+ color: var(--sv-color-text-on-accent);
35
+ font-size: var(--sv-font-size-xs);
36
+ font-weight: var(--sv-font-weight-semibold);
37
+ text-decoration: none;
38
+ overflow: hidden;
39
+ }
40
+
41
+ .brandLogoImg {
42
+ width: 100%;
43
+ height: 100%;
44
+ object-fit: cover;
45
+ }
46
+
47
+ .plugin {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: var(--sv-space-1);
51
+ min-width: 0;
52
+ text-decoration: none;
53
+ color: var(--sv-color-text-primary);
54
+ }
55
+
56
+ .pluginName {
57
+ font-size: var(--sv-font-size-md);
58
+ font-weight: var(--sv-font-weight-semibold);
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ white-space: nowrap;
62
+ }
63
+
64
+ .brandBadge:focus-visible,
65
+ .plugin:focus-visible {
66
+ outline: 2px solid var(--sv-color-focus-ring);
67
+ outline-offset: 2px;
68
+ }
@@ -0,0 +1,21 @@
1
+ .shell {
2
+ display: flex;
3
+ flex-direction: column;
4
+ height: 100%;
5
+ }
6
+
7
+ .header {
8
+ flex-shrink: 0;
9
+ overflow: hidden;
10
+ }
11
+
12
+ .main {
13
+ flex: 1;
14
+ min-height: 0;
15
+ overflow-y: auto;
16
+ }
17
+
18
+ .footer {
19
+ flex-shrink: 0;
20
+ overflow: hidden;
21
+ }