@koobiq/components 21.0.0 → 21.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/badge/_badge-theme.scss +31 -0
- package/breadcrumbs/breadcrumbs.scss +5 -1
- package/checkbox/_checkbox-theme.scss +0 -17
- package/checkbox/checkbox-tokens.scss +0 -4
- package/code-block/_code-block-theme.scss +7 -6
- package/code-block/code-block-tokens.scss +8 -4
- package/code-block/code-block.scss +54 -32
- package/content-panel/content-panel-header.scss +2 -3
- package/content-panel/content-panel.scss +3 -0
- package/core/selection/pseudo-checkbox/pseudo-checkbox-tokens.scss +0 -2
- package/fesm2022/koobiq-components-accordion.mjs +4 -4
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +10 -2
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-app-switcher.mjs +1 -1
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
- package/fesm2022/koobiq-components-badge.mjs +2 -2
- package/fesm2022/koobiq-components-badge.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +2 -2
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +18 -8
- package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +78 -10
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +106 -394
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +4 -4
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +300 -37
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +151 -60
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-divider.mjs +3 -3
- package/fesm2022/koobiq-components-divider.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +3 -3
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +17 -8
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +124 -41
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-flag.mjs +3 -3
- package/fesm2022/koobiq-components-flag.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +90 -27
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +38 -17
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +19 -2
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
- package/fesm2022/koobiq-components-input.mjs +76 -17
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +1 -1
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +3 -3
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +86 -25
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +4 -4
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +116 -38
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +86 -7
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-radio.mjs +41 -19
- package/fesm2022/koobiq-components-radio.mjs.map +1 -1
- package/fesm2022/koobiq-components-search-expandable.mjs +29 -17
- package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +49 -12
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +198 -186
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter.mjs +49 -25
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +30 -11
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +1 -1
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +28 -11
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-time-range.mjs +2 -2
- package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs +71 -16
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +2 -2
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +2 -2
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +25 -9
- package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +90 -17
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-top-bar.mjs +27 -7
- package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +24 -9
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +288 -109
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/file-upload/_file-upload-theme.scss +0 -12
- package/file-upload/file-upload-tokens.scss +0 -1
- package/file-upload/file-upload.scss +0 -1
- package/filter-bar/_filter-bar-theme.scss +7 -8
- package/filter-bar/filter-bar.scss +0 -1
- package/filter-bar/pipes/base-pipe.scss +36 -2
- package/filter-bar/pipes/pipe-multi-tree-select.scss +27 -0
- package/form-field/_fieldset-theme.scss +2 -7
- package/form-field/_form-field-theme.scss +9 -22
- package/form-field/_hint-theme.scss +20 -0
- package/form-field/fieldset-tokens.scss +0 -1
- package/form-field/fieldset.scss +0 -3
- package/form-field/form-field-tokens.scss +1 -1
- package/form-field/form-field.scss +9 -0
- package/form-field/hint-tokens.scss +3 -0
- package/modal/modal.scss +2 -0
- package/navbar/_navbar-item_vertical.scss +48 -2
- package/navbar/_navbar-theme.scss +11 -3
- package/navbar/navbar-item.scss +17 -0
- package/navbar/navbar-tokens.scss +3 -0
- package/package.json +4 -4
- package/popover/popover.scss +1 -1
- package/radio/_radio-theme.scss +0 -30
- package/radio/radio-tokens.scss +0 -2
- package/schematics/collection.json +94 -89
- package/schematics/migrations/accordion-state-saving-default/{index.js → index.cjs} +5 -4
- package/schematics/migrations/actions-panel-overlay-container/{index.js → index.cjs} +5 -4
- package/schematics/migrations/alert-signals/{index.js → index.cjs} +14 -13
- package/schematics/migrations/angular-animations-removal/index.cjs +21 -0
- package/schematics/migrations/app-switcher-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/autocomplete-panel-width-auto/{index.js → index.cjs} +6 -5
- package/schematics/migrations/autocomplete-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/badge-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/button-state-and-styles/{index.js → index.cjs} +7 -6
- package/schematics/migrations/button-supported-colors/{index.js → index.cjs} +7 -6
- package/schematics/migrations/button-toggle-signals-and-aria/{index.js → index.cjs} +7 -6
- package/schematics/migrations/button-truncation/{index.js → index.cjs} +7 -6
- package/schematics/migrations/checkbox-signals/{index.js → index.cjs} +9 -8
- package/schematics/migrations/clamped-text-disclosure/{index.js → index.cjs} +5 -4
- 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/{index.js → index.cjs} +7 -6
- package/schematics/migrations/color-signals/index.cjs +20 -0
- package/schematics/migrations/core-mixins-removal/index.cjs +18 -0
- package/schematics/migrations/css-selectors/{index.js → index.cjs} +4 -3
- package/schematics/migrations/datepicker-signals/index.cjs +18 -0
- package/schematics/migrations/deprecated-icons/README.md +21 -5
- package/schematics/migrations/deprecated-icons/{index.js → index.cjs} +15 -28
- package/schematics/migrations/deprecated-icons/schema.json +1 -1
- package/schematics/migrations/design-tokens-v4/{index.js → index.cjs} +3 -2
- package/schematics/migrations/divider-signals-and-aria/{index.js → index.cjs} +5 -4
- package/schematics/migrations/dl-attribute-coercion/{index.js → index.cjs} +7 -6
- package/schematics/migrations/dl-standalone-names/{index.js → index.cjs} +11 -10
- package/schematics/migrations/dropdown-demote-overlay/{index.js → index.cjs} +7 -6
- package/schematics/migrations/dropdown-signals/index.cjs +20 -0
- package/schematics/migrations/empty-state-error-color/{index.js → index.cjs} +5 -4
- package/schematics/migrations/empty-state-size-attr/{index.js → index.cjs} +6 -5
- package/schematics/migrations/file-upload-cva-and-primitives/{index.js → index.cjs} +5 -4
- package/schematics/migrations/file-upload-deprecated-outputs/{index.js → index.cjs} +5 -4
- package/schematics/migrations/filter-bar-rename-action/{index.js → index.cjs} +5 -4
- package/schematics/migrations/filter-bar-signals/{index.js → index.cjs} +16 -15
- package/schematics/migrations/filter-bar-state-saving-default/{index.js → index.cjs} +5 -4
- package/schematics/migrations/flag-inner-html/{index.js → index.cjs} +5 -4
- package/schematics/migrations/form-field-signals/{index.js → index.cjs} +18 -17
- package/schematics/migrations/icon-semantics-and-api/{data.js → data.cjs} +4 -4
- package/schematics/migrations/icon-semantics-and-api/{index.js → index.cjs} +6 -5
- package/schematics/migrations/icons-replacement/README.md +16 -2
- package/schematics/migrations/icons-replacement/{index.js → index.cjs} +21 -18
- package/schematics/migrations/icons-replacement/schema.json +12 -3
- package/schematics/migrations/inline-edit-a11y-and-types/{index.js → index.cjs} +5 -4
- package/schematics/migrations/input-number-surface/{index.js → index.cjs} +5 -4
- package/schematics/migrations/input-signals/index.cjs +18 -0
- package/schematics/migrations/link-deprecated-path/{index.js → index.cjs} +4 -3
- package/schematics/migrations/link-signals/{index.js → index.cjs} +5 -4
- package/schematics/migrations/list-signals/index.cjs +18 -0
- package/schematics/migrations/list-tree-multiple-input/{index.js → index.cjs} +7 -6
- package/schematics/migrations/loader-overlay-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/loader-overlay-size-attr/{index.js → index.cjs} +6 -5
- package/schematics/migrations/locale-configuration-providers/{index.js → index.cjs} +5 -4
- package/schematics/migrations/mandatory-peer-dependencies/{index.js → index.cjs} +3 -2
- package/schematics/migrations/markdown-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/modal-dialog-semantics/{index.js → index.cjs} +5 -4
- package/schematics/migrations/modal-signals/index.cjs +20 -0
- package/schematics/migrations/navbar-signals-and-aria/{index.js → index.cjs} +7 -6
- package/schematics/migrations/new-icons-pack/README.md +37 -25
- package/schematics/migrations/new-icons-pack/{index.js → index.cjs} +29 -38
- package/schematics/migrations/new-icons-pack/replacement.json +2 -14
- package/schematics/migrations/new-icons-pack/schema.json +3 -3
- package/schematics/migrations/notification-center-signals/{index.js → index.cjs} +5 -4
- package/schematics/migrations/option-signals/index.cjs +20 -0
- package/schematics/migrations/popover-leave-delay/{index.js → index.cjs} +5 -4
- package/schematics/migrations/progress-bar-percentage-and-aria/{index.js → index.cjs} +5 -4
- package/schematics/migrations/progress-spinner-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/query-list-signals/index.cjs +18 -0
- package/schematics/migrations/radio-signals-and-aria/{index.js → index.cjs} +9 -8
- package/schematics/migrations/read-state-dwell-handlers/{index.js → index.cjs} +5 -4
- package/schematics/migrations/scrollbar-deprecated-path/{index.js → index.cjs} +4 -3
- package/schematics/migrations/select-signal-inputs/{index.js → index.cjs} +5 -4
- package/schematics/migrations/sidepanel-non-modal-behavior/{index.js → index.cjs} +5 -4
- package/schematics/migrations/signal-inputs-subclasses/index.cjs +18 -0
- package/schematics/migrations/split-button-optional-disabled/{index.js → index.cjs} +5 -4
- package/schematics/migrations/splitter-deprecated-path/{index.js → index.cjs} +4 -3
- package/schematics/migrations/state-saving-default/{index.js → index.cjs} +5 -4
- package/schematics/migrations/table-cell-content/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tabs-signals-and-aria/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tag-list-cleaner/{index.js → index.cjs} +7 -6
- package/schematics/migrations/tag-slots/{index.js → index.cjs} +6 -5
- package/schematics/migrations/tags-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/textarea-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/time-range-title-for/{index.js → index.cjs} +5 -4
- package/schematics/migrations/timepicker-signals/{index.js → index.cjs} +7 -6
- package/schematics/migrations/timezone-grouping-utils/{index.js → index.cjs} +5 -4
- package/schematics/migrations/title-encapsulation/{index.js → index.cjs} +5 -4
- package/schematics/migrations/toast-stack-and-defaults/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tooltip-pointer-events-and-types/{index.js → index.cjs} +5 -4
- package/schematics/migrations/top-bar-container-selectors/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tree-select-signals/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tree-signals/{index.js → index.cjs} +5 -4
- package/schematics/migrations/tree-state-saving-default/{index.js → index.cjs} +5 -4
- package/schematics/migrations/username-pipe-injection/{index.js → index.cjs} +5 -4
- package/schematics/migrations/v20-upgrade/{data.js → data.cjs} +7 -7
- package/schematics/migrations/v20-upgrade/index.cjs +19 -0
- package/schematics/migrations/v21-upgrade/{data.js → data.cjs} +22 -22
- package/schematics/migrations/v21-upgrade/{index.js → index.cjs} +11 -10
- package/schematics/migrations/zoneless-change-detection/index.cjs +21 -0
- package/schematics/migrations.json +87 -82
- package/schematics/ng-add/{index.js → index.cjs} +15 -289
- package/schematics/utils/{angular-parsing.js → angular-parsing.cjs} +2 -2
- package/schematics/utils/custom-data.cjs +64 -0
- package/schematics/utils/{deprecated-path-migration.js → deprecated-path-migration.cjs} +4 -3
- package/schematics/utils/html-config.cjs +148 -0
- package/schematics/utils/{icon-migration.js → icon-migration.cjs} +11 -5
- package/schematics/utils/list-item-pattern.cjs +16 -0
- package/schematics/utils/{messages.js → messages.cjs} +4 -0
- package/schematics/utils/package-config.cjs +99 -0
- 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/select/select.scss +7 -0
- package/tabs/_tabs-common.scss +23 -0
- package/textarea/textarea-tokens.scss +4 -1
- package/toast/toast.component.scss +1 -0
- package/toggle/_toggle-theme.scss +0 -17
- package/tooltip/tooltip.scss +1 -1
- package/top-bar/top-bar-tokens.scss +1 -0
- package/top-bar/top-bar.scss +10 -0
- package/types/koobiq-components-accordion.d.ts +25 -0
- package/types/koobiq-components-button-toggle.d.ts +6 -0
- package/types/koobiq-components-checkbox.d.ts +30 -0
- package/types/koobiq-components-clamped-text.d.ts +16 -3
- package/types/koobiq-components-code-block.d.ts +55 -14
- package/types/koobiq-components-core.d.ts +226 -13
- package/types/koobiq-components-datepicker.d.ts +28 -1
- package/types/koobiq-components-divider.d.ts +28 -10
- package/types/koobiq-components-dropdown.d.ts +19 -0
- package/types/koobiq-components-filter-bar.d.ts +79 -6
- package/types/koobiq-components-flag.d.ts +18 -0
- package/types/koobiq-components-form-field.d.ts +87 -6
- package/types/koobiq-components-icon.d.ts +15 -0
- package/types/koobiq-components-inline-edit.d.ts +8 -1
- package/types/koobiq-components-input.d.ts +22 -3
- package/types/koobiq-components-list.d.ts +6 -0
- package/types/koobiq-components-modal.d.ts +7 -0
- package/types/koobiq-components-navbar.d.ts +71 -7
- package/types/koobiq-components-notification-center.d.ts +13 -0
- package/types/koobiq-components-overflow-items.d.ts +26 -2
- package/types/koobiq-components-popover.d.ts +38 -3
- package/types/koobiq-components-radio.d.ts +30 -0
- package/types/koobiq-components-search-expandable.d.ts +10 -0
- package/types/koobiq-components-select.d.ts +36 -4
- package/types/koobiq-components-sidepanel.d.ts +52 -1
- package/types/koobiq-components-splitter.d.ts +13 -4
- package/types/koobiq-components-tabs.d.ts +4 -0
- package/types/koobiq-components-tags.d.ts +6 -0
- package/types/koobiq-components-textarea.d.ts +9 -2
- package/types/koobiq-components-timepicker.d.ts +15 -0
- package/types/koobiq-components-toggle.d.ts +30 -0
- package/types/koobiq-components-tooltip.d.ts +55 -10
- package/types/koobiq-components-top-bar.d.ts +11 -3
- package/types/koobiq-components-tree-select.d.ts +23 -8
- package/types/koobiq-components-tree.d.ts +144 -60
- package/schematics/migrations/angular-animations-removal/index.js +0 -20
- package/schematics/migrations/color-signals/index.js +0 -19
- package/schematics/migrations/core-mixins-removal/index.js +0 -17
- package/schematics/migrations/datepicker-signals/index.js +0 -17
- package/schematics/migrations/dropdown-signals/index.js +0 -19
- package/schematics/migrations/input-signals/index.js +0 -17
- package/schematics/migrations/list-signals/index.js +0 -17
- package/schematics/migrations/modal-signals/index.js +0 -19
- package/schematics/migrations/option-signals/index.js +0 -19
- package/schematics/migrations/query-list-signals/index.js +0 -17
- package/schematics/migrations/signal-inputs-subclasses/index.js +0 -17
- package/schematics/migrations/v20-upgrade/index.js +0 -18
- package/schematics/migrations/zoneless-change-detection/index.js +0 -20
- package/schematics/utils/package-config.js +0 -13
- /package/schematics/migrations/accordion-state-saving-default/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/actions-panel-overlay-container/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/alert-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/angular-animations-removal/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/app-switcher-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/autocomplete-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/badge-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/button-state-and-styles/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/button-supported-colors/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/button-toggle-signals-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/button-truncation/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/checkbox-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/clamped-text-disclosure/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/code-block-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/color-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/core-mixins-removal/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/css-selectors/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/datepicker-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/deprecated-icons/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/divider-signals-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/dl-attribute-coercion/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/dl-standalone-names/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/dropdown-demote-overlay/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/dropdown-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/empty-state-error-color/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/file-upload-cva-and-primitives/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/file-upload-deprecated-outputs/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/filter-bar-rename-action/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/filter-bar-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/filter-bar-state-saving-default/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/flag-inner-html/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/form-field-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/icons-replacement/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/inline-edit-a11y-and-types/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/input-number-surface/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/input-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/link-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/list-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/list-tree-multiple-input/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/loader-overlay-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/locale-configuration-providers/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/markdown-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/modal-dialog-semantics/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/modal-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/navbar-signals-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/new-icons-pack/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/notification-center-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/option-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/popover-leave-delay/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/progress-bar-percentage-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/progress-spinner-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/query-list-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/radio-signals-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/read-state-dwell-handlers/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/select-signal-inputs/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/sidepanel-non-modal-behavior/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/signal-inputs-subclasses/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/split-button-optional-disabled/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/state-saving-default/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/table-cell-content/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tabs-signals-and-aria/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tag-list-cleaner/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tags-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/textarea-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/time-range-title-for/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/timepicker-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/timezone-grouping-utils/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/title-encapsulation/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/toast-stack-and-defaults/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tooltip-pointer-events-and-types/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/top-bar-container-selectors/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tree-select-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tree-signals/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/tree-state-saving-default/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/username-pipe-injection/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/zoneless-change-detection/{data.js → data.cjs} +0 -0
- /package/schematics/utils/{ast.js → ast.cjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"koobiq-components-sidepanel.mjs","sources":["../../../packages/components/sidepanel/sidepanel-config.ts","../../../packages/components/sidepanel/sidepanel-animations.ts","../../../packages/components/sidepanel/sidepanel-container.component.ts","../../../packages/components/sidepanel/sidepanel-container.component.html","../../../packages/components/sidepanel/sidepanel-ref.ts","../../../packages/components/sidepanel/sidepanel-directives.ts","../../../packages/components/sidepanel/sidepanel.service.ts","../../../packages/components/sidepanel/sidepanel.module.ts","../../../packages/components/sidepanel/koobiq-components-sidepanel.ts"],"sourcesContent":["import { ScrollStrategy } from '@angular/cdk/overlay';\nimport { InjectionToken, Injector } from '@angular/core';\n\n/** Injection token that can be used to access the data that was passed in to a sidepanel. */\nexport const KBQ_SIDEPANEL_DATA = new InjectionToken<any>('KbqSidepanelData');\n\nexport enum KbqSidepanelPosition {\n Right = 'right',\n Left = 'left',\n Top = 'top',\n Bottom = 'bottom'\n}\n\nexport enum KbqSidepanelSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large'\n}\n\nexport class KbqSidepanelConfig<D = any> {\n /** ID for the sidepanel. If omitted, a unique one will be generated. */\n id?: string;\n\n /**\n * Persists whether this sidepanel is open, under this key, so the application can bring it back on\n * the next visit — see `KbqSidepanelService.wasOpen()`.\n *\n * Omit it and nothing is persisted. The key is the opt-in because there is nothing else stable to\n * persist under: a sidepanel lives in an overlay, and `id` falls back to a counter that means\n * something different on every load.\n */\n stateSavingKey?: string;\n\n /** Whether the focus trap is active. Defaults to whether the sidepanel has a backdrop. */\n trapFocus?: boolean;\n\n /** capture focus on initialization. This option sets cdkTrapFocusAutoCapture. Defaults to `true`. */\n trapFocusAutoCapture?: boolean;\n\n /**\n * Accessible name of the sidepanel, used when no `kbq-sidepanel-header` names it and no\n * `ariaLabelledBy` is given.\n */\n ariaLabel?: string;\n\n /**\n * Id of the element that labels the sidepanel. When omitted, `kbq-sidepanel-header` labels the\n * sidepanel with its own title.\n */\n ariaLabelledBy?: string;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n position?: KbqSidepanelPosition = KbqSidepanelPosition.Right;\n\n size?: KbqSidepanelSize = KbqSidepanelSize.Medium;\n\n /** Whether the sidepanel has a backdrop. */\n hasBackdrop?: boolean = true;\n\n backdropClass?: string;\n\n /** Whether the user can use escape or clicking outside to close the sidepanel. */\n disableClose?: boolean = false;\n\n /** Custom class for the overlay pane. */\n overlayPanelClass?: string | string[] = '';\n\n /**\n * Injector used for the instantiation of the component to be attached.\n * Allows to pass a custom injector to provide a dependency injection hierarchy for the sidepanel content.\n */\n injector?: Injector;\n\n /**\n * Scroll strategy of the sidepanel overlay, resolved once when the sidepanel opens.\n * Defaults to blocking the page scroll for sidepanels with a backdrop and to repositioning for the rest.\n */\n scrollStrategy?: () => ScrollStrategy;\n}\n","import { KbqSidepanelPosition } from './sidepanel-config';\n\n/** @internal */\nexport enum KbqSidepanelAnimationState {\n Void = 'void',\n Visible = 'visible',\n Hidden = 'hidden',\n Lower = 'lower',\n BottomPanel = 'bottom-panel',\n BecomingNormal = 'becoming-normal'\n}\n\n/**\n * A state transition of the sidepanel container: started, or ended — finished, or interrupted by the next one.\n *\n * @internal\n */\nexport interface KbqSidepanelAnimationEvent {\n phaseName: 'start' | 'done';\n toState: KbqSidepanelAnimationState;\n}\n\n/** @internal */\nexport const kbqSidepanelTransformAnimation: Record<\n KbqSidepanelPosition,\n { in: string; out: string; lower: string; bottomPanel: string; becomingNormal: string }\n> = {\n right: {\n in: 'translateX(100%)',\n out: 'translateX(0)',\n lower: 'scale(0.95) translateX(calc(-1 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n bottomPanel: 'scale(0.9) translateX(calc(-2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateX(0) scale(1)'\n },\n left: {\n in: 'translateX(-100%) scale(1)',\n out: 'translateX(0%) scale(1)',\n lower: 'scale(0.95) translateX(var(--kbq-sidepanel-size-panel-lower-offset))',\n bottomPanel: 'scale(0.9) translateX(calc(2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateX(0%) scale(1)'\n },\n top: {\n in: 'translateY(-100%)',\n out: 'translateY(0%)',\n lower: 'scale(0.95) translateY(var(--kbq-sidepanel-size-panel-lower-offset))',\n bottomPanel: 'scale(0.9) translateY(calc(2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateY(0%) scale(1)'\n },\n bottom: {\n in: 'translateY(100%)',\n out: 'translateY(0%)',\n lower: 'scale(0.95) translateY(calc(-1 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n bottomPanel: 'scale(0.9) translateY(calc(-2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateY(0%) scale(1)'\n }\n};\n","import { CdkTrapFocus, ConfigurableFocusTrapFactory, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { BasePortalOutlet, CdkPortalOutlet, ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\nimport {\n afterNextRender,\n AfterRenderRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n computed,\n ElementRef,\n EmbeddedViewRef,\n inject,\n InjectionToken,\n Injector,\n OnDestroy,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { kbqAfterAnimations, kbqAnimationsDisabled } from '@koobiq/components/core';\nimport { Observable, Subject } from 'rxjs';\nimport {\n KbqSidepanelAnimationEvent,\n KbqSidepanelAnimationState,\n kbqSidepanelTransformAnimation\n} from './sidepanel-animations';\nimport { KbqSidepanelConfig, KbqSidepanelPosition, KbqSidepanelSize } from './sidepanel-config';\n\nexport const KBQ_SIDEPANEL_WITH_INDENT = new InjectionToken<boolean>('kbq-sidepanel-with-indent');\n\n@Component({\n selector: 'kbq-sidepanel-container',\n imports: [\n CdkPortalOutlet,\n CdkTrapFocus\n ],\n templateUrl: './sidepanel-container.component.html',\n styleUrls: ['./sidepanel.scss', './sidepanel-tokens.scss'],\n // The configurable trap adds an inert strategy that pulls escaping focus back, which the anchor-only\n // default cannot do. Scoped to the container so it does not replace the factory the rest of the\n // application injects.\n providers: [{ provide: FocusTrapFactory, useClass: ConfigurableFocusTrapFactory }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-sidepanel-container kbq-sidepanel-container_shadowed',\n '[class]': 'size',\n '[class.kbq-sidepanel_nested]': 'withIndent',\n '[attr.id]': 'id',\n '[attr.tabindex]': '-1',\n '[attr.role]': '\"dialog\"',\n '[attr.aria-modal]': 'trapFocus ? \"true\" : null',\n '[attr.aria-label]': 'sidepanelConfig.ariaLabel ?? null',\n '[attr.aria-labelledby]': 'ariaLabelledBy',\n '[class.kbq-animations-disabled]': 'animationsDisabled',\n '[style.transform]': 'stateTransform()',\n '[style.opacity]': 'stateOpacity()'\n }\n})\nexport class KbqSidepanelContainerComponent extends BasePortalOutlet implements OnDestroy {\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private changeDetectorRef = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n sidepanelConfig = inject(KbqSidepanelConfig);\n\n /** Whether the sidepanel moves without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /** Whether the panel exposes the clickable indent strip of the sidepanel stacked underneath it. */\n get withIndent(): boolean {\n return this._withIndent();\n }\n\n set withIndent(value: boolean) {\n this._withIndent.set(value);\n }\n\n private readonly _withIndent = signal(inject(KBQ_SIDEPANEL_WITH_INDENT));\n\n /** ID for the container DOM element. */\n id: string;\n\n /**\n * Id of the element naming the sidepanel. Comes from the config, or from `kbq-sidepanel-header`.\n *\n * @docs-private\n */\n get ariaLabelledBy(): string | null {\n return this._ariaLabelledBy();\n }\n\n /** @docs-private */\n set ariaLabelledBy(value: string | null) {\n this._ariaLabelledBy.set(value);\n }\n\n // A signal: the header reports its title while this view is being checked, which a `markForCheck` would miss.\n private readonly _ariaLabelledBy = signal(this.sidepanelConfig.ariaLabelledBy ?? null);\n\n /** The portal outlet inside of this container into which the content will be loaded. */\n readonly portalOutlet = viewChild.required(CdkPortalOutlet);\n\n /**\n * The state of the sidepanel: on screen, closing, or stacked under another one.\n *\n * @internal\n */\n readonly animationState = signal<KbqSidepanelAnimationState>(KbqSidepanelAnimationState.Void);\n\n /**\n * Reports each state transition starting and ending.\n *\n * @internal\n */\n readonly animationStateChanged = new Subject<KbqSidepanelAnimationEvent>();\n\n /** The transition in progress, ended early by the next one. */\n private pendingTransition?: { state: KbqSidepanelAnimationState; wait: { destroy(): void } };\n\n /** Transition events held until the render that applies the state, in the order they happened. */\n private readonly unreportedEvents: KbqSidepanelAnimationEvent[] = [];\n\n /** Reports the held events once the next render is over. */\n private reportAfterRender?: AfterRenderRef;\n\n /** @docs-private */\n get size(): string {\n return `kbq-sidepanel_${this.sidepanelConfig.size ?? KbqSidepanelSize.Medium}`;\n }\n\n /**\n * Defaults to `true` in both modalities: it is what moves focus into the panel on open and returns\n * it to the trigger on close, and `CdkTrapFocus` restores focus only when it captured it.\n *\n * @docs-private\n */\n get trapFocusAutoCapture(): boolean {\n return this.sidepanelConfig.trapFocusAutoCapture ?? true;\n }\n\n /** @docs-private */\n get trapFocus(): boolean {\n return this.sidepanelConfig.trapFocus ?? !!this.sidepanelConfig.hasBackdrop;\n }\n\n /** @docs-private */\n protected readonly indentClickEmitter = new Subject<MouseEvent>();\n\n /** Whether the component has been destroyed. */\n private destroyed: boolean;\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /**\n * Gets an observable that emits when the indent has been clicked.\n *\n * @docs-private\n */\n indentClick(): Observable<MouseEvent> {\n return this.indentClickEmitter.asObservable();\n }\n\n /** Attach a component portal as content to this sidepanel container. */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n this.validatePortalAttached();\n this.setPanelClass();\n\n const componentRef = this.portalOutlet().attachComponentPortal(portal);\n\n // The portal outlet inserts the attached component's own host element between\n // `.kbq-sidepanel-content` and the header/body/footer, and a plain block there takes the\n // body out of the flex column that makes it scroll.\n (componentRef.location.nativeElement as HTMLElement).classList.add('kbq-sidepanel-content-host');\n\n return componentRef;\n }\n\n /** Attach a template portal as content to this sidepanel container. */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n this.validatePortalAttached();\n this.setPanelClass();\n\n return this.portalOutlet().attachTemplatePortal(portal);\n }\n\n /** Begin animation of the sidepanel entrance into view. */\n enter(): void {\n if (this.destroyed) return;\n\n this.animationState.set(KbqSidepanelAnimationState.Visible);\n this.changeDetectorRef.detectChanges();\n this.startTransition(KbqSidepanelAnimationState.Visible);\n }\n\n /** Begin animation of the sidepanel exiting from view. */\n exit(): void {\n if (this.destroyed) return;\n\n this.setAnimationState(KbqSidepanelAnimationState.Hidden);\n }\n\n /** @internal */\n setAnimationState(state: KbqSidepanelAnimationState): void {\n if (this.destroyed) return;\n\n this.animationState.set(state);\n this.startTransition(state);\n }\n\n /**\n * Transform of the panel in its current state.\n *\n * @internal\n */\n protected readonly stateTransform = computed((): string | null => {\n const transforms = kbqSidepanelTransformAnimation[this.position];\n\n switch (this.animationState()) {\n case KbqSidepanelAnimationState.Hidden:\n return transforms.in;\n case KbqSidepanelAnimationState.Visible:\n return transforms.out;\n case KbqSidepanelAnimationState.Lower:\n return transforms.lower;\n case KbqSidepanelAnimationState.BottomPanel:\n return transforms.bottomPanel;\n case KbqSidepanelAnimationState.BecomingNormal:\n return transforms.becomingNormal;\n default:\n return null;\n }\n });\n\n /**\n * Opacity of the panel in its current state.\n *\n * @internal\n */\n protected readonly stateOpacity = computed((): number | null => {\n switch (this.animationState()) {\n case KbqSidepanelAnimationState.Void:\n case KbqSidepanelAnimationState.BottomPanel:\n return 0;\n case KbqSidepanelAnimationState.Hidden:\n return null;\n default:\n return 1;\n }\n });\n\n /**\n * Recomputes whether this panel exposes an indent strip, after the stack it belongs to changed.\n *\n * @docs-private\n */\n setWithIndent(withIndent: boolean): void {\n this.withIndent = withIndent;\n }\n\n /**\n * Names the sidepanel after the title of its header. A name given through the config wins.\n *\n * @docs-private\n */\n setAriaLabelledBy(id: string): void {\n if (this.ariaLabelledBy !== null) return;\n\n this.ariaLabelledBy = id;\n }\n\n /**\n * Reports the transition to `state` starting, and ending once its CSS transition has.\n *\n * Both are reported after the render that applies the state, as the animation engine did, and never inside\n * `open()` or `close()`: a subscriber that opens another sidepanel would otherwise do so before the stack the\n * call is changing is complete, and one that subscribes right after the call would miss the start.\n */\n private startTransition(state: KbqSidepanelAnimationState): void {\n const pending = this.pendingTransition;\n\n if (pending) {\n pending.wait.destroy();\n this.holdEvent({ phaseName: 'done', toState: pending.state });\n }\n\n this.holdEvent({ phaseName: 'start', toState: state });\n\n const wait = kbqAfterAnimations(\n () => this.elementRef.nativeElement,\n () => {\n this.pendingTransition = undefined;\n this.unreportedEvents.push({ phaseName: 'done', toState: state });\n this.reportEvents();\n },\n this.injector\n );\n\n this.pendingTransition = { state, wait };\n }\n\n private holdEvent(event: KbqSidepanelAnimationEvent): void {\n this.unreportedEvents.push(event);\n this.reportAfterRender ??= afterNextRender(() => this.reportEvents(), { injector: this.injector });\n }\n\n private reportEvents(): void {\n this.reportAfterRender?.destroy();\n\n // One at a time: a subscriber that moves the panel again holds more events, which follow in order.\n for (let event = this.unreportedEvents.shift(); event; event = this.unreportedEvents.shift()) {\n this.animationStateChanged.next(event);\n }\n\n this.reportAfterRender = undefined;\n }\n\n private setPanelClass() {\n this.elementRef.nativeElement.classList.add(`kbq-sidepanel-container_${this.position}`);\n }\n\n private get position(): KbqSidepanelPosition {\n return this.sidepanelConfig.position ?? KbqSidepanelPosition.Right;\n }\n\n private validatePortalAttached() {\n if (this.portalOutlet().hasAttached()) {\n throw Error('Attempting to attach sidepanel content after content is already attached');\n }\n }\n}\n","<div class=\"kbq-sidepanel-wrapper\">\n @if (withIndent) {\n <div class=\"kbq-sidepanel-indent\" (click)=\"indentClickEmitter.next($event)\"></div>\n }\n\n <div class=\"kbq-sidepanel-content\" [cdkTrapFocus]=\"trapFocus\" [cdkTrapFocusAutoCapture]=\"trapFocusAutoCapture\">\n <ng-template cdkPortalOutlet />\n </div>\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { signal, untracked } from '@angular/core';\nimport { ESCAPE, isHtmlElement, KbqOverflowShadowState } from '@koobiq/components/core';\nimport { merge, Observable, Subject } from 'rxjs';\nimport { filter, take, tap } from 'rxjs/operators';\nimport { KbqSidepanelAnimationState } from './sidepanel-animations';\nimport { KbqSidepanelConfig } from './sidepanel-config';\nimport { KbqSidepanelContainerComponent } from './sidepanel-container.component';\n\n// Counter for unique sidepanel ids.\nlet uniqueId = 0;\n\nexport class KbqSidepanelRef<T = any, R = any> {\n readonly id: string;\n\n /**\n * Vertical scroll overflow state of the sidepanel body.\n * Updated on scroll and used for visual adjustments.\n */\n readonly bodyOverflow = signal<KbqOverflowShadowState>({ top: false, bottom: false });\n\n /** Instance of the component making up the content of the sidepanel. */\n instance: T;\n\n /** Subject for notifying the user that the sidepanel has been closed and dismissed. */\n private readonly afterClosed$ = new Subject<R | undefined>();\n\n /** Subject for notifying the user that the sidepanel starting closing. */\n private readonly beforeClosed$ = new Subject<void>();\n\n /** Subject for notifying the user that the sidepanel has opened and appeared. */\n private readonly afterOpened$ = new Subject<void>();\n\n /** Result to be passed down to the `afterDismissed` stream. */\n private result: R | undefined;\n\n /** Whether `close()` has already started the closing animation. */\n private closing = false;\n\n constructor(\n public readonly containerInstance: KbqSidepanelContainerComponent,\n public readonly overlayRef: OverlayRef,\n public readonly config: KbqSidepanelConfig\n ) {\n this.id = this.config.id || `kbq-sidepanel-${uniqueId++}`;\n this.containerInstance.id = this.id;\n overlayRef.backdropElement?.classList.add(config.backdropClass ?? 'kbq-overlay-dark-backdrop');\n\n const slideBelowStart = containerInstance.animationStateChanged.pipe(\n filter(\n (event) =>\n event.phaseName === 'start' &&\n [KbqSidepanelAnimationState.Lower, KbqSidepanelAnimationState.BottomPanel].includes(\n event.toState as KbqSidepanelAnimationState\n )\n )\n );\n\n // Act on close\n const beforeClosed = containerInstance.animationStateChanged.pipe(\n filter(({ phaseName, toState }) => phaseName === 'start' && toState === KbqSidepanelAnimationState.Hidden),\n take(1),\n tap(() => {\n this.beforeClosed$.next();\n this.beforeClosed$.complete();\n })\n );\n\n // Emit when opening animation completes\n containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done' && event.toState === KbqSidepanelAnimationState.Visible),\n take(1)\n )\n .subscribe(() => {\n this.afterOpened$.next();\n this.afterOpened$.complete();\n });\n\n containerInstance.animationStateChanged\n .pipe(\n filter(\n (event) =>\n event.phaseName === 'start' && event.toState === KbqSidepanelAnimationState.BecomingNormal\n )\n )\n .subscribe(() => {\n if (overlayRef.backdropElement?.style) {\n overlayRef.backdropElement.style.opacity = '1';\n }\n });\n\n merge(slideBelowStart, beforeClosed).subscribe(() => {\n if (overlayRef.backdropElement?.style) {\n overlayRef.backdropElement.style.opacity = '0';\n }\n });\n\n // Dispose overlay when closing animation is complete\n containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done' && event.toState === KbqSidepanelAnimationState.Hidden),\n take(1)\n )\n .subscribe(() => {\n overlayRef.dispose();\n this.afterClosed$.next(this.result);\n this.afterClosed$.complete();\n });\n\n overlayRef\n .keydownEvents()\n .pipe(\n // keyCode is deprecated, but IE11 and Edge don't support code property, which we need use instead\n filter((event) => event.keyCode === ESCAPE)\n )\n .subscribe((event) => {\n // CDK hands the key to this overlay after the layers above it, such as a tooltip, a popover or a\n // confirm dialog, have handled it: one that closed spent it, and the sidepanel stays open.\n if (event.defaultPrevented || this.config.disableClose) return;\n\n event.preventDefault();\n this.close();\n });\n\n merge(\n overlayRef.backdropClick(),\n this.containerInstance.indentClick(),\n overlayRef.outsidePointerEvents().pipe(filter((event) => this.isClickInsideSamePositionStack(event)))\n ).subscribe(() => {\n if (this.config.disableClose) return;\n\n this.close();\n });\n }\n\n close(result?: R): void {\n // Untracked, as `KbqSidepanelService.open()`: called from a consumer's `effect()`, the state of the sidepanels\n // stacked under this one, read and written on the way, would make the effect run again as they move.\n untracked(() => this.startClosing(result));\n }\n\n /** Body of `close()`. */\n private startClosing(result: R | undefined): void {\n if (this.closing) return;\n\n this.closing = true;\n\n // Transition the backdrop in parallel to the sidepanel.\n this.containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done'),\n take(1)\n )\n .subscribe(() => this.overlayRef.detachBackdrop());\n\n this.result = result;\n this.containerInstance.exit();\n }\n\n /** Gets an observable that is notified when the sidepanel is started closing. */\n beforeClosed(): Observable<void> {\n return this.beforeClosed$.asObservable();\n }\n\n /** Gets an observable that is notified when the sidepanel is finished closing. */\n afterClosed(): Observable<R | undefined> {\n return this.afterClosed$.asObservable();\n }\n\n /** Gets an observable that is notified when the sidepanel has opened and appeared. */\n afterOpened(): Observable<void> {\n return this.afterOpened$.asObservable();\n }\n\n /**\n * A pointer event outside this overlay closes the sidepanel only when it lands in a sidepanel of the\n * same stack — that is the exposed strip of a panel opened over this one. Panels at other edges do\n * not overlap this one and must not close it.\n */\n private isClickInsideSamePositionStack(event: MouseEvent): boolean {\n if (!isHtmlElement(event.target)) return false;\n\n const container = event.target.closest('.kbq-sidepanel-container');\n\n return !!container && container.classList.contains(`kbq-sidepanel-container_${this.config.position}`);\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport {\n KBQ_A11Y_LOCALE_CONFIGURATION,\n KbqLocaleOverridesDirective,\n KbqOverflowShadowContainer\n} from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { KbqTitleDirective } from '@koobiq/components/title';\nimport { KbqSidepanelRef } from './sidepanel-ref';\n\n/**\n * Button that will close the current sidepanel.\n */\n@Directive({\n selector: 'button[kbq-sidepanel-close], button[kbqSidepanelClose]',\n host: {\n class: 'kbq-sidepanel-close',\n // The camel-case spelling wins when a template binds both, as it did before.\n '(click)': 'sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())'\n }\n})\nexport class KbqSidepanelClose {\n // `CdkPortalOutlet.attachTemplatePortal()` forwards the portal injector to the embedded view, so the\n // ref is reachable from a `<ng-template>` sidepanel as well as from a component one.\n readonly sidepanelRef = inject(KbqSidepanelRef);\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n /** Value handed to `KbqSidepanelRef.close()`, under the hyphenated spelling of the selector. */\n readonly sidepanelResult = input<any>(undefined, { alias: 'kbq-sidepanel-close' });\n\n /** The same value, under the camel-case spelling. */\n readonly kbqSidepanelClose = input<any>();\n\n constructor() {\n afterNextRender(() => {\n // A button with no type submits the form it sits in, so closing a sidepanel from inside a form would\n // submit it too. A type the author set is left alone. The element carries its static attributes by\n // the time a directive is constructed, so this needs no lifecycle hook.\n if (!this.elementRef.nativeElement.hasAttribute('type')) {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'type', 'button');\n }\n });\n }\n}\n\n/**\n * Header of a sidepanel.\n */\n@Component({\n selector: 'kbq-sidepanel-header',\n imports: [\n KbqButtonModule,\n KbqSidepanelClose,\n KbqIconModule,\n KbqTitleDirective\n ],\n template: `\n <div class=\"kbq-sidepanel-title\" kbq-title [attr.id]=\"titleId\">\n <ng-content />\n </div>\n\n @if (closeable()) {\n <button\n kbq-button\n kbq-sidepanel-close\n type=\"button\"\n [attr.aria-label]=\"a11yLocaleConfiguration().close\"\n [color]=\"'contrast'\"\n [kbqStyle]=\"'transparent'\"\n >\n <i kbq-icon=\"kbq-xmark_16\" [color]=\"'contrast'\"></i>\n </button>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'kbq-sidepanel-header',\n '[class.kbq-sidepanel-header_truncate-text]': 'truncateText()',\n '[style.box-shadow]': 'sidepanelRef.bodyOverflow().top ? \"var(--kbq-shadow-overflow-normal-bottom)\" : null'\n },\n hostDirectives: [\n { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }\n ]\n})\nexport class KbqSidepanelHeader {\n /** Accessible name for the icon-only close button. */\n protected readonly a11yLocaleConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read(\n 'a11y',\n KBQ_A11Y_LOCALE_CONFIGURATION\n );\n\n /** Add button for close sidepanel. Default false */\n readonly closeable = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Enables text truncation. Default true */\n readonly truncateText = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /** @docs-private */\n protected sidepanelRef = inject(KbqSidepanelRef);\n\n /** Id of the title element, which is what names the sidepanel to assistive technology. */\n protected readonly titleId = `${this.sidepanelRef.id}-title`;\n\n constructor() {\n this.sidepanelRef.containerInstance.setAriaLabelledBy(this.titleId);\n }\n}\n\n/**\n * Scrollable content container of a sidepanel.\n */\n@Directive({\n selector: 'kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody',\n host: {\n class: 'kbq-sidepanel-body'\n },\n hostDirectives: [KbqOverflowShadowContainer, KbqScrollbarViewport]\n})\nexport class KbqSidepanelBody {\n private readonly sidepanelRef = inject(KbqSidepanelRef);\n private readonly overflowContainer = inject(KbqOverflowShadowContainer);\n private readonly scrollbarViewport = inject(KbqScrollbarViewport);\n\n constructor() {\n effect(() => this.sidepanelRef.bodyOverflow.set(this.overflowContainer.overflow()));\n\n this.sidepanelRef\n .afterOpened()\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.scrollbarViewport.flashScrollIndicators());\n }\n}\n\n/**\n * Footer of a sidepanel.\n */\n@Directive({\n selector: 'kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter',\n host: {\n class: 'kbq-sidepanel-footer',\n '[style.box-shadow]': 'sidepanelRef.bodyOverflow().bottom ? \"var(--kbq-shadow-overflow-normal-top)\" : null'\n }\n})\nexport class KbqSidepanelFooter {\n /** @docs-private */\n protected sidepanelRef = inject(KbqSidepanelRef);\n}\n\n/**\n * Actions block of a sidepanel footer.\n */\n@Directive({\n selector: 'kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions',\n host: {\n class: 'kbq-sidepanel-actions'\n }\n})\nexport class KbqSidepanelActions {}\n","import { Overlay, OverlayConfig, OverlayContainer, OverlayRef, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType, TemplatePortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n TemplateRef,\n inject,\n isDevMode,\n untracked\n} from '@angular/core';\nimport { KBQ_STATE_STORE, KbqStateSavingRef, KbqStateSavingService, KbqStateStore } from '@koobiq/components/core';\nimport { KbqSidepanelAnimationState } from './sidepanel-animations';\nimport { KBQ_SIDEPANEL_DATA, KbqSidepanelConfig } from './sidepanel-config';\nimport { KBQ_SIDEPANEL_WITH_INDENT, KbqSidepanelContainerComponent } from './sidepanel-container.component';\nimport { KbqSidepanelRef } from './sidepanel-ref';\n\n/** Injection token that can be used to specify default sidepanel options. */\nexport const KBQ_SIDEPANEL_DEFAULT_OPTIONS = new InjectionToken<KbqSidepanelConfig>('kbq-sidepanel-default-options');\n\n/** The persisted state of a sidepanel — whether it was open. */\nexport interface KbqSidepanelState {\n opened: boolean;\n}\n\n/**\n * Coerces a raw persisted payload into a `KbqSidepanelState`, returning `null` for anything\n * unrecognizable.\n *\n * Web storage is origin-wide and user-writable, so a payload is never trusted — without this, a\n * hand-edited entry would decide whether a sidepanel opens.\n */\nconst normalizeSidepanelState = (parsed: unknown): KbqSidepanelState | null => {\n const opened = (parsed as Partial<KbqSidepanelState> | null)?.opened;\n\n return typeof opened === 'boolean' ? { opened } : null;\n};\n\n/**\n * What `KbqStateSavingService` reports for one persisted sidepanel key.\n *\n * The five components that persist register themselves, and a sidepanel has nothing to register: it is\n * closed exactly when its entry matters, and while open it lives in an overlay with no stable position\n * to be identified by. So the service stands in for it, and `host` stays `null`.\n */\nclass KbqSidepanelStateSavingRef implements KbqStateSavingRef {\n readonly name = 'kbq-sidepanel';\n readonly host = null;\n\n /** Persistence is opted into by supplying a `stateSavingKey`, so a tracked key is always enabled. */\n readonly enabled = true;\n\n state: unknown = null;\n\n constructor(\n readonly key: string,\n private readonly store: KbqStateStore\n ) {}\n\n clear(): void {\n this.store.removeState(this.key);\n this.state = null;\n }\n}\n\n/** Context of a sidepanel opened from a `TemplateRef`. */\ntype KbqSidepanelTemplateContext<T, D> = {\n $implicit: D | null | undefined;\n sidepanelRef: KbqSidepanelRef<T>;\n};\n\n/** Copies the entries that carry a value, so an unset optional does not overwrite a default with `undefined`. */\nconst assignDefined = <T extends object>(target: T, source: T | null | undefined): void => {\n if (!source) return;\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n if (source[key] !== undefined) {\n target[key] = source[key];\n }\n }\n};\n\n@Injectable({ providedIn: 'root' })\nexport class KbqSidepanelService implements OnDestroy {\n private overlay = inject(Overlay);\n private overlayContainer = inject(OverlayContainer);\n private injector = inject(Injector);\n private defaultOptions = inject<KbqSidepanelConfig>(KBQ_SIDEPANEL_DEFAULT_OPTIONS, { optional: true });\n private parentSidepanelService = inject(KbqSidepanelService, { optional: true, skipSelf: true });\n\n /** Sidepanels opened through this very instance, closed when this injector level is destroyed. */\n private readonly openedSidepanelsAtThisLevel: KbqSidepanelRef[] = [];\n\n /** The shared stack. Only the root-most instance ever holds it; the rest reach it through the getter. */\n private readonly rootOpenedSidepanels: KbqSidepanelRef[] = [];\n\n /** Sidepanels that hid the rest of the page from assistive technology when they opened. */\n private readonly modalSidepanels = new Set<KbqSidepanelRef>();\n\n /** Elements outside the overlay container that were hidden from assistive technology, and their previous state. */\n private readonly ariaHiddenElements = new Map<Element, string | null>();\n\n private readonly stateStore = inject(KBQ_STATE_STORE);\n private readonly stateSavingService = inject(KbqStateSavingService);\n\n /**\n * One entry per `stateSavingKey` this service has seen, so `KbqStateSavingService` reports what is\n * stored as claimed. Without it a closed sidepanel's entry has nothing live behind it, and\n * `clearOrphans()` would sweep away exactly what the next visit is meant to restore.\n */\n private readonly stateSavingRefs = new Map<string, KbqSidepanelStateSavingRef>();\n\n private readonly bulkClosedAtThisLevel = new WeakSet<KbqSidepanelRef>();\n\n /** Keeps track of the currently-open sidepanels. */\n get openedSidepanels(): KbqSidepanelRef[] {\n return this.parentSidepanelService ? this.parentSidepanelService.openedSidepanels : this.rootOpenedSidepanels;\n }\n\n /** The instance holding the shared stack and the assistive-technology bookkeeping. */\n private get rootService(): KbqSidepanelService {\n return this.parentSidepanelService?.rootService ?? this;\n }\n\n /**\n * The sidepanels being closed as a group rather than one at a time, whose close is not recorded.\n *\n * Shared up the chain like `openedSidepanels`: `closeAll()` reaches panels another instance opened,\n * and it is that instance's subscription that would record the close.\n */\n private get bulkClosed(): WeakSet<KbqSidepanelRef> {\n return this.parentSidepanelService ? this.parentSidepanelService.bulkClosed : this.bulkClosedAtThisLevel;\n }\n\n ngOnDestroy() {\n // Only close the sidepanels opened at this level on destroy,\n // since the parent service may still be active.\n this.closeSidepanels(this.openedSidepanelsAtThisLevel);\n\n // The bookkeeping is shared, so only the instance that owns it may drop it: a child level going\n // away must not reveal the page under a modal sidepanel opened somewhere else.\n if (this.rootService === this) {\n this.restoreContentForAssistiveTechnology();\n }\n\n this.stateSavingRefs.forEach((ref) => this.stateSavingService.unregister(ref));\n this.stateSavingRefs.clear();\n }\n\n open<T, D = any>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: KbqSidepanelConfig<D>\n ): KbqSidepanelRef<T> {\n // Untracked, as `KbqSidepanelRef.close()`: called from a consumer's `effect()`, the state of the sidepanels\n // already open, read and written on the way, would make the effect run again — and open another sidepanel —\n // as soon as it changes.\n return untracked(() => this.openSidepanel(componentOrTemplateRef, config));\n }\n\n /** Body of `open()`. */\n private openSidepanel<T, D>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config: KbqSidepanelConfig<D> | undefined\n ): KbqSidepanelRef<T> {\n const fullConfig = new KbqSidepanelConfig<D>();\n\n assignDefined(fullConfig, this.defaultOptions);\n assignDefined(fullConfig, config);\n\n if (fullConfig.id && this.getSidepanelById(fullConfig.id)) {\n throw Error(`Sidepanel with id \"${fullConfig.id}\" exists already. The sidepanel id must be unique.`);\n }\n\n if (isDevMode() && fullConfig.stateSavingKey && this.isStateSavingKeyInUse(fullConfig.stateSavingKey)) {\n // eslint-disable-next-line no-console\n console.warn(\n `kbq-sidepanel: another open sidepanel already persists under the state saving key ` +\n `\"${fullConfig.stateSavingKey}\". They share one entry, so closing either records the ` +\n 'panel as closed. Give each one its own key.'\n );\n }\n\n const overlayRef = this.createOverlay(fullConfig);\n const container = this.attachContainer(overlayRef, fullConfig);\n const ref = new KbqSidepanelRef<T>(container, overlayRef, fullConfig);\n\n if (componentOrTemplateRef instanceof TemplateRef) {\n container.attachTemplatePortal(\n new TemplatePortal<KbqSidepanelTemplateContext<T, D>>(\n componentOrTemplateRef as TemplateRef<KbqSidepanelTemplateContext<T, D>>,\n null!,\n { $implicit: fullConfig.data, sidepanelRef: ref },\n this.createInjector(fullConfig, ref, container)\n )\n );\n } else {\n const portal = new ComponentPortal(\n componentOrTemplateRef,\n undefined,\n this.createInjector(fullConfig, ref, container)\n );\n const contentRef = container.attachComponentPortal(portal);\n\n ref.instance = contentRef.instance;\n }\n\n this.openedSidepanels.push(ref);\n this.openedSidepanelsAtThisLevel.push(ref);\n // The panel that was on top until now has to give the strip up, or the stack shows one per level.\n this.updateIndents(fullConfig);\n\n if (container.trapFocus) {\n this.rootService.hideContentFromAssistiveTechnology(ref);\n }\n\n ref.beforeClosed().subscribe(() => this.updateAnimationState(ref));\n ref.afterClosed().subscribe(() => {\n this.removeOpenSidepanel(ref);\n\n // A group close is the owner going away rather than a decision to close this panel, and\n // keeping the flag is what lets the next visit bring the panel back.\n if (!this.bulkClosed.has(ref)) {\n this.writeState(fullConfig.stateSavingKey, false);\n }\n });\n\n this.writeState(fullConfig.stateSavingKey, true);\n\n container.enter();\n\n return ref;\n }\n\n /**\n * Closes all of the currently-open sidepanels.\n *\n * Closing as a group is not recorded — see `wasOpen()`.\n */\n closeAll(): void {\n this.closeSidepanels(this.openedSidepanels);\n }\n\n /**\n * Whether the sidepanel persisted under `key` was open when it was last recorded, so the\n * application can open it again:\n *\n * ```ts\n * if (sidepanel.wasOpen('filters')) this.openFilters();\n * ```\n *\n * A sidepanel cannot restore itself the way the components that persist do. It exists only while it\n * is open, so at the point the state would be read there is nothing left to read it — and what to\n * reopen is a component class or a `TemplateRef` and its `data`, none of which survives being\n * written to storage. This service keeps the flag; the application keeps the rest.\n *\n * What is recorded is a sidepanel opened and closed on its own. Closing a group — `closeAll()`, or\n * this service being destroyed — leaves the flag alone, so a panel that was open when the page went\n * away comes back whether the page was reloaded or navigated away from.\n *\n * Reading claims the key: from here on `KbqStateSavingService` reports the entry as this service's\n * rather than orphaned. It has to happen on read, because for a sidepanel that is not open this is\n * the only call there is.\n */\n wasOpen(key: string): boolean {\n if (!key || !this.stateSavingService.isEnabled()) return false;\n\n const state = normalizeSidepanelState(this.stateStore.getState(key));\n\n this.trackState(key, state);\n\n return state?.opened ?? false;\n }\n\n /**\n * Removes what is persisted under `key`.\n *\n * Persistence itself stays on: a sidepanel opened under that key again is recorded again.\n */\n clearSavedState(key: string): void {\n if (!key) return;\n\n this.stateStore.removeState(key);\n this.stateSavingRefs.get(key)?.clear();\n this.stateSavingService.notify();\n }\n\n /**\n * Finds an open sidepanel by its id.\n *\n * @param id ID to use when looking up the sidepanel.\n */\n getSidepanelById(id: string): KbqSidepanelRef | undefined {\n return this.openedSidepanels.find((sidepanel) => sidepanel.id === id);\n }\n\n /**\n * Attaches the sidepanel container component to the overlay.\n */\n private attachContainer(overlayRef: OverlayRef, config: KbqSidepanelConfig): KbqSidepanelContainerComponent {\n const openedSidepanelsWithSamePosition = this.getOpenedSidepanelsWithSamePosition(config);\n\n const lower = openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 1];\n const bottom = openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 2];\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.Lower);\n this.setAnimationState(bottom, KbqSidepanelAnimationState.BottomPanel);\n\n const injector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: KbqSidepanelConfig, useValue: config },\n { provide: KBQ_SIDEPANEL_WITH_INDENT, useValue: openedSidepanelsWithSamePosition.length >= 1 }\n ]\n });\n\n const containerPortal = new ComponentPortal(KbqSidepanelContainerComponent, undefined, injector);\n const containerRef: ComponentRef<KbqSidepanelContainerComponent> = overlayRef.attach(containerPortal);\n\n return containerRef.instance;\n }\n\n /**\n * Creates a custom injector to be used inside the sidepanel. This allows a component loaded inside\n * of a sidepanel to close itself and, optionally, to return a value.\n *\n * @param config Config object that is used to construct the sidepanel.\n * @param sidepanelRef Reference to the sidepanel.\n * @param sidepanelContainer Sidepanel container element that wraps all of the contents.\n * @returns The custom injector that can be used inside the sidepanel.\n */\n private createInjector<T>(\n config: KbqSidepanelConfig,\n sidepanelRef: KbqSidepanelRef<T>,\n sidepanelContainer: KbqSidepanelContainerComponent\n ): Injector {\n // The KbqSidepanelContainerComponent is injected in the portal as the KbqSidepanelContainerComponent and\n // the sidepanel's content are created out of the same ViewContainerRef and as such, are siblings for injector\n // purposes. To allow the hierarchy that is expected, the KbqSidepanelContainerComponent is explicitly\n // added to the injection tokens.\n\n return Injector.create({\n parent: config.injector ?? this.injector,\n providers: [\n { provide: KbqSidepanelContainerComponent, useValue: sidepanelContainer },\n { provide: KBQ_SIDEPANEL_DATA, useValue: config.data },\n { provide: KbqSidepanelRef, useValue: sidepanelRef }\n ]\n });\n }\n\n /**\n * Creates a new overlay and places it in the correct location.\n *\n * @param config The user-specified sidepanel config.\n */\n private createOverlay(config: KbqSidepanelConfig): OverlayRef {\n const overlayConfig = new OverlayConfig({\n hasBackdrop: config.hasBackdrop,\n backdropClass: '',\n maxWidth: '100%',\n panelClass: config.overlayPanelClass,\n scrollStrategy: this.resolveScrollStrategy(config),\n positionStrategy: this.overlay.position().global()\n });\n\n return this.overlay.create(overlayConfig);\n }\n\n /**\n * `block()` pins the document with `position: fixed`, which is exactly what the non-modal mode\n * promises not to do, so only a backdropped sidepanel gets it.\n */\n private resolveScrollStrategy(config: KbqSidepanelConfig): ScrollStrategy {\n if (config.scrollStrategy) return config.scrollStrategy();\n\n return config.hasBackdrop ? this.overlay.scrollStrategies.block() : this.overlay.scrollStrategies.reposition();\n }\n\n /**\n * `BlockScrollStrategy` refuses to engage while the page is already blocked, so in a stack the block\n * belongs to the bottom-most backdropped sidepanel and has to be handed over when that one closes.\n *\n * @param closedIndex Index the closed sidepanel held in the stack, before it was removed.\n */\n private restoreScrollBlock(closedConfig: KbqSidepanelConfig, closedIndex: number) {\n if (!closedConfig.hasBackdrop) return;\n\n const ownerIndex = this.openedSidepanels.findIndex(({ config }) => config.hasBackdrop);\n\n // A backdropped sidepanel that was already below the closed one still holds the block. Re-applying\n // the strategy there would release and re-take the page, scrolling it twice for nothing.\n if (ownerIndex === -1 || ownerIndex < closedIndex) return;\n\n const owner = this.openedSidepanels[ownerIndex];\n\n owner.overlayRef.updateScrollStrategy(this.resolveScrollStrategy(owner.config));\n }\n\n private closeSidepanels(sidepanels: KbqSidepanelRef[]) {\n // `reverse()` mutates, and this is called with the live stack.\n [...sidepanels].reverse().forEach((sidepanelRef: KbqSidepanelRef) => {\n // Marked before closing rather than around the loop: `afterClosed()` only fires once the exit\n // animation is done, by which time a flag held for the duration of this call would be gone.\n this.bulkClosed.add(sidepanelRef);\n\n sidepanelRef.close();\n });\n }\n\n /** Whether an already-open sidepanel persists under this key. */\n private isStateSavingKeyInUse(key: string): boolean {\n return this.openedSidepanels.some((ref) => ref.config.stateSavingKey === key);\n }\n\n /** Records whether the sidepanel persisting under `key` is open. A sidepanel without a key is not. */\n private writeState(key: string | undefined, opened: boolean): void {\n if (!key || !this.stateSavingService.isEnabled()) return;\n\n const state: KbqSidepanelState = { opened };\n\n this.stateStore.setState(key, state);\n this.trackState(key, state);\n\n // The write does not go through `KbqStateSavingService`, so it would otherwise go unreported.\n this.stateSavingService.notify();\n }\n\n /** Reports the key to `KbqStateSavingService`, registering it the first time it is seen. */\n private trackState(key: string, state: KbqSidepanelState | null): void {\n let ref = this.stateSavingRefs.get(key);\n\n if (!ref) {\n ref = new KbqSidepanelStateSavingRef(key, this.stateStore);\n\n this.stateSavingRefs.set(key, ref);\n this.stateSavingService.register(ref);\n }\n\n ref.state = state;\n }\n\n private getOpenedSidepanelsWithSamePosition(config: KbqSidepanelConfig): KbqSidepanelRef[] {\n return this.openedSidepanels.filter((sidepanelRef) => sidepanelRef.config.position === config.position);\n }\n\n private updateAnimationState(sidepanelRef: KbqSidepanelRef) {\n const index = this.openedSidepanels.indexOf(sidepanelRef);\n\n // only allow animations if ref is last element in sidepanels list\n if (index === -1 || index !== this.openedSidepanels.length - 1) return;\n\n const [lower, bottom] = this.getLowerSidepanelsWithSamePosition(index);\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.BecomingNormal);\n this.setAnimationState(bottom, KbqSidepanelAnimationState.Lower);\n }\n\n /**\n * Moves a sidepanel into `state`, unless it is closing already.\n *\n * The exit animation is what disposes the overlay, so interrupting it with another state leaves the\n * sidepanel in the DOM and in `openedSidepanels` for good — which is what closing a stack of them as\n * a group used to do to the panels underneath.\n */\n private setAnimationState(sidepanelRef: KbqSidepanelRef | undefined, state: KbqSidepanelAnimationState): void {\n const containerInstance = sidepanelRef?.containerInstance;\n\n if (!containerInstance || containerInstance.animationState() === KbqSidepanelAnimationState.Hidden) return;\n\n containerInstance.setAnimationState(state);\n }\n\n /**\n * Removes a sidepanel from the array of open sidepanels.\n *\n * @param sidepanelRef Sidepanel to be removed.\n */\n private removeOpenSidepanel(sidepanelRef: KbqSidepanelRef) {\n const levelIndex = this.openedSidepanelsAtThisLevel.indexOf(sidepanelRef);\n\n if (levelIndex > -1) {\n this.openedSidepanelsAtThisLevel.splice(levelIndex, 1);\n }\n\n const index = this.openedSidepanels.indexOf(sidepanelRef);\n\n if (index > -1) {\n const [lower] = this.getLowerSidepanelsWithSamePosition(index);\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.Visible);\n\n this.openedSidepanels.splice(index, 1);\n this.updateIndents(sidepanelRef.config);\n this.restoreScrollBlock(sidepanelRef.config, index);\n }\n\n this.rootService.revealContentForAssistiveTechnology(sidepanelRef);\n }\n\n /**\n * Only the top sidepanel of a position stack carries the indent, however deep the stack is — the strip\n * is what reveals the panel underneath, and one per level is the visual noise the docs rule out.\n *\n * The flag belongs to the stack rather than to the panel that had one when it opened, so it is\n * recomputed on both ends: opening demotes the panel that was on top, and closing a *lower* sidepanel\n * would otherwise leave the top one exposing a strip of a panel that is no longer there.\n */\n private updateIndents(config: KbqSidepanelConfig) {\n const stack = this.getOpenedSidepanelsWithSamePosition(config);\n\n stack.forEach((sidepanelRef, index) =>\n sidepanelRef.containerInstance.setWithIndent(stack.length > 1 && index === stack.length - 1)\n );\n }\n\n /**\n * A focus trap constrains Tab, not the virtual cursor, so everything outside the overlay stays\n * reachable to a screen reader while a modal sidepanel is open unless it is hidden explicitly.\n */\n private hideContentFromAssistiveTechnology(sidepanelRef: KbqSidepanelRef) {\n const firstModal = this.modalSidepanels.size === 0;\n\n this.modalSidepanels.add(sidepanelRef);\n\n if (!firstModal) return;\n\n const overlayContainerElement = this.overlayContainer.getContainerElement();\n const siblings = overlayContainerElement.parentElement?.children;\n\n if (!siblings) return;\n\n for (let i = siblings.length - 1; i > -1; i--) {\n const sibling = siblings[i];\n\n if (\n sibling === overlayContainerElement ||\n sibling.nodeName === 'SCRIPT' ||\n sibling.nodeName === 'STYLE' ||\n sibling.hasAttribute('aria-live')\n ) {\n continue;\n }\n\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n\n private revealContentForAssistiveTechnology(sidepanelRef: KbqSidepanelRef) {\n this.modalSidepanels.delete(sidepanelRef);\n\n if (this.modalSidepanels.size === 0) {\n this.restoreContentForAssistiveTechnology();\n }\n }\n\n private restoreContentForAssistiveTechnology() {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue === null) {\n element.removeAttribute('aria-hidden');\n } else {\n element.setAttribute('aria-hidden', previousValue);\n }\n });\n\n this.ariaHiddenElements.clear();\n this.modalSidepanels.clear();\n }\n\n private getLowerSidepanelsWithSamePosition(index: number): KbqSidepanelRef[] {\n const openedSidepanelsWithSamePosition = this.getOpenedSidepanelsWithSamePosition(\n this.openedSidepanels[index].config\n );\n\n return [\n openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 2],\n openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 3]\n ];\n }\n}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { NgModule } from '@angular/core';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqTitleModule } from '@koobiq/components/title';\nimport { KbqSidepanelContainerComponent } from './sidepanel-container.component';\nimport {\n KbqSidepanelActions,\n KbqSidepanelBody,\n KbqSidepanelClose,\n KbqSidepanelFooter,\n KbqSidepanelHeader\n} from './sidepanel-directives';\nimport { KbqSidepanelService } from './sidepanel.service';\n\n@NgModule({\n imports: [\n OverlayModule,\n PortalModule,\n KbqButtonModule,\n KbqIconModule,\n KbqTitleModule,\n A11yModule,\n KbqSidepanelContainerComponent,\n KbqSidepanelClose,\n KbqSidepanelHeader,\n KbqSidepanelBody,\n KbqSidepanelFooter,\n KbqSidepanelActions\n ],\n providers: [KbqSidepanelService],\n exports: [\n KbqSidepanelContainerComponent,\n KbqSidepanelClose,\n KbqSidepanelHeader,\n KbqSidepanelBody,\n KbqSidepanelFooter,\n KbqSidepanelActions\n ]\n})\nexport class KbqSidepanelModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"koobiq-components-sidepanel.mjs","sources":["../../../packages/components/sidepanel/sidepanel-config.ts","../../../packages/components/sidepanel/sidepanel-animations.ts","../../../packages/components/sidepanel/sidepanel-container.component.ts","../../../packages/components/sidepanel/sidepanel-container.component.html","../../../packages/components/sidepanel/sidepanel-ref.ts","../../../packages/components/sidepanel/sidepanel.service.ts","../../../packages/components/sidepanel/sidepanel-directives.ts","../../../packages/components/sidepanel/sidepanel.module.ts","../../../packages/components/sidepanel/koobiq-components-sidepanel.ts"],"sourcesContent":["import { ScrollStrategy } from '@angular/cdk/overlay';\nimport { InjectionToken, Injector } from '@angular/core';\n\n/** Injection token that can be used to access the data that was passed in to a sidepanel. */\nexport const KBQ_SIDEPANEL_DATA = new InjectionToken<any>('KbqSidepanelData');\n\nexport enum KbqSidepanelPosition {\n Right = 'right',\n Left = 'left',\n Top = 'top',\n Bottom = 'bottom'\n}\n\nexport enum KbqSidepanelSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large'\n}\n\nexport class KbqSidepanelConfig<D = any> {\n /** ID for the sidepanel. If omitted, a unique one will be generated. */\n id?: string;\n\n /**\n * Persists whether this sidepanel is open, under this key, so the application can bring it back on\n * the next visit — see `KbqSidepanelService.wasOpen()`.\n *\n * Omit it and nothing is persisted. The key is the opt-in because there is nothing else stable to\n * persist under: a sidepanel lives in an overlay, and `id` falls back to a counter that means\n * something different on every load.\n */\n stateSavingKey?: string;\n\n /** Whether the focus trap is active. Defaults to whether the sidepanel has a backdrop. */\n trapFocus?: boolean;\n\n /** capture focus on initialization. This option sets cdkTrapFocusAutoCapture. Defaults to `true`. */\n trapFocusAutoCapture?: boolean;\n\n /**\n * Accessible name of the sidepanel, used when no `kbq-sidepanel-header` names it and no\n * `ariaLabelledBy` is given.\n */\n ariaLabel?: string;\n\n /**\n * Id of the element that labels the sidepanel. When omitted, `kbq-sidepanel-header` labels the\n * sidepanel with its own title.\n */\n ariaLabelledBy?: string;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n position?: KbqSidepanelPosition = KbqSidepanelPosition.Right;\n\n size?: KbqSidepanelSize = KbqSidepanelSize.Medium;\n\n /** Whether the sidepanel has a backdrop. */\n hasBackdrop?: boolean = true;\n\n backdropClass?: string;\n\n /** Whether the user can use escape or clicking outside to close the sidepanel. */\n disableClose?: boolean = false;\n\n /** Custom class for the overlay pane. */\n overlayPanelClass?: string | string[] = '';\n\n /**\n * Injector used for the instantiation of the component to be attached.\n * Allows to pass a custom injector to provide a dependency injection hierarchy for the sidepanel content.\n */\n injector?: Injector;\n\n /**\n * Scroll strategy of the sidepanel overlay, resolved once when the sidepanel opens.\n * Defaults to blocking the page scroll for sidepanels with a backdrop and to repositioning for the rest.\n */\n scrollStrategy?: () => ScrollStrategy;\n}\n","import { KbqSidepanelPosition } from './sidepanel-config';\n\n/** @docs-private */\nexport enum KbqSidepanelAnimationState {\n Void = 'void',\n Visible = 'visible',\n Hidden = 'hidden',\n Lower = 'lower',\n BottomPanel = 'bottom-panel',\n BecomingNormal = 'becoming-normal'\n}\n\n/**\n * A state transition of the sidepanel container: started, or ended — finished, or interrupted by the next one.\n *\n * @docs-private\n */\nexport interface KbqSidepanelAnimationEvent {\n phaseName: 'start' | 'done';\n toState: KbqSidepanelAnimationState;\n}\n\n/** @internal */\nexport const kbqSidepanelTransformAnimation: Record<\n KbqSidepanelPosition,\n { in: string; out: string; lower: string; bottomPanel: string; becomingNormal: string }\n> = {\n right: {\n in: 'translateX(100%)',\n out: 'translateX(0)',\n lower: 'scale(0.95) translateX(calc(-1 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n bottomPanel: 'scale(0.9) translateX(calc(-2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateX(0) scale(1)'\n },\n left: {\n in: 'translateX(-100%) scale(1)',\n out: 'translateX(0%) scale(1)',\n lower: 'scale(0.95) translateX(var(--kbq-sidepanel-size-panel-lower-offset))',\n bottomPanel: 'scale(0.9) translateX(calc(2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateX(0%) scale(1)'\n },\n top: {\n in: 'translateY(-100%)',\n out: 'translateY(0%)',\n lower: 'scale(0.95) translateY(var(--kbq-sidepanel-size-panel-lower-offset))',\n bottomPanel: 'scale(0.9) translateY(calc(2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateY(0%) scale(1)'\n },\n bottom: {\n in: 'translateY(100%)',\n out: 'translateY(0%)',\n lower: 'scale(0.95) translateY(calc(-1 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n bottomPanel: 'scale(0.9) translateY(calc(-2 * var(--kbq-sidepanel-size-panel-lower-offset)))',\n becomingNormal: 'translateY(0%) scale(1)'\n }\n};\n","import { CdkTrapFocus, ConfigurableFocusTrapFactory, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { BasePortalOutlet, CdkPortalOutlet, ComponentPortal, TemplatePortal } from '@angular/cdk/portal';\nimport {\n afterNextRender,\n AfterRenderRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ComponentRef,\n computed,\n ElementRef,\n EmbeddedViewRef,\n inject,\n InjectionToken,\n Injector,\n OnDestroy,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { kbqAfterAnimations, kbqAnimationsDisabled } from '@koobiq/components/core';\nimport { Observable, Subject } from 'rxjs';\nimport {\n KbqSidepanelAnimationEvent,\n KbqSidepanelAnimationState,\n kbqSidepanelTransformAnimation\n} from './sidepanel-animations';\nimport { KbqSidepanelConfig, KbqSidepanelPosition, KbqSidepanelSize } from './sidepanel-config';\n\nexport const KBQ_SIDEPANEL_WITH_INDENT = new InjectionToken<boolean>('kbq-sidepanel-with-indent');\n\n@Component({\n selector: 'kbq-sidepanel-container',\n imports: [\n CdkPortalOutlet,\n CdkTrapFocus\n ],\n templateUrl: './sidepanel-container.component.html',\n styleUrls: ['./sidepanel.scss', './sidepanel-tokens.scss'],\n // The configurable trap adds an inert strategy that pulls escaping focus back, which the anchor-only\n // default cannot do. Scoped to the container so it does not replace the factory the rest of the\n // application injects.\n providers: [{ provide: FocusTrapFactory, useClass: ConfigurableFocusTrapFactory }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-sidepanel-container kbq-sidepanel-container_shadowed',\n '[class]': 'size',\n '[class.kbq-sidepanel_nested]': 'withIndent',\n '[attr.id]': 'id',\n '[attr.tabindex]': '-1',\n '[attr.role]': '\"dialog\"',\n '[attr.aria-modal]': 'trapFocus ? \"true\" : null',\n '[attr.aria-label]': 'sidepanelConfig.ariaLabel ?? null',\n '[attr.aria-labelledby]': 'ariaLabelledBy',\n '[class.kbq-animations-disabled]': 'animationsDisabled',\n '[style.transform]': 'stateTransform()',\n '[style.opacity]': 'stateOpacity()'\n }\n})\nexport class KbqSidepanelContainerComponent extends BasePortalOutlet implements OnDestroy {\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private changeDetectorRef = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n sidepanelConfig = inject(KbqSidepanelConfig);\n\n /** Whether the sidepanel moves without motion. */\n protected readonly animationsDisabled = kbqAnimationsDisabled();\n\n /** Whether the panel exposes the clickable indent strip of the sidepanel stacked underneath it. */\n get withIndent(): boolean {\n return this._withIndent();\n }\n\n set withIndent(value: boolean) {\n this._withIndent.set(value);\n }\n\n private readonly _withIndent = signal(inject(KBQ_SIDEPANEL_WITH_INDENT));\n\n /** ID for the container DOM element. */\n id: string;\n\n /**\n * Id of the element naming the sidepanel. Comes from the config, or from `kbq-sidepanel-header`.\n *\n * @docs-private\n */\n get ariaLabelledBy(): string | null {\n return this._ariaLabelledBy();\n }\n\n /** @docs-private */\n set ariaLabelledBy(value: string | null) {\n this._ariaLabelledBy.set(value);\n }\n\n // A signal: the header reports its title while this view is being checked, which a `markForCheck` would miss.\n private readonly _ariaLabelledBy = signal(this.sidepanelConfig.ariaLabelledBy ?? null);\n\n /** The portal outlet inside of this container into which the content will be loaded. */\n readonly portalOutlet = viewChild.required(CdkPortalOutlet);\n\n /**\n * The state of the sidepanel: on screen, closing, or stacked under another one.\n *\n * @docs-private\n */\n readonly animationState = signal<KbqSidepanelAnimationState>(KbqSidepanelAnimationState.Void);\n\n /**\n * Reports each state transition starting and ending.\n *\n * @docs-private\n */\n readonly animationStateChanged = new Subject<KbqSidepanelAnimationEvent>();\n\n /** The transition in progress, ended early by the next one. */\n private pendingTransition?: { state: KbqSidepanelAnimationState; wait: { destroy(): void } };\n\n /** Transition events held until the render that applies the state, in the order they happened. */\n private readonly unreportedEvents: KbqSidepanelAnimationEvent[] = [];\n\n /** Reports the held events once the next render is over. */\n private reportAfterRender?: AfterRenderRef;\n\n /** @docs-private */\n get size(): string {\n return `kbq-sidepanel_${this.sidepanelConfig.size ?? KbqSidepanelSize.Medium}`;\n }\n\n /**\n * Defaults to `true` in both modalities: it is what moves focus into the panel on open and returns\n * it to the trigger on close, and `CdkTrapFocus` restores focus only when it captured it.\n *\n * @docs-private\n */\n get trapFocusAutoCapture(): boolean {\n return this.sidepanelConfig.trapFocusAutoCapture ?? true;\n }\n\n /** @docs-private */\n get trapFocus(): boolean {\n return this.sidepanelConfig.trapFocus ?? !!this.sidepanelConfig.hasBackdrop;\n }\n\n /** @docs-private */\n protected readonly indentClickEmitter = new Subject<MouseEvent>();\n\n /** Whether the component has been destroyed. */\n private destroyed: boolean;\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /**\n * Gets an observable that emits when the indent has been clicked.\n *\n * @docs-private\n */\n indentClick(): Observable<MouseEvent> {\n return this.indentClickEmitter.asObservable();\n }\n\n /** Attach a component portal as content to this sidepanel container. */\n attachComponentPortal<T>(portal: ComponentPortal<T>): ComponentRef<T> {\n this.validatePortalAttached();\n this.setPanelClass();\n\n const componentRef = this.portalOutlet().attachComponentPortal(portal);\n\n // The portal outlet inserts the attached component's own host element between\n // `.kbq-sidepanel-content` and the header/body/footer, and a plain block there takes the\n // body out of the flex column that makes it scroll.\n (componentRef.location.nativeElement as HTMLElement).classList.add('kbq-sidepanel-content-host');\n\n return componentRef;\n }\n\n /** Attach a template portal as content to this sidepanel container. */\n attachTemplatePortal<C>(portal: TemplatePortal<C>): EmbeddedViewRef<C> {\n this.validatePortalAttached();\n this.setPanelClass();\n\n return this.portalOutlet().attachTemplatePortal(portal);\n }\n\n /** Begin animation of the sidepanel entrance into view. */\n enter(): void {\n if (this.destroyed) return;\n\n this.animationState.set(KbqSidepanelAnimationState.Visible);\n this.changeDetectorRef.detectChanges();\n this.startTransition(KbqSidepanelAnimationState.Visible);\n }\n\n /** Begin animation of the sidepanel exiting from view. */\n exit(): void {\n if (this.destroyed) return;\n\n this.setAnimationState(KbqSidepanelAnimationState.Hidden);\n }\n\n /** @docs-private */\n setAnimationState(state: KbqSidepanelAnimationState): void {\n if (this.destroyed) return;\n\n this.animationState.set(state);\n this.startTransition(state);\n }\n\n /**\n * Transform of the panel in its current state.\n *\n * @docs-private\n */\n protected readonly stateTransform = computed((): string | null => {\n const transforms = kbqSidepanelTransformAnimation[this.position];\n\n switch (this.animationState()) {\n case KbqSidepanelAnimationState.Hidden:\n return transforms.in;\n case KbqSidepanelAnimationState.Visible:\n return transforms.out;\n case KbqSidepanelAnimationState.Lower:\n return transforms.lower;\n case KbqSidepanelAnimationState.BottomPanel:\n return transforms.bottomPanel;\n case KbqSidepanelAnimationState.BecomingNormal:\n return transforms.becomingNormal;\n default:\n return null;\n }\n });\n\n /**\n * Opacity of the panel in its current state.\n *\n * @docs-private\n */\n protected readonly stateOpacity = computed((): number | null => {\n switch (this.animationState()) {\n case KbqSidepanelAnimationState.Void:\n case KbqSidepanelAnimationState.BottomPanel:\n return 0;\n case KbqSidepanelAnimationState.Hidden:\n return null;\n default:\n return 1;\n }\n });\n\n /**\n * Recomputes whether this panel exposes an indent strip, after the stack it belongs to changed.\n *\n * @docs-private\n */\n setWithIndent(withIndent: boolean): void {\n this.withIndent = withIndent;\n }\n\n /**\n * Names the sidepanel after the title of its header. A name given through the config wins.\n *\n * @docs-private\n */\n setAriaLabelledBy(id: string): void {\n if (this.ariaLabelledBy !== null) return;\n\n this.ariaLabelledBy = id;\n }\n\n /**\n * Reports the transition to `state` starting, and ending once its CSS transition has.\n *\n * Both are reported after the render that applies the state, as the animation engine did, and never inside\n * `open()` or `close()`: a subscriber that opens another sidepanel would otherwise do so before the stack the\n * call is changing is complete, and one that subscribes right after the call would miss the start.\n */\n private startTransition(state: KbqSidepanelAnimationState): void {\n const pending = this.pendingTransition;\n\n if (pending) {\n pending.wait.destroy();\n this.holdEvent({ phaseName: 'done', toState: pending.state });\n }\n\n this.holdEvent({ phaseName: 'start', toState: state });\n\n const wait = kbqAfterAnimations(\n () => this.elementRef.nativeElement,\n () => {\n this.pendingTransition = undefined;\n this.unreportedEvents.push({ phaseName: 'done', toState: state });\n this.reportEvents();\n },\n this.injector\n );\n\n this.pendingTransition = { state, wait };\n }\n\n private holdEvent(event: KbqSidepanelAnimationEvent): void {\n this.unreportedEvents.push(event);\n this.reportAfterRender ??= afterNextRender(() => this.reportEvents(), { injector: this.injector });\n }\n\n private reportEvents(): void {\n this.reportAfterRender?.destroy();\n\n // One at a time: a subscriber that moves the panel again holds more events, which follow in order.\n for (let event = this.unreportedEvents.shift(); event; event = this.unreportedEvents.shift()) {\n this.animationStateChanged.next(event);\n }\n\n this.reportAfterRender = undefined;\n }\n\n private setPanelClass() {\n this.elementRef.nativeElement.classList.add(`kbq-sidepanel-container_${this.position}`);\n }\n\n private get position(): KbqSidepanelPosition {\n return this.sidepanelConfig.position ?? KbqSidepanelPosition.Right;\n }\n\n private validatePortalAttached() {\n if (this.portalOutlet().hasAttached()) {\n throw Error('Attempting to attach sidepanel content after content is already attached');\n }\n }\n}\n","<div class=\"kbq-sidepanel-wrapper\">\n @if (withIndent) {\n <div class=\"kbq-sidepanel-indent\" (click)=\"indentClickEmitter.next($event)\"></div>\n }\n\n <div class=\"kbq-sidepanel-content\" [cdkTrapFocus]=\"trapFocus\" [cdkTrapFocusAutoCapture]=\"trapFocusAutoCapture\">\n <ng-template cdkPortalOutlet />\n </div>\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { signal, untracked } from '@angular/core';\nimport { ESCAPE, isHtmlElement, KbqOverflowShadowState } from '@koobiq/components/core';\nimport { merge, Observable, Subject } from 'rxjs';\nimport { filter, take, tap } from 'rxjs/operators';\nimport { KbqSidepanelAnimationState } from './sidepanel-animations';\nimport { KbqSidepanelConfig } from './sidepanel-config';\nimport { KbqSidepanelContainerComponent } from './sidepanel-container.component';\n\n// Counter for unique sidepanel ids.\nlet uniqueId = 0;\n\nexport class KbqSidepanelRef<T = any, R = any> {\n readonly id: string;\n\n /**\n * Vertical scroll overflow state of the sidepanel body.\n * Updated on scroll and used for visual adjustments.\n */\n readonly bodyOverflow = signal<KbqOverflowShadowState>({ top: false, bottom: false });\n\n /** Instance of the component making up the content of the sidepanel. */\n instance: T;\n\n /** Subject for notifying the user that the sidepanel has been closed and dismissed. */\n private readonly afterClosed$ = new Subject<R | undefined>();\n\n /** Subject for notifying the user that the sidepanel starting closing. */\n private readonly beforeClosed$ = new Subject<void>();\n\n /** Subject for notifying the user that the sidepanel has opened and appeared. */\n private readonly afterOpened$ = new Subject<void>();\n\n /** Result to be passed down to the `afterDismissed` stream. */\n private result: R | undefined;\n\n /** Whether `close()` has already started the closing animation. */\n private closing = false;\n\n constructor(\n public readonly containerInstance: KbqSidepanelContainerComponent,\n public readonly overlayRef: OverlayRef,\n public readonly config: KbqSidepanelConfig\n ) {\n this.id = this.config.id || `kbq-sidepanel-${uniqueId++}`;\n this.containerInstance.id = this.id;\n overlayRef.backdropElement?.classList.add(config.backdropClass ?? 'kbq-overlay-dark-backdrop');\n\n const slideBelowStart = containerInstance.animationStateChanged.pipe(\n filter(\n (event) =>\n event.phaseName === 'start' &&\n [KbqSidepanelAnimationState.Lower, KbqSidepanelAnimationState.BottomPanel].includes(\n event.toState as KbqSidepanelAnimationState\n )\n )\n );\n\n // Act on close\n const beforeClosed = containerInstance.animationStateChanged.pipe(\n filter(({ phaseName, toState }) => phaseName === 'start' && toState === KbqSidepanelAnimationState.Hidden),\n take(1),\n tap(() => {\n this.beforeClosed$.next();\n this.beforeClosed$.complete();\n })\n );\n\n // Emit when opening animation completes\n containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done' && event.toState === KbqSidepanelAnimationState.Visible),\n take(1)\n )\n .subscribe(() => {\n this.afterOpened$.next();\n this.afterOpened$.complete();\n });\n\n containerInstance.animationStateChanged\n .pipe(\n filter(\n (event) =>\n event.phaseName === 'start' && event.toState === KbqSidepanelAnimationState.BecomingNormal\n )\n )\n .subscribe(() => {\n if (overlayRef.backdropElement?.style) {\n overlayRef.backdropElement.style.opacity = '1';\n }\n });\n\n merge(slideBelowStart, beforeClosed).subscribe(() => {\n if (overlayRef.backdropElement?.style) {\n overlayRef.backdropElement.style.opacity = '0';\n }\n });\n\n // Dispose overlay when closing animation is complete\n containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done' && event.toState === KbqSidepanelAnimationState.Hidden),\n take(1)\n )\n .subscribe(() => {\n overlayRef.dispose();\n this.afterClosed$.next(this.result);\n this.afterClosed$.complete();\n });\n\n overlayRef\n .keydownEvents()\n .pipe(\n // keyCode is deprecated, but IE11 and Edge don't support code property, which we need use instead\n filter((event) => event.keyCode === ESCAPE)\n )\n .subscribe((event) => {\n // CDK hands the key to this overlay after the layers above it, such as a tooltip, a popover or a\n // confirm dialog, have handled it: one that closed spent it, and the sidepanel stays open.\n if (event.defaultPrevented || this.config.disableClose) return;\n\n event.preventDefault();\n this.close();\n });\n\n merge(\n overlayRef.backdropClick(),\n this.containerInstance.indentClick(),\n overlayRef.outsidePointerEvents().pipe(filter((event) => this.isClickInsideSamePositionStack(event)))\n ).subscribe(() => {\n if (this.config.disableClose) return;\n\n this.close();\n });\n }\n\n close(result?: R): void {\n // Untracked, as `KbqSidepanelService.open()`: called from a consumer's `effect()`, the state of the sidepanels\n // stacked under this one, read and written on the way, would make the effect run again as they move.\n untracked(() => this.startClosing(result));\n }\n\n /** Body of `close()`. */\n private startClosing(result: R | undefined): void {\n if (this.closing) return;\n\n this.closing = true;\n\n // Transition the backdrop in parallel to the sidepanel.\n this.containerInstance.animationStateChanged\n .pipe(\n filter((event) => event.phaseName === 'done'),\n take(1)\n )\n .subscribe(() => this.overlayRef.detachBackdrop());\n\n this.result = result;\n this.containerInstance.exit();\n }\n\n /** Gets an observable that is notified when the sidepanel is started closing. */\n beforeClosed(): Observable<void> {\n return this.beforeClosed$.asObservable();\n }\n\n /** Gets an observable that is notified when the sidepanel is finished closing. */\n afterClosed(): Observable<R | undefined> {\n return this.afterClosed$.asObservable();\n }\n\n /** Gets an observable that is notified when the sidepanel has opened and appeared. */\n afterOpened(): Observable<void> {\n return this.afterOpened$.asObservable();\n }\n\n /**\n * A pointer event outside this overlay closes the sidepanel only when it lands in a sidepanel of the\n * same stack — that is the exposed strip of a panel opened over this one. Panels at other edges do\n * not overlap this one and must not close it.\n */\n private isClickInsideSamePositionStack(event: MouseEvent): boolean {\n if (!isHtmlElement(event.target)) return false;\n\n const container = event.target.closest('.kbq-sidepanel-container');\n\n return !!container && container.classList.contains(`kbq-sidepanel-container_${this.config.position}`);\n }\n}\n","import { Overlay, OverlayConfig, OverlayContainer, OverlayRef, ScrollStrategy } from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType, TemplatePortal } from '@angular/cdk/portal';\nimport {\n ComponentRef,\n Injectable,\n InjectionToken,\n Injector,\n OnDestroy,\n TemplateRef,\n inject,\n isDevMode,\n untracked\n} from '@angular/core';\nimport { KBQ_STATE_STORE, KbqStateSavingRef, KbqStateSavingService, KbqStateStore } from '@koobiq/components/core';\nimport { KbqSidepanelAnimationState } from './sidepanel-animations';\nimport { KBQ_SIDEPANEL_DATA, KbqSidepanelConfig } from './sidepanel-config';\nimport { KBQ_SIDEPANEL_WITH_INDENT, KbqSidepanelContainerComponent } from './sidepanel-container.component';\nimport { KbqSidepanelRef } from './sidepanel-ref';\n\n/** Injection token that can be used to specify default sidepanel options. */\nexport const KBQ_SIDEPANEL_DEFAULT_OPTIONS = new InjectionToken<KbqSidepanelConfig>('kbq-sidepanel-default-options');\n\n/** The persisted state of a sidepanel — whether it was open. */\nexport interface KbqSidepanelState {\n opened: boolean;\n}\n\n/**\n * Coerces a raw persisted payload into a `KbqSidepanelState`, returning `null` for anything\n * unrecognizable.\n *\n * Web storage is origin-wide and user-writable, so a payload is never trusted — without this, a\n * hand-edited entry would decide whether a sidepanel opens.\n */\nconst normalizeSidepanelState = (parsed: unknown): KbqSidepanelState | null => {\n const opened = (parsed as Partial<KbqSidepanelState> | null)?.opened;\n\n return typeof opened === 'boolean' ? { opened } : null;\n};\n\n/**\n * What `KbqStateSavingService` reports for one persisted sidepanel key.\n *\n * The five components that persist register themselves, and a sidepanel has nothing to register: it is\n * closed exactly when its entry matters, and while open it lives in an overlay with no stable position\n * to be identified by. So the service stands in for it, and `host` stays `null`.\n */\nclass KbqSidepanelStateSavingRef implements KbqStateSavingRef {\n readonly name = 'kbq-sidepanel';\n readonly host = null;\n\n /** Persistence is opted into by supplying a `stateSavingKey`, so a tracked key is always enabled. */\n readonly enabled = true;\n\n state: unknown = null;\n\n constructor(\n readonly key: string,\n private readonly store: KbqStateStore\n ) {}\n\n clear(): void {\n this.store.removeState(this.key);\n this.state = null;\n }\n}\n\n/** Context of a sidepanel opened from a `TemplateRef`. */\ntype KbqSidepanelTemplateContext<T, D> = {\n $implicit: D | null | undefined;\n sidepanelRef: KbqSidepanelRef<T>;\n};\n\n/** Copies the entries that carry a value, so an unset optional does not overwrite a default with `undefined`. */\nconst assignDefined = <T extends object>(target: T, source: T | null | undefined): void => {\n if (!source) return;\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n if (source[key] !== undefined) {\n target[key] = source[key];\n }\n }\n};\n\n@Injectable({ providedIn: 'root' })\nexport class KbqSidepanelService implements OnDestroy {\n private overlay = inject(Overlay);\n private overlayContainer = inject(OverlayContainer);\n private injector = inject(Injector);\n private defaultOptions = inject<KbqSidepanelConfig>(KBQ_SIDEPANEL_DEFAULT_OPTIONS, { optional: true });\n private parentSidepanelService = inject(KbqSidepanelService, { optional: true, skipSelf: true });\n\n /** Sidepanels opened through this very instance, closed when this injector level is destroyed. */\n private readonly openedSidepanelsAtThisLevel: KbqSidepanelRef[] = [];\n\n /** The shared stack. Only the root-most instance ever holds it; the rest reach it through the getter. */\n private readonly rootOpenedSidepanels: KbqSidepanelRef[] = [];\n\n /** Sidepanels that hid the rest of the page from assistive technology when they opened. */\n private readonly modalSidepanels = new Set<KbqSidepanelRef>();\n\n /** Elements outside the overlay container that were hidden from assistive technology, and their previous state. */\n private readonly ariaHiddenElements = new Map<Element, string | null>();\n\n private readonly stateStore = inject(KBQ_STATE_STORE);\n private readonly stateSavingService = inject(KbqStateSavingService);\n\n /**\n * One entry per `stateSavingKey` this service has seen, so `KbqStateSavingService` reports what is\n * stored as claimed. Without it a closed sidepanel's entry has nothing live behind it, and\n * `clearOrphans()` would sweep away exactly what the next visit is meant to restore.\n */\n private readonly stateSavingRefs = new Map<string, KbqSidepanelStateSavingRef>();\n\n private readonly bulkClosedAtThisLevel = new WeakSet<KbqSidepanelRef>();\n\n /** Keeps track of the currently-open sidepanels. */\n get openedSidepanels(): KbqSidepanelRef[] {\n return this.parentSidepanelService ? this.parentSidepanelService.openedSidepanels : this.rootOpenedSidepanels;\n }\n\n /** The instance holding the shared stack and the assistive-technology bookkeeping. */\n private get rootService(): KbqSidepanelService {\n return this.parentSidepanelService?.rootService ?? this;\n }\n\n /**\n * The sidepanels being closed as a group rather than one at a time, whose close is not recorded.\n *\n * Shared up the chain like `openedSidepanels`: `closeAll()` reaches panels another instance opened,\n * and it is that instance's subscription that would record the close.\n */\n private get bulkClosed(): WeakSet<KbqSidepanelRef> {\n return this.parentSidepanelService ? this.parentSidepanelService.bulkClosed : this.bulkClosedAtThisLevel;\n }\n\n ngOnDestroy() {\n // Only close the sidepanels opened at this level on destroy,\n // since the parent service may still be active.\n this.closeSidepanels(this.openedSidepanelsAtThisLevel);\n\n // The bookkeeping is shared, so only the instance that owns it may drop it: a child level going\n // away must not reveal the page under a modal sidepanel opened somewhere else.\n if (this.rootService === this) {\n this.restoreContentForAssistiveTechnology();\n }\n\n this.stateSavingRefs.forEach((ref) => this.stateSavingService.unregister(ref));\n this.stateSavingRefs.clear();\n }\n\n open<T, D = any>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config?: KbqSidepanelConfig<D>\n ): KbqSidepanelRef<T> {\n // Untracked, as `KbqSidepanelRef.close()`: called from a consumer's `effect()`, the state of the sidepanels\n // already open, read and written on the way, would make the effect run again — and open another sidepanel —\n // as soon as it changes.\n return untracked(() => this.openSidepanel(componentOrTemplateRef, config));\n }\n\n /** Body of `open()`. */\n private openSidepanel<T, D>(\n componentOrTemplateRef: ComponentType<T> | TemplateRef<T>,\n config: KbqSidepanelConfig<D> | undefined\n ): KbqSidepanelRef<T> {\n const fullConfig = new KbqSidepanelConfig<D>();\n\n assignDefined(fullConfig, this.defaultOptions);\n assignDefined(fullConfig, config);\n\n if (fullConfig.id && this.getSidepanelById(fullConfig.id)) {\n throw Error(`Sidepanel with id \"${fullConfig.id}\" exists already. The sidepanel id must be unique.`);\n }\n\n if (isDevMode() && fullConfig.stateSavingKey && this.isStateSavingKeyInUse(fullConfig.stateSavingKey)) {\n // eslint-disable-next-line no-console\n console.warn(\n `kbq-sidepanel: another open sidepanel already persists under the state saving key ` +\n `\"${fullConfig.stateSavingKey}\". They share one entry, so closing either records the ` +\n 'panel as closed. Give each one its own key.'\n );\n }\n\n const overlayRef = this.createOverlay(fullConfig);\n const container = this.attachContainer(overlayRef, fullConfig);\n const ref = new KbqSidepanelRef<T>(container, overlayRef, fullConfig);\n\n if (componentOrTemplateRef instanceof TemplateRef) {\n container.attachTemplatePortal(\n new TemplatePortal<KbqSidepanelTemplateContext<T, D>>(\n componentOrTemplateRef as TemplateRef<KbqSidepanelTemplateContext<T, D>>,\n null!,\n { $implicit: fullConfig.data, sidepanelRef: ref },\n this.createInjector(fullConfig, ref, container)\n )\n );\n } else {\n const portal = new ComponentPortal(\n componentOrTemplateRef,\n undefined,\n this.createInjector(fullConfig, ref, container)\n );\n const contentRef = container.attachComponentPortal(portal);\n\n ref.instance = contentRef.instance;\n }\n\n this.openedSidepanels.push(ref);\n this.openedSidepanelsAtThisLevel.push(ref);\n // The panel that was on top until now has to give the strip up, or the stack shows one per level.\n this.updateIndents(fullConfig);\n\n if (container.trapFocus) {\n this.rootService.hideContentFromAssistiveTechnology(ref);\n }\n\n ref.beforeClosed().subscribe(() => this.updateAnimationState(ref));\n ref.afterClosed().subscribe(() => {\n this.removeOpenSidepanel(ref);\n\n // A group close is the owner going away rather than a decision to close this panel, and\n // keeping the flag is what lets the next visit bring the panel back.\n if (!this.bulkClosed.has(ref)) {\n this.writeState(fullConfig.stateSavingKey, false);\n }\n });\n\n this.writeState(fullConfig.stateSavingKey, true);\n\n container.enter();\n\n return ref;\n }\n\n /**\n * Closes all of the currently-open sidepanels.\n *\n * Closing as a group is not recorded — see `wasOpen()`.\n */\n closeAll(): void {\n this.closeSidepanels(this.openedSidepanels);\n }\n\n /**\n * Whether the sidepanel persisted under `key` was open when it was last recorded, so the\n * application can open it again:\n *\n * ```ts\n * if (sidepanel.wasOpen('filters')) this.openFilters();\n * ```\n *\n * A sidepanel cannot restore itself the way the components that persist do. It exists only while it\n * is open, so at the point the state would be read there is nothing left to read it — and what to\n * reopen is a component class or a `TemplateRef` and its `data`, none of which survives being\n * written to storage. This service keeps the flag; the application keeps the rest.\n *\n * What is recorded is a sidepanel opened and closed on its own. Closing a group — `closeAll()`, or\n * this service being destroyed — leaves the flag alone, so a panel that was open when the page went\n * away comes back whether the page was reloaded or navigated away from.\n *\n * Reading claims the key: from here on `KbqStateSavingService` reports the entry as this service's\n * rather than orphaned. It has to happen on read, because for a sidepanel that is not open this is\n * the only call there is.\n */\n wasOpen(key: string): boolean {\n if (!key || !this.stateSavingService.isEnabled()) return false;\n\n const state = normalizeSidepanelState(this.stateStore.getState(key));\n\n this.trackState(key, state);\n\n return state?.opened ?? false;\n }\n\n /**\n * Removes what is persisted under `key`.\n *\n * Persistence itself stays on: a sidepanel opened under that key again is recorded again.\n */\n clearSavedState(key: string): void {\n if (!key) return;\n\n this.stateStore.removeState(key);\n this.stateSavingRefs.get(key)?.clear();\n this.stateSavingService.notify();\n }\n\n /**\n * Finds an open sidepanel by its id.\n *\n * @param id ID to use when looking up the sidepanel.\n */\n getSidepanelById(id: string): KbqSidepanelRef | undefined {\n return this.openedSidepanels.find((sidepanel) => sidepanel.id === id);\n }\n\n /**\n * Attaches the sidepanel container component to the overlay.\n */\n private attachContainer(overlayRef: OverlayRef, config: KbqSidepanelConfig): KbqSidepanelContainerComponent {\n const openedSidepanelsWithSamePosition = this.getOpenedSidepanelsWithSamePosition(config);\n\n const lower = openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 1];\n const bottom = openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 2];\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.Lower);\n this.setAnimationState(bottom, KbqSidepanelAnimationState.BottomPanel);\n\n const injector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: KbqSidepanelConfig, useValue: config },\n { provide: KBQ_SIDEPANEL_WITH_INDENT, useValue: openedSidepanelsWithSamePosition.length >= 1 }\n ]\n });\n\n const containerPortal = new ComponentPortal(KbqSidepanelContainerComponent, undefined, injector);\n const containerRef: ComponentRef<KbqSidepanelContainerComponent> = overlayRef.attach(containerPortal);\n\n return containerRef.instance;\n }\n\n /**\n * Creates a custom injector to be used inside the sidepanel. This allows a component loaded inside\n * of a sidepanel to close itself and, optionally, to return a value.\n *\n * @param config Config object that is used to construct the sidepanel.\n * @param sidepanelRef Reference to the sidepanel.\n * @param sidepanelContainer Sidepanel container element that wraps all of the contents.\n * @returns The custom injector that can be used inside the sidepanel.\n */\n private createInjector<T>(\n config: KbqSidepanelConfig,\n sidepanelRef: KbqSidepanelRef<T>,\n sidepanelContainer: KbqSidepanelContainerComponent\n ): Injector {\n // The KbqSidepanelContainerComponent is injected in the portal as the KbqSidepanelContainerComponent and\n // the sidepanel's content are created out of the same ViewContainerRef and as such, are siblings for injector\n // purposes. To allow the hierarchy that is expected, the KbqSidepanelContainerComponent is explicitly\n // added to the injection tokens.\n\n return Injector.create({\n parent: config.injector ?? this.injector,\n providers: [\n { provide: KbqSidepanelContainerComponent, useValue: sidepanelContainer },\n { provide: KBQ_SIDEPANEL_DATA, useValue: config.data },\n { provide: KbqSidepanelRef, useValue: sidepanelRef }\n ]\n });\n }\n\n /**\n * Creates a new overlay and places it in the correct location.\n *\n * @param config The user-specified sidepanel config.\n */\n private createOverlay(config: KbqSidepanelConfig): OverlayRef {\n const overlayConfig = new OverlayConfig({\n hasBackdrop: config.hasBackdrop,\n backdropClass: '',\n maxWidth: '100%',\n panelClass: config.overlayPanelClass,\n scrollStrategy: this.resolveScrollStrategy(config),\n positionStrategy: this.overlay.position().global()\n });\n\n return this.overlay.create(overlayConfig);\n }\n\n /**\n * `block()` pins the document with `position: fixed`, which is exactly what the non-modal mode\n * promises not to do, so only a backdropped sidepanel gets it.\n */\n private resolveScrollStrategy(config: KbqSidepanelConfig): ScrollStrategy {\n if (config.scrollStrategy) return config.scrollStrategy();\n\n return config.hasBackdrop ? this.overlay.scrollStrategies.block() : this.overlay.scrollStrategies.reposition();\n }\n\n /**\n * `BlockScrollStrategy` refuses to engage while the page is already blocked, so in a stack the block\n * belongs to the bottom-most backdropped sidepanel and has to be handed over when that one closes.\n *\n * @param closedIndex Index the closed sidepanel held in the stack, before it was removed.\n */\n private restoreScrollBlock(closedConfig: KbqSidepanelConfig, closedIndex: number) {\n if (!closedConfig.hasBackdrop) return;\n\n const ownerIndex = this.openedSidepanels.findIndex(({ config }) => config.hasBackdrop);\n\n // A backdropped sidepanel that was already below the closed one still holds the block. Re-applying\n // the strategy there would release and re-take the page, scrolling it twice for nothing.\n if (ownerIndex === -1 || ownerIndex < closedIndex) return;\n\n const owner = this.openedSidepanels[ownerIndex];\n\n owner.overlayRef.updateScrollStrategy(this.resolveScrollStrategy(owner.config));\n }\n\n private closeSidepanels(sidepanels: KbqSidepanelRef[]) {\n // `reverse()` mutates, and this is called with the live stack.\n [...sidepanels].reverse().forEach((sidepanelRef: KbqSidepanelRef) => {\n // Marked before closing rather than around the loop: `afterClosed()` only fires once the exit\n // animation is done, by which time a flag held for the duration of this call would be gone.\n this.bulkClosed.add(sidepanelRef);\n\n sidepanelRef.close();\n });\n }\n\n /** Whether an already-open sidepanel persists under this key. */\n private isStateSavingKeyInUse(key: string): boolean {\n return this.openedSidepanels.some((ref) => ref.config.stateSavingKey === key);\n }\n\n /** Records whether the sidepanel persisting under `key` is open. A sidepanel without a key is not. */\n private writeState(key: string | undefined, opened: boolean): void {\n if (!key || !this.stateSavingService.isEnabled()) return;\n\n const state: KbqSidepanelState = { opened };\n\n this.stateStore.setState(key, state);\n this.trackState(key, state);\n\n // The write does not go through `KbqStateSavingService`, so it would otherwise go unreported.\n this.stateSavingService.notify();\n }\n\n /** Reports the key to `KbqStateSavingService`, registering it the first time it is seen. */\n private trackState(key: string, state: KbqSidepanelState | null): void {\n let ref = this.stateSavingRefs.get(key);\n\n if (!ref) {\n ref = new KbqSidepanelStateSavingRef(key, this.stateStore);\n\n this.stateSavingRefs.set(key, ref);\n this.stateSavingService.register(ref);\n }\n\n ref.state = state;\n }\n\n private getOpenedSidepanelsWithSamePosition(config: KbqSidepanelConfig): KbqSidepanelRef[] {\n return this.openedSidepanels.filter((sidepanelRef) => sidepanelRef.config.position === config.position);\n }\n\n private updateAnimationState(sidepanelRef: KbqSidepanelRef) {\n const index = this.openedSidepanels.indexOf(sidepanelRef);\n\n // only allow animations if ref is last element in sidepanels list\n if (index === -1 || index !== this.openedSidepanels.length - 1) return;\n\n const [lower, bottom] = this.getLowerSidepanelsWithSamePosition(index);\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.BecomingNormal);\n this.setAnimationState(bottom, KbqSidepanelAnimationState.Lower);\n }\n\n /**\n * Moves a sidepanel into `state`, unless it is closing already.\n *\n * The exit animation is what disposes the overlay, so interrupting it with another state leaves the\n * sidepanel in the DOM and in `openedSidepanels` for good — which is what closing a stack of them as\n * a group used to do to the panels underneath.\n */\n private setAnimationState(sidepanelRef: KbqSidepanelRef | undefined, state: KbqSidepanelAnimationState): void {\n const containerInstance = sidepanelRef?.containerInstance;\n\n if (!containerInstance || containerInstance.animationState() === KbqSidepanelAnimationState.Hidden) return;\n\n containerInstance.setAnimationState(state);\n }\n\n /**\n * Removes a sidepanel from the array of open sidepanels.\n *\n * @param sidepanelRef Sidepanel to be removed.\n */\n private removeOpenSidepanel(sidepanelRef: KbqSidepanelRef) {\n const levelIndex = this.openedSidepanelsAtThisLevel.indexOf(sidepanelRef);\n\n if (levelIndex > -1) {\n this.openedSidepanelsAtThisLevel.splice(levelIndex, 1);\n }\n\n const index = this.openedSidepanels.indexOf(sidepanelRef);\n\n if (index > -1) {\n const [lower] = this.getLowerSidepanelsWithSamePosition(index);\n\n this.setAnimationState(lower, KbqSidepanelAnimationState.Visible);\n\n this.openedSidepanels.splice(index, 1);\n this.updateIndents(sidepanelRef.config);\n this.restoreScrollBlock(sidepanelRef.config, index);\n }\n\n this.rootService.revealContentForAssistiveTechnology(sidepanelRef);\n }\n\n /**\n * Only the top sidepanel of a position stack carries the indent, however deep the stack is — the strip\n * is what reveals the panel underneath, and one per level is the visual noise the docs rule out.\n *\n * The flag belongs to the stack rather than to the panel that had one when it opened, so it is\n * recomputed on both ends: opening demotes the panel that was on top, and closing a *lower* sidepanel\n * would otherwise leave the top one exposing a strip of a panel that is no longer there.\n */\n private updateIndents(config: KbqSidepanelConfig) {\n const stack = this.getOpenedSidepanelsWithSamePosition(config);\n\n stack.forEach((sidepanelRef, index) =>\n sidepanelRef.containerInstance.setWithIndent(stack.length > 1 && index === stack.length - 1)\n );\n }\n\n /**\n * A focus trap constrains Tab, not the virtual cursor, so everything outside the overlay stays\n * reachable to a screen reader while a modal sidepanel is open unless it is hidden explicitly.\n */\n private hideContentFromAssistiveTechnology(sidepanelRef: KbqSidepanelRef) {\n const firstModal = this.modalSidepanels.size === 0;\n\n this.modalSidepanels.add(sidepanelRef);\n\n if (!firstModal) return;\n\n const overlayContainerElement = this.overlayContainer.getContainerElement();\n const siblings = overlayContainerElement.parentElement?.children;\n\n if (!siblings) return;\n\n for (let i = siblings.length - 1; i > -1; i--) {\n const sibling = siblings[i];\n\n if (\n sibling === overlayContainerElement ||\n sibling.nodeName === 'SCRIPT' ||\n sibling.nodeName === 'STYLE' ||\n sibling.hasAttribute('aria-live')\n ) {\n continue;\n }\n\n this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));\n sibling.setAttribute('aria-hidden', 'true');\n }\n }\n\n private revealContentForAssistiveTechnology(sidepanelRef: KbqSidepanelRef) {\n this.modalSidepanels.delete(sidepanelRef);\n\n if (this.modalSidepanels.size === 0) {\n this.restoreContentForAssistiveTechnology();\n }\n }\n\n private restoreContentForAssistiveTechnology() {\n this.ariaHiddenElements.forEach((previousValue, element) => {\n if (previousValue === null) {\n element.removeAttribute('aria-hidden');\n } else {\n element.setAttribute('aria-hidden', previousValue);\n }\n });\n\n this.ariaHiddenElements.clear();\n this.modalSidepanels.clear();\n }\n\n private getLowerSidepanelsWithSamePosition(index: number): KbqSidepanelRef[] {\n const openedSidepanelsWithSamePosition = this.getOpenedSidepanelsWithSamePosition(\n this.openedSidepanels[index].config\n );\n\n return [\n openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 2],\n openedSidepanelsWithSamePosition[openedSidepanelsWithSamePosition.length - 3]\n ];\n }\n}\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport {\n KBQ_A11Y_LOCALE_CONFIGURATION,\n KbqLocaleOverridesDirective,\n KbqOverflowShadowContainer\n} from '@koobiq/components/core';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqScrollbarViewport } from '@koobiq/components/scrollbar';\nimport { KbqTitleDirective } from '@koobiq/components/title';\nimport { KbqSidepanelRef } from './sidepanel-ref';\nimport { KbqSidepanelService } from './sidepanel.service';\n\n/**\n * Button that will close the current sidepanel.\n */\n@Directive({\n selector: 'button[kbq-sidepanel-close], button[kbqSidepanelClose]',\n host: {\n class: 'kbq-sidepanel-close',\n // The camel-case spelling wins when a template binds both, as it did before.\n '(click)': 'sidepanelRef.close(kbqSidepanelClose() ?? sidepanelResult())'\n }\n})\nexport class KbqSidepanelClose {\n private readonly declaredSidepanelRef = inject(KbqSidepanelRef, { optional: true });\n private readonly sidepanelService = inject(KbqSidepanelService);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n /** Value handed to `KbqSidepanelRef.close()`, under the hyphenated spelling of the selector. */\n readonly sidepanelResult = input<any>(undefined, { alias: 'kbq-sidepanel-close' });\n\n /** The same value, under the camel-case spelling. */\n readonly kbqSidepanelClose = input<any>();\n\n /**\n * Sidepanel the button closes: the one it is rendered in. A button rendered outside any sidepanel, such as\n * an item of a dropdown opened from one, closes the sidepanel its template is declared in.\n */\n get sidepanelRef(): KbqSidepanelRef {\n const container = this.elementRef.nativeElement.closest('.kbq-sidepanel-container');\n const renderedIn = container && this.sidepanelService.openedSidepanels.find(({ id }) => id === container.id);\n const sidepanelRef = renderedIn ?? this.declaredSidepanelRef;\n\n if (!sidepanelRef) {\n throw Error('kbqSidepanelClose: the button is neither rendered nor declared inside a sidepanel.');\n }\n\n return sidepanelRef;\n }\n\n constructor() {\n afterNextRender(() => {\n // A button with no type submits the form it sits in, so closing a sidepanel from inside a form would\n // submit it too. A type the author set is left alone. The element carries its static attributes by\n // the time a directive is constructed, so this needs no lifecycle hook.\n if (!this.elementRef.nativeElement.hasAttribute('type')) {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'type', 'button');\n }\n });\n }\n}\n\n/**\n * Header of a sidepanel.\n */\n@Component({\n selector: 'kbq-sidepanel-header',\n imports: [\n KbqButtonModule,\n KbqSidepanelClose,\n KbqIconModule,\n KbqTitleDirective\n ],\n template: `\n <div class=\"kbq-sidepanel-title\" kbq-title [attr.id]=\"titleId\">\n <ng-content />\n </div>\n\n @if (closeable()) {\n <button\n kbq-button\n kbq-sidepanel-close\n type=\"button\"\n [attr.aria-label]=\"a11yLocaleConfiguration().close\"\n [color]=\"'contrast'\"\n [kbqStyle]=\"'transparent'\"\n >\n <i kbq-icon=\"kbq-xmark_16\" [color]=\"'contrast'\"></i>\n </button>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'kbq-sidepanel-header',\n '[class.kbq-sidepanel-header_truncate-text]': 'truncateText()',\n '[style.box-shadow]': 'sidepanelRef.bodyOverflow().top ? \"var(--kbq-shadow-overflow-normal-bottom)\" : null'\n },\n hostDirectives: [\n { directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }\n ]\n})\nexport class KbqSidepanelHeader {\n /** Accessible name for the icon-only close button. */\n protected readonly a11yLocaleConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read(\n 'a11y',\n KBQ_A11Y_LOCALE_CONFIGURATION\n );\n\n /** Add button for close sidepanel. Default false */\n readonly closeable = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n /** Enables text truncation. Default true */\n readonly truncateText = input<boolean, unknown>(true, { transform: booleanAttribute });\n\n /** @docs-private */\n protected sidepanelRef = inject(KbqSidepanelRef);\n\n /** Id of the title element, which is what names the sidepanel to assistive technology. */\n protected readonly titleId = `${this.sidepanelRef.id}-title`;\n\n constructor() {\n this.sidepanelRef.containerInstance.setAriaLabelledBy(this.titleId);\n }\n}\n\n/**\n * Scrollable content container of a sidepanel.\n */\n@Directive({\n selector: 'kbq-sidepanel-body, [kbq-sidepanel-body], kbqSidepanelBody',\n host: {\n class: 'kbq-sidepanel-body'\n },\n hostDirectives: [KbqOverflowShadowContainer, KbqScrollbarViewport]\n})\nexport class KbqSidepanelBody {\n private readonly sidepanelRef = inject(KbqSidepanelRef);\n private readonly overflowContainer = inject(KbqOverflowShadowContainer);\n private readonly scrollbarViewport = inject(KbqScrollbarViewport);\n\n constructor() {\n effect(() => this.sidepanelRef.bodyOverflow.set(this.overflowContainer.overflow()));\n\n this.sidepanelRef\n .afterOpened()\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.scrollbarViewport.flashScrollIndicators());\n }\n}\n\n/**\n * Footer of a sidepanel.\n */\n@Directive({\n selector: 'kbq-sidepanel-footer, [kbq-sidepanel-footer], kbqSidepanelFooter',\n host: {\n class: 'kbq-sidepanel-footer',\n '[style.box-shadow]': 'sidepanelRef.bodyOverflow().bottom ? \"var(--kbq-shadow-overflow-normal-top)\" : null'\n }\n})\nexport class KbqSidepanelFooter {\n /** @docs-private */\n protected sidepanelRef = inject(KbqSidepanelRef);\n}\n\n/**\n * Actions block of a sidepanel footer.\n */\n@Directive({\n selector: 'kbq-sidepanel-actions, [kbq-sidepanel-actions], kbqSidepanelActions',\n host: {\n class: 'kbq-sidepanel-actions'\n }\n})\nexport class KbqSidepanelActions {}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { NgModule } from '@angular/core';\nimport { KbqButtonModule } from '@koobiq/components/button';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqTitleModule } from '@koobiq/components/title';\nimport { KbqSidepanelContainerComponent } from './sidepanel-container.component';\nimport {\n KbqSidepanelActions,\n KbqSidepanelBody,\n KbqSidepanelClose,\n KbqSidepanelFooter,\n KbqSidepanelHeader\n} from './sidepanel-directives';\nimport { KbqSidepanelService } from './sidepanel.service';\n\n@NgModule({\n imports: [\n OverlayModule,\n PortalModule,\n KbqButtonModule,\n KbqIconModule,\n KbqTitleModule,\n A11yModule,\n KbqSidepanelContainerComponent,\n KbqSidepanelClose,\n KbqSidepanelHeader,\n KbqSidepanelBody,\n KbqSidepanelFooter,\n KbqSidepanelActions\n ],\n providers: [KbqSidepanelService],\n exports: [\n KbqSidepanelContainerComponent,\n KbqSidepanelClose,\n KbqSidepanelHeader,\n KbqSidepanelBody,\n KbqSidepanelFooter,\n KbqSidepanelActions\n ]\n})\nexport class KbqSidepanelModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { FocusMonitor, _IdGenerator, CdkMonitorFocus } from '@angular/cdk/a11y';
|
|
|
2
2
|
import { Directionality } from '@angular/cdk/bidi';
|
|
3
3
|
import { SharedResizeObserver } from '@angular/cdk/observers/private';
|
|
4
4
|
import { Platform } from '@angular/cdk/platform';
|
|
5
|
+
import { ViewportRuler } from '@angular/cdk/scrolling';
|
|
5
6
|
import * as i0 from '@angular/core';
|
|
6
7
|
import { InjectionToken, inject, input, numberAttribute, booleanAttribute, model, viewChild, computed, isDevMode, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, DestroyRef, contentChildren, signal, afterNextRender, NgModule } from '@angular/core';
|
|
7
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
@@ -11,18 +12,23 @@ import { KbqResizer, KbqResizable } from '@koobiq/components/resizer';
|
|
|
11
12
|
import { startWith } from 'rxjs/operators';
|
|
12
13
|
|
|
13
14
|
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
14
|
-
/** A number, bare or followed by `px` or
|
|
15
|
-
const SPLITTER_SIZE_PATTERN = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(px
|
|
15
|
+
/** A number, bare or followed by `px`, `%`, `vw` or `vh` — the only size strings a panel understands. */
|
|
16
|
+
const SPLITTER_SIZE_PATTERN = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(px|%|vw|vh)?$/i;
|
|
16
17
|
/**
|
|
17
|
-
* Resolves a declared size
|
|
18
|
+
* Resolves a declared size into pixels.
|
|
18
19
|
*
|
|
19
|
-
* Numbers and `<number>px` strings are pixels, `<number>%` is a share of `total
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* Numbers and `<number>px` strings are pixels already, `<number>%` is a share of `total`, the splitter's own size
|
|
21
|
+
* along the resize axis, and `<number>vw` / `<number>vh` are shares of `viewport`. As in CSS, `vw` stays the
|
|
22
|
+
* viewport's width in a vertical splitter too. Returns `null` for a size that is not set or is anything else,
|
|
23
|
+
* another unit included: reading `10rem` as ten pixels would quietly hand the panel a limit nobody asked for.
|
|
24
|
+
* `null` is how a panel says "take whatever is left".
|
|
25
|
+
*
|
|
26
|
+
* `viewport` is a getter read only for those two units, so a computed that resolves no such size does not depend on
|
|
27
|
+
* the viewport, and resizing the window leaves its splitter alone.
|
|
22
28
|
*
|
|
23
29
|
* @internal
|
|
24
30
|
*/
|
|
25
|
-
function resolveSplitterSize(size, total) {
|
|
31
|
+
function resolveSplitterSize(size, total, viewport = () => ({ width: 0, height: 0 })) {
|
|
26
32
|
if (size === null || size === undefined)
|
|
27
33
|
return null;
|
|
28
34
|
if (typeof size === 'number')
|
|
@@ -30,7 +36,17 @@ function resolveSplitterSize(size, total) {
|
|
|
30
36
|
const [, value, unit] = SPLITTER_SIZE_PATTERN.exec(size.trim()) ?? [];
|
|
31
37
|
if (value === undefined)
|
|
32
38
|
return null;
|
|
33
|
-
|
|
39
|
+
const amount = parseFloat(value);
|
|
40
|
+
switch (unit?.toLowerCase()) {
|
|
41
|
+
case '%':
|
|
42
|
+
return (amount / 100) * total;
|
|
43
|
+
case 'vw':
|
|
44
|
+
return (amount / 100) * viewport().width;
|
|
45
|
+
case 'vh':
|
|
46
|
+
return (amount / 100) * viewport().height;
|
|
47
|
+
default:
|
|
48
|
+
return amount;
|
|
49
|
+
}
|
|
34
50
|
}
|
|
35
51
|
/**
|
|
36
52
|
* Clamps every panel to its own limits and then spends whatever that left over, so the sizes add up to
|
|
@@ -187,8 +203,8 @@ class KbqSplitterPanel {
|
|
|
187
203
|
*/
|
|
188
204
|
this.id = input(inject(_IdGenerator).getId('kbq-splitter-panel-'), ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
189
205
|
/**
|
|
190
|
-
* Size the panel starts at, in pixels (`240`, `'240px'`)
|
|
191
|
-
* Panels that leave it unset share whatever the sized ones did not claim.
|
|
206
|
+
* Size the panel starts at, in pixels (`240`, `'240px'`), as a share of the splitter (`'30%'`) or as a share
|
|
207
|
+
* of the viewport (`'30vw'`, `'30vh'`). Panels that leave it unset share whatever the sized ones did not claim.
|
|
192
208
|
*/
|
|
193
209
|
this.size = input(undefined, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
194
210
|
/** Smallest size the panel may be dragged to. Defaults to `0`. */
|
|
@@ -305,7 +321,8 @@ class KbqSplitterPanel {
|
|
|
305
321
|
this.reportedSizes.add(key);
|
|
306
322
|
// eslint-disable-next-line no-console
|
|
307
323
|
console.warn(`kbq-splitter-panel: \`${name}\` "${size}" is ignored. A size is a number of pixels, ` +
|
|
308
|
-
'a "<number>px" string
|
|
324
|
+
'a "<number>px" string, a "<number>%" share of the splitter ' +
|
|
325
|
+
'or a "<number>vw" / "<number>vh" share of the viewport.');
|
|
309
326
|
}
|
|
310
327
|
}
|
|
311
328
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqSplitterPanel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -407,6 +424,7 @@ class KbqSplitter {
|
|
|
407
424
|
this.platform = inject(Platform);
|
|
408
425
|
this.window = inject(KBQ_WINDOW);
|
|
409
426
|
this.resizeObserver = inject(SharedResizeObserver);
|
|
427
|
+
this.viewportRuler = inject(ViewportRuler);
|
|
410
428
|
this.directionality = inject(Directionality, { optional: true });
|
|
411
429
|
this.options = inject(KBQ_SPLITTER_OPTIONS);
|
|
412
430
|
/** Direction the panels are laid out in. */
|
|
@@ -431,6 +449,11 @@ class KbqSplitter {
|
|
|
431
449
|
this.dragging = computed(() => this.dragBoundary() !== null, ...(ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []));
|
|
432
450
|
/** Splitter size along the resize axis, in pixels; `0` until the first measurement. */
|
|
433
451
|
this.containerSize = signal(0, ...(ngDevMode ? [{ debugName: "containerSize" }] : /* istanbul ignore next */ []));
|
|
452
|
+
/**
|
|
453
|
+
* Viewport size `vw` and `vh` resolve against, in pixels. Known from the start rather than after the first render:
|
|
454
|
+
* tracks resolved against a zero viewport would be what a nested splitter measures itself in.
|
|
455
|
+
*/
|
|
456
|
+
this.viewportSize = signal(this.viewportRuler.getViewportSize(), ...(ngDevMode ? [{ debugName: "viewportSize" }] : /* istanbul ignore next */ []));
|
|
434
457
|
/** Sizes and layout captured when the drag began; every move is measured against these, so clamping cannot drift. */
|
|
435
458
|
this.dragSnapshot = null;
|
|
436
459
|
// `valueSignal` rather than the plain `value` getter: the getter is not reactive, so a `dir` flipped at
|
|
@@ -446,25 +469,18 @@ class KbqSplitter {
|
|
|
446
469
|
return this.rtl() ? [-1, 0] : [1, 0];
|
|
447
470
|
}, ...(ngDevMode ? [{ debugName: "resizerDirection" }] : /* istanbul ignore next */ []));
|
|
448
471
|
/** Smallest size of each panel while it is not collapsed, in pixels. */
|
|
449
|
-
this.expandedMinSizes = computed(() => {
|
|
450
|
-
const total = this.containerSize();
|
|
451
|
-
return this.panels().map((panel) => Math.max(0, resolveSplitterSize(panel.minSize(), total) ?? 0));
|
|
452
|
-
}, ...(ngDevMode ? [{ debugName: "expandedMinSizes" }] : /* istanbul ignore next */ []));
|
|
472
|
+
this.expandedMinSizes = computed(() => this.panels().map((panel) => Math.max(0, this.resolveSize(panel.minSize()) ?? 0)), ...(ngDevMode ? [{ debugName: "expandedMinSizes" }] : /* istanbul ignore next */ []));
|
|
453
473
|
/** Largest size of each panel while it is not collapsed, in pixels. */
|
|
454
474
|
this.expandedMaxSizes = computed(() => {
|
|
455
|
-
const total = this.containerSize();
|
|
456
475
|
const min = this.expandedMinSizes();
|
|
457
476
|
return this.panels().map((panel, index) => {
|
|
458
|
-
const max =
|
|
477
|
+
const max = this.resolveSize(panel.maxSize()) ?? Number.POSITIVE_INFINITY;
|
|
459
478
|
// A maximum below the minimum would make every clamp order-dependent; the minimum wins.
|
|
460
479
|
return Math.max(min[index], max);
|
|
461
480
|
});
|
|
462
481
|
}, ...(ngDevMode ? [{ debugName: "expandedMaxSizes" }] : /* istanbul ignore next */ []));
|
|
463
482
|
/** Size a collapsed panel is pinned to, in pixels. */
|
|
464
|
-
this.collapsedSizes = computed(() => {
|
|
465
|
-
const total = this.containerSize();
|
|
466
|
-
return this.panels().map((panel) => Math.max(0, resolveSplitterSize(panel.collapsedSize(), total) ?? 0));
|
|
467
|
-
}, ...(ngDevMode ? [{ debugName: "collapsedSizes" }] : /* istanbul ignore next */ []));
|
|
483
|
+
this.collapsedSizes = computed(() => this.panels().map((panel) => Math.max(0, this.resolveSize(panel.collapsedSize()) ?? 0)), ...(ngDevMode ? [{ debugName: "collapsedSizes" }] : /* istanbul ignore next */ []));
|
|
468
484
|
/**
|
|
469
485
|
* Panels the drag in progress may take through the gap between their collapsed size and their minimum.
|
|
470
486
|
*
|
|
@@ -493,9 +509,7 @@ class KbqSplitter {
|
|
|
493
509
|
const total = this.containerSize();
|
|
494
510
|
if (!panels.length || total <= 0)
|
|
495
511
|
return panels.map(() => 0);
|
|
496
|
-
const declared = panels.map((panel) => panel.collapsed()
|
|
497
|
-
? (resolveSplitterSize(panel.collapsedSize(), total) ?? 0)
|
|
498
|
-
: resolveSplitterSize(panel.size(), total));
|
|
512
|
+
const declared = panels.map((panel) => panel.collapsed() ? (this.resolveSize(panel.collapsedSize()) ?? 0) : this.resolveSize(panel.size()));
|
|
499
513
|
const flexible = declared.map((_, index) => index).filter((index) => declared[index] === null);
|
|
500
514
|
const claimed = declared.reduce((sum, size) => sum + (size ?? 0), 0);
|
|
501
515
|
const share = flexible.length ? Math.max(0, total - claimed) / flexible.length : 0;
|
|
@@ -542,6 +556,12 @@ class KbqSplitter {
|
|
|
542
556
|
.pipe(startWith(null), takeUntilDestroyed(this.destroyRef))
|
|
543
557
|
.subscribe(() => this.measure());
|
|
544
558
|
});
|
|
559
|
+
// The viewport can change while the splitter's own box does not, a splitter of a fixed width for one,
|
|
560
|
+
// and then no resize observation fires for the `vw` and `vh` sizes that depend on it.
|
|
561
|
+
this.viewportRuler
|
|
562
|
+
.change()
|
|
563
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
564
|
+
.subscribe(() => this.viewportSize.set(this.viewportRuler.getViewportSize()));
|
|
545
565
|
// Swapping the axis changes which dimension every size resolves against, and no resize observation
|
|
546
566
|
// fires for it: the splitter's own box may not have changed at all.
|
|
547
567
|
effect(() => {
|
|
@@ -717,6 +737,10 @@ class KbqSplitter {
|
|
|
717
737
|
return this.layout.set(null);
|
|
718
738
|
this.resizeBy(index, this.minSizes()[index] - this.sizes()[index]);
|
|
719
739
|
}
|
|
740
|
+
/** Resolves a size in the units a panel understands into pixels, with `total` as the splitter's own size. */
|
|
741
|
+
resolveSize(size, total = this.containerSize()) {
|
|
742
|
+
return resolveSplitterSize(size, total, this.viewportSize);
|
|
743
|
+
}
|
|
720
744
|
/**
|
|
721
745
|
* Whether the panels are still the ones the drag was measured against.
|
|
722
746
|
*
|
|
@@ -820,7 +844,7 @@ class KbqSplitter {
|
|
|
820
844
|
// for the leading one before it can compete with the leading panel's own points.
|
|
821
845
|
const pairSize = snapshot.sizes[index] + (snapshot.sizes[index + 1] ?? 0);
|
|
822
846
|
const snapPointsOf = (panel, toLeadingSize) => [...panel.snapSizes(), panel.minSize(), panel.maxSize()]
|
|
823
|
-
.map((size) =>
|
|
847
|
+
.map((size) => this.resolveSize(size, snapshot.total))
|
|
824
848
|
.filter((size) => size !== null)
|
|
825
849
|
.map((size) => ({ size: toLeadingSize(size), tolerance: panel.snapTolerance() }));
|
|
826
850
|
const target = snapSplitterSize(snapshot.sizes[index] + delta, [
|