@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,68 @@
1
+ /** Values accepted wherever a date comes in: a Date, an ISO `yyyy-mm-dd` string or a timestamp. */
2
+ export type DateInput = Date | string | number;
3
+
4
+ export interface DateRange {
5
+ start: Date | null;
6
+ end: Date | null;
7
+ }
8
+
9
+ export type DatePickerSize = "sm" | "md" | "lg";
10
+
11
+ /** Panel shown inside the popover. */
12
+ export type CalendarView = "days" | "months" | "years";
13
+
14
+ export interface CalendarDay {
15
+ date: Date;
16
+ /** Day of the month, 1-31. */
17
+ day: number;
18
+ /** `yyyy-mm-dd` in local time: a stable key, and safe to compare. */
19
+ key: string;
20
+ /** Belongs to a neighbouring month. */
21
+ outside: boolean;
22
+ today: boolean;
23
+ weekend: boolean;
24
+ disabled: boolean;
25
+ }
26
+
27
+ export interface CalendarWeek {
28
+ /** ISO week number, shown when `showWeekNumbers` is set. */
29
+ weekNumber: number;
30
+ days: CalendarDay[];
31
+ }
32
+
33
+ export interface CalendarMonth {
34
+ year: number;
35
+ /** 0-11, as in `Date.prototype.getMonth`. */
36
+ month: number;
37
+ weeks: CalendarWeek[];
38
+ }
39
+
40
+ /** What makes a day unselectable. */
41
+ export interface DateLimits {
42
+ min?: Date | null;
43
+ max?: Date | null;
44
+ isDateDisabled?(date: Date): boolean;
45
+ }
46
+
47
+ export interface DatePickerLocaleText {
48
+ calendarLabel: string;
49
+ openCalendar: string;
50
+ clear: string;
51
+ today: string;
52
+ previousMonth: string;
53
+ nextMonth: string;
54
+ previousYears: string;
55
+ nextYears: string;
56
+ /** Button that switches the day grid to the month and year panels. */
57
+ chooseMonthYear: string;
58
+ monthPanelLabel: string;
59
+ yearPanelLabel: string;
60
+ weekNumber: string;
61
+ startDate: string;
62
+ endDate: string;
63
+ invalidDate: string;
64
+ outOfRange: string;
65
+ presets: string;
66
+ selectedDate(date: string): string;
67
+ selectedRange(start: string, end: string): string;
68
+ }
@@ -0,0 +1,16 @@
1
+ export { DatePicker } from "./react/DatePicker";
2
+ export type { DatePickerProps } from "./react/DatePicker";
3
+ export { DateRangePicker } from "./react/DateRangePicker";
4
+ export type { DateRangePickerProps, DateRangeInput } from "./react/DateRangePicker";
5
+ export type { DatePreset } from "./react/CalendarPanel";
6
+ export { formatWith, useDatePicker } from "./react/useDatePicker";
7
+ export type { DatePickerEngine, RangeField, UseDatePickerParams } from "./react/useDatePicker";
8
+ export { defaultDatePickerText } from "./react/locale";
9
+ export type { DayState } from "./react/Calendar";
10
+ export type {
11
+ DateFormat,
12
+ DatePickerHandle,
13
+ DatePickerSharedProps,
14
+ DatePickerSlot,
15
+ } from "./react/props";
16
+ export * from "./core";
@@ -0,0 +1,407 @@
1
+ {
2
+ "passportVersion": "1.0.0",
3
+ "identity": {
4
+ "component": "DatePicker",
5
+ "folder": "date-picker",
6
+ "exports": [
7
+ "DEFAULT_DATE_FORMAT",
8
+ "DatePicker",
9
+ "DateRangePicker"
10
+ ]
11
+ },
12
+ "source": {
13
+ "libraryVersion": "2.4.0",
14
+ "files": [
15
+ "core/calendar.ts",
16
+ "core/format.ts",
17
+ "core/index.ts",
18
+ "core/today.ts",
19
+ "core/types.ts",
20
+ "index.ts",
21
+ "react/Calendar.tsx",
22
+ "react/CalendarPanel.tsx",
23
+ "react/DatePicker.tsx",
24
+ "react/DateRangePicker.tsx",
25
+ "react/MonthYearPanels.tsx",
26
+ "react/Popover.tsx",
27
+ "react/icons.tsx",
28
+ "react/locale.ts",
29
+ "react/props.ts",
30
+ "react/useDatePicker.ts"
31
+ ],
32
+ "sourceHash": "sha256:3dba4cc6b29876969fcc114163bd9efae4ebcf6257e23b258d4f12f643115b78"
33
+ },
34
+ "props": [
35
+ {
36
+ "name": "allowInput",
37
+ "type": "boolean",
38
+ "typeText": "boolean | undefined",
39
+ "required": false,
40
+ "default": true,
41
+ "origin": "derived",
42
+ "description": "Let people type a date instead of picking one. Default true.",
43
+ "descriptionOrigin": "jsdoc"
44
+ },
45
+ {
46
+ "name": "className",
47
+ "type": "string",
48
+ "typeText": "string | undefined",
49
+ "required": false,
50
+ "origin": "derived"
51
+ },
52
+ {
53
+ "name": "classNames",
54
+ "type": "other",
55
+ "typeText": "Partial<Record<DatePickerSlot, string>> | undefined",
56
+ "required": false,
57
+ "origin": "derived"
58
+ },
59
+ {
60
+ "name": "clearable",
61
+ "type": "boolean",
62
+ "typeText": "boolean | undefined",
63
+ "required": false,
64
+ "default": true,
65
+ "origin": "derived",
66
+ "description": "Show the clear button. Default true.",
67
+ "descriptionOrigin": "jsdoc"
68
+ },
69
+ {
70
+ "name": "closeOnSelect",
71
+ "type": "boolean",
72
+ "typeText": "boolean | undefined",
73
+ "required": false,
74
+ "default": true,
75
+ "origin": "derived",
76
+ "description": "Close the calendar after choosing a date. Default true.",
77
+ "descriptionOrigin": "jsdoc"
78
+ },
79
+ {
80
+ "name": "defaultValue",
81
+ "type": "other",
82
+ "typeText": "DateInput | null | undefined",
83
+ "required": false,
84
+ "origin": "derived"
85
+ },
86
+ {
87
+ "name": "description",
88
+ "type": "other",
89
+ "typeText": "ReactNode",
90
+ "required": false,
91
+ "origin": "derived"
92
+ },
93
+ {
94
+ "name": "disabled",
95
+ "type": "boolean",
96
+ "typeText": "boolean | undefined",
97
+ "required": false,
98
+ "default": false,
99
+ "origin": "derived"
100
+ },
101
+ {
102
+ "name": "error",
103
+ "type": "other",
104
+ "typeText": "ReactNode",
105
+ "required": false,
106
+ "origin": "derived",
107
+ "description": "Message shown below the control; also marks the control invalid.",
108
+ "descriptionOrigin": "jsdoc"
109
+ },
110
+ {
111
+ "name": "fixedWeeks",
112
+ "type": "boolean",
113
+ "typeText": "boolean | undefined",
114
+ "required": false,
115
+ "default": true,
116
+ "origin": "derived",
117
+ "description": "Always six week rows, so the popover never changes height. Default true.",
118
+ "descriptionOrigin": "jsdoc"
119
+ },
120
+ {
121
+ "name": "format",
122
+ "type": "other",
123
+ "typeText": "DateFormat | undefined",
124
+ "required": false,
125
+ "origin": "derived"
126
+ },
127
+ {
128
+ "name": "id",
129
+ "type": "string",
130
+ "typeText": "string | undefined",
131
+ "required": false,
132
+ "origin": "derived"
133
+ },
134
+ {
135
+ "name": "isDateDisabled",
136
+ "type": "function",
137
+ "signature": "((date: Date) => boolean) | undefined",
138
+ "required": false,
139
+ "origin": "derived",
140
+ "description": "Called for every rendered day; return true to block it (weekends, holidays).",
141
+ "descriptionOrigin": "jsdoc"
142
+ },
143
+ {
144
+ "name": "label",
145
+ "type": "other",
146
+ "typeText": "ReactNode",
147
+ "required": false,
148
+ "origin": "derived"
149
+ },
150
+ {
151
+ "name": "locale",
152
+ "type": "string",
153
+ "typeText": "string | undefined",
154
+ "required": false,
155
+ "origin": "derived",
156
+ "description": "BCP-47 tag deciding month names, field order and the first day of the week.\nDefaults to the runtime's locale — pass it explicitly when you render on a\nserver, so the markup matches what the browser produces.",
157
+ "descriptionOrigin": "jsdoc"
158
+ },
159
+ {
160
+ "name": "localeText",
161
+ "type": "other",
162
+ "typeText": "Partial<DatePickerLocaleText> | undefined",
163
+ "required": false,
164
+ "origin": "derived"
165
+ },
166
+ {
167
+ "name": "max",
168
+ "type": "other",
169
+ "typeText": "DateInput | null | undefined",
170
+ "required": false,
171
+ "origin": "derived"
172
+ },
173
+ {
174
+ "name": "min",
175
+ "type": "other",
176
+ "typeText": "DateInput | null | undefined",
177
+ "required": false,
178
+ "origin": "derived",
179
+ "description": "Earliest and latest selectable day.",
180
+ "descriptionOrigin": "jsdoc"
181
+ },
182
+ {
183
+ "name": "name",
184
+ "type": "string",
185
+ "typeText": "string | undefined",
186
+ "required": false,
187
+ "origin": "derived",
188
+ "description": "Posts the value as `yyyy-mm-dd` in a hidden input.",
189
+ "descriptionOrigin": "jsdoc"
190
+ },
191
+ {
192
+ "name": "numberOfMonths",
193
+ "type": "number",
194
+ "typeText": "number | undefined",
195
+ "required": false,
196
+ "default": 1,
197
+ "origin": "derived",
198
+ "description": "Months shown side by side. Default 1, or 2 for the range picker.",
199
+ "descriptionOrigin": "jsdoc"
200
+ },
201
+ {
202
+ "name": "onChange",
203
+ "type": "function",
204
+ "signature": "((date: Date | null) => void) | undefined",
205
+ "required": false,
206
+ "origin": "derived"
207
+ },
208
+ {
209
+ "name": "onOpenChange",
210
+ "type": "function",
211
+ "signature": "((open: boolean) => void) | undefined",
212
+ "required": false,
213
+ "origin": "derived"
214
+ },
215
+ {
216
+ "name": "placeholder",
217
+ "type": "string",
218
+ "typeText": "string | undefined",
219
+ "required": false,
220
+ "origin": "derived"
221
+ },
222
+ {
223
+ "name": "presets",
224
+ "type": "other",
225
+ "typeText": "readonly DatePreset[] | undefined",
226
+ "required": false,
227
+ "origin": "derived",
228
+ "description": "Shortcuts shown beside the calendar (\"Last 7 days\").",
229
+ "descriptionOrigin": "jsdoc"
230
+ },
231
+ {
232
+ "name": "readOnly",
233
+ "type": "boolean",
234
+ "typeText": "boolean | undefined",
235
+ "required": false,
236
+ "default": false,
237
+ "origin": "derived",
238
+ "description": "Shows the value but blocks typing and picking.",
239
+ "descriptionOrigin": "jsdoc"
240
+ },
241
+ {
242
+ "name": "ref",
243
+ "type": "other",
244
+ "typeText": "Ref<DatePickerHandle<Date | null>> | undefined",
245
+ "required": false,
246
+ "origin": "derived"
247
+ },
248
+ {
249
+ "name": "required",
250
+ "type": "boolean",
251
+ "typeText": "boolean | undefined",
252
+ "required": false,
253
+ "default": false,
254
+ "origin": "derived"
255
+ },
256
+ {
257
+ "name": "showToday",
258
+ "type": "boolean",
259
+ "typeText": "boolean | undefined",
260
+ "required": false,
261
+ "default": true,
262
+ "origin": "derived",
263
+ "description": "Show the \"Today\" shortcut in the footer. Default true.",
264
+ "descriptionOrigin": "jsdoc"
265
+ },
266
+ {
267
+ "name": "showWeekNumbers",
268
+ "type": "boolean",
269
+ "typeText": "boolean | undefined",
270
+ "required": false,
271
+ "default": false,
272
+ "origin": "derived"
273
+ },
274
+ {
275
+ "name": "size",
276
+ "type": "enum",
277
+ "values": [
278
+ "lg",
279
+ "md",
280
+ "sm"
281
+ ],
282
+ "typeText": "DatePickerSize | undefined",
283
+ "required": false,
284
+ "default": "md",
285
+ "origin": "derived"
286
+ },
287
+ {
288
+ "name": "style",
289
+ "type": "other",
290
+ "typeText": "CSSProperties | undefined",
291
+ "required": false,
292
+ "origin": "derived"
293
+ },
294
+ {
295
+ "name": "value",
296
+ "type": "other",
297
+ "typeText": "DateInput | null | undefined",
298
+ "required": false,
299
+ "origin": "derived"
300
+ },
301
+ {
302
+ "name": "weekStartsOn",
303
+ "type": "number",
304
+ "typeText": "number | undefined",
305
+ "required": false,
306
+ "origin": "derived",
307
+ "description": "0 = Sunday. Defaults to the locale's first day of the week.",
308
+ "descriptionOrigin": "jsdoc"
309
+ }
310
+ ],
311
+ "events": [
312
+ {
313
+ "name": "onChange",
314
+ "signature": "((date: Date | null) => void) | undefined"
315
+ },
316
+ {
317
+ "name": "onOpenChange",
318
+ "signature": "((open: boolean) => void) | undefined"
319
+ }
320
+ ],
321
+ "slots": [
322
+ "root",
323
+ "label",
324
+ "control",
325
+ "input",
326
+ "popover",
327
+ "calendar",
328
+ "day",
329
+ "footer",
330
+ "presets"
331
+ ],
332
+ "states": [
333
+ {
334
+ "attr": "data-autofocus"
335
+ },
336
+ {
337
+ "attr": "data-disabled"
338
+ },
339
+ {
340
+ "attr": "data-in-range"
341
+ },
342
+ {
343
+ "attr": "data-invalid"
344
+ },
345
+ {
346
+ "attr": "data-key"
347
+ },
348
+ {
349
+ "attr": "data-outside"
350
+ },
351
+ {
352
+ "attr": "data-range-end"
353
+ },
354
+ {
355
+ "attr": "data-range-start"
356
+ },
357
+ {
358
+ "attr": "data-required"
359
+ },
360
+ {
361
+ "attr": "data-selected"
362
+ },
363
+ {
364
+ "attr": "data-size",
365
+ "values": [
366
+ "lg",
367
+ "sm"
368
+ ]
369
+ },
370
+ {
371
+ "attr": "data-state",
372
+ "values": [
373
+ "open"
374
+ ]
375
+ },
376
+ {
377
+ "attr": "data-theme",
378
+ "values": [
379
+ "dark",
380
+ "light"
381
+ ]
382
+ },
383
+ {
384
+ "attr": "data-today"
385
+ },
386
+ {
387
+ "attr": "data-weekend"
388
+ }
389
+ ],
390
+ "accessibility": {
391
+ "supplied": [],
392
+ "required": []
393
+ },
394
+ "composition": {},
395
+ "operations": {},
396
+ "intentDomains": [],
397
+ "safeMutations": {},
398
+ "examples": [],
399
+ "coverage": {
400
+ "propsTotal": 33,
401
+ "propsDescribed": 14,
402
+ "describedPct": 42,
403
+ "authoredSections": [
404
+ "accessibility"
405
+ ]
406
+ }
407
+ }
@@ -0,0 +1,160 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, type KeyboardEvent } from "react";
4
+ import { formatDate } from "../core/format";
5
+ import type { CalendarDay, CalendarMonth, DatePickerLocaleText } from "../core/types";
6
+ import type { WeekdayName } from "../core/format";
7
+ import { cx } from "./props";
8
+
9
+ export interface DayState {
10
+ selected: boolean;
11
+ rangeStart: boolean;
12
+ rangeEnd: boolean;
13
+ inRange: boolean;
14
+ }
15
+
16
+ interface CalendarProps {
17
+ months: CalendarMonth[];
18
+ weekdays: WeekdayName[];
19
+ locale?: string;
20
+ /** `yyyy-mm-dd` of the one day that is in the tab order. */
21
+ focusedKey: string;
22
+ /** Pull DOM focus to the focused day (false while someone types in the field). */
23
+ gridFocus: boolean;
24
+ showWeekNumbers: boolean;
25
+ text: DatePickerLocaleText;
26
+ dayClassName?: string;
27
+ monthLabel(month: CalendarMonth): string;
28
+ getDayState(date: Date): DayState;
29
+ onSelect(date: Date): void;
30
+ onPreview(date: Date | null): void;
31
+ onKeyDown(event: KeyboardEvent<HTMLElement>): void;
32
+ }
33
+
34
+ const FULL_DATE: Intl.DateTimeFormatOptions = {
35
+ weekday: "long",
36
+ day: "numeric",
37
+ month: "long",
38
+ year: "numeric",
39
+ };
40
+
41
+ /**
42
+ * One or more month grids. Only the focused day is tabbable; the arrow keys move
43
+ * it, which is the WAI-ARIA grid pattern for a date picker.
44
+ */
45
+ export function Calendar({
46
+ months,
47
+ weekdays,
48
+ locale,
49
+ focusedKey,
50
+ gridFocus,
51
+ showWeekNumbers,
52
+ text,
53
+ dayClassName,
54
+ monthLabel,
55
+ getDayState,
56
+ onSelect,
57
+ onPreview,
58
+ onKeyDown,
59
+ }: CalendarProps) {
60
+ const ref = useRef<HTMLDivElement>(null);
61
+ // With two months side by side the same day appears twice, so the neighbouring
62
+ // month's days are blanked out rather than rendered as duplicates.
63
+ const hideOutside = months.length > 1;
64
+
65
+ useEffect(() => {
66
+ if (!gridFocus) return;
67
+ const day = ref.current?.querySelector<HTMLElement>(`[data-key="${focusedKey}"]`);
68
+ if (day && day !== document.activeElement) day.focus({ preventScroll: true });
69
+ }, [gridFocus, focusedKey]);
70
+
71
+ const renderDay = (day: CalendarDay) => {
72
+ if (day.outside && hideOutside) {
73
+ return <td key={day.key} className="dp-cell" aria-hidden="true" />;
74
+ }
75
+ const state = getDayState(day.date);
76
+ const focused = day.key === focusedKey;
77
+ return (
78
+ <td
79
+ key={day.key}
80
+ role="gridcell"
81
+ className="dp-cell"
82
+ aria-selected={state.selected || undefined}
83
+ data-in-range={state.inRange || undefined}
84
+ data-range-start={state.rangeStart || undefined}
85
+ data-range-end={state.rangeEnd || undefined}
86
+ >
87
+ <button
88
+ type="button"
89
+ className={cx("dp-day", dayClassName)}
90
+ data-key={day.key}
91
+ data-autofocus={focused || undefined}
92
+ data-today={day.today || undefined}
93
+ data-outside={day.outside || undefined}
94
+ data-weekend={day.weekend || undefined}
95
+ data-selected={state.selected || undefined}
96
+ tabIndex={focused ? 0 : -1}
97
+ disabled={day.disabled}
98
+ aria-label={formatDate(day.date, locale, FULL_DATE)}
99
+ aria-current={day.today ? "date" : undefined}
100
+ onClick={() => onSelect(day.date)}
101
+ onPointerEnter={() => onPreview(day.date)}
102
+ onFocus={() => onPreview(day.date)}
103
+ >
104
+ {day.day}
105
+ </button>
106
+ </td>
107
+ );
108
+ };
109
+
110
+ return (
111
+ <div
112
+ ref={ref}
113
+ className="dp-months"
114
+ onKeyDown={onKeyDown}
115
+ onPointerLeave={() => onPreview(null)}
116
+ >
117
+ {months.map((month) => {
118
+ const label = monthLabel(month);
119
+ return (
120
+ <div key={`${month.year}-${month.month}`} className="dp-month">
121
+ {months.length > 1 && (
122
+ <div className="dp-month-caption" aria-hidden="true">
123
+ {label}
124
+ </div>
125
+ )}
126
+ <table role="grid" aria-label={label} className="dp-grid">
127
+ <thead>
128
+ <tr>
129
+ {showWeekNumbers && (
130
+ <th scope="col" className="dp-week-number">
131
+ <abbr title={text.weekNumber}>#</abbr>
132
+ </th>
133
+ )}
134
+ {weekdays.map((weekday) => (
135
+ <th key={weekday.long} scope="col" abbr={weekday.long} className="dp-weekday">
136
+ <span aria-hidden="true">{weekday.short}</span>
137
+ <span className="dp-sr-only">{weekday.long}</span>
138
+ </th>
139
+ ))}
140
+ </tr>
141
+ </thead>
142
+ <tbody>
143
+ {month.weeks.map((week) => (
144
+ <tr key={week.days[0].key} role="row">
145
+ {showWeekNumbers && (
146
+ <th scope="row" className="dp-week-number">
147
+ {week.weekNumber}
148
+ </th>
149
+ )}
150
+ {week.days.map(renderDay)}
151
+ </tr>
152
+ ))}
153
+ </tbody>
154
+ </table>
155
+ </div>
156
+ );
157
+ })}
158
+ </div>
159
+ );
160
+ }