@siemens/element-ng 49.16.0 → 51.0.0-rc.10
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/README.md +1 -1
- package/fesm2022/siemens-element-ng-about.mjs +41 -25
- package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-accordion.mjs +59 -41
- package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-action-modal.mjs +83 -53
- package/fesm2022/siemens-element-ng-action-modal.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ag-grid.mjs +143 -148
- package/fesm2022/siemens-element-ng-ag-grid.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-application-header.mjs +180 -188
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs +34 -28
- package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-autocomplete.mjs +27 -22
- package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-avatar.mjs +34 -24
- package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-badge.mjs +9 -8
- package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-breadcrumb-router.mjs +17 -14
- package/fesm2022/siemens-element-ng-breadcrumb-router.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-breadcrumb.mjs +21 -17
- package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-card.mjs +72 -47
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-carousel.mjs +58 -34
- package/fesm2022/siemens-element-ng-carousel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-chat-messages.mjs +323 -215
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-circle-status.mjs +39 -25
- package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-color-picker.mjs +44 -34
- package/fesm2022/siemens-element-ng-color-picker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +58 -37
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-common.mjs +22 -22
- package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-connection-strength.mjs +14 -12
- package/fesm2022/siemens-element-ng-connection-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-content-action-bar.mjs +37 -28
- package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-copyright-notice.mjs +19 -14
- package/fesm2022/siemens-element-ng-copyright-notice.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-dashboard.mjs +337 -223
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datatable.mjs +12 -15
- package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-date-range-filter.mjs +126 -76
- package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datepicker.mjs +393 -251
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs +22 -17
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-empty-state.mjs +15 -12
- package/fesm2022/siemens-element-ng-empty-state.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +105 -91
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filter-bar.mjs +33 -25
- package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +274 -165
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-footer.mjs +12 -10
- package/fesm2022/siemens-element-ng-footer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-form.mjs +361 -116
- package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-formly-legacy.mjs +99 -0
- package/fesm2022/siemens-element-ng-formly-legacy.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-formly.mjs +224 -318
- package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs +40 -30
- package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-help-button.mjs +6 -6
- package/fesm2022/siemens-element-ng-help-button.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs +56 -57
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-info-page.mjs +17 -11
- package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-inline-notification.mjs +19 -14
- package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +19 -15
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-landing-page.mjs +121 -75
- package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-language-switcher.mjs +16 -12
- package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-link.mjs +31 -21
- package/fesm2022/siemens-element-ng-link.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-list-details.mjs +132 -66
- package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-loading-spinner.mjs +51 -64
- package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-localization.mjs +14 -12
- package/fesm2022/siemens-element-ng-localization.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-main-detail-container.mjs +116 -51
- package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-maplibre.mjs +401 -0
- package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs +70 -0
- package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs +215 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs +76 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs +86 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs +130 -0
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown.mjs +800 -0
- package/fesm2022/siemens-element-ng-markdown.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-menu.mjs +71 -57
- package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-modal.mjs +14 -11
- package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +251 -206
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs +123 -86
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar.mjs +72 -45
- package/fesm2022/siemens-element-ng-navbar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-notification-item.mjs +19 -11
- package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-number-input.mjs +41 -29
- package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-pagination.mjs +31 -20
- package/fesm2022/siemens-element-ng-pagination.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-password-strength.mjs +33 -24
- package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-password-toggle.mjs +19 -14
- package/fesm2022/siemens-element-ng-password-toggle.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-phone-number.mjs +144 -139
- package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-photo-upload.mjs +85 -52
- package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-pills-input.mjs +56 -41
- package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover-legacy.mjs +43 -28
- package/fesm2022/siemens-element-ng-popover-legacy.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover.mjs +35 -27
- package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-progressbar.mjs +23 -16
- package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-resize-observer.mjs +32 -43
- package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-result-details-list.mjs +12 -10
- package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-search-bar.mjs +38 -37
- package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-select.mjs +265 -170
- package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-shadow-root.mjs +4 -4
- package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-side-panel.mjs +181 -104
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-skip-links.mjs +21 -24
- package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-slider.mjs +45 -30
- package/fesm2022/siemens-element-ng-slider.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-source-chip.mjs +79 -0
- package/fesm2022/siemens-element-ng-source-chip.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-split.mjs +290 -306
- package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-bar.mjs +66 -52
- package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-counter.mjs +15 -11
- package/fesm2022/siemens-element-ng-status-counter.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-toggle.mjs +26 -16
- package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-summary-chip.mjs +25 -16
- package/fesm2022/siemens-element-ng-summary-chip.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-summary-widget.mjs +27 -17
- package/fesm2022/siemens-element-ng-summary-widget.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-system-banner.mjs +13 -10
- package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs +20 -17
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs.mjs +156 -131
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-theme.mjs +29 -6
- package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-threshold.mjs +62 -42
- package/fesm2022/siemens-element-ng-threshold.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-toast-notification.mjs +59 -40
- package/fesm2022/siemens-element-ng-toast-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tooltip.mjs +108 -82
- package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tour.mjs +36 -19
- package/fesm2022/siemens-element-ng-tour.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs +0 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +113 -84
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-typeahead.mjs +69 -49
- package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-wizard.mjs +95 -54
- package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
- package/formly-legacy/package.json +4 -0
- package/maplibre/package.json +4 -0
- package/maplibre/styles/_index.scss +1 -0
- package/maplibre/styles/maplibre-gl.scss +724 -0
- package/markdown/directives/tabs/package.json +4 -0
- package/markdown/extensions/citations/package.json +4 -0
- package/markdown/extensions/katex/package.json +4 -0
- package/markdown/extensions/mermaid/package.json +4 -0
- package/markdown/hightlighter/highlightjs/package.json +4 -0
- package/markdown/package.json +4 -0
- package/package.json +96 -25
- package/schematics/collection.json +5 -0
- package/schematics/{migrations/icon-path-migration → migrate-tabs-legacy}/index.js +1 -1
- package/schematics/migrate-tabs-legacy/migrate-tabs-legacy-rule.js +675 -0
- package/schematics/migrate-tabs-legacy/schema.json +14 -0
- package/schematics/migration.json +4 -4
- package/schematics/migrations/data/class-member-replacement.js +1 -19
- package/schematics/migrations/data/component-property-names.js +1 -25
- package/schematics/migrations/data/component-property-to-child.js +11 -0
- package/schematics/migrations/data/css-custom-properties.js +224 -0
- package/schematics/migrations/data/element-class-changes.js +116 -18
- package/schematics/migrations/data/element-migration-data.js +6 -0
- package/schematics/migrations/data/element-selectors.js +1 -9
- package/schematics/migrations/data/index.js +0 -4
- package/schematics/migrations/data/migration-test-data.js +49 -6
- package/schematics/migrations/data/provider-function-removals.js +7 -0
- package/schematics/migrations/data/symbol-removals.js +17 -7
- package/schematics/migrations/data/symbol-renaming.js +3 -44
- package/schematics/migrations/element-migration/element-migration.js +6 -6
- package/schematics/migrations/utilities/component-property-to-child.migration.js +73 -0
- package/schematics/migrations/utilities/css-custom-property.migration.js +51 -0
- package/schematics/migrations/utilities/element-class-change.migration.js +10 -5
- package/schematics/migrations/utilities/import-removal.js +39 -0
- package/schematics/migrations/utilities/index.js +4 -0
- package/schematics/migrations/utilities/provider-function-removal.migration.js +116 -0
- package/schematics/ng-update/index.js +1 -1
- package/schematics/ng-update/migrate-content-formatter.js +288 -0
- package/schematics/ng-update/migrate-list-details-units.js +86 -0
- package/schematics/ng-update/migrate-main-detail-units.js +89 -0
- package/schematics/ng-update/migrate-markdown-renderer.js +106 -0
- package/schematics/ng-update/migrate-spacers.js +32 -0
- package/schematics/ng-update/migrate-split-collapse.js +276 -0
- package/schematics/ng-update/migrate-split-scale.js +524 -0
- package/schematics/ng-update/migrate-split-sizes.js +107 -0
- package/schematics/ng-update/migrate-to-v51.js +35 -0
- package/schematics/utils/index.js +1 -0
- package/schematics/utils/template-edit-utils.js +35 -0
- package/schematics/utils/template-utils.js +31 -45
- package/source-chip/package.json +4 -0
- package/template-i18n.json +78 -47
- package/types/siemens-element-ng-application-header.d.ts +7 -33
- package/types/siemens-element-ng-avatar.d.ts +1 -1
- package/types/siemens-element-ng-breadcrumb.d.ts +1 -1
- package/types/siemens-element-ng-chat-messages.d.ts +118 -70
- package/types/siemens-element-ng-circle-status.d.ts +1 -1
- package/types/siemens-element-ng-content-action-bar.d.ts +1 -1
- package/types/siemens-element-ng-dashboard.d.ts +2 -2
- package/types/siemens-element-ng-datatable.d.ts +5 -56
- package/types/siemens-element-ng-date-range-filter.d.ts +1 -1
- package/types/siemens-element-ng-datepicker.d.ts +8 -15
- package/types/siemens-element-ng-electron-titlebar.d.ts +1 -1
- package/types/siemens-element-ng-file-uploader.d.ts +13 -31
- package/types/siemens-element-ng-filter-bar.d.ts +1 -1
- package/types/siemens-element-ng-filtered-search.d.ts +4 -4
- package/types/siemens-element-ng-form.d.ts +183 -44
- package/types/siemens-element-ng-formly-legacy.d.ts +40 -0
- package/types/siemens-element-ng-formly.d.ts +34 -167
- package/types/siemens-element-ng-icon.d.ts +2 -19
- package/types/siemens-element-ng-landing-page.d.ts +2 -2
- package/types/siemens-element-ng-list-details.d.ts +25 -3
- package/types/siemens-element-ng-loading-spinner.d.ts +11 -17
- package/types/siemens-element-ng-main-detail-container.d.ts +23 -3
- package/types/siemens-element-ng-maplibre.d.ts +190 -0
- package/types/siemens-element-ng-markdown-directives-tabs.d.ts +10 -0
- package/types/siemens-element-ng-markdown-extensions-citations.d.ts +11 -0
- package/types/siemens-element-ng-markdown-extensions-katex.d.ts +19 -0
- package/types/siemens-element-ng-markdown-extensions-mermaid.d.ts +11 -0
- package/types/siemens-element-ng-markdown-hightlighter-highlightjs.d.ts +48 -0
- package/types/siemens-element-ng-markdown.d.ts +367 -0
- package/types/siemens-element-ng-menu.d.ts +2 -0
- package/types/siemens-element-ng-navbar-vertical-next.d.ts +87 -39
- package/types/siemens-element-ng-navbar-vertical.d.ts +1 -1
- package/types/siemens-element-ng-navbar.d.ts +3 -3
- package/types/siemens-element-ng-notification-item.d.ts +12 -0
- package/types/siemens-element-ng-phone-number.d.ts +28 -10
- package/types/siemens-element-ng-photo-upload.d.ts +4 -4
- package/types/siemens-element-ng-resize-observer.d.ts +0 -17
- package/types/siemens-element-ng-search-bar.d.ts +2 -9
- package/types/siemens-element-ng-select.d.ts +32 -5
- package/types/siemens-element-ng-side-panel.d.ts +25 -11
- package/types/siemens-element-ng-source-chip.d.ts +53 -0
- package/types/siemens-element-ng-split.d.ts +101 -78
- package/types/siemens-element-ng-status-bar.d.ts +5 -13
- package/types/siemens-element-ng-status-counter.d.ts +1 -1
- package/types/siemens-element-ng-system-banner.d.ts +2 -2
- package/types/siemens-element-ng-tabs.d.ts +1 -2
- package/types/siemens-element-ng-theme.d.ts +12 -2
- package/types/siemens-element-ng-threshold.d.ts +1 -1
- package/types/siemens-element-ng-toast-notification.d.ts +0 -1
- package/types/siemens-element-ng-tooltip.d.ts +7 -7
- package/types/siemens-element-ng-translate.d.ts +35 -5
- package/types/siemens-element-ng-tree-view.d.ts +3 -0
- package/types/siemens-element-ng-wizard.d.ts +18 -3
- package/fesm2022/siemens-element-ng-icon-status.mjs +0 -46
- package/fesm2022/siemens-element-ng-icon-status.mjs.map +0 -1
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs +0 -263
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +0 -1
- package/fesm2022/siemens-element-ng-sort-bar.mjs +0 -99
- package/fesm2022/siemens-element-ng-sort-bar.mjs.map +0 -1
- package/icon-status/package.json +0 -4
- package/markdown-renderer/package.json +0 -4
- package/schematics/migrations/icon-path-migration/icon-path-migration.js +0 -95
- package/schematics/ng-update/migrate-to-v49.js +0 -21
- package/schematics/vitest-setup.js +0 -5
- package/sort-bar/package.json +0 -4
- package/types/siemens-element-ng-icon-status.d.ts +0 -25
- package/types/siemens-element-ng-markdown-renderer.d.ts +0 -36
- package/types/siemens-element-ng-sort-bar.d.ts +0 -59
- /package/{LICENSE.md → LICENSE} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, booleanAttribute, numberAttribute, output, signal, linkedSignal, computed, inject, ElementRef, effect, untracked, Component, contentChildren, NgZone, ChangeDetectorRef, DOCUMENT, DestroyRef, NgModule } from '@angular/core';
|
|
3
3
|
import { NgTemplateOutlet } from '@angular/common';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { elementDoubleRight } from '@siemens/element-icons';
|
|
5
|
+
import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
|
|
6
|
+
import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
|
|
6
7
|
import { __decorate } from 'tslib';
|
|
7
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
+
import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
9
|
import { SI_UI_STATE_SERVICE, isRTL, WebComponentContentChildren } from '@siemens/element-ng/common';
|
|
9
10
|
import { asapScheduler, merge, fromEvent } from 'rxjs';
|
|
10
11
|
import { observeOn, takeUntil } from 'rxjs/operators';
|
|
@@ -13,38 +14,51 @@ import { observeOn, takeUntil } from 'rxjs/operators';
|
|
|
13
14
|
* Copyright (c) Siemens 2016 - 2026
|
|
14
15
|
* SPDX-License-Identifier: MIT
|
|
15
16
|
*/
|
|
16
|
-
/* eslint-disable @angular-eslint/prefer-output-emitter-ref */
|
|
17
17
|
class SiSplitPartComponent {
|
|
18
|
-
|
|
19
|
-
actions = [];
|
|
18
|
+
icons = addIcons({ elementDoubleRight });
|
|
20
19
|
/**
|
|
21
|
-
*
|
|
20
|
+
* Action buttons displayed in the split part header.
|
|
21
|
+
*
|
|
22
|
+
* @defaultValue []
|
|
23
|
+
*/
|
|
24
|
+
actions = input([], /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
|
|
26
|
+
/**
|
|
27
|
+
* Defines whether and in which direction the split part can collapse.
|
|
28
|
+
* When unset, the collapse button is hidden.
|
|
29
|
+
*
|
|
30
|
+
* @defaultValue undefined
|
|
22
31
|
*/
|
|
23
|
-
|
|
32
|
+
collapsible = input(/* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [undefined, { debugName: "collapsible" }] : /* istanbul ignore next */ []));
|
|
24
34
|
/**
|
|
25
35
|
* Sets the icon class that is used in the buttons of split parts to
|
|
26
36
|
* collapse and uncollapse the parts.
|
|
27
|
-
*
|
|
28
|
-
* @defaultValue 'element-double-right'
|
|
29
37
|
*/
|
|
30
|
-
collapseIconClass =
|
|
38
|
+
collapseIconClass = input(/* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [undefined, { debugName: "collapseIconClass" }] : /* istanbul ignore next */ []));
|
|
31
40
|
/**
|
|
32
41
|
* Collapse only to the given min size.
|
|
33
42
|
*
|
|
34
43
|
* @defaultValue false
|
|
35
44
|
*/
|
|
36
|
-
collapseToMinSize = false;
|
|
37
|
-
|
|
45
|
+
collapseToMinSize = input(false, { ...(ngDevMode ? { debugName: "collapseToMinSize" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
46
|
+
/**
|
|
47
|
+
* Custom template for the split part header. The template receives the component instance as implicit context.
|
|
48
|
+
*/
|
|
49
|
+
headerTemplate = input(/* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [undefined, { debugName: "headerTemplate" }] : /* istanbul ignore next */ []));
|
|
38
51
|
/**
|
|
39
52
|
* Sets the title of the split part header.
|
|
40
53
|
*/
|
|
41
|
-
heading
|
|
54
|
+
heading = input(/* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [undefined, { debugName: "heading" }] : /* istanbul ignore next */ []));
|
|
42
56
|
/**
|
|
43
57
|
* Minimum size in px.
|
|
44
58
|
*
|
|
45
59
|
* @defaultValue 0
|
|
46
60
|
*/
|
|
47
|
-
minSize = 0;
|
|
61
|
+
minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
48
62
|
/**
|
|
49
63
|
* When a split part is collapsed, the content gets hidden but it will
|
|
50
64
|
* still remain within the DOM. If you want to remove and destroy the component
|
|
@@ -53,41 +67,38 @@ class SiSplitPartComponent {
|
|
|
53
67
|
*
|
|
54
68
|
* @defaultValue false
|
|
55
69
|
*/
|
|
56
|
-
removeContentOnCollapse = false;
|
|
57
|
-
/**
|
|
58
|
-
* Defines the behavior of the split part during scaling.
|
|
59
|
-
* E.g. when set to `none`, the spit part will keep its current size even when the parent container grows or shrinks.
|
|
60
|
-
*
|
|
61
|
-
* @defaultValue 'auto'
|
|
62
|
-
*/
|
|
63
|
-
scale = 'auto';
|
|
64
|
-
/**
|
|
65
|
-
* Defines if the collapse button of a split part is displayed. Default value is true.
|
|
66
|
-
*
|
|
67
|
-
* @defaultValue true
|
|
68
|
-
*/
|
|
69
|
-
showCollapseButton = true;
|
|
70
|
+
removeContentOnCollapse = input(false, { ...(ngDevMode ? { debugName: "removeContentOnCollapse" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
70
71
|
/**
|
|
71
72
|
* Defines if the header of the split part is visible. Default is true.
|
|
72
73
|
*
|
|
73
74
|
* @defaultValue true
|
|
74
75
|
*/
|
|
75
|
-
showHeader = true;
|
|
76
|
+
showHeader = input(true, { ...(ngDevMode ? { debugName: "showHeader" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
76
77
|
/**
|
|
77
78
|
* Aria label for collapse button. Needed for a11y
|
|
78
79
|
*
|
|
79
|
-
* @defaultValue
|
|
80
|
+
* @defaultValue
|
|
81
|
+
* ```
|
|
82
|
+
* t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)
|
|
83
|
+
* ```
|
|
80
84
|
*/
|
|
81
|
-
collapseLabel =
|
|
85
|
+
collapseLabel = input(t(() => $localize `:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`), /* @ts-ignore */
|
|
86
|
+
...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
|
|
82
87
|
/**
|
|
83
88
|
* An optional stateId to uniquely identify a component instance.
|
|
84
89
|
* Required for persistence of ui state.
|
|
85
90
|
*/
|
|
86
|
-
stateId
|
|
91
|
+
stateId = input(/* @ts-ignore */
|
|
92
|
+
...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
|
|
93
|
+
/**
|
|
94
|
+
* Expanded size.
|
|
95
|
+
*/
|
|
96
|
+
size = input.required({ ...(ngDevMode ? { debugName: "size" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
87
97
|
/**
|
|
88
|
-
*
|
|
98
|
+
* Unit for the configured {@link size}.
|
|
89
99
|
*/
|
|
90
|
-
|
|
100
|
+
unit = input.required(/* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
|
|
91
102
|
/**
|
|
92
103
|
* This toggles the behavior when collapsing this split part.
|
|
93
104
|
* If enabled, all split parts between this one and the end of the split in the respective direction will be collapsed if this part is collapsed.
|
|
@@ -95,21 +106,49 @@ class SiSplitPartComponent {
|
|
|
95
106
|
*
|
|
96
107
|
* @defaultValue false
|
|
97
108
|
*/
|
|
98
|
-
collapseOthers = false;
|
|
99
|
-
|
|
100
|
-
|
|
109
|
+
collapseOthers = input(false, { ...(ngDevMode ? { debugName: "collapseOthers" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
110
|
+
/**
|
|
111
|
+
* Sets the initial expanded or collapsed state of the split part.
|
|
112
|
+
*
|
|
113
|
+
* @defaultValue true
|
|
114
|
+
*/
|
|
115
|
+
expanded = input(true, { ...(ngDevMode ? { debugName: "expanded" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
116
|
+
/**
|
|
117
|
+
* Emits when the part is collapsed or expanded.
|
|
118
|
+
*/
|
|
119
|
+
collapseChanged = output();
|
|
120
|
+
/**
|
|
121
|
+
* Emits the part's expanded state and size after it is toggled.
|
|
122
|
+
*/
|
|
123
|
+
stateChange = output();
|
|
101
124
|
/** @internal */
|
|
102
125
|
index = 0;
|
|
103
126
|
/** @internal */
|
|
104
|
-
before
|
|
127
|
+
before = signal(undefined, /* @ts-ignore */
|
|
128
|
+
...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
|
|
105
129
|
/** @internal */
|
|
106
|
-
after
|
|
130
|
+
after = signal(undefined, /* @ts-ignore */
|
|
131
|
+
...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
|
|
107
132
|
/** @internal */
|
|
108
|
-
fractionalSize =
|
|
133
|
+
fractionalSize = linkedSignal(() => (this.unit() === 'fr' ? this.size() : undefined), /* @ts-ignore */
|
|
134
|
+
...(ngDevMode ? [{ debugName: "fractionalSize" }] : /* istanbul ignore next */ []));
|
|
109
135
|
/** @internal */
|
|
110
|
-
collapsedSize =
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
collapsedSize = computed(() => (this.collapseToMinSize() ? (this.minSize() ?? 40) : 40), /* @ts-ignore */
|
|
137
|
+
...(ngDevMode ? [{ debugName: "collapsedSize" }] : /* istanbul ignore next */ []));
|
|
138
|
+
/**
|
|
139
|
+
* Internal, mutable collapsed state. Initialized from the {@link expanded} input but can be
|
|
140
|
+
* overwritten while toggling, cascading to sibling parts or restoring the persisted ui state.
|
|
141
|
+
* @internal
|
|
142
|
+
*/
|
|
143
|
+
collapsedState = linkedSignal(() => !this.expanded(), /* @ts-ignore */
|
|
144
|
+
...(ngDevMode ? [{ debugName: "collapsedState" }] : /* istanbul ignore next */ []));
|
|
145
|
+
/**
|
|
146
|
+
* Internal, mutable collapse direction. Initialized from the {@link collapsible}
|
|
147
|
+
* input but can be overwritten while cascading collapse state to sibling parts.
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
collapseDirectionState = linkedSignal(() => this.collapsible(), /* @ts-ignore */
|
|
151
|
+
...(ngDevMode ? [{ debugName: "collapseDirectionState" }] : /* istanbul ignore next */ []));
|
|
113
152
|
/**
|
|
114
153
|
* Get collapsed state.
|
|
115
154
|
* @returns True if the split part is collapsed, false is expanded.
|
|
@@ -118,14 +157,16 @@ class SiSplitPartComponent {
|
|
|
118
157
|
return this.collapsedState();
|
|
119
158
|
}
|
|
120
159
|
/** @internal */
|
|
121
|
-
expandedSize =
|
|
160
|
+
expandedSize = linkedSignal({ ...(ngDevMode ? { debugName: "expandedSize" } : /* istanbul ignore next */ {}), source: () => ({ size: this.size(), unit: this.unit() }),
|
|
161
|
+
computation: source => (source.unit === 'fr' ? undefined : source.size) });
|
|
122
162
|
/** @internal */
|
|
123
163
|
actualSize = computed(() => {
|
|
124
164
|
if (this.collapsedState()) {
|
|
125
165
|
return this.collapsedSize();
|
|
126
166
|
}
|
|
127
167
|
return this.expandedSize() ?? 0;
|
|
128
|
-
},
|
|
168
|
+
}, /* @ts-ignore */
|
|
169
|
+
...(ngDevMode ? [{ debugName: "actualSize" }] : /* istanbul ignore next */ []));
|
|
129
170
|
/** @internal */
|
|
130
171
|
saveUIState;
|
|
131
172
|
/** @internal */
|
|
@@ -133,34 +174,25 @@ class SiSplitPartComponent {
|
|
|
133
174
|
if (!this.collapsedState()) {
|
|
134
175
|
return this;
|
|
135
176
|
}
|
|
136
|
-
const
|
|
177
|
+
const after = this.after();
|
|
178
|
+
const nextExpanded = after ? after.nextExpandedAfter() : this;
|
|
137
179
|
return nextExpanded;
|
|
138
|
-
},
|
|
180
|
+
}, /* @ts-ignore */
|
|
181
|
+
...(ngDevMode ? [{ debugName: "nextExpandedAfter" }] : /* istanbul ignore next */ []));
|
|
139
182
|
elementRef = inject(ElementRef);
|
|
140
183
|
headerContext = {
|
|
141
184
|
$implicit: this
|
|
142
185
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
ngOnChanges(changes) {
|
|
155
|
-
if (changes.collapseToMinSize && this.collapseToMinSize) {
|
|
156
|
-
this.collapsedSize.set(this.minSize ?? 40);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
this.collapsedSize.set(40); // 40px is default size of the header
|
|
160
|
-
}
|
|
161
|
-
if (changes.size) {
|
|
162
|
-
this.expandedSize.set(this.size);
|
|
163
|
-
}
|
|
186
|
+
constructor() {
|
|
187
|
+
effect(() => {
|
|
188
|
+
this.expanded();
|
|
189
|
+
untracked(() => {
|
|
190
|
+
if (this.collapseOthers()) {
|
|
191
|
+
this.before()?.refreshCollapseToStart();
|
|
192
|
+
this.after()?.refreshCollapsedToEnd();
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
164
196
|
}
|
|
165
197
|
/** @internal */
|
|
166
198
|
refreshSizePx(orientation) {
|
|
@@ -179,224 +211,163 @@ class SiSplitPartComponent {
|
|
|
179
211
|
*/
|
|
180
212
|
toggleCollapse() {
|
|
181
213
|
this.collapsedState.update(v => !v);
|
|
182
|
-
if (this.collapseOthers) {
|
|
183
|
-
this.before?.refreshCollapseToStart();
|
|
184
|
-
this.after?.refreshCollapsedToEnd();
|
|
214
|
+
if (this.collapseOthers()) {
|
|
215
|
+
this.before()?.refreshCollapseToStart();
|
|
216
|
+
this.after()?.refreshCollapsedToEnd();
|
|
185
217
|
}
|
|
186
218
|
this.collapseChanged.emit(this.collapsedState());
|
|
187
|
-
this.stateChange.emit({ expanded: this.
|
|
219
|
+
this.stateChange.emit({ expanded: !this.collapsedState(), size: this.actualSize() });
|
|
188
220
|
this.saveUIState();
|
|
189
221
|
}
|
|
190
222
|
refreshCollapsedToEnd() {
|
|
191
|
-
|
|
223
|
+
const before = this.before();
|
|
224
|
+
if (before?.collapsedState() && before.collapseDirectionState() === 'to-end') {
|
|
192
225
|
this.collapsedState.set(true);
|
|
193
|
-
this.
|
|
194
|
-
this.after?.refreshCollapsedToEnd();
|
|
226
|
+
this.collapseDirectionState.set('to-end');
|
|
227
|
+
this.after()?.refreshCollapsedToEnd();
|
|
195
228
|
}
|
|
196
229
|
}
|
|
197
230
|
refreshCollapseToStart() {
|
|
198
|
-
|
|
231
|
+
const after = this.after();
|
|
232
|
+
if (after?.collapsedState() && after.collapseDirectionState() === 'to-start') {
|
|
199
233
|
this.collapsedState.set(true);
|
|
200
|
-
this.
|
|
201
|
-
this.before?.refreshCollapseToStart();
|
|
234
|
+
this.collapseDirectionState.set('to-start');
|
|
235
|
+
this.before()?.refreshCollapseToStart();
|
|
202
236
|
}
|
|
203
237
|
}
|
|
204
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
205
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
238
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitPartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
239
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapseIconClass: { classPropertyName: "collapseIconClass", publicName: "collapseIconClass", isSignal: true, isRequired: false, transformFunction: null }, collapseToMinSize: { classPropertyName: "collapseToMinSize", publicName: "collapseToMinSize", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, removeContentOnCollapse: { classPropertyName: "removeContentOnCollapse", publicName: "removeContentOnCollapse", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: true, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: true, transformFunction: null }, collapseOthers: { classPropertyName: "collapseOthers", publicName: "collapseOthers", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapseChanged: "collapseChanged", stateChange: "stateChange" }, host: { properties: { "class.is-collapsed": "collapsedState()", "class.collapse-start": "collapseDirectionState() === \"to-start\"", "style.grid-area": "\"p-\" + this.index" } }, ngImport: i0, template: "@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30);background:var(--si-sys-background-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:600;flex:1}.si-split-part-actions{padding-inline:var(--si-sys-sizing-spacing-x-40);flex:0 0 auto}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
206
240
|
}
|
|
207
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
241
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitPartComponent, decorators: [{
|
|
208
242
|
type: Component,
|
|
209
|
-
args: [{ selector: 'si-split-part', imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe],
|
|
243
|
+
args: [{ selector: 'si-split-part', imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe], host: {
|
|
210
244
|
'[class.is-collapsed]': 'collapsedState()',
|
|
211
|
-
'[class.collapse-start]': '
|
|
245
|
+
'[class.collapse-start]': 'collapseDirectionState() === "to-start"',
|
|
212
246
|
'[style.grid-area]': '"p-" + this.index'
|
|
213
|
-
}, template: "@if (!headerTemplate && showHeader) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions; track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (
|
|
214
|
-
}], propDecorators: { actions: [{
|
|
215
|
-
type: Input
|
|
216
|
-
}], collapseDirection: [{
|
|
217
|
-
type: Input
|
|
218
|
-
}], collapseIconClass: [{
|
|
219
|
-
type: Input
|
|
220
|
-
}], collapseToMinSize: [{
|
|
221
|
-
type: Input,
|
|
222
|
-
args: [{ transform: booleanAttribute }]
|
|
223
|
-
}], headerTemplate: [{
|
|
224
|
-
type: Input
|
|
225
|
-
}], heading: [{
|
|
226
|
-
type: Input
|
|
227
|
-
}], minSize: [{
|
|
228
|
-
type: Input,
|
|
229
|
-
args: [{ transform: numberAttribute }]
|
|
230
|
-
}], removeContentOnCollapse: [{
|
|
231
|
-
type: Input,
|
|
232
|
-
args: [{ transform: booleanAttribute }]
|
|
233
|
-
}], scale: [{
|
|
234
|
-
type: Input
|
|
235
|
-
}], showCollapseButton: [{
|
|
236
|
-
type: Input,
|
|
237
|
-
args: [{ transform: booleanAttribute }]
|
|
238
|
-
}], showHeader: [{
|
|
239
|
-
type: Input,
|
|
240
|
-
args: [{ transform: booleanAttribute }]
|
|
241
|
-
}], collapseLabel: [{
|
|
242
|
-
type: Input
|
|
243
|
-
}], stateId: [{
|
|
244
|
-
type: Input
|
|
245
|
-
}], size: [{
|
|
246
|
-
type: Input,
|
|
247
|
-
args: [{ transform: numberAttribute }]
|
|
248
|
-
}], collapseOthers: [{
|
|
249
|
-
type: Input,
|
|
250
|
-
args: [{ transform: booleanAttribute }]
|
|
251
|
-
}], collapseChanged: [{
|
|
252
|
-
type: Output
|
|
253
|
-
}], stateChange: [{
|
|
254
|
-
type: Output
|
|
255
|
-
}], expanded: [{
|
|
256
|
-
type: Input,
|
|
257
|
-
args: [{ transform: booleanAttribute }]
|
|
258
|
-
}] } });
|
|
247
|
+
}, template: "@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30);background:var(--si-sys-background-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:600;flex:1}.si-split-part-actions{padding-inline:var(--si-sys-sizing-spacing-x-40);flex:0 0 auto}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"] }]
|
|
248
|
+
}], ctorParameters: () => [], propDecorators: { actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapseIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseIconClass", required: false }] }], collapseToMinSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseToMinSize", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], removeContentOnCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeContentOnCollapse", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: true }] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: true }] }], collapseOthers: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseOthers", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], collapseChanged: [{ type: i0.Output, args: ["collapseChanged"] }], stateChange: [{ type: i0.Output, args: ["stateChange"] }] } });
|
|
259
249
|
|
|
260
250
|
class SiSplitComponent {
|
|
261
|
-
/**
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
251
|
+
/**
|
|
252
|
+
* Size of the gutter (divider) between split parts in pixels.
|
|
253
|
+
*
|
|
254
|
+
* @defaultValue 16
|
|
255
|
+
*/
|
|
256
|
+
gutterSize = input(16, /* @ts-ignore */
|
|
257
|
+
...(ngDevMode ? [{ debugName: "gutterSize" }] : /* istanbul ignore next */ []));
|
|
258
|
+
/**
|
|
259
|
+
* Defines the split layout direction.
|
|
260
|
+
*
|
|
261
|
+
* @defaultValue 'horizontal'
|
|
262
|
+
*/
|
|
263
|
+
orientation = input('horizontal', /* @ts-ignore */
|
|
264
|
+
...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
273
265
|
/**
|
|
274
266
|
* An optional stateId to uniquely identify a component instance.
|
|
275
267
|
* Required for persistence of ui state.
|
|
276
268
|
*/
|
|
277
|
-
stateId
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
269
|
+
stateId = input(/* @ts-ignore */
|
|
270
|
+
...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
|
|
271
|
+
/**
|
|
272
|
+
* Emits the sizes of all parts as percentages when the user resizes a gutter.
|
|
273
|
+
*/
|
|
274
|
+
sizesChange = output();
|
|
275
|
+
parts = contentChildren(SiSplitPartComponent, /* @ts-ignore */
|
|
276
|
+
...(ngDevMode ? [{ debugName: "parts" }] : /* istanbul ignore next */ []));
|
|
277
|
+
gutters = signal([], /* @ts-ignore */
|
|
278
|
+
...(ngDevMode ? [{ debugName: "gutters" }] : /* istanbul ignore next */ []));
|
|
279
|
+
gridTemplate = computed(() => {
|
|
280
|
+
if (!this.initialized()) {
|
|
281
|
+
return '';
|
|
282
|
+
}
|
|
283
|
+
return this.parts()
|
|
284
|
+
.map(part => part.collapsedState()
|
|
285
|
+
? part.collapseToMinSize()
|
|
286
|
+
? `${part.minSize()}px`
|
|
287
|
+
: 'min-content'
|
|
288
|
+
: part.unit() === 'px'
|
|
289
|
+
? `minmax(${part.minSize()}px, ${part.expandedSize() ?? part.size()}px)`
|
|
290
|
+
: `minmax(${part.minSize()}px, ${part.expandedSize() === undefined
|
|
291
|
+
? part.fractionalSize() * this.fractionalSizeToExpandedSizeFactor()
|
|
292
|
+
: part.fractionalSize()}fr)`)
|
|
293
|
+
.join(' min-content ');
|
|
294
|
+
}, /* @ts-ignore */
|
|
295
|
+
...(ngDevMode ? [{ debugName: "gridTemplate" }] : /* istanbul ignore next */ []));
|
|
296
|
+
gridTemplateRows = computed(() => this.orientation() === 'vertical' ? this.gridTemplate() : '1fr', /* @ts-ignore */
|
|
297
|
+
...(ngDevMode ? [{ debugName: "gridTemplateRows" }] : /* istanbul ignore next */ []));
|
|
298
|
+
gridTemplateColumns = computed(() => this.orientation() === 'horizontal' ? this.gridTemplate() : '1fr', /* @ts-ignore */
|
|
299
|
+
...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : /* istanbul ignore next */ []));
|
|
300
|
+
gridTemplateAreas = computed(() => {
|
|
301
|
+
if (!this.initialized()) {
|
|
302
|
+
return '';
|
|
303
|
+
}
|
|
304
|
+
const areaNames = this.parts()
|
|
305
|
+
.map((part, index) => [`p-${index}`, part.after() ? `g-${index}` : []])
|
|
306
|
+
.flat(2);
|
|
307
|
+
if (this.orientation() === 'horizontal') {
|
|
308
|
+
return `"${areaNames.join(' ')}"`;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
return `"${areaNames.join('" "')}"`;
|
|
312
|
+
}
|
|
313
|
+
}, /* @ts-ignore */
|
|
314
|
+
...(ngDevMode ? [{ debugName: "gridTemplateAreas" }] : /* istanbul ignore next */ []));
|
|
287
315
|
elementRef = inject((ElementRef));
|
|
288
316
|
ngZone = inject(NgZone);
|
|
289
317
|
changeDetectorRef = inject(ChangeDetectorRef);
|
|
290
318
|
document = inject(DOCUMENT);
|
|
291
319
|
uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });
|
|
292
320
|
destroyRef = inject(DestroyRef);
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
321
|
+
// Existing fr parts are measured in pixels after layout or dragging, so their fr weights become
|
|
322
|
+
// pixel-derived. A newly added fr part has not been measured yet and still has its configured
|
|
323
|
+
// weight. This factor converts that configured weight into the same scale until it is measured.
|
|
324
|
+
// It is the ratio of measured expanded sizes to configured weights of visible measured fr parts.
|
|
325
|
+
fractionalSizeToExpandedSizeFactor = computed(() => {
|
|
326
|
+
const measuredParts = this.parts().filter(part => !part.collapsedState() && part.unit() === 'fr' && part.expandedSize() !== undefined);
|
|
327
|
+
const configuredSizeSum = measuredParts.reduce((sum, part) => sum + part.size(), 0);
|
|
328
|
+
const expandedSizeSum = measuredParts.reduce((sum, part) => sum + part.expandedSize(), 0);
|
|
329
|
+
return configuredSizeSum ? expandedSizeSum / configuredSizeSum : 1;
|
|
330
|
+
}, /* @ts-ignore */
|
|
331
|
+
...(ngDevMode ? [{ debugName: "fractionalSizeToExpandedSizeFactor" }] : /* istanbul ignore next */ []));
|
|
332
|
+
initialized = signal(false, /* @ts-ignore */
|
|
333
|
+
...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
|
|
334
|
+
constructor() {
|
|
335
|
+
toObservable(this.parts)
|
|
336
|
+
.pipe(observeOn(asapScheduler), takeUntilDestroyed())
|
|
337
|
+
.subscribe(() => this.setupParts());
|
|
307
338
|
}
|
|
308
|
-
|
|
309
|
-
this.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
this.alignRelativeSizes();
|
|
331
|
-
this.updateFractionalSizeToExpandSizeFactor();
|
|
332
|
-
this.restoreFromUIState();
|
|
333
|
-
const gridTemplate = computed(() => this.parts
|
|
334
|
-
.map(part => part.collapsedState()
|
|
335
|
-
? part.collapseToMinSize
|
|
336
|
-
? `${part.minSize}px`
|
|
337
|
-
: 'min-content'
|
|
338
|
-
: part.actualSize()
|
|
339
|
-
? part.scale === 'auto'
|
|
340
|
-
? `minmax(${part.minSize}px, ${part.actualSize()}fr)`
|
|
341
|
-
: `minmax(${part.minSize}px, ${part.actualSize()}px)`
|
|
342
|
-
: `minmax(${part.minSize}px, ${part.fractionalSize() * this.fractionalSizeToExpandedSizeFactor}fr)`)
|
|
343
|
-
.join(' min-content '), ...(ngDevMode ? [{ debugName: "gridTemplate" }] : []));
|
|
344
|
-
this.gridTemplateRows = computed(() => this._orientation() === 'vertical' ? gridTemplate() : '1fr', ...(ngDevMode ? [{ debugName: "gridTemplateRows" }] : []));
|
|
345
|
-
this.gridTemplateColumns = computed(() => this._orientation() === 'horizontal' ? gridTemplate() : '1fr', ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
|
|
346
|
-
this.gridTemplateAreas = computed(() => {
|
|
347
|
-
const areaNames = this.parts
|
|
348
|
-
.map((part, index) => [`p-${index}`, part.after ? `g-${index}` : []])
|
|
349
|
-
.flat(2);
|
|
350
|
-
if (this._orientation() === 'horizontal') {
|
|
351
|
-
return `"${areaNames.join(' ')}"`;
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
return `"${areaNames.join('" "')}"`;
|
|
355
|
-
}
|
|
356
|
-
}, ...(ngDevMode ? [{ debugName: "gridTemplateAreas" }] : []));
|
|
357
|
-
setTimeout(() => this.refreshAllPartSizes());
|
|
358
|
-
});
|
|
359
|
-
this.parts.notifyOnChanges();
|
|
360
|
-
}
|
|
361
|
-
alignRelativeSizes() {
|
|
362
|
-
const requestedNoSize = this.parts.filter(part => !part.size && !part.fractionalSize());
|
|
363
|
-
const requestedRelSize = this.parts.filter(part => part.fractionalSize() && !part.size);
|
|
364
|
-
if (requestedRelSize.length) {
|
|
365
|
-
const totalRequestedRelSize = requestedRelSize.reduce((a, b) => a + b.fractionalSize(), 0);
|
|
366
|
-
const averageRelSize = totalRequestedRelSize / requestedRelSize.length;
|
|
367
|
-
const totalAssignedRelSize = totalRequestedRelSize + requestedNoSize.length * averageRelSize;
|
|
368
|
-
requestedNoSize.forEach(part => part.fractionalSize.set(averageRelSize / totalAssignedRelSize));
|
|
369
|
-
requestedRelSize.forEach(part => part.fractionalSize.set(part.fractionalSize() / totalAssignedRelSize));
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
requestedNoSize.forEach(part => part.fractionalSize.set(1 / requestedNoSize.length));
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
updateFractionalSizeToExpandSizeFactor() {
|
|
376
|
-
let previousScalableFractionalSum = 0;
|
|
377
|
-
let previousScalableExpandedSizeSum = 0;
|
|
378
|
-
for (let index = 0; index < this.parts.length; index++) {
|
|
379
|
-
const component = this.parts.get(index);
|
|
380
|
-
if (component.scale === 'auto' && component.expandedSize() !== undefined) {
|
|
381
|
-
previousScalableExpandedSizeSum += component.expandedSize();
|
|
382
|
-
previousScalableFractionalSum += component.fractionalSize();
|
|
339
|
+
setupParts() {
|
|
340
|
+
this.initialized.set(true);
|
|
341
|
+
const gutters = [];
|
|
342
|
+
const parts = this.parts();
|
|
343
|
+
for (let index = 0; index < parts.length; index++) {
|
|
344
|
+
const component = parts[index];
|
|
345
|
+
component.index = index;
|
|
346
|
+
component.after.set(parts[index + 1]);
|
|
347
|
+
component.before.set(parts[index - 1]);
|
|
348
|
+
component.saveUIState = () => this.saveUIState();
|
|
349
|
+
if (component.after()) {
|
|
350
|
+
gutters.push({
|
|
351
|
+
before: component,
|
|
352
|
+
after: parts[index + 1],
|
|
353
|
+
visible: computed(() => {
|
|
354
|
+
const afterPart = component.after().nextExpandedAfter();
|
|
355
|
+
return !afterPart.collapsedState() && !component.collapsedState();
|
|
356
|
+
})
|
|
357
|
+
});
|
|
383
358
|
}
|
|
384
359
|
}
|
|
385
|
-
this.
|
|
386
|
-
|
|
387
|
-
|
|
360
|
+
this.gutters.set(gutters);
|
|
361
|
+
this.restoreFromUIState();
|
|
362
|
+
setTimeout(() => this.refreshAllPartSizes());
|
|
388
363
|
}
|
|
389
364
|
refreshAllPartSizes() {
|
|
390
|
-
|
|
391
|
-
part.
|
|
392
|
-
(part.
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
const beforeToAfterFactor = beforeFrSum > 0 ? afterFrSum / beforeFrSum : 1;
|
|
397
|
-
this.parts
|
|
398
|
-
.filter(part => part.collapsedState() && (part.scale === 'auto' || part.expandedSize() === undefined))
|
|
399
|
-
.forEach(part => part.expandedSize.update(prev => (prev ?? part.fractionalSize()) * beforeToAfterFactor));
|
|
365
|
+
this.parts().forEach(part => {
|
|
366
|
+
part.refreshSizePx(this.orientation());
|
|
367
|
+
if (!part.collapsedState() && part.unit() === 'fr') {
|
|
368
|
+
part.fractionalSize.set(part.expandedSize());
|
|
369
|
+
}
|
|
370
|
+
});
|
|
400
371
|
}
|
|
401
372
|
resizeStart(gutter, event) {
|
|
402
373
|
this.refreshAllPartSizes();
|
|
@@ -407,9 +378,8 @@ class SiSplitComponent {
|
|
|
407
378
|
let appliedDelta = 0;
|
|
408
379
|
const rtl = isRTL();
|
|
409
380
|
const startPosition = this.getPosition(event);
|
|
410
|
-
const minDelta = -1 * (beforeSize - gutter.before.minSize);
|
|
411
|
-
const maxDelta = afterSize - afterPart.minSize;
|
|
412
|
-
const containerSize = this.measureContainerSize();
|
|
381
|
+
const minDelta = -1 * (beforeSize - gutter.before.minSize());
|
|
382
|
+
const maxDelta = afterSize - afterPart.minSize();
|
|
413
383
|
event.preventDefault(); // prevents text-selection
|
|
414
384
|
this.ngZone.runOutsideAngular(() => {
|
|
415
385
|
merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))
|
|
@@ -417,7 +387,7 @@ class SiSplitComponent {
|
|
|
417
387
|
.subscribe({
|
|
418
388
|
next: move => {
|
|
419
389
|
let delta = this.getPosition(move) - startPosition;
|
|
420
|
-
if (rtl && this.orientation === 'horizontal') {
|
|
390
|
+
if (rtl && this.orientation() === 'horizontal') {
|
|
421
391
|
delta *= -1;
|
|
422
392
|
}
|
|
423
393
|
delta -= appliedDelta;
|
|
@@ -435,21 +405,33 @@ class SiSplitComponent {
|
|
|
435
405
|
appliedDelta += delta;
|
|
436
406
|
gutter.before.expandedSize.set(beforeSize);
|
|
437
407
|
afterPart.expandedSize.set(afterSize);
|
|
438
|
-
if (
|
|
408
|
+
if (gutter.before.unit() === 'fr') {
|
|
409
|
+
gutter.before.fractionalSize.set(beforeSize);
|
|
410
|
+
}
|
|
411
|
+
if (afterPart.unit() === 'fr') {
|
|
412
|
+
afterPart.fractionalSize.set(afterSize);
|
|
413
|
+
}
|
|
414
|
+
if (this.orientation() === 'vertical') {
|
|
439
415
|
this.elementRef.nativeElement.style.setProperty('grid-template-rows', this.gridTemplateRows());
|
|
440
416
|
}
|
|
441
417
|
else {
|
|
442
418
|
this.elementRef.nativeElement.style.setProperty('grid-template-columns', this.gridTemplateColumns());
|
|
443
419
|
}
|
|
444
|
-
this.
|
|
420
|
+
this.emitSizesChange();
|
|
445
421
|
},
|
|
446
422
|
complete: () => this.saveUIState()
|
|
447
423
|
});
|
|
448
424
|
});
|
|
449
425
|
}
|
|
426
|
+
emitSizesChange() {
|
|
427
|
+
const containerSize = this.measureContainerSize();
|
|
428
|
+
if (containerSize > 0) {
|
|
429
|
+
this.ngZone.run(() => this.sizesChange.emit(this.parts().map(part => (part.actualSize() * 100) / containerSize)));
|
|
430
|
+
}
|
|
431
|
+
}
|
|
450
432
|
measureContainerSize() {
|
|
451
433
|
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
452
|
-
if (this.
|
|
434
|
+
if (this.orientation() === 'vertical') {
|
|
453
435
|
return rect.height;
|
|
454
436
|
}
|
|
455
437
|
else {
|
|
@@ -458,86 +440,88 @@ class SiSplitComponent {
|
|
|
458
440
|
}
|
|
459
441
|
getPosition(event) {
|
|
460
442
|
const positionObject = event.touches?.[0] ?? event;
|
|
461
|
-
return this.orientation === 'horizontal'
|
|
443
|
+
return this.orientation() === 'horizontal'
|
|
462
444
|
? (positionObject.clientX ?? 0)
|
|
463
445
|
: (positionObject.clientY ?? 0);
|
|
464
446
|
}
|
|
465
447
|
saveUIState() {
|
|
466
|
-
|
|
448
|
+
const stateId = this.stateId();
|
|
449
|
+
if (!stateId || !this.uiStateService) {
|
|
467
450
|
return;
|
|
468
451
|
}
|
|
469
|
-
const
|
|
470
|
-
|
|
471
|
-
if (
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
452
|
+
const state = this.parts().reduce((partState, part) => {
|
|
453
|
+
const partStateId = part.stateId();
|
|
454
|
+
if (partStateId) {
|
|
455
|
+
const unit = part.unit();
|
|
456
|
+
partState[partStateId] = {
|
|
457
|
+
size: unit === 'px' ? part.expandedSize() : part.fractionalSize(),
|
|
458
|
+
initialSize: part.size(),
|
|
459
|
+
initialUnit: unit,
|
|
460
|
+
expanded: !part.collapsedState()
|
|
476
461
|
};
|
|
477
462
|
}
|
|
478
463
|
return partState;
|
|
479
464
|
}, {});
|
|
480
|
-
this.uiStateService.save(
|
|
465
|
+
this.uiStateService.save(stateId, state);
|
|
481
466
|
}
|
|
482
467
|
restoreFromUIState() {
|
|
483
|
-
|
|
468
|
+
const stateId = this.stateId();
|
|
469
|
+
if (!stateId || !this.uiStateService) {
|
|
484
470
|
return;
|
|
485
471
|
}
|
|
486
|
-
this.uiStateService.load(
|
|
472
|
+
this.uiStateService.load(stateId).then(uiState => {
|
|
487
473
|
if (!uiState) {
|
|
488
474
|
return;
|
|
489
475
|
}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
.
|
|
493
|
-
.
|
|
476
|
+
let restored = false;
|
|
477
|
+
this.parts()
|
|
478
|
+
.filter(part => part.stateId())
|
|
479
|
+
.map(part => ({ part, state: uiState[part.stateId()] }))
|
|
480
|
+
.filter((item) => !!item.state && item.state.initialUnit === item.part.unit())
|
|
494
481
|
.forEach(({ part, state }) => {
|
|
495
|
-
|
|
496
|
-
part.
|
|
497
|
-
|
|
482
|
+
restored = true;
|
|
483
|
+
if (part.unit() === 'px') {
|
|
484
|
+
part.expandedSize.set(state.size);
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
part.fractionalSize.set(state.size);
|
|
488
|
+
}
|
|
489
|
+
part.collapsedState.set(!state.expanded);
|
|
490
|
+
});
|
|
491
|
+
setTimeout(() => {
|
|
492
|
+
this.refreshAllPartSizes();
|
|
493
|
+
if (restored) {
|
|
494
|
+
this.emitSizesChange();
|
|
495
|
+
}
|
|
498
496
|
});
|
|
499
|
-
setTimeout(() => this.refreshAllPartSizes());
|
|
500
497
|
});
|
|
501
498
|
}
|
|
502
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
503
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
499
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
500
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiSplitComponent, isStandalone: true, selector: "si-split", inputs: { gutterSize: { classPropertyName: "gutterSize", publicName: "gutterSize", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sizesChange: "sizesChange" }, host: { properties: { "class": "orientation()", "style.grid-template-rows": "gridTemplateRows()", "style.grid-template-columns": "gridTemplateColumns()", "style.grid-template-areas": "gridTemplateAreas()" } }, queries: [{ propertyName: "parts", predicate: SiSplitPartComponent, isSignal: true }], ngImport: i0, template: "<ng-content />\n\n@for (gutter of gutters(); track $index) {\n @if ($index < parts().length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation() === 'horizontal' ? gutterSize() : null\"\n [style.height.px]=\"orientation() === 'vertical' ? gutterSize() : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n", styles: [":host{display:grid;inline-size:100%;block-size:100%}.si-split-gutter{flex:0 0 auto;background:var(--si-sys-background-0);cursor:col-resize}.si-split-gutter:before{display:block;content:\"\";position:relative;inset-block-start:50%;margin-block-start:-20px;inset-inline-start:50%;margin-inline-start:-1px;inline-size:2px;block-size:40px;background:var(--si-sys-border-2)}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:row-resize}:host(.vertical)>.si-split-gutter:before{transform:rotate(90deg)}.si-split-gutter:hover:before{background:var(--si-sys-border-accent-hover)}.si-split-gutter:active:before{background:var(--si-sys-border-accent-active)}\n"] });
|
|
504
501
|
}
|
|
505
502
|
__decorate([
|
|
506
503
|
WebComponentContentChildren(SiSplitPartComponent)
|
|
507
504
|
], SiSplitComponent.prototype, "parts", void 0);
|
|
508
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
505
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitComponent, decorators: [{
|
|
509
506
|
type: Component,
|
|
510
|
-
args: [{ selector: 'si-split',
|
|
511
|
-
'[class]': '
|
|
507
|
+
args: [{ selector: 'si-split', host: {
|
|
508
|
+
'[class]': 'orientation()',
|
|
512
509
|
'[style.grid-template-rows]': 'gridTemplateRows()',
|
|
513
510
|
'[style.grid-template-columns]': 'gridTemplateColumns()',
|
|
514
511
|
'[style.grid-template-areas]': 'gridTemplateAreas()'
|
|
515
|
-
}, template: "<ng-content />\n\n@for (gutter of gutters; track $index) {\n @if ($index < parts.length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation === 'horizontal' ? gutterSize : null\"\n [style.height.px]=\"orientation === 'vertical' ? gutterSize : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n", styles: [":host{display:grid;inline-size:100%;block-size:100%}.si-split-gutter{flex:0 0 auto;background:var(--
|
|
516
|
-
}], propDecorators: { gutterSize: [{
|
|
517
|
-
type: Input
|
|
518
|
-
}], orientation: [{
|
|
519
|
-
type: Input
|
|
520
|
-
}], sizes: [{
|
|
521
|
-
type: Input
|
|
522
|
-
}], stateId: [{
|
|
523
|
-
type: Input
|
|
524
|
-
}], sizesChange: [{
|
|
525
|
-
type: Output
|
|
526
|
-
}], parts: [{
|
|
527
|
-
type: ContentChildren,
|
|
528
|
-
args: [SiSplitPartComponent]
|
|
529
|
-
}] } });
|
|
512
|
+
}, template: "<ng-content />\n\n@for (gutter of gutters(); track $index) {\n @if ($index < parts().length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation() === 'horizontal' ? gutterSize() : null\"\n [style.height.px]=\"orientation() === 'vertical' ? gutterSize() : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n", styles: [":host{display:grid;inline-size:100%;block-size:100%}.si-split-gutter{flex:0 0 auto;background:var(--si-sys-background-0);cursor:col-resize}.si-split-gutter:before{display:block;content:\"\";position:relative;inset-block-start:50%;margin-block-start:-20px;inset-inline-start:50%;margin-inline-start:-1px;inline-size:2px;block-size:40px;background:var(--si-sys-border-2)}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:row-resize}:host(.vertical)>.si-split-gutter:before{transform:rotate(90deg)}.si-split-gutter:hover:before{background:var(--si-sys-border-accent-hover)}.si-split-gutter:active:before{background:var(--si-sys-border-accent-active)}\n"] }]
|
|
513
|
+
}], ctorParameters: () => [], propDecorators: { gutterSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutterSize", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], sizesChange: [{ type: i0.Output, args: ["sizesChange"] }], parts: [] } });
|
|
530
514
|
|
|
531
515
|
/**
|
|
532
516
|
* Copyright (c) Siemens 2016 - 2026
|
|
533
517
|
* SPDX-License-Identifier: MIT
|
|
534
518
|
*/
|
|
535
519
|
class SiSplitModule {
|
|
536
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
537
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
538
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
520
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
521
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: SiSplitModule, imports: [SiSplitComponent, SiSplitPartComponent], exports: [SiSplitComponent, SiSplitPartComponent] });
|
|
522
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitModule, imports: [SiSplitPartComponent] });
|
|
539
523
|
}
|
|
540
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
524
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitModule, decorators: [{
|
|
541
525
|
type: NgModule,
|
|
542
526
|
args: [{
|
|
543
527
|
imports: [SiSplitComponent, SiSplitPartComponent],
|