@kouji-ui/core 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (535) hide show
  1. package/fesm2022/kouji-ui-core.mjs +26789 -0
  2. package/fesm2022/kouji-ui-core.mjs.map +1 -0
  3. package/package.json +5 -6
  4. package/types/kouji-ui-core.d.ts +13545 -0
  5. package/.turbo/turbo-build.log +0 -30
  6. package/CHANGELOG.md +0 -190
  7. package/ng-package.json +0 -11
  8. package/src/a11y/.gitkeep +0 -0
  9. package/src/a11y/aria-describedby.spec.ts +0 -55
  10. package/src/a11y/aria-describedby.ts +0 -37
  11. package/src/a11y/aria-labelledby.spec.ts +0 -55
  12. package/src/a11y/aria-labelledby.ts +0 -38
  13. package/src/a11y/focus-trap.spec.ts +0 -86
  14. package/src/a11y/focus-trap.ts +0 -72
  15. package/src/a11y/index.ts +0 -10
  16. package/src/a11y/live-region.spec.ts +0 -58
  17. package/src/a11y/live-region.ts +0 -50
  18. package/src/a11y/roving-tabindex.spec.ts +0 -201
  19. package/src/a11y/roving-tabindex.ts +0 -153
  20. package/src/a11y/visually-hidden.spec.ts +0 -34
  21. package/src/a11y/visually-hidden.ts +0 -26
  22. package/src/accordion/accordion.context.ts +0 -44
  23. package/src/accordion/accordion.spec.ts +0 -242
  24. package/src/accordion/accordion.ts +0 -401
  25. package/src/accordion/index.ts +0 -8
  26. package/src/alert/alert.context.ts +0 -28
  27. package/src/alert/alert.spec.ts +0 -217
  28. package/src/alert/alert.ts +0 -417
  29. package/src/alert/config.ts +0 -46
  30. package/src/alert/index.ts +0 -19
  31. package/src/avatar/avatar-group.context.ts +0 -45
  32. package/src/avatar/avatar-group.spec.ts +0 -358
  33. package/src/avatar/avatar-group.ts +0 -259
  34. package/src/avatar/avatar.spec.ts +0 -18
  35. package/src/avatar/avatar.ts +0 -39
  36. package/src/avatar/index.ts +0 -11
  37. package/src/badge/badge.spec.ts +0 -28
  38. package/src/badge/badge.ts +0 -35
  39. package/src/badge/index.ts +0 -1
  40. package/src/breadcrumb/breadcrumb-current.ts +0 -38
  41. package/src/breadcrumb/breadcrumb-ellipsis.ts +0 -71
  42. package/src/breadcrumb/breadcrumb-item.ts +0 -41
  43. package/src/breadcrumb/breadcrumb-link.ts +0 -44
  44. package/src/breadcrumb/breadcrumb-list.ts +0 -42
  45. package/src/breadcrumb/breadcrumb-separator.ts +0 -45
  46. package/src/breadcrumb/breadcrumb.context.ts +0 -45
  47. package/src/breadcrumb/breadcrumb.spec.ts +0 -354
  48. package/src/breadcrumb/breadcrumb.ts +0 -239
  49. package/src/breadcrumb/config.ts +0 -84
  50. package/src/breadcrumb/index.ts +0 -18
  51. package/src/button/_examples/button.example.ts +0 -71
  52. package/src/button/_examples/button.finance.example.ts +0 -83
  53. package/src/button/_examples/button.retro.example.ts +0 -91
  54. package/src/button/_examples/button.sizes.example.ts +0 -60
  55. package/src/button/_examples/index.ts +0 -6
  56. package/src/button/button.spec.ts +0 -163
  57. package/src/button/button.ts +0 -142
  58. package/src/button/config.spec.ts +0 -33
  59. package/src/button/config.ts +0 -45
  60. package/src/button/index.ts +0 -2
  61. package/src/button-group/button-group.context.ts +0 -28
  62. package/src/button-group/button-group.spec.ts +0 -99
  63. package/src/button-group/button-group.ts +0 -99
  64. package/src/button-group/index.ts +0 -2
  65. package/src/calendar/calendar-day.ts +0 -102
  66. package/src/calendar/calendar-grid.ts +0 -90
  67. package/src/calendar/calendar-header.ts +0 -65
  68. package/src/calendar/calendar.context.ts +0 -53
  69. package/src/calendar/calendar.spec.ts +0 -225
  70. package/src/calendar/calendar.ts +0 -233
  71. package/src/calendar/date-utils.ts +0 -225
  72. package/src/calendar/index.ts +0 -28
  73. package/src/carousel/carousel.context.ts +0 -81
  74. package/src/carousel/carousel.spec.ts +0 -337
  75. package/src/carousel/carousel.ts +0 -919
  76. package/src/carousel/index.ts +0 -22
  77. package/src/cascade-select/cascade-select-option.ts +0 -205
  78. package/src/cascade-select/cascade-select-panel.ts +0 -106
  79. package/src/cascade-select/cascade-select-root.ts +0 -265
  80. package/src/cascade-select/cascade-select-sub-panel.ts +0 -168
  81. package/src/cascade-select/cascade-select-trigger.ts +0 -44
  82. package/src/cascade-select/cascade-select.context.ts +0 -71
  83. package/src/cascade-select/cascade-select.spec.ts +0 -241
  84. package/src/cascade-select/cascade-select.ts +0 -5
  85. package/src/cascade-select/index.ts +0 -11
  86. package/src/chart/chart.spec.ts +0 -27
  87. package/src/chart/chart.ts +0 -52
  88. package/src/chart/index.ts +0 -1
  89. package/src/chat/chat-avatar.ts +0 -31
  90. package/src/chat/chat-bubble.ts +0 -49
  91. package/src/chat/chat-footer.ts +0 -67
  92. package/src/chat/chat-header.ts +0 -41
  93. package/src/chat/chat-log.ts +0 -43
  94. package/src/chat/chat.context.ts +0 -64
  95. package/src/chat/chat.spec.ts +0 -341
  96. package/src/chat/chat.ts +0 -191
  97. package/src/chat/config.ts +0 -53
  98. package/src/chat/index.ts +0 -21
  99. package/src/checkbox/checkbox.spec.ts +0 -35
  100. package/src/checkbox/checkbox.ts +0 -89
  101. package/src/checkbox/index.ts +0 -1
  102. package/src/color-picker/color-picker.context.ts +0 -74
  103. package/src/color-picker/color-picker.spec.ts +0 -241
  104. package/src/color-picker/color-picker.ts +0 -698
  105. package/src/color-picker/color-picker.utils.ts +0 -140
  106. package/src/color-picker/index.ts +0 -28
  107. package/src/combobox/combobox-input.ts +0 -143
  108. package/src/combobox/combobox-listbox.ts +0 -49
  109. package/src/combobox/combobox-option.ts +0 -43
  110. package/src/combobox/combobox-root.ts +0 -281
  111. package/src/combobox/combobox.spec.ts +0 -75
  112. package/src/combobox/combobox.ts +0 -4
  113. package/src/combobox/index.ts +0 -4
  114. package/src/command-palette/command-empty.ts +0 -36
  115. package/src/command-palette/command-group.ts +0 -21
  116. package/src/command-palette/command-input.ts +0 -70
  117. package/src/command-palette/command-item.ts +0 -60
  118. package/src/command-palette/command-list.ts +0 -25
  119. package/src/command-palette/command-palette-dialog.ts +0 -74
  120. package/src/command-palette/command-palette-trigger.ts +0 -64
  121. package/src/command-palette/command-palette.filters.ts +0 -53
  122. package/src/command-palette/command-palette.spec.ts +0 -349
  123. package/src/command-palette/command-palette.ts +0 -204
  124. package/src/command-palette/command-separator.ts +0 -18
  125. package/src/command-palette/index.ts +0 -15
  126. package/src/confirm-popup/confirm-popup-action.ts +0 -39
  127. package/src/confirm-popup/confirm-popup-cancel.ts +0 -38
  128. package/src/confirm-popup/confirm-popup-content.ts +0 -113
  129. package/src/confirm-popup/confirm-popup-message.ts +0 -36
  130. package/src/confirm-popup/confirm-popup-trigger.ts +0 -31
  131. package/src/confirm-popup/confirm-popup.context.ts +0 -41
  132. package/src/confirm-popup/confirm-popup.spec.ts +0 -337
  133. package/src/confirm-popup/confirm-popup.ts +0 -109
  134. package/src/confirm-popup/index.ts +0 -12
  135. package/src/date-picker/date-picker-calendar.ts +0 -65
  136. package/src/date-picker/date-picker-trigger.ts +0 -215
  137. package/src/date-picker/date-picker.context.ts +0 -50
  138. package/src/date-picker/date-picker.spec.ts +0 -117
  139. package/src/date-picker/date-picker.ts +0 -127
  140. package/src/date-picker/index.ts +0 -7
  141. package/src/dialog/_examples/dialog.confirm.example.ts +0 -145
  142. package/src/dialog/_examples/dialog.example.ts +0 -106
  143. package/src/dialog/_examples/dialog.finance.example.ts +0 -121
  144. package/src/dialog/_examples/dialog.retro.example.ts +0 -126
  145. package/src/dialog/_examples/index.ts +0 -6
  146. package/src/dialog/dialog.ref.ts +0 -42
  147. package/src/dialog/dialog.service.ts +0 -66
  148. package/src/dialog/dialog.spec.ts +0 -37
  149. package/src/dialog/dialog.ts +0 -26
  150. package/src/dialog/index.ts +0 -3
  151. package/src/divider/divider.spec.ts +0 -223
  152. package/src/divider/divider.ts +0 -137
  153. package/src/divider/index.ts +0 -5
  154. package/src/drawer/drawer.ref.ts +0 -63
  155. package/src/drawer/drawer.service.ts +0 -106
  156. package/src/drawer/drawer.spec.ts +0 -117
  157. package/src/drawer/drawer.ts +0 -122
  158. package/src/drawer/index.ts +0 -10
  159. package/src/dropdown-menu/dropdown-menu-content.ts +0 -258
  160. package/src/dropdown-menu/dropdown-menu-group.ts +0 -31
  161. package/src/dropdown-menu/dropdown-menu-item.ts +0 -51
  162. package/src/dropdown-menu/dropdown-menu-label.ts +0 -41
  163. package/src/dropdown-menu/dropdown-menu-separator.ts +0 -27
  164. package/src/dropdown-menu/dropdown-menu-trigger.ts +0 -140
  165. package/src/dropdown-menu/dropdown-menu.spec.ts +0 -265
  166. package/src/dropdown-menu/dropdown-menu.ts +0 -60
  167. package/src/dropdown-menu/index.ts +0 -15
  168. package/src/example-components.ts +0 -42
  169. package/src/field/field-error.ts +0 -49
  170. package/src/field/field-group.ts +0 -39
  171. package/src/field/field-help.ts +0 -47
  172. package/src/field/field-label.ts +0 -30
  173. package/src/field/field.context.ts +0 -28
  174. package/src/field/field.spec.ts +0 -179
  175. package/src/field/field.ts +0 -121
  176. package/src/field/index.ts +0 -6
  177. package/src/file-upload/file-upload.context.ts +0 -89
  178. package/src/file-upload/file-upload.spec.ts +0 -290
  179. package/src/file-upload/file-upload.ts +0 -639
  180. package/src/file-upload/file-upload.types.ts +0 -59
  181. package/src/file-upload/index.ts +0 -23
  182. package/src/form/form-error-summary.ts +0 -87
  183. package/src/form/form-field.context.ts +0 -3
  184. package/src/form/form-field.spec.ts +0 -25
  185. package/src/form/form-field.ts +0 -52
  186. package/src/form/form.context.ts +0 -53
  187. package/src/form/form.spec.ts +0 -162
  188. package/src/form/form.ts +0 -326
  189. package/src/form/index.ts +0 -11
  190. package/src/icon/E2E.md +0 -14
  191. package/src/icon/icon.directive.spec.ts +0 -198
  192. package/src/icon/icon.directive.ts +0 -113
  193. package/src/icon/icon.mode.spec.ts +0 -29
  194. package/src/icon/icon.mode.ts +0 -23
  195. package/src/icon/icon.providers.spec.ts +0 -63
  196. package/src/icon/icon.providers.ts +0 -47
  197. package/src/icon/icon.resolver.spec.ts +0 -96
  198. package/src/icon/icon.resolver.ts +0 -49
  199. package/src/icon/icon.tokens.ts +0 -88
  200. package/src/icon/icon.types.ts +0 -48
  201. package/src/icon/index.ts +0 -21
  202. package/src/input/index.ts +0 -1
  203. package/src/input/input.spec.ts +0 -43
  204. package/src/input/input.ts +0 -89
  205. package/src/input-group/index.ts +0 -3
  206. package/src/input-group/input-group-addon.ts +0 -92
  207. package/src/input-group/input-group.context.ts +0 -27
  208. package/src/input-group/input-group.spec.ts +0 -186
  209. package/src/input-group/input-group.ts +0 -136
  210. package/src/input-mask/index.ts +0 -11
  211. package/src/input-mask/input-mask.compile.ts +0 -69
  212. package/src/input-mask/input-mask.engine.ts +0 -376
  213. package/src/input-mask/input-mask.presets.ts +0 -24
  214. package/src/input-mask/input-mask.spec.ts +0 -304
  215. package/src/input-mask/input-mask.tokens.ts +0 -49
  216. package/src/input-mask/input-mask.ts +0 -280
  217. package/src/input-otp/index.ts +0 -2
  218. package/src/input-otp/input-otp.context.ts +0 -41
  219. package/src/input-otp/input-otp.spec.ts +0 -308
  220. package/src/input-otp/input-otp.ts +0 -470
  221. package/src/kbd/index.ts +0 -1
  222. package/src/kbd/kbd.spec.ts +0 -127
  223. package/src/kbd/kbd.ts +0 -132
  224. package/src/link/config.ts +0 -44
  225. package/src/link/index.ts +0 -2
  226. package/src/link/link.spec.ts +0 -246
  227. package/src/link/link.ts +0 -226
  228. package/src/list/index.ts +0 -11
  229. package/src/list/list.spec.ts +0 -237
  230. package/src/list/list.ts +0 -277
  231. package/src/menubar/index.ts +0 -7
  232. package/src/menubar/menubar-item.ts +0 -204
  233. package/src/menubar/menubar.context.ts +0 -43
  234. package/src/menubar/menubar.spec.ts +0 -433
  235. package/src/menubar/menubar.ts +0 -309
  236. package/src/number-input/index.ts +0 -4
  237. package/src/number-input/number-input-group.ts +0 -64
  238. package/src/number-input/number-input.context.ts +0 -31
  239. package/src/number-input/number-input.format.ts +0 -148
  240. package/src/number-input/number-input.spec.ts +0 -170
  241. package/src/number-input/number-input.ts +0 -457
  242. package/src/number-input/number-stepper.ts +0 -193
  243. package/src/overlay-badge/index.ts +0 -7
  244. package/src/overlay-badge/overlay-badge-content.ts +0 -73
  245. package/src/overlay-badge/overlay-badge.context.ts +0 -37
  246. package/src/overlay-badge/overlay-badge.spec.ts +0 -220
  247. package/src/overlay-badge/overlay-badge.ts +0 -128
  248. package/src/pagination/config.ts +0 -82
  249. package/src/pagination/index.ts +0 -19
  250. package/src/pagination/page-tokens.ts +0 -78
  251. package/src/pagination/pagination-ellipsis.ts +0 -69
  252. package/src/pagination/pagination-first.ts +0 -84
  253. package/src/pagination/pagination-info.ts +0 -70
  254. package/src/pagination/pagination-item.ts +0 -81
  255. package/src/pagination/pagination-last.ts +0 -85
  256. package/src/pagination/pagination-next.ts +0 -86
  257. package/src/pagination/pagination-previous.ts +0 -90
  258. package/src/pagination/pagination.context.ts +0 -52
  259. package/src/pagination/pagination.spec.ts +0 -388
  260. package/src/pagination/pagination.ts +0 -288
  261. package/src/password-input/index.ts +0 -15
  262. package/src/password-input/password-input.context.ts +0 -65
  263. package/src/password-input/password-input.scorer.ts +0 -34
  264. package/src/password-input/password-input.spec.ts +0 -274
  265. package/src/password-input/password-input.ts +0 -488
  266. package/src/popover/_examples/index.ts +0 -5
  267. package/src/popover/_examples/popover.example.ts +0 -92
  268. package/src/popover/_examples/popover.finance.example.ts +0 -106
  269. package/src/popover/_examples/popover.retro.example.ts +0 -103
  270. package/src/popover/index.ts +0 -5
  271. package/src/popover/popover-arrow.ts +0 -30
  272. package/src/popover/popover-close.ts +0 -36
  273. package/src/popover/popover-content.ts +0 -41
  274. package/src/popover/popover-title.ts +0 -39
  275. package/src/popover/popover-trigger.ts +0 -40
  276. package/src/popover/popover.spec.ts +0 -59
  277. package/src/popover/popover.ts +0 -5
  278. package/src/presets/bind-presets.spec.ts +0 -50
  279. package/src/presets/bind-presets.ts +0 -43
  280. package/src/presets/index.ts +0 -3
  281. package/src/presets/size.spec.ts +0 -67
  282. package/src/presets/size.ts +0 -59
  283. package/src/presets/variant.spec.ts +0 -72
  284. package/src/presets/variant.ts +0 -62
  285. package/src/primitives/.gitkeep +0 -0
  286. package/src/primitives/directionality/directionality.spec.ts +0 -112
  287. package/src/primitives/directionality/directionality.ts +0 -89
  288. package/src/primitives/directionality/index.ts +0 -1
  289. package/src/primitives/forms/form-control.spec.ts +0 -67
  290. package/src/primitives/forms/form-control.ts +0 -94
  291. package/src/primitives/forms/index.ts +0 -1
  292. package/src/primitives/index.ts +0 -6
  293. package/src/primitives/interaction/disabled.spec.ts +0 -47
  294. package/src/primitives/interaction/disabled.ts +0 -31
  295. package/src/primitives/interaction/focus-ring.spec.ts +0 -62
  296. package/src/primitives/interaction/focus-ring.ts +0 -59
  297. package/src/primitives/interaction/index.ts +0 -2
  298. package/src/primitives/list/filterable-list.spec.ts +0 -114
  299. package/src/primitives/list/filterable-list.ts +0 -126
  300. package/src/primitives/list/group.spec.ts +0 -99
  301. package/src/primitives/list/group.ts +0 -139
  302. package/src/primitives/list/index.ts +0 -8
  303. package/src/primitives/list/inject-helpers.ts +0 -8
  304. package/src/primitives/list/item.spec.ts +0 -173
  305. package/src/primitives/list/item.ts +0 -222
  306. package/src/primitives/list/navigator.spec.ts +0 -286
  307. package/src/primitives/list/navigator.ts +0 -238
  308. package/src/primitives/list/selection.spec.ts +0 -214
  309. package/src/primitives/list/selection.ts +0 -339
  310. package/src/primitives/list/tokens.ts +0 -106
  311. package/src/primitives/list/type-ahead.spec.ts +0 -58
  312. package/src/primitives/list/type-ahead.ts +0 -46
  313. package/src/primitives/overlay/backdrop.spec.ts +0 -54
  314. package/src/primitives/overlay/backdrop.ts +0 -31
  315. package/src/primitives/overlay/builder.spec.ts +0 -38
  316. package/src/primitives/overlay/builder.ts +0 -151
  317. package/src/primitives/overlay/container.ts +0 -42
  318. package/src/primitives/overlay/context.ts +0 -14
  319. package/src/primitives/overlay/controller.spec.ts +0 -86
  320. package/src/primitives/overlay/controller.ts +0 -190
  321. package/src/primitives/overlay/id.spec.ts +0 -24
  322. package/src/primitives/overlay/id.ts +0 -17
  323. package/src/primitives/overlay/index.ts +0 -18
  324. package/src/primitives/overlay/overlay.css +0 -42
  325. package/src/primitives/overlay/panel.spec.ts +0 -52
  326. package/src/primitives/overlay/panel.ts +0 -102
  327. package/src/primitives/overlay/stack.spec.ts +0 -55
  328. package/src/primitives/overlay/stack.ts +0 -113
  329. package/src/primitives/overlay/strategies/backdrop/blurred.spec.ts +0 -11
  330. package/src/primitives/overlay/strategies/backdrop/blurred.ts +0 -5
  331. package/src/primitives/overlay/strategies/backdrop/none.spec.ts +0 -10
  332. package/src/primitives/overlay/strategies/backdrop/none.ts +0 -9
  333. package/src/primitives/overlay/strategies/backdrop/solid.spec.ts +0 -18
  334. package/src/primitives/overlay/strategies/backdrop/solid.ts +0 -23
  335. package/src/primitives/overlay/strategies/focus-trap/inert-based.spec.ts +0 -28
  336. package/src/primitives/overlay/strategies/focus-trap/inert-based.ts +0 -38
  337. package/src/primitives/overlay/strategies/focus-trap/no-trap.spec.ts +0 -9
  338. package/src/primitives/overlay/strategies/focus-trap/no-trap.ts +0 -8
  339. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.spec.ts +0 -49
  340. package/src/primitives/overlay/strategies/focus-trap/tab-cycle.ts +0 -85
  341. package/src/primitives/overlay/strategies/index.ts +0 -34
  342. package/src/primitives/overlay/strategies/live-announcer/_announce.ts +0 -35
  343. package/src/primitives/overlay/strategies/live-announcer/assertive.spec.ts +0 -21
  344. package/src/primitives/overlay/strategies/live-announcer/assertive.ts +0 -11
  345. package/src/primitives/overlay/strategies/live-announcer/polite.spec.ts +0 -21
  346. package/src/primitives/overlay/strategies/live-announcer/polite.ts +0 -11
  347. package/src/primitives/overlay/strategies/live-announcer/silent.spec.ts +0 -12
  348. package/src/primitives/overlay/strategies/live-announcer/silent.ts +0 -5
  349. package/src/primitives/overlay/strategies/mount/body-portal.spec.ts +0 -40
  350. package/src/primitives/overlay/strategies/mount/body-portal.ts +0 -91
  351. package/src/primitives/overlay/strategies/mount/in-container.spec.ts +0 -43
  352. package/src/primitives/overlay/strategies/mount/in-container.ts +0 -39
  353. package/src/primitives/overlay/strategies/mount/in-place.spec.ts +0 -40
  354. package/src/primitives/overlay/strategies/mount/in-place.ts +0 -20
  355. package/src/primitives/overlay/strategies/position/anchored-to.spec.ts +0 -56
  356. package/src/primitives/overlay/strategies/position/anchored-to.ts +0 -248
  357. package/src/primitives/overlay/strategies/position/corner.spec.ts +0 -36
  358. package/src/primitives/overlay/strategies/position/corner.ts +0 -33
  359. package/src/primitives/overlay/strategies/position/edge-sheet.spec.ts +0 -32
  360. package/src/primitives/overlay/strategies/position/edge-sheet.ts +0 -36
  361. package/src/primitives/overlay/strategies/position/in-place-sibling.spec.ts +0 -25
  362. package/src/primitives/overlay/strategies/position/in-place-sibling.ts +0 -13
  363. package/src/primitives/overlay/strategies/position/point-at.spec.ts +0 -40
  364. package/src/primitives/overlay/strategies/position/point-at.ts +0 -34
  365. package/src/primitives/overlay/strategies/position/viewport-centered.spec.ts +0 -31
  366. package/src/primitives/overlay/strategies/position/viewport-centered.ts +0 -31
  367. package/src/primitives/overlay/strategies/scroll-lock/css-clip.spec.ts +0 -15
  368. package/src/primitives/overlay/strategies/scroll-lock/css-clip.ts +0 -39
  369. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.spec.ts +0 -21
  370. package/src/primitives/overlay/strategies/scroll-lock/html-overflow.ts +0 -44
  371. package/src/primitives/overlay/strategies/scroll-lock/none.spec.ts +0 -9
  372. package/src/primitives/overlay/strategies/scroll-lock/none.ts +0 -5
  373. package/src/primitives/overlay/strategies/trigger-event/on-click.spec.ts +0 -32
  374. package/src/primitives/overlay/strategies/trigger-event/on-click.ts +0 -28
  375. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.spec.ts +0 -45
  376. package/src/primitives/overlay/strategies/trigger-event/on-context-menu.ts +0 -70
  377. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.spec.ts +0 -35
  378. package/src/primitives/overlay/strategies/trigger-event/on-focus-or-input.ts +0 -34
  379. package/src/primitives/overlay/strategies/trigger-event/on-focus.spec.ts +0 -64
  380. package/src/primitives/overlay/strategies/trigger-event/on-focus.ts +0 -37
  381. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.spec.ts +0 -37
  382. package/src/primitives/overlay/strategies/trigger-event/on-hotkey.ts +0 -59
  383. package/src/primitives/overlay/strategies/trigger-event/on-hover.spec.ts +0 -34
  384. package/src/primitives/overlay/strategies/trigger-event/on-hover.ts +0 -86
  385. package/src/primitives/overlay/strategies/trigger-event/programmatic.spec.ts +0 -16
  386. package/src/primitives/overlay/strategies/trigger-event/programmatic.ts +0 -12
  387. package/src/primitives/overlay/tokens.ts +0 -54
  388. package/src/primitives/overlay/trigger.spec.ts +0 -103
  389. package/src/primitives/overlay/trigger.ts +0 -75
  390. package/src/primitives/overlay/types.ts +0 -24
  391. package/src/primitives/overlay/wrapper.ts +0 -50
  392. package/src/primitives/signals/deep-signal.ts +0 -109
  393. package/src/primitives/signals/index.ts +0 -1
  394. package/src/progress-bar/config.ts +0 -48
  395. package/src/progress-bar/index.ts +0 -12
  396. package/src/progress-bar/progress-bar-fill.ts +0 -37
  397. package/src/progress-bar/progress-bar.context.ts +0 -34
  398. package/src/progress-bar/progress-bar.spec.ts +0 -423
  399. package/src/progress-bar/progress-bar.ts +0 -217
  400. package/src/public-api.ts +0 -84
  401. package/src/radio/index.ts +0 -2
  402. package/src/radio/radio.context.ts +0 -3
  403. package/src/radio/radio.spec.ts +0 -36
  404. package/src/radio/radio.ts +0 -66
  405. package/src/select/index.ts +0 -4
  406. package/src/select/select-content.ts +0 -69
  407. package/src/select/select-option.ts +0 -35
  408. package/src/select/select-root.ts +0 -129
  409. package/src/select/select-trigger.ts +0 -93
  410. package/src/select/select.spec.ts +0 -138
  411. package/src/select/select.ts +0 -4
  412. package/src/skeleton/index.ts +0 -5
  413. package/src/skeleton/skeleton.spec.ts +0 -115
  414. package/src/skeleton/skeleton.ts +0 -56
  415. package/src/slider/index.ts +0 -10
  416. package/src/slider/slider-range.ts +0 -49
  417. package/src/slider/slider-thumb.ts +0 -335
  418. package/src/slider/slider-track.ts +0 -70
  419. package/src/slider/slider.context.ts +0 -79
  420. package/src/slider/slider.geometry.ts +0 -73
  421. package/src/slider/slider.spec.ts +0 -216
  422. package/src/slider/slider.ts +0 -443
  423. package/src/speed-dial/index.ts +0 -10
  424. package/src/speed-dial/speed-dial-action.ts +0 -40
  425. package/src/speed-dial/speed-dial-actions.ts +0 -31
  426. package/src/speed-dial/speed-dial-trigger.ts +0 -55
  427. package/src/speed-dial/speed-dial.context.ts +0 -36
  428. package/src/speed-dial/speed-dial.spec.ts +0 -143
  429. package/src/speed-dial/speed-dial.ts +0 -127
  430. package/src/spinner/config.ts +0 -48
  431. package/src/spinner/index.ts +0 -8
  432. package/src/spinner/spinner.spec.ts +0 -262
  433. package/src/spinner/spinner.ts +0 -129
  434. package/src/stepper/index.ts +0 -15
  435. package/src/stepper/stepper.context.ts +0 -63
  436. package/src/stepper/stepper.spec.ts +0 -403
  437. package/src/stepper/stepper.ts +0 -544
  438. package/src/styles/docs-themes.css +0 -82
  439. package/src/styles.css +0 -17
  440. package/src/table/column-helpers.spec.ts +0 -74
  441. package/src/table/column-helpers.ts +0 -68
  442. package/src/table/filter-fns.ts +0 -230
  443. package/src/table/filter-models.spec.ts +0 -240
  444. package/src/table/filter-models.ts +0 -124
  445. package/src/table/filter-params.ts +0 -90
  446. package/src/table/grid-api-impl.ts +0 -321
  447. package/src/table/grid-api.spec.ts +0 -178
  448. package/src/table/grid-api.ts +0 -285
  449. package/src/table/index.ts +0 -73
  450. package/src/table/table-cell.spec.ts +0 -43
  451. package/src/table/table-cell.ts +0 -38
  452. package/src/table/table-filter-outlet.ts +0 -120
  453. package/src/table/table-header.spec.ts +0 -54
  454. package/src/table/table-header.ts +0 -63
  455. package/src/table/table-keyboard.spec.ts +0 -68
  456. package/src/table/table-keyboard.ts +0 -107
  457. package/src/table/table-resource.spec.ts +0 -37
  458. package/src/table/table-resource.ts +0 -36
  459. package/src/table/table-row.spec.ts +0 -54
  460. package/src/table/table-row.ts +0 -31
  461. package/src/table/table-storage.spec.ts +0 -67
  462. package/src/table/table-storage.ts +0 -76
  463. package/src/table/table.spec.ts +0 -172
  464. package/src/table/table.ts +0 -281
  465. package/src/table/table.types.ts +0 -83
  466. package/src/tabs/index.ts +0 -7
  467. package/src/tabs/tabs.context.ts +0 -32
  468. package/src/tabs/tabs.spec.ts +0 -352
  469. package/src/tabs/tabs.ts +0 -364
  470. package/src/tag/config.ts +0 -53
  471. package/src/tag/index.ts +0 -7
  472. package/src/tag/tag-list.ts +0 -76
  473. package/src/tag/tag-remove.ts +0 -61
  474. package/src/tag/tag.context.ts +0 -36
  475. package/src/tag/tag.spec.ts +0 -240
  476. package/src/tag/tag.ts +0 -203
  477. package/src/test-setup.ts +0 -5
  478. package/src/textarea/config.ts +0 -42
  479. package/src/textarea/index.ts +0 -8
  480. package/src/textarea/textarea.spec.ts +0 -176
  481. package/src/textarea/textarea.ts +0 -235
  482. package/src/time-picker/index.ts +0 -15
  483. package/src/time-picker/time-picker-meridiem.ts +0 -123
  484. package/src/time-picker/time-picker-segment.ts +0 -318
  485. package/src/time-picker/time-picker.context.ts +0 -38
  486. package/src/time-picker/time-picker.format.ts +0 -181
  487. package/src/time-picker/time-picker.spec.ts +0 -189
  488. package/src/time-picker/time-picker.ts +0 -274
  489. package/src/toast/_examples/index.ts +0 -5
  490. package/src/toast/_examples/toast.example.ts +0 -282
  491. package/src/toast/_examples/toast.finance.example.ts +0 -180
  492. package/src/toast/_examples/toast.retro.example.ts +0 -161
  493. package/src/toast/index.ts +0 -28
  494. package/src/toast/toast.ref.ts +0 -26
  495. package/src/toast/toast.service.ts +0 -339
  496. package/src/toast/toast.spec.ts +0 -247
  497. package/src/toast/toast.strategy.ts +0 -112
  498. package/src/toast/toast.ts +0 -463
  499. package/src/toast/toast.types.ts +0 -5
  500. package/src/toggle/index.ts +0 -1
  501. package/src/toggle/toggle.spec.ts +0 -24
  502. package/src/toggle/toggle.ts +0 -48
  503. package/src/tooltip/_examples/index.ts +0 -6
  504. package/src/tooltip/_examples/tooltip.example.ts +0 -82
  505. package/src/tooltip/_examples/tooltip.finance.example.ts +0 -97
  506. package/src/tooltip/_examples/tooltip.placements.example.ts +0 -83
  507. package/src/tooltip/_examples/tooltip.retro.example.ts +0 -107
  508. package/src/tooltip/index.ts +0 -4
  509. package/src/tooltip/tooltip-arrow.ts +0 -31
  510. package/src/tooltip/tooltip-content.ts +0 -38
  511. package/src/tooltip/tooltip-group.ts +0 -32
  512. package/src/tooltip/tooltip-trigger.ts +0 -47
  513. package/src/tooltip/tooltip.spec.ts +0 -40
  514. package/src/tooltip/tooltip.ts +0 -5
  515. package/src/tree-select/index.ts +0 -12
  516. package/src/tree-select/tree-select-content.ts +0 -199
  517. package/src/tree-select/tree-select-node.ts +0 -132
  518. package/src/tree-select/tree-select-root.ts +0 -272
  519. package/src/tree-select/tree-select-trigger.ts +0 -90
  520. package/src/tree-select/tree-select.context.ts +0 -63
  521. package/src/tree-select/tree-select.spec.ts +0 -433
  522. package/src/tree-select/tree-select.ts +0 -2
  523. package/src/typography/blockquote.ts +0 -57
  524. package/src/typography/code.ts +0 -53
  525. package/src/typography/index.ts +0 -22
  526. package/src/typography/lead.ts +0 -49
  527. package/src/typography/muted.ts +0 -29
  528. package/src/typography/truncate.ts +0 -99
  529. package/src/typography/typography.spec.ts +0 -203
  530. package/tsconfig.lib.json +0 -21
  531. package/tsconfig.lib.prod.json +0 -17
  532. package/tsconfig.spec.json +0 -18
  533. package/vite.config.ts +0 -27
  534. /package/{src/icon → icon}/icon.css +0 -0
  535. /package/{src/typography → typography}/prose.css +0 -0
@@ -1,76 +0,0 @@
1
- import { InjectionToken, Provider } from '@angular/core';
2
-
3
- /**
4
- * Adapter contract for persisting `<kj-data-table>` state. The default
5
- * factory yields an in-memory adapter in non-browser environments and a
6
- * localStorage adapter in the browser.
7
- */
8
- export interface KjStorageAdapter {
9
- read<T>(key: string): T | null;
10
- write<T>(key: string, value: T): void;
11
- }
12
-
13
- export interface LocalStorageAdapterOptions { keyPrefix?: string; }
14
- export interface SessionStorageAdapterOptions { keyPrefix?: string; }
15
-
16
- /** Per-instance in-memory adapter. Survives nothing. Default in SSR/tests. */
17
- export function inMemoryAdapter(): KjStorageAdapter {
18
- const store = new Map<string, unknown>();
19
- return {
20
- read: <T>(k: string): T | null => store.has(k) ? (store.get(k) as T) : null,
21
- write: <T>(k: string, v: T) => { store.set(k, v); },
22
- };
23
- }
24
-
25
- function wrap(get: () => Storage | null, prefix = ''): KjStorageAdapter {
26
- return {
27
- read<T>(k: string): T | null {
28
- const s = get();
29
- if (!s) return null;
30
- const raw = s.getItem(prefix + k);
31
- if (raw == null) return null;
32
- try { return JSON.parse(raw) as T; } catch { return null; }
33
- },
34
- write<T>(k: string, v: T) {
35
- const s = get();
36
- if (!s) return;
37
- try { s.setItem(prefix + k, JSON.stringify(v)); } catch { /* quota / serialization */ }
38
- },
39
- };
40
- }
41
-
42
- const safeLocal = (): Storage | null => {
43
- try { return typeof localStorage !== 'undefined' ? localStorage : null; } catch { return null; }
44
- };
45
- const safeSession = (): Storage | null => {
46
- try { return typeof sessionStorage !== 'undefined' ? sessionStorage : null; } catch { return null; }
47
- };
48
-
49
- /** Adapter backed by `localStorage`. No-ops in SSR. Optional `keyPrefix`. */
50
- export function localStorageAdapter(opts: LocalStorageAdapterOptions = {}): KjStorageAdapter {
51
- return wrap(safeLocal, opts.keyPrefix ?? '');
52
- }
53
-
54
- /** Adapter backed by `sessionStorage`. No-ops in SSR. Optional `keyPrefix`. */
55
- export function sessionStorageAdapter(opts: SessionStorageAdapterOptions = {}): KjStorageAdapter {
56
- return wrap(safeSession, opts.keyPrefix ?? '');
57
- }
58
-
59
- /** Default smart adapter — localStorage in browser, in-memory otherwise. */
60
- function defaultAdapter(): KjStorageAdapter {
61
- return safeLocal() ? localStorageAdapter() : inMemoryAdapter();
62
- }
63
-
64
- /**
65
- * DI token for the active table storage adapter. Default factory yields a
66
- * smart adapter (localStorage in browser, in-memory otherwise). Override via
67
- * `provideKjTableStorage(...)` at app scope or `[kjStorageAdapter]` per table.
68
- */
69
- export const KJ_TABLE_STORAGE = new InjectionToken<KjStorageAdapter>('kj.table.storage', {
70
- factory: defaultAdapter,
71
- });
72
-
73
- /** Configures the app-wide table storage adapter. */
74
- export function provideKjTableStorage(adapter: KjStorageAdapter): Provider {
75
- return { provide: KJ_TABLE_STORAGE, useValue: adapter };
76
- }
@@ -1,172 +0,0 @@
1
- import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
2
- import { ColumnDef } from '@tanstack/angular-table';
3
- import { render } from '@testing-library/angular';
4
- import { axe, toHaveNoViolations } from 'jest-axe';
5
- import { describe, expect, it } from 'vitest';
6
- import { KjTable } from './table';
7
- import { KjTableHeader } from './table-header';
8
- import { kjColumn } from './column-helpers';
9
-
10
- expect.extend(toHaveNoViolations);
11
-
12
- interface User {
13
- name: string;
14
- age: number;
15
- }
16
-
17
- @Component({
18
- standalone: true,
19
- imports: [KjTable, KjTableHeader],
20
- changeDetection: ChangeDetectionStrategy.Eager,
21
- template: ` <table [kjTable]="columns" [kjTableData]="data" #tbl="kjTable">
22
- <thead>
23
- @for (hg of tbl.table().getHeaderGroups(); track hg.id) {
24
- <tr>
25
- @for (h of hg.headers; track h.id) {
26
- <th kjTableHeader [kjHeader]="h" scope="col">{{ h.id }}</th>
27
- }
28
- </tr>
29
- }
30
- </thead>
31
- <tbody>
32
- @for (row of tbl.table().getRowModel().rows; track row.id) {
33
- <tr>
34
- @for (cell of row.getVisibleCells(); track cell.id) {
35
- <td>{{ cell.getValue() }}</td>
36
- }
37
- </tr>
38
- }
39
- </tbody>
40
- </table>`,
41
- })
42
- class TableTestComponent {
43
- columns: ColumnDef<User>[] = [
44
- { accessorKey: 'name', header: 'Name' },
45
- { accessorKey: 'age', header: 'Age' },
46
- ];
47
- data: User[] = [
48
- { name: 'Alice', age: 30 },
49
- { name: 'Bob', age: 25 },
50
- ];
51
- }
52
-
53
- describe('KjTable', () => {
54
- it('renders table headers', async () => {
55
- const { container } = await render(TableTestComponent);
56
- const headers = container.querySelectorAll('th');
57
- expect(headers.length).toBe(2);
58
- });
59
-
60
- it('renders data rows', async () => {
61
- const { container } = await render(TableTestComponent);
62
- const rows = container.querySelectorAll('tbody tr');
63
- expect(rows.length).toBe(2);
64
- });
65
-
66
- it('renders cell data', async () => {
67
- const { getByText } = await render(TableTestComponent);
68
- expect(getByText('Alice')).toBeInTheDocument();
69
- expect(getByText('Bob')).toBeInTheDocument();
70
- });
71
-
72
- it('passes axe audit', async () => {
73
- const { container } = await render(TableTestComponent);
74
- expect(await axe(container)).toHaveNoViolations();
75
- });
76
-
77
- it('sortable header has tabindex=0', async () => {
78
- const { container } = await render(TableTestComponent);
79
- const ths = container.querySelectorAll('th');
80
- ths.forEach((th) => expect(th).toHaveAttribute('tabindex', '0'));
81
- });
82
-
83
- it('sortable header has aria-sort="none" initially', async () => {
84
- const { container } = await render(TableTestComponent);
85
- const ths = container.querySelectorAll('th');
86
- ths.forEach((th) => expect(th).toHaveAttribute('aria-sort', 'none'));
87
- });
88
-
89
- it('non-sortable column header has no cursor:pointer', async () => {
90
- @Component({
91
- standalone: true,
92
- imports: [KjTable, KjTableHeader],
93
- template: ` <table [kjTable]="columns" [kjTableData]="data" #tbl="kjTable">
94
- <thead>
95
- @for (hg of tbl.table().getHeaderGroups(); track hg.id) {
96
- <tr>
97
- @for (h of hg.headers; track h.id) {
98
- <th kjTableHeader [kjHeader]="h" scope="col">{{ h.id }}</th>
99
- }
100
- </tr>
101
- }
102
- </thead>
103
- <tbody></tbody>
104
- </table>`,
105
- })
106
- class NoSortTableComponent {
107
- columns: ColumnDef<User>[] = [{ accessorKey: 'name', header: 'Name', enableSorting: false }];
108
- data: User[] = [{ name: 'Alice', age: 30 }];
109
- }
110
-
111
- const { container } = await render(NoSortTableComponent);
112
- const th = container.querySelector('th')!;
113
- expect(th.style.cursor).not.toBe('pointer');
114
- expect(th.hasAttribute('data-sort')).toBe(false);
115
- });
116
- });
117
-
118
- interface Row {
119
- id: string;
120
- name: string;
121
- }
122
-
123
- @Component({
124
- standalone: true,
125
- imports: [KjTable],
126
- changeDetection: ChangeDetectionStrategy.Eager,
127
- template: `<table [kjTable]="cols" [kjTableData]="data()" #t="kjTable"></table>`,
128
- })
129
- class Host {
130
- protected readonly cols = [kjColumn<Row>({ accessorKey: 'name', header: 'Name' })];
131
- protected readonly data = signal<Row[]>([
132
- { id: '1', name: 'alice' },
133
- { id: '2', name: 'bob' },
134
- ]);
135
- }
136
-
137
- describe('KjTable (extended)', () => {
138
- it('exposes every state slice via the deep state signal', async () => {
139
- const { fixture } = await render(Host);
140
- const dir = fixture.debugElement.children[0].injector.get(KjTable);
141
- expect(dir.state.sorting()).toEqual([]);
142
- expect(dir.state.columnFilters()).toEqual([]);
143
- expect(dir.state.globalFilter()).toBe('');
144
- expect(dir.state.pagination()).toEqual({ pageIndex: 0, pageSize: 25 });
145
- expect(dir.state.rowSelection()).toEqual({});
146
- expect(dir.state.columnSizing()).toEqual({});
147
- expect(dir.state.columnVisibility()).toEqual({});
148
- expect(dir.state.columnOrder()).toEqual([]);
149
- expect(dir.state.columnPinning()).toEqual({ left: [], right: [] });
150
- expect(dir.state.expanded()).toEqual({});
151
- expect(dir.state.grouping()).toEqual([]);
152
- expect(dir.state.density()).toBe('standard');
153
- });
154
-
155
- it('state() returns the full bundle and setState merges', async () => {
156
- const { fixture } = await render(Host);
157
- const dir = fixture.debugElement.children[0].injector.get(KjTable);
158
- dir.setState({ density: 'compact', globalFilter: 'al' });
159
- expect(dir.state.density()).toBe('compact');
160
- expect(dir.state.globalFilter()).toBe('al');
161
- expect(dir.state().density).toBe('compact');
162
- });
163
-
164
- it('resetState clears all slices', async () => {
165
- const { fixture } = await render(Host);
166
- const dir = fixture.debugElement.children[0].injector.get(KjTable);
167
- dir.setState({ density: 'compact', globalFilter: 'x' });
168
- dir.resetState();
169
- expect(dir.state.density()).toBe('standard');
170
- expect(dir.state.globalFilter()).toBe('');
171
- });
172
- });
@@ -1,281 +0,0 @@
1
- import {
2
- ColumnDef, RowData,
3
- createAngularTable, getCoreRowModel, getSortedRowModel, getFilteredRowModel,
4
- getPaginationRowModel, getExpandedRowModel, getGroupedRowModel,
5
- type ColumnSizingInfoState,
6
- type Table,
7
- } from '@tanstack/angular-table';
8
- import { Directive, InjectionToken, computed, input, model, signal } from '@angular/core';
9
- import { toDeepSignal, type DeepSignal } from '../primitives/signals/deep-signal';
10
- import { createGridApi } from './grid-api-impl';
11
- import type { KjColumnApi, KjGridApi } from './grid-api';
12
- import type { KjTableState } from './table.types';
13
-
14
- /** Injection token providing the TanStack table instance to child directives. */
15
- export const KJ_TABLE = new InjectionToken<KjTable<unknown>>('KjTable');
16
-
17
- const DEFAULT_STATE: KjTableState = {
18
- sorting: [],
19
- columnFilters: [],
20
- globalFilter: '',
21
- pagination: { pageIndex: 0, pageSize: 25 },
22
- rowSelection: {},
23
- columnSizing: {},
24
- columnVisibility: {},
25
- columnOrder: [],
26
- columnPinning: { left: [], right: [] },
27
- expanded: {},
28
- grouping: [],
29
- density: 'standard',
30
- };
31
-
32
- const DEFAULT_RESIZE_INFO: ColumnSizingInfoState = {
33
- startOffset: null,
34
- startSize: null,
35
- deltaOffset: null,
36
- deltaPercentage: null,
37
- isResizingColumn: false,
38
- columnSizingStart: [],
39
- };
40
-
41
- /**
42
- * Wraps TanStack Angular Table. Accepts `kjTable` (columns) and `kjTableData` signal inputs and
43
- * exposes the table instance (rows, headers, sorting) via the `KJ_TABLE` context token.
44
- *
45
- * Use `table` to access the full TanStack `Table<T>` instance in templates via `exportAs: 'kjTable'`.
46
- *
47
- * State is exposed as a single `DeepSignal<KjTableState>`:
48
- *
49
- * - `state()` — full snapshot (also used by `kjTableResource`).
50
- * - `state.sorting()`, `state.pagination()`, … — per-slice readonly signals,
51
- * lazily memoised by the deep-signal proxy. Reading one only re-runs your
52
- * consumer when that specific slice changes.
53
- *
54
- * @example
55
- * ```html
56
- * <table [kjTable]="columns" [kjTableData]="rows" #tbl="kjTable">
57
- * <thead>
58
- * @for (headerGroup of tbl.table().getHeaderGroups(); track headerGroup.id) {
59
- * <tr>
60
- * @for (header of headerGroup.headers; track header.id) {
61
- * <th kjTableHeader [kjHeader]="header">
62
- * {{ header.column.columnDef.header }}
63
- * </th>
64
- * }
65
- * </tr>
66
- * }
67
- * </thead>
68
- * </table>
69
- * ```
70
- */
71
- @Directive({
72
- selector: '[kjTable]',
73
- standalone: true,
74
- exportAs: 'kjTable',
75
- providers: [{ provide: KJ_TABLE, useExisting: KjTable }],
76
- })
77
- export class KjTable<TData extends RowData = unknown> {
78
- /** Column definitions for the table. */
79
- kjTable = input.required<ColumnDef<TData>[]>();
80
-
81
- /**
82
- * Data rows for the table. A `model()` so the styled wrapper can write
83
- * resource-resolved rows back into the directive when the user uses
84
- * `[kjResource]` instead of `[kjData]`. The model defaults to `[]`, and
85
- * a one-way external binding (`[kjTableData]="rows"`) keeps working.
86
- */
87
- kjTableData = model<TData[]>([]);
88
-
89
- /**
90
- * Optional accessor that returns a stable id for each row. When set, TanStack
91
- * keys row state (selection, expansion, pinning) by this id rather than by
92
- * row index. Mirrors TanStack's `getRowId` option.
93
- */
94
- kjGetRowId = input<((row: TData, index: number) => string) | undefined>(undefined);
95
-
96
- private readonly _state = signal<KjTableState>(DEFAULT_STATE);
97
-
98
- /**
99
- * The full table state as a single deep signal. Call `state()` for the
100
- * whole snapshot, or read any slice (`state.sorting()`, `state.pagination()`,
101
- * `state.density()`…) as an individual `Signal<T>` — child signals are
102
- * lazily memoised so each only invalidates on its own slice's change.
103
- */
104
- readonly state: DeepSignal<KjTableState> = toDeepSignal(this._state.asReadonly());
105
-
106
- /**
107
- * Transient column-resize tracker. Updated continuously by TanStack while
108
- * the user drags a resize handle and read by the styled wrapper to render
109
- * a preview guide line. Excluded from `state` so it never gets persisted
110
- * or echoed through `(stateChange)`.
111
- */
112
- private readonly _columnSizingInfo = signal<ColumnSizingInfoState>(DEFAULT_RESIZE_INFO);
113
- readonly columnSizingInfo = this._columnSizingInfo.asReadonly();
114
-
115
- /**
116
- * Manual-pagination + total-row-count wiring for server-driven tables.
117
- * When `rowCount` is set to a non-null value, the wrapper assumes the
118
- * loader pages rows externally — TanStack stops paginating client-side
119
- * and the pagination / status-bar slots derive their totals from the
120
- * remote count. Set both via `setRowCount(total)` and read them through
121
- * the public `rowCount` / `manualPagination` signals if you need them.
122
- */
123
- private readonly _rowCount = signal<number | null>(null);
124
- readonly rowCount = this._rowCount.asReadonly();
125
- readonly manualPagination = computed(() => this._rowCount() !== null);
126
- setRowCount(n: number | null): void {
127
- this._rowCount.set(n);
128
- }
129
-
130
- /**
131
- * Apply a TanStack updater (value or function) to a single state slice.
132
- *
133
- * Dedupes content-equal updates: TanStack often calls `on*Change` with a
134
- * fresh object literal that has identical fields (e.g. pagination emits
135
- * `{pageIndex:0, pageSize:25}` on data ingestion). Without dedupe, the
136
- * state signal invalidates on every such call, which cascades into
137
- * `(stateChange)` consumers that drive `kjTableResource` — creating an
138
- * infinite loader loop where the spinner never goes away.
139
- */
140
- private patch<K extends keyof KjTableState>(
141
- key: K,
142
- updater: KjTableState[K] | ((prev: KjTableState[K]) => KjTableState[K]),
143
- ): void {
144
- this._state.update(s => {
145
- const next = typeof updater === 'function'
146
- ? (updater as (p: KjTableState[K]) => KjTableState[K])(s[key])
147
- : updater;
148
- if (sliceEqual(s[key], next)) return s;
149
- return { ...s, [key]: next };
150
- });
151
- }
152
-
153
- /** The TanStack table instance. Access rows, headers, and state here. */
154
- readonly table: () => Table<TData> = createAngularTable<TData>(() => ({
155
- data: this.kjTableData(),
156
- columns: this.kjTable(),
157
- getRowId: this.kjGetRowId()
158
- ? (row, index) => this.kjGetRowId()!(row, index)
159
- : undefined,
160
- // `columnResizeMode: 'onEnd'` defers the actual column width write until
161
- // the user releases the resize handle. While dragging, the wrapper reads
162
- // `state.columnSizingInfo().deltaOffset` to render a vertical preview
163
- // guide so the user sees where the new edge will land before reflow.
164
- columnResizeMode: 'onEnd',
165
- // Server-mode wiring: when a total `rowCount` is registered, switch
166
- // TanStack to manual pagination so the loader-page becomes the
167
- // visible page (no client-side slicing) and pagination controls
168
- // derive their totals from the remote count.
169
- manualPagination: this._rowCount() !== null,
170
- rowCount: this._rowCount() ?? undefined,
171
- state: { ...this._state(), columnSizingInfo: this._columnSizingInfo() },
172
- onSortingChange: u => this.patch('sorting', u),
173
- onColumnFiltersChange: u => this.patch('columnFilters', u),
174
- onGlobalFilterChange: u => this.patch('globalFilter', u),
175
- onPaginationChange: u => this.patch('pagination', u),
176
- onRowSelectionChange: u => this.patch('rowSelection', u),
177
- onColumnSizingChange: u => this.patch('columnSizing', u),
178
- onColumnSizingInfoChange: u => this._columnSizingInfo.update(p => typeof u === 'function' ? (u as (prev: ColumnSizingInfoState) => ColumnSizingInfoState)(p) : u),
179
- onColumnVisibilityChange: u => this.patch('columnVisibility', u),
180
- onColumnOrderChange: u => this.patch('columnOrder', u),
181
- onColumnPinningChange: u => this.patch('columnPinning', u),
182
- onExpandedChange: u => this.patch('expanded', u),
183
- onGroupingChange: u => this.patch('grouping', u),
184
- getCoreRowModel: getCoreRowModel(),
185
- getSortedRowModel: getSortedRowModel(),
186
- getFilteredRowModel: getFilteredRowModel(),
187
- getPaginationRowModel: getPaginationRowModel(),
188
- getExpandedRowModel: getExpandedRowModel(),
189
- getGroupedRowModel: getGroupedRowModel(),
190
- // Selection is enabled by default in TanStack, but be explicit so a
191
- // future opts-passthrough doesn't accidentally turn it off and break
192
- // the styled wrapper's row-click toggle.
193
- enableRowSelection: true,
194
- enableMultiRowSelection: true,
195
- }));
196
-
197
- /** Merge a partial state. Unspecified slices are left untouched. */
198
- setState(partial: Partial<KjTableState>): void {
199
- this._state.update(s => ({ ...s, ...partial }));
200
- }
201
-
202
- /** Reset every slice back to the directive's default state. */
203
- resetState(): void { this._state.set(DEFAULT_STATE); }
204
-
205
- // ── Public API surface (AG-Grid-style) ─────────────────────────────────
206
- // Built lazily on first read so the TanStack table getter and the state
207
- // signal are already wired when callers touch the api.
208
-
209
- private _api?: { gridApi: KjGridApi<TData>; columnApi: KjColumnApi<TData> };
210
- private buildApi(): { gridApi: KjGridApi<TData>; columnApi: KjColumnApi<TData> } {
211
- return this._api ??= createGridApi<TData>({
212
- state: this._state.asReadonly(),
213
- table: this.table,
214
- patch: (key, updater) => this.patch(key, updater),
215
- setStateInternal: this._state.update.bind(this._state),
216
- resetState: () => this.resetState(),
217
- defaultState: DEFAULT_STATE,
218
- });
219
- }
220
-
221
- /**
222
- * Grid-wide imperative API — selection, sorting, filtering, pagination,
223
- * expansion, grouping, density, bulk state. Stable across grid lifetime.
224
- * Passed to custom filter/editor components via their params object so
225
- * user code never has to reach into TanStack or the directive directly.
226
- */
227
- get gridApi(): KjGridApi<TData> { return this.buildApi().gridApi; }
228
-
229
- /**
230
- * Per-column imperative API — visibility, width, pinning, order, grouping.
231
- * Mirrors AG-Grid's `ColumnApi`. Passed alongside `gridApi` to custom
232
- * filter/editor components.
233
- */
234
- get columnApi(): KjColumnApi<TData> { return this.buildApi().columnApi; }
235
- }
236
-
237
- /**
238
- * Shallow-equality check tuned for `KjTableState` slices — plain objects,
239
- * primitive arrays, and primitives. Returns `true` when `a` and `b` are
240
- * structurally identical at one level (object keys + values compared with
241
- * `Object.is`; arrays element-wise the same way). Falls back to `Object.is`
242
- * for non-object types. Cheap enough to run on every `patch()`.
243
- */
244
- function sliceEqual(a: unknown, b: unknown): boolean {
245
- if (Object.is(a, b)) return true;
246
- if (a == null || b == null) return false;
247
- if (typeof a !== 'object' || typeof b !== 'object') return false;
248
- if (Array.isArray(a)) {
249
- if (!Array.isArray(b) || a.length !== b.length) return false;
250
- for (let i = 0; i < a.length; i++) {
251
- const av = a[i];
252
- const bv = b[i];
253
- if (Object.is(av, bv)) continue;
254
- // Sorting / column-filter entries are plain objects — one-level deep.
255
- if (av && bv && typeof av === 'object' && typeof bv === 'object') {
256
- if (!sliceEqual(av, bv)) return false;
257
- } else {
258
- return false;
259
- }
260
- }
261
- return true;
262
- }
263
- if (Array.isArray(b)) return false;
264
- const ao = a as Record<string, unknown>;
265
- const bo = b as Record<string, unknown>;
266
- const ak = Object.keys(ao);
267
- const bk = Object.keys(bo);
268
- if (ak.length !== bk.length) return false;
269
- for (const k of ak) {
270
- const av = ao[k];
271
- const bv = bo[k];
272
- if (Object.is(av, bv)) continue;
273
- // columnPinning has `{ left: string[], right: string[] }` — recurse one level.
274
- if (Array.isArray(av) || (av && typeof av === 'object')) {
275
- if (!sliceEqual(av, bv)) return false;
276
- } else {
277
- return false;
278
- }
279
- }
280
- return true;
281
- }
@@ -1,83 +0,0 @@
1
- import type { ColumnDef, RowData, Table, SortingState, ColumnFiltersState, PaginationState, RowSelectionState, ColumnSizingState, VisibilityState, ColumnOrderState, ColumnPinningState, ExpandedState, GroupingState } from '@tanstack/angular-table';
2
- import type { TemplateRef, Type } from '@angular/core';
3
-
4
- /** Built-in column types. Drives filter widget, editor widget, formatter, alignment. */
5
- export type KjColumnType = 'text' | 'number' | 'date' | 'boolean' | 'select';
6
-
7
- /** Pin slot for a column. */
8
- export type KjColumnPin = 'left' | 'right' | null;
9
-
10
- /** Built-in aggregation kinds; pass a function for custom. */
11
- export type KjAggregationKind = 'sum' | 'avg' | 'min' | 'max' | 'count';
12
- export type KjAggregationFn<T> = (rows: readonly T[]) => unknown;
13
- export type KjAggregation<T> = KjAggregationKind | KjAggregationFn<T>;
14
-
15
- /** Editor / filter UI override: a component class OR a template ref. */
16
- export type KjEditorRef<TData = unknown, TValue = unknown> =
17
- | Type<unknown>
18
- | TemplateRef<{ row: TData; value: TValue; commit: (v: TValue) => void; cancel: () => void }>;
19
-
20
- export type KjFilterUiRef<TData = unknown> =
21
- | Type<unknown>
22
- | TemplateRef<{ column: unknown; table: Table<TData> }>;
23
-
24
- /** kj-specific meta stored on TanStack ColumnDef.meta.kj. */
25
- export interface KjColumnMeta<TData extends RowData = RowData> {
26
- type?: KjColumnType;
27
- editable?: boolean;
28
- filterable?: boolean;
29
- pin?: KjColumnPin;
30
- group?: boolean;
31
- agg?: KjAggregation<TData>;
32
- editor?: KjEditorRef<TData>;
33
- filterUi?: KjFilterUiRef<TData>;
34
- selectOptions?: ReadonlyArray<string | { value: unknown; label: string }>;
35
- exportable?: boolean;
36
- persist?: boolean;
37
- }
38
-
39
- /** kj column definition — TanStack ColumnDef extended with kj* top-level knobs. */
40
- export type KjColumnDef<TData extends RowData = RowData> =
41
- ColumnDef<TData> & {
42
- kjType?: KjColumnType;
43
- kjEditable?: boolean;
44
- kjFilterable?: boolean;
45
- kjPin?: KjColumnPin;
46
- kjGroup?: boolean;
47
- kjAgg?: KjAggregation<TData>;
48
- kjEditor?: KjEditorRef<TData>;
49
- kjFilterUi?: KjFilterUiRef<TData>;
50
- kjSelectOptions?: ReadonlyArray<string | { value: unknown; label: string }>;
51
- kjExportable?: boolean;
52
- kjPersist?: boolean;
53
- };
54
-
55
- /** Density preset applied to the styled wrapper. */
56
- export type KjTableDensity = 'compact' | 'standard' | 'comfortable';
57
-
58
- /**
59
- * Persistent table state — exposed as a single `DeepSignal<KjTableState>` and
60
- * emitted via `(stateChange)`. Transient drag state (`columnSizingInfo`) is
61
- * tracked separately on the directive and intentionally excluded here so it
62
- * never round-trips through storage adapters or change-detection emissions.
63
- */
64
- export interface KjTableState {
65
- readonly sorting: SortingState;
66
- readonly columnFilters: ColumnFiltersState;
67
- readonly globalFilter: string;
68
- readonly pagination: PaginationState;
69
- readonly rowSelection: RowSelectionState;
70
- readonly columnSizing: ColumnSizingState;
71
- readonly columnVisibility: VisibilityState;
72
- readonly columnOrder: ColumnOrderState;
73
- readonly columnPinning: ColumnPinningState;
74
- readonly expanded: ExpandedState;
75
- readonly grouping: GroupingState;
76
- readonly density: KjTableDensity;
77
- }
78
-
79
- /** Loader return value for kjTableResource. Matches TanStack manualPagination + rowCount. */
80
- export interface KjResourceResult<TData> {
81
- readonly rows: readonly TData[];
82
- readonly rowCount: number;
83
- }
package/src/tabs/index.ts DELETED
@@ -1,7 +0,0 @@
1
- export { KjTabs, KjTabList, KjTab, KjTabPanel } from './tabs';
2
- export {
3
- KJ_TABS,
4
- type KjTabsContext,
5
- type KjTabsActivationMode,
6
- type KjTabsOrientation,
7
- } from './tabs.context';
@@ -1,32 +0,0 @@
1
- import { InjectionToken, Signal } from '@angular/core';
2
-
3
- /** Activation modes per WAI-ARIA APG Tabs pattern. */
4
- export type KjTabsActivationMode = 'automatic' | 'manual';
5
-
6
- /** Tabs orientation. Drives `aria-orientation` and the roving arrow-axis. */
7
- export type KjTabsOrientation = 'horizontal' | 'vertical';
8
-
9
- /**
10
- * Context exposed by `KjTabs` to its child directives (`KjTabList`, `KjTab`,
11
- * `KjTabPanel`). Holds the active value, orientation, activation mode, and
12
- * id helpers for ARIA wiring.
13
- */
14
- export interface KjTabsContext {
15
- /** Currently active tab value. */
16
- readonly value: Signal<string>;
17
- /** Tabs orientation; drives `aria-orientation` and arrow-key axis. */
18
- readonly orientation: Signal<KjTabsOrientation>;
19
- /** Activation mode; `'automatic'` activates on focus, `'manual'` requires Enter/Space. */
20
- readonly activationMode: Signal<KjTabsActivationMode>;
21
- /** Unique id for the tab element associated with `value`. */
22
- tabId(value: string): string;
23
- /** Unique id for the panel element associated with `value`. */
24
- panelId(value: string): string;
25
- /** Whether the tab/panel pair for `value` is currently active. */
26
- isActive(value: string): boolean;
27
- /** Activates the tab/panel pair for `value`. No-op when the tab is disabled. */
28
- select(value: string): void;
29
- }
30
-
31
- /** Injection token for the root `KjTabs` directive context. */
32
- export const KJ_TABS = new InjectionToken<KjTabsContext>('KjTabs');