@kouji-ui/core 0.0.3 → 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 +6 -3
  2. package/CHANGELOG.md +177 -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 +14 -6
  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 +102 -43
  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 +178 -25
  472. package/src/toast/toast.strategy.ts +10 -0
  473. package/src/toast/toast.ts +178 -22
  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 -102
  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
@@ -1,8 +1,9 @@
1
1
  import {
2
- DestroyRef, Directive, ElementRef, TemplateRef,
3
- afterNextRender, computed, inject, input, signal,
2
+ ChangeDetectionStrategy, Component, DestroyRef, Directive, ElementRef, TemplateRef, ViewEncapsulation,
3
+ afterNextRender, booleanAttribute, computed, inject, input, signal,
4
4
  } from '@angular/core';
5
- import { KjToastContext, KjToastService, KjToastTemplateContext, KjToastVariant } from './toast.service';
5
+ import { KjOverlayPanel } from '../primitives/overlay/panel';
6
+ import { KjToastService, KjToastTemplateContext, KjToastVariant } from './toast.service';
6
7
  import { KJ_TOAST_STRATEGY } from './toast.strategy';
7
8
  import { KjToastPositionX, KjToastPositionY } from './toast.types';
8
9
 
@@ -38,7 +39,7 @@ export type { KjToastPositionX, KjToastPositionY } from './toast.types';
38
39
  * </div>
39
40
  * </ng-template>
40
41
  * ```
41
- * @category Core/Overlays
42
+ * @doc-category Core/Overlay
42
43
  */
43
44
  @Directive({
44
45
  selector: '[kjToast]',
@@ -48,6 +49,7 @@ export type { KjToastPositionX, KjToastPositionY } from './toast.types';
48
49
  '[attr.aria-atomic]': '"true"',
49
50
  '[attr.data-variant]': 'kjToastVariant()',
50
51
  '[attr.data-front]': 'isFront()',
52
+ '[attr.data-toast-id]': 'kjToastId()',
51
53
  '[style.--kj-toast-index]': 'index()',
52
54
  '[style.--kj-toast-before]': 'before()',
53
55
  '[style.--kj-toast-after]': 'after()',
@@ -112,9 +114,12 @@ export class KjToast {
112
114
  const measure = () => this._height.set(Math.round(node.getBoundingClientRect().height));
113
115
  measure();
114
116
  // Use border-box geometry via getBoundingClientRect — contentRect strips padding.
115
- const ro = new ResizeObserver(measure);
116
- ro.observe(node);
117
- this.destroyRef.onDestroy(() => ro.disconnect());
117
+ // Guard ResizeObserver for SSR / older test environments.
118
+ if (typeof ResizeObserver !== 'undefined') {
119
+ const ro = new ResizeObserver(measure);
120
+ ro.observe(node);
121
+ this.destroyRef.onDestroy(() => ro.disconnect());
122
+ }
118
123
  });
119
124
  }
120
125
  }
@@ -159,7 +164,7 @@ export interface KjToastRenderable<TData = unknown> {
159
164
  * }
160
165
  * </ol>
161
166
  * ```
162
- * @category Core/Overlays
167
+ * @doc-category Core/Overlay
163
168
  */
164
169
  @Directive({
165
170
  selector: '[kjToastViewport]',
@@ -167,6 +172,7 @@ export interface KjToastRenderable<TData = unknown> {
167
172
  exportAs: 'kjToastViewport',
168
173
  host: {
169
174
  'role': 'region',
175
+ 'tabindex': '-1',
170
176
  '[attr.aria-live]': '"polite"',
171
177
  '[attr.aria-atomic]': '"false"',
172
178
  '[attr.aria-relevant]': '"additions removals"',
@@ -177,10 +183,10 @@ export interface KjToastRenderable<TData = unknown> {
177
183
  '[style.--kj-toast-z-index]': 'kjToastBaseZIndex()',
178
184
  '[style.--kj-toasts-count]': 'renderable().length',
179
185
  '[style.--kj-toast-front-height]': 'frontHeightPx()',
180
- '(mouseenter)': 'onHover(true)',
181
- '(mouseleave)': 'onHover(false)',
182
- '(focusin)': 'onHover(true)',
183
- '(focusout)': 'onHover(false)',
186
+ '(mouseenter)': 'onPointerEnter()',
187
+ '(mouseleave)': 'onPointerLeave()',
188
+ '(focusin)': 'onFocusIn($event)',
189
+ '(focusout)': 'onFocusOut($event)',
184
190
  },
185
191
  })
186
192
  export class KjToastViewport {
@@ -214,7 +220,24 @@ export class KjToastViewport {
214
220
  */
215
221
  readonly kjToastExpand = input<boolean | undefined>(undefined);
216
222
 
223
+ /**
224
+ * When `true` (default), hover/focus on the viewport pauses every in-flight
225
+ * auto-dismiss timer via `KjToastService.pause('hover'|'focus')`. Required
226
+ * for WCAG 2.2.1 (AAA) and 1.4.13. Distinct from visual stacking expansion
227
+ * (`kjToastExpand` / `strategy.expandOnHover`). Defaults from the active
228
+ * `KjToastStrategy.pauseOnHover`.
229
+ */
230
+ readonly kjToastPauseOnHover = input<boolean, unknown>(this.strategy.pauseOnHover, {
231
+ transform: booleanAttribute,
232
+ });
233
+
217
234
  private readonly _hovered = signal(false);
235
+ /** Tracks pointer-driven pause state so resume() runs exactly once per enter/leave pair. */
236
+ private pointerPauseHeld = false;
237
+ /** Tracks focus-driven pause state — independent ref so blur after re-enter doesn't double-resume. */
238
+ private focusPauseHeld = false;
239
+ /** Element to restore focus to when F6/Escape leaves the viewport. */
240
+ private previouslyFocused: HTMLElement | null = null;
218
241
 
219
242
  /** Resolved expand state — explicit input wins; otherwise falls back to hover when the strategy enables it. */
220
243
  readonly expanded = computed(() => {
@@ -223,8 +246,72 @@ export class KjToastViewport {
223
246
  return this.strategy.expandOnHover && this._hovered();
224
247
  });
225
248
 
226
- protected onHover(state: boolean): void {
227
- if (this.strategy.expandOnHover) this._hovered.set(state);
249
+ protected onPointerEnter(): void {
250
+ if (this.strategy.expandOnHover) this._hovered.set(true);
251
+ if (this.kjToastPauseOnHover() && !this.pointerPauseHeld) {
252
+ this.pointerPauseHeld = true;
253
+ this.svc.pause('hover');
254
+ }
255
+ }
256
+
257
+ protected onPointerLeave(): void {
258
+ if (this.strategy.expandOnHover) this._hovered.set(false);
259
+ if (this.pointerPauseHeld) {
260
+ this.pointerPauseHeld = false;
261
+ this.svc.resume('hover');
262
+ }
263
+ }
264
+
265
+ protected onFocusIn(event: FocusEvent): void {
266
+ if (this.strategy.expandOnHover) this._hovered.set(true);
267
+ // Capture the *external* focus owner so F6/Escape can restore. Only the
268
+ // first focusin counts — subsequent focus moves *within* the viewport
269
+ // (e.g. Tab between toasts) must not overwrite the restore target.
270
+ if (!this.focusPauseHeld) {
271
+ const previous = event.relatedTarget as HTMLElement | null;
272
+ const root = this.el.nativeElement;
273
+ // relatedTarget can be null on programmatic focus; fall back to
274
+ // document.activeElement if it's outside the viewport.
275
+ if (previous && !root.contains(previous)) {
276
+ this.previouslyFocused = previous;
277
+ }
278
+ }
279
+ if (this.kjToastPauseOnHover() && !this.focusPauseHeld) {
280
+ this.focusPauseHeld = true;
281
+ this.svc.pause('focus');
282
+ }
283
+ }
284
+
285
+ protected onFocusOut(event: FocusEvent): void {
286
+ const root = this.el.nativeElement;
287
+ const next = event.relatedTarget as HTMLElement | null;
288
+ // focusout fires for every internal focus move; only count *real* exits
289
+ // — the new focus target is null or outside the viewport root.
290
+ if (next && root.contains(next)) return;
291
+ if (this.strategy.expandOnHover) this._hovered.set(false);
292
+ if (this.focusPauseHeld) {
293
+ this.focusPauseHeld = false;
294
+ this.svc.resume('focus');
295
+ }
296
+ }
297
+
298
+ private focusFrontToast(): void {
299
+ const root = this.el.nativeElement as HTMLElement;
300
+ // Front-most toast is the *last* in DOM order (newest). Prefer the first
301
+ // focusable inside it; fall back to the toast element itself.
302
+ const fronts = root.querySelectorAll('[kjToast][data-front="true"]');
303
+ const front = fronts.length > 0 ? (fronts[fronts.length - 1] as HTMLElement) : null;
304
+ if (!front) return;
305
+ const focusable = front.querySelector(
306
+ 'button:not([disabled]), [href], input:not([disabled]), [tabindex]:not([tabindex="-1"])',
307
+ ) as HTMLElement | null;
308
+ (focusable ?? front).focus();
309
+ }
310
+
311
+ private restorePreviousFocus(): void {
312
+ const target = this.previouslyFocused;
313
+ this.previouslyFocused = null;
314
+ if (target && typeof target.focus === 'function') target.focus();
228
315
  }
229
316
 
230
317
  /** Live list of queued toasts (uncapped). */
@@ -259,6 +346,49 @@ export class KjToastViewport {
259
346
  });
260
347
 
261
348
  constructor() {
349
+ // Register the F6 / Escape document-level listener eagerly — registering
350
+ // from `afterNextRender` was too late for tests that dispatch immediately
351
+ // after `service.show()`. Sonner uses the same pattern of a long-lived
352
+ // top-level listener. Handles both directions of F6 (outside → in,
353
+ // inside → out) and Escape (dismiss focused toast + restore focus) so
354
+ // there is exactly one source of truth — host listeners would race the
355
+ // document listener over the same event.
356
+ const doc = (typeof document !== 'undefined' ? document : null);
357
+ if (doc) {
358
+ const onDocKeydown = (event: KeyboardEvent) => {
359
+ if (event.key !== 'F6' && event.key !== 'Escape') return;
360
+ if (this.svc.toasts().length === 0) return;
361
+ const root = this.el.nativeElement as HTMLElement;
362
+ const active = doc.activeElement as HTMLElement | null;
363
+ const inside = active != null && root.contains(active);
364
+ if (event.key === 'F6') {
365
+ if (inside) {
366
+ event.preventDefault();
367
+ this.restorePreviousFocus();
368
+ return;
369
+ }
370
+ event.preventDefault();
371
+ this.previouslyFocused = active;
372
+ this.focusFrontToast();
373
+ return;
374
+ }
375
+ // Escape: only act when focus is inside the viewport so we don't
376
+ // hijack the consumer's other Escape affordances.
377
+ if (event.key === 'Escape' && inside) {
378
+ event.preventDefault();
379
+ const target = event.target as HTMLElement | null;
380
+ const toastEl = (target?.closest('[kjToast]')) as HTMLElement | null;
381
+ const id = toastEl?.getAttribute('data-toast-id')
382
+ ?? this.svc.toasts().at(-1)?.id
383
+ ?? null;
384
+ this.restorePreviousFocus();
385
+ if (id) this.svc.dismiss(id);
386
+ }
387
+ };
388
+ doc.addEventListener('keydown', onDocKeydown);
389
+ this.destroyRef.onDestroy(() => doc.removeEventListener('keydown', onDocKeydown));
390
+ }
391
+
262
392
  afterNextRender(() => {
263
393
  const root = this.el.nativeElement as HTMLElement;
264
394
  const measure = () => {
@@ -267,13 +397,20 @@ export class KjToastViewport {
267
397
  this._frontHeight.set(Math.round(front.getBoundingClientRect().height));
268
398
  };
269
399
  measure();
270
- const ro = new ResizeObserver(measure);
271
- // Observe the viewport — children added/resized trigger remeasure.
272
- ro.observe(root);
273
- // MutationObserver picks up new children (data-front="true" added on a new toast).
274
- const mo = new MutationObserver(measure);
275
- mo.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-front'] });
276
- this.destroyRef.onDestroy(() => { ro.disconnect(); mo.disconnect(); });
400
+ // Guard ResizeObserver / MutationObserver for SSR + older test envs.
401
+ let ro: ResizeObserver | undefined;
402
+ let mo: MutationObserver | undefined;
403
+ if (typeof ResizeObserver !== 'undefined') {
404
+ ro = new ResizeObserver(measure);
405
+ // Observe the viewport children added/resized trigger remeasure.
406
+ ro.observe(root);
407
+ }
408
+ if (typeof MutationObserver !== 'undefined') {
409
+ // MutationObserver picks up new children (data-front="true" added on a new toast).
410
+ mo = new MutationObserver(measure);
411
+ mo.observe(root, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-front'] });
412
+ }
413
+ this.destroyRef.onDestroy(() => { ro?.disconnect(); mo?.disconnect(); });
277
414
  });
278
415
  }
279
416
  }
@@ -287,12 +424,13 @@ export class KjToastViewport {
287
424
  * ```html
288
425
  * <button [kjToastClose]="toast.id" aria-label="Dismiss">×</button>
289
426
  * ```
290
- * @category Core/Overlays
427
+ * @doc-category Core/Overlay
291
428
  */
292
429
  @Directive({
293
430
  selector: '[kjToastClose]',
294
431
  standalone: true,
295
432
  host: {
433
+ 'class': 'kj-toast-close',
296
434
  '(click)': 'dismiss()',
297
435
  },
298
436
  })
@@ -305,3 +443,21 @@ export class KjToastClose {
305
443
  this.svc.dismiss(this.kjToastClose());
306
444
  }
307
445
  }
446
+
447
+ /**
448
+ * Service-launched toast panel. Composes `KjOverlayPanel` as a host directive
449
+ * so the overlay primitives wire role/state/aria management. The role is
450
+ * decided by the service via `KJ_OVERLAY_PANEL_ROLE` (`status` or `alert`).
451
+ *
452
+ * @doc-category Core/Overlay
453
+ */
454
+ @Component({
455
+ selector: 'kj-toast',
456
+ standalone: true,
457
+ hostDirectives: [{ directive: KjOverlayPanel }],
458
+ changeDetection: ChangeDetectionStrategy.OnPush,
459
+ encapsulation: ViewEncapsulation.None,
460
+ host: { class: 'kj-toast' },
461
+ template: `<ng-content />`,
462
+ })
463
+ export class KjToastPanel {}
@@ -1,14 +1,22 @@
1
- import { Directive, inject, model } from '@angular/core';
1
+ import { Directive, inject, model } from '@angular/core';
2
2
  import { KjDisabled, KjFocusRing, KjFormControl } from '../primitives';
3
3
 
4
4
  /**
5
5
  * Adds toggle (press) behavior with Angular forms integration.
6
6
  *
7
+ * Reflects `aria-pressed` and `data-pressed` and integrates with reactive and
8
+ * template-driven forms so the pressed state participates as a regular form
9
+ * value alongside other inputs.
10
+ *
7
11
  * @example
8
12
  * ```html
9
13
  * <button kjToggle [(kjPressed)]="isBold" aria-label="Bold">B</button>
10
14
  * ```
11
- * @category Core/Inputs
15
+ * @doc-category Core/Inputs
16
+ * @doc
17
+ * @doc-name toggle
18
+ * @doc-description Adds press/unpress toggle behaviour to any focusable element with Angular forms support.
19
+ * @doc-is-main
12
20
  */
13
21
  @Directive({
14
22
  selector: '[kjToggle]',
@@ -0,0 +1,6 @@
1
+ // AUTO-GENERATED by scripts/migrate-examples.mjs
2
+ // One barrel per component folder — used by the docs app as a lazy chunk.
3
+ export { TooltipBasicExample } from './tooltip.example';
4
+ export { TooltipFinanceExample } from './tooltip.finance.example';
5
+ export { TooltipPlacementsExample } from './tooltip.placements.example';
6
+ export { TooltipRetroExample } from './tooltip.retro.example';
@@ -0,0 +1,82 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjTooltipTrigger, KjTooltipContent } from '../tooltip';
3
+ import { KjButton } from '../../button/button';
4
+
5
+ @Component({
6
+ selector: 'kj-example-tooltip-basic',
7
+ standalone: true,
8
+ imports: [KjTooltipTrigger, KjTooltipContent, KjButton],
9
+ styleUrls: ['../../styles/docs-themes.css'],
10
+ styles: [
11
+ `
12
+ :host {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ padding: 5rem 3rem;
17
+ background: var(--kj-bg);
18
+ font-family: var(--kj-font);
19
+ min-height: 180px;
20
+ }
21
+ .row {
22
+ display: flex;
23
+ gap: 1.5rem;
24
+ flex-wrap: wrap;
25
+ align-items: center;
26
+ justify-content: center;
27
+ }
28
+ button[kjButton] {
29
+ padding: 0.5rem 1.25rem;
30
+ font-family: var(--kj-font);
31
+ font-size: 0.875rem;
32
+ border: var(--kj-btn-border);
33
+ cursor: pointer;
34
+ transition: var(--kj-transition);
35
+ }
36
+ [data-variant='default'] {
37
+ background: var(--kj-accent);
38
+ color: var(--kj-accent-on);
39
+ }
40
+ [data-variant='link'] {
41
+ background: transparent;
42
+ color: var(--kj-accent);
43
+ border: none;
44
+ padding: 0.5rem 0.5rem;
45
+ text-decoration: none;
46
+ text-underline-offset: 4px;
47
+ }
48
+ [data-variant='link']:hover {
49
+ text-decoration: underline;
50
+ }
51
+ [data-variant='ghost'] {
52
+ background: transparent;
53
+ color: var(--kj-btn-ghost-color);
54
+ }
55
+ :global(kj-tooltip-content) {
56
+ background: var(--kj-accent);
57
+ color: var(--kj-accent-on);
58
+ padding: 0.25rem 0.625rem;
59
+ font-size: 0.75rem;
60
+ white-space: nowrap;
61
+ pointer-events: none;
62
+ transition: var(--kj-transition);
63
+ }
64
+ `,
65
+ ],
66
+ changeDetection: ChangeDetectionStrategy.Eager,
67
+ template: `
68
+ <div class="row">
69
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #t1="kjTooltipTrigger">
70
+ Default
71
+ </button>
72
+ <kj-tooltip-content [kjFor]="t1">Copy to clipboard</kj-tooltip-content>
73
+
74
+ <button kjButton [kjVariant]="'link'" kjTooltipTrigger #t2="kjTooltipTrigger">Link</button>
75
+ <kj-tooltip-content [kjFor]="t2" [kjSide]="'bottom'">Opens below</kj-tooltip-content>
76
+
77
+ <button kjButton [kjVariant]="'ghost'" kjTooltipTrigger #t3="kjTooltipTrigger">Ghost</button>
78
+ <kj-tooltip-content [kjFor]="t3" [kjSide]="'right'">Opens right</kj-tooltip-content>
79
+ </div>
80
+ `,
81
+ })
82
+ export class TooltipBasicExample {}
@@ -0,0 +1,97 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjTooltipTrigger, KjTooltipContent } from '../tooltip';
3
+ import { KjButton } from '../../button/button';
4
+
5
+ @Component({
6
+ selector: 'kj-example-tooltip-finance',
7
+ standalone: true,
8
+ imports: [KjTooltipTrigger, KjTooltipContent, KjButton],
9
+ styleUrls: ['../../styles/docs-themes.css'],
10
+ /* Closed-state `display:none` for portaled `kj-tooltip-content` comes from
11
+ * `packages/components/src/tooltip/tooltip.css` (docs app global styles) — not repeated here. */
12
+ styles: [
13
+ `
14
+ :host {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ padding: 5rem 3rem;
19
+ background: var(--kj-bg);
20
+ font-family: var(--kj-font);
21
+ min-height: 180px;
22
+ color: var(--kj-text);
23
+ }
24
+ .row {
25
+ display: flex;
26
+ gap: 1.5rem;
27
+ flex-wrap: wrap;
28
+ align-items: center;
29
+ justify-content: center;
30
+ }
31
+ button[kjButton] {
32
+ padding: 4px 15px;
33
+ font-family: var(--kj-font);
34
+ font-size: 14px;
35
+ font-weight: 400;
36
+ border: 1px solid transparent;
37
+ border-radius: 6px;
38
+ cursor: pointer;
39
+ transition: var(--kj-transition);
40
+ line-height: 1.5;
41
+ }
42
+ button[kjButton][data-variant='default'] {
43
+ background: var(--kj-accent);
44
+ color: var(--kj-accent-on);
45
+ border-color: var(--kj-accent);
46
+ }
47
+ button[kjButton][data-variant='default']:hover {
48
+ background: #4096ff;
49
+ border-color: #4096ff;
50
+ }
51
+ button[kjButton][data-variant='link'] {
52
+ background: transparent;
53
+ color: var(--kj-accent);
54
+ border-color: transparent;
55
+ }
56
+ button[kjButton][data-variant='link']:hover {
57
+ color: #4096ff;
58
+ }
59
+ button[kjButton][data-variant='ghost'] {
60
+ background: transparent;
61
+ color: var(--kj-text);
62
+ border: 1px solid var(--kj-text);
63
+ }
64
+ button[kjButton][data-variant='ghost']:hover {
65
+ color: var(--kj-accent);
66
+ border-color: var(--kj-accent);
67
+ }
68
+ :global(kj-tooltip-content) {
69
+ background: #1f2937;
70
+ color: #f9fafb;
71
+ padding: 0.3rem 0.625rem;
72
+ font-size: 0.75rem;
73
+ border-radius: var(--kj-radius-sm);
74
+ white-space: nowrap;
75
+ pointer-events: none;
76
+ box-shadow: var(--kj-shadow-sm);
77
+ }
78
+ `,
79
+ ],
80
+ host: { class: 'kj-theme-finance' },
81
+ changeDetection: ChangeDetectionStrategy.Eager,
82
+ template: `
83
+ <div class="row">
84
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #t1="kjTooltipTrigger">
85
+ Default
86
+ </button>
87
+ <kj-tooltip-content [kjFor]="t1">Copy to clipboard</kj-tooltip-content>
88
+
89
+ <button kjButton [kjVariant]="'link'" kjTooltipTrigger #t2="kjTooltipTrigger">Link</button>
90
+ <kj-tooltip-content [kjFor]="t2" [kjSide]="'bottom'">Opens below</kj-tooltip-content>
91
+
92
+ <button kjButton [kjVariant]="'ghost'" kjTooltipTrigger #t3="kjTooltipTrigger">Ghost</button>
93
+ <kj-tooltip-content [kjFor]="t3" [kjSide]="'right'">Opens right</kj-tooltip-content>
94
+ </div>
95
+ `,
96
+ })
97
+ export class TooltipFinanceExample {}
@@ -0,0 +1,83 @@
1
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
2
+ import { KjTooltipTrigger, KjTooltipContent } from '../tooltip';
3
+ import { KjButton } from '../../button/button';
4
+
5
+ @Component({
6
+ selector: 'kj-example-tooltip-placements',
7
+ standalone: true,
8
+ imports: [KjTooltipTrigger, KjTooltipContent, KjButton],
9
+ styleUrls: ['../../styles/docs-themes.css'],
10
+ styles: [
11
+ `
12
+ :host {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ padding: 5rem 4rem;
17
+ background: var(--kj-bg);
18
+ font-family: var(--kj-font);
19
+ min-height: 220px;
20
+ }
21
+ .grid {
22
+ display: grid;
23
+ grid-template-columns: 1fr 1fr 1fr;
24
+ grid-template-rows: auto auto auto;
25
+ gap: 0.75rem;
26
+ place-items: center;
27
+ }
28
+ button[kjButton] {
29
+ padding: 0.5rem 1.25rem;
30
+ font-family: var(--kj-font);
31
+ font-size: 0.875rem;
32
+ border: var(--kj-btn-border);
33
+ cursor: pointer;
34
+ transition: var(--kj-transition);
35
+ }
36
+ [data-variant='default'] {
37
+ background: var(--kj-accent);
38
+ color: var(--kj-accent-on);
39
+ }
40
+ .empty {
41
+ width: 80px;
42
+ }
43
+ :global(kj-tooltip-content) {
44
+ background: var(--kj-accent);
45
+ color: var(--kj-accent-on);
46
+ padding: 0.25rem 0.625rem;
47
+ font-size: 0.75rem;
48
+ white-space: nowrap;
49
+ pointer-events: none;
50
+ transition: var(--kj-transition);
51
+ }
52
+ `,
53
+ ],
54
+ changeDetection: ChangeDetectionStrategy.Eager,
55
+ template: `
56
+ <div class="grid">
57
+ <div class="empty"></div>
58
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #tTop="kjTooltipTrigger">
59
+ Top
60
+ </button>
61
+ <kj-tooltip-content [kjFor]="tTop" [kjSide]="'top'">Top tooltip</kj-tooltip-content>
62
+ <div class="empty"></div>
63
+
64
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #tLeft="kjTooltipTrigger">
65
+ Left
66
+ </button>
67
+ <kj-tooltip-content [kjFor]="tLeft" [kjSide]="'left'">Left tooltip</kj-tooltip-content>
68
+ <div class="empty"></div>
69
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #tRight="kjTooltipTrigger">
70
+ Right
71
+ </button>
72
+ <kj-tooltip-content [kjFor]="tRight" [kjSide]="'right'">Right tooltip</kj-tooltip-content>
73
+
74
+ <div class="empty"></div>
75
+ <button kjButton [kjVariant]="'default'" kjTooltipTrigger #tBot="kjTooltipTrigger">
76
+ Bottom
77
+ </button>
78
+ <kj-tooltip-content [kjFor]="tBot" [kjSide]="'bottom'">Bottom tooltip</kj-tooltip-content>
79
+ <div class="empty"></div>
80
+ </div>
81
+ `,
82
+ })
83
+ export class TooltipPlacementsExample {}