@kouji-ui/core 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. package/fesm2022/kouji-ui-core.mjs +26789 -0
  2. package/fesm2022/kouji-ui-core.mjs.map +1 -0
  3. package/package.json +5 -6
  4. package/types/kouji-ui-core.d.ts +13545 -0
  5. package/.turbo/turbo-build.log +0 -30
  6. package/CHANGELOG.md +0 -190
  7. package/ng-package.json +0 -11
  8. package/src/a11y/.gitkeep +0 -0
  9. package/src/a11y/aria-describedby.spec.ts +0 -55
  10. package/src/a11y/aria-describedby.ts +0 -37
  11. package/src/a11y/aria-labelledby.spec.ts +0 -55
  12. package/src/a11y/aria-labelledby.ts +0 -38
  13. package/src/a11y/focus-trap.spec.ts +0 -86
  14. package/src/a11y/focus-trap.ts +0 -72
  15. package/src/a11y/index.ts +0 -10
  16. package/src/a11y/live-region.spec.ts +0 -58
  17. package/src/a11y/live-region.ts +0 -50
  18. package/src/a11y/roving-tabindex.spec.ts +0 -201
  19. package/src/a11y/roving-tabindex.ts +0 -153
  20. package/src/a11y/visually-hidden.spec.ts +0 -34
  21. package/src/a11y/visually-hidden.ts +0 -26
  22. package/src/accordion/accordion.context.ts +0 -44
  23. package/src/accordion/accordion.spec.ts +0 -242
  24. package/src/accordion/accordion.ts +0 -401
  25. package/src/accordion/index.ts +0 -8
  26. package/src/alert/alert.context.ts +0 -28
  27. package/src/alert/alert.spec.ts +0 -217
  28. package/src/alert/alert.ts +0 -417
  29. package/src/alert/config.ts +0 -46
  30. package/src/alert/index.ts +0 -19
  31. package/src/avatar/avatar-group.context.ts +0 -45
  32. package/src/avatar/avatar-group.spec.ts +0 -358
  33. package/src/avatar/avatar-group.ts +0 -259
  34. package/src/avatar/avatar.spec.ts +0 -18
  35. package/src/avatar/avatar.ts +0 -39
  36. package/src/avatar/index.ts +0 -11
  37. package/src/badge/badge.spec.ts +0 -28
  38. package/src/badge/badge.ts +0 -35
  39. package/src/badge/index.ts +0 -1
  40. package/src/breadcrumb/breadcrumb-current.ts +0 -38
  41. package/src/breadcrumb/breadcrumb-ellipsis.ts +0 -71
  42. package/src/breadcrumb/breadcrumb-item.ts +0 -41
  43. package/src/breadcrumb/breadcrumb-link.ts +0 -44
  44. package/src/breadcrumb/breadcrumb-list.ts +0 -42
  45. package/src/breadcrumb/breadcrumb-separator.ts +0 -45
  46. package/src/breadcrumb/breadcrumb.context.ts +0 -45
  47. package/src/breadcrumb/breadcrumb.spec.ts +0 -354
  48. package/src/breadcrumb/breadcrumb.ts +0 -239
  49. package/src/breadcrumb/config.ts +0 -84
  50. package/src/breadcrumb/index.ts +0 -18
  51. package/src/button/_examples/button.example.ts +0 -71
  52. package/src/button/_examples/button.finance.example.ts +0 -83
  53. package/src/button/_examples/button.retro.example.ts +0 -91
  54. package/src/button/_examples/button.sizes.example.ts +0 -60
  55. package/src/button/_examples/index.ts +0 -6
  56. package/src/button/button.spec.ts +0 -163
  57. package/src/button/button.ts +0 -142
  58. package/src/button/config.spec.ts +0 -33
  59. package/src/button/config.ts +0 -45
  60. package/src/button/index.ts +0 -2
  61. package/src/button-group/button-group.context.ts +0 -28
  62. package/src/button-group/button-group.spec.ts +0 -99
  63. package/src/button-group/button-group.ts +0 -99
  64. package/src/button-group/index.ts +0 -2
  65. package/src/calendar/calendar-day.ts +0 -102
  66. package/src/calendar/calendar-grid.ts +0 -90
  67. package/src/calendar/calendar-header.ts +0 -65
  68. package/src/calendar/calendar.context.ts +0 -53
  69. package/src/calendar/calendar.spec.ts +0 -225
  70. package/src/calendar/calendar.ts +0 -233
  71. package/src/calendar/date-utils.ts +0 -225
  72. package/src/calendar/index.ts +0 -28
  73. package/src/carousel/carousel.context.ts +0 -81
  74. package/src/carousel/carousel.spec.ts +0 -337
  75. package/src/carousel/carousel.ts +0 -919
  76. package/src/carousel/index.ts +0 -22
  77. package/src/cascade-select/cascade-select-option.ts +0 -205
  78. package/src/cascade-select/cascade-select-panel.ts +0 -106
  79. package/src/cascade-select/cascade-select-root.ts +0 -265
  80. package/src/cascade-select/cascade-select-sub-panel.ts +0 -168
  81. package/src/cascade-select/cascade-select-trigger.ts +0 -44
  82. package/src/cascade-select/cascade-select.context.ts +0 -71
  83. package/src/cascade-select/cascade-select.spec.ts +0 -241
  84. package/src/cascade-select/cascade-select.ts +0 -5
  85. package/src/cascade-select/index.ts +0 -11
  86. package/src/chart/chart.spec.ts +0 -27
  87. package/src/chart/chart.ts +0 -52
  88. package/src/chart/index.ts +0 -1
  89. package/src/chat/chat-avatar.ts +0 -31
  90. package/src/chat/chat-bubble.ts +0 -49
  91. package/src/chat/chat-footer.ts +0 -67
  92. package/src/chat/chat-header.ts +0 -41
  93. package/src/chat/chat-log.ts +0 -43
  94. package/src/chat/chat.context.ts +0 -64
  95. package/src/chat/chat.spec.ts +0 -341
  96. package/src/chat/chat.ts +0 -191
  97. package/src/chat/config.ts +0 -53
  98. package/src/chat/index.ts +0 -21
  99. package/src/checkbox/checkbox.spec.ts +0 -35
  100. package/src/checkbox/checkbox.ts +0 -89
  101. package/src/checkbox/index.ts +0 -1
  102. package/src/color-picker/color-picker.context.ts +0 -74
  103. package/src/color-picker/color-picker.spec.ts +0 -241
  104. package/src/color-picker/color-picker.ts +0 -698
  105. package/src/color-picker/color-picker.utils.ts +0 -140
  106. package/src/color-picker/index.ts +0 -28
  107. package/src/combobox/combobox-input.ts +0 -143
  108. package/src/combobox/combobox-listbox.ts +0 -49
  109. package/src/combobox/combobox-option.ts +0 -43
  110. package/src/combobox/combobox-root.ts +0 -281
  111. package/src/combobox/combobox.spec.ts +0 -75
  112. package/src/combobox/combobox.ts +0 -4
  113. package/src/combobox/index.ts +0 -4
  114. package/src/command-palette/command-empty.ts +0 -36
  115. package/src/command-palette/command-group.ts +0 -21
  116. package/src/command-palette/command-input.ts +0 -70
  117. package/src/command-palette/command-item.ts +0 -60
  118. package/src/command-palette/command-list.ts +0 -25
  119. package/src/command-palette/command-palette-dialog.ts +0 -74
  120. package/src/command-palette/command-palette-trigger.ts +0 -64
  121. package/src/command-palette/command-palette.filters.ts +0 -53
  122. package/src/command-palette/command-palette.spec.ts +0 -349
  123. package/src/command-palette/command-palette.ts +0 -204
  124. package/src/command-palette/command-separator.ts +0 -18
  125. package/src/command-palette/index.ts +0 -15
  126. package/src/confirm-popup/confirm-popup-action.ts +0 -39
  127. package/src/confirm-popup/confirm-popup-cancel.ts +0 -38
  128. package/src/confirm-popup/confirm-popup-content.ts +0 -113
  129. package/src/confirm-popup/confirm-popup-message.ts +0 -36
  130. package/src/confirm-popup/confirm-popup-trigger.ts +0 -31
  131. package/src/confirm-popup/confirm-popup.context.ts +0 -41
  132. package/src/confirm-popup/confirm-popup.spec.ts +0 -337
  133. package/src/confirm-popup/confirm-popup.ts +0 -109
  134. package/src/confirm-popup/index.ts +0 -12
  135. package/src/date-picker/date-picker-calendar.ts +0 -65
  136. package/src/date-picker/date-picker-trigger.ts +0 -215
  137. package/src/date-picker/date-picker.context.ts +0 -50
  138. package/src/date-picker/date-picker.spec.ts +0 -117
  139. package/src/date-picker/date-picker.ts +0 -127
  140. package/src/date-picker/index.ts +0 -7
  141. package/src/dialog/_examples/dialog.confirm.example.ts +0 -145
  142. package/src/dialog/_examples/dialog.example.ts +0 -106
  143. package/src/dialog/_examples/dialog.finance.example.ts +0 -121
  144. package/src/dialog/_examples/dialog.retro.example.ts +0 -126
  145. package/src/dialog/_examples/index.ts +0 -6
  146. package/src/dialog/dialog.ref.ts +0 -42
  147. package/src/dialog/dialog.service.ts +0 -66
  148. package/src/dialog/dialog.spec.ts +0 -37
  149. package/src/dialog/dialog.ts +0 -26
  150. package/src/dialog/index.ts +0 -3
  151. package/src/divider/divider.spec.ts +0 -223
  152. package/src/divider/divider.ts +0 -137
  153. package/src/divider/index.ts +0 -5
  154. package/src/drawer/drawer.ref.ts +0 -63
  155. package/src/drawer/drawer.service.ts +0 -106
  156. package/src/drawer/drawer.spec.ts +0 -117
  157. package/src/drawer/drawer.ts +0 -122
  158. package/src/drawer/index.ts +0 -10
  159. package/src/dropdown-menu/dropdown-menu-content.ts +0 -258
  160. package/src/dropdown-menu/dropdown-menu-group.ts +0 -31
  161. package/src/dropdown-menu/dropdown-menu-item.ts +0 -51
  162. package/src/dropdown-menu/dropdown-menu-label.ts +0 -41
  163. package/src/dropdown-menu/dropdown-menu-separator.ts +0 -27
  164. package/src/dropdown-menu/dropdown-menu-trigger.ts +0 -140
  165. package/src/dropdown-menu/dropdown-menu.spec.ts +0 -265
  166. package/src/dropdown-menu/dropdown-menu.ts +0 -60
  167. package/src/dropdown-menu/index.ts +0 -15
  168. package/src/example-components.ts +0 -42
  169. package/src/field/field-error.ts +0 -49
  170. package/src/field/field-group.ts +0 -39
  171. package/src/field/field-help.ts +0 -47
  172. package/src/field/field-label.ts +0 -30
  173. package/src/field/field.context.ts +0 -28
  174. package/src/field/field.spec.ts +0 -179
  175. package/src/field/field.ts +0 -121
  176. package/src/field/index.ts +0 -6
  177. package/src/file-upload/file-upload.context.ts +0 -89
  178. package/src/file-upload/file-upload.spec.ts +0 -290
  179. package/src/file-upload/file-upload.ts +0 -639
  180. package/src/file-upload/file-upload.types.ts +0 -59
  181. package/src/file-upload/index.ts +0 -23
  182. package/src/form/form-error-summary.ts +0 -87
  183. package/src/form/form-field.context.ts +0 -3
  184. package/src/form/form-field.spec.ts +0 -25
  185. package/src/form/form-field.ts +0 -52
  186. package/src/form/form.context.ts +0 -53
  187. package/src/form/form.spec.ts +0 -162
  188. package/src/form/form.ts +0 -326
  189. package/src/form/index.ts +0 -11
  190. package/src/icon/E2E.md +0 -14
  191. package/src/icon/icon.directive.spec.ts +0 -198
  192. package/src/icon/icon.directive.ts +0 -113
  193. package/src/icon/icon.mode.spec.ts +0 -29
  194. package/src/icon/icon.mode.ts +0 -23
  195. package/src/icon/icon.providers.spec.ts +0 -63
  196. package/src/icon/icon.providers.ts +0 -47
  197. package/src/icon/icon.resolver.spec.ts +0 -96
  198. package/src/icon/icon.resolver.ts +0 -49
  199. package/src/icon/icon.tokens.ts +0 -88
  200. package/src/icon/icon.types.ts +0 -48
  201. package/src/icon/index.ts +0 -21
  202. package/src/input/index.ts +0 -1
  203. package/src/input/input.spec.ts +0 -43
  204. package/src/input/input.ts +0 -89
  205. package/src/input-group/index.ts +0 -3
  206. package/src/input-group/input-group-addon.ts +0 -92
  207. package/src/input-group/input-group.context.ts +0 -27
  208. package/src/input-group/input-group.spec.ts +0 -186
  209. package/src/input-group/input-group.ts +0 -136
  210. package/src/input-mask/index.ts +0 -11
  211. package/src/input-mask/input-mask.compile.ts +0 -69
  212. package/src/input-mask/input-mask.engine.ts +0 -376
  213. package/src/input-mask/input-mask.presets.ts +0 -24
  214. package/src/input-mask/input-mask.spec.ts +0 -304
  215. package/src/input-mask/input-mask.tokens.ts +0 -49
  216. package/src/input-mask/input-mask.ts +0 -280
  217. package/src/input-otp/index.ts +0 -2
  218. package/src/input-otp/input-otp.context.ts +0 -41
  219. package/src/input-otp/input-otp.spec.ts +0 -308
  220. package/src/input-otp/input-otp.ts +0 -470
  221. package/src/kbd/index.ts +0 -1
  222. package/src/kbd/kbd.spec.ts +0 -127
  223. package/src/kbd/kbd.ts +0 -132
  224. package/src/link/config.ts +0 -44
  225. package/src/link/index.ts +0 -2
  226. package/src/link/link.spec.ts +0 -246
  227. package/src/link/link.ts +0 -226
  228. package/src/list/index.ts +0 -11
  229. package/src/list/list.spec.ts +0 -237
  230. package/src/list/list.ts +0 -277
  231. package/src/menubar/index.ts +0 -7
  232. package/src/menubar/menubar-item.ts +0 -204
  233. package/src/menubar/menubar.context.ts +0 -43
  234. package/src/menubar/menubar.spec.ts +0 -433
  235. package/src/menubar/menubar.ts +0 -309
  236. package/src/number-input/index.ts +0 -4
  237. package/src/number-input/number-input-group.ts +0 -64
  238. package/src/number-input/number-input.context.ts +0 -31
  239. package/src/number-input/number-input.format.ts +0 -148
  240. package/src/number-input/number-input.spec.ts +0 -170
  241. package/src/number-input/number-input.ts +0 -457
  242. package/src/number-input/number-stepper.ts +0 -193
  243. package/src/overlay-badge/index.ts +0 -7
  244. package/src/overlay-badge/overlay-badge-content.ts +0 -73
  245. package/src/overlay-badge/overlay-badge.context.ts +0 -37
  246. package/src/overlay-badge/overlay-badge.spec.ts +0 -220
  247. package/src/overlay-badge/overlay-badge.ts +0 -128
  248. package/src/pagination/config.ts +0 -82
  249. package/src/pagination/index.ts +0 -19
  250. package/src/pagination/page-tokens.ts +0 -78
  251. package/src/pagination/pagination-ellipsis.ts +0 -69
  252. package/src/pagination/pagination-first.ts +0 -84
  253. package/src/pagination/pagination-info.ts +0 -70
  254. package/src/pagination/pagination-item.ts +0 -81
  255. package/src/pagination/pagination-last.ts +0 -85
  256. package/src/pagination/pagination-next.ts +0 -86
  257. package/src/pagination/pagination-previous.ts +0 -90
  258. package/src/pagination/pagination.context.ts +0 -52
  259. package/src/pagination/pagination.spec.ts +0 -388
  260. package/src/pagination/pagination.ts +0 -288
  261. package/src/password-input/index.ts +0 -15
  262. package/src/password-input/password-input.context.ts +0 -65
  263. package/src/password-input/password-input.scorer.ts +0 -34
  264. package/src/password-input/password-input.spec.ts +0 -274
  265. package/src/password-input/password-input.ts +0 -488
  266. package/src/popover/_examples/index.ts +0 -5
  267. package/src/popover/_examples/popover.example.ts +0 -92
  268. package/src/popover/_examples/popover.finance.example.ts +0 -106
  269. package/src/popover/_examples/popover.retro.example.ts +0 -103
  270. package/src/popover/index.ts +0 -5
  271. package/src/popover/popover-arrow.ts +0 -30
  272. package/src/popover/popover-close.ts +0 -36
  273. package/src/popover/popover-content.ts +0 -41
  274. package/src/popover/popover-title.ts +0 -39
  275. package/src/popover/popover-trigger.ts +0 -40
  276. package/src/popover/popover.spec.ts +0 -59
  277. package/src/popover/popover.ts +0 -5
  278. package/src/presets/bind-presets.spec.ts +0 -50
  279. package/src/presets/bind-presets.ts +0 -43
  280. package/src/presets/index.ts +0 -3
  281. package/src/presets/size.spec.ts +0 -67
  282. package/src/presets/size.ts +0 -59
  283. package/src/presets/variant.spec.ts +0 -72
  284. package/src/presets/variant.ts +0 -62
  285. package/src/primitives/.gitkeep +0 -0
  286. package/src/primitives/directionality/directionality.spec.ts +0 -112
  287. package/src/primitives/directionality/directionality.ts +0 -89
  288. package/src/primitives/directionality/index.ts +0 -1
  289. package/src/primitives/forms/form-control.spec.ts +0 -67
  290. package/src/primitives/forms/form-control.ts +0 -94
  291. package/src/primitives/forms/index.ts +0 -1
  292. package/src/primitives/index.ts +0 -6
  293. package/src/primitives/interaction/disabled.spec.ts +0 -47
  294. package/src/primitives/interaction/disabled.ts +0 -31
  295. package/src/primitives/interaction/focus-ring.spec.ts +0 -62
  296. package/src/primitives/interaction/focus-ring.ts +0 -59
  297. package/src/primitives/interaction/index.ts +0 -2
  298. package/src/primitives/list/filterable-list.spec.ts +0 -114
  299. package/src/primitives/list/filterable-list.ts +0 -126
  300. package/src/primitives/list/group.spec.ts +0 -99
  301. package/src/primitives/list/group.ts +0 -139
  302. package/src/primitives/list/index.ts +0 -8
  303. package/src/primitives/list/inject-helpers.ts +0 -8
  304. package/src/primitives/list/item.spec.ts +0 -173
  305. package/src/primitives/list/item.ts +0 -222
  306. package/src/primitives/list/navigator.spec.ts +0 -286
  307. package/src/primitives/list/navigator.ts +0 -238
  308. package/src/primitives/list/selection.spec.ts +0 -214
  309. package/src/primitives/list/selection.ts +0 -339
  310. package/src/primitives/list/tokens.ts +0 -106
  311. package/src/primitives/list/type-ahead.spec.ts +0 -58
  312. package/src/primitives/list/type-ahead.ts +0 -46
  313. package/src/primitives/overlay/backdrop.spec.ts +0 -54
  314. package/src/primitives/overlay/backdrop.ts +0 -31
  315. package/src/primitives/overlay/builder.spec.ts +0 -38
  316. package/src/primitives/overlay/builder.ts +0 -151
  317. package/src/primitives/overlay/container.ts +0 -42
  318. package/src/primitives/overlay/context.ts +0 -14
  319. package/src/primitives/overlay/controller.spec.ts +0 -86
  320. package/src/primitives/overlay/controller.ts +0 -190
  321. package/src/primitives/overlay/id.spec.ts +0 -24
  322. package/src/primitives/overlay/id.ts +0 -17
  323. package/src/primitives/overlay/index.ts +0 -18
  324. package/src/primitives/overlay/overlay.css +0 -42
  325. package/src/primitives/overlay/panel.spec.ts +0 -52
  326. package/src/primitives/overlay/panel.ts +0 -102
  327. package/src/primitives/overlay/stack.spec.ts +0 -55
  328. package/src/primitives/overlay/stack.ts +0 -113
  329. package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +0 -11
  330. package/src/primitives/overlay/strategies/backdrop/blurred.ts +0 -5
  331. package/src/primitives/overlay/strategies/backdrop/none.spec.ts +0 -10
  332. package/src/primitives/overlay/strategies/backdrop/none.ts +0 -9
  333. package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +0 -18
  334. package/src/primitives/overlay/strategies/backdrop/solid.ts +0 -23
  335. package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +0 -28
  336. package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +0 -38
  337. package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +0 -9
  338. package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +0 -8
  339. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +0 -49
  340. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +0 -85
  341. package/src/primitives/overlay/strategies/index.ts +0 -34
  342. package/src/primitives/overlay/strategies/live-announcer/_announce.ts +0 -35
  343. package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +0 -21
  344. package/src/primitives/overlay/strategies/live-announcer/assertive.ts +0 -11
  345. package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +0 -21
  346. package/src/primitives/overlay/strategies/live-announcer/polite.ts +0 -11
  347. package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +0 -12
  348. package/src/primitives/overlay/strategies/live-announcer/silent.ts +0 -5
  349. package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +0 -40
  350. package/src/primitives/overlay/strategies/mount/body-portal.ts +0 -91
  351. package/src/primitives/overlay/strategies/mount/in-container.spec.ts +0 -43
  352. package/src/primitives/overlay/strategies/mount/in-container.ts +0 -39
  353. package/src/primitives/overlay/strategies/mount/in-place.spec.ts +0 -40
  354. package/src/primitives/overlay/strategies/mount/in-place.ts +0 -20
  355. package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +0 -56
  356. package/src/primitives/overlay/strategies/position/anchored-to.ts +0 -248
  357. package/src/primitives/overlay/strategies/position/corner.spec.ts +0 -36
  358. package/src/primitives/overlay/strategies/position/corner.ts +0 -33
  359. package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +0 -32
  360. package/src/primitives/overlay/strategies/position/edge-sheet.ts +0 -36
  361. package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +0 -25
  362. package/src/primitives/overlay/strategies/position/in-place-sibling.ts +0 -13
  363. package/src/primitives/overlay/strategies/position/point-at.spec.ts +0 -40
  364. package/src/primitives/overlay/strategies/position/point-at.ts +0 -34
  365. package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +0 -31
  366. package/src/primitives/overlay/strategies/position/viewport-centered.ts +0 -31
  367. package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +0 -15
  368. package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +0 -39
  369. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +0 -21
  370. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +0 -44
  371. package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +0 -9
  372. package/src/primitives/overlay/strategies/scroll-lock/none.ts +0 -5
  373. package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +0 -32
  374. package/src/primitives/overlay/strategies/trigger-event/on-click.ts +0 -28
  375. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +0 -45
  376. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +0 -70
  377. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +0 -35
  378. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +0 -34
  379. package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +0 -64
  380. package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +0 -37
  381. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +0 -37
  382. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +0 -59
  383. package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +0 -34
  384. package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +0 -86
  385. package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +0 -16
  386. package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +0 -12
  387. package/src/primitives/overlay/tokens.ts +0 -54
  388. package/src/primitives/overlay/trigger.spec.ts +0 -103
  389. package/src/primitives/overlay/trigger.ts +0 -75
  390. package/src/primitives/overlay/types.ts +0 -24
  391. package/src/primitives/overlay/wrapper.ts +0 -50
  392. package/src/primitives/signals/deep-signal.ts +0 -109
  393. package/src/primitives/signals/index.ts +0 -1
  394. package/src/progress-bar/config.ts +0 -48
  395. package/src/progress-bar/index.ts +0 -12
  396. package/src/progress-bar/progress-bar-fill.ts +0 -37
  397. package/src/progress-bar/progress-bar.context.ts +0 -34
  398. package/src/progress-bar/progress-bar.spec.ts +0 -423
  399. package/src/progress-bar/progress-bar.ts +0 -217
  400. package/src/public-api.ts +0 -84
  401. package/src/radio/index.ts +0 -2
  402. package/src/radio/radio.context.ts +0 -3
  403. package/src/radio/radio.spec.ts +0 -36
  404. package/src/radio/radio.ts +0 -66
  405. package/src/select/index.ts +0 -4
  406. package/src/select/select-content.ts +0 -69
  407. package/src/select/select-option.ts +0 -35
  408. package/src/select/select-root.ts +0 -129
  409. package/src/select/select-trigger.ts +0 -93
  410. package/src/select/select.spec.ts +0 -138
  411. package/src/select/select.ts +0 -4
  412. package/src/skeleton/index.ts +0 -5
  413. package/src/skeleton/skeleton.spec.ts +0 -115
  414. package/src/skeleton/skeleton.ts +0 -56
  415. package/src/slider/index.ts +0 -10
  416. package/src/slider/slider-range.ts +0 -49
  417. package/src/slider/slider-thumb.ts +0 -335
  418. package/src/slider/slider-track.ts +0 -70
  419. package/src/slider/slider.context.ts +0 -79
  420. package/src/slider/slider.geometry.ts +0 -73
  421. package/src/slider/slider.spec.ts +0 -216
  422. package/src/slider/slider.ts +0 -443
  423. package/src/speed-dial/index.ts +0 -10
  424. package/src/speed-dial/speed-dial-action.ts +0 -40
  425. package/src/speed-dial/speed-dial-actions.ts +0 -31
  426. package/src/speed-dial/speed-dial-trigger.ts +0 -55
  427. package/src/speed-dial/speed-dial.context.ts +0 -36
  428. package/src/speed-dial/speed-dial.spec.ts +0 -143
  429. package/src/speed-dial/speed-dial.ts +0 -127
  430. package/src/spinner/config.ts +0 -48
  431. package/src/spinner/index.ts +0 -8
  432. package/src/spinner/spinner.spec.ts +0 -262
  433. package/src/spinner/spinner.ts +0 -129
  434. package/src/stepper/index.ts +0 -15
  435. package/src/stepper/stepper.context.ts +0 -63
  436. package/src/stepper/stepper.spec.ts +0 -403
  437. package/src/stepper/stepper.ts +0 -544
  438. package/src/styles/docs-themes.css +0 -82
  439. package/src/styles.css +0 -17
  440. package/src/table/column-helpers.spec.ts +0 -74
  441. package/src/table/column-helpers.ts +0 -68
  442. package/src/table/filter-fns.ts +0 -230
  443. package/src/table/filter-models.spec.ts +0 -240
  444. package/src/table/filter-models.ts +0 -124
  445. package/src/table/filter-params.ts +0 -90
  446. package/src/table/grid-api-impl.ts +0 -321
  447. package/src/table/grid-api.spec.ts +0 -178
  448. package/src/table/grid-api.ts +0 -285
  449. package/src/table/index.ts +0 -73
  450. package/src/table/table-cell.spec.ts +0 -43
  451. package/src/table/table-cell.ts +0 -38
  452. package/src/table/table-filter-outlet.ts +0 -120
  453. package/src/table/table-header.spec.ts +0 -54
  454. package/src/table/table-header.ts +0 -63
  455. package/src/table/table-keyboard.spec.ts +0 -68
  456. package/src/table/table-keyboard.ts +0 -107
  457. package/src/table/table-resource.spec.ts +0 -37
  458. package/src/table/table-resource.ts +0 -36
  459. package/src/table/table-row.spec.ts +0 -54
  460. package/src/table/table-row.ts +0 -31
  461. package/src/table/table-storage.spec.ts +0 -67
  462. package/src/table/table-storage.ts +0 -76
  463. package/src/table/table.spec.ts +0 -172
  464. package/src/table/table.ts +0 -281
  465. package/src/table/table.types.ts +0 -83
  466. package/src/tabs/index.ts +0 -7
  467. package/src/tabs/tabs.context.ts +0 -32
  468. package/src/tabs/tabs.spec.ts +0 -352
  469. package/src/tabs/tabs.ts +0 -364
  470. package/src/tag/config.ts +0 -53
  471. package/src/tag/index.ts +0 -7
  472. package/src/tag/tag-list.ts +0 -76
  473. package/src/tag/tag-remove.ts +0 -61
  474. package/src/tag/tag.context.ts +0 -36
  475. package/src/tag/tag.spec.ts +0 -240
  476. package/src/tag/tag.ts +0 -203
  477. package/src/test-setup.ts +0 -5
  478. package/src/textarea/config.ts +0 -42
  479. package/src/textarea/index.ts +0 -8
  480. package/src/textarea/textarea.spec.ts +0 -176
  481. package/src/textarea/textarea.ts +0 -235
  482. package/src/time-picker/index.ts +0 -15
  483. package/src/time-picker/time-picker-meridiem.ts +0 -123
  484. package/src/time-picker/time-picker-segment.ts +0 -318
  485. package/src/time-picker/time-picker.context.ts +0 -38
  486. package/src/time-picker/time-picker.format.ts +0 -181
  487. package/src/time-picker/time-picker.spec.ts +0 -189
  488. package/src/time-picker/time-picker.ts +0 -274
  489. package/src/toast/_examples/index.ts +0 -5
  490. package/src/toast/_examples/toast.example.ts +0 -282
  491. package/src/toast/_examples/toast.finance.example.ts +0 -180
  492. package/src/toast/_examples/toast.retro.example.ts +0 -161
  493. package/src/toast/index.ts +0 -28
  494. package/src/toast/toast.ref.ts +0 -26
  495. package/src/toast/toast.service.ts +0 -339
  496. package/src/toast/toast.spec.ts +0 -247
  497. package/src/toast/toast.strategy.ts +0 -112
  498. package/src/toast/toast.ts +0 -463
  499. package/src/toast/toast.types.ts +0 -5
  500. package/src/toggle/index.ts +0 -1
  501. package/src/toggle/toggle.spec.ts +0 -24
  502. package/src/toggle/toggle.ts +0 -48
  503. package/src/tooltip/_examples/index.ts +0 -6
  504. package/src/tooltip/_examples/tooltip.example.ts +0 -82
  505. package/src/tooltip/_examples/tooltip.finance.example.ts +0 -97
  506. package/src/tooltip/_examples/tooltip.placements.example.ts +0 -83
  507. package/src/tooltip/_examples/tooltip.retro.example.ts +0 -107
  508. package/src/tooltip/index.ts +0 -4
  509. package/src/tooltip/tooltip-arrow.ts +0 -31
  510. package/src/tooltip/tooltip-content.ts +0 -38
  511. package/src/tooltip/tooltip-group.ts +0 -32
  512. package/src/tooltip/tooltip-trigger.ts +0 -47
  513. package/src/tooltip/tooltip.spec.ts +0 -40
  514. package/src/tooltip/tooltip.ts +0 -5
  515. package/src/tree-select/index.ts +0 -12
  516. package/src/tree-select/tree-select-content.ts +0 -199
  517. package/src/tree-select/tree-select-node.ts +0 -132
  518. package/src/tree-select/tree-select-root.ts +0 -272
  519. package/src/tree-select/tree-select-trigger.ts +0 -90
  520. package/src/tree-select/tree-select.context.ts +0 -63
  521. package/src/tree-select/tree-select.spec.ts +0 -433
  522. package/src/tree-select/tree-select.ts +0 -2
  523. package/src/typography/blockquote.ts +0 -57
  524. package/src/typography/code.ts +0 -53
  525. package/src/typography/index.ts +0 -22
  526. package/src/typography/lead.ts +0 -49
  527. package/src/typography/muted.ts +0 -29
  528. package/src/typography/truncate.ts +0 -99
  529. package/src/typography/typography.spec.ts +0 -203
  530. package/tsconfig.lib.json +0 -21
  531. package/tsconfig.lib.prod.json +0 -17
  532. package/tsconfig.spec.json +0 -18
  533. package/vite.config.ts +0 -27
  534. /package/{src/icon → icon}/icon.css +0 -0
  535. /package/{src/typography → typography}/prose.css +0 -0
@@ -1,129 +0,0 @@
1
- import {
2
- DestroyRef,
3
- Directive,
4
- ElementRef,
5
- afterNextRender,
6
- computed,
7
- inject,
8
- input,
9
- signal,
10
- } from '@angular/core';
11
- import { KjSize, KjVariant, bindPresets } from '../presets';
12
- import { KJ_SPINNER_CONFIG, KjSpinnerAnimation } from './config';
13
-
14
- /**
15
- * Marks an element as a kouji indeterminate spinner. Owns the small
16
- * accessibility contract (`role="status"`, default `aria-label="Loading"`,
17
- * `prefers-reduced-motion` reflection) and reflects `data-animation`,
18
- * `data-variant`, and `data-size` for the theme to render the visual glyph.
19
- *
20
- * The host element is consumer-supplied — usually a `<span kjSpinner>`. The
21
- * directive itself emits no markup; the surrounding wrapper / template is
22
- * responsible for the visually-hidden label fallback when no consumer label
23
- * is provided. The directive does set `aria-label` to the default when
24
- * neither `aria-label` nor `aria-labelledby` is already on the host.
25
- *
26
- * **Indeterminate-only.** A determinate "x of y" indicator is a Progress
27
- * Bar — different role, different ARIA contract; do not bend Spinner to fit.
28
- *
29
- * @example
30
- * ```html
31
- * <span kjSpinner></span>
32
- * <span kjSpinner kjAnimation="dots" kjAriaLabel="Sending"></span>
33
- * ```
34
- * @doc-category Core/Feedback
35
- * @doc
36
- * @doc-name spinner
37
- * @doc-description Marks an element as an indeterminate loading indicator with the right accessibility role and label.
38
- * @doc-is-main
39
- */
40
- @Directive({
41
- selector: '[kjSpinner]',
42
- standalone: true,
43
- exportAs: 'kjSpinner',
44
- hostDirectives: [
45
- { directive: KjVariant, inputs: ['kjVariant'] },
46
- { directive: KjSize, inputs: ['kjSize'] },
47
- ],
48
- providers: [...bindPresets(KJ_SPINNER_CONFIG)],
49
- host: {
50
- role: 'status',
51
- 'aria-live': 'polite',
52
- 'aria-atomic': 'true',
53
- '[attr.data-animation]': 'kjAnimation()',
54
- '[attr.data-reduced-motion]': 'reducedMotion() ? "true" : null',
55
- '[attr.aria-label]': 'ariaLabelAttr()',
56
- },
57
- })
58
- export class KjSpinner {
59
- private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
60
- private readonly config = inject(KJ_SPINNER_CONFIG);
61
-
62
- /**
63
- * Animation shape preset. Reflects `data-animation`. Default `'spin'`.
64
- * Themes own the keyframes for each value.
65
- */
66
- readonly kjAnimation = input<KjSpinnerAnimation>(
67
- (this.config.defaults.animation as KjSpinnerAnimation) ?? 'spin',
68
- );
69
-
70
- /**
71
- * Accessible name announced by AT. Bound to `aria-label` when the host has
72
- * no `aria-label` attribute and no `aria-labelledby` attribute already set
73
- * (so a consumer-authored `aria-labelledby` wins, and a consumer-authored
74
- * `aria-label` is not double-bound).
75
- */
76
- readonly kjAriaLabel = input<string>(this.config.defaults.ariaLabel ?? 'Loading');
77
-
78
- /** True when the host had a consumer-authored `aria-labelledby` at mount. */
79
- protected readonly hasAriaLabelledBy: boolean;
80
-
81
- /**
82
- * Captured value of the consumer-authored `aria-label` HTML attribute at
83
- * mount, or `null` if none was set. We re-emit it through the host
84
- * binding so Angular doesn't strip the original (a host `[attr.aria-label]`
85
- * binding always wins over the static attribute, so leaving the binding
86
- * unconditional but echoing the captured value preserves the consumer
87
- * intent).
88
- */
89
- protected readonly nativeAriaLabel: string | null;
90
-
91
- /**
92
- * Reflects the user's `prefers-reduced-motion` preference. The directive
93
- * does not animate anything itself — it mirrors the boolean as
94
- * `data-reduced-motion="true"` and themes own the alternate keyframe.
95
- */
96
- protected readonly reducedMotion = signal<boolean>(false);
97
-
98
- protected readonly ariaLabelAttr = computed(() => {
99
- if (this.hasAriaLabelledBy) return null;
100
- if (this.nativeAriaLabel !== null) return this.nativeAriaLabel;
101
- return this.kjAriaLabel();
102
- });
103
-
104
- constructor() {
105
- const destroyRef = inject(DestroyRef);
106
-
107
- // Read consumer-authored aria attributes synchronously in the
108
- // constructor — by the time `afterNextRender` runs, Angular's host
109
- // binding for `[attr.aria-label]` has already overwritten the original
110
- // attribute with the computed default, which would make the detection
111
- // see kouji's own value and ignore the consumer's.
112
- const host = this.el.nativeElement;
113
- this.hasAriaLabelledBy = host.hasAttribute('aria-labelledby');
114
- this.nativeAriaLabel = host.getAttribute('aria-label');
115
-
116
- afterNextRender(() => {
117
- // SSR-safe: matchMedia is only present in a real browser. The
118
- // server-rendered HTML carries no `data-reduced-motion`; the post-
119
- // hydrate read sets it on the client when the preference is active.
120
- if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
121
- const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
122
- this.reducedMotion.set(mql.matches);
123
- const onChange = (e: MediaQueryListEvent) => this.reducedMotion.set(e.matches);
124
- mql.addEventListener('change', onChange);
125
- destroyRef.onDestroy(() => mql.removeEventListener('change', onChange));
126
- }
127
- });
128
- }
129
- }
@@ -1,15 +0,0 @@
1
- export {
2
- KjStepper,
3
- KjStep,
4
- KjStepLabel,
5
- KjStepContent,
6
- KjStepperNext,
7
- KjStepperPrevious,
8
- KjStepperReset,
9
- } from './stepper';
10
- export {
11
- KJ_STEPPER,
12
- KJ_STEP,
13
- type KjStepperContext,
14
- type KjStepContext,
15
- } from './stepper.context';
@@ -1,63 +0,0 @@
1
- import { InjectionToken, Signal } from '@angular/core';
2
-
3
- /** Per-step context exposed to `KjStepLabel` and `KjStepContent`. */
4
- export interface KjStepContext {
5
- /** 0-based index in the parent stepper's step set. */
6
- readonly index: Signal<number>;
7
- /** True when this step is the active one. */
8
- readonly active: Signal<boolean>;
9
- /** True when this step has been completed (consumer-set via `kjStepCompleted`). */
10
- readonly completed: Signal<boolean>;
11
- /** True when this step is in an error state (consumer-set via `kjStepError`). */
12
- readonly error: Signal<boolean>;
13
- /** True when this step is optional (does not gate linear advancement). */
14
- readonly optional: Signal<boolean>;
15
- /** True when this step is reachable in the current mode. */
16
- readonly reachable: Signal<boolean>;
17
- /** True when this step is explicitly disabled by the consumer. */
18
- readonly disabled: Signal<boolean>;
19
- /** Optional consumer-supplied semantic key, used by `goToKey()`. */
20
- readonly key: Signal<string | undefined>;
21
- /** Stable id for `aria-labelledby` wiring. */
22
- readonly labelId: Signal<string>;
23
- /** Stable id for the content region. */
24
- readonly contentId: Signal<string>;
25
- /** Activate this step (subject to linear-mode gating). */
26
- activate(): void;
27
- }
28
-
29
- /** Stepper-root context exposed to step / label / content / command directives. */
30
- export interface KjStepperContext {
31
- /** Active step index (0-based). */
32
- readonly activeStep: Signal<number>;
33
- /** Total number of registered steps. */
34
- readonly totalSteps: Signal<number>;
35
- /** @internal — read-only view of registered steps in registration order. */
36
- readonly steps: Signal<readonly KjStepContext[]>;
37
- /** Linear-mode flag. */
38
- readonly linear: Signal<boolean>;
39
- /** Orientation. */
40
- readonly orientation: Signal<'horizontal' | 'vertical'>;
41
- /** True when `next()` will succeed. */
42
- readonly canAdvance: Signal<boolean>;
43
- /** True when `previous()` will succeed. */
44
- readonly canRetreat: Signal<boolean>;
45
- /** Imperative navigation. */
46
- next(): void;
47
- previous(): void;
48
- goTo(index: number): void;
49
- goToKey(key: string): void;
50
- reset(): void;
51
- /** @internal — `KjStep` registers / unregisters here. */
52
- register(step: KjStepContext): void;
53
- /** @internal */
54
- unregister(step: KjStepContext): void;
55
- /** @internal — `KjStep` reports its reachability under linear gating. */
56
- isReachable(index: number): boolean;
57
- }
58
-
59
- /** Injection token for the root stepper directive. */
60
- export const KJ_STEPPER = new InjectionToken<KjStepperContext>('KjStepper');
61
-
62
- /** Injection token for an individual step directive. */
63
- export const KJ_STEP = new InjectionToken<KjStepContext>('KjStep');
@@ -1,403 +0,0 @@
1
- import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { fireEvent, render } from '@testing-library/angular';
3
- import { axe, toHaveNoViolations } from 'jest-axe';
4
- import {
5
- KjStep,
6
- KjStepContent,
7
- KjStepLabel,
8
- KjStepper,
9
- KjStepperNext,
10
- KjStepperPrevious,
11
- KjStepperReset,
12
- } from './stepper';
13
-
14
- expect.extend(toHaveNoViolations);
15
-
16
- const imports = [
17
- KjStepper,
18
- KjStep,
19
- KjStepLabel,
20
- KjStepContent,
21
- KjStepperNext,
22
- KjStepperPrevious,
23
- KjStepperReset,
24
- ];
25
-
26
- const baseTemplate = `
27
- <ol kjStepper [(kjActiveStep)]="active">
28
- <li kjStep>
29
- <button kjStepLabel>Account</button>
30
- <section kjStepContent>Account body</section>
31
- </li>
32
- <li kjStep>
33
- <button kjStepLabel>Profile</button>
34
- <section kjStepContent>Profile body</section>
35
- </li>
36
- <li kjStep>
37
- <button kjStepLabel>Confirm</button>
38
- <section kjStepContent>Confirm body</section>
39
- </li>
40
- <li>
41
- <button kjStepperPrevious>Back</button>
42
- <button kjStepperNext>Next</button>
43
- <button kjStepperReset>Reset</button>
44
- </li>
45
- </ol>`;
46
-
47
- @Component({
48
- standalone: true,
49
- imports,
50
- changeDetection: ChangeDetectionStrategy.Eager,
51
- template: baseTemplate,
52
- })
53
- class BasicHostComponent {
54
- active = 0;
55
- }
56
-
57
- describe('KjStepper', () => {
58
- describe('roles + ARIA', () => {
59
- it('renders the root with native <ol> semantics and data-orientation', async () => {
60
- const { container } = await render(BasicHostComponent);
61
- const root = container.querySelector('[kjStepper]')!;
62
- expect(root.tagName).toBe('OL');
63
- // We deliberately do not set `aria-orientation` — axe `aria-allowed-attr`
64
- // rejects it on the implicit `list` role. The keyboard axis is enforced
65
- // via `KjRovingTabindex`; visual layout reads `data-orientation`.
66
- expect(root).not.toHaveAttribute('aria-orientation');
67
- expect(root).toHaveAttribute('data-orientation', 'horizontal');
68
- });
69
-
70
- it('marks the active step with aria-current="step" and inactive steps without it', async () => {
71
- const { container } = await render(BasicHostComponent);
72
- const steps = container.querySelectorAll('[kjStep]');
73
- expect(steps[0]).toHaveAttribute('aria-current', 'step');
74
- expect(steps[1]).not.toHaveAttribute('aria-current');
75
- expect(steps[2]).not.toHaveAttribute('aria-current');
76
- });
77
-
78
- it('wires step content as role="region" with aria-labelledby to the label id', async () => {
79
- const { container } = await render(BasicHostComponent);
80
- const label = container.querySelectorAll('[kjStepLabel]')[0];
81
- const content = container.querySelectorAll('[kjStepContent]')[0];
82
- expect(content).toHaveAttribute('role', 'region');
83
- expect(label.getAttribute('id')).toBeTruthy();
84
- expect(content.getAttribute('aria-labelledby')).toBe(label.getAttribute('id'));
85
- expect(label.getAttribute('aria-controls')).toBe(content.getAttribute('id'));
86
- });
87
-
88
- it('hides inactive content panels via [hidden] and [inert]', async () => {
89
- const { container } = await render(BasicHostComponent);
90
- const contents = container.querySelectorAll('[kjStepContent]');
91
- expect(contents[0]).not.toHaveAttribute('hidden');
92
- expect(contents[1]).toHaveAttribute('hidden', '');
93
- expect(contents[1]).toHaveAttribute('inert', '');
94
- });
95
-
96
- it('passes axe audit', async () => {
97
- const { container } = await render(BasicHostComponent);
98
- // Step content elements with `aria-labelledby` may be flagged when their
99
- // referenced label is hidden; restrict the audit to the always-visible
100
- // header strip + active panel for a clean signal.
101
- expect(await axe(container)).toHaveNoViolations();
102
- });
103
- });
104
-
105
- describe('active step via index', () => {
106
- it('writing to kjActiveStep activates the matching step', async () => {
107
- const fixture = await render(BasicHostComponent);
108
- fixture.fixture.componentInstance.active = 1;
109
- fixture.detectChanges();
110
- const steps = fixture.container.querySelectorAll('[kjStep]');
111
- expect(steps[0]).not.toHaveAttribute('aria-current');
112
- expect(steps[1]).toHaveAttribute('aria-current', 'step');
113
- });
114
-
115
- it('out-of-range writes clamp to the valid range', async () => {
116
- const fixture = await render(BasicHostComponent);
117
- fixture.fixture.componentInstance.active = 99;
118
- fixture.detectChanges();
119
- // The clamping effect re-runs and pulls the model back into range.
120
- await fixture.fixture.whenStable();
121
- fixture.detectChanges();
122
- const steps = fixture.container.querySelectorAll('[kjStep]');
123
- expect(steps[2]).toHaveAttribute('aria-current', 'step');
124
- });
125
- });
126
-
127
- describe('non-linear jumps', () => {
128
- it('clicking any step header activates it', async () => {
129
- const { container } = await render(BasicHostComponent);
130
- const labels = container.querySelectorAll('[kjStepLabel]');
131
- fireEvent.click(labels[2]);
132
- const steps = container.querySelectorAll('[kjStep]');
133
- expect(steps[2]).toHaveAttribute('aria-current', 'step');
134
- });
135
- });
136
-
137
- describe('linear-mode reachability gating', () => {
138
- @Component({
139
- standalone: true,
140
- imports,
141
- template: `
142
- <ol kjStepper [kjLinear]="true" [(kjActiveStep)]="active">
143
- <li kjStep [kjStepCompleted]="step1Done()">
144
- <button kjStepLabel>Account</button>
145
- <section kjStepContent>Account</section>
146
- </li>
147
- <li kjStep [kjStepCompleted]="step2Done()">
148
- <button kjStepLabel>Profile</button>
149
- <section kjStepContent>Profile</section>
150
- </li>
151
- <li kjStep>
152
- <button kjStepLabel>Confirm</button>
153
- <section kjStepContent>Confirm</section>
154
- </li>
155
- <button kjStepperNext>Next</button>
156
- </ol>
157
- `,
158
- })
159
- class LinearHost {
160
- active = 0;
161
- readonly step1Done = signal(false);
162
- readonly step2Done = signal(false);
163
- }
164
-
165
- it('un-reached headers are aria-disabled in linear mode', async () => {
166
- const { container } = await render(LinearHost);
167
- const labels = container.querySelectorAll('[kjStepLabel]');
168
- expect(labels[0]).not.toHaveAttribute('aria-disabled');
169
- expect(labels[1]).toHaveAttribute('aria-disabled', 'true');
170
- expect(labels[2]).toHaveAttribute('aria-disabled', 'true');
171
- });
172
-
173
- it('clicking an un-reached label is a no-op', async () => {
174
- const { container } = await render(LinearHost);
175
- const labels = container.querySelectorAll('[kjStepLabel]');
176
- fireEvent.click(labels[2]);
177
- const steps = container.querySelectorAll('[kjStep]');
178
- expect(steps[0]).toHaveAttribute('aria-current', 'step');
179
- expect(steps[2]).not.toHaveAttribute('aria-current');
180
- });
181
-
182
- it('next() is disabled when the active step is not completed', async () => {
183
- const { container } = await render(LinearHost);
184
- const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
185
- expect(next).toHaveAttribute('disabled', '');
186
- });
187
-
188
- it('next() advances after the active step is marked completed', async () => {
189
- const fixture = await render(LinearHost);
190
- fixture.fixture.componentInstance.step1Done.set(true);
191
- fixture.detectChanges();
192
- const next = fixture.container.querySelector('[kjStepperNext]') as HTMLButtonElement;
193
- expect(next).not.toHaveAttribute('disabled');
194
- fireEvent.click(next);
195
- fixture.detectChanges();
196
- const steps = fixture.container.querySelectorAll('[kjStep]');
197
- expect(steps[1]).toHaveAttribute('aria-current', 'step');
198
- });
199
-
200
- it('once a step is completed the next header becomes reachable', async () => {
201
- const fixture = await render(LinearHost);
202
- fixture.fixture.componentInstance.step1Done.set(true);
203
- fixture.detectChanges();
204
- const labels = fixture.container.querySelectorAll('[kjStepLabel]');
205
- expect(labels[1]).not.toHaveAttribute('aria-disabled');
206
- // Step 3 still gated because step 2 isn't done yet.
207
- expect(labels[2]).toHaveAttribute('aria-disabled', 'true');
208
- });
209
- });
210
-
211
- describe('step completion + error reflection', () => {
212
- @Component({
213
- standalone: true,
214
- imports,
215
- template: `
216
- <ol kjStepper>
217
- <li
218
- kjStep
219
- [kjStepCompleted]="done()"
220
- [kjStepError]="failed()"
221
- [kjStepOptional]="optional()"
222
- >
223
- <button kjStepLabel>One</button>
224
- </li>
225
- <li kjStep>
226
- <button kjStepLabel>Two</button>
227
- </li>
228
- </ol>
229
- `,
230
- })
231
- class StateHost {
232
- readonly done = signal(false);
233
- readonly failed = signal(false);
234
- readonly optional = signal(false);
235
- }
236
-
237
- it('reflects completion / error / optional via data-* attrs', async () => {
238
- const fixture = await render(StateHost);
239
- const step = fixture.container.querySelectorAll('[kjStep]')[0];
240
- expect(step).not.toHaveAttribute('data-completed');
241
- expect(step).not.toHaveAttribute('data-error');
242
- expect(step).not.toHaveAttribute('data-optional');
243
-
244
- fixture.fixture.componentInstance.done.set(true);
245
- fixture.fixture.componentInstance.failed.set(true);
246
- fixture.fixture.componentInstance.optional.set(true);
247
- fixture.detectChanges();
248
-
249
- expect(step).toHaveAttribute('data-completed', 'true');
250
- expect(step).toHaveAttribute('data-error', 'true');
251
- expect(step).toHaveAttribute('data-optional', 'true');
252
- });
253
- });
254
-
255
- describe('next/prev/reset commands', () => {
256
- it('next advances by one in non-linear mode', async () => {
257
- const { container } = await render(BasicHostComponent);
258
- const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
259
- fireEvent.click(next);
260
- const steps = container.querySelectorAll('[kjStep]');
261
- expect(steps[1]).toHaveAttribute('aria-current', 'step');
262
- });
263
-
264
- it('previous retreats by one and is disabled at index 0', async () => {
265
- const { container } = await render(BasicHostComponent);
266
- const prev = container.querySelector('[kjStepperPrevious]') as HTMLButtonElement;
267
- expect(prev).toHaveAttribute('disabled', '');
268
- const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
269
- fireEvent.click(next);
270
- fireEvent.click(next);
271
- expect(prev).not.toHaveAttribute('disabled');
272
- fireEvent.click(prev);
273
- const steps = container.querySelectorAll('[kjStep]');
274
- expect(steps[1]).toHaveAttribute('aria-current', 'step');
275
- });
276
-
277
- it('reset returns to step 0', async () => {
278
- const { container } = await render(BasicHostComponent);
279
- const next = container.querySelector('[kjStepperNext]') as HTMLButtonElement;
280
- const reset = container.querySelector('[kjStepperReset]') as HTMLButtonElement;
281
- fireEvent.click(next);
282
- fireEvent.click(next);
283
- fireEvent.click(reset);
284
- const steps = container.querySelectorAll('[kjStep]');
285
- expect(steps[0]).toHaveAttribute('aria-current', 'step');
286
- });
287
-
288
- it('next at the last step is disabled by default; loops when kjLoop=true', async () => {
289
- @Component({
290
- standalone: true,
291
- imports,
292
- template: ` <ol kjStepper [kjLoop]="loop">
293
- <li kjStep><button kjStepLabel>A</button></li>
294
- <li kjStep><button kjStepLabel>B</button></li>
295
- <button kjStepperNext>Next</button>
296
- </ol>`,
297
- })
298
- class LoopHost {
299
- loop = false;
300
- }
301
- const fixture = await render(LoopHost);
302
- const next = fixture.container.querySelector('[kjStepperNext]') as HTMLButtonElement;
303
- fireEvent.click(next);
304
- // At last step, no loop → disabled.
305
- expect(next).toHaveAttribute('disabled', '');
306
-
307
- fixture.fixture.componentInstance.loop = true;
308
- fixture.detectChanges();
309
- expect(next).not.toHaveAttribute('disabled');
310
- fireEvent.click(next);
311
- const steps = fixture.container.querySelectorAll('[kjStep]');
312
- expect(steps[0]).toHaveAttribute('aria-current', 'step');
313
- });
314
- });
315
-
316
- describe('orientation propagation to roving', () => {
317
- it('vertical orientation reflects on data-orientation', async () => {
318
- @Component({
319
- standalone: true,
320
- imports,
321
- template: ` <ol kjStepper kjOrientation="vertical">
322
- <li kjStep><button kjStepLabel>One</button></li>
323
- <li kjStep><button kjStepLabel>Two</button></li>
324
- </ol>`,
325
- })
326
- class VerticalHost {}
327
- const { container } = await render(VerticalHost);
328
- const root = container.querySelector('[kjStepper]')!;
329
- expect(root).toHaveAttribute('data-orientation', 'vertical');
330
- });
331
-
332
- it('arrow keys move focus along the configured axis (horizontal default)', async () => {
333
- const { container } = await render(BasicHostComponent);
334
- const root = container.querySelector('[kjStepper]')!;
335
- const labels = container.querySelectorAll<HTMLButtonElement>('[kjStepLabel]');
336
- labels[0].focus();
337
- fireEvent.keyDown(root, { key: 'ArrowRight' });
338
- // Roving moved tabindex=0 to the next label.
339
- expect(labels[1]).toHaveAttribute('tabindex', '0');
340
- expect(labels[0]).toHaveAttribute('tabindex', '-1');
341
- });
342
-
343
- it('vertical orientation: ArrowDown moves focus, ArrowRight is ignored', async () => {
344
- @Component({
345
- standalone: true,
346
- imports,
347
- template: ` <ol kjStepper kjOrientation="vertical">
348
- <li kjStep><button kjStepLabel>One</button></li>
349
- <li kjStep><button kjStepLabel>Two</button></li>
350
- </ol>`,
351
- })
352
- class VerticalHost {}
353
- const { container } = await render(VerticalHost);
354
- const root = container.querySelector('[kjStepper]')!;
355
- const labels = container.querySelectorAll<HTMLButtonElement>('[kjStepLabel]');
356
- labels[0].focus();
357
- fireEvent.keyDown(root, { key: 'ArrowRight' });
358
- expect(labels[0]).toHaveAttribute('tabindex', '0');
359
- expect(labels[1]).toHaveAttribute('tabindex', '-1');
360
-
361
- fireEvent.keyDown(root, { key: 'ArrowDown' });
362
- expect(labels[1]).toHaveAttribute('tabindex', '0');
363
- expect(labels[0]).toHaveAttribute('tabindex', '-1');
364
- });
365
- });
366
-
367
- describe('goToKey lookup', () => {
368
- it('navigates by kjStepKey', async () => {
369
- @Component({
370
- standalone: true,
371
- imports,
372
- template: ` <ol kjStepper #s="kjStepper">
373
- <li kjStep kjStepKey="account"><button kjStepLabel>Account</button></li>
374
- <li kjStep kjStepKey="profile"><button kjStepLabel>Profile</button></li>
375
- <li kjStep kjStepKey="confirm"><button kjStepLabel>Confirm</button></li>
376
- <button (click)="s.goToKey('profile')" id="jump">Jump</button>
377
- </ol>`,
378
- })
379
- class KeyHost {}
380
- const { container } = await render(KeyHost);
381
- fireEvent.click(container.querySelector('#jump')!);
382
- const steps = container.querySelectorAll('[kjStep]');
383
- expect(steps[1]).toHaveAttribute('aria-current', 'step');
384
- });
385
-
386
- it('unknown key is a no-op', async () => {
387
- @Component({
388
- standalone: true,
389
- imports,
390
- template: ` <ol kjStepper #s="kjStepper">
391
- <li kjStep kjStepKey="a"><button kjStepLabel>A</button></li>
392
- <li kjStep kjStepKey="b"><button kjStepLabel>B</button></li>
393
- <button (click)="s.goToKey('nope')" id="jump">Jump</button>
394
- </ol>`,
395
- })
396
- class KeyHost {}
397
- const { container } = await render(KeyHost);
398
- fireEvent.click(container.querySelector('#jump')!);
399
- const steps = container.querySelectorAll('[kjStep]');
400
- expect(steps[0]).toHaveAttribute('aria-current', 'step');
401
- });
402
- });
403
- });