@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,63 +0,0 @@
1
- import { InjectionToken, Signal } from '@angular/core';
2
-
3
- /**
4
- * A single node in a tree structure. Nodes may carry an arbitrary value
5
- * of type `T`, a display label, an optional disabled flag, and optional
6
- * child nodes (making the node a branch rather than a leaf).
7
- */
8
- export interface KjTreeNode<T = unknown> {
9
- /** The value represented by this node. Used for selection and identity. */
10
- readonly value: T;
11
- /** Human-readable display label shown in the tree. */
12
- readonly label: string;
13
- /** When `true`, the node cannot be selected or expanded by the user. */
14
- readonly disabled?: boolean;
15
- /** Child nodes. When present and non-empty, this node is a branch. */
16
- readonly children?: readonly KjTreeNode<T>[];
17
- }
18
-
19
- /**
20
- * Context interface exposed by `KjTreeSelect` to descendant directives
21
- * (panel, nodes, toggle buttons) via the `KJ_TREE_SELECT` injection token.
22
- *
23
- * Selection state (current value, membership checks, toggles) is **not**
24
- * part of this context — it lives on the shared `KjSelectionModel`
25
- * provided by the root and consumed by `KjListItem` via the
26
- * `KJ_LIST_NAVIGATOR_CONFIG` plumbing. This interface only carries the
27
- * **tree-specific** surface: node data, expansion state, and the public
28
- * `selectionMode` input value (used by panel ARIA to drive
29
- * `aria-multiselectable`).
30
- *
31
- * Open/close state lives on the overlay primitives and is not part of this
32
- * context — descendants that need it inject `KjOverlayController` directly.
33
- */
34
- export interface KjTreeSelectContext<T = unknown> {
35
- /** Stable id for the panel element (used for `aria-controls`). */
36
- readonly panelId: string;
37
- /** Current selection mode: `'single'` or `'multiple'`. */
38
- readonly selectionMode: Signal<'single' | 'multiple'>;
39
- /** Set of node IDs that are currently expanded. */
40
- readonly expandedIds: Signal<ReadonlySet<string>>;
41
- /** Set of node **values** that are currently expanded. */
42
- readonly expandedValues: Signal<ReadonlySet<unknown>>;
43
- /** The full tree data. */
44
- readonly nodes: Signal<readonly KjTreeNode<T>[]>;
45
-
46
- /**
47
- * Toggle expand/collapse for the given node DOM id. Does nothing for leaf
48
- * nodes (those without children).
49
- */
50
- toggleNode(nodeId: string): void;
51
- /**
52
- * Toggle expand/collapse for a node identified by its **value**. Used by
53
- * wrapper components that track expansion by value rather than by DOM id.
54
- */
55
- toggleNodeByValue(value: T): void;
56
- /** Returns `true` when the node with the given DOM id is expanded. */
57
- isExpanded(nodeId: string): boolean;
58
- /** Returns `true` when the given value is in the expanded values set. */
59
- isValueExpanded(value: T): boolean;
60
- }
61
-
62
- /** Injection token providing the nearest `KjTreeSelect` context to descendants. */
63
- export const KJ_TREE_SELECT = new InjectionToken<KjTreeSelectContext>('KjTreeSelect');
@@ -1,433 +0,0 @@
1
- import { render, fireEvent } from '@testing-library/angular';
2
- import { By } from '@angular/platform-browser';
3
- import { toHaveNoViolations } from 'jest-axe';
4
- import { afterEach } from 'vitest';
5
- import {
6
- KjTreeSelect,
7
- KjTreeSelectNode,
8
- KjTreeSelectToggle,
9
- } from './tree-select';
10
- import { KjTreeSelectTrigger } from './tree-select-trigger';
11
- import { KjTreeSelectContent } from './tree-select-content';
12
- import { KJ_LIST_NAVIGATOR_CONFIG } from '../primitives/list';
13
-
14
- expect.extend(toHaveNoViolations);
15
-
16
- // Sweep portalled overlay wrappers between tests. The body-portal
17
- // mount strategy detaches them on overlay close, but if a test ends
18
- // while the panel is still open the wrapper survives in `document.body`
19
- // and pollutes subsequent `document.querySelector` calls.
20
- afterEach(() => {
21
- document
22
- .querySelectorAll('.kj-overlay-wrapper, .kj-overlay-container')
23
- .forEach(w => w.remove());
24
- });
25
-
26
- const imports = [
27
- KjTreeSelect,
28
- KjTreeSelectTrigger,
29
- KjTreeSelectContent,
30
- KjTreeSelectNode,
31
- KjTreeSelectToggle,
32
- ];
33
-
34
- // The overlay uses the body-portal mount strategy, so on open the panel
35
- // (and all of its tree-node children) move from the test `container`
36
- // into a per-overlay wrapper inside `document.body`. Pre-open queries
37
- // happily use the test `container`; post-open queries must scope to
38
- // `document` (or fall back to `container` when the portal is closed).
39
- const q = (sel: string): Element | null =>
40
- document.querySelector(sel) ?? null;
41
- const qa = (sel: string): NodeListOf<Element> => document.querySelectorAll(sel);
42
-
43
- // ── Base single-select template ──────────────────────────────────────────────
44
-
45
- const singleTemplate = `
46
- <div kjTreeSelect [(kjValue)]="selected">
47
- <button kjTreeSelectTrigger #t="kjTreeSelectTrigger">Choose</button>
48
- <kj-tree-select-content [kjFor]="t">
49
- <div
50
- kjTreeSelectNode
51
- [kjValue]="'fruits'"
52
- kjLabel="Fruits"
53
- [kjHasChildren]="true"
54
- [kjNodeLevel]="1" [kjNodeSize]="2" [kjNodePos]="1"
55
- >
56
- <button kjTreeSelectToggle type="button">▶</button>
57
- <span>Fruits</span>
58
- <div
59
- kjTreeSelectNode
60
- [kjValue]="'apple'"
61
- kjLabel="Apple"
62
- [kjNodeLevel]="2" [kjNodeSize]="2" [kjNodePos]="1"
63
- >Apple</div>
64
- <div
65
- kjTreeSelectNode
66
- [kjValue]="'banana'"
67
- kjLabel="Banana"
68
- [kjNodeLevel]="2" [kjNodeSize]="2" [kjNodePos]="2"
69
- >Banana</div>
70
- </div>
71
- <div
72
- kjTreeSelectNode
73
- [kjValue]="'veggies'"
74
- kjLabel="Vegetables"
75
- [kjNodeLevel]="1" [kjNodeSize]="2" [kjNodePos]="2"
76
- >Vegetables</div>
77
- </kj-tree-select-content>
78
- </div>
79
- `;
80
-
81
- // ── Tests ────────────────────────────────────────────────────────────────────
82
-
83
- describe('KjTreeSelect – panel visibility', () => {
84
- it('panel is hidden by default', async () => {
85
- const { container } = await render(singleTemplate, {
86
- imports,
87
- componentProperties: { selected: undefined },
88
- });
89
- expect(container.querySelector('kj-tree-select-content')).toHaveAttribute('hidden', '');
90
- });
91
-
92
- it('clicking the trigger opens the panel', async () => {
93
- const { container } = await render(singleTemplate, {
94
- imports,
95
- componentProperties: { selected: undefined },
96
- });
97
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
98
- // Panel is portalled to body on open — query via `document`.
99
- expect(q('kj-tree-select-content')).not.toHaveAttribute('hidden');
100
- });
101
-
102
- it('aria-expanded on trigger reflects open state', async () => {
103
- const { container } = await render(singleTemplate, {
104
- imports,
105
- componentProperties: { selected: undefined },
106
- });
107
- const trigger = container.querySelector('[kjTreeSelectTrigger]')!;
108
- expect(trigger).toHaveAttribute('aria-expanded', 'false');
109
- fireEvent.click(trigger);
110
- expect(trigger).toHaveAttribute('aria-expanded', 'true');
111
- });
112
-
113
- it('Escape closes the panel', async () => {
114
- const { container } = await render(singleTemplate, {
115
- imports,
116
- componentProperties: { selected: undefined },
117
- });
118
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
119
- fireEvent.keyDown(document, { key: 'Escape' });
120
- // `KjOverlayController.close` schedules its DOM teardown inside a
121
- // requestAnimationFrame (so consumers can animate close transitions
122
- // without panicking the state machine). Wait one RAF before we
123
- // assert on the final `hidden` attribute. Once closed, the panel
124
- // is detached/hidden regardless of which parent currently holds
125
- // it — query against `document` so the assertion stays
126
- // intent-preserving.
127
- await new Promise<void>(r => requestAnimationFrame(() => r()));
128
- expect(q('kj-tree-select-content')).toHaveAttribute('hidden', '');
129
- });
130
- });
131
-
132
- describe('KjTreeSelect – trigger ARIA', () => {
133
- it('trigger has role="combobox" and aria-haspopup="tree"', async () => {
134
- const { container } = await render(singleTemplate, {
135
- imports,
136
- componentProperties: { selected: undefined },
137
- });
138
- const trigger = container.querySelector('[kjTreeSelectTrigger]')!;
139
- expect(trigger).toHaveAttribute('role', 'combobox');
140
- expect(trigger).toHaveAttribute('aria-haspopup', 'tree');
141
- });
142
- });
143
-
144
- describe('KjTreeSelect – panel ARIA', () => {
145
- it('panel has role="tree"', async () => {
146
- const { container } = await render(singleTemplate, {
147
- imports,
148
- componentProperties: { selected: undefined },
149
- });
150
- expect(container.querySelector('kj-tree-select-content')).toHaveAttribute('role', 'tree');
151
- });
152
-
153
- it('nodes carry role="treeitem"', async () => {
154
- const { container } = await render(singleTemplate, {
155
- imports,
156
- componentProperties: { selected: undefined },
157
- });
158
- const nodes = container.querySelectorAll('[kjTreeSelectNode]');
159
- nodes.forEach(n => expect(n).toHaveAttribute('role', 'treeitem'));
160
- });
161
-
162
- it('branch node has aria-expanded="false" when collapsed', async () => {
163
- const { container } = await render(singleTemplate, {
164
- imports,
165
- componentProperties: { selected: undefined },
166
- });
167
- const branchNode = container.querySelector('[kjTreeSelectNode][data-has-children="true"]')!;
168
- expect(branchNode).toHaveAttribute('aria-expanded', 'false');
169
- });
170
-
171
- it('node host element has an id minted by the composed KjListItem', async () => {
172
- const { container } = await render(singleTemplate, {
173
- imports,
174
- componentProperties: { selected: undefined },
175
- });
176
- const node = container.querySelector('[kjTreeSelectNode]')!;
177
- // KjListItem auto-mints `kj-list-item-N` ids unless an `id` is
178
- // already set on the host element.
179
- expect(node.id).toMatch(/^kj-list-item-\d+$/);
180
- });
181
- });
182
-
183
- describe('KjTreeSelect – expand / collapse', () => {
184
- it('clicking the toggle button expands the branch node', async () => {
185
- const { container } = await render(singleTemplate, {
186
- imports,
187
- componentProperties: { selected: undefined },
188
- });
189
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
190
- const toggle = q('[kjTreeSelectToggle]')!;
191
- fireEvent.click(toggle);
192
- const branchNode = q('[kjTreeSelectNode][data-has-children="true"]')!;
193
- expect(branchNode).toHaveAttribute('aria-expanded', 'true');
194
- expect(branchNode).toHaveAttribute('data-expanded', 'true');
195
- });
196
-
197
- it('clicking toggle again collapses the branch', async () => {
198
- const { container } = await render(singleTemplate, {
199
- imports,
200
- componentProperties: { selected: undefined },
201
- });
202
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
203
- const toggle = q('[kjTreeSelectToggle]')!;
204
- fireEvent.click(toggle);
205
- fireEvent.click(toggle);
206
- const branchNode = q('[kjTreeSelectNode][data-has-children="true"]')!;
207
- expect(branchNode).toHaveAttribute('aria-expanded', 'false');
208
- });
209
-
210
- it('toggle click does not select the branch node', async () => {
211
- const { container, fixture } = await render(singleTemplate, {
212
- imports,
213
- componentProperties: { selected: undefined },
214
- });
215
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
216
- const toggle = q('[kjTreeSelectToggle]')!;
217
- fireEvent.click(toggle);
218
- fixture.detectChanges();
219
- expect(q('kj-tree-select-content')).not.toHaveAttribute('hidden');
220
- });
221
- });
222
-
223
- describe('KjTreeSelect – single selection', () => {
224
- it('clicking a leaf node selects it and closes the panel', async () => {
225
- const { container, fixture } = await render(singleTemplate, {
226
- imports,
227
- componentProperties: { selected: undefined },
228
- });
229
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
230
- const leafNode = q('[kjTreeSelectNode][aria-level="2"]')!;
231
- // Capture the node's id before activation so we can find it again
232
- // post-close (panel may be portalled back to its original slot, or
233
- // remain in the body wrapper — `document.querySelector` covers
234
- // both placements).
235
- const leafId = leafNode.id;
236
- fireEvent.click(leafNode);
237
- fixture.detectChanges();
238
- // `KjOverlayController.close` schedules its DOM teardown inside a
239
- // requestAnimationFrame — wait one RAF before asserting on
240
- // `hidden`.
241
- await new Promise<void>(r => requestAnimationFrame(() => r()));
242
- expect(q('kj-tree-select-content')).toHaveAttribute('hidden', '');
243
- const refoundLeaf = q(`#${leafId}`)!;
244
- expect(refoundLeaf).toHaveAttribute('aria-selected', 'true');
245
- expect(refoundLeaf).toHaveAttribute('data-selected', '');
246
- });
247
-
248
- it('aria-selected="false" on unselected nodes', async () => {
249
- const { container } = await render(singleTemplate, {
250
- imports,
251
- componentProperties: { selected: undefined },
252
- });
253
- const nodes = container.querySelectorAll('[kjTreeSelectNode]');
254
- nodes.forEach(n => expect(n).toHaveAttribute('aria-selected', 'false'));
255
- });
256
-
257
- it('clicking a different node updates the selection', async () => {
258
- const { container, fixture } = await render(singleTemplate, {
259
- imports,
260
- componentProperties: { selected: undefined },
261
- });
262
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
263
- const initial = qa('[kjTreeSelectNode][aria-level="2"]');
264
- const firstId = initial[0].id;
265
- const secondId = initial[1].id;
266
- fireEvent.click(initial[0]);
267
- fixture.detectChanges();
268
-
269
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
270
- fixture.detectChanges();
271
- expect(q(`#${firstId}`)).toHaveAttribute('aria-selected', 'true');
272
- expect(q(`#${secondId}`)).toHaveAttribute('aria-selected', 'false');
273
- });
274
- });
275
-
276
- describe('KjTreeSelect – multi selection', () => {
277
- const multiTemplate = `
278
- <div kjTreeSelect [(kjValue)]="selected" kjSelectionMode="multiple">
279
- <button kjTreeSelectTrigger #t="kjTreeSelectTrigger">Choose</button>
280
- <kj-tree-select-content [kjFor]="t">
281
- <div kjTreeSelectNode [kjValue]="'a'" kjLabel="A" [kjNodeLevel]="1" [kjNodeSize]="3" [kjNodePos]="1">A</div>
282
- <div kjTreeSelectNode [kjValue]="'b'" kjLabel="B" [kjNodeLevel]="1" [kjNodeSize]="3" [kjNodePos]="2">B</div>
283
- <div kjTreeSelectNode [kjValue]="'c'" kjLabel="C" [kjNodeLevel]="1" [kjNodeSize]="3" [kjNodePos]="3">C</div>
284
- </kj-tree-select-content>
285
- </div>
286
- `;
287
-
288
- it('panel stays open after selecting a node', async () => {
289
- const { container } = await render(multiTemplate, {
290
- imports,
291
- componentProperties: { selected: [] },
292
- });
293
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
294
- const nodes = qa('[kjTreeSelectNode]');
295
- fireEvent.click(nodes[0]);
296
- expect(q('kj-tree-select-content')).not.toHaveAttribute('hidden');
297
- });
298
-
299
- it('panel has aria-multiselectable="true"', async () => {
300
- const { container } = await render(multiTemplate, {
301
- imports,
302
- componentProperties: { selected: [] },
303
- });
304
- expect(container.querySelector('kj-tree-select-content')).toHaveAttribute(
305
- 'aria-multiselectable', 'true',
306
- );
307
- });
308
-
309
- it('selecting multiple nodes accumulates the selection', async () => {
310
- const { container, fixture } = await render(multiTemplate, {
311
- imports,
312
- componentProperties: { selected: [] },
313
- });
314
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
315
- const nodes = qa('[kjTreeSelectNode]');
316
- fireEvent.click(nodes[0]);
317
- fireEvent.click(nodes[2]);
318
- fixture.detectChanges();
319
- expect(nodes[0]).toHaveAttribute('aria-selected', 'true');
320
- expect(nodes[1]).toHaveAttribute('aria-selected', 'false');
321
- expect(nodes[2]).toHaveAttribute('aria-selected', 'true');
322
- });
323
-
324
- it('clicking a selected node deselects it', async () => {
325
- const { container, fixture } = await render(multiTemplate, {
326
- imports,
327
- componentProperties: { selected: [] },
328
- });
329
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
330
- const nodes = qa('[kjTreeSelectNode]');
331
- fireEvent.click(nodes[0]);
332
- fireEvent.click(nodes[0]);
333
- fixture.detectChanges();
334
- expect(nodes[0]).toHaveAttribute('aria-selected', 'false');
335
- });
336
-
337
- it('single mode panel does not have aria-multiselectable', async () => {
338
- const { container } = await render(singleTemplate, {
339
- imports,
340
- componentProperties: { selected: undefined },
341
- });
342
- const panel = container.querySelector('kj-tree-select-content')!;
343
- expect(panel).not.toHaveAttribute('aria-multiselectable');
344
- });
345
- });
346
-
347
- describe('KjTreeSelect – disabled node', () => {
348
- const disabledTemplate = `
349
- <div kjTreeSelect [(kjValue)]="selected">
350
- <button kjTreeSelectTrigger #t="kjTreeSelectTrigger">Choose</button>
351
- <kj-tree-select-content [kjFor]="t">
352
- <div kjTreeSelectNode [kjValue]="'x'" kjLabel="X" kjDisabled [kjNodeLevel]="1" [kjNodeSize]="1" [kjNodePos]="1">X</div>
353
- </kj-tree-select-content>
354
- </div>
355
- `;
356
-
357
- it('disabled node has aria-disabled="true"', async () => {
358
- const { container } = await render(disabledTemplate, {
359
- imports,
360
- componentProperties: { selected: undefined },
361
- });
362
- const node = container.querySelector('[kjTreeSelectNode]')!;
363
- expect(node).toHaveAttribute('aria-disabled', 'true');
364
- });
365
-
366
- it('disabled node does not change the selection when clicked', async () => {
367
- const { container, fixture } = await render(disabledTemplate, {
368
- imports,
369
- componentProperties: { selected: undefined },
370
- });
371
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
372
- const node = q('[kjTreeSelectNode]')!;
373
- fireEvent.click(node);
374
- fixture.detectChanges();
375
- expect(node).toHaveAttribute('aria-selected', 'false');
376
- });
377
- });
378
-
379
- describe('KjTreeSelect – KjListNavigatorConfig integration', () => {
380
- it('provides KJ_LIST_NAVIGATOR_CONFIG that reads/writes the kjValue model', async () => {
381
- const { fixture } = await render(singleTemplate, {
382
- imports,
383
- componentProperties: { selected: undefined },
384
- });
385
- const rootDe = fixture.debugElement.query(By.directive(KjTreeSelect));
386
- const cfg = rootDe.injector.get(KJ_LIST_NAVIGATOR_CONFIG);
387
- expect(cfg.value).toBeDefined();
388
- cfg.value!.set('apple');
389
- fixture.detectChanges();
390
- expect((fixture.componentInstance as { selected: unknown }).selected).toBe('apple');
391
- });
392
- });
393
-
394
- describe('KjTreeSelect – keyboard navigation', () => {
395
- // Post-Task-4: Up/Down/Home/End/Enter/Space/type-ahead are owned by
396
- // the composed `KjListNavigator`; tree-specific ArrowLeft/Right stay
397
- // on `KjTreeSelectContent`. Roving DOM focus is wired by the content
398
- // component via a local effect on `KjListNavigator.activeId` plus a
399
- // `KJ_LIST_FOCUS_MODE` provider override (Angular's
400
- // `hostDirectives.inputs` cannot statically push `'roving'` into the
401
- // navigator's input signal). Net effect for these tests: keyboard
402
- // moves `activeId` → DOM focus follows → `activeElement` matches.
403
- it('ArrowDown on the panel moves focus to the first node', async () => {
404
- const { container } = await render(singleTemplate, {
405
- imports,
406
- componentProperties: { selected: undefined },
407
- });
408
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
409
- const panel = q('kj-tree-select-content')!;
410
- fireEvent.keyDown(panel, { key: 'ArrowDown' });
411
- const nodes = qa('[kjTreeSelectNode]');
412
- expect(document.activeElement).toBe(nodes[0]);
413
- });
414
-
415
- it('Enter on focused node selects it', async () => {
416
- const { container, fixture } = await render(singleTemplate, {
417
- imports,
418
- componentProperties: { selected: undefined },
419
- });
420
- fireEvent.click(container.querySelector('[kjTreeSelectTrigger]')!);
421
- const leafNode = q('[kjTreeSelectNode][aria-level="2"]')!;
422
- const leafId = leafNode.id;
423
- fireEvent.keyDown(leafNode, { key: 'Enter' });
424
- fixture.detectChanges();
425
- // Enter routes through the content keydown handler, which calls
426
- // `node.click()` — `KjListItem`'s `(click)` runs `_activate` →
427
- // `KjSelectionModel.toggle` → root `afterSelect` closes the panel
428
- // (single mode). Look up by id via `document` so we don't depend
429
- // on whether the panel has been re-parented yet.
430
- const refoundLeaf = q(`#${leafId}`)!;
431
- expect(refoundLeaf).toHaveAttribute('aria-selected', 'true');
432
- });
433
- });
@@ -1,2 +0,0 @@
1
- export { KjTreeSelect } from './tree-select-root';
2
- export { KjTreeSelectNode, KjTreeSelectToggle } from './tree-select-node';
@@ -1,57 +0,0 @@
1
- import {
2
- Directive,
3
- ElementRef,
4
- afterNextRender,
5
- inject,
6
- isDevMode,
7
- } from '@angular/core';
8
-
9
- /**
10
- * Applies kouji's blockquote tone — left rule, italic, indent — to a
11
- * `<blockquote>` element. Reflects `data-tone="blockquote"`. Useful when
12
- * the blockquote sits *outside* a `kj-prose` container (the prose container
13
- * styles its own `<blockquote>` descendants automatically).
14
- *
15
- * Recommended host is `<blockquote>` to preserve native semantics; applied
16
- * to a non-`<blockquote>` host the directive emits a dev-mode warning but
17
- * does not enforce the tag.
18
- *
19
- * @example
20
- * ```html
21
- * <blockquote kjBlockquote>
22
- * "kouji-ui shipped on the day they said it would."
23
- * </blockquote>
24
- * ```
25
- * @doc-category Core/Data display
26
- * @doc
27
- * @doc-name typography
28
- * @doc-description Styles a standalone blockquote outside a prose container with the kouji quotation tone.
29
- * @doc-is-main
30
- */
31
- @Directive({
32
- selector: '[kjBlockquote]',
33
- standalone: true,
34
- exportAs: 'kjBlockquote',
35
- host: {
36
- '[attr.data-tone]': '"blockquote"',
37
- },
38
- })
39
- export class KjBlockquote {
40
- private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
41
-
42
- constructor() {
43
- if (isDevMode()) {
44
- afterNextRender(() => {
45
- const host = this.el.nativeElement;
46
- if (host.tagName?.toLowerCase() !== 'blockquote') {
47
- console.warn(
48
- `[kj] kjBlockquote applied to <${host.tagName?.toLowerCase()}>. ` +
49
- `Recommended host element is <blockquote> for native semantics ` +
50
- `(WCAG 1.3.1 / 4.1.2). Apply only to non-blockquote elements ` +
51
- `when you have a specific styling reason.`,
52
- );
53
- }
54
- });
55
- }
56
- }
57
- }
@@ -1,53 +0,0 @@
1
- import {
2
- Directive,
3
- ElementRef,
4
- afterNextRender,
5
- inject,
6
- isDevMode,
7
- } from '@angular/core';
8
-
9
- /**
10
- * Marks an inline `<code>` element with kouji's inline-code tone — monospace
11
- * font, subtle background fill, and inline padding. Reflects
12
- * `data-tone="code"`. The directive does not handle multi-line `<pre><code>`
13
- * blocks; those are styled by the prose container's `pre code` selector or
14
- * by a consumer-wired syntax highlighter.
15
- *
16
- * Recommended host is `<code>` to preserve native semantics; applying
17
- * `[kjCode]` to a different element is dev-mode warned but not enforced.
18
- *
19
- * @example
20
- * ```html
21
- * <p>Run <code kjCode>npm install @kouji-ui/core</code> to install.</p>
22
- * ```
23
- * @doc-category Core/Data display
24
- * @doc
25
- * @doc-name typography
26
- */
27
- @Directive({
28
- selector: '[kjCode]',
29
- standalone: true,
30
- exportAs: 'kjCode',
31
- host: {
32
- '[attr.data-tone]': '"code"',
33
- },
34
- })
35
- export class KjCode {
36
- private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
37
-
38
- constructor() {
39
- if (isDevMode()) {
40
- afterNextRender(() => {
41
- const host = this.el.nativeElement;
42
- if (host.tagName?.toLowerCase() !== 'code') {
43
- console.warn(
44
- `[kj] kjCode applied to <${host.tagName?.toLowerCase()}>. ` +
45
- `Recommended host element is <code> for native semantics ` +
46
- `(WCAG 1.3.1 / 4.1.2). Apply only to non-code elements when ` +
47
- `you have a specific styling reason.`,
48
- );
49
- }
50
- });
51
- }
52
- }
53
- }
@@ -1,22 +0,0 @@
1
- export { KjLead } from './lead';
2
- export { KjMuted } from './muted';
3
- export { KjCode } from './code';
4
- export { KjBlockquote } from './blockquote';
5
- export { KjTruncate } from './truncate';
6
-
7
- /**
8
- * Resolvable path to the kouji prose stylesheet. Consumers import the CSS
9
- * once at the application root:
10
- *
11
- * ```ts
12
- * import { KJ_PROSE_CSS_PATH } from '@kouji-ui/core';
13
- * // or import the file directly:
14
- * import '@kouji-ui/core/typography/prose.css';
15
- * ```
16
- *
17
- * The path is exposed as a string so build tools can locate the file via
18
- * `require.resolve(KJ_PROSE_CSS_PATH)` when programmatic resolution is
19
- * needed (for example, when wiring the stylesheet into a docs-site
20
- * pipeline).
21
- */
22
- export const KJ_PROSE_CSS_PATH = '@kouji-ui/core/typography/prose.css';
@@ -1,49 +0,0 @@
1
- import {
2
- Directive,
3
- ElementRef,
4
- afterNextRender,
5
- inject,
6
- isDevMode,
7
- } from '@angular/core';
8
-
9
- /**
10
- * Marks a paragraph as the lead-in paragraph for a section — slightly larger
11
- * size with a softer tone. Reflects `data-tone="lead"` so theme CSS keys off
12
- * it; the directive owns no styling itself.
13
- *
14
- * Lead semantics are paragraph-bound; applied to a non-`<p>` host the
15
- * directive emits a dev-mode warning but does not enforce the tag.
16
- *
17
- * @example
18
- * ```html
19
- * <p kjLead>Atlas helps engineering teams plan quarterly roadmaps.</p>
20
- * ```
21
- * @doc-category Core/Data display
22
- * @doc
23
- * @doc-name typography
24
- */
25
- @Directive({
26
- selector: '[kjLead]',
27
- standalone: true,
28
- exportAs: 'kjLead',
29
- host: {
30
- '[attr.data-tone]': '"lead"',
31
- },
32
- })
33
- export class KjLead {
34
- private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
35
-
36
- constructor() {
37
- if (isDevMode()) {
38
- afterNextRender(() => {
39
- const host = this.el.nativeElement;
40
- if (host.tagName?.toLowerCase() !== 'p') {
41
- console.warn(
42
- `[kj] kjLead applied to <${host.tagName?.toLowerCase()}>. ` +
43
- `Lead semantics are paragraph-bound; recommended host is <p>.`,
44
- );
45
- }
46
- });
47
- }
48
- }
49
- }