@koobiq/components 20.4.2 → 21.0.0

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 (771) hide show
  1. package/accordion/accordion-trigger.scss +3 -10
  2. package/accordion/accordion.scss +4 -6
  3. package/actions-panel/actions-panel-container.scss +45 -1
  4. package/alert/alert.component.scss +3 -2
  5. package/app-switcher/_app-switcher-theme.scss +0 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +3 -2
  7. package/app-switcher/app-switcher-dropdown-site.scss +2 -1
  8. package/app-switcher/{kbq-app-switcher-list-item.scss → app-switcher-list-item.scss} +18 -4
  9. package/app-switcher/app-switcher-tokens.scss +15 -0
  10. package/app-switcher/app-switcher.scss +14 -4
  11. package/autocomplete/autocomplete.scss +7 -6
  12. package/badge/badge.component.scss +5 -8
  13. package/breadcrumbs/breadcrumbs.scss +25 -10
  14. package/button/_button-base.scss +30 -7
  15. package/button/_button-theme.scss +16 -0
  16. package/button/button-group.scss +7 -0
  17. package/button/button-tokens.scss +0 -2
  18. package/button/button.scss +34 -2
  19. package/button-toggle/_button-toggle-theme.scss +7 -2
  20. package/button-toggle/button-toggle.scss +65 -15
  21. package/checkbox/_checkbox-theme.scss +4 -3
  22. package/checkbox/checkbox.scss +3 -6
  23. package/clamped-text/clamped-text.scss +6 -2
  24. package/code-block/code-block-tokens.scss +0 -224
  25. package/code-block/code-block.scss +20 -9
  26. package/content-panel/content-panel-aside.scss +3 -2
  27. package/content-panel/content-panel-container.scss +37 -0
  28. package/content-panel/content-panel.scss +4 -3
  29. package/core/highlight/_highlight-theme.scss +3 -1
  30. package/core/option/action-container.scss +2 -2
  31. package/core/option/action.scss +2 -1
  32. package/core/option/option.scss +2 -1
  33. package/core/pop-up/_pop-up.scss +0 -37
  34. package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +5 -10
  35. package/core/styles/_core.scss +3 -0
  36. package/core/styles/_koobiq-theme.scss +5 -6
  37. package/core/styles/common/_animation.scss +44 -16
  38. package/core/styles/common/_groups-mixins.scss +21 -19
  39. package/core/styles/common/_groups.scss +4 -32
  40. package/core/styles/common/_index.scss +0 -2
  41. package/core/styles/common/_link.scss +117 -0
  42. package/core/styles/common/_list.scss +0 -26
  43. package/core/styles/common/_overlay.scss +8 -10
  44. package/core/styles/common/_rtl.scss +0 -14
  45. package/core/styles/common/_select.scss +33 -15
  46. package/core/styles/common/_squircle.scss +63 -0
  47. package/core/styles/common/_tokens.scss +0 -11
  48. package/core/styles/common/_vendor-prefixes.scss +0 -20
  49. package/core/styles/functions/_timing.scss +0 -22
  50. package/core/styles/theming/_scrollbar-theme.scss +6 -1
  51. package/core/styles/theming/_theming.scss +13 -65
  52. package/core/styles/typography/_index.scss +0 -1
  53. package/core/styles/typography/_typography.scss +0 -143
  54. package/core/styles/visual/_body.scss +1 -6
  55. package/core/styles/visual/_layout.scss +0 -12
  56. package/datepicker/calendar-body.scss +3 -1
  57. package/datepicker/calendar-header.scss +0 -1
  58. package/datepicker/datepicker-content.scss +33 -1
  59. package/datepicker/datepicker-toggle.scss +0 -38
  60. package/dl/dl-tokens.scss +10 -0
  61. package/dl/dl.scss +113 -13
  62. package/dropdown/_dropdown-theme.scss +4 -16
  63. package/dropdown/dropdown-item.scss +4 -10
  64. package/dropdown/dropdown.scss +2 -1
  65. package/empty-state/_empty-state-theme.scss +10 -4
  66. package/empty-state/empty-state-tokens.scss +4 -4
  67. package/empty-state/empty-state.scss +4 -0
  68. package/fesm2022/koobiq-components-accordion.mjs +347 -229
  69. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-actions-panel.mjs +302 -187
  71. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-alert.mjs +39 -39
  73. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-app-switcher.mjs +677 -367
  75. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-autocomplete.mjs +620 -253
  77. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-badge.mjs +46 -48
  79. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-breadcrumbs.mjs +221 -169
  81. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-button-toggle.mjs +565 -196
  83. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-button.mjs +332 -116
  85. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-checkbox.mjs +172 -132
  87. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-clamped-text.mjs +165 -158
  89. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-code-block.mjs +755 -601
  91. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-content-panel.mjs +260 -143
  93. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-core.mjs +4342 -1595
  95. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-datepicker.mjs +1713 -1606
  97. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-divider.mjs +73 -36
  99. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-dl.mjs +447 -89
  101. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-dropdown.mjs +703 -599
  103. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-dynamic-translation.mjs +20 -20
  105. package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-ellipsis-center.mjs +46 -31
  107. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-empty-state.mjs +116 -60
  109. package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-file-upload.mjs +550 -290
  111. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-filter-bar.mjs +2810 -2538
  113. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-flag.mjs +79 -24
  115. package/fesm2022/koobiq-components-flag.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-form-field.mjs +389 -525
  117. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-icon.mjs +366 -136
  119. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  120. package/fesm2022/koobiq-components-inline-edit.mjs +429 -212
  121. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  122. package/fesm2022/koobiq-components-input.mjs +601 -459
  123. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  124. package/fesm2022/koobiq-components-link-deprecated.mjs +196 -0
  125. package/fesm2022/koobiq-components-link-deprecated.mjs.map +1 -0
  126. package/fesm2022/koobiq-components-link.mjs +328 -125
  127. package/fesm2022/koobiq-components-link.mjs.map +1 -1
  128. package/fesm2022/koobiq-components-list.mjs +583 -433
  129. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  130. package/fesm2022/koobiq-components-loader-overlay.mjs +167 -68
  131. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  132. package/fesm2022/koobiq-components-markdown.mjs +55 -78
  133. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  134. package/fesm2022/koobiq-components-modal.mjs +853 -475
  135. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  136. package/fesm2022/koobiq-components-navbar.mjs +895 -556
  137. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  138. package/fesm2022/koobiq-components-notification-center.mjs +680 -310
  139. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  140. package/fesm2022/koobiq-components-overflow-items.mjs +46 -64
  141. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  142. package/fesm2022/koobiq-components-popover.mjs +684 -285
  143. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  144. package/fesm2022/koobiq-components-progress-bar.mjs +87 -33
  145. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  146. package/fesm2022/koobiq-components-progress-spinner.mjs +52 -43
  147. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  148. package/fesm2022/koobiq-components-radio.mjs +450 -231
  149. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  150. package/fesm2022/koobiq-components-resizer.mjs +127 -21
  151. package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
  152. package/fesm2022/koobiq-components-scrollbar-deprecated.mjs +299 -0
  153. package/fesm2022/koobiq-components-scrollbar-deprecated.mjs.map +1 -0
  154. package/fesm2022/koobiq-components-scrollbar.mjs +745 -222
  155. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  156. package/fesm2022/koobiq-components-search-expandable.mjs +288 -126
  157. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  158. package/fesm2022/koobiq-components-select.mjs +883 -693
  159. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  160. package/fesm2022/koobiq-components-sidebar.mjs +207 -88
  161. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  162. package/fesm2022/koobiq-components-sidepanel.mjs +689 -296
  163. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  164. package/fesm2022/koobiq-components-skeleton.mjs +815 -41
  165. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  166. package/fesm2022/koobiq-components-split-button.mjs +109 -88
  167. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  168. package/fesm2022/koobiq-components-splitter-deprecated.mjs +591 -0
  169. package/fesm2022/koobiq-components-splitter-deprecated.mjs.map +1 -0
  170. package/fesm2022/koobiq-components-splitter.mjs +890 -501
  171. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  172. package/fesm2022/koobiq-components-table.mjs +63 -49
  173. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  174. package/fesm2022/koobiq-components-tabs.mjs +1062 -603
  175. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  176. package/fesm2022/koobiq-components-tags.mjs +886 -733
  177. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  178. package/fesm2022/koobiq-components-textarea.mjs +213 -185
  179. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  180. package/fesm2022/koobiq-components-time-range.mjs +299 -147
  181. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  182. package/fesm2022/koobiq-components-timepicker.mjs +233 -245
  183. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  184. package/fesm2022/koobiq-components-timezone.mjs +344 -142
  185. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  186. package/fesm2022/koobiq-components-title.mjs +229 -145
  187. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  188. package/fesm2022/koobiq-components-toast.mjs +463 -143
  189. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  190. package/fesm2022/koobiq-components-toggle.mjs +177 -130
  191. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  192. package/fesm2022/koobiq-components-tooltip.mjs +657 -214
  193. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  194. package/fesm2022/koobiq-components-top-bar.mjs +61 -32
  195. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  196. package/fesm2022/koobiq-components-tree-select.mjs +719 -488
  197. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  198. package/fesm2022/koobiq-components-tree.mjs +1506 -558
  199. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  200. package/fesm2022/koobiq-components-username.mjs +290 -135
  201. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  202. package/file-upload/dropzone.scss +31 -3
  203. package/file-upload/file-upload-tokens.scss +2 -22
  204. package/file-upload/file-upload.scss +6 -0
  205. package/file-upload/multiple-file-upload.component.scss +14 -12
  206. package/file-upload/single-file-upload.component.scss +3 -2
  207. package/filter-bar/filters.scss +7 -0
  208. package/filter-bar/pipes/base-pipe.scss +3 -3
  209. package/filter-bar/pipes/pipe-date.scss +8 -1
  210. package/flag/flag-tokens.scss +22 -0
  211. package/flag/flag.scss +34 -21
  212. package/form-field/{_fiedset-theme.scss → _fieldset-theme.scss} +1 -5
  213. package/form-field/_form-field-theme.scss +4 -9
  214. package/form-field/cleaner.scss +3 -1
  215. package/form-field/fieldset.scss +3 -4
  216. package/form-field/form-field.scss +26 -21
  217. package/form-field/password-toggle.scss +3 -1
  218. package/icon/_icon-button-theme.scss +7 -0
  219. package/icon/_icon-theme.scss +10 -7
  220. package/icon/icon-button.scss +0 -2
  221. package/icon/icon-tokens.scss +12 -9
  222. package/inline-edit/inline-edit.scss +40 -54
  223. package/input/input.scss +4 -0
  224. package/link/{_link-theme.scss → deprecated/_link-theme.scss} +11 -6
  225. package/link/deprecated/link-tokens.scss +27 -0
  226. package/link/link-tokens.scss +6 -25
  227. package/link/link.scss +137 -0
  228. package/list/list.scss +3 -2
  229. package/loader-overlay/_loader-overlay-theme.scss +19 -10
  230. package/loader-overlay/loader-overlay-tokens.scss +0 -2
  231. package/loader-overlay/loader-overlay.scss +7 -1
  232. package/markdown/_markdown-theme.scss +16 -0
  233. package/markdown/markdown-tokens.scss +5 -0
  234. package/markdown/markdown.scss +2 -1
  235. package/modal/_modal-animation.scss +23 -14
  236. package/modal/modal-tokens.scss +2 -1
  237. package/modal/modal.scss +35 -31
  238. package/navbar/_navbar-item_horizontal.scss +8 -6
  239. package/navbar/_navbar-item_vertical.scss +18 -6
  240. package/navbar/_navbar-theme.scss +9 -1
  241. package/navbar/navbar-brand.scss +8 -6
  242. package/navbar/navbar-divider.scss +1 -1
  243. package/navbar/navbar-item.scss +8 -9
  244. package/navbar/navbar-toggle.scss +3 -3
  245. package/navbar/navbar-tokens.scss +14 -0
  246. package/navbar/navbar.scss +1 -2
  247. package/navbar/vertical-navbar.scss +2 -2
  248. package/notification-center/_notification-center-theme.scss +11 -6
  249. package/notification-center/notification-center-tokens.scss +33 -0
  250. package/notification-center/notification-center.scss +58 -20
  251. package/notification-center/notification-item.scss +15 -6
  252. package/package.json +112 -81
  253. package/popover/popover-tokens.scss +0 -2
  254. package/popover/popover.scss +41 -19
  255. package/prebuilt-themes/theme.css +1 -1
  256. package/progress-bar/_progress-bar-theme.scss +20 -3
  257. package/progress-bar/progress-bar-tokens.scss +3 -0
  258. package/progress-bar/progress-bar.scss +36 -8
  259. package/progress-spinner/progress-spinner.scss +4 -3
  260. package/radio/_radio-theme.scss +21 -4
  261. package/radio/radio-tokens.scss +7 -3
  262. package/radio/radio.scss +55 -8
  263. package/schematics/collection.json +399 -7
  264. package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
  265. package/schematics/migrations/accordion-state-saving-default/data.js +75 -0
  266. package/schematics/migrations/accordion-state-saving-default/index.js +60 -0
  267. package/schematics/migrations/accordion-state-saving-default/schema.json +15 -0
  268. package/schematics/migrations/actions-panel-overlay-container/README.md +35 -0
  269. package/schematics/migrations/actions-panel-overlay-container/data.js +47 -0
  270. package/schematics/migrations/actions-panel-overlay-container/index.js +54 -0
  271. package/schematics/migrations/actions-panel-overlay-container/schema.json +15 -0
  272. package/schematics/migrations/alert-signals/README.md +13 -7
  273. package/schematics/migrations/alert-signals/data.js +3 -0
  274. package/schematics/migrations/alert-signals/index.js +70 -203
  275. package/schematics/migrations/angular-animations-removal/README.md +46 -0
  276. package/schematics/migrations/angular-animations-removal/data.js +150 -0
  277. package/schematics/migrations/angular-animations-removal/index.js +20 -0
  278. package/schematics/migrations/angular-animations-removal/schema.json +15 -0
  279. package/schematics/migrations/app-switcher-signals/README.md +88 -0
  280. package/schematics/migrations/app-switcher-signals/data.js +136 -0
  281. package/schematics/migrations/app-switcher-signals/index.js +365 -0
  282. package/schematics/migrations/app-switcher-signals/schema.json +20 -0
  283. package/schematics/migrations/autocomplete-panel-width-auto/README.md +2 -2
  284. package/schematics/migrations/autocomplete-panel-width-auto/index.js +1 -1
  285. package/schematics/migrations/autocomplete-signals/README.md +92 -0
  286. package/schematics/migrations/autocomplete-signals/data.js +149 -0
  287. package/schematics/migrations/autocomplete-signals/index.js +706 -0
  288. package/schematics/migrations/autocomplete-signals/schema.json +20 -0
  289. package/schematics/migrations/badge-signals/README.md +77 -0
  290. package/schematics/migrations/badge-signals/data.js +109 -0
  291. package/schematics/migrations/badge-signals/index.js +693 -0
  292. package/schematics/migrations/badge-signals/schema.json +20 -0
  293. package/schematics/migrations/button-state-and-styles/README.md +129 -0
  294. package/schematics/migrations/button-state-and-styles/data.js +136 -0
  295. package/schematics/migrations/button-state-and-styles/index.js +220 -0
  296. package/schematics/migrations/button-state-and-styles/schema.json +20 -0
  297. package/schematics/migrations/button-supported-colors/README.md +73 -0
  298. package/schematics/migrations/button-supported-colors/data.js +106 -0
  299. package/schematics/migrations/button-supported-colors/index.js +260 -0
  300. package/schematics/migrations/button-supported-colors/schema.json +20 -0
  301. package/schematics/migrations/button-toggle-signals-and-aria/README.md +137 -0
  302. package/schematics/migrations/button-toggle-signals-and-aria/data.js +200 -0
  303. package/schematics/migrations/button-toggle-signals-and-aria/index.js +496 -0
  304. package/schematics/migrations/button-toggle-signals-and-aria/schema.json +20 -0
  305. package/schematics/migrations/button-truncation/README.md +110 -0
  306. package/schematics/migrations/button-truncation/data.js +88 -0
  307. package/schematics/migrations/button-truncation/index.js +269 -0
  308. package/schematics/migrations/button-truncation/schema.json +20 -0
  309. package/schematics/migrations/checkbox-signals/README.md +76 -0
  310. package/schematics/migrations/checkbox-signals/data.js +114 -0
  311. package/schematics/migrations/checkbox-signals/index.js +634 -0
  312. package/schematics/migrations/checkbox-signals/schema.json +20 -0
  313. package/schematics/migrations/clamped-text-disclosure/README.md +62 -0
  314. package/schematics/migrations/clamped-text-disclosure/data.js +101 -0
  315. package/schematics/migrations/clamped-text-disclosure/index.js +59 -0
  316. package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
  317. package/schematics/migrations/code-block-signals/README.md +84 -0
  318. package/schematics/migrations/code-block-signals/data.js +121 -0
  319. package/schematics/migrations/code-block-signals/index.js +700 -0
  320. package/schematics/migrations/code-block-signals/schema.json +20 -0
  321. package/schematics/migrations/color-signals/README.md +46 -0
  322. package/schematics/migrations/color-signals/data.js +131 -0
  323. package/schematics/migrations/color-signals/index.js +19 -0
  324. package/schematics/migrations/color-signals/schema.json +20 -0
  325. package/schematics/migrations/core-mixins-removal/README.md +20 -0
  326. package/schematics/migrations/core-mixins-removal/data.js +27 -0
  327. package/schematics/migrations/core-mixins-removal/index.js +17 -0
  328. package/schematics/migrations/core-mixins-removal/schema.json +15 -0
  329. package/schematics/migrations/css-selectors/README.md +2 -2
  330. package/schematics/migrations/css-selectors/index.js +1 -1
  331. package/schematics/migrations/datepicker-signals/README.md +24 -0
  332. package/schematics/migrations/datepicker-signals/data.js +49 -0
  333. package/schematics/migrations/datepicker-signals/index.js +17 -0
  334. package/schematics/migrations/datepicker-signals/schema.json +15 -0
  335. package/schematics/migrations/deprecated-icons/README.md +2 -2
  336. package/schematics/migrations/deprecated-icons/index.js +1 -1
  337. package/schematics/migrations/design-tokens-v4/README.md +75 -0
  338. package/schematics/migrations/design-tokens-v4/index.js +59 -0
  339. package/schematics/migrations/design-tokens-v4/schema.json +15 -0
  340. package/schematics/migrations/divider-signals-and-aria/README.md +47 -0
  341. package/schematics/migrations/divider-signals-and-aria/data.js +62 -0
  342. package/schematics/migrations/divider-signals-and-aria/index.js +211 -0
  343. package/schematics/migrations/divider-signals-and-aria/schema.json +15 -0
  344. package/schematics/migrations/dl-attribute-coercion/README.md +59 -0
  345. package/schematics/migrations/dl-attribute-coercion/data.js +85 -0
  346. package/schematics/migrations/dl-attribute-coercion/index.js +161 -0
  347. package/schematics/migrations/dl-attribute-coercion/schema.json +15 -0
  348. package/schematics/migrations/dl-standalone-names/README.md +49 -0
  349. package/schematics/migrations/dl-standalone-names/data.js +44 -0
  350. package/schematics/migrations/dl-standalone-names/index.js +321 -0
  351. package/schematics/migrations/dl-standalone-names/schema.json +20 -0
  352. package/schematics/migrations/dropdown-demote-overlay/README.md +137 -0
  353. package/schematics/migrations/dropdown-demote-overlay/data.js +84 -0
  354. package/schematics/migrations/dropdown-demote-overlay/index.js +288 -0
  355. package/schematics/migrations/dropdown-demote-overlay/schema.json +20 -0
  356. package/schematics/migrations/dropdown-signals/README.md +83 -0
  357. package/schematics/migrations/dropdown-signals/data.js +152 -0
  358. package/schematics/migrations/dropdown-signals/index.js +19 -0
  359. package/schematics/migrations/dropdown-signals/schema.json +20 -0
  360. package/schematics/migrations/empty-state-error-color/README.md +84 -0
  361. package/schematics/migrations/empty-state-error-color/data.js +85 -0
  362. package/schematics/migrations/empty-state-error-color/index.js +71 -0
  363. package/schematics/migrations/empty-state-error-color/schema.json +15 -0
  364. package/schematics/migrations/empty-state-size-attr/README.md +2 -2
  365. package/schematics/migrations/empty-state-size-attr/index.js +1 -1
  366. package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
  367. package/schematics/migrations/file-upload-cva-and-primitives/data.js +97 -0
  368. package/schematics/migrations/file-upload-cva-and-primitives/index.js +60 -0
  369. package/schematics/migrations/file-upload-cva-and-primitives/schema.json +15 -0
  370. package/schematics/migrations/file-upload-deprecated-outputs/README.md +90 -0
  371. package/schematics/migrations/file-upload-deprecated-outputs/data.js +20 -0
  372. package/schematics/migrations/file-upload-deprecated-outputs/index.js +70 -0
  373. package/schematics/migrations/file-upload-deprecated-outputs/schema.json +20 -0
  374. package/schematics/migrations/filter-bar-rename-action/README.md +183 -0
  375. package/schematics/migrations/filter-bar-rename-action/data.js +151 -0
  376. package/schematics/migrations/filter-bar-rename-action/index.js +177 -0
  377. package/schematics/migrations/filter-bar-rename-action/schema.json +20 -0
  378. package/schematics/migrations/filter-bar-signals/README.md +27 -16
  379. package/schematics/migrations/filter-bar-signals/data.js +1 -2
  380. package/schematics/migrations/filter-bar-signals/index.js +100 -195
  381. package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
  382. package/schematics/migrations/filter-bar-state-saving-default/data.js +87 -0
  383. package/schematics/migrations/filter-bar-state-saving-default/index.js +61 -0
  384. package/schematics/migrations/filter-bar-state-saving-default/schema.json +15 -0
  385. package/schematics/migrations/flag-inner-html/README.md +67 -0
  386. package/schematics/migrations/flag-inner-html/data.js +58 -0
  387. package/schematics/migrations/flag-inner-html/index.js +61 -0
  388. package/schematics/migrations/flag-inner-html/schema.json +15 -0
  389. package/schematics/migrations/form-field-signals/README.md +125 -0
  390. package/schematics/migrations/form-field-signals/data.js +288 -0
  391. package/schematics/migrations/form-field-signals/index.js +382 -0
  392. package/schematics/migrations/form-field-signals/schema.json +20 -0
  393. package/schematics/migrations/icon-semantics-and-api/README.md +65 -0
  394. package/schematics/migrations/icon-semantics-and-api/data.js +97 -0
  395. package/schematics/migrations/icon-semantics-and-api/index.js +64 -0
  396. package/schematics/migrations/icon-semantics-and-api/schema.json +15 -0
  397. package/schematics/migrations/icons-replacement/README.md +5 -5
  398. package/schematics/migrations/icons-replacement/index.js +1 -1
  399. package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
  400. package/schematics/migrations/inline-edit-a11y-and-types/data.js +117 -0
  401. package/schematics/migrations/inline-edit-a11y-and-types/index.js +97 -0
  402. package/schematics/migrations/inline-edit-a11y-and-types/schema.json +20 -0
  403. package/schematics/migrations/input-number-surface/README.md +140 -0
  404. package/schematics/migrations/input-number-surface/data.js +135 -0
  405. package/schematics/migrations/input-number-surface/index.js +292 -0
  406. package/schematics/migrations/input-number-surface/schema.json +20 -0
  407. package/schematics/migrations/input-signals/README.md +20 -0
  408. package/schematics/migrations/input-signals/data.js +30 -0
  409. package/schematics/migrations/input-signals/index.js +17 -0
  410. package/schematics/migrations/input-signals/schema.json +15 -0
  411. package/schematics/migrations/link-deprecated-path/README.md +144 -0
  412. package/schematics/migrations/link-deprecated-path/index.js +19 -0
  413. package/schematics/migrations/link-deprecated-path/schema.json +20 -0
  414. package/schematics/migrations/link-signals/README.md +71 -0
  415. package/schematics/migrations/link-signals/data.js +116 -0
  416. package/schematics/migrations/link-signals/index.js +415 -0
  417. package/schematics/migrations/link-signals/schema.json +20 -0
  418. package/schematics/migrations/list-signals/README.md +22 -0
  419. package/schematics/migrations/list-signals/data.js +35 -0
  420. package/schematics/migrations/list-signals/index.js +17 -0
  421. package/schematics/migrations/list-signals/schema.json +15 -0
  422. package/schematics/migrations/list-tree-multiple-input/README.md +105 -0
  423. package/schematics/migrations/list-tree-multiple-input/data.js +74 -0
  424. package/schematics/migrations/list-tree-multiple-input/index.js +221 -0
  425. package/schematics/migrations/list-tree-multiple-input/schema.json +20 -0
  426. package/schematics/migrations/loader-overlay-signals/README.md +62 -0
  427. package/schematics/migrations/loader-overlay-signals/data.js +101 -0
  428. package/schematics/migrations/loader-overlay-signals/index.js +697 -0
  429. package/schematics/migrations/loader-overlay-signals/schema.json +20 -0
  430. package/schematics/migrations/loader-overlay-size-attr/README.md +2 -2
  431. package/schematics/migrations/loader-overlay-size-attr/index.js +1 -1
  432. package/schematics/migrations/locale-configuration-providers/README.md +163 -0
  433. package/schematics/migrations/locale-configuration-providers/data.js +257 -0
  434. package/schematics/migrations/locale-configuration-providers/index.js +294 -0
  435. package/schematics/migrations/locale-configuration-providers/schema.json +20 -0
  436. package/schematics/migrations/mandatory-peer-dependencies/README.md +70 -0
  437. package/schematics/migrations/mandatory-peer-dependencies/index.js +42 -0
  438. package/schematics/migrations/mandatory-peer-dependencies/schema.json +15 -0
  439. package/schematics/migrations/markdown-signals/README.md +58 -0
  440. package/schematics/migrations/markdown-signals/data.js +79 -0
  441. package/schematics/migrations/markdown-signals/index.js +639 -0
  442. package/schematics/migrations/markdown-signals/schema.json +20 -0
  443. package/schematics/migrations/modal-dialog-semantics/README.md +106 -0
  444. package/schematics/migrations/modal-dialog-semantics/data.js +110 -0
  445. package/schematics/migrations/modal-dialog-semantics/index.js +58 -0
  446. package/schematics/migrations/modal-dialog-semantics/schema.json +15 -0
  447. package/schematics/migrations/modal-signals/README.md +88 -0
  448. package/schematics/migrations/modal-signals/data.js +132 -0
  449. package/schematics/migrations/modal-signals/index.js +19 -0
  450. package/schematics/migrations/modal-signals/schema.json +20 -0
  451. package/schematics/migrations/navbar-signals-and-aria/README.md +111 -0
  452. package/schematics/migrations/navbar-signals-and-aria/data.js +198 -0
  453. package/schematics/migrations/navbar-signals-and-aria/index.js +568 -0
  454. package/schematics/migrations/navbar-signals-and-aria/schema.json +20 -0
  455. package/schematics/migrations/new-icons-pack/README.md +10 -10
  456. package/schematics/migrations/new-icons-pack/index.js +1 -1
  457. package/schematics/migrations/notification-center-signals/README.md +67 -0
  458. package/schematics/migrations/notification-center-signals/data.js +66 -0
  459. package/schematics/migrations/notification-center-signals/index.js +61 -0
  460. package/schematics/migrations/notification-center-signals/schema.json +15 -0
  461. package/schematics/migrations/option-signals/README.md +37 -0
  462. package/schematics/migrations/option-signals/data.js +86 -0
  463. package/schematics/migrations/option-signals/index.js +19 -0
  464. package/schematics/migrations/option-signals/schema.json +20 -0
  465. package/schematics/migrations/popover-leave-delay/README.md +51 -0
  466. package/schematics/migrations/popover-leave-delay/data.js +61 -0
  467. package/schematics/migrations/popover-leave-delay/index.js +54 -0
  468. package/schematics/migrations/popover-leave-delay/schema.json +15 -0
  469. package/schematics/migrations/progress-bar-percentage-and-aria/README.md +54 -0
  470. package/schematics/migrations/progress-bar-percentage-and-aria/data.js +76 -0
  471. package/schematics/migrations/progress-bar-percentage-and-aria/index.js +58 -0
  472. package/schematics/migrations/progress-bar-percentage-and-aria/schema.json +15 -0
  473. package/schematics/migrations/progress-spinner-signals/README.md +72 -0
  474. package/schematics/migrations/progress-spinner-signals/data.js +83 -0
  475. package/schematics/migrations/progress-spinner-signals/index.js +694 -0
  476. package/schematics/migrations/progress-spinner-signals/schema.json +20 -0
  477. package/schematics/migrations/query-list-signals/README.md +32 -0
  478. package/schematics/migrations/query-list-signals/data.js +70 -0
  479. package/schematics/migrations/query-list-signals/index.js +17 -0
  480. package/schematics/migrations/query-list-signals/schema.json +15 -0
  481. package/schematics/migrations/radio-signals-and-aria/README.md +82 -0
  482. package/schematics/migrations/radio-signals-and-aria/data.js +163 -0
  483. package/schematics/migrations/radio-signals-and-aria/index.js +39 -0
  484. package/schematics/migrations/radio-signals-and-aria/schema.json +20 -0
  485. package/schematics/migrations/read-state-dwell-handlers/README.md +125 -0
  486. package/schematics/migrations/read-state-dwell-handlers/data.js +45 -0
  487. package/schematics/migrations/read-state-dwell-handlers/index.js +215 -0
  488. package/schematics/migrations/read-state-dwell-handlers/schema.json +20 -0
  489. package/schematics/migrations/scrollbar-deprecated-path/README.md +128 -0
  490. package/schematics/migrations/scrollbar-deprecated-path/index.js +20 -0
  491. package/schematics/migrations/scrollbar-deprecated-path/schema.json +20 -0
  492. package/schematics/migrations/select-signal-inputs/README.md +61 -0
  493. package/schematics/migrations/select-signal-inputs/data.js +99 -0
  494. package/schematics/migrations/select-signal-inputs/index.js +57 -0
  495. package/schematics/migrations/select-signal-inputs/schema.json +15 -0
  496. package/schematics/migrations/sidepanel-non-modal-behavior/README.md +57 -0
  497. package/schematics/migrations/sidepanel-non-modal-behavior/data.js +111 -0
  498. package/schematics/migrations/sidepanel-non-modal-behavior/index.js +57 -0
  499. package/schematics/migrations/sidepanel-non-modal-behavior/schema.json +15 -0
  500. package/schematics/migrations/signal-inputs-subclasses/README.md +28 -0
  501. package/schematics/migrations/signal-inputs-subclasses/data.js +69 -0
  502. package/schematics/migrations/signal-inputs-subclasses/index.js +17 -0
  503. package/schematics/migrations/signal-inputs-subclasses/schema.json +15 -0
  504. package/schematics/migrations/split-button-optional-disabled/README.md +47 -0
  505. package/schematics/migrations/split-button-optional-disabled/data.js +53 -0
  506. package/schematics/migrations/split-button-optional-disabled/index.js +57 -0
  507. package/schematics/migrations/split-button-optional-disabled/schema.json +15 -0
  508. package/schematics/migrations/splitter-deprecated-path/README.md +136 -0
  509. package/schematics/migrations/splitter-deprecated-path/index.js +20 -0
  510. package/schematics/migrations/splitter-deprecated-path/schema.json +20 -0
  511. package/schematics/migrations/state-saving-default/README.md +67 -0
  512. package/schematics/migrations/state-saving-default/data.js +88 -0
  513. package/schematics/migrations/state-saving-default/index.js +62 -0
  514. package/schematics/migrations/state-saving-default/schema.json +15 -0
  515. package/schematics/migrations/table-cell-content/README.md +55 -0
  516. package/schematics/migrations/table-cell-content/data.js +66 -0
  517. package/schematics/migrations/table-cell-content/index.js +66 -0
  518. package/schematics/migrations/table-cell-content/schema.json +15 -0
  519. package/schematics/migrations/tabs-signals-and-aria/README.md +93 -0
  520. package/schematics/migrations/tabs-signals-and-aria/data.js +139 -0
  521. package/schematics/migrations/tabs-signals-and-aria/index.js +65 -0
  522. package/schematics/migrations/tabs-signals-and-aria/schema.json +15 -0
  523. package/schematics/migrations/tag-list-cleaner/README.md +58 -0
  524. package/schematics/migrations/tag-list-cleaner/data.js +42 -0
  525. package/schematics/migrations/tag-list-cleaner/index.js +196 -0
  526. package/schematics/migrations/tag-list-cleaner/schema.json +20 -0
  527. package/schematics/migrations/tag-slots/README.md +41 -0
  528. package/schematics/migrations/tag-slots/index.js +190 -0
  529. package/schematics/migrations/tag-slots/schema.json +20 -0
  530. package/schematics/migrations/tags-signals/README.md +85 -0
  531. package/schematics/migrations/tags-signals/data.js +103 -0
  532. package/schematics/migrations/tags-signals/index.js +673 -0
  533. package/schematics/migrations/tags-signals/schema.json +20 -0
  534. package/schematics/migrations/textarea-signals/README.md +72 -0
  535. package/schematics/migrations/textarea-signals/data.js +121 -0
  536. package/schematics/migrations/textarea-signals/index.js +379 -0
  537. package/schematics/migrations/textarea-signals/schema.json +20 -0
  538. package/schematics/migrations/time-range-title-for/README.md +164 -0
  539. package/schematics/migrations/time-range-title-for/data.js +139 -0
  540. package/schematics/migrations/time-range-title-for/index.js +163 -0
  541. package/schematics/migrations/time-range-title-for/schema.json +20 -0
  542. package/schematics/migrations/timepicker-signals/README.md +78 -0
  543. package/schematics/migrations/timepicker-signals/data.js +82 -0
  544. package/schematics/migrations/timepicker-signals/index.js +709 -0
  545. package/schematics/migrations/timepicker-signals/schema.json +20 -0
  546. package/schematics/migrations/timezone-grouping-utils/README.md +73 -0
  547. package/schematics/migrations/timezone-grouping-utils/data.js +101 -0
  548. package/schematics/migrations/timezone-grouping-utils/index.js +64 -0
  549. package/schematics/migrations/timezone-grouping-utils/schema.json +15 -0
  550. package/schematics/migrations/title-encapsulation/README.md +49 -0
  551. package/schematics/migrations/title-encapsulation/data.js +69 -0
  552. package/schematics/migrations/title-encapsulation/index.js +57 -0
  553. package/schematics/migrations/title-encapsulation/schema.json +15 -0
  554. package/schematics/migrations/toast-stack-and-defaults/README.md +102 -0
  555. package/schematics/migrations/toast-stack-and-defaults/data.js +79 -0
  556. package/schematics/migrations/toast-stack-and-defaults/index.js +53 -0
  557. package/schematics/migrations/toast-stack-and-defaults/schema.json +15 -0
  558. package/schematics/migrations/tooltip-pointer-events-and-types/README.md +53 -0
  559. package/schematics/migrations/tooltip-pointer-events-and-types/data.js +89 -0
  560. package/schematics/migrations/tooltip-pointer-events-and-types/index.js +60 -0
  561. package/schematics/migrations/tooltip-pointer-events-and-types/schema.json +15 -0
  562. package/schematics/migrations/top-bar-container-selectors/README.md +111 -0
  563. package/schematics/migrations/top-bar-container-selectors/data.js +56 -0
  564. package/schematics/migrations/top-bar-container-selectors/index.js +84 -0
  565. package/schematics/migrations/top-bar-container-selectors/schema.json +20 -0
  566. package/schematics/migrations/tree-select-signals/README.md +61 -0
  567. package/schematics/migrations/tree-select-signals/data.js +106 -0
  568. package/schematics/migrations/tree-select-signals/index.js +58 -0
  569. package/schematics/migrations/tree-select-signals/schema.json +15 -0
  570. package/schematics/migrations/tree-signals/README.md +82 -0
  571. package/schematics/migrations/tree-signals/data.js +123 -0
  572. package/schematics/migrations/tree-signals/index.js +54 -0
  573. package/schematics/migrations/tree-signals/schema.json +15 -0
  574. package/schematics/migrations/tree-state-saving-default/README.md +66 -0
  575. package/schematics/migrations/tree-state-saving-default/data.js +78 -0
  576. package/schematics/migrations/tree-state-saving-default/index.js +60 -0
  577. package/schematics/migrations/tree-state-saving-default/schema.json +15 -0
  578. package/schematics/migrations/username-pipe-injection/README.md +59 -0
  579. package/schematics/migrations/username-pipe-injection/data.js +78 -0
  580. package/schematics/migrations/username-pipe-injection/index.js +58 -0
  581. package/schematics/migrations/username-pipe-injection/schema.json +15 -0
  582. package/schematics/migrations/v20-upgrade/README.md +36 -16
  583. package/schematics/migrations/v20-upgrade/data.js +124 -77
  584. package/schematics/migrations/v20-upgrade/index.js +6 -213
  585. package/schematics/migrations/v21-upgrade/README.md +271 -0
  586. package/schematics/migrations/v21-upgrade/data.js +1371 -0
  587. package/schematics/migrations/v21-upgrade/index.js +94 -0
  588. package/schematics/migrations/v21-upgrade/schema.json +20 -0
  589. package/schematics/migrations/zoneless-change-detection/README.md +30 -0
  590. package/schematics/migrations/zoneless-change-detection/data.js +29 -0
  591. package/schematics/migrations/zoneless-change-detection/index.js +20 -0
  592. package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
  593. package/schematics/migrations.json +392 -2
  594. package/schematics/ng-add/index.js +515 -14
  595. package/schematics/ng-add/schema.json +15 -0
  596. package/schematics/utils/deprecated-path-migration.js +61 -0
  597. package/schematics/utils/package-config.js +9 -105
  598. package/scrollbar/{_scrollbar-component-theme.scss → deprecated/_scrollbar-component-theme.scss} +1 -1
  599. package/scrollbar/{scrollbar.component.scss → deprecated/scrollbar.component.scss} +1 -1
  600. package/scrollbar/native-scrollbar.scss +68 -0
  601. package/scrollbar/scrollbar-tokens.scss +13 -22
  602. package/scrollbar/scrollbar-track.scss +94 -0
  603. package/scrollbar/scrollbar-viewport.scss +33 -0
  604. package/scrollbar/scrollbar.scss +24 -0
  605. package/search-expandable/search-expandable-tokens.scss +4 -0
  606. package/search-expandable/search-expandable.scss +4 -2
  607. package/select/_select-theme.scss +3 -16
  608. package/select/select.scss +0 -6
  609. package/sidebar/sidebar.scss +20 -0
  610. package/sidepanel/_sidepanel-theme.scss +1 -1
  611. package/sidepanel/sidepanel-tokens.scss +7 -1
  612. package/sidepanel/sidepanel.scss +41 -5
  613. package/skeleton/skeleton-presets.scss +350 -0
  614. package/skeleton/skeleton-tokens.scss +127 -0
  615. package/skeleton/skeleton.scss +53 -45
  616. package/split-button/_split-button-theme.scss +4 -4
  617. package/split-button/split-button.scss +2 -6
  618. package/splitter/{_splitter-theme.scss → deprecated/_splitter-theme.scss} +1 -1
  619. package/splitter/deprecated/splitter.scss +51 -0
  620. package/splitter/splitter-tokens.scss +19 -0
  621. package/splitter/splitter.scss +148 -28
  622. package/table/_table-theme.scss +13 -12
  623. package/table/table-tokens.scss +8 -0
  624. package/table/table.scss +47 -22
  625. package/tabs/_tabs-common.scss +14 -14
  626. package/tabs/_tabs-theme.scss +4 -5
  627. package/tabs/tab-body.scss +49 -1
  628. package/tabs/tab-header.scss +2 -1
  629. package/tags/tag-list.scss +4 -0
  630. package/tags/tag.scss +19 -1
  631. package/time-range/time-range.scss +9 -0
  632. package/timezone/timezone-option.component.scss +4 -7
  633. package/timezone/timezone-select.component.scss +3 -0
  634. package/toast/_toast-theme.scss +1 -4
  635. package/toast/toast-container.component.scss +19 -13
  636. package/toast/toast-tokens.scss +12 -6
  637. package/toast/toast.component.scss +42 -19
  638. package/toggle/_toggle-theme.scss +4 -10
  639. package/toggle/toggle.scss +67 -26
  640. package/tooltip/_tooltip-theme.scss +7 -1
  641. package/tooltip/tooltip-tokens.scss +1 -2
  642. package/tooltip/tooltip.scss +55 -9
  643. package/top-bar/top-bar-tokens.scss +13 -2
  644. package/top-bar/top-bar.scss +24 -19
  645. package/tree/_tree-theme.scss +0 -1
  646. package/tree/toggle.scss +5 -9
  647. package/tree/tree-option.scss +2 -4
  648. package/tree/tree-tokens.scss +2 -1
  649. package/tree/tree.scss +3 -5
  650. package/tree-select/_tree-select-theme.scss +4 -15
  651. package/tree-select/tree-select-tokens.scss +16 -0
  652. package/tree-select/tree-select.scss +0 -6
  653. package/{accordion/index.d.ts → types/koobiq-components-accordion.d.ts} +102 -84
  654. package/{actions-panel/index.d.ts → types/koobiq-components-actions-panel.d.ts} +44 -59
  655. package/{alert/index.d.ts → types/koobiq-components-alert.d.ts} +8 -3
  656. package/types/koobiq-components-app-switcher.d.ts +406 -0
  657. package/types/koobiq-components-autocomplete.d.ts +443 -0
  658. package/{badge/index.d.ts → types/koobiq-components-badge.d.ts} +25 -20
  659. package/{breadcrumbs/index.d.ts → types/koobiq-components-breadcrumbs.d.ts} +97 -46
  660. package/types/koobiq-components-button-toggle.d.ts +340 -0
  661. package/types/koobiq-components-button.d.ts +296 -0
  662. package/types/koobiq-components-checkbox.d.ts +172 -0
  663. package/types/koobiq-components-clamped-text.d.ts +184 -0
  664. package/{code-block/index.d.ts → types/koobiq-components-code-block.d.ts} +114 -79
  665. package/{content-panel/index.d.ts → types/koobiq-components-content-panel.d.ts} +81 -25
  666. package/{core/index.d.ts → types/koobiq-components-core.d.ts} +2827 -865
  667. package/{datepicker/index.d.ts → types/koobiq-components-datepicker.d.ts} +161 -116
  668. package/types/koobiq-components-divider.d.ts +43 -0
  669. package/types/koobiq-components-dl.d.ts +235 -0
  670. package/{dropdown/index.d.ts → types/koobiq-components-dropdown.d.ts} +245 -239
  671. package/types/koobiq-components-ellipsis-center.d.ts +85 -0
  672. package/types/koobiq-components-empty-state.d.ts +106 -0
  673. package/{file-upload/index.d.ts → types/koobiq-components-file-upload.d.ts} +214 -107
  674. package/{filter-bar/index.d.ts → types/koobiq-components-filter-bar.d.ts} +410 -495
  675. package/types/koobiq-components-flag.d.ts +68 -0
  676. package/{form-field/index.d.ts → types/koobiq-components-form-field.d.ts} +167 -191
  677. package/types/koobiq-components-icon.d.ts +333 -0
  678. package/{inline-edit/index.d.ts → types/koobiq-components-inline-edit.d.ts} +109 -46
  679. package/types/koobiq-components-input.d.ts +477 -0
  680. package/types/koobiq-components-link-deprecated.d.ts +101 -0
  681. package/types/koobiq-components-link.d.ts +176 -0
  682. package/{list/index.d.ts → types/koobiq-components-list.d.ts} +162 -99
  683. package/types/koobiq-components-loader-overlay.d.ts +101 -0
  684. package/{markdown/index.d.ts → types/koobiq-components-markdown.d.ts} +16 -24
  685. package/types/koobiq-components-modal.d.ts +666 -0
  686. package/types/koobiq-components-navbar.d.ts +569 -0
  687. package/types/koobiq-components-notification-center.d.ts +500 -0
  688. package/{overflow-items/index.d.ts → types/koobiq-components-overflow-items.d.ts} +8 -22
  689. package/types/koobiq-components-popover.d.ts +468 -0
  690. package/types/koobiq-components-progress-bar.d.ts +67 -0
  691. package/{progress-spinner/index.d.ts → types/koobiq-components-progress-spinner.d.ts} +33 -10
  692. package/types/koobiq-components-radio.d.ts +294 -0
  693. package/{resizer/index.d.ts → types/koobiq-components-resizer.d.ts} +37 -2
  694. package/{scrollbar/index.d.ts → types/koobiq-components-scrollbar-deprecated.d.ts} +18 -1
  695. package/types/koobiq-components-scrollbar.d.ts +154 -0
  696. package/types/koobiq-components-search-expandable.d.ts +164 -0
  697. package/{select/index.d.ts → types/koobiq-components-select.d.ts} +360 -167
  698. package/types/koobiq-components-sidebar.d.ts +152 -0
  699. package/types/koobiq-components-sidepanel.d.ts +436 -0
  700. package/types/koobiq-components-skeleton.d.ts +234 -0
  701. package/types/koobiq-components-split-button.d.ts +65 -0
  702. package/{splitter/index.d.ts → types/koobiq-components-splitter-deprecated.d.ts} +44 -1
  703. package/types/koobiq-components-splitter.d.ts +406 -0
  704. package/types/koobiq-components-table.d.ts +44 -0
  705. package/types/koobiq-components-tabs.d.ts +888 -0
  706. package/{tags/index.d.ts → types/koobiq-components-tags.d.ts} +249 -133
  707. package/types/koobiq-components-textarea.d.ts +178 -0
  708. package/{time-range/index.d.ts → types/koobiq-components-time-range.d.ts} +135 -62
  709. package/types/koobiq-components-timepicker.d.ts +223 -0
  710. package/types/koobiq-components-timezone.d.ts +266 -0
  711. package/types/koobiq-components-title.d.ts +184 -0
  712. package/types/koobiq-components-toast.d.ts +289 -0
  713. package/types/koobiq-components-toggle.d.ts +121 -0
  714. package/types/koobiq-components-tooltip.d.ts +610 -0
  715. package/types/koobiq-components-top-bar.d.ts +61 -0
  716. package/types/koobiq-components-tree-select.d.ts +667 -0
  717. package/types/koobiq-components-tree.d.ts +1290 -0
  718. package/types/koobiq-components-username.d.ts +340 -0
  719. package/username/_username-theme.scss +35 -0
  720. package/username/username.scss +10 -34
  721. package/app-switcher/index.d.ts +0 -276
  722. package/autocomplete/index.d.ts +0 -286
  723. package/button/index.d.ts +0 -153
  724. package/button-toggle/index.d.ts +0 -162
  725. package/checkbox/index.d.ts +0 -163
  726. package/clamped-text/index.d.ts +0 -146
  727. package/core/styles/_tokens.scss +0 -7
  728. package/core/styles/common/_clearfix.scss +0 -13
  729. package/core/styles/common/_popup.scss +0 -6
  730. package/core/styles/functions/_index.scss +0 -3
  731. package/core/styles/functions/_number.scss +0 -60
  732. package/core/styles/functions/_string.scss +0 -18
  733. package/core/styles/theming/scrollbar-tokens.scss +0 -25
  734. package/core/styles/typography/_typography-utils.scss +0 -84
  735. package/divider/index.d.ts +0 -20
  736. package/dl/index.d.ts +0 -45
  737. package/ellipsis-center/index.d.ts +0 -71
  738. package/empty-state/index.d.ts +0 -45
  739. package/flag/index.d.ts +0 -44
  740. package/icon/index.d.ts +0 -200
  741. package/input/index.d.ts +0 -354
  742. package/link/index.d.ts +0 -56
  743. package/loader-overlay/index.d.ts +0 -57
  744. package/modal/index.d.ts +0 -339
  745. package/navbar/index.d.ts +0 -372
  746. package/notification-center/index.d.ts +0 -323
  747. package/popover/index.d.ts +0 -182
  748. package/prebuilt-themes/dark-theme.css +0 -1
  749. package/prebuilt-themes/light-theme.css +0 -1
  750. package/progress-bar/index.d.ts +0 -31
  751. package/radio/index.d.ts +0 -203
  752. package/search-expandable/index.d.ts +0 -101
  753. package/sidebar/index.d.ts +0 -94
  754. package/sidepanel/index.d.ts +0 -272
  755. package/skeleton/index.d.ts +0 -26
  756. package/split-button/index.d.ts +0 -46
  757. package/table/index.d.ts +0 -25
  758. package/tabs/index.d.ts +0 -677
  759. package/textarea/index.d.ts +0 -138
  760. package/timepicker/index.d.ts +0 -197
  761. package/timezone/index.d.ts +0 -125
  762. package/title/index.d.ts +0 -139
  763. package/toast/index.d.ts +0 -178
  764. package/toggle/index.d.ts +0 -104
  765. package/tooltip/index.d.ts +0 -335
  766. package/top-bar/index.d.ts +0 -33
  767. package/tree/index.d.ts +0 -802
  768. package/tree-select/index.d.ts +0 -475
  769. package/username/index.d.ts +0 -194
  770. /package/{dynamic-translation/index.d.ts → types/koobiq-components-dynamic-translation.d.ts} +0 -0
  771. /package/{index.d.ts → types/koobiq-components.d.ts} +0 -0
@@ -1,31 +1,25 @@
1
- import { trigger, transition, style, animate } from '@angular/animations';
2
1
  import * as i1 from '@angular/cdk/a11y';
3
- import { CdkTrapFocus, CdkMonitorFocus } from '@angular/cdk/a11y';
2
+ import { InteractivityChecker, FocusMonitor, CdkTrapFocus, CdkMonitorFocus } from '@angular/cdk/a11y';
4
3
  import { hasModifierKey } from '@angular/cdk/keycodes';
4
+ import { ContentObserver } from '@angular/cdk/observers';
5
5
  import { SharedResizeObserver } from '@angular/cdk/observers/private';
6
6
  import { Overlay, ScrollDispatcher, CdkConnectedOverlay } from '@angular/cdk/overlay';
7
7
  import { DOCUMENT } from '@angular/common';
8
8
  import * as i0 from '@angular/core';
9
- import { InjectionToken, output, Directive, inject, ElementRef, NgZone, DestroyRef, input, booleanAttribute, numberAttribute, contentChild, computed, contentChildren, viewChild, viewChildren, signal, effect, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
10
- import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import { InjectionToken, Directive, inject, ElementRef, NgZone, PendingTasks, DestroyRef, Injector, input, booleanAttribute, numberAttribute, output, model, contentChild, computed, contentChildren, viewChild, signal, effect, untracked, isWritableSignal, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
11
10
  import { AbstractControl, NgControl } from '@angular/forms';
12
- import * as i2 from '@koobiq/components/button';
11
+ import * as i3 from '@koobiq/components/button';
13
12
  import { KbqButtonModule } from '@koobiq/components/button';
14
- import { KbqAnimationDurations, KbqAnimationCurves, kbqInjectA11yLocaleConfiguration, KBQ_WINDOW, isElement, PopUpPlacements, KbqComponentColors, runCompareWith, KBQ_CONNECTED_OVERLAY_ORIGIN } from '@koobiq/components/core';
13
+ import * as i2 from '@koobiq/components/core';
14
+ import { KbqLocaleOverridesDirective, KBQ_A11Y_LOCALE_CONFIGURATION, KBQ_OVERLAY_LAYERS, KBQ_WINDOW, isElement, PopUpPlacements, kbqAnimationsDisabled, KbqComponentColors, runCompareWith, KBQ_CONNECTED_OVERLAY_ORIGIN } from '@koobiq/components/core';
15
15
  import { KbqDropdownTrigger } from '@koobiq/components/dropdown';
16
16
  import { KbqLabel, KbqFormField } from '@koobiq/components/form-field';
17
17
  import { KbqIcon } from '@koobiq/components/icon';
18
18
  import { KbqSelect } from '@koobiq/components/select';
19
19
  import { KbqTooltipTrigger } from '@koobiq/components/tooltip';
20
- import { skip, merge, of, timer, concat } from 'rxjs';
21
- import { take, takeUntil, map, defaultIfEmpty, catchError, takeWhile, concatMap, ignoreElements } from 'rxjs/operators';
20
+ import { startWith, debounceTime, of, timer, merge, concat } from 'rxjs';
21
+ import { take, map, defaultIfEmpty, catchError, takeWhile, concatMap, ignoreElements, takeUntil } from 'rxjs/operators';
22
22
 
23
- const KBQ_INLINE_EDIT_ACTION_BUTTONS_ANIMATION = trigger('panelAnimation', [
24
- transition(':enter', [
25
- style({ transform: 'translateY(100%)', opacity: 0 }),
26
- animate(`${KbqAnimationDurations.Instant} ${KbqAnimationCurves.DecelerationCurve}`, style({ transform: 'translateY(0%)', opacity: 1 }))
27
- ])
28
- ]);
29
23
  const baseClass = 'kbq-inline-edit';
30
24
  /**
31
25
  * Fallback delay before showing the validation tooltip if `scrollend` never fires — e.g. the browser doesn't
@@ -38,41 +32,20 @@ const ENTER_ACTIVATED_SELECTORS = 'button,input[type="button"],input[type="submi
38
32
  const kbqInlineEditSaveProgressDelay = 100;
39
33
  /** Minimum time the save progress state stays once it has appeared. */
40
34
  const kbqInlineEditSaveProgressMinimumDuration = 300;
35
+ /**
36
+ * Every live inline edit, keyed by its host element, so Tab-chaining can call the neighbour's public API
37
+ * instead of driving it through the DOM with a fabricated `KeyboardEvent`.
38
+ */
39
+ const inlineEditRegistry = new WeakMap();
40
+ const isValueAccessor = (control) => typeof control.writeValue === 'function';
41
41
  /** Reports every failed save the same way across the application. Declare it in the root injector. */
42
42
  const KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER = new InjectionToken('KbqInlineEditSaveErrorHandler');
43
- /** @docs-private */
44
- class KbqFocusRegionItem {
45
- constructor() {
46
- this.tabOut = output();
47
- this.isFocused = false;
48
- }
49
- onTabOut(event) {
50
- if (this.isFocused) {
51
- this.tabOut.emit(event);
52
- }
53
- this.isFocused = !this.isFocused;
54
- }
55
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFocusRegionItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
56
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqFocusRegionItem, isStandalone: true, selector: "[kbqFocusRegionItem]", outputs: { tabOut: "tabOut" }, host: { listeners: { "focusin": "isFocused = true", "keydown.tab": "onTabOut($event)", "keydown.shift.tab": "onTabOut($event)" } }, exportAs: ["kbqFocusRegionItem"], ngImport: i0 }); }
57
- }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqFocusRegionItem, decorators: [{
59
- type: Directive,
60
- args: [{
61
- selector: '[kbqFocusRegionItem]',
62
- host: {
63
- '(focusin)': 'isFocused = true',
64
- '(keydown.tab)': 'onTabOut($event)',
65
- '(keydown.shift.tab)': 'onTabOut($event)'
66
- },
67
- exportAs: 'kbqFocusRegionItem'
68
- }]
69
- }], propDecorators: { tabOut: [{ type: i0.Output, args: ["tabOut"] }] } });
70
43
  /** Directive for easy using styles of inline edit placeholder publicly. */
71
44
  class KbqInlineEditPlaceholder {
72
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
73
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqInlineEditPlaceholder, isStandalone: true, selector: "[kbqInlineEditPlaceholder]", host: { classAttribute: "kbq-inline-edit__placeholder" }, exportAs: ["kbqInlineEditPlaceholder"], ngImport: i0 }); }
45
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditPlaceholder, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
46
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqInlineEditPlaceholder, isStandalone: true, selector: "[kbqInlineEditPlaceholder]", host: { classAttribute: "kbq-inline-edit__placeholder" }, exportAs: ["kbqInlineEditPlaceholder"], ngImport: i0 }); }
74
47
  }
75
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditPlaceholder, decorators: [{
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditPlaceholder, decorators: [{
76
49
  type: Directive,
77
50
  args: [{
78
51
  selector: '[kbqInlineEditPlaceholder]',
@@ -92,10 +65,10 @@ class KbqInlineEditMenu {
92
65
  /** @docs-private */
93
66
  this.dropdownTrigger = inject(KbqDropdownTrigger, { optional: true });
94
67
  }
95
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
96
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqInlineEditMenu, isStandalone: true, selector: "[kbqInlineEditMenu]", host: { attributes: { "role": "button" }, listeners: { "click": "$event.stopPropagation()", "keydown.enter": "$event.stopPropagation()", "keydown.space": "$event.stopPropagation()" }, properties: { "class.kbq-active": "dropdownTrigger?.opened" }, classAttribute: "kbq-inline-edit__menu" }, exportAs: ["kbqInlineEditMenu"], ngImport: i0 }); }
68
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
69
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqInlineEditMenu, isStandalone: true, selector: "[kbqInlineEditMenu]", host: { attributes: { "role": "button" }, listeners: { "click": "$event.stopPropagation()", "keydown.enter": "$event.stopPropagation()", "keydown.space": "$event.stopPropagation()" }, properties: { "class.kbq-active": "dropdownTrigger?.opened" }, classAttribute: "kbq-inline-edit__menu" }, exportAs: ["kbqInlineEditMenu"], ngImport: i0 }); }
97
70
  }
98
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditMenu, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditMenu, decorators: [{
99
72
  type: Directive,
100
73
  args: [{
101
74
  selector: '[kbqInlineEditMenu]',
@@ -117,16 +90,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
117
90
  */
118
91
  class KbqInlineEdit {
119
92
  constructor() {
120
- /** Texts of the save status announcements. */
121
- this.a11yLocaleConfiguration = kbqInjectA11yLocaleConfiguration();
93
+ /** Accessible names for the icon-only save/cancel buttons and for the view mode itself. */
94
+ this.a11yLocaleConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('a11y', KBQ_A11Y_LOCALE_CONFIGURATION);
122
95
  this.overlay = inject(Overlay);
96
+ this.overlayLayers = inject(KBQ_OVERLAY_LAYERS);
123
97
  this.document = inject(DOCUMENT);
124
98
  this.window = inject(KBQ_WINDOW);
125
99
  this.resizeObserver = inject(SharedResizeObserver);
126
100
  this.elementRef = inject(ElementRef);
127
101
  this.ngZone = inject(NgZone);
102
+ this.pendingTasks = inject(PendingTasks);
128
103
  this.scrollDispatcher = inject(ScrollDispatcher);
129
104
  this.destroyRef = inject(DestroyRef);
105
+ this.injector = inject(Injector);
106
+ this.contentObserver = inject(ContentObserver);
107
+ this.interactivityChecker = inject(InteractivityChecker);
108
+ this.focusMonitor = inject(FocusMonitor);
130
109
  /**
131
110
  * The validation tooltip is anchored inside the edit-mode overlay — an overlay inside another
132
111
  * overlay. Its default `close()` scroll strategy would close it the moment either overlay's
@@ -134,120 +113,135 @@ class KbqInlineEdit {
134
113
  * invalid control into view), so it's overridden to `reposition()` here — passed directly as a
135
114
  * per-instance override to this tooltip's `[kbqTooltipScrollStrategy]` input, rather than a DI
136
115
  * override, so it doesn't leak into any `kbqTooltip` in projected content.
116
+ *
137
117
  * @docs-private
138
118
  */
139
119
  this.validationTooltipScrollStrategy = () => this.overlay.scrollStrategies.reposition();
140
120
  /**
141
- * Whether to show save/cancel action buttons in edit mode.
142
- * @default false
121
+ * Whether to show save/cancel action buttons in edit mode. Defaults to `false`.
143
122
  */
144
- this.showActions = input(false, ...(ngDevMode ? [{ debugName: "showActions", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
123
+ this.showActions = input(false, { ...(ngDevMode ? { debugName: "showActions" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
145
124
  /**
146
125
  * Whether to automatically show validation error tooltips on save attempts.
147
- * @default true
126
+ * Has no effect unless `validationTooltip` is set. Defaults to `true`.
148
127
  */
149
- this.showTooltipOnError = input(true, ...(ngDevMode ? [{ debugName: "showTooltipOnError", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
128
+ this.showTooltipOnError = input(true, { ...(ngDevMode ? { debugName: "showTooltipOnError" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
150
129
  /** Custom validation tooltip message. */
151
- this.validationTooltip = input(...(ngDevMode ? [undefined, { debugName: "validationTooltip" }] : []));
130
+ this.validationTooltip = input(...(ngDevMode ? [undefined, { debugName: "validationTooltip" }] : /* istanbul ignore next */ []));
152
131
  /**
153
132
  * Disables the component, preventing interaction and mode switching. Only allows menu dropdown.
154
- * @default false
133
+ * Defaults to `false`.
155
134
  */
156
- this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
135
+ this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
157
136
  /** Custom width in pixels for the edit mode overlay. Auto-calculated if not set. */
158
- this.editModeWidth = input(undefined, ...(ngDevMode ? [{ debugName: "editModeWidth", transform: numberAttribute }] : [{ transform: numberAttribute }]));
137
+ this.editModeWidth = input(undefined, { ...(ngDevMode ? { debugName: "editModeWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
159
138
  /** User-defined tooltip placement */
160
- this.tooltipPlacement = input(...(ngDevMode ? [undefined, { debugName: "tooltipPlacement" }] : []));
139
+ this.tooltipPlacement = input(...(ngDevMode ? [undefined, { debugName: "tooltipPlacement" }] : /* istanbul ignore next */ []));
161
140
  /** Classes to be passed to the inline edit panel. */
162
- this.overlayPanelClass = input('', ...(ngDevMode ? [{ debugName: "overlayPanelClass" }] : []));
141
+ this.overlayPanelClass = input('', ...(ngDevMode ? [{ debugName: "overlayPanelClass" }] : /* istanbul ignore next */ []));
163
142
  /** Handler function to retrieve the current value */
164
- this.getValueHandler = input(...(ngDevMode ? [undefined, { debugName: "getValueHandler" }] : []));
143
+ this.getValueHandler = input(...(ngDevMode ? [undefined, { debugName: "getValueHandler" }] : /* istanbul ignore next */ []));
165
144
  /** Handler function to update the value */
166
- this.setValueHandler = input(...(ngDevMode ? [undefined, { debugName: "setValueHandler" }] : []));
145
+ this.setValueHandler = input(...(ngDevMode ? [undefined, { debugName: "setValueHandler" }] : /* istanbul ignore next */ []));
146
+ /**
147
+ * Accessible name of the control that opens the editor. Defaults to the localized "Edit"; set a
148
+ * field-specific name where the projected value alone doesn't say what is being edited.
149
+ */
150
+ this.ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
167
151
  /**
168
152
  * Whether the value still equals the one the editor opened with, in which case `saveHandler` is not called.
169
153
  * The default suits text and numbers; bind your own for arrays and objects, or `null` to send every time.
170
154
  * A failed save is always retried, however the values compare.
171
155
  */
172
- this.compareWith = input((a, b) => a === b, ...(ngDevMode ? [{ debugName: "compareWith" }] : []));
156
+ this.compareWith = input((a, b) => a === b, ...(ngDevMode ? [{ debugName: "compareWith" }] : /* istanbul ignore next */ []));
173
157
  /**
174
158
  * Saves a valid value in the background: edit mode closes right away and view mode reports how the request
175
159
  * went. Without it, a valid value is saved immediately.
176
160
  */
177
- this.saveHandler = input(...(ngDevMode ? [undefined, { debugName: "saveHandler" }] : []));
161
+ this.saveHandler = input(...(ngDevMode ? [undefined, { debugName: "saveHandler" }] : /* istanbul ignore next */ []));
178
162
  /**
179
163
  * Reaction to a failed save for this inline edit alone. Defaults to `KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER`;
180
164
  * bind `null` to leave it without one.
181
165
  */
182
- this.saveErrorHandler = input(inject(KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER, { optional: true }), ...(ngDevMode ? [{ debugName: "saveErrorHandler" }] : []));
166
+ this.saveErrorHandler = input(inject(KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER, { optional: true }), ...(ngDevMode ? [{ debugName: "saveErrorHandler" }] : /* istanbul ignore next */ []));
183
167
  /** Customizable function that checks if saving on enter available. */
184
168
  this.canSaveOnEnter = input((event) => {
185
169
  // A control that runs its own action on Enter would otherwise fire it and save at the same time.
186
170
  if (isElement(event.target) && event.target.closest(ENTER_ACTIVATED_SELECTORS))
187
171
  return false;
188
172
  return hasModifierKey(event, 'ctrlKey', 'metaKey') || !(event.target instanceof HTMLTextAreaElement);
189
- }, ...(ngDevMode ? [{ debugName: "canSaveOnEnter" }] : []));
173
+ }, ...(ngDevMode ? [{ debugName: "canSaveOnEnter" }] : /* istanbul ignore next */ []));
190
174
  /**
191
175
  * CSS selectors for elements in view mode that should handle clicks instead of opening edit mode.
192
176
  * Override to replace or extend the default list.
193
177
  *
194
178
  * @example
195
- * `<kbq-inline-edit [interactiveSelectors]="['a', 'kbq-tag', 'button']">`
179
+ * ```html
180
+ * <kbq-inline-edit [interactiveSelectors]="['a', 'kbq-tag', 'button']">
181
+ * ```
196
182
  */
197
- this.interactiveSelectors = input(['a', 'kbq-tag'], ...(ngDevMode ? [{ debugName: "interactiveSelectors" }] : []));
183
+ this.interactiveSelectors = input(['a', 'kbq-tag'], ...(ngDevMode ? [{ debugName: "interactiveSelectors" }] : /* istanbul ignore next */ []));
198
184
  /** Emitted when the inline edit is saved successfully. */
199
185
  this.saved = output();
200
186
  /** Emitted when the inline edit is canceled and changes are discarded. */
201
187
  this.canceled = output();
202
188
  /** Emitted when a `saveHandler` request fails. Silent once the row is destroyed; `saveErrorHandler` is not. */
203
189
  this.saveError = output();
204
- /** Emitted when mode switched to edit/view */
205
- this.modeChange = output();
190
+ /**
191
+ * Current mode. Two-way bindable: `[(mode)]` opens and closes the editor programmatically, and
192
+ * `(modeChange)` alone reports every transition.
193
+ */
194
+ this.mode = model('view', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
206
195
  /** @docs-private */
207
- this.menu = contentChild(KbqInlineEditMenu, ...(ngDevMode ? [{ debugName: "menu" }] : []));
196
+ this.menu = contentChild(KbqInlineEditMenu, ...(ngDevMode ? [{ debugName: "menu" }] : /* istanbul ignore next */ []));
208
197
  /** @docs-private */
209
- this.label = contentChild(KbqLabel, ...(ngDevMode ? [{ debugName: "label" }] : []));
198
+ this.label = contentChild(KbqLabel, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
210
199
  /** @docs-private */
211
- this.formFieldRef = computed(() => this.formFieldRefList()[0], ...(ngDevMode ? [{ debugName: "formFieldRef" }] : []));
200
+ this.formFieldRef = computed(() => this.formFieldRefList()[0], ...(ngDevMode ? [{ debugName: "formFieldRef" }] : /* istanbul ignore next */ []));
212
201
  /** @docs-private */
213
- this.formFieldRefList = contentChildren(KbqFormField, ...(ngDevMode ? [{ debugName: "formFieldRefList", descendants: true }] : [{ descendants: true }]));
202
+ this.formFieldRefList = contentChildren(KbqFormField, { ...(ngDevMode ? { debugName: "formFieldRefList" } : /* istanbul ignore next */ {}), descendants: true });
214
203
  /** @docs-private */
215
- this.selectRef = contentChild(KbqSelect, ...(ngDevMode ? [{ debugName: "selectRef", descendants: true }] : [{ descendants: true }]));
204
+ this.selectRef = contentChild(KbqSelect, { ...(ngDevMode ? { debugName: "selectRef" } : /* istanbul ignore next */ {}), descendants: true });
216
205
  /**
217
206
  * Whether edit mode contains a single-value select. When true, edit mode shows only the
218
207
  * dropdown panel instead of a bordered field - see the "Select-style editor" example.
208
+ *
219
209
  * @docs-private
220
210
  */
221
211
  this.isSingleSelect = computed(() => {
222
212
  const select = this.selectRef();
223
213
  return !!select && !select.multiple && !select.multiline();
224
- }, ...(ngDevMode ? [{ debugName: "isSingleSelect" }] : []));
225
- /** @docs-private */
226
- this.overlayOrigin = this.elementRef.nativeElement;
214
+ }, ...(ngDevMode ? [{ debugName: "isSingleSelect" }] : /* istanbul ignore next */ []));
227
215
  /** @docs-private */
228
216
  this.tooltipTrigger = viewChild.required(KbqTooltipTrigger);
229
217
  /** @docs-private */
230
218
  this.viewContainer = viewChild.required('viewContainer');
231
219
  /** @docs-private */
232
- this.overlayDir = viewChild.required(CdkConnectedOverlay);
233
- /** @docs-private */
234
- this.regionItems = viewChildren(KbqFocusRegionItem, ...(ngDevMode ? [{ debugName: "regionItems" }] : []));
235
- /** @docs-private */
236
- this.mode = signal('view', ...(ngDevMode ? [{ debugName: "mode" }] : []));
220
+ this.viewContent = viewChild.required('viewContent');
221
+ /** Present only while the view content is interactive, where it stands in as the field's tab stop. */
222
+ this.focusAnchor = viewChild('focusAnchor', ...(ngDevMode ? [{ debugName: "focusAnchor" }] : /* istanbul ignore next */ []));
237
223
  /** @docs-private */
238
- this.overlayWidth = signal('', ...(ngDevMode ? [{ debugName: "overlayWidth" }] : []));
239
- /** @docs-private */
240
- this.scrollStrategy = signal(this.overlay.scrollStrategies.reposition(), ...(ngDevMode ? [{ debugName: "scrollStrategy" }] : []));
224
+ this.overlayDir = viewChild.required(CdkConnectedOverlay);
241
225
  /** @docs-private */
242
- this.modeAsReadonly = computed(() => this.mode(), ...(ngDevMode ? [{ debugName: "modeAsReadonly" }] : []));
243
- this.saveStatusSource = signal('idle', ...(ngDevMode ? [{ debugName: "saveStatusSource" }] : []));
226
+ this.overlayWidth = signal('', ...(ngDevMode ? [{ debugName: "overlayWidth" }] : /* istanbul ignore next */ []));
227
+ /** Distance the panel is pulled up by so that it covers the view it replaces. */
228
+ this.overlayOffsetY = signal(0, ...(ngDevMode ? [{ debugName: "overlayOffsetY" }] : /* istanbul ignore next */ []));
229
+ /**
230
+ * Built on first read rather than in the field initializer: a list of inline edits would otherwise
231
+ * allocate one strategy per row, including the rows nobody ever opens.
232
+ *
233
+ * @docs-private
234
+ */
235
+ this.scrollStrategy = computed(() => this.overlay.scrollStrategies.reposition(), ...(ngDevMode ? [{ debugName: "scrollStrategy" }] : /* istanbul ignore next */ []));
236
+ this.saveStatusSource = signal('idle', ...(ngDevMode ? [{ debugName: "saveStatusSource" }] : /* istanbul ignore next */ []));
244
237
  /** State of the background save started by `saveHandler`. */
245
238
  this.saveStatus = this.saveStatusSource.asReadonly();
246
239
  /** @docs-private */
247
- this.isSaving = computed(() => this.saveStatus() === 'pending' || this.saveStatus() === 'progress', ...(ngDevMode ? [{ debugName: "isSaving" }] : []));
240
+ this.isSaving = computed(() => this.saveStatus() === 'pending' || this.saveStatus() === 'progress', ...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
248
241
  /**
249
242
  * Both save states are otherwise conveyed by colour alone. `aria-busy` cannot carry the first one: it is set
250
243
  * on the row, which contains this region, and that tells assistive tech to hold the announcement back.
244
+ *
251
245
  * @docs-private
252
246
  */
253
247
  this.saveStatusMessage = computed(() => {
@@ -255,15 +249,17 @@ class KbqInlineEdit {
255
249
  if (this.saveStatus() === 'progress')
256
250
  return a11y.saving;
257
251
  return this.saveStatus() === 'error' ? a11y.saveFailed : '';
258
- }, ...(ngDevMode ? [{ debugName: "saveStatusMessage" }] : []));
252
+ }, ...(ngDevMode ? [{ debugName: "saveStatusMessage" }] : /* istanbul ignore next */ []));
253
+ /** @docs-private */
254
+ this.overlayOrigin = computed(() => this.label() ? this.viewContainer().nativeElement : this.elementRef.nativeElement, ...(ngDevMode ? [{ debugName: "overlayOrigin" }] : /* istanbul ignore next */ []));
259
255
  /** @docs-private */
260
- this.className = computed(() => `${baseClass}_${this.mode()}`, ...(ngDevMode ? [{ debugName: "className" }] : []));
256
+ this.className = computed(() => `${baseClass}_${this.mode()}`, ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
261
257
  /** @docs-private */
262
- this.isEditMode = computed(() => this.mode() === 'edit', ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
258
+ this.isEditMode = computed(() => this.mode() === 'edit', ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
263
259
  /** @docs-private */
264
- this.hasInteractiveContent = signal(false, ...(ngDevMode ? [{ debugName: "hasInteractiveContent" }] : []));
260
+ this.hasInteractiveContent = signal(false, ...(ngDevMode ? [{ debugName: "hasInteractiveContent" }] : /* istanbul ignore next */ []));
265
261
  /** @docs-private */
266
- this.anchorFocused = signal(false, ...(ngDevMode ? [{ debugName: "anchorFocused" }] : []));
262
+ this.anchorFocused = signal(false, ...(ngDevMode ? [{ debugName: "anchorFocused" }] : /* istanbul ignore next */ []));
267
263
  /** @docs-private */
268
264
  this.tabIndex = computed(() => {
269
265
  // Saving is deliberately absent: like `kbq-dropdown-item`, a row in progress keeps its place in the tab
@@ -271,38 +267,75 @@ class KbqInlineEdit {
271
267
  if (this.isEditMode() || this.disabled() || this.hasInteractiveContent())
272
268
  return -1;
273
269
  return 0;
274
- }, ...(ngDevMode ? [{ debugName: "tabIndex" }] : []));
270
+ }, ...(ngDevMode ? [{ debugName: "tabIndex" }] : /* istanbul ignore next */ []));
271
+ /**
272
+ * Widget role of the view content. Dropped once the projected content is interactive, because a
273
+ * `button` wrapping a link or a tag is a `nested-interactive` violation — the focus anchor carries
274
+ * the semantics in that case instead.
275
+ *
276
+ * @docs-private
277
+ */
278
+ this.viewContentRole = computed(() => (this.hasInteractiveContent() ? null : 'button'), ...(ngDevMode ? [{ debugName: "viewContentRole" }] : /* istanbul ignore next */ []));
279
+ /** Falls back on an empty `aria-label` too, which would otherwise leave the control with no name. */
280
+ this.accessibleName = computed(() => this.ariaLabel() || this.a11yLocaleConfiguration().edit, ...(ngDevMode ? [{ debugName: "accessibleName" }] : /* istanbul ignore next */ []));
275
281
  /** @docs-private */
276
282
  this.placements = PopUpPlacements;
277
283
  /** @docs-private */
284
+ this.animationsDisabled = kbqAnimationsDisabled();
285
+ /** @docs-private */
278
286
  this.colors = KbqComponentColors;
279
287
  this.destroyed = false;
280
288
  /** Handle for an in-flight `showValidationTooltip()` scroll/settle request, if any. */
281
289
  this.validationTooltipScrollHandle = null;
282
- // The save outlives the row, so its outputs have to fall silent with the view they belong to.
283
- this.destroyRef.onDestroy(() => (this.destroyed = true));
284
- toObservable(this.mode)
285
- .pipe(skip(1), takeUntilDestroyed())
286
- .subscribe((currentMode) => this.modeChange.emit(currentMode));
290
+ /** How edit mode was entered, so leaving it restores the same focus style. */
291
+ this.editModeOrigin = null;
292
+ /** Set while Tab-chaining, where the next inline edit — not this one — has to end up focused. */
293
+ this.chainingToNextInlineEdit = false;
294
+ inlineEditRegistry.set(this.elementRef.nativeElement, this);
295
+ this.destroyRef.onDestroy(() => {
296
+ // The save outlives the row, so its outputs have to fall silent with the view they belong to.
297
+ this.destroyed = true;
298
+ inlineEditRegistry.delete(this.elementRef.nativeElement);
299
+ this.validationTooltipScrollHandle?.cancel();
300
+ });
301
+ // The panel is pulled up by exactly the height of the view it replaces. Measured on every entry
302
+ // into edit mode, including an external `[(mode)]` write that never passes through `toggleMode()`,
303
+ // and before the overlay is attached — reading it from a template binding would force a layout
304
+ // flush on every tick.
287
305
  effect(() => {
288
- this.overlayOrigin = this.label() ? this.viewContainer().nativeElement : this.elementRef.nativeElement;
306
+ if (this.mode() !== 'edit')
307
+ return;
308
+ untracked(() => this.overlayOffsetY.set(-this.overlayOrigin().offsetHeight));
289
309
  });
290
310
  effect((onCleanup) => {
291
311
  const selectors = this.interactiveSelectors();
292
- const timeoutId = setTimeout(() => this.detectInteractiveContent(selectors));
293
- onCleanup(() => clearTimeout(timeoutId));
312
+ const viewContent = this.viewContent().nativeElement;
313
+ // Projected content can arrive long after the first pass — a value fetched from a server, or
314
+ // the `@if (value) { … } @else { placeholder }` shape every example uses — so detection has to
315
+ // follow the content rather than run once. `debounceTime` also defers the first pass out of the
316
+ // current change detection, which is what the one-shot timeout used to do.
317
+ const subscription = this.contentObserver
318
+ .observe(viewContent)
319
+ .pipe(startWith(null), debounceTime(0))
320
+ .subscribe(() => this.detectInteractiveContent(viewContent, selectors));
321
+ onCleanup(() => subscription.unsubscribe());
294
322
  });
295
323
  }
296
324
  /** Manually switch mode. Does nothing while a `saveHandler` request is in flight. */
297
325
  toggleMode() {
298
- if (this.isSaving())
299
- return;
300
- this.mode.update((mode) => (mode === 'view' ? 'edit' : 'view'));
326
+ // Untracked, as `commit()`, `retrySave()` and `rollback()`: called from a consumer's `effect()`, the state read
327
+ // on the way — the mode, the save status, the inputs — would make the effect run again whenever it changes.
328
+ untracked(() => {
329
+ if (this.isSaving())
330
+ return;
331
+ this.mode.update((currentMode) => (currentMode === 'edit' ? 'view' : 'edit'));
332
+ });
301
333
  }
302
334
  /**
303
335
  * Implements `KbqConnectedOverlayOriginProvider`, letting a nested `KbqFormField`'s control
304
336
  * anchor its overlay to this element instead of the form-field's own container.
305
337
  * When no override is needed, the form-field falls back to its default.
338
+ *
306
339
  * @docs-private
307
340
  */
308
341
  getConnectedOverlayOrigin() {
@@ -310,25 +343,29 @@ class KbqInlineEdit {
310
343
  }
311
344
  /** Saves the current value, running the same validation as a normal save. */
312
345
  commit() {
313
- this.save();
346
+ untracked(() => this.save());
314
347
  }
315
348
  /** Repeats the request for a value the server rejected. Does nothing unless the last save failed. */
316
349
  retrySave() {
317
- const saveHandler = this.saveHandler();
318
- if (this.saveStatus() !== 'error' || !saveHandler)
319
- return;
320
- this.startSave(saveHandler());
350
+ untracked(() => {
351
+ const saveHandler = this.saveHandler();
352
+ if (this.saveStatus() !== 'error' || !saveHandler)
353
+ return;
354
+ this.startSave(saveHandler());
355
+ });
321
356
  }
322
357
  /** Discards the value the server rejected, restoring the last saved one and closing the editor. */
323
358
  rollback() {
324
- if (this.saveStatus() !== 'error')
325
- return;
326
- this.setValue(this.lastSavedValue);
327
- this.initialValue = this.lastSavedValue;
328
- this.saveStatusSource.set('idle');
329
- if (this.isEditMode()) {
330
- this.toggleMode();
331
- }
359
+ untracked(() => {
360
+ if (this.saveStatus() !== 'error')
361
+ return;
362
+ this.setValue(this.lastSavedValue);
363
+ this.initialValue = this.lastSavedValue;
364
+ this.saveStatusSource.set('idle');
365
+ if (this.isEditMode()) {
366
+ this.toggleMode();
367
+ }
368
+ });
332
369
  }
333
370
  /** @docs-private */
334
371
  onClick(event) {
@@ -338,28 +375,37 @@ class KbqInlineEdit {
338
375
  return;
339
376
  event.preventDefault();
340
377
  event.stopPropagation();
378
+ this.editModeOrigin = event instanceof KeyboardEvent ? 'keyboard' : 'mouse';
341
379
  this.toggleMode();
342
380
  }
343
381
  /** @docs-private */
344
382
  onAttach() {
383
+ // `cdkConnectedOverlay` creates and attaches the overlay in one go, so this is the first point it exists.
384
+ this.overlayLayers.adopt(this.overlayDir().overlayRef, this.elementRef.nativeElement);
345
385
  this.setOverlayWidth();
346
- this.setOverlayKeydownListener();
386
+ // Hides the validation tooltip once the controls accept their values. Ended with the session by hand: an
387
+ // effect otherwise lives as long as its injector, and the tooltip only as long as the panel.
388
+ const validationTooltipWatcher = effect(() => {
389
+ this.formFieldRefList().forEach((ref) => {
390
+ ref.control().errorState();
391
+ ref.control().value();
392
+ });
393
+ untracked(() => {
394
+ const tooltipTrigger = this.tooltipTrigger();
395
+ if (tooltipTrigger.isOpen && !this.isInvalid()) {
396
+ tooltipTrigger.hide();
397
+ }
398
+ });
399
+ }, { ...(ngDevMode ? { debugName: "validationTooltipWatcher" } : /* istanbul ignore next */ {}), injector: this.injector });
347
400
  this.overlayDir()
348
401
  .overlayRef.detachments()
349
402
  .pipe(take(1))
350
- .subscribe(() => this.validationTooltipScrollHandle?.cancel());
351
- const formFieldRefList = this.formFieldRefList();
352
- merge(...formFieldRefList.map((ref) => ref.control().stateChanges))
353
- .pipe(takeUntil(this.overlayDir().overlayRef.detachments()))
354
403
  .subscribe(() => {
355
- if (!this.isInvalid()) {
356
- const tooltipTrigger = this.tooltipTrigger();
357
- if (tooltipTrigger?.isOpen) {
358
- tooltipTrigger.hide();
359
- }
360
- }
404
+ validationTooltipWatcher.destroy();
405
+ this.validationTooltipScrollHandle?.cancel();
361
406
  });
362
- setTimeout(() => {
407
+ this.watchTabOutsideThePanel();
408
+ this.defer(() => {
363
409
  // Captured before the form-field checks below: an editor built on `setValueHandler` alone has no
364
410
  // `KbqFormField`, and `cancel()` and `rollback()` still have to restore something other than undefined.
365
411
  this.initialValue = this.getValue();
@@ -376,7 +422,7 @@ class KbqInlineEdit {
376
422
  if (this.initialValue)
377
423
  input?.select();
378
424
  this.openPanel(formFieldRef);
379
- }, 0);
425
+ });
380
426
  }
381
427
  /** @docs-private */
382
428
  save($event) {
@@ -384,6 +430,9 @@ class KbqInlineEdit {
384
430
  // same interaction — without this, the second call would toggle back into edit mode.
385
431
  if (!this.isEditMode())
386
432
  return;
433
+ // Saving is what makes the controls touched, not typing into them: the display state has to be
434
+ // caught up before the error styling is allowed to appear.
435
+ this.markAllAsTouched();
387
436
  if (this.isInvalid()) {
388
437
  $event?.stopPropagation();
389
438
  if (this.showTooltipOnError() && this.validationTooltip()) {
@@ -396,14 +445,17 @@ class KbqInlineEdit {
396
445
  // without a handler `saved` keeps meaning "the user committed".
397
446
  if (saveHandler && this.isUnchanged()) {
398
447
  this.toggleMode();
448
+ this.restoreFocus();
399
449
  return;
400
450
  }
401
451
  // Started before the mode switch: a handler that throws is a bug in the application, and folding that into
402
452
  // the save result would report it as the server's refusal.
403
453
  const request$ = saveHandler?.();
404
454
  // Client-side validation has passed, so editing is over either way: with a handler the request runs in the
405
- // background, and view mode reports how it went.
455
+ // background, and view mode reports how it went. Focus goes back with the mode, not with the response,
456
+ // which lands long after the user has moved on.
406
457
  this.toggleMode();
458
+ this.restoreFocus();
407
459
  if (request$) {
408
460
  this.startSave(request$);
409
461
  return;
@@ -462,7 +514,8 @@ class KbqInlineEdit {
462
514
  * positioning.
463
515
  */
464
516
  isOverlayOriginFullyVisible() {
465
- const rect = this.overlayOrigin.getBoundingClientRect();
517
+ const overlayOrigin = this.overlayOrigin();
518
+ const rect = overlayOrigin.getBoundingClientRect();
466
519
  const isWithin = (container) => rect.top >= container.top &&
467
520
  rect.left >= container.left &&
468
521
  rect.bottom <= container.bottom &&
@@ -471,7 +524,7 @@ class KbqInlineEdit {
471
524
  return false;
472
525
  }
473
526
  return this.scrollDispatcher
474
- .getAncestorScrollContainers(this.overlayOrigin)
527
+ .getAncestorScrollContainers(overlayOrigin)
475
528
  .every((scrollable) => isWithin(scrollable.getElementRef().nativeElement.getBoundingClientRect()));
476
529
  }
477
530
  /**
@@ -481,11 +534,10 @@ class KbqInlineEdit {
481
534
  * a while — so showing the tooltip right away would anchor its overlay to a stale, pre-scroll position.
482
535
  * `scrollend` reports when the scroll actually completes; the timeout is a fallback for browsers without
483
536
  * `scrollend` support and cases where nothing ends up scrolling.
484
- *
485
- * TODO(DS-5420): "scroll an element into view, then act once settled" isn't inline-edit-specific — worth
486
- * extracting into `packages/components/core` in a follow-up. Kept local to this fix for now.
487
537
  */
488
538
  showValidationTooltip() {
539
+ // TODO(DS-5420): "scroll an element into view, then act once settled" isn't inline-edit-specific — worth
540
+ // extracting into `packages/components/core` in a follow-up. Kept local to this fix for now.
489
541
  // save() can fire repeatedly while the control stays invalid (Save button + onOverlayOutsideClick on
490
542
  // every outside click) — let an in-flight request finish rather than stacking a second scroll/listener/timer.
491
543
  if (this.validationTooltipScrollHandle)
@@ -504,19 +556,17 @@ class KbqInlineEdit {
504
556
  }
505
557
  };
506
558
  const onScrollEnd = () => {
559
+ const wasShown = shown;
560
+ shown = true;
507
561
  clearFallbackTimer();
508
- if (!shown) {
509
- shown = true;
510
- removeScrollEndListener();
511
- this.validationTooltipScrollHandle = null;
512
- this.ngZone.run(() => this.showValidationTooltipIfStillInvalid());
513
- return;
514
- }
515
- // Already shown via the fallback timeout at a stale position — this late scrollend corrects it
516
- // instead of re-showing (which would re-trigger the enter animation).
517
- removeScrollEndListener();
518
- this.validationTooltipScrollHandle = null;
562
+ this.validationTooltipScrollHandle?.cancel();
519
563
  this.ngZone.run(() => {
564
+ if (!wasShown) {
565
+ this.showValidationTooltipIfStillInvalid();
566
+ return;
567
+ }
568
+ // Already shown via the fallback timeout at a stale position — this late scrollend corrects
569
+ // it instead of re-showing (which would re-trigger the enter animation).
520
570
  if (this.isInvalid() && this.tooltipTrigger()?.isOpen) {
521
571
  this.tooltipTrigger()?.updatePosition(true);
522
572
  }
@@ -525,10 +575,9 @@ class KbqInlineEdit {
525
575
  const onTimeout = () => {
526
576
  timeoutId = null;
527
577
  shown = true;
528
- this.validationTooltipScrollHandle = null;
578
+ // The handle deliberately stays installed: the scrollend listener is still armed so a late
579
+ // scrollend can correct the stale position, and `cancel()` is the only thing that removes it.
529
580
  this.ngZone.run(() => this.showValidationTooltipIfStillInvalid());
530
- // Deliberately keep the scrollend listener alive: a late scrollend still corrects the stale
531
- // position via the branch above. Removed by cancel() or the next onScrollEnd call.
532
581
  };
533
582
  this.ngZone.runOutsideAngular(() => {
534
583
  this.window.addEventListener('scrollend', onScrollEnd, { capture: true });
@@ -541,7 +590,7 @@ class KbqInlineEdit {
541
590
  this.validationTooltipScrollHandle = null;
542
591
  }
543
592
  };
544
- this.overlayOrigin.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' });
593
+ this.overlayOrigin().scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'smooth' });
545
594
  }
546
595
  showValidationTooltipIfStillInvalid() {
547
596
  if (!(this.isInvalid() && this.showTooltipOnError() && this.validationTooltip()))
@@ -557,21 +606,29 @@ class KbqInlineEdit {
557
606
  }
558
607
  this.toggleMode();
559
608
  this.canceled.emit();
609
+ this.restoreFocus();
610
+ }
611
+ /** @docs-private */
612
+ onPanelEscape(event) {
613
+ // Also bound on the panel: the overlay dispatches its keys from `<body>`, after a container around an
614
+ // overlay layer, such as a modal, has handled them. A key spent in the panel cancels nothing more.
615
+ if (event.defaultPrevented)
616
+ return;
617
+ event.preventDefault();
618
+ this.cancel();
560
619
  }
561
620
  /** @docs-private */
562
621
  onOverlayKeydown(event) {
563
- this.markAllAsTouched();
564
622
  const canSaveOnEnter = this.canSaveOnEnter();
565
623
  switch (event.key) {
566
624
  case 'Escape': {
567
- this.cancel();
625
+ this.onPanelEscape(event);
568
626
  break;
569
627
  }
570
628
  case 'Enter': {
571
629
  if (canSaveOnEnter(event)) {
572
630
  event.preventDefault();
573
- this.markAllAsTouched();
574
- setTimeout(() => this.save(event));
631
+ this.defer(() => this.save(event));
575
632
  }
576
633
  break;
577
634
  }
@@ -580,9 +637,29 @@ class KbqInlineEdit {
580
637
  }
581
638
  }
582
639
  }
640
+ /**
641
+ * Tab off the panel's first or last tabbable control saves and moves to the tab stop next to the field.
642
+ *
643
+ * @docs-private
644
+ */
645
+ onPanelTab(event, panel, backwards) {
646
+ if (!isElement(event.target))
647
+ return;
648
+ const tabbable = this.getTabbableElements(panel);
649
+ const boundary = backwards ? tabbable.at(0) : tabbable.at(-1);
650
+ if (!boundary || boundary !== event.target)
651
+ return;
652
+ // A control that moved the focus itself has spent the key; one that only prevented the default has not.
653
+ if (event.defaultPrevented && this.document.activeElement !== boundary)
654
+ return;
655
+ // The panel detaches before the browser resolves the key, and Tab from a detached element restarts at the top.
656
+ event.preventDefault();
657
+ this.saveAndFocusAdjacentTabStop(event, backwards);
658
+ }
583
659
  /**
584
660
  * Block propagation of overlay outside click.
585
661
  * Used to prevent reopening when target is inline edit itself.
662
+ *
586
663
  * @docs-private
587
664
  */
588
665
  onOverlayOutsideClick($event) {
@@ -592,48 +669,168 @@ class KbqInlineEdit {
592
669
  }
593
670
  this.save($event);
594
671
  }
595
- detectInteractiveContent(selectors) {
596
- if (!selectors.length) {
597
- this.hasInteractiveContent.set(false);
672
+ /** A select's options sit in an overlay of their own, so the panel's `(keydown.tab)` never fires. */
673
+ watchTabOutsideThePanel() {
674
+ const select = this.selectRef();
675
+ if (!select)
598
676
  return;
677
+ const onKeydown = (event) => {
678
+ if (event.key !== 'Tab' || hasModifierKey(event, 'ctrlKey', 'metaKey', 'altKey'))
679
+ return;
680
+ const overlayElement = this.overlayDir()?.overlayRef?.overlayElement;
681
+ // A Tab inside the panel is the normal case, already handled by `onPanelTab`.
682
+ if (isElement(event.target) && overlayElement?.contains(event.target))
683
+ return;
684
+ const backwards = event.shiftKey;
685
+ // Deferred by one task: the select also uses Tab to walk its own footer, and stays open when
686
+ // it does. That is its business, and only the next task can tell the two apart.
687
+ this.defer(() => {
688
+ if (select.panelOpen || !this.isEditMode())
689
+ return;
690
+ this.ngZone.run(() => this.saveAndFocusAdjacentTabStop(event, backwards));
691
+ });
692
+ };
693
+ this.ngZone.runOutsideAngular(() => {
694
+ this.document.addEventListener('keydown', onKeydown, { capture: true });
695
+ });
696
+ this.overlayDir()
697
+ .overlayRef.detachments()
698
+ .pipe(take(1))
699
+ .subscribe(() => this.document.removeEventListener('keydown', onKeydown, { capture: true }));
700
+ }
701
+ getTabbableElements(panel) {
702
+ return Array.from(panel.querySelectorAll('*')).filter((element) => this.isTabStop(element));
703
+ }
704
+ isTabStop(element) {
705
+ return this.interactivityChecker.isTabbable(element) && !this.interactivityChecker.isDisabled(element);
706
+ }
707
+ /** Offers focus to each next tab stop in turn: `isTabbable` passes hidden controls that then refuse it. */
708
+ focusAdjacentTabStop(backwards) {
709
+ let candidate = this.findAdjacentTabStop(backwards, this.elementRef.nativeElement);
710
+ while (candidate) {
711
+ this.focusMonitor.focusVia(candidate, 'keyboard');
712
+ // `contains` rather than equality: a candidate may hand the focus to a control of its own.
713
+ if (candidate.contains(this.document.activeElement))
714
+ return candidate;
715
+ candidate = this.findAdjacentTabStop(backwards, candidate);
599
716
  }
600
- const viewContent = this.viewContainer().nativeElement.querySelector('.kbq-inline-edit__view-content');
601
- this.hasInteractiveContent.set(!!viewContent?.querySelector(selectors.join(',')));
717
+ return null;
718
+ }
719
+ /** The tab stop next to `from` in document order, walked out of the host rather than collected page-wide. */
720
+ findAdjacentTabStop(backwards, from) {
721
+ const host = this.elementRef.nativeElement;
722
+ const overlayElement = this.overlayDir()?.overlayRef?.overlayElement;
723
+ const walker = this.document.createTreeWalker(this.document.body, NodeFilter.SHOW_ELEMENT);
724
+ walker.currentNode = from;
725
+ const step = () => (backwards ? walker.previousNode() : walker.nextNode());
726
+ for (let node = step(); node; node = step()) {
727
+ // CDK's checker and `focusVia` are typed for `HTMLElement`; an SVG tab stop answers both the same.
728
+ const element = node;
729
+ // Only the subtree: backwards the walk climbs the ancestors, where a tab stop is where Shift+Tab belongs.
730
+ if (host.contains(element) || overlayElement?.contains(element) || !this.isTabStop(element))
731
+ continue;
732
+ // Another overlay — a neighbour's panel, a dialog — is not part of the sequence this field is leaving.
733
+ const overlayContainer = element.closest('.cdk-overlay-container');
734
+ if (overlayContainer && !overlayContainer.contains(host))
735
+ continue;
736
+ return element;
737
+ }
738
+ return null;
602
739
  }
603
- isInteractiveElement(target) {
604
- const selectors = this.interactiveSelectors();
605
- if (!selectors.length)
606
- return false;
607
- return isElement(target) && !!target.closest(selectors.join(','));
740
+ /**
741
+ * Takes focus back when leaving edit mode would otherwise drop it on `<body>`: the element that was
742
+ * focused when the overlay opened may have been destroyed meanwhile, which is exactly the case CDK's
743
+ * `cdkTrapFocusAutoCapture` restore cannot handle, so the target is resolved after the view is back.
744
+ */
745
+ restoreFocus() {
746
+ if (this.chainingToNextInlineEdit)
747
+ return;
748
+ const activeElement = this.document.activeElement;
749
+ const overlayElement = this.overlayDir()?.overlayRef?.overlayElement;
750
+ if (!(activeElement === this.document.body || !!overlayElement?.contains(activeElement)))
751
+ return;
752
+ const origin = this.editModeOrigin;
753
+ this.editModeOrigin = null;
754
+ this.defer(() => {
755
+ if (!this.elementRef.nativeElement.isConnected)
756
+ return;
757
+ this.focusViewTabStop(origin ?? 'program');
758
+ });
608
759
  }
609
760
  /**
610
- * Sets up Tab key listeners on region items.
611
- * Single item: Tab moves to next edit.
612
- * Multiple items: Shift+Tab on first or Tab on last moves to next edit.
761
+ * Runs `fn` in the next task, unless the inline edit is gone by then, and keeps the application unstable until
762
+ * then: without zone.js nothing else would make `whenStable` wait for a timer.
613
763
  */
614
- setOverlayKeydownListener() {
615
- const regionItems = this.regionItems();
616
- if (regionItems.length === 0)
764
+ defer(fn) {
765
+ const removeTask = this.pendingTasks.add();
766
+ setTimeout(() => {
767
+ try {
768
+ if (!this.destroyRef.destroyed)
769
+ fn();
770
+ }
771
+ finally {
772
+ removeTask();
773
+ }
774
+ });
775
+ }
776
+ /** Focuses the tab stop of view mode, resolved at call time: the focus anchor is a new node on every return. */
777
+ focusViewTabStop(origin) {
778
+ this.focusMonitor.focusVia(this.focusAnchor()?.nativeElement ?? this.viewContent().nativeElement, origin);
779
+ }
780
+ /** Brings focus back into the editor a rejected value keeps open; only the select path can lose it. */
781
+ focusRejectedEditor() {
782
+ const panel = this.overlayDir()?.overlayRef?.overlayElement;
783
+ if (!panel || panel.contains(this.document.activeElement))
617
784
  return;
618
- const firstItem = regionItems.at(0);
619
- const lastItem = regionItems.at(regionItems.length - 1);
620
- if (regionItems.length === 1) {
621
- firstItem?.tabOut.subscribe((event) => this.saveAndFocusNextInlineEdit(event));
785
+ this.getTabbableElements(panel).at(0)?.focus();
786
+ }
787
+ detectInteractiveContent(viewContent, selectors) {
788
+ this.hasInteractiveContent.set(!!selectors.length && !!viewContent.querySelector(selectors.join(',')));
789
+ }
790
+ isInteractiveElement(target) {
791
+ const selectors = this.interactiveSelectors();
792
+ if (!selectors.length || !isElement(target))
793
+ return false;
794
+ const match = target.closest(selectors.join(','));
795
+ // The walk has to stop at the component: an inline edit rendered inside an `<a>` — a clickable table
796
+ // row, say — would otherwise read every click as interactive and could never be opened by pointer.
797
+ return !!match && this.elementRef.nativeElement.contains(match);
798
+ }
799
+ /** Saves and hands focus to the tab stop next to the field, opening it when it belongs to another inline edit. */
800
+ saveAndFocusAdjacentTabStop(event, backwards) {
801
+ this.chainingToNextInlineEdit = true;
802
+ // A throwing handler of the application's must not leave the flag set: `restoreFocus()` reads it.
803
+ try {
804
+ this.save(event);
622
805
  }
623
- else {
624
- firstItem?.tabOut.subscribe((event) => hasModifierKey(event, 'shiftKey') && this.saveAndFocusNextInlineEdit(event));
625
- lastItem?.tabOut.subscribe((event) => !hasModifierKey(event, 'shiftKey') && this.saveAndFocusNextInlineEdit(event));
806
+ finally {
807
+ this.chainingToNextInlineEdit = false;
626
808
  }
627
- }
628
- saveAndFocusNextInlineEdit(event) {
629
- this.save(event);
630
- if (this.isInvalid())
809
+ if (this.isInvalid()) {
810
+ this.focusRejectedEditor();
631
811
  return;
632
- setTimeout(() => {
633
- const activeElement = this.document.activeElement;
634
- if (activeElement?.classList?.contains('kbq-inline-edit')) {
635
- activeElement.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
812
+ }
813
+ // The chain goes around `restoreFocus()`, which normally consumes it, and into the next session.
814
+ this.editModeOrigin = null;
815
+ // Deferred until view mode is rendered: until then the field's own tab stop — the fallback — is missing.
816
+ this.defer(() => {
817
+ if (!this.elementRef.nativeElement.isConnected)
818
+ return;
819
+ const target = this.focusAdjacentTabStop(backwards);
820
+ // Nothing took the focus: taking it back beats leaving it on `<body>`, where the next Tab starts over.
821
+ if (!target) {
822
+ this.focusViewTabStop('keyboard');
823
+ return;
636
824
  }
825
+ // An interactive view's tab stop is the anchor beside it, so the neighbour comes from the host element.
826
+ const host = target.closest(`.${baseClass}`);
827
+ const next = host ? inlineEditRegistry.get(host) : undefined;
828
+ if (!next || next === this || next.disabled() || next.mode() !== 'view')
829
+ return;
830
+ // Tab got us here, so the neighbour has to restore a keyboard focus on the way out — without
831
+ // this it would fall back to `program` and leave a keyboard user without a focus ring.
832
+ next.editModeOrigin = 'keyboard';
833
+ next.toggleMode();
637
834
  });
638
835
  }
639
836
  /** Whether saving would send back the value the editor opened with. */
@@ -652,11 +849,16 @@ class KbqInlineEdit {
652
849
  }
653
850
  return runCompareWith(compareWith, current, initial);
654
851
  }
852
+ /**
853
+ * Whether any projected control rejects its current value. Read from the control rather than from
854
+ * `KbqFormField.invalid`, which is the cached `ErrorStateMatcher` verdict — `touched || submitted` —
855
+ * and so reports a pristine invalid control as valid. Error *styling* still follows the matcher.
856
+ */
655
857
  isInvalid() {
656
858
  const formFieldRefList = this.formFieldRefList();
657
859
  if (!formFieldRefList.length)
658
860
  return false;
659
- return formFieldRefList.some((ref) => ref.invalid);
861
+ return formFieldRefList.some((ref) => this.getFormControl(ref)?.invalid ?? ref.invalid);
660
862
  }
661
863
  getValue() {
662
864
  const getValueHandler = this.getValueHandler();
@@ -665,7 +867,10 @@ class KbqInlineEdit {
665
867
  const formFieldRefList = this.formFieldRefList();
666
868
  if (!formFieldRefList.length)
667
869
  return;
668
- return this.formFieldRefList().map((ref) => this.coerceControl(ref)?.value);
870
+ return this.formFieldRefList().map((ref) => {
871
+ const control = this.coerceControl(ref);
872
+ return control instanceof AbstractControl ? control.value : control.value();
873
+ });
669
874
  }
670
875
  setValue(value) {
671
876
  const setValue = this.setValueHandler();
@@ -678,22 +883,28 @@ class KbqInlineEdit {
678
883
  return;
679
884
  value.forEach((controlValue, index) => {
680
885
  const control = this.coerceControl(formFieldRefList[index]);
681
- if (!control)
682
- return;
683
886
  if (control instanceof AbstractControl) {
684
887
  control.setValue(controlValue);
685
888
  }
686
- else {
687
- control.value = controlValue;
889
+ else if (isWritableSignal(control.value)) {
890
+ // A control without a form control can still hold a value code writes, as `kbqInput` does.
891
+ control.value.set(controlValue);
892
+ }
893
+ else if (isValueAccessor(control)) {
894
+ // One holding its value read-only, as the pickers and the tree select do, takes it as from a form.
895
+ control.writeValue(controlValue);
688
896
  }
689
897
  });
690
898
  }
691
899
  coerceControl(formFieldRef) {
692
- const control = formFieldRef.control();
693
- if (control.ngControl instanceof NgControl) {
694
- return control.ngControl.control;
695
- }
696
- return control;
900
+ return this.getFormControl(formFieldRef) ?? formFieldRef.control();
901
+ }
902
+ getFormControl(formFieldRef) {
903
+ const { ngControl } = formFieldRef.control();
904
+ // The pickers hand over the form control itself: they are value accessors, which cannot inject `NgControl`.
905
+ if (ngControl instanceof AbstractControl)
906
+ return ngControl;
907
+ return ngControl instanceof NgControl ? ngControl.control : null;
697
908
  }
698
909
  setOverlayWidth() {
699
910
  const editModeWidth = this.editModeWidth();
@@ -711,6 +922,7 @@ class KbqInlineEdit {
711
922
  .pipe(takeUntil(overlayRef.detachments()))
712
923
  .subscribe(() => {
713
924
  this.overlayWidth.set(element.offsetWidth);
925
+ this.overlayOffsetY.set(-this.overlayOrigin().offsetHeight);
714
926
  overlayRef.updatePosition();
715
927
  });
716
928
  }
@@ -724,23 +936,23 @@ class KbqInlineEdit {
724
936
  return this.overlayDir()?.overlayRef.overlayElement.querySelector('input:not([type="file"]),textarea') ?? null;
725
937
  }
726
938
  markAllAsTouched() {
727
- this.formFieldRefList().forEach((formField) => formField.control().ngControl?.control?.markAsTouched());
939
+ this.formFieldRefList().forEach((formField) => this.getFormControl(formField)?.markAsTouched());
728
940
  }
729
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEdit, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
730
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.30", type: KbqInlineEdit, isStandalone: true, selector: "kbq-inline-edit", inputs: { showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, showTooltipOnError: { classPropertyName: "showTooltipOnError", publicName: "showTooltipOnError", isSignal: true, isRequired: false, transformFunction: null }, validationTooltip: { classPropertyName: "validationTooltip", publicName: "validationTooltip", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, editModeWidth: { classPropertyName: "editModeWidth", publicName: "editModeWidth", isSignal: true, isRequired: false, transformFunction: null }, tooltipPlacement: { classPropertyName: "tooltipPlacement", publicName: "tooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayPanelClass: { classPropertyName: "overlayPanelClass", publicName: "overlayPanelClass", isSignal: true, isRequired: false, transformFunction: null }, getValueHandler: { classPropertyName: "getValueHandler", publicName: "getValueHandler", isSignal: true, isRequired: false, transformFunction: null }, setValueHandler: { classPropertyName: "setValueHandler", publicName: "setValueHandler", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, saveHandler: { classPropertyName: "saveHandler", publicName: "saveHandler", isSignal: true, isRequired: false, transformFunction: null }, saveErrorHandler: { classPropertyName: "saveErrorHandler", publicName: "saveErrorHandler", isSignal: true, isRequired: false, transformFunction: null }, canSaveOnEnter: { classPropertyName: "canSaveOnEnter", publicName: "canSaveOnEnter", isSignal: true, isRequired: false, transformFunction: null }, interactiveSelectors: { classPropertyName: "interactiveSelectors", publicName: "interactiveSelectors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", canceled: "canceled", saveError: "saveError", modeChange: "modeChange" }, host: { listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "attr.tabindex": "tabIndex()", "class": "className()", "class.kbq-inline-edit_with-label": "!!label()", "class.kbq-inline-edit_with-menu": "!!menu()", "class.kbq-inline-edit_disabled": "disabled()", "class.kbq-inline-edit_anchor-focused": "anchorFocused()", "class.kbq-inline-edit_select": "isSingleSelect()", "class.kbq-inline-edit_save-error": "saveStatus() === \"error\"", "class.kbq-progress": "saveStatus() === \"progress\"" }, classAttribute: "kbq-inline-edit" }, providers: [{ provide: KBQ_CONNECTED_OVERLAY_ORIGIN, useExisting: forwardRef((() => KbqInlineEdit)) }], queries: [{ propertyName: "menu", first: true, predicate: KbqInlineEditMenu, descendants: true, isSignal: true }, { propertyName: "label", first: true, predicate: KbqLabel, descendants: true, isSignal: true }, { propertyName: "formFieldRefList", predicate: KbqFormField, descendants: true, isSignal: true }, { propertyName: "selectRef", first: true, predicate: KbqSelect, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "tooltipTrigger", first: true, predicate: KbqTooltipTrigger, descendants: true, isSignal: true }, { propertyName: "viewContainer", first: true, predicate: ["viewContainer"], descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "regionItems", predicate: KbqFocusRegionItem, descendants: true, isSignal: true }], exportAs: ["kbqInlineEdit"], hostDirectives: [{ directive: i1.CdkMonitorFocus }], ngImport: i0, template: "<div class=\"kbq-inline-edit__focus_container\">\n <div class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ saveStatusMessage() }}</div>\n\n @if (label()) {\n <div class=\"kbq-inline-edit__label\">\n <ng-content select=\"kbq-label\" />\n </div>\n }\n\n <div #viewContainer class=\"kbq-inline-edit__view-container\">\n <div class=\"kbq-inline-edit__view-content\">\n <ng-content select=\"[kbqInlineEditViewMode]\" />\n </div>\n\n @if (hasInteractiveContent() && mode() === 'view' && !disabled()) {\n <div\n class=\"kbq-inline-edit__focus-anchor cdk-visually-hidden\"\n tabindex=\"0\"\n (focus)=\"anchorFocused.set(true)\"\n (blur)=\"anchorFocused.set(false)\"\n ></div>\n }\n\n @if (menu() && mode() === 'view') {\n <div class=\"kbq-inline-edit__menu-mask kbq-mask\">\n <div class=\"kbq-inline-edit__menu-mask-fade kbq-mask__fade\"></div>\n <div class=\"kbq-inline-edit__menu-mask-container kbq-mask__container\">\n <ng-content select=\"[kbqInlineEditMenu]\" />\n </div>\n </div>\n }\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOpen]=\"isEditMode()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOffsetY]=\"-overlayOrigin.offsetHeight\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayDisableClose]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy()\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n (attach)=\"onAttach()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n >\n <div class=\"cdk-visually-hidden\" aria-hidden=\"true\" kbqFocusRegionItem tabindex=\"0\"></div>\n <div\n class=\"kbq-inline-edit__panel\"\n cdkTrapFocusAutoCapture\n [class.kbq-inline-edit__panel_select]=\"isSingleSelect()\"\n [cdkTrapFocus]=\"false\"\n >\n <div\n class=\"kbq-inline-edit__control-container\"\n [kbqTooltipColor]=\"colors.Error\"\n [kbqTooltip]=\"validationTooltip() ?? ''\"\n [kbqTooltipDisabled]=\"!validationTooltip()\"\n [kbqTooltipArrow]=\"false\"\n [kbqTrigger]=\"'manual'\"\n [kbqPlacement]=\"tooltipPlacement() ?? placements.TopLeft\"\n [kbqTooltipScrollStrategy]=\"validationTooltipScrollStrategy\"\n >\n <ng-content select=\"[kbqInlineEditEditMode]\" />\n </div>\n\n @if (showActions()) {\n <div class=\"kbq-inline-edit__action-buttons\" role=\"group\" [@panelAnimation]>\n <div class=\"kbq-inline-edit__action-button\">\n <button kbq-button [color]=\"'contrast'\" (click)=\"save($event)\">\n <i kbq-icon=\"kbq-check_16\"></i>\n </button>\n </div>\n\n <div class=\"kbq-inline-edit__action-button\">\n <button kbq-button [color]=\"'contrast-fade'\" (click)=\"cancel()\">\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"cdk-visually-hidden\" aria-hidden=\"true\" kbqFocusRegionItem tabindex=\"0\"></div>\n </ng-template>\n </div>\n</div>\n", styles: [".kbq-inline-edit{display:flex;flex-direction:column;justify-content:center;box-sizing:border-box;border:var(--kbq-size-border-width) solid transparent;border-radius:var(--kbq-size-border-radius);padding:var(--kbq-inline-edit-padding-vertical) var(--kbq-inline-edit-padding-horizontal);min-height:var(--kbq-inline-edit-height);background:var(--kbq-inline-edit-background)}.kbq-inline-edit:focus-visible{outline:none}.kbq-inline-edit.cdk-keyboard-focused,.kbq-inline-edit.kbq-inline-edit_anchor-focused{box-shadow:inset 0 0 .1px 1px var(--kbq-states-line-focus-theme);border-color:var(--kbq-states-line-focus-theme)}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-transparent-hover);--kbq-mask-background: var(--kbq-states-background-contrast-less-hover);cursor:pointer}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-transparent-active);--kbq-mask-background: var(--kbq-states-background-contrast-less-active)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:hover,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:has(.kbq-inline-edit__menu.kbq-active){--kbq-mask-background: var(--kbq-background-bg)}.kbq-inline-edit .kbq-label{color:var(--kbq-inline-edit-label-color)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error{--kbq-inline-edit-background: var(--kbq-inline-edit-error-background)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-error-less-hover);--kbq-mask-background: var(--kbq-states-background-error-less-hover)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-error-less-active);--kbq-mask-background: var(--kbq-states-background-error-less-active)}.kbq-inline-edit{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-inline-edit:not(.kbq-inline-edit_with-label){--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-m) - var(--kbq-size-border-width))}.kbq-inline-edit.kbq-inline-edit_with-label{padding-top:var(--kbq-inline-edit-padding-vertical);padding-bottom:var(--kbq-inline-edit-padding-vertical)}.kbq-inline-edit.kbq-inline-edit_with-label.kbq-inline-edit_edit .kbq-inline-edit__view-container{position:relative}.kbq-inline-edit.kbq-inline-edit_with-label .kbq-inline-edit__label{margin-bottom:var(--kbq-size-3xs)}.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-container,.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-content{text-overflow:ellipsis}.kbq-inline-edit.kbq-inline-edit_select.kbq-inline-edit_edit{--kbq-inline-edit-background: var(--kbq-states-background-transparent-active)}.kbq-inline-edit:hover .kbq-inline-edit__menu-mask,.kbq-inline-edit.cdk-keyboard-focused .kbq-inline-edit__menu-mask,.kbq-inline-edit.kbq-inline-edit_anchor-focused .kbq-inline-edit__menu-mask{opacity:1}.kbq-inline-edit .kbq-inline-edit__placeholder{color:var(--kbq-foreground-contrast-secondary)}.kbq-inline-edit{position:relative}.kbq-inline-edit .kbq-mask{display:flex;position:absolute;top:calc(var(--kbq-size-border-width) * -1);right:calc(var(--kbq-size-border-width) * -1)}.kbq-inline-edit .kbq-mask .kbq-mask__fade{background:var(--kbq-mask-background, transparent);-webkit-mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black, var(--kbq-black-default)));mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black, var(--kbq-black-default)))}.kbq-inline-edit .kbq-mask .kbq-mask__container{background:var(--kbq-mask-background, transparent)}.kbq-inline-edit .kbq-inline-edit__menu-mask{opacity:0;height:calc(100% + 2 * var(--kbq-size-border-width));justify-content:flex-end;border-top-right-radius:var(--kbq-size-border-radius);border-bottom-right-radius:var(--kbq-size-border-radius)}.kbq-inline-edit .kbq-inline-edit__menu-mask:has(.kbq-inline-edit__menu.kbq-pressed,.kbq-inline-edit__menu.cdk-keyboard-focused){opacity:1}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-fade{width:32px}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-container{display:flex;justify-content:flex-end;min-width:40px;border-radius:inherit}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu{display:inline-flex;align-self:flex-start;padding:var(--kbq-size-s);z-index:2}.kbq-inline-edit__panel{width:100%}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons{position:absolute;left:calc(-1 * var(--kbq-inline-edit-padding-horizontal));display:inline-flex;flex-direction:row;gap:var(--kbq-size-xxs);padding:var(--kbq-size-xxs) var(--kbq-size-s) var(--kbq-size-s)}.kbq-inline-edit__panel.kbq-inline-edit__panel_select .kbq-inline-edit__control-container{display:none}.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{box-shadow:var(--kbq-shadow-popup);background-color:var(--kbq-background-bg);border-radius:var(--kbq-size-border-radius)}\n", ":where(.kbq-inline-edit,.kbq-inline-edit__panel){--kbq-inline-edit-background: transparent;--kbq-inline-edit-height: calc(var(--kbq-size-3xl) - 2 * var(--kbq-size-border-width));--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-s) - var(--kbq-size-border-width));--kbq-inline-edit-padding-vertical: calc(var(--kbq-size-xs) - var(--kbq-size-border-width));--kbq-inline-edit-panel-shadow: var(--kbq-shadow-popup);--kbq-inline-edit-label-color: var(--kbq-foreground-contrast-secondary);--kbq-inline-edit-error-background: var(--kbq-background-error-less)}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i2.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i2.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "component", type: KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["kbqTooltipScrollStrategy", "forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "directive", type: KbqFocusRegionItem, selector: "[kbqFocusRegionItem]", outputs: ["tabOut"], exportAs: ["kbqFocusRegionItem"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], animations: [KBQ_INLINE_EDIT_ACTION_BUTTONS_ANIMATION], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
941
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEdit, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
942
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqInlineEdit, isStandalone: true, selector: "kbq-inline-edit", inputs: { showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, showTooltipOnError: { classPropertyName: "showTooltipOnError", publicName: "showTooltipOnError", isSignal: true, isRequired: false, transformFunction: null }, validationTooltip: { classPropertyName: "validationTooltip", publicName: "validationTooltip", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, editModeWidth: { classPropertyName: "editModeWidth", publicName: "editModeWidth", isSignal: true, isRequired: false, transformFunction: null }, tooltipPlacement: { classPropertyName: "tooltipPlacement", publicName: "tooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, overlayPanelClass: { classPropertyName: "overlayPanelClass", publicName: "overlayPanelClass", isSignal: true, isRequired: false, transformFunction: null }, getValueHandler: { classPropertyName: "getValueHandler", publicName: "getValueHandler", isSignal: true, isRequired: false, transformFunction: null }, setValueHandler: { classPropertyName: "setValueHandler", publicName: "setValueHandler", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, compareWith: { classPropertyName: "compareWith", publicName: "compareWith", isSignal: true, isRequired: false, transformFunction: null }, saveHandler: { classPropertyName: "saveHandler", publicName: "saveHandler", isSignal: true, isRequired: false, transformFunction: null }, saveErrorHandler: { classPropertyName: "saveErrorHandler", publicName: "saveErrorHandler", isSignal: true, isRequired: false, transformFunction: null }, canSaveOnEnter: { classPropertyName: "canSaveOnEnter", publicName: "canSaveOnEnter", isSignal: true, isRequired: false, transformFunction: null }, interactiveSelectors: { classPropertyName: "interactiveSelectors", publicName: "interactiveSelectors", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", canceled: "canceled", saveError: "saveError", mode: "modeChange" }, host: { attributes: { "cdkMonitorSubtreeFocus": "" }, listeners: { "click": "onClick($event)", "keydown.enter": "onClick($event)", "keydown.space": "onClick($event)" }, properties: { "class": "className()", "class.kbq-inline-edit_with-label": "!!label()", "class.kbq-inline-edit_with-menu": "!!menu()", "class.kbq-inline-edit_disabled": "disabled()", "class.kbq-inline-edit_anchor-focused": "anchorFocused()", "class.kbq-inline-edit_select": "isSingleSelect()", "class.kbq-inline-edit_save-error": "saveStatus() === \"error\"", "class.kbq-progress": "saveStatus() === \"progress\"", "attr.aria-label": "null" }, classAttribute: "kbq-inline-edit" }, providers: [{ provide: KBQ_CONNECTED_OVERLAY_ORIGIN, useExisting: forwardRef((() => KbqInlineEdit)) }], queries: [{ propertyName: "menu", first: true, predicate: KbqInlineEditMenu, descendants: true, isSignal: true }, { propertyName: "label", first: true, predicate: KbqLabel, descendants: true, isSignal: true }, { propertyName: "formFieldRefList", predicate: KbqFormField, descendants: true, isSignal: true }, { propertyName: "selectRef", first: true, predicate: KbqSelect, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "tooltipTrigger", first: true, predicate: KbqTooltipTrigger, descendants: true, isSignal: true }, { propertyName: "viewContainer", first: true, predicate: ["viewContainer"], descendants: true, isSignal: true }, { propertyName: "viewContent", first: true, predicate: ["viewContent"], descendants: true, isSignal: true }, { propertyName: "focusAnchor", first: true, predicate: ["focusAnchor"], descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }], exportAs: ["kbqInlineEdit"], hostDirectives: [{ directive: i1.CdkMonitorFocus }, { directive: i2.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: "<div class=\"kbq-inline-edit__focus_container\">\n <div class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ saveStatusMessage() }}</div>\n\n @if (label()) {\n <div class=\"kbq-inline-edit__label\">\n <ng-content select=\"kbq-label\" />\n </div>\n }\n\n <div #viewContainer class=\"kbq-inline-edit__view-container\">\n <div\n #viewContent\n class=\"kbq-inline-edit__view-content\"\n [attr.role]=\"viewContentRole()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.aria-label]=\"viewContentRole() ? accessibleName() : null\"\n [attr.aria-expanded]=\"viewContentRole() ? isEditMode() : null\"\n [attr.aria-disabled]=\"viewContentRole() && disabled() ? true : null\"\n >\n <ng-content select=\"[kbqInlineEditViewMode]\" />\n </div>\n\n @if (hasInteractiveContent() && mode() === 'view' && !disabled()) {\n <!-- `aria-expanded` is static: the anchor only exists in view mode, so it is never expanded. -->\n <div\n #focusAnchor\n class=\"kbq-inline-edit__focus-anchor cdk-visually-hidden\"\n aria-expanded=\"false\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"accessibleName()\"\n (focus)=\"anchorFocused.set(true)\"\n (blur)=\"anchorFocused.set(false)\"\n ></div>\n }\n\n @if (menu() && mode() === 'view') {\n <div class=\"kbq-inline-edit__menu-mask\">\n <div class=\"kbq-inline-edit__menu-mask-fade\"></div>\n <div class=\"kbq-inline-edit__menu-mask-container\">\n <ng-content select=\"[kbqInlineEditMenu]\" />\n </div>\n </div>\n }\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOpen]=\"isEditMode()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin()\"\n [cdkConnectedOverlayOffsetY]=\"overlayOffsetY()\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayDisableClose]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy()\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n (attach)=\"onAttach()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n >\n <div\n #panel\n class=\"kbq-inline-edit__panel\"\n cdkTrapFocusAutoCapture\n [class.kbq-inline-edit__panel_select]=\"isSingleSelect()\"\n [cdkTrapFocus]=\"false\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (keydown.tab)=\"onPanelTab($event, panel, false)\"\n (keydown.shift.tab)=\"onPanelTab($event, panel, true)\"\n >\n <div\n class=\"kbq-inline-edit__control-container\"\n [kbqTooltipColor]=\"colors.Error\"\n [kbqTooltip]=\"validationTooltip() ?? ''\"\n [kbqTooltipDisabled]=\"!validationTooltip()\"\n [kbqTooltipArrow]=\"false\"\n [kbqTrigger]=\"'manual'\"\n [kbqPlacement]=\"tooltipPlacement() ?? placements.TopLeft\"\n [kbqTooltipScrollStrategy]=\"validationTooltipScrollStrategy\"\n >\n <ng-content select=\"[kbqInlineEditEditMode]\" />\n </div>\n\n @if (showActions()) {\n <div\n animate.enter=\"kbq-inline-edit__action-buttons_enter\"\n class=\"kbq-inline-edit__action-buttons\"\n role=\"group\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n >\n <div class=\"kbq-inline-edit__action-button\">\n <button\n kbq-button\n [attr.aria-label]=\"a11yLocaleConfiguration().save\"\n [color]=\"'contrast'\"\n (click)=\"save($event)\"\n >\n <i kbq-icon=\"kbq-check_16\"></i>\n </button>\n </div>\n\n <div class=\"kbq-inline-edit__action-button\">\n <button\n kbq-button\n [attr.aria-label]=\"a11yLocaleConfiguration().cancel\"\n [color]=\"'contrast-fade'\"\n (click)=\"cancel()\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.kbq-inline-edit{display:flex;position:relative;flex-direction:column;justify-content:center;box-sizing:border-box;border:var(--kbq-size-border-width) solid transparent;border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-inline-edit{padding:var(--kbq-inline-edit-padding-vertical) var(--kbq-inline-edit-padding-horizontal);min-height:var(--kbq-inline-edit-height);background:var(--kbq-inline-edit-background)}.kbq-inline-edit .kbq-inline-edit__view-content:focus,.kbq-inline-edit .kbq-inline-edit__focus-anchor:focus{outline:none}.kbq-inline-edit.cdk-keyboard-focused:not(:has(:focus:not(.kbq-inline-edit__view-content,.kbq-inline-edit__focus-anchor))),.kbq-inline-edit.kbq-inline-edit_anchor-focused{box-shadow:inset 0 0 .1px 1px var(--kbq-states-line-focus-theme);border-color:var(--kbq-states-line-focus-theme)}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-transparent-hover);--kbq-mask-background: var(--kbq-states-background-contrast-less-hover);cursor:pointer}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-transparent-active);--kbq-mask-background: var(--kbq-states-background-contrast-less-active)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:hover,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:has(.kbq-inline-edit__menu.kbq-active){--kbq-mask-background: var(--kbq-background-bg)}.kbq-inline-edit .kbq-label{color:var(--kbq-inline-edit-label-color)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error{--kbq-inline-edit-background: var(--kbq-inline-edit-error-background)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-error-less-hover);--kbq-mask-background: var(--kbq-states-background-error-less-hover)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-error-less-active);--kbq-mask-background: var(--kbq-states-background-error-less-active)}.kbq-inline-edit{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-inline-edit:not(.kbq-inline-edit_with-label){--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-m) - var(--kbq-size-border-width))}.kbq-inline-edit.kbq-inline-edit_with-label{padding-top:var(--kbq-inline-edit-padding-vertical);padding-bottom:var(--kbq-inline-edit-padding-vertical)}.kbq-inline-edit.kbq-inline-edit_with-label.kbq-inline-edit_edit .kbq-inline-edit__view-container{position:relative}.kbq-inline-edit.kbq-inline-edit_with-label .kbq-inline-edit__label{margin-bottom:var(--kbq-size-3xs)}.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-container,.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-content{text-overflow:ellipsis}.kbq-inline-edit.kbq-inline-edit_select.kbq-inline-edit_edit{--kbq-inline-edit-background: var(--kbq-states-background-transparent-active)}.kbq-inline-edit:hover .kbq-inline-edit__menu-mask,.kbq-inline-edit.cdk-keyboard-focused .kbq-inline-edit__menu-mask,.kbq-inline-edit.kbq-inline-edit_anchor-focused .kbq-inline-edit__menu-mask{opacity:1}.kbq-inline-edit .kbq-inline-edit__placeholder{color:var(--kbq-foreground-contrast-secondary)}.kbq-inline-edit .kbq-inline-edit__menu-mask{display:flex;position:absolute;top:calc(var(--kbq-size-border-width) * -1);right:calc(var(--kbq-size-border-width) * -1);opacity:0;height:calc(100% + 2 * var(--kbq-size-border-width));justify-content:flex-end;border-top-right-radius:var(--kbq-size-border-radius);border-bottom-right-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit .kbq-inline-edit__menu-mask{corner-shape:squircle;border-top-right-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2);border-bottom-right-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-inline-edit .kbq-inline-edit__menu-mask:has(.kbq-inline-edit__menu.kbq-pressed,.kbq-inline-edit__menu.cdk-keyboard-focused){opacity:1}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-fade{width:32px;background:var(--kbq-mask-background, transparent);-webkit-mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black));mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black))}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-container{display:flex;justify-content:flex-end;min-width:40px;border-radius:inherit;corner-shape:inherit;background:var(--kbq-mask-background, transparent)}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu{display:inline-flex;align-self:flex-start;padding:var(--kbq-size-s);z-index:2}.kbq-inline-edit__panel{width:100%}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons{position:absolute;left:calc(-1 * var(--kbq-inline-edit-padding-horizontal));display:inline-flex;flex-direction:row;gap:var(--kbq-size-xxs);padding:var(--kbq-size-xxs) var(--kbq-size-s) var(--kbq-size-s)}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter{animation:kbq-inline-edit-action-buttons-enter 50ms cubic-bezier(0,0,.2,1)}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter.kbq-animations-disabled{animation:none;transition:none}@media(prefers-reduced-motion:reduce){.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter{animation:none;transition:none}}.kbq-inline-edit__panel.kbq-inline-edit__panel_select .kbq-inline-edit__control-container{display:none}.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{box-shadow:var(--kbq-inline-edit-panel-shadow);background-color:var(--kbq-background-bg);border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}@keyframes kbq-inline-edit-action-buttons-enter{0%{transform:translateY(100%);opacity:0}}\n", ":where(.kbq-inline-edit,.kbq-inline-edit__panel){--kbq-inline-edit-background: transparent;--kbq-inline-edit-height: calc(var(--kbq-size-3xl) - 2 * var(--kbq-size-border-width));--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-s) - var(--kbq-size-border-width));--kbq-inline-edit-padding-vertical: calc(var(--kbq-size-xs) - var(--kbq-size-border-width));--kbq-inline-edit-panel-shadow: var(--kbq-shadow-popup);--kbq-inline-edit-label-color: var(--kbq-foreground-contrast-secondary);--kbq-inline-edit-error-background: var(--kbq-background-error-less)}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "component", type: KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["kbqTooltipScrollStrategy", "forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "kbqTrigger", "hideWithTimeout", "kbqEnterDelay", "kbqLeaveDelay", "kbqRelativeToPointer", "kbqRelativeToCaret", "kbqRelativeToCaretVertical", "kbqTooltip", "kbqTooltipHeader", "kbqTooltipModifier", "kbqTooltipContext", "kbqTooltipClass", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipDisabled", "kbqPlacementPriority", "kbqPlacement", "kbqVisible"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
731
943
  }
732
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEdit, decorators: [{
944
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEdit, decorators: [{
733
945
  type: Component,
734
946
  args: [{ selector: 'kbq-inline-edit', imports: [
735
947
  CdkConnectedOverlay,
736
948
  KbqButtonModule,
737
949
  KbqIcon,
738
950
  KbqTooltipTrigger,
739
- KbqFocusRegionItem,
740
951
  CdkTrapFocus
741
952
  ], providers: [{ provide: KBQ_CONNECTED_OVERLAY_ORIGIN, useExisting: forwardRef((() => KbqInlineEdit)) }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
742
953
  class: baseClass,
743
- '[attr.tabindex]': 'tabIndex()',
954
+ // The widget semantics live on the view content, so the focus ring has to follow the subtree.
955
+ cdkMonitorSubtreeFocus: '',
744
956
  '[class]': 'className()',
745
957
  '[class.kbq-inline-edit_with-label]': '!!label()',
746
958
  '[class.kbq-inline-edit_with-menu]': '!!menu()',
@@ -750,11 +962,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
750
962
  '[class.kbq-inline-edit_save-error]': 'saveStatus() === "error"',
751
963
  // The background save is reported on the row itself, which by then is back in view mode.
752
964
  '[class.kbq-progress]': 'saveStatus() === "progress"',
965
+ // `aria-label` is an input, and the host itself carries no role, where naming is prohibited.
966
+ '[attr.aria-label]': 'null',
753
967
  '(click)': 'onClick($event)',
754
968
  '(keydown.enter)': 'onClick($event)',
755
969
  '(keydown.space)': 'onClick($event)'
756
- }, hostDirectives: [CdkMonitorFocus], animations: [KBQ_INLINE_EDIT_ACTION_BUTTONS_ANIMATION], exportAs: 'kbqInlineEdit', template: "<div class=\"kbq-inline-edit__focus_container\">\n <div class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ saveStatusMessage() }}</div>\n\n @if (label()) {\n <div class=\"kbq-inline-edit__label\">\n <ng-content select=\"kbq-label\" />\n </div>\n }\n\n <div #viewContainer class=\"kbq-inline-edit__view-container\">\n <div class=\"kbq-inline-edit__view-content\">\n <ng-content select=\"[kbqInlineEditViewMode]\" />\n </div>\n\n @if (hasInteractiveContent() && mode() === 'view' && !disabled()) {\n <div\n class=\"kbq-inline-edit__focus-anchor cdk-visually-hidden\"\n tabindex=\"0\"\n (focus)=\"anchorFocused.set(true)\"\n (blur)=\"anchorFocused.set(false)\"\n ></div>\n }\n\n @if (menu() && mode() === 'view') {\n <div class=\"kbq-inline-edit__menu-mask kbq-mask\">\n <div class=\"kbq-inline-edit__menu-mask-fade kbq-mask__fade\"></div>\n <div class=\"kbq-inline-edit__menu-mask-container kbq-mask__container\">\n <ng-content select=\"[kbqInlineEditMenu]\" />\n </div>\n </div>\n }\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOpen]=\"isEditMode()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOffsetY]=\"-overlayOrigin.offsetHeight\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayDisableClose]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy()\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n (attach)=\"onAttach()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n >\n <div class=\"cdk-visually-hidden\" aria-hidden=\"true\" kbqFocusRegionItem tabindex=\"0\"></div>\n <div\n class=\"kbq-inline-edit__panel\"\n cdkTrapFocusAutoCapture\n [class.kbq-inline-edit__panel_select]=\"isSingleSelect()\"\n [cdkTrapFocus]=\"false\"\n >\n <div\n class=\"kbq-inline-edit__control-container\"\n [kbqTooltipColor]=\"colors.Error\"\n [kbqTooltip]=\"validationTooltip() ?? ''\"\n [kbqTooltipDisabled]=\"!validationTooltip()\"\n [kbqTooltipArrow]=\"false\"\n [kbqTrigger]=\"'manual'\"\n [kbqPlacement]=\"tooltipPlacement() ?? placements.TopLeft\"\n [kbqTooltipScrollStrategy]=\"validationTooltipScrollStrategy\"\n >\n <ng-content select=\"[kbqInlineEditEditMode]\" />\n </div>\n\n @if (showActions()) {\n <div class=\"kbq-inline-edit__action-buttons\" role=\"group\" [@panelAnimation]>\n <div class=\"kbq-inline-edit__action-button\">\n <button kbq-button [color]=\"'contrast'\" (click)=\"save($event)\">\n <i kbq-icon=\"kbq-check_16\"></i>\n </button>\n </div>\n\n <div class=\"kbq-inline-edit__action-button\">\n <button kbq-button [color]=\"'contrast-fade'\" (click)=\"cancel()\">\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n <div class=\"cdk-visually-hidden\" aria-hidden=\"true\" kbqFocusRegionItem tabindex=\"0\"></div>\n </ng-template>\n </div>\n</div>\n", styles: [".kbq-inline-edit{display:flex;flex-direction:column;justify-content:center;box-sizing:border-box;border:var(--kbq-size-border-width) solid transparent;border-radius:var(--kbq-size-border-radius);padding:var(--kbq-inline-edit-padding-vertical) var(--kbq-inline-edit-padding-horizontal);min-height:var(--kbq-inline-edit-height);background:var(--kbq-inline-edit-background)}.kbq-inline-edit:focus-visible{outline:none}.kbq-inline-edit.cdk-keyboard-focused,.kbq-inline-edit.kbq-inline-edit_anchor-focused{box-shadow:inset 0 0 .1px 1px var(--kbq-states-line-focus-theme);border-color:var(--kbq-states-line-focus-theme)}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-transparent-hover);--kbq-mask-background: var(--kbq-states-background-contrast-less-hover);cursor:pointer}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-transparent-active);--kbq-mask-background: var(--kbq-states-background-contrast-less-active)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:hover,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:has(.kbq-inline-edit__menu.kbq-active){--kbq-mask-background: var(--kbq-background-bg)}.kbq-inline-edit .kbq-label{color:var(--kbq-inline-edit-label-color)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error{--kbq-inline-edit-background: var(--kbq-inline-edit-error-background)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-error-less-hover);--kbq-mask-background: var(--kbq-states-background-error-less-hover)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-error-less-active);--kbq-mask-background: var(--kbq-states-background-error-less-active)}.kbq-inline-edit{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-inline-edit:not(.kbq-inline-edit_with-label){--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-m) - var(--kbq-size-border-width))}.kbq-inline-edit.kbq-inline-edit_with-label{padding-top:var(--kbq-inline-edit-padding-vertical);padding-bottom:var(--kbq-inline-edit-padding-vertical)}.kbq-inline-edit.kbq-inline-edit_with-label.kbq-inline-edit_edit .kbq-inline-edit__view-container{position:relative}.kbq-inline-edit.kbq-inline-edit_with-label .kbq-inline-edit__label{margin-bottom:var(--kbq-size-3xs)}.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-container,.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-content{text-overflow:ellipsis}.kbq-inline-edit.kbq-inline-edit_select.kbq-inline-edit_edit{--kbq-inline-edit-background: var(--kbq-states-background-transparent-active)}.kbq-inline-edit:hover .kbq-inline-edit__menu-mask,.kbq-inline-edit.cdk-keyboard-focused .kbq-inline-edit__menu-mask,.kbq-inline-edit.kbq-inline-edit_anchor-focused .kbq-inline-edit__menu-mask{opacity:1}.kbq-inline-edit .kbq-inline-edit__placeholder{color:var(--kbq-foreground-contrast-secondary)}.kbq-inline-edit{position:relative}.kbq-inline-edit .kbq-mask{display:flex;position:absolute;top:calc(var(--kbq-size-border-width) * -1);right:calc(var(--kbq-size-border-width) * -1)}.kbq-inline-edit .kbq-mask .kbq-mask__fade{background:var(--kbq-mask-background, transparent);-webkit-mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black, var(--kbq-black-default)));mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black, var(--kbq-black-default)))}.kbq-inline-edit .kbq-mask .kbq-mask__container{background:var(--kbq-mask-background, transparent)}.kbq-inline-edit .kbq-inline-edit__menu-mask{opacity:0;height:calc(100% + 2 * var(--kbq-size-border-width));justify-content:flex-end;border-top-right-radius:var(--kbq-size-border-radius);border-bottom-right-radius:var(--kbq-size-border-radius)}.kbq-inline-edit .kbq-inline-edit__menu-mask:has(.kbq-inline-edit__menu.kbq-pressed,.kbq-inline-edit__menu.cdk-keyboard-focused){opacity:1}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-fade{width:32px}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-container{display:flex;justify-content:flex-end;min-width:40px;border-radius:inherit}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu{display:inline-flex;align-self:flex-start;padding:var(--kbq-size-s);z-index:2}.kbq-inline-edit__panel{width:100%}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons{position:absolute;left:calc(-1 * var(--kbq-inline-edit-padding-horizontal));display:inline-flex;flex-direction:row;gap:var(--kbq-size-xxs);padding:var(--kbq-size-xxs) var(--kbq-size-s) var(--kbq-size-s)}.kbq-inline-edit__panel.kbq-inline-edit__panel_select .kbq-inline-edit__control-container{display:none}.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{box-shadow:var(--kbq-shadow-popup);background-color:var(--kbq-background-bg);border-radius:var(--kbq-size-border-radius)}\n", ":where(.kbq-inline-edit,.kbq-inline-edit__panel){--kbq-inline-edit-background: transparent;--kbq-inline-edit-height: calc(var(--kbq-size-3xl) - 2 * var(--kbq-size-border-width));--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-s) - var(--kbq-size-border-width));--kbq-inline-edit-padding-vertical: calc(var(--kbq-size-xs) - var(--kbq-size-border-width));--kbq-inline-edit-panel-shadow: var(--kbq-shadow-popup);--kbq-inline-edit-label-color: var(--kbq-foreground-contrast-secondary);--kbq-inline-edit-error-background: var(--kbq-background-error-less)}\n"] }]
757
- }], ctorParameters: () => [], propDecorators: { showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], showTooltipOnError: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltipOnError", required: false }] }], validationTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "validationTooltip", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], editModeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "editModeWidth", required: false }] }], tooltipPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipPlacement", required: false }] }], overlayPanelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPanelClass", required: false }] }], getValueHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "getValueHandler", required: false }] }], setValueHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "setValueHandler", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], saveHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "saveHandler", required: false }] }], saveErrorHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "saveErrorHandler", required: false }] }], canSaveOnEnter: [{ type: i0.Input, args: [{ isSignal: true, alias: "canSaveOnEnter", required: false }] }], interactiveSelectors: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactiveSelectors", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], canceled: [{ type: i0.Output, args: ["canceled"] }], saveError: [{ type: i0.Output, args: ["saveError"] }], modeChange: [{ type: i0.Output, args: ["modeChange"] }], menu: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqInlineEditMenu), { isSignal: true }] }], label: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqLabel), { isSignal: true }] }], formFieldRefList: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KbqFormField), { ...{ descendants: true }, isSignal: true }] }], selectRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelect), { ...{ descendants: true }, isSignal: true }] }], tooltipTrigger: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqTooltipTrigger), { isSignal: true }] }], viewContainer: [{ type: i0.ViewChild, args: ['viewContainer', { isSignal: true }] }], overlayDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], regionItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => KbqFocusRegionItem), { isSignal: true }] }] } });
970
+ }, hostDirectives: [
971
+ CdkMonitorFocus,
972
+ { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
973
+ ], exportAs: 'kbqInlineEdit', template: "<div class=\"kbq-inline-edit__focus_container\">\n <div class=\"cdk-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ saveStatusMessage() }}</div>\n\n @if (label()) {\n <div class=\"kbq-inline-edit__label\">\n <ng-content select=\"kbq-label\" />\n </div>\n }\n\n <div #viewContainer class=\"kbq-inline-edit__view-container\">\n <div\n #viewContent\n class=\"kbq-inline-edit__view-content\"\n [attr.role]=\"viewContentRole()\"\n [attr.tabindex]=\"tabIndex()\"\n [attr.aria-label]=\"viewContentRole() ? accessibleName() : null\"\n [attr.aria-expanded]=\"viewContentRole() ? isEditMode() : null\"\n [attr.aria-disabled]=\"viewContentRole() && disabled() ? true : null\"\n >\n <ng-content select=\"[kbqInlineEditViewMode]\" />\n </div>\n\n @if (hasInteractiveContent() && mode() === 'view' && !disabled()) {\n <!-- `aria-expanded` is static: the anchor only exists in view mode, so it is never expanded. -->\n <div\n #focusAnchor\n class=\"kbq-inline-edit__focus-anchor cdk-visually-hidden\"\n aria-expanded=\"false\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"accessibleName()\"\n (focus)=\"anchorFocused.set(true)\"\n (blur)=\"anchorFocused.set(false)\"\n ></div>\n }\n\n @if (menu() && mode() === 'view') {\n <div class=\"kbq-inline-edit__menu-mask\">\n <div class=\"kbq-inline-edit__menu-mask-fade\"></div>\n <div class=\"kbq-inline-edit__menu-mask-container\">\n <ng-content select=\"[kbqInlineEditMenu]\" />\n </div>\n </div>\n }\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayOpen]=\"isEditMode()\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin()\"\n [cdkConnectedOverlayOffsetY]=\"overlayOffsetY()\"\n [cdkConnectedOverlayWidth]=\"overlayWidth()\"\n [cdkConnectedOverlayDisableClose]=\"true\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy()\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n (attach)=\"onAttach()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n >\n <div\n #panel\n class=\"kbq-inline-edit__panel\"\n cdkTrapFocusAutoCapture\n [class.kbq-inline-edit__panel_select]=\"isSingleSelect()\"\n [cdkTrapFocus]=\"false\"\n (keydown.escape)=\"onPanelEscape($event)\"\n (keydown.tab)=\"onPanelTab($event, panel, false)\"\n (keydown.shift.tab)=\"onPanelTab($event, panel, true)\"\n >\n <div\n class=\"kbq-inline-edit__control-container\"\n [kbqTooltipColor]=\"colors.Error\"\n [kbqTooltip]=\"validationTooltip() ?? ''\"\n [kbqTooltipDisabled]=\"!validationTooltip()\"\n [kbqTooltipArrow]=\"false\"\n [kbqTrigger]=\"'manual'\"\n [kbqPlacement]=\"tooltipPlacement() ?? placements.TopLeft\"\n [kbqTooltipScrollStrategy]=\"validationTooltipScrollStrategy\"\n >\n <ng-content select=\"[kbqInlineEditEditMode]\" />\n </div>\n\n @if (showActions()) {\n <div\n animate.enter=\"kbq-inline-edit__action-buttons_enter\"\n class=\"kbq-inline-edit__action-buttons\"\n role=\"group\"\n [class.kbq-animations-disabled]=\"animationsDisabled\"\n >\n <div class=\"kbq-inline-edit__action-button\">\n <button\n kbq-button\n [attr.aria-label]=\"a11yLocaleConfiguration().save\"\n [color]=\"'contrast'\"\n (click)=\"save($event)\"\n >\n <i kbq-icon=\"kbq-check_16\"></i>\n </button>\n </div>\n\n <div class=\"kbq-inline-edit__action-button\">\n <button\n kbq-button\n [attr.aria-label]=\"a11yLocaleConfiguration().cancel\"\n [color]=\"'contrast-fade'\"\n (click)=\"cancel()\"\n >\n <i kbq-icon=\"kbq-xmark_16\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </ng-template>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.kbq-inline-edit{display:flex;position:relative;flex-direction:column;justify-content:center;box-sizing:border-box;border:var(--kbq-size-border-width) solid transparent;border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-inline-edit{padding:var(--kbq-inline-edit-padding-vertical) var(--kbq-inline-edit-padding-horizontal);min-height:var(--kbq-inline-edit-height);background:var(--kbq-inline-edit-background)}.kbq-inline-edit .kbq-inline-edit__view-content:focus,.kbq-inline-edit .kbq-inline-edit__focus-anchor:focus{outline:none}.kbq-inline-edit.cdk-keyboard-focused:not(:has(:focus:not(.kbq-inline-edit__view-content,.kbq-inline-edit__focus-anchor))),.kbq-inline-edit.kbq-inline-edit_anchor-focused{box-shadow:inset 0 0 .1px 1px var(--kbq-states-line-focus-theme);border-color:var(--kbq-states-line-focus-theme)}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-transparent-hover);--kbq-mask-background: var(--kbq-states-background-contrast-less-hover);cursor:pointer}.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-transparent-active);--kbq-mask-background: var(--kbq-states-background-contrast-less-active)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:hover,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_disabled:has(.kbq-inline-edit__menu.kbq-active){--kbq-mask-background: var(--kbq-background-bg)}.kbq-inline-edit .kbq-label{color:var(--kbq-inline-edit-label-color)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error{--kbq-inline-edit-background: var(--kbq-inline-edit-error-background)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):hover{--kbq-inline-edit-background: var(--kbq-states-background-error-less-hover);--kbq-mask-background: var(--kbq-states-background-error-less-hover)}.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):active,.kbq-inline-edit.kbq-inline-edit_view.kbq-inline-edit_save-error:not(.kbq-inline-edit_disabled):has(.kbq-inline-edit__menu.kbq-active){--kbq-inline-edit-background: var(--kbq-states-background-error-less-active);--kbq-mask-background: var(--kbq-states-background-error-less-active)}.kbq-inline-edit{font-size:var(--kbq-typography-text-normal-font-size);font-style:var(--kbq-typography-text-normal-font-style);font-weight:var(--kbq-typography-text-normal-font-weight);line-height:var(--kbq-typography-text-normal-line-height);font-family:var(--kbq-typography-text-normal-font-family);text-transform:var(--kbq-typography-text-normal-text-transform);font-feature-settings:var(--kbq-typography-text-normal-font-feature-settings);letter-spacing:var(--kbq-typography-text-normal-letter-spacing)}.kbq-inline-edit:not(.kbq-inline-edit_with-label){--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-m) - var(--kbq-size-border-width))}.kbq-inline-edit.kbq-inline-edit_with-label{padding-top:var(--kbq-inline-edit-padding-vertical);padding-bottom:var(--kbq-inline-edit-padding-vertical)}.kbq-inline-edit.kbq-inline-edit_with-label.kbq-inline-edit_edit .kbq-inline-edit__view-container{position:relative}.kbq-inline-edit.kbq-inline-edit_with-label .kbq-inline-edit__label{margin-bottom:var(--kbq-size-3xs)}.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-container,.kbq-inline-edit.kbq-inline-edit_view .kbq-inline-edit__view-content{text-overflow:ellipsis}.kbq-inline-edit.kbq-inline-edit_select.kbq-inline-edit_edit{--kbq-inline-edit-background: var(--kbq-states-background-transparent-active)}.kbq-inline-edit:hover .kbq-inline-edit__menu-mask,.kbq-inline-edit.cdk-keyboard-focused .kbq-inline-edit__menu-mask,.kbq-inline-edit.kbq-inline-edit_anchor-focused .kbq-inline-edit__menu-mask{opacity:1}.kbq-inline-edit .kbq-inline-edit__placeholder{color:var(--kbq-foreground-contrast-secondary)}.kbq-inline-edit .kbq-inline-edit__menu-mask{display:flex;position:absolute;top:calc(var(--kbq-size-border-width) * -1);right:calc(var(--kbq-size-border-width) * -1);opacity:0;height:calc(100% + 2 * var(--kbq-size-border-width));justify-content:flex-end;border-top-right-radius:var(--kbq-size-border-radius);border-bottom-right-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit .kbq-inline-edit__menu-mask{corner-shape:squircle;border-top-right-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2);border-bottom-right-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-inline-edit .kbq-inline-edit__menu-mask:has(.kbq-inline-edit__menu.kbq-pressed,.kbq-inline-edit__menu.cdk-keyboard-focused){opacity:1}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-fade{width:32px;background:var(--kbq-mask-background, transparent);-webkit-mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black));mask-image:linear-gradient(90deg,transparent,var(--kbq-plt-black))}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu-mask-container{display:flex;justify-content:flex-end;min-width:40px;border-radius:inherit;corner-shape:inherit;background:var(--kbq-mask-background, transparent)}.kbq-inline-edit .kbq-inline-edit__menu-mask .kbq-inline-edit__menu{display:inline-flex;align-self:flex-start;padding:var(--kbq-size-s);z-index:2}.kbq-inline-edit__panel{width:100%}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons{position:absolute;left:calc(-1 * var(--kbq-inline-edit-padding-horizontal));display:inline-flex;flex-direction:row;gap:var(--kbq-size-xxs);padding:var(--kbq-size-xxs) var(--kbq-size-s) var(--kbq-size-s)}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter{animation:kbq-inline-edit-action-buttons-enter 50ms cubic-bezier(0,0,.2,1)}.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter.kbq-animations-disabled{animation:none;transition:none}@media(prefers-reduced-motion:reduce){.kbq-inline-edit__panel .kbq-inline-edit__action-buttons_enter{animation:none;transition:none}}.kbq-inline-edit__panel.kbq-inline-edit__panel_select .kbq-inline-edit__control-container{display:none}.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{box-shadow:var(--kbq-inline-edit-panel-shadow);background-color:var(--kbq-background-bg);border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-inline-edit__panel .kbq-inline-edit__control-container,.kbq-inline-edit__panel .kbq-inline-edit__action-button{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}@keyframes kbq-inline-edit-action-buttons-enter{0%{transform:translateY(100%);opacity:0}}\n", ":where(.kbq-inline-edit,.kbq-inline-edit__panel){--kbq-inline-edit-background: transparent;--kbq-inline-edit-height: calc(var(--kbq-size-3xl) - 2 * var(--kbq-size-border-width));--kbq-inline-edit-padding-horizontal: calc(var(--kbq-size-s) - var(--kbq-size-border-width));--kbq-inline-edit-padding-vertical: calc(var(--kbq-size-xs) - var(--kbq-size-border-width));--kbq-inline-edit-panel-shadow: var(--kbq-shadow-popup);--kbq-inline-edit-label-color: var(--kbq-foreground-contrast-secondary);--kbq-inline-edit-error-background: var(--kbq-background-error-less)}\n"] }]
974
+ }], ctorParameters: () => [], propDecorators: { showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], showTooltipOnError: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltipOnError", required: false }] }], validationTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "validationTooltip", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], editModeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "editModeWidth", required: false }] }], tooltipPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipPlacement", required: false }] }], overlayPanelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayPanelClass", required: false }] }], getValueHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "getValueHandler", required: false }] }], setValueHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "setValueHandler", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], compareWith: [{ type: i0.Input, args: [{ isSignal: true, alias: "compareWith", required: false }] }], saveHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "saveHandler", required: false }] }], saveErrorHandler: [{ type: i0.Input, args: [{ isSignal: true, alias: "saveErrorHandler", required: false }] }], canSaveOnEnter: [{ type: i0.Input, args: [{ isSignal: true, alias: "canSaveOnEnter", required: false }] }], interactiveSelectors: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactiveSelectors", required: false }] }], saved: [{ type: i0.Output, args: ["saved"] }], canceled: [{ type: i0.Output, args: ["canceled"] }], saveError: [{ type: i0.Output, args: ["saveError"] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }, { type: i0.Output, args: ["modeChange"] }], menu: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqInlineEditMenu), { isSignal: true }] }], label: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqLabel), { isSignal: true }] }], formFieldRefList: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => KbqFormField), { ...{ descendants: true }, isSignal: true }] }], selectRef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelect), { ...{ descendants: true }, isSignal: true }] }], tooltipTrigger: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqTooltipTrigger), { isSignal: true }] }], viewContainer: [{ type: i0.ViewChild, args: ['viewContainer', { isSignal: true }] }], viewContent: [{ type: i0.ViewChild, args: ['viewContent', { isSignal: true }] }], focusAnchor: [{ type: i0.ViewChild, args: ['focusAnchor', { isSignal: true }] }], overlayDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }] } });
758
975
 
759
976
  const COMPONENTS = [
760
977
  KbqInlineEdit,
@@ -762,15 +979,15 @@ const COMPONENTS = [
762
979
  KbqInlineEditMenu
763
980
  ];
764
981
  class KbqInlineEditModule {
765
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
766
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditModule, imports: [KbqInlineEdit,
982
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
983
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditModule, imports: [KbqInlineEdit,
767
984
  KbqInlineEditPlaceholder,
768
985
  KbqInlineEditMenu], exports: [KbqInlineEdit,
769
986
  KbqInlineEditPlaceholder,
770
987
  KbqInlineEditMenu] }); }
771
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditModule, imports: [KbqInlineEdit] }); }
988
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditModule, imports: [KbqInlineEdit] }); }
772
989
  }
773
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqInlineEditModule, decorators: [{
990
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqInlineEditModule, decorators: [{
774
991
  type: NgModule,
775
992
  args: [{
776
993
  imports: COMPONENTS,
@@ -782,5 +999,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
782
999
  * Generated bundle index. Do not edit.
783
1000
  */
784
1001
 
785
- export { KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER, KbqFocusRegionItem, KbqInlineEdit, KbqInlineEditMenu, KbqInlineEditModule, KbqInlineEditPlaceholder, kbqInlineEditSaveProgressDelay, kbqInlineEditSaveProgressMinimumDuration };
1002
+ export { KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER, KbqInlineEdit, KbqInlineEditMenu, KbqInlineEditModule, KbqInlineEditPlaceholder, kbqInlineEditSaveProgressDelay, kbqInlineEditSaveProgressMinimumDuration };
786
1003
  //# sourceMappingURL=koobiq-components-inline-edit.mjs.map