@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,49 +0,0 @@
1
- import { Directive, computed, inject, input } from '@angular/core';
2
- import { KjSize, KjVariant, bindPresets } from '../presets';
3
- import { KJ_CHAT } from './chat.context';
4
- import { KJ_CHAT_BUBBLE_CONFIG } from './config';
5
-
6
- /**
7
- * The rounded message body. Composes `KjVariant` + `KjSize` via
8
- * `hostDirectives` so theme CSS can paint per-message register
9
- * (`primary` for "your" messages, `default` for theirs, `info` / `success` /
10
- * `warning` / `error` for system or status, `accent` for highlighted) and
11
- * density (`sm` / `md` / `lg`).
12
- *
13
- * Owns the **tail** via the `data-tail` host attribute — present when
14
- * `kjChatBubbleNoTail` is false **and** the parent row is not grouped (the
15
- * tail belongs only to the first message in a same-sender run). CSS draws
16
- * the tail with a `::before` pseudo and reads `data-side` from the row to
17
- * place it on the correct corner.
18
- *
19
- * @example
20
- * ```html
21
- * <p kjChatBubble kjVariant="primary" kjSize="md">Reply text</p>
22
- * ```
23
- * @doc-category Core/Data display
24
- * @doc
25
- * @doc-name chat
26
- */
27
- @Directive({
28
- selector: '[kjChatBubble]',
29
- standalone: true,
30
- hostDirectives: [
31
- { directive: KjVariant, inputs: ['kjVariant'] },
32
- { directive: KjSize, inputs: ['kjSize'] },
33
- ],
34
- providers: [...bindPresets(KJ_CHAT_BUBBLE_CONFIG)],
35
- host: {
36
- '[attr.data-tail]': 'showTail() ? "" : null',
37
- },
38
- })
39
- export class KjChatBubble {
40
- private readonly row = inject(KJ_CHAT, { optional: true });
41
-
42
- /** Suppresses the tail unconditionally. Auto-suppression on grouped rows is independent. */
43
- readonly kjChatBubbleNoTail = input(false);
44
-
45
- /** True when the tail should render. */
46
- readonly showTail = computed(
47
- () => !this.kjChatBubbleNoTail() && !(this.row?.grouped() ?? false),
48
- );
49
- }
@@ -1,67 +0,0 @@
1
- import { DestroyRef, Directive, computed, inject, input } from '@angular/core';
2
- import { KJ_CHAT, nextChatFooterId, type KjChatState } from './chat.context';
3
-
4
- const STATE_LABEL: Readonly<Record<KjChatState, string>> = {
5
- sending: 'Sending',
6
- sent: 'Sent',
7
- delivered: 'Delivered',
8
- read: 'Read',
9
- error: 'Failed to send',
10
- };
11
-
12
- /**
13
- * Mints a stable id for the chat row's footer and registers it with the
14
- * parent `KjChat` so the row's host `aria-describedby` references it.
15
- *
16
- * Reflects `kjState` to a `data-state` host attribute that components-package
17
- * CSS reads to paint a status glyph (clock / single-check / double-check /
18
- * filled-double-check / exclamation). Also injects an `aria-label` so the
19
- * description is intelligible to AT even when the glyph is the only visible
20
- * content.
21
- *
22
- * Free-form text ("Seen 12:46") is fine too — leave `kjState` undefined and
23
- * the directive renders only the consumer's projected content.
24
- *
25
- * @example
26
- * ```html
27
- * <footer kjChatFooter kjState="read">Read 12:46</footer>
28
- * ```
29
- * @doc-category Core/Data display
30
- * @doc
31
- * @doc-name chat
32
- */
33
- @Directive({
34
- selector: '[kjChatFooter]',
35
- standalone: true,
36
- host: {
37
- '[id]': 'id',
38
- '[attr.data-state]': 'kjState() ?? null',
39
- '[attr.aria-label]': 'ariaLabel()',
40
- },
41
- })
42
- export class KjChatFooter {
43
- private readonly chat = inject(KJ_CHAT, { optional: true });
44
- private readonly destroyRef = inject(DestroyRef);
45
-
46
- /** Auto-generated id used for the parent row's `aria-describedby`. */
47
- readonly id = nextChatFooterId();
48
-
49
- /**
50
- * Read / delivery state. Drives `data-state` for the glyph and an injected
51
- * `aria-label` for AT. When undefined, only projected content renders.
52
- */
53
- readonly kjState = input<KjChatState | undefined>(undefined);
54
-
55
- /** Aria label derived from `kjState`. `null` when no state is set. */
56
- readonly ariaLabel = computed(() => {
57
- const s = this.kjState();
58
- return s ? STATE_LABEL[s] : null;
59
- });
60
-
61
- constructor() {
62
- if (this.chat) {
63
- this.chat.registerFooterId(this.id);
64
- this.destroyRef.onDestroy(() => this.chat?.unregisterFooterId(this.id));
65
- }
66
- }
67
- }
@@ -1,41 +0,0 @@
1
- import { DestroyRef, Directive, inject } from '@angular/core';
2
- import { KJ_CHAT, nextChatHeaderId } from './chat.context';
3
-
4
- /**
5
- * Mints a stable id for the chat row's header and registers it with the
6
- * parent `KjChat` so the row's host `aria-labelledby` attribute references
7
- * the sender's name + time. Visual chrome (small font, muted colour, spacing
8
- * above the bubble) belongs to CSS; the directive does not paint.
9
- *
10
- * Standalone (no `KjChat` parent) the directive still mints an id but no
11
- * wiring fires — the consumer is responsible for the link.
12
- *
13
- * @example
14
- * ```html
15
- * <header kjChatHeader>Alice <time datetime="…">12:46</time></header>
16
- * ```
17
- * @doc-category Core/Data display
18
- * @doc
19
- * @doc-name chat
20
- */
21
- @Directive({
22
- selector: '[kjChatHeader]',
23
- standalone: true,
24
- host: {
25
- '[id]': 'id',
26
- },
27
- })
28
- export class KjChatHeader {
29
- private readonly chat = inject(KJ_CHAT, { optional: true });
30
- private readonly destroyRef = inject(DestroyRef);
31
-
32
- /** Auto-generated id used for the parent row's `aria-labelledby`. */
33
- readonly id = nextChatHeaderId();
34
-
35
- constructor() {
36
- if (this.chat) {
37
- this.chat.registerHeaderId(this.id);
38
- this.destroyRef.onDestroy(() => this.chat?.unregisterHeaderId(this.id));
39
- }
40
- }
41
- }
@@ -1,43 +0,0 @@
1
- import { Directive, input } from '@angular/core';
2
- import { KJ_CHAT_LOG, type KjChatLogContext } from './chat.context';
3
-
4
- /**
5
- * Container for a stream of `[kjChat]` rows. Owns the live region: per APG's
6
- * Log pattern, the **container** announces new arrivals — never the bubble
7
- * itself. Default `aria-live="polite"` matches the chat-app convention; we
8
- * deliberately do not expose `'assertive'` (it would interrupt the user
9
- * mid-typing on every inbound message and is the canonical chat-app a11y bug).
10
- *
11
- * `aria-relevant="additions"` confines announcements to *new* messages so that
12
- * edits to existing bubbles don't re-announce the full edited content.
13
- *
14
- * @example
15
- * ```html
16
- * <div kjChatLog kjChatLogLabel="Conversation with Alice">
17
- * <div kjChat kjSide="start" kjChatAuthor="alice">…</div>
18
- * <div kjChat kjSide="end" kjChatAuthor="me">…</div>
19
- * </div>
20
- * ```
21
- * @doc-category Core/Data display
22
- * @doc
23
- * @doc-name chat
24
- */
25
- @Directive({
26
- selector: '[kjChatLog]',
27
- standalone: true,
28
- providers: [{ provide: KJ_CHAT_LOG, useExisting: KjChatLog }],
29
- host: {
30
- 'role': 'log',
31
- '[attr.aria-live]': 'kjChatLogLive()',
32
- '[attr.aria-relevant]': '"additions"',
33
- '[attr.aria-atomic]': '"false"',
34
- '[attr.aria-label]': 'kjChatLogLabel() ?? null',
35
- },
36
- })
37
- export class KjChatLog implements KjChatLogContext {
38
- /** Live-region politeness. `'polite'` (default) or `'off'`. */
39
- readonly kjChatLogLive = input<'polite' | 'off'>('polite');
40
-
41
- /** Optional `aria-label` for the log landmark. */
42
- readonly kjChatLogLabel = input<string | undefined>(undefined);
43
- }
@@ -1,64 +0,0 @@
1
- import { InjectionToken, type Signal } from '@angular/core';
2
-
3
- /** Logical side of a chat row. CSS handles the physical RTL flip via cascade. */
4
- export type KjChatSide = 'start' | 'end';
5
-
6
- /**
7
- * Per-row role override. Default `'article'` gives screen readers a per-message
8
- * landmark; `'listitem'` opts in to list semantics (parent log must then carry
9
- * `role="list"`); `null` drops the role attribute entirely.
10
- */
11
- export type KjChatRole = 'article' | 'listitem' | null;
12
-
13
- /** Read / delivery state machine for the footer. */
14
- export type KjChatState =
15
- | 'sending'
16
- | 'sent'
17
- | 'delivered'
18
- | 'read'
19
- | 'error';
20
-
21
- /** Context shape exposed by `KjChatLog` to descendant chat directives. */
22
- export interface KjChatLogContext {
23
- /** Reflected to `aria-live`. `'polite'` (default) or `'off'`. */
24
- readonly kjChatLogLive: Signal<'polite' | 'off'>;
25
- /** Optional landmark label for the log. */
26
- readonly kjChatLogLabel: Signal<string | undefined>;
27
- }
28
-
29
- /**
30
- * Context shape exposed by `KjChat` to its child directives. Children read this
31
- * to register their minted ids (header / footer) for `aria-labelledby` /
32
- * `aria-describedby` wiring, and to ask whether the row is part of a grouped
33
- * run for tail / avatar suppression.
34
- */
35
- export interface KjChatContext {
36
- readonly kjSide: Signal<KjChatSide>;
37
- readonly kjChatAuthor: Signal<string | undefined>;
38
- /** True when this row is grouped with the previous row (same author). */
39
- readonly grouped: Signal<boolean>;
40
- /** Register a header id; the row reflects it as `aria-labelledby`. */
41
- registerHeaderId(id: string): void;
42
- unregisterHeaderId(id: string): void;
43
- /** Register a footer id; the row reflects it as `aria-describedby`. */
44
- registerFooterId(id: string): void;
45
- unregisterFooterId(id: string): void;
46
- }
47
-
48
- /** Injection token for the `KjChatLog` container. */
49
- export const KJ_CHAT_LOG = new InjectionToken<KjChatLogContext>('KjChatLog');
50
-
51
- /** Injection token for the `KjChat` row. */
52
- export const KJ_CHAT = new InjectionToken<KjChatContext>('KjChat');
53
-
54
- let _chatHeaderIdCounter = 0;
55
- /** Allocate a stable id used for `aria-labelledby` wiring. */
56
- export function nextChatHeaderId(): string {
57
- return `kj-chat-header-${++_chatHeaderIdCounter}`;
58
- }
59
-
60
- let _chatFooterIdCounter = 0;
61
- /** Allocate a stable id used for `aria-describedby` wiring. */
62
- export function nextChatFooterId(): string {
63
- return `kj-chat-footer-${++_chatFooterIdCounter}`;
64
- }
@@ -1,341 +0,0 @@
1
- import { render } from '@testing-library/angular';
2
- import { axe, toHaveNoViolations } from 'jest-axe';
3
- import { describe, expect, it } from 'vitest';
4
- import { KjChat } from './chat';
5
- import { KjChatAvatar } from './chat-avatar';
6
- import { KjChatBubble } from './chat-bubble';
7
- import { KjChatFooter } from './chat-footer';
8
- import { KjChatHeader } from './chat-header';
9
- import { KjChatLog } from './chat-log';
10
- import { provideKjChatBubble } from './config';
11
-
12
- expect.extend(toHaveNoViolations);
13
-
14
- const imports = [
15
- KjChatLog,
16
- KjChat,
17
- KjChatAvatar,
18
- KjChatHeader,
19
- KjChatBubble,
20
- KjChatFooter,
21
- ];
22
-
23
- describe('KjChatLog', () => {
24
- it('hosts role=log + aria-live=polite by default', async () => {
25
- const { container } = await render(
26
- `<div kjChatLog data-testid="log"></div>`,
27
- { imports },
28
- );
29
- const log = container.querySelector('[data-testid="log"]')!;
30
- expect(log).toHaveAttribute('role', 'log');
31
- expect(log).toHaveAttribute('aria-live', 'polite');
32
- expect(log).toHaveAttribute('aria-relevant', 'additions');
33
- expect(log).toHaveAttribute('aria-atomic', 'false');
34
- });
35
-
36
- it('reflects kjChatLogLive=off', async () => {
37
- const { container } = await render(
38
- `<div kjChatLog kjChatLogLive="off" data-testid="log"></div>`,
39
- { imports },
40
- );
41
- expect(container.querySelector('[data-testid="log"]')).toHaveAttribute(
42
- 'aria-live',
43
- 'off',
44
- );
45
- });
46
-
47
- it('reflects kjChatLogLabel as aria-label', async () => {
48
- const { container } = await render(
49
- `<div kjChatLog kjChatLogLabel="Conversation with Alice" data-testid="log"></div>`,
50
- { imports },
51
- );
52
- expect(container.querySelector('[data-testid="log"]')).toHaveAttribute(
53
- 'aria-label',
54
- 'Conversation with Alice',
55
- );
56
- });
57
- });
58
-
59
- describe('KjChat', () => {
60
- it('default role is article', async () => {
61
- const { container } = await render(
62
- `<div kjChat data-testid="row"></div>`,
63
- { imports },
64
- );
65
- expect(container.querySelector('[data-testid="row"]')).toHaveAttribute(
66
- 'role',
67
- 'article',
68
- );
69
- });
70
-
71
- it('kjRole=listitem reflects on host', async () => {
72
- const { container } = await render(
73
- `<div kjChat kjRole="listitem" data-testid="row"></div>`,
74
- { imports },
75
- );
76
- expect(container.querySelector('[data-testid="row"]')).toHaveAttribute(
77
- 'role',
78
- 'listitem',
79
- );
80
- });
81
-
82
- it('kjRole=null drops the role attribute', async () => {
83
- const { container } = await render(
84
- `<div kjChat [kjRole]="null" data-testid="row"></div>`,
85
- { imports },
86
- );
87
- expect(
88
- container.querySelector('[data-testid="row"]'),
89
- ).not.toHaveAttribute('role');
90
- });
91
-
92
- it('kjSide reflects to data-side', async () => {
93
- const { container } = await render(
94
- `<div kjChat kjSide="end" data-testid="row"></div>`,
95
- { imports },
96
- );
97
- expect(container.querySelector('[data-testid="row"]')).toHaveAttribute(
98
- 'data-side',
99
- 'end',
100
- );
101
- });
102
-
103
- it('auto-grouping marks the second same-author row with data-grouped', async () => {
104
- const { container, fixture } = await render(
105
- `<div kjChatLog>
106
- <div kjChat kjChatAuthor="alice" data-testid="r1"></div>
107
- <div kjChat kjChatAuthor="alice" data-testid="r2"></div>
108
- <div kjChat kjChatAuthor="bob" data-testid="r3"></div>
109
- </div>`,
110
- { imports },
111
- );
112
- fixture.detectChanges();
113
- await fixture.whenStable();
114
- fixture.detectChanges();
115
- expect(
116
- container.querySelector('[data-testid="r1"]'),
117
- ).not.toHaveAttribute('data-grouped');
118
- expect(container.querySelector('[data-testid="r2"]')).toHaveAttribute(
119
- 'data-grouped',
120
- '',
121
- );
122
- expect(
123
- container.querySelector('[data-testid="r3"]'),
124
- ).not.toHaveAttribute('data-grouped');
125
- });
126
-
127
- it('explicit kjChatGrouped overrides auto-grouping', async () => {
128
- const { container, fixture } = await render(
129
- `<div kjChatLog>
130
- <div kjChat kjChatAuthor="alice" data-testid="r1"></div>
131
- <div kjChat kjChatAuthor="bob" [kjChatGrouped]="true" data-testid="r2"></div>
132
- </div>`,
133
- { imports },
134
- );
135
- fixture.detectChanges();
136
- await fixture.whenStable();
137
- expect(container.querySelector('[data-testid="r2"]')).toHaveAttribute(
138
- 'data-grouped',
139
- '',
140
- );
141
- });
142
-
143
- it('header/footer ids wire aria-labelledby and aria-describedby on the row', async () => {
144
- const { container } = await render(
145
- `<div kjChat data-testid="row">
146
- <header kjChatHeader data-testid="h">Alice 12:46</header>
147
- <p kjChatBubble>Hi</p>
148
- <footer kjChatFooter data-testid="f">Sent</footer>
149
- </div>`,
150
- { imports },
151
- );
152
- const row = container.querySelector('[data-testid="row"]')!;
153
- const header = container.querySelector('[data-testid="h"]')!;
154
- const footer = container.querySelector('[data-testid="f"]')!;
155
- expect(header.id).toMatch(/^kj-chat-header-\d+$/);
156
- expect(footer.id).toMatch(/^kj-chat-footer-\d+$/);
157
- expect(row.getAttribute('aria-labelledby')).toBe(header.id);
158
- expect(row.getAttribute('aria-describedby')).toBe(footer.id);
159
- });
160
- });
161
-
162
- describe('KjChatAvatar', () => {
163
- it('forces aria-hidden=true', async () => {
164
- const { container } = await render(
165
- `<span kjChatAvatar data-testid="av"></span>`,
166
- { imports },
167
- );
168
- const av = container.querySelector('[data-testid="av"]')!;
169
- expect(av).toHaveAttribute('aria-hidden', 'true');
170
- expect(av).toHaveAttribute('role', 'presentation');
171
- });
172
- });
173
-
174
- describe('KjChatHeader / KjChatFooter', () => {
175
- it('mint unique ids for two adjacent headers / footers', async () => {
176
- const { container } = await render(
177
- `<div kjChatLog>
178
- <div kjChat>
179
- <header kjChatHeader data-testid="h1">A</header>
180
- <footer kjChatFooter data-testid="f1">x</footer>
181
- </div>
182
- <div kjChat>
183
- <header kjChatHeader data-testid="h2">B</header>
184
- <footer kjChatFooter data-testid="f2">y</footer>
185
- </div>
186
- </div>`,
187
- { imports },
188
- );
189
- const h1 = container.querySelector('[data-testid="h1"]')!.id;
190
- const h2 = container.querySelector('[data-testid="h2"]')!.id;
191
- const f1 = container.querySelector('[data-testid="f1"]')!.id;
192
- const f2 = container.querySelector('[data-testid="f2"]')!.id;
193
- expect(h1).not.toEqual(h2);
194
- expect(f1).not.toEqual(f2);
195
- expect(h1).toMatch(/^kj-chat-header-/);
196
- expect(f1).toMatch(/^kj-chat-footer-/);
197
- });
198
-
199
- it('footer reflects kjState as data-state and aria-label', async () => {
200
- const { container } = await render(
201
- `<footer kjChatFooter kjState="read" data-testid="f">Read 12:46</footer>`,
202
- { imports },
203
- );
204
- const f = container.querySelector('[data-testid="f"]')!;
205
- expect(f).toHaveAttribute('data-state', 'read');
206
- expect(f).toHaveAttribute('aria-label', 'Read');
207
- });
208
-
209
- it('footer omits data-state and aria-label when kjState is unset', async () => {
210
- const { container } = await render(
211
- `<footer kjChatFooter data-testid="f">Sent 12:46</footer>`,
212
- { imports },
213
- );
214
- const f = container.querySelector('[data-testid="f"]')!;
215
- expect(f).not.toHaveAttribute('data-state');
216
- expect(f).not.toHaveAttribute('aria-label');
217
- });
218
- });
219
-
220
- describe('KjChatBubble', () => {
221
- it('composes KjVariant -> data-variant default', async () => {
222
- const { container } = await render(
223
- `<p kjChatBubble data-testid="b">Hi</p>`,
224
- { imports },
225
- );
226
- expect(container.querySelector('[data-testid="b"]')).toHaveAttribute(
227
- 'data-variant',
228
- 'default',
229
- );
230
- });
231
-
232
- it('composes KjSize -> data-size default', async () => {
233
- const { container } = await render(
234
- `<p kjChatBubble data-testid="b">Hi</p>`,
235
- { imports },
236
- );
237
- expect(container.querySelector('[data-testid="b"]')).toHaveAttribute(
238
- 'data-size',
239
- 'md',
240
- );
241
- });
242
-
243
- it('forwards kjVariant + kjSize through hostDirectives', async () => {
244
- const { container } = await render(
245
- `<p kjChatBubble kjVariant="primary" kjSize="lg" data-testid="b">Hi</p>`,
246
- { imports },
247
- );
248
- const b = container.querySelector('[data-testid="b"]')!;
249
- expect(b).toHaveAttribute('data-variant', 'primary');
250
- expect(b).toHaveAttribute('data-size', 'lg');
251
- });
252
-
253
- it('renders data-tail when not grouped and no-tail not set', async () => {
254
- const { container } = await render(
255
- `<div kjChat>
256
- <p kjChatBubble data-testid="b">Hi</p>
257
- </div>`,
258
- { imports },
259
- );
260
- expect(container.querySelector('[data-testid="b"]')).toHaveAttribute(
261
- 'data-tail',
262
- '',
263
- );
264
- });
265
-
266
- it('omits data-tail when kjChatBubbleNoTail=true', async () => {
267
- const { container } = await render(
268
- `<div kjChat>
269
- <p kjChatBubble [kjChatBubbleNoTail]="true" data-testid="b">Hi</p>
270
- </div>`,
271
- { imports },
272
- );
273
- expect(
274
- container.querySelector('[data-testid="b"]'),
275
- ).not.toHaveAttribute('data-tail');
276
- });
277
-
278
- it('omits data-tail when the parent row is auto-grouped', async () => {
279
- const { container, fixture } = await render(
280
- `<div kjChatLog>
281
- <div kjChat kjChatAuthor="alice">
282
- <p kjChatBubble data-testid="b1">A</p>
283
- </div>
284
- <div kjChat kjChatAuthor="alice">
285
- <p kjChatBubble data-testid="b2">B</p>
286
- </div>
287
- </div>`,
288
- { imports },
289
- );
290
- fixture.detectChanges();
291
- await fixture.whenStable();
292
- fixture.detectChanges();
293
- expect(container.querySelector('[data-testid="b1"]')).toHaveAttribute(
294
- 'data-tail',
295
- '',
296
- );
297
- expect(
298
- container.querySelector('[data-testid="b2"]'),
299
- ).not.toHaveAttribute('data-tail');
300
- });
301
-
302
- it('respects provideKjChatBubble preset overrides', async () => {
303
- const { container } = await render(
304
- `<p kjChatBubble data-testid="b">x</p>`,
305
- {
306
- imports,
307
- providers: [
308
- provideKjChatBubble({
309
- variants: ['default', 'primary', 'brand'],
310
- defaults: { variant: 'brand', size: 'md' },
311
- }),
312
- ],
313
- },
314
- );
315
- expect(container.querySelector('[data-testid="b"]')).toHaveAttribute(
316
- 'data-variant',
317
- 'brand',
318
- );
319
- });
320
- });
321
-
322
- describe('a11y', () => {
323
- it('passes axe audit on a populated chat log', async () => {
324
- const { container } = await render(
325
- `<div kjChatLog kjChatLogLabel="Test conversation">
326
- <div kjChat kjSide="start" kjChatAuthor="alice">
327
- <span kjChatAvatar></span>
328
- <header kjChatHeader>Alice 12:46</header>
329
- <p kjChatBubble>Hi there</p>
330
- <footer kjChatFooter kjState="read">Read 12:46</footer>
331
- </div>
332
- <div kjChat kjSide="end" kjChatAuthor="me">
333
- <p kjChatBubble kjVariant="primary">Hello back</p>
334
- <footer kjChatFooter kjState="delivered">Delivered</footer>
335
- </div>
336
- </div>`,
337
- { imports },
338
- );
339
- expect(await axe(container)).toHaveNoViolations();
340
- });
341
- });