@kouji-ui/core 0.1.1 → 0.1.2

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 (535) hide show
  1. package/fesm2022/kouji-ui-core.mjs +26789 -0
  2. package/fesm2022/kouji-ui-core.mjs.map +1 -0
  3. package/package.json +5 -6
  4. package/types/kouji-ui-core.d.ts +13545 -0
  5. package/.turbo/turbo-build.log +0 -30
  6. package/CHANGELOG.md +0 -190
  7. package/ng-package.json +0 -11
  8. package/src/a11y/.gitkeep +0 -0
  9. package/src/a11y/aria-describedby.spec.ts +0 -55
  10. package/src/a11y/aria-describedby.ts +0 -37
  11. package/src/a11y/aria-labelledby.spec.ts +0 -55
  12. package/src/a11y/aria-labelledby.ts +0 -38
  13. package/src/a11y/focus-trap.spec.ts +0 -86
  14. package/src/a11y/focus-trap.ts +0 -72
  15. package/src/a11y/index.ts +0 -10
  16. package/src/a11y/live-region.spec.ts +0 -58
  17. package/src/a11y/live-region.ts +0 -50
  18. package/src/a11y/roving-tabindex.spec.ts +0 -201
  19. package/src/a11y/roving-tabindex.ts +0 -153
  20. package/src/a11y/visually-hidden.spec.ts +0 -34
  21. package/src/a11y/visually-hidden.ts +0 -26
  22. package/src/accordion/accordion.context.ts +0 -44
  23. package/src/accordion/accordion.spec.ts +0 -242
  24. package/src/accordion/accordion.ts +0 -401
  25. package/src/accordion/index.ts +0 -8
  26. package/src/alert/alert.context.ts +0 -28
  27. package/src/alert/alert.spec.ts +0 -217
  28. package/src/alert/alert.ts +0 -417
  29. package/src/alert/config.ts +0 -46
  30. package/src/alert/index.ts +0 -19
  31. package/src/avatar/avatar-group.context.ts +0 -45
  32. package/src/avatar/avatar-group.spec.ts +0 -358
  33. package/src/avatar/avatar-group.ts +0 -259
  34. package/src/avatar/avatar.spec.ts +0 -18
  35. package/src/avatar/avatar.ts +0 -39
  36. package/src/avatar/index.ts +0 -11
  37. package/src/badge/badge.spec.ts +0 -28
  38. package/src/badge/badge.ts +0 -35
  39. package/src/badge/index.ts +0 -1
  40. package/src/breadcrumb/breadcrumb-current.ts +0 -38
  41. package/src/breadcrumb/breadcrumb-ellipsis.ts +0 -71
  42. package/src/breadcrumb/breadcrumb-item.ts +0 -41
  43. package/src/breadcrumb/breadcrumb-link.ts +0 -44
  44. package/src/breadcrumb/breadcrumb-list.ts +0 -42
  45. package/src/breadcrumb/breadcrumb-separator.ts +0 -45
  46. package/src/breadcrumb/breadcrumb.context.ts +0 -45
  47. package/src/breadcrumb/breadcrumb.spec.ts +0 -354
  48. package/src/breadcrumb/breadcrumb.ts +0 -239
  49. package/src/breadcrumb/config.ts +0 -84
  50. package/src/breadcrumb/index.ts +0 -18
  51. package/src/button/_examples/button.example.ts +0 -71
  52. package/src/button/_examples/button.finance.example.ts +0 -83
  53. package/src/button/_examples/button.retro.example.ts +0 -91
  54. package/src/button/_examples/button.sizes.example.ts +0 -60
  55. package/src/button/_examples/index.ts +0 -6
  56. package/src/button/button.spec.ts +0 -163
  57. package/src/button/button.ts +0 -142
  58. package/src/button/config.spec.ts +0 -33
  59. package/src/button/config.ts +0 -45
  60. package/src/button/index.ts +0 -2
  61. package/src/button-group/button-group.context.ts +0 -28
  62. package/src/button-group/button-group.spec.ts +0 -99
  63. package/src/button-group/button-group.ts +0 -99
  64. package/src/button-group/index.ts +0 -2
  65. package/src/calendar/calendar-day.ts +0 -102
  66. package/src/calendar/calendar-grid.ts +0 -90
  67. package/src/calendar/calendar-header.ts +0 -65
  68. package/src/calendar/calendar.context.ts +0 -53
  69. package/src/calendar/calendar.spec.ts +0 -225
  70. package/src/calendar/calendar.ts +0 -233
  71. package/src/calendar/date-utils.ts +0 -225
  72. package/src/calendar/index.ts +0 -28
  73. package/src/carousel/carousel.context.ts +0 -81
  74. package/src/carousel/carousel.spec.ts +0 -337
  75. package/src/carousel/carousel.ts +0 -919
  76. package/src/carousel/index.ts +0 -22
  77. package/src/cascade-select/cascade-select-option.ts +0 -205
  78. package/src/cascade-select/cascade-select-panel.ts +0 -106
  79. package/src/cascade-select/cascade-select-root.ts +0 -265
  80. package/src/cascade-select/cascade-select-sub-panel.ts +0 -168
  81. package/src/cascade-select/cascade-select-trigger.ts +0 -44
  82. package/src/cascade-select/cascade-select.context.ts +0 -71
  83. package/src/cascade-select/cascade-select.spec.ts +0 -241
  84. package/src/cascade-select/cascade-select.ts +0 -5
  85. package/src/cascade-select/index.ts +0 -11
  86. package/src/chart/chart.spec.ts +0 -27
  87. package/src/chart/chart.ts +0 -52
  88. package/src/chart/index.ts +0 -1
  89. package/src/chat/chat-avatar.ts +0 -31
  90. package/src/chat/chat-bubble.ts +0 -49
  91. package/src/chat/chat-footer.ts +0 -67
  92. package/src/chat/chat-header.ts +0 -41
  93. package/src/chat/chat-log.ts +0 -43
  94. package/src/chat/chat.context.ts +0 -64
  95. package/src/chat/chat.spec.ts +0 -341
  96. package/src/chat/chat.ts +0 -191
  97. package/src/chat/config.ts +0 -53
  98. package/src/chat/index.ts +0 -21
  99. package/src/checkbox/checkbox.spec.ts +0 -35
  100. package/src/checkbox/checkbox.ts +0 -89
  101. package/src/checkbox/index.ts +0 -1
  102. package/src/color-picker/color-picker.context.ts +0 -74
  103. package/src/color-picker/color-picker.spec.ts +0 -241
  104. package/src/color-picker/color-picker.ts +0 -698
  105. package/src/color-picker/color-picker.utils.ts +0 -140
  106. package/src/color-picker/index.ts +0 -28
  107. package/src/combobox/combobox-input.ts +0 -143
  108. package/src/combobox/combobox-listbox.ts +0 -49
  109. package/src/combobox/combobox-option.ts +0 -43
  110. package/src/combobox/combobox-root.ts +0 -281
  111. package/src/combobox/combobox.spec.ts +0 -75
  112. package/src/combobox/combobox.ts +0 -4
  113. package/src/combobox/index.ts +0 -4
  114. package/src/command-palette/command-empty.ts +0 -36
  115. package/src/command-palette/command-group.ts +0 -21
  116. package/src/command-palette/command-input.ts +0 -70
  117. package/src/command-palette/command-item.ts +0 -60
  118. package/src/command-palette/command-list.ts +0 -25
  119. package/src/command-palette/command-palette-dialog.ts +0 -74
  120. package/src/command-palette/command-palette-trigger.ts +0 -64
  121. package/src/command-palette/command-palette.filters.ts +0 -53
  122. package/src/command-palette/command-palette.spec.ts +0 -349
  123. package/src/command-palette/command-palette.ts +0 -204
  124. package/src/command-palette/command-separator.ts +0 -18
  125. package/src/command-palette/index.ts +0 -15
  126. package/src/confirm-popup/confirm-popup-action.ts +0 -39
  127. package/src/confirm-popup/confirm-popup-cancel.ts +0 -38
  128. package/src/confirm-popup/confirm-popup-content.ts +0 -113
  129. package/src/confirm-popup/confirm-popup-message.ts +0 -36
  130. package/src/confirm-popup/confirm-popup-trigger.ts +0 -31
  131. package/src/confirm-popup/confirm-popup.context.ts +0 -41
  132. package/src/confirm-popup/confirm-popup.spec.ts +0 -337
  133. package/src/confirm-popup/confirm-popup.ts +0 -109
  134. package/src/confirm-popup/index.ts +0 -12
  135. package/src/date-picker/date-picker-calendar.ts +0 -65
  136. package/src/date-picker/date-picker-trigger.ts +0 -215
  137. package/src/date-picker/date-picker.context.ts +0 -50
  138. package/src/date-picker/date-picker.spec.ts +0 -117
  139. package/src/date-picker/date-picker.ts +0 -127
  140. package/src/date-picker/index.ts +0 -7
  141. package/src/dialog/_examples/dialog.confirm.example.ts +0 -145
  142. package/src/dialog/_examples/dialog.example.ts +0 -106
  143. package/src/dialog/_examples/dialog.finance.example.ts +0 -121
  144. package/src/dialog/_examples/dialog.retro.example.ts +0 -126
  145. package/src/dialog/_examples/index.ts +0 -6
  146. package/src/dialog/dialog.ref.ts +0 -42
  147. package/src/dialog/dialog.service.ts +0 -66
  148. package/src/dialog/dialog.spec.ts +0 -37
  149. package/src/dialog/dialog.ts +0 -26
  150. package/src/dialog/index.ts +0 -3
  151. package/src/divider/divider.spec.ts +0 -223
  152. package/src/divider/divider.ts +0 -137
  153. package/src/divider/index.ts +0 -5
  154. package/src/drawer/drawer.ref.ts +0 -63
  155. package/src/drawer/drawer.service.ts +0 -106
  156. package/src/drawer/drawer.spec.ts +0 -117
  157. package/src/drawer/drawer.ts +0 -122
  158. package/src/drawer/index.ts +0 -10
  159. package/src/dropdown-menu/dropdown-menu-content.ts +0 -258
  160. package/src/dropdown-menu/dropdown-menu-group.ts +0 -31
  161. package/src/dropdown-menu/dropdown-menu-item.ts +0 -51
  162. package/src/dropdown-menu/dropdown-menu-label.ts +0 -41
  163. package/src/dropdown-menu/dropdown-menu-separator.ts +0 -27
  164. package/src/dropdown-menu/dropdown-menu-trigger.ts +0 -140
  165. package/src/dropdown-menu/dropdown-menu.spec.ts +0 -265
  166. package/src/dropdown-menu/dropdown-menu.ts +0 -60
  167. package/src/dropdown-menu/index.ts +0 -15
  168. package/src/example-components.ts +0 -42
  169. package/src/field/field-error.ts +0 -49
  170. package/src/field/field-group.ts +0 -39
  171. package/src/field/field-help.ts +0 -47
  172. package/src/field/field-label.ts +0 -30
  173. package/src/field/field.context.ts +0 -28
  174. package/src/field/field.spec.ts +0 -179
  175. package/src/field/field.ts +0 -121
  176. package/src/field/index.ts +0 -6
  177. package/src/file-upload/file-upload.context.ts +0 -89
  178. package/src/file-upload/file-upload.spec.ts +0 -290
  179. package/src/file-upload/file-upload.ts +0 -639
  180. package/src/file-upload/file-upload.types.ts +0 -59
  181. package/src/file-upload/index.ts +0 -23
  182. package/src/form/form-error-summary.ts +0 -87
  183. package/src/form/form-field.context.ts +0 -3
  184. package/src/form/form-field.spec.ts +0 -25
  185. package/src/form/form-field.ts +0 -52
  186. package/src/form/form.context.ts +0 -53
  187. package/src/form/form.spec.ts +0 -162
  188. package/src/form/form.ts +0 -326
  189. package/src/form/index.ts +0 -11
  190. package/src/icon/E2E.md +0 -14
  191. package/src/icon/icon.directive.spec.ts +0 -198
  192. package/src/icon/icon.directive.ts +0 -113
  193. package/src/icon/icon.mode.spec.ts +0 -29
  194. package/src/icon/icon.mode.ts +0 -23
  195. package/src/icon/icon.providers.spec.ts +0 -63
  196. package/src/icon/icon.providers.ts +0 -47
  197. package/src/icon/icon.resolver.spec.ts +0 -96
  198. package/src/icon/icon.resolver.ts +0 -49
  199. package/src/icon/icon.tokens.ts +0 -88
  200. package/src/icon/icon.types.ts +0 -48
  201. package/src/icon/index.ts +0 -21
  202. package/src/input/index.ts +0 -1
  203. package/src/input/input.spec.ts +0 -43
  204. package/src/input/input.ts +0 -89
  205. package/src/input-group/index.ts +0 -3
  206. package/src/input-group/input-group-addon.ts +0 -92
  207. package/src/input-group/input-group.context.ts +0 -27
  208. package/src/input-group/input-group.spec.ts +0 -186
  209. package/src/input-group/input-group.ts +0 -136
  210. package/src/input-mask/index.ts +0 -11
  211. package/src/input-mask/input-mask.compile.ts +0 -69
  212. package/src/input-mask/input-mask.engine.ts +0 -376
  213. package/src/input-mask/input-mask.presets.ts +0 -24
  214. package/src/input-mask/input-mask.spec.ts +0 -304
  215. package/src/input-mask/input-mask.tokens.ts +0 -49
  216. package/src/input-mask/input-mask.ts +0 -280
  217. package/src/input-otp/index.ts +0 -2
  218. package/src/input-otp/input-otp.context.ts +0 -41
  219. package/src/input-otp/input-otp.spec.ts +0 -308
  220. package/src/input-otp/input-otp.ts +0 -470
  221. package/src/kbd/index.ts +0 -1
  222. package/src/kbd/kbd.spec.ts +0 -127
  223. package/src/kbd/kbd.ts +0 -132
  224. package/src/link/config.ts +0 -44
  225. package/src/link/index.ts +0 -2
  226. package/src/link/link.spec.ts +0 -246
  227. package/src/link/link.ts +0 -226
  228. package/src/list/index.ts +0 -11
  229. package/src/list/list.spec.ts +0 -237
  230. package/src/list/list.ts +0 -277
  231. package/src/menubar/index.ts +0 -7
  232. package/src/menubar/menubar-item.ts +0 -204
  233. package/src/menubar/menubar.context.ts +0 -43
  234. package/src/menubar/menubar.spec.ts +0 -433
  235. package/src/menubar/menubar.ts +0 -309
  236. package/src/number-input/index.ts +0 -4
  237. package/src/number-input/number-input-group.ts +0 -64
  238. package/src/number-input/number-input.context.ts +0 -31
  239. package/src/number-input/number-input.format.ts +0 -148
  240. package/src/number-input/number-input.spec.ts +0 -170
  241. package/src/number-input/number-input.ts +0 -457
  242. package/src/number-input/number-stepper.ts +0 -193
  243. package/src/overlay-badge/index.ts +0 -7
  244. package/src/overlay-badge/overlay-badge-content.ts +0 -73
  245. package/src/overlay-badge/overlay-badge.context.ts +0 -37
  246. package/src/overlay-badge/overlay-badge.spec.ts +0 -220
  247. package/src/overlay-badge/overlay-badge.ts +0 -128
  248. package/src/pagination/config.ts +0 -82
  249. package/src/pagination/index.ts +0 -19
  250. package/src/pagination/page-tokens.ts +0 -78
  251. package/src/pagination/pagination-ellipsis.ts +0 -69
  252. package/src/pagination/pagination-first.ts +0 -84
  253. package/src/pagination/pagination-info.ts +0 -70
  254. package/src/pagination/pagination-item.ts +0 -81
  255. package/src/pagination/pagination-last.ts +0 -85
  256. package/src/pagination/pagination-next.ts +0 -86
  257. package/src/pagination/pagination-previous.ts +0 -90
  258. package/src/pagination/pagination.context.ts +0 -52
  259. package/src/pagination/pagination.spec.ts +0 -388
  260. package/src/pagination/pagination.ts +0 -288
  261. package/src/password-input/index.ts +0 -15
  262. package/src/password-input/password-input.context.ts +0 -65
  263. package/src/password-input/password-input.scorer.ts +0 -34
  264. package/src/password-input/password-input.spec.ts +0 -274
  265. package/src/password-input/password-input.ts +0 -488
  266. package/src/popover/_examples/index.ts +0 -5
  267. package/src/popover/_examples/popover.example.ts +0 -92
  268. package/src/popover/_examples/popover.finance.example.ts +0 -106
  269. package/src/popover/_examples/popover.retro.example.ts +0 -103
  270. package/src/popover/index.ts +0 -5
  271. package/src/popover/popover-arrow.ts +0 -30
  272. package/src/popover/popover-close.ts +0 -36
  273. package/src/popover/popover-content.ts +0 -41
  274. package/src/popover/popover-title.ts +0 -39
  275. package/src/popover/popover-trigger.ts +0 -40
  276. package/src/popover/popover.spec.ts +0 -59
  277. package/src/popover/popover.ts +0 -5
  278. package/src/presets/bind-presets.spec.ts +0 -50
  279. package/src/presets/bind-presets.ts +0 -43
  280. package/src/presets/index.ts +0 -3
  281. package/src/presets/size.spec.ts +0 -67
  282. package/src/presets/size.ts +0 -59
  283. package/src/presets/variant.spec.ts +0 -72
  284. package/src/presets/variant.ts +0 -62
  285. package/src/primitives/.gitkeep +0 -0
  286. package/src/primitives/directionality/directionality.spec.ts +0 -112
  287. package/src/primitives/directionality/directionality.ts +0 -89
  288. package/src/primitives/directionality/index.ts +0 -1
  289. package/src/primitives/forms/form-control.spec.ts +0 -67
  290. package/src/primitives/forms/form-control.ts +0 -94
  291. package/src/primitives/forms/index.ts +0 -1
  292. package/src/primitives/index.ts +0 -6
  293. package/src/primitives/interaction/disabled.spec.ts +0 -47
  294. package/src/primitives/interaction/disabled.ts +0 -31
  295. package/src/primitives/interaction/focus-ring.spec.ts +0 -62
  296. package/src/primitives/interaction/focus-ring.ts +0 -59
  297. package/src/primitives/interaction/index.ts +0 -2
  298. package/src/primitives/list/filterable-list.spec.ts +0 -114
  299. package/src/primitives/list/filterable-list.ts +0 -126
  300. package/src/primitives/list/group.spec.ts +0 -99
  301. package/src/primitives/list/group.ts +0 -139
  302. package/src/primitives/list/index.ts +0 -8
  303. package/src/primitives/list/inject-helpers.ts +0 -8
  304. package/src/primitives/list/item.spec.ts +0 -173
  305. package/src/primitives/list/item.ts +0 -222
  306. package/src/primitives/list/navigator.spec.ts +0 -286
  307. package/src/primitives/list/navigator.ts +0 -238
  308. package/src/primitives/list/selection.spec.ts +0 -214
  309. package/src/primitives/list/selection.ts +0 -339
  310. package/src/primitives/list/tokens.ts +0 -106
  311. package/src/primitives/list/type-ahead.spec.ts +0 -58
  312. package/src/primitives/list/type-ahead.ts +0 -46
  313. package/src/primitives/overlay/backdrop.spec.ts +0 -54
  314. package/src/primitives/overlay/backdrop.ts +0 -31
  315. package/src/primitives/overlay/builder.spec.ts +0 -38
  316. package/src/primitives/overlay/builder.ts +0 -151
  317. package/src/primitives/overlay/container.ts +0 -42
  318. package/src/primitives/overlay/context.ts +0 -14
  319. package/src/primitives/overlay/controller.spec.ts +0 -86
  320. package/src/primitives/overlay/controller.ts +0 -190
  321. package/src/primitives/overlay/id.spec.ts +0 -24
  322. package/src/primitives/overlay/id.ts +0 -17
  323. package/src/primitives/overlay/index.ts +0 -18
  324. package/src/primitives/overlay/overlay.css +0 -42
  325. package/src/primitives/overlay/panel.spec.ts +0 -52
  326. package/src/primitives/overlay/panel.ts +0 -102
  327. package/src/primitives/overlay/stack.spec.ts +0 -55
  328. package/src/primitives/overlay/stack.ts +0 -113
  329. package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +0 -11
  330. package/src/primitives/overlay/strategies/backdrop/blurred.ts +0 -5
  331. package/src/primitives/overlay/strategies/backdrop/none.spec.ts +0 -10
  332. package/src/primitives/overlay/strategies/backdrop/none.ts +0 -9
  333. package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +0 -18
  334. package/src/primitives/overlay/strategies/backdrop/solid.ts +0 -23
  335. package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +0 -28
  336. package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +0 -38
  337. package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +0 -9
  338. package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +0 -8
  339. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +0 -49
  340. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +0 -85
  341. package/src/primitives/overlay/strategies/index.ts +0 -34
  342. package/src/primitives/overlay/strategies/live-announcer/_announce.ts +0 -35
  343. package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +0 -21
  344. package/src/primitives/overlay/strategies/live-announcer/assertive.ts +0 -11
  345. package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +0 -21
  346. package/src/primitives/overlay/strategies/live-announcer/polite.ts +0 -11
  347. package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +0 -12
  348. package/src/primitives/overlay/strategies/live-announcer/silent.ts +0 -5
  349. package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +0 -40
  350. package/src/primitives/overlay/strategies/mount/body-portal.ts +0 -91
  351. package/src/primitives/overlay/strategies/mount/in-container.spec.ts +0 -43
  352. package/src/primitives/overlay/strategies/mount/in-container.ts +0 -39
  353. package/src/primitives/overlay/strategies/mount/in-place.spec.ts +0 -40
  354. package/src/primitives/overlay/strategies/mount/in-place.ts +0 -20
  355. package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +0 -56
  356. package/src/primitives/overlay/strategies/position/anchored-to.ts +0 -248
  357. package/src/primitives/overlay/strategies/position/corner.spec.ts +0 -36
  358. package/src/primitives/overlay/strategies/position/corner.ts +0 -33
  359. package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +0 -32
  360. package/src/primitives/overlay/strategies/position/edge-sheet.ts +0 -36
  361. package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +0 -25
  362. package/src/primitives/overlay/strategies/position/in-place-sibling.ts +0 -13
  363. package/src/primitives/overlay/strategies/position/point-at.spec.ts +0 -40
  364. package/src/primitives/overlay/strategies/position/point-at.ts +0 -34
  365. package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +0 -31
  366. package/src/primitives/overlay/strategies/position/viewport-centered.ts +0 -31
  367. package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +0 -15
  368. package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +0 -39
  369. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +0 -21
  370. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +0 -44
  371. package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +0 -9
  372. package/src/primitives/overlay/strategies/scroll-lock/none.ts +0 -5
  373. package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +0 -32
  374. package/src/primitives/overlay/strategies/trigger-event/on-click.ts +0 -28
  375. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +0 -45
  376. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +0 -70
  377. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +0 -35
  378. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +0 -34
  379. package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +0 -64
  380. package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +0 -37
  381. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +0 -37
  382. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +0 -59
  383. package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +0 -34
  384. package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +0 -86
  385. package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +0 -16
  386. package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +0 -12
  387. package/src/primitives/overlay/tokens.ts +0 -54
  388. package/src/primitives/overlay/trigger.spec.ts +0 -103
  389. package/src/primitives/overlay/trigger.ts +0 -75
  390. package/src/primitives/overlay/types.ts +0 -24
  391. package/src/primitives/overlay/wrapper.ts +0 -50
  392. package/src/primitives/signals/deep-signal.ts +0 -109
  393. package/src/primitives/signals/index.ts +0 -1
  394. package/src/progress-bar/config.ts +0 -48
  395. package/src/progress-bar/index.ts +0 -12
  396. package/src/progress-bar/progress-bar-fill.ts +0 -37
  397. package/src/progress-bar/progress-bar.context.ts +0 -34
  398. package/src/progress-bar/progress-bar.spec.ts +0 -423
  399. package/src/progress-bar/progress-bar.ts +0 -217
  400. package/src/public-api.ts +0 -84
  401. package/src/radio/index.ts +0 -2
  402. package/src/radio/radio.context.ts +0 -3
  403. package/src/radio/radio.spec.ts +0 -36
  404. package/src/radio/radio.ts +0 -66
  405. package/src/select/index.ts +0 -4
  406. package/src/select/select-content.ts +0 -69
  407. package/src/select/select-option.ts +0 -35
  408. package/src/select/select-root.ts +0 -129
  409. package/src/select/select-trigger.ts +0 -93
  410. package/src/select/select.spec.ts +0 -138
  411. package/src/select/select.ts +0 -4
  412. package/src/skeleton/index.ts +0 -5
  413. package/src/skeleton/skeleton.spec.ts +0 -115
  414. package/src/skeleton/skeleton.ts +0 -56
  415. package/src/slider/index.ts +0 -10
  416. package/src/slider/slider-range.ts +0 -49
  417. package/src/slider/slider-thumb.ts +0 -335
  418. package/src/slider/slider-track.ts +0 -70
  419. package/src/slider/slider.context.ts +0 -79
  420. package/src/slider/slider.geometry.ts +0 -73
  421. package/src/slider/slider.spec.ts +0 -216
  422. package/src/slider/slider.ts +0 -443
  423. package/src/speed-dial/index.ts +0 -10
  424. package/src/speed-dial/speed-dial-action.ts +0 -40
  425. package/src/speed-dial/speed-dial-actions.ts +0 -31
  426. package/src/speed-dial/speed-dial-trigger.ts +0 -55
  427. package/src/speed-dial/speed-dial.context.ts +0 -36
  428. package/src/speed-dial/speed-dial.spec.ts +0 -143
  429. package/src/speed-dial/speed-dial.ts +0 -127
  430. package/src/spinner/config.ts +0 -48
  431. package/src/spinner/index.ts +0 -8
  432. package/src/spinner/spinner.spec.ts +0 -262
  433. package/src/spinner/spinner.ts +0 -129
  434. package/src/stepper/index.ts +0 -15
  435. package/src/stepper/stepper.context.ts +0 -63
  436. package/src/stepper/stepper.spec.ts +0 -403
  437. package/src/stepper/stepper.ts +0 -544
  438. package/src/styles/docs-themes.css +0 -82
  439. package/src/styles.css +0 -17
  440. package/src/table/column-helpers.spec.ts +0 -74
  441. package/src/table/column-helpers.ts +0 -68
  442. package/src/table/filter-fns.ts +0 -230
  443. package/src/table/filter-models.spec.ts +0 -240
  444. package/src/table/filter-models.ts +0 -124
  445. package/src/table/filter-params.ts +0 -90
  446. package/src/table/grid-api-impl.ts +0 -321
  447. package/src/table/grid-api.spec.ts +0 -178
  448. package/src/table/grid-api.ts +0 -285
  449. package/src/table/index.ts +0 -73
  450. package/src/table/table-cell.spec.ts +0 -43
  451. package/src/table/table-cell.ts +0 -38
  452. package/src/table/table-filter-outlet.ts +0 -120
  453. package/src/table/table-header.spec.ts +0 -54
  454. package/src/table/table-header.ts +0 -63
  455. package/src/table/table-keyboard.spec.ts +0 -68
  456. package/src/table/table-keyboard.ts +0 -107
  457. package/src/table/table-resource.spec.ts +0 -37
  458. package/src/table/table-resource.ts +0 -36
  459. package/src/table/table-row.spec.ts +0 -54
  460. package/src/table/table-row.ts +0 -31
  461. package/src/table/table-storage.spec.ts +0 -67
  462. package/src/table/table-storage.ts +0 -76
  463. package/src/table/table.spec.ts +0 -172
  464. package/src/table/table.ts +0 -281
  465. package/src/table/table.types.ts +0 -83
  466. package/src/tabs/index.ts +0 -7
  467. package/src/tabs/tabs.context.ts +0 -32
  468. package/src/tabs/tabs.spec.ts +0 -352
  469. package/src/tabs/tabs.ts +0 -364
  470. package/src/tag/config.ts +0 -53
  471. package/src/tag/index.ts +0 -7
  472. package/src/tag/tag-list.ts +0 -76
  473. package/src/tag/tag-remove.ts +0 -61
  474. package/src/tag/tag.context.ts +0 -36
  475. package/src/tag/tag.spec.ts +0 -240
  476. package/src/tag/tag.ts +0 -203
  477. package/src/test-setup.ts +0 -5
  478. package/src/textarea/config.ts +0 -42
  479. package/src/textarea/index.ts +0 -8
  480. package/src/textarea/textarea.spec.ts +0 -176
  481. package/src/textarea/textarea.ts +0 -235
  482. package/src/time-picker/index.ts +0 -15
  483. package/src/time-picker/time-picker-meridiem.ts +0 -123
  484. package/src/time-picker/time-picker-segment.ts +0 -318
  485. package/src/time-picker/time-picker.context.ts +0 -38
  486. package/src/time-picker/time-picker.format.ts +0 -181
  487. package/src/time-picker/time-picker.spec.ts +0 -189
  488. package/src/time-picker/time-picker.ts +0 -274
  489. package/src/toast/_examples/index.ts +0 -5
  490. package/src/toast/_examples/toast.example.ts +0 -282
  491. package/src/toast/_examples/toast.finance.example.ts +0 -180
  492. package/src/toast/_examples/toast.retro.example.ts +0 -161
  493. package/src/toast/index.ts +0 -28
  494. package/src/toast/toast.ref.ts +0 -26
  495. package/src/toast/toast.service.ts +0 -339
  496. package/src/toast/toast.spec.ts +0 -247
  497. package/src/toast/toast.strategy.ts +0 -112
  498. package/src/toast/toast.ts +0 -463
  499. package/src/toast/toast.types.ts +0 -5
  500. package/src/toggle/index.ts +0 -1
  501. package/src/toggle/toggle.spec.ts +0 -24
  502. package/src/toggle/toggle.ts +0 -48
  503. package/src/tooltip/_examples/index.ts +0 -6
  504. package/src/tooltip/_examples/tooltip.example.ts +0 -82
  505. package/src/tooltip/_examples/tooltip.finance.example.ts +0 -97
  506. package/src/tooltip/_examples/tooltip.placements.example.ts +0 -83
  507. package/src/tooltip/_examples/tooltip.retro.example.ts +0 -107
  508. package/src/tooltip/index.ts +0 -4
  509. package/src/tooltip/tooltip-arrow.ts +0 -31
  510. package/src/tooltip/tooltip-content.ts +0 -38
  511. package/src/tooltip/tooltip-group.ts +0 -32
  512. package/src/tooltip/tooltip-trigger.ts +0 -47
  513. package/src/tooltip/tooltip.spec.ts +0 -40
  514. package/src/tooltip/tooltip.ts +0 -5
  515. package/src/tree-select/index.ts +0 -12
  516. package/src/tree-select/tree-select-content.ts +0 -199
  517. package/src/tree-select/tree-select-node.ts +0 -132
  518. package/src/tree-select/tree-select-root.ts +0 -272
  519. package/src/tree-select/tree-select-trigger.ts +0 -90
  520. package/src/tree-select/tree-select.context.ts +0 -63
  521. package/src/tree-select/tree-select.spec.ts +0 -433
  522. package/src/tree-select/tree-select.ts +0 -2
  523. package/src/typography/blockquote.ts +0 -57
  524. package/src/typography/code.ts +0 -53
  525. package/src/typography/index.ts +0 -22
  526. package/src/typography/lead.ts +0 -49
  527. package/src/typography/muted.ts +0 -29
  528. package/src/typography/truncate.ts +0 -99
  529. package/src/typography/typography.spec.ts +0 -203
  530. package/tsconfig.lib.json +0 -21
  531. package/tsconfig.lib.prod.json +0 -17
  532. package/tsconfig.spec.json +0 -18
  533. package/vite.config.ts +0 -27
  534. /package/{src/icon → icon}/icon.css +0 -0
  535. /package/{src/typography → typography}/prose.css +0 -0
@@ -1,225 +0,0 @@
1
- import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { TestBed } from '@angular/core/testing';
3
- import { describe, expect, test, beforeEach } from 'vitest';
4
- import { KjCalendar, KjCalendarDay, KjCalendarGrid, KjCalendarHeader } from './index';
5
- import {
6
- addDays,
7
- buildMonthMatrix,
8
- formatDateShort,
9
- formatMonthYear,
10
- isSameDay,
11
- parseDate,
12
- startOfDay,
13
- } from './date-utils';
14
-
15
- @Component({
16
- standalone: true,
17
- imports: [KjCalendar, KjCalendarHeader, KjCalendarGrid, KjCalendarDay],
18
- changeDetection: ChangeDetectionStrategy.Eager,
19
- template: `
20
- <div
21
- kjCalendar
22
- #cal="kjCalendar"
23
- [(kjValue)]="value"
24
- [kjMin]="min()"
25
- [kjMax]="max()"
26
- [kjDisabledDates]="filter()"
27
- >
28
- <div kjCalendarHeader #hdr="kjCalendarHeader">
29
- <button type="button" (click)="hdr.prev()">prev</button>
30
- <h2 [id]="hdr.captionId()">{{ hdr.label() }}</h2>
31
- <button type="button" (click)="hdr.next()">next</button>
32
- </div>
33
- <table kjCalendarGrid #g="kjCalendarGrid">
34
- <thead>
35
- <tr>
36
- @for (n of g.weekdayShort(); track $index) {
37
- <th scope="col">{{ n }}</th>
38
- }
39
- </tr>
40
- </thead>
41
- <tbody>
42
- @for (week of g.weeks(); track $index) {
43
- <tr>
44
- @for (d of week; track d.getTime()) {
45
- <td>
46
- <button kjCalendarDay [kjDate]="d">{{ d.getDate() }}</button>
47
- </td>
48
- }
49
- </tr>
50
- }
51
- </tbody>
52
- </table>
53
- </div>
54
- `,
55
- })
56
- class HostCalendar {
57
- value = signal<Date | null>(new Date(2025, 3, 15)); // April 15, 2025
58
- min = signal<Date | null>(null);
59
- max = signal<Date | null>(null);
60
- filter = signal<((d: Date) => boolean) | null>(null);
61
- }
62
-
63
- describe('Calendar utils', () => {
64
- test('buildMonthMatrix returns 6 rows of 7', () => {
65
- const m = buildMonthMatrix(new Date(2025, 3, 15), 0);
66
- expect(m.length).toBe(6);
67
- for (const row of m) expect(row.length).toBe(7);
68
- });
69
-
70
- test('parseDate handles ISO yyyy-MM-dd', () => {
71
- const d = parseDate('2025-04-15', 'en-US')!;
72
- expect(d.getFullYear()).toBe(2025);
73
- expect(d.getMonth()).toBe(3);
74
- expect(d.getDate()).toBe(15);
75
- });
76
-
77
- test('parseDate handles US-style m/d/y', () => {
78
- const d = parseDate('4/15/2025', 'en-US')!;
79
- expect(d.getFullYear()).toBe(2025);
80
- expect(d.getMonth()).toBe(3);
81
- expect(d.getDate()).toBe(15);
82
- });
83
-
84
- test('parseDate handles dmy locale', () => {
85
- const d = parseDate('15/04/2025', 'en-GB')!;
86
- expect(d.getFullYear()).toBe(2025);
87
- expect(d.getMonth()).toBe(3);
88
- expect(d.getDate()).toBe(15);
89
- });
90
-
91
- test('parseDate returns null for empty', () => {
92
- expect(parseDate('', 'en-US')).toBeNull();
93
- expect(parseDate(' ', 'en-US')).toBeNull();
94
- });
95
-
96
- test('formatMonthYear is locale-aware', () => {
97
- const s = formatMonthYear(new Date(2025, 3, 1), 'en-US');
98
- expect(s.toLowerCase()).toContain('april');
99
- expect(s).toContain('2025');
100
- });
101
-
102
- test('formatDateShort produces locale numerics', () => {
103
- const s = formatDateShort(new Date(2025, 3, 15), 'en-US');
104
- expect(s).toContain('2025');
105
- });
106
- });
107
-
108
- describe('KjCalendar directive', () => {
109
- beforeEach(() => {
110
- TestBed.configureTestingModule({ imports: [HostCalendar] });
111
- });
112
-
113
- test('renders the day grid for the seeded month', () => {
114
- const fixture = TestBed.createComponent(HostCalendar);
115
- fixture.detectChanges();
116
- const cells = fixture.nativeElement.querySelectorAll('button[kjCalendarDay]');
117
- expect(cells.length).toBe(42);
118
- });
119
-
120
- test('marks today with aria-current="date"', () => {
121
- const fixture = TestBed.createComponent(HostCalendar);
122
- // Set value to today so it's in the rendered month
123
- fixture.componentInstance.value.set(new Date());
124
- fixture.detectChanges();
125
- const todayCell = fixture.nativeElement.querySelector('[aria-current="date"]');
126
- expect(todayCell).not.toBeNull();
127
- });
128
-
129
- test('marks selected with aria-selected="true"', () => {
130
- const fixture = TestBed.createComponent(HostCalendar);
131
- fixture.detectChanges();
132
- const selected = fixture.nativeElement.querySelectorAll('[aria-selected="true"]');
133
- expect(selected.length).toBe(1);
134
- });
135
-
136
- test('clicking a day cell updates the value', () => {
137
- const fixture = TestBed.createComponent(HostCalendar);
138
- fixture.detectChanges();
139
- const cells = fixture.nativeElement.querySelectorAll('button[kjCalendarDay]');
140
- // Click on the first cell of the second week — definitely a real day in April.
141
- const target = cells[7] as HTMLButtonElement;
142
- target.click();
143
- fixture.detectChanges();
144
- const newVal = fixture.componentInstance.value();
145
- expect(newVal).not.toBeNull();
146
- });
147
-
148
- test('respects kjMin — out-of-bounds cells get aria-disabled', () => {
149
- const fixture = TestBed.createComponent(HostCalendar);
150
- fixture.componentInstance.min.set(new Date(2025, 3, 10)); // Apr 10
151
- fixture.detectChanges();
152
- // Apr 5 should be disabled.
153
- const disabled = fixture.nativeElement.querySelectorAll('[aria-disabled="true"]');
154
- expect(disabled.length).toBeGreaterThan(0);
155
- });
156
-
157
- test('respects kjDisabledDates predicate', () => {
158
- const fixture = TestBed.createComponent(HostCalendar);
159
- // Disable all weekends.
160
- fixture.componentInstance.filter.set((d: Date) => d.getDay() !== 0 && d.getDay() !== 6);
161
- fixture.detectChanges();
162
- const disabled = fixture.nativeElement.querySelectorAll('[aria-disabled="true"]');
163
- // Across 6 weeks * 2 weekend days = up to 12 disabled cells.
164
- expect(disabled.length).toBeGreaterThan(8);
165
- });
166
-
167
- test('grid hosts role="grid" with aria-labelledby pointing to the caption', () => {
168
- const fixture = TestBed.createComponent(HostCalendar);
169
- fixture.detectChanges();
170
- const grid = fixture.nativeElement.querySelector('table[kjCalendarGrid]');
171
- expect(grid.getAttribute('role')).toBe('grid');
172
- const labelledBy = grid.getAttribute('aria-labelledby');
173
- expect(labelledBy).toMatch(/^kj-calendar-caption-/);
174
- const heading = fixture.nativeElement.querySelector(`#${labelledBy}`);
175
- expect(heading).not.toBeNull();
176
- });
177
-
178
- test('host carries role="application" + aria-roledescription="calendar"', () => {
179
- const fixture = TestBed.createComponent(HostCalendar);
180
- fixture.detectChanges();
181
- const root = fixture.nativeElement.querySelector('[kjCalendar]');
182
- expect(root.getAttribute('role')).toBe('application');
183
- expect(root.getAttribute('aria-roledescription')).toBe('calendar');
184
- expect(root.getAttribute('aria-label')).toBe('Calendar');
185
- });
186
-
187
- test('header next() advances the focused month', () => {
188
- const fixture = TestBed.createComponent(HostCalendar);
189
- fixture.detectChanges();
190
- const before = fixture.componentInstance.value()!;
191
- const nextBtn = fixture.nativeElement.querySelectorAll('button')[1] as HTMLButtonElement;
192
- nextBtn.click();
193
- fixture.detectChanges();
194
- // Value unchanged but the rendered month should have advanced — check the caption.
195
- const cap = fixture.nativeElement.querySelector('h2');
196
- expect(cap.textContent).not.toBe(formatMonthYear(before, 'en-US'));
197
- });
198
-
199
- test('keyboard ArrowRight advances focusedDate by one day', () => {
200
- const fixture = TestBed.createComponent(HostCalendar);
201
- fixture.detectChanges();
202
- const grid = fixture.nativeElement.querySelector('table[kjCalendarGrid]');
203
- // The focused-date cell should have tabindex=0.
204
- const focused = grid.querySelector('[tabindex="0"]') as HTMLElement;
205
- expect(focused).not.toBeNull();
206
- const before = fixture.componentInstance.value()!;
207
- grid.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }));
208
- fixture.detectChanges();
209
- // Selection unchanged, focusedDate advanced — selected cell is still the original.
210
- expect(isSameDay(fixture.componentInstance.value()!, before)).toBe(true);
211
- });
212
-
213
- test('keyboard Enter selects the focused date', () => {
214
- const fixture = TestBed.createComponent(HostCalendar);
215
- fixture.detectChanges();
216
- const grid = fixture.nativeElement.querySelector('table[kjCalendarGrid]');
217
- grid.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }));
218
- fixture.detectChanges();
219
- grid.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
220
- fixture.detectChanges();
221
- const newVal = startOfDay(fixture.componentInstance.value()!);
222
- const expected = startOfDay(addDays(new Date(2025, 3, 15), 1));
223
- expect(isSameDay(newVal, expected)).toBe(true);
224
- });
225
- });
@@ -1,233 +0,0 @@
1
- import {
2
- Directive,
3
- LOCALE_ID,
4
- computed,
5
- effect,
6
- inject,
7
- input,
8
- model,
9
- signal,
10
- } from '@angular/core';
11
- import { KjDisabled } from '../primitives/interaction/disabled';
12
- import {
13
- addDays,
14
- addMonths,
15
- addYears,
16
- compareDay,
17
- endOfMonth,
18
- firstDayOfWeek as localeFirstDayOfWeek,
19
- isInRange,
20
- isSameDay,
21
- startOfDay,
22
- startOfMonth,
23
- } from './date-utils';
24
- import { KJ_CALENDAR, type KjCalendarContext } from './calendar.context';
25
-
26
- let _captionIdCounter = 0;
27
- function nextCaptionId(): string {
28
- _captionIdCounter += 1;
29
- return `kj-calendar-caption-${_captionIdCounter}`;
30
- }
31
-
32
- /**
33
- * Headless calendar root. Owns date selection state, the focused-date roving
34
- * signal, locale resolution, and the keyboard-navigation contract. Renders
35
- * nothing on its own — pair with `KjCalendarHeader`, `KjCalendarGrid`, and
36
- * `KjCalendarDay`.
37
- *
38
- * Composes `KjDisabled` for the global-disabled stance. Native `Date` only —
39
- * locale-aware via `Intl.DateTimeFormat`.
40
- *
41
- * **Keyboard contract** (when focus is on a day cell, per APG):
42
- * - `ArrowLeft` / `ArrowRight` — ±1 day
43
- * - `ArrowUp` / `ArrowDown` — ±1 week
44
- * - `Home` / `End` — first / last day of the focused week
45
- * - `PageUp` / `PageDown` — ±1 month
46
- * - `Shift+PageUp` / `Shift+PageDown` — ±1 year
47
- * - `Enter` / `Space` — select the focused date
48
- *
49
- * Disabled dates are skipped by keyboard navigation — pressing `ArrowRight`
50
- * lands on the next *selectable* day. Cells outside `kjMin` / `kjMax` carry
51
- * `aria-disabled="true"` and can't receive focus.
52
- *
53
- * @doc-category Core/Data input
54
- * @doc
55
- * @doc-name calendar
56
- * @doc-description Unstyled calendar root for date selection with locale, bounds, and full keyboard navigation.
57
- * @doc-is-main
58
- */
59
- @Directive({
60
- selector: '[kjCalendar]',
61
- standalone: true,
62
- exportAs: 'kjCalendar',
63
- hostDirectives: [
64
- { directive: KjDisabled, inputs: ['kjDisabled'] },
65
- ],
66
- providers: [
67
- { provide: KJ_CALENDAR, useExisting: KjCalendar },
68
- ],
69
- host: {
70
- 'role': 'application',
71
- 'aria-roledescription': 'calendar',
72
- '[attr.aria-label]': 'computedAriaLabel()',
73
- '[attr.aria-disabled]': 'disabled() ? "true" : null',
74
- '[attr.data-disabled]': 'disabled() ? "" : null',
75
- },
76
- })
77
- export class KjCalendar implements KjCalendarContext {
78
- private readonly disabledHost = inject(KjDisabled);
79
- private readonly defaultLocale = inject(LOCALE_ID);
80
-
81
- /** Current value. Two-way bindable — `[(kjValue)]`. `null` clears. */
82
- readonly kjValue = model<Date | null>(null);
83
-
84
- /** Earliest selectable date (inclusive). `null` = open. */
85
- readonly kjMin = input<Date | null>(null);
86
-
87
- /** Latest selectable date (inclusive). `null` = open. */
88
- readonly kjMax = input<Date | null>(null);
89
-
90
- /** Predicate returning `false` to disable specific dates (e.g. weekends). */
91
- readonly kjDisabledDates = input<((date: Date) => boolean) | null>(null);
92
-
93
- /** BCP-47 locale tag. Defaults to Angular's `LOCALE_ID`. */
94
- readonly kjLocale = input<string>('');
95
-
96
- /** First day of the week (0=Sun … 6=Sat). Defaults to locale-derived. */
97
- readonly kjFirstDayOfWeek = input<number | null>(null);
98
-
99
- /** Optional accessible label override. Defaults to `"Calendar"`. */
100
- readonly kjAriaLabel = input<string>('Calendar');
101
-
102
- /** Initially-focused date when no value is selected. Defaults to today. */
103
- readonly kjStartAt = input<Date | null>(null);
104
-
105
- // ── Context shared with children ───────────────────────────────────
106
-
107
- readonly locale = computed(() => this.kjLocale() || this.defaultLocale);
108
- readonly value = this.kjValue.asReadonly();
109
- readonly minDate = computed(() => this.kjMin());
110
- readonly maxDate = computed(() => this.kjMax());
111
- readonly disabledDates = computed(() => this.kjDisabledDates());
112
- readonly firstDayOfWeek = computed(() => {
113
- const explicit = this.kjFirstDayOfWeek();
114
- if (explicit !== null && explicit >= 0 && explicit <= 6) return explicit;
115
- return localeFirstDayOfWeek(this.locale());
116
- });
117
- readonly disabled = this.disabledHost.disabled;
118
-
119
- /** Internal focused-date signal. Two-way exposed via `kjFocusedDate` model. */
120
- readonly kjFocusedDate = model<Date>(startOfDay(new Date()));
121
- readonly focusedDate = this.kjFocusedDate;
122
-
123
- /** Auto-minted caption id — used by the grid's `aria-labelledby`. */
124
- readonly captionId = signal<string>(nextCaptionId());
125
-
126
- /** Computed accessible name combining label + active selection (for SR clarity). */
127
- readonly computedAriaLabel = computed(() => this.kjAriaLabel());
128
-
129
- constructor() {
130
- // Seed focusedDate from kjStartAt or kjValue or today.
131
- const seed = this.kjStartAt() ?? this.kjValue() ?? new Date();
132
- this.kjFocusedDate.set(startOfDay(seed));
133
-
134
- // Whenever the value changes externally, follow with focus.
135
- effect(() => {
136
- const v = this.kjValue();
137
- if (v) this.kjFocusedDate.set(startOfDay(v));
138
- });
139
- }
140
-
141
- // ── KjCalendarContext methods ──────────────────────────────────────
142
-
143
- isDisabled(date: Date): boolean {
144
- if (this.disabled()) return true;
145
- if (!isInRange(date, this.minDate(), this.maxDate())) return true;
146
- const filter = this.disabledDates();
147
- if (filter && !filter(date)) return true;
148
- return false;
149
- }
150
-
151
- selectDate(date: Date): void {
152
- if (this.isDisabled(date)) return;
153
- const sod = startOfDay(date);
154
- this.kjValue.set(sod);
155
- this.kjFocusedDate.set(sod);
156
- }
157
-
158
- moveFocus(unit: 'day' | 'week' | 'month' | 'year', delta: number): void {
159
- const start = this.focusedDate();
160
- let candidate = this.advance(start, unit, delta);
161
- // Skip disabled by stepping in the same direction one day at a time, max 366.
162
- if (this.isDisabled(candidate)) {
163
- const step = delta >= 0 ? 1 : -1;
164
- for (let i = 0; i < 366; i += 1) {
165
- candidate = addDays(candidate, step);
166
- if (this.minDate() && compareDay(candidate, this.minDate() as Date) < 0) break;
167
- if (this.maxDate() && compareDay(candidate, this.maxDate() as Date) > 0) break;
168
- if (!this.isDisabled(candidate)) {
169
- this.kjFocusedDate.set(startOfDay(candidate));
170
- return;
171
- }
172
- }
173
- // Couldn't find one — leave focus alone.
174
- return;
175
- }
176
- this.kjFocusedDate.set(startOfDay(candidate));
177
- }
178
-
179
- moveFocusToWeekBoundary(boundary: 'start' | 'end'): void {
180
- const f = this.focusedDate();
181
- const ws = this.firstDayOfWeek();
182
- const offset = (f.getDay() - ws + 7) % 7;
183
- const target = boundary === 'start' ? addDays(f, -offset) : addDays(f, 6 - offset);
184
- if (!this.isDisabled(target)) {
185
- this.kjFocusedDate.set(startOfDay(target));
186
- }
187
- }
188
-
189
- /** Snap focus to a specific date (used by the day-cell click handler). */
190
- setFocusedDate(date: Date): void {
191
- this.kjFocusedDate.set(startOfDay(date));
192
- }
193
-
194
- /** Helper: month-anchor for the currently-rendered grid. */
195
- readonly viewMonth = computed(() => startOfMonth(this.focusedDate()));
196
-
197
- private advance(date: Date, unit: 'day' | 'week' | 'month' | 'year', delta: number): Date {
198
- switch (unit) {
199
- case 'day':
200
- return addDays(date, delta);
201
- case 'week':
202
- return addDays(date, delta * 7);
203
- case 'month': {
204
- const target = addMonths(date, delta);
205
- // Clamp day-of-month if necessary.
206
- const last = endOfMonth(target).getDate();
207
- if (target.getDate() !== Math.min(date.getDate(), last)) {
208
- target.setDate(Math.min(date.getDate(), last));
209
- }
210
- return target;
211
- }
212
- case 'year': {
213
- const target = addYears(date, delta);
214
- const last = endOfMonth(target).getDate();
215
- if (target.getDate() !== Math.min(date.getDate(), last)) {
216
- target.setDate(Math.min(date.getDate(), last));
217
- }
218
- return target;
219
- }
220
- }
221
- }
222
-
223
- /** True when `date` is the currently-selected value. */
224
- isSelected(date: Date): boolean {
225
- const v = this.value();
226
- return !!v && isSameDay(v, date);
227
- }
228
-
229
- /** True when `date` matches today's local day. */
230
- isToday(date: Date): boolean {
231
- return isSameDay(date, new Date());
232
- }
233
- }
@@ -1,225 +0,0 @@
1
- /**
2
- * Tiny date helpers used by the Calendar and Date Picker families.
3
- *
4
- * Native `Date` only — no third-party date library. Operations work in local
5
- * time zone (matching the user's runtime). Day-precision throughout —
6
- * comparisons strip the time portion via {@link startOfDay}.
7
- *
8
- * @doc-category Core/Data input
9
- */
10
-
11
- /** Returns a new `Date` set to `00:00:00.000` in local time. */
12
- export function startOfDay(date: Date): Date {
13
- const out = new Date(date.getFullYear(), date.getMonth(), date.getDate());
14
- return out;
15
- }
16
-
17
- /** Returns the first day of the month for `date`. */
18
- export function startOfMonth(date: Date): Date {
19
- return new Date(date.getFullYear(), date.getMonth(), 1);
20
- }
21
-
22
- /** Returns the last day of the month for `date`. */
23
- export function endOfMonth(date: Date): Date {
24
- return new Date(date.getFullYear(), date.getMonth() + 1, 0);
25
- }
26
-
27
- /** Adds `days` calendar days to `date`. Negative values subtract. */
28
- export function addDays(date: Date, days: number): Date {
29
- const out = new Date(date);
30
- out.setDate(out.getDate() + days);
31
- return out;
32
- }
33
-
34
- /** Adds `months` calendar months. Day-of-month clamps when target month is shorter. */
35
- export function addMonths(date: Date, months: number): Date {
36
- const day = date.getDate();
37
- const out = new Date(date.getFullYear(), date.getMonth() + months, 1);
38
- const dim = endOfMonth(out).getDate();
39
- out.setDate(Math.min(day, dim));
40
- return out;
41
- }
42
-
43
- /** Adds `years` calendar years. Feb 29 → Feb 28 on a non-leap target. */
44
- export function addYears(date: Date, years: number): Date {
45
- return addMonths(date, years * 12);
46
- }
47
-
48
- /** Returns true if `a` and `b` represent the same day in local time. */
49
- export function isSameDay(a: Date, b: Date): boolean {
50
- return (
51
- a.getFullYear() === b.getFullYear()
52
- && a.getMonth() === b.getMonth()
53
- && a.getDate() === b.getDate()
54
- );
55
- }
56
-
57
- /** Returns true if `a` and `b` are in the same month and year. */
58
- export function isSameMonth(a: Date, b: Date): boolean {
59
- return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
60
- }
61
-
62
- /** Day-precision compare. Negative if `a < b`, positive if `a > b`, 0 if equal. */
63
- export function compareDay(a: Date, b: Date): number {
64
- return startOfDay(a).getTime() - startOfDay(b).getTime();
65
- }
66
-
67
- /** True when `date` is within `[min, max]` (inclusive). `null` bounds are open. */
68
- export function isInRange(date: Date, min: Date | null, max: Date | null): boolean {
69
- if (min && compareDay(date, min) < 0) return false;
70
- if (max && compareDay(date, max) > 0) return false;
71
- return true;
72
- }
73
-
74
- /**
75
- * Locale-aware first day of the week (0 = Sunday … 6 = Saturday).
76
- *
77
- * Reads `Intl.Locale.getWeekInfo()` when available (Chromium 99+, Safari 17+,
78
- * Firefox 130+); falls back to Sunday for `en` locales and Monday otherwise.
79
- */
80
- export function firstDayOfWeek(locale: string): number {
81
- try {
82
- const loc = new Intl.Locale(locale);
83
- type LocWithWeek = Intl.Locale & { getWeekInfo?: () => { firstDay: number } };
84
- const info = (loc as LocWithWeek).getWeekInfo?.();
85
- if (info && typeof info.firstDay === 'number') {
86
- // Intl reports Mon=1 … Sun=7. Convert to 0..6 with Sun=0.
87
- return info.firstDay === 7 ? 0 : info.firstDay;
88
- }
89
- } catch {
90
- /* ignore */
91
- }
92
- return locale.startsWith('en') ? 0 : 1;
93
- }
94
-
95
- /**
96
- * Builds the 6×7 day-grid for `monthAnchor`. Always returns 42 cells —
97
- * leading/trailing days from neighbouring months fill the grid so callers
98
- * have a stable shape.
99
- *
100
- * @param monthAnchor — any `Date` whose month/year identifies the target month.
101
- * @param weekStart — `0..6` — first column of the grid.
102
- */
103
- export function buildMonthMatrix(monthAnchor: Date, weekStart: number): Date[][] {
104
- const first = startOfMonth(monthAnchor);
105
- const firstDow = first.getDay();
106
- const offset = (firstDow - weekStart + 7) % 7;
107
- const gridStart = addDays(first, -offset);
108
-
109
- const weeks: Date[][] = [];
110
- for (let w = 0; w < 6; w += 1) {
111
- const row: Date[] = [];
112
- for (let d = 0; d < 7; d += 1) {
113
- row.push(addDays(gridStart, w * 7 + d));
114
- }
115
- weeks.push(row);
116
- }
117
- return weeks;
118
- }
119
-
120
- /** Locale-aware short weekday names starting from `weekStart`. */
121
- export function weekdayShortNames(locale: string, weekStart: number): string[] {
122
- const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });
123
- // 1970-01-04 was a Sunday in UTC — anchor for stable iteration.
124
- const base = new Date(1970, 0, 4);
125
- const out: string[] = [];
126
- for (let i = 0; i < 7; i += 1) {
127
- out.push(fmt.format(addDays(base, (i + weekStart) % 7)));
128
- }
129
- return out;
130
- }
131
-
132
- /** Locale-aware long weekday names starting from `weekStart`. Used for `<th abbr>`. */
133
- export function weekdayLongNames(locale: string, weekStart: number): string[] {
134
- const fmt = new Intl.DateTimeFormat(locale, { weekday: 'long' });
135
- const base = new Date(1970, 0, 4);
136
- const out: string[] = [];
137
- for (let i = 0; i < 7; i += 1) {
138
- out.push(fmt.format(addDays(base, (i + weekStart) % 7)));
139
- }
140
- return out;
141
- }
142
-
143
- /** Locale-aware "April 2025" for the calendar caption. */
144
- export function formatMonthYear(date: Date, locale: string): string {
145
- return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'long' }).format(date);
146
- }
147
-
148
- /** Locale-aware long form for cell `aria-label` — "Tuesday, April 15, 2025". */
149
- export function formatDateLong(date: Date, locale: string): string {
150
- return new Intl.DateTimeFormat(locale, {
151
- weekday: 'long',
152
- year: 'numeric',
153
- month: 'long',
154
- day: 'numeric',
155
- }).format(date);
156
- }
157
-
158
- /** Locale-aware short form for the Date Picker input — "4/15/2025" / "15/04/2025". */
159
- export function formatDateShort(date: Date, locale: string): string {
160
- return new Intl.DateTimeFormat(locale, {
161
- year: 'numeric',
162
- month: 'numeric',
163
- day: 'numeric',
164
- }).format(date);
165
- }
166
-
167
- /**
168
- * Best-effort parse of a typed date string. Tries:
169
- * 1. `Date.parse()` on ISO-ish input (`yyyy-MM-dd`).
170
- * 2. Splitting on `/` `-` `.` ` ` and inferring locale order from the
171
- * resolved options of `Intl.DateTimeFormat(locale, …)`.
172
- *
173
- * Returns `null` for empty / invalid input. Day-precision only.
174
- */
175
- export function parseDate(value: string, locale: string): Date | null {
176
- const trimmed = value.trim();
177
- if (!trimmed) return null;
178
-
179
- // ISO 8601 (yyyy-MM-dd or yyyy-MM-ddTHH:mm:ss)
180
- const iso = /^(\d{4})-(\d{2})-(\d{2})/.exec(trimmed);
181
- if (iso) {
182
- const y = Number(iso[1]);
183
- const m = Number(iso[2]) - 1;
184
- const d = Number(iso[3]);
185
- const out = new Date(y, m, d);
186
- if (out.getFullYear() === y && out.getMonth() === m && out.getDate() === d) return out;
187
- return null;
188
- }
189
-
190
- const parts = trimmed.split(/[/\-.\s]+/).filter(Boolean);
191
- if (parts.length < 3) return null;
192
- const nums = parts.map((p) => Number(p));
193
- if (nums.some((n) => !Number.isFinite(n))) return null;
194
-
195
- // Determine locale order via resolved-options of DateTimeFormat parts.
196
- const order = inferDateOrder(locale);
197
- let y: number, m: number, d: number;
198
- if (order === 'dmy') {
199
- [d, m, y] = nums as [number, number, number];
200
- } else if (order === 'ymd') {
201
- [y, m, d] = nums as [number, number, number];
202
- } else {
203
- [m, d, y] = nums as [number, number, number];
204
- }
205
- if (y < 100) y += y < 50 ? 2000 : 1900;
206
- m -= 1;
207
- const out = new Date(y, m, d);
208
- if (out.getFullYear() !== y || out.getMonth() !== m || out.getDate() !== d) return null;
209
- return out;
210
- }
211
-
212
- function inferDateOrder(locale: string): 'mdy' | 'dmy' | 'ymd' {
213
- try {
214
- const parts = new Intl.DateTimeFormat(locale).formatToParts(new Date(2000, 0, 2));
215
- const order: string[] = [];
216
- for (const p of parts) {
217
- if (p.type === 'day' || p.type === 'month' || p.type === 'year') order.push(p.type);
218
- }
219
- if (order[0] === 'year') return 'ymd';
220
- if (order[0] === 'day') return 'dmy';
221
- return 'mdy';
222
- } catch {
223
- return 'mdy';
224
- }
225
- }