@koobiq/components 20.4.2 → 21.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/accordion-trigger.scss +3 -10
- package/accordion/accordion.scss +4 -6
- package/actions-panel/actions-panel-container.scss +45 -1
- package/alert/alert.component.scss +3 -2
- package/app-switcher/_app-switcher-theme.scss +0 -4
- package/app-switcher/app-switcher-dropdown-app.scss +3 -2
- package/app-switcher/app-switcher-dropdown-site.scss +2 -1
- package/app-switcher/{kbq-app-switcher-list-item.scss → app-switcher-list-item.scss} +18 -4
- package/app-switcher/app-switcher-tokens.scss +15 -0
- package/app-switcher/app-switcher.scss +14 -4
- package/autocomplete/autocomplete.scss +7 -6
- package/badge/badge.component.scss +5 -8
- package/breadcrumbs/breadcrumbs.scss +25 -10
- package/button/_button-base.scss +30 -7
- package/button/_button-theme.scss +16 -0
- package/button/button-group.scss +7 -0
- package/button/button-tokens.scss +0 -2
- package/button/button.scss +34 -2
- package/button-toggle/_button-toggle-theme.scss +7 -2
- package/button-toggle/button-toggle.scss +65 -15
- package/checkbox/_checkbox-theme.scss +4 -3
- package/checkbox/checkbox.scss +3 -6
- package/clamped-text/clamped-text.scss +6 -2
- package/code-block/code-block-tokens.scss +0 -224
- package/code-block/code-block.scss +20 -9
- package/content-panel/content-panel-aside.scss +3 -2
- package/content-panel/content-panel-container.scss +37 -0
- package/content-panel/content-panel.scss +4 -3
- package/core/highlight/_highlight-theme.scss +3 -1
- package/core/option/action-container.scss +2 -2
- package/core/option/action.scss +2 -1
- package/core/option/option.scss +2 -1
- package/core/pop-up/_pop-up.scss +0 -37
- package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +5 -10
- package/core/styles/_core.scss +3 -0
- package/core/styles/_koobiq-theme.scss +5 -6
- package/core/styles/common/_animation.scss +44 -16
- package/core/styles/common/_groups-mixins.scss +21 -19
- package/core/styles/common/_groups.scss +4 -32
- package/core/styles/common/_index.scss +0 -2
- package/core/styles/common/_link.scss +117 -0
- package/core/styles/common/_list.scss +0 -26
- package/core/styles/common/_overlay.scss +8 -10
- package/core/styles/common/_rtl.scss +0 -14
- package/core/styles/common/_select.scss +33 -15
- package/core/styles/common/_squircle.scss +63 -0
- package/core/styles/common/_tokens.scss +0 -11
- package/core/styles/common/_vendor-prefixes.scss +0 -20
- package/core/styles/functions/_timing.scss +0 -22
- package/core/styles/theming/_scrollbar-theme.scss +6 -1
- package/core/styles/theming/_theming.scss +13 -65
- package/core/styles/typography/_index.scss +0 -1
- package/core/styles/typography/_typography.scss +0 -143
- package/core/styles/visual/_body.scss +1 -6
- package/core/styles/visual/_layout.scss +0 -12
- package/datepicker/calendar-body.scss +3 -1
- package/datepicker/calendar-header.scss +0 -1
- package/datepicker/datepicker-content.scss +33 -1
- package/datepicker/datepicker-toggle.scss +0 -38
- package/dl/dl-tokens.scss +10 -0
- package/dl/dl.scss +113 -13
- package/dropdown/_dropdown-theme.scss +4 -16
- package/dropdown/dropdown-item.scss +4 -10
- package/dropdown/dropdown.scss +2 -1
- package/empty-state/_empty-state-theme.scss +10 -4
- package/empty-state/empty-state-tokens.scss +4 -4
- package/empty-state/empty-state.scss +4 -0
- package/fesm2022/koobiq-components-accordion.mjs +347 -229
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +302 -187
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-alert.mjs +39 -39
- package/fesm2022/koobiq-components-alert.mjs.map +1 -1
- package/fesm2022/koobiq-components-app-switcher.mjs +677 -367
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
- package/fesm2022/koobiq-components-autocomplete.mjs +620 -253
- package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
- package/fesm2022/koobiq-components-badge.mjs +46 -48
- package/fesm2022/koobiq-components-badge.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +221 -169
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +565 -196
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-button.mjs +332 -116
- package/fesm2022/koobiq-components-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +172 -132
- package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +165 -158
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +791 -609
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +260 -143
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +4342 -1595
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +1713 -1606
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-divider.mjs +73 -36
- package/fesm2022/koobiq-components-divider.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +447 -89
- package/fesm2022/koobiq-components-dl.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +703 -599
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-dynamic-translation.mjs +20 -20
- package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
- package/fesm2022/koobiq-components-ellipsis-center.mjs +46 -31
- package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-empty-state.mjs +116 -60
- package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +550 -290
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +2871 -2595
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-flag.mjs +79 -24
- package/fesm2022/koobiq-components-flag.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +389 -525
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +400 -149
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +429 -212
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
- package/fesm2022/koobiq-components-input.mjs +601 -459
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-link-deprecated.mjs +196 -0
- package/fesm2022/koobiq-components-link-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-link.mjs +328 -125
- package/fesm2022/koobiq-components-link.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +583 -433
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-loader-overlay.mjs +167 -68
- package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +55 -78
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +853 -475
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +895 -556
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +680 -310
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +46 -64
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +684 -285
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-bar.mjs +87 -33
- package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-progress-spinner.mjs +52 -43
- package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
- package/fesm2022/koobiq-components-radio.mjs +450 -231
- package/fesm2022/koobiq-components-radio.mjs.map +1 -1
- package/fesm2022/koobiq-components-resizer.mjs +127 -21
- package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs +299 -0
- package/fesm2022/koobiq-components-scrollbar-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-scrollbar.mjs +745 -222
- package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-search-expandable.mjs +288 -126
- package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +883 -693
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +207 -88
- package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +689 -296
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-skeleton.mjs +815 -41
- package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
- package/fesm2022/koobiq-components-split-button.mjs +109 -88
- package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter-deprecated.mjs +591 -0
- package/fesm2022/koobiq-components-splitter-deprecated.mjs.map +1 -0
- package/fesm2022/koobiq-components-splitter.mjs +890 -501
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-table.mjs +63 -49
- package/fesm2022/koobiq-components-table.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +1062 -603
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +886 -733
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +213 -185
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-time-range.mjs +299 -147
- package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs +233 -245
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +344 -142
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +229 -145
- package/fesm2022/koobiq-components-title.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +463 -143
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +177 -130
- package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +657 -214
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-top-bar.mjs +61 -32
- package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +734 -488
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +1700 -617
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +290 -135
- package/fesm2022/koobiq-components-username.mjs.map +1 -1
- package/file-upload/dropzone.scss +31 -3
- package/file-upload/file-upload-tokens.scss +2 -22
- package/file-upload/file-upload.scss +6 -0
- package/file-upload/multiple-file-upload.component.scss +14 -12
- package/file-upload/single-file-upload.component.scss +3 -2
- package/filter-bar/filters.scss +7 -0
- package/filter-bar/pipes/base-pipe.scss +3 -3
- package/filter-bar/pipes/pipe-date.scss +8 -1
- package/flag/flag-tokens.scss +22 -0
- package/flag/flag.scss +34 -21
- package/form-field/{_fiedset-theme.scss → _fieldset-theme.scss} +1 -5
- package/form-field/_form-field-theme.scss +4 -9
- package/form-field/cleaner.scss +3 -1
- package/form-field/fieldset.scss +3 -4
- package/form-field/form-field.scss +26 -21
- package/form-field/password-toggle.scss +3 -1
- package/icon/_icon-button-theme.scss +7 -0
- package/icon/_icon-theme.scss +10 -7
- package/icon/icon-button.scss +0 -2
- package/icon/icon-tokens.scss +12 -9
- package/inline-edit/inline-edit.scss +40 -54
- package/input/input.scss +4 -0
- package/link/{_link-theme.scss → deprecated/_link-theme.scss} +11 -6
- package/link/deprecated/link-tokens.scss +27 -0
- package/link/link-tokens.scss +6 -25
- package/link/link.scss +137 -0
- package/list/list.scss +3 -2
- package/loader-overlay/_loader-overlay-theme.scss +19 -10
- package/loader-overlay/loader-overlay-tokens.scss +0 -2
- package/loader-overlay/loader-overlay.scss +7 -1
- package/markdown/_markdown-theme.scss +16 -0
- package/markdown/markdown-tokens.scss +5 -0
- package/markdown/markdown.scss +2 -1
- package/modal/_modal-animation.scss +23 -14
- package/modal/modal-tokens.scss +2 -1
- package/modal/modal.scss +35 -31
- package/navbar/_navbar-item_horizontal.scss +8 -6
- package/navbar/_navbar-item_vertical.scss +18 -6
- package/navbar/_navbar-theme.scss +9 -1
- package/navbar/navbar-brand.scss +8 -6
- package/navbar/navbar-divider.scss +1 -1
- package/navbar/navbar-item.scss +8 -9
- package/navbar/navbar-toggle.scss +3 -3
- package/navbar/navbar-tokens.scss +14 -0
- package/navbar/navbar.scss +1 -2
- package/navbar/vertical-navbar.scss +2 -2
- package/notification-center/_notification-center-theme.scss +11 -6
- package/notification-center/notification-center-tokens.scss +33 -0
- package/notification-center/notification-center.scss +58 -20
- package/notification-center/notification-item.scss +15 -6
- package/package.json +112 -81
- package/popover/popover-tokens.scss +0 -2
- package/popover/popover.scss +41 -19
- package/prebuilt-themes/theme.css +1 -1
- package/progress-bar/_progress-bar-theme.scss +20 -3
- package/progress-bar/progress-bar-tokens.scss +3 -0
- package/progress-bar/progress-bar.scss +36 -8
- package/progress-spinner/progress-spinner.scss +4 -3
- package/radio/_radio-theme.scss +21 -4
- package/radio/radio-tokens.scss +7 -3
- package/radio/radio.scss +55 -8
- package/schematics/collection.json +415 -18
- package/schematics/migrations/accordion-state-saving-default/README.md +60 -0
- package/schematics/migrations/accordion-state-saving-default/data.cjs +75 -0
- package/schematics/migrations/accordion-state-saving-default/index.cjs +61 -0
- package/schematics/migrations/accordion-state-saving-default/schema.json +15 -0
- package/schematics/migrations/actions-panel-overlay-container/README.md +35 -0
- package/schematics/migrations/actions-panel-overlay-container/data.cjs +47 -0
- package/schematics/migrations/actions-panel-overlay-container/index.cjs +55 -0
- package/schematics/migrations/actions-panel-overlay-container/schema.json +15 -0
- package/schematics/migrations/alert-signals/README.md +13 -7
- package/schematics/migrations/alert-signals/{data.js → data.cjs} +3 -0
- package/schematics/migrations/alert-signals/index.cjs +221 -0
- package/schematics/migrations/angular-animations-removal/README.md +46 -0
- package/schematics/migrations/angular-animations-removal/data.cjs +150 -0
- package/schematics/migrations/angular-animations-removal/index.cjs +21 -0
- package/schematics/migrations/angular-animations-removal/schema.json +15 -0
- package/schematics/migrations/app-switcher-signals/README.md +88 -0
- package/schematics/migrations/app-switcher-signals/data.cjs +136 -0
- package/schematics/migrations/app-switcher-signals/index.cjs +366 -0
- package/schematics/migrations/app-switcher-signals/schema.json +20 -0
- package/schematics/migrations/autocomplete-panel-width-auto/README.md +2 -2
- package/schematics/migrations/autocomplete-panel-width-auto/{index.js → index.cjs} +6 -5
- package/schematics/migrations/autocomplete-signals/README.md +92 -0
- package/schematics/migrations/autocomplete-signals/data.cjs +149 -0
- package/schematics/migrations/autocomplete-signals/index.cjs +707 -0
- package/schematics/migrations/autocomplete-signals/schema.json +20 -0
- package/schematics/migrations/badge-signals/README.md +77 -0
- package/schematics/migrations/badge-signals/data.cjs +109 -0
- package/schematics/migrations/badge-signals/index.cjs +694 -0
- package/schematics/migrations/badge-signals/schema.json +20 -0
- package/schematics/migrations/button-state-and-styles/README.md +129 -0
- package/schematics/migrations/button-state-and-styles/data.cjs +136 -0
- package/schematics/migrations/button-state-and-styles/index.cjs +221 -0
- package/schematics/migrations/button-state-and-styles/schema.json +20 -0
- package/schematics/migrations/button-supported-colors/README.md +73 -0
- package/schematics/migrations/button-supported-colors/data.cjs +106 -0
- package/schematics/migrations/button-supported-colors/index.cjs +261 -0
- package/schematics/migrations/button-supported-colors/schema.json +20 -0
- package/schematics/migrations/button-toggle-signals-and-aria/README.md +137 -0
- package/schematics/migrations/button-toggle-signals-and-aria/data.cjs +200 -0
- package/schematics/migrations/button-toggle-signals-and-aria/index.cjs +497 -0
- package/schematics/migrations/button-toggle-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/button-truncation/README.md +110 -0
- package/schematics/migrations/button-truncation/data.cjs +88 -0
- package/schematics/migrations/button-truncation/index.cjs +270 -0
- package/schematics/migrations/button-truncation/schema.json +20 -0
- package/schematics/migrations/checkbox-signals/README.md +76 -0
- package/schematics/migrations/checkbox-signals/data.cjs +114 -0
- package/schematics/migrations/checkbox-signals/index.cjs +635 -0
- package/schematics/migrations/checkbox-signals/schema.json +20 -0
- package/schematics/migrations/clamped-text-disclosure/README.md +62 -0
- package/schematics/migrations/clamped-text-disclosure/data.cjs +101 -0
- package/schematics/migrations/clamped-text-disclosure/index.cjs +60 -0
- package/schematics/migrations/clamped-text-disclosure/schema.json +15 -0
- package/schematics/migrations/code-block-highlight-js-core/README.md +53 -0
- package/schematics/migrations/code-block-highlight-js-core/data.cjs +64 -0
- package/schematics/migrations/code-block-highlight-js-core/index.cjs +319 -0
- package/schematics/migrations/code-block-highlight-js-core/schema.json +20 -0
- package/schematics/migrations/code-block-signals/README.md +84 -0
- package/schematics/migrations/code-block-signals/data.cjs +121 -0
- package/schematics/migrations/code-block-signals/index.cjs +701 -0
- package/schematics/migrations/code-block-signals/schema.json +20 -0
- package/schematics/migrations/color-signals/README.md +46 -0
- package/schematics/migrations/color-signals/data.cjs +131 -0
- package/schematics/migrations/color-signals/index.cjs +20 -0
- package/schematics/migrations/color-signals/schema.json +20 -0
- package/schematics/migrations/core-mixins-removal/README.md +20 -0
- package/schematics/migrations/core-mixins-removal/data.cjs +27 -0
- package/schematics/migrations/core-mixins-removal/index.cjs +18 -0
- package/schematics/migrations/core-mixins-removal/schema.json +15 -0
- package/schematics/migrations/css-selectors/README.md +2 -2
- package/schematics/migrations/css-selectors/{index.js → index.cjs} +4 -3
- package/schematics/migrations/datepicker-signals/README.md +24 -0
- package/schematics/migrations/datepicker-signals/data.cjs +49 -0
- package/schematics/migrations/datepicker-signals/index.cjs +18 -0
- package/schematics/migrations/datepicker-signals/schema.json +15 -0
- package/schematics/migrations/deprecated-icons/README.md +2 -2
- package/schematics/migrations/deprecated-icons/{index.js → index.cjs} +8 -7
- package/schematics/migrations/design-tokens-v4/README.md +75 -0
- package/schematics/migrations/design-tokens-v4/index.cjs +60 -0
- package/schematics/migrations/design-tokens-v4/schema.json +15 -0
- package/schematics/migrations/divider-signals-and-aria/README.md +47 -0
- package/schematics/migrations/divider-signals-and-aria/data.cjs +62 -0
- package/schematics/migrations/divider-signals-and-aria/index.cjs +212 -0
- package/schematics/migrations/divider-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/dl-attribute-coercion/README.md +59 -0
- package/schematics/migrations/dl-attribute-coercion/data.cjs +85 -0
- package/schematics/migrations/dl-attribute-coercion/index.cjs +162 -0
- package/schematics/migrations/dl-attribute-coercion/schema.json +15 -0
- package/schematics/migrations/dl-standalone-names/README.md +49 -0
- package/schematics/migrations/dl-standalone-names/data.cjs +44 -0
- package/schematics/migrations/dl-standalone-names/index.cjs +322 -0
- package/schematics/migrations/dl-standalone-names/schema.json +20 -0
- package/schematics/migrations/dropdown-demote-overlay/README.md +137 -0
- package/schematics/migrations/dropdown-demote-overlay/data.cjs +84 -0
- package/schematics/migrations/dropdown-demote-overlay/index.cjs +289 -0
- package/schematics/migrations/dropdown-demote-overlay/schema.json +20 -0
- package/schematics/migrations/dropdown-signals/README.md +83 -0
- package/schematics/migrations/dropdown-signals/data.cjs +152 -0
- package/schematics/migrations/dropdown-signals/index.cjs +20 -0
- package/schematics/migrations/dropdown-signals/schema.json +20 -0
- package/schematics/migrations/empty-state-error-color/README.md +84 -0
- package/schematics/migrations/empty-state-error-color/data.cjs +85 -0
- package/schematics/migrations/empty-state-error-color/index.cjs +72 -0
- package/schematics/migrations/empty-state-error-color/schema.json +15 -0
- package/schematics/migrations/empty-state-size-attr/README.md +2 -2
- package/schematics/migrations/empty-state-size-attr/{index.js → index.cjs} +6 -5
- package/schematics/migrations/file-upload-cva-and-primitives/README.md +70 -0
- package/schematics/migrations/file-upload-cva-and-primitives/data.cjs +97 -0
- package/schematics/migrations/file-upload-cva-and-primitives/index.cjs +61 -0
- package/schematics/migrations/file-upload-cva-and-primitives/schema.json +15 -0
- package/schematics/migrations/file-upload-deprecated-outputs/README.md +90 -0
- package/schematics/migrations/file-upload-deprecated-outputs/data.cjs +20 -0
- package/schematics/migrations/file-upload-deprecated-outputs/index.cjs +71 -0
- package/schematics/migrations/file-upload-deprecated-outputs/schema.json +20 -0
- package/schematics/migrations/filter-bar-rename-action/README.md +183 -0
- package/schematics/migrations/filter-bar-rename-action/data.cjs +151 -0
- package/schematics/migrations/filter-bar-rename-action/index.cjs +178 -0
- package/schematics/migrations/filter-bar-rename-action/schema.json +20 -0
- package/schematics/migrations/filter-bar-signals/README.md +27 -16
- package/schematics/migrations/filter-bar-signals/{data.js → data.cjs} +1 -2
- package/schematics/migrations/filter-bar-signals/index.cjs +225 -0
- package/schematics/migrations/filter-bar-state-saving-default/README.md +53 -0
- package/schematics/migrations/filter-bar-state-saving-default/data.cjs +87 -0
- package/schematics/migrations/filter-bar-state-saving-default/index.cjs +62 -0
- package/schematics/migrations/filter-bar-state-saving-default/schema.json +15 -0
- package/schematics/migrations/flag-inner-html/README.md +67 -0
- package/schematics/migrations/flag-inner-html/data.cjs +58 -0
- package/schematics/migrations/flag-inner-html/index.cjs +62 -0
- package/schematics/migrations/flag-inner-html/schema.json +15 -0
- package/schematics/migrations/form-field-signals/README.md +125 -0
- package/schematics/migrations/form-field-signals/data.cjs +288 -0
- package/schematics/migrations/form-field-signals/index.cjs +383 -0
- package/schematics/migrations/form-field-signals/schema.json +20 -0
- package/schematics/migrations/icon-semantics-and-api/README.md +65 -0
- package/schematics/migrations/icon-semantics-and-api/data.cjs +97 -0
- package/schematics/migrations/icon-semantics-and-api/index.cjs +65 -0
- package/schematics/migrations/icon-semantics-and-api/schema.json +15 -0
- package/schematics/migrations/icons-replacement/README.md +5 -5
- package/schematics/migrations/icons-replacement/{index.js → index.cjs} +4 -3
- package/schematics/migrations/inline-edit-a11y-and-types/README.md +82 -0
- package/schematics/migrations/inline-edit-a11y-and-types/data.cjs +117 -0
- package/schematics/migrations/inline-edit-a11y-and-types/index.cjs +98 -0
- package/schematics/migrations/inline-edit-a11y-and-types/schema.json +20 -0
- package/schematics/migrations/input-number-surface/README.md +140 -0
- package/schematics/migrations/input-number-surface/data.cjs +135 -0
- package/schematics/migrations/input-number-surface/index.cjs +293 -0
- package/schematics/migrations/input-number-surface/schema.json +20 -0
- package/schematics/migrations/input-signals/README.md +20 -0
- package/schematics/migrations/input-signals/data.cjs +30 -0
- package/schematics/migrations/input-signals/index.cjs +18 -0
- package/schematics/migrations/input-signals/schema.json +15 -0
- package/schematics/migrations/link-deprecated-path/README.md +144 -0
- package/schematics/migrations/link-deprecated-path/index.cjs +20 -0
- package/schematics/migrations/link-deprecated-path/schema.json +20 -0
- package/schematics/migrations/link-signals/README.md +71 -0
- package/schematics/migrations/link-signals/data.cjs +116 -0
- package/schematics/migrations/link-signals/index.cjs +416 -0
- package/schematics/migrations/link-signals/schema.json +20 -0
- package/schematics/migrations/list-signals/README.md +22 -0
- package/schematics/migrations/list-signals/data.cjs +35 -0
- package/schematics/migrations/list-signals/index.cjs +18 -0
- package/schematics/migrations/list-signals/schema.json +15 -0
- package/schematics/migrations/list-tree-multiple-input/README.md +105 -0
- package/schematics/migrations/list-tree-multiple-input/data.cjs +74 -0
- package/schematics/migrations/list-tree-multiple-input/index.cjs +222 -0
- package/schematics/migrations/list-tree-multiple-input/schema.json +20 -0
- package/schematics/migrations/loader-overlay-signals/README.md +62 -0
- package/schematics/migrations/loader-overlay-signals/data.cjs +101 -0
- package/schematics/migrations/loader-overlay-signals/index.cjs +698 -0
- package/schematics/migrations/loader-overlay-signals/schema.json +20 -0
- package/schematics/migrations/loader-overlay-size-attr/README.md +2 -2
- package/schematics/migrations/loader-overlay-size-attr/{index.js → index.cjs} +6 -5
- package/schematics/migrations/locale-configuration-providers/README.md +163 -0
- package/schematics/migrations/locale-configuration-providers/data.cjs +257 -0
- package/schematics/migrations/locale-configuration-providers/index.cjs +295 -0
- package/schematics/migrations/locale-configuration-providers/schema.json +20 -0
- package/schematics/migrations/mandatory-peer-dependencies/README.md +70 -0
- package/schematics/migrations/mandatory-peer-dependencies/index.cjs +43 -0
- package/schematics/migrations/mandatory-peer-dependencies/schema.json +15 -0
- package/schematics/migrations/markdown-signals/README.md +58 -0
- package/schematics/migrations/markdown-signals/data.cjs +79 -0
- package/schematics/migrations/markdown-signals/index.cjs +640 -0
- package/schematics/migrations/markdown-signals/schema.json +20 -0
- package/schematics/migrations/modal-dialog-semantics/README.md +106 -0
- package/schematics/migrations/modal-dialog-semantics/data.cjs +110 -0
- package/schematics/migrations/modal-dialog-semantics/index.cjs +59 -0
- package/schematics/migrations/modal-dialog-semantics/schema.json +15 -0
- package/schematics/migrations/modal-signals/README.md +88 -0
- package/schematics/migrations/modal-signals/data.cjs +132 -0
- package/schematics/migrations/modal-signals/index.cjs +20 -0
- package/schematics/migrations/modal-signals/schema.json +20 -0
- package/schematics/migrations/navbar-signals-and-aria/README.md +111 -0
- package/schematics/migrations/navbar-signals-and-aria/data.cjs +198 -0
- package/schematics/migrations/navbar-signals-and-aria/index.cjs +569 -0
- package/schematics/migrations/navbar-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/new-icons-pack/README.md +10 -10
- package/schematics/migrations/new-icons-pack/{index.js → index.cjs} +8 -7
- package/schematics/migrations/notification-center-signals/README.md +67 -0
- package/schematics/migrations/notification-center-signals/data.cjs +66 -0
- package/schematics/migrations/notification-center-signals/index.cjs +62 -0
- package/schematics/migrations/notification-center-signals/schema.json +15 -0
- package/schematics/migrations/option-signals/README.md +37 -0
- package/schematics/migrations/option-signals/data.cjs +86 -0
- package/schematics/migrations/option-signals/index.cjs +20 -0
- package/schematics/migrations/option-signals/schema.json +20 -0
- package/schematics/migrations/popover-leave-delay/README.md +51 -0
- package/schematics/migrations/popover-leave-delay/data.cjs +61 -0
- package/schematics/migrations/popover-leave-delay/index.cjs +55 -0
- package/schematics/migrations/popover-leave-delay/schema.json +15 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/README.md +54 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/data.cjs +76 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/index.cjs +59 -0
- package/schematics/migrations/progress-bar-percentage-and-aria/schema.json +15 -0
- package/schematics/migrations/progress-spinner-signals/README.md +72 -0
- package/schematics/migrations/progress-spinner-signals/data.cjs +83 -0
- package/schematics/migrations/progress-spinner-signals/index.cjs +695 -0
- package/schematics/migrations/progress-spinner-signals/schema.json +20 -0
- package/schematics/migrations/query-list-signals/README.md +32 -0
- package/schematics/migrations/query-list-signals/data.cjs +70 -0
- package/schematics/migrations/query-list-signals/index.cjs +18 -0
- package/schematics/migrations/query-list-signals/schema.json +15 -0
- package/schematics/migrations/radio-signals-and-aria/README.md +82 -0
- package/schematics/migrations/radio-signals-and-aria/data.cjs +163 -0
- package/schematics/migrations/radio-signals-and-aria/index.cjs +40 -0
- package/schematics/migrations/radio-signals-and-aria/schema.json +20 -0
- package/schematics/migrations/read-state-dwell-handlers/README.md +125 -0
- package/schematics/migrations/read-state-dwell-handlers/data.cjs +45 -0
- package/schematics/migrations/read-state-dwell-handlers/index.cjs +216 -0
- package/schematics/migrations/read-state-dwell-handlers/schema.json +20 -0
- package/schematics/migrations/scrollbar-deprecated-path/README.md +128 -0
- package/schematics/migrations/scrollbar-deprecated-path/index.cjs +21 -0
- package/schematics/migrations/scrollbar-deprecated-path/schema.json +20 -0
- package/schematics/migrations/select-signal-inputs/README.md +61 -0
- package/schematics/migrations/select-signal-inputs/data.cjs +99 -0
- package/schematics/migrations/select-signal-inputs/index.cjs +58 -0
- package/schematics/migrations/select-signal-inputs/schema.json +15 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/README.md +57 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/data.cjs +111 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/index.cjs +58 -0
- package/schematics/migrations/sidepanel-non-modal-behavior/schema.json +15 -0
- package/schematics/migrations/signal-inputs-subclasses/README.md +28 -0
- package/schematics/migrations/signal-inputs-subclasses/data.cjs +69 -0
- package/schematics/migrations/signal-inputs-subclasses/index.cjs +18 -0
- package/schematics/migrations/signal-inputs-subclasses/schema.json +15 -0
- package/schematics/migrations/split-button-optional-disabled/README.md +47 -0
- package/schematics/migrations/split-button-optional-disabled/data.cjs +53 -0
- package/schematics/migrations/split-button-optional-disabled/index.cjs +58 -0
- package/schematics/migrations/split-button-optional-disabled/schema.json +15 -0
- package/schematics/migrations/splitter-deprecated-path/README.md +136 -0
- package/schematics/migrations/splitter-deprecated-path/index.cjs +21 -0
- package/schematics/migrations/splitter-deprecated-path/schema.json +20 -0
- package/schematics/migrations/state-saving-default/README.md +67 -0
- package/schematics/migrations/state-saving-default/data.cjs +88 -0
- package/schematics/migrations/state-saving-default/index.cjs +63 -0
- package/schematics/migrations/state-saving-default/schema.json +15 -0
- package/schematics/migrations/table-cell-content/README.md +55 -0
- package/schematics/migrations/table-cell-content/data.cjs +66 -0
- package/schematics/migrations/table-cell-content/index.cjs +67 -0
- package/schematics/migrations/table-cell-content/schema.json +15 -0
- package/schematics/migrations/tabs-signals-and-aria/README.md +93 -0
- package/schematics/migrations/tabs-signals-and-aria/data.cjs +139 -0
- package/schematics/migrations/tabs-signals-and-aria/index.cjs +66 -0
- package/schematics/migrations/tabs-signals-and-aria/schema.json +15 -0
- package/schematics/migrations/tag-list-cleaner/README.md +58 -0
- package/schematics/migrations/tag-list-cleaner/data.cjs +42 -0
- package/schematics/migrations/tag-list-cleaner/index.cjs +197 -0
- package/schematics/migrations/tag-list-cleaner/schema.json +20 -0
- package/schematics/migrations/tag-slots/README.md +41 -0
- package/schematics/migrations/tag-slots/index.cjs +191 -0
- package/schematics/migrations/tag-slots/schema.json +20 -0
- package/schematics/migrations/tags-signals/README.md +85 -0
- package/schematics/migrations/tags-signals/data.cjs +103 -0
- package/schematics/migrations/tags-signals/index.cjs +674 -0
- package/schematics/migrations/tags-signals/schema.json +20 -0
- package/schematics/migrations/textarea-signals/README.md +72 -0
- package/schematics/migrations/textarea-signals/data.cjs +121 -0
- package/schematics/migrations/textarea-signals/index.cjs +380 -0
- package/schematics/migrations/textarea-signals/schema.json +20 -0
- package/schematics/migrations/time-range-title-for/README.md +164 -0
- package/schematics/migrations/time-range-title-for/data.cjs +139 -0
- package/schematics/migrations/time-range-title-for/index.cjs +164 -0
- package/schematics/migrations/time-range-title-for/schema.json +20 -0
- package/schematics/migrations/timepicker-signals/README.md +78 -0
- package/schematics/migrations/timepicker-signals/data.cjs +82 -0
- package/schematics/migrations/timepicker-signals/index.cjs +710 -0
- package/schematics/migrations/timepicker-signals/schema.json +20 -0
- package/schematics/migrations/timezone-grouping-utils/README.md +73 -0
- package/schematics/migrations/timezone-grouping-utils/data.cjs +101 -0
- package/schematics/migrations/timezone-grouping-utils/index.cjs +65 -0
- package/schematics/migrations/timezone-grouping-utils/schema.json +15 -0
- package/schematics/migrations/title-encapsulation/README.md +49 -0
- package/schematics/migrations/title-encapsulation/data.cjs +69 -0
- package/schematics/migrations/title-encapsulation/index.cjs +58 -0
- package/schematics/migrations/title-encapsulation/schema.json +15 -0
- package/schematics/migrations/toast-stack-and-defaults/README.md +102 -0
- package/schematics/migrations/toast-stack-and-defaults/data.cjs +79 -0
- package/schematics/migrations/toast-stack-and-defaults/index.cjs +54 -0
- package/schematics/migrations/toast-stack-and-defaults/schema.json +15 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/README.md +53 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/data.cjs +89 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/index.cjs +61 -0
- package/schematics/migrations/tooltip-pointer-events-and-types/schema.json +15 -0
- package/schematics/migrations/top-bar-container-selectors/README.md +111 -0
- package/schematics/migrations/top-bar-container-selectors/data.cjs +56 -0
- package/schematics/migrations/top-bar-container-selectors/index.cjs +85 -0
- package/schematics/migrations/top-bar-container-selectors/schema.json +20 -0
- package/schematics/migrations/tree-select-signals/README.md +61 -0
- package/schematics/migrations/tree-select-signals/data.cjs +106 -0
- package/schematics/migrations/tree-select-signals/index.cjs +59 -0
- package/schematics/migrations/tree-select-signals/schema.json +15 -0
- package/schematics/migrations/tree-signals/README.md +82 -0
- package/schematics/migrations/tree-signals/data.cjs +123 -0
- package/schematics/migrations/tree-signals/index.cjs +55 -0
- package/schematics/migrations/tree-signals/schema.json +15 -0
- package/schematics/migrations/tree-state-saving-default/README.md +66 -0
- package/schematics/migrations/tree-state-saving-default/data.cjs +78 -0
- package/schematics/migrations/tree-state-saving-default/index.cjs +61 -0
- package/schematics/migrations/tree-state-saving-default/schema.json +15 -0
- package/schematics/migrations/username-pipe-injection/README.md +59 -0
- package/schematics/migrations/username-pipe-injection/data.cjs +78 -0
- package/schematics/migrations/username-pipe-injection/index.cjs +59 -0
- package/schematics/migrations/username-pipe-injection/schema.json +15 -0
- package/schematics/migrations/v20-upgrade/README.md +36 -16
- package/schematics/migrations/v20-upgrade/{data.js → data.cjs} +124 -77
- package/schematics/migrations/v20-upgrade/index.cjs +19 -0
- package/schematics/migrations/v21-upgrade/README.md +271 -0
- package/schematics/migrations/v21-upgrade/data.cjs +1371 -0
- package/schematics/migrations/v21-upgrade/index.cjs +95 -0
- package/schematics/migrations/v21-upgrade/schema.json +20 -0
- package/schematics/migrations/zoneless-change-detection/README.md +30 -0
- package/schematics/migrations/zoneless-change-detection/data.cjs +29 -0
- package/schematics/migrations/zoneless-change-detection/index.cjs +21 -0
- package/schematics/migrations/zoneless-change-detection/schema.json +15 -0
- package/schematics/migrations.json +401 -6
- package/schematics/ng-add/index.cjs +266 -0
- package/schematics/ng-add/schema.json +15 -0
- package/schematics/utils/{angular-parsing.js → angular-parsing.cjs} +2 -2
- package/schematics/utils/deprecated-path-migration.cjs +62 -0
- package/schematics/utils/html-config.cjs +148 -0
- package/schematics/utils/{icon-migration.js → icon-migration.cjs} +2 -2
- package/schematics/utils/list-item-pattern.cjs +16 -0
- package/schematics/utils/{package-config.js → package-config.cjs} +3 -32
- package/schematics/utils/project-files.cjs +25 -0
- package/schematics/utils/replacement-driver.cjs +337 -0
- package/schematics/utils/safe-rule.cjs +23 -0
- package/schematics/utils/signal-members-migration.cjs +779 -0
- package/schematics/utils/tag-patterns.cjs +21 -0
- package/schematics/utils/template-ref-access.cjs +155 -0
- package/schematics/utils/{typescript.js → typescript.cjs} +1 -1
- package/schematics/utils/warn-only-migration.cjs +52 -0
- package/schematics/utils/workspace-styles.cjs +123 -0
- package/scrollbar/{_scrollbar-component-theme.scss → deprecated/_scrollbar-component-theme.scss} +1 -1
- package/scrollbar/{scrollbar.component.scss → deprecated/scrollbar.component.scss} +1 -1
- package/scrollbar/native-scrollbar.scss +68 -0
- package/scrollbar/scrollbar-tokens.scss +13 -22
- package/scrollbar/scrollbar-track.scss +94 -0
- package/scrollbar/scrollbar-viewport.scss +33 -0
- package/scrollbar/scrollbar.scss +24 -0
- package/search-expandable/search-expandable-tokens.scss +4 -0
- package/search-expandable/search-expandable.scss +4 -2
- package/select/_select-theme.scss +3 -16
- package/select/select.scss +0 -6
- package/sidebar/sidebar.scss +20 -0
- package/sidepanel/_sidepanel-theme.scss +1 -1
- package/sidepanel/sidepanel-tokens.scss +7 -1
- package/sidepanel/sidepanel.scss +41 -5
- package/skeleton/skeleton-presets.scss +350 -0
- package/skeleton/skeleton-tokens.scss +127 -0
- package/skeleton/skeleton.scss +53 -45
- package/split-button/_split-button-theme.scss +4 -4
- package/split-button/split-button.scss +2 -6
- package/splitter/{_splitter-theme.scss → deprecated/_splitter-theme.scss} +1 -1
- package/splitter/deprecated/splitter.scss +51 -0
- package/splitter/splitter-tokens.scss +19 -0
- package/splitter/splitter.scss +148 -28
- package/table/_table-theme.scss +13 -12
- package/table/table-tokens.scss +8 -0
- package/table/table.scss +47 -22
- package/tabs/_tabs-common.scss +14 -14
- package/tabs/_tabs-theme.scss +4 -5
- package/tabs/tab-body.scss +49 -1
- package/tabs/tab-header.scss +2 -1
- package/tags/tag-list.scss +4 -0
- package/tags/tag.scss +19 -1
- package/time-range/time-range.scss +9 -0
- package/timezone/timezone-option.component.scss +4 -7
- package/timezone/timezone-select.component.scss +3 -0
- package/toast/_toast-theme.scss +1 -4
- package/toast/toast-container.component.scss +19 -13
- package/toast/toast-tokens.scss +12 -6
- package/toast/toast.component.scss +42 -19
- package/toggle/_toggle-theme.scss +4 -10
- package/toggle/toggle.scss +67 -26
- package/tooltip/_tooltip-theme.scss +7 -1
- package/tooltip/tooltip-tokens.scss +1 -2
- package/tooltip/tooltip.scss +55 -9
- package/top-bar/top-bar-tokens.scss +13 -2
- package/top-bar/top-bar.scss +24 -19
- package/tree/_tree-theme.scss +0 -1
- package/tree/toggle.scss +5 -9
- package/tree/tree-option.scss +2 -4
- package/tree/tree-tokens.scss +2 -1
- package/tree/tree.scss +3 -5
- package/tree-select/_tree-select-theme.scss +4 -15
- package/tree-select/tree-select-tokens.scss +16 -0
- package/tree-select/tree-select.scss +0 -6
- package/{accordion/index.d.ts → types/koobiq-components-accordion.d.ts} +102 -84
- package/{actions-panel/index.d.ts → types/koobiq-components-actions-panel.d.ts} +44 -59
- package/{alert/index.d.ts → types/koobiq-components-alert.d.ts} +8 -3
- package/types/koobiq-components-app-switcher.d.ts +406 -0
- package/types/koobiq-components-autocomplete.d.ts +443 -0
- package/{badge/index.d.ts → types/koobiq-components-badge.d.ts} +25 -20
- package/{breadcrumbs/index.d.ts → types/koobiq-components-breadcrumbs.d.ts} +97 -46
- package/types/koobiq-components-button-toggle.d.ts +340 -0
- package/types/koobiq-components-button.d.ts +296 -0
- package/types/koobiq-components-checkbox.d.ts +172 -0
- package/types/koobiq-components-clamped-text.d.ts +184 -0
- package/{code-block/index.d.ts → types/koobiq-components-code-block.d.ts} +150 -88
- package/{content-panel/index.d.ts → types/koobiq-components-content-panel.d.ts} +81 -25
- package/{core/index.d.ts → types/koobiq-components-core.d.ts} +2827 -865
- package/{datepicker/index.d.ts → types/koobiq-components-datepicker.d.ts} +161 -116
- package/types/koobiq-components-divider.d.ts +43 -0
- package/types/koobiq-components-dl.d.ts +235 -0
- package/{dropdown/index.d.ts → types/koobiq-components-dropdown.d.ts} +245 -239
- package/types/koobiq-components-ellipsis-center.d.ts +85 -0
- package/types/koobiq-components-empty-state.d.ts +106 -0
- package/{file-upload/index.d.ts → types/koobiq-components-file-upload.d.ts} +214 -107
- package/{filter-bar/index.d.ts → types/koobiq-components-filter-bar.d.ts} +410 -495
- package/types/koobiq-components-flag.d.ts +68 -0
- package/{form-field/index.d.ts → types/koobiq-components-form-field.d.ts} +167 -191
- package/types/koobiq-components-icon.d.ts +333 -0
- package/{inline-edit/index.d.ts → types/koobiq-components-inline-edit.d.ts} +109 -46
- package/types/koobiq-components-input.d.ts +477 -0
- package/types/koobiq-components-link-deprecated.d.ts +101 -0
- package/types/koobiq-components-link.d.ts +176 -0
- package/{list/index.d.ts → types/koobiq-components-list.d.ts} +162 -99
- package/types/koobiq-components-loader-overlay.d.ts +101 -0
- package/{markdown/index.d.ts → types/koobiq-components-markdown.d.ts} +16 -24
- package/types/koobiq-components-modal.d.ts +666 -0
- package/types/koobiq-components-navbar.d.ts +569 -0
- package/types/koobiq-components-notification-center.d.ts +500 -0
- package/{overflow-items/index.d.ts → types/koobiq-components-overflow-items.d.ts} +8 -22
- package/types/koobiq-components-popover.d.ts +468 -0
- package/types/koobiq-components-progress-bar.d.ts +67 -0
- package/{progress-spinner/index.d.ts → types/koobiq-components-progress-spinner.d.ts} +33 -10
- package/types/koobiq-components-radio.d.ts +294 -0
- package/{resizer/index.d.ts → types/koobiq-components-resizer.d.ts} +37 -2
- package/{scrollbar/index.d.ts → types/koobiq-components-scrollbar-deprecated.d.ts} +18 -1
- package/types/koobiq-components-scrollbar.d.ts +154 -0
- package/types/koobiq-components-search-expandable.d.ts +164 -0
- package/{select/index.d.ts → types/koobiq-components-select.d.ts} +360 -167
- package/types/koobiq-components-sidebar.d.ts +152 -0
- package/types/koobiq-components-sidepanel.d.ts +436 -0
- package/types/koobiq-components-skeleton.d.ts +234 -0
- package/types/koobiq-components-split-button.d.ts +65 -0
- package/{splitter/index.d.ts → types/koobiq-components-splitter-deprecated.d.ts} +44 -1
- package/types/koobiq-components-splitter.d.ts +406 -0
- package/types/koobiq-components-table.d.ts +44 -0
- package/types/koobiq-components-tabs.d.ts +888 -0
- package/{tags/index.d.ts → types/koobiq-components-tags.d.ts} +249 -133
- package/types/koobiq-components-textarea.d.ts +178 -0
- package/{time-range/index.d.ts → types/koobiq-components-time-range.d.ts} +135 -62
- package/types/koobiq-components-timepicker.d.ts +223 -0
- package/types/koobiq-components-timezone.d.ts +266 -0
- package/types/koobiq-components-title.d.ts +184 -0
- package/types/koobiq-components-toast.d.ts +289 -0
- package/types/koobiq-components-toggle.d.ts +121 -0
- package/types/koobiq-components-tooltip.d.ts +610 -0
- package/types/koobiq-components-top-bar.d.ts +61 -0
- package/types/koobiq-components-tree-select.d.ts +670 -0
- package/types/koobiq-components-tree.d.ts +1339 -0
- package/types/koobiq-components-username.d.ts +340 -0
- package/username/_username-theme.scss +35 -0
- package/username/username.scss +10 -34
- package/app-switcher/index.d.ts +0 -276
- package/autocomplete/index.d.ts +0 -286
- package/button/index.d.ts +0 -153
- package/button-toggle/index.d.ts +0 -162
- package/checkbox/index.d.ts +0 -163
- package/clamped-text/index.d.ts +0 -146
- package/core/styles/_tokens.scss +0 -7
- package/core/styles/common/_clearfix.scss +0 -13
- package/core/styles/common/_popup.scss +0 -6
- package/core/styles/functions/_index.scss +0 -3
- package/core/styles/functions/_number.scss +0 -60
- package/core/styles/functions/_string.scss +0 -18
- package/core/styles/theming/scrollbar-tokens.scss +0 -25
- package/core/styles/typography/_typography-utils.scss +0 -84
- package/divider/index.d.ts +0 -20
- package/dl/index.d.ts +0 -45
- package/ellipsis-center/index.d.ts +0 -71
- package/empty-state/index.d.ts +0 -45
- package/flag/index.d.ts +0 -44
- package/icon/index.d.ts +0 -200
- package/input/index.d.ts +0 -354
- package/link/index.d.ts +0 -56
- package/loader-overlay/index.d.ts +0 -57
- package/modal/index.d.ts +0 -339
- package/navbar/index.d.ts +0 -372
- package/notification-center/index.d.ts +0 -323
- package/popover/index.d.ts +0 -182
- package/prebuilt-themes/dark-theme.css +0 -1
- package/prebuilt-themes/light-theme.css +0 -1
- package/progress-bar/index.d.ts +0 -31
- package/radio/index.d.ts +0 -203
- package/schematics/migrations/alert-signals/index.js +0 -353
- package/schematics/migrations/filter-bar-signals/index.js +0 -319
- package/schematics/migrations/v20-upgrade/index.js +0 -225
- package/schematics/ng-add/index.js +0 -39
- package/search-expandable/index.d.ts +0 -101
- package/sidebar/index.d.ts +0 -94
- package/sidepanel/index.d.ts +0 -272
- package/skeleton/index.d.ts +0 -26
- package/split-button/index.d.ts +0 -46
- package/table/index.d.ts +0 -25
- package/tabs/index.d.ts +0 -677
- package/textarea/index.d.ts +0 -138
- package/timepicker/index.d.ts +0 -197
- package/timezone/index.d.ts +0 -125
- package/title/index.d.ts +0 -139
- package/toast/index.d.ts +0 -178
- package/toggle/index.d.ts +0 -104
- package/tooltip/index.d.ts +0 -335
- package/top-bar/index.d.ts +0 -33
- package/tree/index.d.ts +0 -802
- package/tree-select/index.d.ts +0 -475
- package/username/index.d.ts +0 -194
- /package/schematics/migrations/css-selectors/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/deprecated-icons/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/icons-replacement/{data.js → data.cjs} +0 -0
- /package/schematics/migrations/new-icons-pack/{data.js → data.cjs} +0 -0
- /package/schematics/utils/{ast.js → ast.cjs} +0 -0
- /package/schematics/utils/{messages.js → messages.cjs} +0 -0
- /package/{dynamic-translation/index.d.ts → types/koobiq-components-dynamic-translation.d.ts} +0 -0
- /package/{index.d.ts → types/koobiq-components.d.ts} +0 -0
|
@@ -1,27 +1,465 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i4 from '@angular/cdk/a11y';
|
|
2
2
|
import { FocusMonitor, A11yModule } from '@angular/cdk/a11y';
|
|
3
3
|
import { Clipboard } from '@angular/cdk/clipboard';
|
|
4
4
|
import { SharedResizeObserver } from '@angular/cdk/observers/private';
|
|
5
5
|
import { Platform } from '@angular/cdk/platform';
|
|
6
|
-
import * as i4 from '@angular/cdk/scrolling';
|
|
7
|
-
import { CdkScrollable, CdkScrollableModule } from '@angular/cdk/scrolling';
|
|
8
6
|
import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
|
|
9
7
|
import * as i0 from '@angular/core';
|
|
10
|
-
import {
|
|
8
|
+
import { inject, isDevMode, Injectable, InjectionToken, Renderer2, PendingTasks, signal, input, numberAttribute, booleanAttribute, effect, SecurityContext, Directive, viewChild, contentChild, TemplateRef, linkedSignal, output, computed, ElementRef, Injector, DestroyRef, afterEveryRender, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
11
9
|
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
12
10
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
13
|
-
import * as
|
|
11
|
+
import * as i3 from '@koobiq/components/button';
|
|
14
12
|
import { KbqButtonStyles, KbqButtonModule } from '@koobiq/components/button';
|
|
15
|
-
import
|
|
13
|
+
import * as i1 from '@koobiq/components/core';
|
|
14
|
+
import { KBQ_WINDOW, kbqInjectNativeElement, ruRULocaleData, kbqLocaleConfigurationOverrideProvider, kbqOptionalNumberAttribute, KbqLocaleOverridesDirective, KbqComponentColors, KbqOverflowShadowContainer, KbqOverflowShadowTop } from '@koobiq/components/core';
|
|
16
15
|
import * as i6 from '@koobiq/components/icon';
|
|
17
16
|
import { KbqIconModule } from '@koobiq/components/icon';
|
|
18
|
-
import
|
|
17
|
+
import { KbqScrollbarViewport } from '@koobiq/components/scrollbar';
|
|
18
|
+
import * as i2 from '@koobiq/components/tabs';
|
|
19
19
|
import { KbqTabsModule } from '@koobiq/components/tabs';
|
|
20
20
|
import * as i5 from '@koobiq/components/tooltip';
|
|
21
21
|
import { KbqToolTipModule } from '@koobiq/components/tooltip';
|
|
22
|
-
import {
|
|
22
|
+
import { take, merge, fromEvent, map, debounceTime, filter } from 'rxjs';
|
|
23
|
+
import plaintext from 'highlight.js/lib/languages/plaintext';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The highlight.js line numbers plugin, kept apart from the code that calls it until code blocks number their lines
|
|
27
|
+
* on their own.
|
|
28
|
+
*
|
|
29
|
+
* This function is not intended for editing.
|
|
30
|
+
* Changes may lead to unpredictable behavior.
|
|
31
|
+
* Source code: https://github.com/wcoder/highlightjs-line-numbers.js/blob/v2.9.0/src/highlightjs-line-numbers.js
|
|
32
|
+
*
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
function highlightJSLineNumbersPlugin(d, w) {
|
|
36
|
+
'use strict';
|
|
37
|
+
if (!w)
|
|
38
|
+
return;
|
|
39
|
+
const TABLE_NAME = 'hljs-ln', LINE_NAME = 'hljs-ln-line', CODE_BLOCK_NAME = 'hljs-ln-code', NUMBERS_BLOCK_NAME = 'hljs-ln-numbers', NUMBER_LINE_NAME = 'hljs-ln-n', DATA_ATTR_NAME = 'data-line-number', BREAK_LINE_REGEXP = /\r\n|\r|\n/g;
|
|
40
|
+
if (w['hljs']) {
|
|
41
|
+
w['hljs'].initLineNumbersOnLoad = initLineNumbersOnLoad;
|
|
42
|
+
w['hljs'].lineNumbersBlock = lineNumbersBlock;
|
|
43
|
+
w['hljs'].lineNumbersBlockSync = lineNumbersBlockSync;
|
|
44
|
+
w['hljs'].lineNumbersValue = lineNumbersValue;
|
|
45
|
+
addStyles();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.error('highlight.js not detected!');
|
|
50
|
+
}
|
|
51
|
+
function isHljsLnCodeDescendant(domElt) {
|
|
52
|
+
let curElt = domElt;
|
|
53
|
+
while (curElt) {
|
|
54
|
+
if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
curElt = curElt.parentNode;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
function getHljsLnTable(hljsLnDomElt) {
|
|
62
|
+
let curElt = hljsLnDomElt;
|
|
63
|
+
while (curElt.nodeName !== 'TABLE') {
|
|
64
|
+
curElt = curElt.parentNode;
|
|
65
|
+
}
|
|
66
|
+
return curElt;
|
|
67
|
+
}
|
|
68
|
+
// Function to workaround a copy issue with Microsoft Edge.
|
|
69
|
+
// Due to hljs-ln wrapping the lines of code inside a <table> element,
|
|
70
|
+
// itself wrapped inside a <pre> element, window.getSelection().toString()
|
|
71
|
+
// does not contain any line breaks. So we need to get them back using the
|
|
72
|
+
// rendered code in the DOM as reference.
|
|
73
|
+
function edgeGetSelectedCodeLines(selection) {
|
|
74
|
+
// current selected text without line breaks
|
|
75
|
+
const selectionText = selection.toString();
|
|
76
|
+
// get the <td> element wrapping the first line of selected code
|
|
77
|
+
let tdAnchor = selection.anchorNode;
|
|
78
|
+
while (tdAnchor.nodeName !== 'TD') {
|
|
79
|
+
tdAnchor = tdAnchor.parentNode;
|
|
80
|
+
}
|
|
81
|
+
// get the <td> element wrapping the last line of selected code
|
|
82
|
+
let tdFocus = selection.focusNode;
|
|
83
|
+
while (tdFocus.nodeName !== 'TD') {
|
|
84
|
+
tdFocus = tdFocus.parentNode;
|
|
85
|
+
}
|
|
86
|
+
// extract line numbers
|
|
87
|
+
let firstLineNumber = parseInt(tdAnchor.dataset.lineNumber);
|
|
88
|
+
let lastLineNumber = parseInt(tdFocus.dataset.lineNumber);
|
|
89
|
+
// multi-lines copied case
|
|
90
|
+
if (firstLineNumber != lastLineNumber) {
|
|
91
|
+
let firstLineText = tdAnchor.textContent;
|
|
92
|
+
let lastLineText = tdFocus.textContent;
|
|
93
|
+
// if the selection was made backward, swap values
|
|
94
|
+
if (firstLineNumber > lastLineNumber) {
|
|
95
|
+
let tmp = firstLineNumber;
|
|
96
|
+
firstLineNumber = lastLineNumber;
|
|
97
|
+
lastLineNumber = tmp;
|
|
98
|
+
tmp = firstLineText;
|
|
99
|
+
firstLineText = lastLineText;
|
|
100
|
+
lastLineText = tmp;
|
|
101
|
+
}
|
|
102
|
+
// discard not copied characters in first line
|
|
103
|
+
while (selectionText.indexOf(firstLineText) !== 0) {
|
|
104
|
+
firstLineText = firstLineText.slice(1);
|
|
105
|
+
}
|
|
106
|
+
// discard not copied characters in last line
|
|
107
|
+
while (selectionText.lastIndexOf(lastLineText) === -1) {
|
|
108
|
+
lastLineText = lastLineText.slice(0, -1);
|
|
109
|
+
}
|
|
110
|
+
// reconstruct and return the real copied text
|
|
111
|
+
let selectedText = firstLineText;
|
|
112
|
+
const hljsLnTable = getHljsLnTable(tdAnchor);
|
|
113
|
+
for (let i = firstLineNumber + 1; i < lastLineNumber; ++i) {
|
|
114
|
+
const codeLineSel = format('.{0}[{1}="{2}"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]);
|
|
115
|
+
const codeLineElt = hljsLnTable.querySelector(codeLineSel);
|
|
116
|
+
selectedText += '\n' + codeLineElt.textContent;
|
|
117
|
+
}
|
|
118
|
+
selectedText += '\n' + lastLineText;
|
|
119
|
+
return selectedText;
|
|
120
|
+
// single copied line case
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
return selectionText;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// ensure consistent code copy/paste behavior across all browsers
|
|
127
|
+
// (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)
|
|
128
|
+
d.addEventListener('copy', function (e) {
|
|
129
|
+
// get current selection
|
|
130
|
+
const selection = w.getSelection();
|
|
131
|
+
// override behavior when one wants to copy line of codes
|
|
132
|
+
if (isHljsLnCodeDescendant(selection.anchorNode)) {
|
|
133
|
+
let selectionText;
|
|
134
|
+
// workaround an issue with Microsoft Edge as copied line breaks
|
|
135
|
+
// are removed otherwise from the selection string
|
|
136
|
+
if (w.navigator.userAgent.indexOf('Edge') !== -1) {
|
|
137
|
+
selectionText = edgeGetSelectedCodeLines(selection);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// other browsers can directly use the selection string
|
|
141
|
+
selectionText = selection.toString();
|
|
142
|
+
}
|
|
143
|
+
e.clipboardData.setData('text/plain', selectionText);
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
function addStyles() {
|
|
148
|
+
const css = d.createElement('style');
|
|
149
|
+
css.type = 'text/css';
|
|
150
|
+
css.innerHTML = format('.{0}{border-collapse:collapse}' + '.{0} td{padding:0}' + '.{1}:before{content:attr({2})}', [
|
|
151
|
+
TABLE_NAME,
|
|
152
|
+
NUMBER_LINE_NAME,
|
|
153
|
+
DATA_ATTR_NAME
|
|
154
|
+
]);
|
|
155
|
+
d.getElementsByTagName('head')[0].appendChild(css);
|
|
156
|
+
}
|
|
157
|
+
function initLineNumbersOnLoad(options) {
|
|
158
|
+
if (d.readyState === 'interactive' || d.readyState === 'complete') {
|
|
159
|
+
documentReady(options);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
w.addEventListener('DOMContentLoaded', function () {
|
|
163
|
+
documentReady(options);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function documentReady(options) {
|
|
168
|
+
try {
|
|
169
|
+
const blocks = d.querySelectorAll('code.hljs,code.nohighlight');
|
|
170
|
+
for (const i in blocks) {
|
|
171
|
+
if (blocks.hasOwnProperty(i)) {
|
|
172
|
+
if (!isPluginDisabledForBlock(blocks[i])) {
|
|
173
|
+
lineNumbersBlock(blocks[i], options);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
// eslint-disable-next-line no-console
|
|
180
|
+
console.error('LineNumbers error: ', e);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function isPluginDisabledForBlock(element) {
|
|
184
|
+
return element.classList.contains('nohljsln');
|
|
185
|
+
}
|
|
186
|
+
function lineNumbersBlock(element, options) {
|
|
187
|
+
if (typeof element !== 'object')
|
|
188
|
+
return;
|
|
189
|
+
async(function () {
|
|
190
|
+
element.innerHTML = lineNumbersInternal(element, options);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function lineNumbersBlockSync(element, options) {
|
|
194
|
+
if (typeof element !== 'object')
|
|
195
|
+
return;
|
|
196
|
+
element.innerHTML = lineNumbersInternal(element, options);
|
|
197
|
+
}
|
|
198
|
+
function lineNumbersValue(value, options) {
|
|
199
|
+
if (typeof value !== 'string')
|
|
200
|
+
return;
|
|
201
|
+
const element = d.createElement('code');
|
|
202
|
+
element.innerHTML = value;
|
|
203
|
+
return lineNumbersInternal(element, options);
|
|
204
|
+
}
|
|
205
|
+
function lineNumbersInternal(element, options) {
|
|
206
|
+
const internalOptions = mapOptions(element, options);
|
|
207
|
+
duplicateMultilineNodes(element);
|
|
208
|
+
return addLineNumbersBlockFor(element.innerHTML, internalOptions);
|
|
209
|
+
}
|
|
210
|
+
function addLineNumbersBlockFor(inputHtml, options) {
|
|
211
|
+
const lines = getLines(inputHtml);
|
|
212
|
+
// if last line contains only carriage return remove it
|
|
213
|
+
if (lines[lines.length - 1].trim() === '') {
|
|
214
|
+
lines.pop();
|
|
215
|
+
}
|
|
216
|
+
if (lines.length > 1 || options.singleLine) {
|
|
217
|
+
let html = '';
|
|
218
|
+
for (let i = 0, l = lines.length; i < l; i++) {
|
|
219
|
+
html += format('<tr>' +
|
|
220
|
+
'<td class="{0} {1}" {3}="{5}">' +
|
|
221
|
+
'<div class="{2}" {3}="{5}"></div>' +
|
|
222
|
+
'</td>' +
|
|
223
|
+
'<td class="{0} {4}" {3}="{5}">' +
|
|
224
|
+
'{6}' +
|
|
225
|
+
'</td>' +
|
|
226
|
+
'</tr>', [
|
|
227
|
+
LINE_NAME,
|
|
228
|
+
NUMBERS_BLOCK_NAME,
|
|
229
|
+
NUMBER_LINE_NAME,
|
|
230
|
+
DATA_ATTR_NAME,
|
|
231
|
+
CODE_BLOCK_NAME,
|
|
232
|
+
i + options.startFrom,
|
|
233
|
+
lines[i].length > 0 ? lines[i] : ' '
|
|
234
|
+
]);
|
|
235
|
+
}
|
|
236
|
+
return format('<table class="{0}">{1}</table>', [TABLE_NAME, html]);
|
|
237
|
+
}
|
|
238
|
+
return inputHtml;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* @param {HTMLElement} element Code block.
|
|
242
|
+
* @param {Object} options External API options.
|
|
243
|
+
* @returns {Object} Internal API options.
|
|
244
|
+
*/
|
|
245
|
+
function mapOptions(element, options) {
|
|
246
|
+
options = options || {};
|
|
247
|
+
return {
|
|
248
|
+
singleLine: getSingleLineOption(options),
|
|
249
|
+
startFrom: getStartFromOption(element, options)
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function getSingleLineOption(options) {
|
|
253
|
+
const defaultValue = false;
|
|
254
|
+
if (options.singleLine) {
|
|
255
|
+
return options.singleLine;
|
|
256
|
+
}
|
|
257
|
+
return defaultValue;
|
|
258
|
+
}
|
|
259
|
+
function getStartFromOption(element, options) {
|
|
260
|
+
const defaultValue = 1;
|
|
261
|
+
let startFrom = defaultValue;
|
|
262
|
+
if (isFinite(options.startFrom)) {
|
|
263
|
+
startFrom = options.startFrom;
|
|
264
|
+
}
|
|
265
|
+
// can be overridden because local option is priority
|
|
266
|
+
const value = getAttribute(element, 'data-ln-start-from');
|
|
267
|
+
if (value !== null) {
|
|
268
|
+
startFrom = toNumber(value, defaultValue);
|
|
269
|
+
}
|
|
270
|
+
return startFrom;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Recursive method for fix multi-line elements implementation in highlight.js
|
|
274
|
+
* Doing deep passage on child nodes.
|
|
275
|
+
* @param {HTMLElement} element
|
|
276
|
+
*/
|
|
277
|
+
function duplicateMultilineNodes(element) {
|
|
278
|
+
const nodes = element.childNodes;
|
|
279
|
+
for (const node in nodes) {
|
|
280
|
+
if (nodes.hasOwnProperty(node)) {
|
|
281
|
+
const child = nodes[node];
|
|
282
|
+
if (getLinesCount(child.textContent) > 0) {
|
|
283
|
+
if (child.childNodes.length > 0) {
|
|
284
|
+
duplicateMultilineNodes(child);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
duplicateMultilineNode(child.parentNode);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Method for fix multi-line elements implementation in highlight.js
|
|
295
|
+
* @param {HTMLElement} element
|
|
296
|
+
*/
|
|
297
|
+
function duplicateMultilineNode(element) {
|
|
298
|
+
const className = element.className;
|
|
299
|
+
if (!/hljs-/.test(className))
|
|
300
|
+
return;
|
|
301
|
+
const lines = getLines(element.innerHTML);
|
|
302
|
+
let result = '';
|
|
303
|
+
for (let i = 0; i < lines.length; i++) {
|
|
304
|
+
const lineText = lines[i].length > 0 ? lines[i] : ' ';
|
|
305
|
+
result += format('<span class="{0}">{1}</span>\n', [className, lineText]);
|
|
306
|
+
}
|
|
307
|
+
element.innerHTML = result.trim();
|
|
308
|
+
}
|
|
309
|
+
function getLines(text) {
|
|
310
|
+
if (text.length === 0)
|
|
311
|
+
return [];
|
|
312
|
+
return text.split(BREAK_LINE_REGEXP);
|
|
313
|
+
}
|
|
314
|
+
function getLinesCount(text) {
|
|
315
|
+
return (text.trim().match(BREAK_LINE_REGEXP) || []).length;
|
|
316
|
+
}
|
|
317
|
+
///
|
|
318
|
+
/// HELPERS
|
|
319
|
+
///
|
|
320
|
+
function async(func) {
|
|
321
|
+
w.setTimeout(func, 0);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}
|
|
325
|
+
* @param {string} format
|
|
326
|
+
* @param {array} args
|
|
327
|
+
*/
|
|
328
|
+
function format(format, args) {
|
|
329
|
+
return format.replace(/\{(\d+)\}/g, function (m, n) {
|
|
330
|
+
return args[n] !== undefined ? args[n] : m;
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* @param {HTMLElement} element Code block.
|
|
335
|
+
* @param {String} attrName Attribute name.
|
|
336
|
+
* @returns {String} Attribute value or empty.
|
|
337
|
+
*/
|
|
338
|
+
function getAttribute(element, attrName) {
|
|
339
|
+
return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* @param {String} str Source string.
|
|
343
|
+
* @param {Number} fallback Fallback value.
|
|
344
|
+
* @returns Parsed number or fallback value.
|
|
345
|
+
*/
|
|
346
|
+
function toNumber(str, fallback) {
|
|
347
|
+
if (!str)
|
|
348
|
+
return fallback;
|
|
349
|
+
const number = Number(str);
|
|
350
|
+
return isFinite(number) ? number : fallback;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// The core and not the full bundle: a bundler emits a chunk for every `import()` it finds, called or not, so the
|
|
355
|
+
// full bundle has to be imported by the application that asks for it. An instance of its own, as the module is one
|
|
356
|
+
// object for the whole process, the full bundle included: the languages one configuration registers on it would reach
|
|
357
|
+
// every other, and every later server render.
|
|
358
|
+
const defaultHljsLoader = async () => ({
|
|
359
|
+
default: (await import('highlight.js/lib/core')).default.newInstance()
|
|
360
|
+
});
|
|
361
|
+
// The key of the default configuration: `config ?? {}` would make a new key on every call.
|
|
362
|
+
const DEFAULT_CONFIG = {};
|
|
363
|
+
/**
|
|
364
|
+
* Language the loader registers on every instance, the fallback of a file the code block cannot highlight otherwise.
|
|
365
|
+
*
|
|
366
|
+
* @internal
|
|
367
|
+
*/
|
|
368
|
+
const PLAIN_TEXT_LANGUAGE = 'plaintext';
|
|
369
|
+
/**
|
|
370
|
+
* Loads highlight.js once per configuration and installs its line numbers plugin once per application.
|
|
371
|
+
*
|
|
372
|
+
* The configuration is passed in rather than injected: `KBQ_CODE_BLOCK_HIGHLIGHT_JS_CONFIG` may be provided by a
|
|
373
|
+
* component or a route, where a root service would not see it. Loads are shared by the identity of the configuration,
|
|
374
|
+
* so the code blocks under one provider share one load.
|
|
375
|
+
*
|
|
376
|
+
* @internal
|
|
377
|
+
*/
|
|
378
|
+
class KbqCodeBlockHighlightJsLoader {
|
|
379
|
+
constructor() {
|
|
380
|
+
this.document = inject(DOCUMENT);
|
|
381
|
+
this.window = inject(KBQ_WINDOW);
|
|
382
|
+
// Weak, so that a configuration made for one component instance goes away with it.
|
|
383
|
+
this.loads = new WeakMap();
|
|
384
|
+
this.instances = new WeakMap();
|
|
385
|
+
this.lineNumbers = null;
|
|
386
|
+
}
|
|
387
|
+
/** The instance loaded for `config`, or `null` until it is. */
|
|
388
|
+
loaded(config) {
|
|
389
|
+
return this.instances.get(config ?? DEFAULT_CONFIG) ?? null;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Loads highlight.js for `config`, sharing the load in flight. A failure resolves to `null` rather than rejecting,
|
|
393
|
+
* since the callers have nowhere to send a rejection, and is forgotten, so that the next file change tries again.
|
|
394
|
+
*/
|
|
395
|
+
load(config) {
|
|
396
|
+
const key = config ?? DEFAULT_CONFIG;
|
|
397
|
+
let loading = this.loads.get(key);
|
|
398
|
+
if (!loading) {
|
|
399
|
+
loading = this.importInstance(key).then((instance) => {
|
|
400
|
+
this.instances.set(key, instance);
|
|
401
|
+
return instance;
|
|
402
|
+
}, (error) => {
|
|
403
|
+
this.loads.delete(key);
|
|
404
|
+
if (isDevMode()) {
|
|
405
|
+
// eslint-disable-next-line no-console
|
|
406
|
+
console.warn('[KbqCodeBlock] Failed to load highlight.js.', error);
|
|
407
|
+
}
|
|
408
|
+
return null;
|
|
409
|
+
});
|
|
410
|
+
this.loads.set(key, loading);
|
|
411
|
+
}
|
|
412
|
+
return loading;
|
|
413
|
+
}
|
|
414
|
+
/** Wraps highlighted markup in the line numbers table. */
|
|
415
|
+
addLineNumbers(html, options) {
|
|
416
|
+
// The plugin cannot take empty markup: it reads the last of no lines.
|
|
417
|
+
return html ? this.lineNumbersPlugin().lineNumbersValue(html, options) : html;
|
|
418
|
+
}
|
|
419
|
+
async importInstance({ core, languages = {} }) {
|
|
420
|
+
const entries = Object.entries(languages);
|
|
421
|
+
// The languages do not need the core to load, so they load alongside it.
|
|
422
|
+
const [{ default: instance }, loaded] = await Promise.all([
|
|
423
|
+
(core ?? defaultHljsLoader)(),
|
|
424
|
+
Promise.all(entries.map(([, loader]) => loader()))
|
|
425
|
+
]);
|
|
426
|
+
entries.forEach(([name], index) => instance.registerLanguage(name, loaded[index].default));
|
|
427
|
+
// The directive falls back to plain text, and highlight.js throws on a language it has not registered, as the
|
|
428
|
+
// core has none.
|
|
429
|
+
if (!instance.getLanguage(PLAIN_TEXT_LANGUAGE))
|
|
430
|
+
instance.registerLanguage(PLAIN_TEXT_LANGUAGE, plaintext);
|
|
431
|
+
return instance;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* The plugin appends a `<style>` to `<head>` and registers a document `copy` listener, and removes neither, so it
|
|
435
|
+
* is installed once, for the lifetime of the application.
|
|
436
|
+
*/
|
|
437
|
+
lineNumbersPlugin() {
|
|
438
|
+
if (!this.lineNumbers) {
|
|
439
|
+
const window = this.window;
|
|
440
|
+
// The plugin attaches its API to `w.hljs` and reads nothing else from `w` but the selection and the user
|
|
441
|
+
// agent. A host of its own keeps the plugin off the highlight.js module, which every server render in the
|
|
442
|
+
// process shares, and off the global `window.hljs`.
|
|
443
|
+
const host = {
|
|
444
|
+
hljs: {},
|
|
445
|
+
getSelection: () => window.getSelection(),
|
|
446
|
+
get navigator() {
|
|
447
|
+
return window.navigator;
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
highlightJSLineNumbersPlugin(this.document, host);
|
|
451
|
+
this.lineNumbers = host.hljs;
|
|
452
|
+
}
|
|
453
|
+
return this.lineNumbers;
|
|
454
|
+
}
|
|
455
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockHighlightJsLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
456
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockHighlightJsLoader, providedIn: 'root' }); }
|
|
457
|
+
}
|
|
458
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockHighlightJsLoader, decorators: [{
|
|
459
|
+
type: Injectable,
|
|
460
|
+
args: [{ providedIn: 'root' }]
|
|
461
|
+
}] });
|
|
23
462
|
|
|
24
|
-
const defaultHljsLoader = () => import('highlight.js');
|
|
25
463
|
/**
|
|
26
464
|
* Injection token for configuring `KbqCodeBlockHighlightJsConfig`.
|
|
27
465
|
*/
|
|
@@ -33,7 +471,6 @@ const KBQ_CODE_BLOCK_HIGHLIGHT_JS_CONFIG = new InjectionToken('KBQ_CODE_BLOCK_HI
|
|
|
33
471
|
* ```ts
|
|
34
472
|
* providers: [
|
|
35
473
|
* kbqCodeBlockHighlightJsConfigProvider({
|
|
36
|
-
* core: () => import('highlight.js/lib/core'),
|
|
37
474
|
* languages: {
|
|
38
475
|
* typescript: () => import('highlight.js/lib/languages/typescript'),
|
|
39
476
|
* css: () => import('highlight.js/lib/languages/css'),
|
|
@@ -48,17 +485,24 @@ const kbqCodeBlockHighlightJsConfigProvider = (options) => ({
|
|
|
48
485
|
useValue: options
|
|
49
486
|
});
|
|
50
487
|
/**
|
|
51
|
-
* Fallback language for code block if language is not supported/specified.
|
|
488
|
+
* Fallback language for code block if language is not supported/specified. It has to be registered in `languages` of
|
|
489
|
+
* `KbqCodeBlockHighlightJsConfig`, unless it is plain text or the full bundle of highlight.js is loaded, or the code
|
|
490
|
+
* block falls back to `plaintext`.
|
|
52
491
|
*
|
|
53
|
-
*
|
|
54
|
-
* @link https://highlightjs.readthedocs.io/en/stable/supported-languages.html
|
|
492
|
+
* See the [list of supported languages](https://github.com/highlightjs/highlight.js/blob/11-stable/SUPPORTED_LANGUAGES.md).
|
|
55
493
|
*/
|
|
56
|
-
const KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE = new InjectionToken('KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE', { factory: () =>
|
|
494
|
+
const KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE = new InjectionToken('KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE', { factory: () => PLAIN_TEXT_LANGUAGE });
|
|
57
495
|
/** Utility provider for `KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE`. */
|
|
58
496
|
const kbqCodeBlockFallbackFileLanguageProvider = (language) => ({
|
|
59
497
|
provide: KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE,
|
|
60
498
|
useValue: language
|
|
61
499
|
});
|
|
500
|
+
/**
|
|
501
|
+
* Marks the markup the directive has highlighted. Found while highlight.js has yet to load, it can only have come
|
|
502
|
+
* from the server: once the browser has highlighted a file, highlight.js stays loaded. Not `data-highlighted`, which
|
|
503
|
+
* highlight.js sets on the elements it highlights itself.
|
|
504
|
+
*/
|
|
505
|
+
const HIGHLIGHTED_MARKUP_ATTRIBUTE = 'data-highlighted-markup';
|
|
62
506
|
/**
|
|
63
507
|
* Directive which applies syntax highlighting to the code block content.
|
|
64
508
|
*
|
|
@@ -67,419 +511,119 @@ const kbqCodeBlockFallbackFileLanguageProvider = (language) => ({
|
|
|
67
511
|
class KbqCodeBlockHighlight {
|
|
68
512
|
constructor() {
|
|
69
513
|
this.nativeElement = kbqInjectNativeElement();
|
|
70
|
-
this.document = inject(DOCUMENT);
|
|
71
514
|
this.renderer = inject(Renderer2);
|
|
72
515
|
this.domSanitizer = inject(DomSanitizer);
|
|
516
|
+
this.pendingTasks = inject(PendingTasks);
|
|
517
|
+
this.loader = inject(KbqCodeBlockHighlightJsLoader);
|
|
73
518
|
this.fallbackFileLanguage = inject(KBQ_CODE_BLOCK_FALLBACK_FILE_LANGUAGE);
|
|
74
|
-
|
|
519
|
+
// Read here and handed to the loader: a component or a route may provide a configuration of its own.
|
|
75
520
|
this.config = inject(KBQ_CODE_BLOCK_HIGHLIGHT_JS_CONFIG, { optional: true });
|
|
76
|
-
this.
|
|
77
|
-
this._pending = signal(false, ...(ngDevMode ? [{ debugName: "_pending" }] : []));
|
|
521
|
+
this._pending = signal(false, ...(ngDevMode ? [{ debugName: "_pending" }] : /* istanbul ignore next */ []));
|
|
78
522
|
/**
|
|
79
523
|
* Whether syntax highlighting is pending.
|
|
80
524
|
*
|
|
81
525
|
* @docs-private
|
|
82
526
|
*/
|
|
83
527
|
this.pending = this._pending.asReadonly();
|
|
528
|
+
/** The code file. */
|
|
529
|
+
this.file = input.required(...(ngDevMode ? [{ debugName: "file" }] : /* istanbul ignore next */ []));
|
|
84
530
|
/** The starting line number. */
|
|
85
|
-
this.startFrom = input(1, ...(ngDevMode ?
|
|
531
|
+
this.startFrom = input(1, { ...(ngDevMode ? { debugName: "startFrom" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
86
532
|
/** Whether to display line numbers for single line code block. */
|
|
87
|
-
this.singleLine = input(false, ...(ngDevMode ?
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
533
|
+
this.singleLine = input(false, { ...(ngDevMode ? { debugName: "singleLine" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
534
|
+
effect((onCleanup) => {
|
|
535
|
+
const file = this.file();
|
|
536
|
+
// Captured here rather than read inside `highlight()`: on the load path that read happens in a
|
|
537
|
+
// microtask, where nothing is tracked, so the effect's dependencies would otherwise depend on
|
|
538
|
+
// which branch had run before.
|
|
539
|
+
const lineNumbers = { startFrom: this.startFrom(), singleLine: this.singleLine() };
|
|
540
|
+
const hljs = this.loader.loaded(this.config);
|
|
541
|
+
if (hljs) {
|
|
542
|
+
this.highlight(hljs, file, lineNumbers);
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
// The template leaves `<code>` empty, so that hydration does not look for a text node the highlighted
|
|
546
|
+
// markup has replaced. The plain content stands in until highlighting lands, and for good if it fails.
|
|
547
|
+
const keepsServerMarkup = this.nativeElement.hasAttribute(HIGHLIGHTED_MARKUP_ATTRIBUTE);
|
|
548
|
+
if (keepsServerMarkup) {
|
|
549
|
+
// Markup from the server stays instead, rather than flash plain text over code that arrived
|
|
550
|
+
// highlighted. Once: the file of a later run is not the one it was rendered for.
|
|
551
|
+
this.renderer.removeAttribute(this.nativeElement, HIGHLIGHTED_MARKUP_ATTRIBUTE);
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
this.renderer.setProperty(this.nativeElement, 'textContent', file.content);
|
|
555
|
+
this.renderer.removeAttribute(this.nativeElement, 'data-language');
|
|
556
|
+
}
|
|
557
|
+
// A `file` that arrives while highlight.js is still loading must not be overwritten by the previous
|
|
558
|
+
// one, and nothing may be highlighted through a directive that has gone away in the meantime.
|
|
559
|
+
let cancelled = false;
|
|
560
|
+
onCleanup(() => (cancelled = true));
|
|
561
|
+
// `pending` holds the code block until the load settles, failed or not. A block with nothing highlighted to
|
|
562
|
+
// show holds the application as well, so that server rendering and tests wait for the highlighted markup.
|
|
563
|
+
// Markup kept from the server needs no task: it would keep a hydrated page unstable, and Angular replays
|
|
564
|
+
// what a reader did before hydration only once the page is stable.
|
|
565
|
+
this._pending.set(true);
|
|
566
|
+
const removeTask = keepsServerMarkup ? null : this.pendingTasks.add();
|
|
567
|
+
this.loader
|
|
568
|
+
.load(this.config)
|
|
569
|
+
.then((loaded) => {
|
|
570
|
+
if (loaded && !cancelled)
|
|
571
|
+
this.highlight(loaded, file, lineNumbers);
|
|
572
|
+
})
|
|
573
|
+
.finally(() => {
|
|
574
|
+
// A run cancelled by a newer file leaves `pending` to that one.
|
|
575
|
+
if (!cancelled)
|
|
576
|
+
this._pending.set(false);
|
|
577
|
+
removeTask?.();
|
|
578
|
+
});
|
|
579
|
+
});
|
|
101
580
|
}
|
|
102
|
-
|
|
103
|
-
this._pending.set(true);
|
|
104
|
-
const loader = core ?? defaultHljsLoader;
|
|
105
|
-
const { default: instance } = await loader();
|
|
106
|
-
if (languages) {
|
|
107
|
-
await Promise.all(Object.entries(languages).map(async ([name, loader]) => {
|
|
108
|
-
const { default: language } = await loader();
|
|
109
|
-
instance.registerLanguage(name, language);
|
|
110
|
-
}));
|
|
111
|
-
}
|
|
112
|
-
this.hljs = instance;
|
|
113
|
-
this.initLineNumbersPlugin(instance);
|
|
114
|
-
}
|
|
115
|
-
highlight(file) {
|
|
581
|
+
highlight(hljs, file, lineNumbers) {
|
|
116
582
|
this._pending.set(true);
|
|
117
583
|
let { language } = file;
|
|
118
|
-
const isKnownLanguage = !!language && !!
|
|
584
|
+
const isKnownLanguage = !!language && !!hljs.getLanguage(language);
|
|
119
585
|
if (!language || !isKnownLanguage) {
|
|
586
|
+
const fallbackLanguage = this.fallbackLanguage(hljs);
|
|
120
587
|
// A file without a language is plain text by design; only a language the core lacks is a mistake.
|
|
121
588
|
if (language) {
|
|
122
|
-
this.warn(`[KbqCodeBlock] Unknown file language: "${language}". Fall back to "${
|
|
589
|
+
this.warn(`[KbqCodeBlock] Unknown file language: "${language}". Fall back to "${fallbackLanguage}".`, file);
|
|
123
590
|
}
|
|
124
|
-
language =
|
|
591
|
+
language = fallbackLanguage;
|
|
125
592
|
}
|
|
126
|
-
const { value: highlightedHTML, language: highlightedLanguage, illegal, relevance } =
|
|
593
|
+
const { value: highlightedHTML, language: highlightedLanguage, illegal, relevance } = hljs.highlight(file.content, { language });
|
|
127
594
|
if (illegal) {
|
|
128
595
|
this.warn('[KbqCodeBlock] File content contains illegal characters.', file);
|
|
129
596
|
}
|
|
130
|
-
// Plain text
|
|
131
|
-
|
|
597
|
+
// Plain text and an empty file have no syntax to score, so their relevance is always 0. Plain text is compared by
|
|
598
|
+
// definition: highlight.js returns the name the file gives, which may be an alias such as `text`.
|
|
599
|
+
const isPlainText = hljs.getLanguage(language) === hljs.getLanguage(PLAIN_TEXT_LANGUAGE);
|
|
600
|
+
if (relevance === 0 && isKnownLanguage && !isPlainText && file.content.trim()) {
|
|
132
601
|
this.warn('[KbqCodeBlock] File content does not match the specified programming language.', file);
|
|
133
602
|
}
|
|
134
|
-
const safeHTML = this.domSanitizer.sanitize(SecurityContext.HTML, highlightedHTML);
|
|
135
|
-
const highlightedHTMLWithLineNumbers = this.
|
|
136
|
-
startFrom: this.startFrom(),
|
|
137
|
-
singleLine: this.singleLine()
|
|
138
|
-
});
|
|
603
|
+
const safeHTML = this.domSanitizer.sanitize(SecurityContext.HTML, highlightedHTML) ?? '';
|
|
604
|
+
const highlightedHTMLWithLineNumbers = this.loader.addLineNumbers(safeHTML, lineNumbers);
|
|
139
605
|
this.renderer.setAttribute(this.nativeElement, 'data-language', highlightedLanguage);
|
|
140
606
|
this.renderer.setProperty(this.nativeElement, 'innerHTML', highlightedHTMLWithLineNumbers);
|
|
607
|
+
this.renderer.setAttribute(this.nativeElement, HIGHLIGHTED_MARKUP_ATTRIBUTE, '');
|
|
141
608
|
this._pending.set(false);
|
|
142
609
|
}
|
|
610
|
+
/** The fallback language, or plain text, which the loader registers on every instance, if it is unknown too. */
|
|
611
|
+
fallbackLanguage(hljs) {
|
|
612
|
+
if (hljs.getLanguage(this.fallbackFileLanguage))
|
|
613
|
+
return this.fallbackFileLanguage;
|
|
614
|
+
this.warn(`[KbqCodeBlock] Unknown fallback language: "${this.fallbackFileLanguage}". Fall back to "${PLAIN_TEXT_LANGUAGE}".`);
|
|
615
|
+
return PLAIN_TEXT_LANGUAGE;
|
|
616
|
+
}
|
|
143
617
|
warn(...messages) {
|
|
144
618
|
if (!isDevMode())
|
|
145
619
|
return;
|
|
146
620
|
// eslint-disable-next-line no-console
|
|
147
621
|
console.warn(...messages);
|
|
148
622
|
}
|
|
149
|
-
/**
|
|
150
|
-
|
|
151
|
-
if (!this.window)
|
|
152
|
-
return;
|
|
153
|
-
this.window['hljs'] = instance;
|
|
154
|
-
this.highlightJSLineNumbersPlugin(this.document, this.window);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* This method is not intended for editing.
|
|
158
|
-
* Changes may lead to unpredictable behavior.
|
|
159
|
-
* Source code: https://github.com/wcoder/highlightjs-line-numbers.js/blob/v2.9.0/src/highlightjs-line-numbers.js
|
|
160
|
-
*/
|
|
161
|
-
highlightJSLineNumbersPlugin(d, w) {
|
|
162
|
-
'use strict';
|
|
163
|
-
if (!w)
|
|
164
|
-
return;
|
|
165
|
-
const TABLE_NAME = 'hljs-ln', LINE_NAME = 'hljs-ln-line', CODE_BLOCK_NAME = 'hljs-ln-code', NUMBERS_BLOCK_NAME = 'hljs-ln-numbers', NUMBER_LINE_NAME = 'hljs-ln-n', DATA_ATTR_NAME = 'data-line-number', BREAK_LINE_REGEXP = /\r\n|\r|\n/g;
|
|
166
|
-
if (w['hljs']) {
|
|
167
|
-
w['hljs'].initLineNumbersOnLoad = initLineNumbersOnLoad;
|
|
168
|
-
w['hljs'].lineNumbersBlock = lineNumbersBlock;
|
|
169
|
-
w['hljs'].lineNumbersBlockSync = lineNumbersBlockSync;
|
|
170
|
-
w['hljs'].lineNumbersValue = lineNumbersValue;
|
|
171
|
-
addStyles();
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
// eslint-disable-next-line no-console
|
|
175
|
-
console.error('highlight.js not detected!');
|
|
176
|
-
}
|
|
177
|
-
function isHljsLnCodeDescendant(domElt) {
|
|
178
|
-
let curElt = domElt;
|
|
179
|
-
while (curElt) {
|
|
180
|
-
if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
curElt = curElt.parentNode;
|
|
184
|
-
}
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
function getHljsLnTable(hljsLnDomElt) {
|
|
188
|
-
let curElt = hljsLnDomElt;
|
|
189
|
-
while (curElt.nodeName !== 'TABLE') {
|
|
190
|
-
curElt = curElt.parentNode;
|
|
191
|
-
}
|
|
192
|
-
return curElt;
|
|
193
|
-
}
|
|
194
|
-
// Function to workaround a copy issue with Microsoft Edge.
|
|
195
|
-
// Due to hljs-ln wrapping the lines of code inside a <table> element,
|
|
196
|
-
// itself wrapped inside a <pre> element, window.getSelection().toString()
|
|
197
|
-
// does not contain any line breaks. So we need to get them back using the
|
|
198
|
-
// rendered code in the DOM as reference.
|
|
199
|
-
function edgeGetSelectedCodeLines(selection) {
|
|
200
|
-
// current selected text without line breaks
|
|
201
|
-
const selectionText = selection.toString();
|
|
202
|
-
// get the <td> element wrapping the first line of selected code
|
|
203
|
-
let tdAnchor = selection.anchorNode;
|
|
204
|
-
while (tdAnchor.nodeName !== 'TD') {
|
|
205
|
-
tdAnchor = tdAnchor.parentNode;
|
|
206
|
-
}
|
|
207
|
-
// get the <td> element wrapping the last line of selected code
|
|
208
|
-
let tdFocus = selection.focusNode;
|
|
209
|
-
while (tdFocus.nodeName !== 'TD') {
|
|
210
|
-
tdFocus = tdFocus.parentNode;
|
|
211
|
-
}
|
|
212
|
-
// extract line numbers
|
|
213
|
-
let firstLineNumber = parseInt(tdAnchor.dataset.lineNumber);
|
|
214
|
-
let lastLineNumber = parseInt(tdFocus.dataset.lineNumber);
|
|
215
|
-
// multi-lines copied case
|
|
216
|
-
if (firstLineNumber != lastLineNumber) {
|
|
217
|
-
let firstLineText = tdAnchor.textContent;
|
|
218
|
-
let lastLineText = tdFocus.textContent;
|
|
219
|
-
// if the selection was made backward, swap values
|
|
220
|
-
if (firstLineNumber > lastLineNumber) {
|
|
221
|
-
let tmp = firstLineNumber;
|
|
222
|
-
firstLineNumber = lastLineNumber;
|
|
223
|
-
lastLineNumber = tmp;
|
|
224
|
-
tmp = firstLineText;
|
|
225
|
-
firstLineText = lastLineText;
|
|
226
|
-
lastLineText = tmp;
|
|
227
|
-
}
|
|
228
|
-
// discard not copied characters in first line
|
|
229
|
-
while (selectionText.indexOf(firstLineText) !== 0) {
|
|
230
|
-
firstLineText = firstLineText.slice(1);
|
|
231
|
-
}
|
|
232
|
-
// discard not copied characters in last line
|
|
233
|
-
while (selectionText.lastIndexOf(lastLineText) === -1) {
|
|
234
|
-
lastLineText = lastLineText.slice(0, -1);
|
|
235
|
-
}
|
|
236
|
-
// reconstruct and return the real copied text
|
|
237
|
-
let selectedText = firstLineText;
|
|
238
|
-
const hljsLnTable = getHljsLnTable(tdAnchor);
|
|
239
|
-
for (let i = firstLineNumber + 1; i < lastLineNumber; ++i) {
|
|
240
|
-
const codeLineSel = format('.{0}[{1}="{2}"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]);
|
|
241
|
-
const codeLineElt = hljsLnTable.querySelector(codeLineSel);
|
|
242
|
-
selectedText += '\n' + codeLineElt.textContent;
|
|
243
|
-
}
|
|
244
|
-
selectedText += '\n' + lastLineText;
|
|
245
|
-
return selectedText;
|
|
246
|
-
// single copied line case
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
return selectionText;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// ensure consistent code copy/paste behavior across all browsers
|
|
253
|
-
// (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)
|
|
254
|
-
d.addEventListener('copy', function (e) {
|
|
255
|
-
// get current selection
|
|
256
|
-
const selection = w.getSelection();
|
|
257
|
-
// override behavior when one wants to copy line of codes
|
|
258
|
-
if (isHljsLnCodeDescendant(selection.anchorNode)) {
|
|
259
|
-
let selectionText;
|
|
260
|
-
// workaround an issue with Microsoft Edge as copied line breaks
|
|
261
|
-
// are removed otherwise from the selection string
|
|
262
|
-
if (w.navigator.userAgent.indexOf('Edge') !== -1) {
|
|
263
|
-
selectionText = edgeGetSelectedCodeLines(selection);
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
// other browsers can directly use the selection string
|
|
267
|
-
selectionText = selection.toString();
|
|
268
|
-
}
|
|
269
|
-
e.clipboardData.setData('text/plain', selectionText);
|
|
270
|
-
e.preventDefault();
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
function addStyles() {
|
|
274
|
-
const css = d.createElement('style');
|
|
275
|
-
css.type = 'text/css';
|
|
276
|
-
css.innerHTML = format('.{0}{border-collapse:collapse}' + '.{0} td{padding:0}' + '.{1}:before{content:attr({2})}', [
|
|
277
|
-
TABLE_NAME,
|
|
278
|
-
NUMBER_LINE_NAME,
|
|
279
|
-
DATA_ATTR_NAME
|
|
280
|
-
]);
|
|
281
|
-
d.getElementsByTagName('head')[0].appendChild(css);
|
|
282
|
-
}
|
|
283
|
-
function initLineNumbersOnLoad(options) {
|
|
284
|
-
if (d.readyState === 'interactive' || d.readyState === 'complete') {
|
|
285
|
-
documentReady(options);
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
w.addEventListener('DOMContentLoaded', function () {
|
|
289
|
-
documentReady(options);
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
function documentReady(options) {
|
|
294
|
-
try {
|
|
295
|
-
const blocks = d.querySelectorAll('code.hljs,code.nohighlight');
|
|
296
|
-
for (const i in blocks) {
|
|
297
|
-
if (blocks.hasOwnProperty(i)) {
|
|
298
|
-
if (!isPluginDisabledForBlock(blocks[i])) {
|
|
299
|
-
lineNumbersBlock(blocks[i], options);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
catch (e) {
|
|
305
|
-
// eslint-disable-next-line no-console
|
|
306
|
-
console.error('LineNumbers error: ', e);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
function isPluginDisabledForBlock(element) {
|
|
310
|
-
return element.classList.contains('nohljsln');
|
|
311
|
-
}
|
|
312
|
-
function lineNumbersBlock(element, options) {
|
|
313
|
-
if (typeof element !== 'object')
|
|
314
|
-
return;
|
|
315
|
-
async(function () {
|
|
316
|
-
element.innerHTML = lineNumbersInternal(element, options);
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
function lineNumbersBlockSync(element, options) {
|
|
320
|
-
if (typeof element !== 'object')
|
|
321
|
-
return;
|
|
322
|
-
element.innerHTML = lineNumbersInternal(element, options);
|
|
323
|
-
}
|
|
324
|
-
function lineNumbersValue(value, options) {
|
|
325
|
-
if (typeof value !== 'string')
|
|
326
|
-
return;
|
|
327
|
-
const element = d.createElement('code');
|
|
328
|
-
element.innerHTML = value;
|
|
329
|
-
return lineNumbersInternal(element, options);
|
|
330
|
-
}
|
|
331
|
-
function lineNumbersInternal(element, options) {
|
|
332
|
-
const internalOptions = mapOptions(element, options);
|
|
333
|
-
duplicateMultilineNodes(element);
|
|
334
|
-
return addLineNumbersBlockFor(element.innerHTML, internalOptions);
|
|
335
|
-
}
|
|
336
|
-
function addLineNumbersBlockFor(inputHtml, options) {
|
|
337
|
-
const lines = getLines(inputHtml);
|
|
338
|
-
// if last line contains only carriage return remove it
|
|
339
|
-
if (lines[lines.length - 1].trim() === '') {
|
|
340
|
-
lines.pop();
|
|
341
|
-
}
|
|
342
|
-
if (lines.length > 1 || options.singleLine) {
|
|
343
|
-
let html = '';
|
|
344
|
-
for (let i = 0, l = lines.length; i < l; i++) {
|
|
345
|
-
html += format('<tr>' +
|
|
346
|
-
'<td class="{0} {1}" {3}="{5}">' +
|
|
347
|
-
'<div class="{2}" {3}="{5}"></div>' +
|
|
348
|
-
'</td>' +
|
|
349
|
-
'<td class="{0} {4}" {3}="{5}">' +
|
|
350
|
-
'{6}' +
|
|
351
|
-
'</td>' +
|
|
352
|
-
'</tr>', [
|
|
353
|
-
LINE_NAME,
|
|
354
|
-
NUMBERS_BLOCK_NAME,
|
|
355
|
-
NUMBER_LINE_NAME,
|
|
356
|
-
DATA_ATTR_NAME,
|
|
357
|
-
CODE_BLOCK_NAME,
|
|
358
|
-
i + options.startFrom,
|
|
359
|
-
lines[i].length > 0 ? lines[i] : ' '
|
|
360
|
-
]);
|
|
361
|
-
}
|
|
362
|
-
return format('<table class="{0}">{1}</table>', [TABLE_NAME, html]);
|
|
363
|
-
}
|
|
364
|
-
return inputHtml;
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* @param {HTMLElement} element Code block.
|
|
368
|
-
* @param {Object} options External API options.
|
|
369
|
-
* @returns {Object} Internal API options.
|
|
370
|
-
*/
|
|
371
|
-
function mapOptions(element, options) {
|
|
372
|
-
options = options || {};
|
|
373
|
-
return {
|
|
374
|
-
singleLine: getSingleLineOption(options),
|
|
375
|
-
startFrom: getStartFromOption(element, options)
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
function getSingleLineOption(options) {
|
|
379
|
-
const defaultValue = false;
|
|
380
|
-
if (options.singleLine) {
|
|
381
|
-
return options.singleLine;
|
|
382
|
-
}
|
|
383
|
-
return defaultValue;
|
|
384
|
-
}
|
|
385
|
-
function getStartFromOption(element, options) {
|
|
386
|
-
const defaultValue = 1;
|
|
387
|
-
let startFrom = defaultValue;
|
|
388
|
-
if (isFinite(options.startFrom)) {
|
|
389
|
-
startFrom = options.startFrom;
|
|
390
|
-
}
|
|
391
|
-
// can be overridden because local option is priority
|
|
392
|
-
const value = getAttribute(element, 'data-ln-start-from');
|
|
393
|
-
if (value !== null) {
|
|
394
|
-
startFrom = toNumber(value, defaultValue);
|
|
395
|
-
}
|
|
396
|
-
return startFrom;
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Recursive method for fix multi-line elements implementation in highlight.js
|
|
400
|
-
* Doing deep passage on child nodes.
|
|
401
|
-
* @param {HTMLElement} element
|
|
402
|
-
*/
|
|
403
|
-
function duplicateMultilineNodes(element) {
|
|
404
|
-
const nodes = element.childNodes;
|
|
405
|
-
for (const node in nodes) {
|
|
406
|
-
if (nodes.hasOwnProperty(node)) {
|
|
407
|
-
const child = nodes[node];
|
|
408
|
-
if (getLinesCount(child.textContent) > 0) {
|
|
409
|
-
if (child.childNodes.length > 0) {
|
|
410
|
-
duplicateMultilineNodes(child);
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
duplicateMultilineNode(child.parentNode);
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Method for fix multi-line elements implementation in highlight.js
|
|
421
|
-
* @param {HTMLElement} element
|
|
422
|
-
*/
|
|
423
|
-
function duplicateMultilineNode(element) {
|
|
424
|
-
const className = element.className;
|
|
425
|
-
if (!/hljs-/.test(className))
|
|
426
|
-
return;
|
|
427
|
-
const lines = getLines(element.innerHTML);
|
|
428
|
-
let result = '';
|
|
429
|
-
for (let i = 0; i < lines.length; i++) {
|
|
430
|
-
const lineText = lines[i].length > 0 ? lines[i] : ' ';
|
|
431
|
-
result += format('<span class="{0}">{1}</span>\n', [className, lineText]);
|
|
432
|
-
}
|
|
433
|
-
element.innerHTML = result.trim();
|
|
434
|
-
}
|
|
435
|
-
function getLines(text) {
|
|
436
|
-
if (text.length === 0)
|
|
437
|
-
return [];
|
|
438
|
-
return text.split(BREAK_LINE_REGEXP);
|
|
439
|
-
}
|
|
440
|
-
function getLinesCount(text) {
|
|
441
|
-
return (text.trim().match(BREAK_LINE_REGEXP) || []).length;
|
|
442
|
-
}
|
|
443
|
-
///
|
|
444
|
-
/// HELPERS
|
|
445
|
-
///
|
|
446
|
-
function async(func) {
|
|
447
|
-
w.setTimeout(func, 0);
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}
|
|
451
|
-
* @param {string} format
|
|
452
|
-
* @param {array} args
|
|
453
|
-
*/
|
|
454
|
-
function format(format, args) {
|
|
455
|
-
return format.replace(/\{(\d+)\}/g, function (m, n) {
|
|
456
|
-
return args[n] !== undefined ? args[n] : m;
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* @param {HTMLElement} element Code block.
|
|
461
|
-
* @param {String} attrName Attribute name.
|
|
462
|
-
* @returns {String} Attribute value or empty.
|
|
463
|
-
*/
|
|
464
|
-
function getAttribute(element, attrName) {
|
|
465
|
-
return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null;
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* @param {String} str Source string.
|
|
469
|
-
* @param {Number} fallback Fallback value.
|
|
470
|
-
* @returns Parsed number or fallback value.
|
|
471
|
-
*/
|
|
472
|
-
function toNumber(str, fallback) {
|
|
473
|
-
if (!str)
|
|
474
|
-
return fallback;
|
|
475
|
-
const number = Number(str);
|
|
476
|
-
return isFinite(number) ? number : fallback;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqCodeBlockHighlight, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
480
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.30", type: KbqCodeBlockHighlight, isStandalone: true, selector: "code[kbqCodeBlockHighlight]", inputs: { file: { classPropertyName: "file", publicName: "file", isSignal: false, isRequired: true, transformFunction: null }, startFrom: { classPropertyName: "startFrom", publicName: "startFrom", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "hljs" }, exportAs: ["kbqCodeBlockHighlight"], ngImport: i0 }); }
|
|
623
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockHighlight, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
624
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.25", type: KbqCodeBlockHighlight, isStandalone: true, selector: "code[kbqCodeBlockHighlight]", inputs: { file: { classPropertyName: "file", publicName: "file", isSignal: true, isRequired: true, transformFunction: null }, startFrom: { classPropertyName: "startFrom", publicName: "startFrom", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "hljs" }, exportAs: ["kbqCodeBlockHighlight"], ngImport: i0 }); }
|
|
481
625
|
}
|
|
482
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
626
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockHighlight, decorators: [{
|
|
483
627
|
type: Directive,
|
|
484
628
|
args: [{
|
|
485
629
|
selector: 'code[kbqCodeBlockHighlight]',
|
|
@@ -488,18 +632,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
488
632
|
},
|
|
489
633
|
exportAs: 'kbqCodeBlockHighlight'
|
|
490
634
|
}]
|
|
491
|
-
}], propDecorators: { file: [{
|
|
492
|
-
type: Input,
|
|
493
|
-
args: [{ required: true }]
|
|
494
|
-
}], startFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "startFrom", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }] } });
|
|
635
|
+
}], ctorParameters: () => [], propDecorators: { file: [{ type: i0.Input, args: [{ isSignal: true, alias: "file", required: true }] }], startFrom: [{ type: i0.Input, args: [{ isSignal: true, alias: "startFrom", required: false }] }], singleLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleLine", required: false }] }] } });
|
|
495
636
|
|
|
496
637
|
/** Localization configuration provider. */
|
|
497
|
-
const KBQ_CODE_BLOCK_LOCALE_CONFIGURATION = new InjectionToken('
|
|
498
|
-
/**
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
638
|
+
const KBQ_CODE_BLOCK_LOCALE_CONFIGURATION = new InjectionToken('KbqCodeBlockLocaleConfiguration', { factory: () => ruRULocaleData.codeBlock });
|
|
639
|
+
/**
|
|
640
|
+
* Utility provider for `KBQ_CODE_BLOCK_LOCALE_CONFIGURATION`. Only the strings you pass are overridden;
|
|
641
|
+
* the rest keep following the active locale.
|
|
642
|
+
*/
|
|
643
|
+
const kbqCodeBlockLocaleConfigurationProvider = (configuration) => kbqLocaleConfigurationOverrideProvider('codeBlock', configuration);
|
|
503
644
|
/** Fallback file name for code block if file name is not specified. */
|
|
504
645
|
const KBQ_CODE_BLOCK_FALLBACK_FILE_NAME = new InjectionToken('KBQ_CODE_BLOCK_FALLBACK_FILE_NAME', {
|
|
505
646
|
factory: () => 'code'
|
|
@@ -518,10 +659,10 @@ const kbqCodeBlockDefaultOptionsProvider = (options) => ({
|
|
|
518
659
|
});
|
|
519
660
|
/** Marks a template as a custom tab link. */
|
|
520
661
|
class KbqCodeBlockTabLinkContent {
|
|
521
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
522
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
662
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockTabLinkContent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
663
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.25", type: KbqCodeBlockTabLinkContent, isStandalone: true, selector: "ng-template[kbqCodeBlockTabLinkContent]", exportAs: ["kbqCodeBlockTabLinkContent"], ngImport: i0 }); }
|
|
523
664
|
}
|
|
524
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
665
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockTabLinkContent, decorators: [{
|
|
525
666
|
type: Directive,
|
|
526
667
|
args: [{
|
|
527
668
|
selector: 'ng-template[kbqCodeBlockTabLinkContent]',
|
|
@@ -533,128 +674,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
|
|
|
533
674
|
*/
|
|
534
675
|
class KbqCodeBlock {
|
|
535
676
|
/**
|
|
536
|
-
*
|
|
537
|
-
|
|
538
|
-
get calculatedMaxHeight() {
|
|
539
|
-
return this.maxHeight() > 0 && !this.viewAll ? this.maxHeight() : null;
|
|
540
|
-
}
|
|
541
|
-
/**
|
|
542
|
-
* @deprecated Will be removed in next major release, use `canDownload` instead.
|
|
543
|
-
*
|
|
544
|
-
* @docs-private
|
|
545
|
-
*/
|
|
546
|
-
// TODO: Skipped for migration because:
|
|
547
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
548
|
-
set canLoad(value) {
|
|
549
|
-
this.canDownload = value;
|
|
550
|
-
}
|
|
551
|
-
/**
|
|
552
|
-
* @deprecated Will be removed in next major release, use `files` instead.
|
|
553
|
-
*/
|
|
554
|
-
// TODO: Skipped for migration because:
|
|
555
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
556
|
-
set codeFiles(files) {
|
|
557
|
-
this.files = files;
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* @TODO Mark as `required`, after removing `codeFiles`
|
|
561
|
-
*
|
|
562
|
-
* Files to display.
|
|
563
|
-
*/
|
|
564
|
-
// TODO: Skipped for migration because:
|
|
565
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
566
|
-
get files() {
|
|
567
|
-
return this._files;
|
|
568
|
-
}
|
|
569
|
-
set files(files) {
|
|
570
|
-
this._files = files;
|
|
571
|
-
if (this._files.length < this.activeFileIndex) {
|
|
572
|
-
this.onSelectedTabChange(0);
|
|
573
|
-
}
|
|
574
|
-
if (this._files.length === 1 && !this._files[0].filename) {
|
|
575
|
-
this.hideTabs = true;
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* Whether to hide header tabs.
|
|
580
|
-
* Always `true` if there is only one file without filename.
|
|
581
|
-
* Makes actionbar floating if tabs are hidden.
|
|
582
|
-
*/
|
|
583
|
-
// TODO: Skipped for migration because:
|
|
584
|
-
// Accessor inputs cannot be migrated as they are too complex.
|
|
585
|
-
get hideTabs() {
|
|
586
|
-
return this._hideTabs();
|
|
587
|
-
}
|
|
588
|
-
set hideTabs(value) {
|
|
589
|
-
this._hideTabs.set(value);
|
|
590
|
-
this.hideTabsChange.emit(value);
|
|
591
|
-
}
|
|
592
|
-
/**
|
|
593
|
-
* Component locale configuration.
|
|
594
|
-
*
|
|
595
|
-
* @docs-private
|
|
596
|
-
*/
|
|
597
|
-
get localeConfiguration() {
|
|
598
|
-
return this._localeConfiguration;
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* Code content tab index.
|
|
602
|
-
*
|
|
603
|
-
* @docs-private
|
|
604
|
-
*/
|
|
605
|
-
get codeContentTabIndex() {
|
|
606
|
-
return this.canCodeContentBeFocused ? 0 : -1;
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Determines whether the code content can be focused.
|
|
610
|
-
*
|
|
611
|
-
* This checks if the scrollable code content element is present,
|
|
612
|
-
* has a scroll, and the calculated maximum height is not set.
|
|
677
|
+
* Whether the code content scrolls while nothing collapses it, which leaves keyboard users a way to scroll it.
|
|
678
|
+
* Collapsed under `maxHeight` it is clipped instead, and the "view all" button is the way in.
|
|
613
679
|
*/
|
|
614
680
|
get canCodeContentBeFocused() {
|
|
615
|
-
|
|
616
|
-
return false;
|
|
617
|
-
const element = this.scrollableCodeContent()?.getElementRef().nativeElement;
|
|
618
|
-
return element && this.hasScroll(element) && !this.calculatedMaxHeight;
|
|
681
|
+
return !this.calculatedMaxHeight() && this.hasScroll(this.scrollbarViewport().getNativeElement());
|
|
619
682
|
}
|
|
620
683
|
constructor() {
|
|
621
|
-
this.copyButtonTooltip = viewChild('copyButtonTooltip', ...(ngDevMode ? [{ debugName: "copyButtonTooltip" }] : []));
|
|
684
|
+
this.copyButtonTooltip = viewChild('copyButtonTooltip', ...(ngDevMode ? [{ debugName: "copyButtonTooltip" }] : /* istanbul ignore next */ []));
|
|
622
685
|
this.defaultOptions = inject(KBQ_CODE_BLOCK_DEFAULT_OPTIONS, { optional: true });
|
|
686
|
+
this.highlight = viewChild(KbqCodeBlockHighlight, ...(ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []));
|
|
687
|
+
this.scrollbarViewport = viewChild.required(KbqScrollbarViewport);
|
|
688
|
+
this.preElementRef = viewChild('codeBlockPre', ...(ngDevMode ? [{ debugName: "preElementRef" }] : /* istanbul ignore next */ []));
|
|
689
|
+
this.codeElementRef = viewChild('codeBlockCode', ...(ngDevMode ? [{ debugName: "codeElementRef" }] : /* istanbul ignore next */ []));
|
|
623
690
|
/**
|
|
624
|
-
*
|
|
625
|
-
*
|
|
626
|
-
* @deprecated Use `scrollTo` method instead, will be removed from public API (mark as private) in the next major release.
|
|
691
|
+
* Whether the code runs past `maxHeight`, or `undefined` until the browser has measured it. The server
|
|
692
|
+
* never measures, and its markup keeps the limit so that a block hydrated later holds its height.
|
|
627
693
|
*
|
|
628
694
|
* @docs-private
|
|
629
695
|
*/
|
|
630
|
-
this.
|
|
631
|
-
/** @docs-private */
|
|
632
|
-
this.highlight = viewChild.required(KbqCodeBlockHighlight);
|
|
633
|
-
/** @docs-private */
|
|
634
|
-
this.preElementRef = viewChild.required('codeBlockPre');
|
|
696
|
+
this.contentExceedsMaxHeight = signal(undefined, ...(ngDevMode ? [{ debugName: "contentExceedsMaxHeight" }] : /* istanbul ignore next */ []));
|
|
635
697
|
/** @docs-private */
|
|
636
|
-
this.
|
|
698
|
+
this.tabLinkTemplate = contentChild(KbqCodeBlockTabLinkContent, { ...(ngDevMode ? { debugName: "tabLinkTemplate" } : /* istanbul ignore next */ {}), read: TemplateRef });
|
|
637
699
|
/** Whether to display line numbers. */
|
|
638
|
-
this.lineNumbers = input(false, ...(ngDevMode ?
|
|
700
|
+
this.lineNumbers = input(false, { ...(ngDevMode ? { debugName: "lineNumbers" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
639
701
|
/** Whether the code block should be filled. */
|
|
640
|
-
this.filled = input(false, ...(ngDevMode ?
|
|
702
|
+
this.filled = input(false, { ...(ngDevMode ? { debugName: "filled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
641
703
|
/** Added soft wrap toggle button. */
|
|
642
|
-
this.canToggleSoftWrap = input(false, ...(ngDevMode ?
|
|
704
|
+
this.canToggleSoftWrap = input(false, { ...(ngDevMode ? { debugName: "canToggleSoftWrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
705
|
+
/**
|
|
706
|
+
* Backing input of `softWrap`. Bind through the `softWrap` attribute; read and write the signal.
|
|
707
|
+
*
|
|
708
|
+
* `model()` cannot carry the `booleanAttribute` transform a valueless attribute needs, and an input
|
|
709
|
+
* is read-only while `toggleSoftWrap()` writes this as well as the binding - hence the pair.
|
|
710
|
+
*
|
|
711
|
+
* @docs-private
|
|
712
|
+
*/
|
|
713
|
+
this.softWrapInput = input(false, { ...(ngDevMode ? { debugName: "softWrapInput" } : /* istanbul ignore next */ {}), alias: 'softWrap', transform: booleanAttribute });
|
|
643
714
|
/** Whether sequences of whitespace should be preserved. */
|
|
644
|
-
|
|
645
|
-
// Your application code writes to the input. This prevents migration.
|
|
646
|
-
this.softWrap = false;
|
|
715
|
+
this.softWrap = linkedSignal(() => this.softWrapInput(), ...(ngDevMode ? [{ debugName: "softWrap" }] : /* istanbul ignore next */ []));
|
|
647
716
|
/**
|
|
648
717
|
* Output to support two-way binding on `[(softWrap)]` property.
|
|
649
718
|
*/
|
|
650
719
|
this.softWrapChange = output();
|
|
720
|
+
/**
|
|
721
|
+
* Backing input of `viewAll`, in the same shape as `softWrapInput`.
|
|
722
|
+
*
|
|
723
|
+
* @docs-private
|
|
724
|
+
*/
|
|
725
|
+
this.viewAllInput = input(false, { ...(ngDevMode ? { debugName: "viewAllInput" } : /* istanbul ignore next */ {}), alias: 'viewAll', transform: booleanAttribute });
|
|
651
726
|
/**
|
|
652
727
|
* Allows to view all the code, otherwise it will be hidden.
|
|
653
728
|
* Works only with `maxHeight` property.
|
|
654
729
|
*/
|
|
655
|
-
|
|
656
|
-
// Your application code writes to the input. This prevents migration.
|
|
657
|
-
this.viewAll = false;
|
|
730
|
+
this.viewAll = linkedSignal(() => this.viewAllInput(), ...(ngDevMode ? [{ debugName: "viewAll" }] : /* istanbul ignore next */ []));
|
|
658
731
|
/**
|
|
659
732
|
* Output to support two-way binding on `[(viewAll)]` property.
|
|
660
733
|
*/
|
|
@@ -663,35 +736,111 @@ class KbqCodeBlock {
|
|
|
663
736
|
* Maximum height of the code block content, other parts will be hidden.
|
|
664
737
|
* Can be toggled by `viewAll` property.
|
|
665
738
|
*/
|
|
666
|
-
this.maxHeight = input(undefined, ...(ngDevMode ?
|
|
739
|
+
this.maxHeight = input(undefined, { ...(ngDevMode ? { debugName: "maxHeight" } : /* istanbul ignore next */ {}), transform: kbqOptionalNumberAttribute });
|
|
740
|
+
/**
|
|
741
|
+
* @docs-private
|
|
742
|
+
*/
|
|
743
|
+
this.calculatedMaxHeight = computed(() => {
|
|
744
|
+
const maxHeight = this.maxHeight();
|
|
745
|
+
// Code that fits is left at its natural height: clipped at the limit it would scroll by its own
|
|
746
|
+
// bottom padding, with nothing hidden to reveal and no "view all" button to reveal it.
|
|
747
|
+
return maxHeight && maxHeight > 0 && !this.viewAll() && this.contentExceedsMaxHeight() !== false
|
|
748
|
+
? maxHeight
|
|
749
|
+
: null;
|
|
750
|
+
}, ...(ngDevMode ? [{ debugName: "calculatedMaxHeight" }] : /* istanbul ignore next */ []));
|
|
751
|
+
/**
|
|
752
|
+
* Backing input of `canDownload`.
|
|
753
|
+
*
|
|
754
|
+
* @docs-private
|
|
755
|
+
*/
|
|
756
|
+
this.canDownloadInput = input(false, { ...(ngDevMode ? { debugName: "canDownloadInput" } : /* istanbul ignore next */ {}), alias: 'canDownload', transform: booleanAttribute });
|
|
667
757
|
/** Added download code button. */
|
|
668
|
-
|
|
669
|
-
// Your application code writes to the input. This prevents migration.
|
|
670
|
-
this.canDownload = false;
|
|
758
|
+
this.canDownload = linkedSignal(() => this.canDownloadInput(), ...(ngDevMode ? [{ debugName: "canDownload" }] : /* istanbul ignore next */ []));
|
|
671
759
|
/** Added copy code button. */
|
|
672
|
-
this.canCopy = input(true, ...(ngDevMode ?
|
|
760
|
+
this.canCopy = input(true, { ...(ngDevMode ? { debugName: "canCopy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
673
761
|
/** Whether the actionbar should remain visible when tabs are hidden. */
|
|
674
|
-
this.alwaysShowActionbar = input(this.defaultOptions?.alwaysShowActionbar ?? false, ...(ngDevMode ?
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
762
|
+
this.alwaysShowActionbar = input(this.defaultOptions?.alwaysShowActionbar ?? false, { ...(ngDevMode ? { debugName: "alwaysShowActionbar" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
763
|
+
/**
|
|
764
|
+
* Backing input of `files`.
|
|
765
|
+
*
|
|
766
|
+
* @docs-private
|
|
767
|
+
*/
|
|
768
|
+
this.filesInput = input([], { ...(ngDevMode ? { debugName: "filesInput" } : /* istanbul ignore next */ {}), alias: 'files' });
|
|
769
|
+
/** Files to display. */
|
|
770
|
+
// TODO: mark as `required`.
|
|
771
|
+
this.files = linkedSignal(() => this.filesInput(), ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
|
|
772
|
+
/**
|
|
773
|
+
* Backing input of `activeFileIndex`. `numberAttribute` yields NaN for anything not cleanly numeric,
|
|
774
|
+
* and an unbound `index?: number` reaches it as `undefined`, so the transform floors both at 0 rather
|
|
775
|
+
* than letting NaN through a signal typed `number`.
|
|
776
|
+
*
|
|
777
|
+
* @docs-private
|
|
778
|
+
*/
|
|
779
|
+
this.activeFileIndexInput = input(0, { ...(ngDevMode ? { debugName: "activeFileIndexInput" } : /* istanbul ignore next */ {}), alias: 'activeFileIndex',
|
|
780
|
+
transform: (value) => {
|
|
781
|
+
const index = numberAttribute(value);
|
|
782
|
+
return Number.isInteger(index) && index >= 0 ? index : 0;
|
|
783
|
+
} });
|
|
678
784
|
/** Defines which file (index) is active. */
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
785
|
+
this.activeFileIndex = linkedSignal(() => this.activeFileIndexInput(), ...(ngDevMode ? [{ debugName: "activeFileIndex" }] : /* istanbul ignore next */ []));
|
|
786
|
+
/**
|
|
787
|
+
* Index of the file actually rendered. `files` and `activeFileIndex` are written one after the other,
|
|
788
|
+
* so either order leaves the pair briefly inconsistent: the render falls back to the first file rather
|
|
789
|
+
* than resetting the input, which would write back into a `[(activeFileIndex)]` mid-update.
|
|
790
|
+
*
|
|
791
|
+
* @docs-private
|
|
792
|
+
*/
|
|
793
|
+
this.renderedFileIndex = computed(() => {
|
|
794
|
+
const index = this.activeFileIndex();
|
|
795
|
+
return index < this.files().length ? index : 0;
|
|
796
|
+
}, ...(ngDevMode ? [{ debugName: "renderedFileIndex" }] : /* istanbul ignore next */ []));
|
|
797
|
+
/**
|
|
798
|
+
* The file being rendered, or `undefined` while `files` is empty.
|
|
799
|
+
*
|
|
800
|
+
* @docs-private
|
|
801
|
+
*/
|
|
802
|
+
this.activeFile = computed(() => this.files()[this.renderedFileIndex()], ...(ngDevMode ? [{ debugName: "activeFile" }] : /* istanbul ignore next */ []));
|
|
682
803
|
/**
|
|
683
804
|
* Output to support two-way binding on `[(activeFileIndex)]` property.
|
|
684
805
|
*/
|
|
685
806
|
this.activeFileIndexChange = output();
|
|
686
807
|
/** Whether to hide border. */
|
|
687
|
-
this.noBorder = input(false, ...(ngDevMode ?
|
|
688
|
-
|
|
689
|
-
|
|
808
|
+
this.noBorder = input(false, { ...(ngDevMode ? { debugName: "noBorder" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
809
|
+
/**
|
|
810
|
+
* Backing input of `hideTabs`.
|
|
811
|
+
*
|
|
812
|
+
* @docs-private
|
|
813
|
+
*/
|
|
814
|
+
this.hideTabsInput = input(false, { ...(ngDevMode ? { debugName: "hideTabsInput" } : /* istanbul ignore next */ {}), alias: 'hideTabs', transform: booleanAttribute });
|
|
815
|
+
/**
|
|
816
|
+
* Whether to hide header tabs. A single file without a filename hides them regardless - read
|
|
817
|
+
* `tabsHidden` for what the header actually does.
|
|
818
|
+
* Makes actionbar floating if tabs are hidden.
|
|
819
|
+
*/
|
|
820
|
+
this.hideTabs = linkedSignal(() => this.hideTabsInput(), ...(ngDevMode ? [{ debugName: "hideTabs" }] : /* istanbul ignore next */ []));
|
|
821
|
+
/**
|
|
822
|
+
* A lone file with no filename has nothing to label a tab with, so the bar is hidden whatever was
|
|
823
|
+
* bound. Derived rather than written into `hideTabs`: the write latched the bar off for the life of
|
|
824
|
+
* the component, so naming the files later never brought it back, and it re-emitted `hideTabsChange`
|
|
825
|
+
* on every `files` assignment.
|
|
826
|
+
*
|
|
827
|
+
* @docs-private
|
|
828
|
+
*/
|
|
829
|
+
this.tabsHidden = computed(() => {
|
|
830
|
+
const files = this.files();
|
|
831
|
+
return this.hideTabs() || (files.length === 1 && !files[0].filename);
|
|
832
|
+
}, ...(ngDevMode ? [{ debugName: "tabsHidden" }] : /* istanbul ignore next */ []));
|
|
833
|
+
this.actionbarHovered = signal(false, ...(ngDevMode ? [{ debugName: "actionbarHovered" }] : /* istanbul ignore next */ []));
|
|
690
834
|
/**
|
|
691
835
|
* Output to support two-way binding on `[(hideTabs)]` property.
|
|
692
836
|
*/
|
|
693
837
|
this.hideTabsChange = output();
|
|
694
|
-
|
|
838
|
+
/**
|
|
839
|
+
* Component locale configuration.
|
|
840
|
+
*
|
|
841
|
+
* @docs-private
|
|
842
|
+
*/
|
|
843
|
+
this.localeConfiguration = inject(KbqLocaleOverridesDirective, { self: true }).read('codeBlock', KBQ_CODE_BLOCK_LOCALE_CONFIGURATION);
|
|
695
844
|
/**
|
|
696
845
|
* @docs-private
|
|
697
846
|
*/
|
|
@@ -702,8 +851,6 @@ class KbqCodeBlock {
|
|
|
702
851
|
this.buttonStyle = KbqButtonStyles;
|
|
703
852
|
this.elementRef = inject(ElementRef);
|
|
704
853
|
this.injector = inject(Injector);
|
|
705
|
-
this.changeDetectorRef = inject(ChangeDetectorRef);
|
|
706
|
-
this.localeService = inject(KBQ_LOCALE_SERVICE, { optional: true });
|
|
707
854
|
this.destroyRef = inject(DestroyRef);
|
|
708
855
|
this.platform = inject(Platform);
|
|
709
856
|
this.focusMonitor = inject(FocusMonitor);
|
|
@@ -720,27 +867,35 @@ class KbqCodeBlock {
|
|
|
720
867
|
this.actionbarVisible = computed(() => this.alwaysShowActionbar() ||
|
|
721
868
|
this.platform.IOS ||
|
|
722
869
|
this.platform.ANDROID ||
|
|
723
|
-
!this.
|
|
724
|
-
this.actionbarHovered(), ...(ngDevMode ? [{ debugName: "actionbarVisible" }] : []));
|
|
725
|
-
this.updateLocaleParams = () => {
|
|
726
|
-
this._localeConfiguration = this.localeService?.getParams('codeBlock');
|
|
727
|
-
this.changeDetectorRef.markForCheck();
|
|
728
|
-
};
|
|
870
|
+
!this.tabsHidden() ||
|
|
871
|
+
this.actionbarHovered(), ...(ngDevMode ? [{ debugName: "actionbarVisible" }] : /* istanbul ignore next */ []));
|
|
729
872
|
this.trackHoverState();
|
|
730
|
-
|
|
873
|
+
// The template leaves the code content focusable, as the server renders it: the server cannot measure, and a
|
|
874
|
+
// block that stays dehydrated under a `@defer` hydrate trigger would otherwise keep an overflow that no keyboard
|
|
875
|
+
// can scroll. The browser measures in the phases of every render, so that blocks rendered together read in one
|
|
876
|
+
// layout, and writes to the element directly: a binding would only catch up a round of change detection later,
|
|
877
|
+
// after the hooks still to run in this render.
|
|
878
|
+
if (this.platform.isBrowser) {
|
|
879
|
+
afterEveryRender({
|
|
880
|
+
earlyRead: () => (this.canCodeContentBeFocused ? 0 : -1),
|
|
881
|
+
write: (tabIndex) => {
|
|
882
|
+
const element = this.scrollbarViewport().getNativeElement();
|
|
883
|
+
if (element.tabIndex !== tabIndex)
|
|
884
|
+
element.tabIndex = tabIndex;
|
|
885
|
+
}
|
|
886
|
+
});
|
|
887
|
+
}
|
|
731
888
|
}
|
|
732
889
|
ngAfterViewInit() {
|
|
733
890
|
this.setupContentOverflowDetection();
|
|
891
|
+
this.revealScrollbarOnHighlight();
|
|
734
892
|
this.copyButtonTooltip()
|
|
735
893
|
?.visibleChange.pipe(takeUntilDestroyed(this.destroyRef))
|
|
736
894
|
.subscribe((isVisible) => {
|
|
737
895
|
if (isVisible) {
|
|
738
|
-
this.copyButtonTooltip().content = this.localeConfiguration.copyTooltip;
|
|
896
|
+
this.copyButtonTooltip().content = this.localeConfiguration().copyTooltip;
|
|
739
897
|
}
|
|
740
898
|
});
|
|
741
|
-
// Should call `markForCheck` to ensure the `codeContentTabIndex` is updated after the view is initialized,
|
|
742
|
-
// for correct focus behavior.
|
|
743
|
-
this.changeDetectorRef.markForCheck();
|
|
744
899
|
}
|
|
745
900
|
/**
|
|
746
901
|
* Toggles the `viewAll` property.
|
|
@@ -752,20 +907,17 @@ class KbqCodeBlock {
|
|
|
752
907
|
* will be displayed.
|
|
753
908
|
*/
|
|
754
909
|
toggleViewAll() {
|
|
755
|
-
this.viewAll
|
|
756
|
-
if (!this.viewAll) {
|
|
910
|
+
this.viewAll.set(!this.viewAll());
|
|
911
|
+
if (!this.viewAll()) {
|
|
757
912
|
this.scrollTo({ top: 0, behavior: 'instant' });
|
|
758
913
|
}
|
|
759
|
-
this.viewAllChange.emit(this.viewAll);
|
|
914
|
+
this.viewAllChange.emit(this.viewAll());
|
|
760
915
|
}
|
|
761
916
|
/** Scrolls the code content to the specified position. */
|
|
762
917
|
scrollTo(options) {
|
|
763
|
-
const scroll = () => this.
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
toObservable(highlight.pending, { injector: this.injector })
|
|
767
|
-
.pipe(filter((pending) => !pending), take(1))
|
|
768
|
-
.subscribe(scroll);
|
|
918
|
+
const scroll = () => this.scrollbarViewport().scrollTo(options);
|
|
919
|
+
if (this.highlight()?.pending()) {
|
|
920
|
+
this.highlightSettled().pipe(take(1)).subscribe(scroll);
|
|
769
921
|
}
|
|
770
922
|
else {
|
|
771
923
|
scroll();
|
|
@@ -779,8 +931,8 @@ class KbqCodeBlock {
|
|
|
779
931
|
* the content will not be wrapped.
|
|
780
932
|
*/
|
|
781
933
|
toggleSoftWrap() {
|
|
782
|
-
this.softWrap
|
|
783
|
-
this.softWrapChange.emit(this.softWrap);
|
|
934
|
+
this.softWrap.set(!this.softWrap());
|
|
935
|
+
this.softWrapChange.emit(this.softWrap());
|
|
784
936
|
}
|
|
785
937
|
/**
|
|
786
938
|
* Handles the change of the selected tab by updating the active file index
|
|
@@ -791,20 +943,25 @@ class KbqCodeBlock {
|
|
|
791
943
|
* @docs-private
|
|
792
944
|
*/
|
|
793
945
|
onSelectedTabChange(index) {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
946
|
+
// Compared against the bound index rather than the rendered one: with an out-of-range binding the
|
|
947
|
+
// two differ, and clicking the tab that is already on screen has to bring the input back in range.
|
|
948
|
+
if (this.activeFileIndex() !== index) {
|
|
949
|
+
this.activeFileIndex.set(index);
|
|
950
|
+
this.activeFileIndexChange.emit(index);
|
|
797
951
|
this.scrollTo({ top: 0, behavior: 'instant' });
|
|
798
952
|
}
|
|
799
953
|
}
|
|
800
954
|
/** Tracks hover when tabs are hidden and `alwaysShowActionbar` is disabled. */
|
|
801
955
|
trackHoverState() {
|
|
802
956
|
effect((onCleanup) => {
|
|
803
|
-
const hideTabs = this.
|
|
957
|
+
const hideTabs = this.tabsHidden();
|
|
804
958
|
const alwaysShowActionbar = this.alwaysShowActionbar();
|
|
805
959
|
this.actionbarHovered.set(false);
|
|
806
960
|
if (!hideTabs || alwaysShowActionbar || this.platform.IOS || this.platform.ANDROID)
|
|
807
961
|
return;
|
|
962
|
+
// A block that comes to life under the pointer, as one hydrated on hover does, gets no `mouseenter`
|
|
963
|
+
// until the pointer has left it.
|
|
964
|
+
this.actionbarHovered.set(this.platform.isBrowser && this.elementRef.nativeElement.matches(':hover'));
|
|
808
965
|
const subscription = merge(fromEvent(this.elementRef.nativeElement, 'mouseenter').pipe(map(() => true)), fromEvent(this.elementRef.nativeElement, 'mouseleave').pipe(map(() => false)))
|
|
809
966
|
.pipe(debounceTime(100))
|
|
810
967
|
.subscribe((isHovered) => {
|
|
@@ -813,25 +970,70 @@ class KbqCodeBlock {
|
|
|
813
970
|
onCleanup(() => subscription.unsubscribe());
|
|
814
971
|
}, { injector: this.injector });
|
|
815
972
|
}
|
|
973
|
+
/**
|
|
974
|
+
* Briefly reveals the scrollbar once highlighting settles, so whether the code scrolls is answered
|
|
975
|
+
* on arrival rather than only after the pointer enters the block. Switching files needs nothing of
|
|
976
|
+
* its own: `onSelectedTabChange` scrolls the content back to the top, and that scroll reveals the
|
|
977
|
+
* track by itself.
|
|
978
|
+
*
|
|
979
|
+
* A viewport with nothing to scroll paints no track, so this stays silent for code that fits.
|
|
980
|
+
*/
|
|
981
|
+
revealScrollbarOnHighlight() {
|
|
982
|
+
if (!this.platform.isBrowser)
|
|
983
|
+
return;
|
|
984
|
+
this.highlightSettled()
|
|
985
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
986
|
+
.subscribe(() => this.scrollbarViewport().flashScrollIndicators());
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* Emits every time highlighting finishes. Built once and reused: `toObservable` installs an Angular
|
|
990
|
+
* effect that lives as long as the injector, so creating one per call — as `scrollTo` did on every
|
|
991
|
+
* tab click while a file was still highlighting — left an effect behind each time.
|
|
992
|
+
*/
|
|
993
|
+
highlightSettled() {
|
|
994
|
+
// Read through the query: the highlighted element lives inside `@if (activeFile())`, and a block
|
|
995
|
+
// with no file has nothing to wait for.
|
|
996
|
+
this.highlightPending ??= toObservable(computed(() => this.highlight()?.pending() ?? false), {
|
|
997
|
+
injector: this.injector
|
|
998
|
+
});
|
|
999
|
+
return this.highlightPending.pipe(filter((pending) => !pending));
|
|
1000
|
+
}
|
|
816
1001
|
setupContentOverflowDetection() {
|
|
817
1002
|
if (!this.platform.isBrowser)
|
|
818
1003
|
return;
|
|
819
|
-
|
|
1004
|
+
// `maxHeight` is a signal, so the gate has to follow it: bound after init it used to leave the
|
|
1005
|
+
// content clipped with neither the "view all" button nor a way in from the keyboard.
|
|
1006
|
+
effect((onCleanup) => {
|
|
1007
|
+
const preElement = this.preElementRef()?.nativeElement;
|
|
1008
|
+
this.measureContentOverflow();
|
|
1009
|
+
if (!this.maxHeight() || !preElement)
|
|
1010
|
+
return;
|
|
1011
|
+
const subscription = this.sharedResizeObserver
|
|
1012
|
+
.observe(preElement)
|
|
1013
|
+
.subscribe(() => this.measureContentOverflow());
|
|
1014
|
+
onCleanup(() => subscription.unsubscribe());
|
|
1015
|
+
}, { injector: this.injector });
|
|
1016
|
+
// Half-rendered content answers for the wrong height, so the measurement is retaken once
|
|
1017
|
+
// highlighting settles. Kept apart from the subscription above, which would otherwise be torn
|
|
1018
|
+
// down and re-created on both edges of every `pending` flip.
|
|
1019
|
+
effect(() => {
|
|
1020
|
+
this.highlight()?.pending();
|
|
1021
|
+
untracked(() => this.measureContentOverflow());
|
|
1022
|
+
}, { injector: this.injector });
|
|
1023
|
+
}
|
|
1024
|
+
measureContentOverflow() {
|
|
1025
|
+
const maxHeight = this.maxHeight();
|
|
1026
|
+
const preElement = this.preElementRef()?.nativeElement;
|
|
1027
|
+
const codeElement = this.codeElementRef()?.nativeElement;
|
|
1028
|
+
if (!maxHeight || !preElement || !codeElement) {
|
|
1029
|
+
this.contentExceedsMaxHeight.set(false);
|
|
820
1030
|
return;
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
const
|
|
826
|
-
|
|
827
|
-
toObservable(highlight.pending, { injector: this.injector })
|
|
828
|
-
.pipe(filter((pending) => !pending), take(1))
|
|
829
|
-
.subscribe(checkOverflow);
|
|
830
|
-
}
|
|
831
|
-
this.sharedResizeObserver
|
|
832
|
-
.observe(this.preElementRef().nativeElement)
|
|
833
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
834
|
-
.subscribe(checkOverflow);
|
|
1031
|
+
}
|
|
1032
|
+
// The limit is checked against the end of the last line, not of the element: the bottom padding is
|
|
1033
|
+
// what gets clipped first, and clipped padding hides no code. Read from the computed style because
|
|
1034
|
+
// the "view all" button, once shown, deepens that padding, and measuring it would keep the button.
|
|
1035
|
+
const paddingBottom = parseFloat(this.window.getComputedStyle(codeElement).paddingBottom) || 0;
|
|
1036
|
+
this.contentExceedsMaxHeight.set(preElement.offsetHeight - paddingBottom > maxHeight);
|
|
835
1037
|
}
|
|
836
1038
|
/** Whether the element has scroll. */
|
|
837
1039
|
hasScroll({ scrollHeight, scrollWidth, clientHeight, clientWidth }) {
|
|
@@ -846,7 +1048,7 @@ class KbqCodeBlock {
|
|
|
846
1048
|
event.preventDefault();
|
|
847
1049
|
this.toggleViewAll();
|
|
848
1050
|
if (this.canCodeContentBeFocused) {
|
|
849
|
-
this.focusMonitor.focusVia(this.
|
|
1051
|
+
this.focusMonitor.focusVia(this.scrollbarViewport().getNativeElement(), 'keyboard');
|
|
850
1052
|
}
|
|
851
1053
|
}
|
|
852
1054
|
/**
|
|
@@ -858,10 +1060,12 @@ class KbqCodeBlock {
|
|
|
858
1060
|
* @docs-private
|
|
859
1061
|
*/
|
|
860
1062
|
copyCode() {
|
|
861
|
-
const file = this.
|
|
1063
|
+
const file = this.activeFile();
|
|
1064
|
+
if (!file)
|
|
1065
|
+
return;
|
|
862
1066
|
const copyButtonTooltip = this.copyButtonTooltip();
|
|
863
1067
|
if (this.clipboard.copy(file.content) && copyButtonTooltip) {
|
|
864
|
-
copyButtonTooltip.content = this.localeConfiguration.copiedTooltip;
|
|
1068
|
+
copyButtonTooltip.content = this.localeConfiguration().copiedTooltip;
|
|
865
1069
|
}
|
|
866
1070
|
}
|
|
867
1071
|
/**
|
|
@@ -870,7 +1074,9 @@ class KbqCodeBlock {
|
|
|
870
1074
|
* @docs-private
|
|
871
1075
|
*/
|
|
872
1076
|
openLink() {
|
|
873
|
-
const file = this.
|
|
1077
|
+
const file = this.activeFile();
|
|
1078
|
+
if (!file?.link)
|
|
1079
|
+
return;
|
|
874
1080
|
const safeURL = this.domSanitizer.sanitize(SecurityContext.URL, file.link);
|
|
875
1081
|
if (safeURL) {
|
|
876
1082
|
this.window.open(safeURL.toString(), '_blank');
|
|
@@ -885,7 +1091,9 @@ class KbqCodeBlock {
|
|
|
885
1091
|
* @docs-private
|
|
886
1092
|
*/
|
|
887
1093
|
downloadCode() {
|
|
888
|
-
const file = this.
|
|
1094
|
+
const file = this.activeFile();
|
|
1095
|
+
if (!file)
|
|
1096
|
+
return;
|
|
889
1097
|
const blob = new Blob([file.content], { type: 'text/plain' });
|
|
890
1098
|
const url = URL.createObjectURL(blob);
|
|
891
1099
|
const link = this.document.createElement('a');
|
|
@@ -893,75 +1101,49 @@ class KbqCodeBlock {
|
|
|
893
1101
|
link.setAttribute('download', file.filename || this.fallbackFileName);
|
|
894
1102
|
link.click();
|
|
895
1103
|
}
|
|
896
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
897
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.30", type: KbqCodeBlock, isStandalone: true, selector: "kbq-code-block", inputs: { lineNumbers: { classPropertyName: "lineNumbers", publicName: "lineNumbers", isSignal: true, isRequired: false, transformFunction: null }, filled: { classPropertyName: "filled", publicName: "filled", isSignal: true, isRequired: false, transformFunction: null }, canToggleSoftWrap: { classPropertyName: "canToggleSoftWrap", publicName: "canToggleSoftWrap", isSignal: true, isRequired: false, transformFunction: null }, softWrap: { classPropertyName: "softWrap", publicName: "softWrap", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, viewAll: { classPropertyName: "viewAll", publicName: "viewAll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, canLoad: { classPropertyName: "canLoad", publicName: "canLoad", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, canDownload: { classPropertyName: "canDownload", publicName: "canDownload", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, canCopy: { classPropertyName: "canCopy", publicName: "canCopy", isSignal: true, isRequired: false, transformFunction: null }, alwaysShowActionbar: { classPropertyName: "alwaysShowActionbar", publicName: "alwaysShowActionbar", isSignal: true, isRequired: false, transformFunction: null }, codeFiles: { classPropertyName: "codeFiles", publicName: "codeFiles", isSignal: false, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: false, isRequired: false, transformFunction: null }, activeFileIndex: { classPropertyName: "activeFileIndex", publicName: "activeFileIndex", isSignal: false, isRequired: false, transformFunction: numberAttribute }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, hideTabs: { classPropertyName: "hideTabs", publicName: "hideTabs", isSignal: false, isRequired: false, transformFunction: booleanAttribute } }, outputs: { softWrapChange: "softWrapChange", viewAllChange: "viewAllChange", activeFileIndexChange: "activeFileIndexChange", hideTabsChange: "hideTabsChange" }, host: { attributes: { "ngSkipHydration": "true" }, properties: { "class.kbq-code-block_filled": "filled()", "class.kbq-code-block_outline": "!filled()", "class.kbq-code-block_hide-line-numbers": "!lineNumbers()", "class.kbq-code-block_hide-tabs": "hideTabs", "class.kbq-code-block_no-border": "noBorder() || filled()", "class.kbq-code-block_show-actionbar": "actionbarVisible()", "class.kbq-code-block_soft-wrap": "softWrap", "class.kbq-code-block_view-all": "viewAll" }, classAttribute: "kbq-code-block" }, queries: [{ propertyName: "tabLinkTemplate", first: true, predicate: KbqCodeBlockTabLinkContent, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "copyButtonTooltip", first: true, predicate: ["copyButtonTooltip"], descendants: true, isSignal: true }, { propertyName: "scrollableCodeContent", first: true, predicate: CdkScrollable, descendants: true, isSignal: true }, { propertyName: "highlight", first: true, predicate: KbqCodeBlockHighlight, descendants: true, isSignal: true }, { propertyName: "preElementRef", first: true, predicate: ["codeBlockPre"], descendants: true, isSignal: true }], exportAs: ["kbqCodeBlock"], ngImport: i0, template: "@let file = files[activeFileIndex];\n\n<div class=\"kbq-code-block__header\" [kbqOverflowShadowTop]=\"codeBlockContent\">\n @if (!hideTabs) {\n <div class=\"kbq-code-block__header-tabs\">\n <div kbqTabNavBar transparent [tabNavPanel]=\"tabPanel\">\n @for (file of files; track file) {\n <!-- Mark tab-link as readonly if only single file present -->\n <div\n kbqTabLink\n [active]=\"$count > 1 && activeFileIndex === $index\"\n [style.pointer-events]=\"$count === 1 ? 'none' : null\"\n (click)=\"onSelectedTabChange($index)\"\n >\n @if (tabLinkTemplate) {\n <ng-container\n *ngTemplateOutlet=\"tabLinkTemplate; context: { $implicit: file, fallbackFileName }\"\n />\n } @else {\n {{ file.filename || fallbackFileName }}\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"kbq-code-block__actionbar\">\n <div class=\"kbq-code-block__actionbar__button-stack\">\n @if (canToggleSoftWrap()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__soft-wrap-button\"\n [attr.aria-label]=\"\n softWrap ? localeConfiguration.softWrapOffTooltip : localeConfiguration.softWrapOnTooltip\n \"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"\n softWrap ? localeConfiguration.softWrapOffTooltip : localeConfiguration.softWrapOnTooltip\n \"\n (click)=\"toggleSoftWrap()\"\n >\n @if (softWrap) {\n <i kbq-icon=\"kbq-text-overflow_16\"></i>\n } @else {\n <i kbq-icon=\"kbq-text-wrap_16\"></i>\n }\n </button>\n }\n\n @if (canDownload) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__download-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration.downloadTooltip\"\n (click)=\"downloadCode()\"\n >\n <i kbq-icon=\"kbq-arrow-down-to-line_16\"></i>\n </button>\n }\n\n @if (canCopy()) {\n <div #copyButtonTooltip=\"kbqTooltip\" [kbqTooltip]=\"localeConfiguration.copyTooltip\">\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__copy-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"copyCode()\"\n >\n <i kbq-icon=\"kbq-file-multiple-o_16\"></i>\n </button>\n </div>\n }\n\n @if (file.link) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__link-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration.openExternalSystemTooltip\"\n (click)=\"openLink()\"\n >\n <i kbq-icon=\"kbq-arrow-up-right-from-square_16\"></i>\n </button>\n }\n </div>\n </div>\n</div>\n\n<div\n #tabPanel=\"kbqTabNavPanel\"\n #codeBlockContent=\"kbqOverflowShadowContainer\"\n cdkMonitorElementFocus\n cdkScrollable\n kbqOverflowShadowContainer\n kbqTabNavPanel\n class=\"kbq-code-block__main kbq-scrollbar\"\n [style.max-height.px]=\"calculatedMaxHeight\"\n [tabIndex]=\"codeContentTabIndex\"\n>\n <pre\n #codeBlockPre\n class=\"kbq-code-block__pre\"\n ><code kbqCodeBlockHighlight class=\"kbq-code-block__code\" [file]=\"file\">{{ file.content }}</code></pre>\n\n @if (contentExceedsMaxHeight()) {\n <div\n class=\"kbq-code-block__view-all\"\n [class.kbq-code-block__view-all_collapsed]=\"!viewAll\"\n [class.kbq-code-block__view-all_expanded]=\"viewAll\"\n >\n <div class=\"kbq-code-block__view-all__wrapper\">\n <button\n kbq-button\n class=\"kbq-code-block__view-all__button\"\n [color]=\"componentColor.Theme\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"toggleViewAll()\"\n (keydown.enter)=\"onViewAllEnterKeydown($event)\"\n >\n @if (viewAll) {\n <i kbq-icon=\"kbq-chevron-up_16\"></i>\n {{ localeConfiguration.viewLessText }}\n } @else {\n <i kbq-icon=\"kbq-chevron-down_16\"></i>\n {{ localeConfiguration.viewAllText }}\n }\n </button>\n </div>\n </div>\n }\n</div>\n", styles: [".kbq-code-block{display:flex;flex-direction:column;position:relative;border-width:var(--kbq-code-block-size-container-border-width);border-style:solid;border-radius:var(--kbq-code-block-size-container-border-radius);box-sizing:border-box;hyphens:none;-ms-hyphens:none;-moz-hyphens:none;-webkit-hyphens:none}.kbq-code-block .kbq-code-block__header{display:flex;align-items:center;padding:var(--kbq-size-s) var(--kbq-size-m)}.kbq-code-block .kbq-code-block__header .kbq-code-block__header-tabs{overflow:hidden;flex-grow:1}.kbq-code-block .kbq-code-block__actionbar{display:flex;justify-content:right;align-items:center;z-index:1}.kbq-code-block .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{display:flex;gap:var(--kbq-code-block-size-actionbar-content-gap-horizontal)}.kbq-code-block:has(.kbq-code-block__view-all) .kbq-code-block__main .kbq-code-block__code{padding-bottom:var(--kbq-size-3xl)!important}.kbq-code-block .kbq-code-block__main{flex-grow:1;flex-direction:column;border-radius:var(--kbq-code-block-size-container-border-radius)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-style:solid;outline-width:var(--kbq-code-block-size-container-border-width-focused);outline-offset:-1px}.kbq-code-block .kbq-code-block__main .kbq-code-block__pre{margin:0;flex-grow:1}.kbq-code-block .kbq-code-block__main .kbq-code-block__code{tab-size:var(--kbq-code-block-tab-size);padding:var(--kbq-code-block-size-with-header-content-padding-top) var(--kbq-code-block-size-with-header-content-padding-horizontal) var(--kbq-code-block-size-with-header-content-padding-bottom) var(--kbq-code-block-size-with-header-content-padding-horizontal)}.kbq-code-block .kbq-code-block__main .kbq-code-block__code:focus-visible{outline:none}.kbq-code-block .kbq-code-block__main .hljs{display:block}.kbq-code-block .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-with-header-content-content-gap-horizontal);vertical-align:baseline;text-align:right}.kbq-code-block .kbq-code-block__main .hljs-ln{border-collapse:unset}.kbq-code-block .kbq-code-block__main .hljs-ln .hljs{padding:0}.kbq-code-block .kbq-code-block__main .hljs-ln-n:before{white-space:nowrap}.kbq-code-block.kbq-code-block_hide-line-numbers .hljs-ln-line.hljs-ln-numbers{display:none}.kbq-code-block.kbq-code-block_soft-wrap .kbq-code-block__code{white-space:pre-wrap;overflow-wrap:anywhere}.kbq-code-block.kbq-code-block_view-all .kbq-code-block__main{max-height:unset;overflow:auto}.kbq-code-block:not(.kbq-code-block_view-all) .kbq-code-block__main{overflow:hidden}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__header{padding:0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar{display:none;position:absolute;top:0;right:0;margin:var(--kbq-size-s) var(--kbq-size-s) var(--kbq-size-s) 0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-width:1px;border-style:solid;border-radius:calc(var(--kbq-size-border-radius) + 1px)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main{position:relative}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .kbq-code-block__code{padding:var(--kbq-code-block-size-no-header-content-padding-vertical) var(--kbq-code-block-size-no-header-content-padding-horizontal)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-no-header-content-content-gap-horizontal)}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{border-radius:var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius) 0 0}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{border-radius:0 0 var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius)}.kbq-code-block.kbq-code-block_show-actionbar .kbq-code-block__actionbar{display:flex}.kbq-code-block:not(:has(.kbq-code-block__view-all)) .kbq-code-block__main{overflow:auto}.kbq-code-block .kbq-code-block__view-all{display:flex;justify-content:center;width:100%;position:absolute;bottom:calc(var(--kbq-code-block-size-container-border-width) * -1);border-radius:var(--kbq-code-block-size-container-border-radius)}.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{border-radius:var(--kbq-size-border-radius)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{padding-top:var(--kbq-code-block-size-collapse-collapsed-padding-top);padding-bottom:var(--kbq-code-block-size-collapse-collapsed-padding-bottom)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_expanded{padding-top:var(--kbq-code-block-size-collapse-expanded-padding-top);margin-bottom:var(--kbq-code-block-size-collapse-expanded-padding-bottom)}.kbq-code-block.kbq-code-block_no-border{border-color:transparent!important}.kbq-code-block .hljs-addition{background-color:var(--kbq-code-block-hljs-addition-background);color:var(--kbq-code-block-hljs-addition-color)}.kbq-code-block .hljs-attr{background-color:var(--kbq-code-block-hljs-attr-background);color:var(--kbq-code-block-hljs-attr-color)}.kbq-code-block .hljs-attribute{background-color:var(--kbq-code-block-hljs-attribute-background);color:var(--kbq-code-block-hljs-attribute-color)}.kbq-code-block .hljs-built_in{background-color:var(--kbq-code-block-hljs-built-in-background);color:var(--kbq-code-block-hljs-built-in-color)}.kbq-code-block .hljs-bullet{background-color:var(--kbq-code-block-hljs-bullet-background);color:var(--kbq-code-block-hljs-bullet-color)}.kbq-code-block .hljs-char-escape{background-color:var(--kbq-code-block-hljs-char-escape-background);color:var(--kbq-code-block-hljs-char-escape-color)}.kbq-code-block .hljs-class{background-color:var(--kbq-code-block-hljs-class-background);color:var(--kbq-code-block-hljs-class-color)}.kbq-code-block .hljs-code{background-color:var(--kbq-code-block-hljs-code-background);color:var(--kbq-code-block-hljs-code-color)}.kbq-code-block .hljs-comment{background-color:var(--kbq-code-block-hljs-comment-background);color:var(--kbq-code-block-hljs-comment-color)}.kbq-code-block .hljs-deletion{background-color:var(--kbq-code-block-hljs-deletion-background);color:var(--kbq-code-block-hljs-deletion-color)}.kbq-code-block .hljs-doctag{background-color:var(--kbq-code-block-hljs-doctag-background);color:var(--kbq-code-block-hljs-doctag-color)}.kbq-code-block .hljs-emphasis{background-color:var(--kbq-code-block-hljs-emphasis-background);color:var(--kbq-code-block-hljs-emphasis-color)}.kbq-code-block .hljs-formula{background-color:var(--kbq-code-block-hljs-formula-background);color:var(--kbq-code-block-hljs-formula-color)}.kbq-code-block .hljs-function{background-color:var(--kbq-code-block-hljs-function-background);color:var(--kbq-code-block-hljs-function-color)}.kbq-code-block .hljs-keyword{background-color:var(--kbq-code-block-hljs-keyword-background);color:var(--kbq-code-block-hljs-keyword-color)}.kbq-code-block .hljs-link{background-color:var(--kbq-code-block-hljs-link-background);color:var(--kbq-code-block-hljs-link-color)}.kbq-code-block .hljs-literal{background-color:var(--kbq-code-block-hljs-literal-background);color:var(--kbq-code-block-hljs-literal-color)}.kbq-code-block .hljs-meta{background-color:var(--kbq-code-block-hljs-meta-background);color:var(--kbq-code-block-hljs-meta-color)}.kbq-code-block .hljs-meta-keyword{background-color:var(--kbq-code-block-hljs-meta-keyword-background);color:var(--kbq-code-block-hljs-meta-keyword-color)}.kbq-code-block .hljs-meta-string{background-color:var(--kbq-code-block-hljs-meta-string-background);color:var(--kbq-code-block-hljs-meta-string-color)}.kbq-code-block .hljs-meta-prompt{background-color:var(--kbq-code-block-hljs-meta-prompt-background);color:var(--kbq-code-block-hljs-meta-prompt-color)}.kbq-code-block .hljs-name{background-color:var(--kbq-code-block-hljs-name-background);color:var(--kbq-code-block-hljs-name-color)}.kbq-code-block .hljs-number{background-color:var(--kbq-code-block-hljs-number-background);color:var(--kbq-code-block-hljs-number-color)}.kbq-code-block .hljs-operator{background-color:var(--kbq-code-block-hljs-operator-background);color:var(--kbq-code-block-hljs-operator-color)}.kbq-code-block .hljs-params{background-color:var(--kbq-code-block-hljs-params-background);color:var(--kbq-code-block-hljs-params-color)}.kbq-code-block .hljs-property{background-color:var(--kbq-code-block-hljs-property-background);color:var(--kbq-code-block-hljs-property-color)}.kbq-code-block .hljs-punctuation{background-color:var(--kbq-code-block-hljs-punctuation-background);color:var(--kbq-code-block-hljs-punctuation-color)}.kbq-code-block .hljs-quote{background-color:var(--kbq-code-block-hljs-quote-background);color:var(--kbq-code-block-hljs-quote-color)}.kbq-code-block .hljs-regexp{background-color:var(--kbq-code-block-hljs-regexp-background);color:var(--kbq-code-block-hljs-regexp-color)}.kbq-code-block .hljs-section{background-color:var(--kbq-code-block-hljs-section-background);color:var(--kbq-code-block-hljs-section-color)}.kbq-code-block .hljs-selector-attr{background-color:var(--kbq-code-block-hljs-selector-attr-background);color:var(--kbq-code-block-hljs-selector-attr-color)}.kbq-code-block .hljs-selector-class{background-color:var(--kbq-code-block-hljs-selector-class-background);color:var(--kbq-code-block-hljs-selector-class-color)}.kbq-code-block .hljs-selector-id{background-color:var(--kbq-code-block-hljs-selector-id-background);color:var(--kbq-code-block-hljs-selector-id-color)}.kbq-code-block .hljs-selector-pseudo{background-color:var(--kbq-code-block-hljs-selector-pseudo-background);color:var(--kbq-code-block-hljs-selector-pseudo-color)}.kbq-code-block .hljs-selector-tag{background-color:var(--kbq-code-block-hljs-selector-tag-background);color:var(--kbq-code-block-hljs-selector-tag-color)}.kbq-code-block .hljs-string{background-color:var(--kbq-code-block-hljs-string-background);color:var(--kbq-code-block-hljs-string-color)}.kbq-code-block .hljs-strong{background-color:var(--kbq-code-block-hljs-strong-background);color:var(--kbq-code-block-hljs-strong-color)}.kbq-code-block .hljs-subst{background-color:var(--kbq-code-block-hljs-subst-background);color:var(--kbq-code-block-hljs-subst-color)}.kbq-code-block .hljs-symbol{background-color:var(--kbq-code-block-hljs-symbol-background);color:var(--kbq-code-block-hljs-symbol-color)}.kbq-code-block .hljs-tag{background-color:var(--kbq-code-block-hljs-tag-background);color:var(--kbq-code-block-hljs-tag-color)}.kbq-code-block .hljs-template-tag{background-color:var(--kbq-code-block-hljs-template-tag-background);color:var(--kbq-code-block-hljs-template-tag-color)}.kbq-code-block .hljs-template-variable{background-color:var(--kbq-code-block-hljs-template-variable-background);color:var(--kbq-code-block-hljs-template-variable-color)}.kbq-code-block .hljs-title{background-color:var(--kbq-code-block-hljs-title-background);color:var(--kbq-code-block-hljs-title-color)}.kbq-code-block .hljs-title-class{background-color:var(--kbq-code-block-hljs-title-class-background);color:var(--kbq-code-block-hljs-title-class-color)}.kbq-code-block .hljs-title-class-inherited{background-color:var(--kbq-code-block-hljs-title-class-inherited-background);color:var(--kbq-code-block-hljs-title-class-inherited-color)}.kbq-code-block .hljs-title-function{background-color:var(--kbq-code-block-hljs-title-function-background);color:var(--kbq-code-block-hljs-title-function-color)}.kbq-code-block .hljs-title-function-invoke{background-color:var(--kbq-code-block-hljs-title-function-invoke-background);color:var(--kbq-code-block-hljs-title-function-invoke-color)}.kbq-code-block .hljs-type{background-color:var(--kbq-code-block-hljs-type-background);color:var(--kbq-code-block-hljs-type-color)}.kbq-code-block .hljs-variable{background-color:var(--kbq-code-block-hljs-variable-background);color:var(--kbq-code-block-hljs-variable-color)}.kbq-code-block .hljs-variable-constant{background-color:var(--kbq-code-block-hljs-variable-constant-background);color:var(--kbq-code-block-hljs-variable-constant-color)}.kbq-code-block .hljs-variable-language{background-color:var(--kbq-code-block-hljs-variable-language-background);color:var(--kbq-code-block-hljs-variable-language-color)}.kbq-code-block .hljs-ln-n{color:var(--kbq-code-block-hljs-line-numbers-color)}.kbq-code-block.kbq-code-block_outline{background:var(--kbq-code-block-outline-container-background);border-color:var(--kbq-code-block-outline-container-border-color)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__header{background:var(--kbq-code-block-outline-header-background)}.kbq-code-block.kbq-code-block_outline.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-outline-actionbar-border-color);background:var(--kbq-code-block-outline-actionbar-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-outline-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-outline-collapse-expanded-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-outline-collapse-collapsed-background)}.kbq-code-block.kbq-code-block_filled{background:var(--kbq-code-block-filled-container-background);border-color:var(--kbq-code-block-filled-container-border-color)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__header{background:var(--kbq-code-block-filled-header-background)}.kbq-code-block.kbq-code-block_filled.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-filled-actionbar-border-color);background:var(--kbq-code-block-filled-actionbar-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-filled-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-filled-collapse-expanded-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-filled-collapse-collapsed-background)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-color:var(--kbq-states-line-focus-theme)}.kbq-code-block{font-size:var(--kbq-typography-mono-codeblock-font-size);font-style:var(--kbq-typography-mono-codeblock-font-style);font-weight:var(--kbq-typography-mono-codeblock-font-weight);line-height:var(--kbq-typography-mono-codeblock-line-height);font-family:var(--kbq-typography-mono-codeblock-font-family);text-transform:var(--kbq-typography-mono-codeblock-text-transform);font-feature-settings:var(--kbq-typography-mono-codeblock-font-feature-settings);letter-spacing:var(--kbq-typography-mono-codeblock-letter-spacing)}.kbq-code-block .kbq-code-block__pre,.kbq-code-block .kbq-code-block__code{font:inherit}\n", ".kbq-code-block{--kbq-code-block-size-container-border-width: var(--kbq-size-border-width);--kbq-code-block-size-container-border-width-focused: 2px;--kbq-code-block-size-container-border-radius: var(--kbq-size-border-radius);--kbq-code-block-size-with-header-content-padding-top: var(--kbq-size-xxs);--kbq-code-block-size-with-header-content-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-with-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-with-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-no-header-content-padding-vertical: 14px;--kbq-code-block-size-no-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-no-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-header-content-gap-horizontal: var(--kbq-size-l);--kbq-code-block-size-actionbar-content-gap-horizontal: var(--kbq-size-3xs);--kbq-code-block-size-collapse-expanded-padding-top: 0;--kbq-code-block-size-collapse-expanded-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-collapse-collapsed-padding-top: var(--kbq-size-3xl);--kbq-code-block-size-collapse-collapsed-padding-bottom: var(--kbq-size-l);--kbq-code-block-font-hljs-addition-font-style: null;--kbq-code-block-font-hljs-addition-font-weight: null;--kbq-code-block-font-hljs-attr-font-style: null;--kbq-code-block-font-hljs-attr-font-weight: null;--kbq-code-block-font-hljs-attribute-font-style: null;--kbq-code-block-font-hljs-attribute-font-weight: null;--kbq-code-block-font-hljs-built-in-font-style: null;--kbq-code-block-font-hljs-built-in-font-weight: null;--kbq-code-block-font-hljs-bullet-font-style: null;--kbq-code-block-font-hljs-bullet-font-weight: null;--kbq-code-block-font-hljs-char-escape-font-style: null;--kbq-code-block-font-hljs-char-escape-font-weight: null;--kbq-code-block-font-hljs-class-font-style: null;--kbq-code-block-font-hljs-class-font-weight: null;--kbq-code-block-font-hljs-code-font-style: null;--kbq-code-block-font-hljs-code-font-weight: null;--kbq-code-block-font-hljs-comment-font-style: null;--kbq-code-block-font-hljs-comment-font-weight: null;--kbq-code-block-font-hljs-deletion-font-style: null;--kbq-code-block-font-hljs-deletion-font-weight: null;--kbq-code-block-font-hljs-doctag-font-style: null;--kbq-code-block-font-hljs-doctag-font-weight: null;--kbq-code-block-font-hljs-emphasis-font-style: null;--kbq-code-block-font-hljs-emphasis-font-weight: null;--kbq-code-block-font-hljs-formula-font-style: null;--kbq-code-block-font-hljs-formula-font-weight: null;--kbq-code-block-font-hljs-function-font-style: null;--kbq-code-block-font-hljs-function-font-weight: null;--kbq-code-block-font-hljs-keyword-font-style: null;--kbq-code-block-font-hljs-keyword-font-weight: null;--kbq-code-block-font-hljs-link-font-style: null;--kbq-code-block-font-hljs-link-font-weight: null;--kbq-code-block-font-hljs-literal-font-style: null;--kbq-code-block-font-hljs-literal-font-weight: null;--kbq-code-block-font-hljs-meta-font-style: null;--kbq-code-block-font-hljs-meta-font-weight: null;--kbq-code-block-font-hljs-meta-keyword-font-style: null;--kbq-code-block-font-hljs-meta-keyword-font-weight: null;--kbq-code-block-font-hljs-meta-string-font-style: null;--kbq-code-block-font-hljs-meta-string-font-weight: null;--kbq-code-block-font-hljs-meta-prompt-font-style: null;--kbq-code-block-font-hljs-meta-prompt-font-weight: null;--kbq-code-block-font-hljs-name-font-style: null;--kbq-code-block-font-hljs-name-font-weight: null;--kbq-code-block-font-hljs-number-font-style: null;--kbq-code-block-font-hljs-number-font-weight: null;--kbq-code-block-font-hljs-operator-font-style: null;--kbq-code-block-font-hljs-operator-font-weight: null;--kbq-code-block-font-hljs-params-font-style: null;--kbq-code-block-font-hljs-params-font-weight: null;--kbq-code-block-font-hljs-property-font-style: null;--kbq-code-block-font-hljs-property-font-weight: null;--kbq-code-block-font-hljs-punctuation-font-style: null;--kbq-code-block-font-hljs-punctuation-font-weight: null;--kbq-code-block-font-hljs-quote-font-style: null;--kbq-code-block-font-hljs-quote-font-weight: null;--kbq-code-block-font-hljs-regexp-font-style: null;--kbq-code-block-font-hljs-regexp-font-weight: null;--kbq-code-block-font-hljs-section-font-style: null;--kbq-code-block-font-hljs-section-font-weight: null;--kbq-code-block-font-hljs-selector-attr-font-style: null;--kbq-code-block-font-hljs-selector-attr-font-weight: null;--kbq-code-block-font-hljs-selector-class-font-style: null;--kbq-code-block-font-hljs-selector-class-font-weight: null;--kbq-code-block-font-hljs-selector-id-font-style: null;--kbq-code-block-font-hljs-selector-id-font-weight: null;--kbq-code-block-font-hljs-selector-pseudo-font-style: null;--kbq-code-block-font-hljs-selector-pseudo-font-weight: null;--kbq-code-block-font-hljs-selector-tag-font-style: null;--kbq-code-block-font-hljs-selector-tag-font-weight: null;--kbq-code-block-font-hljs-string-font-style: null;--kbq-code-block-font-hljs-string-font-weight: null;--kbq-code-block-font-hljs-strong-font-style: null;--kbq-code-block-font-hljs-strong-font-weight: null;--kbq-code-block-font-hljs-subst-font-style: null;--kbq-code-block-font-hljs-subst-font-weight: null;--kbq-code-block-font-hljs-symbol-font-style: null;--kbq-code-block-font-hljs-symbol-font-weight: null;--kbq-code-block-font-hljs-tag-font-style: null;--kbq-code-block-font-hljs-tag-font-weight: null;--kbq-code-block-font-hljs-template-tag-font-style: null;--kbq-code-block-font-hljs-template-tag-font-weight: null;--kbq-code-block-font-hljs-template-variable-font-style: null;--kbq-code-block-font-hljs-template-variable-font-weight: null;--kbq-code-block-font-hljs-title-font-style: null;--kbq-code-block-font-hljs-title-font-weight: null;--kbq-code-block-font-hljs-title-class-font-style: normal;--kbq-code-block-font-hljs-title-class-font-weight: 500;--kbq-code-block-font-hljs-title-class-inherited-font-style: null;--kbq-code-block-font-hljs-title-class-inherited-font-weight: null;--kbq-code-block-font-hljs-title-function-font-style: null;--kbq-code-block-font-hljs-title-function-font-weight: null;--kbq-code-block-font-hljs-title-function-invoke-font-style: null;--kbq-code-block-font-hljs-title-function-invoke-font-weight: null;--kbq-code-block-font-hljs-type-font-style: null;--kbq-code-block-font-hljs-type-font-weight: null;--kbq-code-block-font-hljs-variable-font-style: null;--kbq-code-block-font-hljs-variable-font-weight: null;--kbq-code-block-font-hljs-variable-constant-font-style: null;--kbq-code-block-font-hljs-variable-constant-font-weight: null;--kbq-code-block-font-hljs-variable-language-font-style: null;--kbq-code-block-font-hljs-variable-language-font-weight: null;--kbq-code-block-filled-container-background: var(--kbq-background-contrast-less);--kbq-code-block-filled-container-border-color: transparent;--kbq-code-block-filled-header-background: transparent;--kbq-code-block-filled-actionbar-background: var(--kbq-background-card);--kbq-code-block-filled-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-filled-collapse-expanded-background: transparent;--kbq-code-block-filled-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg-secondary) 100% );--kbq-code-block-filled-collapse-button-expand-background: var(--kbq-background-bg-secondary);--kbq-code-block-outline-container-background: var(--kbq-background-card);--kbq-code-block-outline-container-border-color: var(--kbq-divider-color, var(--kbq-line-contrast-less));--kbq-code-block-outline-header-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-outline-collapse-expanded-background: transparent;--kbq-code-block-outline-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg) 100% );--kbq-code-block-outline-collapse-button-expand-background: var(--kbq-background-card);--kbq-code-block-hljs-addition-background: var(--kbq-plt-green-a2, var(--kbq-palette-green-95));--kbq-code-block-hljs-addition-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-attr-background: null;--kbq-code-block-hljs-attr-color: null;--kbq-code-block-hljs-attribute-background: null;--kbq-code-block-hljs-attribute-color: null;--kbq-code-block-hljs-built-in-background: null;--kbq-code-block-hljs-built-in-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-bullet-background: null;--kbq-code-block-hljs-bullet-color: null;--kbq-code-block-hljs-char-escape-background: null;--kbq-code-block-hljs-char-escape-color: null;--kbq-code-block-hljs-class-background: null;--kbq-code-block-hljs-class-color: null;--kbq-code-block-hljs-code-background: null;--kbq-code-block-hljs-code-color: null;--kbq-code-block-hljs-comment-background: null;--kbq-code-block-hljs-comment-color: var(--kbq-plt-slate-a16, var(--kbq-palette-grey-60));--kbq-code-block-hljs-deletion-background: var(--kbq-plt-red-a2, var(--kbq-palette-red-95));--kbq-code-block-hljs-deletion-color: var(--kbq-plt-red-a16, var(--kbq-palette-red-35));--kbq-code-block-hljs-doctag-background: null;--kbq-code-block-hljs-doctag-color: null;--kbq-code-block-hljs-emphasis-background: null;--kbq-code-block-hljs-emphasis-color: null;--kbq-code-block-hljs-formula-background: null;--kbq-code-block-hljs-formula-color: null;--kbq-code-block-hljs-function-background: null;--kbq-code-block-hljs-function-color: null;--kbq-code-block-hljs-keyword-background: null;--kbq-code-block-hljs-keyword-color: null;--kbq-code-block-hljs-line-numbers-color: var(--kbq-foreground-contrast-secondary);--kbq-code-block-hljs-link-background: null;--kbq-code-block-hljs-link-color: null;--kbq-code-block-hljs-literal-background: null;--kbq-code-block-hljs-literal-color: var(--kbq-plt-purple-a16, var(--kbq-palette-purple-30));--kbq-code-block-hljs-meta-background: null;--kbq-code-block-hljs-meta-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-keyword-background: null;--kbq-code-block-hljs-meta-keyword-color: null;--kbq-code-block-hljs-meta-string-background: null;--kbq-code-block-hljs-meta-string-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-prompt-background: null;--kbq-code-block-hljs-meta-prompt-color: null;--kbq-code-block-hljs-name-background: null;--kbq-code-block-hljs-name-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-number-background: null;--kbq-code-block-hljs-number-color: var(--kbq-plt-purple-a16, var(--kbq-palette-purple-30));--kbq-code-block-hljs-operator-background: null;--kbq-code-block-hljs-operator-color: null;--kbq-code-block-hljs-params-background: null;--kbq-code-block-hljs-params-color: null;--kbq-code-block-hljs-property-background: null;--kbq-code-block-hljs-property-color: null;--kbq-code-block-hljs-punctuation-background: null;--kbq-code-block-hljs-punctuation-color: null;--kbq-code-block-hljs-quote-background: null;--kbq-code-block-hljs-quote-color: null;--kbq-code-block-hljs-regexp-background: null;--kbq-code-block-hljs-regexp-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-section-background: null;--kbq-code-block-hljs-section-color: null;--kbq-code-block-hljs-selector-attr-background: null;--kbq-code-block-hljs-selector-attr-color: null;--kbq-code-block-hljs-selector-class-background: null;--kbq-code-block-hljs-selector-class-color: null;--kbq-code-block-hljs-selector-id-background: null;--kbq-code-block-hljs-selector-id-color: null;--kbq-code-block-hljs-selector-pseudo-background: null;--kbq-code-block-hljs-selector-pseudo-color: null;--kbq-code-block-hljs-selector-tag-background: null;--kbq-code-block-hljs-selector-tag-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-string-background: null;--kbq-code-block-hljs-string-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-strong-background: null;--kbq-code-block-hljs-strong-color: null;--kbq-code-block-hljs-subst-background: null;--kbq-code-block-hljs-subst-color: null;--kbq-code-block-hljs-symbol-background: null;--kbq-code-block-hljs-symbol-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-tag-background: null;--kbq-code-block-hljs-tag-color: null;--kbq-code-block-hljs-template-tag-background: null;--kbq-code-block-hljs-template-tag-color: null;--kbq-code-block-hljs-template-variable-background: null;--kbq-code-block-hljs-template-variable-color: null;--kbq-code-block-hljs-title-background: null;--kbq-code-block-hljs-title-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-title-class-background: null;--kbq-code-block-hljs-title-class-color: null;--kbq-code-block-hljs-title-class-inherited-background: null;--kbq-code-block-hljs-title-class-inherited-color: null;--kbq-code-block-hljs-title-function-background: null;--kbq-code-block-hljs-title-function-color: null;--kbq-code-block-hljs-title-function-invoke-background: null;--kbq-code-block-hljs-title-function-invoke-color: null;--kbq-code-block-hljs-type-background: null;--kbq-code-block-hljs-type-color: null;--kbq-code-block-hljs-variable-background: null;--kbq-code-block-hljs-variable-color: null;--kbq-code-block-hljs-variable-constant-background: null;--kbq-code-block-hljs-variable-constant-color: null;--kbq-code-block-hljs-variable-language-background: null;--kbq-code-block-hljs-variable-language-color: null;--kbq-code-block-tab-size: 4}.kbq-dark .kbq-code-block{--kbq-code-block-hljs-addition-background: var(--kbq-plt-dark-green-a5, var(--kbq-palette-green-95));--kbq-code-block-hljs-addition-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-built-in-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-comment-color: var(--kbq-plt-dark-slate-a14, var(--kbq-palette-grey-60));--kbq-code-block-hljs-deletion-background: var(--kbq-plt-dark-red-a5, var(--kbq-palette-red-95));--kbq-code-block-hljs-deletion-color: var(--kbq-plt-dark-red-a14, var(--kbq-palette-red-35));--kbq-code-block-hljs-literal-color: var(--kbq-plt-dark-purple-a14, var(--kbq-palette-purple-30));--kbq-code-block-hljs-meta-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-string-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-name-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-number-color: var(--kbq-plt-dark-purple-a14, var(--kbq-palette-purple-30));--kbq-code-block-hljs-regexp-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-selector-tag-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-string-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-symbol-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-title-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35))}\n"], dependencies: [{ kind: "ngmodule", type: KbqTabsModule }, { kind: "component", type: i1.KbqTabNavBar, selector: "[kbqTabNavBar], [kbq-tab-nav-bar]", inputs: ["transparent", "onSurface", "underlined", "tabNavPanel"], exportAs: ["kbqTabNavBar"] }, { kind: "directive", type: i1.KbqTabLink, selector: "[kbqTabLink], [kbq-tab-link]", inputs: ["id", "active", "disabled", "tabIndex"], exportAs: ["kbqTabLink"] }, { kind: "directive", type: i1.KbqTabNavPanel, selector: "[kbqTabNavPanel]", inputs: ["id"], exportAs: ["kbqTabNavPanel"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i2.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i2.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqCodeBlockHighlight, selector: "code[kbqCodeBlockHighlight]", inputs: ["file", "startFrom", "singleLine"], exportAs: ["kbqCodeBlockHighlight"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "ngmodule", type: CdkScrollableModule }, { kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "ngmodule", type: KbqToolTipModule }, { kind: "directive", type: i5.KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["kbqTooltipScrollStrategy", "forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "hideWithTimeout", "kbqVisible", "kbqPlacement", "kbqRelativeToPointer", "kbqPlacementPriority", "kbqTooltip", "kbqTooltipDisabled", "kbqEnterDelay", "kbqLeaveDelay", "kbqTrigger", "kbqTooltipClass", "kbqTooltipContext", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipModifier", "kbqTooltipHeader"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i6.KbqIcon, selector: "[kbq-icon]", inputs: ["small", "autoColor", "kbq-icon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: KbqOverflowShadowContainer, selector: "[kbqOverflowShadowContainer]", inputs: ["debounce"], exportAs: ["kbqOverflowShadowContainer"] }, { kind: "directive", type: KbqOverflowShadowTop, selector: "[kbqOverflowShadowTop]", inputs: ["kbqOverflowShadowTop", "shadow"], exportAs: ["kbqOverflowShadowTop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1104
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1105
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.25", type: KbqCodeBlock, isStandalone: true, selector: "kbq-code-block", inputs: { lineNumbers: { classPropertyName: "lineNumbers", publicName: "lineNumbers", isSignal: true, isRequired: false, transformFunction: null }, filled: { classPropertyName: "filled", publicName: "filled", isSignal: true, isRequired: false, transformFunction: null }, canToggleSoftWrap: { classPropertyName: "canToggleSoftWrap", publicName: "canToggleSoftWrap", isSignal: true, isRequired: false, transformFunction: null }, softWrapInput: { classPropertyName: "softWrapInput", publicName: "softWrap", isSignal: true, isRequired: false, transformFunction: null }, viewAllInput: { classPropertyName: "viewAllInput", publicName: "viewAll", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, canDownloadInput: { classPropertyName: "canDownloadInput", publicName: "canDownload", isSignal: true, isRequired: false, transformFunction: null }, canCopy: { classPropertyName: "canCopy", publicName: "canCopy", isSignal: true, isRequired: false, transformFunction: null }, alwaysShowActionbar: { classPropertyName: "alwaysShowActionbar", publicName: "alwaysShowActionbar", isSignal: true, isRequired: false, transformFunction: null }, filesInput: { classPropertyName: "filesInput", publicName: "files", isSignal: true, isRequired: false, transformFunction: null }, activeFileIndexInput: { classPropertyName: "activeFileIndexInput", publicName: "activeFileIndex", isSignal: true, isRequired: false, transformFunction: null }, noBorder: { classPropertyName: "noBorder", publicName: "noBorder", isSignal: true, isRequired: false, transformFunction: null }, hideTabsInput: { classPropertyName: "hideTabsInput", publicName: "hideTabs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { softWrapChange: "softWrapChange", viewAllChange: "viewAllChange", activeFileIndexChange: "activeFileIndexChange", hideTabsChange: "hideTabsChange" }, host: { properties: { "class.kbq-code-block_filled": "filled()", "class.kbq-code-block_outline": "!filled()", "class.kbq-code-block_hide-line-numbers": "!lineNumbers()", "class.kbq-code-block_hide-tabs": "tabsHidden()", "class.kbq-code-block_no-border": "noBorder() || filled()", "class.kbq-code-block_show-actionbar": "actionbarVisible()", "class.kbq-code-block_soft-wrap": "softWrap()", "class.kbq-code-block_view-all": "viewAll()" }, classAttribute: "kbq-code-block" }, queries: [{ propertyName: "tabLinkTemplate", first: true, predicate: KbqCodeBlockTabLinkContent, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "copyButtonTooltip", first: true, predicate: ["copyButtonTooltip"], descendants: true, isSignal: true }, { propertyName: "highlight", first: true, predicate: KbqCodeBlockHighlight, descendants: true, isSignal: true }, { propertyName: "scrollbarViewport", first: true, predicate: KbqScrollbarViewport, descendants: true, isSignal: true }, { propertyName: "preElementRef", first: true, predicate: ["codeBlockPre"], descendants: true, isSignal: true }, { propertyName: "codeElementRef", first: true, predicate: ["codeBlockCode"], descendants: true, isSignal: true }], exportAs: ["kbqCodeBlock"], hostDirectives: [{ directive: i1.KbqLocaleOverridesDirective, inputs: ["kbqLocaleOverrides", "localeOverrides"] }], ngImport: i0, template: "<div class=\"kbq-code-block__header\" [kbqOverflowShadowTop]=\"codeBlockContent\">\n @if (!tabsHidden()) {\n <div class=\"kbq-code-block__header-tabs\">\n <div kbqTabNavBar transparent [tabNavPanel]=\"tabPanel\">\n @for (file of files(); track file) {\n <!-- Mark tab-link as readonly if only single file present -->\n <div\n kbqTabLink\n [active]=\"$count > 1 && renderedFileIndex() === $index\"\n [style.pointer-events]=\"$count === 1 ? 'none' : null\"\n (click)=\"onSelectedTabChange($index)\"\n >\n @if (tabLinkTemplate(); as linkTemplate) {\n <ng-container\n *ngTemplateOutlet=\"linkTemplate; context: { $implicit: file, fallbackFileName }\"\n />\n } @else {\n {{ file.filename || fallbackFileName }}\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"kbq-code-block__actionbar\">\n <div class=\"kbq-code-block__actionbar__button-stack\">\n @if (canToggleSoftWrap()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__soft-wrap-button\"\n [attr.aria-label]=\"\n softWrap() ? localeConfiguration().softWrapOffTooltip : localeConfiguration().softWrapOnTooltip\n \"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"\n softWrap() ? localeConfiguration().softWrapOffTooltip : localeConfiguration().softWrapOnTooltip\n \"\n (click)=\"toggleSoftWrap()\"\n >\n @if (softWrap()) {\n <i kbq-icon=\"kbq-text-overflow_16\"></i>\n } @else {\n <i kbq-icon=\"kbq-text-wrap_16\"></i>\n }\n </button>\n }\n\n @if (canDownload()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__download-button\"\n [attr.aria-label]=\"localeConfiguration().downloadTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration().downloadTooltip\"\n (click)=\"downloadCode()\"\n >\n <i kbq-icon=\"kbq-arrow-down-to-line_16\"></i>\n </button>\n }\n\n @if (canCopy()) {\n <div #copyButtonTooltip=\"kbqTooltip\" [kbqTooltip]=\"localeConfiguration().copyTooltip\">\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__copy-button\"\n [attr.aria-label]=\"localeConfiguration().copyTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"copyCode()\"\n >\n <i kbq-icon=\"kbq-file-multiple-o_16\"></i>\n </button>\n </div>\n }\n\n @if (activeFile()?.link) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__link-button\"\n [attr.aria-label]=\"localeConfiguration().openExternalSystemTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration().openExternalSystemTooltip\"\n (click)=\"openLink()\"\n >\n <i kbq-icon=\"kbq-arrow-up-right-from-square_16\"></i>\n </button>\n }\n </div>\n </div>\n</div>\n\n<div\n #tabPanel=\"kbqTabNavPanel\"\n #codeBlockContent=\"kbqOverflowShadowContainer\"\n cdkMonitorElementFocus\n kbqOverflowShadowContainer\n kbqScrollbarViewport\n kbqTabNavPanel\n class=\"kbq-code-block__main\"\n tabindex=\"0\"\n [style.max-height.px]=\"calculatedMaxHeight()\"\n>\n @if (activeFile(); as file) {\n <pre\n #codeBlockPre\n class=\"kbq-code-block__pre\"\n ><code #codeBlockCode kbqCodeBlockHighlight class=\"kbq-code-block__code\" [file]=\"file\"></code></pre>\n }\n\n @if (contentExceedsMaxHeight()) {\n <div\n class=\"kbq-code-block__view-all\"\n [class.kbq-code-block__view-all_collapsed]=\"!viewAll()\"\n [class.kbq-code-block__view-all_expanded]=\"viewAll()\"\n >\n <div class=\"kbq-code-block__view-all__wrapper\">\n <button\n kbq-button\n class=\"kbq-code-block__view-all__button\"\n [color]=\"componentColor.Theme\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"toggleViewAll()\"\n (keydown.enter)=\"onViewAllEnterKeydown($event)\"\n >\n @if (viewAll()) {\n <i kbq-icon=\"kbq-chevron-up_16\"></i>\n {{ localeConfiguration().viewLessText }}\n } @else {\n <i kbq-icon=\"kbq-chevron-down_16\"></i>\n {{ localeConfiguration().viewAllText }}\n }\n </button>\n </div>\n </div>\n }\n</div>\n", styles: [".kbq-code-block{display:flex;flex-direction:column;position:relative;border-width:var(--kbq-code-block-size-container-border-width);border-style:solid;border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block{box-sizing:border-box;hyphens:none;-ms-hyphens:none;-moz-hyphens:none;-webkit-hyphens:none}.kbq-code-block .kbq-code-block__header{display:flex;align-items:center;padding:var(--kbq-size-s) var(--kbq-size-m)}.kbq-code-block .kbq-code-block__header .kbq-code-block__header-tabs{overflow:hidden;flex-grow:1}.kbq-code-block .kbq-code-block__actionbar{display:flex;justify-content:right;align-items:center;z-index:1}.kbq-code-block .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{display:flex;gap:var(--kbq-code-block-size-actionbar-content-gap-horizontal)}.kbq-code-block:has(.kbq-code-block__view-all) .kbq-code-block__main .kbq-code-block__code{padding-bottom:var(--kbq-size-3xl)!important}.kbq-code-block .kbq-code-block__main{flex-grow:1;flex-direction:column;border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__main{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-style:solid;outline-width:var(--kbq-code-block-size-container-border-width-focused);outline-offset:-1px}.kbq-code-block .kbq-code-block__main .kbq-code-block__pre{margin:0;flex-grow:1}.kbq-code-block .kbq-code-block__main .kbq-code-block__code{tab-size:var(--kbq-code-block-tab-size);padding:var(--kbq-code-block-size-with-header-content-padding-top) var(--kbq-code-block-size-with-header-content-padding-horizontal) var(--kbq-code-block-size-with-header-content-padding-bottom) var(--kbq-code-block-size-with-header-content-padding-horizontal)}.kbq-code-block .kbq-code-block__main .kbq-code-block__code:focus-visible{outline:none}.kbq-code-block .kbq-code-block__main .hljs{display:block}.kbq-code-block .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-with-header-content-content-gap-horizontal);vertical-align:baseline;text-align:right}.kbq-code-block .kbq-code-block__main .hljs-ln{border-collapse:unset}.kbq-code-block .kbq-code-block__main .hljs-ln .hljs{padding:0}.kbq-code-block .kbq-code-block__main .hljs-ln-n:before{white-space:nowrap}.kbq-code-block.kbq-code-block_hide-line-numbers .hljs-ln-line.hljs-ln-numbers{display:none}.kbq-code-block.kbq-code-block_soft-wrap .kbq-code-block__code{white-space:pre-wrap;overflow-wrap:anywhere}.kbq-code-block:not(.kbq-code-block_soft-wrap) .kbq-code-block__pre{width:max-content;min-width:100%}.kbq-code-block.kbq-code-block_view-all .kbq-code-block__main{max-height:unset;overflow:auto}.kbq-code-block:not(.kbq-code-block_view-all) .kbq-code-block__main{overflow:hidden}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__header{padding:0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar{display:none;position:absolute;top:0;right:0;margin:var(--kbq-size-s) var(--kbq-size-s) var(--kbq-size-s) 0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-width:1px;border-style:solid;border-radius:calc(var(--kbq-size-border-radius) + 1px)}@supports (corner-shape: squircle){.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{corner-shape:squircle;border-radius:clamp((var(--kbq-size-border-radius) + 1px) * 1.85,(var(--kbq-size-border-radius) + 1px) * 2.3 - 3.6px,(var(--kbq-size-border-radius) + 1px) * 2)}}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main{position:relative}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .kbq-code-block__code{padding:var(--kbq-code-block-size-no-header-content-padding-vertical) var(--kbq-code-block-size-no-header-content-padding-horizontal)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-no-header-content-content-gap-horizontal)}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{border-radius:var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius) 0 0}@supports (corner-shape: squircle){.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) 0 0}}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{border-radius:0 0 var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{corner-shape:squircle;border-radius:0 0 clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block.kbq-code-block_show-actionbar .kbq-code-block__actionbar{display:flex}.kbq-code-block:not(:has(.kbq-code-block__view-all)) .kbq-code-block__main{overflow:auto}.kbq-code-block .kbq-code-block__view-all{display:flex;justify-content:center;width:100%;position:absolute;bottom:calc(var(--kbq-code-block-size-container-border-width) * -1);border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__view-all{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{padding-top:var(--kbq-code-block-size-collapse-collapsed-padding-top);padding-bottom:var(--kbq-code-block-size-collapse-collapsed-padding-bottom)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_expanded{padding-top:var(--kbq-code-block-size-collapse-expanded-padding-top);margin-bottom:var(--kbq-code-block-size-collapse-expanded-padding-bottom)}.kbq-code-block.kbq-code-block_no-border{border-color:transparent!important}.kbq-code-block .hljs-addition{background-color:var(--kbq-code-block-hljs-addition-background);color:var(--kbq-code-block-hljs-addition-color)}.kbq-code-block .hljs-attr{background-color:var(--kbq-code-block-hljs-attr-background);color:var(--kbq-code-block-hljs-attr-color)}.kbq-code-block .hljs-attribute{background-color:var(--kbq-code-block-hljs-attribute-background);color:var(--kbq-code-block-hljs-attribute-color)}.kbq-code-block .hljs-built_in{background-color:var(--kbq-code-block-hljs-built-in-background);color:var(--kbq-code-block-hljs-built-in-color)}.kbq-code-block .hljs-bullet{background-color:var(--kbq-code-block-hljs-bullet-background);color:var(--kbq-code-block-hljs-bullet-color)}.kbq-code-block .hljs-char-escape{background-color:var(--kbq-code-block-hljs-char-escape-background);color:var(--kbq-code-block-hljs-char-escape-color)}.kbq-code-block .hljs-class{background-color:var(--kbq-code-block-hljs-class-background);color:var(--kbq-code-block-hljs-class-color)}.kbq-code-block .hljs-code{background-color:var(--kbq-code-block-hljs-code-background);color:var(--kbq-code-block-hljs-code-color)}.kbq-code-block .hljs-comment{background-color:var(--kbq-code-block-hljs-comment-background);color:var(--kbq-code-block-hljs-comment-color)}.kbq-code-block .hljs-deletion{background-color:var(--kbq-code-block-hljs-deletion-background);color:var(--kbq-code-block-hljs-deletion-color)}.kbq-code-block .hljs-doctag{background-color:var(--kbq-code-block-hljs-doctag-background);color:var(--kbq-code-block-hljs-doctag-color)}.kbq-code-block .hljs-emphasis{background-color:var(--kbq-code-block-hljs-emphasis-background);color:var(--kbq-code-block-hljs-emphasis-color)}.kbq-code-block .hljs-formula{background-color:var(--kbq-code-block-hljs-formula-background);color:var(--kbq-code-block-hljs-formula-color)}.kbq-code-block .hljs-function{background-color:var(--kbq-code-block-hljs-function-background);color:var(--kbq-code-block-hljs-function-color)}.kbq-code-block .hljs-keyword{background-color:var(--kbq-code-block-hljs-keyword-background);color:var(--kbq-code-block-hljs-keyword-color)}.kbq-code-block .hljs-link{background-color:var(--kbq-code-block-hljs-link-background);color:var(--kbq-code-block-hljs-link-color)}.kbq-code-block .hljs-literal{background-color:var(--kbq-code-block-hljs-literal-background);color:var(--kbq-code-block-hljs-literal-color)}.kbq-code-block .hljs-meta{background-color:var(--kbq-code-block-hljs-meta-background);color:var(--kbq-code-block-hljs-meta-color)}.kbq-code-block .hljs-meta-keyword{background-color:var(--kbq-code-block-hljs-meta-keyword-background);color:var(--kbq-code-block-hljs-meta-keyword-color)}.kbq-code-block .hljs-meta-string{background-color:var(--kbq-code-block-hljs-meta-string-background);color:var(--kbq-code-block-hljs-meta-string-color)}.kbq-code-block .hljs-meta-prompt{background-color:var(--kbq-code-block-hljs-meta-prompt-background);color:var(--kbq-code-block-hljs-meta-prompt-color)}.kbq-code-block .hljs-name{background-color:var(--kbq-code-block-hljs-name-background);color:var(--kbq-code-block-hljs-name-color)}.kbq-code-block .hljs-number{background-color:var(--kbq-code-block-hljs-number-background);color:var(--kbq-code-block-hljs-number-color)}.kbq-code-block .hljs-operator{background-color:var(--kbq-code-block-hljs-operator-background);color:var(--kbq-code-block-hljs-operator-color)}.kbq-code-block .hljs-params{background-color:var(--kbq-code-block-hljs-params-background);color:var(--kbq-code-block-hljs-params-color)}.kbq-code-block .hljs-property{background-color:var(--kbq-code-block-hljs-property-background);color:var(--kbq-code-block-hljs-property-color)}.kbq-code-block .hljs-punctuation{background-color:var(--kbq-code-block-hljs-punctuation-background);color:var(--kbq-code-block-hljs-punctuation-color)}.kbq-code-block .hljs-quote{background-color:var(--kbq-code-block-hljs-quote-background);color:var(--kbq-code-block-hljs-quote-color)}.kbq-code-block .hljs-regexp{background-color:var(--kbq-code-block-hljs-regexp-background);color:var(--kbq-code-block-hljs-regexp-color)}.kbq-code-block .hljs-section{background-color:var(--kbq-code-block-hljs-section-background);color:var(--kbq-code-block-hljs-section-color)}.kbq-code-block .hljs-selector-attr{background-color:var(--kbq-code-block-hljs-selector-attr-background);color:var(--kbq-code-block-hljs-selector-attr-color)}.kbq-code-block .hljs-selector-class{background-color:var(--kbq-code-block-hljs-selector-class-background);color:var(--kbq-code-block-hljs-selector-class-color)}.kbq-code-block .hljs-selector-id{background-color:var(--kbq-code-block-hljs-selector-id-background);color:var(--kbq-code-block-hljs-selector-id-color)}.kbq-code-block .hljs-selector-pseudo{background-color:var(--kbq-code-block-hljs-selector-pseudo-background);color:var(--kbq-code-block-hljs-selector-pseudo-color)}.kbq-code-block .hljs-selector-tag{background-color:var(--kbq-code-block-hljs-selector-tag-background);color:var(--kbq-code-block-hljs-selector-tag-color)}.kbq-code-block .hljs-string{background-color:var(--kbq-code-block-hljs-string-background);color:var(--kbq-code-block-hljs-string-color)}.kbq-code-block .hljs-strong{background-color:var(--kbq-code-block-hljs-strong-background);color:var(--kbq-code-block-hljs-strong-color)}.kbq-code-block .hljs-subst{background-color:var(--kbq-code-block-hljs-subst-background);color:var(--kbq-code-block-hljs-subst-color)}.kbq-code-block .hljs-symbol{background-color:var(--kbq-code-block-hljs-symbol-background);color:var(--kbq-code-block-hljs-symbol-color)}.kbq-code-block .hljs-tag{background-color:var(--kbq-code-block-hljs-tag-background);color:var(--kbq-code-block-hljs-tag-color)}.kbq-code-block .hljs-template-tag{background-color:var(--kbq-code-block-hljs-template-tag-background);color:var(--kbq-code-block-hljs-template-tag-color)}.kbq-code-block .hljs-template-variable{background-color:var(--kbq-code-block-hljs-template-variable-background);color:var(--kbq-code-block-hljs-template-variable-color)}.kbq-code-block .hljs-title{background-color:var(--kbq-code-block-hljs-title-background);color:var(--kbq-code-block-hljs-title-color)}.kbq-code-block .hljs-title-class{background-color:var(--kbq-code-block-hljs-title-class-background);color:var(--kbq-code-block-hljs-title-class-color)}.kbq-code-block .hljs-title-class-inherited{background-color:var(--kbq-code-block-hljs-title-class-inherited-background);color:var(--kbq-code-block-hljs-title-class-inherited-color)}.kbq-code-block .hljs-title-function{background-color:var(--kbq-code-block-hljs-title-function-background);color:var(--kbq-code-block-hljs-title-function-color)}.kbq-code-block .hljs-title-function-invoke{background-color:var(--kbq-code-block-hljs-title-function-invoke-background);color:var(--kbq-code-block-hljs-title-function-invoke-color)}.kbq-code-block .hljs-type{background-color:var(--kbq-code-block-hljs-type-background);color:var(--kbq-code-block-hljs-type-color)}.kbq-code-block .hljs-variable{background-color:var(--kbq-code-block-hljs-variable-background);color:var(--kbq-code-block-hljs-variable-color)}.kbq-code-block .hljs-variable-constant{background-color:var(--kbq-code-block-hljs-variable-constant-background);color:var(--kbq-code-block-hljs-variable-constant-color)}.kbq-code-block .hljs-variable-language{background-color:var(--kbq-code-block-hljs-variable-language-background);color:var(--kbq-code-block-hljs-variable-language-color)}.kbq-code-block .hljs-ln-n{color:var(--kbq-code-block-hljs-line-numbers-color)}.kbq-code-block.kbq-code-block_outline{background:var(--kbq-code-block-outline-container-background);border-color:var(--kbq-code-block-outline-container-border-color)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__header{background:var(--kbq-code-block-outline-header-background)}.kbq-code-block.kbq-code-block_outline.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-outline-actionbar-border-color);background:var(--kbq-code-block-outline-actionbar-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-outline-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-outline-collapse-expanded-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-outline-collapse-collapsed-background)}.kbq-code-block.kbq-code-block_filled{background:var(--kbq-code-block-filled-container-background);border-color:var(--kbq-code-block-filled-container-border-color)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__header{background:var(--kbq-code-block-filled-header-background)}.kbq-code-block.kbq-code-block_filled.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-filled-actionbar-border-color);background:var(--kbq-code-block-filled-actionbar-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-filled-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-filled-collapse-expanded-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-filled-collapse-collapsed-background)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-color:var(--kbq-states-line-focus-theme)}.kbq-code-block{font-size:var(--kbq-typography-mono-codeblock-font-size);font-style:var(--kbq-typography-mono-codeblock-font-style);font-weight:var(--kbq-typography-mono-codeblock-font-weight);line-height:var(--kbq-typography-mono-codeblock-line-height);font-family:var(--kbq-typography-mono-codeblock-font-family);text-transform:var(--kbq-typography-mono-codeblock-text-transform);font-feature-settings:var(--kbq-typography-mono-codeblock-font-feature-settings);letter-spacing:var(--kbq-typography-mono-codeblock-letter-spacing)}.kbq-code-block .kbq-code-block__pre,.kbq-code-block .kbq-code-block__code{font:inherit}\n", ".kbq-code-block{--kbq-code-block-size-container-border-width: var(--kbq-size-border-width);--kbq-code-block-size-container-border-width-focused: 2px;--kbq-code-block-size-container-border-radius: var(--kbq-size-border-radius);--kbq-code-block-size-with-header-content-padding-top: var(--kbq-size-xxs);--kbq-code-block-size-with-header-content-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-with-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-with-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-no-header-content-padding-vertical: 14px;--kbq-code-block-size-no-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-no-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-header-content-gap-horizontal: var(--kbq-size-l);--kbq-code-block-size-actionbar-content-gap-horizontal: var(--kbq-size-3xs);--kbq-code-block-size-collapse-expanded-padding-top: 0;--kbq-code-block-size-collapse-expanded-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-collapse-collapsed-padding-top: var(--kbq-size-3xl);--kbq-code-block-size-collapse-collapsed-padding-bottom: var(--kbq-size-l);--kbq-code-block-filled-container-background: var(--kbq-background-contrast-less);--kbq-code-block-filled-container-border-color: transparent;--kbq-code-block-filled-header-background: transparent;--kbq-code-block-filled-actionbar-background: var(--kbq-background-card);--kbq-code-block-filled-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-filled-collapse-expanded-background: transparent;--kbq-code-block-filled-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg-secondary) 100% );--kbq-code-block-filled-collapse-button-expand-background: var(--kbq-background-bg-secondary);--kbq-code-block-outline-container-background: var(--kbq-background-card);--kbq-code-block-outline-container-border-color: var(--kbq-divider-color, var(--kbq-line-contrast-less));--kbq-code-block-outline-header-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-outline-collapse-expanded-background: transparent;--kbq-code-block-outline-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg) 100% );--kbq-code-block-outline-collapse-button-expand-background: var(--kbq-background-card);--kbq-code-block-tab-size: 4}\n"], dependencies: [{ kind: "ngmodule", type: KbqTabsModule }, { kind: "component", type: i2.KbqTabNavBar, selector: "[kbqTabNavBar], [kbq-tab-nav-bar]", inputs: ["transparent", "onSurface", "underlined", "tabNavPanel"], exportAs: ["kbqTabNavBar"] }, { kind: "directive", type: i2.KbqTabLink, selector: "[kbqTabLink], [kbq-tab-link]", inputs: ["id", "active", "disabled", "tabIndex"], exportAs: ["kbqTabLink"] }, { kind: "directive", type: i2.KbqTabNavPanel, selector: "[kbqTabNavPanel]", inputs: ["id"], exportAs: ["kbqTabNavPanel"] }, { kind: "ngmodule", type: KbqButtonModule }, { kind: "component", type: i3.KbqButton, selector: "[kbq-button]", inputs: ["kbqStyle", "disabled", "tabIndex"] }, { kind: "directive", type: i3.KbqButtonCssStyler, selector: "[kbq-button]" }, { kind: "directive", type: KbqCodeBlockHighlight, selector: "code[kbqCodeBlockHighlight]", inputs: ["file", "startFrom", "singleLine"], exportAs: ["kbqCodeBlockHighlight"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i4.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "ngmodule", type: KbqToolTipModule }, { kind: "directive", type: i5.KbqTooltipTrigger, selector: "[kbqTooltip]", inputs: ["kbqTooltipScrollStrategy", "forDisabledComponent", "ignoreTooltipPointerEvents", "kbqTooltipSingleInstance", "kbqTrigger", "hideWithTimeout", "kbqEnterDelay", "kbqLeaveDelay", "kbqRelativeToPointer", "kbqRelativeToCaret", "kbqRelativeToCaretVertical", "kbqTooltip", "kbqTooltipHeader", "kbqTooltipModifier", "kbqTooltipContext", "kbqTooltipClass", "kbqTooltipColor", "kbqTooltipArrow", "kbqTooltipOffset", "kbqTooltipDisabled", "kbqPlacementPriority", "kbqPlacement", "kbqVisible"], outputs: ["kbqPlacementChange", "kbqVisibleChange"], exportAs: ["kbqTooltip"] }, { kind: "ngmodule", type: KbqIconModule }, { kind: "component", type: i6.KbqIcon, selector: "[kbq-icon]", inputs: ["aria-hidden", "iconSize", "autoColor", "kbq-icon"] }, { kind: "directive", type: KbqScrollbarViewport, selector: "[kbqScrollbarViewport]", inputs: ["kbqScrollbarMode", "kbqScrollbarHideDelay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: KbqOverflowShadowContainer, selector: "[kbqOverflowShadowContainer]", inputs: ["debounce"], exportAs: ["kbqOverflowShadowContainer"] }, { kind: "directive", type: KbqOverflowShadowTop, selector: "[kbqOverflowShadowTop]", inputs: ["kbqOverflowShadowTop", "shadow"], exportAs: ["kbqOverflowShadowTop"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
898
1106
|
}
|
|
899
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlock, decorators: [{
|
|
900
1108
|
type: Component,
|
|
901
1109
|
args: [{ selector: 'kbq-code-block', imports: [
|
|
902
1110
|
KbqTabsModule,
|
|
903
1111
|
KbqButtonModule,
|
|
904
1112
|
KbqCodeBlockHighlight,
|
|
905
1113
|
A11yModule,
|
|
906
|
-
CdkScrollableModule,
|
|
907
1114
|
KbqToolTipModule,
|
|
908
1115
|
KbqIconModule,
|
|
1116
|
+
KbqScrollbarViewport,
|
|
909
1117
|
NgTemplateOutlet,
|
|
910
1118
|
KbqOverflowShadowContainer,
|
|
911
1119
|
KbqOverflowShadowTop
|
|
912
1120
|
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
|
|
913
1121
|
class: 'kbq-code-block',
|
|
914
|
-
// highlight.js rewrites the <code> subtree on the client (and builds a <table> for line numbers),
|
|
915
|
-
// which never matches the server-rendered DOM — skip hydration for this component to avoid NG0500.
|
|
916
|
-
ngSkipHydration: 'true',
|
|
917
1122
|
'[class.kbq-code-block_filled]': 'filled()',
|
|
918
1123
|
'[class.kbq-code-block_outline]': '!filled()',
|
|
919
1124
|
'[class.kbq-code-block_hide-line-numbers]': '!lineNumbers()',
|
|
920
|
-
'[class.kbq-code-block_hide-tabs]': '
|
|
1125
|
+
'[class.kbq-code-block_hide-tabs]': 'tabsHidden()',
|
|
921
1126
|
'[class.kbq-code-block_no-border]': 'noBorder() || filled()',
|
|
922
1127
|
'[class.kbq-code-block_show-actionbar]': 'actionbarVisible()',
|
|
923
|
-
'[class.kbq-code-block_soft-wrap]': 'softWrap',
|
|
924
|
-
'[class.kbq-code-block_view-all]': 'viewAll'
|
|
925
|
-
}, exportAs: 'kbqCodeBlock', template: "@let file = files[activeFileIndex];\n\n<div class=\"kbq-code-block__header\" [kbqOverflowShadowTop]=\"codeBlockContent\">\n @if (!hideTabs) {\n <div class=\"kbq-code-block__header-tabs\">\n <div kbqTabNavBar transparent [tabNavPanel]=\"tabPanel\">\n @for (file of files; track file) {\n <!-- Mark tab-link as readonly if only single file present -->\n <div\n kbqTabLink\n [active]=\"$count > 1 && activeFileIndex === $index\"\n [style.pointer-events]=\"$count === 1 ? 'none' : null\"\n (click)=\"onSelectedTabChange($index)\"\n >\n @if (tabLinkTemplate) {\n <ng-container\n *ngTemplateOutlet=\"tabLinkTemplate; context: { $implicit: file, fallbackFileName }\"\n />\n } @else {\n {{ file.filename || fallbackFileName }}\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"kbq-code-block__actionbar\">\n <div class=\"kbq-code-block__actionbar__button-stack\">\n @if (canToggleSoftWrap()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__soft-wrap-button\"\n [attr.aria-label]=\"\n softWrap ? localeConfiguration.softWrapOffTooltip : localeConfiguration.softWrapOnTooltip\n \"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"\n softWrap ? localeConfiguration.softWrapOffTooltip : localeConfiguration.softWrapOnTooltip\n \"\n (click)=\"toggleSoftWrap()\"\n >\n @if (softWrap) {\n <i kbq-icon=\"kbq-text-overflow_16\"></i>\n } @else {\n <i kbq-icon=\"kbq-text-wrap_16\"></i>\n }\n </button>\n }\n\n @if (canDownload) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__download-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration.downloadTooltip\"\n (click)=\"downloadCode()\"\n >\n <i kbq-icon=\"kbq-arrow-down-to-line_16\"></i>\n </button>\n }\n\n @if (canCopy()) {\n <div #copyButtonTooltip=\"kbqTooltip\" [kbqTooltip]=\"localeConfiguration.copyTooltip\">\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__copy-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"copyCode()\"\n >\n <i kbq-icon=\"kbq-file-multiple-o_16\"></i>\n </button>\n </div>\n }\n\n @if (file.link) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__link-button\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration.openExternalSystemTooltip\"\n (click)=\"openLink()\"\n >\n <i kbq-icon=\"kbq-arrow-up-right-from-square_16\"></i>\n </button>\n }\n </div>\n </div>\n</div>\n\n<div\n #tabPanel=\"kbqTabNavPanel\"\n #codeBlockContent=\"kbqOverflowShadowContainer\"\n cdkMonitorElementFocus\n cdkScrollable\n kbqOverflowShadowContainer\n kbqTabNavPanel\n class=\"kbq-code-block__main kbq-scrollbar\"\n [style.max-height.px]=\"calculatedMaxHeight\"\n [tabIndex]=\"codeContentTabIndex\"\n>\n <pre\n #codeBlockPre\n class=\"kbq-code-block__pre\"\n ><code kbqCodeBlockHighlight class=\"kbq-code-block__code\" [file]=\"file\">{{ file.content }}</code></pre>\n\n @if (contentExceedsMaxHeight()) {\n <div\n class=\"kbq-code-block__view-all\"\n [class.kbq-code-block__view-all_collapsed]=\"!viewAll\"\n [class.kbq-code-block__view-all_expanded]=\"viewAll\"\n >\n <div class=\"kbq-code-block__view-all__wrapper\">\n <button\n kbq-button\n class=\"kbq-code-block__view-all__button\"\n [color]=\"componentColor.Theme\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"toggleViewAll()\"\n (keydown.enter)=\"onViewAllEnterKeydown($event)\"\n >\n @if (viewAll) {\n <i kbq-icon=\"kbq-chevron-up_16\"></i>\n {{ localeConfiguration.viewLessText }}\n } @else {\n <i kbq-icon=\"kbq-chevron-down_16\"></i>\n {{ localeConfiguration.viewAllText }}\n }\n </button>\n </div>\n </div>\n }\n</div>\n", styles: [".kbq-code-block{display:flex;flex-direction:column;position:relative;border-width:var(--kbq-code-block-size-container-border-width);border-style:solid;border-radius:var(--kbq-code-block-size-container-border-radius);box-sizing:border-box;hyphens:none;-ms-hyphens:none;-moz-hyphens:none;-webkit-hyphens:none}.kbq-code-block .kbq-code-block__header{display:flex;align-items:center;padding:var(--kbq-size-s) var(--kbq-size-m)}.kbq-code-block .kbq-code-block__header .kbq-code-block__header-tabs{overflow:hidden;flex-grow:1}.kbq-code-block .kbq-code-block__actionbar{display:flex;justify-content:right;align-items:center;z-index:1}.kbq-code-block .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{display:flex;gap:var(--kbq-code-block-size-actionbar-content-gap-horizontal)}.kbq-code-block:has(.kbq-code-block__view-all) .kbq-code-block__main .kbq-code-block__code{padding-bottom:var(--kbq-size-3xl)!important}.kbq-code-block .kbq-code-block__main{flex-grow:1;flex-direction:column;border-radius:var(--kbq-code-block-size-container-border-radius)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-style:solid;outline-width:var(--kbq-code-block-size-container-border-width-focused);outline-offset:-1px}.kbq-code-block .kbq-code-block__main .kbq-code-block__pre{margin:0;flex-grow:1}.kbq-code-block .kbq-code-block__main .kbq-code-block__code{tab-size:var(--kbq-code-block-tab-size);padding:var(--kbq-code-block-size-with-header-content-padding-top) var(--kbq-code-block-size-with-header-content-padding-horizontal) var(--kbq-code-block-size-with-header-content-padding-bottom) var(--kbq-code-block-size-with-header-content-padding-horizontal)}.kbq-code-block .kbq-code-block__main .kbq-code-block__code:focus-visible{outline:none}.kbq-code-block .kbq-code-block__main .hljs{display:block}.kbq-code-block .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-with-header-content-content-gap-horizontal);vertical-align:baseline;text-align:right}.kbq-code-block .kbq-code-block__main .hljs-ln{border-collapse:unset}.kbq-code-block .kbq-code-block__main .hljs-ln .hljs{padding:0}.kbq-code-block .kbq-code-block__main .hljs-ln-n:before{white-space:nowrap}.kbq-code-block.kbq-code-block_hide-line-numbers .hljs-ln-line.hljs-ln-numbers{display:none}.kbq-code-block.kbq-code-block_soft-wrap .kbq-code-block__code{white-space:pre-wrap;overflow-wrap:anywhere}.kbq-code-block.kbq-code-block_view-all .kbq-code-block__main{max-height:unset;overflow:auto}.kbq-code-block:not(.kbq-code-block_view-all) .kbq-code-block__main{overflow:hidden}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__header{padding:0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar{display:none;position:absolute;top:0;right:0;margin:var(--kbq-size-s) var(--kbq-size-s) var(--kbq-size-s) 0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-width:1px;border-style:solid;border-radius:calc(var(--kbq-size-border-radius) + 1px)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main{position:relative}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .kbq-code-block__code{padding:var(--kbq-code-block-size-no-header-content-padding-vertical) var(--kbq-code-block-size-no-header-content-padding-horizontal)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-no-header-content-content-gap-horizontal)}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{border-radius:var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius) 0 0}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{border-radius:0 0 var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius)}.kbq-code-block.kbq-code-block_show-actionbar .kbq-code-block__actionbar{display:flex}.kbq-code-block:not(:has(.kbq-code-block__view-all)) .kbq-code-block__main{overflow:auto}.kbq-code-block .kbq-code-block__view-all{display:flex;justify-content:center;width:100%;position:absolute;bottom:calc(var(--kbq-code-block-size-container-border-width) * -1);border-radius:var(--kbq-code-block-size-container-border-radius)}.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{border-radius:var(--kbq-size-border-radius)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{padding-top:var(--kbq-code-block-size-collapse-collapsed-padding-top);padding-bottom:var(--kbq-code-block-size-collapse-collapsed-padding-bottom)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_expanded{padding-top:var(--kbq-code-block-size-collapse-expanded-padding-top);margin-bottom:var(--kbq-code-block-size-collapse-expanded-padding-bottom)}.kbq-code-block.kbq-code-block_no-border{border-color:transparent!important}.kbq-code-block .hljs-addition{background-color:var(--kbq-code-block-hljs-addition-background);color:var(--kbq-code-block-hljs-addition-color)}.kbq-code-block .hljs-attr{background-color:var(--kbq-code-block-hljs-attr-background);color:var(--kbq-code-block-hljs-attr-color)}.kbq-code-block .hljs-attribute{background-color:var(--kbq-code-block-hljs-attribute-background);color:var(--kbq-code-block-hljs-attribute-color)}.kbq-code-block .hljs-built_in{background-color:var(--kbq-code-block-hljs-built-in-background);color:var(--kbq-code-block-hljs-built-in-color)}.kbq-code-block .hljs-bullet{background-color:var(--kbq-code-block-hljs-bullet-background);color:var(--kbq-code-block-hljs-bullet-color)}.kbq-code-block .hljs-char-escape{background-color:var(--kbq-code-block-hljs-char-escape-background);color:var(--kbq-code-block-hljs-char-escape-color)}.kbq-code-block .hljs-class{background-color:var(--kbq-code-block-hljs-class-background);color:var(--kbq-code-block-hljs-class-color)}.kbq-code-block .hljs-code{background-color:var(--kbq-code-block-hljs-code-background);color:var(--kbq-code-block-hljs-code-color)}.kbq-code-block .hljs-comment{background-color:var(--kbq-code-block-hljs-comment-background);color:var(--kbq-code-block-hljs-comment-color)}.kbq-code-block .hljs-deletion{background-color:var(--kbq-code-block-hljs-deletion-background);color:var(--kbq-code-block-hljs-deletion-color)}.kbq-code-block .hljs-doctag{background-color:var(--kbq-code-block-hljs-doctag-background);color:var(--kbq-code-block-hljs-doctag-color)}.kbq-code-block .hljs-emphasis{background-color:var(--kbq-code-block-hljs-emphasis-background);color:var(--kbq-code-block-hljs-emphasis-color)}.kbq-code-block .hljs-formula{background-color:var(--kbq-code-block-hljs-formula-background);color:var(--kbq-code-block-hljs-formula-color)}.kbq-code-block .hljs-function{background-color:var(--kbq-code-block-hljs-function-background);color:var(--kbq-code-block-hljs-function-color)}.kbq-code-block .hljs-keyword{background-color:var(--kbq-code-block-hljs-keyword-background);color:var(--kbq-code-block-hljs-keyword-color)}.kbq-code-block .hljs-link{background-color:var(--kbq-code-block-hljs-link-background);color:var(--kbq-code-block-hljs-link-color)}.kbq-code-block .hljs-literal{background-color:var(--kbq-code-block-hljs-literal-background);color:var(--kbq-code-block-hljs-literal-color)}.kbq-code-block .hljs-meta{background-color:var(--kbq-code-block-hljs-meta-background);color:var(--kbq-code-block-hljs-meta-color)}.kbq-code-block .hljs-meta-keyword{background-color:var(--kbq-code-block-hljs-meta-keyword-background);color:var(--kbq-code-block-hljs-meta-keyword-color)}.kbq-code-block .hljs-meta-string{background-color:var(--kbq-code-block-hljs-meta-string-background);color:var(--kbq-code-block-hljs-meta-string-color)}.kbq-code-block .hljs-meta-prompt{background-color:var(--kbq-code-block-hljs-meta-prompt-background);color:var(--kbq-code-block-hljs-meta-prompt-color)}.kbq-code-block .hljs-name{background-color:var(--kbq-code-block-hljs-name-background);color:var(--kbq-code-block-hljs-name-color)}.kbq-code-block .hljs-number{background-color:var(--kbq-code-block-hljs-number-background);color:var(--kbq-code-block-hljs-number-color)}.kbq-code-block .hljs-operator{background-color:var(--kbq-code-block-hljs-operator-background);color:var(--kbq-code-block-hljs-operator-color)}.kbq-code-block .hljs-params{background-color:var(--kbq-code-block-hljs-params-background);color:var(--kbq-code-block-hljs-params-color)}.kbq-code-block .hljs-property{background-color:var(--kbq-code-block-hljs-property-background);color:var(--kbq-code-block-hljs-property-color)}.kbq-code-block .hljs-punctuation{background-color:var(--kbq-code-block-hljs-punctuation-background);color:var(--kbq-code-block-hljs-punctuation-color)}.kbq-code-block .hljs-quote{background-color:var(--kbq-code-block-hljs-quote-background);color:var(--kbq-code-block-hljs-quote-color)}.kbq-code-block .hljs-regexp{background-color:var(--kbq-code-block-hljs-regexp-background);color:var(--kbq-code-block-hljs-regexp-color)}.kbq-code-block .hljs-section{background-color:var(--kbq-code-block-hljs-section-background);color:var(--kbq-code-block-hljs-section-color)}.kbq-code-block .hljs-selector-attr{background-color:var(--kbq-code-block-hljs-selector-attr-background);color:var(--kbq-code-block-hljs-selector-attr-color)}.kbq-code-block .hljs-selector-class{background-color:var(--kbq-code-block-hljs-selector-class-background);color:var(--kbq-code-block-hljs-selector-class-color)}.kbq-code-block .hljs-selector-id{background-color:var(--kbq-code-block-hljs-selector-id-background);color:var(--kbq-code-block-hljs-selector-id-color)}.kbq-code-block .hljs-selector-pseudo{background-color:var(--kbq-code-block-hljs-selector-pseudo-background);color:var(--kbq-code-block-hljs-selector-pseudo-color)}.kbq-code-block .hljs-selector-tag{background-color:var(--kbq-code-block-hljs-selector-tag-background);color:var(--kbq-code-block-hljs-selector-tag-color)}.kbq-code-block .hljs-string{background-color:var(--kbq-code-block-hljs-string-background);color:var(--kbq-code-block-hljs-string-color)}.kbq-code-block .hljs-strong{background-color:var(--kbq-code-block-hljs-strong-background);color:var(--kbq-code-block-hljs-strong-color)}.kbq-code-block .hljs-subst{background-color:var(--kbq-code-block-hljs-subst-background);color:var(--kbq-code-block-hljs-subst-color)}.kbq-code-block .hljs-symbol{background-color:var(--kbq-code-block-hljs-symbol-background);color:var(--kbq-code-block-hljs-symbol-color)}.kbq-code-block .hljs-tag{background-color:var(--kbq-code-block-hljs-tag-background);color:var(--kbq-code-block-hljs-tag-color)}.kbq-code-block .hljs-template-tag{background-color:var(--kbq-code-block-hljs-template-tag-background);color:var(--kbq-code-block-hljs-template-tag-color)}.kbq-code-block .hljs-template-variable{background-color:var(--kbq-code-block-hljs-template-variable-background);color:var(--kbq-code-block-hljs-template-variable-color)}.kbq-code-block .hljs-title{background-color:var(--kbq-code-block-hljs-title-background);color:var(--kbq-code-block-hljs-title-color)}.kbq-code-block .hljs-title-class{background-color:var(--kbq-code-block-hljs-title-class-background);color:var(--kbq-code-block-hljs-title-class-color)}.kbq-code-block .hljs-title-class-inherited{background-color:var(--kbq-code-block-hljs-title-class-inherited-background);color:var(--kbq-code-block-hljs-title-class-inherited-color)}.kbq-code-block .hljs-title-function{background-color:var(--kbq-code-block-hljs-title-function-background);color:var(--kbq-code-block-hljs-title-function-color)}.kbq-code-block .hljs-title-function-invoke{background-color:var(--kbq-code-block-hljs-title-function-invoke-background);color:var(--kbq-code-block-hljs-title-function-invoke-color)}.kbq-code-block .hljs-type{background-color:var(--kbq-code-block-hljs-type-background);color:var(--kbq-code-block-hljs-type-color)}.kbq-code-block .hljs-variable{background-color:var(--kbq-code-block-hljs-variable-background);color:var(--kbq-code-block-hljs-variable-color)}.kbq-code-block .hljs-variable-constant{background-color:var(--kbq-code-block-hljs-variable-constant-background);color:var(--kbq-code-block-hljs-variable-constant-color)}.kbq-code-block .hljs-variable-language{background-color:var(--kbq-code-block-hljs-variable-language-background);color:var(--kbq-code-block-hljs-variable-language-color)}.kbq-code-block .hljs-ln-n{color:var(--kbq-code-block-hljs-line-numbers-color)}.kbq-code-block.kbq-code-block_outline{background:var(--kbq-code-block-outline-container-background);border-color:var(--kbq-code-block-outline-container-border-color)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__header{background:var(--kbq-code-block-outline-header-background)}.kbq-code-block.kbq-code-block_outline.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-outline-actionbar-border-color);background:var(--kbq-code-block-outline-actionbar-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-outline-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-outline-collapse-expanded-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-outline-collapse-collapsed-background)}.kbq-code-block.kbq-code-block_filled{background:var(--kbq-code-block-filled-container-background);border-color:var(--kbq-code-block-filled-container-border-color)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__header{background:var(--kbq-code-block-filled-header-background)}.kbq-code-block.kbq-code-block_filled.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-filled-actionbar-border-color);background:var(--kbq-code-block-filled-actionbar-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-filled-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-filled-collapse-expanded-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-filled-collapse-collapsed-background)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-color:var(--kbq-states-line-focus-theme)}.kbq-code-block{font-size:var(--kbq-typography-mono-codeblock-font-size);font-style:var(--kbq-typography-mono-codeblock-font-style);font-weight:var(--kbq-typography-mono-codeblock-font-weight);line-height:var(--kbq-typography-mono-codeblock-line-height);font-family:var(--kbq-typography-mono-codeblock-font-family);text-transform:var(--kbq-typography-mono-codeblock-text-transform);font-feature-settings:var(--kbq-typography-mono-codeblock-font-feature-settings);letter-spacing:var(--kbq-typography-mono-codeblock-letter-spacing)}.kbq-code-block .kbq-code-block__pre,.kbq-code-block .kbq-code-block__code{font:inherit}\n", ".kbq-code-block{--kbq-code-block-size-container-border-width: var(--kbq-size-border-width);--kbq-code-block-size-container-border-width-focused: 2px;--kbq-code-block-size-container-border-radius: var(--kbq-size-border-radius);--kbq-code-block-size-with-header-content-padding-top: var(--kbq-size-xxs);--kbq-code-block-size-with-header-content-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-with-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-with-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-no-header-content-padding-vertical: 14px;--kbq-code-block-size-no-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-no-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-header-content-gap-horizontal: var(--kbq-size-l);--kbq-code-block-size-actionbar-content-gap-horizontal: var(--kbq-size-3xs);--kbq-code-block-size-collapse-expanded-padding-top: 0;--kbq-code-block-size-collapse-expanded-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-collapse-collapsed-padding-top: var(--kbq-size-3xl);--kbq-code-block-size-collapse-collapsed-padding-bottom: var(--kbq-size-l);--kbq-code-block-font-hljs-addition-font-style: null;--kbq-code-block-font-hljs-addition-font-weight: null;--kbq-code-block-font-hljs-attr-font-style: null;--kbq-code-block-font-hljs-attr-font-weight: null;--kbq-code-block-font-hljs-attribute-font-style: null;--kbq-code-block-font-hljs-attribute-font-weight: null;--kbq-code-block-font-hljs-built-in-font-style: null;--kbq-code-block-font-hljs-built-in-font-weight: null;--kbq-code-block-font-hljs-bullet-font-style: null;--kbq-code-block-font-hljs-bullet-font-weight: null;--kbq-code-block-font-hljs-char-escape-font-style: null;--kbq-code-block-font-hljs-char-escape-font-weight: null;--kbq-code-block-font-hljs-class-font-style: null;--kbq-code-block-font-hljs-class-font-weight: null;--kbq-code-block-font-hljs-code-font-style: null;--kbq-code-block-font-hljs-code-font-weight: null;--kbq-code-block-font-hljs-comment-font-style: null;--kbq-code-block-font-hljs-comment-font-weight: null;--kbq-code-block-font-hljs-deletion-font-style: null;--kbq-code-block-font-hljs-deletion-font-weight: null;--kbq-code-block-font-hljs-doctag-font-style: null;--kbq-code-block-font-hljs-doctag-font-weight: null;--kbq-code-block-font-hljs-emphasis-font-style: null;--kbq-code-block-font-hljs-emphasis-font-weight: null;--kbq-code-block-font-hljs-formula-font-style: null;--kbq-code-block-font-hljs-formula-font-weight: null;--kbq-code-block-font-hljs-function-font-style: null;--kbq-code-block-font-hljs-function-font-weight: null;--kbq-code-block-font-hljs-keyword-font-style: null;--kbq-code-block-font-hljs-keyword-font-weight: null;--kbq-code-block-font-hljs-link-font-style: null;--kbq-code-block-font-hljs-link-font-weight: null;--kbq-code-block-font-hljs-literal-font-style: null;--kbq-code-block-font-hljs-literal-font-weight: null;--kbq-code-block-font-hljs-meta-font-style: null;--kbq-code-block-font-hljs-meta-font-weight: null;--kbq-code-block-font-hljs-meta-keyword-font-style: null;--kbq-code-block-font-hljs-meta-keyword-font-weight: null;--kbq-code-block-font-hljs-meta-string-font-style: null;--kbq-code-block-font-hljs-meta-string-font-weight: null;--kbq-code-block-font-hljs-meta-prompt-font-style: null;--kbq-code-block-font-hljs-meta-prompt-font-weight: null;--kbq-code-block-font-hljs-name-font-style: null;--kbq-code-block-font-hljs-name-font-weight: null;--kbq-code-block-font-hljs-number-font-style: null;--kbq-code-block-font-hljs-number-font-weight: null;--kbq-code-block-font-hljs-operator-font-style: null;--kbq-code-block-font-hljs-operator-font-weight: null;--kbq-code-block-font-hljs-params-font-style: null;--kbq-code-block-font-hljs-params-font-weight: null;--kbq-code-block-font-hljs-property-font-style: null;--kbq-code-block-font-hljs-property-font-weight: null;--kbq-code-block-font-hljs-punctuation-font-style: null;--kbq-code-block-font-hljs-punctuation-font-weight: null;--kbq-code-block-font-hljs-quote-font-style: null;--kbq-code-block-font-hljs-quote-font-weight: null;--kbq-code-block-font-hljs-regexp-font-style: null;--kbq-code-block-font-hljs-regexp-font-weight: null;--kbq-code-block-font-hljs-section-font-style: null;--kbq-code-block-font-hljs-section-font-weight: null;--kbq-code-block-font-hljs-selector-attr-font-style: null;--kbq-code-block-font-hljs-selector-attr-font-weight: null;--kbq-code-block-font-hljs-selector-class-font-style: null;--kbq-code-block-font-hljs-selector-class-font-weight: null;--kbq-code-block-font-hljs-selector-id-font-style: null;--kbq-code-block-font-hljs-selector-id-font-weight: null;--kbq-code-block-font-hljs-selector-pseudo-font-style: null;--kbq-code-block-font-hljs-selector-pseudo-font-weight: null;--kbq-code-block-font-hljs-selector-tag-font-style: null;--kbq-code-block-font-hljs-selector-tag-font-weight: null;--kbq-code-block-font-hljs-string-font-style: null;--kbq-code-block-font-hljs-string-font-weight: null;--kbq-code-block-font-hljs-strong-font-style: null;--kbq-code-block-font-hljs-strong-font-weight: null;--kbq-code-block-font-hljs-subst-font-style: null;--kbq-code-block-font-hljs-subst-font-weight: null;--kbq-code-block-font-hljs-symbol-font-style: null;--kbq-code-block-font-hljs-symbol-font-weight: null;--kbq-code-block-font-hljs-tag-font-style: null;--kbq-code-block-font-hljs-tag-font-weight: null;--kbq-code-block-font-hljs-template-tag-font-style: null;--kbq-code-block-font-hljs-template-tag-font-weight: null;--kbq-code-block-font-hljs-template-variable-font-style: null;--kbq-code-block-font-hljs-template-variable-font-weight: null;--kbq-code-block-font-hljs-title-font-style: null;--kbq-code-block-font-hljs-title-font-weight: null;--kbq-code-block-font-hljs-title-class-font-style: normal;--kbq-code-block-font-hljs-title-class-font-weight: 500;--kbq-code-block-font-hljs-title-class-inherited-font-style: null;--kbq-code-block-font-hljs-title-class-inherited-font-weight: null;--kbq-code-block-font-hljs-title-function-font-style: null;--kbq-code-block-font-hljs-title-function-font-weight: null;--kbq-code-block-font-hljs-title-function-invoke-font-style: null;--kbq-code-block-font-hljs-title-function-invoke-font-weight: null;--kbq-code-block-font-hljs-type-font-style: null;--kbq-code-block-font-hljs-type-font-weight: null;--kbq-code-block-font-hljs-variable-font-style: null;--kbq-code-block-font-hljs-variable-font-weight: null;--kbq-code-block-font-hljs-variable-constant-font-style: null;--kbq-code-block-font-hljs-variable-constant-font-weight: null;--kbq-code-block-font-hljs-variable-language-font-style: null;--kbq-code-block-font-hljs-variable-language-font-weight: null;--kbq-code-block-filled-container-background: var(--kbq-background-contrast-less);--kbq-code-block-filled-container-border-color: transparent;--kbq-code-block-filled-header-background: transparent;--kbq-code-block-filled-actionbar-background: var(--kbq-background-card);--kbq-code-block-filled-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-filled-collapse-expanded-background: transparent;--kbq-code-block-filled-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg-secondary) 100% );--kbq-code-block-filled-collapse-button-expand-background: var(--kbq-background-bg-secondary);--kbq-code-block-outline-container-background: var(--kbq-background-card);--kbq-code-block-outline-container-border-color: var(--kbq-divider-color, var(--kbq-line-contrast-less));--kbq-code-block-outline-header-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-outline-collapse-expanded-background: transparent;--kbq-code-block-outline-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg) 100% );--kbq-code-block-outline-collapse-button-expand-background: var(--kbq-background-card);--kbq-code-block-hljs-addition-background: var(--kbq-plt-green-a2, var(--kbq-palette-green-95));--kbq-code-block-hljs-addition-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-attr-background: null;--kbq-code-block-hljs-attr-color: null;--kbq-code-block-hljs-attribute-background: null;--kbq-code-block-hljs-attribute-color: null;--kbq-code-block-hljs-built-in-background: null;--kbq-code-block-hljs-built-in-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-bullet-background: null;--kbq-code-block-hljs-bullet-color: null;--kbq-code-block-hljs-char-escape-background: null;--kbq-code-block-hljs-char-escape-color: null;--kbq-code-block-hljs-class-background: null;--kbq-code-block-hljs-class-color: null;--kbq-code-block-hljs-code-background: null;--kbq-code-block-hljs-code-color: null;--kbq-code-block-hljs-comment-background: null;--kbq-code-block-hljs-comment-color: var(--kbq-plt-slate-a16, var(--kbq-palette-grey-60));--kbq-code-block-hljs-deletion-background: var(--kbq-plt-red-a2, var(--kbq-palette-red-95));--kbq-code-block-hljs-deletion-color: var(--kbq-plt-red-a16, var(--kbq-palette-red-35));--kbq-code-block-hljs-doctag-background: null;--kbq-code-block-hljs-doctag-color: null;--kbq-code-block-hljs-emphasis-background: null;--kbq-code-block-hljs-emphasis-color: null;--kbq-code-block-hljs-formula-background: null;--kbq-code-block-hljs-formula-color: null;--kbq-code-block-hljs-function-background: null;--kbq-code-block-hljs-function-color: null;--kbq-code-block-hljs-keyword-background: null;--kbq-code-block-hljs-keyword-color: null;--kbq-code-block-hljs-line-numbers-color: var(--kbq-foreground-contrast-secondary);--kbq-code-block-hljs-link-background: null;--kbq-code-block-hljs-link-color: null;--kbq-code-block-hljs-literal-background: null;--kbq-code-block-hljs-literal-color: var(--kbq-plt-purple-a16, var(--kbq-palette-purple-30));--kbq-code-block-hljs-meta-background: null;--kbq-code-block-hljs-meta-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-keyword-background: null;--kbq-code-block-hljs-meta-keyword-color: null;--kbq-code-block-hljs-meta-string-background: null;--kbq-code-block-hljs-meta-string-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-prompt-background: null;--kbq-code-block-hljs-meta-prompt-color: null;--kbq-code-block-hljs-name-background: null;--kbq-code-block-hljs-name-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-number-background: null;--kbq-code-block-hljs-number-color: var(--kbq-plt-purple-a16, var(--kbq-palette-purple-30));--kbq-code-block-hljs-operator-background: null;--kbq-code-block-hljs-operator-color: null;--kbq-code-block-hljs-params-background: null;--kbq-code-block-hljs-params-color: null;--kbq-code-block-hljs-property-background: null;--kbq-code-block-hljs-property-color: null;--kbq-code-block-hljs-punctuation-background: null;--kbq-code-block-hljs-punctuation-color: null;--kbq-code-block-hljs-quote-background: null;--kbq-code-block-hljs-quote-color: null;--kbq-code-block-hljs-regexp-background: null;--kbq-code-block-hljs-regexp-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-section-background: null;--kbq-code-block-hljs-section-color: null;--kbq-code-block-hljs-selector-attr-background: null;--kbq-code-block-hljs-selector-attr-color: null;--kbq-code-block-hljs-selector-class-background: null;--kbq-code-block-hljs-selector-class-color: null;--kbq-code-block-hljs-selector-id-background: null;--kbq-code-block-hljs-selector-id-color: null;--kbq-code-block-hljs-selector-pseudo-background: null;--kbq-code-block-hljs-selector-pseudo-color: null;--kbq-code-block-hljs-selector-tag-background: null;--kbq-code-block-hljs-selector-tag-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-string-background: null;--kbq-code-block-hljs-string-color: var(--kbq-plt-green-a16, var(--kbq-palette-green-25));--kbq-code-block-hljs-strong-background: null;--kbq-code-block-hljs-strong-color: null;--kbq-code-block-hljs-subst-background: null;--kbq-code-block-hljs-subst-color: null;--kbq-code-block-hljs-symbol-background: null;--kbq-code-block-hljs-symbol-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-tag-background: null;--kbq-code-block-hljs-tag-color: null;--kbq-code-block-hljs-template-tag-background: null;--kbq-code-block-hljs-template-tag-color: null;--kbq-code-block-hljs-template-variable-background: null;--kbq-code-block-hljs-template-variable-color: null;--kbq-code-block-hljs-title-background: null;--kbq-code-block-hljs-title-color: var(--kbq-plt-blue-a16, var(--kbq-palette-blue-35));--kbq-code-block-hljs-title-class-background: null;--kbq-code-block-hljs-title-class-color: null;--kbq-code-block-hljs-title-class-inherited-background: null;--kbq-code-block-hljs-title-class-inherited-color: null;--kbq-code-block-hljs-title-function-background: null;--kbq-code-block-hljs-title-function-color: null;--kbq-code-block-hljs-title-function-invoke-background: null;--kbq-code-block-hljs-title-function-invoke-color: null;--kbq-code-block-hljs-type-background: null;--kbq-code-block-hljs-type-color: null;--kbq-code-block-hljs-variable-background: null;--kbq-code-block-hljs-variable-color: null;--kbq-code-block-hljs-variable-constant-background: null;--kbq-code-block-hljs-variable-constant-color: null;--kbq-code-block-hljs-variable-language-background: null;--kbq-code-block-hljs-variable-language-color: null;--kbq-code-block-tab-size: 4}.kbq-dark .kbq-code-block{--kbq-code-block-hljs-addition-background: var(--kbq-plt-dark-green-a5, var(--kbq-palette-green-95));--kbq-code-block-hljs-addition-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-built-in-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-comment-color: var(--kbq-plt-dark-slate-a14, var(--kbq-palette-grey-60));--kbq-code-block-hljs-deletion-background: var(--kbq-plt-dark-red-a5, var(--kbq-palette-red-95));--kbq-code-block-hljs-deletion-color: var(--kbq-plt-dark-red-a14, var(--kbq-palette-red-35));--kbq-code-block-hljs-literal-color: var(--kbq-plt-dark-purple-a14, var(--kbq-palette-purple-30));--kbq-code-block-hljs-meta-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-meta-string-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-name-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-number-color: var(--kbq-plt-dark-purple-a14, var(--kbq-palette-purple-30));--kbq-code-block-hljs-regexp-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-selector-tag-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-string-color: var(--kbq-plt-dark-green-a14, var(--kbq-palette-green-25));--kbq-code-block-hljs-symbol-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35));--kbq-code-block-hljs-title-color: var(--kbq-plt-dark-blue-a14, var(--kbq-palette-blue-35))}\n"] }]
|
|
926
|
-
|
|
927
|
-
type: ContentChild,
|
|
928
|
-
|
|
929
|
-
}], lineNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineNumbers", required: false }] }], filled: [{ type: i0.Input, args: [{ isSignal: true, alias: "filled", required: false }] }], canToggleSoftWrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "canToggleSoftWrap", required: false }] }], softWrap: [{
|
|
930
|
-
type: Input,
|
|
931
|
-
args: [{ transform: booleanAttribute }]
|
|
932
|
-
}], softWrapChange: [{ type: i0.Output, args: ["softWrapChange"] }], viewAll: [{
|
|
933
|
-
type: Input,
|
|
934
|
-
args: [{ transform: booleanAttribute }]
|
|
935
|
-
}], viewAllChange: [{ type: i0.Output, args: ["viewAllChange"] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], canLoad: [{
|
|
936
|
-
type: Input,
|
|
937
|
-
args: [{ transform: booleanAttribute }]
|
|
938
|
-
}], canDownload: [{
|
|
939
|
-
type: Input,
|
|
940
|
-
args: [{ transform: booleanAttribute }]
|
|
941
|
-
}], canCopy: [{ type: i0.Input, args: [{ isSignal: true, alias: "canCopy", required: false }] }], alwaysShowActionbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "alwaysShowActionbar", required: false }] }], codeFiles: [{
|
|
942
|
-
type: Input
|
|
943
|
-
}], files: [{
|
|
944
|
-
type: Input
|
|
945
|
-
}], activeFileIndex: [{
|
|
946
|
-
type: Input,
|
|
947
|
-
args: [{ transform: numberAttribute }]
|
|
948
|
-
}], activeFileIndexChange: [{ type: i0.Output, args: ["activeFileIndexChange"] }], noBorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "noBorder", required: false }] }], hideTabs: [{
|
|
949
|
-
type: Input,
|
|
950
|
-
args: [{ transform: booleanAttribute }]
|
|
951
|
-
}], hideTabsChange: [{ type: i0.Output, args: ["hideTabsChange"] }] } });
|
|
1128
|
+
'[class.kbq-code-block_soft-wrap]': 'softWrap()',
|
|
1129
|
+
'[class.kbq-code-block_view-all]': 'viewAll()'
|
|
1130
|
+
}, hostDirectives: [
|
|
1131
|
+
{ directive: KbqLocaleOverridesDirective, inputs: ['kbqLocaleOverrides: localeOverrides'] }
|
|
1132
|
+
], exportAs: 'kbqCodeBlock', template: "<div class=\"kbq-code-block__header\" [kbqOverflowShadowTop]=\"codeBlockContent\">\n @if (!tabsHidden()) {\n <div class=\"kbq-code-block__header-tabs\">\n <div kbqTabNavBar transparent [tabNavPanel]=\"tabPanel\">\n @for (file of files(); track file) {\n <!-- Mark tab-link as readonly if only single file present -->\n <div\n kbqTabLink\n [active]=\"$count > 1 && renderedFileIndex() === $index\"\n [style.pointer-events]=\"$count === 1 ? 'none' : null\"\n (click)=\"onSelectedTabChange($index)\"\n >\n @if (tabLinkTemplate(); as linkTemplate) {\n <ng-container\n *ngTemplateOutlet=\"linkTemplate; context: { $implicit: file, fallbackFileName }\"\n />\n } @else {\n {{ file.filename || fallbackFileName }}\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"kbq-code-block__actionbar\">\n <div class=\"kbq-code-block__actionbar__button-stack\">\n @if (canToggleSoftWrap()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__soft-wrap-button\"\n [attr.aria-label]=\"\n softWrap() ? localeConfiguration().softWrapOffTooltip : localeConfiguration().softWrapOnTooltip\n \"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"\n softWrap() ? localeConfiguration().softWrapOffTooltip : localeConfiguration().softWrapOnTooltip\n \"\n (click)=\"toggleSoftWrap()\"\n >\n @if (softWrap()) {\n <i kbq-icon=\"kbq-text-overflow_16\"></i>\n } @else {\n <i kbq-icon=\"kbq-text-wrap_16\"></i>\n }\n </button>\n }\n\n @if (canDownload()) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__download-button\"\n [attr.aria-label]=\"localeConfiguration().downloadTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration().downloadTooltip\"\n (click)=\"downloadCode()\"\n >\n <i kbq-icon=\"kbq-arrow-down-to-line_16\"></i>\n </button>\n }\n\n @if (canCopy()) {\n <div #copyButtonTooltip=\"kbqTooltip\" [kbqTooltip]=\"localeConfiguration().copyTooltip\">\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__copy-button\"\n [attr.aria-label]=\"localeConfiguration().copyTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"copyCode()\"\n >\n <i kbq-icon=\"kbq-file-multiple-o_16\"></i>\n </button>\n </div>\n }\n\n @if (activeFile()?.link) {\n <button\n kbq-button\n class=\"kbq-code-block__actionbar__link-button\"\n [attr.aria-label]=\"localeConfiguration().openExternalSystemTooltip\"\n [color]=\"componentColor.Contrast\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n [kbqTooltip]=\"localeConfiguration().openExternalSystemTooltip\"\n (click)=\"openLink()\"\n >\n <i kbq-icon=\"kbq-arrow-up-right-from-square_16\"></i>\n </button>\n }\n </div>\n </div>\n</div>\n\n<div\n #tabPanel=\"kbqTabNavPanel\"\n #codeBlockContent=\"kbqOverflowShadowContainer\"\n cdkMonitorElementFocus\n kbqOverflowShadowContainer\n kbqScrollbarViewport\n kbqTabNavPanel\n class=\"kbq-code-block__main\"\n tabindex=\"0\"\n [style.max-height.px]=\"calculatedMaxHeight()\"\n>\n @if (activeFile(); as file) {\n <pre\n #codeBlockPre\n class=\"kbq-code-block__pre\"\n ><code #codeBlockCode kbqCodeBlockHighlight class=\"kbq-code-block__code\" [file]=\"file\"></code></pre>\n }\n\n @if (contentExceedsMaxHeight()) {\n <div\n class=\"kbq-code-block__view-all\"\n [class.kbq-code-block__view-all_collapsed]=\"!viewAll()\"\n [class.kbq-code-block__view-all_expanded]=\"viewAll()\"\n >\n <div class=\"kbq-code-block__view-all__wrapper\">\n <button\n kbq-button\n class=\"kbq-code-block__view-all__button\"\n [color]=\"componentColor.Theme\"\n [kbqStyle]=\"buttonStyle.Transparent\"\n (click)=\"toggleViewAll()\"\n (keydown.enter)=\"onViewAllEnterKeydown($event)\"\n >\n @if (viewAll()) {\n <i kbq-icon=\"kbq-chevron-up_16\"></i>\n {{ localeConfiguration().viewLessText }}\n } @else {\n <i kbq-icon=\"kbq-chevron-down_16\"></i>\n {{ localeConfiguration().viewAllText }}\n }\n </button>\n </div>\n </div>\n }\n</div>\n", styles: [".kbq-code-block{display:flex;flex-direction:column;position:relative;border-width:var(--kbq-code-block-size-container-border-width);border-style:solid;border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block{box-sizing:border-box;hyphens:none;-ms-hyphens:none;-moz-hyphens:none;-webkit-hyphens:none}.kbq-code-block .kbq-code-block__header{display:flex;align-items:center;padding:var(--kbq-size-s) var(--kbq-size-m)}.kbq-code-block .kbq-code-block__header .kbq-code-block__header-tabs{overflow:hidden;flex-grow:1}.kbq-code-block .kbq-code-block__actionbar{display:flex;justify-content:right;align-items:center;z-index:1}.kbq-code-block .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{display:flex;gap:var(--kbq-code-block-size-actionbar-content-gap-horizontal)}.kbq-code-block:has(.kbq-code-block__view-all) .kbq-code-block__main .kbq-code-block__code{padding-bottom:var(--kbq-size-3xl)!important}.kbq-code-block .kbq-code-block__main{flex-grow:1;flex-direction:column;border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__main{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-style:solid;outline-width:var(--kbq-code-block-size-container-border-width-focused);outline-offset:-1px}.kbq-code-block .kbq-code-block__main .kbq-code-block__pre{margin:0;flex-grow:1}.kbq-code-block .kbq-code-block__main .kbq-code-block__code{tab-size:var(--kbq-code-block-tab-size);padding:var(--kbq-code-block-size-with-header-content-padding-top) var(--kbq-code-block-size-with-header-content-padding-horizontal) var(--kbq-code-block-size-with-header-content-padding-bottom) var(--kbq-code-block-size-with-header-content-padding-horizontal)}.kbq-code-block .kbq-code-block__main .kbq-code-block__code:focus-visible{outline:none}.kbq-code-block .kbq-code-block__main .hljs{display:block}.kbq-code-block .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-with-header-content-content-gap-horizontal);vertical-align:baseline;text-align:right}.kbq-code-block .kbq-code-block__main .hljs-ln{border-collapse:unset}.kbq-code-block .kbq-code-block__main .hljs-ln .hljs{padding:0}.kbq-code-block .kbq-code-block__main .hljs-ln-n:before{white-space:nowrap}.kbq-code-block.kbq-code-block_hide-line-numbers .hljs-ln-line.hljs-ln-numbers{display:none}.kbq-code-block.kbq-code-block_soft-wrap .kbq-code-block__code{white-space:pre-wrap;overflow-wrap:anywhere}.kbq-code-block:not(.kbq-code-block_soft-wrap) .kbq-code-block__pre{width:max-content;min-width:100%}.kbq-code-block.kbq-code-block_view-all .kbq-code-block__main{max-height:unset;overflow:auto}.kbq-code-block:not(.kbq-code-block_view-all) .kbq-code-block__main{overflow:hidden}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__header{padding:0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar{display:none;position:absolute;top:0;right:0;margin:var(--kbq-size-s) var(--kbq-size-s) var(--kbq-size-s) 0}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-width:1px;border-style:solid;border-radius:calc(var(--kbq-size-border-radius) + 1px)}@supports (corner-shape: squircle){.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{corner-shape:squircle;border-radius:clamp((var(--kbq-size-border-radius) + 1px) * 1.85,(var(--kbq-size-border-radius) + 1px) * 2.3 - 3.6px,(var(--kbq-size-border-radius) + 1px) * 2)}}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main{position:relative}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .kbq-code-block__code{padding:var(--kbq-code-block-size-no-header-content-padding-vertical) var(--kbq-code-block-size-no-header-content-padding-horizontal)}.kbq-code-block.kbq-code-block_hide-tabs .kbq-code-block__main .hljs-ln-numbers{padding-right:var(--kbq-code-block-size-no-header-content-content-gap-horizontal)}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{border-radius:var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius) 0 0}@supports (corner-shape: squircle){.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__header{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) 0 0}}.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{border-radius:0 0 var(--kbq-code-block-size-container-border-radius) var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block:not(.kbq-code-block_hide-tabs) .kbq-code-block__main{corner-shape:squircle;border-radius:0 0 clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2) clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block.kbq-code-block_show-actionbar .kbq-code-block__actionbar{display:flex}.kbq-code-block:not(:has(.kbq-code-block__view-all)) .kbq-code-block__main{overflow:auto}.kbq-code-block .kbq-code-block__view-all{display:flex;justify-content:center;width:100%;position:absolute;bottom:calc(var(--kbq-code-block-size-container-border-width) * -1);border-radius:var(--kbq-code-block-size-container-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__view-all{corner-shape:squircle;border-radius:clamp(var(--kbq-code-block-size-container-border-radius) * 1.85,var(--kbq-code-block-size-container-border-radius) * 2.3 - 3.6px,var(--kbq-code-block-size-container-border-radius) * 2)}}.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{border-radius:var(--kbq-size-border-radius)}@supports (corner-shape: squircle){.kbq-code-block .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{corner-shape:squircle;border-radius:clamp(var(--kbq-size-border-radius) * 1.85,var(--kbq-size-border-radius) * 2.3 - 3.6px,var(--kbq-size-border-radius) * 2)}}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{padding-top:var(--kbq-code-block-size-collapse-collapsed-padding-top);padding-bottom:var(--kbq-code-block-size-collapse-collapsed-padding-bottom)}.kbq-code-block .kbq-code-block__view-all.kbq-code-block__view-all_expanded{padding-top:var(--kbq-code-block-size-collapse-expanded-padding-top);margin-bottom:var(--kbq-code-block-size-collapse-expanded-padding-bottom)}.kbq-code-block.kbq-code-block_no-border{border-color:transparent!important}.kbq-code-block .hljs-addition{background-color:var(--kbq-code-block-hljs-addition-background);color:var(--kbq-code-block-hljs-addition-color)}.kbq-code-block .hljs-attr{background-color:var(--kbq-code-block-hljs-attr-background);color:var(--kbq-code-block-hljs-attr-color)}.kbq-code-block .hljs-attribute{background-color:var(--kbq-code-block-hljs-attribute-background);color:var(--kbq-code-block-hljs-attribute-color)}.kbq-code-block .hljs-built_in{background-color:var(--kbq-code-block-hljs-built-in-background);color:var(--kbq-code-block-hljs-built-in-color)}.kbq-code-block .hljs-bullet{background-color:var(--kbq-code-block-hljs-bullet-background);color:var(--kbq-code-block-hljs-bullet-color)}.kbq-code-block .hljs-char-escape{background-color:var(--kbq-code-block-hljs-char-escape-background);color:var(--kbq-code-block-hljs-char-escape-color)}.kbq-code-block .hljs-class{background-color:var(--kbq-code-block-hljs-class-background);color:var(--kbq-code-block-hljs-class-color)}.kbq-code-block .hljs-code{background-color:var(--kbq-code-block-hljs-code-background);color:var(--kbq-code-block-hljs-code-color)}.kbq-code-block .hljs-comment{background-color:var(--kbq-code-block-hljs-comment-background);color:var(--kbq-code-block-hljs-comment-color)}.kbq-code-block .hljs-deletion{background-color:var(--kbq-code-block-hljs-deletion-background);color:var(--kbq-code-block-hljs-deletion-color)}.kbq-code-block .hljs-doctag{background-color:var(--kbq-code-block-hljs-doctag-background);color:var(--kbq-code-block-hljs-doctag-color)}.kbq-code-block .hljs-emphasis{background-color:var(--kbq-code-block-hljs-emphasis-background);color:var(--kbq-code-block-hljs-emphasis-color)}.kbq-code-block .hljs-formula{background-color:var(--kbq-code-block-hljs-formula-background);color:var(--kbq-code-block-hljs-formula-color)}.kbq-code-block .hljs-function{background-color:var(--kbq-code-block-hljs-function-background);color:var(--kbq-code-block-hljs-function-color)}.kbq-code-block .hljs-keyword{background-color:var(--kbq-code-block-hljs-keyword-background);color:var(--kbq-code-block-hljs-keyword-color)}.kbq-code-block .hljs-link{background-color:var(--kbq-code-block-hljs-link-background);color:var(--kbq-code-block-hljs-link-color)}.kbq-code-block .hljs-literal{background-color:var(--kbq-code-block-hljs-literal-background);color:var(--kbq-code-block-hljs-literal-color)}.kbq-code-block .hljs-meta{background-color:var(--kbq-code-block-hljs-meta-background);color:var(--kbq-code-block-hljs-meta-color)}.kbq-code-block .hljs-meta-keyword{background-color:var(--kbq-code-block-hljs-meta-keyword-background);color:var(--kbq-code-block-hljs-meta-keyword-color)}.kbq-code-block .hljs-meta-string{background-color:var(--kbq-code-block-hljs-meta-string-background);color:var(--kbq-code-block-hljs-meta-string-color)}.kbq-code-block .hljs-meta-prompt{background-color:var(--kbq-code-block-hljs-meta-prompt-background);color:var(--kbq-code-block-hljs-meta-prompt-color)}.kbq-code-block .hljs-name{background-color:var(--kbq-code-block-hljs-name-background);color:var(--kbq-code-block-hljs-name-color)}.kbq-code-block .hljs-number{background-color:var(--kbq-code-block-hljs-number-background);color:var(--kbq-code-block-hljs-number-color)}.kbq-code-block .hljs-operator{background-color:var(--kbq-code-block-hljs-operator-background);color:var(--kbq-code-block-hljs-operator-color)}.kbq-code-block .hljs-params{background-color:var(--kbq-code-block-hljs-params-background);color:var(--kbq-code-block-hljs-params-color)}.kbq-code-block .hljs-property{background-color:var(--kbq-code-block-hljs-property-background);color:var(--kbq-code-block-hljs-property-color)}.kbq-code-block .hljs-punctuation{background-color:var(--kbq-code-block-hljs-punctuation-background);color:var(--kbq-code-block-hljs-punctuation-color)}.kbq-code-block .hljs-quote{background-color:var(--kbq-code-block-hljs-quote-background);color:var(--kbq-code-block-hljs-quote-color)}.kbq-code-block .hljs-regexp{background-color:var(--kbq-code-block-hljs-regexp-background);color:var(--kbq-code-block-hljs-regexp-color)}.kbq-code-block .hljs-section{background-color:var(--kbq-code-block-hljs-section-background);color:var(--kbq-code-block-hljs-section-color)}.kbq-code-block .hljs-selector-attr{background-color:var(--kbq-code-block-hljs-selector-attr-background);color:var(--kbq-code-block-hljs-selector-attr-color)}.kbq-code-block .hljs-selector-class{background-color:var(--kbq-code-block-hljs-selector-class-background);color:var(--kbq-code-block-hljs-selector-class-color)}.kbq-code-block .hljs-selector-id{background-color:var(--kbq-code-block-hljs-selector-id-background);color:var(--kbq-code-block-hljs-selector-id-color)}.kbq-code-block .hljs-selector-pseudo{background-color:var(--kbq-code-block-hljs-selector-pseudo-background);color:var(--kbq-code-block-hljs-selector-pseudo-color)}.kbq-code-block .hljs-selector-tag{background-color:var(--kbq-code-block-hljs-selector-tag-background);color:var(--kbq-code-block-hljs-selector-tag-color)}.kbq-code-block .hljs-string{background-color:var(--kbq-code-block-hljs-string-background);color:var(--kbq-code-block-hljs-string-color)}.kbq-code-block .hljs-strong{background-color:var(--kbq-code-block-hljs-strong-background);color:var(--kbq-code-block-hljs-strong-color)}.kbq-code-block .hljs-subst{background-color:var(--kbq-code-block-hljs-subst-background);color:var(--kbq-code-block-hljs-subst-color)}.kbq-code-block .hljs-symbol{background-color:var(--kbq-code-block-hljs-symbol-background);color:var(--kbq-code-block-hljs-symbol-color)}.kbq-code-block .hljs-tag{background-color:var(--kbq-code-block-hljs-tag-background);color:var(--kbq-code-block-hljs-tag-color)}.kbq-code-block .hljs-template-tag{background-color:var(--kbq-code-block-hljs-template-tag-background);color:var(--kbq-code-block-hljs-template-tag-color)}.kbq-code-block .hljs-template-variable{background-color:var(--kbq-code-block-hljs-template-variable-background);color:var(--kbq-code-block-hljs-template-variable-color)}.kbq-code-block .hljs-title{background-color:var(--kbq-code-block-hljs-title-background);color:var(--kbq-code-block-hljs-title-color)}.kbq-code-block .hljs-title-class{background-color:var(--kbq-code-block-hljs-title-class-background);color:var(--kbq-code-block-hljs-title-class-color)}.kbq-code-block .hljs-title-class-inherited{background-color:var(--kbq-code-block-hljs-title-class-inherited-background);color:var(--kbq-code-block-hljs-title-class-inherited-color)}.kbq-code-block .hljs-title-function{background-color:var(--kbq-code-block-hljs-title-function-background);color:var(--kbq-code-block-hljs-title-function-color)}.kbq-code-block .hljs-title-function-invoke{background-color:var(--kbq-code-block-hljs-title-function-invoke-background);color:var(--kbq-code-block-hljs-title-function-invoke-color)}.kbq-code-block .hljs-type{background-color:var(--kbq-code-block-hljs-type-background);color:var(--kbq-code-block-hljs-type-color)}.kbq-code-block .hljs-variable{background-color:var(--kbq-code-block-hljs-variable-background);color:var(--kbq-code-block-hljs-variable-color)}.kbq-code-block .hljs-variable-constant{background-color:var(--kbq-code-block-hljs-variable-constant-background);color:var(--kbq-code-block-hljs-variable-constant-color)}.kbq-code-block .hljs-variable-language{background-color:var(--kbq-code-block-hljs-variable-language-background);color:var(--kbq-code-block-hljs-variable-language-color)}.kbq-code-block .hljs-ln-n{color:var(--kbq-code-block-hljs-line-numbers-color)}.kbq-code-block.kbq-code-block_outline{background:var(--kbq-code-block-outline-container-background);border-color:var(--kbq-code-block-outline-container-border-color)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__header{background:var(--kbq-code-block-outline-header-background)}.kbq-code-block.kbq-code-block_outline.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-outline-actionbar-border-color);background:var(--kbq-code-block-outline-actionbar-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-outline-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-outline-collapse-expanded-background)}.kbq-code-block.kbq-code-block_outline .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-outline-collapse-collapsed-background)}.kbq-code-block.kbq-code-block_filled{background:var(--kbq-code-block-filled-container-background);border-color:var(--kbq-code-block-filled-container-border-color)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__header{background:var(--kbq-code-block-filled-header-background)}.kbq-code-block.kbq-code-block_filled.kbq-code-block_hide-tabs .kbq-code-block__actionbar .kbq-code-block__actionbar__button-stack{border-color:var(--kbq-code-block-filled-actionbar-border-color);background:var(--kbq-code-block-filled-actionbar-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all .kbq-code-block__view-all__wrapper{background:var(--kbq-code-block-filled-collapse-button-expand-background);opacity:90%}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_expanded{background:var(--kbq-code-block-filled-collapse-expanded-background)}.kbq-code-block.kbq-code-block_filled .kbq-code-block__view-all.kbq-code-block__view-all_collapsed{background:var(--kbq-code-block-filled-collapse-collapsed-background)}.kbq-code-block .kbq-code-block__main.cdk-keyboard-focused{outline-color:var(--kbq-states-line-focus-theme)}.kbq-code-block{font-size:var(--kbq-typography-mono-codeblock-font-size);font-style:var(--kbq-typography-mono-codeblock-font-style);font-weight:var(--kbq-typography-mono-codeblock-font-weight);line-height:var(--kbq-typography-mono-codeblock-line-height);font-family:var(--kbq-typography-mono-codeblock-font-family);text-transform:var(--kbq-typography-mono-codeblock-text-transform);font-feature-settings:var(--kbq-typography-mono-codeblock-font-feature-settings);letter-spacing:var(--kbq-typography-mono-codeblock-letter-spacing)}.kbq-code-block .kbq-code-block__pre,.kbq-code-block .kbq-code-block__code{font:inherit}\n", ".kbq-code-block{--kbq-code-block-size-container-border-width: var(--kbq-size-border-width);--kbq-code-block-size-container-border-width-focused: 2px;--kbq-code-block-size-container-border-radius: var(--kbq-size-border-radius);--kbq-code-block-size-with-header-content-padding-top: var(--kbq-size-xxs);--kbq-code-block-size-with-header-content-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-with-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-with-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-no-header-content-padding-vertical: 14px;--kbq-code-block-size-no-header-content-padding-horizontal: var(--kbq-size-xl);--kbq-code-block-size-no-header-content-content-gap-horizontal: var(--kbq-size-m);--kbq-code-block-size-header-content-gap-horizontal: var(--kbq-size-l);--kbq-code-block-size-actionbar-content-gap-horizontal: var(--kbq-size-3xs);--kbq-code-block-size-collapse-expanded-padding-top: 0;--kbq-code-block-size-collapse-expanded-padding-bottom: var(--kbq-size-l);--kbq-code-block-size-collapse-collapsed-padding-top: var(--kbq-size-3xl);--kbq-code-block-size-collapse-collapsed-padding-bottom: var(--kbq-size-l);--kbq-code-block-filled-container-background: var(--kbq-background-contrast-less);--kbq-code-block-filled-container-border-color: transparent;--kbq-code-block-filled-header-background: transparent;--kbq-code-block-filled-actionbar-background: var(--kbq-background-card);--kbq-code-block-filled-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-filled-collapse-expanded-background: transparent;--kbq-code-block-filled-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg-secondary) 100% );--kbq-code-block-filled-collapse-button-expand-background: var(--kbq-background-bg-secondary);--kbq-code-block-outline-container-background: var(--kbq-background-card);--kbq-code-block-outline-container-border-color: var(--kbq-divider-color, var(--kbq-line-contrast-less));--kbq-code-block-outline-header-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-background: var(--kbq-background-card);--kbq-code-block-outline-actionbar-border-color: var(--kbq-line-contrast-less);--kbq-code-block-outline-collapse-expanded-background: transparent;--kbq-code-block-outline-collapse-collapsed-background: linear-gradient( 180deg, transparent, var(--kbq-background-bg) 100% );--kbq-code-block-outline-collapse-button-expand-background: var(--kbq-background-card);--kbq-code-block-tab-size: 4}\n"] }]
|
|
1133
|
+
}], ctorParameters: () => [], propDecorators: { copyButtonTooltip: [{ type: i0.ViewChild, args: ['copyButtonTooltip', { isSignal: true }] }], highlight: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqCodeBlockHighlight), { isSignal: true }] }], scrollbarViewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => KbqScrollbarViewport), { isSignal: true }] }], preElementRef: [{ type: i0.ViewChild, args: ['codeBlockPre', { isSignal: true }] }], codeElementRef: [{ type: i0.ViewChild, args: ['codeBlockCode', { isSignal: true }] }], tabLinkTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => KbqCodeBlockTabLinkContent), { ...{ read: TemplateRef }, isSignal: true }] }], lineNumbers: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineNumbers", required: false }] }], filled: [{ type: i0.Input, args: [{ isSignal: true, alias: "filled", required: false }] }], canToggleSoftWrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "canToggleSoftWrap", required: false }] }], softWrapInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "softWrap", required: false }] }], softWrapChange: [{ type: i0.Output, args: ["softWrapChange"] }], viewAllInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewAll", required: false }] }], viewAllChange: [{ type: i0.Output, args: ["viewAllChange"] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], canDownloadInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "canDownload", required: false }] }], canCopy: [{ type: i0.Input, args: [{ isSignal: true, alias: "canCopy", required: false }] }], alwaysShowActionbar: [{ type: i0.Input, args: [{ isSignal: true, alias: "alwaysShowActionbar", required: false }] }], filesInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }], activeFileIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeFileIndex", required: false }] }], activeFileIndexChange: [{ type: i0.Output, args: ["activeFileIndexChange"] }], noBorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "noBorder", required: false }] }], hideTabsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideTabs", required: false }] }], hideTabsChange: [{ type: i0.Output, args: ["hideTabsChange"] }] } });
|
|
952
1134
|
|
|
953
1135
|
const COMPONENTS = [
|
|
954
1136
|
KbqCodeBlock,
|
|
955
1137
|
KbqCodeBlockTabLinkContent
|
|
956
1138
|
];
|
|
957
1139
|
class KbqCodeBlockModule {
|
|
958
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
959
|
-
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
1140
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1141
|
+
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockModule, imports: [KbqCodeBlock,
|
|
960
1142
|
KbqCodeBlockTabLinkContent], exports: [KbqCodeBlock,
|
|
961
1143
|
KbqCodeBlockTabLinkContent] }); }
|
|
962
|
-
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
1144
|
+
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockModule, imports: [KbqCodeBlock] }); }
|
|
963
1145
|
}
|
|
964
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1146
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: KbqCodeBlockModule, decorators: [{
|
|
965
1147
|
type: NgModule,
|
|
966
1148
|
args: [{
|
|
967
1149
|
imports: COMPONENTS,
|