@koobiq/components 20.4.2 → 21.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +791 -609
- 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 +2871 -2595
- 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 +400 -149
- 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 +463 -143
- 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 +734 -488
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +1700 -617
- 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 +415 -18
- package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
- package/schematics/migrations/accordion-state-saving-default/data.cjs +75 -0
- package/schematics/migrations/accordion-state-saving-default/index.cjs +61 -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.cjs +47 -0
- package/schematics/migrations/actions-panel-overlay-container/index.cjs +55 -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 → data.cjs} +3 -0
- package/schematics/migrations/alert-signals/index.cjs +221 -0
- package/schematics/migrations/angular-animations-removal/README.md +46 -0
- package/schematics/migrations/angular-animations-removal/data.cjs +150 -0
- package/schematics/migrations/angular-animations-removal/index.cjs +21 -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.cjs +136 -0
- package/schematics/migrations/app-switcher-signals/index.cjs +366 -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 → index.cjs} +6 -5
- package/schematics/migrations/autocomplete-signals/README.md +92 -0
- package/schematics/migrations/autocomplete-signals/data.cjs +149 -0
- package/schematics/migrations/autocomplete-signals/index.cjs +707 -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.cjs +109 -0
- package/schematics/migrations/badge-signals/index.cjs +694 -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.cjs +136 -0
- package/schematics/migrations/button-state-and-styles/index.cjs +221 -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.cjs +106 -0
- package/schematics/migrations/button-supported-colors/index.cjs +261 -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.cjs +200 -0
- package/schematics/migrations/button-toggle-signals-and-aria/index.cjs +497 -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.cjs +88 -0
- package/schematics/migrations/button-truncation/index.cjs +270 -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.cjs +114 -0
- package/schematics/migrations/checkbox-signals/index.cjs +635 -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.cjs +101 -0
- package/schematics/migrations/clamped-text-disclosure/index.cjs +60 -0
- package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
- package/schematics/migrations/code-block-highlight-js-core/README.md +53 -0
- package/schematics/migrations/code-block-highlight-js-core/data.cjs +64 -0
- package/schematics/migrations/code-block-highlight-js-core/index.cjs +319 -0
- package/schematics/migrations/code-block-highlight-js-core/schema.json +20 -0
- package/schematics/migrations/code-block-signals/README.md +84 -0
- package/schematics/migrations/code-block-signals/data.cjs +121 -0
- package/schematics/migrations/code-block-signals/index.cjs +701 -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.cjs +131 -0
- package/schematics/migrations/color-signals/index.cjs +20 -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.cjs +27 -0
- package/schematics/migrations/core-mixins-removal/index.cjs +18 -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 → index.cjs} +4 -3
- package/schematics/migrations/datepicker-signals/README.md +24 -0
- package/schematics/migrations/datepicker-signals/data.cjs +49 -0
- package/schematics/migrations/datepicker-signals/index.cjs +18 -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 → index.cjs} +8 -7
- package/schematics/migrations/design-tokens-v4/README.md +75 -0
- package/schematics/migrations/design-tokens-v4/index.cjs +60 -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.cjs +62 -0
- package/schematics/migrations/divider-signals-and-aria/index.cjs +212 -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.cjs +85 -0
- package/schematics/migrations/dl-attribute-coercion/index.cjs +162 -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.cjs +44 -0
- package/schematics/migrations/dl-standalone-names/index.cjs +322 -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.cjs +84 -0
- package/schematics/migrations/dropdown-demote-overlay/index.cjs +289 -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.cjs +152 -0
- package/schematics/migrations/dropdown-signals/index.cjs +20 -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.cjs +85 -0
- package/schematics/migrations/empty-state-error-color/index.cjs +72 -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 → index.cjs} +6 -5
- package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
- package/schematics/migrations/file-upload-cva-and-primitives/data.cjs +97 -0
- package/schematics/migrations/file-upload-cva-and-primitives/index.cjs +61 -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.cjs +20 -0
- package/schematics/migrations/file-upload-deprecated-outputs/index.cjs +71 -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.cjs +151 -0
- package/schematics/migrations/filter-bar-rename-action/index.cjs +178 -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 → data.cjs} +1 -2
- package/schematics/migrations/filter-bar-signals/index.cjs +225 -0
- package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
- package/schematics/migrations/filter-bar-state-saving-default/data.cjs +87 -0
- package/schematics/migrations/filter-bar-state-saving-default/index.cjs +62 -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.cjs +58 -0
- package/schematics/migrations/flag-inner-html/index.cjs +62 -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.cjs +288 -0
- package/schematics/migrations/form-field-signals/index.cjs +383 -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.cjs +97 -0
- package/schematics/migrations/icon-semantics-and-api/index.cjs +65 -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 → index.cjs} +4 -3
- package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
- package/schematics/migrations/inline-edit-a11y-and-types/data.cjs +117 -0
- package/schematics/migrations/inline-edit-a11y-and-types/index.cjs +98 -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.cjs +135 -0
- package/schematics/migrations/input-number-surface/index.cjs +293 -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.cjs +30 -0
- package/schematics/migrations/input-signals/index.cjs +18 -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.cjs +20 -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.cjs +116 -0
- package/schematics/migrations/link-signals/index.cjs +416 -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.cjs +35 -0
- package/schematics/migrations/list-signals/index.cjs +18 -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.cjs +74 -0
- package/schematics/migrations/list-tree-multiple-input/index.cjs +222 -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.cjs +101 -0
- package/schematics/migrations/loader-overlay-signals/index.cjs +698 -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 → index.cjs} +6 -5
- package/schematics/migrations/locale-configuration-providers/README.md +163 -0
- package/schematics/migrations/locale-configuration-providers/data.cjs +257 -0
- package/schematics/migrations/locale-configuration-providers/index.cjs +295 -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.cjs +43 -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.cjs +79 -0
- package/schematics/migrations/markdown-signals/index.cjs +640 -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.cjs +110 -0
- package/schematics/migrations/modal-dialog-semantics/index.cjs +59 -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.cjs +132 -0
- package/schematics/migrations/modal-signals/index.cjs +20 -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.cjs +198 -0
- package/schematics/migrations/navbar-signals-and-aria/index.cjs +569 -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 → index.cjs} +8 -7
- package/schematics/migrations/notification-center-signals/README.md +67 -0
- package/schematics/migrations/notification-center-signals/data.cjs +66 -0
- package/schematics/migrations/notification-center-signals/index.cjs +62 -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.cjs +86 -0
- package/schematics/migrations/option-signals/index.cjs +20 -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.cjs +61 -0
- package/schematics/migrations/popover-leave-delay/index.cjs +55 -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.cjs +76 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/index.cjs +59 -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.cjs +83 -0
- package/schematics/migrations/progress-spinner-signals/index.cjs +695 -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.cjs +70 -0
- package/schematics/migrations/query-list-signals/index.cjs +18 -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.cjs +163 -0
- package/schematics/migrations/radio-signals-and-aria/index.cjs +40 -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.cjs +45 -0
- package/schematics/migrations/read-state-dwell-handlers/index.cjs +216 -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.cjs +21 -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.cjs +99 -0
- package/schematics/migrations/select-signal-inputs/index.cjs +58 -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.cjs +111 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/index.cjs +58 -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.cjs +69 -0
- package/schematics/migrations/signal-inputs-subclasses/index.cjs +18 -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.cjs +53 -0
- package/schematics/migrations/split-button-optional-disabled/index.cjs +58 -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.cjs +21 -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.cjs +88 -0
- package/schematics/migrations/state-saving-default/index.cjs +63 -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.cjs +66 -0
- package/schematics/migrations/table-cell-content/index.cjs +67 -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.cjs +139 -0
- package/schematics/migrations/tabs-signals-and-aria/index.cjs +66 -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.cjs +42 -0
- package/schematics/migrations/tag-list-cleaner/index.cjs +197 -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.cjs +191 -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.cjs +103 -0
- package/schematics/migrations/tags-signals/index.cjs +674 -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.cjs +121 -0
- package/schematics/migrations/textarea-signals/index.cjs +380 -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.cjs +139 -0
- package/schematics/migrations/time-range-title-for/index.cjs +164 -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.cjs +82 -0
- package/schematics/migrations/timepicker-signals/index.cjs +710 -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.cjs +101 -0
- package/schematics/migrations/timezone-grouping-utils/index.cjs +65 -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.cjs +69 -0
- package/schematics/migrations/title-encapsulation/index.cjs +58 -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.cjs +79 -0
- package/schematics/migrations/toast-stack-and-defaults/index.cjs +54 -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.cjs +89 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/index.cjs +61 -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.cjs +56 -0
- package/schematics/migrations/top-bar-container-selectors/index.cjs +85 -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.cjs +106 -0
- package/schematics/migrations/tree-select-signals/index.cjs +59 -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.cjs +123 -0
- package/schematics/migrations/tree-signals/index.cjs +55 -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.cjs +78 -0
- package/schematics/migrations/tree-state-saving-default/index.cjs +61 -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.cjs +78 -0
- package/schematics/migrations/username-pipe-injection/index.cjs +59 -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 → data.cjs} +124 -77
- package/schematics/migrations/v20-upgrade/index.cjs +19 -0
- package/schematics/migrations/v21-upgrade/README.md +271 -0
- package/schematics/migrations/v21-upgrade/data.cjs +1371 -0
- package/schematics/migrations/v21-upgrade/index.cjs +95 -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.cjs +29 -0
- package/schematics/migrations/zoneless-change-detection/index.cjs +21 -0
- package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
- package/schematics/migrations.json +401 -6
- package/schematics/ng-add/index.cjs +266 -0
- package/schematics/ng-add/schema.json +15 -0
- package/schematics/utils/{angular-parsing.js → angular-parsing.cjs} +2 -2
- package/schematics/utils/deprecated-path-migration.cjs +62 -0
- package/schematics/utils/html-config.cjs +148 -0
- package/schematics/utils/{icon-migration.js → icon-migration.cjs} +2 -2
- package/schematics/utils/list-item-pattern.cjs +16 -0
- package/schematics/utils/{package-config.js → package-config.cjs} +3 -32
- package/schematics/utils/project-files.cjs +25 -0
- package/schematics/utils/replacement-driver.cjs +337 -0
- package/schematics/utils/safe-rule.cjs +23 -0
- package/schematics/utils/signal-members-migration.cjs +779 -0
- package/schematics/utils/tag-patterns.cjs +21 -0
- package/schematics/utils/template-ref-access.cjs +155 -0
- package/schematics/utils/{typescript.js → typescript.cjs} +1 -1
- package/schematics/utils/warn-only-migration.cjs +52 -0
- package/schematics/utils/workspace-styles.cjs +123 -0
- 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} +150 -88
- 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 +670 -0
- package/types/koobiq-components-tree.d.ts +1339 -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/schematics/migrations/alert-signals/index.js +0 -353
- package/schematics/migrations/filter-bar-signals/index.js +0 -319
- package/schematics/migrations/v20-upgrade/index.js +0 -225
- package/schematics/ng-add/index.js +0 -39
- 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 -178
- 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/schematics/migrations/css-selectors/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/deprecated-icons/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/icons-replacement/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/new-icons-pack/{data.js → data.cjs} +0 -0
- /package/schematics/utils/{ast.js → ast.cjs} +0 -0
- /package/schematics/utils/{messages.js → messages.cjs} +0 -0
- /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,23 +1,24 @@
|
|
|
1
|
-
import { CdkMonitorFocus
|
|
2
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
3
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
1
|
+
import { CdkMonitorFocus } from '@angular/cdk/a11y';
|
|
4
2
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
5
|
-
import {
|
|
3
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';
|
|
6
4
|
import { Platform, _getEventTarget } from '@angular/cdk/platform';
|
|
7
5
|
import { NgTemplateOutlet } from '@angular/common';
|
|
8
6
|
import * as i0 from '@angular/core';
|
|
9
|
-
import { InjectionToken, inject, ElementRef, ChangeDetectorRef,
|
|
10
|
-
import { outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
|
+
import { InjectionToken, inject, ElementRef, ChangeDetectorRef, Injector, Renderer2, signal, viewChild, viewChildren, contentChild, TemplateRef, input, EventEmitter, output, computed, booleanAttribute, linkedSignal, numberAttribute, DestroyRef, effect, afterNextRender, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
8
|
+
import { outputFromObservable, outputToObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
9
|
import { NgForm, FormGroupDirective, NgControl } from '@angular/forms';
|
|
12
|
-
import
|
|
10
|
+
import * as i1 from '@koobiq/components/core';
|
|
11
|
+
import { KbqAbstractSelect, isInput, shouldSelectSearchText, runClearPredicate, ErrorStateMatcher, KBQ_SELECT_SCROLL_STRATEGY, KBQ_OVERLAY_LAYERS, KbqErrorStateTracker, defaultOffsetY, KBQ_CONNECTED_OVERLAY_BELOW_CLASS, KBQ_CONNECTED_OVERLAY_ABOVE_CLASS, kbqQueryListFrom, KbqSelectTrigger, KbqSelectMatcher, KbqSelectSearch, KbqLocaleOverridesDirective, KBQ_SELECT_LOCALE_CONFIGURATION, kbqSelectAllHandlerTransform, KBQ_PANEL_DEFAULT_MIN_WIDTH, kbqResolvePanelMaxHeightToken, KbqComponentColors, getKbqSelectDynamicMultipleError, KbqSelectAllEvent, MultipleMode, DOWN_ARROW, UP_ARROW, LEFT_ARROW, RIGHT_ARROW, ENTER, SPACE, ESCAPE, TAB, HOME, END, PAGE_UP, PAGE_DOWN, isSelectAll, hasModifierKey, isUndefined, getKbqSelectNonArrayValueError, KBQ_PARENT_POPUP, kbqSiblingPopupProvider, KbqSelectFooter, KbqSelectSearchEmptyResult } from '@koobiq/components/core';
|
|
13
12
|
import { KBQ_FORM_FIELD, KbqCleaner, KbqFormFieldControl, kbqCleanerFactoryProvider, KbqFormFieldModule } from '@koobiq/components/form-field';
|
|
14
|
-
import * as
|
|
13
|
+
import * as i2 from '@koobiq/components/icon';
|
|
15
14
|
import { KbqIconModule } from '@koobiq/components/icon';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
15
|
+
import { KbqScrollbarViewport } from '@koobiq/components/scrollbar';
|
|
16
|
+
import { KbqSelectNoOptions } from '@koobiq/components/select';
|
|
17
|
+
import { KbqTag, KbqTagRemove, KbqTagsModule } from '@koobiq/components/tags';
|
|
18
|
+
import { KbqTreeSelection, KbqTreeModule } from '@koobiq/components/tree';
|
|
18
19
|
import { SizeXxs } from '@koobiq/design-tokens';
|
|
19
|
-
import { Subject, defer, merge, Subscription, fromEvent, audit } from 'rxjs';
|
|
20
|
-
import { filter, map, startWith, switchMap,
|
|
20
|
+
import { Subject, defer, merge, Subscription, fromEvent, audit, timer } from 'rxjs';
|
|
21
|
+
import { filter, map, startWith, switchMap, delay, debounceTime, distinctUntilChanged, take } from 'rxjs/operators';
|
|
21
22
|
|
|
22
23
|
let nextUniqueId = 0;
|
|
23
24
|
/** Injection token that can be used to provide the default options for the `kbq-tree-select`. */
|
|
@@ -31,7 +32,19 @@ const kbqTreeSelectOptionsProvider = (options) => {
|
|
|
31
32
|
};
|
|
32
33
|
/** Change event object that is emitted when the select value has changed. */
|
|
33
34
|
class KbqTreeSelectChange {
|
|
34
|
-
constructor(
|
|
35
|
+
constructor(
|
|
36
|
+
/** Select the change comes from. */
|
|
37
|
+
source,
|
|
38
|
+
/**
|
|
39
|
+
* Option the change is about — a `KbqTreeOption` whenever the changed node is rendered, and the
|
|
40
|
+
* raw value of the node when it is not. `null` when the change is not about a single option,
|
|
41
|
+
* which today means the cleaner was activated; `values` then carries the nodes it removed.
|
|
42
|
+
*/
|
|
43
|
+
value,
|
|
44
|
+
/** Whether the change was made by the user rather than written to the model. */
|
|
45
|
+
isUserInput = false,
|
|
46
|
+
/** Every option the change is about, when it covers more than one. */
|
|
47
|
+
values) {
|
|
35
48
|
this.source = source;
|
|
36
49
|
this.value = value;
|
|
37
50
|
this.isUserInput = isUserInput;
|
|
@@ -39,114 +52,33 @@ class KbqTreeSelectChange {
|
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
54
|
class KbqTreeSelect extends KbqAbstractSelect {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return this._placeholder;
|
|
46
|
-
}
|
|
47
|
-
set placeholder(value) {
|
|
48
|
-
this._placeholder = value;
|
|
49
|
-
this.stateChanges.next();
|
|
50
|
-
}
|
|
51
|
-
// TODO: Skipped for migration because:
|
|
52
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
53
|
-
get required() {
|
|
54
|
-
return this._required;
|
|
55
|
-
}
|
|
56
|
-
set required(value) {
|
|
57
|
-
this._required = coerceBooleanProperty(value);
|
|
58
|
-
this.stateChanges.next();
|
|
59
|
-
}
|
|
60
|
-
// TODO: Skipped for migration because:
|
|
61
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
62
|
-
get multiple() {
|
|
63
|
-
return this._multiple;
|
|
64
|
-
}
|
|
65
|
-
set multiple(value) {
|
|
66
|
-
if (this.selectionModel) {
|
|
67
|
-
throw getKbqSelectDynamicMultipleError();
|
|
68
|
-
}
|
|
69
|
-
this._multiple = coerceBooleanProperty(value);
|
|
70
|
-
}
|
|
71
|
-
// TODO: Skipped for migration because:
|
|
72
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
73
|
-
get autoSelect() {
|
|
74
|
-
if (this.multiSelection) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
return this._autoSelect;
|
|
78
|
-
}
|
|
79
|
-
set autoSelect(value) {
|
|
80
|
-
this._autoSelect = coerceBooleanProperty(value);
|
|
81
|
-
}
|
|
82
|
-
get value() {
|
|
83
|
-
return this.tree().getSelectedValues();
|
|
55
|
+
/** Reference to the CDK connected overlay directive. */
|
|
56
|
+
get overlayDir() {
|
|
57
|
+
return this.overlayDirQuery();
|
|
84
58
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
get id() {
|
|
88
|
-
return this._id;
|
|
59
|
+
get tags() {
|
|
60
|
+
return this.tagsList();
|
|
89
61
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
}
|
|
94
|
-
// TODO: Skipped for migration because:
|
|
95
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
96
|
-
get hasBackdrop() {
|
|
97
|
-
return this._hasBackdrop;
|
|
62
|
+
/** Whether multiple nodes can be selected. Cannot be changed once the selection model exists. */
|
|
63
|
+
get multiple() {
|
|
64
|
+
return this.multipleValue ?? this.multipleInput();
|
|
98
65
|
}
|
|
99
|
-
|
|
100
|
-
|
|
66
|
+
/** Whether moving the active node selects it. Always off in multiple selection. */
|
|
67
|
+
get autoSelect() {
|
|
68
|
+
return !this.multiSelection && this.autoSelectInput();
|
|
101
69
|
}
|
|
102
|
-
|
|
103
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
70
|
+
/** Tab index of the select, `-1` while it is disabled. A value that is not an integer keeps the last valid one. */
|
|
104
71
|
get tabIndex() {
|
|
105
|
-
return this.
|
|
106
|
-
}
|
|
107
|
-
set tabIndex(value) {
|
|
108
|
-
if (Number.isInteger(value) || value === null) {
|
|
109
|
-
this._tabIndex = value;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// TODO: Skipped for migration because:
|
|
113
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
114
|
-
get disabled() {
|
|
115
|
-
return this._disabled;
|
|
116
|
-
}
|
|
117
|
-
set disabled(value) {
|
|
118
|
-
if (value !== this.disabled) {
|
|
119
|
-
this._disabled = value;
|
|
120
|
-
if (this.parentFormField) {
|
|
121
|
-
Promise.resolve().then(() => {
|
|
122
|
-
if (this._disabled) {
|
|
123
|
-
this.parentFormField.stopFocusMonitor();
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
this.parentFormField.runFocusMonitor();
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
// Let the parent form field know to run change detection when the disabled state changes.
|
|
131
|
-
this.stateChanges.next();
|
|
132
|
-
}
|
|
72
|
+
return this.resolvedTabIndex();
|
|
133
73
|
}
|
|
134
74
|
/**
|
|
135
75
|
* Function for handling the combination Ctrl + A (select all). By default, the internal handler is used.
|
|
136
76
|
*/
|
|
137
|
-
// TODO: Skipped for migration because:
|
|
138
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
139
77
|
get selectAllHandler() {
|
|
140
|
-
return this.
|
|
141
|
-
}
|
|
142
|
-
set selectAllHandler(fn) {
|
|
143
|
-
if (typeof fn !== 'function') {
|
|
144
|
-
throw Error('`selectAllHandler` must be a function.');
|
|
145
|
-
}
|
|
146
|
-
this._selectAllHandler = fn;
|
|
78
|
+
return this.selectAllHandlerInput() ?? this.defaultSelectAllHandler;
|
|
147
79
|
}
|
|
148
80
|
/** Function for handling the combination Ctrl + A (select all). By default, the internal handler is used. */
|
|
149
|
-
|
|
81
|
+
defaultSelectAllHandler(event, select) {
|
|
150
82
|
const searchInput = isInput(event) ? event.target : null;
|
|
151
83
|
if (shouldSelectSearchText(searchInput)) {
|
|
152
84
|
searchInput.select();
|
|
@@ -159,97 +91,105 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
159
91
|
// `onSelectAll` is emitted by the tree subscription set up in `ngAfterContentInit`.
|
|
160
92
|
select.tree().selectAllOptions(select.selectAll() || select.selectAllToggle());
|
|
161
93
|
}
|
|
162
|
-
/** Whether the select is focused. */
|
|
163
|
-
get focused() {
|
|
164
|
-
return this._focused || this._panelOpen;
|
|
165
|
-
}
|
|
166
|
-
set focused(value) {
|
|
167
|
-
this._focused = value;
|
|
168
|
-
}
|
|
169
94
|
/** Whether multiple choice is enabled or not. True if multiple or multiline */
|
|
170
95
|
get multiSelection() {
|
|
171
96
|
return this.multiple || this.multiline();
|
|
172
97
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Controls when the search functionality is displayed based on the number of available options.
|
|
175
|
-
*
|
|
176
|
-
* Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
|
|
177
|
-
* @default undefined
|
|
178
|
-
*/
|
|
179
|
-
// TODO: Skipped for migration because:
|
|
180
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
181
|
-
set searchMinOptionsThreshold(value) {
|
|
182
|
-
this._searchMinOptionsThreshold =
|
|
183
|
-
this.resolveSearchMinOptionsThreshold(value) ??
|
|
184
|
-
this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold);
|
|
185
|
-
}
|
|
186
|
-
get searchMinOptionsThreshold() {
|
|
187
|
-
return this._searchMinOptionsThreshold;
|
|
188
|
-
}
|
|
189
98
|
get panelOpen() {
|
|
190
|
-
return this.
|
|
99
|
+
return this.panelOpenValue();
|
|
191
100
|
}
|
|
192
101
|
/** Whether the overlay panel is currently on screen. Part of the `KbqSiblingPopup` contract. */
|
|
193
102
|
get isAttached() {
|
|
194
|
-
return this.
|
|
103
|
+
return this.panelOpenValue();
|
|
195
104
|
}
|
|
196
105
|
/**
|
|
197
106
|
* Whether the cleaner (clear button) should be shown.
|
|
107
|
+
*
|
|
198
108
|
* @docs-private
|
|
199
109
|
*/
|
|
200
110
|
get canShowCleaner() {
|
|
201
111
|
return !!this.cleaner()?.canShow;
|
|
202
112
|
}
|
|
203
|
-
/**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Whether the cleaner still has a node to remove.
|
|
115
|
+
*
|
|
116
|
+
* @docs-private
|
|
117
|
+
*/
|
|
118
|
+
get canClear() {
|
|
119
|
+
return !!this.selectionModel?.selected.some((node) => runClearPredicate(this.clearPredicate(), node));
|
|
120
|
+
}
|
|
121
|
+
/** Selected nodes the cleaner removes, in selection order. */
|
|
122
|
+
get clearTargets() {
|
|
123
|
+
return this.selectionModel?.selected.filter((node) => runClearPredicate(this.clearPredicate(), node)) ?? [];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The tree answers for any node; the option is asked only for its own `[disabled]` input, and a
|
|
127
|
+
* node inside a collapsed branch has no option to ask.
|
|
128
|
+
*/
|
|
129
|
+
isNodeDisabled(node, optionsByNode) {
|
|
130
|
+
const tree = this.tree();
|
|
131
|
+
if (!tree)
|
|
132
|
+
return false;
|
|
133
|
+
if (tree.disabled || tree.treeControl.isDisabled(node))
|
|
134
|
+
return true;
|
|
135
|
+
const option = optionsByNode
|
|
136
|
+
? optionsByNode.get(node)
|
|
137
|
+
: tree.renderedOptions.find((option) => option.data === node);
|
|
138
|
+
return option?.disabled ?? false;
|
|
139
|
+
}
|
|
140
|
+
/** The rendered option of each node, for asking `isNodeDisabled` about every selected node at once. */
|
|
141
|
+
renderedOptionsByNode() {
|
|
142
|
+
const optionsByNode = new Map();
|
|
143
|
+
this.tree()?.renderedOptions.forEach((option) => {
|
|
144
|
+
if (!optionsByNode.has(option.data))
|
|
145
|
+
optionsByNode.set(option.data, option);
|
|
146
|
+
});
|
|
147
|
+
return optionsByNode;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Accessible name of the combobox.
|
|
151
|
+
*
|
|
152
|
+
* A combobox takes its name from the author only, so the placeholder rendered inside the trigger does
|
|
153
|
+
* not name it. Falling back to the placeholder text keeps a control that was given neither an
|
|
154
|
+
* `aria-label` nor an `aria-labelledby` from being announced blank — the shape every consumer in the
|
|
155
|
+
* repository is in. Left off while `aria-labelledby` is set, which outranks `aria-label` anyway.
|
|
156
|
+
*/
|
|
157
|
+
get ariaLabelText() {
|
|
158
|
+
return this.resolvedAriaLabel();
|
|
209
159
|
}
|
|
210
160
|
constructor() {
|
|
211
161
|
super();
|
|
212
162
|
this.elementRef = inject(ElementRef);
|
|
213
163
|
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
214
|
-
this.
|
|
164
|
+
this.injector = inject(Injector);
|
|
215
165
|
this.renderer = inject(Renderer2);
|
|
216
166
|
this.defaultErrorStateMatcher = inject(ErrorStateMatcher);
|
|
217
167
|
this.scrollStrategyFactory = inject(KBQ_SELECT_SCROLL_STRATEGY);
|
|
218
|
-
this.
|
|
168
|
+
this.overlayLayers = inject(KBQ_OVERLAY_LAYERS);
|
|
219
169
|
this.parentForm = inject(NgForm, { optional: true });
|
|
220
170
|
this.parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
221
171
|
this.parentFormField = inject(KBQ_FORM_FIELD, { host: true, optional: true });
|
|
222
172
|
this.ngControl = inject(NgControl, { optional: true, self: true });
|
|
223
|
-
this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
|
|
224
173
|
this.isBrowser = inject(Platform).isBrowser;
|
|
225
174
|
this.defaultOptions = inject(KBQ_TREE_SELECT_OPTIONS, { optional: true });
|
|
175
|
+
this.errorStateTracker = new KbqErrorStateTracker(this.defaultErrorStateMatcher, this.ngControl, this.parentFormGroup, this.parentForm);
|
|
226
176
|
/** Whether the component is in an error state. */
|
|
227
|
-
this.errorState =
|
|
228
|
-
/**
|
|
229
|
-
* Emits whenever the component state changes and should cause the parent
|
|
230
|
-
* form-field to update. Implemented as part of `KbqFormFieldControl`.
|
|
231
|
-
* @docs-private
|
|
232
|
-
*/
|
|
233
|
-
this.stateChanges = new Subject();
|
|
177
|
+
this.errorState = this.errorStateTracker.errorState;
|
|
234
178
|
/** A name for this control that can be used by `kbq-form-field`. */
|
|
235
179
|
this.controlType = 'select';
|
|
236
|
-
|
|
180
|
+
/**
|
|
181
|
+
* A `kbq-tree-select` is not a native labelable element, so the form-field's `<label for>` cannot
|
|
182
|
+
* associate with it. The control is named through `aria-labelledby` instead.
|
|
183
|
+
*/
|
|
184
|
+
this.isNativeLabelSupported = false;
|
|
185
|
+
/** Number of the selected items that do not fit into the trigger. */
|
|
186
|
+
this.hiddenItems = signal(0, ...(ngDevMode ? [{ debugName: "hiddenItems" }] : /* istanbul ignore next */ []));
|
|
237
187
|
/** The cached font-size of the trigger element. */
|
|
238
188
|
this.triggerFontSize = 0;
|
|
239
|
-
/**
|
|
240
|
-
this.transformOrigin = 'top';
|
|
241
|
-
/** Emits when the panel element is finished transforming in. */
|
|
189
|
+
/** Emits once the panel has rendered (`'showing'`) or has been removed (`'void'`). */
|
|
242
190
|
this.panelDoneAnimatingStream = new Subject();
|
|
243
191
|
/** Strategy that will be used to handle scrolling while the select panel is open. */
|
|
244
192
|
this.scrollStrategy = this.scrollStrategyFactory();
|
|
245
|
-
/**
|
|
246
|
-
* The y-offset of the overlay panel in relation to the trigger.
|
|
247
|
-
*
|
|
248
|
-
* @deprecated noop. The trigger↔panel gap is now controlled by the `--kbq-connected-overlay-gap` CSS
|
|
249
|
-
* variable (transparent padding inside the pane via the `kbq-connected-overlay_below/_above` panel
|
|
250
|
-
* classes), not by a physical overlay offset — so setting this has no effect. Will be removed in 21.0.0.
|
|
251
|
-
*/
|
|
252
|
-
this.offsetY = 0;
|
|
253
193
|
/**
|
|
254
194
|
* Minimum space to keep between the overlay and the viewport edge.
|
|
255
195
|
* At least `defaultOffsetY` so CDK's fit check — which runs before the `kbq-connected-overlay_below/_above`
|
|
@@ -284,23 +224,39 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
284
224
|
*/
|
|
285
225
|
this.trigger = viewChild.required('trigger');
|
|
286
226
|
/** Reference to the overlay panel element. */
|
|
287
|
-
this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : []));
|
|
227
|
+
this.panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
|
|
288
228
|
/** Scrollable option list inside the panel. */
|
|
289
|
-
this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : []));
|
|
229
|
+
this.optionsContainer = viewChild('optionsContainer', ...(ngDevMode ? [{ debugName: "optionsContainer" }] : /* istanbul ignore next */ []));
|
|
230
|
+
/** The options container's custom scrollbar viewport, flashed when the panel opens. */
|
|
231
|
+
this.scrollbarViewport = viewChild(KbqScrollbarViewport, ...(ngDevMode ? [{ debugName: "scrollbarViewport" }] : /* istanbul ignore next */ []));
|
|
232
|
+
this.overlayDirQuery = viewChild(CdkConnectedOverlay, ...(ngDevMode ? [{ debugName: "overlayDirQuery" }] : /* istanbul ignore next */ []));
|
|
233
|
+
this.tagsQuery = viewChildren(KbqTag, ...(ngDevMode ? [{ debugName: "tagsQuery" }] : /* istanbul ignore next */ []));
|
|
234
|
+
this.tagsList = kbqQueryListFrom(this.tagsQuery);
|
|
290
235
|
/**
|
|
291
236
|
* Reference to the optional cleaner element for clearing selection.
|
|
237
|
+
*
|
|
292
238
|
* @docs-private
|
|
293
239
|
*/
|
|
294
|
-
this.cleaner = contentChild(KbqCleaner, ...(ngDevMode ?
|
|
240
|
+
this.cleaner = contentChild(KbqCleaner, { ...(ngDevMode ? { debugName: "cleaner" } : /* istanbul ignore next */ {}), descendants: false });
|
|
295
241
|
/** User-supplied override of the trigger element. */
|
|
296
|
-
this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : []));
|
|
297
|
-
this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : []));
|
|
298
|
-
this.customTagTemplateRef = contentChild('kbqSelectTagContent', ...(ngDevMode ?
|
|
299
|
-
this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : []));
|
|
300
|
-
this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : []));
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
242
|
+
this.customTrigger = contentChild(KbqSelectTrigger, ...(ngDevMode ? [{ debugName: "customTrigger" }] : /* istanbul ignore next */ []));
|
|
243
|
+
this.customMatcher = contentChild(KbqSelectMatcher, ...(ngDevMode ? [{ debugName: "customMatcher" }] : /* istanbul ignore next */ []));
|
|
244
|
+
this.customTagTemplateRef = contentChild('kbqSelectTagContent', { ...(ngDevMode ? { debugName: "customTagTemplateRef" } : /* istanbul ignore next */ {}), read: TemplateRef });
|
|
245
|
+
this.tree = contentChild(KbqTreeSelection, ...(ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []));
|
|
246
|
+
this.search = contentChild(KbqSelectSearch, ...(ngDevMode ? [{ debugName: "search" }] : /* istanbul ignore next */ []));
|
|
247
|
+
/** Message projected for an empty tree — the only thing the panel opens onto without options. */
|
|
248
|
+
this.noOptionsMessage = contentChild(KbqSelectNoOptions, ...(ngDevMode ? [{ debugName: "noOptionsMessage" }] : /* istanbul ignore next */ []));
|
|
249
|
+
/**
|
|
250
|
+
* Text of the counter of the selected items that do not fit into the trigger. `{{ number }}` is
|
|
251
|
+
* replaced with their number.
|
|
252
|
+
*
|
|
253
|
+
* Left unset, the text follows the active locale (`select.hiddenItemsText`); set, it wins over the
|
|
254
|
+
* locale and survives a locale change.
|
|
255
|
+
*/
|
|
256
|
+
this.hiddenItemsText = input(undefined, ...(ngDevMode ? [{ debugName: "hiddenItemsText" }] : /* istanbul ignore next */ []));
|
|
257
|
+
/** Formats the counter of the items that do not fit into the trigger. */
|
|
258
|
+
this.hiddenItemsTextFormatter = input((hiddenItemsText, hiddenItems) => hiddenItemsText.replace('{{ number }}', hiddenItems.toString()), ...(ngDevMode ? [{ debugName: "hiddenItemsTextFormatter" }] : /* istanbul ignore next */ []));
|
|
259
|
+
this.localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('select', KBQ_SELECT_LOCALE_CONFIGURATION);
|
|
304
260
|
/**
|
|
305
261
|
* Event emitted when the select panel has been toggled.
|
|
306
262
|
* Also serves as the `openedChange` member of the `KbqSiblingPopup` contract — a tooltip sharing
|
|
@@ -308,10 +264,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
308
264
|
* `ngOnInit`) matters beyond this output's original consumers.
|
|
309
265
|
*/
|
|
310
266
|
this.openedChange = new EventEmitter();
|
|
267
|
+
/** @docs-private */
|
|
268
|
+
this.openedChangeOutput = outputFromObservable(this.openedChange, { alias: 'openedChange' });
|
|
311
269
|
/** Event emitted when the select has been opened. */
|
|
312
270
|
this.openedStream = this.openedChange.pipe(filter((o) => o), map(() => { }));
|
|
271
|
+
/** @docs-private */
|
|
272
|
+
this.openedOutput = outputFromObservable(this.openedStream, { alias: 'opened' });
|
|
313
273
|
/** Event emitted when the select has been closed. */
|
|
314
274
|
this.closedStream = this.openedChange.pipe(filter((o) => !o), map(() => { }));
|
|
275
|
+
/** @docs-private */
|
|
276
|
+
this.closedOutput = outputFromObservable(this.closedStream, { alias: 'closed' });
|
|
315
277
|
/** Event emitted when the selected value has been changed by the user. */
|
|
316
278
|
this.selectionChange = output();
|
|
317
279
|
/**
|
|
@@ -319,43 +281,87 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
319
281
|
* checkbox, the Ctrl/Cmd + A shortcut, or a custom `selectAllHandler` that delegates to it.
|
|
320
282
|
*/
|
|
321
283
|
this.onSelectAll = output();
|
|
284
|
+
/** Classes to be passed to the select panel. Supports the same syntax as the `[class]` binding. */
|
|
285
|
+
this.panelClass = input(undefined, ...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
286
|
+
this.backdropClass = input('cdk-overlay-transparent-backdrop', ...(ngDevMode ? [{ debugName: "backdropClass" }] : /* istanbul ignore next */ []));
|
|
322
287
|
/**
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
288
|
+
* Name of the control, for when no element on the page carries it. Defaults to the placeholder.
|
|
289
|
+
*
|
|
290
|
+
* Prefer `aria-labelledby` and point it at visible text: a name that duplicates a visible label is one
|
|
291
|
+
* more string to keep in sync, and a name with no visible counterpart cannot be spoken back by voice
|
|
292
|
+
* control (WCAG 2.5.3).
|
|
326
293
|
*/
|
|
327
|
-
this.
|
|
328
|
-
/**
|
|
329
|
-
|
|
330
|
-
|
|
294
|
+
this.ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
295
|
+
/**
|
|
296
|
+
* Id of the element that names the control. Defaults to the `kbq-label` of a wrapping `kbq-form-field`.
|
|
297
|
+
*
|
|
298
|
+
* A `role="combobox"` element takes its name from the author only, so neither the placeholder nor the
|
|
299
|
+
* selected values name it, and the `<label for>` of the form field names labelable elements only, which
|
|
300
|
+
* a custom control is not. Without a form-field label, point this at whatever visible text names the
|
|
301
|
+
* control.
|
|
302
|
+
*/
|
|
303
|
+
this.ariaLabelledby = input(null, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
|
|
304
|
+
/**
|
|
305
|
+
* Id of the element that names the control: its own `aria-labelledby`, or else the form-field label.
|
|
306
|
+
*
|
|
307
|
+
* @internal
|
|
308
|
+
*/
|
|
309
|
+
this.resolvedAriaLabelledby = computed(() => this.ariaLabelledby() ?? this.parentFormField?.labelId() ?? null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabelledby" }] : /* istanbul ignore next */ []));
|
|
310
|
+
/** Object used to control when error messages are shown. */
|
|
311
|
+
this.errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
|
|
312
|
+
/**
|
|
313
|
+
* Function used to sort the values in a select in multiple mode, by default their order in the panel.
|
|
314
|
+
* Follows the same logic as `Array.prototype.sort`. Receives two selected data nodes and every data node of the
|
|
315
|
+
* tree in panel order, collapsed branches included — a node in a collapsed branch has no option.
|
|
316
|
+
*/
|
|
317
|
+
this.sortComparator = input(undefined, ...(ngDevMode ? [{ debugName: "sortComparator" }] : /* istanbul ignore next */ []));
|
|
331
318
|
/**
|
|
332
|
-
*
|
|
333
|
-
*
|
|
319
|
+
* Decides which selected nodes the projected `KbqCleaner` removes: return `true` to clear the node,
|
|
320
|
+
* `false` to keep it. Receives the data node, not the option — a node in a collapsed branch has no
|
|
321
|
+
* option. Disabled nodes are kept by default. Bind a stable reference — a new function on every
|
|
322
|
+
* change detection re-runs the predicate over the whole selection.
|
|
323
|
+
*
|
|
324
|
+
* Not consulted by `writeValue` / `reset()`, which always clear everything. The parameter type becomes the select's
|
|
325
|
+
* `T` in a template: type it with the tree's node, not with an option.
|
|
334
326
|
*/
|
|
335
|
-
this.
|
|
327
|
+
this.clearPredicate = input(this.defaultOptions?.clearPredicate ?? ((node) => !this.isNodeDisabled(node)), { ...(ngDevMode ? { debugName: "clearPredicate" } : /* istanbul ignore next */ {}), transform: (fn) => {
|
|
328
|
+
if (typeof fn !== 'function') {
|
|
329
|
+
throw Error('`clearPredicate` must be a function.');
|
|
330
|
+
}
|
|
331
|
+
return fn;
|
|
332
|
+
} });
|
|
336
333
|
/**
|
|
337
334
|
* Whether to use a multiline matcher or not. Default is false
|
|
338
335
|
*/
|
|
339
|
-
this.multiline = input(false, ...(ngDevMode ?
|
|
336
|
+
this.multiline = input(false, { ...(ngDevMode ? { debugName: "multiline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
340
337
|
/** Combined stream of all of the child options' change events. */
|
|
341
338
|
this.optionSelectionChanges = defer(() => {
|
|
342
339
|
if (this.options) {
|
|
343
|
-
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.
|
|
340
|
+
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => outputToObservable(option.selectionChange)))));
|
|
344
341
|
}
|
|
345
|
-
return this.
|
|
342
|
+
return this.optionsInitialized.pipe(switchMap(() => this.optionSelectionChanges));
|
|
346
343
|
});
|
|
347
344
|
/** Combined stream of all of the child options userInteraction events. */
|
|
348
345
|
this.userInteractionChanges = defer(() => {
|
|
349
346
|
if (this.options) {
|
|
350
347
|
return this.options.changes.pipe(startWith(this.options), switchMap(() => merge(...this.options.map((option) => option.userInteraction))));
|
|
351
348
|
}
|
|
352
|
-
return this.
|
|
349
|
+
return this.optionsInitialized.pipe(switchMap(() => this.userInteractionChanges));
|
|
353
350
|
});
|
|
354
|
-
|
|
355
|
-
this.
|
|
356
|
-
|
|
351
|
+
/** Emits once `options` is assigned, for subscribers that arrive before the content is resolved. */
|
|
352
|
+
this.optionsInitialized = new Subject();
|
|
353
|
+
/** Placeholder shown in the trigger while nothing is selected. */
|
|
354
|
+
this.placeholder = input(...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
355
|
+
/** Whether the select is required. */
|
|
356
|
+
this.required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
357
|
+
/** @docs-private */
|
|
358
|
+
this.multipleInput = input(false, { ...(ngDevMode ? { debugName: "multipleInput" } : /* istanbul ignore next */ {}), alias: 'multiple',
|
|
359
|
+
transform: booleanAttribute });
|
|
360
|
+
/** @docs-private */
|
|
361
|
+
this.autoSelectInput = input(true, { ...(ngDevMode ? { debugName: "autoSelectInput" } : /* istanbul ignore next */ {}), alias: 'autoSelect',
|
|
362
|
+
transform: booleanAttribute });
|
|
357
363
|
/** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
|
|
358
|
-
this.selectAllToggle = input(false, ...(ngDevMode ?
|
|
364
|
+
this.selectAllToggle = input(false, { ...(ngDevMode ? { debugName: "selectAllToggle" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
359
365
|
/**
|
|
360
366
|
* Whether to render the "select all" master checkbox above the tree. Multiple selection only.
|
|
361
367
|
*
|
|
@@ -364,30 +370,61 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
364
370
|
* covers only the matches. Enabling it also makes Ctrl/Cmd + A a two-way toggle, so the shortcut and
|
|
365
371
|
* the checkbox never disagree (`selectAllToggle` is implied).
|
|
366
372
|
*/
|
|
367
|
-
this.selectAll = input(false, ...(ngDevMode ?
|
|
368
|
-
this.
|
|
369
|
-
|
|
370
|
-
this.
|
|
371
|
-
|
|
373
|
+
this.selectAll = input(false, { ...(ngDevMode ? { debugName: "selectAll" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
374
|
+
this.valueState = signal(undefined, ...(ngDevMode ? [{ debugName: "valueState" }] : /* istanbul ignore next */ []));
|
|
375
|
+
/** Values of the selected nodes: an array in multiple mode. */
|
|
376
|
+
this.value = this.valueState.asReadonly();
|
|
377
|
+
/** @docs-private */
|
|
378
|
+
this.idInput = input(undefined, { ...(ngDevMode ? { debugName: "idInput" } : /* istanbul ignore next */ {}), alias: 'id' });
|
|
379
|
+
/** Unique identifier of the select, generated when not provided. */
|
|
380
|
+
this.id = computed(() => this.idInput() || this.uid, ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
381
|
+
/** Whether the overlay panel is rendered on top of a backdrop. */
|
|
382
|
+
this.hasBackdrop = input(false, { ...(ngDevMode ? { debugName: "hasBackdrop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
383
|
+
/** @docs-private */
|
|
384
|
+
this.tabIndexInput = input(0, { ...(ngDevMode ? { debugName: "tabIndexInput" } : /* istanbul ignore next */ {}), alias: 'tabIndex' });
|
|
385
|
+
this.validTabIndex = linkedSignal({ ...(ngDevMode ? { debugName: "validTabIndex" } : /* istanbul ignore next */ {}), source: () => this.tabIndexInput(),
|
|
386
|
+
computation: (value, previous) => (Number.isInteger(value) || value === null ? value : (previous?.value ?? 0)) });
|
|
387
|
+
/** @docs-private */
|
|
388
|
+
this.disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled',
|
|
389
|
+
transform: booleanAttribute });
|
|
390
|
+
/** Whether the select is disabled. Also set by the bound form control. */
|
|
391
|
+
this.disabled = linkedSignal(() => this.disabledInput(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
392
|
+
// One signal per host value. The host bindings of every tree-select in a view run in that view's reactive
|
|
393
|
+
// consumer, where a signal read again by another binding costs a scan of everything the view has read.
|
|
394
|
+
this.resolvedTabIndex = computed(() => (this.disabled() ? -1 : this.validTabIndex()), ...(ngDevMode ? [{ debugName: "resolvedTabIndex" }] : /* istanbul ignore next */ []));
|
|
395
|
+
this.resolvedAriaLabel = computed(() => this.resolvedAriaLabelledby() ? null : this.ariaLabel() || this.placeholder() || null, ...(ngDevMode ? [{ debugName: "resolvedAriaLabel" }] : /* istanbul ignore next */ []));
|
|
396
|
+
/** @internal */
|
|
397
|
+
this.disabledAttribute = computed(() => this.disabled() || null, ...(ngDevMode ? [{ debugName: "disabledAttribute" }] : /* istanbul ignore next */ []));
|
|
398
|
+
/** @internal */
|
|
399
|
+
this.disabledClass = computed(() => this.disabled(), ...(ngDevMode ? [{ debugName: "disabledClass" }] : /* istanbul ignore next */ []));
|
|
400
|
+
/** @internal */
|
|
401
|
+
this.invalidClass = computed(() => this.errorState(), ...(ngDevMode ? [{ debugName: "invalidClass" }] : /* istanbul ignore next */ []));
|
|
402
|
+
/** @docs-private */
|
|
403
|
+
this.selectAllHandlerInput = input(undefined, { ...(ngDevMode ? { debugName: "selectAllHandlerInput" } : /* istanbul ignore next */ {}), alias: 'selectAllHandler',
|
|
404
|
+
transform: kbqSelectAllHandlerTransform });
|
|
405
|
+
this.focusedValue = signal(false, ...(ngDevMode ? [{ debugName: "focusedValue" }] : /* istanbul ignore next */ []));
|
|
406
|
+
this.panelOpenValue = signal(false, ...(ngDevMode ? [{ debugName: "panelOpenValue" }] : /* istanbul ignore next */ []));
|
|
407
|
+
/** Whether the select is focused. */
|
|
408
|
+
this.focused = computed(() => this.focusedValue() || this.panelOpenValue(), ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
|
|
372
409
|
/**
|
|
373
410
|
* Minimum width of the panel.
|
|
374
411
|
* If minWidth is larger than window width, it will be ignored.
|
|
375
412
|
*/
|
|
376
413
|
this.panelMinWidth = input(this.defaultOptions?.panelMinWidth === undefined
|
|
377
414
|
? KBQ_PANEL_DEFAULT_MIN_WIDTH
|
|
378
|
-
: this.defaultOptions.panelMinWidth, ...(ngDevMode ?
|
|
415
|
+
: this.defaultOptions.panelMinWidth, { ...(ngDevMode ? { debugName: "panelMinWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
379
416
|
/**
|
|
380
417
|
* Width of the panel. If set to `auto`, the panel will match the trigger width, but will never be
|
|
381
418
|
* narrower than `panelMinWidth`. If set to null or an empty string, the panel will grow to match the
|
|
382
419
|
* longest option's text. Any other value is used as an exact width, and `panelMinWidth` is not applied.
|
|
383
420
|
*/
|
|
384
|
-
this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : []));
|
|
421
|
+
this.panelWidth = input(this.defaultOptions?.panelWidth ?? null, ...(ngDevMode ? [{ debugName: "panelWidth" }] : /* istanbul ignore next */ []));
|
|
385
422
|
/**
|
|
386
423
|
* Maximum width of the panel in pixels. Caps how far the panel grows with its content — it never makes
|
|
387
424
|
* the panel narrower than the trigger, and never clamps an explicit `panelWidth`.
|
|
388
425
|
* When null, the `--kbq-panel-size-width-max` token applies.
|
|
389
426
|
*/
|
|
390
|
-
this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, ...(ngDevMode ?
|
|
427
|
+
this.panelMaxWidth = input(this.defaultOptions?.panelMaxWidth === undefined ? null : this.defaultOptions.panelMaxWidth, { ...(ngDevMode ? { debugName: "panelMaxWidth" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
391
428
|
/**
|
|
392
429
|
* Maximum height of the panel's scrollable option list, in pixels. Applied as the
|
|
393
430
|
* `--kbq-select-panel-size-max-height` custom property on the panel.
|
|
@@ -395,66 +432,140 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
395
432
|
* The search field and the footer sit outside the scrollable area and add to the panel's total height.
|
|
396
433
|
* When null, the token default (256px) applies.
|
|
397
434
|
*/
|
|
398
|
-
this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, ...(ngDevMode ?
|
|
435
|
+
this.panelMaxHeight = input(this.defaultOptions?.panelMaxHeight === undefined ? null : this.defaultOptions.panelMaxHeight, { ...(ngDevMode ? { debugName: "panelMaxHeight" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
399
436
|
/**
|
|
400
437
|
* `panelMaxHeight` rendered as a CSS length for the `--kbq-select-panel-size-max-height` token.
|
|
401
438
|
* A non-finite value (e.g. `null`) leaves the stylesheet default in place.
|
|
439
|
+
*
|
|
402
440
|
* @docs-private
|
|
403
441
|
*/
|
|
404
|
-
this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : []));
|
|
405
|
-
|
|
442
|
+
this.panelMaxHeightToken = computed(() => kbqResolvePanelMaxHeightToken(this.panelMaxHeight()), ...(ngDevMode ? [{ debugName: "panelMaxHeightToken" }] : /* istanbul ignore next */ []));
|
|
443
|
+
/**
|
|
444
|
+
* Controls when the search functionality is displayed based on the number of available options.
|
|
445
|
+
*
|
|
446
|
+
* Automatically enables search hiding if value provided, even if `defaultOptions.searchMinOptionsThreshold` is provided.
|
|
447
|
+
* Defaults to `undefined`.
|
|
448
|
+
*/
|
|
449
|
+
this.searchMinOptionsThreshold = computed(() => this.resolveSearchMinOptionsThreshold(this.searchMinOptionsThresholdInput()) ??
|
|
450
|
+
this.resolveSearchMinOptionsThreshold(this.defaultOptions?.searchMinOptionsThreshold), ...(ngDevMode ? [{ debugName: "searchMinOptionsThreshold" }] : /* istanbul ignore next */ []));
|
|
451
|
+
/** @docs-private */
|
|
452
|
+
this.searchMinOptionsThresholdInput = input(undefined, { ...(ngDevMode ? { debugName: "searchMinOptionsThresholdInput" } : /* istanbul ignore next */ {}), alias: 'searchMinOptionsThreshold' });
|
|
453
|
+
/**
|
|
454
|
+
* Colour of the trigger's tags and arrow.
|
|
455
|
+
*
|
|
456
|
+
* @docs-private
|
|
457
|
+
*/
|
|
458
|
+
this.colorForState = computed(() => this.errorState() ? KbqComponentColors.Error : KbqComponentColors.ContrastFade, ...(ngDevMode ? [{ debugName: "colorForState" }] : /* istanbul ignore next */ []));
|
|
459
|
+
/** Full set of classes for the panel: base class, form-field theme and custom `panelClass`. */
|
|
460
|
+
this.panelClasses = computed(() => {
|
|
461
|
+
const panelClass = this.panelClass();
|
|
462
|
+
const formFieldColor = this.parentFormField?.color();
|
|
463
|
+
const classes = ['kbq-tree-select__panel', formFieldColor ? `kbq-${formFieldColor}` : ''];
|
|
464
|
+
if (typeof panelClass === 'string') {
|
|
465
|
+
classes.push(panelClass);
|
|
466
|
+
}
|
|
467
|
+
else if (Array.isArray(panelClass) || panelClass instanceof Set) {
|
|
468
|
+
classes.push(...panelClass);
|
|
469
|
+
}
|
|
470
|
+
else if (panelClass) {
|
|
471
|
+
classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
|
|
472
|
+
}
|
|
473
|
+
return classes.filter(Boolean).join(' ');
|
|
474
|
+
}, ...(ngDevMode ? [{ debugName: "panelClasses" }] : /* istanbul ignore next */ []));
|
|
475
|
+
/** Text of the counter of the items that do not fit into the trigger. */
|
|
476
|
+
this.hiddenItemsLabel = computed(() => this.hiddenItemsTextFormatter()(this.hiddenItemsText() ?? this.localeConfiguration().hiddenItemsText, this.hiddenItems()), ...(ngDevMode ? [{ debugName: "hiddenItemsLabel" }] : /* istanbul ignore next */ []));
|
|
406
477
|
this.triggerValues = [];
|
|
407
478
|
this.closeSubscription = Subscription.EMPTY;
|
|
408
|
-
this._panelOpen = false;
|
|
409
479
|
/** The scroll offset the panel is restored to when it attaches — the list always opens at the top. */
|
|
410
480
|
this.scrollTop = 0;
|
|
411
481
|
/** Unique id for this input. */
|
|
412
482
|
this.uid = `kbq-tree-select-${nextUniqueId++}`;
|
|
483
|
+
/** Id of the overlay panel, referenced by the host's `aria-controls`. */
|
|
484
|
+
this.panelId = `${this.uid}-panel`;
|
|
485
|
+
/**
|
|
486
|
+
* Whether projected content has been resolved. The search field reaches its form control through
|
|
487
|
+
* its own form field, and that is only guaranteed to have been wired by `ngAfterContentInit`.
|
|
488
|
+
*/
|
|
489
|
+
this.contentInitialized = signal(false, ...(ngDevMode ? [{ debugName: "contentInitialized" }] : /* istanbul ignore next */ []));
|
|
490
|
+
/**
|
|
491
|
+
* The last value the form wrote while the tree could not resolve all of it yet — before the content was
|
|
492
|
+
* initialized, or before the data held every node it names. Applied again as the data changes, until every node
|
|
493
|
+
* is found or the selection is reported to the form.
|
|
494
|
+
*/
|
|
495
|
+
this.pendingValue = null;
|
|
496
|
+
/** The data nodes {@link pendingValue} was last resolved against. */
|
|
497
|
+
this.pendingValueDataNodes = null;
|
|
498
|
+
/** Whether the selection is being set to a value the form wrote, which is no change to report back. */
|
|
499
|
+
this.writingValue = false;
|
|
500
|
+
/** Handles of the timers that outlive the call that scheduled them. */
|
|
501
|
+
this.pendingTimers = new Set();
|
|
413
502
|
this.destroyRef = inject(DestroyRef);
|
|
414
|
-
/**
|
|
503
|
+
/**
|
|
504
|
+
* Called when the value changes. Needed to properly implement `ControlValueAccessor`.
|
|
505
|
+
*
|
|
506
|
+
* @docs-private
|
|
507
|
+
*/
|
|
415
508
|
this.onChange = () => { };
|
|
416
|
-
/**
|
|
509
|
+
/**
|
|
510
|
+
* Called when the control is blurred. Needed to properly implement `ControlValueAccessor`.
|
|
511
|
+
*
|
|
512
|
+
* @docs-private
|
|
513
|
+
*/
|
|
417
514
|
this.onTouched = () => { };
|
|
515
|
+
this.emptyValue = signal(true, ...(ngDevMode ? [{ debugName: "emptyValue" }] : /* istanbul ignore next */ []));
|
|
516
|
+
/** Whether no node is selected. */
|
|
517
|
+
this.empty = this.emptyValue.asReadonly();
|
|
518
|
+
/**
|
|
519
|
+
* Recounts the tags of the trigger that do not fit on its first line and refreshes the "+N"
|
|
520
|
+
* counter. Runs on window resize and whenever the rendered tags change.
|
|
521
|
+
*
|
|
522
|
+
* @docs-private
|
|
523
|
+
*/
|
|
418
524
|
this.calculateHiddenItems = () => {
|
|
419
525
|
if (!this.isBrowser ||
|
|
420
526
|
this.customTrigger() ||
|
|
421
527
|
this.customMatcher() ||
|
|
422
|
-
this.empty ||
|
|
528
|
+
this.empty() ||
|
|
423
529
|
!this.multiple ||
|
|
424
530
|
this.multiline())
|
|
425
531
|
return;
|
|
426
|
-
const totalItemsWidth = this.
|
|
427
|
-
|
|
428
|
-
this.hiddenItems = this.selectionModel.selected.length - visibleItems;
|
|
532
|
+
const { totalItemsWidth, visibleItems } = this.measureMatcherItems();
|
|
533
|
+
this.hiddenItems.set(this.selectionModel.selected.length - visibleItems);
|
|
429
534
|
this.changeDetectorRef.detectChanges();
|
|
430
|
-
if (this.hiddenItems) {
|
|
535
|
+
if (this.hiddenItems()) {
|
|
431
536
|
const itemsCounter = this.trigger().nativeElement.querySelector('.kbq-select__match-hidden-text');
|
|
432
537
|
const matcherList = this.trigger().nativeElement.querySelector('.kbq-select__match-list');
|
|
433
|
-
if (!itemsCounter || !matcherList)
|
|
434
|
-
this.changeDetectorRef.markForCheck();
|
|
538
|
+
if (!itemsCounter || !matcherList)
|
|
435
539
|
return;
|
|
436
|
-
}
|
|
437
540
|
const itemsCounterShowed = itemsCounter.offsetTop < itemsCounter.offsetHeight;
|
|
438
541
|
const itemsCounterWidth = Math.floor(itemsCounter.getBoundingClientRect().width);
|
|
439
542
|
const matcherListWidth = Math.floor(matcherList.getBoundingClientRect().width);
|
|
440
543
|
const matcherWidth = matcherListWidth + (itemsCounterShowed ? itemsCounterWidth : 0);
|
|
441
544
|
if (itemsCounterShowed && totalItemsWidth < matcherWidth) {
|
|
442
|
-
this.hiddenItems
|
|
545
|
+
this.hiddenItems.set(0);
|
|
443
546
|
this.changeDetectorRef.detectChanges();
|
|
444
547
|
}
|
|
445
|
-
if (totalVisibleItemsWidth === matcherListWidth ||
|
|
446
|
-
totalVisibleItemsWidth + itemsCounterWidth < matcherListWidth) {
|
|
447
|
-
this.changeDetectorRef.markForCheck();
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
548
|
}
|
|
451
|
-
this.changeDetectorRef.markForCheck();
|
|
452
|
-
};
|
|
453
|
-
this.updateLocaleParams = () => {
|
|
454
|
-
this.hiddenItemsText = this.localeService?.getParams('select').hiddenItemsText;
|
|
455
|
-
this.changeDetectorRef.markForCheck();
|
|
456
549
|
};
|
|
457
|
-
|
|
550
|
+
// The selection model is created with the multiplicity of the first binding and cannot follow a change.
|
|
551
|
+
effect(() => {
|
|
552
|
+
const multiple = this.multipleInput();
|
|
553
|
+
if (this.multipleValue !== undefined && multiple !== this.multipleValue) {
|
|
554
|
+
throw getKbqSelectDynamicMultipleError();
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
// A disabled select reports no focus to its form field.
|
|
558
|
+
let wasDisabled = false;
|
|
559
|
+
effect(() => {
|
|
560
|
+
const disabled = this.disabled();
|
|
561
|
+
if (disabled === wasDisabled)
|
|
562
|
+
return;
|
|
563
|
+
wasDisabled = disabled;
|
|
564
|
+
const formField = this.parentFormField;
|
|
565
|
+
if (formField) {
|
|
566
|
+
Promise.resolve().then(() => this.disabled() ? formField.stopFocusMonitor() : formField.runFocusMonitor());
|
|
567
|
+
}
|
|
568
|
+
});
|
|
458
569
|
// The tree owns the "select all" row — it is the only place that can put it in front of the nodes
|
|
459
570
|
// and into the key manager's list. Mirrored through an effect rather than assigned once in
|
|
460
571
|
// `ngAfterContentInit` so a `[selectAll]` bound to a changing expression keeps working.
|
|
@@ -464,13 +575,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
464
575
|
tree.selectAll = this.selectAll();
|
|
465
576
|
}
|
|
466
577
|
});
|
|
578
|
+
// `search` is projected content and can come and go with an `@if`, so both the wiring that
|
|
579
|
+
// follows it and the flag the tree reads on blur have to be re-applied, not read once.
|
|
580
|
+
// Gated on content init because the search reaches its control through its own form field,
|
|
581
|
+
// which is only guaranteed to have resolved by then.
|
|
582
|
+
effect((onCleanup) => {
|
|
583
|
+
const tree = this.tree();
|
|
584
|
+
const search = this.search();
|
|
585
|
+
if (!tree || !this.contentInitialized())
|
|
586
|
+
return;
|
|
587
|
+
tree.optionShouldHoldFocusOnBlur = !!search;
|
|
588
|
+
if (!search)
|
|
589
|
+
return;
|
|
590
|
+
const subscription = this.subscribeOnSearchChanges(tree, search);
|
|
591
|
+
onCleanup(() => subscription?.unsubscribe());
|
|
592
|
+
});
|
|
593
|
+
this.destroyRef.onDestroy(() => {
|
|
594
|
+
this.pendingTimers.forEach(clearTimeout);
|
|
595
|
+
this.pendingTimers.clear();
|
|
596
|
+
});
|
|
467
597
|
if (this.ngControl) {
|
|
468
598
|
// Note: we provide the value accessor through here, instead of
|
|
469
599
|
// the `providers` to avoid running into a circular import.
|
|
470
600
|
this.ngControl.valueAccessor = this;
|
|
471
601
|
}
|
|
472
|
-
// Force setter to be called in case id was not specified.
|
|
473
|
-
this.id = this.id;
|
|
474
602
|
afterNextRender(() => {
|
|
475
603
|
if (this.multiple && !this.multiline()) {
|
|
476
604
|
merge(fromEvent(this.window, 'resize'), this.tags.changes)
|
|
@@ -480,22 +608,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
480
608
|
});
|
|
481
609
|
}
|
|
482
610
|
ngOnInit() {
|
|
483
|
-
|
|
484
|
-
//
|
|
485
|
-
// fire the animation end event twice for the same animation. See:
|
|
486
|
-
// https://github.com/angular/angular/issues/24084
|
|
611
|
+
// Only the latest report of a frame is delivered, so a close and a reopen within one frame repeat the
|
|
612
|
+
// state delivered before; `distinctUntilChanged` keeps `openedChange` from emitting it twice.
|
|
487
613
|
this.panelDoneAnimatingStream
|
|
488
614
|
.pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
|
|
489
615
|
.subscribe(() => {
|
|
490
616
|
if (this.panelOpen) {
|
|
491
|
-
this.
|
|
492
|
-
setTimeout(() => {
|
|
617
|
+
this.scheduleTimeout(() => {
|
|
493
618
|
this.highlightCorrectOption();
|
|
494
619
|
const search = this.search();
|
|
495
620
|
if (search) {
|
|
496
621
|
search.focus();
|
|
497
622
|
}
|
|
498
623
|
});
|
|
624
|
+
this.scrollbarViewport()?.flashScrollIndicators();
|
|
499
625
|
this.openedChange.emit(true);
|
|
500
626
|
}
|
|
501
627
|
else {
|
|
@@ -515,13 +641,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
515
641
|
if (!tree)
|
|
516
642
|
return;
|
|
517
643
|
tree.resetFocusedItemOnBlur = false;
|
|
518
|
-
|
|
519
|
-
this.selectionModel =
|
|
644
|
+
this.multipleValue = this.multipleInput();
|
|
645
|
+
this.selectionModel = new SelectionModel(this.multiSelection);
|
|
646
|
+
this.syncSelectionState();
|
|
520
647
|
this.selectionModel.changed.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
521
|
-
this.
|
|
648
|
+
this.syncSelectionState();
|
|
649
|
+
// Neither a written value nor the tree re-pointing the selection at reloaded data is the user's change.
|
|
650
|
+
if (!this.writingValue && !tree.syncingSelection) {
|
|
651
|
+
this.reportValue();
|
|
652
|
+
}
|
|
522
653
|
if (this.multiSelection) {
|
|
523
654
|
this.refreshTriggerValues();
|
|
524
655
|
}
|
|
656
|
+
// The trigger renders the selection, whichever way it changed (a click, `writeValue`, select all).
|
|
657
|
+
this.changeDetectorRef.markForCheck();
|
|
525
658
|
});
|
|
526
659
|
this.selectionModel.changed.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
527
660
|
// A multiline trigger grows with every selected option, and this is the one signal guaranteed
|
|
@@ -529,30 +662,43 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
529
662
|
this.updatePanelAnchor();
|
|
530
663
|
this.setOverlayPosition();
|
|
531
664
|
});
|
|
532
|
-
//
|
|
533
|
-
tree
|
|
665
|
+
// Hands the tree the model this component owns. Re-running `tree.ngAfterContentInit()` was the
|
|
666
|
+
// old way of doing it and left the tree with a second set of subscribers on query lists that are
|
|
667
|
+
// never re-created — every options change handled twice, for the lifetime of the component.
|
|
668
|
+
tree.initializeForEmbedding(this.selectionModel);
|
|
669
|
+
tree.renderedOptions.changes.pipe(delay(0), takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
670
|
+
// A value written ahead of its data, such as one loaded over HTTP, is applied once the nodes arrive.
|
|
671
|
+
if (this.pendingValue && tree.treeControl.dataNodes !== this.pendingValueDataNodes) {
|
|
672
|
+
this.applyPendingValue();
|
|
673
|
+
}
|
|
674
|
+
// Options render after the first value reaches the control, so the trigger is built before any
|
|
675
|
+
// of them exists and its `disabled` flags can be stale.
|
|
676
|
+
if (this.multiSelection && this.hasStaleTriggerValues()) {
|
|
677
|
+
this.refreshTriggerValues();
|
|
678
|
+
}
|
|
679
|
+
});
|
|
534
680
|
this.initKeyManager();
|
|
535
681
|
this.options = tree.renderedOptions;
|
|
536
682
|
tree.autoSelect = this.autoSelect;
|
|
537
683
|
// Single place the event is raised, so a click on the master checkbox and Ctrl/Cmd + A — which
|
|
538
684
|
// both go through `selectAllOptions` — emit exactly once and with the same payload.
|
|
539
|
-
outputToObservable(tree.
|
|
685
|
+
outputToObservable(tree.selectAllChange)
|
|
540
686
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
541
687
|
.subscribe(({ options }) => this.onSelectAll.emit(new KbqSelectAllEvent(this, options, tree.allOptionsSelected)));
|
|
542
688
|
// Tree lives inside the select panel: enable hover-to-focus on options even without a
|
|
543
689
|
// wrapping form-field (e.g. filter-bar pipes render the tree-select bare).
|
|
544
690
|
tree.inSelect = true;
|
|
545
|
-
if (tree.multipleMode === null) {
|
|
546
|
-
|
|
547
|
-
setTimeout(() => (this.tree().multipleMode = this.multiSelection ? MultipleMode.CHECKBOX : null));
|
|
691
|
+
if (tree.multipleMode === null && this.multiSelection) {
|
|
692
|
+
tree.multipleMode = MultipleMode.CHECKBOX;
|
|
548
693
|
}
|
|
549
694
|
if (this.multiSelection) {
|
|
550
695
|
tree.noUnselectLast = false;
|
|
551
696
|
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
this.
|
|
697
|
+
// A missing value written ahead of the content leaves the selection as empty as it starts.
|
|
698
|
+
if (this.pendingValue?.value === null || this.pendingValue?.value === undefined) {
|
|
699
|
+
this.pendingValue = null;
|
|
555
700
|
}
|
|
701
|
+
this.applyPendingValue();
|
|
556
702
|
this.userInteractionChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
557
703
|
if (!this.multiSelection && this.panelOpen) {
|
|
558
704
|
this.close();
|
|
@@ -562,7 +708,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
562
708
|
tree.selectionChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
|
|
563
709
|
this.selectionChange.emit(new KbqTreeSelectChange(this, event.option, false, event.options));
|
|
564
710
|
const search = this.search();
|
|
565
|
-
|
|
711
|
+
// Guarded the same way every other refocus in the component is: with the field hidden by
|
|
712
|
+
// `searchMinOptionsThreshold` there is nothing to give the caret back to.
|
|
713
|
+
if (search && this.shouldShowSearch()) {
|
|
566
714
|
search.focus();
|
|
567
715
|
}
|
|
568
716
|
});
|
|
@@ -574,7 +722,9 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
574
722
|
this.tree().keyManager.setActiveItem(this.options.find(({ data }) => data === added[0]));
|
|
575
723
|
});
|
|
576
724
|
}
|
|
577
|
-
this.
|
|
725
|
+
this.contentInitialized.set(true);
|
|
726
|
+
this.optionsInitialized.next();
|
|
727
|
+
this.optionsInitialized.complete();
|
|
578
728
|
}
|
|
579
729
|
ngAfterViewInit() {
|
|
580
730
|
const tree = this.tree();
|
|
@@ -584,53 +734,44 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
584
734
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
585
735
|
.subscribe(() => this.setOverlayPosition());
|
|
586
736
|
}
|
|
737
|
+
ngAfterViewChecked() {
|
|
738
|
+
// Syncs the list here so `changes` emits once this view is checked.
|
|
739
|
+
this.tagsList();
|
|
740
|
+
}
|
|
587
741
|
ngOnDestroy() {
|
|
588
|
-
this.
|
|
742
|
+
this.panelDoneAnimatingStream.complete();
|
|
743
|
+
this.openedChange.complete();
|
|
589
744
|
this.closeSubscription.unsubscribe();
|
|
590
745
|
this.unsubscribeFromPanelResize();
|
|
591
746
|
}
|
|
592
747
|
updateErrorState() {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
const matcher = this.errorStateMatcher || this.defaultErrorStateMatcher;
|
|
596
|
-
const control = this.ngControl ? this.ngControl.control : null;
|
|
597
|
-
const newState = matcher.isErrorState(control, parent);
|
|
598
|
-
if (newState !== oldState) {
|
|
599
|
-
this.errorState = newState;
|
|
600
|
-
this.stateChanges.next();
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) {
|
|
604
|
-
return hiddenItemsText.replace('{{ number }}', hiddenItems.toString());
|
|
748
|
+
this.errorStateTracker.errorStateMatcher = this.errorStateMatcher();
|
|
749
|
+
this.errorStateTracker.updateErrorState();
|
|
605
750
|
}
|
|
606
751
|
/**
|
|
607
|
-
* Clears the
|
|
752
|
+
* Clears the nodes `clearPredicate` accepts; disabled ones are kept by default.
|
|
753
|
+
*
|
|
754
|
+
* Deselects on the model directly: `tree.setOptionsFromValues([])` starts by clearing the whole
|
|
755
|
+
* model and would take the kept nodes with it.
|
|
756
|
+
*
|
|
608
757
|
* @docs-private
|
|
609
758
|
*/
|
|
610
759
|
clear() {
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
760
|
+
untracked(() => {
|
|
761
|
+
const targets = this.clearTargets;
|
|
762
|
+
this.selectionModel.deselect(...targets);
|
|
763
|
+
this.tree().keyManager.setActiveItem(-1);
|
|
764
|
+
this.changeDetectorRef.detectChanges();
|
|
765
|
+
this.reportValue();
|
|
766
|
+
this.selectionChange.emit(new KbqTreeSelectChange(this, null, false, targets));
|
|
767
|
+
});
|
|
616
768
|
}
|
|
617
|
-
/**
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
*/
|
|
622
|
-
clearValue(event) {
|
|
623
|
-
const cleaner = this.cleaner();
|
|
624
|
-
if (cleaner) {
|
|
625
|
-
cleaner.clear(event);
|
|
626
|
-
}
|
|
627
|
-
else {
|
|
628
|
-
event.stopPropagation();
|
|
629
|
-
event.preventDefault();
|
|
630
|
-
this.clear();
|
|
631
|
-
this.focus();
|
|
632
|
-
}
|
|
769
|
+
/** Reports the selection to the form, which then holds it instead of a value still waiting for its nodes. */
|
|
770
|
+
reportValue() {
|
|
771
|
+
this.pendingValue = null;
|
|
772
|
+
this.onChange(this.selectedValues);
|
|
633
773
|
}
|
|
774
|
+
/** Host click handler. A custom matcher that opts out of the default handlers takes it over. */
|
|
634
775
|
handleClick() {
|
|
635
776
|
const customMatcher = this.customMatcher();
|
|
636
777
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
@@ -638,15 +779,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
638
779
|
this.toggle();
|
|
639
780
|
}
|
|
640
781
|
toggle() {
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
this.
|
|
646
|
-
|
|
782
|
+
// Untracked, like the other imperative methods: called from a consumer's `effect()`, the state read on the
|
|
783
|
+
// way — `panelOpen`, `disabled`, the options, the inputs — would make the effect run again on every open
|
|
784
|
+
// and close.
|
|
785
|
+
untracked(() => {
|
|
786
|
+
if (this.panelOpen) {
|
|
787
|
+
this.close();
|
|
788
|
+
}
|
|
789
|
+
else {
|
|
790
|
+
this.open();
|
|
791
|
+
}
|
|
792
|
+
});
|
|
647
793
|
}
|
|
648
794
|
open() {
|
|
649
|
-
|
|
795
|
+
untracked(() => this.attachPanel());
|
|
796
|
+
}
|
|
797
|
+
attachPanel() {
|
|
798
|
+
if (this.disabled() || !this.options || this.panelOpenValue())
|
|
799
|
+
return;
|
|
800
|
+
if (!this.options.length && !this.noOptionsMessage())
|
|
650
801
|
return;
|
|
651
802
|
// add check for form-field bounding rectangles, since it adds extra padding around the trigger
|
|
652
803
|
this.triggerRect = (this.parentFormField?.getConnectedOverlayOrigin().nativeElement || this.trigger().nativeElement).getBoundingClientRect();
|
|
@@ -660,37 +811,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
660
811
|
this.overlayOrigin = this.parentFormField.getConnectedOverlayOrigin();
|
|
661
812
|
}
|
|
662
813
|
this.updateOverlayWidth(this.panelWidth(), this.panelMinWidth(), this.overlayOrigin ?? this.elementRef);
|
|
663
|
-
this.
|
|
814
|
+
this.panelOpenValue.set(true);
|
|
664
815
|
this.changeDetectorRef.markForCheck();
|
|
665
816
|
// Set the font size on the panel element once it exists.
|
|
666
|
-
|
|
667
|
-
.asObservable()
|
|
668
|
-
.pipe(take(1))
|
|
669
|
-
.subscribe(() => {
|
|
817
|
+
afterNextRender(() => {
|
|
670
818
|
if (this.triggerFontSize && this.overlayDir.overlayRef && this.overlayDir.overlayRef.overlayElement) {
|
|
671
819
|
this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this.triggerFontSize}px`;
|
|
672
820
|
}
|
|
673
821
|
if (this.search()) {
|
|
674
822
|
this.lockOverlayWidthForSearch(this.panel());
|
|
675
823
|
}
|
|
676
|
-
});
|
|
824
|
+
}, { injector: this.injector });
|
|
825
|
+
this.reportPanelRendered('showing');
|
|
677
826
|
}
|
|
678
827
|
/** Closes the overlay panel and focuses the host element. */
|
|
679
828
|
close() {
|
|
680
|
-
|
|
829
|
+
untracked(() => {
|
|
830
|
+
if (!this.panelOpenValue()) {
|
|
831
|
+
return;
|
|
832
|
+
}
|
|
833
|
+
this.panelOpenValue.set(false);
|
|
834
|
+
this.unsubscribeFromPanelResize();
|
|
835
|
+
// Back to the two default sides, so the next open is not resolved against a first row that has since
|
|
836
|
+
// changed height.
|
|
837
|
+
this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
|
|
838
|
+
this.changeDetectorRef.markForCheck();
|
|
839
|
+
this.onTouched();
|
|
840
|
+
const search = this.search();
|
|
841
|
+
if (search) {
|
|
842
|
+
search.reset();
|
|
843
|
+
}
|
|
844
|
+
this.reportPanelRendered('void');
|
|
845
|
+
});
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Reports the panel rendered or removed once the next render has applied `panelOpen`; only the latest
|
|
849
|
+
* report of a frame is delivered.
|
|
850
|
+
*/
|
|
851
|
+
reportPanelRendered(state) {
|
|
852
|
+
this.panelRender?.destroy();
|
|
853
|
+
// The overlay detaching while the select is destroyed closes it too.
|
|
854
|
+
if (this.destroyRef.destroyed)
|
|
681
855
|
return;
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
// Back to the two default sides, so the next open is not resolved against a first row that has since
|
|
686
|
-
// changed height.
|
|
687
|
-
this.positions = this.withOverlapPosition(this.positions, null) ?? this.positions;
|
|
688
|
-
this.changeDetectorRef.markForCheck();
|
|
689
|
-
this.onTouched();
|
|
690
|
-
const search = this.search();
|
|
691
|
-
if (search) {
|
|
692
|
-
search.reset();
|
|
693
|
-
}
|
|
856
|
+
this.panelRender = afterNextRender(() => this.panelDoneAnimatingStream.next(state), {
|
|
857
|
+
injector: this.injector
|
|
858
|
+
});
|
|
694
859
|
}
|
|
695
860
|
/**
|
|
696
861
|
* Sets the select's value. Part of the ControlValueAccessor interface
|
|
@@ -699,11 +864,30 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
699
864
|
* @param value New value to be written to the model.
|
|
700
865
|
*/
|
|
701
866
|
writeValue(value) {
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
this.
|
|
867
|
+
// Untracked: a form control set from an `effect()` writes here synchronously.
|
|
868
|
+
untracked(() => {
|
|
869
|
+
this.pendingValue = { value };
|
|
870
|
+
// Until then the select has no selection model shared with the tree, and `ngAfterContentInit` applies it.
|
|
871
|
+
if (this.contentInitialized()) {
|
|
872
|
+
this.applyPendingValue();
|
|
873
|
+
}
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
/** Applies the value the form wrote last, and lets it go once the data holds every node it names. */
|
|
877
|
+
applyPendingValue() {
|
|
878
|
+
const pending = this.pendingValue;
|
|
879
|
+
const treeControl = this.tree()?.treeControl;
|
|
880
|
+
if (!pending || !treeControl)
|
|
881
|
+
return;
|
|
882
|
+
// Dropped first, so a value that throws is not applied again with every change of the data.
|
|
883
|
+
this.pendingValue = null;
|
|
884
|
+
this.pendingValueDataNodes = treeControl.dataNodes;
|
|
885
|
+
this.setSelectionByValue(pending.value);
|
|
886
|
+
const { value } = pending;
|
|
887
|
+
const values = value === null || value === undefined ? [] : this.multiSelection && Array.isArray(value) ? value : [value];
|
|
888
|
+
// Unless another value was written meanwhile.
|
|
889
|
+
if (this.pendingValue === null && !values.every((item) => treeControl.hasValue(item))) {
|
|
890
|
+
this.pendingValue = pending;
|
|
707
891
|
}
|
|
708
892
|
}
|
|
709
893
|
/**
|
|
@@ -723,7 +907,6 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
723
907
|
*
|
|
724
908
|
* @param fn Callback to be triggered when the component has been touched.
|
|
725
909
|
*/
|
|
726
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
727
910
|
registerOnTouched(fn) {
|
|
728
911
|
this.onTouched = fn;
|
|
729
912
|
}
|
|
@@ -734,9 +917,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
734
917
|
* @param isDisabled Sets whether the component is disabled.
|
|
735
918
|
*/
|
|
736
919
|
setDisabledState(isDisabled) {
|
|
737
|
-
this.disabled
|
|
738
|
-
this.changeDetectorRef.markForCheck();
|
|
739
|
-
this.stateChanges.next();
|
|
920
|
+
this.disabled.set(isDisabled);
|
|
740
921
|
}
|
|
741
922
|
get selected() {
|
|
742
923
|
return this.multiSelection ? this.selectionModel?.selected : this.selectionModel?.selected[0];
|
|
@@ -746,25 +927,25 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
746
927
|
return this.multiSelection ? selectedValues : selectedValues[0];
|
|
747
928
|
}
|
|
748
929
|
get triggerValue() {
|
|
749
|
-
if (this.empty) {
|
|
930
|
+
if (this.empty()) {
|
|
750
931
|
return '';
|
|
751
932
|
}
|
|
933
|
+
// Shown in single selection, where `selected` is the node.
|
|
752
934
|
return this.tree().treeControl.getViewValue(this.selected);
|
|
753
935
|
}
|
|
754
|
-
|
|
755
|
-
return !this.selectionModel || this.selectionModel.isEmpty();
|
|
756
|
-
}
|
|
757
|
-
isRtl() {
|
|
758
|
-
return this.dir ? this.dir.value === 'rtl' : false;
|
|
759
|
-
}
|
|
936
|
+
/** First selected node that is not disabled — the one the panel highlights when it opens. */
|
|
760
937
|
get firstSelected() {
|
|
761
938
|
return this.selectionModel.selected.filter((node) => !this.tree().treeControl.isDisabled(node))[0];
|
|
762
939
|
}
|
|
940
|
+
/**
|
|
941
|
+
* Host keydown handler, routing the event to the trigger or the panel handler. A custom matcher
|
|
942
|
+
* that opts out of the default handlers reaches those two directly instead.
|
|
943
|
+
*/
|
|
763
944
|
handleKeydown(event) {
|
|
764
945
|
const customMatcher = this.customMatcher();
|
|
765
946
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
766
947
|
return;
|
|
767
|
-
if (!this.disabled) {
|
|
948
|
+
if (!this.disabled()) {
|
|
768
949
|
if (this.panelOpen) {
|
|
769
950
|
this.panelKeydownHandler(event);
|
|
770
951
|
}
|
|
@@ -777,9 +958,8 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
777
958
|
const customMatcher = this.customMatcher();
|
|
778
959
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
779
960
|
return;
|
|
780
|
-
if (!this.disabled) {
|
|
781
|
-
this.
|
|
782
|
-
this.stateChanges.next();
|
|
961
|
+
if (!this.disabled()) {
|
|
962
|
+
this.focusedValue.set(true);
|
|
783
963
|
}
|
|
784
964
|
}
|
|
785
965
|
/**
|
|
@@ -790,25 +970,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
790
970
|
const customMatcher = this.customMatcher();
|
|
791
971
|
if (customMatcher && !customMatcher.useDefaultHandlers())
|
|
792
972
|
return;
|
|
793
|
-
this.
|
|
794
|
-
if (!this.disabled && !this.panelOpen) {
|
|
973
|
+
this.focusedValue.set(false);
|
|
974
|
+
if (!this.disabled() && !this.panelOpen) {
|
|
795
975
|
this.onTouched();
|
|
796
976
|
this.changeDetectorRef.markForCheck();
|
|
797
|
-
this.stateChanges.next();
|
|
798
977
|
}
|
|
799
978
|
}
|
|
800
979
|
/** Callback that is invoked when the overlay panel has been attached. */
|
|
801
980
|
onAttached() {
|
|
981
|
+
// `cdkConnectedOverlay` creates and attaches the overlay in one go, so this is the first point it exists.
|
|
982
|
+
this.overlayLayers.adopt(this.overlayDir.overlayRef, this.elementRef.nativeElement);
|
|
802
983
|
this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {
|
|
803
984
|
this.changeDetectorRef.detectChanges();
|
|
804
985
|
this.setOverlayPosition();
|
|
805
986
|
// The panel itself is an `overflow: hidden` box; the option list is what scrolls.
|
|
806
|
-
this.
|
|
987
|
+
this.scrollbarViewport()?.scrollTo({ top: this.scrollTop });
|
|
807
988
|
this.tree().updateScrollSize();
|
|
808
989
|
// Deliberately out of this frame — see `reanchorPanel`. A microtask still lands before paint.
|
|
809
990
|
queueMicrotask(() => this.reanchorPanel());
|
|
810
991
|
});
|
|
811
992
|
this.subscribeToPanelResize();
|
|
993
|
+
// This runs on every open, so without dropping the previous subscription every open would add
|
|
994
|
+
// another one and a single outside click would call `close()` once per open so far.
|
|
995
|
+
this.closeSubscription.unsubscribe();
|
|
812
996
|
this.closeSubscription = this.closingActions().subscribe(() => this.close());
|
|
813
997
|
}
|
|
814
998
|
/** Element the overlay is positioned and sized against. */
|
|
@@ -816,43 +1000,51 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
816
1000
|
return this.parentFormField?.getConnectedOverlayOrigin().nativeElement ?? this.trigger()?.nativeElement;
|
|
817
1001
|
}
|
|
818
1002
|
isPanelOpen() {
|
|
819
|
-
return this.
|
|
820
|
-
}
|
|
821
|
-
/** Returns the theme to be used on the panel. */
|
|
822
|
-
getPanelTheme() {
|
|
823
|
-
return this.parentFormField ? `kbq-${this.parentFormField.color}` : '';
|
|
824
|
-
}
|
|
825
|
-
/** Returns the full set of classes for the panel: base class, theme and custom `panelClass`. */
|
|
826
|
-
getPanelClasses() {
|
|
827
|
-
const panelClass = this.panelClass();
|
|
828
|
-
const classes = ['kbq-tree-select__panel', this.getPanelTheme()];
|
|
829
|
-
if (typeof panelClass === 'string') {
|
|
830
|
-
classes.push(panelClass);
|
|
831
|
-
}
|
|
832
|
-
else if (Array.isArray(panelClass) || panelClass instanceof Set) {
|
|
833
|
-
classes.push(...panelClass);
|
|
834
|
-
}
|
|
835
|
-
else if (panelClass) {
|
|
836
|
-
classes.push(...Object.keys(panelClass).filter((key) => panelClass[key]));
|
|
837
|
-
}
|
|
838
|
-
return classes.filter(Boolean).join(' ');
|
|
1003
|
+
return this.panelOpenValue();
|
|
839
1004
|
}
|
|
840
1005
|
focus() {
|
|
841
1006
|
this.elementRef.nativeElement.focus();
|
|
842
1007
|
}
|
|
843
1008
|
/**
|
|
844
1009
|
* Implemented as part of KbqFormFieldControl.
|
|
1010
|
+
*
|
|
845
1011
|
* @docs-private
|
|
846
1012
|
*/
|
|
847
1013
|
onContainerClick() {
|
|
848
1014
|
this.focus();
|
|
849
1015
|
}
|
|
850
|
-
/**
|
|
1016
|
+
/** Removes an option from the selection through the trailing icon of its tag in the trigger. */
|
|
851
1017
|
onRemoveSelectedOption(selectedOption, $event) {
|
|
852
1018
|
$event.stopPropagation();
|
|
853
|
-
|
|
1019
|
+
// Only removable tags render the icon, so this is also the index of the icon among them.
|
|
1020
|
+
const removedIndex = this.triggerValues
|
|
1021
|
+
.filter(({ disabled }) => !disabled)
|
|
1022
|
+
.findIndex(({ value }) => value === selectedOption.value);
|
|
1023
|
+
const removed = this.selectionModel.selected.find((node) => this.tree().treeControl.getValue(node) === selectedOption.value);
|
|
1024
|
+
if (removed !== undefined) {
|
|
1025
|
+
this.selectionModel.deselect(removed);
|
|
1026
|
+
}
|
|
854
1027
|
this.selectionChange.emit(new KbqTreeSelectChange(this, this.options.find((option) => option.value === selectedOption.value) || selectedOption.value));
|
|
855
|
-
this.
|
|
1028
|
+
this.reportValue();
|
|
1029
|
+
this.restoreFocusAfterRemoval(removedIndex);
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* Takes the focus off the remove icon that has just been destroyed along with its tag.
|
|
1033
|
+
*
|
|
1034
|
+
* The trigger is rebuilt synchronously — `selectionModel.changed` runs `refreshTriggerValues()`,
|
|
1035
|
+
* which calls `detectChanges()` — so by the time the click handler returns the icon the keyboard was
|
|
1036
|
+
* on is gone and the focus has fallen back to the document body. Hands it to the icon that took the
|
|
1037
|
+
* removed tag's place, or to the control itself once no removable tag is left.
|
|
1038
|
+
*/
|
|
1039
|
+
restoreFocusAfterRemoval(removedIndex) {
|
|
1040
|
+
const removeIcons = this.trigger().nativeElement.querySelectorAll('[kbqTagRemove]');
|
|
1041
|
+
const next = removeIcons[Math.min(removedIndex, removeIcons.length - 1)];
|
|
1042
|
+
if (next) {
|
|
1043
|
+
next.focus();
|
|
1044
|
+
}
|
|
1045
|
+
else {
|
|
1046
|
+
this.focus();
|
|
1047
|
+
}
|
|
856
1048
|
}
|
|
857
1049
|
triggerKeydownHandler(event) {
|
|
858
1050
|
const keyCode = event.keyCode;
|
|
@@ -873,7 +1065,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
873
1065
|
const keyCode = event.keyCode;
|
|
874
1066
|
const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
|
|
875
1067
|
const tree = this.tree();
|
|
876
|
-
if ((isArrowKey && event.altKey) || keyCode === ESCAPE
|
|
1068
|
+
if ((isArrowKey && event.altKey) || keyCode === ESCAPE) {
|
|
877
1069
|
// Close the select on ALT + arrow key to match the native <select>
|
|
878
1070
|
event.preventDefault();
|
|
879
1071
|
// Prevent ESCAPE from bubbling to ancestor (when inside overlay)
|
|
@@ -883,8 +1075,15 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
883
1075
|
this.close();
|
|
884
1076
|
this.focus();
|
|
885
1077
|
}
|
|
1078
|
+
else if (keyCode === TAB) {
|
|
1079
|
+
// Deliberately not `preventDefault`-ed. Closing the panel and pulling the focus back to the
|
|
1080
|
+
// host is all this control has to do; the browser then moves on to the next control the way
|
|
1081
|
+
// Tab always does. Swallowing the key trapped the focus inside an open select.
|
|
1082
|
+
this.close();
|
|
1083
|
+
this.focus();
|
|
1084
|
+
}
|
|
886
1085
|
else if (keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW) {
|
|
887
|
-
|
|
1086
|
+
tree.handleKeydown(event);
|
|
888
1087
|
// LEFT_ARROW moves focus to the parent option when the active one is already collapsed,
|
|
889
1088
|
// so the search field has to be given the caret back, the same way the other keys do below.
|
|
890
1089
|
const search = this.search();
|
|
@@ -912,7 +1111,7 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
912
1111
|
else if ((keyCode === ENTER || keyCode === SPACE) && tree.keyManager.activeItem) {
|
|
913
1112
|
event.preventDefault();
|
|
914
1113
|
if (!this.autoSelect) {
|
|
915
|
-
|
|
1114
|
+
tree.handleKeydown(event);
|
|
916
1115
|
}
|
|
917
1116
|
else {
|
|
918
1117
|
this.close();
|
|
@@ -957,9 +1156,20 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
957
1156
|
// reading the tree's own authoritative node count instead of subtracting from `options.length`
|
|
958
1157
|
// sidesteps that race entirely, rather than risking the two going momentarily out of step.
|
|
959
1158
|
const optionsCount = this.tree()?.nodesCount ?? this.options.length;
|
|
960
|
-
return (isUndefined(this.searchMinOptionsThreshold) ||
|
|
1159
|
+
return (isUndefined(this.searchMinOptionsThreshold()) ||
|
|
961
1160
|
!!this.search()?.value() ||
|
|
962
|
-
optionsCount >= this.searchMinOptionsThreshold);
|
|
1161
|
+
optionsCount >= this.searchMinOptionsThreshold());
|
|
1162
|
+
}
|
|
1163
|
+
/**
|
|
1164
|
+
* Runs `callback` after the current task, keeping the handle so that destroying the component
|
|
1165
|
+
* cancels it. A timer left to fire after teardown runs against a component that is already gone.
|
|
1166
|
+
*/
|
|
1167
|
+
scheduleTimeout(callback) {
|
|
1168
|
+
const handle = setTimeout(() => {
|
|
1169
|
+
this.pendingTimers.delete(handle);
|
|
1170
|
+
callback();
|
|
1171
|
+
});
|
|
1172
|
+
this.pendingTimers.add(handle);
|
|
963
1173
|
}
|
|
964
1174
|
closingActions() {
|
|
965
1175
|
const backdrop = this.overlayDir.overlayRef.backdropClick();
|
|
@@ -969,33 +1179,34 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
969
1179
|
const detachments = this.overlayDir.overlayRef.detachments();
|
|
970
1180
|
return merge(backdrop, outsidePointerEvents, detachments);
|
|
971
1181
|
}
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
}
|
|
982
|
-
getTotalVisibleItems() {
|
|
1182
|
+
/**
|
|
1183
|
+
* Measures the tags of the matcher on an off-screen copy of the trigger.
|
|
1184
|
+
*
|
|
1185
|
+
* Two answers are needed — how many tags fit on the first line next to the "+N" counter, and how
|
|
1186
|
+
* wide all of them are together — and they used to cost a clone each. One clone is enough: it is
|
|
1187
|
+
* built, appended and removed once, and the only thing separating the two passes is the counter,
|
|
1188
|
+
* which the second pass drops from the copy.
|
|
1189
|
+
*/
|
|
1190
|
+
measureMatcherItems() {
|
|
983
1191
|
const triggerClone = this.buildTriggerClone();
|
|
984
1192
|
const hiddenText = triggerClone.querySelector('.kbq-select__match-hidden-text');
|
|
985
1193
|
if (hiddenText) {
|
|
986
1194
|
this.renderer.setStyle(hiddenText, 'display', 'block');
|
|
987
1195
|
}
|
|
988
1196
|
this.renderer.appendChild(this.trigger().nativeElement, triggerClone);
|
|
989
|
-
let
|
|
990
|
-
let totalVisibleItemsWidth = 0;
|
|
1197
|
+
let visibleItems = 0;
|
|
991
1198
|
triggerClone.querySelectorAll('kbq-tag').forEach((item) => {
|
|
992
1199
|
if (item.offsetTop < item.offsetHeight) {
|
|
993
|
-
|
|
994
|
-
visibleItemsCount++;
|
|
1200
|
+
visibleItems++;
|
|
995
1201
|
}
|
|
996
1202
|
});
|
|
1203
|
+
hiddenText?.remove();
|
|
1204
|
+
let totalItemsWidth = 0;
|
|
1205
|
+
triggerClone
|
|
1206
|
+
.querySelectorAll('kbq-tag')
|
|
1207
|
+
.forEach((item) => (totalItemsWidth += this.getItemWidth(item)));
|
|
997
1208
|
triggerClone.remove();
|
|
998
|
-
return
|
|
1209
|
+
return { totalItemsWidth, visibleItems };
|
|
999
1210
|
}
|
|
1000
1211
|
buildTriggerClone() {
|
|
1001
1212
|
const triggerClone = this.trigger().nativeElement.cloneNode(true);
|
|
@@ -1018,11 +1229,23 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1018
1229
|
const marginRight = parseFloat(computedStyle.marginRight) || 0;
|
|
1019
1230
|
return width + marginLeft + marginRight + parseInt(SizeXxs);
|
|
1020
1231
|
}
|
|
1232
|
+
/** Whether the trigger's tags still agree with the selection about which nodes are disabled. */
|
|
1233
|
+
hasStaleTriggerValues() {
|
|
1234
|
+
const selected = this.selectionModel.selected;
|
|
1235
|
+
if (this.triggerValues.length !== selected.length)
|
|
1236
|
+
return false;
|
|
1237
|
+
const optionsByNode = this.renderedOptionsByNode();
|
|
1238
|
+
return selected.some((node, index) => this.triggerValues[index].disabled !== this.isNodeDisabled(node, optionsByNode));
|
|
1239
|
+
}
|
|
1021
1240
|
refreshTriggerValues() {
|
|
1241
|
+
const treeControl = this.tree().treeControl;
|
|
1242
|
+
const optionsByNode = this.renderedOptionsByNode();
|
|
1022
1243
|
this.triggerValues = this.selectionModel.selected.map((node) => ({
|
|
1023
|
-
value:
|
|
1024
|
-
viewValue:
|
|
1025
|
-
|
|
1244
|
+
value: treeControl.getValue(node),
|
|
1245
|
+
viewValue: treeControl.getViewValue(node),
|
|
1246
|
+
// `treeControl` alone would miss a node disabled through the option's own input and give it
|
|
1247
|
+
// a remove icon — one-by-one removal of exactly what the cleaner keeps.
|
|
1248
|
+
disabled: this.isNodeDisabled(node, optionsByNode)
|
|
1026
1249
|
}));
|
|
1027
1250
|
this.changeDetectorRef.detectChanges();
|
|
1028
1251
|
}
|
|
@@ -1031,42 +1254,76 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1031
1254
|
* found with the designated value, the select trigger is cleared.
|
|
1032
1255
|
*/
|
|
1033
1256
|
setSelectionByValue(value) {
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1257
|
+
// Restored rather than cleared: a value written while this one is applied must not end the outer write.
|
|
1258
|
+
const wasWritingValue = this.writingValue;
|
|
1259
|
+
this.writingValue = true;
|
|
1260
|
+
try {
|
|
1261
|
+
if (this.multiSelection && value) {
|
|
1262
|
+
if (!Array.isArray(value)) {
|
|
1263
|
+
throw getKbqSelectNonArrayValueError();
|
|
1264
|
+
}
|
|
1265
|
+
this.tree().setOptionsFromValues(value);
|
|
1266
|
+
this.sortValues();
|
|
1267
|
+
}
|
|
1268
|
+
else {
|
|
1269
|
+
this.tree().setOptionsFromValues([value]);
|
|
1037
1270
|
}
|
|
1038
|
-
this.tree().setOptionsFromValues(value);
|
|
1039
|
-
this.sortValues();
|
|
1040
1271
|
}
|
|
1041
|
-
|
|
1042
|
-
this.
|
|
1272
|
+
finally {
|
|
1273
|
+
this.writingValue = wasWritingValue;
|
|
1043
1274
|
}
|
|
1044
1275
|
this.changeDetectorRef.detectChanges();
|
|
1045
1276
|
}
|
|
1046
1277
|
initKeyManager() {
|
|
1047
1278
|
const tree = this.tree();
|
|
1048
|
-
|
|
1049
|
-
tree
|
|
1279
|
+
// The select routes every key itself and calls back into `tree.handleKeydown` for the parts it
|
|
1280
|
+
// delegates, so the tree must not also act on the same event from its own host listener.
|
|
1281
|
+
tree.ownsKeyboard = false;
|
|
1282
|
+
// `panelKeydownHandler` forwards every unhandled key to the tree's key manager, and the search
|
|
1283
|
+
// field sits inside the panel — so its query would otherwise drive the tree's type-ahead.
|
|
1284
|
+
tree.typeAhead = !this.search();
|
|
1050
1285
|
tree.keyManager.change.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
1051
1286
|
const treeValue = this.tree();
|
|
1052
|
-
if (this.
|
|
1287
|
+
if (this.panelOpenValue() && this.panel()) {
|
|
1053
1288
|
this.scrollActiveOptionIntoView();
|
|
1054
1289
|
}
|
|
1055
|
-
else if (!this.
|
|
1290
|
+
else if (!this.panelOpenValue() &&
|
|
1291
|
+
!this.multiSelection &&
|
|
1292
|
+
treeValue.keyManager.activeItem &&
|
|
1293
|
+
// The active option follows a written value, or the selection the tree re-pointed at reloaded data;
|
|
1294
|
+
// selecting it again would report it as the user's.
|
|
1295
|
+
!this.writingValue &&
|
|
1296
|
+
!treeValue.syncingSelection) {
|
|
1056
1297
|
treeValue.keyManager.activeItem.selectViaInteraction();
|
|
1057
1298
|
}
|
|
1058
1299
|
});
|
|
1059
1300
|
}
|
|
1060
|
-
/**
|
|
1301
|
+
/**
|
|
1302
|
+
* Sorts the selected nodes by their order in the panel, collapsed branches included, or with `sortComparator`.
|
|
1303
|
+
* A node missing from the data sorts after every node in it.
|
|
1304
|
+
*/
|
|
1061
1305
|
sortValues() {
|
|
1062
|
-
if (this.multiSelection)
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
this.stateChanges.next();
|
|
1306
|
+
if (!this.multiSelection)
|
|
1307
|
+
return;
|
|
1308
|
+
const nodes = this.tree().treeControl.dataNodes ?? [];
|
|
1309
|
+
const sortComparator = this.sortComparator();
|
|
1310
|
+
if (sortComparator) {
|
|
1311
|
+
this.selectionModel.sort((a, b) => sortComparator(a, b, nodes));
|
|
1069
1312
|
}
|
|
1313
|
+
else {
|
|
1314
|
+
// Indexed once: `indexOf` in the comparator would scan the whole data set on every comparison.
|
|
1315
|
+
const order = new Map(nodes.map((node, index) => [node, index]));
|
|
1316
|
+
const indexOf = (node) => order.get(node) ?? nodes.length;
|
|
1317
|
+
this.selectionModel.sort((a, b) => indexOf(a) - indexOf(b));
|
|
1318
|
+
}
|
|
1319
|
+
this.syncSelectionState();
|
|
1320
|
+
// The tags were built while the model emitted, ahead of the sort.
|
|
1321
|
+
this.refreshTriggerValues();
|
|
1322
|
+
}
|
|
1323
|
+
/** Mirrors the selection into the `value` and `empty` signals. */
|
|
1324
|
+
syncSelectionState() {
|
|
1325
|
+
this.emptyValue.set(this.selectionModel.isEmpty());
|
|
1326
|
+
this.valueState.set(this.selectedValues);
|
|
1070
1327
|
}
|
|
1071
1328
|
/**
|
|
1072
1329
|
* Highlights the selected item. If no option is selected, it will highlight
|
|
@@ -1092,19 +1349,29 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1092
1349
|
scrollActiveOptionIntoView() {
|
|
1093
1350
|
this.tree().keyManager.activeItem?.focus();
|
|
1094
1351
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1352
|
+
/**
|
|
1353
|
+
* Keeps `isEmptySearchResult` in step with the search field.
|
|
1354
|
+
*
|
|
1355
|
+
* The flag is read back once the tree has had the chance to re-render for the new query. Waiting on
|
|
1356
|
+
* the rendered set alone is not enough: a query that filters nothing out leaves the option list —
|
|
1357
|
+
* and therefore its `changes` — silent, and the flag kept answering for the query before it. The
|
|
1358
|
+
* timer is the floor that covers that case.
|
|
1359
|
+
*/
|
|
1360
|
+
subscribeOnSearchChanges(tree, search) {
|
|
1361
|
+
const ngControl = search.ngControl;
|
|
1362
|
+
const valueChanges = ngControl?.valueChanges;
|
|
1363
|
+
if (!ngControl || !valueChanges)
|
|
1098
1364
|
return;
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1365
|
+
// Seeded rather than piped through `startWith`, which would open the gate below — and with it a
|
|
1366
|
+
// timer — before the user has typed anything.
|
|
1367
|
+
this.isEmptySearchResult = !!ngControl.value && tree.isEmpty;
|
|
1368
|
+
return valueChanges.pipe(audit(() => merge(tree.unorderedOptions.changes, timer(0)))).subscribe((value) => {
|
|
1369
|
+
this.isEmptySearchResult = !!value && tree.isEmpty;
|
|
1103
1370
|
this.changeDetectorRef.markForCheck();
|
|
1104
1371
|
});
|
|
1105
1372
|
}
|
|
1106
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1107
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1373
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1374
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqTreeSelect, isStandalone: true, selector: "kbq-tree-select", inputs: { hiddenItemsText: { classPropertyName: "hiddenItemsText", publicName: "hiddenItemsText", isSignal: true, isRequired: false, transformFunction: null }, hiddenItemsTextFormatter: { classPropertyName: "hiddenItemsTextFormatter", publicName: "hiddenItemsTextFormatter", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, backdropClass: { classPropertyName: "backdropClass", publicName: "backdropClass", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, sortComparator: { classPropertyName: "sortComparator", publicName: "sortComparator", isSignal: true, isRequired: false, transformFunction: null }, clearPredicate: { classPropertyName: "clearPredicate", publicName: "clearPredicate", isSignal: true, isRequired: false, transformFunction: null }, multiline: { classPropertyName: "multiline", publicName: "multiline", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multipleInput: { classPropertyName: "multipleInput", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, autoSelectInput: { classPropertyName: "autoSelectInput", publicName: "autoSelect", isSignal: true, isRequired: false, transformFunction: null }, selectAllToggle: { classPropertyName: "selectAllToggle", publicName: "selectAllToggle", isSignal: true, isRequired: false, transformFunction: null }, selectAll: { classPropertyName: "selectAll", publicName: "selectAll", isSignal: true, isRequired: false, transformFunction: null }, idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, hasBackdrop: { classPropertyName: "hasBackdrop", publicName: "hasBackdrop", isSignal: true, isRequired: false, transformFunction: null }, tabIndexInput: { classPropertyName: "tabIndexInput", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selectAllHandlerInput: { classPropertyName: "selectAllHandlerInput", publicName: "selectAllHandler", isSignal: true, isRequired: false, transformFunction: null }, panelMinWidth: { classPropertyName: "panelMinWidth", publicName: "panelMinWidth", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxWidth: { classPropertyName: "panelMaxWidth", publicName: "panelMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, panelMaxHeight: { classPropertyName: "panelMaxHeight", publicName: "panelMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, searchMinOptionsThresholdInput: { classPropertyName: "searchMinOptionsThresholdInput", publicName: "searchMinOptionsThreshold", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openedChangeOutput: "openedChange", openedOutput: "opened", closedOutput: "closed", selectionChange: "selectionChange", onSelectAll: "onSelectAll" }, host: { attributes: { "role": "combobox" }, listeners: { "click": "handleClick()", "keydown": "handleKeydown($event)", "focus": "onFocus()", "blur": "onBlur()" }, properties: { "class.kbq-select_multiple": "multiple", "class.kbq-select_multiline": "multiline()", "class.kbq-disabled": "disabledClass()", "class.kbq-invalid": "invalidClass()", "attr.id": "id()", "attr.aria-expanded": "panelOpen", "attr.aria-controls": "panelOpen ? panelId : null", "attr.aria-label": "ariaLabelText", "attr.aria-labelledby": "resolvedAriaLabelledby()", "attr.aria-invalid": "errorState()", "attr.aria-required": "required()", "attr.aria-disabled": "disabled() || null", "attr.tabindex": "tabIndex", "attr.disabled": "disabledAttribute()" }, classAttribute: "kbq-tree-select" }, providers: [
|
|
1108
1375
|
{ provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
|
|
1109
1376
|
kbqCleanerFactoryProvider((() => {
|
|
1110
1377
|
const treeSelect = inject(KbqTreeSelect);
|
|
@@ -1112,22 +1379,16 @@ class KbqTreeSelect extends KbqAbstractSelect {
|
|
|
1112
1379
|
get control() {
|
|
1113
1380
|
return treeSelect;
|
|
1114
1381
|
},
|
|
1115
|
-
get keydownTarget() {
|
|
1116
|
-
return treeSelect.elementRef.nativeElement;
|
|
1117
|
-
},
|
|
1118
1382
|
clearByEscape: false,
|
|
1119
|
-
clear: (() => treeSelect.clear())
|
|
1383
|
+
clear: (() => treeSelect.clear()),
|
|
1384
|
+
canClear: (() => treeSelect.canClear)
|
|
1120
1385
|
};
|
|
1121
1386
|
})),
|
|
1122
|
-
{ provide: KbqTree, useExisting: KbqTreeSelect },
|
|
1123
1387
|
{ provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
|
|
1124
1388
|
kbqSiblingPopupProvider(KbqTreeSelect)
|
|
1125
|
-
], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "tags", predicate: KbqTag, descendants: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{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)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i1.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]" }, { 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: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "value", "selectable", "removable", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
|
|
1126
|
-
kbqSelectAnimations.transformPanel,
|
|
1127
|
-
kbqSelectAnimations.fadeInContent
|
|
1128
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1389
|
+
], queries: [{ propertyName: "cleaner", first: true, predicate: KbqCleaner, isSignal: true }, { propertyName: "customTrigger", first: true, predicate: KbqSelectTrigger, descendants: true, isSignal: true }, { propertyName: "customMatcher", first: true, predicate: KbqSelectMatcher, descendants: true, isSignal: true }, { propertyName: "customTagTemplateRef", first: true, predicate: ["kbqSelectTagContent"], descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "tree", first: true, predicate: KbqTreeSelection, descendants: true, isSignal: true }, { propertyName: "search", first: true, predicate: KbqSelectSearch, descendants: true, isSignal: true }, { propertyName: "noOptionsMessage", first: true, predicate: KbqSelectNoOptions, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "optionsContainer", first: true, predicate: ["optionsContainer"], descendants: true, isSignal: true }, { propertyName: "scrollbarViewport", first: true, predicate: KbqScrollbarViewport, descendants: true, isSignal: true }, { propertyName: "overlayDirQuery", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "tagsQuery", predicate: KbqTag, descendants: true, isSignal: true }], exportAs: ["kbqTreeSelect"], usesInheritance: true, hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{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)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i2.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqTagRemove, selector: "[kbqTagRemove]", inputs: ["aria-label", "tabIndex"] }, { 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: "directive", type: CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: KbqTag, selector: "kbq-tag, [kbq-tag], kbq-basic-tag, [kbq-basic-tag]", inputs: ["editable", "preventEditSubmit", "selected", "selectable", "removable", "value", "tabindex", "disabled"], outputs: ["editChange", "selectionChange", "destroyed", "removed"], exportAs: ["kbqTag"] }, { kind: "directive", type: KbqScrollbarViewport, selector: "[kbqScrollbarViewport]", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1129
1390
|
}
|
|
1130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1391
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelect, decorators: [{
|
|
1131
1392
|
type: Component,
|
|
1132
1393
|
args: [{ selector: 'kbq-tree-select', imports: [
|
|
1133
1394
|
CdkOverlayOrigin,
|
|
@@ -1136,6 +1397,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
1136
1397
|
CdkConnectedOverlay,
|
|
1137
1398
|
CdkMonitorFocus,
|
|
1138
1399
|
KbqTag,
|
|
1400
|
+
KbqScrollbarViewport,
|
|
1139
1401
|
NgTemplateOutlet
|
|
1140
1402
|
], providers: [
|
|
1141
1403
|
{ provide: KbqFormFieldControl, useExisting: KbqTreeSelect },
|
|
@@ -1145,130 +1407,114 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
1145
1407
|
get control() {
|
|
1146
1408
|
return treeSelect;
|
|
1147
1409
|
},
|
|
1148
|
-
get keydownTarget() {
|
|
1149
|
-
return treeSelect.elementRef.nativeElement;
|
|
1150
|
-
},
|
|
1151
1410
|
clearByEscape: false,
|
|
1152
|
-
clear: (() => treeSelect.clear())
|
|
1411
|
+
clear: (() => treeSelect.clear()),
|
|
1412
|
+
canClear: (() => treeSelect.canClear)
|
|
1153
1413
|
};
|
|
1154
1414
|
})),
|
|
1155
|
-
{ provide: KbqTree, useExisting: KbqTreeSelect },
|
|
1156
1415
|
{ provide: KBQ_PARENT_POPUP, useExisting: KbqTreeSelect },
|
|
1157
1416
|
kbqSiblingPopupProvider(KbqTreeSelect)
|
|
1158
1417
|
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
1159
1418
|
class: 'kbq-tree-select',
|
|
1160
1419
|
'[class.kbq-select_multiple]': 'multiple',
|
|
1161
1420
|
'[class.kbq-select_multiline]': 'multiline()',
|
|
1162
|
-
'[class.kbq-disabled]': '
|
|
1163
|
-
'[class.kbq-invalid]': '
|
|
1421
|
+
'[class.kbq-disabled]': 'disabledClass()',
|
|
1422
|
+
'[class.kbq-invalid]': 'invalidClass()',
|
|
1423
|
+
// The tree-select is not a native control, so its combobox semantics, its accessible name and
|
|
1424
|
+
// its invalid/required/disabled states all have to be exposed explicitly.
|
|
1425
|
+
//
|
|
1426
|
+
// No `aria-haspopup` here: the panel carries no `role="tree"` yet, and announcing a popup that
|
|
1427
|
+
// the assistive technology then cannot find is worse than announcing none — the same call
|
|
1428
|
+
// `KbqDropdownTrigger` made. Add it together with the tree roles.
|
|
1429
|
+
//
|
|
1430
|
+
// No `aria-activedescendant` either: it is only read off the element that HAS the focus, and this
|
|
1431
|
+
// control moves the focus into the panel — onto the option, or into the projected search field —
|
|
1432
|
+
// for as long as the panel is open. It can only start telling the truth once the option highlight
|
|
1433
|
+
// stops being driven by real DOM focus (`KbqTreeOption` paints `kbq-focused` from `hasFocus`),
|
|
1434
|
+
// which is `@koobiq/components/tree`'s call to make.
|
|
1435
|
+
role: 'combobox',
|
|
1436
|
+
'[attr.id]': 'id()',
|
|
1437
|
+
'[attr.aria-expanded]': 'panelOpen',
|
|
1438
|
+
'[attr.aria-controls]': 'panelOpen ? panelId : null',
|
|
1439
|
+
'[attr.aria-label]': 'ariaLabelText',
|
|
1440
|
+
'[attr.aria-labelledby]': 'resolvedAriaLabelledby()',
|
|
1441
|
+
'[attr.aria-invalid]': 'errorState()',
|
|
1442
|
+
'[attr.aria-required]': 'required()',
|
|
1443
|
+
'[attr.aria-disabled]': 'disabled() || null',
|
|
1164
1444
|
'[attr.tabindex]': 'tabIndex',
|
|
1165
|
-
'[attr.disabled]': '
|
|
1445
|
+
'[attr.disabled]': 'disabledAttribute()',
|
|
1166
1446
|
'(click)': 'handleClick()',
|
|
1167
1447
|
'(keydown)': 'handleKeydown($event)',
|
|
1168
1448
|
'(focus)': 'onFocus()',
|
|
1169
1449
|
'(blur)': 'onBlur()'
|
|
1170
|
-
},
|
|
1171
|
-
|
|
1172
|
-
kbqSelectAnimations.fadeInContent
|
|
1173
|
-
], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track option) {\n <kbq-tag\n [color]=\"colorForState\"\n [disabled]=\"option.disabled || disabled\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled) {\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track option) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsTextFormatter(hiddenItemsText, hiddenItems) }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [class]=\"getPanelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n [style.transformOrigin]=\"transformOrigin\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div\n #optionsContainer\n class=\"kbq-tree-select__content kbq-scrollbar\"\n [@fadeInContent]=\"'showing'\"\n (@fadeInContent.done)=\"panelDoneAnimatingStream.next($event.toState)\"\n >\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-form-field-appearance-fill .kbq-tree-select .kbq-select__arrow-wrapper,.kbq-form-field-appearance-standard .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-50%)}.kbq-form-field-appearance-outline .kbq-tree-select .kbq-select__arrow-wrapper{transform:translateY(-25%)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-form-field-type-select:not(.kbq-disabled) .kbq-form-field-flex{cursor:pointer}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid,.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-control_has-validate-directive.ng-invalid .kbq-select__placeholder,.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select,.kbq-tree-select__panel{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)}\n", ".kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n", ".kbq-select,.kbq-tree-select,.kbq-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius);--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}\n"] }]
|
|
1174
|
-
}], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], overlayDir: [{
|
|
1175
|
-
type: ViewChild,
|
|
1176
|
-
args: [CdkConnectedOverlay, { static: false }]
|
|
1177
|
-
}], tags: [{
|
|
1178
|
-
type: ViewChildren,
|
|
1179
|
-
args: [KbqTag]
|
|
1180
|
-
}], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], hiddenItemsText: [{
|
|
1181
|
-
type: Input
|
|
1182
|
-
}], openedChange: [{
|
|
1183
|
-
type: Output
|
|
1184
|
-
}], openedStream: [{
|
|
1185
|
-
type: Output,
|
|
1186
|
-
args: ['opened']
|
|
1187
|
-
}], closedStream: [{
|
|
1188
|
-
type: Output,
|
|
1189
|
-
args: ['closed']
|
|
1190
|
-
}], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], errorStateMatcher: [{
|
|
1191
|
-
type: Input
|
|
1192
|
-
}], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{
|
|
1193
|
-
type: Input
|
|
1194
|
-
}], required: [{
|
|
1195
|
-
type: Input
|
|
1196
|
-
}], multiple: [{
|
|
1197
|
-
type: Input,
|
|
1198
|
-
args: [{ transform: booleanAttribute }]
|
|
1199
|
-
}], autoSelect: [{
|
|
1200
|
-
type: Input
|
|
1201
|
-
}], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], id: [{
|
|
1202
|
-
type: Input
|
|
1203
|
-
}], hasBackdrop: [{
|
|
1204
|
-
type: Input
|
|
1205
|
-
}], tabIndex: [{
|
|
1206
|
-
type: Input
|
|
1207
|
-
}], disabled: [{
|
|
1208
|
-
type: Input,
|
|
1209
|
-
args: [{ transform: booleanAttribute }]
|
|
1210
|
-
}], selectAllHandler: [{
|
|
1211
|
-
type: Input
|
|
1212
|
-
}], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThreshold: [{
|
|
1213
|
-
type: Input
|
|
1214
|
-
}], hiddenItemsTextFormatter: [{
|
|
1215
|
-
type: Input
|
|
1216
|
-
}] } });
|
|
1450
|
+
}, hostDirectives: [
|
|
1451
|
+
{ directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
|
|
1452
|
+
], exportAs: 'kbqTreeSelect', template: "<div\n #fallbackOverlayOrigin=\"cdkOverlayOrigin\"\n #trigger\n cdkOverlayOrigin\n class=\"kbq-select__trigger\"\n [class.kbq-select__trigger_empty]=\"empty()\"\n [class.kbq-select__trigger_multiline]=\"multiline()\"\n [class.kbq-select__trigger_multiple]=\"multiple\"\n [class.kbq-select__trigger_single]=\"!multiple\"\n>\n @if (!!customMatcher()) {\n <ng-content select=\"kbq-select-matcher, [kbq-select-matcher]\" />\n } @else {\n <div class=\"kbq-select__matcher\">\n @if (empty()) {\n <span class=\"kbq-select__placeholder\">\n {{ placeholder() || '\\u00A0' }}\n </span>\n } @else {\n @if (!!customTrigger()) {\n <ng-content select=\"kbq-select-trigger, [kbq-select-trigger]\" />\n } @else {\n <div class=\"kbq-select__match-container\">\n @if (multiSelection) {\n <div\n #multilineMatchList\n [class.kbq-select__match-list]=\"!multiline()\"\n [class.kbq-select__multiline-match-list]=\"multiline()\"\n >\n @if (!customTagTemplateRef()) {\n @for (option of triggerValues; track $index) {\n <kbq-tag\n [color]=\"colorForState()\"\n [disabled]=\"option.disabled || disabled()\"\n [selectable]=\"false\"\n >\n {{ option.viewValue }}\n @if (!option.disabled && !disabled()) {\n <!--\n `tabIndex` defaults to -1, because inside a tag list\n the tag itself is the tab stop. Here the tag stands on\n its own in the trigger, so the control has to opt in or\n it is left mouse-only.\n -->\n <i\n kbq-icon=\"kbq-xmark-s_16\"\n kbqTagRemove\n [tabIndex]=\"0\"\n (click)=\"onRemoveSelectedOption(option, $event)\"\n ></i>\n }\n </kbq-tag>\n }\n } @else {\n @for (option of triggerValues; track $index) {\n <ng-container\n [ngTemplateOutlet]=\"customTagTemplateRef()\"\n [ngTemplateOutletContext]=\"{ $implicit: option, select: this }\"\n />\n }\n }\n </div>\n } @else {\n <span class=\"kbq-select__matcher-text\">\n {{ triggerValue }}\n </span>\n }\n @if (!multiline()) {\n <div\n class=\"kbq-select__match-hidden-text\"\n [style.display]=\"hiddenItems() > 0 ? 'block' : 'none'\"\n >\n {{ hiddenItemsLabel() }}\n </div>\n }\n </div>\n }\n }\n\n @if (canShowCleaner) {\n <div class=\"kbq-select__cleaner\">\n <ng-content select=\"kbq-cleaner\" />\n </div>\n }\n\n <div class=\"kbq-select__arrow-wrapper\">\n <i kbq-icon=\"kbq-chevron-down-s_16\" class=\"kbq-select__arrow\" [color]=\"colorForState()\"></i>\n </div>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayLockPosition\n [cdkConnectedOverlayBackdropClass]=\"backdropClass()\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop()\"\n [cdkConnectedOverlayMinWidth]=\"overlayMinWidth\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin || fallbackOverlayOrigin\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClass\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"viewportMargin\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (attach)=\"onAttached()\"\n (backdropClick)=\"close()\"\n>\n <div\n #panel\n cdkMonitorSubtreeFocus\n [attr.id]=\"panelId\"\n [class]=\"panelClasses()\"\n [style.--kbq-select-panel-size-max-height]=\"panelMaxHeightToken()\"\n [style.font-size.px]=\"triggerFontSize\"\n [style.max-width.px]=\"panelMaxWidth()\"\n (keydown)=\"panelKeydownHandler($event)\"\n >\n @if (search() && shouldShowSearch()) {\n <div class=\"kbq-select__search-container\">\n <ng-content select=\"[kbqSelectSearch]\" />\n </div>\n }\n\n <div #optionsContainer kbqScrollbarViewport class=\"kbq-tree-select__content\">\n @if (isEmptySearchResult) {\n <ng-content select=\"[kbq-select-search-empty-result]\" />\n }\n\n <ng-content select=\"kbq-select-no-options, [kbq-select-no-options]\" />\n\n <ng-content select=\"kbq-tree-selection\" />\n </div>\n\n <ng-content select=\"kbq-select-footer,[kbq-tree-select-footer]\" />\n </div>\n</ng-template>\n", styles: [".kbq-tree-select{box-sizing:border-box;display:inline-block;width:100%;outline:none}.kbq-tree-select .kbq-select__trigger{display:flex;box-sizing:border-box;position:relative;cursor:pointer;min-height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline),.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty{height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-border-width) * 2)}.kbq-tree-select .kbq-select__trigger:not(.kbq-select__trigger_multiline) .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_empty .kbq-select__matcher{overflow:hidden;white-space:nowrap}.kbq-tree-select .kbq-select__matcher{-webkit-user-select:none;user-select:none;display:flex;flex-grow:1;align-items:center}.kbq-tree-select .kbq-select__matcher>span{flex:1;overflow:hidden}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_single .kbq-select__matcher,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple.kbq-select__trigger_empty .kbq-select__matcher{padding:var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-right) var(--kbq-select-size-single-padding-vertical) var(--kbq-select-size-single-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher{padding:var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-right) var(--kbq-select-size-multiple-padding-vertical) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-container{display:flex}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiple:not(.kbq-select__trigger_empty) .kbq-select__matcher .kbq-select__match-list{display:flex;flex-wrap:wrap;overflow:hidden;height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);max-height:calc(var(--kbq-form-field-size-height) - var(--kbq-select-size-multiple-padding-vertical) * 2);gap:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs))}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__match-container{flex-direction:column}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__matcher{max-width:100%;padding:calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-right) calc(var(--kbq-select-size-multiple-padding-vertical) - var(--kbq-size-border-width)) var(--kbq-select-size-multiple-padding-left)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__cleaner,.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__arrow-wrapper{align-self:flex-start;align-items:center;height:calc(var(--kbq-form-field-size-height) - var(--kbq-size-s));min-width:var(--kbq-form-field-size-addon-width)}.kbq-tree-select .kbq-select__trigger.kbq-select__trigger_multiline:not(.kbq-select__trigger_empty) .kbq-select__multiline-match-list{display:flex;flex-direction:row;flex-wrap:wrap;margin-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));gap:var(--kbq-size-xxs)}.kbq-tree-select .kbq-select__match-container{width:100%;text-overflow:ellipsis;overflow:hidden}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text{box-sizing:content-box;display:none;flex:0 0 var(--kbq-form-field-size-addon-width);align-self:center;padding-left:var(--kbq-size-xxs);padding-right:var(--kbq-select-size-multiple-content-gap, var(--kbq-size-xxs));text-align:right}.kbq-tree-select .kbq-select__match-container .kbq-select__match-hidden-text.kbq-select__match-hidden-text_visible{display:block}.kbq-tree-select kbq-select-trigger,.kbq-tree-select [kbq-select-trigger]{width:100%}.kbq-tree-select .kbq-select__arrow-wrapper{display:flex;align-self:center;justify-content:center;min-width:var(--kbq-form-field-size-addon-width)}.kbq-disabled.kbq-tree-select .kbq-select__trigger{-webkit-user-select:none;user-select:none;cursor:default}.kbq-tree-select__panel{min-width:100%;max-width:var(--kbq-panel-size-width-max, 640px);overflow:hidden;border-radius:var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius))}@supports (corner-shape: squircle){.kbq-tree-select__panel{corner-shape:squircle;border-radius:clamp(var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 1.85,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2.3 - 3.6px,var(--kbq-select-panel-size-border-radius, var(--kbq-size-border-radius)) * 2)}}.kbq-tree-select__panel .kbq-option{font-size:inherit}.kbq-tree-select__panel .kbq-select__no-options-message{-webkit-user-select:none;user-select:none;display:flex;flex-direction:row;align-items:center;justify-content:center;box-sizing:border-box;position:relative;margin-bottom:var(--kbq-size-3xl);margin-top:var(--kbq-size-3xl);max-width:100%;height:var(--kbq-option-size-height, var(--kbq-size-3xl));cursor:default;outline:none;padding-left:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));padding-right:var(--kbq-option-size-horizontal-padding, var(--kbq-size-m));border:var(--kbq-option-size-border-width, var(--kbq-size-3xs)) solid transparent}.kbq-tree-select__panel .kbq-select__search-container{padding:var(--kbq-size-xxs);border-bottom-width:1px;border-bottom-style:solid}.kbq-tree-select__content{box-sizing:initial;max-height:var(--kbq-select-panel-size-max-height, 256px);padding:var(--kbq-size-xxs);overflow:hidden auto}.kbq-tree-select__panel .kbq-select__footer{-webkit-user-select:none;user-select:none;display:flex;align-items:center;box-sizing:border-box;min-height:var(--kbq-select-footer-size-min-height, var(--kbq-size-4xl));border-top-width:var(--kbq-select-footer-size-border-width, var(--kbq-size-border-width));border-top-style:solid;padding:var(--kbq-select-footer-size-padding-vertical, var(--kbq-size-xxs)) var(--kbq-select-footer-size-padding-horizontal, var(--kbq-size-l))}.kbq-tree-select__content .kbq-tree-selection{height:100%}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option{position:relative}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before,.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{position:absolute;content:\"\";width:var(--kbq-size-xxs);height:calc(100% + var(--kbq-size-3xs) * 2)}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:before{right:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select__content .kbq-tree-selection .kbq-tree-option:after{left:calc(100% + var(--kbq-size-3xs))}.kbq-tree-select{color:var(--kbq-foreground-contrast)}.kbq-tree-select.kbq-invalid{color:var(--kbq-foreground-error)}.kbq-tree-select.kbq-invalid .kbq-select__placeholder{color:var(--kbq-form-field-states-error-placeholder)}.kbq-tree-select.kbq-disabled{color:var(--kbq-states-foreground-disabled)}.kbq-tree-select.kbq-disabled .kbq-select__placeholder{color:var(--kbq-form-field-states-disabled-placeholder)}.kbq-select__placeholder{text-overflow:ellipsis;color:var(--kbq-form-field-default-placeholder)}.kbq-select__search-container{border-bottom-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-select__no-options-message{color:var(--kbq-foreground-contrast-secondary)}.kbq-tree-select__panel{box-shadow:var(--kbq-select-panel-dropdown-shadow);background:var(--kbq-select-panel-dropdown-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-default-container-background);background:var(--kbq-tree-default-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-default-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-default-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-default-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused{--kbq-option-background: var(--kbq-tree-states-hover-container-background);background:var(--kbq-tree-states-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-text{color:var(--kbq-tree-states-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-active-container-background);background:var(--kbq-tree-states-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused){--kbq-option-background: var(--kbq-tree-states-selected-container-background);background:var(--kbq-tree-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-text,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-text{color:var(--kbq-tree-states-selected-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:hover:not(.kbq-focused) .kbq-option-caption,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-hovered:not(.kbq-focused) .kbq-option-caption{color:var(--kbq-tree-states-selected-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused{--kbq-option-background: var(--kbq-tree-states-selected-hover-container-background);background:var(--kbq-tree-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-text{color:var(--kbq-tree-states-selected-hover-text-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-action .kbq-icon.kbq-empty{color:var(--kbq-tree-states-selected-hover-action-button-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-focused .kbq-option-caption{color:var(--kbq-tree-states-selected-hover-caption-color)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-states-selected-active-container-background);background:var(--kbq-tree-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-hovered:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:hover:not(.kbq-focused),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-hovered:not(.kbq-focused){background:var(--kbq-tree-multiple-states-selected-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-focused,.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-focused{background:var(--kbq-tree-multiple-states-selected-hover-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected):active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-checked:not(.kbq-selected).kbq-active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected:active:not(.kbq-disabled),.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-tree-option_multiple.kbq-selected.kbq-active:not(.kbq-disabled){--kbq-option-background: var(--kbq-tree-multiple-states-selected-active-container-background);background:var(--kbq-tree-multiple-states-selected-active-container-background)}.kbq-tree-select__panel .kbq-tree-selection .kbq-tree-option:not(.kbq-disabled).kbq-focused:not(.kbq-action-button-focused){border-color:transparent}.kbq-tree-select__panel .kbq-select__footer{border-color:var(--kbq-divider-color, var(--kbq-line-contrast-less))}.kbq-tree-select,.kbq-tree-select__panel{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)}\n", ".kbq-tree-select,.kbq-tree-select__panel{--kbq-select-size-single-padding-left: 0;--kbq-select-size-single-padding-right: 0;--kbq-select-size-single-padding-vertical: var(--kbq-size-xs);--kbq-select-size-single-content-gap: var(--kbq-size-xxs);--kbq-select-size-multiple-padding-left: 0;--kbq-select-size-multiple-padding-right: 0;--kbq-select-size-multiple-padding-vertical: var(--kbq-size-xxs);--kbq-select-size-multiple-content-gap: var(--kbq-size-xxs);--kbq-select-panel-size-border-radius: var(--kbq-size-border-radius)}.kbq-tree-select__panel{--kbq-select-panel-dropdown-background: var(--kbq-background-card);--kbq-select-panel-dropdown-shadow: var(--kbq-shadow-popup)}.kbq-tree-select__panel .kbq-tree-selection{--kbq-tree-option-border-radius: var(--kbq-size-xs)}\n"] }]
|
|
1453
|
+
}], ctorParameters: () => [], propDecorators: { trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], optionsContainer: [{ type: i0.ViewChild, args: ['optionsContainer', { isSignal: true }] }], scrollbarViewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqScrollbarViewport), { isSignal: true }] }], overlayDirQuery: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], tagsQuery: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => KbqTag), { isSignal: true }] }], cleaner: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCleaner), { ...{ descendants: false }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectTrigger), { isSignal: true }] }], customMatcher: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectMatcher), { isSignal: true }] }], customTagTemplateRef: [{ type: i0.ContentChild, args: ['kbqSelectTagContent', { ...{ read: TemplateRef }, isSignal: true }] }], tree: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqTreeSelection), { isSignal: true }] }], search: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectSearch), { isSignal: true }] }], noOptionsMessage: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqSelectNoOptions), { isSignal: true }] }], hiddenItemsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsText", required: false }] }], hiddenItemsTextFormatter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenItemsTextFormatter", required: false }] }], openedChangeOutput: [{ type: i0.Output, args: ["openedChange"] }], openedOutput: [{ type: i0.Output, args: ["opened"] }], closedOutput: [{ type: i0.Output, args: ["closed"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], onSelectAll: [{ type: i0.Output, args: ["onSelectAll"] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], backdropClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClass", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], sortComparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortComparator", required: false }] }], clearPredicate: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearPredicate", required: false }] }], multiline: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiline", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multipleInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], autoSelectInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoSelect", required: false }] }], selectAllToggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllToggle", required: false }] }], selectAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAll", required: false }] }], idInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], tabIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selectAllHandlerInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllHandler", required: false }] }], panelMinWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMinWidth", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelMaxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxWidth", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], searchMinOptionsThresholdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchMinOptionsThreshold", required: false }] }] } });
|
|
1217
1454
|
|
|
1455
|
+
/**
|
|
1456
|
+
* The module declares nothing — `KbqTreeSelect` is standalone and brings its own imports — so the
|
|
1457
|
+
* entries below are here either to be re-exported or for the providers they carry (`OverlayModule`,
|
|
1458
|
+
* `KbqTagsModule`, `KbqTreeModule`).
|
|
1459
|
+
*/
|
|
1218
1460
|
class KbqTreeSelectModule {
|
|
1219
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1220
|
-
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
1461
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1462
|
+
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
|
|
1221
1463
|
KbqTreeModule,
|
|
1222
|
-
KbqIconModule,
|
|
1223
1464
|
KbqTagsModule,
|
|
1224
|
-
KbqPseudoCheckboxModule,
|
|
1225
1465
|
KbqSelectSearch,
|
|
1226
1466
|
KbqSelectFooter,
|
|
1227
1467
|
KbqSelectMatcher,
|
|
1228
1468
|
KbqSelectTrigger,
|
|
1229
1469
|
KbqSelectSearchEmptyResult,
|
|
1230
|
-
|
|
1231
|
-
A11yModule,
|
|
1470
|
+
KbqSelectNoOptions,
|
|
1232
1471
|
KbqTreeSelect], exports: [KbqTreeSelect,
|
|
1472
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1473
|
+
// gives a consumer a control they cannot fill.
|
|
1474
|
+
KbqTreeModule,
|
|
1233
1475
|
KbqSelectSearch,
|
|
1234
1476
|
KbqSelectFooter,
|
|
1235
1477
|
KbqSelectMatcher,
|
|
1236
1478
|
KbqSelectTrigger,
|
|
1237
1479
|
KbqSelectSearchEmptyResult,
|
|
1480
|
+
KbqSelectNoOptions,
|
|
1238
1481
|
KbqFormFieldModule] }); }
|
|
1239
|
-
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
1482
|
+
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, imports: [OverlayModule,
|
|
1240
1483
|
KbqTreeModule,
|
|
1241
|
-
KbqIconModule,
|
|
1242
1484
|
KbqTagsModule,
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1485
|
+
KbqSelectNoOptions,
|
|
1486
|
+
KbqTreeSelect,
|
|
1487
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1488
|
+
// gives a consumer a control they cannot fill.
|
|
1489
|
+
KbqTreeModule,
|
|
1490
|
+
KbqFormFieldModule] }); }
|
|
1246
1491
|
}
|
|
1247
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1492
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqTreeSelectModule, decorators: [{
|
|
1248
1493
|
type: NgModule,
|
|
1249
1494
|
args: [{
|
|
1250
1495
|
imports: [
|
|
1251
1496
|
OverlayModule,
|
|
1252
1497
|
KbqTreeModule,
|
|
1253
|
-
KbqIconModule,
|
|
1254
1498
|
KbqTagsModule,
|
|
1255
|
-
KbqPseudoCheckboxModule,
|
|
1256
1499
|
KbqSelectSearch,
|
|
1257
1500
|
KbqSelectFooter,
|
|
1258
1501
|
KbqSelectMatcher,
|
|
1259
1502
|
KbqSelectTrigger,
|
|
1260
1503
|
KbqSelectSearchEmptyResult,
|
|
1261
|
-
|
|
1262
|
-
A11yModule,
|
|
1504
|
+
KbqSelectNoOptions,
|
|
1263
1505
|
KbqTreeSelect
|
|
1264
1506
|
],
|
|
1265
1507
|
exports: [
|
|
1266
1508
|
KbqTreeSelect,
|
|
1509
|
+
// `kbq-tree-selection` content is mandatory, so importing the tree-select without the tree
|
|
1510
|
+
// gives a consumer a control they cannot fill.
|
|
1511
|
+
KbqTreeModule,
|
|
1267
1512
|
KbqSelectSearch,
|
|
1268
1513
|
KbqSelectFooter,
|
|
1269
1514
|
KbqSelectMatcher,
|
|
1270
1515
|
KbqSelectTrigger,
|
|
1271
1516
|
KbqSelectSearchEmptyResult,
|
|
1517
|
+
KbqSelectNoOptions,
|
|
1272
1518
|
KbqFormFieldModule
|
|
1273
1519
|
]
|
|
1274
1520
|
}]
|