@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,222 +0,0 @@
1
- import {
2
- AfterContentInit,
3
- Directive,
4
- ElementRef,
5
- booleanAttribute,
6
- computed,
7
- forwardRef,
8
- inject,
9
- input,
10
- output,
11
- signal,
12
- } from '@angular/core';
13
- import { KjListNavigator } from './navigator';
14
- import { KjSelectionModel } from './selection';
15
- import { KJ_LIST_FOCUS_MODE, KJ_LIST_NAVIGATOR_CONFIG } from './tokens';
16
-
17
- let _id = 0;
18
-
19
- /**
20
- * Behavior primitive for any item rendered inside a listbox / menu / tree.
21
- * Composes `KjDisabled`; mints a stable id; exposes value/label/haystacks;
22
- * binds `aria-disabled`, `aria-selected` (via injected `KjSelectionModel`),
23
- * `aria-posinset`/`aria-setsize` (stamped by `KjFilterableList`), and
24
- * `aria-keyshortcuts`. Activation (click / Enter / Space) fires an
25
- * `activate` output the consumer subscribes to. Role is set by the
26
- * consumer's outer directive — varies per cluster.
27
- *
28
- * @doc-category Core/Primitives
29
- */
30
- @Directive({
31
- selector: '[kjListItem]',
32
- exportAs: 'kjListItem',
33
- standalone: true,
34
- host: {
35
- '[hidden]': '!visible()',
36
- '[attr.tabindex]': 'tabIndex()',
37
- '[attr.aria-disabled]': 'disabled() ? "true" : null',
38
- '[attr.data-disabled]': 'disabled() ? "" : null',
39
- '[attr.aria-selected]': 'ariaSelected()',
40
- '[attr.aria-checked]': 'ariaChecked()',
41
- '[attr.aria-posinset]': 'posInSet()',
42
- '[attr.aria-setsize]': 'setSize()',
43
- '[attr.aria-keyshortcuts]': 'kjShortcut() || null',
44
- '(click)': '_activate($event)',
45
- '(keydown.enter)': '$event.preventDefault(); _activate($event)',
46
- '(keydown.space)': '$event.preventDefault(); _activate($event)',
47
- },
48
- })
49
- export class KjListItem<T = unknown> implements AfterContentInit {
50
- /** Typed value emitted on activation. `undefined` when unset. */
51
- readonly kjItemValue = input<T | undefined>(undefined);
52
- /** Display label. Falls back to element text content when empty. */
53
- readonly kjItemLabel = input<string>('');
54
- /** Extra search terms merged into `haystacks` for type-ahead / filter matching. */
55
- readonly kjItemKeywords = input<readonly string[]>([]);
56
- /** ARIA keyboard shortcut string bound to `aria-keyshortcuts`. Omit to suppress the attribute. */
57
- readonly kjShortcut = input<string | null>(null);
58
- /**
59
- * Disabled flag. Declared as a top-level input (rather than as a
60
- * `hostDirective` forward) so consumers that compose `KjListItem`
61
- * inside their own `hostDirectives` (`KjOption`, `KjTreeSelectNode`,
62
- * …) can re-forward it without falling foul of NG0311. The composed
63
- * `KjDisabled` instance follows this signal via an effect below.
64
- */
65
- readonly kjDisabled = input<boolean, unknown>(false, { transform: booleanAttribute });
66
-
67
- /** Fires when the item is activated (click / Enter / Space) and not disabled. Emits `value()`. */
68
- readonly activate = output<T | undefined>();
69
-
70
- /**
71
- * Stable id used by `aria-activedescendant`. Resolved at construction.
72
- * Priority: existing host `id` attribute (static markup) → generated
73
- * `kj-list-item-N`. To pin an id, write `<el id="my-id" kjListItem>`.
74
- */
75
- readonly id: string;
76
-
77
- private readonly el = inject(ElementRef<HTMLElement>);
78
- readonly disabled = this.kjDisabled;
79
-
80
- /**
81
- * Nearest ancestor `KjListItem` resolved via the element injector
82
- * (`skipSelf`, `optional`). Surfaces the DOM-nested parent → child
83
- * relationship to the selection model, which auto-derives a tree
84
- * shape from these pointers when the consumer does not supply one
85
- * via `cfg.treeShape`. Flat consumers (e.g. data-driven tree-select)
86
- * pass an explicit shape and this pointer is ignored.
87
- */
88
- readonly parent = inject<KjListItem<unknown> | null>(KjListItem, {
89
- skipSelf: true,
90
- optional: true,
91
- });
92
-
93
- // Optional — only present when this item lives inside a
94
- // `[kjListNavigator]` (the common case). Read by `tabIndex()` so the
95
- // item can reactively re-bind its host `tabindex` as activeId moves.
96
- // forwardRef avoids the navigator <-> item circular reference issue.
97
- private readonly navigator = inject<KjListNavigator | null>(
98
- forwardRef(() => KjListNavigator),
99
- { optional: true },
100
- );
101
- // Focus mode signal provided by the navigator. Optional: when no
102
- // navigator hosts this item, fall back to activedescendant behavior
103
- // (always `-1`) — matches the legacy tabindex output.
104
- private readonly focusMode = inject(KJ_LIST_FOCUS_MODE, { optional: true });
105
-
106
- constructor() {
107
- const host = this.el.nativeElement;
108
- this.id = host.id || `kj-list-item-${++_id}`;
109
- host.id = this.id;
110
- }
111
-
112
- /** @internal Native host element. Used by `KjListNavigator` to call `.focus()` in roving mode. */
113
- _host(): HTMLElement {
114
- return this.el.nativeElement;
115
- }
116
-
117
- /**
118
- * Reactive `tabindex` for the host element:
119
- * - No navigator / `'activedescendant'`: always `-1` — the navigator
120
- * host owns the Tab stop and signals activation via
121
- * `aria-activedescendant`.
122
- * - `'roving'`: `0` for the currently active (focused) item and `-1`
123
- * for the rest. Disabled items are never active because
124
- * `KjListNavigator.navigable` filters them out, so they naturally
125
- * read `-1` here.
126
- */
127
- readonly tabIndex = computed<string>(() => {
128
- const mode = this.focusMode?.();
129
- if (mode !== 'roving') return '-1';
130
- if (this.disabled()) return '-1';
131
- return this.navigator?.activeId() === this.id ? '0' : '-1';
132
- });
133
-
134
- private readonly _elText = signal('');
135
- readonly value = computed<T | undefined>(() => this.kjItemValue());
136
- readonly label = computed(() => (this.kjItemLabel() || this._elText()).trim());
137
- readonly haystacks = computed<readonly string[]>(() => [this.label(), ...this.kjItemKeywords()]);
138
-
139
- private readonly _visible = signal(true);
140
- readonly visible = this._visible.asReadonly();
141
- setVisible(v: boolean): void { this._visible.set(v); }
142
-
143
- /**
144
- * Position in the visible (filter-aware) set, bound to `aria-posinset`.
145
- * Writable for internal use by `KjFilterableList` only; consumers
146
- * should treat it as read-only.
147
- */
148
- readonly posInSet = signal<number | null>(null);
149
- /**
150
- * Total size of the visible (filter-aware) set, bound to `aria-setsize`.
151
- * Writable for internal use by `KjFilterableList` only; consumers
152
- * should treat it as read-only.
153
- */
154
- readonly setSize = signal<number | null>(null);
155
-
156
- private readonly selection = inject(KjSelectionModel, { optional: true }) as KjSelectionModel<T> | null;
157
- private readonly cfg = inject(KJ_LIST_NAVIGATOR_CONFIG, { optional: true });
158
-
159
- /**
160
- * `aria-selected` driven by the injected selection model. `null` when
161
- * no model is provided, the value is undefined, or the mode is
162
- * `'cascade'` (which uses `aria-checked` instead, per WAI-ARIA tree).
163
- */
164
- readonly ariaSelected = computed<'true' | 'false' | null>(() => {
165
- if (!this.selection) return null;
166
- if (this.selection.mode() === 'cascade') return null;
167
- const v = this.value();
168
- if (v === undefined) return null;
169
- return this.selection.isSelected(v) ? 'true' : 'false';
170
- });
171
-
172
- /**
173
- * `aria-checked` driven by `KjSelectionModel.cascadeState()` when the
174
- * mode is `'cascade'`. Returns `'true'` / `'false'` / `'mixed'` per
175
- * the WAI-ARIA tree checkbox tri-state pattern. `null` (attribute
176
- * omitted) in any other mode.
177
- */
178
- readonly ariaChecked = computed<'true' | 'false' | 'mixed' | null>(() => {
179
- if (!this.selection || this.selection.mode() !== 'cascade') return null;
180
- const v = this.value();
181
- if (v === undefined) return null;
182
- return this.selection.cascadeState(v);
183
- });
184
-
185
- ngAfterContentInit(): void {
186
- this._elText.set(this.el.nativeElement.textContent ?? '');
187
- }
188
-
189
- _activate(event?: Event): void {
190
- if (this.disabled()) return;
191
- const v = this.value();
192
- // Branch gate owned by the selection model: in `'single'` mode
193
- // with a tree shape (consumer-supplied or auto-derived from
194
- // KjListItem parent DI), non-leaf targets must not commit a value
195
- // — they exist purely as disclosure controls (e.g. cascade-select
196
- // branch options that only toggle their own sub-panel). Runs
197
- // before `stopPropagation` so a blocked click can still reach the
198
- // consumer's own host listener.
199
- if (v !== undefined && this.selection && !this.selection.canActivate(v)) return;
200
- // Stop bubbling so a click on a nested `kjListItem` doesn't also
201
- // activate the ancestor item (matters for tree-style consumers
202
- // where leaf nodes are rendered inside their parent branch's host
203
- // element — without this, the leaf activation would be followed
204
- // by the branch's `_activate` overriding the selection).
205
- event?.stopPropagation();
206
- // Selection toggle + consumer hook live here — not in the option
207
- // wrapper — because every list-style cluster that wires a
208
- // `KjSelectionModel` repeats the same two steps after activation:
209
- // (1) toggle the value, (2) run consumer-specific side-effects
210
- // (close the overlay, set an input query, emit a commit event).
211
- // Centralizing both removes the per-option `activate.subscribe(...)`
212
- // boilerplate. `afterSelect` is invoked even when the toggle was a
213
- // no-op (e.g. leaf-mode branch click) so consumers can decide what
214
- // counts as "select" — they receive `closeRequested` to gate on.
215
- let closeRequested = false;
216
- if (this.selection && v !== undefined) {
217
- ({ closeRequested } = this.selection.toggle(v));
218
- }
219
- this.cfg?.afterSelect?.(v, closeRequested);
220
- this.activate.emit(v);
221
- }
222
- }
@@ -1,286 +0,0 @@
1
- // packages/core/src/primitives/list/navigator.spec.ts
2
- import { Component, Directive, contentChildren, forwardRef, signal } from '@angular/core';
3
- import { By } from '@angular/platform-browser';
4
- import { render, type RenderResult } from '@testing-library/angular';
5
- import { describe, it, expect } from 'vitest';
6
- import { KjListNavigator } from './navigator';
7
- import { KjListItem } from './item';
8
- import { KjTypeAhead } from './type-ahead';
9
- import { KJ_LIST_NAVIGATOR_CONFIG } from './tokens';
10
-
11
- /**
12
- * Minimal test root that registers child KjListItems into
13
- * KJ_LIST_NAVIGATOR_CONFIG via contentChildren — same pattern as
14
- * KjSelect / KjCombobox. Used by the focus-mode tests below.
15
- */
16
- @Directive({
17
- selector: '[kjTestListRoot]',
18
- standalone: true,
19
- providers: [
20
- { provide: KJ_LIST_NAVIGATOR_CONFIG, useExisting: forwardRef(() => TestListRoot) },
21
- ],
22
- })
23
- class TestListRoot {
24
- readonly items = contentChildren(KjListItem, { descendants: true });
25
- }
26
-
27
- /** Shape that mirrors the parts of KjListItem the navigator reads. */
28
- function fakeItem(id: string, label: string, disabled = false) {
29
- let activated = 0;
30
- return {
31
- id,
32
- label: () => label,
33
- disabled: () => disabled,
34
- _activate: () => { activated++; },
35
- get activated() { return activated; },
36
- } as unknown as KjListItem<unknown> & { activated: number; _activate: () => void };
37
- }
38
-
39
- function setup(items: ReturnType<typeof fakeItem>[], opts: { wrap?: boolean; orientation?: 'vertical' | 'horizontal' | 'both' } = {}) {
40
- const orientationAttr = opts.orientation ? ` [kjOrientation]="'${opts.orientation}'"` : '';
41
- const wrapAttr = opts.wrap === false ? ` [kjWrap]="false"` : '';
42
- return render(
43
- `<div kjListNavigator${orientationAttr}${wrapAttr}></div>`,
44
- {
45
- imports: [KjListNavigator],
46
- providers: [
47
- KjTypeAhead,
48
- {
49
- provide: KJ_LIST_NAVIGATOR_CONFIG,
50
- useValue: { items: signal(items) },
51
- },
52
- ],
53
- },
54
- );
55
- }
56
-
57
- /** Dispatch a keydown and flush change detection so host bindings reach the DOM. */
58
- function press(host: HTMLElement, fixture: RenderResult<unknown>['fixture'], key: string): KeyboardEvent {
59
- const e = new KeyboardEvent('keydown', { key, bubbles: true, cancelable: true });
60
- host.dispatchEvent(e);
61
- fixture.detectChanges();
62
- return e;
63
- }
64
-
65
- describe('KjListNavigator', () => {
66
- it('starts with no active item', async () => {
67
- const { container } = await setup([fakeItem('1', 'A'), fakeItem('2', 'B')]);
68
- const host = container.querySelector('[kjListNavigator]')!;
69
- expect(host.hasAttribute('aria-activedescendant')).toBe(false);
70
- });
71
-
72
- it('ArrowDown moves to next item, wraps past last when kjWrap=true', async () => {
73
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
74
- const { container, fixture } = await setup(items);
75
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
76
- press(host, fixture, 'ArrowDown');
77
- expect(host.getAttribute('aria-activedescendant')).toBe('1');
78
- press(host, fixture, 'ArrowDown');
79
- expect(host.getAttribute('aria-activedescendant')).toBe('2');
80
- press(host, fixture, 'ArrowDown');
81
- expect(host.getAttribute('aria-activedescendant')).toBe('1');
82
- });
83
-
84
- it('ArrowUp wraps to last item from first', async () => {
85
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
86
- const { container, fixture } = await setup(items);
87
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
88
- press(host, fixture, 'ArrowUp');
89
- expect(host.getAttribute('aria-activedescendant')).toBe('2');
90
- });
91
-
92
- it('skips disabled items during navigation', async () => {
93
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B', true), fakeItem('3', 'C')];
94
- const { container, fixture } = await setup(items);
95
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
96
- press(host, fixture, 'ArrowDown');
97
- expect(host.getAttribute('aria-activedescendant')).toBe('1');
98
- press(host, fixture, 'ArrowDown');
99
- expect(host.getAttribute('aria-activedescendant')).toBe('3');
100
- });
101
-
102
- it('Home moves to first, End moves to last', async () => {
103
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B'), fakeItem('3', 'C')];
104
- const { container, fixture } = await setup(items);
105
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
106
- press(host, fixture, 'End');
107
- expect(host.getAttribute('aria-activedescendant')).toBe('3');
108
- press(host, fixture, 'Home');
109
- expect(host.getAttribute('aria-activedescendant')).toBe('1');
110
- });
111
-
112
- it('Enter calls _activate on the current item and preventDefaults', async () => {
113
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
114
- const { container, fixture } = await setup(items);
115
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
116
- press(host, fixture, 'ArrowDown');
117
- const e = press(host, fixture, 'Enter');
118
- expect((items[0] as { activated: number }).activated).toBe(1);
119
- expect(e.defaultPrevented).toBe(true);
120
- });
121
-
122
- it('Enter does NOT preventDefault when there is no active item', async () => {
123
- const items = [fakeItem('1', 'A')];
124
- const { container, fixture } = await setup(items);
125
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
126
- const e = press(host, fixture, 'Enter');
127
- expect(e.defaultPrevented).toBe(false);
128
- expect((items[0] as { activated: number }).activated).toBe(0);
129
- });
130
-
131
- it('Space activates current item', async () => {
132
- const items = [fakeItem('1', 'A')];
133
- const { container, fixture } = await setup(items);
134
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
135
- press(host, fixture, 'ArrowDown');
136
- press(host, fixture, ' ');
137
- expect((items[0] as { activated: number }).activated).toBe(1);
138
- });
139
-
140
- it('PageDown moves by kjPageSize (default 10)', async () => {
141
- const items = Array.from({ length: 15 }, (_, i) => fakeItem(String(i + 1), 'Item ' + (i + 1)));
142
- const { container, fixture } = await setup(items);
143
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
144
- press(host, fixture, 'ArrowDown');
145
- press(host, fixture, 'PageDown');
146
- expect(host.getAttribute('aria-activedescendant')).toBe('11');
147
- });
148
-
149
- it('delegates single-char keys to KjTypeAhead and activates the match', async () => {
150
- const items = [fakeItem('1', 'Apple'), fakeItem('2', 'Banana')];
151
- const { container, fixture } = await setup(items);
152
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
153
- press(host, fixture, 'b');
154
- expect(host.getAttribute('aria-activedescendant')).toBe('2');
155
- });
156
-
157
- it('kjOrientation="horizontal" responds to ArrowLeft/Right not Up/Down', async () => {
158
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
159
- const { container, fixture } = await setup(items, { orientation: 'horizontal' });
160
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
161
- press(host, fixture, 'ArrowDown');
162
- expect(host.hasAttribute('aria-activedescendant')).toBe(false);
163
- press(host, fixture, 'ArrowRight');
164
- expect(host.getAttribute('aria-activedescendant')).toBe('1');
165
- });
166
-
167
- it('kjWrap=false clamps at last item instead of wrapping', async () => {
168
- const items = [fakeItem('1', 'A'), fakeItem('2', 'B')];
169
- const { container, fixture } = await setup(items, { wrap: false });
170
- const host = container.querySelector('[kjListNavigator]') as HTMLElement;
171
- press(host, fixture, 'End');
172
- press(host, fixture, 'ArrowDown');
173
- expect(host.getAttribute('aria-activedescendant')).toBe('2');
174
- });
175
- });
176
-
177
- describe('KjListNavigator focus modes', () => {
178
- it('default activedescendant: all KjListItem tabindex=-1', async () => {
179
- @Component({
180
- standalone: true,
181
- imports: [KjListNavigator, KjListItem, TestListRoot],
182
- template: `
183
- <div kjTestListRoot kjListNavigator>
184
- <div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
185
- <div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
186
- </div>
187
- `,
188
- })
189
- class Host {}
190
- const { container } = await render(Host);
191
- const els = container.querySelectorAll('[kjListItem]');
192
- els.forEach(el => expect(el.getAttribute('tabindex')).toBe('-1'));
193
- });
194
-
195
- it('roving mode: first item is tabindex=0 on first render, others -1', async () => {
196
- @Component({
197
- standalone: true,
198
- imports: [KjListNavigator, KjListItem, TestListRoot],
199
- template: `
200
- <div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
201
- <div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
202
- <div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
203
- <div role="option" aria-selected="false" kjListItem id="c" [kjItemValue]="'c'">C</div>
204
- </div>
205
- `,
206
- })
207
- class Host {}
208
- const { container, fixture } = await render(Host);
209
- fixture.detectChanges();
210
- const a = container.querySelector('#a')!;
211
- const b = container.querySelector('#b')!;
212
- const c = container.querySelector('#c')!;
213
- expect(a.getAttribute('tabindex')).toBe('0');
214
- expect(b.getAttribute('tabindex')).toBe('-1');
215
- expect(c.getAttribute('tabindex')).toBe('-1');
216
- });
217
-
218
- it('roving mode: moveBy(1) flips the tabbable item to the next', async () => {
219
- @Component({
220
- standalone: true,
221
- imports: [KjListNavigator, KjListItem, TestListRoot],
222
- template: `
223
- <div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'" #nav="kjListNavigator">
224
- <div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
225
- <div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
226
- </div>
227
- `,
228
- })
229
- class Host {}
230
- const { container, fixture } = await render(Host);
231
- fixture.detectChanges();
232
- const nav = fixture.debugElement.query(By.directive(KjListNavigator)).injector.get(KjListNavigator);
233
- nav.moveBy(1);
234
- fixture.detectChanges();
235
- const a = container.querySelector('#a')!;
236
- const b = container.querySelector('#b')!;
237
- expect(a.getAttribute('tabindex')).toBe('-1');
238
- expect(b.getAttribute('tabindex')).toBe('0');
239
- });
240
-
241
- it('roving mode: disabled items get -1 even when first; first navigable seeded', async () => {
242
- @Component({
243
- standalone: true,
244
- imports: [KjListNavigator, KjListItem, TestListRoot],
245
- template: `
246
- <div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
247
- <div role="option" aria-selected="false" kjListItem id="a" [kjDisabled]="true" [kjItemValue]="'a'">A</div>
248
- <div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
249
- <div role="option" aria-selected="false" kjListItem id="c" [kjItemValue]="'c'">C</div>
250
- </div>
251
- `,
252
- })
253
- class Host {}
254
- const { container, fixture } = await render(Host);
255
- fixture.detectChanges();
256
- const a = container.querySelector('#a')!;
257
- const b = container.querySelector('#b')!;
258
- const c = container.querySelector('#c')!;
259
- // Disabled first item: tabindex=-1, first navigable (b) gets 0.
260
- expect(a.getAttribute('tabindex')).toBe('-1');
261
- expect(b.getAttribute('tabindex')).toBe('0');
262
- expect(c.getAttribute('tabindex')).toBe('-1');
263
- });
264
-
265
- it('roving mode: setActive(id) moves focus to that item\'s host element', async () => {
266
- @Component({
267
- standalone: true,
268
- imports: [KjListNavigator, KjListItem, TestListRoot],
269
- template: `
270
- <div kjTestListRoot kjListNavigator [kjFocusMode]="'roving'">
271
- <div role="option" aria-selected="false" kjListItem id="a" [kjItemValue]="'a'">A</div>
272
- <div role="option" aria-selected="false" kjListItem id="b" [kjItemValue]="'b'">B</div>
273
- </div>
274
- `,
275
- })
276
- class Host {}
277
- const { container, fixture } = await render(Host);
278
- fixture.detectChanges();
279
- const nav = fixture.debugElement.query(By.directive(KjListNavigator)).injector.get(KjListNavigator);
280
- const b = container.querySelector('#b') as HTMLElement;
281
- nav.setActive('b');
282
- fixture.detectChanges();
283
- expect(document.activeElement).toBe(b);
284
- expect(b.getAttribute('tabindex')).toBe('0');
285
- });
286
- });