@rt-tools/ui-kit-v2 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +79 -0
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +227 -0
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +702 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
- package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
- package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
- package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
- package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2590 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
- package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
- package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
- package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +937 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +674 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
- package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
- package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
- package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
- package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
- package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
- package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
- package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
- package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +96 -41
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
- package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
- package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
- package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
- package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
- package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
- package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23164
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +349 -1
- package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
- package/src/lib/components/action-bar/CONTEXT.md +5 -0
- package/src/lib/components/action-bar/rt-action-bar.component.scss +30 -16
- package/src/lib/components/aside/CONTEXT.md +9 -1
- package/src/lib/components/aside/footer/rt-aside-footer.component.scss +7 -8
- package/src/lib/components/aside/header/rt-aside-header.component.scss +16 -1
- package/src/lib/components/aside/rt-aside.component.scss +17 -1
- package/src/lib/components/button/CONTEXT.md +12 -11
- package/src/lib/components/button/rt-button.directive.scss +36 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +2 -2
- package/src/lib/components/data-table/cell/rt-data-table-cell.component.scss +1 -1
- package/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.scss +1 -1
- package/src/lib/components/data-table/rt-data-table.component.scss +1 -1
- package/src/lib/components/dialog/CONTEXT.md +9 -0
- package/src/lib/components/dialog/content/rt-dialog-content.component.scss +20 -0
- package/src/lib/components/dialog/footer/rt-dialog-footer.component.scss +18 -2
- package/src/lib/components/dialog/header/rt-dialog-header.component.scss +21 -3
- package/src/lib/components/dialog/rt-dialog.component.scss +9 -3
- package/src/lib/components/dot-field/CONTEXT.md +31 -0
- package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
- package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
- package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
- package/src/lib/components/dynamic-selector/CONTEXT.md +6 -0
- package/src/lib/components/field/CONTEXT.md +18 -2
- package/src/lib/components/header/CONTEXT.md +2 -2
- package/src/lib/components/icon/CONTEXT.md +11 -7
- package/src/lib/components/icon/rt-icon.component.scss +47 -0
- package/src/lib/components/icon-button/CONTEXT.md +27 -20
- package/src/lib/components/icon-button/rt-icon-button.component.scss +51 -25
- package/src/lib/components/image-upload/CONTEXT.md +20 -15
- package/src/lib/components/image-upload/rt-image-upload.component.scss +14 -2
- package/src/lib/components/pagination/rt-pagination.component.scss +1 -1
- package/src/lib/components/scroll-area/CONTEXT.md +2 -0
- package/src/lib/components/scroll-area/rt-scroll-area.component.scss +20 -3
- package/src/lib/components/select/rt-select.component.scss +4 -0
- package/src/lib/components/side-menu/CONTEXT.md +7 -2
- package/src/lib/components/spinner/CONTEXT.md +15 -8
- package/src/lib/components/spinner/rt-spinner.component.scss +108 -9
- package/src/lib/components/tag/rt-tag.component.scss +43 -23
- package/src/lib/components/toast/CONTEXT.md +8 -0
- package/src/lib/components/toast/rt-toast.component.scss +74 -15
- package/src/lib/components/toast/rt-toaster.component.scss +5 -1
- package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -37
- package/src/lib/components/toggle-switch/CONTEXT.md +11 -3
- package/src/lib/components/toggle-switch/rt-toggle-switch.component.scss +53 -14
- package/src/lib/components/toolbar/rt-toolbar.component.scss +15 -4
- package/src/lib/components/tooltip/CONTEXT.md +5 -5
- package/src/rich-editor/lib/components/chat/CONTEXT.md +7 -2
- package/src/rich-editor/lib/components/chat/rt-chat.component.scss +25 -0
- package/src/styles/_semantic.scss +1 -1
- package/styles/tokens.css +43 -8
- package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
- package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
- package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
- package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
- package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
- package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
- package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
- package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
- package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
- package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
- package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
- package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
- package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
- package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
- package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
- package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
- package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
- package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
- package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
- package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
- package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
- package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
- package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
- package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
- package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
- package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
- package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
- package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
- package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
- package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
- package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
- package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
- package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
- package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
- package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
- package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
- package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
- package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
- package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
- package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
- package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
- package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
- package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
- package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
- package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
- package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
- package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
- package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
- package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
- package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
- package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
- package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
- package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
- package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
- package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +16 -20
- package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
- package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
- package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
- package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
- package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
- package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
- package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
- package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
- package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
- package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
- package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
- package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
- package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
- package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
- package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
- package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
- package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
- package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
- package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
- package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
- package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
- package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
- package/types/rt-tools-ui-kit-v2.d.ts +87 -9290
- package/rt-tools-ui-kit-v2-0.16.0.tgz +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, Renderer2, DestroyRef, input, booleanAttribute, Directive } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
const BEM_BLOCK = 'rt-ripple';
|
|
5
|
+
/** Сколько живёт один слой волны. Совпадает с длительностью в стилях блока. */
|
|
6
|
+
const RIPPLE_LIFETIME_MS = 550;
|
|
7
|
+
/**
|
|
8
|
+
* Волна нажатия. Ставится на элемент, который нажимают, и рисует расходящийся
|
|
9
|
+
* от точки касания круг.
|
|
10
|
+
*
|
|
11
|
+
* Волна живёт в своём обрезающем слое внутри элемента, а не прямо в нём:
|
|
12
|
+
* `overflow: hidden` на самой кнопке срезал бы всё, что торчит за её край, —
|
|
13
|
+
* у кнопки-значка так стоит метка, вынесенная на два пикселя наружу.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```html
|
|
17
|
+
* <button rtRipple>Сохранить</button>
|
|
18
|
+
* <button rtRipple [rippleDisabled]="loading()">Сохранить</button>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
class RtRippleDirective {
|
|
22
|
+
#el;
|
|
23
|
+
#renderer;
|
|
24
|
+
#destroyRef;
|
|
25
|
+
/** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */
|
|
26
|
+
#live;
|
|
27
|
+
/** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */
|
|
28
|
+
#area;
|
|
29
|
+
/** Гасит незакончившиеся волны: иначе таймер трогает снятый из дерева узел. */
|
|
30
|
+
constructor() {
|
|
31
|
+
this.#el = inject(ElementRef);
|
|
32
|
+
this.#renderer = inject(Renderer2);
|
|
33
|
+
this.#destroyRef = inject(DestroyRef);
|
|
34
|
+
/** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */
|
|
35
|
+
this.#live = new Set();
|
|
36
|
+
/** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */
|
|
37
|
+
this.#area = null;
|
|
38
|
+
/**
|
|
39
|
+
* Отключает волну, не трогая остальное поведение элемента.
|
|
40
|
+
* Отключённая и загружающаяся кнопка волны не даёт.
|
|
41
|
+
*/
|
|
42
|
+
this.rippleDisabled = input(false, { ...(ngDevMode ? { debugName: "rippleDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
43
|
+
this.#destroyRef.onDestroy(() => {
|
|
44
|
+
for (const timer of this.#live) {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
this.#live.clear();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ставит один слой волны от точки нажатия и снимает его, когда тот отгорит.
|
|
52
|
+
*
|
|
53
|
+
* Радиус считается по дальнему углу элемента: волна из угла должна накрыть
|
|
54
|
+
* противоположный, иначе на широкой кнопке она обрывается на полпути.
|
|
55
|
+
*/
|
|
56
|
+
launch(event) {
|
|
57
|
+
const host = this.#el.nativeElement;
|
|
58
|
+
if (this.rippleDisabled() || host.disabled) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const box = host.getBoundingClientRect();
|
|
62
|
+
const x = event.clientX - box.left;
|
|
63
|
+
const y = event.clientY - box.top;
|
|
64
|
+
const radius = Math.hypot(Math.max(x, box.width - x), Math.max(y, box.height - y));
|
|
65
|
+
const area = this.#ensureArea(host);
|
|
66
|
+
const layer = this.#renderer.createElement('span');
|
|
67
|
+
this.#renderer.addClass(layer, `${BEM_BLOCK}__wave`);
|
|
68
|
+
this.#renderer.setStyle(layer, 'left', `${x - radius}px`);
|
|
69
|
+
this.#renderer.setStyle(layer, 'top', `${y - radius}px`);
|
|
70
|
+
this.#renderer.setStyle(layer, 'width', `${radius * 2}px`);
|
|
71
|
+
this.#renderer.setStyle(layer, 'height', `${radius * 2}px`);
|
|
72
|
+
this.#renderer.appendChild(area, layer);
|
|
73
|
+
const timer = setTimeout(() => {
|
|
74
|
+
this.#live.delete(timer);
|
|
75
|
+
if (layer.parentNode) {
|
|
76
|
+
this.#renderer.removeChild(area, layer);
|
|
77
|
+
}
|
|
78
|
+
}, RIPPLE_LIFETIME_MS);
|
|
79
|
+
this.#live.add(timer);
|
|
80
|
+
}
|
|
81
|
+
/** Обрезающий слой один на элемент: он повторяет его скругление и не ловит указатель. */
|
|
82
|
+
#ensureArea(host) {
|
|
83
|
+
if (this.#area?.parentNode) {
|
|
84
|
+
return this.#area;
|
|
85
|
+
}
|
|
86
|
+
/* Обрезающий слой стоит absolute, и ему нужен позиционированный предок. Позиция
|
|
87
|
+
ставится здесь, а не правилом блока: правило висело бы на каждой кнопке кита и
|
|
88
|
+
меняло растеризацию кадров витрины, ничего не двигая в раскладке. */
|
|
89
|
+
if (getComputedStyle(host).position === 'static') {
|
|
90
|
+
this.#renderer.setStyle(host, 'position', 'relative');
|
|
91
|
+
}
|
|
92
|
+
const area = this.#renderer.createElement('span');
|
|
93
|
+
this.#renderer.addClass(area, `${BEM_BLOCK}__area`);
|
|
94
|
+
this.#renderer.setAttribute(area, 'aria-hidden', 'true');
|
|
95
|
+
this.#renderer.appendChild(host, area);
|
|
96
|
+
this.#area = area;
|
|
97
|
+
return area;
|
|
98
|
+
}
|
|
99
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRippleDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
100
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtRippleDirective, isStandalone: true, selector: "[rtRipple]", inputs: { rippleDisabled: { classPropertyName: "rippleDisabled", publicName: "rippleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerdown": "launch($event)" }, classAttribute: "rt-ripple" }, ngImport: i0 }); }
|
|
101
|
+
}
|
|
102
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtRippleDirective, decorators: [{
|
|
103
|
+
type: Directive,
|
|
104
|
+
args: [{
|
|
105
|
+
selector: '[rtRipple]',
|
|
106
|
+
host: {
|
|
107
|
+
class: BEM_BLOCK,
|
|
108
|
+
'(pointerdown)': 'launch($event)',
|
|
109
|
+
},
|
|
110
|
+
}]
|
|
111
|
+
}], ctorParameters: () => [], propDecorators: { rippleDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "rippleDisabled", required: false }] }] } });
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Generated bundle index. Do not edit.
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
export { RtRippleDirective };
|
|
118
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-ripple.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-ripple.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/ripple/rt-ripple.directive.ts","../../../projects/ui-kit-v2/src/lib/components/ripple/rt-tools-ui-kit-v2-ripple.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, DestroyRef, Directive, ElementRef, inject, input, InputSignalWithTransform, Renderer2 } from '@angular/core';\n\nconst BEM_BLOCK: string = 'rt-ripple';\n\n/** Сколько живёт один слой волны. Совпадает с длительностью в стилях блока. */\nconst RIPPLE_LIFETIME_MS: number = 550;\n\n/**\n * Волна нажатия. Ставится на элемент, который нажимают, и рисует расходящийся\n * от точки касания круг.\n *\n * Волна живёт в своём обрезающем слое внутри элемента, а не прямо в нём:\n * `overflow: hidden` на самой кнопке срезал бы всё, что торчит за её край, —\n * у кнопки-значка так стоит метка, вынесенная на два пикселя наружу.\n *\n * @example\n * ```html\n * <button rtRipple>Сохранить</button>\n * <button rtRipple [rippleDisabled]=\"loading()\">Сохранить</button>\n * ```\n */\n@Directive({\n selector: '[rtRipple]',\n host: {\n class: BEM_BLOCK,\n '(pointerdown)': 'launch($event)',\n },\n})\nexport class RtRippleDirective {\n readonly #el: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #renderer: Renderer2 = inject(Renderer2);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /** Слои, которые ещё гаснут: снимаются, если элемент умрёт раньше их. */\n readonly #live: Set<ReturnType<typeof setTimeout>> = new Set<ReturnType<typeof setTimeout>>();\n\n /** Обрезающий слой заводится при первом нажатии: у кнопки, которую не нажали, его нет. */\n #area: HTMLElement | null = null;\n\n /**\n * Отключает волну, не трогая остальное поведение элемента.\n * Отключённая и загружающаяся кнопка волны не даёт.\n */\n public readonly rippleDisabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Гасит незакончившиеся волны: иначе таймер трогает снятый из дерева узел. */\n constructor() {\n this.#destroyRef.onDestroy((): void => {\n for (const timer of this.#live) {\n clearTimeout(timer);\n }\n this.#live.clear();\n });\n }\n\n /**\n * Ставит один слой волны от точки нажатия и снимает его, когда тот отгорит.\n *\n * Радиус считается по дальнему углу элемента: волна из угла должна накрыть\n * противоположный, иначе на широкой кнопке она обрывается на полпути.\n */\n public launch(event: PointerEvent): void {\n const host: HTMLElement = this.#el.nativeElement;\n if (this.rippleDisabled() || (host as HTMLButtonElement).disabled) {\n return;\n }\n\n const box: DOMRect = host.getBoundingClientRect();\n const x: number = event.clientX - box.left;\n const y: number = event.clientY - box.top;\n const radius: number = Math.hypot(Math.max(x, box.width - x), Math.max(y, box.height - y));\n\n const area: HTMLElement = this.#ensureArea(host);\n const layer: HTMLElement = this.#renderer.createElement('span');\n this.#renderer.addClass(layer, `${BEM_BLOCK}__wave`);\n this.#renderer.setStyle(layer, 'left', `${x - radius}px`);\n this.#renderer.setStyle(layer, 'top', `${y - radius}px`);\n this.#renderer.setStyle(layer, 'width', `${radius * 2}px`);\n this.#renderer.setStyle(layer, 'height', `${radius * 2}px`);\n this.#renderer.appendChild(area, layer);\n\n const timer: ReturnType<typeof setTimeout> = setTimeout((): void => {\n this.#live.delete(timer);\n if (layer.parentNode) {\n this.#renderer.removeChild(area, layer);\n }\n }, RIPPLE_LIFETIME_MS);\n this.#live.add(timer);\n }\n\n /** Обрезающий слой один на элемент: он повторяет его скругление и не ловит указатель. */\n #ensureArea(host: HTMLElement): HTMLElement {\n if (this.#area?.parentNode) {\n return this.#area;\n }\n\n /* Обрезающий слой стоит absolute, и ему нужен позиционированный предок. Позиция\n ставится здесь, а не правилом блока: правило висело бы на каждой кнопке кита и\n меняло растеризацию кадров витрины, ничего не двигая в раскладке. */\n if (getComputedStyle(host).position === 'static') {\n this.#renderer.setStyle(host, 'position', 'relative');\n }\n\n const area: HTMLElement = this.#renderer.createElement('span');\n this.#renderer.addClass(area, `${BEM_BLOCK}__area`);\n this.#renderer.setAttribute(area, 'aria-hidden', 'true');\n this.#renderer.appendChild(host, area);\n this.#area = area;\n\n return area;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, TemplateRef, Directive, viewChild, signal, contentChild, input, booleanAttribute, DestroyRef, afterRenderEffect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { BlockDirective, ElemDirective } from '@rt-tools/core';
|
|
5
|
+
import { RT_KIT_LABELS } from '@rt-tools/ui-kit-v2/core';
|
|
6
|
+
import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
|
|
7
|
+
import { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Маркеры частей области прокрутки — своим файлом, как у соседних семей.
|
|
11
|
+
*
|
|
12
|
+
* Каждый маркер держит свой шаблон и не знает об области ничего: область читает маркеры среди
|
|
13
|
+
* своего содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для области
|
|
14
|
+
* просто отсутствует — рисовать нечего.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Шапка области: стоит сверху и не прокручивается.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```html
|
|
21
|
+
* <rt-scroll-area>
|
|
22
|
+
* <ng-container *rtScrollAreaHeader>
|
|
23
|
+
* <h3>Заголовок</h3>
|
|
24
|
+
* </ng-container>
|
|
25
|
+
* </rt-scroll-area>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
class RtScrollAreaHeaderDirective {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.templateRef = inject(TemplateRef);
|
|
31
|
+
}
|
|
32
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
33
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtScrollAreaHeaderDirective, isStandalone: true, selector: "[rtScrollAreaHeader]", ngImport: i0 }); }
|
|
34
|
+
}
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaHeaderDirective, decorators: [{
|
|
36
|
+
type: Directive,
|
|
37
|
+
args: [{
|
|
38
|
+
selector: '[rtScrollAreaHeader]',
|
|
39
|
+
}]
|
|
40
|
+
}] });
|
|
41
|
+
/** Тело области: единственная часть, которая прокручивается. */
|
|
42
|
+
class RtScrollAreaContentDirective {
|
|
43
|
+
constructor() {
|
|
44
|
+
this.templateRef = inject(TemplateRef);
|
|
45
|
+
}
|
|
46
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
47
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtScrollAreaContentDirective, isStandalone: true, selector: "[rtScrollAreaContent]", ngImport: i0 }); }
|
|
48
|
+
}
|
|
49
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaContentDirective, decorators: [{
|
|
50
|
+
type: Directive,
|
|
51
|
+
args: [{
|
|
52
|
+
selector: '[rtScrollAreaContent]',
|
|
53
|
+
}]
|
|
54
|
+
}] });
|
|
55
|
+
/** Подвал области: стоит снизу и не прокручивается. */
|
|
56
|
+
class RtScrollAreaFooterDirective {
|
|
57
|
+
constructor() {
|
|
58
|
+
this.templateRef = inject(TemplateRef);
|
|
59
|
+
}
|
|
60
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
61
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtScrollAreaFooterDirective, isStandalone: true, selector: "[rtScrollAreaFooter]", ngImport: i0 }); }
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaFooterDirective, decorators: [{
|
|
64
|
+
type: Directive,
|
|
65
|
+
args: [{
|
|
66
|
+
selector: '[rtScrollAreaFooter]',
|
|
67
|
+
}]
|
|
68
|
+
}] });
|
|
69
|
+
|
|
70
|
+
const BEM_BLOCK = 'rt-scroll-area';
|
|
71
|
+
/**
|
|
72
|
+
* Целый пункт запаса при сравнении прокрутки с высотой.
|
|
73
|
+
*
|
|
74
|
+
* Дробная высота строки оставляет остаток, при котором прокрутка уже в самом низу, а разность
|
|
75
|
+
* всё ещё больше нуля: без запаса признак непоказанного висел бы навсегда.
|
|
76
|
+
*/
|
|
77
|
+
const BOTTOM_SLACK_PX = 1;
|
|
78
|
+
/**
|
|
79
|
+
* Область прокрутки: шапка и подвал стоят, тело прокручивается.
|
|
80
|
+
*
|
|
81
|
+
* Части объявляет потребитель — по директиве на каждую. Необъявленная часть не рисуется вовсе:
|
|
82
|
+
* пустая шапка это полоса отступа над списком, а высоту она забирает у тела, ради которого
|
|
83
|
+
* область и открыли.
|
|
84
|
+
*
|
|
85
|
+
* Договорённость — `docs/specs/ui-kit-v2/scroll-area/`.
|
|
86
|
+
*/
|
|
87
|
+
class RtScrollAreaComponent {
|
|
88
|
+
#destroyRef;
|
|
89
|
+
/**
|
|
90
|
+
* Наблюдатель за размером тела, его содержимого и подвала. Событие прокрутки приходит только
|
|
91
|
+
* после движения руки, а список не влезает уже в первую минуту показа: без наблюдателя признак
|
|
92
|
+
* появлялся бы у того, кто и так догадался прокрутить, и молчал у того, кому он нужен.
|
|
93
|
+
*/
|
|
94
|
+
#sizeWatch;
|
|
95
|
+
/**
|
|
96
|
+
* Наблюдатель за составом тела. Тело — окно постоянной высоты, и когда список дорастает под ним,
|
|
97
|
+
* размер тела не меняется: наблюдатель размера молчит. Пришедшие узлы ставятся под наблюдение
|
|
98
|
+
* размера здесь же — их высота меняется и после того, как они легли.
|
|
99
|
+
*/
|
|
100
|
+
#contentWatch;
|
|
101
|
+
/** Узлы, за которыми наблюдают сейчас: пересозданное тело или подвал ставятся под наблюдение заново. */
|
|
102
|
+
#watchedBody;
|
|
103
|
+
#watchedFooter;
|
|
104
|
+
/** Наблюдение поставлено: тело и подвал могут быть и пустыми, флаг отличает «снято» от «нечего смотреть». */
|
|
105
|
+
#isWatching;
|
|
106
|
+
constructor() {
|
|
107
|
+
this.t = inject(RT_KIT_LABELS);
|
|
108
|
+
this.bodyRef = viewChild('body', /* @ts-ignore */
|
|
109
|
+
...(ngDevMode ? [{ debugName: "bodyRef" }] : /* istanbul ignore next */ []));
|
|
110
|
+
this.footerRef = viewChild('foot', /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "footerRef" }] : /* istanbul ignore next */ []));
|
|
112
|
+
/**
|
|
113
|
+
* Ниже окна области ещё есть содержимое. Считается по трём числам самого узла, а не по числу
|
|
114
|
+
* пунктов: область не знает, что ей подали, и высота строки у каждого потребителя своя.
|
|
115
|
+
*/
|
|
116
|
+
this.hasMoreBelow = signal(false, /* @ts-ignore */
|
|
117
|
+
...(ngDevMode ? [{ debugName: "hasMoreBelow" }] : /* istanbul ignore next */ []));
|
|
118
|
+
/**
|
|
119
|
+
* На сколько полоса растушёвки поднята над низом области. Она обязана кончиться там, где
|
|
120
|
+
* начинается содержимое подвала: разделитель потребитель рисует первой его строкой, и полоса,
|
|
121
|
+
* оборвавшаяся выше, оставляет до него чистый фон. Считается замером — верхний отступ подвала
|
|
122
|
+
* потребитель пишет как хочет, и вычесть его в стилях не из чего. Без подвала полоса стоит у
|
|
123
|
+
* самого низа.
|
|
124
|
+
*/
|
|
125
|
+
this.hintBottom = signal(0, /* @ts-ignore */
|
|
126
|
+
...(ngDevMode ? [{ debugName: "hintBottom" }] : /* istanbul ignore next */ []));
|
|
127
|
+
this.headerTpl = contentChild(RtScrollAreaHeaderDirective, /* @ts-ignore */
|
|
128
|
+
...(ngDevMode ? [{ debugName: "headerTpl" }] : /* istanbul ignore next */ []));
|
|
129
|
+
this.contentTpl = contentChild(RtScrollAreaContentDirective, /* @ts-ignore */
|
|
130
|
+
...(ngDevMode ? [{ debugName: "contentTpl" }] : /* istanbul ignore next */ []));
|
|
131
|
+
this.footerTpl = contentChild(RtScrollAreaFooterDirective, /* @ts-ignore */
|
|
132
|
+
...(ngDevMode ? [{ debugName: "footerTpl" }] : /* istanbul ignore next */ []));
|
|
133
|
+
/**
|
|
134
|
+
* Признак того, что снизу осталось непоказанное. Выключен по умолчанию: область рисуют
|
|
135
|
+
* десятки экранов, и признак, поставленный безусловно, сдвинул бы вид каждому из них.
|
|
136
|
+
*/
|
|
137
|
+
this.isScrollHintShown = input(false, { ...(ngDevMode ? { debugName: "isScrollHintShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
138
|
+
this.#destroyRef = inject(DestroyRef);
|
|
139
|
+
/**
|
|
140
|
+
* Наблюдатель за размером тела, его содержимого и подвала. Событие прокрутки приходит только
|
|
141
|
+
* после движения руки, а список не влезает уже в первую минуту показа: без наблюдателя признак
|
|
142
|
+
* появлялся бы у того, кто и так догадался прокрутить, и молчал у того, кому он нужен.
|
|
143
|
+
*/
|
|
144
|
+
this.#sizeWatch = null;
|
|
145
|
+
/**
|
|
146
|
+
* Наблюдатель за составом тела. Тело — окно постоянной высоты, и когда список дорастает под ним,
|
|
147
|
+
* размер тела не меняется: наблюдатель размера молчит. Пришедшие узлы ставятся под наблюдение
|
|
148
|
+
* размера здесь же — их высота меняется и после того, как они легли.
|
|
149
|
+
*/
|
|
150
|
+
this.#contentWatch = null;
|
|
151
|
+
/** Узлы, за которыми наблюдают сейчас: пересозданное тело или подвал ставятся под наблюдение заново. */
|
|
152
|
+
this.#watchedBody = null;
|
|
153
|
+
this.#watchedFooter = null;
|
|
154
|
+
/** Наблюдение поставлено: тело и подвал могут быть и пустыми, флаг отличает «снято» от «нечего смотреть». */
|
|
155
|
+
this.#isWatching = false;
|
|
156
|
+
// Наблюдатели живут, только пока признак включён: выключенный признак ничего не рисует, а
|
|
157
|
+
// наблюдатель состава с поддеревом заставлял бы браузер пересчитывать раскладку на каждую
|
|
158
|
+
// правку внутри тела у каждой области экрана. Включение ставит их, выключение снимает.
|
|
159
|
+
afterRenderEffect(() => {
|
|
160
|
+
const body = this.bodyRef()?.nativeElement ?? null;
|
|
161
|
+
const footer = this.footerRef()?.nativeElement ?? null;
|
|
162
|
+
if (!this.isScrollHintShown()) {
|
|
163
|
+
this.#unwatch();
|
|
164
|
+
this.hasMoreBelow.set(false);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.onBodyScroll();
|
|
168
|
+
if (!this.#isWatching || body !== this.#watchedBody || footer !== this.#watchedFooter) {
|
|
169
|
+
this.#watch(body, footer);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
this.#destroyRef.onDestroy(() => this.#unwatch());
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Нажатие на значок уводит тело к самому низу. Нажатие останавливается здесь и в содержимое
|
|
176
|
+
* под значком не уходит: под ним живой пункт, и человек, целившийся в подсказку, уехал бы на
|
|
177
|
+
* чужой экран.
|
|
178
|
+
*/
|
|
179
|
+
onScrollHintClick(event) {
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
event.stopPropagation();
|
|
182
|
+
const body = this.bodyRef();
|
|
183
|
+
if (!body) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
body.nativeElement.scrollTo({ top: body.nativeElement.scrollHeight, behavior: 'smooth' });
|
|
187
|
+
}
|
|
188
|
+
onBodyScroll() {
|
|
189
|
+
// Выключенный признак не рисуется, и замер для него — чтение раскладки на каждое движение.
|
|
190
|
+
if (!this.isScrollHintShown()) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
this.#measureHintBottom();
|
|
194
|
+
const body = this.bodyRef();
|
|
195
|
+
if (!body) {
|
|
196
|
+
this.hasMoreBelow.set(false);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const node = body.nativeElement;
|
|
200
|
+
this.hasMoreBelow.set(node.scrollHeight - node.scrollTop - node.clientHeight > BOTTOM_SLACK_PX);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Подъём полосы над низом области: высота подвала без его верхнего отступа. Ровно на этом
|
|
204
|
+
* месте начинается содержимое подвала, и до него полоса и должна доходить.
|
|
205
|
+
*/
|
|
206
|
+
#measureHintBottom() {
|
|
207
|
+
const footer = this.footerRef();
|
|
208
|
+
if (!footer) {
|
|
209
|
+
this.hintBottom.set(0);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const node = footer.nativeElement;
|
|
213
|
+
const paddingTop = parseFloat(getComputedStyle(node).paddingTop) || 0;
|
|
214
|
+
this.hintBottom.set(Math.max(node.offsetHeight - paddingTop, 0));
|
|
215
|
+
}
|
|
216
|
+
/** Ставит под наблюдение нынешние тело и подвал; прежние наблюдатели снимаются. */
|
|
217
|
+
#watch(body, footer) {
|
|
218
|
+
this.#unwatch();
|
|
219
|
+
this.#watchedBody = body;
|
|
220
|
+
this.#watchedFooter = footer;
|
|
221
|
+
this.#isWatching = true;
|
|
222
|
+
if (!body) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
226
|
+
this.#sizeWatch = new ResizeObserver(() => this.onBodyScroll());
|
|
227
|
+
this.#observeSizes();
|
|
228
|
+
}
|
|
229
|
+
if (typeof MutationObserver !== 'undefined') {
|
|
230
|
+
this.#contentWatch = new MutationObserver(() => {
|
|
231
|
+
this.#observeSizes();
|
|
232
|
+
this.onBodyScroll();
|
|
233
|
+
});
|
|
234
|
+
this.#contentWatch.observe(body, { childList: true, subtree: true, characterData: true });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Размер наблюдается у тела, у каждого его прямого потомка и у подвала. Подвал — наравне с
|
|
239
|
+
* телом: от его высоты считается подъём полосы, и не наблюдавшаяся, она осталась бы стоять по
|
|
240
|
+
* прежней высоте подвала и наехала бы на его первую строку.
|
|
241
|
+
*/
|
|
242
|
+
#observeSizes() {
|
|
243
|
+
const watch = this.#sizeWatch;
|
|
244
|
+
const body = this.#watchedBody;
|
|
245
|
+
if (!watch || !body) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// Состав тела сменился — ушедшие узлы снимаются вместе со всеми, пришедшие ставятся заново.
|
|
249
|
+
watch.disconnect();
|
|
250
|
+
watch.observe(body);
|
|
251
|
+
Array.from(body.children).forEach((child) => watch.observe(child));
|
|
252
|
+
if (this.#watchedFooter) {
|
|
253
|
+
watch.observe(this.#watchedFooter);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
#unwatch() {
|
|
257
|
+
this.#sizeWatch?.disconnect();
|
|
258
|
+
this.#sizeWatch = null;
|
|
259
|
+
this.#contentWatch?.disconnect();
|
|
260
|
+
this.#contentWatch = null;
|
|
261
|
+
this.#watchedBody = null;
|
|
262
|
+
this.#watchedFooter = null;
|
|
263
|
+
this.#isWatching = false;
|
|
264
|
+
}
|
|
265
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
266
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtScrollAreaComponent, isStandalone: true, selector: "rt-scroll-area", inputs: { isScrollHintShown: { classPropertyName: "isScrollHintShown", publicName: "isScrollHintShown", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "rt-scroll-area" }, queries: [{ propertyName: "headerTpl", first: true, predicate: RtScrollAreaHeaderDirective, descendants: true, isSignal: true }, { propertyName: "contentTpl", first: true, predicate: RtScrollAreaContentDirective, descendants: true, isSignal: true }, { propertyName: "footerTpl", first: true, predicate: RtScrollAreaFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true, isSignal: true }, { propertyName: "footerRef", first: true, predicate: ["foot"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-scroll-area\">\n @if (headerTpl()) {\n <div rtElem=\"header\" qa-dataid=\"scroll-area-header\">\n <ng-container [ngTemplateOutlet]=\"headerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (contentTpl()) {\n <div #body rtElem=\"body\" qa-dataid=\"scroll-area-body\" (scroll)=\"onBodyScroll()\">\n <ng-container [ngTemplateOutlet]=\"contentTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (footerTpl()) {\n <div #foot rtElem=\"footer\" qa-dataid=\"scroll-area-footer\">\n <ng-container [ngTemplateOutlet]=\"footerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n <!--\n \u041F\u0440\u0438\u0437\u043D\u0430\u043A \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0441\u043D\u0438\u0437\u0443 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043D\u0435\u043F\u043E\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435: \u043A\u0440\u0430\u0439 \u0441\u043F\u0438\u0441\u043A\u0430, \u0440\u043E\u0432\u043D\u043E \u043E\u0431\u0440\u0435\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u043E\u0434\u0432\u0430\u043B\u043E\u043C,\n \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u043A\u043E\u043D\u0435\u0446 \u0441\u043F\u0438\u0441\u043A\u0430, \u0438 \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043E \u043F\u0443\u043D\u043A\u0442 \u043F\u0440\u043E\u043F\u0430\u043B. \u041F\u043E\u043B\u043E\u0441\u0430 \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0445\u043E\u0441\u0442\u0435, \u0430\n \u043D\u0435 \u0432\u043D\u0443\u0442\u0440\u0438 \u0442\u0435\u043B\u0430: \u0442\u0435\u043B\u043E \u043E\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0432\u0441\u0451 \u043F\u043E \u0441\u0432\u043E\u0435\u043C\u0443 \u043A\u0440\u0430\u044E, \u0438 \u043F\u043E\u043B\u043E\u0441\u0430 \u043E\u0431\u0440\u044B\u0432\u0430\u043B\u0430\u0441\u044C \u0431\u044B \u043D\u0430 \u0432\u0435\u0440\u0445\u043D\u0435\u043C\n \u043E\u0442\u0441\u0442\u0443\u043F\u0435 \u043F\u043E\u0434\u0432\u0430\u043B\u0430 \u2014 \u043C\u0435\u0436\u0434\u0443 \u043D\u0435\u0439 \u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0435\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C \u0440\u0438\u0441\u0443\u0435\u0442 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439\n \u043F\u043E\u0434\u0432\u0430\u043B\u0430, \u043E\u0441\u0442\u0430\u0432\u0430\u043B\u0430\u0441\u044C \u0431\u044B \u043F\u043E\u043B\u043E\u0441\u0430 \u0447\u0438\u0441\u0442\u043E\u0433\u043E \u0444\u043E\u043D\u0430.\n -->\n @if (isScrollHintShown() && hasMoreBelow()) {\n <div rtElem=\"scroll-hint\" qa-dataid=\"scroll-area-scroll-hint\" [style.bottom.px]=\"hintBottom()\">\n <rt-icon\n rtElem=\"scroll-hint-icon\"\n qa-dataid=\"scroll-area-scroll-hint-icon\"\n name=\"chevron-down\"\n size=\"md\"\n role=\"button\"\n tabindex=\"0\"\n rtTooltipPlacement=\"top\"\n [rtTooltip]=\"t().uiScrollDown\"\n [attr.aria-label]=\"t().uiScrollDown\"\n (click)=\"onScrollHintClick($event)\"\n (keydown.enter)=\"onScrollHintClick($event)\" />\n </div>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{:where(.rt-scroll-area){background:var(--rt-scroll-area-bg)}.rt-scroll-area{--rt-scroll-area-hint-height: var(--rt-space-10);--rt-scroll-area-hint-color: var(--rt-color-bg-surface);--rt-scroll-area-hint-radius: var(--rt-radius-full);--rt-scroll-area-header-padding: var(--rt-space-2) var(--rt-space-4);--rt-scroll-area-body-padding: var(--rt-space-4);--rt-scroll-area-footer-padding: var(--rt-space-4);--rt-scroll-area-bg: transparent;--rt-scroll-area-header-bg: transparent;--rt-scroll-area-body-bg: transparent;--rt-scroll-area-footer-bg: transparent;position:relative;display:flex;flex-direction:column;block-size:100%;inline-size:100%;min-block-size:0}.rt-scroll-area__header{flex:0 0 auto;padding:var(--rt-scroll-area-header-padding);background:var(--rt-scroll-area-header-bg)}.rt-scroll-area__body{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;padding:var(--rt-scroll-area-body-padding);background:var(--rt-scroll-area-body-bg);min-block-size:0}.rt-scroll-area__footer{flex:0 0 auto;padding:var(--rt-scroll-area-footer-padding);background:var(--rt-scroll-area-footer-bg)}.rt-scroll-area__scroll-hint{position:absolute;z-index:1;display:flex;align-items:flex-end;justify-content:center;background:linear-gradient(to bottom,rgb(from var(--rt-scroll-area-hint-color) r g b/0%),var(--rt-scroll-area-hint-color));block-size:var(--rt-scroll-area-hint-height);inset-inline:0;pointer-events:none}.rt-scroll-area__scroll-hint-icon{display:flex;align-items:center;justify-content:center;border-radius:var(--rt-scroll-area-hint-radius);background-color:var(--rt-color-bg-surface);color:var(--rt-color-text-muted);cursor:pointer;pointer-events:auto}}\n"], dependencies: [{ kind: "directive", type:
|
|
267
|
+
// Angular
|
|
268
|
+
NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type:
|
|
269
|
+
// standalone components / directives
|
|
270
|
+
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
271
|
+
}
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtScrollAreaComponent, decorators: [{
|
|
273
|
+
type: Component,
|
|
274
|
+
args: [{ selector: 'rt-scroll-area', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
275
|
+
// Angular
|
|
276
|
+
NgTemplateOutlet,
|
|
277
|
+
// standalone components / directives
|
|
278
|
+
RtIconComponent,
|
|
279
|
+
RtTooltipDirective,
|
|
280
|
+
BlockDirective,
|
|
281
|
+
ElemDirective,
|
|
282
|
+
], host: { class: BEM_BLOCK }, template: "<ng-container rtBlock=\"rt-scroll-area\">\n @if (headerTpl()) {\n <div rtElem=\"header\" qa-dataid=\"scroll-area-header\">\n <ng-container [ngTemplateOutlet]=\"headerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (contentTpl()) {\n <div #body rtElem=\"body\" qa-dataid=\"scroll-area-body\" (scroll)=\"onBodyScroll()\">\n <ng-container [ngTemplateOutlet]=\"contentTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (footerTpl()) {\n <div #foot rtElem=\"footer\" qa-dataid=\"scroll-area-footer\">\n <ng-container [ngTemplateOutlet]=\"footerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n <!--\n \u041F\u0440\u0438\u0437\u043D\u0430\u043A \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0441\u043D\u0438\u0437\u0443 \u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C \u043D\u0435\u043F\u043E\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435: \u043A\u0440\u0430\u0439 \u0441\u043F\u0438\u0441\u043A\u0430, \u0440\u043E\u0432\u043D\u043E \u043E\u0431\u0440\u0435\u0437\u0430\u043D\u043D\u044B\u0439 \u043F\u043E\u0434\u0432\u0430\u043B\u043E\u043C,\n \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A \u043A\u043E\u043D\u0435\u0446 \u0441\u043F\u0438\u0441\u043A\u0430, \u0438 \u0447\u0435\u043B\u043E\u0432\u0435\u043A \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043E \u043F\u0443\u043D\u043A\u0442 \u043F\u0440\u043E\u043F\u0430\u043B. \u041F\u043E\u043B\u043E\u0441\u0430 \u0436\u0438\u0432\u0451\u0442 \u043D\u0430 \u0445\u043E\u0441\u0442\u0435, \u0430\n \u043D\u0435 \u0432\u043D\u0443\u0442\u0440\u0438 \u0442\u0435\u043B\u0430: \u0442\u0435\u043B\u043E \u043E\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0432\u0441\u0451 \u043F\u043E \u0441\u0432\u043E\u0435\u043C\u0443 \u043A\u0440\u0430\u044E, \u0438 \u043F\u043E\u043B\u043E\u0441\u0430 \u043E\u0431\u0440\u044B\u0432\u0430\u043B\u0430\u0441\u044C \u0431\u044B \u043D\u0430 \u0432\u0435\u0440\u0445\u043D\u0435\u043C\n \u043E\u0442\u0441\u0442\u0443\u043F\u0435 \u043F\u043E\u0434\u0432\u0430\u043B\u0430 \u2014 \u043C\u0435\u0436\u0434\u0443 \u043D\u0435\u0439 \u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0435\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u044C \u0440\u0438\u0441\u0443\u0435\u0442 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439\n \u043F\u043E\u0434\u0432\u0430\u043B\u0430, \u043E\u0441\u0442\u0430\u0432\u0430\u043B\u0430\u0441\u044C \u0431\u044B \u043F\u043E\u043B\u043E\u0441\u0430 \u0447\u0438\u0441\u0442\u043E\u0433\u043E \u0444\u043E\u043D\u0430.\n -->\n @if (isScrollHintShown() && hasMoreBelow()) {\n <div rtElem=\"scroll-hint\" qa-dataid=\"scroll-area-scroll-hint\" [style.bottom.px]=\"hintBottom()\">\n <rt-icon\n rtElem=\"scroll-hint-icon\"\n qa-dataid=\"scroll-area-scroll-hint-icon\"\n name=\"chevron-down\"\n size=\"md\"\n role=\"button\"\n tabindex=\"0\"\n rtTooltipPlacement=\"top\"\n [rtTooltip]=\"t().uiScrollDown\"\n [attr.aria-label]=\"t().uiScrollDown\"\n (click)=\"onScrollHintClick($event)\"\n (keydown.enter)=\"onScrollHintClick($event)\" />\n </div>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{:where(.rt-scroll-area){background:var(--rt-scroll-area-bg)}.rt-scroll-area{--rt-scroll-area-hint-height: var(--rt-space-10);--rt-scroll-area-hint-color: var(--rt-color-bg-surface);--rt-scroll-area-hint-radius: var(--rt-radius-full);--rt-scroll-area-header-padding: var(--rt-space-2) var(--rt-space-4);--rt-scroll-area-body-padding: var(--rt-space-4);--rt-scroll-area-footer-padding: var(--rt-space-4);--rt-scroll-area-bg: transparent;--rt-scroll-area-header-bg: transparent;--rt-scroll-area-body-bg: transparent;--rt-scroll-area-footer-bg: transparent;position:relative;display:flex;flex-direction:column;block-size:100%;inline-size:100%;min-block-size:0}.rt-scroll-area__header{flex:0 0 auto;padding:var(--rt-scroll-area-header-padding);background:var(--rt-scroll-area-header-bg)}.rt-scroll-area__body{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;padding:var(--rt-scroll-area-body-padding);background:var(--rt-scroll-area-body-bg);min-block-size:0}.rt-scroll-area__footer{flex:0 0 auto;padding:var(--rt-scroll-area-footer-padding);background:var(--rt-scroll-area-footer-bg)}.rt-scroll-area__scroll-hint{position:absolute;z-index:1;display:flex;align-items:flex-end;justify-content:center;background:linear-gradient(to bottom,rgb(from var(--rt-scroll-area-hint-color) r g b/0%),var(--rt-scroll-area-hint-color));block-size:var(--rt-scroll-area-hint-height);inset-inline:0;pointer-events:none}.rt-scroll-area__scroll-hint-icon{display:flex;align-items:center;justify-content:center;border-radius:var(--rt-scroll-area-hint-radius);background-color:var(--rt-color-bg-surface);color:var(--rt-color-text-muted);cursor:pointer;pointer-events:auto}}\n"] }]
|
|
283
|
+
}], ctorParameters: () => [], propDecorators: { bodyRef: [{ type: i0.ViewChild, args: ['body', { isSignal: true }] }], footerRef: [{ type: i0.ViewChild, args: ['foot', { isSignal: true }] }], headerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtScrollAreaHeaderDirective), { isSignal: true }] }], contentTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtScrollAreaContentDirective), { isSignal: true }] }], footerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtScrollAreaFooterDirective), { isSignal: true }] }], isScrollHintShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isScrollHintShown", required: false }] }] } });
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Generated bundle index. Do not edit.
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
export { RtScrollAreaComponent, RtScrollAreaContentDirective, RtScrollAreaFooterDirective, RtScrollAreaHeaderDirective };
|
|
290
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-scroll-area.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-scroll-area.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.directives.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.ts","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-scroll-area.component.html","../../../projects/ui-kit-v2/src/lib/components/scroll-area/rt-tools-ui-kit-v2-scroll-area.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Маркеры частей области прокрутки — своим файлом, как у соседних семей.\n *\n * Каждый маркер держит свой шаблон и не знает об области ничего: область читает маркеры среди\n * своего содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для области\n * просто отсутствует — рисовать нечего.\n */\n\n/**\n * Шапка области: стоит сверху и не прокручивается.\n *\n * @example\n * ```html\n * <rt-scroll-area>\n * <ng-container *rtScrollAreaHeader>\n * <h3>Заголовок</h3>\n * </ng-container>\n * </rt-scroll-area>\n * ```\n */\n@Directive({\n selector: '[rtScrollAreaHeader]',\n})\nexport class RtScrollAreaHeaderDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Тело области: единственная часть, которая прокручивается. */\n@Directive({\n selector: '[rtScrollAreaContent]',\n})\nexport class RtScrollAreaContentDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Подвал области: стоит снизу и не прокручивается. */\n@Directive({\n selector: '[rtScrollAreaFooter]',\n})\nexport class RtScrollAreaFooterDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChild,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignalWithTransform,\n signal,\n Signal,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { TNullable } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { RtScrollAreaContentDirective, RtScrollAreaFooterDirective, RtScrollAreaHeaderDirective } from './rt-scroll-area.directives';\n\nconst BEM_BLOCK: string = 'rt-scroll-area';\n\n/**\n * Целый пункт запаса при сравнении прокрутки с высотой.\n *\n * Дробная высота строки оставляет остаток, при котором прокрутка уже в самом низу, а разность\n * всё ещё больше нуля: без запаса признак непоказанного висел бы навсегда.\n */\nconst BOTTOM_SLACK_PX: number = 1;\n\n/**\n * Область прокрутки: шапка и подвал стоят, тело прокручивается.\n *\n * Части объявляет потребитель — по директиве на каждую. Необъявленная часть не рисуется вовсе:\n * пустая шапка это полоса отступа над списком, а высоту она забирает у тела, ради которого\n * область и открыли.\n *\n * Договорённость — `docs/specs/ui-kit-v2/scroll-area/`.\n */\n@Component({\n selector: 'rt-scroll-area',\n templateUrl: './rt-scroll-area.component.html',\n styleUrls: ['./rt-scroll-area.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconComponent,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtScrollAreaComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly bodyRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('body');\n protected readonly footerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('foot');\n\n /**\n * Ниже окна области ещё есть содержимое. Считается по трём числам самого узла, а не по числу\n * пунктов: область не знает, что ей подали, и высота строки у каждого потребителя своя.\n */\n protected readonly hasMoreBelow: WritableSignal<boolean> = signal(false);\n\n /**\n * На сколько полоса растушёвки поднята над низом области. Она обязана кончиться там, где\n * начинается содержимое подвала: разделитель потребитель рисует первой его строкой, и полоса,\n * оборвавшаяся выше, оставляет до него чистый фон. Считается замером — верхний отступ подвала\n * потребитель пишет как хочет, и вычесть его в стилях не из чего. Без подвала полоса стоит у\n * самого низа.\n */\n protected readonly hintBottom: WritableSignal<number> = signal(0);\n\n public readonly headerTpl: Signal<TNullable<RtScrollAreaHeaderDirective>> = contentChild(RtScrollAreaHeaderDirective);\n public readonly contentTpl: Signal<TNullable<RtScrollAreaContentDirective>> = contentChild(RtScrollAreaContentDirective);\n public readonly footerTpl: Signal<TNullable<RtScrollAreaFooterDirective>> = contentChild(RtScrollAreaFooterDirective);\n\n /**\n * Признак того, что снизу осталось непоказанное. Выключен по умолчанию: область рисуют\n * десятки экранов, и признак, поставленный безусловно, сдвинул бы вид каждому из них.\n */\n public readonly isScrollHintShown: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Наблюдатель за размером тела, его содержимого и подвала. Событие прокрутки приходит только\n * после движения руки, а список не влезает уже в первую минуту показа: без наблюдателя признак\n * появлялся бы у того, кто и так догадался прокрутить, и молчал у того, кому он нужен.\n */\n #sizeWatch: TNullable<ResizeObserver> = null;\n\n /**\n * Наблюдатель за составом тела. Тело — окно постоянной высоты, и когда список дорастает под ним,\n * размер тела не меняется: наблюдатель размера молчит. Пришедшие узлы ставятся под наблюдение\n * размера здесь же — их высота меняется и после того, как они легли.\n */\n #contentWatch: TNullable<MutationObserver> = null;\n\n /** Узлы, за которыми наблюдают сейчас: пересозданное тело или подвал ставятся под наблюдение заново. */\n #watchedBody: HTMLElement | null = null;\n #watchedFooter: HTMLElement | null = null;\n\n /** Наблюдение поставлено: тело и подвал могут быть и пустыми, флаг отличает «снято» от «нечего смотреть». */\n #isWatching: boolean = false;\n\n constructor() {\n // Наблюдатели живут, только пока признак включён: выключенный признак ничего не рисует, а\n // наблюдатель состава с поддеревом заставлял бы браузер пересчитывать раскладку на каждую\n // правку внутри тела у каждой области экрана. Включение ставит их, выключение снимает.\n afterRenderEffect((): void => {\n const body: HTMLElement | null = this.bodyRef()?.nativeElement ?? null;\n const footer: HTMLElement | null = this.footerRef()?.nativeElement ?? null;\n\n if (!this.isScrollHintShown()) {\n this.#unwatch();\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n this.onBodyScroll();\n\n if (!this.#isWatching || body !== this.#watchedBody || footer !== this.#watchedFooter) {\n this.#watch(body, footer);\n }\n });\n\n this.#destroyRef.onDestroy((): void => this.#unwatch());\n }\n\n /**\n * Нажатие на значок уводит тело к самому низу. Нажатие останавливается здесь и в содержимое\n * под значком не уходит: под ним живой пункт, и человек, целившийся в подсказку, уехал бы на\n * чужой экран.\n */\n public onScrollHintClick(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n return;\n }\n\n body.nativeElement.scrollTo({ top: body.nativeElement.scrollHeight, behavior: 'smooth' });\n }\n\n public onBodyScroll(): void {\n // Выключенный признак не рисуется, и замер для него — чтение раскладки на каждое движение.\n if (!this.isScrollHintShown()) {\n return;\n }\n\n this.#measureHintBottom();\n\n const body: TNullable<ElementRef<HTMLElement>> = this.bodyRef();\n\n if (!body) {\n this.hasMoreBelow.set(false);\n\n return;\n }\n\n const node: HTMLElement = body.nativeElement;\n\n this.hasMoreBelow.set(node.scrollHeight - node.scrollTop - node.clientHeight > BOTTOM_SLACK_PX);\n }\n\n /**\n * Подъём полосы над низом области: высота подвала без его верхнего отступа. Ровно на этом\n * месте начинается содержимое подвала, и до него полоса и должна доходить.\n */\n #measureHintBottom(): void {\n const footer: TNullable<ElementRef<HTMLElement>> = this.footerRef();\n\n if (!footer) {\n this.hintBottom.set(0);\n\n return;\n }\n\n const node: HTMLElement = footer.nativeElement;\n const paddingTop: number = parseFloat(getComputedStyle(node).paddingTop) || 0;\n\n this.hintBottom.set(Math.max(node.offsetHeight - paddingTop, 0));\n }\n\n /** Ставит под наблюдение нынешние тело и подвал; прежние наблюдатели снимаются. */\n #watch(body: HTMLElement | null, footer: HTMLElement | null): void {\n this.#unwatch();\n this.#watchedBody = body;\n this.#watchedFooter = footer;\n this.#isWatching = true;\n\n if (!body) {\n return;\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n this.#sizeWatch = new ResizeObserver((): void => this.onBodyScroll());\n this.#observeSizes();\n }\n\n if (typeof MutationObserver !== 'undefined') {\n this.#contentWatch = new MutationObserver((): void => {\n this.#observeSizes();\n this.onBodyScroll();\n });\n this.#contentWatch.observe(body, { childList: true, subtree: true, characterData: true });\n }\n }\n\n /**\n * Размер наблюдается у тела, у каждого его прямого потомка и у подвала. Подвал — наравне с\n * телом: от его высоты считается подъём полосы, и не наблюдавшаяся, она осталась бы стоять по\n * прежней высоте подвала и наехала бы на его первую строку.\n */\n #observeSizes(): void {\n const watch: TNullable<ResizeObserver> = this.#sizeWatch;\n const body: HTMLElement | null = this.#watchedBody;\n\n if (!watch || !body) {\n return;\n }\n\n // Состав тела сменился — ушедшие узлы снимаются вместе со всеми, пришедшие ставятся заново.\n watch.disconnect();\n watch.observe(body);\n Array.from(body.children).forEach((child: Element): void => watch.observe(child));\n\n if (this.#watchedFooter) {\n watch.observe(this.#watchedFooter);\n }\n }\n\n #unwatch(): void {\n this.#sizeWatch?.disconnect();\n this.#sizeWatch = null;\n this.#contentWatch?.disconnect();\n this.#contentWatch = null;\n this.#watchedBody = null;\n this.#watchedFooter = null;\n this.#isWatching = false;\n }\n}\n","<ng-container rtBlock=\"rt-scroll-area\">\n @if (headerTpl()) {\n <div rtElem=\"header\" qa-dataid=\"scroll-area-header\">\n <ng-container [ngTemplateOutlet]=\"headerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (contentTpl()) {\n <div #body rtElem=\"body\" qa-dataid=\"scroll-area-body\" (scroll)=\"onBodyScroll()\">\n <ng-container [ngTemplateOutlet]=\"contentTpl()?.templateRef ?? null\" />\n </div>\n }\n\n @if (footerTpl()) {\n <div #foot rtElem=\"footer\" qa-dataid=\"scroll-area-footer\">\n <ng-container [ngTemplateOutlet]=\"footerTpl()?.templateRef ?? null\" />\n </div>\n }\n\n <!--\n Признак того, что снизу осталось непоказанное: край списка, ровно обрезанный подвалом,\n читается как конец списка, и человек считает, что пункт пропал. Полоса живёт на хосте, а\n не внутри тела: тело обрезает всё по своему краю, и полоса обрывалась бы на верхнем\n отступе подвала — между ней и разделителем, который потребитель рисует первой строкой\n подвала, оставалась бы полоса чистого фона.\n -->\n @if (isScrollHintShown() && hasMoreBelow()) {\n <div rtElem=\"scroll-hint\" qa-dataid=\"scroll-area-scroll-hint\" [style.bottom.px]=\"hintBottom()\">\n <rt-icon\n rtElem=\"scroll-hint-icon\"\n qa-dataid=\"scroll-area-scroll-hint-icon\"\n name=\"chevron-down\"\n size=\"md\"\n role=\"button\"\n tabindex=\"0\"\n rtTooltipPlacement=\"top\"\n [rtTooltip]=\"t().uiScrollDown\"\n [attr.aria-label]=\"t().uiScrollDown\"\n (click)=\"onScrollHintClick($event)\"\n (keydown.enter)=\"onScrollHintClick($event)\" />\n </div>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
4
|
+
import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
|
|
5
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
6
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
7
|
+
|
|
8
|
+
const BEM_BLOCK = 'rt-section-nav';
|
|
9
|
+
class RtSectionNavComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.items = input([], /* @ts-ignore */
|
|
12
|
+
...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
13
|
+
this.itemSelect = output();
|
|
14
|
+
}
|
|
15
|
+
onSelect(item) {
|
|
16
|
+
if (item.active) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
this.itemSelect.emit(item.id);
|
|
20
|
+
}
|
|
21
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtSectionNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtSectionNavComponent, isStandalone: true, selector: "rt-section-nav", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect" }, host: { attributes: { "role": "navigation" }, classAttribute: "rt-section-nav" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-section-nav{--rt-section-nav-tile-radius: var(--rt-radius-xl);--rt-section-nav-tile-shadow: var(--rt-shadow-card-soft);--rt-section-nav-transition-duration: var(--rt-duration-fast);display:flex;gap:var(--rt-space-md)}.rt-section-nav__tile{display:flex;min-width:0;flex:1 0 0;flex-direction:column;align-items:center;justify-content:center;padding:var(--rt-space-md);border:0;border-radius:var(--rt-section-nav-tile-radius);background:transparent;box-shadow:none;color:var(--rt-color-text-primary);cursor:pointer;gap:var(--rt-space-2);transition:background var(--rt-section-nav-transition-duration) ease,box-shadow var(--rt-section-nav-transition-duration) ease}.rt-section-nav__tile:not(.rt-section-nav__tile--active):hover{background:var(--rt-color-bg-surface-subtle);box-shadow:var(--rt-section-nav-tile-shadow)}.rt-section-nav__tile--active{background:var(--rt-color-bg-surface);box-shadow:var(--rt-section-nav-tile-shadow);cursor:default}.rt-section-nav__icon{color:inherit}.rt-section-nav__label{color:inherit;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-bold);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-section-nav[data-rt-radius=none]{--rt-section-nav-tile-radius: var(--rt-radius-none)}.rt-section-nav[data-rt-radius=xs]{--rt-section-nav-tile-radius: var(--rt-radius-xs)}.rt-section-nav[data-rt-radius=sm]{--rt-section-nav-tile-radius: var(--rt-radius-sm)}.rt-section-nav[data-rt-radius=ms]{--rt-section-nav-tile-radius: var(--rt-radius-ms)}.rt-section-nav[data-rt-radius=md]{--rt-section-nav-tile-radius: var(--rt-radius-md)}.rt-section-nav[data-rt-radius=lg]{--rt-section-nav-tile-radius: var(--rt-radius-lg)}.rt-section-nav[data-rt-radius=xl]{--rt-section-nav-tile-radius: var(--rt-radius-xl)}.rt-section-nav[data-rt-radius=\"2xl\"]{--rt-section-nav-tile-radius: var(--rt-radius-2xl)}.rt-section-nav[data-rt-radius=full]{--rt-section-nav-tile-radius: var(--rt-radius-full)}[data-theme=dark] .rt-section-nav__tile--active{background:var(--rt-color-bg-nav)}}\n"], dependencies: [{ kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtSectionNavComponent, decorators: [{
|
|
25
|
+
type: Component,
|
|
26
|
+
args: [{ selector: 'rt-section-nav', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [RtIconComponent, BlockDirective, ElemDirective, ModDirective], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
27
|
+
class: BEM_BLOCK,
|
|
28
|
+
role: 'navigation',
|
|
29
|
+
}, template: "<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-section-nav{--rt-section-nav-tile-radius: var(--rt-radius-xl);--rt-section-nav-tile-shadow: var(--rt-shadow-card-soft);--rt-section-nav-transition-duration: var(--rt-duration-fast);display:flex;gap:var(--rt-space-md)}.rt-section-nav__tile{display:flex;min-width:0;flex:1 0 0;flex-direction:column;align-items:center;justify-content:center;padding:var(--rt-space-md);border:0;border-radius:var(--rt-section-nav-tile-radius);background:transparent;box-shadow:none;color:var(--rt-color-text-primary);cursor:pointer;gap:var(--rt-space-2);transition:background var(--rt-section-nav-transition-duration) ease,box-shadow var(--rt-section-nav-transition-duration) ease}.rt-section-nav__tile:not(.rt-section-nav__tile--active):hover{background:var(--rt-color-bg-surface-subtle);box-shadow:var(--rt-section-nav-tile-shadow)}.rt-section-nav__tile--active{background:var(--rt-color-bg-surface);box-shadow:var(--rt-section-nav-tile-shadow);cursor:default}.rt-section-nav__icon{color:inherit}.rt-section-nav__label{color:inherit;font-family:var(--rt-font-family-sans);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-bold);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}.rt-section-nav[data-rt-radius=none]{--rt-section-nav-tile-radius: var(--rt-radius-none)}.rt-section-nav[data-rt-radius=xs]{--rt-section-nav-tile-radius: var(--rt-radius-xs)}.rt-section-nav[data-rt-radius=sm]{--rt-section-nav-tile-radius: var(--rt-radius-sm)}.rt-section-nav[data-rt-radius=ms]{--rt-section-nav-tile-radius: var(--rt-radius-ms)}.rt-section-nav[data-rt-radius=md]{--rt-section-nav-tile-radius: var(--rt-radius-md)}.rt-section-nav[data-rt-radius=lg]{--rt-section-nav-tile-radius: var(--rt-radius-lg)}.rt-section-nav[data-rt-radius=xl]{--rt-section-nav-tile-radius: var(--rt-radius-xl)}.rt-section-nav[data-rt-radius=\"2xl\"]{--rt-section-nav-tile-radius: var(--rt-radius-2xl)}.rt-section-nav[data-rt-radius=full]{--rt-section-nav-tile-radius: var(--rt-radius-full)}[data-theme=dark] .rt-section-nav__tile--active{background:var(--rt-color-bg-nav)}}\n"] }]
|
|
30
|
+
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], itemSelect: [{ type: i0.Output, args: ["itemSelect"] }] } });
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Generated bundle index. Do not edit.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
export { RtSectionNavComponent };
|
|
37
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-section-nav.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-section-nav.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.ts","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-section-nav.component.html","../../../projects/ui-kit-v2/src/lib/components/section-nav/rt-tools-ui-kit-v2-section-nav.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, InputSignal, output, OutputEmitterRef, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { IRtSectionNav } from './rt-section-nav.model';\n\nconst BEM_BLOCK: string = 'rt-section-nav';\n\n@Component({\n selector: 'rt-section-nav',\n templateUrl: './rt-section-nav.component.html',\n styleUrls: ['./rt-section-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [RtIconComponent, BlockDirective, ElemDirective, ModDirective],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n role: 'navigation',\n },\n})\nexport class RtSectionNavComponent {\n public readonly items: InputSignal<readonly IRtSectionNav.Item[]> = input<readonly IRtSectionNav.Item[]>([]);\n\n public readonly itemSelect: OutputEmitterRef<string> = output<string>();\n\n protected onSelect(item: IRtSectionNav.Item): void {\n if (item.active) {\n return;\n }\n this.itemSelect.emit(item.id);\n }\n}\n","<ng-container rtBlock=\"rt-section-nav\">\n @for (item of items(); track item.id) {\n <button\n rtElem=\"tile\"\n qa-dataid=\"section-nav-tile\"\n type=\"button\"\n [attr.data-key]=\"item.id\"\n [attr.data-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'page' : null\"\n [rtMod]=\"{ active: item.active }\"\n (click)=\"onSelect(item)\">\n <rt-icon rtElem=\"icon\" size=\"lg\" [name]=\"item.icon\" />\n <span rtElem=\"label\">{{ item.label }}</span>\n </button>\n }\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAQA,MAAM,SAAS,GAAW,gBAAgB;MAe7B,qBAAqB,CAAA;AAblC,IAAA,WAAA,GAAA;QAcoB,IAAA,CAAA,KAAK,GAA+C,KAAK,CAAgC,EAAE;kFAAC;QAE5F,IAAA,CAAA,UAAU,GAA6B,MAAM,EAAU;AAQ1E,IAAA;AANa,IAAA,QAAQ,CAAC,IAAwB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACb;QACJ;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC;8GAVS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBlC,snBAgBA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAc,eAAe,0HAAE,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAO7D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAbjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,cAAA,EACvD,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,IAAI,EAAE,YAAY;AACrB,qBAAA,EAAA,QAAA,EAAA,snBAAA,EAAA,MAAA,EAAA,CAAA,mkEAAA,CAAA,EAAA;;;AErBL;;AAEG;;;;"}
|