@kouji-ui/core 0.1.1 → 0.1.3

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 +15 -7
  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,22 +0,0 @@
1
- export {
2
- KjCarousel,
3
- KjCarouselViewport,
4
- KjCarouselSlide,
5
- KjCarouselPrevious,
6
- KjCarouselNext,
7
- KjCarouselIndicators,
8
- KjCarouselIndicator,
9
- KjCarouselAutoplay,
10
- KjCarouselPauseToggle,
11
- } from './carousel';
12
- export {
13
- KJ_CAROUSEL,
14
- KJ_CAROUSEL_SLIDE,
15
- KJ_CAROUSEL_INDICATORS,
16
- type KjCarouselContext,
17
- type KjCarouselSlideContext,
18
- type KjCarouselIndicatorsContext,
19
- type KjCarouselOrientation,
20
- type KjCarouselAlign,
21
- type KjCarouselControlPattern,
22
- } from './carousel.context';
@@ -1,205 +0,0 @@
1
- import {
2
- computed,
3
- contentChildren,
4
- Directive,
5
- forwardRef,
6
- inject,
7
- OnDestroy,
8
- } from '@angular/core';
9
- import { KjListItem, injectListItem } from '../primitives/list';
10
- import { KJ_CASCADE_SELECT } from './cascade-select.context';
11
- import { KjCascadeSelectSubPanel } from './cascade-select-sub-panel';
12
-
13
- /**
14
- * Single row inside a `[kjCascadeSelectPanel]` or
15
- * `[kjCascadeSelectSubPanel]`. When projected `[kjCascadeSelectSubPanel]`
16
- * content is present the option becomes a **sub-trigger** (branch node);
17
- * otherwise it is a **leaf** that commits a value on activation.
18
- *
19
- * Composes `KjListItem` via `hostDirectives` — the list item owns the
20
- * stable `id`, the click / Enter / Space activation, `aria-selected`
21
- * (via the shared `KjSelectionModel` in `'leaf'` mode), and
22
- * `aria-disabled`. This directive contributes cascade-specific
23
- * semantics: `role="treeitem"`, branch `aria-haspopup` / `aria-expanded`,
24
- * and hover-open / hover-close timers for sub-panels.
25
- *
26
- * Branch detection is signal-driven: `KjCascadeSelectSubPanel` instances
27
- * declared inside this option call `_registerSubPanel()` from their
28
- * constructor (they inject this directive via the element injector).
29
- * No `contentChildren` + binding effect — straightforward DI both ways.
30
- *
31
- * Branch clicks are no-ops at the selection-model level (leaf mode
32
- * filters them out when a `treeShape` is provided on the root) but
33
- * still toggle their own sub-panel via this directive's
34
- * `handleClick()`.
35
- *
36
- * Role: `treeitem`.
37
- *
38
- * @example Leaf
39
- * ```html
40
- * <div kjCascadeSelectOption [kjValue]="'sf'" kjLabel="San Francisco" />
41
- * ```
42
- *
43
- * @example Branch
44
- * ```html
45
- * <div kjCascadeSelectOption [kjValue]="'us'" kjLabel="USA">
46
- * <div kjCascadeSelectSubPanel>…</div>
47
- * </div>
48
- * ```
49
- * @doc-category Core/Data input
50
- * @doc
51
- * @doc-name cascade-select
52
- */
53
- @Directive({
54
- selector: '[kjCascadeSelectOption]',
55
- exportAs: 'kjCascadeSelectOption',
56
- standalone: true,
57
- hostDirectives: [
58
- {
59
- directive: KjListItem,
60
- inputs: [
61
- 'kjItemValue:kjValue',
62
- 'kjItemLabel:kjLabel',
63
- 'kjDisabled:kjDisabled',
64
- ],
65
- },
66
- ],
67
- host: {
68
- 'role': 'treeitem',
69
- '[attr.aria-haspopup]': 'isBranch() ? "tree" : null',
70
- '[attr.aria-expanded]': 'isBranch() ? subPanelOpen().toString() : null',
71
- '[attr.data-label]': 'item.label()',
72
- '[attr.data-leaf]': 'isLeaf().toString()',
73
- '[attr.data-selected]': 'item.ariaSelected() === "true" ? "" : null',
74
- '[attr.data-active-path]': 'isOnActivePath() ? "" : null',
75
- '(click)': 'handleClick()',
76
- '(mouseenter)': 'handleMouseEnter()',
77
- '(mouseleave)': 'handleMouseLeave()',
78
- },
79
- })
80
- export class KjCascadeSelectOption implements OnDestroy {
81
- /** @internal — composed list-item primitive providing id/value/disabled/activation. */
82
- readonly item = injectListItem<unknown>();
83
- /** @internal */
84
- readonly ctx = inject(KJ_CASCADE_SELECT);
85
-
86
- /**
87
- * @internal Closest ancestor sub-panel (if any). `null` when this
88
- * option sits in the root cascade panel. Used by `KjCascadeSelect`'s
89
- * `openSubPanel` chain rebuild — walking parent panels up to the
90
- * root produces the exact open-chain that should be set, so opening
91
- * a sibling at any level closes its siblings automatically (instead
92
- * of leaving stale entries that a late-firing close timer can then
93
- * slice through).
94
- *
95
- * `forwardRef` defers the class lookup so the option ↔ sub-panel
96
- * import cycle doesn't trip on first evaluation.
97
- */
98
- readonly parentSubPanel = inject<KjCascadeSelectSubPanel | null>(
99
- forwardRef(() => KjCascadeSelectSubPanel),
100
- { optional: true },
101
- );
102
-
103
- // `kjValue`, `kjLabel`, `kjDisabled` are exposed via the composed
104
- // `KjListItem` host directive above. Don't redeclare them on this
105
- // class — duplicate public-name inputs route to the local declaration
106
- // and leave `KjListItem.kjItemValue` unset. Read values back through
107
- // `this.item.value()` / `this.item.label()`.
108
-
109
- /**
110
- * @internal Sub-panels projected as content of this option. Any
111
- * `[kjCascadeSelectSubPanel]` declared inside the option's content
112
- * makes it a branch — Angular keeps this signal in sync.
113
- */
114
- private readonly _subPanels = contentChildren(
115
- forwardRef(() => KjCascadeSelectSubPanel),
116
- { descendants: true },
117
- );
118
-
119
- /** @internal Whether this option is a branch node. */
120
- readonly isBranch = computed(() => this._subPanels().length > 0);
121
-
122
- /** @internal Inverse of `isBranch` for the `data-leaf` attribute. */
123
- readonly isLeaf = computed(() => !this.isBranch());
124
-
125
- private _openTimer: ReturnType<typeof setTimeout> | undefined;
126
- private _closeTimer: ReturnType<typeof setTimeout> | undefined;
127
-
128
- /** @internal True when this option's sub-panel is open. */
129
- readonly subPanelOpen = computed(() =>
130
- this.isBranch()
131
- ? this.ctx.openSubPanels().includes(this.item.id)
132
- : false,
133
- );
134
-
135
- /** @internal True when the selected value is in this option's sub-tree. */
136
- readonly isOnActivePath = computed(() => {
137
- const path = this.ctx.path();
138
- const v = this.item.value();
139
- return v !== undefined && path.includes(v);
140
- });
141
-
142
- ngOnDestroy(): void {
143
- clearTimeout(this._openTimer);
144
- clearTimeout(this._closeTimer);
145
- }
146
-
147
- /**
148
- * @internal Click handler — branch-only sub-panel toggle. Leaf clicks
149
- * are handled by the composed `KjListItem` (which calls
150
- * `KjSelectionModel.toggle` and then `KjCascadeSelect.afterSelect`).
151
- * In leaf-mode `KjSelectionModel` no-ops on branches when a tree
152
- * shape is provided, so we don't need to gate that here.
153
- */
154
- handleClick(): void {
155
- if (this.item.disabled()) return;
156
- if (!this.isBranch()) return;
157
- clearTimeout(this._openTimer);
158
- clearTimeout(this._closeTimer);
159
- if (this.subPanelOpen()) this.ctx.closeSubPanel(this.item.id);
160
- else this.ctx.openSubPanel(this.item.id);
161
- }
162
-
163
- /** @internal */
164
- handleMouseEnter(): void {
165
- if (this.item.disabled() || !this.isBranch()) return;
166
- clearTimeout(this._closeTimer);
167
- const delay = this.ctx.subPanelOpenDelayMs();
168
- this._openTimer = setTimeout(() => {
169
- this.ctx.openSubPanel(this.item.id);
170
- }, delay);
171
- }
172
-
173
- /** @internal */
174
- handleMouseLeave(): void {
175
- if (this.item.disabled() || !this.isBranch()) return;
176
- clearTimeout(this._openTimer);
177
- this._scheduleClose();
178
- }
179
-
180
- /**
181
- * @internal Called by `KjCascadeSelectSubPanel` when the cursor enters
182
- * the sub-panel. The option's `mouseleave` fires the moment the cursor
183
- * crosses out of the option's bounding box — including the case where
184
- * the cursor moves *into* the adjacent sub-panel. Without this bridge,
185
- * the close timer kept ticking and dismissed an actively-hovered
186
- * sub-panel after `subPanelCloseDelayMs`.
187
- */
188
- _cancelCloseTimer(): void {
189
- clearTimeout(this._closeTimer);
190
- this._closeTimer = undefined;
191
- }
192
-
193
- /**
194
- * @internal Called by `KjCascadeSelectSubPanel` when the cursor leaves
195
- * the sub-panel (to anywhere except back into the parent option).
196
- * Restarts the same close timer the option's own `mouseleave` would.
197
- */
198
- _scheduleClose(): void {
199
- const delay = this.ctx.subPanelCloseDelayMs();
200
- this._closeTimer = setTimeout(() => {
201
- if (!this.subPanelOpen()) return;
202
- this.ctx.closeSubPanel(this.item.id);
203
- }, delay);
204
- }
205
- }
@@ -1,106 +0,0 @@
1
- import {
2
- Directive,
3
- inject,
4
- input,
5
- } from '@angular/core';
6
- import { KjOverlayPanel } from '../primitives/overlay/panel';
7
- import {
8
- KJ_OVERLAY_MOUNT_STRATEGY,
9
- KJ_OVERLAY_POSITION_STRATEGY,
10
- KJ_OVERLAY_PANEL_ROLE,
11
- } from '../primitives/overlay/tokens';
12
- import type { KjAlign, KjSide } from '../primitives/overlay/types';
13
- import { bodyPortal } from '../primitives/overlay/strategies/mount/body-portal';
14
- import { anchoredTo } from '../primitives/overlay/strategies/position/anchored-to';
15
- import { KjListNavigator } from '../primitives/list';
16
- import { KjCascadeSelect } from './cascade-select-root';
17
-
18
- /**
19
- * Root panel for a Cascade Select. Composes:
20
- * - `KjOverlayPanel` — mount / position / aria wiring (rendered with
21
- * `role="tree"` via the panel-role provider).
22
- * - `KjListNavigator` (vertical + activedescendant) — generic Up/Down /
23
- * Home/End / Enter / Space / type-ahead navigation across the
24
- * level-0 options.
25
- *
26
- * Cascade-specific ArrowRight (open the active option's sub-panel) and
27
- * Escape / Tab (close everything) remain handled here because they
28
- * carry cascade-specific semantics the generic navigator doesn't
29
- * cover.
30
- *
31
- * @doc-category Core/Data input
32
- * @doc
33
- * @doc-name cascade-select
34
- */
35
- @Directive({
36
- selector: '[kjCascadeSelectPanel]',
37
- exportAs: 'kjCascadeSelectPanel',
38
- standalone: true,
39
- hostDirectives: [
40
- { directive: KjOverlayPanel, inputs: ['kjFor'] },
41
- {
42
- directive: KjListNavigator,
43
- inputs: ['kjOrientation', 'kjFocusMode'],
44
- },
45
- ],
46
- providers: [
47
- { provide: KJ_OVERLAY_PANEL_ROLE, useValue: 'tree' as const },
48
- { provide: KJ_OVERLAY_MOUNT_STRATEGY, useFactory: () => bodyPortal() },
49
- { provide: KJ_OVERLAY_POSITION_STRATEGY, useFactory: () => anchoredTo() },
50
- ],
51
- host: {
52
- 'role': 'tree',
53
- 'aria-orientation': 'horizontal',
54
- 'aria-multiselectable': 'false',
55
- 'tabindex': '-1',
56
- 'kjOrientation': 'vertical',
57
- 'kjFocusMode': 'activedescendant',
58
- '(keydown)': 'onKeydown($event)',
59
- '(click)': '$event.stopPropagation()',
60
- },
61
- })
62
- export class KjCascadeSelectPanel {
63
- /** @internal — root directive (typed). Owns sub-panel state + option lookup. */
64
- private readonly root = inject(KjCascadeSelect);
65
- /** @internal — generic list navigator composed via `hostDirectives`. */
66
- private readonly nav = inject(KjListNavigator);
67
-
68
- /** Anchored side relative to the trigger. */
69
- readonly kjSide = input<KjSide>('bottom');
70
- /** Cross-axis alignment relative to the trigger. */
71
- readonly kjAlign = input<KjAlign>('start');
72
-
73
- constructor() {
74
- const pos = inject(KJ_OVERLAY_POSITION_STRATEGY) as ReturnType<typeof anchoredTo>;
75
- pos.configure({ side: this.kjSide, align: this.kjAlign, matchTriggerWidth: 'min' });
76
- }
77
-
78
- /**
79
- * @internal Cascade-specific keys — ArrowRight opens the active
80
- * branch's sub-panel; Escape / Tab dismiss everything. Up/Down /
81
- * Home/End / Enter / Space / typeahead all flow through the composed
82
- * `KjListNavigator`.
83
- */
84
- onKeydown(e: KeyboardEvent): void {
85
- switch (e.key) {
86
- case 'ArrowRight': {
87
- e.preventDefault();
88
- const activeId = this.nav.activeId();
89
- if (!activeId) return;
90
- const option = this.root.findOption(activeId);
91
- if (option?.isBranch()) this.root.openSubPanel(option.item.id);
92
- return;
93
- }
94
- case 'Escape':
95
- e.preventDefault();
96
- e.stopPropagation();
97
- this.root.hide();
98
- this.root.closeAll();
99
- return;
100
- case 'Tab':
101
- this.root.hide();
102
- this.root.closeAll();
103
- return;
104
- }
105
- }
106
- }
@@ -1,265 +0,0 @@
1
- import {
2
- Directive,
3
- computed,
4
- contentChildren,
5
- forwardRef,
6
- inject,
7
- input,
8
- model,
9
- output,
10
- signal,
11
- type Signal,
12
- type WritableSignal,
13
- } from '@angular/core';
14
- import { KjOverlayController } from '../primitives/overlay/controller';
15
- import { KJ_SELECT } from '../select/select-root';
16
- import {
17
- KJ_LIST_NAVIGATOR_CONFIG,
18
- KjListItem,
19
- KjSelectionModel,
20
- type KjCompareFn,
21
- type KjListNavigatorConfig,
22
- type KjListSelectionMode,
23
- type KjTreeShape,
24
- } from '../primitives/list';
25
- import {
26
- KJ_CASCADE_SELECT,
27
- type KjCascadeSelectContext,
28
- } from './cascade-select.context';
29
- import { KjCascadeSelectOption } from './cascade-select-option';
30
-
31
- /**
32
- * Root cascade-select container. Implements
33
- * {@link KjListNavigatorConfig} (items, value, mode, compareBy,
34
- * treeShape, afterSelect) and provides itself under
35
- * `KJ_LIST_NAVIGATOR_CONFIG` via `forwardRef`. Each cascade panel +
36
- * sub-panel hosts its own `KjListNavigator` (vertical +
37
- * activedescendant). All tree-walking logic — branch gating, path
38
- * derivation, isLeaf — lives in the shared `KjSelectionModel`, which
39
- * auto-derives the tree shape from each `KjListItem.parent` DI pointer.
40
- * The root just owns cascade-specific UX: the sub-panel open-chain and
41
- * the overlay close-on-commit behavior.
42
- *
43
- * Like `KjSelect`, the root does NOT inject `KjSelectionModel` at
44
- * construction — doing so creates a runtime cycle (the model's
45
- * `inject(KJ_LIST_NAVIGATOR_CONFIG)` would resolve to a still-
46
- * constructing root). Lazy access via the element `Injector` resolves
47
- * the model after construction finishes.
48
- *
49
- * @example
50
- * ```html
51
- * <div kjCascadeSelect [(kjValue)]="city">
52
- * <button kjCascadeSelectTrigger #t="kjCascadeSelectTrigger">Pick</button>
53
- * <div kjCascadeSelectPanel [kjFor]="t">
54
- * <div kjCascadeSelectOption [kjValue]="'us'" kjLabel="USA">…</div>
55
- * </div>
56
- * </div>
57
- * ```
58
- *
59
- * @doc-category Core/Data input
60
- * @doc
61
- * @doc-name cascade-select
62
- * @doc-is-main
63
- * @doc-description Unstyled cascade-select root that implements KjListNavigatorConfig and owns the shared selection model.
64
- */
65
- @Directive({
66
- selector: '[kjCascadeSelect]',
67
- exportAs: 'kjCascadeSelect',
68
- standalone: true,
69
- providers: [
70
- { provide: KJ_CASCADE_SELECT, useExisting: forwardRef(() => KjCascadeSelect) },
71
- { provide: KJ_SELECT, useExisting: forwardRef(() => KjCascadeSelect) },
72
- { provide: KJ_LIST_NAVIGATOR_CONFIG, useExisting: forwardRef(() => KjCascadeSelect) },
73
- KjSelectionModel,
74
- KjOverlayController,
75
- ],
76
- })
77
- export class KjCascadeSelect implements KjListNavigatorConfig, KjCascadeSelectContext {
78
- /** @internal — shared overlay controller; trigger + panel + options share this. */
79
- private readonly _controller = inject(KjOverlayController);
80
-
81
- /** Two-way bindable selected leaf value. */
82
- readonly kjValue = model<unknown>(undefined);
83
-
84
- /** Two-way bindable path of values from root to selected leaf. */
85
- readonly kjCascadePath = model<readonly unknown[]>([]);
86
-
87
- /**
88
- * Optional consumer-supplied tree topology. When omitted, the
89
- * selection model auto-derives one from each `KjListItem.parent`
90
- * pointer (which Angular resolves via the element injector — the
91
- * outer cascade option of a sub-panel's contents). Supply this only
92
- * when the consumer's data model isn't a faithful match for the
93
- * projected DOM (rare).
94
- */
95
- readonly kjTreeShape = input<KjTreeShape<unknown> | null>(null);
96
-
97
- /** Sub-panel hover-open delay in ms. Default 100 (matches Dropdown Menu). */
98
- readonly kjSubPanelOpenDelayMs = input<number>(100);
99
-
100
- /** Sub-panel hover-out close delay in ms. Default 300 (prevents flicker). */
101
- readonly kjSubPanelCloseDelayMs = input<number>(300);
102
-
103
- /** Emitted when the active-descendant crosses a level boundary. */
104
- readonly kjLevelChange = output<{ levelIndex: number }>();
105
-
106
- // ── KjListNavigatorConfig implementation ──────────────────────────
107
- /** All `KjListItem`s under this cascade — source for the navigators. */
108
- readonly items = contentChildren(KjListItem, { descendants: true });
109
-
110
- /**
111
- * Every projected `KjCascadeSelectOption`. Used by {@link findOption}
112
- * to resolve a `KjListItem` id (typically the navigator's active id)
113
- * to its wrapping option directive — no `document.getElementById` /
114
- * `querySelector` lookups in panel keydown handlers.
115
- */
116
- private readonly _options = contentChildren(KjCascadeSelectOption, { descendants: true });
117
-
118
- private readonly _optionsById = computed(() => {
119
- const map = new Map<string, KjCascadeSelectOption>();
120
- for (const o of this._options()) map.set(o.item.id, o);
121
- return map;
122
- });
123
-
124
- /**
125
- * Resolve the `KjCascadeSelectOption` wrapping the given
126
- * `KjListItem.id`. Returns `undefined` when no projected option
127
- * matches.
128
- */
129
- findOption(itemId: string): KjCascadeSelectOption | undefined {
130
- return this._optionsById().get(itemId);
131
- }
132
-
133
- /**
134
- * Implements `KjListNavigatorConfig.value`. Shared with `kjValue` so
135
- * `KjSelectionModel` reads / writes through the same signal — one
136
- * source of truth.
137
- */
138
- readonly value = this.kjValue as unknown as WritableSignal<
139
- unknown | readonly unknown[] | null
140
- >;
141
-
142
- /**
143
- * Cascade is single-leaf select: exactly one leaf value lives in
144
- * `kjValue`. The selection model's `'single'` + tree-shape branch
145
- * gate blocks non-leaf commits automatically — branches only toggle
146
- * their own sub-panel via `KjCascadeSelectOption.handleClick`.
147
- */
148
- readonly mode: Signal<KjListSelectionMode> = signal<KjListSelectionMode>('single');
149
-
150
- /** Implements `KjListNavigatorConfig.compareBy`. */
151
- readonly compareBy = signal<KjCompareFn<unknown>>(Object.is as KjCompareFn<unknown>);
152
-
153
- /** Re-exposes `kjTreeShape` under the {@link KjListNavigatorConfig} key. */
154
- readonly treeShape = this.kjTreeShape;
155
-
156
- /**
157
- * Selection model is injected directly. The model uses a {@link
158
- * KjSelectionModel.bind} call to receive this root's canonical
159
- * signals — that pattern keeps the DI graph acyclic (the model does
160
- * not inject `KJ_LIST_NAVIGATOR_CONFIG` back, so providing both on
161
- * the same element no longer collides).
162
- */
163
- private readonly _selection = inject(KjSelectionModel);
164
-
165
- constructor() {
166
- this._selection.bind({
167
- value: this.value,
168
- items: this.items,
169
- mode: this.mode,
170
- compareBy: this.compareBy,
171
- treeShape: this.treeShape,
172
- });
173
- }
174
-
175
- // ── KjSelectContext-compatible surface ──────────────────────────────
176
- /** Open state — drives `KjSelect.open` for downstream consumers. */
177
- readonly open = this._controller.isOpen;
178
-
179
- /** Compatibility shim — KjSelect-style single setter. Closes the panel. */
180
- select(val: unknown): void {
181
- this.kjValue.set(val);
182
- this._controller.close('programmatic');
183
- }
184
-
185
- /** Compatibility shim — toggles the overlay. */
186
- toggle(): void {
187
- if (this._controller.isOpen()) this._controller.close('programmatic');
188
- else this._controller.open();
189
- }
190
-
191
- // ── KjCascadeSelectContext implementation ──────────────────────────
192
- private readonly _openSubPanels = signal<readonly string[]>([]);
193
-
194
- /** Path of values from root option to the selected leaf. */
195
- readonly path = computed(() => this.kjCascadePath());
196
-
197
- /** Open sub-panel ownerOptionIds (level → level chain). */
198
- readonly openSubPanels = this._openSubPanels.asReadonly();
199
-
200
- /** Hover-open delay (ms). */
201
- readonly subPanelOpenDelayMs = computed(() => this.kjSubPanelOpenDelayMs());
202
- /** Hover-out close delay (ms). */
203
- readonly subPanelCloseDelayMs = computed(() => this.kjSubPanelCloseDelayMs());
204
-
205
- /**
206
- * Implements `KjListNavigatorConfig.afterSelect`. The selection model
207
- * already gated branches before reaching here (see
208
- * `KjSelectionModel.canActivate`), so any defined `value` is a leaf
209
- * commit: derive the path from the model, surface it on
210
- * `kjCascadePath`, close every sub-panel, and dismiss the overlay.
211
- */
212
- afterSelect(value: unknown, _closeRequested: boolean): void {
213
- if (value === undefined) return;
214
- this.kjCascadePath.set(this._selection.pathTo(value));
215
- this._openSubPanels.set([]);
216
- this._controller.close('programmatic');
217
- }
218
-
219
- /**
220
- * Open the sub-panel chain ending at `ownerOptionId`. Walking the
221
- * target's ancestry on every open is the trick that keeps sibling
222
- * sub-panels mutually exclusive: any stale entries from a prior
223
- * branch get replaced atomically with the fresh chain, so a
224
- * mouseleave-queued close timer on a sibling can no longer slice
225
- * through the new chain after it fires. The walk also cancels any
226
- * pending close timers along the new chain so a brief inter-option
227
- * cursor crossing doesn't dismiss a freshly-opened panel.
228
- */
229
- openSubPanel(ownerOptionId: string): void {
230
- const target = this.findOption(ownerOptionId);
231
- if (!target) {
232
- // Fallback: option not yet registered (rare — pre-content-init).
233
- // Append to keep behavior monotonic; the close path is tolerant.
234
- this._openSubPanels.update(panels =>
235
- panels.includes(ownerOptionId) ? panels : [...panels, ownerOptionId],
236
- );
237
- return;
238
- }
239
- const chain: string[] = [];
240
- let current: typeof target | null = target;
241
- while (current) {
242
- current._cancelCloseTimer();
243
- chain.unshift(current.item.id);
244
- current = current.parentSubPanel?.parentOption ?? null;
245
- }
246
- this._openSubPanels.set(chain);
247
- }
248
-
249
- closeSubPanel(ownerOptionId: string): void {
250
- this._openSubPanels.update(panels => {
251
- const idx = panels.indexOf(ownerOptionId);
252
- if (idx < 0) return panels;
253
- return panels.slice(0, idx);
254
- });
255
- }
256
-
257
- closeAll(): void {
258
- this._openSubPanels.set([]);
259
- }
260
-
261
- /** Closes the root cascade panel. */
262
- hide(): void {
263
- this._controller.close('programmatic');
264
- }
265
- }