@rt-tools/ui-kit-v2 0.33.0 → 0.34.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/README.md +4 -3
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
- package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +113 -2
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
- package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
- package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
- package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +654 -43
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
- package/package.json +17 -1
- package/src/assets/icons/volume-off.svg +2 -1
- package/src/lib/components/autocomplete/CONTEXT.md +25 -14
- package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
- package/src/lib/components/badge/CONTEXT.md +33 -0
- package/src/lib/components/badge/rt-badge.directive.scss +104 -0
- package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
- package/src/lib/components/button/CONTEXT.md +5 -0
- package/src/lib/components/button/rt-button.directive.scss +3 -1
- package/src/lib/components/checkbox/CONTEXT.md +15 -8
- package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
- package/src/lib/components/container/CONTEXT.md +23 -6
- package/src/lib/components/container/rt-container.component.scss +90 -1
- package/src/lib/components/copy-value/CONTEXT.md +6 -5
- package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
- package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
- package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
- package/src/lib/components/divider/CONTEXT.md +21 -0
- package/src/lib/components/divider/rt-divider.component.scss +34 -0
- package/src/lib/components/drawer/CONTEXT.md +73 -0
- package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
- package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
- package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
- package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
- package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
- package/src/lib/components/field/CONTEXT.md +43 -0
- package/src/lib/components/field/rt-field-label-inside.scss +179 -0
- package/src/lib/components/field/rt-field.component.scss +51 -2
- package/src/lib/components/icon-button/CONTEXT.md +17 -15
- package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
- package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
- package/src/lib/components/input/CONTEXT.md +45 -11
- package/src/lib/components/input/rt-input-floating-label.scss +192 -0
- package/src/lib/components/input/rt-input-icons.scss +105 -0
- package/src/lib/components/input/rt-input.component.scss +91 -13
- package/src/lib/components/input-number/CONTEXT.md +7 -0
- package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
- package/src/lib/components/menu/CONTEXT.md +1 -0
- package/src/lib/components/multiselect/CONTEXT.md +2 -1
- package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
- package/src/lib/components/pagination/CONTEXT.md +3 -0
- package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
- package/src/lib/components/progress-bar/CONTEXT.md +22 -0
- package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
- package/src/lib/components/radio-button/CONTEXT.md +9 -0
- package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
- package/src/lib/components/select/CONTEXT.md +28 -0
- package/src/lib/components/select/rt-select-clear.scss +88 -0
- package/src/lib/components/select/rt-select-floating-label.scss +155 -0
- package/src/lib/components/select/rt-select-material.scss +54 -0
- package/src/lib/components/select/rt-select.component.scss +54 -16
- package/src/lib/components/side-menu/CONTEXT.md +5 -0
- package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
- package/src/lib/components/stepper/CONTEXT.md +13 -5
- package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
- package/src/lib/components/tabs/CONTEXT.md +61 -9
- package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
- package/src/lib/components/textarea/CONTEXT.md +12 -1
- package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
- package/src/lib/components/toast/CONTEXT.md +23 -0
- package/src/lib/components/toast/rt-toast.component.scss +37 -0
- package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
- package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
- package/src/lib/components/tooltip/CONTEXT.md +7 -1
- package/src/lib/components/tree/rt-tree.component.scss +2 -2
- package/src/styles/_color-scheme.scss +1 -1
- package/src/styles/_density.scss +48 -0
- package/src/styles/_index.scss +8 -0
- package/src/styles/_preset-material.scss +160 -70
- package/src/styles/_primitives.scss +1 -0
- package/src/styles/_semantic-navigation.scss +117 -0
- package/src/styles/_semantic.scss +29 -98
- package/src/styles/_theme-dark.scss +8 -0
- package/styles/tokens.css +2066 -1134
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
- package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
- package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
- package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
- package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
- package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
- package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
- package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
- package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
- package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
- package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
- package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
- package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +337 -8
- package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
- package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
- package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
- package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
- package/types/rt-tools-ui-kit-v2.d.ts +4 -0
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
|
@@ -241,7 +241,7 @@ var RtSpeedMenuComponent = class RtSpeedMenuComponent {
|
|
|
241
241
|
}],
|
|
242
242
|
ngImport: i0,
|
|
243
243
|
template: "<ng-container rtBlock=\"rt-speed-menu\">\n <!-- Панель висит на кнопке меню: по ней она встаёт и её нажатие не считает нажатием снаружи.\n Открывает и закрывает её сама кнопка — триггер панели ручной. -->\n <rt-icon-button\n rtElem=\"trigger\"\n qa-dataid=\"speed-menu-trigger\"\n radius=\"full\"\n rtPopoverTrigger=\"manual\"\n rtPopoverPanelClass=\"rt-speed-menu-pane\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverPositions]=\"positions()\"\n [glyph]=\"isOpen() ? 'close' : icon()\"\n [ariaLabel]=\"triggerLabel()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [expanded]=\"isOpen()\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\"\n (clicked)=\"onTrigger($event)\" />\n\n <ng-template #panelTpl>\n <div\n #panel\n rtElem=\"panel\"\n role=\"group\"\n qa-dataid=\"speed-menu-panel\"\n [rtMod]=\"direction()\"\n [attr.aria-label]=\"triggerLabel()\"\n (keydown)=\"onPanelKeydown($event)\">\n @for (action of actions(); track action.value) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"speed-menu-action\"\n radius=\"full\"\n variant=\"secondary\"\n [rtTooltip]=\"action.label\"\n [rtTooltipPlacement]=\"tooltipSide()\"\n [glyph]=\"action.icon\"\n [ariaLabel]=\"action.label\"\n [size]=\"actionSize()\"\n [disabled]=\"action.disabled ?? false\"\n [attr.data-value]=\"action.value\"\n (clicked)=\"onAction(action)\" />\n }\n </div>\n </ng-template>\n</ng-container>\n",
|
|
244
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-speed-menu{--rt-speed-menu-shadow: var(--rt-shadow-md);display:inline-flex;vertical-align:middle}.rt-speed-menu__trigger .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-shadow)}.rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-space-sm);--rt-speed-menu-inset: var(--rt-speed-menu-gap);--rt-speed-menu-action-shadow: var(--rt-shadow-md);--rt-speed-menu-action-shadow-hover: var(--rt-speed-menu-action-shadow);--rt-speed-menu-action-bg: var(--rt-color-bg-surface);--rt-speed-menu-action-color: var(--rt-color-text-primary);--rt-speed-menu-action-radius: var(--rt-radius-full);--rt-speed-menu-duration: var(--rt-duration-fast);--rt-speed-menu-stagger: var(--rt-duration-fast);display:flex;align-items:center;padding:var(--rt-speed-menu-inset);gap:var(--rt-speed-menu-gap)}:is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-size-4);--rt-speed-menu-inset: calc(var(--rt-size-6) + var(--rt-size-1));--rt-speed-menu-action-bg: var(--
|
|
244
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-speed-menu{--rt-speed-menu-shadow: var(--rt-shadow-md);display:inline-flex;vertical-align:middle}.rt-speed-menu__trigger .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-shadow)}.rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-space-sm);--rt-speed-menu-inset: var(--rt-speed-menu-gap);--rt-speed-menu-action-shadow: var(--rt-shadow-md);--rt-speed-menu-action-shadow-hover: var(--rt-speed-menu-action-shadow);--rt-speed-menu-action-bg: var(--rt-color-bg-surface);--rt-speed-menu-action-color: var(--rt-color-text-primary);--rt-speed-menu-action-radius: var(--rt-radius-full);--rt-speed-menu-duration: var(--rt-duration-fast);--rt-speed-menu-stagger: var(--rt-duration-fast);display:flex;align-items:center;padding:var(--rt-speed-menu-inset);gap:var(--rt-speed-menu-gap)}:is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-size-4);--rt-speed-menu-inset: calc(var(--rt-size-6) + var(--rt-size-1));--rt-speed-menu-action-bg: var(--rt-sys-primary-container, var(--rt-mat-neutral-25));--rt-speed-menu-action-color: var(--rt-sys-on-primary-container, var(--rt-color-text-primary));--rt-icon-step-md: var(--rt-size-6);--rt-speed-menu-action-shadow: var(--rt-sys-level3, var(--rt-mat-shadow-fab));--rt-speed-menu-action-shadow-hover: var(--rt-sys-level4, var(--rt-mat-shadow-fab-hover));--rt-speed-menu-duration: calc(var(--rt-duration-fast) * 5 / 6);--rt-speed-menu-stagger: calc(var(--rt-duration-fast) * 5 / 12)}.rt-speed-menu__panel--up,.rt-speed-menu__panel--down{flex-direction:column}.rt-speed-menu__panel--start,.rt-speed-menu__panel--end{flex-direction:row}.rt-speed-menu__action{--rt-speed-menu-step: 0;border-radius:var(--rt-speed-menu-action-radius);background-color:var(--rt-speed-menu-action-bg);opacity:1;transform:scale(1);transition:opacity var(--rt-speed-menu-duration) ease-out,transform var(--rt-speed-menu-duration) ease-out;transition-delay:calc(var(--rt-speed-menu-step) * var(--rt-speed-menu-stagger))}@starting-style{.rt-speed-menu__action{opacity:0;transform:scale(.5)}}.rt-speed-menu__action .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-action-shadow);color:var(--rt-speed-menu-action-color)}.rt-speed-menu__action .rt-icon-button:hover{--rt-icon-button-shadow: var(--rt-speed-menu-action-shadow-hover)}:root[data-theme=dark] :is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel,html.rt-theme-dark :is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-action-bg: var(--rt-sys-primary-container, var(--rt-mat-dark-20))}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(2),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(2),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(2),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(2){--rt-speed-menu-step: 1}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(3),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(3),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(3),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(3){--rt-speed-menu-step: 2}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(4),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(4),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(4),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(4){--rt-speed-menu-step: 3}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(5),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(5),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(5),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(5){--rt-speed-menu-step: 4}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(6),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(6),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(6),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(6){--rt-speed-menu-step: 5}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(7),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(7),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(7),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(7){--rt-speed-menu-step: 6}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(8),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(8),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(8),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(8){--rt-speed-menu-step: 7}@media(prefers-reduced-motion:reduce){.rt-speed-menu__action{transition:none}}}\n"],
|
|
245
245
|
dependencies: [
|
|
246
246
|
{
|
|
247
247
|
kind: "directive",
|
|
@@ -312,6 +312,7 @@ var RtSpeedMenuComponent = class RtSpeedMenuComponent {
|
|
|
312
312
|
inputs: [
|
|
313
313
|
"rtTooltip",
|
|
314
314
|
"rtTooltipPlacement",
|
|
315
|
+
"rtTooltipShowDelay",
|
|
315
316
|
"rtTooltipWhenTruncated",
|
|
316
317
|
"rtTooltipHideOnClick"
|
|
317
318
|
],
|
|
@@ -347,7 +348,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
347
348
|
"[class.rt-speed-menu--open]": "isOpen()"
|
|
348
349
|
},
|
|
349
350
|
template: "<ng-container rtBlock=\"rt-speed-menu\">\n <!-- Панель висит на кнопке меню: по ней она встаёт и её нажатие не считает нажатием снаружи.\n Открывает и закрывает её сама кнопка — триггер панели ручной. -->\n <rt-icon-button\n rtElem=\"trigger\"\n qa-dataid=\"speed-menu-trigger\"\n radius=\"full\"\n rtPopoverTrigger=\"manual\"\n rtPopoverPanelClass=\"rt-speed-menu-pane\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverPositions]=\"positions()\"\n [glyph]=\"isOpen() ? 'close' : icon()\"\n [ariaLabel]=\"triggerLabel()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [expanded]=\"isOpen()\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\"\n (clicked)=\"onTrigger($event)\" />\n\n <ng-template #panelTpl>\n <div\n #panel\n rtElem=\"panel\"\n role=\"group\"\n qa-dataid=\"speed-menu-panel\"\n [rtMod]=\"direction()\"\n [attr.aria-label]=\"triggerLabel()\"\n (keydown)=\"onPanelKeydown($event)\">\n @for (action of actions(); track action.value) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"speed-menu-action\"\n radius=\"full\"\n variant=\"secondary\"\n [rtTooltip]=\"action.label\"\n [rtTooltipPlacement]=\"tooltipSide()\"\n [glyph]=\"action.icon\"\n [ariaLabel]=\"action.label\"\n [size]=\"actionSize()\"\n [disabled]=\"action.disabled ?? false\"\n [attr.data-value]=\"action.value\"\n (clicked)=\"onAction(action)\" />\n }\n </div>\n </ng-template>\n</ng-container>\n",
|
|
350
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-speed-menu{--rt-speed-menu-shadow: var(--rt-shadow-md);display:inline-flex;vertical-align:middle}.rt-speed-menu__trigger .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-shadow)}.rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-space-sm);--rt-speed-menu-inset: var(--rt-speed-menu-gap);--rt-speed-menu-action-shadow: var(--rt-shadow-md);--rt-speed-menu-action-shadow-hover: var(--rt-speed-menu-action-shadow);--rt-speed-menu-action-bg: var(--rt-color-bg-surface);--rt-speed-menu-action-color: var(--rt-color-text-primary);--rt-speed-menu-action-radius: var(--rt-radius-full);--rt-speed-menu-duration: var(--rt-duration-fast);--rt-speed-menu-stagger: var(--rt-duration-fast);display:flex;align-items:center;padding:var(--rt-speed-menu-inset);gap:var(--rt-speed-menu-gap)}:is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-size-4);--rt-speed-menu-inset: calc(var(--rt-size-6) + var(--rt-size-1));--rt-speed-menu-action-bg: var(--
|
|
351
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-speed-menu{--rt-speed-menu-shadow: var(--rt-shadow-md);display:inline-flex;vertical-align:middle}.rt-speed-menu__trigger .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-shadow)}.rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-space-sm);--rt-speed-menu-inset: var(--rt-speed-menu-gap);--rt-speed-menu-action-shadow: var(--rt-shadow-md);--rt-speed-menu-action-shadow-hover: var(--rt-speed-menu-action-shadow);--rt-speed-menu-action-bg: var(--rt-color-bg-surface);--rt-speed-menu-action-color: var(--rt-color-text-primary);--rt-speed-menu-action-radius: var(--rt-radius-full);--rt-speed-menu-duration: var(--rt-duration-fast);--rt-speed-menu-stagger: var(--rt-duration-fast);display:flex;align-items:center;padding:var(--rt-speed-menu-inset);gap:var(--rt-speed-menu-gap)}:is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-gap: var(--rt-size-4);--rt-speed-menu-inset: calc(var(--rt-size-6) + var(--rt-size-1));--rt-speed-menu-action-bg: var(--rt-sys-primary-container, var(--rt-mat-neutral-25));--rt-speed-menu-action-color: var(--rt-sys-on-primary-container, var(--rt-color-text-primary));--rt-icon-step-md: var(--rt-size-6);--rt-speed-menu-action-shadow: var(--rt-sys-level3, var(--rt-mat-shadow-fab));--rt-speed-menu-action-shadow-hover: var(--rt-sys-level4, var(--rt-mat-shadow-fab-hover));--rt-speed-menu-duration: calc(var(--rt-duration-fast) * 5 / 6);--rt-speed-menu-stagger: calc(var(--rt-duration-fast) * 5 / 12)}.rt-speed-menu__panel--up,.rt-speed-menu__panel--down{flex-direction:column}.rt-speed-menu__panel--start,.rt-speed-menu__panel--end{flex-direction:row}.rt-speed-menu__action{--rt-speed-menu-step: 0;border-radius:var(--rt-speed-menu-action-radius);background-color:var(--rt-speed-menu-action-bg);opacity:1;transform:scale(1);transition:opacity var(--rt-speed-menu-duration) ease-out,transform var(--rt-speed-menu-duration) ease-out;transition-delay:calc(var(--rt-speed-menu-step) * var(--rt-speed-menu-stagger))}@starting-style{.rt-speed-menu__action{opacity:0;transform:scale(.5)}}.rt-speed-menu__action .rt-icon-button{--rt-icon-button-shadow: var(--rt-speed-menu-action-shadow);color:var(--rt-speed-menu-action-color)}.rt-speed-menu__action .rt-icon-button:hover{--rt-icon-button-shadow: var(--rt-speed-menu-action-shadow-hover)}:root[data-theme=dark] :is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel,html.rt-theme-dark :is(.rt-preset-material,[data-preset=material]) .rt-speed-menu__panel{--rt-speed-menu-action-bg: var(--rt-sys-primary-container, var(--rt-mat-dark-20))}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(2),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(2),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(2),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(2){--rt-speed-menu-step: 1}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(3),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(3),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(3),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(3){--rt-speed-menu-step: 2}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(4),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(4),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(4),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(4){--rt-speed-menu-step: 3}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(5),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(5),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(5),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(5){--rt-speed-menu-step: 4}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(6),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(6),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(6),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(6){--rt-speed-menu-step: 5}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(7),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(7),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(7),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(7){--rt-speed-menu-step: 6}.rt-speed-menu__panel--down .rt-speed-menu__action:nth-child(8),.rt-speed-menu__panel--end .rt-speed-menu__action:nth-child(8),.rt-speed-menu__panel--up .rt-speed-menu__action:nth-last-child(8),.rt-speed-menu__panel--start .rt-speed-menu__action:nth-last-child(8){--rt-speed-menu-step: 7}@media(prefers-reduced-motion:reduce){.rt-speed-menu__action{transition:none}}}\n"]
|
|
351
352
|
}]
|
|
352
353
|
}],
|
|
353
354
|
ctorParameters: () => [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-speed-menu.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.logic.ts","../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.component.ts","../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.component.html"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtTooltip } from '@rt-tools/ui-kit-v2/tooltip';\nimport { IRtSpeedMenu } from './rt-speed-menu.model';\n\nconst UP: ConnectedPosition = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' };\nconst DOWN: ConnectedPosition = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' };\nconst START: ConnectedPosition = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' };\nconst END: ConnectedPosition = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' };\n\nconst POSITIONS: Record<IRtSpeedMenu.Direction, readonly ConnectedPosition[]> = {\n up: [UP, DOWN],\n down: [DOWN, UP],\n start: [START, END],\n end: [END, START],\n};\n\nconst ACTION_SIZE: Record<IRtSpeedMenu.Size, IRtIconButton.Size> = {\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n xl: 'lg',\n};\n\n/** Места панели вокруг кнопки: сторона направления, а у края экрана — противоположная. */\nexport function speedMenuPositions(direction: IRtSpeedMenu.Direction): readonly ConnectedPosition[] {\n return POSITIONS[direction];\n}\n\n/** Размер кнопок действий — на шаг меньше кнопки меню. */\nexport function speedMenuActionSize(size: IRtSpeedMenu.Size): IRtIconButton.Size {\n return ACTION_SIZE[size];\n}\n\n/** Подсказка столбца действий встаёт сбоку, подсказка ряда — сверху: иначе она закрывает соседа. */\nexport function speedMenuTooltipSide(direction: IRtSpeedMenu.Direction): IRtTooltip.Placement {\n return direction === 'up' || direction === 'down' ? 'left' : 'top';\n}\n\n/**\n * Куда клавиша переводит фокус среди доступных действий: стрелки идут по кругу, Home и End берут\n * крайние. `null` — клавиша не про переход.\n */\nexport function speedMenuNextIndex(key: string, current: number, count: number): number | null {\n if (count === 0) {\n return null;\n }\n\n switch (key) {\n case 'ArrowDown':\n case 'ArrowRight':\n return (current + 1) % count;\n case 'ArrowUp':\n case 'ArrowLeft':\n return (current - 1 + count) % count;\n case 'Home':\n return 0;\n case 'End':\n return count - 1;\n default:\n return null;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIconButton, RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtTooltip, RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { speedMenuActionSize, speedMenuNextIndex, speedMenuPositions, speedMenuTooltipSide } from './rt-speed-menu.logic';\nimport { IRtSpeedMenu } from './rt-speed-menu.model';\n\nconst BEM_BLOCK: string = 'rt-speed-menu';\n\n/** Кнопки действий, которые можно нажать: недоступная кнопка кита несёт нативный `disabled`. */\nconst AVAILABLE_ACTION: string = '.rt-speed-menu__action .rt-icon-button:not(:disabled)';\n\n/**\n * Быстрое меню: круглая кнопка, которая раскрывает рядом несколько круглых кнопок действий. Действия\n * лежат в плавающей панели кита (`rtPopover`) на стороне направления, у края экрана — на\n * противоположной; Escape и нажатие снаружи закрывают меню.\n *\n * Выбор отдаётся выходом `actionSelect`, и меню остаётся открытым: приложение нажимает действие\n * несколько раз подряд. Закрытие на выборе — вход `closeOnSelect`.\n */\n@Component({\n selector: 'rt-speed-menu',\n templateUrl: './rt-speed-menu.component.html',\n styleUrl: './rt-speed-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ElemDirective, ModDirective, RtIconButtonComponent, RtPopoverDirective, RtTooltipDirective],\n host: {\n class: BEM_BLOCK,\n '[class.rt-speed-menu--open]': 'isOpen()',\n },\n})\nexport class RtSpeedMenuComponent {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n readonly #injector: Injector = inject(Injector);\n\n readonly #t_uiActions: Signal<string> = rtKitLabel('uiActions');\n\n protected readonly popover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n protected readonly panel: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('panel');\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover()?.isOpen() ?? false);\n\n /** Своё имя кнопки важнее умолчания: приложение знает, что за действия в меню. */\n protected readonly triggerLabel: Signal<string> = computed((): string => this.label() || this.#t_uiActions());\n\n protected readonly positions: Signal<readonly ConnectedPosition[]> = computed((): readonly ConnectedPosition[] =>\n speedMenuPositions(this.direction())\n );\n\n protected readonly actionSize: Signal<IRtIconButton.Size> = computed((): IRtIconButton.Size => speedMenuActionSize(this.size()));\n\n protected readonly tooltipSide: Signal<IRtTooltip.Placement> = computed((): IRtTooltip.Placement =>\n speedMenuTooltipSide(this.direction())\n );\n\n /** Действия меню в порядке чтения: сверху вниз в столбце, от начала к концу в ряду. */\n public readonly actions: InputSignal<readonly IRtSpeedMenu.Action[]> = input.required<readonly IRtSpeedMenu.Action[]>();\n\n /** Значок кнопки меню: имя кита или Material. Открытая кнопка показывает крест. */\n public readonly icon: InputSignal<string> = input<string>('menu');\n\n /** Доступное имя кнопки меню. Пусто — подпись кита «Действия». */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Сторона, на которую раскрываются действия. */\n public readonly direction: InputSignal<IRtSpeedMenu.Direction> = input<IRtSpeedMenu.Direction>('up');\n\n /** Размер кнопки меню; действия на шаг меньше. */\n public readonly size: InputSignal<IRtSpeedMenu.Size> = input<IRtSpeedMenu.Size>('lg');\n\n /** Палитра кнопки меню. */\n public readonly variant: InputSignal<IRtSpeedMenu.Variant> = input<IRtSpeedMenu.Variant>('primary');\n\n /** Закрывать меню после выбора действия; фокус возвращается на кнопку меню. */\n public readonly closeOnSelect: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Недоступное меню не открывается, а открытое закрывается. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Выбор действия — его `value`. */\n public readonly actionSelect: OutputEmitterRef<string> = output<string>();\n\n /** Меню открылось (`true`) или закрылось (`false`). */\n public readonly openChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n effect((): void => {\n if (this.disabled()) {\n this.popover()?.close();\n }\n });\n }\n\n protected onTrigger(event: MouseEvent): void {\n if (this.isOpen()) {\n this.popover()?.close();\n return;\n }\n if (this.actions().length === 0) {\n return;\n }\n this.popover()?.open();\n // Нажатие с клавиатуры приходит без счёта щелчков: такого человека панель встречает фокусом\n // на первом действии — она лежит в конце страницы, и Tab до неё не дошёл бы.\n if (event.detail === 0) {\n afterNextRender((): void => this.#focusAction(0), { injector: this.#injector });\n }\n }\n\n protected onAction(action: IRtSpeedMenu.Action): void {\n if (action.disabled) {\n return;\n }\n this.actionSelect.emit(action.value);\n if (this.closeOnSelect()) {\n this.#closeToTrigger();\n }\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' || event.key === 'Tab') {\n event.preventDefault();\n this.#closeToTrigger();\n return;\n }\n const buttons: HTMLElement[] = this.#availableActions();\n // Клавишу ловит кнопка в фокусе, и место в ряду меряется по ней\n const current: number = buttons.findIndex((button: HTMLElement): boolean => button === event.target);\n const next: number | null = speedMenuNextIndex(event.key, current, buttons.length);\n if (next === null) {\n return;\n }\n event.preventDefault();\n buttons[next]?.focus();\n }\n\n protected onOpened(): void {\n this.openChange.emit(true);\n }\n\n protected onClosed(): void {\n this.openChange.emit(false);\n }\n\n #closeToTrigger(): void {\n this.popover()?.close();\n this.#host.nativeElement.querySelector<HTMLElement>('.rt-speed-menu__trigger .rt-icon-button')?.focus();\n }\n\n #focusAction(index: number): void {\n this.#availableActions()[index]?.focus();\n }\n\n #availableActions(): HTMLElement[] {\n const panel: HTMLElement | undefined = this.panel()?.nativeElement;\n return panel ? Array.from(panel.querySelectorAll<HTMLElement>(AVAILABLE_ACTION)) : [];\n }\n}\n","<ng-container rtBlock=\"rt-speed-menu\">\n <!-- Панель висит на кнопке меню: по ней она встаёт и её нажатие не считает нажатием снаружи.\n Открывает и закрывает её сама кнопка — триггер панели ручной. -->\n <rt-icon-button\n rtElem=\"trigger\"\n qa-dataid=\"speed-menu-trigger\"\n radius=\"full\"\n rtPopoverTrigger=\"manual\"\n rtPopoverPanelClass=\"rt-speed-menu-pane\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverPositions]=\"positions()\"\n [glyph]=\"isOpen() ? 'close' : icon()\"\n [ariaLabel]=\"triggerLabel()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [expanded]=\"isOpen()\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\"\n (clicked)=\"onTrigger($event)\" />\n\n <ng-template #panelTpl>\n <div\n #panel\n rtElem=\"panel\"\n role=\"group\"\n qa-dataid=\"speed-menu-panel\"\n [rtMod]=\"direction()\"\n [attr.aria-label]=\"triggerLabel()\"\n (keydown)=\"onPanelKeydown($event)\">\n @for (action of actions(); track action.value) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"speed-menu-action\"\n radius=\"full\"\n variant=\"secondary\"\n [rtTooltip]=\"action.label\"\n [rtTooltipPlacement]=\"tooltipSide()\"\n [glyph]=\"action.icon\"\n [ariaLabel]=\"action.label\"\n [size]=\"actionSize()\"\n [disabled]=\"action.disabled ?? false\"\n [attr.data-value]=\"action.value\"\n (clicked)=\"onAction(action)\" />\n }\n </div>\n </ng-template>\n</ng-container>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-speed-menu.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.logic.ts","../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.component.ts","../../../projects/ui-kit-v2/src/lib/components/speed-menu/rt-speed-menu.component.html"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtTooltip } from '@rt-tools/ui-kit-v2/tooltip';\nimport { IRtSpeedMenu } from './rt-speed-menu.model';\n\nconst UP: ConnectedPosition = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom' };\nconst DOWN: ConnectedPosition = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top' };\nconst START: ConnectedPosition = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center' };\nconst END: ConnectedPosition = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center' };\n\nconst POSITIONS: Record<IRtSpeedMenu.Direction, readonly ConnectedPosition[]> = {\n up: [UP, DOWN],\n down: [DOWN, UP],\n start: [START, END],\n end: [END, START],\n};\n\nconst ACTION_SIZE: Record<IRtSpeedMenu.Size, IRtIconButton.Size> = {\n sm: 'xs',\n md: 'sm',\n lg: 'md',\n xl: 'lg',\n};\n\n/** Места панели вокруг кнопки: сторона направления, а у края экрана — противоположная. */\nexport function speedMenuPositions(direction: IRtSpeedMenu.Direction): readonly ConnectedPosition[] {\n return POSITIONS[direction];\n}\n\n/** Размер кнопок действий — на шаг меньше кнопки меню. */\nexport function speedMenuActionSize(size: IRtSpeedMenu.Size): IRtIconButton.Size {\n return ACTION_SIZE[size];\n}\n\n/** Подсказка столбца действий встаёт сбоку, подсказка ряда — сверху: иначе она закрывает соседа. */\nexport function speedMenuTooltipSide(direction: IRtSpeedMenu.Direction): IRtTooltip.Placement {\n return direction === 'up' || direction === 'down' ? 'left' : 'top';\n}\n\n/**\n * Куда клавиша переводит фокус среди доступных действий: стрелки идут по кругу, Home и End берут\n * крайние. `null` — клавиша не про переход.\n */\nexport function speedMenuNextIndex(key: string, current: number, count: number): number | null {\n if (count === 0) {\n return null;\n }\n\n switch (key) {\n case 'ArrowDown':\n case 'ArrowRight':\n return (current + 1) % count;\n case 'ArrowUp':\n case 'ArrowLeft':\n return (current - 1 + count) % count;\n case 'Home':\n return 0;\n case 'End':\n return count - 1;\n default:\n return null;\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { ConnectedPosition } from '@angular/cdk/overlay';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIconButton, RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtTooltip, RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { speedMenuActionSize, speedMenuNextIndex, speedMenuPositions, speedMenuTooltipSide } from './rt-speed-menu.logic';\nimport { IRtSpeedMenu } from './rt-speed-menu.model';\n\nconst BEM_BLOCK: string = 'rt-speed-menu';\n\n/** Кнопки действий, которые можно нажать: недоступная кнопка кита несёт нативный `disabled`. */\nconst AVAILABLE_ACTION: string = '.rt-speed-menu__action .rt-icon-button:not(:disabled)';\n\n/**\n * Быстрое меню: круглая кнопка, которая раскрывает рядом несколько круглых кнопок действий. Действия\n * лежат в плавающей панели кита (`rtPopover`) на стороне направления, у края экрана — на\n * противоположной; Escape и нажатие снаружи закрывают меню.\n *\n * Выбор отдаётся выходом `actionSelect`, и меню остаётся открытым: приложение нажимает действие\n * несколько раз подряд. Закрытие на выборе — вход `closeOnSelect`.\n */\n@Component({\n selector: 'rt-speed-menu',\n templateUrl: './rt-speed-menu.component.html',\n styleUrl: './rt-speed-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ElemDirective, ModDirective, RtIconButtonComponent, RtPopoverDirective, RtTooltipDirective],\n host: {\n class: BEM_BLOCK,\n '[class.rt-speed-menu--open]': 'isOpen()',\n },\n})\nexport class RtSpeedMenuComponent {\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n readonly #injector: Injector = inject(Injector);\n\n readonly #t_uiActions: Signal<string> = rtKitLabel('uiActions');\n\n protected readonly popover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n protected readonly panel: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('panel');\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover()?.isOpen() ?? false);\n\n /** Своё имя кнопки важнее умолчания: приложение знает, что за действия в меню. */\n protected readonly triggerLabel: Signal<string> = computed((): string => this.label() || this.#t_uiActions());\n\n protected readonly positions: Signal<readonly ConnectedPosition[]> = computed((): readonly ConnectedPosition[] =>\n speedMenuPositions(this.direction())\n );\n\n protected readonly actionSize: Signal<IRtIconButton.Size> = computed((): IRtIconButton.Size => speedMenuActionSize(this.size()));\n\n protected readonly tooltipSide: Signal<IRtTooltip.Placement> = computed((): IRtTooltip.Placement =>\n speedMenuTooltipSide(this.direction())\n );\n\n /** Действия меню в порядке чтения: сверху вниз в столбце, от начала к концу в ряду. */\n public readonly actions: InputSignal<readonly IRtSpeedMenu.Action[]> = input.required<readonly IRtSpeedMenu.Action[]>();\n\n /** Значок кнопки меню: имя кита или Material. Открытая кнопка показывает крест. */\n public readonly icon: InputSignal<string> = input<string>('menu');\n\n /** Доступное имя кнопки меню. Пусто — подпись кита «Действия». */\n public readonly label: InputSignal<string> = input<string>('');\n\n /** Сторона, на которую раскрываются действия. */\n public readonly direction: InputSignal<IRtSpeedMenu.Direction> = input<IRtSpeedMenu.Direction>('up');\n\n /** Размер кнопки меню; действия на шаг меньше. */\n public readonly size: InputSignal<IRtSpeedMenu.Size> = input<IRtSpeedMenu.Size>('lg');\n\n /** Палитра кнопки меню. */\n public readonly variant: InputSignal<IRtSpeedMenu.Variant> = input<IRtSpeedMenu.Variant>('primary');\n\n /** Закрывать меню после выбора действия; фокус возвращается на кнопку меню. */\n public readonly closeOnSelect: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Недоступное меню не открывается, а открытое закрывается. */\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Выбор действия — его `value`. */\n public readonly actionSelect: OutputEmitterRef<string> = output<string>();\n\n /** Меню открылось (`true`) или закрылось (`false`). */\n public readonly openChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n effect((): void => {\n if (this.disabled()) {\n this.popover()?.close();\n }\n });\n }\n\n protected onTrigger(event: MouseEvent): void {\n if (this.isOpen()) {\n this.popover()?.close();\n return;\n }\n if (this.actions().length === 0) {\n return;\n }\n this.popover()?.open();\n // Нажатие с клавиатуры приходит без счёта щелчков: такого человека панель встречает фокусом\n // на первом действии — она лежит в конце страницы, и Tab до неё не дошёл бы.\n if (event.detail === 0) {\n afterNextRender((): void => this.#focusAction(0), { injector: this.#injector });\n }\n }\n\n protected onAction(action: IRtSpeedMenu.Action): void {\n if (action.disabled) {\n return;\n }\n this.actionSelect.emit(action.value);\n if (this.closeOnSelect()) {\n this.#closeToTrigger();\n }\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' || event.key === 'Tab') {\n event.preventDefault();\n this.#closeToTrigger();\n return;\n }\n const buttons: HTMLElement[] = this.#availableActions();\n // Клавишу ловит кнопка в фокусе, и место в ряду меряется по ней\n const current: number = buttons.findIndex((button: HTMLElement): boolean => button === event.target);\n const next: number | null = speedMenuNextIndex(event.key, current, buttons.length);\n if (next === null) {\n return;\n }\n event.preventDefault();\n buttons[next]?.focus();\n }\n\n protected onOpened(): void {\n this.openChange.emit(true);\n }\n\n protected onClosed(): void {\n this.openChange.emit(false);\n }\n\n #closeToTrigger(): void {\n this.popover()?.close();\n this.#host.nativeElement.querySelector<HTMLElement>('.rt-speed-menu__trigger .rt-icon-button')?.focus();\n }\n\n #focusAction(index: number): void {\n this.#availableActions()[index]?.focus();\n }\n\n #availableActions(): HTMLElement[] {\n const panel: HTMLElement | undefined = this.panel()?.nativeElement;\n return panel ? Array.from(panel.querySelectorAll<HTMLElement>(AVAILABLE_ACTION)) : [];\n }\n}\n","<ng-container rtBlock=\"rt-speed-menu\">\n <!-- Панель висит на кнопке меню: по ней она встаёт и её нажатие не считает нажатием снаружи.\n Открывает и закрывает её сама кнопка — триггер панели ручной. -->\n <rt-icon-button\n rtElem=\"trigger\"\n qa-dataid=\"speed-menu-trigger\"\n radius=\"full\"\n rtPopoverTrigger=\"manual\"\n rtPopoverPanelClass=\"rt-speed-menu-pane\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverPositions]=\"positions()\"\n [glyph]=\"isOpen() ? 'close' : icon()\"\n [ariaLabel]=\"triggerLabel()\"\n [variant]=\"variant()\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [expanded]=\"isOpen()\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\"\n (clicked)=\"onTrigger($event)\" />\n\n <ng-template #panelTpl>\n <div\n #panel\n rtElem=\"panel\"\n role=\"group\"\n qa-dataid=\"speed-menu-panel\"\n [rtMod]=\"direction()\"\n [attr.aria-label]=\"triggerLabel()\"\n (keydown)=\"onPanelKeydown($event)\">\n @for (action of actions(); track action.value) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"speed-menu-action\"\n radius=\"full\"\n variant=\"secondary\"\n [rtTooltip]=\"action.label\"\n [rtTooltipPlacement]=\"tooltipSide()\"\n [glyph]=\"action.icon\"\n [ariaLabel]=\"action.label\"\n [size]=\"actionSize()\"\n [disabled]=\"action.disabled ?? false\"\n [attr.data-value]=\"action.value\"\n (clicked)=\"onAction(action)\" />\n }\n </div>\n </ng-template>\n</ng-container>\n"],"mappings":"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"}
|
|
@@ -1,9 +1,53 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from "@angular/common";
|
|
1
2
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, input, numberAttribute } from "@angular/core";
|
|
3
|
+
import { ChangeDetectionStrategy, Component, Directive, TemplateRef, ViewEncapsulation, computed, contentChild, inject, input, numberAttribute } from "@angular/core";
|
|
3
4
|
import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
|
|
4
5
|
import * as i1 from "@rt-tools/ui-kit-v2/radius";
|
|
5
6
|
import { RtRadiusDirective } from "@rt-tools/ui-kit-v2/radius";
|
|
7
|
+
var RtStepLabelDirective = class RtStepLabelDirective {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.template = inject(TemplateRef);
|
|
10
|
+
}
|
|
11
|
+
static ngTemplateContextGuard(_directive, context) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
static {
|
|
15
|
+
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
16
|
+
minVersion: "12.0.0",
|
|
17
|
+
version: "22.2.2",
|
|
18
|
+
ngImport: i0,
|
|
19
|
+
type: RtStepLabelDirective,
|
|
20
|
+
deps: [],
|
|
21
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
static {
|
|
25
|
+
this.ɵdir = i0.ɵɵngDeclareDirective({
|
|
26
|
+
minVersion: "14.0.0",
|
|
27
|
+
version: "22.2.2",
|
|
28
|
+
type: RtStepLabelDirective,
|
|
29
|
+
isStandalone: true,
|
|
30
|
+
selector: "ng-template[rtStepLabel]",
|
|
31
|
+
ngImport: i0
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
36
|
+
minVersion: "12.0.0",
|
|
37
|
+
version: "22.2.2",
|
|
38
|
+
ngImport: i0,
|
|
39
|
+
type: RtStepLabelDirective,
|
|
40
|
+
decorators: [{
|
|
41
|
+
type: Directive,
|
|
42
|
+
args: [{ selector: "ng-template[rtStepLabel]" }]
|
|
43
|
+
}]
|
|
44
|
+
});
|
|
6
45
|
const BEM_BLOCK = "rt-stepper";
|
|
46
|
+
function stepState(index, current) {
|
|
47
|
+
if (current < 0) return "neutral";
|
|
48
|
+
if (index < current) return "complete";
|
|
49
|
+
return index === current ? "current" : "upcoming";
|
|
50
|
+
}
|
|
7
51
|
var RtStepperComponent = class RtStepperComponent {
|
|
8
52
|
constructor() {
|
|
9
53
|
this.#safeIndex = computed(() => {
|
|
@@ -18,6 +62,15 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
18
62
|
return this.#safeIndex() / (total - 1) * 100;
|
|
19
63
|
}, ...ngDevMode ? [{ debugName: "progressPercent" }] : /* istanbul ignore next */ []);
|
|
20
64
|
this.totalSteps = computed(() => this.steps().length, ...ngDevMode ? [{ debugName: "totalSteps" }] : /* istanbul ignore next */ []);
|
|
65
|
+
this.labelTemplate = contentChild(RtStepLabelDirective, ...ngDevMode ? [{ debugName: "labelTemplate" }] : /* istanbul ignore next */ []);
|
|
66
|
+
this.items = computed(() => {
|
|
67
|
+
const current = this.currentIndex();
|
|
68
|
+
return this.steps().map((step, index) => ({
|
|
69
|
+
step,
|
|
70
|
+
index,
|
|
71
|
+
state: stepState(index, current)
|
|
72
|
+
}));
|
|
73
|
+
}, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
21
74
|
this.labelAnchor = computed(() => {
|
|
22
75
|
const total = this.steps().length;
|
|
23
76
|
const idx = this.#safeIndex();
|
|
@@ -31,6 +84,7 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
31
84
|
return text.split("\n\n");
|
|
32
85
|
}, ...ngDevMode ? [{ debugName: "descriptionParagraphs" }] : /* istanbul ignore next */ []);
|
|
33
86
|
this.steps = input([], ...ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []);
|
|
87
|
+
this.orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
|
|
34
88
|
this.currentIndex = input(0, {
|
|
35
89
|
...ngDevMode ? { debugName: "currentIndex" } : /* istanbul ignore next */ {},
|
|
36
90
|
transform: numberAttribute
|
|
@@ -62,6 +116,13 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
62
116
|
isRequired: false,
|
|
63
117
|
transformFunction: null
|
|
64
118
|
},
|
|
119
|
+
orientation: {
|
|
120
|
+
classPropertyName: "orientation",
|
|
121
|
+
publicName: "orientation",
|
|
122
|
+
isSignal: true,
|
|
123
|
+
isRequired: false,
|
|
124
|
+
transformFunction: null
|
|
125
|
+
},
|
|
65
126
|
currentIndex: {
|
|
66
127
|
classPropertyName: "currentIndex",
|
|
67
128
|
publicName: "currentIndex",
|
|
@@ -70,15 +131,35 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
70
131
|
transformFunction: null
|
|
71
132
|
}
|
|
72
133
|
},
|
|
73
|
-
host: {
|
|
134
|
+
host: {
|
|
135
|
+
properties: { "class.rt-stepper--vertical": "orientation() === 'vertical'" },
|
|
136
|
+
classAttribute: "rt-stepper"
|
|
137
|
+
},
|
|
138
|
+
queries: [{
|
|
139
|
+
propertyName: "labelTemplate",
|
|
140
|
+
first: true,
|
|
141
|
+
predicate: RtStepLabelDirective,
|
|
142
|
+
descendants: true,
|
|
143
|
+
isSignal: true
|
|
144
|
+
}],
|
|
74
145
|
hostDirectives: [{
|
|
75
146
|
directive: i1.RtRadiusDirective,
|
|
76
147
|
inputs: ["radius", "radius"]
|
|
77
148
|
}],
|
|
78
149
|
ngImport: i0,
|
|
79
|
-
template: "@let current = currentStep();\n<div\n rtBlock=\"rt-stepper\"\n
|
|
80
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-point-shadow: var(--rt-shadow-step-indicator);--rt-stepper-transition-duration: var(--rt-duration-fast);display:flex;flex-direction:column;gap:var(--rt-space-4)}rt-stepper .rt-stepper__rail{position:relative;block-size:39px}rt-stepper .rt-stepper__label{position:absolute;margin:0;color:var(--rt-color-stepper-current);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);inset-block-start:0;letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-none);transition:left var(--rt-stepper-transition-duration) ease-out;white-space:nowrap}rt-stepper .rt-stepper__label--anchor--start{transform:translate(0)}rt-stepper .rt-stepper__label--anchor--center{transform:translate(-50%)}rt-stepper .rt-stepper__label--anchor--end{transform:translate(-100%)}rt-stepper .rt-stepper__track-band{position:absolute;display:flex;align-items:center;block-size:16px;inset-block-end:0;inset-inline:0}rt-stepper .rt-stepper__track,rt-stepper .rt-stepper__progress{position:absolute;border-radius:var(--rt-stepper-radius);block-size:2px;inset-block-start:50%;inset-inline-start:0;transform:translateY(-50%)}rt-stepper .rt-stepper__track{background:var(--rt-color-stepper-track);inset-inline-end:0}rt-stepper .rt-stepper__progress{background:var(--rt-color-stepper-progress);transition:width var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__points{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0;margin:0;inline-size:100%;list-style:none}rt-stepper .rt-stepper__point{border-radius:var(--rt-stepper-radius);background:var(--rt-color-stepper-track);block-size:8px;inline-size:8px;transition:inline-size var(--rt-stepper-transition-duration) ease-out,block-size var(--rt-stepper-transition-duration) ease-out,background var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__point--complete{background:var(--rt-color-stepper-progress)}rt-stepper .rt-stepper__point--current{background:var(--rt-color-stepper-current);block-size:16px;box-shadow:var(--rt-stepper-point-shadow);inline-size:16px}rt-stepper .rt-stepper__description{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-xs);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}rt-stepper .rt-stepper__description+rt-stepper .rt-stepper__description{margin-block-start:var(--rt-space-2)}rt-stepper[data-rt-radius=none]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-none)}rt-stepper[data-rt-radius=xs]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xs)}rt-stepper[data-rt-radius=sm]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-sm)}rt-stepper[data-rt-radius=ms]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-ms)}rt-stepper[data-rt-radius=md]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-md)}rt-stepper[data-rt-radius=lg]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-lg)}rt-stepper[data-rt-radius=xl]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xl)}rt-stepper[data-rt-radius=\"2xl\"]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-2xl)}rt-stepper[data-rt-radius=full]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-full)}}\n"],
|
|
150
|
+
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n",
|
|
151
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-point-shadow: var(--rt-shadow-step-indicator);--rt-stepper-transition-duration: var(--rt-duration-fast);display:flex;flex-direction:column;gap:var(--rt-space-4)}rt-stepper .rt-stepper__rail{position:relative;block-size:39px}rt-stepper .rt-stepper__label{position:absolute;margin:0;color:var(--rt-color-stepper-current);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);inset-block-start:0;letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-none);transition:left var(--rt-stepper-transition-duration) ease-out;white-space:nowrap}rt-stepper .rt-stepper__label--anchor--start{transform:translate(0)}rt-stepper .rt-stepper__label--anchor--center{transform:translate(-50%)}rt-stepper .rt-stepper__label--anchor--end{transform:translate(-100%)}rt-stepper .rt-stepper__track-band{position:absolute;display:flex;align-items:center;block-size:16px;inset-block-end:0;inset-inline:0}rt-stepper .rt-stepper__track,rt-stepper .rt-stepper__progress{position:absolute;border-radius:var(--rt-stepper-radius);block-size:2px;inset-block-start:50%;inset-inline-start:0;transform:translateY(-50%)}rt-stepper .rt-stepper__track{background:var(--rt-color-stepper-track);inset-inline-end:0}rt-stepper .rt-stepper__progress{background:var(--rt-color-stepper-progress);transition:width var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__points{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0;margin:0;inline-size:100%;list-style:none}rt-stepper .rt-stepper__point{border-radius:var(--rt-stepper-radius);background:var(--rt-color-stepper-track);block-size:8px;inline-size:8px;transition:inline-size var(--rt-stepper-transition-duration) ease-out,block-size var(--rt-stepper-transition-duration) ease-out,background var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__point--complete{background:var(--rt-color-stepper-progress)}rt-stepper .rt-stepper__point--current{background:var(--rt-color-stepper-current);block-size:16px;box-shadow:var(--rt-stepper-point-shadow);inline-size:16px}rt-stepper .rt-stepper__description{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-xs);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}rt-stepper .rt-stepper__description+rt-stepper .rt-stepper__description{margin-block-start:var(--rt-space-2)}rt-stepper.rt-stepper--vertical>.rt-stepper{--rt-stepper-mark-size: var(--rt-size-6);--rt-stepper-mark-font-size: var(--rt-text-xs);--rt-stepper-mark-bg: var(--rt-color-text-muted);--rt-stepper-mark-color: var(--rt-color-text-inverse);--rt-stepper-line-width: var(--rt-border-width-thin);--rt-stepper-line-color: var(--rt-color-border-default);--rt-stepper-item-gap: var(--rt-space-6);padding:0;margin:0;gap:0;list-style:none}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item{position:relative;display:flex;align-items:flex-start;gap:var(--rt-space-4);padding-block-end:var(--rt-stepper-item-gap)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:last-child{padding-block-end:0}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:not(:last-child):after{position:absolute;background:var(--rt-stepper-line-color);content:\"\";inline-size:var(--rt-stepper-line-width);inset-block:calc(var(--rt-stepper-mark-size) + var(--rt-space-1)) var(--rt-space-1);inset-inline-start:calc((var(--rt-stepper-mark-size) - var(--rt-stepper-line-width)) / 2)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--complete{--rt-stepper-mark-bg: var(--rt-color-stepper-progress);--rt-stepper-mark-color: var(--rt-color-text-inverse)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--current{--rt-stepper-mark-bg: var(--rt-color-stepper-current);--rt-stepper-mark-color: var(--rt-neutral-950)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--upcoming{--rt-stepper-mark-bg: var(--rt-color-stepper-track);--rt-stepper-mark-color: var(--rt-color-text-primary)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__mark{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-mark-bg);block-size:var(--rt-stepper-mark-size);color:var(--rt-stepper-mark-color);font-size:var(--rt-stepper-mark-font-size);font-weight:var(--rt-font-weight-medium);inline-size:var(--rt-stepper-mark-size);line-height:1}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__body{display:flex;min-width:0;flex-direction:column;gap:var(--rt-space-1);padding-block-start:var(--rt-space-1)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);line-height:var(--rt-leading-snug);overflow-wrap:anywhere}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-description{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug)}rt-stepper[data-rt-radius=none]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-none)}rt-stepper[data-rt-radius=xs]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xs)}rt-stepper[data-rt-radius=sm]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-sm)}rt-stepper[data-rt-radius=ms]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-ms)}rt-stepper[data-rt-radius=md]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-md)}rt-stepper[data-rt-radius=lg]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-lg)}rt-stepper[data-rt-radius=xl]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xl)}rt-stepper[data-rt-radius=\"2xl\"]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-2xl)}rt-stepper[data-rt-radius=full]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-full)}}\n"],
|
|
81
152
|
dependencies: [
|
|
153
|
+
{
|
|
154
|
+
kind: "directive",
|
|
155
|
+
type: NgTemplateOutlet,
|
|
156
|
+
selector: "[ngTemplateOutlet]",
|
|
157
|
+
inputs: [
|
|
158
|
+
"ngTemplateOutletContext",
|
|
159
|
+
"ngTemplateOutlet",
|
|
160
|
+
"ngTemplateOutletInjector"
|
|
161
|
+
]
|
|
162
|
+
},
|
|
82
163
|
{
|
|
83
164
|
kind: "directive",
|
|
84
165
|
type: BlockDirective,
|
|
@@ -114,6 +195,7 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
114
195
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
115
196
|
encapsulation: ViewEncapsulation.None,
|
|
116
197
|
imports: [
|
|
198
|
+
NgTemplateOutlet,
|
|
117
199
|
BlockDirective,
|
|
118
200
|
ElemDirective,
|
|
119
201
|
ModDirective
|
|
@@ -122,12 +204,19 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
122
204
|
directive: RtRadiusDirective,
|
|
123
205
|
inputs: ["radius"]
|
|
124
206
|
}],
|
|
125
|
-
host: {
|
|
126
|
-
|
|
127
|
-
|
|
207
|
+
host: {
|
|
208
|
+
class: BEM_BLOCK,
|
|
209
|
+
"[class.rt-stepper--vertical]": "orientation() === 'vertical'"
|
|
210
|
+
},
|
|
211
|
+
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n",
|
|
212
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-point-shadow: var(--rt-shadow-step-indicator);--rt-stepper-transition-duration: var(--rt-duration-fast);display:flex;flex-direction:column;gap:var(--rt-space-4)}rt-stepper .rt-stepper__rail{position:relative;block-size:39px}rt-stepper .rt-stepper__label{position:absolute;margin:0;color:var(--rt-color-stepper-current);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);inset-block-start:0;letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-none);transition:left var(--rt-stepper-transition-duration) ease-out;white-space:nowrap}rt-stepper .rt-stepper__label--anchor--start{transform:translate(0)}rt-stepper .rt-stepper__label--anchor--center{transform:translate(-50%)}rt-stepper .rt-stepper__label--anchor--end{transform:translate(-100%)}rt-stepper .rt-stepper__track-band{position:absolute;display:flex;align-items:center;block-size:16px;inset-block-end:0;inset-inline:0}rt-stepper .rt-stepper__track,rt-stepper .rt-stepper__progress{position:absolute;border-radius:var(--rt-stepper-radius);block-size:2px;inset-block-start:50%;inset-inline-start:0;transform:translateY(-50%)}rt-stepper .rt-stepper__track{background:var(--rt-color-stepper-track);inset-inline-end:0}rt-stepper .rt-stepper__progress{background:var(--rt-color-stepper-progress);transition:width var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__points{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0;margin:0;inline-size:100%;list-style:none}rt-stepper .rt-stepper__point{border-radius:var(--rt-stepper-radius);background:var(--rt-color-stepper-track);block-size:8px;inline-size:8px;transition:inline-size var(--rt-stepper-transition-duration) ease-out,block-size var(--rt-stepper-transition-duration) ease-out,background var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__point--complete{background:var(--rt-color-stepper-progress)}rt-stepper .rt-stepper__point--current{background:var(--rt-color-stepper-current);block-size:16px;box-shadow:var(--rt-stepper-point-shadow);inline-size:16px}rt-stepper .rt-stepper__description{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-xs);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}rt-stepper .rt-stepper__description+rt-stepper .rt-stepper__description{margin-block-start:var(--rt-space-2)}rt-stepper.rt-stepper--vertical>.rt-stepper{--rt-stepper-mark-size: var(--rt-size-6);--rt-stepper-mark-font-size: var(--rt-text-xs);--rt-stepper-mark-bg: var(--rt-color-text-muted);--rt-stepper-mark-color: var(--rt-color-text-inverse);--rt-stepper-line-width: var(--rt-border-width-thin);--rt-stepper-line-color: var(--rt-color-border-default);--rt-stepper-item-gap: var(--rt-space-6);padding:0;margin:0;gap:0;list-style:none}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item{position:relative;display:flex;align-items:flex-start;gap:var(--rt-space-4);padding-block-end:var(--rt-stepper-item-gap)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:last-child{padding-block-end:0}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:not(:last-child):after{position:absolute;background:var(--rt-stepper-line-color);content:\"\";inline-size:var(--rt-stepper-line-width);inset-block:calc(var(--rt-stepper-mark-size) + var(--rt-space-1)) var(--rt-space-1);inset-inline-start:calc((var(--rt-stepper-mark-size) - var(--rt-stepper-line-width)) / 2)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--complete{--rt-stepper-mark-bg: var(--rt-color-stepper-progress);--rt-stepper-mark-color: var(--rt-color-text-inverse)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--current{--rt-stepper-mark-bg: var(--rt-color-stepper-current);--rt-stepper-mark-color: var(--rt-neutral-950)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--upcoming{--rt-stepper-mark-bg: var(--rt-color-stepper-track);--rt-stepper-mark-color: var(--rt-color-text-primary)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__mark{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-mark-bg);block-size:var(--rt-stepper-mark-size);color:var(--rt-stepper-mark-color);font-size:var(--rt-stepper-mark-font-size);font-weight:var(--rt-font-weight-medium);inline-size:var(--rt-stepper-mark-size);line-height:1}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__body{display:flex;min-width:0;flex-direction:column;gap:var(--rt-space-1);padding-block-start:var(--rt-space-1)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);line-height:var(--rt-leading-snug);overflow-wrap:anywhere}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-description{margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug)}rt-stepper[data-rt-radius=none]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-none)}rt-stepper[data-rt-radius=xs]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xs)}rt-stepper[data-rt-radius=sm]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-sm)}rt-stepper[data-rt-radius=ms]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-ms)}rt-stepper[data-rt-radius=md]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-md)}rt-stepper[data-rt-radius=lg]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-lg)}rt-stepper[data-rt-radius=xl]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xl)}rt-stepper[data-rt-radius=\"2xl\"]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-2xl)}rt-stepper[data-rt-radius=full]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-full)}}\n"]
|
|
128
213
|
}]
|
|
129
214
|
}],
|
|
130
215
|
propDecorators: {
|
|
216
|
+
labelTemplate: [{
|
|
217
|
+
type: i0.ContentChild,
|
|
218
|
+
args: [i0.forwardRef(() => RtStepLabelDirective), { isSignal: true }]
|
|
219
|
+
}],
|
|
131
220
|
steps: [{
|
|
132
221
|
type: i0.Input,
|
|
133
222
|
args: [{
|
|
@@ -136,6 +225,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
136
225
|
required: false
|
|
137
226
|
}]
|
|
138
227
|
}],
|
|
228
|
+
orientation: [{
|
|
229
|
+
type: i0.Input,
|
|
230
|
+
args: [{
|
|
231
|
+
isSignal: true,
|
|
232
|
+
alias: "orientation",
|
|
233
|
+
required: false
|
|
234
|
+
}]
|
|
235
|
+
}],
|
|
139
236
|
currentIndex: [{
|
|
140
237
|
type: i0.Input,
|
|
141
238
|
args: [{
|
|
@@ -146,6 +243,6 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
146
243
|
}]
|
|
147
244
|
}
|
|
148
245
|
});
|
|
149
|
-
export { RtStepperComponent };
|
|
246
|
+
export { RtStepLabelDirective, RtStepperComponent };
|
|
150
247
|
|
|
151
248
|
//# sourceMappingURL=rt-tools-ui-kit-v2-stepper.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-stepper.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtStepper } from './rt-stepper.model';\n\nconst BEM_BLOCK: string = 'rt-stepper';\n\n/**\n * Линейный прогресс-степпер: тонкая полоса, набор точек и подпись\n * текущего шага. Шаги задаются через input `steps` (массив `IRtStepper.Step`\n * со связкой label + description), активный шаг — через `currentIndex`.\n *\n * Активная точка увеличена и подсвечивается янтарным; над ней висит подпись\n * текущего шага (тоже янтарная, выравнивается по краю на крайних шагах).\n * Пройденные точки и заполненная часть полосы — progress-цвет; будущие точки\n * и трек — приглушённый цвет (в dark-теме оба ухода от яркого синего). Под\n * полосой — описание текущего шага, многоабзацное (`\\n\\n`). Сам список названий\n * шагов на ui не выводится — публичен только текущий, остальные читаются\n * скринридером через aria.\n */\n@Component({\n selector: 'rt-stepper',\n templateUrl: './rt-stepper.component.html',\n styleUrl: './rt-stepper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtStepperComponent {\n /**\n * Номер шага, зажатый в набор. Индекс приходит снаружи и может выйти за\n * границы; полоса и якорь подписи это уже переживали, а вот объявление для\n * скринридера — нет: при `currentIndex: 99` на трёх шагах на прогрессбаре\n * оказывалось `aria-valuenow=\"100\"` при `aria-valuemax=\"3\"`, а подпись шага\n * пропадала вовсе. Зажимаем один раз здесь, чтобы показ и объявление не\n * могли разойтись.\n */\n readonly #safeIndex: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n return Math.max(0, Math.min(this.currentIndex(), total - 1));\n });\n\n protected readonly currentStep: Signal<IRtStepper.Step | null> = computed(\n (): IRtStepper.Step | null => this.steps()[this.#safeIndex()] ?? null\n );\n\n /** Номер текущего шага для скринридера: `0`, когда шагов нет вовсе. */\n protected readonly currentStepNumber: Signal<number> = computed((): number => (this.steps().length === 0 ? 0 : this.#safeIndex() + 1));\n\n /**\n * Доля заполненной полосы от 0 до 100. На один шаг и меньше — 0%, иначе\n * `idx / (total - 1)`. Без clamp в шаблоне получаем переполнение если\n * передадут `currentIndex > total`.\n */\n protected readonly progressPercent: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n if (total <= 1) {\n return 0;\n }\n return (this.#safeIndex() / (total - 1)) * 100;\n });\n\n protected readonly totalSteps: Signal<number> = computed((): number => this.steps().length);\n\n /**\n * Якорь подписи текущего шага: подпись висит над активной точкой и не должна\n * вылезать за края рельсы. Первый шаг — выравнивание по левому краю точки,\n * последний — по правому, остальные центрируются над точкой.\n */\n protected readonly labelAnchor: Signal<'start' | 'center' | 'end'> = computed((): 'start' | 'center' | 'end' => {\n const total: number = this.steps().length;\n const idx: number = this.#safeIndex();\n if (idx <= 0) {\n return 'start';\n }\n if (idx >= total - 1) {\n return 'end';\n }\n return 'center';\n });\n\n /** Абзацы описания текущего шага: бэк отдаёт плоскую строку, делим по `\\n\\n`. */\n protected readonly descriptionParagraphs: Signal<readonly string[]> = computed((): readonly string[] => {\n const text: string = this.currentStep()?.description ?? '';\n if (text.length === 0) {\n return [];\n }\n return text.split('\\n\\n');\n });\n\n public readonly steps: InputSignal<readonly IRtStepper.Step[]> = input<readonly IRtStepper.Step[]>([]);\n\n public readonly currentIndex: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n}\n","@let current = currentStep();\n<div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n</div>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-stepper.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stepper/rt-step-label.directive.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtStepper } from './rt-stepper.model';\n\n/**\n * Шаблон подписи шага в вертикальном списке: разметка вместо строки `label`, например выделенное\n * слово. Обстановка — сам шаг и его номер с нуля.\n *\n * @example\n * ```html\n * <rt-stepper orientation=\"vertical\" [steps]=\"steps\" [currentIndex]=\"-1\">\n * <ng-template rtStepLabel let-step let-index=\"index\">\n * @if (index === 3) { Войдите под логином <strong>LOGIN</strong> } @else { {{ step.label }} }\n * </ng-template>\n * </rt-stepper>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtStepLabel]',\n})\nexport class RtStepLabelDirective {\n public readonly template: TemplateRef<IRtStepper.LabelContext> = inject<TemplateRef<IRtStepper.LabelContext>>(TemplateRef);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n public static ngTemplateContextGuard(_directive: RtStepLabelDirective, context: unknown): context is IRtStepper.LabelContext {\n return true;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtStepLabelDirective } from './rt-step-label.directive';\nimport { IRtStepper } from './rt-stepper.model';\n\nconst BEM_BLOCK: string = 'rt-stepper';\n\n/** Шаг вертикального списка, собранный для шаблона: номер для метки и состояние. */\ninterface IStepItem {\n readonly step: IRtStepper.Step;\n readonly index: number;\n readonly state: IRtStepper.StepState;\n}\n\n/** Состояние шага по номеру текущего; номер меньше нуля — текущего нет. */\nfunction stepState(index: number, current: number): IRtStepper.StepState {\n if (current < 0) {\n return 'neutral';\n }\n if (index < current) {\n return 'complete';\n }\n return index === current ? 'current' : 'upcoming';\n}\n\n/**\n * Линейный прогресс-степпер: тонкая полоса, набор точек и подпись\n * текущего шага. Шаги задаются через input `steps` (массив `IRtStepper.Step`\n * со связкой label + description), активный шаг — через `currentIndex`.\n *\n * Активная точка увеличена и подсвечивается янтарным; над ней висит подпись\n * текущего шага (тоже янтарная, выравнивается по краю на крайних шагах).\n * Пройденные точки и заполненная часть полосы — progress-цвет; будущие точки\n * и трек — приглушённый цвет (в dark-теме оба ухода от яркого синего). Под\n * полосой — описание текущего шага, многоабзацное (`\\n\\n`). Сам список названий\n * шагов на ui не выводится — публичен только текущий, остальные читаются\n * скринридером через aria.\n *\n * `orientation=\"vertical\"` показывает все шаги списком: у каждого круглая метка с номером и\n * подпись справа, метки соединены линией. Подпись — строка `label` или шаблон `rtStepLabel`.\n * `currentIndex` меньше нуля значит «текущего шага нет»: список — статичная инструкция, все метки\n * нейтральные. Шаги в списке не нажимаются и фокуса не принимают.\n */\n@Component({\n selector: 'rt-stepper',\n templateUrl: './rt-stepper.component.html',\n styleUrl: './rt-stepper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-stepper--vertical]': \"orientation() === 'vertical'\",\n },\n})\nexport class RtStepperComponent {\n /**\n * Номер шага, зажатый в набор. Индекс приходит снаружи и может выйти за\n * границы; полоса и якорь подписи это уже переживали, а вот объявление для\n * скринридера — нет: при `currentIndex: 99` на трёх шагах на прогрессбаре\n * оказывалось `aria-valuenow=\"100\"` при `aria-valuemax=\"3\"`, а подпись шага\n * пропадала вовсе. Зажимаем один раз здесь, чтобы показ и объявление не\n * могли разойтись.\n */\n readonly #safeIndex: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n return Math.max(0, Math.min(this.currentIndex(), total - 1));\n });\n\n protected readonly currentStep: Signal<IRtStepper.Step | null> = computed(\n (): IRtStepper.Step | null => this.steps()[this.#safeIndex()] ?? null\n );\n\n /** Номер текущего шага для скринридера: `0`, когда шагов нет вовсе. */\n protected readonly currentStepNumber: Signal<number> = computed((): number => (this.steps().length === 0 ? 0 : this.#safeIndex() + 1));\n\n /**\n * Доля заполненной полосы от 0 до 100. На один шаг и меньше — 0%, иначе\n * `idx / (total - 1)`. Без clamp в шаблоне получаем переполнение если\n * передадут `currentIndex > total`.\n */\n protected readonly progressPercent: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n if (total <= 1) {\n return 0;\n }\n return (this.#safeIndex() / (total - 1)) * 100;\n });\n\n protected readonly totalSteps: Signal<number> = computed((): number => this.steps().length);\n\n protected readonly labelTemplate: Signal<RtStepLabelDirective | undefined> = contentChild(RtStepLabelDirective);\n\n /**\n * Шаги вертикального списка с состоянием. Номер текущего здесь не зажимается: меньше нуля —\n * текущего нет, и все шаги нейтральные; больше последнего — пройдены все.\n */\n protected readonly items: Signal<readonly IStepItem[]> = computed((): readonly IStepItem[] => {\n const current: number = this.currentIndex();\n\n return this.steps().map((step: IRtStepper.Step, index: number): IStepItem => ({ step, index, state: stepState(index, current) }));\n });\n\n /**\n * Якорь подписи текущего шага: подпись висит над активной точкой и не должна\n * вылезать за края рельсы. Первый шаг — выравнивание по левому краю точки,\n * последний — по правому, остальные центрируются над точкой.\n */\n protected readonly labelAnchor: Signal<'start' | 'center' | 'end'> = computed((): 'start' | 'center' | 'end' => {\n const total: number = this.steps().length;\n const idx: number = this.#safeIndex();\n if (idx <= 0) {\n return 'start';\n }\n if (idx >= total - 1) {\n return 'end';\n }\n return 'center';\n });\n\n /** Абзацы описания текущего шага: бэк отдаёт плоскую строку, делим по `\\n\\n`. */\n protected readonly descriptionParagraphs: Signal<readonly string[]> = computed((): readonly string[] => {\n const text: string = this.currentStep()?.description ?? '';\n if (text.length === 0) {\n return [];\n }\n return text.split('\\n\\n');\n });\n\n public readonly steps: InputSignal<readonly IRtStepper.Step[]> = input<readonly IRtStepper.Step[]>([]);\n\n public readonly orientation: InputSignal<IRtStepper.Orientation> = input<IRtStepper.Orientation>('horizontal');\n\n public readonly currentIndex: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n}\n","@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n"],"mappings":"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"}
|
|
@@ -183,6 +183,7 @@ var RtCopyCellComponent = class RtCopyCellComponent {
|
|
|
183
183
|
inputs: [
|
|
184
184
|
"rtTooltip",
|
|
185
185
|
"rtTooltipPlacement",
|
|
186
|
+
"rtTooltipShowDelay",
|
|
186
187
|
"rtTooltipWhenTruncated",
|
|
187
188
|
"rtTooltipHideOnClick"
|
|
188
189
|
],
|
|
@@ -590,8 +591,17 @@ var RtTableFilterHeaderComponent = class RtTableFilterHeaderComponent {
|
|
|
590
591
|
"iconLeft",
|
|
591
592
|
"iconRight",
|
|
592
593
|
"passwordToggle",
|
|
593
|
-
"autocomplete"
|
|
594
|
-
|
|
594
|
+
"autocomplete",
|
|
595
|
+
"maxlength",
|
|
596
|
+
"floatingLabel",
|
|
597
|
+
"iconLeftAction",
|
|
598
|
+
"iconRightAction",
|
|
599
|
+
"iconLeftDisabled",
|
|
600
|
+
"iconRightDisabled",
|
|
601
|
+
"iconLeftTooltip",
|
|
602
|
+
"iconRightTooltip"
|
|
603
|
+
],
|
|
604
|
+
outputs: ["iconLeftClick", "iconRightClick"]
|
|
595
605
|
},
|
|
596
606
|
{
|
|
597
607
|
kind: "component",
|
|
@@ -660,6 +670,7 @@ var RtTableFilterHeaderComponent = class RtTableFilterHeaderComponent {
|
|
|
660
670
|
"options",
|
|
661
671
|
"placeholder",
|
|
662
672
|
"iconLeft",
|
|
673
|
+
"floatingLabel",
|
|
663
674
|
"filter",
|
|
664
675
|
"filterPlaceholder",
|
|
665
676
|
"panelWidth",
|