@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,223 +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 { KjDivider } from './divider';
5
-
6
- expect.extend(toHaveNoViolations);
7
-
8
- /**
9
- * Flush microtasks + the rAF that backs afterNextRender so the directive has
10
- * a chance to inspect host child nodes and update its with-content / isHr
11
- * signals.
12
- */
13
- async function flushAfterNextRender(): Promise<void> {
14
- await new Promise<void>((resolve) => setTimeout(resolve, 0));
15
- await Promise.resolve();
16
- await Promise.resolve();
17
- }
18
-
19
- describe('KjDivider', () => {
20
- describe('decorative (default)', () => {
21
- it('on <hr> host: aria-hidden="true" and no role', async () => {
22
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
23
- await flushAfterNextRender();
24
- const host = container.querySelector('hr')!;
25
- expect(host).toHaveAttribute('aria-hidden', 'true');
26
- expect(host).not.toHaveAttribute('role');
27
- });
28
-
29
- it('on <div> host: aria-hidden="true" and no role', async () => {
30
- const { container } = await render(`<div kjDivider></div>`, { imports: [KjDivider] });
31
- await flushAfterNextRender();
32
- const host = container.querySelector('div')!;
33
- expect(host).toHaveAttribute('aria-hidden', 'true');
34
- expect(host).not.toHaveAttribute('role');
35
- });
36
-
37
- it('omits aria-orientation in decorative mode (even when vertical)', async () => {
38
- const { container } = await render(
39
- `<hr kjDivider [kjOrientation]="'vertical'" />`,
40
- { imports: [KjDivider] },
41
- );
42
- await flushAfterNextRender();
43
- const host = container.querySelector('hr')!;
44
- expect(host).not.toHaveAttribute('aria-orientation');
45
- });
46
- });
47
-
48
- describe('structural mode', () => {
49
- it('on <div> host: role="separator" and no aria-hidden', async () => {
50
- const { container } = await render(
51
- `<div kjDivider [kjStructural]="true"></div>`,
52
- { imports: [KjDivider] },
53
- );
54
- await flushAfterNextRender();
55
- const host = container.querySelector('div')!;
56
- expect(host).toHaveAttribute('role', 'separator');
57
- expect(host).not.toHaveAttribute('aria-hidden');
58
- });
59
-
60
- it('on <hr> host: relies on implicit role (no explicit role attr) and no aria-hidden', async () => {
61
- const { container } = await render(
62
- `<hr kjDivider [kjStructural]="true" />`,
63
- { imports: [KjDivider] },
64
- );
65
- await flushAfterNextRender();
66
- const host = container.querySelector('hr')!;
67
- // <hr> has implicit role="separator" per HTML AAM; the directive must
68
- // NOT set role explicitly (would be redundant noise).
69
- expect(host).not.toHaveAttribute('role');
70
- expect(host).not.toHaveAttribute('aria-hidden');
71
- });
72
-
73
- it('vertical + structural: aria-orientation="vertical"', async () => {
74
- const { container } = await render(
75
- `<div kjDivider [kjStructural]="true" [kjOrientation]="'vertical'"></div>`,
76
- { imports: [KjDivider] },
77
- );
78
- await flushAfterNextRender();
79
- const host = container.querySelector('div')!;
80
- expect(host).toHaveAttribute('aria-orientation', 'vertical');
81
- expect(host).toHaveAttribute('role', 'separator');
82
- });
83
-
84
- it('horizontal + structural: omits aria-orientation (spec default)', async () => {
85
- const { container } = await render(
86
- `<div kjDivider [kjStructural]="true" [kjOrientation]="'horizontal'"></div>`,
87
- { imports: [KjDivider] },
88
- );
89
- await flushAfterNextRender();
90
- const host = container.querySelector('div')!;
91
- expect(host).not.toHaveAttribute('aria-orientation');
92
- });
93
- });
94
-
95
- describe('orientation reflection', () => {
96
- it('reflects data-orientation="horizontal" by default', async () => {
97
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
98
- await flushAfterNextRender();
99
- expect(container.querySelector('hr')).toHaveAttribute('data-orientation', 'horizontal');
100
- });
101
-
102
- it('reflects data-orientation="vertical" when kjOrientation="vertical"', async () => {
103
- const { container } = await render(
104
- `<hr kjDivider [kjOrientation]="'vertical'" />`,
105
- { imports: [KjDivider] },
106
- );
107
- await flushAfterNextRender();
108
- expect(container.querySelector('hr')).toHaveAttribute('data-orientation', 'vertical');
109
- });
110
- });
111
-
112
- describe('with-content auto-detection', () => {
113
- it('rule-only on <hr>: data-with-content="false"', async () => {
114
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
115
- await flushAfterNextRender();
116
- expect(container.querySelector('hr')).toHaveAttribute('data-with-content', 'false');
117
- });
118
-
119
- it('empty <div>: data-with-content="false"', async () => {
120
- const { container } = await render(`<div kjDivider></div>`, { imports: [KjDivider] });
121
- await flushAfterNextRender();
122
- expect(container.querySelector('div')).toHaveAttribute('data-with-content', 'false');
123
- });
124
-
125
- it('<div> with text content: data-with-content="true"', async () => {
126
- const { container } = await render(
127
- `<div kjDivider>OR</div>`,
128
- { imports: [KjDivider] },
129
- );
130
- await flushAfterNextRender();
131
- expect(container.querySelector('div')).toHaveAttribute('data-with-content', 'true');
132
- });
133
-
134
- it('<div> with element content: data-with-content="true"', async () => {
135
- const { container } = await render(
136
- `<div kjDivider><span>OR</span></div>`,
137
- { imports: [KjDivider] },
138
- );
139
- await flushAfterNextRender();
140
- expect(container.querySelector('div[kjDivider]')).toHaveAttribute(
141
- 'data-with-content',
142
- 'true',
143
- );
144
- });
145
-
146
- it('<div> with whitespace-only content: data-with-content="false"', async () => {
147
- const { container } = await render(
148
- `<div kjDivider> </div>`,
149
- { imports: [KjDivider] },
150
- );
151
- await flushAfterNextRender();
152
- expect(container.querySelector('div')).toHaveAttribute('data-with-content', 'false');
153
- });
154
- });
155
-
156
- describe('align reflection', () => {
157
- it('defaults to data-align="center"', async () => {
158
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
159
- await flushAfterNextRender();
160
- expect(container.querySelector('hr')).toHaveAttribute('data-align', 'center');
161
- });
162
-
163
- it('reflects kjAlign to data-align', async () => {
164
- const { container } = await render(
165
- `<div kjDivider [kjAlign]="'start'">Today</div>`,
166
- { imports: [KjDivider] },
167
- );
168
- await flushAfterNextRender();
169
- expect(container.querySelector('div')).toHaveAttribute('data-align', 'start');
170
- });
171
- });
172
-
173
- describe('variant + size composition', () => {
174
- it('reflects default data-variant from KjVariant preset', async () => {
175
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
176
- await flushAfterNextRender();
177
- // KjVariant default factory: { default: 'default' }
178
- expect(container.querySelector('hr')).toHaveAttribute('data-variant', 'default');
179
- });
180
-
181
- it('reflects default data-size from KjSize preset', async () => {
182
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
183
- await flushAfterNextRender();
184
- // KjSize default factory: { default: 'md' }
185
- expect(container.querySelector('hr')).toHaveAttribute('data-size', 'md');
186
- });
187
-
188
- it('forwards kjVariant input (composed via hostDirectives)', async () => {
189
- const { container } = await render(
190
- `<hr kjDivider [kjVariant]="'dashed'" />`,
191
- { imports: [KjDivider] },
192
- );
193
- await flushAfterNextRender();
194
- expect(container.querySelector('hr')).toHaveAttribute('data-variant', 'dashed');
195
- });
196
-
197
- it('forwards kjSize input (composed via hostDirectives)', async () => {
198
- const { container } = await render(
199
- `<hr kjDivider [kjSize]="'lg'" />`,
200
- { imports: [KjDivider] },
201
- );
202
- await flushAfterNextRender();
203
- expect(container.querySelector('hr')).toHaveAttribute('data-size', 'lg');
204
- });
205
- });
206
-
207
- describe('a11y audits', () => {
208
- it('decorative <hr> divider passes axe', async () => {
209
- const { container } = await render(`<hr kjDivider />`, { imports: [KjDivider] });
210
- await flushAfterNextRender();
211
- expect(await axe(container)).toHaveNoViolations();
212
- });
213
-
214
- it('structural with-content <div> divider passes axe', async () => {
215
- const { container } = await render(
216
- `<div kjDivider [kjStructural]="true">OR</div>`,
217
- { imports: [KjDivider] },
218
- );
219
- await flushAfterNextRender();
220
- expect(await axe(container)).toHaveNoViolations();
221
- });
222
- });
223
- });
@@ -1,137 +0,0 @@
1
- import {
2
- Directive,
3
- ElementRef,
4
- afterNextRender,
5
- computed,
6
- inject,
7
- input,
8
- signal,
9
- } from '@angular/core';
10
- import { KjSize, KjVariant } from '../presets';
11
-
12
- /**
13
- * Orientation of the divider rule.
14
- */
15
- export type KjDividerOrientation = 'horizontal' | 'vertical';
16
-
17
- /**
18
- * Alignment of the projected content within a with-content divider.
19
- */
20
- export type KjDividerAlign = 'start' | 'center' | 'end';
21
-
22
- /**
23
- * Marks an element as a kouji divider / separator. Owns the small a11y opinion
24
- * (decorative-by-default vs. structural) and reflects data attributes that
25
- * theme CSS reads to render the rule (rule-only vs. with-content layout,
26
- * orientation, alignment, variant, size).
27
- *
28
- * The host element is consumer-supplied — `<hr kjDivider>` for the rule-only
29
- * case (recommended; native semantic, implicit `role="separator"`) or
30
- * `<div kjDivider>Title</div>` for the with-content case (label projected in
31
- * the middle of the rule).
32
- *
33
- * **Decorative by default.** Most dividers in real templates are visual
34
- * punctuation between regions already demarcated by surrounding headings or
35
- * landmarks, so AT should not announce them. Set `kjStructural=true` when the
36
- * divider is the only thing demarcating two regions (e.g. an "OR" sign-in
37
- * divider with no surrounding heading).
38
- *
39
- * @example
40
- * ```html
41
- * <hr kjDivider />
42
- * <hr kjDivider [kjStructural]="true" kjOrientation="vertical" />
43
- * <div kjDivider [kjStructural]="true">OR</div>
44
- * ```
45
- * @doc-category Core/Layout/Divider
46
- * @doc
47
- * @doc-name divider
48
- * @doc-description Unstyled divider for separating content with horizontal, vertical, and label-in-rule layouts.
49
- * @doc-is-main
50
- */
51
- @Directive({
52
- selector: '[kjDivider]',
53
- standalone: true,
54
- hostDirectives: [
55
- { directive: KjVariant, inputs: ['kjVariant'] },
56
- { directive: KjSize, inputs: ['kjSize'] },
57
- ],
58
- host: {
59
- '[attr.data-orientation]': 'kjOrientation()',
60
- '[attr.data-align]': 'kjAlign()',
61
- '[attr.data-with-content]': 'withContent() ? "true" : "false"',
62
- '[attr.role]': 'roleAttr()',
63
- '[attr.aria-orientation]': 'ariaOrientationAttr()',
64
- '[attr.aria-hidden]': 'ariaHiddenAttr()',
65
- },
66
- })
67
- export class KjDivider {
68
- private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);
69
-
70
- /**
71
- * Visual orientation of the rule. Reflects to `data-orientation`. When
72
- * `kjStructural=true` and orientation is `vertical`, also reflects
73
- * `aria-orientation="vertical"`. The horizontal case omits `aria-orientation`
74
- * (the spec default; setting it explicitly is redundant noise).
75
- */
76
- readonly kjOrientation = input<KjDividerOrientation>('horizontal');
77
-
78
- /**
79
- * Whether the divider carries semantic weight (separates two regions that
80
- * are not already demarcated by surrounding heading or landmark structure).
81
- *
82
- * - `false` (default): host gets `aria-hidden="true"`; AT skips the divider.
83
- * - `true`: host gets `role="separator"` (suppressed if host is `<hr>`,
84
- * which has implicit role); when `kjOrientation='vertical'`, also gets
85
- * `aria-orientation="vertical"`.
86
- */
87
- readonly kjStructural = input<boolean>(false);
88
-
89
- /**
90
- * Alignment of the projected content within a with-content divider.
91
- * Affects the with-content layout only; ignored when no content is present.
92
- * Reflects to `data-align`.
93
- */
94
- readonly kjAlign = input<KjDividerAlign>('center');
95
-
96
- /** Auto-detected from host child nodes (any text or element child). */
97
- protected readonly withContent = signal<boolean>(false);
98
-
99
- /** True when the host element is an `<hr>` (case-insensitive). */
100
- protected readonly isHr = signal<boolean>(false);
101
-
102
- protected readonly roleAttr = computed(() =>
103
- this.kjStructural() && !this.isHr() ? 'separator' : null,
104
- );
105
-
106
- protected readonly ariaOrientationAttr = computed(() =>
107
- this.kjStructural() && this.kjOrientation() === 'vertical' ? 'vertical' : null,
108
- );
109
-
110
- protected readonly ariaHiddenAttr = computed(() =>
111
- this.kjStructural() ? null : 'true',
112
- );
113
-
114
- constructor() {
115
- afterNextRender(() => {
116
- const host = this.el.nativeElement;
117
- this.isHr.set(host.tagName?.toLowerCase() === 'hr');
118
- // Detect with-content from any non-empty child nodes (text or elements).
119
- // Treat whitespace-only text nodes as no content so a multi-line template
120
- // with a self-closing-style divider doesn't accidentally light up.
121
- this.withContent.set(hasMeaningfulChildNodes(host));
122
- });
123
- }
124
- }
125
-
126
- function hasMeaningfulChildNodes(host: HTMLElement): boolean {
127
- const nodes = host.childNodes;
128
- for (let i = 0; i < nodes.length; i++) {
129
- const node = nodes[i];
130
- if (node.nodeType === Node.ELEMENT_NODE) return true;
131
- if (node.nodeType === Node.TEXT_NODE) {
132
- const text = node.nodeValue ?? '';
133
- if (text.trim().length > 0) return true;
134
- }
135
- }
136
- return false;
137
- }
@@ -1,5 +0,0 @@
1
- export {
2
- KjDivider,
3
- type KjDividerAlign,
4
- type KjDividerOrientation,
5
- } from './divider';
@@ -1,63 +0,0 @@
1
- import { Subject, type Observable } from 'rxjs';
2
- import type { Signal } from '@angular/core';
3
- import type { KjOverlayController } from '../primitives/overlay/controller';
4
-
5
- /**
6
- * Reference returned by `KjDrawer.open()`. Mirrors {@link import('../dialog/dialog.ref').KjDialogRef}.
7
- *
8
- * Use `close(result?)` to dismiss the drawer programmatically. Subscribe to
9
- * `afterClosed$` for the close result, or await the `result` promise.
10
- *
11
- * @doc-category Core/Overlay
12
- */
13
- export class KjDrawerRef<T, R = unknown> {
14
- private _instance: T | null = null;
15
- private _result: R | undefined;
16
- private resolveResult!: (r: R | undefined) => void;
17
- /** Promise resolving with the close result. */
18
- readonly result: Promise<R | undefined>;
19
-
20
- private readonly _afterOpened = new Subject<void>();
21
- private readonly _afterClosed = new Subject<R | undefined>();
22
- /** Emits once after the drawer has finished opening. */
23
- readonly afterOpened$: Observable<void> = this._afterOpened.asObservable();
24
- /** Emits the close result once the drawer has finished closing. */
25
- readonly afterClosed$: Observable<R | undefined> = this._afterClosed.asObservable();
26
-
27
- /** Reactive lifecycle state mirrored from the underlying controller. */
28
- readonly state: Signal<'closed' | 'opening' | 'open' | 'closing'>;
29
- /** Convenience for `state() === 'open' || 'opening'`. */
30
- readonly isOpen: Signal<boolean>;
31
-
32
- constructor(public readonly controller: KjOverlayController) {
33
- this.state = controller.state;
34
- this.isOpen = controller.isOpen;
35
- this.result = new Promise<R | undefined>((res) => {
36
- this.resolveResult = res;
37
- });
38
- }
39
-
40
- /** @internal Bind the rendered component instance for `instance`. */
41
- bindInstance(instance: T): void {
42
- this._instance = instance;
43
- }
44
-
45
- /** The rendered drawer component instance. */
46
- get instance(): T {
47
- if (!this._instance) {
48
- throw new Error('KjDrawerRef: instance not bound');
49
- }
50
- return this._instance;
51
- }
52
-
53
- /** Close the drawer with an optional result payload. */
54
- close(result?: R): void {
55
- this._result = result;
56
- this.controller.close('programmatic');
57
- queueMicrotask(() => {
58
- this._afterClosed.next(this._result);
59
- this._afterClosed.complete();
60
- this.resolveResult(this._result);
61
- });
62
- }
63
- }
@@ -1,106 +0,0 @@
1
- import {
2
- EnvironmentInjector,
3
- Injectable,
4
- InjectionToken,
5
- Type,
6
- effect,
7
- inject,
8
- runInInjectionContext,
9
- } from '@angular/core';
10
- import { KjOverlayBuilder } from '../primitives/overlay/builder';
11
- import { inPlace } from '../primitives/overlay/strategies/mount/in-place';
12
- import { edgeSheet } from '../primitives/overlay/strategies/position/edge-sheet';
13
- import { solidBackdrop } from '../primitives/overlay/strategies/backdrop/solid';
14
- import { tabCycle } from '../primitives/overlay/strategies/focus-trap/tab-cycle';
15
- import { htmlOverflow } from '../primitives/overlay/strategies/scroll-lock/html-overflow';
16
- import { silent } from '../primitives/overlay/strategies/live-announcer/silent';
17
- import { programmatic } from '../primitives/overlay/strategies/trigger-event/programmatic';
18
- import { KjDrawerRef } from './drawer.ref';
19
-
20
- /** Side of the viewport the drawer slides in from. */
21
- export type KjDrawerSide = 'left' | 'right' | 'top' | 'bottom';
22
-
23
- /** Configuration options for {@link KjDrawer.open}. */
24
- export interface KjDrawerOpenOptions<D = unknown> {
25
- /** Side of the viewport the drawer slides in from. Defaults to `'right'`. */
26
- side?: KjDrawerSide;
27
- /** Enables drag-to-dismiss when the body component implements it. */
28
- drag?: boolean;
29
- /** Data injected into the rendered component via `DRAWER_DATA` (when wired). */
30
- data?: D;
31
- /** Whether clicking the backdrop closes the drawer. Defaults to `true`. */
32
- closeOnOutside?: boolean;
33
- }
34
-
35
- /**
36
- * Programmatic service for opening drawers. Mirrors `KjDialog`. Builds an
37
- * overlay handle wired to the overlay primitives and renders a component
38
- * inside the singleton overlay container, positioned via `edgeSheet({side})`.
39
- *
40
- * @doc-category Core/Overlay
41
- */
42
- @Injectable({ providedIn: 'root' })
43
- export class KjDrawerService {
44
- private readonly builder = inject(KjOverlayBuilder);
45
- private readonly env = inject(EnvironmentInjector);
46
-
47
- /**
48
- * Open a component as a modal drawer.
49
- *
50
- * @param component - The component class to render inside the drawer.
51
- * @param opts - Side, drag, data, and close-on-outside controls.
52
- * @returns A {@link KjDrawerRef} for closing and observing the drawer.
53
- */
54
- open<T, R = unknown, D = unknown>(
55
- component: Type<T>,
56
- opts: KjDrawerOpenOptions<D> = {},
57
- ): KjDrawerRef<T, R> {
58
- const side: KjDrawerSide = opts.side ?? 'right';
59
-
60
- const handle = this.builder.create({
61
- mount: inPlace(),
62
- position: edgeSheet({ side }),
63
- backdrop: solidBackdrop({
64
- inert: true,
65
- closeOnClick: opts.closeOnOutside ?? true,
66
- }),
67
- focusTrap: tabCycle({ returnFocus: true }),
68
- scrollLock: htmlOverflow(),
69
- liveAnnouncer: silent(),
70
- trigger: programmatic(),
71
- panelRole: 'dialog',
72
- });
73
-
74
- const ref = new KjDrawerRef<T, R>(handle.controller);
75
- const cmpRef = this.builder.attachComponent(handle, component, {
76
- providers: [
77
- { provide: KjDrawerRef, useValue: ref },
78
- { provide: DRAWER_DATA, useValue: opts.data },
79
- { provide: DRAWER_SIDE, useValue: side },
80
- { provide: DRAWER_DRAG, useValue: !!opts.drag },
81
- ],
82
- });
83
- ref.bindInstance(cmpRef.instance);
84
-
85
- runInInjectionContext(this.env, () => {
86
- let wasOpen = false;
87
- const eff = effect(() => {
88
- const s = handle.controller.state();
89
- if (s === 'open' || s === 'opening') wasOpen = true;
90
- if (s === 'closed' && wasOpen) {
91
- eff.destroy();
92
- queueMicrotask(() => handle.destroy());
93
- }
94
- });
95
- });
96
- handle.controller.open();
97
- return ref;
98
- }
99
- }
100
-
101
- /** Token for passing data to a programmatically opened drawer component. */
102
- export const DRAWER_DATA = new InjectionToken<unknown>('KjDrawerData');
103
- /** Token exposing the resolved drawer side to the rendered component. */
104
- export const DRAWER_SIDE = new InjectionToken<KjDrawerSide>('KjDrawerSide');
105
- /** Token exposing whether drag-to-dismiss is enabled to the rendered component. */
106
- export const DRAWER_DRAG = new InjectionToken<boolean>('KjDrawerDrag');
@@ -1,117 +0,0 @@
1
- import { Component, inject, ChangeDetectionStrategy } from '@angular/core';
2
- import { TestBed } from '@angular/core/testing';
3
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
4
-
5
- import { KjDrawer } from './drawer';
6
- import { KjDrawerService, DRAWER_DATA } from './drawer.service';
7
- import { KjDrawerRef } from './drawer.ref';
8
-
9
- @Component({
10
- selector: 'kj-simple-drawer',
11
- standalone: true,
12
- imports: [KjDrawer],
13
- changeDetection: ChangeDetectionStrategy.Eager,
14
- template: `<kj-drawer><button id="ok" (click)="ref.close('ok')">OK</button></kj-drawer>`,
15
- })
16
- class SimpleDrawer {
17
- readonly ref = inject<KjDrawerRef<SimpleDrawer, string>>(KjDrawerRef);
18
- }
19
-
20
- @Component({
21
- selector: 'kj-data-drawer',
22
- standalone: true,
23
- imports: [KjDrawer],
24
- changeDetection: ChangeDetectionStrategy.Eager,
25
- template: `<kj-drawer>{{ data }}</kj-drawer>`,
26
- })
27
- class DataDrawer {
28
- readonly data = inject<string>(DRAWER_DATA);
29
- }
30
-
31
- function findPanel(): HTMLElement | null {
32
- return document.body.querySelector<HTMLElement>('kj-drawer');
33
- }
34
-
35
- function cleanupOverlays(): void {
36
- document.body.querySelectorAll('kj-drawer').forEach((el) => el.remove());
37
- document.documentElement.style.overflow = '';
38
- document.documentElement.style.paddingRight = '';
39
- }
40
-
41
- describe('KjDrawerService', () => {
42
- beforeEach(() => {
43
- TestBed.resetTestingModule();
44
- TestBed.configureTestingModule({});
45
- });
46
-
47
- afterEach(() => {
48
- cleanupOverlays();
49
- });
50
-
51
- it('open returns a ref with a controller', () => {
52
- const svc = TestBed.inject(KjDrawerService);
53
- const ref = svc.open(SimpleDrawer);
54
- expect(ref).toBeTruthy();
55
- expect(typeof ref.close).toBe('function');
56
- expect(ref.controller).toBeTruthy();
57
- });
58
-
59
- it('rendered panel uses role="dialog"', () => {
60
- const svc = TestBed.inject(KjDrawerService);
61
- svc.open(SimpleDrawer);
62
- const panel = findPanel();
63
- expect(panel).toBeTruthy();
64
- expect(panel!.getAttribute('role')).toBe('dialog');
65
- });
66
-
67
- it('side option is reflected on the host as data-kj-side', () => {
68
- const svc = TestBed.inject(KjDrawerService);
69
- svc.open(SimpleDrawer, { side: 'left' });
70
- expect(findPanel()!.getAttribute('data-kj-side')).toBe('left');
71
- });
72
-
73
- it('defaults side to "right"', () => {
74
- const svc = TestBed.inject(KjDrawerService);
75
- svc.open(SimpleDrawer);
76
- expect(findPanel()!.getAttribute('data-kj-side')).toBe('right');
77
- });
78
-
79
- it('close resolves the result promise', async () => {
80
- const svc = TestBed.inject(KjDrawerService);
81
- const ref = svc.open<SimpleDrawer, string>(SimpleDrawer);
82
- ref.close('hello');
83
- await expect(ref.result).resolves.toBe('hello');
84
- });
85
-
86
- it('passes data through DRAWER_DATA', () => {
87
- const svc = TestBed.inject(KjDrawerService);
88
- svc.open(DataDrawer, { data: 'greetings' });
89
- expect(findPanel()!.textContent).toContain('greetings');
90
- });
91
-
92
- it('drag option is exposed to the body component', () => {
93
- const svc = TestBed.inject(KjDrawerService);
94
- const ref = svc.open(SimpleDrawer, { side: 'bottom', drag: true });
95
- expect(ref.instance).toBeInstanceOf(SimpleDrawer);
96
- });
97
-
98
- it('Escape closes the drawer via the overlay-stack coordinator', async () => {
99
- const svc = TestBed.inject(KjDrawerService);
100
- const ref = svc.open<SimpleDrawer, unknown>(SimpleDrawer);
101
- expect(findPanel()).toBeTruthy();
102
- document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
103
- // The stack coordinator runs synchronously on Esc.
104
- await ref.result;
105
- // After close, the controller state should have transitioned away from open.
106
- expect(ref.state()).not.toBe('open');
107
- });
108
- });
109
-
110
- describe('KjDrawer (body component)', () => {
111
- it('exposes the resolved side through `side`', () => {
112
- const svc = TestBed.inject(KjDrawerService);
113
- const ref = svc.open(SimpleDrawer, { side: 'top' });
114
- expect(ref.instance as unknown as { ref: KjDrawerRef<unknown> }).toBeTruthy();
115
- cleanupOverlays();
116
- });
117
- });