@grampro/kit 0.0.0-stage → 2.4.0

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 (505) hide show
  1. package/.gbs/skills/gbs-components/SKILL.md +190 -0
  2. package/.gbs/skills/gbs-components/references/accessibility.md +102 -0
  3. package/.gbs/skills/gbs-components/references/data-display.md +185 -0
  4. package/.gbs/skills/gbs-components/references/data-grid.md +116 -0
  5. package/.gbs/skills/gbs-components/references/forms.md +202 -0
  6. package/.gbs/skills/gbs-components/references/install.md +211 -0
  7. package/.gbs/skills/gbs-components/references/overlays.md +206 -0
  8. package/.gbs/skills/gbs-components/references/pickers.md +83 -0
  9. package/.gbs/skills/gbs-components/references/styling.md +246 -0
  10. package/.gbs/skills/gbs-components/references/toaster.md +57 -0
  11. package/CHANGELOG.md +139 -0
  12. package/LICENSE +15 -0
  13. package/README.md +193 -2
  14. package/index.cjs +1370 -0
  15. package/package.json +74 -4
  16. package/schema/passport-v1.schema.json +204 -0
  17. package/source/components/accordion/README.md +45 -0
  18. package/source/components/accordion/core/index.ts +2 -0
  19. package/source/components/accordion/core/open.ts +56 -0
  20. package/source/components/accordion/core/types.ts +17 -0
  21. package/source/components/accordion/index.ts +8 -0
  22. package/source/components/accordion/passport.json +259 -0
  23. package/source/components/accordion/react/Accordion.tsx +133 -0
  24. package/source/components/accordion/react/AccordionItem.tsx +120 -0
  25. package/source/components/accordion/react/context.ts +20 -0
  26. package/source/components/accordion/react/props.ts +13 -0
  27. package/source/components/accordion/styles.css +207 -0
  28. package/source/components/alert/README.md +39 -0
  29. package/source/components/alert/core/index.ts +2 -0
  30. package/source/components/alert/core/live.ts +25 -0
  31. package/source/components/alert/core/types.ts +7 -0
  32. package/source/components/alert/index.ts +5 -0
  33. package/source/components/alert/passport.json +250 -0
  34. package/source/components/alert/react/Alert.tsx +113 -0
  35. package/source/components/alert/react/icons.tsx +21 -0
  36. package/source/components/alert/react/locale.ts +5 -0
  37. package/source/components/alert/react/props.ts +11 -0
  38. package/source/components/alert/styles.css +154 -0
  39. package/source/components/avatar/core/identity.ts +103 -0
  40. package/source/components/avatar/core/index.ts +2 -0
  41. package/source/components/avatar/core/types.ts +12 -0
  42. package/source/components/avatar/index.ts +7 -0
  43. package/source/components/avatar/passport.json +294 -0
  44. package/source/components/avatar/react/Avatar.tsx +118 -0
  45. package/source/components/avatar/react/AvatarGroup.tsx +74 -0
  46. package/source/components/avatar/react/locale.ts +11 -0
  47. package/source/components/avatar/react/props.ts +6 -0
  48. package/source/components/avatar/styles.css +225 -0
  49. package/source/components/badge/README.md +37 -0
  50. package/source/components/badge/core/count.ts +37 -0
  51. package/source/components/badge/core/index.ts +2 -0
  52. package/source/components/badge/core/types.ts +11 -0
  53. package/source/components/badge/index.ts +7 -0
  54. package/source/components/badge/passport.json +332 -0
  55. package/source/components/badge/react/Badge.tsx +89 -0
  56. package/source/components/badge/react/Tag.tsx +82 -0
  57. package/source/components/badge/react/locale.ts +5 -0
  58. package/source/components/badge/react/props.ts +6 -0
  59. package/source/components/badge/styles.css +203 -0
  60. package/source/components/breadcrumb/README.md +34 -0
  61. package/source/components/breadcrumb/core/index.ts +4 -0
  62. package/source/components/breadcrumb/core/trail.ts +42 -0
  63. package/source/components/breadcrumb/core/types.ts +20 -0
  64. package/source/components/breadcrumb/index.ts +5 -0
  65. package/source/components/breadcrumb/passport.json +243 -0
  66. package/source/components/breadcrumb/react/Breadcrumb.tsx +177 -0
  67. package/source/components/breadcrumb/react/locale.ts +6 -0
  68. package/source/components/breadcrumb/react/props.ts +14 -0
  69. package/source/components/breadcrumb/styles.css +138 -0
  70. package/source/components/button/README.md +32 -0
  71. package/source/components/button/core/index.ts +3 -0
  72. package/source/components/button/core/state.ts +16 -0
  73. package/source/components/button/core/types.ts +28 -0
  74. package/source/components/button/index.ts +5 -0
  75. package/source/components/button/passport.json +402 -0
  76. package/source/components/button/passport.manual.json +31 -0
  77. package/source/components/button/react/Button.tsx +173 -0
  78. package/source/components/button/react/locale.ts +5 -0
  79. package/source/components/button/react/props.ts +23 -0
  80. package/source/components/button/styles.css +232 -0
  81. package/source/components/card/README.md +60 -0
  82. package/source/components/card/core/index.ts +4 -0
  83. package/source/components/card/core/trend.ts +32 -0
  84. package/source/components/card/core/types.ts +5 -0
  85. package/source/components/card/index.ts +5 -0
  86. package/source/components/card/passport.json +337 -0
  87. package/source/components/card/react/Card.tsx +133 -0
  88. package/source/components/card/react/Stat.tsx +127 -0
  89. package/source/components/card/react/props.ts +4 -0
  90. package/source/components/card/styles.css +230 -0
  91. package/source/components/checkbox/README.md +36 -0
  92. package/source/components/checkbox/core/group.ts +30 -0
  93. package/source/components/checkbox/core/index.ts +3 -0
  94. package/source/components/checkbox/core/types.ts +17 -0
  95. package/source/components/checkbox/index.ts +9 -0
  96. package/source/components/checkbox/passport.json +456 -0
  97. package/source/components/checkbox/react/Checkbox.tsx +147 -0
  98. package/source/components/checkbox/react/CheckboxGroup.tsx +149 -0
  99. package/source/components/checkbox/react/context.ts +16 -0
  100. package/source/components/checkbox/react/locale.ts +5 -0
  101. package/source/components/checkbox/react/props.ts +6 -0
  102. package/source/components/checkbox/styles.css +211 -0
  103. package/source/components/combobox/README.md +170 -0
  104. package/source/components/combobox/core/filter.ts +155 -0
  105. package/source/components/combobox/core/index.ts +16 -0
  106. package/source/components/combobox/core/types.ts +48 -0
  107. package/source/components/combobox/core/virtual.ts +67 -0
  108. package/source/components/combobox/index.ts +13 -0
  109. package/source/components/combobox/passport.json +456 -0
  110. package/source/components/combobox/react/Listbox.tsx +310 -0
  111. package/source/components/combobox/react/MultiSelect.tsx +265 -0
  112. package/source/components/combobox/react/Popover.tsx +38 -0
  113. package/source/components/combobox/react/Select.tsx +200 -0
  114. package/source/components/combobox/react/icons.tsx +11 -0
  115. package/source/components/combobox/react/locale.ts +16 -0
  116. package/source/components/combobox/react/props.ts +88 -0
  117. package/source/components/combobox/react/useCombobox.ts +409 -0
  118. package/source/components/combobox/styles.css +419 -0
  119. package/source/components/data-grid/README.md +233 -0
  120. package/source/components/data-grid/agent/coerce.ts +368 -0
  121. package/source/components/data-grid/agent/contract.ts +410 -0
  122. package/source/components/data-grid/agent/dataset.ts +92 -0
  123. package/source/components/data-grid/agent/engine.ts +470 -0
  124. package/source/components/data-grid/agent/executors.ts +155 -0
  125. package/source/components/data-grid/agent/index.ts +79 -0
  126. package/source/components/data-grid/agent/intent.ts +324 -0
  127. package/source/components/data-grid/agent/operations.ts +335 -0
  128. package/source/components/data-grid/agent/validate.ts +630 -0
  129. package/source/components/data-grid/agent/webmcp.ts +107 -0
  130. package/source/components/data-grid/core/columnHelper.ts +21 -0
  131. package/source/components/data-grid/core/columns.ts +288 -0
  132. package/source/components/data-grid/core/filtering.ts +237 -0
  133. package/source/components/data-grid/core/grid.ts +638 -0
  134. package/source/components/data-grid/core/index.ts +14 -0
  135. package/source/components/data-grid/core/rows.ts +64 -0
  136. package/source/components/data-grid/core/sorting.ts +133 -0
  137. package/source/components/data-grid/core/state.ts +82 -0
  138. package/source/components/data-grid/core/store.ts +52 -0
  139. package/source/components/data-grid/core/types.ts +302 -0
  140. package/source/components/data-grid/core/values.ts +98 -0
  141. package/source/components/data-grid/core/virtual.ts +85 -0
  142. package/source/components/data-grid/export/csv.ts +32 -0
  143. package/source/components/data-grid/export/download.ts +12 -0
  144. package/source/components/data-grid/export/pdf-font.ts +139 -0
  145. package/source/components/data-grid/export/pdf-writer.ts +113 -0
  146. package/source/components/data-grid/export/pdf.ts +379 -0
  147. package/source/components/data-grid/export/table.ts +73 -0
  148. package/source/components/data-grid/export/xlsx.ts +145 -0
  149. package/source/components/data-grid/export/zip.ts +87 -0
  150. package/source/components/data-grid/index.ts +14 -0
  151. package/source/components/data-grid/passport.json +1051 -0
  152. package/source/components/data-grid/passport.manual.json +255 -0
  153. package/source/components/data-grid/react/AskGrid.tsx +164 -0
  154. package/source/components/data-grid/react/Cell.tsx +282 -0
  155. package/source/components/data-grid/react/ColumnMenu.tsx +135 -0
  156. package/source/components/data-grid/react/DataGrid.tsx +335 -0
  157. package/source/components/data-grid/react/FilterForm.tsx +142 -0
  158. package/source/components/data-grid/react/HeaderRow.tsx +332 -0
  159. package/source/components/data-grid/react/Pagination.tsx +107 -0
  160. package/source/components/data-grid/react/Popover.tsx +35 -0
  161. package/source/components/data-grid/react/Row.tsx +85 -0
  162. package/source/components/data-grid/react/Toolbar.tsx +267 -0
  163. package/source/components/data-grid/react/Viewport.tsx +167 -0
  164. package/source/components/data-grid/react/context.ts +57 -0
  165. package/source/components/data-grid/react/hooks.ts +83 -0
  166. package/source/components/data-grid/react/icons.tsx +45 -0
  167. package/source/components/data-grid/react/keyboard.ts +110 -0
  168. package/source/components/data-grid/react/locale.ts +130 -0
  169. package/source/components/data-grid/styles.css +874 -0
  170. package/source/components/date-picker/README.md +141 -0
  171. package/source/components/date-picker/core/calendar.ts +266 -0
  172. package/source/components/date-picker/core/format.ts +170 -0
  173. package/source/components/date-picker/core/index.ts +41 -0
  174. package/source/components/date-picker/core/today.ts +72 -0
  175. package/source/components/date-picker/core/types.ts +68 -0
  176. package/source/components/date-picker/index.ts +16 -0
  177. package/source/components/date-picker/passport.json +407 -0
  178. package/source/components/date-picker/react/Calendar.tsx +160 -0
  179. package/source/components/date-picker/react/CalendarPanel.tsx +170 -0
  180. package/source/components/date-picker/react/DatePicker.tsx +249 -0
  181. package/source/components/date-picker/react/DateRangePicker.tsx +291 -0
  182. package/source/components/date-picker/react/MonthYearPanels.tsx +123 -0
  183. package/source/components/date-picker/react/Popover.tsx +45 -0
  184. package/source/components/date-picker/react/icons.tsx +15 -0
  185. package/source/components/date-picker/react/locale.ts +23 -0
  186. package/source/components/date-picker/react/props.ts +76 -0
  187. package/source/components/date-picker/react/useDatePicker.ts +557 -0
  188. package/source/components/date-picker/styles.css +445 -0
  189. package/source/components/dialog/README.md +39 -0
  190. package/source/components/dialog/core/api.ts +34 -0
  191. package/source/components/dialog/core/dialog.ts +11 -0
  192. package/source/components/dialog/core/index.ts +7 -0
  193. package/source/components/dialog/core/store.ts +81 -0
  194. package/source/components/dialog/core/types.ts +59 -0
  195. package/source/components/dialog/index.ts +7 -0
  196. package/source/components/dialog/passport.json +344 -0
  197. package/source/components/dialog/react/Dialog.tsx +279 -0
  198. package/source/components/dialog/react/DialogHost.tsx +45 -0
  199. package/source/components/dialog/react/icons.tsx +20 -0
  200. package/source/components/dialog/react/locale.ts +8 -0
  201. package/source/components/dialog/react/props.ts +13 -0
  202. package/source/components/dialog/styles.css +280 -0
  203. package/source/components/file-uploader/README.md +99 -0
  204. package/source/components/file-uploader/core/format.ts +79 -0
  205. package/source/components/file-uploader/core/index.ts +26 -0
  206. package/source/components/file-uploader/core/store.ts +432 -0
  207. package/source/components/file-uploader/core/transport.ts +154 -0
  208. package/source/components/file-uploader/core/types.ts +126 -0
  209. package/source/components/file-uploader/core/validate.ts +83 -0
  210. package/source/components/file-uploader/index.ts +7 -0
  211. package/source/components/file-uploader/passport.json +518 -0
  212. package/source/components/file-uploader/react/FileRow.tsx +268 -0
  213. package/source/components/file-uploader/react/FileUploader.tsx +511 -0
  214. package/source/components/file-uploader/react/icons.tsx +60 -0
  215. package/source/components/file-uploader/react/locale.ts +33 -0
  216. package/source/components/file-uploader/react/props.ts +31 -0
  217. package/source/components/file-uploader/react/useFileUploader.ts +32 -0
  218. package/source/components/file-uploader/styles.css +394 -0
  219. package/source/components/input/README.md +44 -0
  220. package/source/components/input/core/count.ts +5 -0
  221. package/source/components/input/core/index.ts +11 -0
  222. package/source/components/input/core/otp.ts +64 -0
  223. package/source/components/input/core/types.ts +14 -0
  224. package/source/components/input/index.ts +8 -0
  225. package/source/components/input/passport.json +536 -0
  226. package/source/components/input/react/Input.tsx +219 -0
  227. package/source/components/input/react/OtpInput.tsx +256 -0
  228. package/source/components/input/react/dom.ts +10 -0
  229. package/source/components/input/react/icons.tsx +17 -0
  230. package/source/components/input/react/locale.ts +9 -0
  231. package/source/components/input/react/props.ts +6 -0
  232. package/source/components/input/styles.css +295 -0
  233. package/source/components/menu/README.md +68 -0
  234. package/source/components/menu/core/index.ts +11 -0
  235. package/source/components/menu/core/navigation.ts +84 -0
  236. package/source/components/menu/core/types.ts +32 -0
  237. package/source/components/menu/index.ts +19 -0
  238. package/source/components/menu/passport.json +322 -0
  239. package/source/components/menu/react/Menu.tsx +371 -0
  240. package/source/components/menu/react/context.ts +31 -0
  241. package/source/components/menu/react/items.tsx +268 -0
  242. package/source/components/menu/react/locale.ts +6 -0
  243. package/source/components/menu/react/props.ts +4 -0
  244. package/source/components/menu/react/useMenuKeys.ts +124 -0
  245. package/source/components/menu/styles.css +224 -0
  246. package/source/components/modal/README.md +51 -0
  247. package/source/components/modal/core/dismiss.ts +29 -0
  248. package/source/components/modal/core/index.ts +3 -0
  249. package/source/components/modal/core/types.ts +27 -0
  250. package/source/components/modal/index.ts +5 -0
  251. package/source/components/modal/passport.json +289 -0
  252. package/source/components/modal/react/Modal.tsx +242 -0
  253. package/source/components/modal/react/icons.tsx +1 -0
  254. package/source/components/modal/react/locale.ts +5 -0
  255. package/source/components/modal/react/props.ts +17 -0
  256. package/source/components/modal/styles.css +241 -0
  257. package/source/components/number-input/README.md +53 -0
  258. package/source/components/number-input/core/format.ts +37 -0
  259. package/source/components/number-input/core/index.ts +4 -0
  260. package/source/components/number-input/core/parse.ts +118 -0
  261. package/source/components/number-input/core/step.ts +73 -0
  262. package/source/components/number-input/core/types.ts +32 -0
  263. package/source/components/number-input/index.ts +5 -0
  264. package/source/components/number-input/passport.json +541 -0
  265. package/source/components/number-input/react/NumberInput.tsx +465 -0
  266. package/source/components/number-input/react/icons.tsx +17 -0
  267. package/source/components/number-input/react/locale.ts +7 -0
  268. package/source/components/number-input/react/props.ts +11 -0
  269. package/source/components/number-input/styles.css +230 -0
  270. package/source/components/popover/README.md +44 -0
  271. package/source/components/popover/core/index.ts +2 -0
  272. package/source/components/popover/core/types.ts +12 -0
  273. package/source/components/popover/index.ts +4 -0
  274. package/source/components/popover/passport.json +238 -0
  275. package/source/components/popover/react/Popover.tsx +202 -0
  276. package/source/components/popover/react/locale.ts +5 -0
  277. package/source/components/popover/react/props.ts +4 -0
  278. package/source/components/popover/styles.css +148 -0
  279. package/source/components/progress/README.md +38 -0
  280. package/source/components/progress/core/index.ts +2 -0
  281. package/source/components/progress/core/progress.ts +40 -0
  282. package/source/components/progress/core/types.ts +23 -0
  283. package/source/components/progress/index.ts +7 -0
  284. package/source/components/progress/passport.json +270 -0
  285. package/source/components/progress/react/CircularProgress.tsx +106 -0
  286. package/source/components/progress/react/Progress.tsx +113 -0
  287. package/source/components/progress/react/locale.ts +7 -0
  288. package/source/components/progress/react/props.ts +6 -0
  289. package/source/components/progress/styles.css +200 -0
  290. package/source/components/radio-group/README.md +58 -0
  291. package/source/components/radio-group/core/group.ts +36 -0
  292. package/source/components/radio-group/core/index.ts +2 -0
  293. package/source/components/radio-group/core/types.ts +20 -0
  294. package/source/components/radio-group/index.ts +9 -0
  295. package/source/components/radio-group/passport.json +477 -0
  296. package/source/components/radio-group/react/Radio.tsx +144 -0
  297. package/source/components/radio-group/react/RadioGroup.tsx +179 -0
  298. package/source/components/radio-group/react/context.ts +18 -0
  299. package/source/components/radio-group/react/locale.ts +5 -0
  300. package/source/components/radio-group/react/props.ts +12 -0
  301. package/source/components/radio-group/styles.css +269 -0
  302. package/source/components/shared/README.md +54 -0
  303. package/source/components/shared/core/agent/adapter.ts +65 -0
  304. package/source/components/shared/core/agent/history.ts +120 -0
  305. package/source/components/shared/core/agent/index.ts +46 -0
  306. package/source/components/shared/core/agent/numbers.ts +217 -0
  307. package/source/components/shared/core/agent/schema.ts +180 -0
  308. package/source/components/shared/core/agent/types.ts +169 -0
  309. package/source/components/shared/core/agent/webmcp.ts +328 -0
  310. package/source/components/shared/core/cx.ts +9 -0
  311. package/source/components/shared/core/field.ts +35 -0
  312. package/source/components/shared/core/position.ts +124 -0
  313. package/source/components/shared/core/text.ts +14 -0
  314. package/source/components/shared/index.ts +17 -0
  315. package/source/components/shared/react/GramproAIProvider.tsx +50 -0
  316. package/source/components/shared/react/Popover.tsx +189 -0
  317. package/source/components/shared/react/icons.tsx +74 -0
  318. package/source/components/shared/react/useAskAgent.ts +217 -0
  319. package/source/components/shared/react/useControllableState.ts +42 -0
  320. package/source/components/shared/styles.css +79 -0
  321. package/source/components/shared/version.json +4 -0
  322. package/source/components/shared/version.ts +6 -0
  323. package/source/components/skeleton/README.md +58 -0
  324. package/source/components/skeleton/core/index.ts +3 -0
  325. package/source/components/skeleton/core/lines.ts +25 -0
  326. package/source/components/skeleton/core/types.ts +5 -0
  327. package/source/components/skeleton/index.ts +5 -0
  328. package/source/components/skeleton/passport.json +251 -0
  329. package/source/components/skeleton/react/Empty.tsx +51 -0
  330. package/source/components/skeleton/react/Skeleton.tsx +92 -0
  331. package/source/components/skeleton/react/props.ts +4 -0
  332. package/source/components/skeleton/styles.css +185 -0
  333. package/source/components/spinner/README.md +29 -0
  334. package/source/components/spinner/core/index.ts +3 -0
  335. package/source/components/spinner/core/types.ts +28 -0
  336. package/source/components/spinner/core/visibility.ts +34 -0
  337. package/source/components/spinner/index.ts +6 -0
  338. package/source/components/spinner/passport.json +245 -0
  339. package/source/components/spinner/react/Spinner.tsx +96 -0
  340. package/source/components/spinner/react/locale.ts +5 -0
  341. package/source/components/spinner/react/props.ts +4 -0
  342. package/source/components/spinner/react/useDelayedLoading.ts +39 -0
  343. package/source/components/spinner/styles.css +173 -0
  344. package/source/components/switch/README.md +46 -0
  345. package/source/components/switch/core/index.ts +2 -0
  346. package/source/components/switch/core/toggle.ts +54 -0
  347. package/source/components/switch/core/types.ts +9 -0
  348. package/source/components/switch/index.ts +5 -0
  349. package/source/components/switch/passport.json +421 -0
  350. package/source/components/switch/react/Switch.tsx +219 -0
  351. package/source/components/switch/react/locale.ts +5 -0
  352. package/source/components/switch/react/props.ts +12 -0
  353. package/source/components/switch/styles.css +227 -0
  354. package/source/components/tabs/README.md +32 -0
  355. package/source/components/tabs/core/index.ts +3 -0
  356. package/source/components/tabs/core/navigation.ts +54 -0
  357. package/source/components/tabs/core/types.ts +16 -0
  358. package/source/components/tabs/index.ts +5 -0
  359. package/source/components/tabs/passport.json +315 -0
  360. package/source/components/tabs/react/Tabs.tsx +306 -0
  361. package/source/components/tabs/react/context.ts +21 -0
  362. package/source/components/tabs/styles.css +263 -0
  363. package/source/components/textarea/README.md +39 -0
  364. package/source/components/textarea/core/count.ts +5 -0
  365. package/source/components/textarea/core/index.ts +4 -0
  366. package/source/components/textarea/core/size.ts +23 -0
  367. package/source/components/textarea/core/types.ts +17 -0
  368. package/source/components/textarea/index.ts +5 -0
  369. package/source/components/textarea/passport.json +382 -0
  370. package/source/components/textarea/react/Textarea.tsx +208 -0
  371. package/source/components/textarea/react/locale.ts +5 -0
  372. package/source/components/textarea/react/props.ts +4 -0
  373. package/source/components/textarea/styles.css +158 -0
  374. package/source/components/toaster/README.md +128 -0
  375. package/source/components/toaster/core/api.ts +87 -0
  376. package/source/components/toaster/core/index.ts +14 -0
  377. package/source/components/toaster/core/store.ts +211 -0
  378. package/source/components/toaster/core/toast.ts +12 -0
  379. package/source/components/toaster/core/types.ts +78 -0
  380. package/source/components/toaster/index.ts +6 -0
  381. package/source/components/toaster/passport.json +221 -0
  382. package/source/components/toaster/react/ToastItem.tsx +164 -0
  383. package/source/components/toaster/react/Toaster.tsx +187 -0
  384. package/source/components/toaster/react/icons.tsx +23 -0
  385. package/source/components/toaster/react/locale.ts +6 -0
  386. package/source/components/toaster/react/props.ts +15 -0
  387. package/source/components/toaster/react/useToasts.ts +11 -0
  388. package/source/components/toaster/styles.css +282 -0
  389. package/source/components/tooltip/README.md +43 -0
  390. package/source/components/tooltip/core/index.ts +4 -0
  391. package/source/components/tooltip/core/types.ts +4 -0
  392. package/source/components/tooltip/core/visibility.ts +34 -0
  393. package/source/components/tooltip/index.ts +3 -0
  394. package/source/components/tooltip/passport.json +170 -0
  395. package/source/components/tooltip/react/Tooltip.tsx +196 -0
  396. package/source/components/tooltip/react/props.ts +4 -0
  397. package/source/components/tooltip/styles.css +71 -0
  398. package/source/fallback/index.tsx +11 -0
  399. package/source/globalStyle.ts +74 -0
  400. package/source/hooks/SelectionHooks/type.ts +4 -0
  401. package/source/hooks/SelectionHooks/useClickOutside.ts +22 -0
  402. package/source/hooks/SelectionHooks/useMultiSelectState.ts +64 -0
  403. package/source/hooks/SelectionHooks/useSelectData.ts +58 -0
  404. package/source/hooks/SelectionHooks/useSelectState.ts +36 -0
  405. package/source/icon/Icon.tsx +102 -0
  406. package/source/icon/iconPaths.ts +206 -0
  407. package/source/legacy-components/bargraph/index.tsx +95 -0
  408. package/source/legacy-components/bargraph/type.ts +12 -0
  409. package/source/legacy-components/breadcrumb/index.tsx +66 -0
  410. package/source/legacy-components/breadcrumb/types.ts +10 -0
  411. package/source/legacy-components/button/index.tsx +42 -0
  412. package/source/legacy-components/card/index.tsx +31 -0
  413. package/source/legacy-components/checkbox/index.tsx +25 -0
  414. package/source/legacy-components/contextmenu/ContextMenu.tsx +87 -0
  415. package/source/legacy-components/contextmenu/ContextMenuItem.tsx +30 -0
  416. package/source/legacy-components/contextmenu/index.ts +2 -0
  417. package/source/legacy-components/contextmenu/types.ts +19 -0
  418. package/source/legacy-components/darkmode/index.tsx +55 -0
  419. package/source/legacy-components/datagrid/context/GridContext.tsx +215 -0
  420. package/source/legacy-components/datagrid/createTemplate.tsx +82 -0
  421. package/source/legacy-components/datagrid/hooks/index.ts +6 -0
  422. package/source/legacy-components/datagrid/hooks/useColumns.ts +33 -0
  423. package/source/legacy-components/datagrid/hooks/useDataSource.ts +54 -0
  424. package/source/legacy-components/datagrid/hooks/useFiltering.ts +169 -0
  425. package/source/legacy-components/datagrid/hooks/usePagination.ts +112 -0
  426. package/source/legacy-components/datagrid/hooks/useRowSelection.ts +48 -0
  427. package/source/legacy-components/datagrid/hooks/useSearch.ts +90 -0
  428. package/source/legacy-components/datagrid/index.tsx +28 -0
  429. package/source/legacy-components/datagrid/layout/FilterPopup.tsx +92 -0
  430. package/source/legacy-components/datagrid/layout/GridBody.tsx +184 -0
  431. package/source/legacy-components/datagrid/layout/GridPagination.tsx +119 -0
  432. package/source/legacy-components/datagrid/layout/GridToolbar.tsx +109 -0
  433. package/source/legacy-components/datagrid/layout/index.tsx +68 -0
  434. package/source/legacy-components/datagrid/type.ts +198 -0
  435. package/source/legacy-components/datepicker/index.tsx +365 -0
  436. package/source/legacy-components/datepicker/types.ts +12 -0
  437. package/source/legacy-components/dialog/index.tsx +44 -0
  438. package/source/legacy-components/dialog/types.ts +12 -0
  439. package/source/legacy-components/formrenderer/componentHandles/CheckBoxHandles.tsx +80 -0
  440. package/source/legacy-components/formrenderer/componentHandles/DatePickerHandles.tsx +93 -0
  441. package/source/legacy-components/formrenderer/componentHandles/InputHandles.tsx +106 -0
  442. package/source/legacy-components/formrenderer/componentHandles/MultiHandles.tsx +93 -0
  443. package/source/legacy-components/formrenderer/componentHandles/SelectHandles.tsx +95 -0
  444. package/source/legacy-components/formrenderer/helperFunctions.ts +72 -0
  445. package/source/legacy-components/formrenderer/index.tsx +93 -0
  446. package/source/legacy-components/formrenderer/types.ts +127 -0
  447. package/source/legacy-components/input/index.tsx +142 -0
  448. package/source/legacy-components/input/types.ts +10 -0
  449. package/source/legacy-components/materialInput/index.tsx +138 -0
  450. package/source/legacy-components/materialInput/types.ts +16 -0
  451. package/source/legacy-components/modal/index.tsx +152 -0
  452. package/source/legacy-components/modal/types.ts +19 -0
  453. package/source/legacy-components/multiselect/PortalDropDown.tsx +44 -0
  454. package/source/legacy-components/multiselect/index.tsx +269 -0
  455. package/source/legacy-components/multiselect/types.ts +26 -0
  456. package/source/legacy-components/navbar/AuthSection.tsx +98 -0
  457. package/source/legacy-components/navbar/MobileToggle.tsx +31 -0
  458. package/source/legacy-components/navbar/NavItemComponent.tsx +119 -0
  459. package/source/legacy-components/navbar/SearchBar.tsx +55 -0
  460. package/source/legacy-components/navbar/helperFunctions.ts +27 -0
  461. package/source/legacy-components/navbar/index.tsx +156 -0
  462. package/source/legacy-components/navbar/types.ts +69 -0
  463. package/source/legacy-components/select/PortalDropDown.tsx +59 -0
  464. package/source/legacy-components/select/index.tsx +249 -0
  465. package/source/legacy-components/select/types.ts +29 -0
  466. package/source/legacy-components/sidebar/components/MenuItem.tsx +101 -0
  467. package/source/legacy-components/sidebar/components/MenuSection.tsx +34 -0
  468. package/source/legacy-components/sidebar/components/SidebarFooter.tsx +50 -0
  469. package/source/legacy-components/sidebar/components/SidebarLogo.tsx +24 -0
  470. package/source/legacy-components/sidebar/components/SidebarMenu.tsx +29 -0
  471. package/source/legacy-components/sidebar/components/UserProfile.tsx +31 -0
  472. package/source/legacy-components/sidebar/hooks/useSidebarState.ts +41 -0
  473. package/source/legacy-components/sidebar/index.tsx +77 -0
  474. package/source/legacy-components/sidebar/type.ts +42 -0
  475. package/source/legacy-components/spinner/Stroke.tsx +89 -0
  476. package/source/legacy-components/spinner/index.tsx +54 -0
  477. package/source/legacy-components/spinner/types.ts +9 -0
  478. package/source/legacy-components/tabs/index.tsx +71 -0
  479. package/source/legacy-components/tabs/types.ts +16 -0
  480. package/source/legacy-components/textarea/index.tsx +123 -0
  481. package/source/legacy-components/textarea/types.ts +15 -0
  482. package/source/legacy-components/toast/ToastComponent.tsx +101 -0
  483. package/source/legacy-components/toast/ToastIcon.tsx +61 -0
  484. package/source/legacy-components/toast/index.tsx +42 -0
  485. package/source/legacy-components/toast/toastStore.ts +42 -0
  486. package/source/legacy-components/toast/types.ts +18 -0
  487. package/source/legacy-components/toast/useToast.ts +12 -0
  488. package/source/legacy-components/uploader/ProgressAnimation.tsx +50 -0
  489. package/source/legacy-components/uploader/UploadedFilePreview.tsx +130 -0
  490. package/source/legacy-components/uploader/index.tsx +311 -0
  491. package/source/legacy-components/uploader/types.ts +30 -0
  492. package/source/legacy-components/uploader/uploaderIcon.tsx +72 -0
  493. package/source/legacy-components/uploader/uploaderService.ts +134 -0
  494. package/source/legacy-components/useUploader/useUploader.tsx +310 -0
  495. package/source/legacy-components/usepaginateddata/usePaginatedData.ts +174 -0
  496. package/source/theme.ts +40 -0
  497. package/source/utils.ts +10 -0
  498. package/tools/env.cjs +61 -0
  499. package/tools/passport/cli.cjs +79 -0
  500. package/tools/passport/extract.cjs +493 -0
  501. package/tools/passport/index.cjs +185 -0
  502. package/tools/passport/merge.cjs +131 -0
  503. package/tools/passport/policy.cjs +65 -0
  504. package/tools/passport/validate.cjs +277 -0
  505. package/tools/ts-require.cjs +79 -0
@@ -0,0 +1,133 @@
1
+ "use client";
2
+
3
+ import {
4
+ useCallback,
5
+ useMemo,
6
+ type CSSProperties,
7
+ type ReactNode,
8
+ type Ref,
9
+ } from "react";
10
+ import { useControllableState } from "../../shared/react/useControllableState";
11
+ import { normalizeOpen, toggleOpen } from "../core/open";
12
+ import type {
13
+ AccordionIconPosition,
14
+ AccordionItemData,
15
+ AccordionSize,
16
+ AccordionVariant,
17
+ } from "../core/types";
18
+ import { AccordionItem } from "./AccordionItem";
19
+ import { AccordionContext, type AccordionContextValue } from "./context";
20
+ import { cx, type AccordionSlot } from "./props";
21
+
22
+ export interface AccordionProps {
23
+ /** Open panels, by value (controlled). */
24
+ value?: string[];
25
+ defaultValue?: string[];
26
+ onValueChange?(value: string[]): void;
27
+ /** Render these panels, or pass `<AccordionItem>` children. */
28
+ items?: readonly AccordionItemData[];
29
+ children?: ReactNode;
30
+ /** Allow more than one panel open at a time. Default false. */
31
+ multiple?: boolean;
32
+ /** Allow the open panel to be closed again. Default true. */
33
+ collapsible?: boolean;
34
+ /** Default `separated`. */
35
+ variant?: AccordionVariant;
36
+ /** Default `md`. */
37
+ size?: AccordionSize;
38
+ /** Which side the chevron sits on. Default `end`. */
39
+ iconPosition?: AccordionIconPosition;
40
+ className?: string;
41
+ classNames?: Partial<Record<AccordionSlot, string>>;
42
+ style?: CSSProperties;
43
+ ref?: Ref<HTMLDivElement>;
44
+ }
45
+
46
+ /**
47
+ * Sections that open one at a time, built on `<details>` and `<summary>`.
48
+ *
49
+ * The browser owns the disclosure: the header is focusable, Enter and Space
50
+ * work, the panel is hidden from search and from the accessibility tree while
51
+ * closed, and Ctrl+F still finds text inside a closed panel in browsers that
52
+ * support it. None of that is implemented here.
53
+ *
54
+ * What is implemented is the accordion *around* the disclosures — which one is
55
+ * open, and whether closing the last is allowed — because `<details name>`
56
+ * alone cannot express a non-collapsible group, and gives no value to store.
57
+ */
58
+ export function Accordion(props: AccordionProps) {
59
+ const {
60
+ ref,
61
+ value,
62
+ defaultValue,
63
+ onValueChange,
64
+ items,
65
+ children,
66
+ multiple = false,
67
+ collapsible = true,
68
+ variant = "separated",
69
+ size = "md",
70
+ iconPosition = "end",
71
+ className,
72
+ classNames,
73
+ style,
74
+ } = props;
75
+
76
+ const [open, setOpen] = useControllableState<string[]>(value, defaultValue ?? []);
77
+ const settings = useMemo(() => ({ multiple, collapsible }), [multiple, collapsible]);
78
+
79
+ /*
80
+ * With `items`, the panels are known and the starting value can be trimmed
81
+ * against them. With children they are not — and asking each item to
82
+ * register itself would mean either reading a ref while rendering or a
83
+ * second render pass on mount, for the sake of dropping a value that already
84
+ * matches nothing and shows nothing.
85
+ *
86
+ * The one thing that needs the list is opening a panel in a non-collapsible
87
+ * accordion that starts with none open, so give that case a `defaultValue`.
88
+ */
89
+ const effective = useMemo(
90
+ () => normalizeOpen(open, items ? items.map((item) => item.value) : open, settings),
91
+ [open, items, settings],
92
+ );
93
+
94
+ const toggle = useCallback(
95
+ (item: string) => {
96
+ const next = toggleOpen(effective, item, settings);
97
+ setOpen(next);
98
+ onValueChange?.(next);
99
+ },
100
+ [effective, settings, setOpen, onValueChange],
101
+ );
102
+
103
+ const context = useMemo<AccordionContextValue>(
104
+ () => ({ open: effective, toggle, size, variant, iconPosition }),
105
+ [effective, toggle, size, variant, iconPosition],
106
+ );
107
+
108
+ return (
109
+ <div
110
+ ref={ref}
111
+ className={cx("ac-root", classNames?.root, className)}
112
+ style={style}
113
+ data-variant={variant}
114
+ data-size={size}
115
+ >
116
+ <AccordionContext value={context}>
117
+ {items
118
+ ? items.map((item) => (
119
+ <AccordionItem
120
+ key={item.value}
121
+ value={item.value}
122
+ title={item.title}
123
+ description={item.description}
124
+ disabled={item.disabled}
125
+ >
126
+ {item.content}
127
+ </AccordionItem>
128
+ ))
129
+ : children}
130
+ </AccordionContext>
131
+ </div>
132
+ );
133
+ }
@@ -0,0 +1,120 @@
1
+ "use client";
2
+
3
+ import {
4
+ useId,
5
+ type CSSProperties,
6
+ type MouseEvent,
7
+ type ReactNode,
8
+ type Ref,
9
+ } from "react";
10
+ import { ChevronDownIcon } from "../../shared/react/icons";
11
+ import { useAccordionContext } from "./context";
12
+ import { cx, type AccordionItemSlot } from "./props";
13
+
14
+ export interface AccordionItemProps {
15
+ /** Identifies the panel in the accordion's value. */
16
+ value: string;
17
+ title: ReactNode;
18
+ /** A second line under the title. */
19
+ description?: ReactNode;
20
+ children?: ReactNode;
21
+ /** Something at the end of the header: a badge, a count. */
22
+ meta?: ReactNode;
23
+ /** Replaces the chevron. */
24
+ icon?: ReactNode;
25
+ disabled?: boolean;
26
+ className?: string;
27
+ classNames?: Partial<Record<AccordionItemSlot, string>>;
28
+ style?: CSSProperties;
29
+ ref?: Ref<HTMLDetailsElement>;
30
+ }
31
+
32
+ /**
33
+ * One section. A `<details>` whose open state the accordion owns, so the group
34
+ * can close the others and refuse to close the last one.
35
+ */
36
+ export function AccordionItem(props: AccordionItemProps) {
37
+ const {
38
+ ref,
39
+ value,
40
+ title,
41
+ description,
42
+ children,
43
+ meta,
44
+ icon,
45
+ disabled = false,
46
+ className,
47
+ classNames,
48
+ style,
49
+ } = props;
50
+
51
+ const context = useAccordionContext("AccordionItem");
52
+ const id = useId();
53
+ const open = context.open.includes(value);
54
+
55
+ const onClick = (event: MouseEvent<HTMLElement>) => {
56
+ // The accordion decides; letting the browser toggle as well would fight it.
57
+ event.preventDefault();
58
+ if (!disabled) context.toggle(value);
59
+ };
60
+
61
+ return (
62
+ <details
63
+ ref={ref}
64
+ className={cx("ac-item", classNames?.root, className)}
65
+ style={style}
66
+ open={open}
67
+ data-disabled={disabled || undefined}
68
+ >
69
+ <summary
70
+ id={`${id}-header`}
71
+ className={cx("ac-header", classNames?.header)}
72
+ /*
73
+ * An explicit button role, because a bare <summary> is exposed as a
74
+ * group in Chromium and `aria-expanded` on it is ignored — so the one
75
+ * thing a screen reader most needs to know, whether the section is
76
+ * open, never gets announced. The role changes nothing about the
77
+ * keyboard: Enter and Space still come from <details> itself.
78
+ */
79
+ role="button"
80
+ aria-expanded={open}
81
+ aria-controls={`${id}-content`}
82
+ // A disabled section is marked rather than removed from the tab order:
83
+ // the heading of something you cannot open is still worth reading, and
84
+ // dropping it loses it silently.
85
+ aria-disabled={disabled || undefined}
86
+ onClick={onClick}
87
+ >
88
+ {context.iconPosition === "start" && (
89
+ <span className={cx("ac-icon", classNames?.icon)} aria-hidden="true">
90
+ {icon ?? <ChevronDownIcon />}
91
+ </span>
92
+ )}
93
+
94
+ <span className="ac-heading">
95
+ <span className={cx("ac-title", classNames?.title)}>{title}</span>
96
+ {description && (
97
+ <span className={cx("ac-description", classNames?.description)}>{description}</span>
98
+ )}
99
+ </span>
100
+
101
+ {meta && <span className="ac-meta">{meta}</span>}
102
+
103
+ {context.iconPosition === "end" && (
104
+ <span className={cx("ac-icon", classNames?.icon)} aria-hidden="true">
105
+ {icon ?? <ChevronDownIcon />}
106
+ </span>
107
+ )}
108
+ </summary>
109
+
110
+ <div
111
+ id={`${id}-content`}
112
+ className={cx("ac-content", classNames?.content)}
113
+ role="region"
114
+ aria-labelledby={`${id}-header`}
115
+ >
116
+ <div className={cx("ac-body", classNames?.body)}>{children}</div>
117
+ </div>
118
+ </details>
119
+ );
120
+ }
@@ -0,0 +1,20 @@
1
+ "use client";
2
+
3
+ import { createContext, use } from "react";
4
+ import type { AccordionIconPosition, AccordionSize, AccordionVariant } from "../core/types";
5
+
6
+ export interface AccordionContextValue {
7
+ open: readonly string[];
8
+ toggle(value: string): void;
9
+ size: AccordionSize;
10
+ variant: AccordionVariant;
11
+ iconPosition: AccordionIconPosition;
12
+ }
13
+
14
+ export const AccordionContext = createContext<AccordionContextValue | null>(null);
15
+
16
+ export function useAccordionContext(component: string): AccordionContextValue {
17
+ const context = use(AccordionContext);
18
+ if (!context) throw new Error(`<${component}> must be used inside an <Accordion>.`);
19
+ return context;
20
+ }
@@ -0,0 +1,13 @@
1
+ export type AccordionSlot = "root";
2
+
3
+ export type AccordionItemSlot =
4
+ | "root"
5
+ | "header"
6
+ | "title"
7
+ | "description"
8
+ | "icon"
9
+ | "content"
10
+ | "body";
11
+
12
+ // Shared with every other component, so class handling cannot drift.
13
+ export { cx } from "../../shared/core/cx";
@@ -0,0 +1,207 @@
1
+ /*
2
+ * Accordion styles.
3
+ *
4
+ * Each section is a native <details>, so the marker has to be taken off (two
5
+ * ways: `list-item` display in Firefox, the WebKit pseudo-element elsewhere)
6
+ * before a chevron of our own goes on. Tokens read the shared --gbs-*
7
+ * variables when they are set on an ancestor (set them on :root to theme every
8
+ * component at once). Rules are unlayered: they beat a framework reset on
9
+ * specificity, and lose to anything you pass through `className`. With
10
+ * Tailwind v4, import this file after the framework and inside its components
11
+ * layer - see the README.
12
+ */
13
+
14
+ .ac-root {
15
+ --ac-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
16
+ --ac-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
17
+ --ac-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
18
+ --ac-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
19
+ --ac-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
20
+ --ac-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
21
+ --ac-radius: var(--gbs-radius, var(--dg-radius, 8px));
22
+ --ac-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
23
+ --ac-px: 14px;
24
+ --ac-py: 12px;
25
+ --ac-duration: 180ms;
26
+
27
+ color-scheme: inherit;
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 8px;
31
+ min-width: 0;
32
+ font-size: var(--ac-font-size);
33
+ line-height: 1.5;
34
+ color: var(--ac-fg);
35
+ }
36
+
37
+ :where(.dark, [data-theme="dark"]) .ac-root {
38
+ color-scheme: dark;
39
+ }
40
+ :where(.light, [data-theme="light"]) .ac-root {
41
+ color-scheme: light;
42
+ }
43
+
44
+ :where(.ac-root) *,
45
+ :where(.ac-root) *::before,
46
+ :where(.ac-root) *::after {
47
+ box-sizing: border-box;
48
+ }
49
+
50
+ .ac-root[data-size="sm"] {
51
+ --ac-px: 10px;
52
+ --ac-py: 8px;
53
+ --ac-font-size: 12px;
54
+ }
55
+ .ac-root[data-size="lg"] {
56
+ --ac-px: 18px;
57
+ --ac-py: 16px;
58
+ --ac-font-size: 14px;
59
+ }
60
+
61
+ /* ---------------------------------------------------------------- item */
62
+
63
+ .ac-item {
64
+ min-width: 0;
65
+ border: 1px solid var(--ac-border);
66
+ border-radius: var(--ac-radius);
67
+ background: var(--ac-bg);
68
+ }
69
+
70
+ /* Contained: one block with dividers instead of separate cards. */
71
+ .ac-root[data-variant="contained"] {
72
+ gap: 0;
73
+ border: 1px solid var(--ac-border);
74
+ border-radius: var(--ac-radius);
75
+ overflow: hidden;
76
+ }
77
+ .ac-root[data-variant="contained"] .ac-item {
78
+ border: 0;
79
+ border-block-end: 1px solid var(--ac-border);
80
+ border-radius: 0;
81
+ }
82
+ .ac-root[data-variant="contained"] .ac-item:last-child {
83
+ border-block-end: 0;
84
+ }
85
+
86
+ /* Plain: rules only, for a sidebar or a FAQ. */
87
+ .ac-root[data-variant="plain"] {
88
+ gap: 0;
89
+ }
90
+ .ac-root[data-variant="plain"] .ac-item {
91
+ border: 0;
92
+ border-block-end: 1px solid var(--ac-border);
93
+ border-radius: 0;
94
+ background: none;
95
+ }
96
+ .ac-root[data-variant="plain"] .ac-header {
97
+ padding-inline: 0;
98
+ }
99
+ .ac-root[data-variant="plain"] .ac-body {
100
+ padding-inline: 0;
101
+ }
102
+
103
+ /* -------------------------------------------------------------- header */
104
+
105
+ .ac-header {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 10px;
109
+ padding: var(--ac-py) var(--ac-px);
110
+ border-radius: inherit;
111
+ cursor: pointer;
112
+ user-select: none;
113
+ /* Firefox draws the triangle through `display: list-item`. */
114
+ list-style: none;
115
+ }
116
+ .ac-header::-webkit-details-marker {
117
+ display: none;
118
+ }
119
+ .ac-header:hover {
120
+ background: var(--ac-hover);
121
+ }
122
+ .ac-header:focus-visible {
123
+ outline: 2px solid var(--ac-focus);
124
+ outline-offset: -2px;
125
+ }
126
+ .ac-item[data-disabled] .ac-header {
127
+ cursor: not-allowed;
128
+ }
129
+ .ac-item[data-disabled] .ac-title {
130
+ color: var(--ac-muted);
131
+ }
132
+
133
+ .ac-heading {
134
+ display: flex;
135
+ flex: 1 1 auto;
136
+ flex-direction: column;
137
+ gap: 1px;
138
+ min-width: 0;
139
+ }
140
+ .ac-title {
141
+ font-weight: 600;
142
+ }
143
+ .ac-description {
144
+ color: var(--ac-muted);
145
+ font-weight: 400;
146
+ }
147
+ .ac-meta {
148
+ display: inline-flex;
149
+ flex: none;
150
+ align-items: center;
151
+ gap: 6px;
152
+ color: var(--ac-muted);
153
+ }
154
+
155
+ .ac-icon {
156
+ display: inline-flex;
157
+ flex: none;
158
+ color: var(--ac-muted);
159
+ transition: rotate var(--ac-duration) ease;
160
+ }
161
+ .ac-icon > svg {
162
+ width: 16px;
163
+ height: 16px;
164
+ }
165
+ .ac-item[open] > .ac-header .ac-icon {
166
+ rotate: 180deg;
167
+ }
168
+
169
+ /* ------------------------------------------------------------- content */
170
+
171
+ .ac-body {
172
+ padding: 0 var(--ac-px) var(--ac-py);
173
+ }
174
+
175
+ /*
176
+ * Opening animates where the browser can do it: `interpolate-size` lets a
177
+ * height of `auto` be interpolated, and `::details-content` is the box to
178
+ * animate. Browsers without either simply show and hide, which is the
179
+ * behaviour everything else falls back to anyway.
180
+ */
181
+ @supports (interpolate-size: allow-keywords) {
182
+ .ac-root {
183
+ interpolate-size: allow-keywords;
184
+ }
185
+ .ac-item::details-content {
186
+ height: 0;
187
+ overflow: hidden;
188
+ transition:
189
+ height var(--ac-duration) ease,
190
+ content-visibility var(--ac-duration) allow-discrete;
191
+ }
192
+ .ac-item[open]::details-content {
193
+ height: auto;
194
+ }
195
+ }
196
+
197
+ @media (prefers-reduced-motion: reduce) {
198
+ .ac-root {
199
+ --ac-duration: 0s;
200
+ }
201
+ }
202
+
203
+ @media (forced-colors: active) {
204
+ .ac-item {
205
+ border: 1px solid CanvasText;
206
+ }
207
+ }
@@ -0,0 +1,39 @@
1
+ # Alert
2
+
3
+ A message that stays in the page: a trial ending, a read-only record, the
4
+ summary above a form that failed validation. For React 19, styled to match the
5
+ rest of the library. No runtime dependencies besides React.
6
+
7
+ ```ts
8
+ import { Alert } from "@/components/alert";
9
+ import "@/components/alert/styles.css";
10
+ ```
11
+
12
+ ```tsx
13
+ <Alert variant="warning" title="Your trial ends in 3 days">
14
+ After that the workspace becomes read-only. <a href="/billing">Add a card</a> to keep it.
15
+ </Alert>
16
+
17
+ <Alert variant="danger" title="We could not save your changes" onDismiss={() => setShown(false)} />
18
+
19
+ <Alert variant="success" size="sm">240 rows imported.</Alert>
20
+ ```
21
+
22
+ **Props:** `variant` (`info` `success` `warning` `danger` `neutral`), `size`
23
+ (`sm` `md`), `title`, `description` or `children`, `icon` (a node, or `false`),
24
+ `actions`, `onDismiss`, `classNames` (`root` `icon` `content` `title`
25
+ `description` `actions` `dismiss`), `localeText`, `ref`, and every `<div>`
26
+ attribute.
27
+
28
+ Which one to reach for:
29
+
30
+ | | Interrupts | Lives | Use for |
31
+ | --- | --- | --- | --- |
32
+ | **Dialog** | Yes, blocks | Top layer | A decision that must happen now |
33
+ | **Toast** | No, and leaves | A corner | Confirming what already happened |
34
+ | **Alert** | No, and stays | In the layout | The state a page or section is in |
35
+
36
+ `liveness(variant)` is exported from the framework-free `core`: problems get
37
+ `role="alert"` and interrupt; everything else gets `role="status"` and waits its
38
+ turn. An alert that was on the page from the start announces nothing either
39
+ way, because a live region only speaks when its contents change.
@@ -0,0 +1,2 @@
1
+ export { liveness, type Liveness } from "./live";
2
+ export type * from "./types";
@@ -0,0 +1,25 @@
1
+ import type { AlertVariant } from "./types";
2
+
3
+ export interface Liveness {
4
+ /** `alert` interrupts whatever is being read; `status` waits its turn. */
5
+ role: "alert" | "status";
6
+ live: "assertive" | "polite";
7
+ }
8
+
9
+ /**
10
+ * How loudly an alert announces itself.
11
+ *
12
+ * A banner that appears after the page has loaded is news, and a screen reader
13
+ * has to be told whether it is worth interrupting for. Problems are:
14
+ * `role="alert"` cuts into whatever is being read, which is right for "your
15
+ * card was declined" and rude for "3 rows imported".
16
+ *
17
+ * A banner that was on the page from the start announces nothing either way —
18
+ * a live region only speaks when its contents change — so this only decides
19
+ * what happens when one appears or its text is replaced.
20
+ */
21
+ export function liveness(variant: AlertVariant): Liveness {
22
+ return variant === "danger" || variant === "warning"
23
+ ? { role: "alert", live: "assertive" }
24
+ : { role: "status", live: "polite" };
25
+ }
@@ -0,0 +1,7 @@
1
+ export type AlertVariant = "info" | "success" | "warning" | "danger" | "neutral";
2
+
3
+ export type AlertSize = "sm" | "md";
4
+
5
+ export interface AlertLocaleText {
6
+ dismiss: string;
7
+ }
@@ -0,0 +1,5 @@
1
+ export { Alert } from "./react/Alert";
2
+ export type { AlertProps } from "./react/Alert";
3
+ export { defaultAlertText } from "./react/locale";
4
+ export type { AlertSlot } from "./react/props";
5
+ export * from "./core";