@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 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-page-header.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.logic.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-page-header.component.html","../../../projects/ui-kit-v2/src/lib/components/page-header/rt-tools-ui-kit-v2-page-header.ts"],"sourcesContent":["import { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtPageHeader } from './rt-page-header.model';\n\n/** Чем пункт отрисуется: панелью, ссылкой или кнопкой. */\nexport enum ERtPageHeaderEntry {\n Panel = 'panel',\n Link = 'link',\n Button = 'button',\n}\n\nexport namespace IRtPageHeaderView {\n /** Пункт, готовый к отрисовке: форма решена заранее, шаблон её не выводит. */\n export interface Entry {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly route: string;\n readonly routerLinkActiveExact: boolean;\n readonly disabled: boolean;\n readonly unread: boolean;\n readonly kind: ERtPageHeaderEntry;\n }\n\n export interface Group {\n readonly id: string;\n readonly label: string;\n readonly icon: IRtIcon.Name | null;\n readonly items: ReadonlyArray<Entry>;\n }\n\n export interface Column {\n readonly id: string;\n readonly groups: ReadonlyArray<Group>;\n }\n\n export interface Section extends Entry {\n readonly columns: ReadonlyArray<Column>;\n readonly columnCount: number;\n /** Все пункты панели одним списком: подсветка раздела и сведение маркера. */\n readonly panelItems: ReadonlyArray<Entry>;\n /** Группы всех колонок подряд: на узком экране колонок нет, а группы есть. */\n readonly panelGroups: ReadonlyArray<Group>;\n }\n}\n\n/** Пункты панели одним списком — колонки и группы для этого раскрываются. */\nexport function panelItemsOf(item: IRtPageHeader.Item): ReadonlyArray<IRtPageHeader.Item> {\n return (item.columns ?? []).flatMap((column: IRtPageHeader.Column): ReadonlyArray<IRtPageHeader.Item> =>\n column.groups.flatMap((group: IRtPageHeader.Group): ReadonlyArray<IRtPageHeader.Item> => group.items)\n );\n}\n\n/**\n * Маркер раздела. Пункты панели свёрнуты, и непросмотренное внутри видно только\n * по точке у самого раздела.\n */\nexport function unreadOf(item: IRtPageHeader.Item): boolean {\n return item.unread === true || panelItemsOf(item).some((entry: IRtPageHeader.Item): boolean => entry.unread === true);\n}\n\nexport function entryKindOf(item: IRtPageHeader.Item): ERtPageHeaderEntry {\n if (panelItemsOf(item).length > 0) {\n return ERtPageHeaderEntry.Panel;\n }\n if ((item.route ?? '') !== '' && !item.disabled) {\n return ERtPageHeaderEntry.Link;\n }\n\n return ERtPageHeaderEntry.Button;\n}\n\nexport function toEntry(item: IRtPageHeader.Item): IRtPageHeaderView.Entry {\n return {\n id: item.id,\n label: item.label,\n icon: item.icon ?? null,\n route: item.route ?? '',\n routerLinkActiveExact: item.routerLinkActiveExact === true,\n disabled: item.disabled === true,\n unread: item.unread === true,\n kind: entryKindOf(item),\n };\n}\n\nfunction toGroup(group: IRtPageHeader.Group): IRtPageHeaderView.Group {\n return {\n id: group.id,\n label: group.label ?? '',\n icon: group.icon ?? null,\n items: group.items.map(toEntry),\n };\n}\n\nfunction toColumn(column: IRtPageHeader.Column): IRtPageHeaderView.Column {\n return {\n id: column.id,\n groups: column.groups.map(toGroup),\n };\n}\n\n/** Группы всех колонок одним списком — узкий экран раскладывает панель без колонок. */\nexport function panelGroupsOf(columns: ReadonlyArray<IRtPageHeaderView.Column>): ReadonlyArray<IRtPageHeaderView.Group> {\n return columns.flatMap((column: IRtPageHeaderView.Column): ReadonlyArray<IRtPageHeaderView.Group> => column.groups);\n}\n\n/** Разделы верхнего ряда вместе с раскладкой их панелей. */\nexport function toSections(items: ReadonlyArray<IRtPageHeader.Item>): ReadonlyArray<IRtPageHeaderView.Section> {\n return items.map((item: IRtPageHeader.Item): IRtPageHeaderView.Section => {\n const columns: ReadonlyArray<IRtPageHeaderView.Column> = (item.columns ?? []).map(toColumn);\n\n return {\n ...toEntry(item),\n unread: unreadOf(item),\n columns,\n columnCount: columns.length,\n panelItems: panelItemsOf(item).map(toEntry),\n panelGroups: panelGroupsOf(columns),\n };\n });\n}\n\n/** Адрес без строки запроса и якоря — подсветка считается по пути. */\nexport function pathOf(url: string): string {\n return url.split(/[?#]/)[0] ?? '';\n}\n\nexport function isEntryActive(entry: IRtPageHeaderView.Entry, path: string): boolean {\n if (entry.kind !== ERtPageHeaderEntry.Link) {\n return false;\n }\n\n return entry.routerLinkActiveExact ? path === entry.route : path.startsWith(entry.route);\n}\n\n/**\n * Разделы, у которых активен хоть один пункт панели. Обход идёт по раскрытому\n * списку пунктов: своего адреса у раздела с панелью нет, и подсветить его больше\n * нечем.\n */\n/**\n * Разделы для кругов сжатой полосы: первые `count` из тех, у кого есть иконка. Раздел без\n * иконки в круг не попадает — показать в нём нечего, и он остаётся под кнопкой «ещё».\n */\nexport function compactSectionsOf(\n sections: ReadonlyArray<IRtPageHeaderView.Section>,\n count: number\n): ReadonlyArray<IRtPageHeaderView.Section> {\n return sections.filter((section: IRtPageHeaderView.Section): boolean => section.icon !== null).slice(0, Math.max(0, count));\n}\n\n/**\n * Прилипла ли шапка: липкий узел стоит на пиксель выше края прокрутки и, прилипнув, теряет этот\n * пиксель из видимой области — наблюдатель пересечения отдаёт долю меньше единицы. Узел, ушедший\n * из области целиком, прилипшим не считается: его не видно вовсе.\n */\nexport function isStuck(intersectionRatio: number, isIntersecting: boolean): boolean {\n return isIntersecting && intersectionRatio < 1;\n}\n\nexport function activeSectionIds(sections: ReadonlyArray<IRtPageHeaderView.Section>, url: string): ReadonlySet<string> {\n const path: string = pathOf(url);\n const ids: Set<string> = new Set<string>();\n for (const section of sections) {\n if (section.panelItems.some((entry: IRtPageHeaderView.Entry): boolean => isEntryActive(entry, path))) {\n ids.add(section.id);\n }\n }\n\n return ids;\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Event as RouterEvent, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { filter, map } from 'rxjs';\n\nimport { BlockDirective, ElemDirective, ModDirective, WINDOW } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, RT_KIT_TRANSLATOR, RtKitLabelPipe, TRtKitLabelMap, TRtKitTranslator, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { activeSectionIds, compactSectionsOf, ERtPageHeaderEntry, IRtPageHeaderView, isStuck, toSections } from './rt-page-header.logic';\nimport { IRtPageHeader } from './rt-page-header.model';\n\nconst BEM_BLOCK: string = 'rt-page-header';\n\n/**\n * Верхняя горизонтальная плашка-навигация для первого уровня доменных страниц.\n *\n * Контракт:\n * - `items` — `Item[]`. Анкор для пунктов с `route`; `<button>` для недоступных\n * и для тех, кто обрабатывается снаружи (`itemClick`). Пункт с `columns` —\n * кнопка-триггер: панель второго уровня открывается наведением ([rtPopover]).\n * - `user` — необязательный блок справа. Если задан `userMenu` (TemplateRef) —\n * блок становится hover-триггером попапа с этим контентом (клик — touch-fallback,\n * панель прижата к правому краю); иначе по клику emit'ит `userClick`.\n *\n * Active state — через `RouterLinkActive` с классом `rt-page-header__link--is-active`;\n * для раздела с панелью — вычисляется по текущему URL (своего route у него нет).\n */\n@Component({\n selector: 'rt-page-header',\n templateUrl: './rt-page-header.component.html',\n // Панель второго уровня и панель узкого экрана рисуются в CDK Overlay, вне\n // хоста, поэтому это отдельные корневые блоки — и отдельные файлы: бюджет\n // стилей компонента считается на каждый файл, и одним они его перебирают.\n styleUrls: [\n './rt-page-header.component.scss',\n './rt-page-header-submenu.scss',\n './rt-page-header-mobile.scss',\n './rt-page-header-compact.scss',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtKitLabelPipe,\n // Angular\n RouterLink,\n RouterLinkActive,\n\n // standalone components / directives\n RtIconComponent,\n RtPopoverDirective,\n RtTooltipDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-page-header--sticky]': 'stickyCompact()',\n '[class.rt-page-header--is-compact]': 'compact()',\n },\n})\nexport class RtPageHeaderComponent {\n readonly #router: Router = inject(Router);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n readonly #host: ElementRef<HTMLElement> = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // Конструктор наблюдателя пересечения объявлен на globalThis, а не на интерфейсе Window —\n // токен отдаёт тот же объект, тип лишь уточняется.\n readonly #window: Window & typeof globalThis = inject(WINDOW) as Window & typeof globalThis;\n\n /**\n * Прилипла ли шапка к краю прокрутки. Считается наблюдателем пересечения, а не смещением\n * окна: страница у потребителя прокручивается и внутри контейнера, и окно об этом не знает.\n */\n readonly #stuck: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly #t_uiMainNav: Signal<string> = rtKitLabel('uiMainNav');\n\n /* Реактивный URL для подсветки раздела: у раздела с панелью нет своего\n route, поэтому RouterLinkActive не применим — сравниваем по факту навигации. */\n readonly #currentUrl: Signal<string> = toSignal(\n this.#router.events.pipe(\n filter((e: RouterEvent): e is NavigationEnd => e instanceof NavigationEnd),\n map((): string => this.#router.url)\n ),\n { initialValue: this.#router.url }\n );\n\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #translate: Signal<TRtKitTranslator> = inject(RT_KIT_TRANSLATOR);\n\n /** Переводчик для чистого пайпа подписи: шаблон отдаёт его вторым доводом. */\n protected readonly translate: Signal<TRtKitTranslator> = this.#translate;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly mobileNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('mobileNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Кнопка «ещё» сжатой полосы открывает ту же панель, что и бургер, своим поповером. */\n protected readonly compactNavPopoverRef: Signal<RtPopoverDirective | undefined> = viewChild('compactNavPopover', {\n read: RtPopoverDirective,\n });\n\n /** Сжатое состояние: шапка липкая и прилипла к верху. */\n protected readonly compact: Signal<boolean> = computed((): boolean => this.stickyCompact() && this.#stuck());\n\n /** Разделы в кругах сжатой полосы: первые с иконкой, число — по входу. */\n protected readonly compactSections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed(\n (): ReadonlyArray<IRtPageHeaderView.Section> => compactSectionsOf(this.sections(), this.compactVisibleCount())\n );\n\n /** Форма пункта решается один раз здесь, а не ветвлениями в шаблоне. */\n protected readonly sections: Signal<ReadonlyArray<IRtPageHeaderView.Section>> = computed((): ReadonlyArray<IRtPageHeaderView.Section> =>\n toSections(this.items())\n );\n\n /**\n * id разделов с активным вложенным адресом — для O(1) lookup в шаблоне.\n * Зависит от #currentUrl + items (сигналы) → подсветка реактивна на навигацию.\n */\n protected readonly activeSectionIds: Signal<ReadonlySet<string>> = computed((): ReadonlySet<string> =>\n activeSectionIds(this.sections(), this.#currentUrl())\n );\n\n protected readonly userAvatar: Signal<string> = computed((): string => {\n const u: IRtPageHeader.User | null = this.user();\n if (!u) {\n return '';\n }\n if (u.avatar && u.avatar.length > 0) {\n return u.avatar.charAt(0).toUpperCase();\n }\n return u.name.charAt(0).toUpperCase();\n });\n\n /** Узкий вьюпорт (≤1080px): инлайн-навигация прячется, показывается гамбургер. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /**\n * id раскрытых разделов-аккордеонов в мобильной панели. Ключ — только раздел:\n * группы внутри раскрытого раздела показаны сразу, и совпасть идентификаторам\n * раздела и группы в этом множестве негде.\n */\n protected readonly expandedSectionIds: WritableSignal<ReadonlySet<string>> = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly EntryKind: typeof ERtPageHeaderEntry = ERtPageHeaderEntry;\n\n public readonly items: InputSignal<ReadonlyArray<IRtPageHeader.Item>> = input<ReadonlyArray<IRtPageHeader.Item>>([]);\n\n public readonly user: InputSignal<IRtPageHeader.User | null> = input<IRtPageHeader.User | null>(null);\n\n public readonly userTitle: InputSignal<string> = input<string>('');\n\n public readonly userMenu: InputSignal<TemplateRef<unknown> | null> = input<TemplateRef<unknown> | null>(null);\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly ariaLabel: InputSignal<string> = input<string>('');\n\n /**\n * Шапка липнет к верху окна и, прилипнув, сжимается в полосу: круги первых разделов,\n * кнопка «ещё» и три слота потребителя. Выключено — поведение прежнее.\n */\n public readonly stickyCompact: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Сколько разделов с иконкой показывать кругами в сжатой полосе; остальные — под «ещё». */\n public readonly compactVisibleCount: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(2, {\n transform: numberAttribute,\n });\n\n /** Своё имя навигации важнее умолчания */\n public readonly navAriaLabel: Signal<string> = computed((): string => this.ariaLabel() || this.#t_uiMainNav());\n\n public readonly itemClick: OutputEmitterRef<string> = output<string>();\n\n public readonly userClick: OutputEmitterRef<void> = output<void>();\n\n constructor() {\n // Ресайз обратно в десктоп — гамбургер скрывается CSS'ом; открытую\n // мобильную панель закрываем, иначе overlay зависнет без якоря.\n effect((): void => {\n if (!this.isNarrow()) {\n this.mobileNavPopoverRef()?.close();\n }\n });\n\n afterNextRender((): void => this.#observeStuck());\n }\n\n /**\n * Липкая шапка стоит на пиксель выше края прокрутки и, прилипнув, теряет его из видимой\n * области: наблюдатель пересечения с порогом в единицу ловит ровно этот момент — и в окне,\n * и внутри прокручиваемого контейнера, о котором окно не знает.\n */\n #observeStuck(): void {\n const observer: IntersectionObserver = new this.#window.IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const entry: IntersectionObserverEntry | undefined = entries.at(-1);\n if (entry !== undefined) {\n this.#stuck.set(isStuck(entry.intersectionRatio, entry.isIntersecting));\n }\n },\n { threshold: [0, 1] }\n );\n observer.observe(this.#host.nativeElement);\n this.#destroyRef.onDestroy((): void => observer.disconnect());\n }\n\n /** Панель разделов открывают и бургер, и кнопка «ещё»: закрываются обе. */\n protected closeNavPanels(): void {\n this.mobileNavPopoverRef()?.close();\n this.compactNavPopoverRef()?.close();\n }\n\n /** Круг раздела без адреса: раздел с панелью открывает общую панель, прочий — сообщает наружу. */\n protected onCompactSectionClick(section: IRtPageHeaderView.Section): void {\n if (section.kind === ERtPageHeaderEntry.Panel) {\n this.compactNavPopoverRef()?.open();\n return;\n }\n this.itemClick.emit(section.id);\n }\n\n protected onItemClick(id: string): void {\n this.itemClick.emit(id);\n }\n\n protected onUserClick(): void {\n this.userClick.emit();\n }\n\n /** Аккордеон мобильной панели: тумблер раскрытия раздела по его id. */\n protected toggleSection(id: string): void {\n this.expandedSectionIds.update((prev: ReadonlySet<string>): ReadonlySet<string> => {\n const next: Set<string> = new Set<string>(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }\n\n /** Клик по плоскому пункту мобильной панели: emit + закрыть панель. */\n protected onMobileItemClick(id: string): void {\n this.itemClick.emit(id);\n this.closeNavPanels();\n }\n}\n","<ng-container rtBlock=\"rt-page-header\">\n <nav rtElem=\"nav\" [attr.aria-label]=\"navAriaLabel()\">\n <ul rtElem=\"list\" role=\"list\">\n @for (section of sections(); track section.id) {\n <li rtElem=\"item\" qa-dataid=\"header-nav-item\" [attr.data-id]=\"section.id\">\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"link\"\n type=\"button\"\n qa-dataid=\"header-nav-trigger\"\n #groupPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{\n isActive: activeSectionIds().has(section.id),\n isOpen: groupPopover.isOpen(),\n }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"groupPopover.isOpen()\"\n [rtPopover]=\"submenuTpl\"\n (click)=\"groupPopover.open()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n <ng-template #submenuTpl>\n <div rtBlock=\"rt-page-header-submenu\" role=\"menu\" [style.--rt-nav-panel-columns]=\"section.columnCount\">\n @for (column of section.columns; track column.id) {\n <div rtElem=\"column\" qa-dataid=\"header-nav-column\" [attr.data-id]=\"column.id\">\n @for (group of column.groups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-subitem\"\n routerLinkActive=\"rt-page-header-submenu__link--is-active\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"groupPopover.close()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"\n 'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\n \">\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n role=\"menuitem\"\n type=\"button\"\n qa-dataid=\"header-nav-subitem\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n routerLinkActive=\"rt-page-header__link--is-active\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button rtElem=\"link\" type=\"button\" [rtMod]=\"{ disabled: true }\" [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button rtElem=\"link\" type=\"button\" (click)=\"onItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n </li>\n }\n </ul>\n </nav>\n\n <button\n rtElem=\"burger\"\n type=\"button\"\n qa-dataid=\"header-nav-burger\"\n #mobileNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"14\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [rtMod]=\"{ isOpen: mobileNavPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"mobileNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon rtElem=\"burger-icon\" name=\"bars\" size=\"md\" />\n </button>\n\n <!--\n Сжатая полоса стоит в разметке всегда, как и узкая: показывает её модификатор хоста.\n Слева стопка кругов — «ещё» поверх остальных, — дальше три слота потребителя.\n -->\n <div rtElem=\"compact\" qa-dataid=\"header-compact\">\n <div rtElem=\"compact-stack\">\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-more\"\n #compactNavPopover=\"rtPopover\"\n rtPopoverFitViewport\n rtPopoverOffsetY=\"10\"\n [rtMod]=\"{ more: true, isOpen: compactNavPopover.isOpen() }\"\n [attr.aria-label]=\"t().uiNavMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"compactNavPopover.isOpen()\"\n [rtPopover]=\"mobileNavTpl\">\n <rt-icon name=\"ellipsis-h\" size=\"sm\" />\n </button>\n @for (section of compactSections(); track section.id; let index = $index) {\n @if (section.kind === EntryKind.Link) {\n <a\n rtElem=\"compact-circle\"\n qa-dataid=\"header-compact-section\"\n routerLinkActive=\"rt-page-header__compact-circle--is-active\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n [rtTooltip]=\"section.label\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else {\n <button\n rtElem=\"compact-circle\"\n type=\"button\"\n qa-dataid=\"header-compact-section\"\n [rtMod]=\"{ isActive: activeSectionIds().has(section.id), disabled: section.disabled }\"\n [style.--rt-nav-compact-index]=\"index + 1\"\n [disabled]=\"section.disabled\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"section.label\"\n [rtTooltip]=\"section.label\"\n (click)=\"onCompactSectionClick(section)\">\n @if (section.icon; as icon) {\n <rt-icon size=\"sm\" [name]=\"icon\" />\n }\n @if (section.unread) {\n <span rtElem=\"compact-marker\" role=\"img\" [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ left: true }\"><ng-content select=\"[rtCompactLeft]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ center: true }\"><ng-content select=\"[rtCompactCenter]\" /></div>\n <div rtElem=\"compact-slot\" [rtMod]=\"{ right: true }\"><ng-content select=\"[rtCompactRight]\" /></div>\n </div>\n\n <ng-template #mobileNavTpl>\n <div rtBlock=\"rt-page-header-mobile\" role=\"menu\">\n @for (section of sections(); track section.id) {\n @switch (section.kind) {\n @case (EntryKind.Panel) {\n <button\n rtElem=\"section\"\n type=\"button\"\n qa-dataid=\"header-nav-mobile-trigger\"\n [rtMod]=\"{\n isExpanded: expandedSectionIds().has(section.id),\n isActive: activeSectionIds().has(section.id),\n }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-expanded]=\"expandedSectionIds().has(section.id)\"\n (click)=\"toggleSection(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n <span rtElem=\"caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n @if (expandedSectionIds().has(section.id)) {\n <div rtElem=\"children\">\n @for (group of section.panelGroups; track group.id) {\n <div rtElem=\"group\" role=\"group\" [attr.aria-label]=\"group.label || null\">\n @if (group.label) {\n <div rtElem=\"group-title\" qa-dataid=\"header-nav-mobile-group\" [attr.data-id]=\"group.id\">\n @if (group.icon) {\n <rt-icon rtElem=\"group-icon\" size=\"xs\" [name]=\"group.icon\" />\n }\n <span rtElem=\"group-label\">{{ group.label }}</span>\n </div>\n }\n @for (entry of group.items; track entry.id) {\n @if (entry.kind === EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n [routerLink]=\"entry.route\"\n [routerLinkActiveOptions]=\"{ exact: entry.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n } @else if (entry.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: entry.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true, disabled: true }\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-disabled]=\"true\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ child: true }\"\n [attr.data-id]=\"entry.id\"\n (click)=\"onMobileItemClick(entry.id)\">\n <span rtElem=\"label\">{{ entry.label }}</span>\n @if (entry.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"entry.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n </div>\n }\n </div>\n }\n }\n @case (EntryKind.Link) {\n <a\n rtElem=\"link\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n routerLinkActive=\"rt-page-header-mobile__link--is-active\"\n [attr.data-id]=\"section.id\"\n [routerLink]=\"section.route\"\n [routerLinkActiveOptions]=\"{ exact: section.routerLinkActiveExact }\"\n (click)=\"closeNavPanels()\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </a>\n }\n @default {\n @if (section.disabled) {\n <span\n rtElem=\"disabled-slot\"\n role=\"none\"\n [rtTooltip]=\"'uiSectionInProgress' | rtKitLabel: translate() : { label: section.label }\">\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [rtMod]=\"{ disabled: true }\"\n [attr.data-id]=\"section.id\"\n [attr.aria-disabled]=\"true\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n </button>\n </span>\n } @else {\n <button\n rtElem=\"link\"\n type=\"button\"\n role=\"menuitem\"\n qa-dataid=\"header-nav-mobile-item\"\n [attr.data-id]=\"section.id\"\n (click)=\"onMobileItemClick(section.id)\">\n @if (section.icon) {\n <rt-icon rtElem=\"icon\" size=\"sm\" [name]=\"section.icon\" />\n }\n <span rtElem=\"label\">{{ section.label }}</span>\n @if (section.unread) {\n <span\n rtElem=\"marker\"\n role=\"img\"\n qa-dataid=\"header-nav-marker\"\n [attr.data-id]=\"section.id\"\n [attr.aria-label]=\"t().uiNavUnread\"></span>\n }\n </button>\n }\n }\n }\n }\n </div>\n </ng-template>\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n @if (user(); as u) {\n @if (userMenu(); as menuTpl) {\n <!--\n Меню профиля открывается наведением, как и разделы: весь верхний\n ряд ведёт себя одинаково. Нажатие остаётся запасным путём для\n касания, а переход курсора на список языков панель переживает —\n вложенный оверлей за уход наружу не считается.\n -->\n <button\n rtElem=\"user\"\n type=\"button\"\n qa-dataid=\"header-user-menu\"\n #userPopover=\"rtPopover\"\n rtPopoverTrigger=\"hover\"\n rtPopoverAlign=\"end\"\n rtPopoverOffsetY=\"14\"\n [rtMod]=\"{ isOpen: userPopover.isOpen() }\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"userPopover.isOpen()\"\n [rtPopover]=\"menuTpl\"\n (click)=\"userPopover.open()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n } @else {\n <button rtElem=\"user\" type=\"button\" (click)=\"onUserClick()\">\n <span rtElem=\"user-avatar\" aria-hidden=\"true\">{{ userAvatar() }}</span>\n <span rtElem=\"user-name\" qa-dataid=\"header-user-name\">{{ u.name }}</span>\n <span rtElem=\"user-caret\" aria-hidden=\"true\">\n <rt-icon name=\"chevron-up-down\" size=\"xs\" />\n </span>\n </button>\n }\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,187 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, computed, input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/forms';
|
|
4
|
+
import { FormsModule } from '@angular/forms';
|
|
5
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
6
|
+
import { RT_KIT_LABELS, rtKitLabel } from '@rt-tools/ui-kit-v2/core';
|
|
7
|
+
import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
|
|
8
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
9
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
10
|
+
import { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';
|
|
11
|
+
|
|
12
|
+
/** Сколько всего страниц. Пустой список — одна страница, листать нечего. */
|
|
13
|
+
function lastPageOf(page) {
|
|
14
|
+
if (page.pageSize <= 0) {
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
return Math.max(1, Math.ceil(page.totalCount / page.pageSize));
|
|
18
|
+
}
|
|
19
|
+
/** Номер первой записи открытой страницы. */
|
|
20
|
+
function rangeFromOf(page) {
|
|
21
|
+
return (page.pageNumber - 1) * page.pageSize + 1;
|
|
22
|
+
}
|
|
23
|
+
/** Номер последней записи открытой страницы — на последней странице она короче. */
|
|
24
|
+
function rangeToOf(page) {
|
|
25
|
+
return Math.min(page.pageNumber * page.pageSize, page.totalCount);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Полоса номеров страниц с разрывами «…»: первая, последняя и соседи открытой.
|
|
29
|
+
* Пуста при единственной странице — показывать нечего.
|
|
30
|
+
*/
|
|
31
|
+
function pageItemsOf(page, neighbours) {
|
|
32
|
+
const lastPage = lastPageOf(page);
|
|
33
|
+
if (lastPage <= 1) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const items = [];
|
|
37
|
+
let previous = 0;
|
|
38
|
+
for (let candidate = 1; candidate <= lastPage; candidate++) {
|
|
39
|
+
const isEdge = candidate === 1 || candidate === lastPage;
|
|
40
|
+
const isNeighbour = candidate >= page.pageNumber - neighbours && candidate <= page.pageNumber + neighbours;
|
|
41
|
+
if (!isEdge && !isNeighbour) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (previous && candidate - previous > 1) {
|
|
45
|
+
items.push('gap');
|
|
46
|
+
}
|
|
47
|
+
items.push(candidate);
|
|
48
|
+
previous = candidate;
|
|
49
|
+
}
|
|
50
|
+
return items;
|
|
51
|
+
}
|
|
52
|
+
/** Номера с `from` по `to` включительно. */
|
|
53
|
+
function pagesBetween(from, to) {
|
|
54
|
+
return Array.from({ length: to - from + 1 }, (_value, index) => from + index);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Полоса номеров первого кита — семь мест: до шести страниц видны все, дальше края по три
|
|
58
|
+
* (`1 2 3 … 11 12 13`) или первая, соседи открытой и последняя (`1 … 6 7 8 … 13`); у края разрыв
|
|
59
|
+
* съезжает на одно место за открытой страницей. Одна страница — один номер.
|
|
60
|
+
*/
|
|
61
|
+
function pageSlotsOf(page) {
|
|
62
|
+
const lastPage = lastPageOf(page);
|
|
63
|
+
const current = page.pageNumber;
|
|
64
|
+
if (lastPage <= 6) {
|
|
65
|
+
return pagesBetween(1, lastPage);
|
|
66
|
+
}
|
|
67
|
+
if (current < 3 || current > lastPage - 2) {
|
|
68
|
+
return [...pagesBetween(1, 3), 'gap', ...pagesBetween(lastPage - 2, lastPage)];
|
|
69
|
+
}
|
|
70
|
+
if (current === 3) {
|
|
71
|
+
return [...pagesBetween(1, 4), 'gap', ...pagesBetween(lastPage - 1, lastPage)];
|
|
72
|
+
}
|
|
73
|
+
if (current === 4) {
|
|
74
|
+
return [...pagesBetween(1, 5), 'gap', lastPage];
|
|
75
|
+
}
|
|
76
|
+
if (current <= lastPage - 4) {
|
|
77
|
+
return [1, 'gap', current - 1, current, current + 1, 'gap', lastPage];
|
|
78
|
+
}
|
|
79
|
+
if (current === lastPage - 3) {
|
|
80
|
+
return [1, 'gap', ...pagesBetween(lastPage - 4, lastPage)];
|
|
81
|
+
}
|
|
82
|
+
return [1, 2, 'gap', ...pagesBetween(lastPage - 3, lastPage)];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const BEM_BLOCK = 'rt-pagination';
|
|
86
|
+
const NEIGHBOURS = 1; // соседей вокруг открытой страницы
|
|
87
|
+
class RtPaginationComponent {
|
|
88
|
+
constructor() {
|
|
89
|
+
this.t = inject(RT_KIT_LABELS);
|
|
90
|
+
this.perPageSelectOptions = computed(() => this.perPageOptions().map((n) => ({ label: String(n), value: n })), /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "perPageSelectOptions" }] : /* istanbul ignore next */ []));
|
|
92
|
+
/**
|
|
93
|
+
* Диапазон записей и номер страницы — с подстановками, поэтому карте подписей
|
|
94
|
+
* они не годятся: числа приходят из модели страницы.
|
|
95
|
+
*/
|
|
96
|
+
this.rangeLabel = rtKitLabel('uiRangeOf', computed(() => ({ from: this.rangeFrom(), to: this.rangeTo(), total: this.pageModel().totalCount })));
|
|
97
|
+
this.pageLabel = rtKitLabel('uiPageOf', computed(() => ({ page: this.pageModel().pageNumber, last: this.lastPage() })));
|
|
98
|
+
this.isFirst = computed(() => this.pageModel().pageNumber <= 1, /* @ts-ignore */
|
|
99
|
+
...(ngDevMode ? [{ debugName: "isFirst" }] : /* istanbul ignore next */ []));
|
|
100
|
+
this.isLast = computed(() => this.pageModel().pageNumber >= this.lastPage(), /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "isLast" }] : /* istanbul ignore next */ []));
|
|
102
|
+
this.pageModel = input.required(/* @ts-ignore */
|
|
103
|
+
...(ngDevMode ? [{ debugName: "pageModel" }] : /* istanbul ignore next */ []));
|
|
104
|
+
this.perPageOptions = input([20, 50, 100], /* @ts-ignore */
|
|
105
|
+
...(ngDevMode ? [{ debugName: "perPageOptions" }] : /* istanbul ignore next */ []));
|
|
106
|
+
/** Значок стрелки «назад»: вид первого кита рисует стрелку, а не шеврон. */
|
|
107
|
+
this.prevIcon = input('chevron-left', /* @ts-ignore */
|
|
108
|
+
...(ngDevMode ? [{ debugName: "prevIcon" }] : /* istanbul ignore next */ []));
|
|
109
|
+
/** Значок стрелки «вперёд». */
|
|
110
|
+
this.nextIcon = input('chevron-right', /* @ts-ignore */
|
|
111
|
+
...(ngDevMode ? [{ debugName: "nextIcon" }] : /* istanbul ignore next */ []));
|
|
112
|
+
/** Счёт номеров: список под материальным набором просит семь мест первого кита. */
|
|
113
|
+
this.numbering = input('neighbours', /* @ts-ignore */
|
|
114
|
+
...(ngDevMode ? [{ debugName: "numbering" }] : /* istanbul ignore next */ []));
|
|
115
|
+
this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
116
|
+
this.pageChange = output();
|
|
117
|
+
this.perPageChange = output();
|
|
118
|
+
/**
|
|
119
|
+
* Пагинацию показываем, только когда есть что листать/менять: всё не влезает
|
|
120
|
+
* на одну страницу даже при минимальной опции размера (`total > наименьший
|
|
121
|
+
* perPageOption`). Иначе и навигация, и селектор размера бесполезны — прячем
|
|
122
|
+
* весь бар (включая пустой и пустой-по-фильтру список).
|
|
123
|
+
*/
|
|
124
|
+
this.isVisible = computed(() => {
|
|
125
|
+
const options = this.perPageOptions();
|
|
126
|
+
const smallest = options.length > 0 ? Math.min(...options) : 0;
|
|
127
|
+
return this.pageModel().totalCount > smallest;
|
|
128
|
+
}, /* @ts-ignore */
|
|
129
|
+
...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
|
|
130
|
+
/** Сколько всего страниц при нынешнем размере страницы. */
|
|
131
|
+
this.lastPage = computed(() => lastPageOf(this.pageModel()), /* @ts-ignore */
|
|
132
|
+
...(ngDevMode ? [{ debugName: "lastPage" }] : /* istanbul ignore next */ []));
|
|
133
|
+
/**
|
|
134
|
+
* Границы диапазона записей открытой страницы. Собираются числами, а сама
|
|
135
|
+
* подпись — в шаблоне: только там подстановка проходит через словарь и
|
|
136
|
+
* переживает смену языка.
|
|
137
|
+
*/
|
|
138
|
+
this.rangeFrom = computed(() => rangeFromOf(this.pageModel()), /* @ts-ignore */
|
|
139
|
+
...(ngDevMode ? [{ debugName: "rangeFrom" }] : /* istanbul ignore next */ []));
|
|
140
|
+
this.rangeTo = computed(() => rangeToOf(this.pageModel()), /* @ts-ignore */
|
|
141
|
+
...(ngDevMode ? [{ debugName: "rangeTo" }] : /* istanbul ignore next */ []));
|
|
142
|
+
/** Полоса номеров страниц с разрывами «…». По соседям пуста при единственной странице. */
|
|
143
|
+
this.pageItems = computed(() => this.numbering() === 'seven' ? pageSlotsOf(this.pageModel()) : pageItemsOf(this.pageModel(), NEIGHBOURS), /* @ts-ignore */
|
|
144
|
+
...(ngDevMode ? [{ debugName: "pageItems" }] : /* istanbul ignore next */ []));
|
|
145
|
+
}
|
|
146
|
+
goTo(pageNumber) {
|
|
147
|
+
if (this.loading() || pageNumber === this.pageModel().pageNumber || pageNumber < 1 || pageNumber > this.lastPage()) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
this.pageChange.emit(pageNumber);
|
|
151
|
+
}
|
|
152
|
+
onPerPage(value) {
|
|
153
|
+
if (value === null || this.loading() || value === this.pageModel().pageSize) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
this.perPageChange.emit(value);
|
|
157
|
+
}
|
|
158
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
159
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtPaginationComponent, isStandalone: true, selector: "rt-pagination", inputs: { pageModel: { classPropertyName: "pageModel", publicName: "pageModel", isSignal: true, isRequired: true, transformFunction: null }, perPageOptions: { classPropertyName: "perPageOptions", publicName: "perPageOptions", isSignal: true, isRequired: false, transformFunction: null }, prevIcon: { classPropertyName: "prevIcon", publicName: "prevIcon", isSignal: true, isRequired: false, transformFunction: null }, nextIcon: { classPropertyName: "nextIcon", publicName: "nextIcon", isSignal: true, isRequired: false, transformFunction: null }, numbering: { classPropertyName: "numbering", publicName: "numbering", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", perPageChange: "perPageChange" }, host: { properties: { "style.display": "isVisible() ? null : 'none'" }, classAttribute: "rt-pagination" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-pagination\">\n <!--\n \u0412\u0435\u0442\u043A\u0438 \u00AB\u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E\u00BB \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0442 \u043D\u0430\u043C\u0435\u0440\u0435\u043D\u043D\u043E: \u043F\u0443\u0441\u0442\u043E\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u0440\u044F\u0447\u0435\u0442 \u0432\u0435\u0441\u044C\n \u0431\u0430\u0440 \u0446\u0435\u043B\u0438\u043A\u043E\u043C (`isVisible`), \u0442\u0430\u043A \u0447\u0442\u043E \u0434\u043E \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u0435\u043B\u043E \u043D\u0435 \u0434\u043E\u0445\u043E\u0434\u0438\u0442. \u041F\u043E\u043A\u0430\n \u0442\u0430\u043A\u0430\u044F \u0432\u0435\u0442\u043A\u0430 \u0442\u0443\u0442 \u0432\u0438\u0441\u0435\u043B\u0430, \u043E\u043D\u0430 \u0447\u0438\u0442\u0430\u043B\u0430\u0441\u044C \u043A\u0430\u043A \u0440\u0430\u0431\u043E\u0447\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u0430 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C\n \u0435\u0451 \u0431\u044B\u043B\u043E \u043D\u0435\u043B\u044C\u0437\u044F \u043D\u0438 \u043F\u0440\u0438 \u043A\u0430\u043A\u0438\u0445 \u0432\u0445\u043E\u0434\u0430\u0445.\n -->\n <span rtElem=\"range\" qa-dataid=\"pagination-range\">\n {{ rangeLabel() }}\n </span>\n\n @if (pageItems().length) {\n <nav rtElem=\"compact\" qa-dataid=\"pagination-compact\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-compact-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n <span rtElem=\"compact-label\" qa-dataid=\"pagination-compact-label\">\n {{ pageLabel() }}\n </span>\n\n <rt-icon-button\n qa-dataid=\"pagination-compact-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n\n <nav rtElem=\"nav\" qa-dataid=\"pagination-nav\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n @for (item of pageItems(); track $index) {\n @if (item === 'gap') {\n <span rtElem=\"gap\" aria-hidden=\"true\">\u2026</span>\n } @else {\n <button\n rtElem=\"page\"\n qa-dataid=\"pagination-page\"\n type=\"button\"\n [attr.data-page]=\"item\"\n [rtMod]=\"{ current: item === pageModel().pageNumber }\"\n [attr.aria-current]=\"item === pageModel().pageNumber ? 'page' : null\"\n [disabled]=\"loading()\"\n (click)=\"goTo(item)\">\n {{ item }}\n </button>\n }\n }\n\n <rt-icon-button\n qa-dataid=\"pagination-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n }\n\n <div rtElem=\"per-page\">\n <span rtElem=\"per-page-label\">{{ t().uiPerPage }}</span>\n <rt-select\n qa-dataid=\"pagination-per-page\"\n [ariaLabel]=\"t().uiItemsPerPage\"\n [options]=\"perPageSelectOptions()\"\n [clearable]=\"false\"\n [ngModel]=\"pageModel().pageSize\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onPerPage($event)\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-pagination{--rt-pagination-page-radius: var(--rt-pagination-box-radius);--rt-pagination-page-border-width: var(--rt-border-width-thin);--rt-pagination-focus-shadow: var(--rt-shadow-focus-ring);--rt-pagination-transition-duration: var(--rt-duration-fast);display:flex;align-items:center;justify-content:var(--rt-pagination-justify);padding:var(--rt-pagination-padding-y) var(--rt-pagination-padding-x);container-type:inline-size;gap:var(--rt-pagination-gap)}.rt-pagination rt-icon-button{--rt-icon-button-color: var(--rt-pagination-arrow-color)}.rt-pagination .rt-icon-button{--rt-icon-button-size-step: var(--rt-pagination-arrow-size);--rt-icon-button-radius: var(--rt-pagination-arrow-radius);--rt-icon-button-shadow: var(--rt-pagination-arrow-shadow)}.rt-pagination__range{display:var(--rt-pagination-range-display);color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);white-space:nowrap}.rt-pagination__nav{display:flex;align-items:center;gap:var(--rt-pagination-nav-gap)}.rt-pagination__compact{display:none;align-items:center;gap:var(--rt-space-xs)}.rt-pagination__compact-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);white-space:nowrap}.rt-pagination__page{min-width:var(--rt-pagination-box-size);height:var(--rt-pagination-box-size);padding:0 var(--rt-space-sm);border:var(--rt-pagination-page-border-width) solid var(--rt-pagination-box-color-border);border-radius:var(--rt-pagination-page-radius);background:transparent;color:var(--rt-pagination-box-color-text);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);transition:background-color var(--rt-pagination-transition-duration) ease,border-color var(--rt-pagination-transition-duration) ease,color var(--rt-pagination-transition-duration) ease}.rt-pagination__page:hover:not(:disabled,.rt-pagination__page--current){border-color:var(--rt-color-border-strong);background:var(--rt-color-bg-surface-subtle)}.rt-pagination__page:focus-visible{box-shadow:var(--rt-pagination-focus-shadow);outline:2px solid transparent;outline-offset:2px}.rt-pagination__page--current{border-color:var(--rt-pagination-box-current-color-border);background:var(--rt-pagination-box-current-color-bg);color:var(--rt-pagination-box-current-color-text);font-weight:var(--rt-pagination-box-current-font-weight)}.rt-pagination__page:disabled{cursor:default;opacity:.6}.rt-pagination__gap{padding:0 var(--rt-space-xs);color:var(--rt-color-text-muted)}.rt-pagination__per-page{--rt-input-height: var(--rt-pagination-field-height);--rt-input-radius: var(--rt-pagination-field-radius);--rt-input-color-border: var(--rt-pagination-field-color-border);--rt-input-padding-x: var(--rt-pagination-field-padding-x);--rt-input-color-bg: var(--rt-pagination-field-color-bg);--rt-input-color-text: var(--rt-pagination-field-color-text);display:flex;align-items:center;gap:var(--rt-pagination-per-page-gap)}.rt-pagination__per-page-label{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);white-space:var(--rt-pagination-per-page-label-white-space)}.rt-pagination[data-rt-radius=none]{--rt-pagination-page-radius: var(--rt-radius-none)}.rt-pagination[data-rt-radius=xs]{--rt-pagination-page-radius: var(--rt-radius-xs)}.rt-pagination[data-rt-radius=sm]{--rt-pagination-page-radius: var(--rt-radius-sm)}.rt-pagination[data-rt-radius=ms]{--rt-pagination-page-radius: var(--rt-radius-ms)}.rt-pagination[data-rt-radius=md]{--rt-pagination-page-radius: var(--rt-radius-md)}.rt-pagination[data-rt-radius=lg]{--rt-pagination-page-radius: var(--rt-radius-lg)}.rt-pagination[data-rt-radius=xl]{--rt-pagination-page-radius: var(--rt-radius-xl)}.rt-pagination[data-rt-radius=\"2xl\"]{--rt-pagination-page-radius: var(--rt-radius-2xl)}.rt-pagination[data-rt-radius=full]{--rt-pagination-page-radius: var(--rt-radius-full)}@container (max-width: 460px){.rt-pagination__nav,.rt-pagination__range{display:none}.rt-pagination__compact{display:flex}}}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
160
|
+
// Angular
|
|
161
|
+
FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type:
|
|
162
|
+
// standalone components / directives
|
|
163
|
+
RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtSelectComponent, selector: "rt-select", inputs: ["appearance", "options", "placeholder", "iconLeft", "filter", "filterPlaceholder", "panelWidth", "panelMaxHeight"], outputs: ["selectionChange"] }, { 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 }); }
|
|
164
|
+
}
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtPaginationComponent, decorators: [{
|
|
166
|
+
type: Component,
|
|
167
|
+
args: [{ selector: 'rt-pagination', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
168
|
+
// Angular
|
|
169
|
+
FormsModule,
|
|
170
|
+
// standalone components / directives
|
|
171
|
+
RtIconButtonComponent,
|
|
172
|
+
RtSelectComponent,
|
|
173
|
+
BlockDirective,
|
|
174
|
+
ElemDirective,
|
|
175
|
+
ModDirective,
|
|
176
|
+
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
177
|
+
class: BEM_BLOCK,
|
|
178
|
+
'[style.display]': "isVisible() ? null : 'none'",
|
|
179
|
+
}, template: "<ng-container rtBlock=\"rt-pagination\">\n <!--\n \u0412\u0435\u0442\u043A\u0438 \u00AB\u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E\u00BB \u0437\u0434\u0435\u0441\u044C \u043D\u0435\u0442 \u043D\u0430\u043C\u0435\u0440\u0435\u043D\u043D\u043E: \u043F\u0443\u0441\u0442\u043E\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u0440\u044F\u0447\u0435\u0442 \u0432\u0435\u0441\u044C\n \u0431\u0430\u0440 \u0446\u0435\u043B\u0438\u043A\u043E\u043C (`isVisible`), \u0442\u0430\u043A \u0447\u0442\u043E \u0434\u043E \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u0435\u043B\u043E \u043D\u0435 \u0434\u043E\u0445\u043E\u0434\u0438\u0442. \u041F\u043E\u043A\u0430\n \u0442\u0430\u043A\u0430\u044F \u0432\u0435\u0442\u043A\u0430 \u0442\u0443\u0442 \u0432\u0438\u0441\u0435\u043B\u0430, \u043E\u043D\u0430 \u0447\u0438\u0442\u0430\u043B\u0430\u0441\u044C \u043A\u0430\u043A \u0440\u0430\u0431\u043E\u0447\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435, \u0430 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C\n \u0435\u0451 \u0431\u044B\u043B\u043E \u043D\u0435\u043B\u044C\u0437\u044F \u043D\u0438 \u043F\u0440\u0438 \u043A\u0430\u043A\u0438\u0445 \u0432\u0445\u043E\u0434\u0430\u0445.\n -->\n <span rtElem=\"range\" qa-dataid=\"pagination-range\">\n {{ rangeLabel() }}\n </span>\n\n @if (pageItems().length) {\n <nav rtElem=\"compact\" qa-dataid=\"pagination-compact\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-compact-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n <span rtElem=\"compact-label\" qa-dataid=\"pagination-compact-label\">\n {{ pageLabel() }}\n </span>\n\n <rt-icon-button\n qa-dataid=\"pagination-compact-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n\n <nav rtElem=\"nav\" qa-dataid=\"pagination-nav\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n @for (item of pageItems(); track $index) {\n @if (item === 'gap') {\n <span rtElem=\"gap\" aria-hidden=\"true\">\u2026</span>\n } @else {\n <button\n rtElem=\"page\"\n qa-dataid=\"pagination-page\"\n type=\"button\"\n [attr.data-page]=\"item\"\n [rtMod]=\"{ current: item === pageModel().pageNumber }\"\n [attr.aria-current]=\"item === pageModel().pageNumber ? 'page' : null\"\n [disabled]=\"loading()\"\n (click)=\"goTo(item)\">\n {{ item }}\n </button>\n }\n }\n\n <rt-icon-button\n qa-dataid=\"pagination-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n }\n\n <div rtElem=\"per-page\">\n <span rtElem=\"per-page-label\">{{ t().uiPerPage }}</span>\n <rt-select\n qa-dataid=\"pagination-per-page\"\n [ariaLabel]=\"t().uiItemsPerPage\"\n [options]=\"perPageSelectOptions()\"\n [clearable]=\"false\"\n [ngModel]=\"pageModel().pageSize\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onPerPage($event)\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-pagination{--rt-pagination-page-radius: var(--rt-pagination-box-radius);--rt-pagination-page-border-width: var(--rt-border-width-thin);--rt-pagination-focus-shadow: var(--rt-shadow-focus-ring);--rt-pagination-transition-duration: var(--rt-duration-fast);display:flex;align-items:center;justify-content:var(--rt-pagination-justify);padding:var(--rt-pagination-padding-y) var(--rt-pagination-padding-x);container-type:inline-size;gap:var(--rt-pagination-gap)}.rt-pagination rt-icon-button{--rt-icon-button-color: var(--rt-pagination-arrow-color)}.rt-pagination .rt-icon-button{--rt-icon-button-size-step: var(--rt-pagination-arrow-size);--rt-icon-button-radius: var(--rt-pagination-arrow-radius);--rt-icon-button-shadow: var(--rt-pagination-arrow-shadow)}.rt-pagination__range{display:var(--rt-pagination-range-display);color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);white-space:nowrap}.rt-pagination__nav{display:flex;align-items:center;gap:var(--rt-pagination-nav-gap)}.rt-pagination__compact{display:none;align-items:center;gap:var(--rt-space-xs)}.rt-pagination__compact-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);white-space:nowrap}.rt-pagination__page{min-width:var(--rt-pagination-box-size);height:var(--rt-pagination-box-size);padding:0 var(--rt-space-sm);border:var(--rt-pagination-page-border-width) solid var(--rt-pagination-box-color-border);border-radius:var(--rt-pagination-page-radius);background:transparent;color:var(--rt-pagination-box-color-text);cursor:pointer;font:inherit;font-size:var(--rt-text-sm);transition:background-color var(--rt-pagination-transition-duration) ease,border-color var(--rt-pagination-transition-duration) ease,color var(--rt-pagination-transition-duration) ease}.rt-pagination__page:hover:not(:disabled,.rt-pagination__page--current){border-color:var(--rt-color-border-strong);background:var(--rt-color-bg-surface-subtle)}.rt-pagination__page:focus-visible{box-shadow:var(--rt-pagination-focus-shadow);outline:2px solid transparent;outline-offset:2px}.rt-pagination__page--current{border-color:var(--rt-pagination-box-current-color-border);background:var(--rt-pagination-box-current-color-bg);color:var(--rt-pagination-box-current-color-text);font-weight:var(--rt-pagination-box-current-font-weight)}.rt-pagination__page:disabled{cursor:default;opacity:.6}.rt-pagination__gap{padding:0 var(--rt-space-xs);color:var(--rt-color-text-muted)}.rt-pagination__per-page{--rt-input-height: var(--rt-pagination-field-height);--rt-input-radius: var(--rt-pagination-field-radius);--rt-input-color-border: var(--rt-pagination-field-color-border);--rt-input-padding-x: var(--rt-pagination-field-padding-x);--rt-input-color-bg: var(--rt-pagination-field-color-bg);--rt-input-color-text: var(--rt-pagination-field-color-text);display:flex;align-items:center;gap:var(--rt-pagination-per-page-gap)}.rt-pagination__per-page-label{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);white-space:var(--rt-pagination-per-page-label-white-space)}.rt-pagination[data-rt-radius=none]{--rt-pagination-page-radius: var(--rt-radius-none)}.rt-pagination[data-rt-radius=xs]{--rt-pagination-page-radius: var(--rt-radius-xs)}.rt-pagination[data-rt-radius=sm]{--rt-pagination-page-radius: var(--rt-radius-sm)}.rt-pagination[data-rt-radius=ms]{--rt-pagination-page-radius: var(--rt-radius-ms)}.rt-pagination[data-rt-radius=md]{--rt-pagination-page-radius: var(--rt-radius-md)}.rt-pagination[data-rt-radius=lg]{--rt-pagination-page-radius: var(--rt-radius-lg)}.rt-pagination[data-rt-radius=xl]{--rt-pagination-page-radius: var(--rt-radius-xl)}.rt-pagination[data-rt-radius=\"2xl\"]{--rt-pagination-page-radius: var(--rt-radius-2xl)}.rt-pagination[data-rt-radius=full]{--rt-pagination-page-radius: var(--rt-radius-full)}@container (max-width: 460px){.rt-pagination__nav,.rt-pagination__range{display:none}.rt-pagination__compact{display:flex}}}\n"] }]
|
|
180
|
+
}], propDecorators: { pageModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageModel", required: true }] }], perPageOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "perPageOptions", required: false }] }], prevIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevIcon", required: false }] }], nextIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextIcon", required: false }] }], numbering: [{ type: i0.Input, args: [{ isSignal: true, alias: "numbering", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], perPageChange: [{ type: i0.Output, args: ["perPageChange"] }] } });
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Generated bundle index. Do not edit.
|
|
184
|
+
*/
|
|
185
|
+
|
|
186
|
+
export { RtPaginationComponent };
|
|
187
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-pagination.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-pagination.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.logic.ts","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.component.ts","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-pagination.component.html","../../../projects/ui-kit-v2/src/lib/components/pagination/rt-tools-ui-kit-v2-pagination.ts"],"sourcesContent":["import { IPageModel } from '@rt-tools/utils';\n\nimport { IRtPagination } from './rt-pagination.model';\n\n/** Сколько всего страниц. Пустой список — одна страница, листать нечего. */\nexport function lastPageOf(page: IPageModel): number {\n if (page.pageSize <= 0) {\n return 1;\n }\n\n return Math.max(1, Math.ceil(page.totalCount / page.pageSize));\n}\n\n/** Номер первой записи открытой страницы. */\nexport function rangeFromOf(page: IPageModel): number {\n return (page.pageNumber - 1) * page.pageSize + 1;\n}\n\n/** Номер последней записи открытой страницы — на последней странице она короче. */\nexport function rangeToOf(page: IPageModel): number {\n return Math.min(page.pageNumber * page.pageSize, page.totalCount);\n}\n\n/**\n * Полоса номеров страниц с разрывами «…»: первая, последняя и соседи открытой.\n * Пуста при единственной странице — показывать нечего.\n */\nexport function pageItemsOf(page: IPageModel, neighbours: number): ReadonlyArray<IRtPagination.PageItem> {\n const lastPage: number = lastPageOf(page);\n if (lastPage <= 1) {\n return [];\n }\n\n const items: IRtPagination.PageItem[] = [];\n let previous: number = 0;\n for (let candidate: number = 1; candidate <= lastPage; candidate++) {\n const isEdge: boolean = candidate === 1 || candidate === lastPage;\n const isNeighbour: boolean = candidate >= page.pageNumber - neighbours && candidate <= page.pageNumber + neighbours;\n if (!isEdge && !isNeighbour) {\n continue;\n }\n if (previous && candidate - previous > 1) {\n items.push('gap');\n }\n items.push(candidate);\n previous = candidate;\n }\n\n return items;\n}\n\n/** Номера с `from` по `to` включительно. */\nfunction pagesBetween(from: number, to: number): number[] {\n return Array.from({ length: to - from + 1 }, (_value: unknown, index: number): number => from + index);\n}\n\n/**\n * Полоса номеров первого кита — семь мест: до шести страниц видны все, дальше края по три\n * (`1 2 3 … 11 12 13`) или первая, соседи открытой и последняя (`1 … 6 7 8 … 13`); у края разрыв\n * съезжает на одно место за открытой страницей. Одна страница — один номер.\n */\nexport function pageSlotsOf(page: IPageModel): ReadonlyArray<IRtPagination.PageItem> {\n const lastPage: number = lastPageOf(page);\n const current: number = page.pageNumber;\n\n if (lastPage <= 6) {\n return pagesBetween(1, lastPage);\n }\n if (current < 3 || current > lastPage - 2) {\n return [...pagesBetween(1, 3), 'gap', ...pagesBetween(lastPage - 2, lastPage)];\n }\n if (current === 3) {\n return [...pagesBetween(1, 4), 'gap', ...pagesBetween(lastPage - 1, lastPage)];\n }\n if (current === 4) {\n return [...pagesBetween(1, 5), 'gap', lastPage];\n }\n if (current <= lastPage - 4) {\n return [1, 'gap', current - 1, current, current + 1, 'gap', lastPage];\n }\n if (current === lastPage - 3) {\n return [1, 'gap', ...pagesBetween(lastPage - 4, lastPage)];\n }\n\n return [1, 2, 'gap', ...pagesBetween(lastPage - 3, lastPage)];\n}\n","import {\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { IPageModel } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, TRtKitLabelParams, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';\nimport { IRtSelect } from '@rt-tools/ui-kit-v2/select';\nimport { lastPageOf, pageItemsOf, pageSlotsOf, rangeFromOf, rangeToOf } from './rt-pagination.logic';\nimport { IRtPagination } from './rt-pagination.model';\n\nconst BEM_BLOCK: string = 'rt-pagination';\nconst NEIGHBOURS: number = 1; // соседей вокруг открытой страницы\n\n@Component({\n selector: 'rt-pagination',\n templateUrl: './rt-pagination.component.html',\n styleUrl: './rt-pagination.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtSelectComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[style.display]': \"isVisible() ? null : 'none'\",\n },\n})\nexport class RtPaginationComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly perPageSelectOptions: Signal<ReadonlyArray<IRtSelect.Option<number>>> = computed(\n (): ReadonlyArray<IRtSelect.Option<number>> =>\n this.perPageOptions().map((n: number): IRtSelect.Option<number> => ({ label: String(n), value: n }))\n );\n\n /**\n * Диапазон записей и номер страницы — с подстановками, поэтому карте подписей\n * они не годятся: числа приходят из модели страницы.\n */\n protected readonly rangeLabel: Signal<string> = rtKitLabel(\n 'uiRangeOf',\n computed((): TRtKitLabelParams => ({ from: this.rangeFrom(), to: this.rangeTo(), total: this.pageModel().totalCount }))\n );\n\n protected readonly pageLabel: Signal<string> = rtKitLabel(\n 'uiPageOf',\n computed((): TRtKitLabelParams => ({ page: this.pageModel().pageNumber, last: this.lastPage() }))\n );\n\n protected readonly isFirst: Signal<boolean> = computed((): boolean => this.pageModel().pageNumber <= 1);\n\n protected readonly isLast: Signal<boolean> = computed((): boolean => this.pageModel().pageNumber >= this.lastPage());\n\n public readonly pageModel: InputSignal<IPageModel> = input.required<IPageModel>();\n\n public readonly perPageOptions: InputSignal<ReadonlyArray<number>> = input<ReadonlyArray<number>>([20, 50, 100]);\n\n /** Значок стрелки «назад»: вид первого кита рисует стрелку, а не шеврон. */\n public readonly prevIcon: InputSignal<IRtIcon.Name> = input<IRtIcon.Name>('chevron-left');\n\n /** Значок стрелки «вперёд». */\n public readonly nextIcon: InputSignal<IRtIcon.Name> = input<IRtIcon.Name>('chevron-right');\n\n /** Счёт номеров: список под материальным набором просит семь мест первого кита. */\n public readonly numbering: InputSignal<IRtPagination.Numbering> = input<IRtPagination.Numbering>('neighbours');\n\n public readonly loading: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n public readonly pageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly perPageChange: OutputEmitterRef<number> = output<number>();\n\n /**\n * Пагинацию показываем, только когда есть что листать/менять: всё не влезает\n * на одну страницу даже при минимальной опции размера (`total > наименьший\n * perPageOption`). Иначе и навигация, и селектор размера бесполезны — прячем\n * весь бар (включая пустой и пустой-по-фильтру список).\n */\n public readonly isVisible: Signal<boolean> = computed((): boolean => {\n const options: ReadonlyArray<number> = this.perPageOptions();\n const smallest: number = options.length > 0 ? Math.min(...options) : 0;\n return this.pageModel().totalCount > smallest;\n });\n\n /** Сколько всего страниц при нынешнем размере страницы. */\n public readonly lastPage: Signal<number> = computed((): number => lastPageOf(this.pageModel()));\n\n /**\n * Границы диапазона записей открытой страницы. Собираются числами, а сама\n * подпись — в шаблоне: только там подстановка проходит через словарь и\n * переживает смену языка.\n */\n public readonly rangeFrom: Signal<number> = computed((): number => rangeFromOf(this.pageModel()));\n\n public readonly rangeTo: Signal<number> = computed((): number => rangeToOf(this.pageModel()));\n\n /** Полоса номеров страниц с разрывами «…». По соседям пуста при единственной странице. */\n public readonly pageItems: Signal<ReadonlyArray<IRtPagination.PageItem>> = computed((): ReadonlyArray<IRtPagination.PageItem> =>\n this.numbering() === 'seven' ? pageSlotsOf(this.pageModel()) : pageItemsOf(this.pageModel(), NEIGHBOURS)\n );\n\n public goTo(pageNumber: number): void {\n if (this.loading() || pageNumber === this.pageModel().pageNumber || pageNumber < 1 || pageNumber > this.lastPage()) {\n return;\n }\n this.pageChange.emit(pageNumber);\n }\n\n protected onPerPage(value: number | null): void {\n if (value === null || this.loading() || value === this.pageModel().pageSize) {\n return;\n }\n this.perPageChange.emit(value);\n }\n}\n","<ng-container rtBlock=\"rt-pagination\">\n <!--\n Ветки «ничего не найдено» здесь нет намеренно: пустой набор прячет весь\n бар целиком (`isVisible`), так что до этой строки дело не доходит. Пока\n такая ветка тут висела, она читалась как рабочее состояние, а показать\n её было нельзя ни при каких входах.\n -->\n <span rtElem=\"range\" qa-dataid=\"pagination-range\">\n {{ rangeLabel() }}\n </span>\n\n @if (pageItems().length) {\n <nav rtElem=\"compact\" qa-dataid=\"pagination-compact\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-compact-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n <span rtElem=\"compact-label\" qa-dataid=\"pagination-compact-label\">\n {{ pageLabel() }}\n </span>\n\n <rt-icon-button\n qa-dataid=\"pagination-compact-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n\n <nav rtElem=\"nav\" qa-dataid=\"pagination-nav\" [attr.aria-label]=\"t().uiPagination\">\n <rt-icon-button\n qa-dataid=\"pagination-prev\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"prevIcon()\"\n [ariaLabel]=\"t().uiPrevPage\"\n [tooltip]=\"t().uiBack\"\n [disabled]=\"isFirst() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber - 1)\" />\n\n @for (item of pageItems(); track $index) {\n @if (item === 'gap') {\n <span rtElem=\"gap\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n rtElem=\"page\"\n qa-dataid=\"pagination-page\"\n type=\"button\"\n [attr.data-page]=\"item\"\n [rtMod]=\"{ current: item === pageModel().pageNumber }\"\n [attr.aria-current]=\"item === pageModel().pageNumber ? 'page' : null\"\n [disabled]=\"loading()\"\n (click)=\"goTo(item)\">\n {{ item }}\n </button>\n }\n }\n\n <rt-icon-button\n qa-dataid=\"pagination-next\"\n variant=\"ghost\"\n size=\"sm\"\n [icon]=\"nextIcon()\"\n [ariaLabel]=\"t().uiNextPage\"\n [tooltip]=\"t().uiForward\"\n [disabled]=\"isLast() || loading()\"\n (clicked)=\"goTo(pageModel().pageNumber + 1)\" />\n </nav>\n }\n\n <div rtElem=\"per-page\">\n <span rtElem=\"per-page-label\">{{ t().uiPerPage }}</span>\n <rt-select\n qa-dataid=\"pagination-per-page\"\n [ariaLabel]=\"t().uiItemsPerPage\"\n [options]=\"perPageSelectOptions()\"\n [clearable]=\"false\"\n [ngModel]=\"pageModel().pageSize\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onPerPage($event)\" />\n </div>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|