@kouji-ui/core 0.0.4 → 0.1.1

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 (534) hide show
  1. package/.turbo/turbo-build.log +7 -4
  2. package/CHANGELOG.md +169 -0
  3. package/ng-package.json +5 -1
  4. package/package.json +18 -6
  5. package/src/a11y/aria-describedby.ts +7 -3
  6. package/src/a11y/aria-labelledby.spec.ts +55 -0
  7. package/src/a11y/aria-labelledby.ts +38 -0
  8. package/src/a11y/focus-trap.ts +4 -2
  9. package/src/a11y/index.ts +1 -0
  10. package/src/a11y/live-region.ts +4 -2
  11. package/src/a11y/roving-tabindex.spec.ts +139 -0
  12. package/src/a11y/roving-tabindex.ts +56 -7
  13. package/src/a11y/visually-hidden.ts +4 -2
  14. package/src/accordion/accordion.context.ts +22 -0
  15. package/src/accordion/accordion.spec.ts +233 -23
  16. package/src/accordion/accordion.ts +311 -39
  17. package/src/accordion/index.ts +8 -2
  18. package/src/alert/alert.context.ts +28 -0
  19. package/src/alert/alert.spec.ts +217 -0
  20. package/src/alert/alert.ts +417 -0
  21. package/src/alert/config.ts +46 -0
  22. package/src/alert/index.ts +19 -0
  23. package/src/avatar/avatar-group.context.ts +45 -0
  24. package/src/avatar/avatar-group.spec.ts +358 -0
  25. package/src/avatar/avatar-group.ts +259 -0
  26. package/src/avatar/avatar.ts +17 -4
  27. package/src/avatar/index.ts +11 -1
  28. package/src/badge/badge.spec.ts +8 -0
  29. package/src/badge/badge.ts +24 -3
  30. package/src/breadcrumb/breadcrumb-current.ts +38 -0
  31. package/src/breadcrumb/breadcrumb-ellipsis.ts +71 -0
  32. package/src/breadcrumb/breadcrumb-item.ts +41 -0
  33. package/src/breadcrumb/breadcrumb-link.ts +44 -0
  34. package/src/breadcrumb/breadcrumb-list.ts +42 -0
  35. package/src/breadcrumb/breadcrumb-separator.ts +45 -0
  36. package/src/breadcrumb/breadcrumb.context.ts +45 -0
  37. package/src/breadcrumb/breadcrumb.spec.ts +354 -0
  38. package/src/breadcrumb/breadcrumb.ts +239 -0
  39. package/src/breadcrumb/config.ts +84 -0
  40. package/src/breadcrumb/index.ts +18 -0
  41. package/src/button/_examples/button.example.ts +71 -0
  42. package/src/button/_examples/button.finance.example.ts +83 -0
  43. package/src/button/_examples/button.retro.example.ts +91 -0
  44. package/src/button/_examples/button.sizes.example.ts +60 -0
  45. package/src/button/_examples/index.ts +6 -0
  46. package/src/button/button.spec.ts +139 -8
  47. package/src/button/button.ts +114 -16
  48. package/src/button/config.spec.ts +33 -0
  49. package/src/button/config.ts +45 -0
  50. package/src/button/index.ts +2 -1
  51. package/src/button-group/button-group.context.ts +28 -0
  52. package/src/button-group/button-group.spec.ts +99 -0
  53. package/src/button-group/button-group.ts +99 -0
  54. package/src/button-group/index.ts +2 -0
  55. package/src/calendar/calendar-day.ts +102 -0
  56. package/src/calendar/calendar-grid.ts +90 -0
  57. package/src/calendar/calendar-header.ts +65 -0
  58. package/src/calendar/calendar.context.ts +53 -0
  59. package/src/calendar/calendar.spec.ts +225 -0
  60. package/src/calendar/calendar.ts +233 -0
  61. package/src/calendar/date-utils.ts +225 -0
  62. package/src/calendar/index.ts +28 -0
  63. package/src/carousel/carousel.context.ts +81 -0
  64. package/src/carousel/carousel.spec.ts +337 -0
  65. package/src/carousel/carousel.ts +919 -0
  66. package/src/carousel/index.ts +22 -0
  67. package/src/cascade-select/cascade-select-option.ts +205 -0
  68. package/src/cascade-select/cascade-select-panel.ts +106 -0
  69. package/src/cascade-select/cascade-select-root.ts +265 -0
  70. package/src/cascade-select/cascade-select-sub-panel.ts +168 -0
  71. package/src/cascade-select/cascade-select-trigger.ts +44 -0
  72. package/src/cascade-select/cascade-select.context.ts +71 -0
  73. package/src/cascade-select/cascade-select.spec.ts +241 -0
  74. package/src/cascade-select/cascade-select.ts +5 -0
  75. package/src/cascade-select/index.ts +11 -0
  76. package/src/chart/chart.ts +6 -2
  77. package/src/chat/chat-avatar.ts +31 -0
  78. package/src/chat/chat-bubble.ts +49 -0
  79. package/src/chat/chat-footer.ts +67 -0
  80. package/src/chat/chat-header.ts +41 -0
  81. package/src/chat/chat-log.ts +43 -0
  82. package/src/chat/chat.context.ts +64 -0
  83. package/src/chat/chat.spec.ts +341 -0
  84. package/src/chat/chat.ts +191 -0
  85. package/src/chat/config.ts +53 -0
  86. package/src/chat/index.ts +21 -0
  87. package/src/checkbox/checkbox.ts +9 -2
  88. package/src/color-picker/color-picker.context.ts +74 -0
  89. package/src/color-picker/color-picker.spec.ts +241 -0
  90. package/src/color-picker/color-picker.ts +698 -0
  91. package/src/color-picker/color-picker.utils.ts +140 -0
  92. package/src/color-picker/index.ts +28 -0
  93. package/src/combobox/combobox-input.ts +143 -0
  94. package/src/combobox/combobox-listbox.ts +49 -0
  95. package/src/combobox/combobox-option.ts +43 -0
  96. package/src/combobox/combobox-root.ts +281 -0
  97. package/src/combobox/combobox.spec.ts +75 -0
  98. package/src/combobox/combobox.ts +4 -0
  99. package/src/combobox/index.ts +4 -0
  100. package/src/command-palette/command-empty.ts +36 -0
  101. package/src/command-palette/command-group.ts +21 -0
  102. package/src/command-palette/command-input.ts +70 -0
  103. package/src/command-palette/command-item.ts +60 -0
  104. package/src/command-palette/command-list.ts +25 -0
  105. package/src/command-palette/command-palette-dialog.ts +74 -0
  106. package/src/command-palette/command-palette-trigger.ts +64 -0
  107. package/src/command-palette/command-palette.filters.ts +53 -0
  108. package/src/command-palette/command-palette.spec.ts +349 -0
  109. package/src/command-palette/command-palette.ts +204 -0
  110. package/src/command-palette/command-separator.ts +18 -0
  111. package/src/command-palette/index.ts +15 -0
  112. package/src/confirm-popup/confirm-popup-action.ts +39 -0
  113. package/src/confirm-popup/confirm-popup-cancel.ts +38 -0
  114. package/src/confirm-popup/confirm-popup-content.ts +113 -0
  115. package/src/confirm-popup/confirm-popup-message.ts +36 -0
  116. package/src/confirm-popup/confirm-popup-trigger.ts +31 -0
  117. package/src/confirm-popup/confirm-popup.context.ts +41 -0
  118. package/src/confirm-popup/confirm-popup.spec.ts +337 -0
  119. package/src/confirm-popup/confirm-popup.ts +109 -0
  120. package/src/confirm-popup/index.ts +12 -0
  121. package/src/date-picker/date-picker-calendar.ts +65 -0
  122. package/src/date-picker/date-picker-trigger.ts +215 -0
  123. package/src/date-picker/date-picker.context.ts +50 -0
  124. package/src/date-picker/date-picker.spec.ts +117 -0
  125. package/src/date-picker/date-picker.ts +127 -0
  126. package/src/date-picker/index.ts +7 -0
  127. package/src/dialog/_examples/dialog.confirm.example.ts +145 -0
  128. package/src/dialog/_examples/dialog.example.ts +106 -0
  129. package/src/dialog/_examples/dialog.finance.example.ts +121 -0
  130. package/src/dialog/_examples/dialog.retro.example.ts +126 -0
  131. package/src/dialog/_examples/index.ts +6 -0
  132. package/src/dialog/dialog.ref.ts +42 -0
  133. package/src/dialog/dialog.service.ts +57 -167
  134. package/src/dialog/dialog.spec.ts +35 -120
  135. package/src/dialog/dialog.ts +17 -192
  136. package/src/dialog/index.ts +3 -9
  137. package/src/divider/divider.spec.ts +223 -0
  138. package/src/divider/divider.ts +137 -0
  139. package/src/divider/index.ts +5 -0
  140. package/src/drawer/drawer.ref.ts +63 -0
  141. package/src/drawer/drawer.service.ts +106 -0
  142. package/src/drawer/drawer.spec.ts +117 -0
  143. package/src/drawer/drawer.ts +122 -0
  144. package/src/drawer/index.ts +10 -0
  145. package/src/dropdown-menu/dropdown-menu-content.ts +258 -0
  146. package/src/dropdown-menu/dropdown-menu-group.ts +31 -0
  147. package/src/dropdown-menu/dropdown-menu-item.ts +51 -0
  148. package/src/dropdown-menu/dropdown-menu-label.ts +41 -0
  149. package/src/dropdown-menu/dropdown-menu-separator.ts +27 -0
  150. package/src/dropdown-menu/dropdown-menu-trigger.ts +140 -0
  151. package/src/dropdown-menu/dropdown-menu.spec.ts +265 -0
  152. package/src/dropdown-menu/dropdown-menu.ts +60 -0
  153. package/src/dropdown-menu/index.ts +15 -0
  154. package/src/example-components.ts +39 -30
  155. package/src/field/field-error.ts +49 -0
  156. package/src/field/field-group.ts +39 -0
  157. package/src/field/field-help.ts +47 -0
  158. package/src/field/field-label.ts +30 -0
  159. package/src/field/field.context.ts +28 -0
  160. package/src/field/field.spec.ts +179 -0
  161. package/src/field/field.ts +121 -0
  162. package/src/field/index.ts +6 -0
  163. package/src/file-upload/file-upload.context.ts +89 -0
  164. package/src/file-upload/file-upload.spec.ts +290 -0
  165. package/src/file-upload/file-upload.ts +639 -0
  166. package/src/file-upload/file-upload.types.ts +59 -0
  167. package/src/file-upload/index.ts +23 -0
  168. package/src/form/form-error-summary.ts +87 -0
  169. package/src/form/form-field.context.ts +3 -0
  170. package/src/form/form-field.spec.ts +25 -0
  171. package/src/form/form-field.ts +52 -0
  172. package/src/form/form.context.ts +52 -2
  173. package/src/form/form.spec.ts +155 -18
  174. package/src/form/form.ts +315 -35
  175. package/src/form/index.ts +11 -2
  176. package/src/icon/E2E.md +14 -0
  177. package/src/icon/icon.css +40 -0
  178. package/src/icon/icon.directive.spec.ts +198 -0
  179. package/src/icon/icon.directive.ts +113 -0
  180. package/src/icon/icon.mode.spec.ts +29 -0
  181. package/src/icon/icon.mode.ts +23 -0
  182. package/src/icon/icon.providers.spec.ts +63 -0
  183. package/src/icon/icon.providers.ts +47 -0
  184. package/src/icon/icon.resolver.spec.ts +96 -0
  185. package/src/icon/icon.resolver.ts +49 -0
  186. package/src/icon/icon.tokens.ts +88 -0
  187. package/src/icon/icon.types.ts +48 -0
  188. package/src/icon/index.ts +21 -0
  189. package/src/input/input.ts +12 -3
  190. package/src/input-group/index.ts +3 -0
  191. package/src/input-group/input-group-addon.ts +92 -0
  192. package/src/input-group/input-group.context.ts +27 -0
  193. package/src/input-group/input-group.spec.ts +186 -0
  194. package/src/input-group/input-group.ts +136 -0
  195. package/src/input-mask/index.ts +11 -0
  196. package/src/input-mask/input-mask.compile.ts +69 -0
  197. package/src/input-mask/input-mask.engine.ts +376 -0
  198. package/src/input-mask/input-mask.presets.ts +24 -0
  199. package/src/input-mask/input-mask.spec.ts +304 -0
  200. package/src/input-mask/input-mask.tokens.ts +49 -0
  201. package/src/input-mask/input-mask.ts +280 -0
  202. package/src/input-otp/index.ts +2 -0
  203. package/src/input-otp/input-otp.context.ts +41 -0
  204. package/src/input-otp/input-otp.spec.ts +308 -0
  205. package/src/input-otp/input-otp.ts +470 -0
  206. package/src/kbd/index.ts +1 -0
  207. package/src/kbd/kbd.spec.ts +127 -0
  208. package/src/kbd/kbd.ts +132 -0
  209. package/src/link/config.ts +44 -0
  210. package/src/link/index.ts +2 -0
  211. package/src/link/link.spec.ts +246 -0
  212. package/src/link/link.ts +226 -0
  213. package/src/list/index.ts +11 -0
  214. package/src/list/list.spec.ts +237 -0
  215. package/src/list/list.ts +277 -0
  216. package/src/menubar/index.ts +7 -0
  217. package/src/menubar/menubar-item.ts +204 -0
  218. package/src/menubar/menubar.context.ts +43 -0
  219. package/src/menubar/menubar.spec.ts +433 -0
  220. package/src/menubar/menubar.ts +309 -0
  221. package/src/number-input/index.ts +4 -0
  222. package/src/number-input/number-input-group.ts +64 -0
  223. package/src/number-input/number-input.context.ts +31 -0
  224. package/src/number-input/number-input.format.ts +148 -0
  225. package/src/number-input/number-input.spec.ts +170 -0
  226. package/src/number-input/number-input.ts +457 -0
  227. package/src/number-input/number-stepper.ts +193 -0
  228. package/src/overlay-badge/index.ts +7 -0
  229. package/src/overlay-badge/overlay-badge-content.ts +73 -0
  230. package/src/overlay-badge/overlay-badge.context.ts +37 -0
  231. package/src/overlay-badge/overlay-badge.spec.ts +220 -0
  232. package/src/overlay-badge/overlay-badge.ts +128 -0
  233. package/src/pagination/config.ts +82 -0
  234. package/src/pagination/index.ts +19 -0
  235. package/src/pagination/page-tokens.ts +78 -0
  236. package/src/pagination/pagination-ellipsis.ts +69 -0
  237. package/src/pagination/pagination-first.ts +84 -0
  238. package/src/pagination/pagination-info.ts +70 -0
  239. package/src/pagination/pagination-item.ts +81 -0
  240. package/src/pagination/pagination-last.ts +85 -0
  241. package/src/pagination/pagination-next.ts +86 -0
  242. package/src/pagination/pagination-previous.ts +90 -0
  243. package/src/pagination/pagination.context.ts +52 -0
  244. package/src/pagination/pagination.spec.ts +388 -0
  245. package/src/pagination/pagination.ts +288 -0
  246. package/src/password-input/index.ts +15 -0
  247. package/src/password-input/password-input.context.ts +65 -0
  248. package/src/password-input/password-input.scorer.ts +34 -0
  249. package/src/password-input/password-input.spec.ts +274 -0
  250. package/src/password-input/password-input.ts +488 -0
  251. package/src/popover/_examples/index.ts +5 -0
  252. package/src/popover/_examples/popover.example.ts +92 -0
  253. package/src/popover/_examples/popover.finance.example.ts +106 -0
  254. package/src/popover/_examples/popover.retro.example.ts +103 -0
  255. package/src/popover/index.ts +5 -12
  256. package/src/popover/popover-arrow.ts +30 -0
  257. package/src/popover/popover-close.ts +36 -0
  258. package/src/popover/popover-content.ts +41 -0
  259. package/src/popover/popover-title.ts +39 -0
  260. package/src/popover/popover-trigger.ts +40 -0
  261. package/src/popover/popover.spec.ts +51 -44
  262. package/src/popover/popover.ts +5 -124
  263. package/src/presets/bind-presets.spec.ts +50 -0
  264. package/src/presets/bind-presets.ts +43 -0
  265. package/src/presets/index.ts +3 -0
  266. package/src/presets/size.spec.ts +67 -0
  267. package/src/presets/size.ts +59 -0
  268. package/src/presets/variant.spec.ts +72 -0
  269. package/src/presets/variant.ts +62 -0
  270. package/src/primitives/directionality/directionality.spec.ts +112 -0
  271. package/src/primitives/directionality/directionality.ts +89 -0
  272. package/src/primitives/directionality/index.ts +1 -0
  273. package/src/primitives/forms/form-control.spec.ts +11 -3
  274. package/src/primitives/forms/form-control.ts +6 -2
  275. package/src/primitives/index.ts +3 -0
  276. package/src/primitives/interaction/disabled.ts +12 -5
  277. package/src/primitives/interaction/focus-ring.ts +4 -2
  278. package/src/primitives/list/filterable-list.spec.ts +114 -0
  279. package/src/primitives/list/filterable-list.ts +126 -0
  280. package/src/primitives/list/group.spec.ts +99 -0
  281. package/src/primitives/list/group.ts +139 -0
  282. package/src/primitives/list/index.ts +8 -0
  283. package/src/primitives/list/inject-helpers.ts +8 -0
  284. package/src/primitives/list/item.spec.ts +173 -0
  285. package/src/primitives/list/item.ts +222 -0
  286. package/src/primitives/list/navigator.spec.ts +286 -0
  287. package/src/primitives/list/navigator.ts +238 -0
  288. package/src/primitives/list/selection.spec.ts +214 -0
  289. package/src/primitives/list/selection.ts +339 -0
  290. package/src/primitives/list/tokens.ts +106 -0
  291. package/src/primitives/list/type-ahead.spec.ts +58 -0
  292. package/src/primitives/list/type-ahead.ts +46 -0
  293. package/src/primitives/overlay/backdrop.spec.ts +54 -0
  294. package/src/primitives/overlay/backdrop.ts +31 -0
  295. package/src/primitives/overlay/builder.spec.ts +38 -0
  296. package/src/primitives/overlay/builder.ts +151 -0
  297. package/src/primitives/overlay/container.ts +42 -0
  298. package/src/primitives/overlay/context.ts +14 -0
  299. package/src/primitives/overlay/controller.spec.ts +86 -0
  300. package/src/primitives/overlay/controller.ts +190 -0
  301. package/src/primitives/overlay/id.spec.ts +24 -0
  302. package/src/primitives/overlay/id.ts +17 -0
  303. package/src/primitives/overlay/index.ts +18 -1
  304. package/src/primitives/overlay/overlay.css +42 -0
  305. package/src/primitives/overlay/panel.spec.ts +52 -0
  306. package/src/primitives/overlay/panel.ts +102 -0
  307. package/src/primitives/overlay/stack.spec.ts +55 -0
  308. package/src/primitives/overlay/stack.ts +113 -0
  309. package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +11 -0
  310. package/src/primitives/overlay/strategies/backdrop/blurred.ts +5 -0
  311. package/src/primitives/overlay/strategies/backdrop/none.spec.ts +10 -0
  312. package/src/primitives/overlay/strategies/backdrop/none.ts +9 -0
  313. package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +18 -0
  314. package/src/primitives/overlay/strategies/backdrop/solid.ts +23 -0
  315. package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +28 -0
  316. package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +38 -0
  317. package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +9 -0
  318. package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +8 -0
  319. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +49 -0
  320. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +85 -0
  321. package/src/primitives/overlay/strategies/index.ts +34 -0
  322. package/src/primitives/overlay/strategies/live-announcer/_announce.ts +35 -0
  323. package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +21 -0
  324. package/src/primitives/overlay/strategies/live-announcer/assertive.ts +11 -0
  325. package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +21 -0
  326. package/src/primitives/overlay/strategies/live-announcer/polite.ts +11 -0
  327. package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +12 -0
  328. package/src/primitives/overlay/strategies/live-announcer/silent.ts +5 -0
  329. package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +40 -0
  330. package/src/primitives/overlay/strategies/mount/body-portal.ts +91 -0
  331. package/src/primitives/overlay/strategies/mount/in-container.spec.ts +43 -0
  332. package/src/primitives/overlay/strategies/mount/in-container.ts +39 -0
  333. package/src/primitives/overlay/strategies/mount/in-place.spec.ts +40 -0
  334. package/src/primitives/overlay/strategies/mount/in-place.ts +20 -0
  335. package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +56 -0
  336. package/src/primitives/overlay/strategies/position/anchored-to.ts +248 -0
  337. package/src/primitives/overlay/strategies/position/corner.spec.ts +36 -0
  338. package/src/primitives/overlay/strategies/position/corner.ts +33 -0
  339. package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +32 -0
  340. package/src/primitives/overlay/strategies/position/edge-sheet.ts +36 -0
  341. package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +25 -0
  342. package/src/primitives/overlay/strategies/position/in-place-sibling.ts +13 -0
  343. package/src/primitives/overlay/strategies/position/point-at.spec.ts +40 -0
  344. package/src/primitives/overlay/strategies/position/point-at.ts +34 -0
  345. package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +31 -0
  346. package/src/primitives/overlay/strategies/position/viewport-centered.ts +31 -0
  347. package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +15 -0
  348. package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +39 -0
  349. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +21 -0
  350. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +44 -0
  351. package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +9 -0
  352. package/src/primitives/overlay/strategies/scroll-lock/none.ts +5 -0
  353. package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +32 -0
  354. package/src/primitives/overlay/strategies/trigger-event/on-click.ts +28 -0
  355. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +45 -0
  356. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +70 -0
  357. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +35 -0
  358. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +34 -0
  359. package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +64 -0
  360. package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +37 -0
  361. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +37 -0
  362. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +59 -0
  363. package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +34 -0
  364. package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +86 -0
  365. package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +16 -0
  366. package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +12 -0
  367. package/src/primitives/overlay/tokens.ts +54 -0
  368. package/src/primitives/overlay/trigger.spec.ts +103 -0
  369. package/src/primitives/overlay/trigger.ts +75 -0
  370. package/src/primitives/overlay/types.ts +24 -0
  371. package/src/primitives/overlay/wrapper.ts +50 -0
  372. package/src/primitives/signals/deep-signal.ts +109 -0
  373. package/src/primitives/signals/index.ts +1 -0
  374. package/src/progress-bar/config.ts +48 -0
  375. package/src/progress-bar/index.ts +12 -0
  376. package/src/progress-bar/progress-bar-fill.ts +37 -0
  377. package/src/progress-bar/progress-bar.context.ts +34 -0
  378. package/src/progress-bar/progress-bar.spec.ts +423 -0
  379. package/src/progress-bar/progress-bar.ts +217 -0
  380. package/src/public-api.ts +58 -9
  381. package/src/radio/radio.ts +14 -3
  382. package/src/select/index.ts +4 -2
  383. package/src/select/select-content.ts +69 -0
  384. package/src/select/select-option.ts +35 -0
  385. package/src/select/select-root.ts +129 -0
  386. package/src/select/select-trigger.ts +93 -0
  387. package/src/select/select.spec.ts +133 -140
  388. package/src/select/select.ts +4 -250
  389. package/src/skeleton/index.ts +5 -0
  390. package/src/skeleton/skeleton.spec.ts +115 -0
  391. package/src/skeleton/skeleton.ts +56 -0
  392. package/src/slider/index.ts +10 -0
  393. package/src/slider/slider-range.ts +49 -0
  394. package/src/slider/slider-thumb.ts +335 -0
  395. package/src/slider/slider-track.ts +70 -0
  396. package/src/slider/slider.context.ts +79 -0
  397. package/src/slider/slider.geometry.ts +73 -0
  398. package/src/slider/slider.spec.ts +216 -0
  399. package/src/slider/slider.ts +443 -0
  400. package/src/speed-dial/index.ts +10 -0
  401. package/src/speed-dial/speed-dial-action.ts +40 -0
  402. package/src/speed-dial/speed-dial-actions.ts +31 -0
  403. package/src/speed-dial/speed-dial-trigger.ts +55 -0
  404. package/src/speed-dial/speed-dial.context.ts +36 -0
  405. package/src/speed-dial/speed-dial.spec.ts +143 -0
  406. package/src/speed-dial/speed-dial.ts +127 -0
  407. package/src/spinner/config.ts +48 -0
  408. package/src/spinner/index.ts +8 -0
  409. package/src/spinner/spinner.spec.ts +262 -0
  410. package/src/spinner/spinner.ts +129 -0
  411. package/src/stepper/index.ts +15 -0
  412. package/src/stepper/stepper.context.ts +63 -0
  413. package/src/stepper/stepper.spec.ts +403 -0
  414. package/src/stepper/stepper.ts +544 -0
  415. package/src/styles.css +17 -0
  416. package/src/table/column-helpers.spec.ts +74 -0
  417. package/src/table/column-helpers.ts +68 -0
  418. package/src/table/filter-fns.ts +230 -0
  419. package/src/table/filter-models.spec.ts +240 -0
  420. package/src/table/filter-models.ts +124 -0
  421. package/src/table/filter-params.ts +90 -0
  422. package/src/table/grid-api-impl.ts +321 -0
  423. package/src/table/grid-api.spec.ts +178 -0
  424. package/src/table/grid-api.ts +285 -0
  425. package/src/table/index.ts +73 -1
  426. package/src/table/table-cell.spec.ts +43 -0
  427. package/src/table/table-cell.ts +38 -0
  428. package/src/table/table-filter-outlet.ts +120 -0
  429. package/src/table/table-header.spec.ts +54 -0
  430. package/src/table/table-header.ts +63 -0
  431. package/src/table/table-keyboard.spec.ts +68 -0
  432. package/src/table/table-keyboard.ts +107 -0
  433. package/src/table/table-resource.spec.ts +37 -0
  434. package/src/table/table-resource.ts +36 -0
  435. package/src/table/table-row.spec.ts +54 -0
  436. package/src/table/table-row.ts +31 -0
  437. package/src/table/table-storage.spec.ts +67 -0
  438. package/src/table/table-storage.ts +76 -0
  439. package/src/table/table.spec.ts +101 -42
  440. package/src/table/table.ts +228 -73
  441. package/src/table/table.types.ts +83 -0
  442. package/src/tabs/index.ts +7 -2
  443. package/src/tabs/tabs.context.ts +27 -4
  444. package/src/tabs/tabs.spec.ts +336 -24
  445. package/src/tabs/tabs.ts +313 -79
  446. package/src/tag/config.ts +53 -0
  447. package/src/tag/index.ts +7 -0
  448. package/src/tag/tag-list.ts +76 -0
  449. package/src/tag/tag-remove.ts +61 -0
  450. package/src/tag/tag.context.ts +36 -0
  451. package/src/tag/tag.spec.ts +240 -0
  452. package/src/tag/tag.ts +203 -0
  453. package/src/textarea/config.ts +42 -0
  454. package/src/textarea/index.ts +8 -0
  455. package/src/textarea/textarea.spec.ts +176 -0
  456. package/src/textarea/textarea.ts +235 -0
  457. package/src/time-picker/index.ts +15 -0
  458. package/src/time-picker/time-picker-meridiem.ts +123 -0
  459. package/src/time-picker/time-picker-segment.ts +318 -0
  460. package/src/time-picker/time-picker.context.ts +38 -0
  461. package/src/time-picker/time-picker.format.ts +181 -0
  462. package/src/time-picker/time-picker.spec.ts +189 -0
  463. package/src/time-picker/time-picker.ts +274 -0
  464. package/src/toast/_examples/index.ts +5 -0
  465. package/src/toast/_examples/toast.example.ts +282 -0
  466. package/src/toast/_examples/toast.finance.example.ts +180 -0
  467. package/src/toast/_examples/toast.retro.example.ts +161 -0
  468. package/src/toast/index.ts +8 -1
  469. package/src/toast/toast.ref.ts +26 -0
  470. package/src/toast/toast.service.ts +227 -41
  471. package/src/toast/toast.spec.ts +166 -14
  472. package/src/toast/toast.strategy.ts +10 -0
  473. package/src/toast/toast.ts +177 -21
  474. package/src/toggle/toggle.ts +10 -2
  475. package/src/tooltip/_examples/index.ts +6 -0
  476. package/src/tooltip/_examples/tooltip.example.ts +82 -0
  477. package/src/tooltip/_examples/tooltip.finance.example.ts +97 -0
  478. package/src/tooltip/_examples/tooltip.placements.example.ts +83 -0
  479. package/src/tooltip/_examples/tooltip.retro.example.ts +107 -0
  480. package/src/tooltip/index.ts +4 -5
  481. package/src/tooltip/tooltip-arrow.ts +31 -0
  482. package/src/tooltip/tooltip-content.ts +38 -0
  483. package/src/tooltip/tooltip-group.ts +32 -0
  484. package/src/tooltip/tooltip-trigger.ts +47 -0
  485. package/src/tooltip/tooltip.spec.ts +38 -102
  486. package/src/tooltip/tooltip.ts +5 -129
  487. package/src/tree-select/index.ts +12 -0
  488. package/src/tree-select/tree-select-content.ts +199 -0
  489. package/src/tree-select/tree-select-node.ts +132 -0
  490. package/src/tree-select/tree-select-root.ts +272 -0
  491. package/src/tree-select/tree-select-trigger.ts +90 -0
  492. package/src/tree-select/tree-select.context.ts +63 -0
  493. package/src/tree-select/tree-select.spec.ts +433 -0
  494. package/src/tree-select/tree-select.ts +2 -0
  495. package/src/typography/blockquote.ts +57 -0
  496. package/src/typography/code.ts +53 -0
  497. package/src/typography/index.ts +22 -0
  498. package/src/typography/lead.ts +49 -0
  499. package/src/typography/muted.ts +29 -0
  500. package/src/typography/prose.css +312 -0
  501. package/src/typography/truncate.ts +99 -0
  502. package/src/typography/typography.spec.ts +203 -0
  503. package/tsconfig.lib.json +9 -1
  504. package/tsconfig.lib.prod.json +7 -1
  505. package/tsconfig.spec.json +9 -1
  506. package/vite.config.ts +8 -0
  507. package/src/button/button.example.ts +0 -30
  508. package/src/button/button.finance.example.ts +0 -37
  509. package/src/button/button.retro.example.ts +0 -47
  510. package/src/button/button.sizes.example.ts +0 -25
  511. package/src/dialog/dialog.confirm.example.ts +0 -57
  512. package/src/dialog/dialog.context.ts +0 -11
  513. package/src/dialog/dialog.example.ts +0 -40
  514. package/src/dialog/dialog.finance.example.ts +0 -47
  515. package/src/dialog/dialog.retro.example.ts +0 -46
  516. package/src/menu/index.ts +0 -2
  517. package/src/menu/menu.context.ts +0 -10
  518. package/src/menu/menu.example.ts +0 -39
  519. package/src/menu/menu.spec.ts +0 -168
  520. package/src/menu/menu.ts +0 -176
  521. package/src/popover/popover.context.ts +0 -18
  522. package/src/popover/popover.example.ts +0 -50
  523. package/src/popover/popover.finance.example.ts +0 -52
  524. package/src/popover/popover.retro.example.ts +0 -53
  525. package/src/primitives/overlay/overlay.spec.ts +0 -90
  526. package/src/primitives/overlay/overlay.ts +0 -106
  527. package/src/select/select.context.ts +0 -3
  528. package/src/toast/toast.example.ts +0 -134
  529. package/src/toast/toast.finance.example.ts +0 -68
  530. package/src/toast/toast.retro.example.ts +0 -69
  531. package/src/tooltip/tooltip.example.ts +0 -46
  532. package/src/tooltip/tooltip.finance.example.ts +0 -54
  533. package/src/tooltip/tooltip.placements.example.ts +0 -56
  534. package/src/tooltip/tooltip.retro.example.ts +0 -65
package/src/menu/menu.ts DELETED
@@ -1,176 +0,0 @@
1
- import { Directive, ElementRef, inject, signal } from '@angular/core';
2
- import { KJ_MENU, KjMenuContext } from './menu.context';
3
-
4
- /**
5
- * Root menu container. Manages open/close state and provides context to child directives.
6
- * Pairs with `[kjMenuTrigger]`, `[kjMenuContent]`, and `[kjMenuItem]`.
7
- *
8
- * Click outside or Escape closes the menu. Clicking the trigger toggles it.
9
- * Arrow-key navigation, Home/End, and typeahead are handled by `[kjMenuContent]`.
10
- *
11
- * @example
12
- * ```html
13
- * <div kjMenu>
14
- * <button kjMenuTrigger>Actions</button>
15
- * <div kjMenuContent>
16
- * <button kjMenuItem>Edit</button>
17
- * <button kjMenuItem>Delete</button>
18
- * </div>
19
- * </div>
20
- * ```
21
- * @doc
22
- * @doc-example Basic
23
- * @doc-theme default
24
- * @doc-file menu.example.ts
25
- * @category Core/Navigation
26
- */
27
- @Directive({
28
- selector: '[kjMenu]',
29
- standalone: true,
30
- providers: [{ provide: KJ_MENU, useExisting: KjMenu }],
31
- exportAs: 'kjMenu',
32
- })
33
- export class KjMenu implements KjMenuContext {
34
- private readonly _open = signal(false);
35
- readonly open = this._open.asReadonly();
36
-
37
- toggle(): void { this._open.update(v => !v); }
38
- close(): void { this._open.set(false); }
39
- }
40
-
41
- /**
42
- * Trigger element that toggles the parent menu.
43
- * Automatically sets `aria-haspopup` and `aria-expanded` on the host element.
44
- *
45
- * @category Core/Navigation
46
- */
47
- @Directive({
48
- selector: '[kjMenuTrigger]',
49
- standalone: true,
50
- host: {
51
- '[attr.aria-haspopup]': '"menu"',
52
- '[attr.aria-expanded]': 'ctx.open().toString()',
53
- // stopPropagation prevents the document:click on kjMenuContent from immediately closing
54
- '(click)': '$event.stopPropagation(); ctx.toggle()',
55
- },
56
- })
57
- export class KjMenuTrigger {
58
- readonly ctx = inject(KJ_MENU);
59
- }
60
-
61
- /**
62
- * Menu content panel. Hidden when closed via the `hidden` attribute.
63
- * Provides keyboard navigation: Arrow keys, Home/End, Escape, and typeahead.
64
- * Click-outside dismissal is handled via a document-level click listener.
65
- *
66
- * @category Core/Navigation
67
- */
68
- @Directive({
69
- selector: '[kjMenuContent]',
70
- standalone: true,
71
- host: {
72
- 'role': 'menu',
73
- '[attr.hidden]': '!ctx.open() ? "" : null',
74
- // Prevent clicks inside from propagating to document click handler
75
- '(click)': '$event.stopPropagation()',
76
- // Keyboard navigation within the menu
77
- '(keydown)': 'onKeydown($event)',
78
- // Close on Escape key
79
- '(document:keydown.escape)': 'ctx.open() && ctx.close()',
80
- // Close on any click outside (trigger stopPropagation prevents self-close)
81
- '(document:click)': 'ctx.open() && ctx.close()',
82
- },
83
- })
84
- export class KjMenuContent {
85
- private readonly el = inject(ElementRef<HTMLElement>);
86
- readonly ctx = inject(KJ_MENU);
87
-
88
- onKeydown(e: KeyboardEvent): void {
89
- const items = this.getFocusableItems();
90
- if (!items.length) return;
91
- const current = items.indexOf(document.activeElement as HTMLElement);
92
-
93
- switch (e.key) {
94
- case 'ArrowDown':
95
- e.preventDefault();
96
- items[(current + 1) % items.length].focus();
97
- break;
98
- case 'ArrowUp':
99
- e.preventDefault();
100
- items[(current - 1 + items.length) % items.length].focus();
101
- break;
102
- case 'Home':
103
- e.preventDefault();
104
- items[0].focus();
105
- break;
106
- case 'End':
107
- e.preventDefault();
108
- items[items.length - 1].focus();
109
- break;
110
- default: {
111
- // Type-ahead: jump to next item starting with pressed character
112
- const char = e.key.length === 1 ? e.key.toLowerCase() : null;
113
- if (char) {
114
- const match =
115
- items.find((item, i) =>
116
- i > current && item.textContent?.trim().toLowerCase().startsWith(char)
117
- ) ??
118
- items.find(item =>
119
- item.textContent?.trim().toLowerCase().startsWith(char)
120
- );
121
- match?.focus();
122
- }
123
- }
124
- }
125
- }
126
-
127
- private getFocusableItems(): HTMLElement[] {
128
- const nodes = this.el.nativeElement.querySelectorAll('[kjMenuItem]');
129
- return (Array.from(nodes) as HTMLElement[]).filter(el => !el.hasAttribute('disabled'));
130
- }
131
- }
132
-
133
- /**
134
- * Individual menu item. Closes the menu on click or keyboard activation (Enter/Space).
135
- *
136
- * @example
137
- * ```html
138
- * <button kjMenuItem>Delete</button>
139
- * ```
140
- * @category Core/Navigation
141
- */
142
- @Directive({
143
- selector: '[kjMenuItem]',
144
- standalone: true,
145
- host: {
146
- 'role': 'menuitem',
147
- '[attr.tabindex]': '"0"',
148
- '(click)': 'ctx.close()',
149
- '(keydown.enter)': '$event.preventDefault(); ctx.close()',
150
- '(keydown.space)': '$event.preventDefault(); ctx.close()',
151
- },
152
- })
153
- export class KjMenuItem {
154
- readonly ctx = inject(KJ_MENU);
155
- }
156
-
157
- /**
158
- * Closes the parent menu when clicked. Convenience directive for non-item close buttons.
159
- * Place anywhere inside `[kjMenu]`.
160
- *
161
- * @example
162
- * ```html
163
- * <button kjMenuClose>Cancel</button>
164
- * ```
165
- * @category Core/Navigation
166
- */
167
- @Directive({
168
- selector: '[kjMenuClose]',
169
- standalone: true,
170
- host: {
171
- '(click)': 'ctx.close()',
172
- },
173
- })
174
- export class KjMenuClose {
175
- readonly ctx = inject(KJ_MENU);
176
- }
@@ -1,18 +0,0 @@
1
- import { InjectionToken, Signal, InputSignal } from '@angular/core';
2
-
3
- /** Preferred side for the popover relative to its trigger. */
4
- export type KjPopoverSide = 'top' | 'bottom' | 'left' | 'right';
5
- /** Alignment of the popover along the cross-axis. */
6
- export type KjPopoverAlign = 'start' | 'center' | 'end';
7
-
8
- /** Context shared between popover directives. */
9
- export interface KjPopoverContext {
10
- readonly open: Signal<boolean>;
11
- readonly popoverId: string;
12
- kjPopoverSide: Signal<KjPopoverSide> | InputSignal<KjPopoverSide>;
13
- kjPopoverAlign: Signal<KjPopoverAlign> | InputSignal<KjPopoverAlign>;
14
- toggle: () => void;
15
- hide: () => void;
16
- }
17
-
18
- export const KJ_POPOVER = new InjectionToken<KjPopoverContext>('KjPopover');
@@ -1,50 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import {
3
- KjPopover, KjPopoverTrigger,
4
- KjPopoverContent, KjPopoverClose,
5
- } from './popover';
6
- import { KjButton } from '../button/button';
7
-
8
- @Component({
9
- selector: 'kj-example-popover-basic',
10
- standalone: true,
11
- imports: [
12
- KjPopover, KjPopoverTrigger,
13
- KjPopoverContent, KjPopoverClose,
14
- KjButton,
15
- ],
16
- styleUrls: ['../styles/docs-themes.css'],
17
- styles: [`
18
- :host { display: flex; align-items: flex-start; justify-content: center; padding: 3rem 2rem 10rem; background: var(--kj-bg); font-family: var(--kj-font); min-height: 220px; }
19
- .anchor { position: relative; display: inline-block; }
20
- button[kjButton] { padding: 0.5rem 1.25rem; border: 1px solid var(--kj-border); background: transparent; color: var(--kj-text); cursor: pointer; font-family: inherit; font-size: 0.875rem; }
21
- button[kjButton]:hover { border-color: var(--kj-accent); color: var(--kj-accent); }
22
- [kjPopoverContent] {
23
- position: absolute; top: calc(100% + 8px); left: 0; z-index: 20;
24
- background: var(--kj-surface); border: 1px solid var(--kj-border); padding: 1rem; min-width: 14rem;
25
- color: var(--kj-text);
26
- }
27
- [kjPopoverContent][hidden] { display: none; }
28
- [kjPopoverContent][data-align="end"] { left: auto; right: 0; }
29
- .popover-title { font-size: 0.875rem; font-weight: 600; margin: 0 0 0.5rem; color: var(--kj-accent); }
30
- .popover-body { font-size: 0.8125rem; color: var(--kj-text-muted); margin: 0 0 1rem; line-height: 1.5; }
31
- .popover-footer { display: flex; justify-content: flex-end; gap: 0.5rem; }
32
- .popover-footer button[kjButton] { padding: 0.35rem 0.875rem; font-size: 0.8125rem; }
33
- [data-variant="default"] { border-color: var(--kj-accent); color: var(--kj-accent-on); background: var(--kj-accent); }
34
- [data-variant="ghost"] { border-color: transparent; background: transparent; color: var(--kj-text-muted); }
35
- `],
36
- template: `
37
- <div class="anchor" kjPopover>
38
- <button kjButton kjPopoverTrigger>Open Popover</button>
39
- <div kjPopoverContent>
40
- <p class="popover-title">Notification Settings</p>
41
- <p class="popover-body">Control how and when you receive notifications from this app.</p>
42
- <div class="popover-footer">
43
- <button kjButton kjPopoverClose [kjVariant]="'ghost'">Cancel</button>
44
- <button kjButton kjPopoverClose [kjVariant]="'default'">Save</button>
45
- </div>
46
- </div>
47
- </div>
48
- `,
49
- })
50
- export class PopoverBasicExample {}
@@ -1,52 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import {
3
- KjPopover, KjPopoverTrigger,
4
- KjPopoverContent, KjPopoverClose,
5
- } from './popover';
6
-
7
- @Component({
8
- selector: 'kj-example-popover-finance',
9
- standalone: true,
10
- imports: [
11
- KjPopover, KjPopoverTrigger,
12
- KjPopoverContent, KjPopoverClose,
13
- ],
14
- styleUrls: ['../styles/docs-themes.css'],
15
- host: { class: 'kj-theme-finance' },
16
- styles: [`
17
- :host { display: flex; align-items: flex-start; justify-content: center; padding: 3rem 2rem 10rem; background: var(--kj-bg); font-family: var(--kj-font); min-height: 220px; }
18
- .anchor { position: relative; display: inline-block; }
19
- button {
20
- padding: 0.4rem 1rem; background: var(--kj-accent); color: var(--kj-accent-on); border: 1px solid var(--kj-accent);
21
- border-radius: var(--kj-radius-md); cursor: pointer; font-family: inherit; font-size: 0.875rem; font-weight: 500;
22
- }
23
- button:hover { background: #2563eb; }
24
- [kjPopoverContent] {
25
- position: absolute; top: calc(100% + 8px); left: 0; z-index: 20;
26
- background: var(--kj-surface); border: 1px solid var(--kj-border); border-radius: var(--kj-radius-lg);
27
- box-shadow: var(--kj-shadow-md); padding: 1rem; min-width: 14rem;
28
- }
29
- [kjPopoverContent][hidden] { display: none; }
30
- .popover-title { font-size: 0.875rem; font-weight: 600; color: var(--kj-text); margin: 0 0 0.375rem; }
31
- .popover-body { font-size: 0.8125rem; color: var(--kj-text-muted); margin: 0 0 1rem; line-height: 1.5; }
32
- .popover-footer { display: flex; justify-content: flex-end; gap: 0.5rem; }
33
- .btn-cancel { padding: 0.35rem 0.875rem; background: var(--kj-surface); color: #374151; border: 1px solid var(--kj-border); border-radius: var(--kj-radius-sm); cursor: pointer; font-size: 0.8125rem; font-weight: 500; }
34
- .btn-cancel:hover { background: #f3f4f6; }
35
- .btn-primary { padding: 0.35rem 0.875rem; background: var(--kj-accent); color: var(--kj-accent-on); border: 1px solid var(--kj-accent); border-radius: var(--kj-radius-sm); cursor: pointer; font-size: 0.8125rem; font-weight: 500; }
36
- .btn-primary:hover { background: #2563eb; }
37
- `],
38
- template: `
39
- <div class="anchor" kjPopover>
40
- <button kjPopoverTrigger>Preferences</button>
41
- <div kjPopoverContent>
42
- <p class="popover-title">Notification Preferences</p>
43
- <p class="popover-body">Choose how you receive alerts and account notifications.</p>
44
- <div class="popover-footer">
45
- <button class="btn-cancel" kjPopoverClose>Cancel</button>
46
- <button class="btn-primary" kjPopoverClose>Apply</button>
47
- </div>
48
- </div>
49
- </div>
50
- `,
51
- })
52
- export class PopoverFinanceExample {}
@@ -1,53 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import {
3
- KjPopover, KjPopoverTrigger,
4
- KjPopoverContent, KjPopoverClose,
5
- } from './popover';
6
-
7
- @Component({
8
- selector: 'kj-example-popover-retro',
9
- standalone: true,
10
- imports: [
11
- KjPopover, KjPopoverTrigger,
12
- KjPopoverContent, KjPopoverClose,
13
- ],
14
- styleUrls: ['../styles/docs-themes.css'],
15
- host: { class: 'kj-theme-retro' },
16
- styles: [`
17
- :host { display: flex; align-items: flex-start; justify-content: center; padding: 3rem 2rem 10rem; background: var(--kj-bg); font-family: var(--kj-font); min-height: 220px; color: var(--kj-text); }
18
- .anchor { position: relative; display: inline-block; }
19
- button {
20
- padding: 0.4rem 1rem; font-family: var(--kj-font); font-size: 0.8rem; font-weight: 700;
21
- letter-spacing: 0.06em; text-transform: uppercase; background: var(--kj-surface); color: var(--kj-text);
22
- border: var(--kj-btn-border); border-radius: 0; cursor: pointer;
23
- box-shadow: var(--kj-shadow-sm); transition: var(--kj-transition);
24
- }
25
- button:hover { transform: translate(-1px, -1px); box-shadow: var(--kj-shadow-md); }
26
- [kjPopoverContent] {
27
- position: absolute; top: calc(100% + 8px); left: 0; z-index: 20;
28
- background: var(--kj-bg); border: var(--kj-btn-border); box-shadow: var(--kj-shadow-hard);
29
- padding: 1rem; min-width: 14rem; font-family: var(--kj-font);
30
- }
31
- [kjPopoverContent][hidden] { display: none; }
32
- .popover-title { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; margin: 0 0 0.5rem; border-bottom: var(--kj-btn-border); padding-bottom: 0.375rem; color: var(--kj-text); }
33
- .popover-body { font-size: 0.75rem; color: var(--kj-text-muted); margin: 0.5rem 0 1rem; line-height: 1.6; }
34
- .popover-footer { display: flex; justify-content: flex-end; gap: 0.5rem; }
35
- .popover-footer button { padding: 0.3rem 0.75rem; font-size: 0.7rem; box-shadow: var(--kj-shadow-sm); }
36
- .popover-footer button:hover { box-shadow: var(--kj-shadow-md); }
37
- .btn-primary { background: var(--kj-accent); color: var(--kj-accent-on); border-color: var(--kj-border); }
38
- `],
39
- template: `
40
- <div class="anchor" kjPopover>
41
- <button kjPopoverTrigger>Settings</button>
42
- <div kjPopoverContent>
43
- <p class="popover-title">Notifications</p>
44
- <p class="popover-body">Configure notification frequency and delivery preferences.</p>
45
- <div class="popover-footer">
46
- <button kjPopoverClose>Cancel</button>
47
- <button kjPopoverClose class="btn-primary">Save</button>
48
- </div>
49
- </div>
50
- </div>
51
- `,
52
- })
53
- export class PopoverRetroExample {}
@@ -1,90 +0,0 @@
1
- import { Component, TemplateRef, ViewChild, ViewContainerRef, inject, OnInit } from '@angular/core';
2
- import { render } from '@testing-library/angular';
3
- import { KjOverlayService, KjOverlayRef } from './overlay';
4
-
5
- describe('KjOverlayService', () => {
6
- it('can be injected', async () => {
7
- @Component({ standalone: true, template: '' })
8
- class TestComponent {
9
- readonly svc = inject(KjOverlayService);
10
- }
11
- const { fixture } = await render(TestComponent);
12
- expect(fixture.componentInstance.svc).toBeTruthy();
13
- });
14
-
15
- it('createFromTemplate returns a KjOverlayRef with isOpen=false', async () => {
16
- @Component({
17
- standalone: true,
18
- template: '<ng-template #tpl><div>overlay content</div></ng-template>',
19
- })
20
- class TestComponent implements OnInit {
21
- @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
22
- readonly svc = inject(KjOverlayService);
23
- readonly vcr = inject(ViewContainerRef);
24
- ref!: KjOverlayRef;
25
- ngOnInit() { this.ref = this.svc.createFromTemplate(this.tpl, this.vcr); }
26
- }
27
- const { fixture } = await render(TestComponent);
28
- expect(fixture.componentInstance.ref.isOpen()).toBe(false);
29
- fixture.componentInstance.ref.dispose();
30
- });
31
-
32
- it('open() sets isOpen to true', async () => {
33
- @Component({
34
- standalone: true,
35
- template: '<ng-template #tpl><div>overlay</div></ng-template>',
36
- })
37
- class TestComponent implements OnInit {
38
- @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
39
- readonly svc = inject(KjOverlayService);
40
- readonly vcr = inject(ViewContainerRef);
41
- ref!: KjOverlayRef;
42
- ngOnInit() { this.ref = this.svc.createFromTemplate(this.tpl, this.vcr); }
43
- }
44
- const { fixture } = await render(TestComponent);
45
- const ref = fixture.componentInstance.ref;
46
- ref.open();
47
- expect(ref.isOpen()).toBe(true);
48
- ref.dispose();
49
- });
50
-
51
- it('close() sets isOpen to false', async () => {
52
- @Component({
53
- standalone: true,
54
- template: '<ng-template #tpl><div>overlay</div></ng-template>',
55
- })
56
- class TestComponent implements OnInit {
57
- @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
58
- readonly svc = inject(KjOverlayService);
59
- readonly vcr = inject(ViewContainerRef);
60
- ref!: KjOverlayRef;
61
- ngOnInit() { this.ref = this.svc.createFromTemplate(this.tpl, this.vcr); }
62
- }
63
- const { fixture } = await render(TestComponent);
64
- const ref = fixture.componentInstance.ref;
65
- ref.open();
66
- ref.close();
67
- expect(ref.isOpen()).toBe(false);
68
- ref.dispose();
69
- });
70
-
71
- it('dispose() removes the overlay container from document.body', async () => {
72
- @Component({
73
- standalone: true,
74
- template: '<ng-template #tpl><div>overlay</div></ng-template>',
75
- })
76
- class TestComponent implements OnInit {
77
- @ViewChild('tpl', { static: true }) tpl!: TemplateRef<unknown>;
78
- readonly svc = inject(KjOverlayService);
79
- readonly vcr = inject(ViewContainerRef);
80
- ref!: KjOverlayRef;
81
- ngOnInit() { this.ref = this.svc.createFromTemplate(this.tpl, this.vcr); }
82
- }
83
- const { fixture } = await render(TestComponent);
84
- const ref = fixture.componentInstance.ref;
85
- ref.open();
86
- expect(document.body.querySelector('[data-kj-overlay]')).toBeTruthy();
87
- ref.dispose();
88
- expect(document.body.querySelector('[data-kj-overlay]')).toBeNull();
89
- });
90
- });
@@ -1,106 +0,0 @@
1
- import {
2
- Injectable, inject, signal,
3
- EmbeddedViewRef, ApplicationRef, TemplateRef, ViewContainerRef,
4
- } from '@angular/core';
5
-
6
- /**
7
- * Managed wrapper around a DOM overlay container.
8
- * Provides `isOpen` as a signal and lifecycle methods.
9
- *
10
- * Create instances via {@link KjOverlayService} — do not construct directly.
11
- *
12
- * @example
13
- * ```ts
14
- * const ref = inject(KjOverlayService).createFromTemplate(tpl, vcr);
15
- * ref.open();
16
- * ```
17
- */
18
- export class KjOverlayRef {
19
- private readonly _isOpen = signal(false);
20
-
21
- /** Whether the overlay is currently open. */
22
- readonly isOpen = this._isOpen.asReadonly();
23
-
24
- constructor(
25
- private readonly container: HTMLElement,
26
- private readonly viewRef: EmbeddedViewRef<unknown>,
27
- private readonly appRef: ApplicationRef,
28
- ) {}
29
-
30
- /** Shows the overlay container. */
31
- open(): void {
32
- this._isOpen.set(true);
33
- this.container.removeAttribute('hidden');
34
- }
35
-
36
- /** Hides the overlay container. */
37
- close(): void {
38
- this._isOpen.set(false);
39
- this.container.setAttribute('hidden', '');
40
- }
41
-
42
- /** Toggles the overlay between open and closed states. */
43
- toggle(): void {
44
- if (this.isOpen()) {
45
- this.close();
46
- } else {
47
- this.open();
48
- }
49
- }
50
-
51
- /**
52
- * Permanently removes the overlay from the DOM and destroys the view.
53
- * Call inside `DestroyRef.onDestroy()` to prevent memory leaks.
54
- */
55
- dispose(): void {
56
- this.appRef.detachView(this.viewRef);
57
- this.viewRef.destroy();
58
- this.container.remove();
59
- }
60
-
61
- /** The underlying container `HTMLElement` for advanced usage. */
62
- get el(): HTMLElement {
63
- return this.container;
64
- }
65
- }
66
-
67
- /**
68
- * Factory service for creating managed overlay containers.
69
- * Creates a container appended to `document.body`.
70
- *
71
- * @example
72
- * ```ts
73
- * // Dialog — full-screen backdrop overlay
74
- * const ref = inject(KjOverlayService).createFromTemplate(tpl, vcr);
75
- * ref.open();
76
- *
77
- * // Clean up when done
78
- * ref.dispose();
79
- * ```
80
- */
81
- @Injectable({ providedIn: 'root' })
82
- export class KjOverlayService {
83
- private readonly appRef = inject(ApplicationRef);
84
-
85
- /**
86
- * Creates an overlay from an Angular template ref.
87
- * The container is appended to `document.body` and starts hidden.
88
- *
89
- * @param tpl - The `TemplateRef` to render inside the overlay.
90
- * @param vcr - The `ViewContainerRef` used to create the embedded view.
91
- * @returns A {@link KjOverlayRef} managing the created overlay.
92
- */
93
- createFromTemplate(tpl: TemplateRef<unknown>, vcr: ViewContainerRef): KjOverlayRef {
94
- // Use TemplateRef.createEmbeddedView directly so the view is not pre-attached
95
- // to the VCR's container — ApplicationRef can own the view lifecycle.
96
- const viewRef = tpl.createEmbeddedView(null as never, vcr.injector);
97
- this.appRef.attachView(viewRef);
98
-
99
- const container = document.createElement('div');
100
- container.setAttribute('data-kj-overlay', '');
101
- viewRef.rootNodes.forEach(node => container.appendChild(node));
102
- document.body.appendChild(container);
103
-
104
- return new KjOverlayRef(container, viewRef, this.appRef);
105
- }
106
- }
@@ -1,3 +0,0 @@
1
- import { InjectionToken, Signal } from '@angular/core';
2
- export interface KjSelectContext { value: Signal<unknown>; open: Signal<boolean>; select: (value: unknown) => void; toggle: () => void; hide: () => void; }
3
- export const KJ_SELECT = new InjectionToken<KjSelectContext>('KjSelect');