@koobiq/components 20.4.1 → 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.
- package/accordion/accordion-trigger.scss +3 -10
- package/accordion/accordion.scss +4 -6
- package/actions-panel/actions-panel-container.scss +45 -1
- package/alert/alert.component.scss +3 -2
- package/app-switcher/_app-switcher-theme.scss +0 -4
- package/app-switcher/app-switcher-dropdown-app.scss +3 -2
- package/app-switcher/app-switcher-dropdown-site.scss +2 -1
- package/app-switcher/{kbq-app-switcher-list-item.scss → app-switcher-list-item.scss} +18 -4
- package/app-switcher/app-switcher-tokens.scss +15 -0
- package/app-switcher/app-switcher.scss +14 -4
- package/autocomplete/autocomplete.scss +7 -6
- package/badge/badge.component.scss +5 -8
- package/breadcrumbs/breadcrumbs.scss +25 -10
- package/button/_button-base.scss +30 -7
- package/button/_button-theme.scss +16 -0
- package/button/button-group.scss +7 -0
- package/button/button-tokens.scss +0 -2
- package/button/button.scss +34 -2
- package/button-toggle/_button-toggle-theme.scss +7 -2
- package/button-toggle/button-toggle.scss +65 -15
- package/checkbox/_checkbox-theme.scss +4 -3
- package/checkbox/checkbox.scss +3 -6
- package/clamped-text/clamped-text.scss +6 -2
- package/code-block/code-block-tokens.scss +0 -224
- package/code-block/code-block.scss +20 -9
- package/content-panel/content-panel-aside.scss +3 -2
- package/content-panel/content-panel-container.scss +37 -0
- package/content-panel/content-panel.scss +4 -3
- package/core/highlight/_highlight-theme.scss +3 -1
- package/core/option/action-container.scss +2 -2
- package/core/option/action.scss +2 -1
- package/core/option/option.scss +2 -1
- package/core/pop-up/_pop-up.scss +0 -37
- package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +5 -10
- package/core/styles/_core.scss +3 -0
- package/core/styles/_koobiq-theme.scss +5 -6
- package/core/styles/common/_animation.scss +44 -16
- package/core/styles/common/_groups-mixins.scss +21 -19
- package/core/styles/common/_groups.scss +4 -32
- package/core/styles/common/_index.scss +0 -2
- package/core/styles/common/_link.scss +117 -0
- package/core/styles/common/_list.scss +0 -26
- package/core/styles/common/_overlay.scss +8 -10
- package/core/styles/common/_rtl.scss +0 -14
- package/core/styles/common/_select.scss +33 -15
- package/core/styles/common/_squircle.scss +63 -0
- package/core/styles/common/_tokens.scss +0 -11
- package/core/styles/common/_vendor-prefixes.scss +0 -20
- package/core/styles/functions/_timing.scss +0 -22
- package/core/styles/theming/_scrollbar-theme.scss +6 -1
- package/core/styles/theming/_theming.scss +13 -65
- package/core/styles/typography/_index.scss +0 -1
- package/core/styles/typography/_typography.scss +0 -143
- package/core/styles/visual/_body.scss +1 -6
- package/core/styles/visual/_layout.scss +0 -12
- package/datepicker/calendar-body.scss +3 -1
- package/datepicker/calendar-header.scss +0 -1
- package/datepicker/datepicker-content.scss +33 -1
- package/datepicker/datepicker-toggle.scss +0 -38
- package/dl/dl-tokens.scss +10 -0
- package/dl/dl.scss +113 -13
- package/dropdown/_dropdown-theme.scss +4 -16
- package/dropdown/dropdown-item.scss +4 -10
- package/dropdown/dropdown.scss +2 -1
- package/empty-state/_empty-state-theme.scss +10 -4
- package/empty-state/empty-state-tokens.scss +4 -4
- package/empty-state/empty-state.scss +4 -0
- package/fesm2022/koobiq-components-accordion.mjs +347 -229
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +302 -187
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-alert.mjs +39 -39
- package/fesm2022/koobiq-components-alert.mjs.map +1 -1
- package/fesm2022/koobiq-components-app-switcher.mjs +677 -367
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
- package/fesm2022/koobiq-components-autocomplete.mjs +620 -253
- package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
- package/fesm2022/koobiq-components-badge.mjs +46 -48
- package/fesm2022/koobiq-components-badge.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +221 -169
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +565 -196
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-button.mjs +332 -116
- package/fesm2022/koobiq-components-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +172 -132
- package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +165 -158
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +755 -601
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +260 -143
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +4342 -1595
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +1713 -1606
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-divider.mjs +73 -36
- package/fesm2022/koobiq-components-divider.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +447 -89
- package/fesm2022/koobiq-components-dl.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +703 -599
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-dynamic-translation.mjs +20 -20
- package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
- package/fesm2022/koobiq-components-ellipsis-center.mjs +46 -31
- package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-empty-state.mjs +116 -60
- package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +550 -290
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +2810 -2538
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-flag.mjs +79 -24
- package/fesm2022/koobiq-components-flag.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +389 -525
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +366 -136
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +429 -212
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
- package/fesm2022/koobiq-components-input.mjs +601 -459
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-link-deprecated.mjs +196 -0
- package/fesm2022/koobiq-components-link-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-link.mjs +328 -125
- package/fesm2022/koobiq-components-link.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +583 -433
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-loader-overlay.mjs +167 -68
- package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +55 -78
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +853 -475
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +895 -556
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +680 -310
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +46 -64
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +684 -285
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-bar.mjs +87 -33
- package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-spinner.mjs +52 -43
- package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
- package/fesm2022/koobiq-components-radio.mjs +450 -231
- package/fesm2022/koobiq-components-radio.mjs.map +1 -1
- package/fesm2022/koobiq-components-resizer.mjs +127 -21
- package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs +299 -0
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-scrollbar.mjs +745 -222
- package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-search-expandable.mjs +288 -126
- package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +883 -693
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +207 -88
- package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +689 -296
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-skeleton.mjs +815 -41
- package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
- package/fesm2022/koobiq-components-split-button.mjs +109 -88
- package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter-deprecated.mjs +591 -0
- package/fesm2022/koobiq-components-splitter-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-splitter.mjs +890 -501
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-table.mjs +63 -49
- package/fesm2022/koobiq-components-table.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +1062 -603
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +886 -733
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +213 -185
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-time-range.mjs +299 -147
- package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs +233 -245
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +344 -142
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +229 -145
- package/fesm2022/koobiq-components-title.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +486 -165
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +177 -130
- package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +657 -214
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-top-bar.mjs +61 -32
- package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +719 -488
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +1506 -558
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +290 -135
- package/fesm2022/koobiq-components-username.mjs.map +1 -1
- package/file-upload/dropzone.scss +31 -3
- package/file-upload/file-upload-tokens.scss +2 -22
- package/file-upload/file-upload.scss +6 -0
- package/file-upload/multiple-file-upload.component.scss +14 -12
- package/file-upload/single-file-upload.component.scss +3 -2
- package/filter-bar/filters.scss +7 -0
- package/filter-bar/pipes/base-pipe.scss +3 -3
- package/filter-bar/pipes/pipe-date.scss +8 -1
- package/flag/flag-tokens.scss +22 -0
- package/flag/flag.scss +34 -21
- package/form-field/{_fiedset-theme.scss → _fieldset-theme.scss} +1 -5
- package/form-field/_form-field-theme.scss +4 -9
- package/form-field/cleaner.scss +3 -1
- package/form-field/fieldset.scss +3 -4
- package/form-field/form-field.scss +26 -21
- package/form-field/password-toggle.scss +3 -1
- package/icon/_icon-button-theme.scss +7 -0
- package/icon/_icon-theme.scss +10 -7
- package/icon/icon-button.scss +0 -2
- package/icon/icon-tokens.scss +12 -9
- package/inline-edit/inline-edit.scss +40 -54
- package/input/input.scss +4 -0
- package/link/{_link-theme.scss → deprecated/_link-theme.scss} +11 -6
- package/link/deprecated/link-tokens.scss +27 -0
- package/link/link-tokens.scss +6 -25
- package/link/link.scss +137 -0
- package/list/list.scss +3 -2
- package/loader-overlay/_loader-overlay-theme.scss +19 -10
- package/loader-overlay/loader-overlay-tokens.scss +0 -2
- package/loader-overlay/loader-overlay.scss +7 -1
- package/markdown/_markdown-theme.scss +16 -0
- package/markdown/markdown-tokens.scss +5 -0
- package/markdown/markdown.scss +2 -1
- package/modal/_modal-animation.scss +23 -14
- package/modal/modal-tokens.scss +2 -1
- package/modal/modal.scss +35 -31
- package/navbar/_navbar-item_horizontal.scss +8 -6
- package/navbar/_navbar-item_vertical.scss +18 -6
- package/navbar/_navbar-theme.scss +9 -1
- package/navbar/navbar-brand.scss +8 -6
- package/navbar/navbar-divider.scss +1 -1
- package/navbar/navbar-item.scss +8 -9
- package/navbar/navbar-toggle.scss +3 -3
- package/navbar/navbar-tokens.scss +14 -0
- package/navbar/navbar.scss +1 -2
- package/navbar/vertical-navbar.scss +2 -2
- package/notification-center/_notification-center-theme.scss +11 -6
- package/notification-center/notification-center-tokens.scss +33 -0
- package/notification-center/notification-center.scss +58 -20
- package/notification-center/notification-item.scss +15 -6
- package/package.json +112 -81
- package/popover/popover-tokens.scss +0 -2
- package/popover/popover.scss +41 -19
- package/prebuilt-themes/theme.css +1 -1
- package/progress-bar/_progress-bar-theme.scss +20 -3
- package/progress-bar/progress-bar-tokens.scss +3 -0
- package/progress-bar/progress-bar.scss +36 -8
- package/progress-spinner/progress-spinner.scss +4 -3
- package/radio/_radio-theme.scss +21 -4
- package/radio/radio-tokens.scss +7 -3
- package/radio/radio.scss +55 -8
- package/schematics/collection.json +399 -7
- package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
- package/schematics/migrations/accordion-state-saving-default/data.js +75 -0
- package/schematics/migrations/accordion-state-saving-default/index.js +60 -0
- package/schematics/migrations/accordion-state-saving-default/schema.json +15 -0
- package/schematics/migrations/actions-panel-overlay-container/README.md +35 -0
- package/schematics/migrations/actions-panel-overlay-container/data.js +47 -0
- package/schematics/migrations/actions-panel-overlay-container/index.js +54 -0
- package/schematics/migrations/actions-panel-overlay-container/schema.json +15 -0
- package/schematics/migrations/alert-signals/README.md +13 -7
- package/schematics/migrations/alert-signals/data.js +3 -0
- package/schematics/migrations/alert-signals/index.js +70 -203
- package/schematics/migrations/angular-animations-removal/README.md +46 -0
- package/schematics/migrations/angular-animations-removal/data.js +150 -0
- package/schematics/migrations/angular-animations-removal/index.js +20 -0
- package/schematics/migrations/angular-animations-removal/schema.json +15 -0
- package/schematics/migrations/app-switcher-signals/README.md +88 -0
- package/schematics/migrations/app-switcher-signals/data.js +136 -0
- package/schematics/migrations/app-switcher-signals/index.js +365 -0
- package/schematics/migrations/app-switcher-signals/schema.json +20 -0
- package/schematics/migrations/autocomplete-panel-width-auto/README.md +2 -2
- package/schematics/migrations/autocomplete-panel-width-auto/index.js +1 -1
- package/schematics/migrations/autocomplete-signals/README.md +92 -0
- package/schematics/migrations/autocomplete-signals/data.js +149 -0
- package/schematics/migrations/autocomplete-signals/index.js +706 -0
- package/schematics/migrations/autocomplete-signals/schema.json +20 -0
- package/schematics/migrations/badge-signals/README.md +77 -0
- package/schematics/migrations/badge-signals/data.js +109 -0
- package/schematics/migrations/badge-signals/index.js +693 -0
- package/schematics/migrations/badge-signals/schema.json +20 -0
- package/schematics/migrations/button-state-and-styles/README.md +129 -0
- package/schematics/migrations/button-state-and-styles/data.js +136 -0
- package/schematics/migrations/button-state-and-styles/index.js +220 -0
- package/schematics/migrations/button-state-and-styles/schema.json +20 -0
- package/schematics/migrations/button-supported-colors/README.md +73 -0
- package/schematics/migrations/button-supported-colors/data.js +106 -0
- package/schematics/migrations/button-supported-colors/index.js +260 -0
- package/schematics/migrations/button-supported-colors/schema.json +20 -0
- package/schematics/migrations/button-toggle-signals-and-aria/README.md +137 -0
- package/schematics/migrations/button-toggle-signals-and-aria/data.js +200 -0
- package/schematics/migrations/button-toggle-signals-and-aria/index.js +496 -0
- package/schematics/migrations/button-toggle-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/button-truncation/README.md +110 -0
- package/schematics/migrations/button-truncation/data.js +88 -0
- package/schematics/migrations/button-truncation/index.js +269 -0
- package/schematics/migrations/button-truncation/schema.json +20 -0
- package/schematics/migrations/checkbox-signals/README.md +76 -0
- package/schematics/migrations/checkbox-signals/data.js +114 -0
- package/schematics/migrations/checkbox-signals/index.js +634 -0
- package/schematics/migrations/checkbox-signals/schema.json +20 -0
- package/schematics/migrations/clamped-text-disclosure/README.md +62 -0
- package/schematics/migrations/clamped-text-disclosure/data.js +101 -0
- package/schematics/migrations/clamped-text-disclosure/index.js +59 -0
- package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
- package/schematics/migrations/code-block-signals/README.md +84 -0
- package/schematics/migrations/code-block-signals/data.js +121 -0
- package/schematics/migrations/code-block-signals/index.js +700 -0
- package/schematics/migrations/code-block-signals/schema.json +20 -0
- package/schematics/migrations/color-signals/README.md +46 -0
- package/schematics/migrations/color-signals/data.js +131 -0
- package/schematics/migrations/color-signals/index.js +19 -0
- package/schematics/migrations/color-signals/schema.json +20 -0
- package/schematics/migrations/core-mixins-removal/README.md +20 -0
- package/schematics/migrations/core-mixins-removal/data.js +27 -0
- package/schematics/migrations/core-mixins-removal/index.js +17 -0
- package/schematics/migrations/core-mixins-removal/schema.json +15 -0
- package/schematics/migrations/css-selectors/README.md +2 -2
- package/schematics/migrations/css-selectors/index.js +1 -1
- package/schematics/migrations/datepicker-signals/README.md +24 -0
- package/schematics/migrations/datepicker-signals/data.js +49 -0
- package/schematics/migrations/datepicker-signals/index.js +17 -0
- package/schematics/migrations/datepicker-signals/schema.json +15 -0
- package/schematics/migrations/deprecated-icons/README.md +2 -2
- package/schematics/migrations/deprecated-icons/index.js +1 -1
- package/schematics/migrations/design-tokens-v4/README.md +75 -0
- package/schematics/migrations/design-tokens-v4/index.js +59 -0
- package/schematics/migrations/design-tokens-v4/schema.json +15 -0
- package/schematics/migrations/divider-signals-and-aria/README.md +47 -0
- package/schematics/migrations/divider-signals-and-aria/data.js +62 -0
- package/schematics/migrations/divider-signals-and-aria/index.js +211 -0
- package/schematics/migrations/divider-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/dl-attribute-coercion/README.md +59 -0
- package/schematics/migrations/dl-attribute-coercion/data.js +85 -0
- package/schematics/migrations/dl-attribute-coercion/index.js +161 -0
- package/schematics/migrations/dl-attribute-coercion/schema.json +15 -0
- package/schematics/migrations/dl-standalone-names/README.md +49 -0
- package/schematics/migrations/dl-standalone-names/data.js +44 -0
- package/schematics/migrations/dl-standalone-names/index.js +321 -0
- package/schematics/migrations/dl-standalone-names/schema.json +20 -0
- package/schematics/migrations/dropdown-demote-overlay/README.md +137 -0
- package/schematics/migrations/dropdown-demote-overlay/data.js +84 -0
- package/schematics/migrations/dropdown-demote-overlay/index.js +288 -0
- package/schematics/migrations/dropdown-demote-overlay/schema.json +20 -0
- package/schematics/migrations/dropdown-signals/README.md +83 -0
- package/schematics/migrations/dropdown-signals/data.js +152 -0
- package/schematics/migrations/dropdown-signals/index.js +19 -0
- package/schematics/migrations/dropdown-signals/schema.json +20 -0
- package/schematics/migrations/empty-state-error-color/README.md +84 -0
- package/schematics/migrations/empty-state-error-color/data.js +85 -0
- package/schematics/migrations/empty-state-error-color/index.js +71 -0
- package/schematics/migrations/empty-state-error-color/schema.json +15 -0
- package/schematics/migrations/empty-state-size-attr/README.md +2 -2
- package/schematics/migrations/empty-state-size-attr/index.js +1 -1
- package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
- package/schematics/migrations/file-upload-cva-and-primitives/data.js +97 -0
- package/schematics/migrations/file-upload-cva-and-primitives/index.js +60 -0
- package/schematics/migrations/file-upload-cva-and-primitives/schema.json +15 -0
- package/schematics/migrations/file-upload-deprecated-outputs/README.md +90 -0
- package/schematics/migrations/file-upload-deprecated-outputs/data.js +20 -0
- package/schematics/migrations/file-upload-deprecated-outputs/index.js +70 -0
- package/schematics/migrations/file-upload-deprecated-outputs/schema.json +20 -0
- package/schematics/migrations/filter-bar-rename-action/README.md +183 -0
- package/schematics/migrations/filter-bar-rename-action/data.js +151 -0
- package/schematics/migrations/filter-bar-rename-action/index.js +177 -0
- package/schematics/migrations/filter-bar-rename-action/schema.json +20 -0
- package/schematics/migrations/filter-bar-signals/README.md +27 -16
- package/schematics/migrations/filter-bar-signals/data.js +1 -2
- package/schematics/migrations/filter-bar-signals/index.js +100 -195
- package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
- package/schematics/migrations/filter-bar-state-saving-default/data.js +87 -0
- package/schematics/migrations/filter-bar-state-saving-default/index.js +61 -0
- package/schematics/migrations/filter-bar-state-saving-default/schema.json +15 -0
- package/schematics/migrations/flag-inner-html/README.md +67 -0
- package/schematics/migrations/flag-inner-html/data.js +58 -0
- package/schematics/migrations/flag-inner-html/index.js +61 -0
- package/schematics/migrations/flag-inner-html/schema.json +15 -0
- package/schematics/migrations/form-field-signals/README.md +125 -0
- package/schematics/migrations/form-field-signals/data.js +288 -0
- package/schematics/migrations/form-field-signals/index.js +382 -0
- package/schematics/migrations/form-field-signals/schema.json +20 -0
- package/schematics/migrations/icon-semantics-and-api/README.md +65 -0
- package/schematics/migrations/icon-semantics-and-api/data.js +97 -0
- package/schematics/migrations/icon-semantics-and-api/index.js +64 -0
- package/schematics/migrations/icon-semantics-and-api/schema.json +15 -0
- package/schematics/migrations/icons-replacement/README.md +5 -5
- package/schematics/migrations/icons-replacement/index.js +1 -1
- package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
- package/schematics/migrations/inline-edit-a11y-and-types/data.js +117 -0
- package/schematics/migrations/inline-edit-a11y-and-types/index.js +97 -0
- package/schematics/migrations/inline-edit-a11y-and-types/schema.json +20 -0
- package/schematics/migrations/input-number-surface/README.md +140 -0
- package/schematics/migrations/input-number-surface/data.js +135 -0
- package/schematics/migrations/input-number-surface/index.js +292 -0
- package/schematics/migrations/input-number-surface/schema.json +20 -0
- package/schematics/migrations/input-signals/README.md +20 -0
- package/schematics/migrations/input-signals/data.js +30 -0
- package/schematics/migrations/input-signals/index.js +17 -0
- package/schematics/migrations/input-signals/schema.json +15 -0
- package/schematics/migrations/link-deprecated-path/README.md +144 -0
- package/schematics/migrations/link-deprecated-path/index.js +19 -0
- package/schematics/migrations/link-deprecated-path/schema.json +20 -0
- package/schematics/migrations/link-signals/README.md +71 -0
- package/schematics/migrations/link-signals/data.js +116 -0
- package/schematics/migrations/link-signals/index.js +415 -0
- package/schematics/migrations/link-signals/schema.json +20 -0
- package/schematics/migrations/list-signals/README.md +22 -0
- package/schematics/migrations/list-signals/data.js +35 -0
- package/schematics/migrations/list-signals/index.js +17 -0
- package/schematics/migrations/list-signals/schema.json +15 -0
- package/schematics/migrations/list-tree-multiple-input/README.md +105 -0
- package/schematics/migrations/list-tree-multiple-input/data.js +74 -0
- package/schematics/migrations/list-tree-multiple-input/index.js +221 -0
- package/schematics/migrations/list-tree-multiple-input/schema.json +20 -0
- package/schematics/migrations/loader-overlay-signals/README.md +62 -0
- package/schematics/migrations/loader-overlay-signals/data.js +101 -0
- package/schematics/migrations/loader-overlay-signals/index.js +697 -0
- package/schematics/migrations/loader-overlay-signals/schema.json +20 -0
- package/schematics/migrations/loader-overlay-size-attr/README.md +2 -2
- package/schematics/migrations/loader-overlay-size-attr/index.js +1 -1
- package/schematics/migrations/locale-configuration-providers/README.md +163 -0
- package/schematics/migrations/locale-configuration-providers/data.js +257 -0
- package/schematics/migrations/locale-configuration-providers/index.js +294 -0
- package/schematics/migrations/locale-configuration-providers/schema.json +20 -0
- package/schematics/migrations/mandatory-peer-dependencies/README.md +70 -0
- package/schematics/migrations/mandatory-peer-dependencies/index.js +42 -0
- package/schematics/migrations/mandatory-peer-dependencies/schema.json +15 -0
- package/schematics/migrations/markdown-signals/README.md +58 -0
- package/schematics/migrations/markdown-signals/data.js +79 -0
- package/schematics/migrations/markdown-signals/index.js +639 -0
- package/schematics/migrations/markdown-signals/schema.json +20 -0
- package/schematics/migrations/modal-dialog-semantics/README.md +106 -0
- package/schematics/migrations/modal-dialog-semantics/data.js +110 -0
- package/schematics/migrations/modal-dialog-semantics/index.js +58 -0
- package/schematics/migrations/modal-dialog-semantics/schema.json +15 -0
- package/schematics/migrations/modal-signals/README.md +88 -0
- package/schematics/migrations/modal-signals/data.js +132 -0
- package/schematics/migrations/modal-signals/index.js +19 -0
- package/schematics/migrations/modal-signals/schema.json +20 -0
- package/schematics/migrations/navbar-signals-and-aria/README.md +111 -0
- package/schematics/migrations/navbar-signals-and-aria/data.js +198 -0
- package/schematics/migrations/navbar-signals-and-aria/index.js +568 -0
- package/schematics/migrations/navbar-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/new-icons-pack/README.md +10 -10
- package/schematics/migrations/new-icons-pack/index.js +1 -1
- package/schematics/migrations/notification-center-signals/README.md +67 -0
- package/schematics/migrations/notification-center-signals/data.js +66 -0
- package/schematics/migrations/notification-center-signals/index.js +61 -0
- package/schematics/migrations/notification-center-signals/schema.json +15 -0
- package/schematics/migrations/option-signals/README.md +37 -0
- package/schematics/migrations/option-signals/data.js +86 -0
- package/schematics/migrations/option-signals/index.js +19 -0
- package/schematics/migrations/option-signals/schema.json +20 -0
- package/schematics/migrations/popover-leave-delay/README.md +51 -0
- package/schematics/migrations/popover-leave-delay/data.js +61 -0
- package/schematics/migrations/popover-leave-delay/index.js +54 -0
- package/schematics/migrations/popover-leave-delay/schema.json +15 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/README.md +54 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/data.js +76 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/index.js +58 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/schema.json +15 -0
- package/schematics/migrations/progress-spinner-signals/README.md +72 -0
- package/schematics/migrations/progress-spinner-signals/data.js +83 -0
- package/schematics/migrations/progress-spinner-signals/index.js +694 -0
- package/schematics/migrations/progress-spinner-signals/schema.json +20 -0
- package/schematics/migrations/query-list-signals/README.md +32 -0
- package/schematics/migrations/query-list-signals/data.js +70 -0
- package/schematics/migrations/query-list-signals/index.js +17 -0
- package/schematics/migrations/query-list-signals/schema.json +15 -0
- package/schematics/migrations/radio-signals-and-aria/README.md +82 -0
- package/schematics/migrations/radio-signals-and-aria/data.js +163 -0
- package/schematics/migrations/radio-signals-and-aria/index.js +39 -0
- package/schematics/migrations/radio-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/read-state-dwell-handlers/README.md +125 -0
- package/schematics/migrations/read-state-dwell-handlers/data.js +45 -0
- package/schematics/migrations/read-state-dwell-handlers/index.js +215 -0
- package/schematics/migrations/read-state-dwell-handlers/schema.json +20 -0
- package/schematics/migrations/scrollbar-deprecated-path/README.md +128 -0
- package/schematics/migrations/scrollbar-deprecated-path/index.js +20 -0
- package/schematics/migrations/scrollbar-deprecated-path/schema.json +20 -0
- package/schematics/migrations/select-signal-inputs/README.md +61 -0
- package/schematics/migrations/select-signal-inputs/data.js +99 -0
- package/schematics/migrations/select-signal-inputs/index.js +57 -0
- package/schematics/migrations/select-signal-inputs/schema.json +15 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/README.md +57 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/data.js +111 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/index.js +57 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/schema.json +15 -0
- package/schematics/migrations/signal-inputs-subclasses/README.md +28 -0
- package/schematics/migrations/signal-inputs-subclasses/data.js +69 -0
- package/schematics/migrations/signal-inputs-subclasses/index.js +17 -0
- package/schematics/migrations/signal-inputs-subclasses/schema.json +15 -0
- package/schematics/migrations/split-button-optional-disabled/README.md +47 -0
- package/schematics/migrations/split-button-optional-disabled/data.js +53 -0
- package/schematics/migrations/split-button-optional-disabled/index.js +57 -0
- package/schematics/migrations/split-button-optional-disabled/schema.json +15 -0
- package/schematics/migrations/splitter-deprecated-path/README.md +136 -0
- package/schematics/migrations/splitter-deprecated-path/index.js +20 -0
- package/schematics/migrations/splitter-deprecated-path/schema.json +20 -0
- package/schematics/migrations/state-saving-default/README.md +67 -0
- package/schematics/migrations/state-saving-default/data.js +88 -0
- package/schematics/migrations/state-saving-default/index.js +62 -0
- package/schematics/migrations/state-saving-default/schema.json +15 -0
- package/schematics/migrations/table-cell-content/README.md +55 -0
- package/schematics/migrations/table-cell-content/data.js +66 -0
- package/schematics/migrations/table-cell-content/index.js +66 -0
- package/schematics/migrations/table-cell-content/schema.json +15 -0
- package/schematics/migrations/tabs-signals-and-aria/README.md +93 -0
- package/schematics/migrations/tabs-signals-and-aria/data.js +139 -0
- package/schematics/migrations/tabs-signals-and-aria/index.js +65 -0
- package/schematics/migrations/tabs-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/tag-list-cleaner/README.md +58 -0
- package/schematics/migrations/tag-list-cleaner/data.js +42 -0
- package/schematics/migrations/tag-list-cleaner/index.js +196 -0
- package/schematics/migrations/tag-list-cleaner/schema.json +20 -0
- package/schematics/migrations/tag-slots/README.md +41 -0
- package/schematics/migrations/tag-slots/index.js +190 -0
- package/schematics/migrations/tag-slots/schema.json +20 -0
- package/schematics/migrations/tags-signals/README.md +85 -0
- package/schematics/migrations/tags-signals/data.js +103 -0
- package/schematics/migrations/tags-signals/index.js +673 -0
- package/schematics/migrations/tags-signals/schema.json +20 -0
- package/schematics/migrations/textarea-signals/README.md +72 -0
- package/schematics/migrations/textarea-signals/data.js +121 -0
- package/schematics/migrations/textarea-signals/index.js +379 -0
- package/schematics/migrations/textarea-signals/schema.json +20 -0
- package/schematics/migrations/time-range-title-for/README.md +164 -0
- package/schematics/migrations/time-range-title-for/data.js +139 -0
- package/schematics/migrations/time-range-title-for/index.js +163 -0
- package/schematics/migrations/time-range-title-for/schema.json +20 -0
- package/schematics/migrations/timepicker-signals/README.md +78 -0
- package/schematics/migrations/timepicker-signals/data.js +82 -0
- package/schematics/migrations/timepicker-signals/index.js +709 -0
- package/schematics/migrations/timepicker-signals/schema.json +20 -0
- package/schematics/migrations/timezone-grouping-utils/README.md +73 -0
- package/schematics/migrations/timezone-grouping-utils/data.js +101 -0
- package/schematics/migrations/timezone-grouping-utils/index.js +64 -0
- package/schematics/migrations/timezone-grouping-utils/schema.json +15 -0
- package/schematics/migrations/title-encapsulation/README.md +49 -0
- package/schematics/migrations/title-encapsulation/data.js +69 -0
- package/schematics/migrations/title-encapsulation/index.js +57 -0
- package/schematics/migrations/title-encapsulation/schema.json +15 -0
- package/schematics/migrations/toast-stack-and-defaults/README.md +102 -0
- package/schematics/migrations/toast-stack-and-defaults/data.js +79 -0
- package/schematics/migrations/toast-stack-and-defaults/index.js +53 -0
- package/schematics/migrations/toast-stack-and-defaults/schema.json +15 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/README.md +53 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/data.js +89 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/index.js +60 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/schema.json +15 -0
- package/schematics/migrations/top-bar-container-selectors/README.md +111 -0
- package/schematics/migrations/top-bar-container-selectors/data.js +56 -0
- package/schematics/migrations/top-bar-container-selectors/index.js +84 -0
- package/schematics/migrations/top-bar-container-selectors/schema.json +20 -0
- package/schematics/migrations/tree-select-signals/README.md +61 -0
- package/schematics/migrations/tree-select-signals/data.js +106 -0
- package/schematics/migrations/tree-select-signals/index.js +58 -0
- package/schematics/migrations/tree-select-signals/schema.json +15 -0
- package/schematics/migrations/tree-signals/README.md +82 -0
- package/schematics/migrations/tree-signals/data.js +123 -0
- package/schematics/migrations/tree-signals/index.js +54 -0
- package/schematics/migrations/tree-signals/schema.json +15 -0
- package/schematics/migrations/tree-state-saving-default/README.md +66 -0
- package/schematics/migrations/tree-state-saving-default/data.js +78 -0
- package/schematics/migrations/tree-state-saving-default/index.js +60 -0
- package/schematics/migrations/tree-state-saving-default/schema.json +15 -0
- package/schematics/migrations/username-pipe-injection/README.md +59 -0
- package/schematics/migrations/username-pipe-injection/data.js +78 -0
- package/schematics/migrations/username-pipe-injection/index.js +58 -0
- package/schematics/migrations/username-pipe-injection/schema.json +15 -0
- package/schematics/migrations/v20-upgrade/README.md +36 -16
- package/schematics/migrations/v20-upgrade/data.js +124 -77
- package/schematics/migrations/v20-upgrade/index.js +6 -213
- package/schematics/migrations/v21-upgrade/README.md +271 -0
- package/schematics/migrations/v21-upgrade/data.js +1371 -0
- package/schematics/migrations/v21-upgrade/index.js +94 -0
- package/schematics/migrations/v21-upgrade/schema.json +20 -0
- package/schematics/migrations/zoneless-change-detection/README.md +30 -0
- package/schematics/migrations/zoneless-change-detection/data.js +29 -0
- package/schematics/migrations/zoneless-change-detection/index.js +20 -0
- package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
- package/schematics/migrations.json +392 -2
- package/schematics/ng-add/index.js +515 -14
- package/schematics/ng-add/schema.json +15 -0
- package/schematics/utils/deprecated-path-migration.js +61 -0
- package/schematics/utils/package-config.js +9 -105
- package/scrollbar/{_scrollbar-component-theme.scss → deprecated/_scrollbar-component-theme.scss} +1 -1
- package/scrollbar/{scrollbar.component.scss → deprecated/scrollbar.component.scss} +1 -1
- package/scrollbar/native-scrollbar.scss +68 -0
- package/scrollbar/scrollbar-tokens.scss +13 -22
- package/scrollbar/scrollbar-track.scss +94 -0
- package/scrollbar/scrollbar-viewport.scss +33 -0
- package/scrollbar/scrollbar.scss +24 -0
- package/search-expandable/search-expandable-tokens.scss +4 -0
- package/search-expandable/search-expandable.scss +4 -2
- package/select/_select-theme.scss +3 -16
- package/select/select.scss +0 -6
- package/sidebar/sidebar.scss +20 -0
- package/sidepanel/_sidepanel-theme.scss +1 -1
- package/sidepanel/sidepanel-tokens.scss +7 -1
- package/sidepanel/sidepanel.scss +41 -5
- package/skeleton/skeleton-presets.scss +350 -0
- package/skeleton/skeleton-tokens.scss +127 -0
- package/skeleton/skeleton.scss +53 -45
- package/split-button/_split-button-theme.scss +4 -4
- package/split-button/split-button.scss +2 -6
- package/splitter/{_splitter-theme.scss → deprecated/_splitter-theme.scss} +1 -1
- package/splitter/deprecated/splitter.scss +51 -0
- package/splitter/splitter-tokens.scss +19 -0
- package/splitter/splitter.scss +148 -28
- package/table/_table-theme.scss +13 -12
- package/table/table-tokens.scss +8 -0
- package/table/table.scss +47 -22
- package/tabs/_tabs-common.scss +14 -14
- package/tabs/_tabs-theme.scss +4 -5
- package/tabs/tab-body.scss +49 -1
- package/tabs/tab-header.scss +2 -1
- package/tags/tag-list.scss +4 -0
- package/tags/tag.scss +19 -1
- package/time-range/time-range.scss +9 -0
- package/timezone/timezone-option.component.scss +4 -7
- package/timezone/timezone-select.component.scss +3 -0
- package/toast/_toast-theme.scss +1 -4
- package/toast/toast-container.component.scss +19 -13
- package/toast/toast-tokens.scss +12 -6
- package/toast/toast.component.scss +42 -19
- package/toggle/_toggle-theme.scss +4 -10
- package/toggle/toggle.scss +67 -26
- package/tooltip/_tooltip-theme.scss +7 -1
- package/tooltip/tooltip-tokens.scss +1 -2
- package/tooltip/tooltip.scss +55 -9
- package/top-bar/top-bar-tokens.scss +13 -2
- package/top-bar/top-bar.scss +24 -19
- package/tree/_tree-theme.scss +0 -1
- package/tree/toggle.scss +5 -9
- package/tree/tree-option.scss +2 -4
- package/tree/tree-tokens.scss +2 -1
- package/tree/tree.scss +3 -5
- package/tree-select/_tree-select-theme.scss +4 -15
- package/tree-select/tree-select-tokens.scss +16 -0
- package/tree-select/tree-select.scss +0 -6
- package/{accordion/index.d.ts → types/koobiq-components-accordion.d.ts} +102 -84
- package/{actions-panel/index.d.ts → types/koobiq-components-actions-panel.d.ts} +44 -59
- package/{alert/index.d.ts → types/koobiq-components-alert.d.ts} +8 -3
- package/types/koobiq-components-app-switcher.d.ts +406 -0
- package/types/koobiq-components-autocomplete.d.ts +443 -0
- package/{badge/index.d.ts → types/koobiq-components-badge.d.ts} +25 -20
- package/{breadcrumbs/index.d.ts → types/koobiq-components-breadcrumbs.d.ts} +97 -46
- package/types/koobiq-components-button-toggle.d.ts +340 -0
- package/types/koobiq-components-button.d.ts +296 -0
- package/types/koobiq-components-checkbox.d.ts +172 -0
- package/types/koobiq-components-clamped-text.d.ts +184 -0
- package/{code-block/index.d.ts → types/koobiq-components-code-block.d.ts} +114 -79
- package/{content-panel/index.d.ts → types/koobiq-components-content-panel.d.ts} +81 -25
- package/{core/index.d.ts → types/koobiq-components-core.d.ts} +2827 -865
- package/{datepicker/index.d.ts → types/koobiq-components-datepicker.d.ts} +161 -116
- package/types/koobiq-components-divider.d.ts +43 -0
- package/types/koobiq-components-dl.d.ts +235 -0
- package/{dropdown/index.d.ts → types/koobiq-components-dropdown.d.ts} +245 -239
- package/types/koobiq-components-ellipsis-center.d.ts +85 -0
- package/types/koobiq-components-empty-state.d.ts +106 -0
- package/{file-upload/index.d.ts → types/koobiq-components-file-upload.d.ts} +214 -107
- package/{filter-bar/index.d.ts → types/koobiq-components-filter-bar.d.ts} +410 -495
- package/types/koobiq-components-flag.d.ts +68 -0
- package/{form-field/index.d.ts → types/koobiq-components-form-field.d.ts} +167 -191
- package/types/koobiq-components-icon.d.ts +333 -0
- package/{inline-edit/index.d.ts → types/koobiq-components-inline-edit.d.ts} +109 -46
- package/types/koobiq-components-input.d.ts +477 -0
- package/types/koobiq-components-link-deprecated.d.ts +101 -0
- package/types/koobiq-components-link.d.ts +176 -0
- package/{list/index.d.ts → types/koobiq-components-list.d.ts} +162 -99
- package/types/koobiq-components-loader-overlay.d.ts +101 -0
- package/{markdown/index.d.ts → types/koobiq-components-markdown.d.ts} +16 -24
- package/types/koobiq-components-modal.d.ts +666 -0
- package/types/koobiq-components-navbar.d.ts +569 -0
- package/types/koobiq-components-notification-center.d.ts +500 -0
- package/{overflow-items/index.d.ts → types/koobiq-components-overflow-items.d.ts} +8 -22
- package/types/koobiq-components-popover.d.ts +468 -0
- package/types/koobiq-components-progress-bar.d.ts +67 -0
- package/{progress-spinner/index.d.ts → types/koobiq-components-progress-spinner.d.ts} +33 -10
- package/types/koobiq-components-radio.d.ts +294 -0
- package/{resizer/index.d.ts → types/koobiq-components-resizer.d.ts} +37 -2
- package/{scrollbar/index.d.ts → types/koobiq-components-scrollbar-deprecated.d.ts} +18 -1
- package/types/koobiq-components-scrollbar.d.ts +154 -0
- package/types/koobiq-components-search-expandable.d.ts +164 -0
- package/{select/index.d.ts → types/koobiq-components-select.d.ts} +360 -167
- package/types/koobiq-components-sidebar.d.ts +152 -0
- package/types/koobiq-components-sidepanel.d.ts +436 -0
- package/types/koobiq-components-skeleton.d.ts +234 -0
- package/types/koobiq-components-split-button.d.ts +65 -0
- package/{splitter/index.d.ts → types/koobiq-components-splitter-deprecated.d.ts} +44 -1
- package/types/koobiq-components-splitter.d.ts +406 -0
- package/types/koobiq-components-table.d.ts +44 -0
- package/types/koobiq-components-tabs.d.ts +888 -0
- package/{tags/index.d.ts → types/koobiq-components-tags.d.ts} +249 -133
- package/types/koobiq-components-textarea.d.ts +178 -0
- package/{time-range/index.d.ts → types/koobiq-components-time-range.d.ts} +135 -62
- package/types/koobiq-components-timepicker.d.ts +223 -0
- package/types/koobiq-components-timezone.d.ts +266 -0
- package/types/koobiq-components-title.d.ts +184 -0
- package/types/koobiq-components-toast.d.ts +289 -0
- package/types/koobiq-components-toggle.d.ts +121 -0
- package/types/koobiq-components-tooltip.d.ts +610 -0
- package/types/koobiq-components-top-bar.d.ts +61 -0
- package/types/koobiq-components-tree-select.d.ts +667 -0
- package/types/koobiq-components-tree.d.ts +1290 -0
- package/types/koobiq-components-username.d.ts +340 -0
- package/username/_username-theme.scss +35 -0
- package/username/username.scss +10 -34
- package/app-switcher/index.d.ts +0 -276
- package/autocomplete/index.d.ts +0 -286
- package/button/index.d.ts +0 -153
- package/button-toggle/index.d.ts +0 -162
- package/checkbox/index.d.ts +0 -163
- package/clamped-text/index.d.ts +0 -146
- package/core/styles/_tokens.scss +0 -7
- package/core/styles/common/_clearfix.scss +0 -13
- package/core/styles/common/_popup.scss +0 -6
- package/core/styles/functions/_index.scss +0 -3
- package/core/styles/functions/_number.scss +0 -60
- package/core/styles/functions/_string.scss +0 -18
- package/core/styles/theming/scrollbar-tokens.scss +0 -25
- package/core/styles/typography/_typography-utils.scss +0 -84
- package/divider/index.d.ts +0 -20
- package/dl/index.d.ts +0 -45
- package/ellipsis-center/index.d.ts +0 -71
- package/empty-state/index.d.ts +0 -45
- package/flag/index.d.ts +0 -44
- package/icon/index.d.ts +0 -200
- package/input/index.d.ts +0 -354
- package/link/index.d.ts +0 -56
- package/loader-overlay/index.d.ts +0 -57
- package/modal/index.d.ts +0 -339
- package/navbar/index.d.ts +0 -372
- package/notification-center/index.d.ts +0 -323
- package/popover/index.d.ts +0 -182
- package/prebuilt-themes/dark-theme.css +0 -1
- package/prebuilt-themes/light-theme.css +0 -1
- package/progress-bar/index.d.ts +0 -31
- package/radio/index.d.ts +0 -203
- package/search-expandable/index.d.ts +0 -101
- package/sidebar/index.d.ts +0 -94
- package/sidepanel/index.d.ts +0 -272
- package/skeleton/index.d.ts +0 -26
- package/split-button/index.d.ts +0 -46
- package/table/index.d.ts +0 -25
- package/tabs/index.d.ts +0 -677
- package/textarea/index.d.ts +0 -138
- package/timepicker/index.d.ts +0 -197
- package/timezone/index.d.ts +0 -125
- package/title/index.d.ts +0 -139
- package/toast/index.d.ts +0 -187
- package/toggle/index.d.ts +0 -104
- package/tooltip/index.d.ts +0 -335
- package/top-bar/index.d.ts +0 -33
- package/tree/index.d.ts +0 -802
- package/tree-select/index.d.ts +0 -475
- package/username/index.d.ts +0 -194
- /package/{dynamic-translation/index.d.ts → types/koobiq-components-dynamic-translation.d.ts} +0 -0
- /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,
|
|
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
|
|
11
|
+
import * as i3 from '@koobiq/components/button';
|
|
13
12
|
import { KbqButtonModule } from '@koobiq/components/button';
|
|
14
|
-
import
|
|
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 {
|
|
21
|
-
import { take,
|
|
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: "
|
|
73
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
96
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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
|
-
/**
|
|
121
|
-
this.a11yLocaleConfiguration =
|
|
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 ?
|
|
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
|
-
*
|
|
126
|
+
* Has no effect unless `validationTooltip` is set. Defaults to `true`.
|
|
148
127
|
*/
|
|
149
|
-
this.showTooltipOnError = input(true, ...(ngDevMode ?
|
|
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
|
-
*
|
|
133
|
+
* Defaults to `false`.
|
|
155
134
|
*/
|
|
156
|
-
this.disabled = input(false, ...(ngDevMode ?
|
|
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 ?
|
|
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
|
-
*
|
|
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
|
-
/**
|
|
205
|
-
|
|
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 ?
|
|
202
|
+
this.formFieldRefList = contentChildren(KbqFormField, { ...(ngDevMode ? { debugName: "formFieldRefList" } : /* istanbul ignore next */ {}), descendants: true });
|
|
214
203
|
/** @docs-private */
|
|
215
|
-
this.selectRef = contentChild(KbqSelect, ...(ngDevMode ?
|
|
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.
|
|
233
|
-
/**
|
|
234
|
-
this.
|
|
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.
|
|
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.
|
|
243
|
-
|
|
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
|
-
|
|
283
|
-
this.
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
-
|
|
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
|
|
293
|
-
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
if (tooltipTrigger?.isOpen) {
|
|
358
|
-
tooltipTrigger.hide();
|
|
359
|
-
}
|
|
360
|
-
}
|
|
404
|
+
validationTooltipWatcher.destroy();
|
|
405
|
+
this.validationTooltipScrollHandle?.cancel();
|
|
361
406
|
});
|
|
362
|
-
|
|
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
|
-
}
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
625
|
+
this.onPanelEscape(event);
|
|
568
626
|
break;
|
|
569
627
|
}
|
|
570
628
|
case 'Enter': {
|
|
571
629
|
if (canSaveOnEnter(event)) {
|
|
572
630
|
event.preventDefault();
|
|
573
|
-
this.
|
|
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
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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
|
-
|
|
601
|
-
|
|
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
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
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
|
-
*
|
|
611
|
-
*
|
|
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
|
-
|
|
615
|
-
const
|
|
616
|
-
|
|
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
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
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
|
-
|
|
624
|
-
|
|
625
|
-
lastItem?.tabOut.subscribe((event) => !hasModifierKey(event, 'shiftKey') && this.saveAndFocusNextInlineEdit(event));
|
|
806
|
+
finally {
|
|
807
|
+
this.chainingToNextInlineEdit = false;
|
|
626
808
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
this.save(event);
|
|
630
|
-
if (this.isInvalid())
|
|
809
|
+
if (this.isInvalid()) {
|
|
810
|
+
this.focusRejectedEditor();
|
|
631
811
|
return;
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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) =>
|
|
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
|
|
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
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
}
|
|
696
|
-
|
|
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) =>
|
|
939
|
+
this.formFieldRefList().forEach((formField) => this.getFormControl(formField)?.markAsTouched());
|
|
728
940
|
}
|
|
729
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
766
|
-
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
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,
|
|
1002
|
+
export { KBQ_INLINE_EDIT_SAVE_ERROR_HANDLER, KbqInlineEdit, KbqInlineEditMenu, KbqInlineEditModule, KbqInlineEditPlaceholder, kbqInlineEditSaveProgressDelay, kbqInlineEditSaveProgressMinimumDuration };
|
|
786
1003
|
//# sourceMappingURL=koobiq-components-inline-edit.mjs.map
|