@sovereignfs/ui 0.83.1 → 0.89.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/LICENSE +373 -661
  2. package/NOTICE +8 -0
  3. package/README.md +4 -6
  4. package/dist/AppsLauncher.module.css +6 -0
  5. package/dist/Button.module.css +5 -0
  6. package/dist/Card.module.css +6 -0
  7. package/dist/CardTile.module.css +6 -0
  8. package/dist/CheckableListRow.module.css +8 -0
  9. package/dist/Checkbox.module.css +8 -0
  10. package/dist/CodeTextarea.module.css +6 -0
  11. package/dist/ColorPicker.module.css +6 -0
  12. package/dist/Combobox.module.css +6 -0
  13. package/dist/Command.module.css +6 -0
  14. package/dist/ConfirmDialog.module.css +6 -0
  15. package/dist/DatePicker.module.css +6 -0
  16. package/dist/Dialog.module.css +1 -1
  17. package/dist/DragHandleRow.module.css +6 -0
  18. package/dist/FileDropzone.module.css +25 -1
  19. package/dist/Header.module.css +6 -0
  20. package/dist/IconPicker.module.css +14 -4
  21. package/dist/Input.module.css +6 -0
  22. package/dist/LegalLinks.module.css +9 -2
  23. package/dist/Markdown.module.css +5 -0
  24. package/dist/Message.module.css +9 -0
  25. package/dist/MobileAppsDrawer.module.css +9 -5
  26. package/dist/MobileFooter.module.css +6 -0
  27. package/dist/NavList.module.css +11 -2
  28. package/dist/NavTabs.module.css +7 -1
  29. package/dist/NotificationsPanel.module.css +10 -0
  30. package/dist/QrCode.module.css +17 -0
  31. package/dist/QuantityStepper.module.css +4 -2
  32. package/dist/RadioGroup.module.css +6 -0
  33. package/dist/SegmentedControl.module.css +6 -0
  34. package/dist/Select.module.css +6 -0
  35. package/dist/Sheet.module.css +16 -1
  36. package/dist/SplitPane.module.css +1 -1
  37. package/dist/StepStrip.module.css +5 -3
  38. package/dist/SuggestionInput.module.css +12 -1
  39. package/dist/SwipableMobileCarouselDots.module.css +6 -0
  40. package/dist/SystemBanner.module.css +6 -0
  41. package/dist/Tabs.module.css +6 -0
  42. package/dist/TagInput.module.css +6 -0
  43. package/dist/Textarea.module.css +6 -0
  44. package/dist/Toast.module.css +5 -0
  45. package/dist/Toggle.module.css +7 -0
  46. package/dist/Tooltip.module.css +6 -0
  47. package/dist/UserMenu.module.css +5 -0
  48. package/dist/fonts/OFL.txt +93 -0
  49. package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
  50. package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
  51. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  52. package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
  53. package/dist/index.d.ts +121 -43
  54. package/dist/index.js +1410 -1152
  55. package/dist/tokens/fonts.css +53 -0
  56. package/dist/tokens/primitives.css +12 -12
  57. package/dist/tokens.css +2 -1
  58. package/package.json +24 -13
  59. package/src/__tests__/motion.test.tsx +0 -105
  60. package/src/__tests__/package-json.test.ts +0 -8
  61. package/src/components/Accordion/Accordion.module.css +0 -3
  62. package/src/components/Accordion/Accordion.stories.tsx +0 -110
  63. package/src/components/Accordion/Accordion.tsx +0 -53
  64. package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
  65. package/src/components/Alert/Alert.module.css +0 -62
  66. package/src/components/Alert/Alert.stories.tsx +0 -96
  67. package/src/components/Alert/Alert.tsx +0 -58
  68. package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
  69. package/src/components/AppsLauncher/AppsLauncher.module.css +0 -96
  70. package/src/components/AppsLauncher/AppsLauncher.stories.tsx +0 -58
  71. package/src/components/AppsLauncher/AppsLauncher.tsx +0 -117
  72. package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +0 -52
  73. package/src/components/AspectRatio/AspectRatio.module.css +0 -15
  74. package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
  75. package/src/components/AspectRatio/AspectRatio.tsx +0 -21
  76. package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
  77. package/src/components/Avatar/Avatar.module.css +0 -38
  78. package/src/components/Avatar/Avatar.tsx +0 -42
  79. package/src/components/Badge/Badge.module.css +0 -177
  80. package/src/components/Badge/Badge.stories.tsx +0 -238
  81. package/src/components/Badge/Badge.tsx +0 -84
  82. package/src/components/Badge/__tests__/Badge.test.tsx +0 -90
  83. package/src/components/BalanceChip/BalanceChip.module.css +0 -32
  84. package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
  85. package/src/components/BalanceChip/BalanceChip.tsx +0 -33
  86. package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
  87. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
  88. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
  89. package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
  90. package/src/components/Button/Button.module.css +0 -169
  91. package/src/components/Button/Button.stories.tsx +0 -83
  92. package/src/components/Button/Button.tsx +0 -52
  93. package/src/components/Button/__tests__/Button.test.tsx +0 -66
  94. package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
  95. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
  96. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
  97. package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
  98. package/src/components/Calendar/Calendar.module.css +0 -126
  99. package/src/components/Calendar/Calendar.tsx +0 -213
  100. package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
  101. package/src/components/Calendar/dateUtils.ts +0 -97
  102. package/src/components/Card/Card.module.css +0 -42
  103. package/src/components/Card/Card.tsx +0 -34
  104. package/src/components/CardTile/CardTile.module.css +0 -181
  105. package/src/components/CardTile/CardTile.stories.tsx +0 -86
  106. package/src/components/CardTile/CardTile.tsx +0 -128
  107. package/src/components/CardTile/__tests__/CardTile.test.tsx +0 -56
  108. package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
  109. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
  110. package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
  111. package/src/components/Checkbox/Checkbox.module.css +0 -111
  112. package/src/components/Checkbox/Checkbox.tsx +0 -78
  113. package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
  114. package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
  115. package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
  116. package/src/components/Collapsible/Collapsible.module.css +0 -70
  117. package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
  118. package/src/components/Collapsible/Collapsible.tsx +0 -66
  119. package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
  120. package/src/components/ColorPicker/ColorPicker.module.css +0 -132
  121. package/src/components/ColorPicker/ColorPicker.stories.tsx +0 -80
  122. package/src/components/ColorPicker/ColorPicker.tsx +0 -157
  123. package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +0 -117
  124. package/src/components/Combobox/Combobox.module.css +0 -122
  125. package/src/components/Combobox/Combobox.stories.tsx +0 -79
  126. package/src/components/Combobox/Combobox.tsx +0 -186
  127. package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
  128. package/src/components/Command/Command.module.css +0 -80
  129. package/src/components/Command/Command.stories.tsx +0 -104
  130. package/src/components/Command/Command.tsx +0 -168
  131. package/src/components/Command/__tests__/Command.test.tsx +0 -162
  132. package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
  133. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -150
  134. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -214
  135. package/src/components/ConsentPrompt/ConsentPrompt.module.css +0 -21
  136. package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +0 -31
  137. package/src/components/ConsentPrompt/ConsentPrompt.tsx +0 -66
  138. package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
  139. package/src/components/ContextMenu/ContextMenu.tsx +0 -100
  140. package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
  141. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
  142. package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
  143. package/src/components/DataTable/DataTable.module.css +0 -28
  144. package/src/components/DataTable/DataTable.stories.tsx +0 -74
  145. package/src/components/DataTable/DataTable.tsx +0 -154
  146. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
  147. package/src/components/DatePicker/DatePicker.module.css +0 -61
  148. package/src/components/DatePicker/DatePicker.tsx +0 -103
  149. package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
  150. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
  151. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
  152. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
  153. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
  154. package/src/components/Dialog/Dialog.module.css +0 -335
  155. package/src/components/Dialog/Dialog.stories.tsx +0 -324
  156. package/src/components/Dialog/Dialog.tsx +0 -254
  157. package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -318
  158. package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
  159. package/src/components/DragHandleRow/DragHandleRow.tsx +0 -42
  160. package/src/components/Drawer/Drawer.module.css +0 -121
  161. package/src/components/Drawer/Drawer.stories.tsx +0 -132
  162. package/src/components/Drawer/Drawer.tsx +0 -175
  163. package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -226
  164. package/src/components/EmptyState/EmptyState.module.css +0 -27
  165. package/src/components/EmptyState/EmptyState.tsx +0 -27
  166. package/src/components/FileDropzone/FileDropzone.module.css +0 -63
  167. package/src/components/FileDropzone/FileDropzone.tsx +0 -109
  168. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
  169. package/src/components/FormField/FormField.module.css +0 -33
  170. package/src/components/FormField/FormField.tsx +0 -78
  171. package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
  172. package/src/components/GripIcon/GripIcon.tsx +0 -27
  173. package/src/components/Header/Header.module.css +0 -62
  174. package/src/components/Header/Header.stories.tsx +0 -452
  175. package/src/components/Header/Header.tsx +0 -102
  176. package/src/components/Header/__tests__/Header.test.tsx +0 -104
  177. package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +0 -21
  178. package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +0 -111
  179. package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +0 -54
  180. package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +0 -58
  181. package/src/components/HoverCard/HoverCard.module.css +0 -3
  182. package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
  183. package/src/components/HoverCard/HoverCard.tsx +0 -111
  184. package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
  185. package/src/components/Icon/Icon.module.css +0 -27
  186. package/src/components/Icon/Icon.stories.tsx +0 -95
  187. package/src/components/Icon/Icon.tsx +0 -43
  188. package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
  189. package/src/components/Icon/icons/activity.tsx +0 -20
  190. package/src/components/Icon/icons/alert-triangle.tsx +0 -22
  191. package/src/components/Icon/icons/apple.tsx +0 -21
  192. package/src/components/Icon/icons/arrow-left-right.tsx +0 -23
  193. package/src/components/Icon/icons/banana.tsx +0 -21
  194. package/src/components/Icon/icons/beef.tsx +0 -22
  195. package/src/components/Icon/icons/beer.tsx +0 -24
  196. package/src/components/Icon/icons/bell.tsx +0 -21
  197. package/src/components/Icon/icons/bold.tsx +0 -20
  198. package/src/components/Icon/icons/calendar.tsx +0 -23
  199. package/src/components/Icon/icons/candy.tsx +0 -24
  200. package/src/components/Icon/icons/carrot.tsx +0 -22
  201. package/src/components/Icon/icons/check.tsx +0 -20
  202. package/src/components/Icon/icons/chevron-down.tsx +0 -20
  203. package/src/components/Icon/icons/chevron-left.tsx +0 -20
  204. package/src/components/Icon/icons/chevron-right.tsx +0 -20
  205. package/src/components/Icon/icons/chevron-up.tsx +0 -20
  206. package/src/components/Icon/icons/circle-check.tsx +0 -21
  207. package/src/components/Icon/icons/circle-chevron-left.tsx +0 -21
  208. package/src/components/Icon/icons/circle-x.tsx +0 -22
  209. package/src/components/Icon/icons/code.tsx +0 -21
  210. package/src/components/Icon/icons/coffee.tsx +0 -23
  211. package/src/components/Icon/icons/cookie.tsx +0 -25
  212. package/src/components/Icon/icons/copy.tsx +0 -21
  213. package/src/components/Icon/icons/credit-card.tsx +0 -21
  214. package/src/components/Icon/icons/croissant.tsx +0 -24
  215. package/src/components/Icon/icons/cup-soda.tsx +0 -23
  216. package/src/components/Icon/icons/database.tsx +0 -22
  217. package/src/components/Icon/icons/download.tsx +0 -22
  218. package/src/components/Icon/icons/drumstick.tsx +0 -21
  219. package/src/components/Icon/icons/egg.tsx +0 -20
  220. package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
  221. package/src/components/Icon/icons/external-link.tsx +0 -22
  222. package/src/components/Icon/icons/eye-off.tsx +0 -23
  223. package/src/components/Icon/icons/eye.tsx +0 -21
  224. package/src/components/Icon/icons/file-text.tsx +0 -24
  225. package/src/components/Icon/icons/file.tsx +0 -21
  226. package/src/components/Icon/icons/fish.tsx +0 -25
  227. package/src/components/Icon/icons/folder-closed.tsx +0 -21
  228. package/src/components/Icon/icons/folder-open.tsx +0 -20
  229. package/src/components/Icon/icons/folder.tsx +0 -20
  230. package/src/components/Icon/icons/folders.tsx +0 -21
  231. package/src/components/Icon/icons/grid-2x2.tsx +0 -22
  232. package/src/components/Icon/icons/hat-glasses.tsx +0 -24
  233. package/src/components/Icon/icons/history.tsx +0 -22
  234. package/src/components/Icon/icons/house.tsx +0 -21
  235. package/src/components/Icon/icons/inbox.tsx +0 -21
  236. package/src/components/Icon/icons/index.ts +0 -394
  237. package/src/components/Icon/icons/info.tsx +0 -22
  238. package/src/components/Icon/icons/italic.tsx +0 -22
  239. package/src/components/Icon/icons/layers.tsx +0 -22
  240. package/src/components/Icon/icons/layout-dashboard.tsx +0 -23
  241. package/src/components/Icon/icons/layout-grid.tsx +0 -23
  242. package/src/components/Icon/icons/link.tsx +0 -21
  243. package/src/components/Icon/icons/list-ordered.tsx +0 -25
  244. package/src/components/Icon/icons/list.tsx +0 -25
  245. package/src/components/Icon/icons/lock.tsx +0 -21
  246. package/src/components/Icon/icons/log-out.tsx +0 -22
  247. package/src/components/Icon/icons/luggage.tsx +0 -24
  248. package/src/components/Icon/icons/mail.tsx +0 -21
  249. package/src/components/Icon/icons/map-pin.tsx +0 -21
  250. package/src/components/Icon/icons/menu.tsx +0 -22
  251. package/src/components/Icon/icons/milk.tsx +0 -22
  252. package/src/components/Icon/icons/minus.tsx +0 -20
  253. package/src/components/Icon/icons/package.tsx +0 -23
  254. package/src/components/Icon/icons/paint-bucket.tsx +0 -23
  255. package/src/components/Icon/icons/panel-left.tsx +0 -21
  256. package/src/components/Icon/icons/pencil.tsx +0 -21
  257. package/src/components/Icon/icons/pin.tsx +0 -21
  258. package/src/components/Icon/icons/pizza.tsx +0 -24
  259. package/src/components/Icon/icons/plus.tsx +0 -21
  260. package/src/components/Icon/icons/rectangle-ellipsis.tsx +0 -23
  261. package/src/components/Icon/icons/refresh-cw.tsx +0 -23
  262. package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
  263. package/src/components/Icon/icons/rotate-cw.tsx +0 -21
  264. package/src/components/Icon/icons/route.tsx +0 -22
  265. package/src/components/Icon/icons/salad.tsx +0 -24
  266. package/src/components/Icon/icons/search.tsx +0 -21
  267. package/src/components/Icon/icons/send.tsx +0 -21
  268. package/src/components/Icon/icons/settings.tsx +0 -21
  269. package/src/components/Icon/icons/share-2.tsx +0 -24
  270. package/src/components/Icon/icons/sheet.tsx +0 -24
  271. package/src/components/Icon/icons/shield.tsx +0 -20
  272. package/src/components/Icon/icons/shopping-basket.tsx +0 -26
  273. package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
  274. package/src/components/Icon/icons/smartphone.tsx +0 -21
  275. package/src/components/Icon/icons/snowflake.tsx +0 -31
  276. package/src/components/Icon/icons/spray-can.tsx +0 -29
  277. package/src/components/Icon/icons/square-kanban.tsx +0 -23
  278. package/src/components/Icon/icons/table.tsx +0 -23
  279. package/src/components/Icon/icons/trash-2.tsx +0 -24
  280. package/src/components/Icon/icons/upload.tsx +0 -22
  281. package/src/components/Icon/icons/user-round-plus.tsx +0 -23
  282. package/src/components/Icon/icons/user.tsx +0 -21
  283. package/src/components/Icon/icons/users.tsx +0 -23
  284. package/src/components/Icon/icons/wine.tsx +0 -23
  285. package/src/components/Icon/icons/x.tsx +0 -21
  286. package/src/components/IconPicker/IconPicker.module.css +0 -63
  287. package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
  288. package/src/components/IconPicker/IconPicker.tsx +0 -90
  289. package/src/components/Input/Input.module.css +0 -52
  290. package/src/components/Input/Input.stories.tsx +0 -86
  291. package/src/components/Input/Input.tsx +0 -20
  292. package/src/components/Input/__tests__/Input.test.tsx +0 -22
  293. package/src/components/Item/Item.module.css +0 -70
  294. package/src/components/Item/Item.stories.tsx +0 -62
  295. package/src/components/Item/Item.tsx +0 -54
  296. package/src/components/Item/__tests__/Item.test.tsx +0 -39
  297. package/src/components/Kbd/Kbd.module.css +0 -14
  298. package/src/components/Kbd/Kbd.stories.tsx +0 -32
  299. package/src/components/Kbd/Kbd.tsx +0 -12
  300. package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
  301. package/src/components/Label/Label.module.css +0 -11
  302. package/src/components/Label/Label.stories.tsx +0 -40
  303. package/src/components/Label/Label.tsx +0 -24
  304. package/src/components/Label/__tests__/Label.test.tsx +0 -32
  305. package/src/components/LegalLinks/LegalLinks.module.css +0 -24
  306. package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
  307. package/src/components/LegalLinks/LegalLinks.tsx +0 -40
  308. package/src/components/Markdown/Markdown.module.css +0 -73
  309. package/src/components/Markdown/Markdown.stories.tsx +0 -40
  310. package/src/components/Markdown/Markdown.tsx +0 -305
  311. package/src/components/Markdown/__tests__/Markdown.test.tsx +0 -144
  312. package/src/components/Marker/Marker.module.css +0 -33
  313. package/src/components/Marker/Marker.stories.tsx +0 -39
  314. package/src/components/Marker/Marker.tsx +0 -34
  315. package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
  316. package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
  317. package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
  318. package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
  319. package/src/components/Menu/Menu.module.css +0 -90
  320. package/src/components/Menu/Menu.tsx +0 -209
  321. package/src/components/Menu/__tests__/Menu.test.tsx +0 -227
  322. package/src/components/Menubar/Menubar.stories.tsx +0 -52
  323. package/src/components/Menubar/Menubar.tsx +0 -42
  324. package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
  325. package/src/components/Message/Message.module.css +0 -99
  326. package/src/components/Message/Message.stories.tsx +0 -79
  327. package/src/components/Message/Message.tsx +0 -41
  328. package/src/components/Message/__tests__/Message.test.tsx +0 -46
  329. package/src/components/MessageScroller/MessageScroller.module.css +0 -65
  330. package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
  331. package/src/components/MessageScroller/MessageScroller.tsx +0 -84
  332. package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
  333. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -82
  334. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
  335. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
  336. package/src/components/MobileFooter/MobileFooter.module.css +0 -73
  337. package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
  338. package/src/components/MobileFooter/MobileFooter.tsx +0 -122
  339. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -129
  340. package/src/components/MobileHeader/MobileHeader.module.css +0 -76
  341. package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
  342. package/src/components/MobileHeader/MobileHeader.tsx +0 -90
  343. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -113
  344. package/src/components/NavList/NavList.module.css +0 -130
  345. package/src/components/NavList/NavList.tsx +0 -136
  346. package/src/components/NavList/__tests__/NavList.test.tsx +0 -109
  347. package/src/components/NavTabs/NavTabs.module.css +0 -50
  348. package/src/components/NavTabs/NavTabs.tsx +0 -61
  349. package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
  350. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
  351. package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
  352. package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
  353. package/src/components/NotificationsPanel/NotificationsPanel.module.css +0 -258
  354. package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +0 -61
  355. package/src/components/NotificationsPanel/NotificationsPanel.tsx +0 -187
  356. package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +0 -78
  357. package/src/components/OfflineGate/OfflineGate.tsx +0 -44
  358. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
  359. package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
  360. package/src/components/OverlayHeader/OverlayHeader.tsx +0 -77
  361. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -69
  362. package/src/components/PageContainer/PageContainer.module.css +0 -82
  363. package/src/components/PageContainer/PageContainer.tsx +0 -64
  364. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -70
  365. package/src/components/PageHeader/PageHeader.module.css +0 -86
  366. package/src/components/PageHeader/PageHeader.tsx +0 -176
  367. package/src/components/PageHeader/__tests__/PageHeader.test.tsx +0 -103
  368. package/src/components/PageLayout/PageLayout.module.css +0 -51
  369. package/src/components/PageLayout/PageLayout.stories.tsx +0 -73
  370. package/src/components/PageLayout/PageLayout.tsx +0 -51
  371. package/src/components/PageLayout/__tests__/PageLayout.test.tsx +0 -34
  372. package/src/components/Pagination/Pagination.module.css +0 -98
  373. package/src/components/Pagination/Pagination.stories.tsx +0 -49
  374. package/src/components/Pagination/Pagination.tsx +0 -87
  375. package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
  376. package/src/components/Popover/Popover.module.css +0 -74
  377. package/src/components/Popover/Popover.stories.tsx +0 -357
  378. package/src/components/Popover/Popover.tsx +0 -290
  379. package/src/components/Popover/__tests__/Popover.test.tsx +0 -263
  380. package/src/components/Progress/Progress.module.css +0 -20
  381. package/src/components/Progress/Progress.stories.tsx +0 -40
  382. package/src/components/Progress/Progress.tsx +0 -35
  383. package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
  384. package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
  385. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
  386. package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
  387. package/src/components/RadioGroup/RadioGroup.module.css +0 -88
  388. package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
  389. package/src/components/RadioGroup/RadioGroup.tsx +0 -99
  390. package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
  391. package/src/components/Resizable/Resizable.module.css +0 -70
  392. package/src/components/Resizable/Resizable.stories.tsx +0 -82
  393. package/src/components/Resizable/Resizable.tsx +0 -313
  394. package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
  395. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
  396. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
  397. package/src/components/RootLayout/RootLayout.module.css +0 -12
  398. package/src/components/RootLayout/RootLayout.stories.tsx +0 -125
  399. package/src/components/RootLayout/RootLayout.tsx +0 -185
  400. package/src/components/RootLayout/__tests__/RootLayout.test.tsx +0 -161
  401. package/src/components/ScrollArea/ScrollArea.module.css +0 -20
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
  403. package/src/components/ScrollArea/ScrollArea.tsx +0 -27
  404. package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
  405. package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
  406. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
  407. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
  408. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
  409. package/src/components/Select/Select.module.css +0 -82
  410. package/src/components/Select/Select.stories.tsx +0 -115
  411. package/src/components/Select/Select.tsx +0 -48
  412. package/src/components/Select/__tests__/Select.test.tsx +0 -59
  413. package/src/components/Sheet/Sheet.module.css +0 -58
  414. package/src/components/Sheet/Sheet.tsx +0 -109
  415. package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
  416. package/src/components/Slider/Slider.module.css +0 -95
  417. package/src/components/Slider/Slider.stories.tsx +0 -64
  418. package/src/components/Slider/Slider.tsx +0 -77
  419. package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
  420. package/src/components/Spinner/Spinner.module.css +0 -39
  421. package/src/components/Spinner/Spinner.tsx +0 -23
  422. package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
  423. package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
  424. package/src/components/SplitPane/SplitPane.module.css +0 -85
  425. package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
  426. package/src/components/SplitPane/SplitPane.tsx +0 -149
  427. package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
  428. package/src/components/StatusBadge/StatusBadge.module.css +0 -59
  429. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
  430. package/src/components/StatusBadge/StatusBadge.tsx +0 -65
  431. package/src/components/StepStrip/StepStrip.module.css +0 -53
  432. package/src/components/StepStrip/StepStrip.tsx +0 -74
  433. package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
  434. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
  435. package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
  436. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -64
  437. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -243
  438. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
  439. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
  440. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
  441. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
  442. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
  443. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -214
  444. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
  445. package/src/components/SwipableMobileCarousel/context.ts +0 -13
  446. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -64
  447. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -73
  448. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
  449. package/src/components/SwipeStack/SwipeStack.module.css +0 -101
  450. package/src/components/SwipeStack/SwipeStack.tsx +0 -199
  451. package/src/components/SwipeStack/SwipeStackCard.tsx +0 -22
  452. package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +0 -169
  453. package/src/components/SystemBanner/SystemBanner.module.css +0 -79
  454. package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
  455. package/src/components/SystemBanner/SystemBanner.tsx +0 -50
  456. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
  457. package/src/components/Table/Table.module.css +0 -45
  458. package/src/components/Table/Table.stories.tsx +0 -125
  459. package/src/components/Table/Table.tsx +0 -51
  460. package/src/components/Table/__tests__/Table.test.tsx +0 -50
  461. package/src/components/Tabs/Tabs.module.css +0 -56
  462. package/src/components/Tabs/Tabs.stories.tsx +0 -100
  463. package/src/components/Tabs/Tabs.tsx +0 -46
  464. package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
  465. package/src/components/TagInput/TagInput.module.css +0 -141
  466. package/src/components/TagInput/TagInput.stories.tsx +0 -109
  467. package/src/components/TagInput/TagInput.tsx +0 -174
  468. package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
  469. package/src/components/Textarea/Textarea.module.css +0 -47
  470. package/src/components/Textarea/Textarea.tsx +0 -38
  471. package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -51
  472. package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +0 -35
  473. package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +0 -152
  474. package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +0 -87
  475. package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +0 -78
  476. package/src/components/Toast/Toast.module.css +0 -191
  477. package/src/components/Toast/Toast.stories.tsx +0 -191
  478. package/src/components/Toast/Toast.tsx +0 -139
  479. package/src/components/Toggle/Toggle.module.css +0 -57
  480. package/src/components/Toggle/Toggle.stories.tsx +0 -95
  481. package/src/components/Toggle/Toggle.tsx +0 -39
  482. package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
  483. package/src/components/Tooltip/Tooltip.module.css +0 -56
  484. package/src/components/Tooltip/Tooltip.tsx +0 -30
  485. package/src/components/Typography/Typography.module.css +0 -47
  486. package/src/components/Typography/Typography.stories.tsx +0 -62
  487. package/src/components/Typography/Typography.tsx +0 -30
  488. package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
  489. package/src/components/UserMenu/UserMenu.module.css +0 -90
  490. package/src/components/UserMenu/UserMenu.stories.tsx +0 -49
  491. package/src/components/UserMenu/UserMenu.tsx +0 -132
  492. package/src/components/UserMenu/__tests__/UserMenu.test.tsx +0 -77
  493. package/src/css-modules.d.ts +0 -4
  494. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
  495. package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
  496. package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
  497. package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
  498. package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
  499. package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
  500. package/src/hooks/__tests__/usePublishShellChromeHeight.test.tsx +0 -118
  501. package/src/hooks/__tests__/useReorderSensors.test.ts +0 -26
  502. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
  503. package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -175
  504. package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
  505. package/src/hooks/__tests__/useSwipeStack.test.tsx +0 -155
  506. package/src/hooks/index.ts +0 -33
  507. package/src/hooks/useCarouselRouteSync.ts +0 -92
  508. package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
  509. package/src/hooks/useDoubleTap.ts +0 -91
  510. package/src/hooks/useIsMobile.ts +0 -33
  511. package/src/hooks/useIsOffline.ts +0 -41
  512. package/src/hooks/useLongPress.ts +0 -185
  513. package/src/hooks/useOfflineTileState.ts +0 -45
  514. package/src/hooks/usePublishShellChromeHeight.ts +0 -96
  515. package/src/hooks/useReorderSensors.ts +0 -88
  516. package/src/hooks/useResponsiveLayout.ts +0 -36
  517. package/src/hooks/useSnapCarousel.ts +0 -284
  518. package/src/hooks/useSwipeReveal.ts +0 -107
  519. package/src/hooks/useSwipeStack.ts +0 -235
  520. package/src/index.ts +0 -311
  521. package/src/motion.ts +0 -78
  522. package/src/overlay-shell.ts +0 -159
  523. package/src/scroll-lock.ts +0 -22
  524. package/src/stories/Avatar.stories.tsx +0 -44
  525. package/src/stories/Card.stories.tsx +0 -35
  526. package/src/stories/Checkbox.stories.tsx +0 -45
  527. package/src/stories/DesignSystemOverview.stories.tsx +0 -3793
  528. package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
  529. package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
  530. package/src/stories/DragHandleRow.stories.tsx +0 -41
  531. package/src/stories/EmptyState.stories.tsx +0 -33
  532. package/src/stories/FileDropzone.stories.tsx +0 -69
  533. package/src/stories/FormField.stories.tsx +0 -47
  534. package/src/stories/GripIcon.stories.tsx +0 -29
  535. package/src/stories/InteractionHooks.stories.tsx +0 -925
  536. package/src/stories/LayoutSystem.stories.tsx +0 -639
  537. package/src/stories/MenuEntries.stories.tsx +0 -86
  538. package/src/stories/MobilePatterns.stories.tsx +0 -1536
  539. package/src/stories/NavList.stories.tsx +0 -147
  540. package/src/stories/NavTabs.stories.tsx +0 -53
  541. package/src/stories/OfflineGate.stories.tsx +0 -42
  542. package/src/stories/PageContainer.stories.tsx +0 -82
  543. package/src/stories/PageHeader.stories.tsx +0 -95
  544. package/src/stories/ResponsiveSurface.stories.tsx +0 -47
  545. package/src/stories/Spinner.stories.tsx +0 -25
  546. package/src/stories/StepStrip.stories.tsx +0 -76
  547. package/src/stories/SwipableMobileCarousel.stories.tsx +0 -362
  548. package/src/stories/SwipeStack.stories.tsx +0 -200
  549. package/src/stories/Textarea.stories.tsx +0 -63
  550. package/src/stories/TokenGallery.stories.tsx +0 -652
  551. package/src/stories/Tooltip.stories.tsx +0 -59
  552. package/src/tokens/primitives.css +0 -168
  553. package/src/tokens/semantic.css +0 -162
  554. package/src/tokens/theme-presets.css +0 -33
  555. package/src/tokens/theme-presets.ts +0 -72
  556. package/src/tokens.css +0 -5
@@ -1,263 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { StrictMode, useState } from 'react';
3
- import { afterEach, describe, expect, it, vi } from 'vitest';
4
- import { cleanup, render, screen, fireEvent } from '@testing-library/react';
5
- import { Popover } from '../Popover';
6
-
7
- afterEach(cleanup);
8
-
9
- const trigger = <button type="button">Open</button>;
10
-
11
- describe('Popover', () => {
12
- it('renders the trigger element', () => {
13
- render(
14
- <Popover open={false} onClose={() => {}} aria-label="Menu" trigger={trigger}>
15
- Content
16
- </Popover>,
17
- );
18
- expect(screen.getByRole('button', { name: 'Open' })).toBeDefined();
19
- });
20
-
21
- it('does not render the panel when closed', () => {
22
- render(
23
- <Popover open={false} onClose={() => {}} aria-label="Menu" trigger={trigger}>
24
- Content
25
- </Popover>,
26
- );
27
- expect(screen.queryByRole('dialog')).toBeNull();
28
- });
29
-
30
- it('renders the panel with children when open', () => {
31
- render(
32
- <Popover open={true} onClose={() => {}} aria-label="Menu" trigger={trigger}>
33
- Panel content
34
- </Popover>,
35
- );
36
- expect(screen.getByRole('dialog', { name: 'Menu' })).toBeDefined();
37
- expect(screen.getByText('Panel content')).toBeDefined();
38
- });
39
-
40
- it('applies the right alignment class by default', () => {
41
- render(
42
- <Popover open={true} onClose={() => {}} aria-label="Menu" trigger={trigger}>
43
- Content
44
- </Popover>,
45
- );
46
- expect(screen.getByRole('dialog').className).toContain('right');
47
- });
48
-
49
- it('applies the left alignment class when specified', () => {
50
- render(
51
- <Popover open={true} onClose={() => {}} align="left" aria-label="Menu" trigger={trigger}>
52
- Content
53
- </Popover>,
54
- );
55
- expect(screen.getByRole('dialog').className).toContain('left');
56
- });
57
-
58
- it('calls onClose when Escape is pressed', () => {
59
- const onClose = vi.fn();
60
- render(
61
- <Popover open={true} onClose={onClose} aria-label="Menu" trigger={trigger}>
62
- Content
63
- </Popover>,
64
- );
65
- fireEvent.keyDown(document, { key: 'Escape' });
66
- expect(onClose).toHaveBeenCalledOnce();
67
- });
68
-
69
- it('calls onClose when clicking outside the container', () => {
70
- const onClose = vi.fn();
71
- render(
72
- <Popover open={true} onClose={onClose} aria-label="Menu" trigger={trigger}>
73
- Content
74
- </Popover>,
75
- );
76
- fireEvent.mouseDown(document.body);
77
- expect(onClose).toHaveBeenCalledOnce();
78
- });
79
-
80
- describe('Escape precedence with a nested Popover', () => {
81
- it('defers Escape to a nested open Popover instead of closing the outer one', () => {
82
- const outerOnClose = vi.fn();
83
-
84
- function NestedHarness() {
85
- // Starts closed and opens via a later click, matching the real
86
- // sequence (e.g. a date-picker Popover opened from a field inside a
87
- // Combobox's own popover content) — mounting both already-open in
88
- // the same initial render would instead have React fire the child's
89
- // registration effect before the parent's in that one shared commit,
90
- // the one case this stack-order approach doesn't handle (see the
91
- // equivalent Dialog+ConfirmDialog regression test's own note).
92
- const [innerOpen, setInnerOpen] = useState(false);
93
- return (
94
- <Popover open={true} onClose={outerOnClose} aria-label="Outer" trigger={trigger}>
95
- <button type="button" onClick={() => setInnerOpen(true)}>
96
- Open inner
97
- </button>
98
- <Popover
99
- open={innerOpen}
100
- onClose={() => setInnerOpen(false)}
101
- aria-label="Inner"
102
- trigger={<span />}
103
- >
104
- Inner content
105
- </Popover>
106
- </Popover>
107
- );
108
- }
109
-
110
- render(<NestedHarness />);
111
- fireEvent.click(screen.getByRole('button', { name: 'Open inner' }));
112
- expect(screen.getByRole('dialog', { name: 'Inner' })).toBeTruthy();
113
-
114
- // The nested Popover is topmost — the outer Popover's own Escape
115
- // listener must not act while it's open.
116
- fireEvent.keyDown(document, { key: 'Escape' });
117
- expect(outerOnClose).not.toHaveBeenCalled();
118
- expect(screen.queryByRole('dialog', { name: 'Inner' })).toBeNull();
119
-
120
- // With the inner one dismissed, the outer Popover is topmost again —
121
- // a second Escape now reaches it.
122
- fireEvent.keyDown(document, { key: 'Escape' });
123
- expect(outerOnClose).toHaveBeenCalledOnce();
124
- });
125
- });
126
-
127
- it('does not call onClose when clicking inside the panel', () => {
128
- const onClose = vi.fn();
129
- render(
130
- <Popover open={true} onClose={onClose} aria-label="Menu" trigger={trigger}>
131
- <button type="button">Inside</button>
132
- </Popover>,
133
- );
134
- fireEvent.mouseDown(screen.getByRole('button', { name: 'Inside' }));
135
- expect(onClose).not.toHaveBeenCalled();
136
- });
137
-
138
- it('applies the provided width as inline style', () => {
139
- render(
140
- <Popover open={true} onClose={() => {}} aria-label="Menu" width={320} trigger={trigger}>
141
- Content
142
- </Popover>,
143
- );
144
- expect((screen.getByRole('dialog') as HTMLElement).style.width).toBe('320px');
145
- });
146
-
147
- describe('horizontal viewport clamp', () => {
148
- const rect = (partial: Partial<DOMRect>): DOMRect =>
149
- ({
150
- top: 0,
151
- left: 0,
152
- right: 0,
153
- bottom: 0,
154
- width: 0,
155
- height: 0,
156
- x: 0,
157
- y: 0,
158
- toJSON() {},
159
- ...partial,
160
- }) as DOMRect;
161
-
162
- afterEach(() => {
163
- vi.restoreAllMocks();
164
- });
165
-
166
- it('shifts the panel back on-screen when align="right" would overflow the left edge', () => {
167
- // A 340px-wide panel right-aligned under a trigger sitting near the
168
- // right edge of a 375px viewport (e.g. a mobile header bell) — its
169
- // natural `right: 0` position runs off the left edge, mirroring the
170
- // real KanbanNotificationBell overflow found live-testing at 375px.
171
- Object.defineProperty(window, 'innerWidth', { value: 375, configurable: true });
172
- Object.defineProperty(window, 'innerHeight', { value: 800, configurable: true });
173
- const containerRect = rect({ left: 275, right: 319, top: 12, bottom: 56 });
174
- const panelRect = rect({
175
- left: -21,
176
- right: 319,
177
- top: 64,
178
- bottom: 200,
179
- width: 340,
180
- height: 136,
181
- });
182
- vi.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(function (
183
- this: Element,
184
- ) {
185
- return this.getAttribute('role') === 'dialog' ? panelRect : containerRect;
186
- });
187
-
188
- render(
189
- <Popover open={true} onClose={() => {}} aria-label="Menu" width={340} trigger={trigger}>
190
- Content
191
- </Popover>,
192
- );
193
-
194
- const panel = screen.getByRole('dialog') as HTMLElement;
195
- // containerRect.left (275) + style.left must land the panel's left
196
- // edge at the 4px viewport margin: 4 - 275 = -271.
197
- expect(panel.style.left).toBe('-271px');
198
- expect(panel.style.right).toBe('auto');
199
- });
200
-
201
- it('leaves alignment untouched when the panel already fits the viewport', () => {
202
- Object.defineProperty(window, 'innerWidth', { value: 1280, configurable: true });
203
- Object.defineProperty(window, 'innerHeight', { value: 800, configurable: true });
204
- const containerRect = rect({ left: 900, right: 944, top: 12, bottom: 56 });
205
- const panelRect = rect({
206
- left: 604,
207
- right: 944,
208
- top: 64,
209
- bottom: 200,
210
- width: 340,
211
- height: 136,
212
- });
213
- vi.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(function (
214
- this: Element,
215
- ) {
216
- return this.getAttribute('role') === 'dialog' ? panelRect : containerRect;
217
- });
218
-
219
- render(
220
- <Popover open={true} onClose={() => {}} aria-label="Menu" width={340} trigger={trigger}>
221
- Content
222
- </Popover>,
223
- );
224
-
225
- const panel = screen.getByRole('dialog') as HTMLElement;
226
- expect(panel.style.left).toBe('');
227
- expect(panel.style.right).toBe('');
228
- });
229
-
230
- it('stays clamped under StrictMode double-invoked layout effects', () => {
231
- // Regression test: an earlier version of this clamp measured the
232
- // panel's *current* `left`/`right` off the DOM to decide whether a
233
- // correction was needed. That's not idempotent — StrictMode's dev-only
234
- // double-invoke of layout effects re-ran the same measurement against
235
- // the panel's own just-applied correction, saw a rect that already
236
- // looked fine, and reset `horizontalOffset` back to null before first
237
- // paint (found live: the panel visibly overflowed again after HMR).
238
- // The fix derives the natural position analytically from `containerRect`
239
- // instead, which StrictMode's replay can't perturb.
240
- Object.defineProperty(window, 'innerWidth', { value: 375, configurable: true });
241
- Object.defineProperty(window, 'innerHeight', { value: 800, configurable: true });
242
- const containerRect = rect({ left: 275, right: 319, top: 12, bottom: 56 });
243
- const panelWidthOnly = rect({ width: 340, height: 136, top: 64, bottom: 200 });
244
- vi.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(function (
245
- this: Element,
246
- ) {
247
- return this.getAttribute('role') === 'dialog' ? panelWidthOnly : containerRect;
248
- });
249
-
250
- render(
251
- <StrictMode>
252
- <Popover open={true} onClose={() => {}} aria-label="Menu" width={340} trigger={trigger}>
253
- Content
254
- </Popover>
255
- </StrictMode>,
256
- );
257
-
258
- const panel = screen.getByRole('dialog') as HTMLElement;
259
- expect(panel.style.left).toBe('-271px');
260
- expect(panel.style.right).toBe('auto');
261
- });
262
- });
263
- });
@@ -1,20 +0,0 @@
1
- .track {
2
- width: 100%;
3
- height: 8px;
4
- border-radius: var(--sv-radius-full);
5
- background: var(--sv-color-surface-sunken);
6
- overflow: hidden;
7
- }
8
-
9
- .fill {
10
- height: 100%;
11
- border-radius: var(--sv-radius-full);
12
- background: var(--sv-color-accent);
13
- transition: width 0.2s ease;
14
- }
15
-
16
- @media (prefers-reduced-motion: reduce) {
17
- .fill {
18
- transition: none;
19
- }
20
- }
@@ -1,40 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Progress } from './Progress';
3
-
4
- const meta = {
5
- title: 'Components/Progress',
6
- component: Progress,
7
- parameters: {
8
- layout: 'padded',
9
- docs: {
10
- description: {
11
- component:
12
- 'Determinate progress bar. role="progressbar" with aria-valuenow/min/max so screen readers announce the current value. Indeterminate state is out of scope.',
13
- },
14
- },
15
- },
16
- args: {
17
- value: 40,
18
- label: 'Upload progress',
19
- },
20
- } satisfies Meta<typeof Progress>;
21
-
22
- export default meta;
23
- type Story = StoryObj<typeof meta>;
24
-
25
- // ---------------------------------------------------------------------------
26
-
27
- export const Default: Story = {};
28
-
29
- export const Empty: Story = {
30
- args: { value: 0 },
31
- };
32
-
33
- export const Complete: Story = {
34
- args: { value: 100 },
35
- };
36
-
37
- export const OverMax: Story = {
38
- name: 'Clamped (value > 100)',
39
- args: { value: 140 },
40
- };
@@ -1,35 +0,0 @@
1
- import styles from './Progress.module.css';
2
-
3
- export interface ProgressProps {
4
- /** 0–100. Values outside that range are clamped. */
5
- value: number;
6
- /** Accessible name — Progress has no visible text of its own. */
7
- label?: string;
8
- id?: string;
9
- className?: string;
10
- }
11
-
12
- /**
13
- * Progress — determinate bar.
14
- *
15
- * `role="progressbar"` with `aria-valuenow`/`aria-valuemin`/`aria-valuemax`
16
- * so screen readers announce the current value. Indeterminate state is out
17
- * of scope until a consumer needs it.
18
- */
19
- export function Progress({ value, label, id, className }: ProgressProps) {
20
- const clamped = Math.min(100, Math.max(0, value));
21
-
22
- return (
23
- <div
24
- id={id}
25
- role="progressbar"
26
- aria-valuenow={clamped}
27
- aria-valuemin={0}
28
- aria-valuemax={100}
29
- aria-label={label}
30
- className={[styles.track, className].filter(Boolean).join(' ')}
31
- >
32
- <div className={styles.fill} style={{ width: `${clamped}%` }} />
33
- </div>
34
- );
35
- }
@@ -1,31 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { Progress } from '../Progress';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('Progress', () => {
9
- it('exposes progressbar ARIA attributes for the given value', () => {
10
- render(<Progress value={40} label="Upload progress" />);
11
- const bar = screen.getByRole('progressbar', { name: 'Upload progress' });
12
- expect(bar.getAttribute('aria-valuenow')).toBe('40');
13
- expect(bar.getAttribute('aria-valuemin')).toBe('0');
14
- expect(bar.getAttribute('aria-valuemax')).toBe('100');
15
- });
16
-
17
- it('clamps a value above 100', () => {
18
- render(<Progress value={140} label="Upload progress" />);
19
- expect(screen.getByRole('progressbar').getAttribute('aria-valuenow')).toBe('100');
20
- });
21
-
22
- it('clamps a negative value to 0', () => {
23
- render(<Progress value={-10} label="Upload progress" />);
24
- expect(screen.getByRole('progressbar').getAttribute('aria-valuenow')).toBe('0');
25
- });
26
-
27
- it('renders without an accessible name when label is omitted', () => {
28
- render(<Progress value={40} />);
29
- expect(screen.getByRole('progressbar').getAttribute('aria-label')).toBeNull();
30
- });
31
- });
@@ -1,67 +0,0 @@
1
- .root {
2
- display: inline-flex;
3
- align-items: center;
4
- gap: var(--sv-space-1);
5
- padding: var(--sv-space-1);
6
- border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
7
- border-radius: var(--sv-radius-full);
8
- background: var(--sv-color-surface-sunken);
9
- }
10
-
11
- .button {
12
- all: unset;
13
- display: flex;
14
- align-items: center;
15
- justify-content: center;
16
- width: var(--sv-space-6);
17
- height: var(--sv-space-6);
18
- border-radius: var(--sv-radius-full);
19
- color: var(--sv-color-text-primary);
20
- font-size: var(--sv-font-size-md);
21
- line-height: 1;
22
- cursor: pointer;
23
- }
24
-
25
- .button:hover:not(:disabled) {
26
- background: var(--sv-color-surface);
27
- }
28
-
29
- .button:disabled {
30
- color: var(--sv-color-text-subtle);
31
- cursor: not-allowed;
32
- }
33
-
34
- .input {
35
- all: unset;
36
- width: 3ch;
37
- text-align: center;
38
- font-family: var(--sv-font-family);
39
- font-size: var(--sv-font-size-sm);
40
- color: var(--sv-color-text-primary);
41
- /* Hide the native spinner — the +/- buttons are the stepper affordance,
42
- a second one from the browser would be redundant and often looks
43
- inconsistent across browsers anyway. */
44
- -moz-appearance: textfield;
45
- }
46
-
47
- .input::-webkit-outer-spin-button,
48
- .input::-webkit-inner-spin-button {
49
- -webkit-appearance: none;
50
- margin: 0;
51
- }
52
-
53
- .input:focus-visible {
54
- outline: none;
55
- box-shadow: 0 0 0 2px var(--sv-color-focus-ring);
56
- border-radius: var(--sv-radius-sm);
57
- }
58
-
59
- .input:disabled {
60
- color: var(--sv-color-text-muted);
61
- }
62
-
63
- .unit {
64
- font-size: var(--sv-font-size-xs);
65
- color: var(--sv-color-text-subtle);
66
- white-space: nowrap;
67
- }
@@ -1,79 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { QuantityStepper } from './QuantityStepper';
4
-
5
- const meta = {
6
- title: 'Components/QuantityStepper',
7
- component: QuantityStepper,
8
- parameters: {
9
- layout: 'padded',
10
- docs: {
11
- description: {
12
- component:
13
- 'A numeric input with +/- buttons and an optional read-only unit suffix. Supports fractional step values for quantities like "1.5 kg".',
14
- },
15
- },
16
- },
17
- args: {
18
- value: 1,
19
- onChange: () => {},
20
- 'aria-label': 'Quantity',
21
- },
22
- } satisfies Meta<typeof QuantityStepper>;
23
-
24
- export default meta;
25
- type Story = StoryObj<typeof meta>;
26
-
27
- function ControlledStepper({
28
- initial = 1,
29
- step = 1,
30
- min = 0,
31
- max,
32
- unit,
33
- }: {
34
- initial?: number;
35
- step?: number;
36
- min?: number;
37
- max?: number;
38
- unit?: string;
39
- }) {
40
- const [value, setValue] = useState(initial);
41
- return (
42
- <QuantityStepper
43
- value={value}
44
- onChange={setValue}
45
- step={step}
46
- min={min}
47
- max={max}
48
- unit={unit}
49
- aria-label="Quantity"
50
- />
51
- );
52
- }
53
-
54
- export const Default: Story = {
55
- render: () => <ControlledStepper initial={1} />,
56
- };
57
-
58
- export const WithUnit: Story = {
59
- render: () => <ControlledStepper initial={6} unit="pcs" />,
60
- };
61
-
62
- export const FractionalStep: Story = {
63
- name: 'Fractional step (0.5 kg)',
64
- render: () => <ControlledStepper initial={1.5} step={0.5} unit="kg" />,
65
- };
66
-
67
- export const AtMinimum: Story = {
68
- render: () => <ControlledStepper initial={0} min={0} unit="pcs" />,
69
- };
70
-
71
- export const WithMax: Story = {
72
- render: () => <ControlledStepper initial={9} max={10} unit="pcs" />,
73
- };
74
-
75
- export const Disabled: Story = {
76
- render: () => (
77
- <QuantityStepper value={3} onChange={() => {}} unit="pcs" aria-label="Quantity" disabled />
78
- ),
79
- };
@@ -1,107 +0,0 @@
1
- 'use client';
2
-
3
- import { useId, type ChangeEvent } from 'react';
4
- import styles from './QuantityStepper.module.css';
5
-
6
- export interface QuantityStepperProps {
7
- value: number;
8
- onChange: (value: number) => void;
9
- /** Smallest selectable value. Default `0`. */
10
- min?: number;
11
- /** Largest selectable value. Default unbounded. */
12
- max?: number;
13
- /** Amount +/- adjusts by. Default `1` — pass e.g. `0.5` for fractional
14
- * quantities (kg, L). */
15
- step?: number;
16
- /** Read-only suffix shown after the number, e.g. "pcs" or "kg" — for
17
- * compact contexts (a list row) where a separate unit selector doesn't
18
- * fit. Editable unit selection (a `<Select>` of units) lives outside
19
- * this component. */
20
- unit?: string;
21
- 'aria-label': string;
22
- disabled?: boolean;
23
- id?: string;
24
- className?: string;
25
- }
26
-
27
- /**
28
- * QuantityStepper — a numeric input with +/- buttons and an optional
29
- * read-only unit suffix. Built for grocery/inventory-style quantities
30
- * (Sovereign Shopper, SHP-06) — supports fractional `step` values since
31
- * quantities like "1.5 kg" are common, unlike a typical integer counter.
32
- *
33
- * The middle field is a real `<input type="number">` so keyboard entry,
34
- * paste, and the browser's native numeric affordances all work — the
35
- * buttons are a convenience on top, not the only way to change the value.
36
- */
37
- export function QuantityStepper({
38
- value,
39
- onChange,
40
- min = 0,
41
- max,
42
- step = 1,
43
- unit,
44
- 'aria-label': ariaLabel,
45
- disabled = false,
46
- id,
47
- className,
48
- }: QuantityStepperProps) {
49
- const generatedId = useId();
50
- const inputId = id ?? generatedId;
51
-
52
- function clamp(next: number): number {
53
- let result = next;
54
- if (min !== undefined) result = Math.max(min, result);
55
- if (max !== undefined) result = Math.min(max, result);
56
- // Avoid float drift (0.1 + 0.2 style errors) from repeated +/- clicks.
57
- return Math.round(result * 1000) / 1000;
58
- }
59
-
60
- function handleInputChange(e: ChangeEvent<HTMLInputElement>) {
61
- const parsed = Number.parseFloat(e.target.value);
62
- if (!Number.isNaN(parsed)) onChange(clamp(parsed));
63
- }
64
-
65
- const decrementDisabled = disabled || (min !== undefined && value <= min);
66
- const incrementDisabled = disabled || (max !== undefined && value >= max);
67
-
68
- return (
69
- <div className={[styles.root, className].filter(Boolean).join(' ')}>
70
- <button
71
- type="button"
72
- className={styles.button}
73
- onClick={() => onChange(clamp(value - step))}
74
- disabled={decrementDisabled}
75
- aria-label={`Decrease ${ariaLabel}`}
76
- >
77
- −
78
- </button>
79
- <input
80
- id={inputId}
81
- type="number"
82
- className={styles.input}
83
- value={value}
84
- onChange={handleInputChange}
85
- min={min}
86
- max={max}
87
- step={step}
88
- disabled={disabled}
89
- aria-label={ariaLabel}
90
- />
91
- {unit && (
92
- <span className={styles.unit} aria-hidden>
93
- {unit}
94
- </span>
95
- )}
96
- <button
97
- type="button"
98
- className={styles.button}
99
- onClick={() => onChange(clamp(value + step))}
100
- disabled={incrementDisabled}
101
- aria-label={`Increase ${ariaLabel}`}
102
- >
103
- +
104
- </button>
105
- </div>
106
- );
107
- }