@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,573 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, computed, linkedSignal, signal, input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component, viewChild, forwardRef } from '@angular/core';
|
|
3
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
4
|
+
import { RT_KIT_LOCALE, RT_KIT_LABELS, rtKitLabel, BreakpointsService } from '@rt-tools/ui-kit-v2/core';
|
|
5
|
+
import { RtBottomSheetComponent } from '@rt-tools/ui-kit-v2/bottom-sheet';
|
|
6
|
+
import { rtDateAddMonths, rtDateRead, rtDateInBounds, rtDateMonth, rtDateText, rtDateShape, rtDateParse, rtDateFirstDay, rtDateWeekdays, rtDateNow, rtDateCanPage, rtDateGridKey, rtDateLayout } from '@rt-tools/ui-kit-v2/date-picker';
|
|
7
|
+
import { RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';
|
|
8
|
+
import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
|
|
9
|
+
import { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';
|
|
10
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
11
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
12
|
+
import { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';
|
|
13
|
+
import { ERtCalendarDayState, RtCalendarComponent } from '@rt-tools/ui-kit-v2/calendar';
|
|
14
|
+
|
|
15
|
+
/** Быстрый вариант диапазона в панели поля. */
|
|
16
|
+
var ERtDateRangePreset;
|
|
17
|
+
(function (ERtDateRangePreset) {
|
|
18
|
+
ERtDateRangePreset["Today"] = "today";
|
|
19
|
+
ERtDateRangePreset["Yesterday"] = "yesterday";
|
|
20
|
+
ERtDateRangePreset["Last7"] = "last-7";
|
|
21
|
+
ERtDateRangePreset["Last30"] = "last-30";
|
|
22
|
+
ERtDateRangePreset["ThisMonth"] = "this-month";
|
|
23
|
+
ERtDateRangePreset["LastMonth"] = "last-month";
|
|
24
|
+
})(ERtDateRangePreset || (ERtDateRangePreset = {}));
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Чистая логика поля диапазона дат: порядок двух дней, состояния дней месяца, быстрые варианты,
|
|
28
|
+
* итог и текст поля. Сегодняшний день приходит параметром — компонент читает часы сам.
|
|
29
|
+
*
|
|
30
|
+
* Дни — строки `YYYY-MM-DD`: строки одной формы сравниваются как текст в порядке дат.
|
|
31
|
+
*/
|
|
32
|
+
const DAY_LENGTH_MS = 86_400_000;
|
|
33
|
+
const DAY_LEN = 10;
|
|
34
|
+
const MONTH_LEN$1 = 7;
|
|
35
|
+
const YEAR_LEN = 4;
|
|
36
|
+
const LAST_WEEK_DAYS = 7;
|
|
37
|
+
const LAST_MONTH_DAYS = 30;
|
|
38
|
+
/** Знак между датами в тексте поля. */
|
|
39
|
+
const DASH = ' — ';
|
|
40
|
+
/** Тире между датами набранного текста: длинное или короткое, дефис — только между пробелами. */
|
|
41
|
+
const DASH_RE = /[—–]|\s-\s/;
|
|
42
|
+
function dayToMs(day) {
|
|
43
|
+
const [y, m, d] = day.split('-').map(Number);
|
|
44
|
+
return Date.UTC(y, m - 1, d);
|
|
45
|
+
}
|
|
46
|
+
function msToDay(ms) {
|
|
47
|
+
return new Date(ms).toISOString().slice(0, DAY_LEN);
|
|
48
|
+
}
|
|
49
|
+
function addDays(day, delta) {
|
|
50
|
+
return msToDay(dayToMs(day) + delta * DAY_LENGTH_MS);
|
|
51
|
+
}
|
|
52
|
+
function lastDayOf(month) {
|
|
53
|
+
return addDays(`${rtDateAddMonths(month, 1)}-01`, -1);
|
|
54
|
+
}
|
|
55
|
+
function dayState(day, low, high) {
|
|
56
|
+
if (high === null || low === high) {
|
|
57
|
+
return day === low ? ERtCalendarDayState.Chosen : ERtCalendarDayState.Free;
|
|
58
|
+
}
|
|
59
|
+
if (day === low) {
|
|
60
|
+
return ERtCalendarDayState.Start;
|
|
61
|
+
}
|
|
62
|
+
if (day === high) {
|
|
63
|
+
return ERtCalendarDayState.End;
|
|
64
|
+
}
|
|
65
|
+
const ms = dayToMs(day);
|
|
66
|
+
return low !== null && ms > dayToMs(low) && ms < dayToMs(high) ? ERtCalendarDayState.InRange : ERtCalendarDayState.Free;
|
|
67
|
+
}
|
|
68
|
+
/** Два дня по порядку: второй раньше первого — они меняются местами. */
|
|
69
|
+
function rtRangeOrder(a, b) {
|
|
70
|
+
return dayToMs(a) <= dayToMs(b) ? { start: a, end: b } : { start: b, end: a };
|
|
71
|
+
}
|
|
72
|
+
/** Значение поля из того, что пришло из формы; не пара дней по порядку — `null`. */
|
|
73
|
+
function rtRangeRead(value) {
|
|
74
|
+
if (typeof value !== 'object' || value === null) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const start = Reflect.get(value, 'start');
|
|
78
|
+
const end = Reflect.get(value, 'end');
|
|
79
|
+
if (typeof start !== 'string' || typeof end !== 'string') {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const ok = rtDateRead(start, 'date') !== null && rtDateRead(end, 'date') !== null && dayToMs(start) <= dayToMs(end);
|
|
83
|
+
return ok ? { start, end } : null;
|
|
84
|
+
}
|
|
85
|
+
/** Диапазон лежит в границах целиком. */
|
|
86
|
+
function rtRangeInBounds(range, min, max) {
|
|
87
|
+
return rtDateInBounds(range.start, min, max) && rtDateInBounds(range.end, min, max);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Месяц `YYYY-MM` для календаря: дни черновика — начало, конец и дни между ними. Пока выбрано только
|
|
91
|
+
* начало, будущий диапазон тянется до дня под указателем, и этот день светлый, как дни между краями:
|
|
92
|
+
* залит только выбранный край.
|
|
93
|
+
*/
|
|
94
|
+
function rtRangeMonth(month, ctx) {
|
|
95
|
+
const base = rtDateMonth(month, { locale: ctx.locale, today: ctx.today, chosen: null, min: ctx.min, max: ctx.max });
|
|
96
|
+
const other = ctx.end ?? ctx.hover;
|
|
97
|
+
const range = ctx.start === null || other === null ? null : rtRangeOrder(ctx.start, other);
|
|
98
|
+
const low = range?.start ?? ctx.start;
|
|
99
|
+
const high = range?.end ?? null;
|
|
100
|
+
const preview = ctx.end === null && ctx.hover !== ctx.start ? ctx.hover : null;
|
|
101
|
+
return {
|
|
102
|
+
...base,
|
|
103
|
+
days: base.days.map((day) => {
|
|
104
|
+
const state = dayState(day.key, low, high);
|
|
105
|
+
return { ...day, state: day.key === preview ? ERtCalendarDayState.InRange : state };
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Диапазоны быстрых вариантов от сегодняшнего дня. */
|
|
110
|
+
function rtRangePresets(today) {
|
|
111
|
+
const month = today.slice(0, MONTH_LEN$1);
|
|
112
|
+
const lastMonth = rtDateAddMonths(month, -1);
|
|
113
|
+
const yesterday = addDays(today, -1);
|
|
114
|
+
return {
|
|
115
|
+
[ERtDateRangePreset.Today]: { start: today, end: today },
|
|
116
|
+
[ERtDateRangePreset.Yesterday]: { start: yesterday, end: yesterday },
|
|
117
|
+
[ERtDateRangePreset.Last7]: { start: addDays(today, 1 - LAST_WEEK_DAYS), end: today },
|
|
118
|
+
[ERtDateRangePreset.Last30]: { start: addDays(today, 1 - LAST_MONTH_DAYS), end: today },
|
|
119
|
+
[ERtDateRangePreset.ThisMonth]: { start: `${month}-01`, end: today },
|
|
120
|
+
[ERtDateRangePreset.LastMonth]: { start: `${lastMonth}-01`, end: lastDayOf(lastMonth) },
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Быстрые варианты в порядке панели; вариант, не лежащий в границах целиком, выключен. */
|
|
124
|
+
function rtRangePresetCells(today, min, max) {
|
|
125
|
+
const ranges = rtRangePresets(today);
|
|
126
|
+
return Object.values(ERtDateRangePreset).map((preset) => ({
|
|
127
|
+
preset,
|
|
128
|
+
range: ranges[preset],
|
|
129
|
+
disabled: !rtRangeInBounds(ranges[preset], min, max),
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/** Вариант, чей диапазон совпадает с черновиком; иначе `null`. */
|
|
133
|
+
function rtRangePresetOf(range, today) {
|
|
134
|
+
if (range === null) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const ranges = rtRangePresets(today);
|
|
138
|
+
const found = Object.values(ERtDateRangePreset).find((preset) => ranges[preset].start === range.start && ranges[preset].end === range.end);
|
|
139
|
+
return found ?? null;
|
|
140
|
+
}
|
|
141
|
+
/** Число дней диапазона, оба края включены. */
|
|
142
|
+
function rtRangeDays(range) {
|
|
143
|
+
return Math.round((dayToMs(range.end) - dayToMs(range.start)) / DAY_LENGTH_MS) + 1;
|
|
144
|
+
}
|
|
145
|
+
/** Форма числа по правилам локали; `zero` и `two` идут подписью `other`. */
|
|
146
|
+
function rtRangePlural(count, locale) {
|
|
147
|
+
const form = new Intl.PluralRules(locale).select(count);
|
|
148
|
+
return form === 'one' || form === 'few' || form === 'many' ? form : 'other';
|
|
149
|
+
}
|
|
150
|
+
/** Даты итога по локали: `12–15 октября`; год пишется, когда края в разных годах. */
|
|
151
|
+
function rtRangeDates(range, locale) {
|
|
152
|
+
const sameYear = range.start.slice(0, YEAR_LEN) === range.end.slice(0, YEAR_LEN);
|
|
153
|
+
const options = sameYear
|
|
154
|
+
? { day: 'numeric', month: 'long', timeZone: 'UTC' }
|
|
155
|
+
: { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' };
|
|
156
|
+
return new Intl.DateTimeFormat(locale, options).formatRange(dayToMs(range.start), dayToMs(range.end));
|
|
157
|
+
}
|
|
158
|
+
/** Текст поля: две даты в порядке локали через тире; пусто — пустой текст. */
|
|
159
|
+
function rtRangeText(value, layout) {
|
|
160
|
+
return value === null ? '' : `${rtDateText(value.start, 'date', layout)}${DASH}${rtDateText(value.end, 'date', layout)}`;
|
|
161
|
+
}
|
|
162
|
+
/** Подсказка формы текста буквами кита: `дд.мм.гггг — дд.мм.гггг`. */
|
|
163
|
+
function rtRangeShape(layout, letters) {
|
|
164
|
+
const day = rtDateShape('date', layout, letters);
|
|
165
|
+
return `${day}${DASH}${day}`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Читает набранный текст в диапазон; `null` — текст не две даты. Даты читаются в порядке локали,
|
|
169
|
+
* форма значения тоже; даты в обратном порядке ставятся по порядку.
|
|
170
|
+
*/
|
|
171
|
+
function rtRangeParse(text, layout) {
|
|
172
|
+
const parts = text.trim().split(DASH_RE);
|
|
173
|
+
if (parts.length !== 2) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const start = rtDateParse(parts[0].trim(), 'date', layout);
|
|
177
|
+
const end = rtDateParse(parts[1].trim(), 'date', layout);
|
|
178
|
+
return start === null || end === null ? null : rtRangeOrder(start, end);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const BEM_BLOCK$1 = 'rt-date-range-panel';
|
|
182
|
+
const MONTH_LEN = 7;
|
|
183
|
+
/** Подпись каждого быстрого варианта в наборе кита. */
|
|
184
|
+
const PRESET_LABELS = {
|
|
185
|
+
[ERtDateRangePreset.Today]: 'uiToday',
|
|
186
|
+
[ERtDateRangePreset.Yesterday]: 'uiYesterday',
|
|
187
|
+
[ERtDateRangePreset.Last7]: 'uiLast7Days',
|
|
188
|
+
[ERtDateRangePreset.Last30]: 'uiLast30Days',
|
|
189
|
+
[ERtDateRangePreset.ThisMonth]: 'uiThisMonth',
|
|
190
|
+
[ERtDateRangePreset.LastMonth]: 'uiLastMonth',
|
|
191
|
+
};
|
|
192
|
+
/** Подпись числа дней для каждой формы множественного числа. */
|
|
193
|
+
const DAY_LABELS = {
|
|
194
|
+
one: 'uiDaysOne',
|
|
195
|
+
few: 'uiDaysFew',
|
|
196
|
+
many: 'uiDaysMany',
|
|
197
|
+
other: 'uiDaysOther',
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Панель rt-date-range: быстрые варианты, два месяца рядом (в шторке — один) и подвал с итогом,
|
|
201
|
+
* «Сбросить» и «Применить».
|
|
202
|
+
*
|
|
203
|
+
* Панель не пишет в форму: готовый диапазон уходит событием `picked`, просьба закрыться — `closed`.
|
|
204
|
+
* Черновик живёт, пока панель открыта; поле создаёт её заново на каждое открытие. Вся арифметика
|
|
205
|
+
* диапазона — в `rt-date-range.logic`.
|
|
206
|
+
*/
|
|
207
|
+
class RtDateRangePanelComponent {
|
|
208
|
+
constructor() {
|
|
209
|
+
/** Локаль кита: названия месяцев, дней недели, даты итога и форма числа дней идут по ней. */
|
|
210
|
+
this.#locale = inject(RT_KIT_LOCALE);
|
|
211
|
+
/** Минута открытия панели: от неё считается «сегодня», когда вход `now` не задан. */
|
|
212
|
+
this.#openedAt = new Date();
|
|
213
|
+
this.#firstDay = computed(() => rtDateFirstDay(this.#locale()), /* @ts-ignore */
|
|
214
|
+
...(ngDevMode ? [{ debugName: "#firstDay" }] : /* istanbul ignore next */ []));
|
|
215
|
+
this.t = inject(RT_KIT_LABELS);
|
|
216
|
+
this.weekdays = computed(() => rtDateWeekdays(this.#locale()), /* @ts-ignore */
|
|
217
|
+
...(ngDevMode ? [{ debugName: "weekdays" }] : /* istanbul ignore next */ []));
|
|
218
|
+
this.today = computed(() => rtDateNow(this.now() ?? this.#openedAt, 1).day, /* @ts-ignore */
|
|
219
|
+
...(ngDevMode ? [{ debugName: "today" }] : /* istanbul ignore next */ []));
|
|
220
|
+
this.start = linkedSignal(() => this.value()?.start ?? null, /* @ts-ignore */
|
|
221
|
+
...(ngDevMode ? [{ debugName: "start" }] : /* istanbul ignore next */ []));
|
|
222
|
+
this.end = linkedSignal(() => this.value()?.end ?? null, /* @ts-ignore */
|
|
223
|
+
...(ngDevMode ? [{ debugName: "end" }] : /* istanbul ignore next */ []));
|
|
224
|
+
/** День под указателем: пока выбрано только начало, до него рисуется будущий диапазон. */
|
|
225
|
+
this.hover = signal(null, /* @ts-ignore */
|
|
226
|
+
...(ngDevMode ? [{ debugName: "hover" }] : /* istanbul ignore next */ []));
|
|
227
|
+
this.activeKey = signal(null, /* @ts-ignore */
|
|
228
|
+
...(ngDevMode ? [{ debugName: "activeKey" }] : /* istanbul ignore next */ []));
|
|
229
|
+
this.shownMonth = linkedSignal(() => (this.value()?.start ?? this.today()).slice(0, MONTH_LEN), /* @ts-ignore */
|
|
230
|
+
...(ngDevMode ? [{ debugName: "shownMonth" }] : /* istanbul ignore next */ []));
|
|
231
|
+
/** Готовый черновик: оба края выбраны. */
|
|
232
|
+
this.draft = computed(() => {
|
|
233
|
+
const start = this.start();
|
|
234
|
+
const end = this.end();
|
|
235
|
+
return start === null || end === null ? null : { start, end };
|
|
236
|
+
}, /* @ts-ignore */
|
|
237
|
+
...(ngDevMode ? [{ debugName: "draft" }] : /* istanbul ignore next */ []));
|
|
238
|
+
this.months = computed(() => {
|
|
239
|
+
const ctx = {
|
|
240
|
+
locale: this.#locale(),
|
|
241
|
+
today: this.today(),
|
|
242
|
+
start: this.start(),
|
|
243
|
+
end: this.end(),
|
|
244
|
+
hover: this.hover(),
|
|
245
|
+
min: this.min(),
|
|
246
|
+
max: this.max(),
|
|
247
|
+
};
|
|
248
|
+
return this.#shown().map((month) => rtRangeMonth(month, ctx));
|
|
249
|
+
}, /* @ts-ignore */
|
|
250
|
+
...(ngDevMode ? [{ debugName: "months" }] : /* istanbul ignore next */ []));
|
|
251
|
+
this.canPrev = computed(() => rtDateCanPage(this.shownMonth(), -1, this.min(), this.max()), /* @ts-ignore */
|
|
252
|
+
...(ngDevMode ? [{ debugName: "canPrev" }] : /* istanbul ignore next */ []));
|
|
253
|
+
/** Вперёд листается, пока последний показанный месяц не упёрся в границу. */
|
|
254
|
+
this.canNext = computed(() => rtDateCanPage(this.#lastShown(), 1, this.min(), this.max()), /* @ts-ignore */
|
|
255
|
+
...(ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []));
|
|
256
|
+
this.presets = computed(() => {
|
|
257
|
+
const labels = this.t();
|
|
258
|
+
const chosen = rtRangePresetOf(this.draft(), this.today());
|
|
259
|
+
return rtRangePresetCells(this.today(), this.min(), this.max()).map((cell) => ({
|
|
260
|
+
cell,
|
|
261
|
+
label: labels[PRESET_LABELS[cell.preset]],
|
|
262
|
+
chosen: cell.preset === chosen,
|
|
263
|
+
}));
|
|
264
|
+
}, /* @ts-ignore */
|
|
265
|
+
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
266
|
+
/** Число дней черновика подписью кита по форме множественного числа локали. */
|
|
267
|
+
this.daysText = rtKitLabel(computed(() => {
|
|
268
|
+
const draft = this.draft();
|
|
269
|
+
return draft === null ? '' : DAY_LABELS[rtRangePlural(rtRangeDays(draft), this.#locale())];
|
|
270
|
+
}), computed(() => {
|
|
271
|
+
const draft = this.draft();
|
|
272
|
+
return { count: draft === null ? 0 : rtRangeDays(draft) };
|
|
273
|
+
}));
|
|
274
|
+
/** Итог подвала: даты и число дней, в шторке — только число; с одним началом — просьба о конце. */
|
|
275
|
+
this.summary = computed(() => {
|
|
276
|
+
const draft = this.draft();
|
|
277
|
+
if (draft === null) {
|
|
278
|
+
return this.start() === null ? this.t().uiPickStartDate : this.t().uiPickEndDate;
|
|
279
|
+
}
|
|
280
|
+
return this.sheet() ? this.daysText() : `${rtRangeDates(draft, this.#locale())} · ${this.daysText()}`;
|
|
281
|
+
}, /* @ts-ignore */
|
|
282
|
+
...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
|
|
283
|
+
/** Значение поля: с него начинается черновик. */
|
|
284
|
+
this.value = input(null, /* @ts-ignore */
|
|
285
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
286
|
+
this.min = input(null, /* @ts-ignore */
|
|
287
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
288
|
+
this.max = input(null, /* @ts-ignore */
|
|
289
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
290
|
+
/** Раскладка нижней шторки: один месяц, варианты строкой сверху, дни под палец. */
|
|
291
|
+
this.sheet = input(false, { ...(ngDevMode ? { debugName: "sheet" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
292
|
+
/**
|
|
293
|
+
* Момент, от которого считаются «сегодня» и быстрые варианты. Поле его не задаёт — панель
|
|
294
|
+
* читает часы сама; задаёт витрина, чтобы кадр не менялся день ото дня.
|
|
295
|
+
*/
|
|
296
|
+
this.now = input(null, /* @ts-ignore */
|
|
297
|
+
...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
|
|
298
|
+
/** Готовый диапазон: панель просит поле его записать. */
|
|
299
|
+
this.picked = output();
|
|
300
|
+
/** Панель просит закрыть себя. */
|
|
301
|
+
this.closed = output();
|
|
302
|
+
}
|
|
303
|
+
/** Локаль кита: названия месяцев, дней недели, даты итога и форма числа дней идут по ней. */
|
|
304
|
+
#locale;
|
|
305
|
+
/** Минута открытия панели: от неё считается «сегодня», когда вход `now` не задан. */
|
|
306
|
+
#openedAt;
|
|
307
|
+
#firstDay;
|
|
308
|
+
/** Первый выбор — начало, второй — конец; выбор после готового диапазона начинает новый. */
|
|
309
|
+
pickDay(day) {
|
|
310
|
+
this.activeKey.set(day.key);
|
|
311
|
+
const start = this.start();
|
|
312
|
+
if (start === null || this.end() !== null) {
|
|
313
|
+
this.start.set(day.key);
|
|
314
|
+
this.end.set(null);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const range = rtRangeOrder(start, day.key);
|
|
318
|
+
this.start.set(range.start);
|
|
319
|
+
this.end.set(range.end);
|
|
320
|
+
this.hover.set(null);
|
|
321
|
+
}
|
|
322
|
+
onHover(day) {
|
|
323
|
+
this.hover.set(day?.key ?? null);
|
|
324
|
+
}
|
|
325
|
+
pickPreset(cell) {
|
|
326
|
+
if (cell.disabled) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
this.start.set(cell.range.start);
|
|
330
|
+
this.end.set(cell.range.end);
|
|
331
|
+
this.hover.set(null);
|
|
332
|
+
this.shownMonth.set(cell.range.start.slice(0, MONTH_LEN));
|
|
333
|
+
}
|
|
334
|
+
/** Клавиша сетки: фокус переходит на день, и месяцы листаются, если он ушёл за показанные. */
|
|
335
|
+
onGridKey(event) {
|
|
336
|
+
const next = rtDateGridKey(event.key, event.day.key, this.#firstDay(), this.min(), this.max());
|
|
337
|
+
if (next === null) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const month = next.slice(0, MONTH_LEN);
|
|
341
|
+
if (!this.#shown().includes(month)) {
|
|
342
|
+
const before = Number(month.replace('-', '')) < Number(this.shownMonth().replace('-', ''));
|
|
343
|
+
this.shownMonth.set(before ? month : rtDateAddMonths(month, 1 - this.#shown().length));
|
|
344
|
+
}
|
|
345
|
+
this.activeKey.set(next);
|
|
346
|
+
this.hover.set(next);
|
|
347
|
+
}
|
|
348
|
+
page(delta) {
|
|
349
|
+
this.shownMonth.set(rtDateAddMonths(this.shownMonth(), delta));
|
|
350
|
+
}
|
|
351
|
+
reset() {
|
|
352
|
+
this.start.set(null);
|
|
353
|
+
this.end.set(null);
|
|
354
|
+
this.hover.set(null);
|
|
355
|
+
}
|
|
356
|
+
/** «Применить»: готовый черновик уходит значением, панель закрывается. */
|
|
357
|
+
apply() {
|
|
358
|
+
const draft = this.draft();
|
|
359
|
+
if (draft !== null) {
|
|
360
|
+
this.picked.emit(draft);
|
|
361
|
+
this.closed.emit();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** Показанные месяцы `YYYY-MM`: два рядом, в шторке — один. */
|
|
365
|
+
#shown() {
|
|
366
|
+
const first = this.shownMonth();
|
|
367
|
+
return this.sheet() ? [first] : [first, rtDateAddMonths(first, 1)];
|
|
368
|
+
}
|
|
369
|
+
#lastShown() {
|
|
370
|
+
const shown = this.#shown();
|
|
371
|
+
return shown[shown.length - 1];
|
|
372
|
+
}
|
|
373
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDateRangePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
374
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDateRangePanelComponent, isStandalone: true, selector: "rt-date-range-panel", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, sheet: { classPropertyName: "sheet", publicName: "sheet", isSignal: true, isRequired: false, transformFunction: null }, now: { classPropertyName: "now", publicName: "now", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { picked: "picked", closed: "closed" }, host: { listeners: { "keydown.escape": "closed.emit()" }, properties: { "class.rt-date-range-panel--sheet": "sheet()" }, classAttribute: "rt-date-range-panel" }, ngImport: i0, template: "<ng-container rtBlock=\"rt-date-range-panel\">\n @if (sheet()) {\n <p rtElem=\"title\" qa-dataid=\"date-range-title\">{{ t().uiPeriod }}</p>\n }\n\n <div rtElem=\"body\">\n <div rtElem=\"presets\" qa-dataid=\"date-range-presets\" role=\"group\" [attr.aria-label]=\"t().uiQuickRanges\">\n @for (item of presets(); track item.cell.preset) {\n <button\n rtButton\n rtElem=\"preset\"\n qa-dataid=\"date-range-preset\"\n type=\"button\"\n size=\"sm\"\n [theme]=\"item.chosen ? 'primary' : 'secondary'\"\n [appearance]=\"sheet() ? 'outlined' : 'text'\"\n [attr.data-preset]=\"item.cell.preset\"\n [label]=\"item.label\"\n [attr.aria-label]=\"item.label\"\n [pressed]=\"item.chosen\"\n [disabled]=\"item.cell.disabled\"\n (click)=\"pickPreset(item.cell)\"></button>\n }\n </div>\n\n <rt-calendar\n rtElem=\"calendar\"\n qa-dataid=\"date-range-calendar\"\n grid\n [months]=\"months()\"\n [weekdayLabels]=\"weekdays()\"\n [canPrev]=\"canPrev()\"\n [canNext]=\"canNext()\"\n [activeKey]=\"activeKey()\"\n [prevAriaLabel]=\"t().uiPrevMonth\"\n [nextAriaLabel]=\"t().uiNextMonth\"\n (prevMonth)=\"page(-1)\"\n (nextMonth)=\"page(1)\"\n (dayClick)=\"pickDay($event)\"\n (dayHover)=\"onHover($event)\"\n (gridKey)=\"onGridKey($event)\" />\n </div>\n\n <div rtElem=\"footer\">\n <span rtElem=\"summary\" qa-dataid=\"date-range-summary\" aria-live=\"polite\">{{ summary() }}</span>\n <button\n rtButton\n qa-dataid=\"date-range-reset\"\n theme=\"primary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiReset\"\n [attr.aria-label]=\"t().uiReset\"\n (click)=\"reset()\"></button>\n <button\n rtButton\n qa-dataid=\"date-range-apply\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiApply\"\n [attr.aria-label]=\"t().uiApply\"\n [disabled]=\"draft() === null\"\n (click)=\"apply()\"></button>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-range-panel{--rt-date-range-panel-sheet-day-size: calc(var(--rt-size-10) + var(--rt-size-1));--rt-date-range-panel-divider-width: var(--rt-border-width-thin);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-range-panel__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-lg);font-weight:var(--rt-font-weight-semibold);text-align:center}.rt-date-range-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-range-panel__presets{display:flex;flex:0 0 auto;flex-direction:column;align-self:stretch;padding-right:var(--rt-space-4);border-right:var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-1)}.rt-date-range-panel__preset{justify-content:flex-start;white-space:nowrap}.rt-date-range-panel .rt-date-range-panel__calendar{--rt-calendar-day-justify: center;--rt-calendar-column-gap: 0;--rt-calendar-range-inner-radius: 0;flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 14 + var(--rt-space-6))}.rt-date-range-panel__footer{display:flex;align-items:center;padding-top:var(--rt-space-2);border-top:var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-range-panel__summary{flex:1 1 auto;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-date-range-panel--sheet{padding-inline:0}.rt-date-range-panel--sheet .rt-date-range-panel__body{flex-direction:column;align-items:stretch}.rt-date-range-panel--sheet .rt-date-range-panel__presets{flex-direction:row;padding-right:0;padding-bottom:var(--rt-space-1);border-right:none;gap:var(--rt-space-2);overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none}.rt-date-range-panel--sheet .rt-date-range-panel__preset{flex:0 0 auto}.rt-date-range-panel--sheet .rt-date-range-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-size: var(--rt-date-range-panel-sheet-day-size);min-inline-size:0}}\n"], dependencies: [{ kind: "directive", type:
|
|
375
|
+
// rt-tools
|
|
376
|
+
BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type:
|
|
377
|
+
// components
|
|
378
|
+
RtButtonDirective, selector: "button[rtButton], a[rtButton]", inputs: ["label", "icon", "iconPos", "theme", "appearance", "size", "loading", "loadingIcon", "loadingLabel", "pressed"] }, { kind: "component", type: RtCalendarComponent, selector: "rt-calendar", inputs: ["months", "weekdayLabels", "canPrev", "canNext", "prevAriaLabel", "nextAriaLabel", "sublabelsLoading", "grid", "activeKey", "titleAction", "headerTitle"], outputs: ["prevMonth", "nextMonth", "dayClick", "gridKey", "titleClick", "dayHover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
379
|
+
}
|
|
380
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDateRangePanelComponent, decorators: [{
|
|
381
|
+
type: Component,
|
|
382
|
+
args: [{ selector: 'rt-date-range-panel', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
383
|
+
// rt-tools
|
|
384
|
+
BlockDirective,
|
|
385
|
+
ElemDirective,
|
|
386
|
+
// components
|
|
387
|
+
RtButtonDirective,
|
|
388
|
+
RtCalendarComponent,
|
|
389
|
+
], host: {
|
|
390
|
+
class: BEM_BLOCK$1,
|
|
391
|
+
'[class.rt-date-range-panel--sheet]': 'sheet()',
|
|
392
|
+
'(keydown.escape)': 'closed.emit()',
|
|
393
|
+
}, template: "<ng-container rtBlock=\"rt-date-range-panel\">\n @if (sheet()) {\n <p rtElem=\"title\" qa-dataid=\"date-range-title\">{{ t().uiPeriod }}</p>\n }\n\n <div rtElem=\"body\">\n <div rtElem=\"presets\" qa-dataid=\"date-range-presets\" role=\"group\" [attr.aria-label]=\"t().uiQuickRanges\">\n @for (item of presets(); track item.cell.preset) {\n <button\n rtButton\n rtElem=\"preset\"\n qa-dataid=\"date-range-preset\"\n type=\"button\"\n size=\"sm\"\n [theme]=\"item.chosen ? 'primary' : 'secondary'\"\n [appearance]=\"sheet() ? 'outlined' : 'text'\"\n [attr.data-preset]=\"item.cell.preset\"\n [label]=\"item.label\"\n [attr.aria-label]=\"item.label\"\n [pressed]=\"item.chosen\"\n [disabled]=\"item.cell.disabled\"\n (click)=\"pickPreset(item.cell)\"></button>\n }\n </div>\n\n <rt-calendar\n rtElem=\"calendar\"\n qa-dataid=\"date-range-calendar\"\n grid\n [months]=\"months()\"\n [weekdayLabels]=\"weekdays()\"\n [canPrev]=\"canPrev()\"\n [canNext]=\"canNext()\"\n [activeKey]=\"activeKey()\"\n [prevAriaLabel]=\"t().uiPrevMonth\"\n [nextAriaLabel]=\"t().uiNextMonth\"\n (prevMonth)=\"page(-1)\"\n (nextMonth)=\"page(1)\"\n (dayClick)=\"pickDay($event)\"\n (dayHover)=\"onHover($event)\"\n (gridKey)=\"onGridKey($event)\" />\n </div>\n\n <div rtElem=\"footer\">\n <span rtElem=\"summary\" qa-dataid=\"date-range-summary\" aria-live=\"polite\">{{ summary() }}</span>\n <button\n rtButton\n qa-dataid=\"date-range-reset\"\n theme=\"primary\"\n appearance=\"text\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiReset\"\n [attr.aria-label]=\"t().uiReset\"\n (click)=\"reset()\"></button>\n <button\n rtButton\n qa-dataid=\"date-range-apply\"\n size=\"sm\"\n type=\"button\"\n [label]=\"t().uiApply\"\n [attr.aria-label]=\"t().uiApply\"\n [disabled]=\"draft() === null\"\n (click)=\"apply()\"></button>\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-range-panel{--rt-date-range-panel-sheet-day-size: calc(var(--rt-size-10) + var(--rt-size-1));--rt-date-range-panel-divider-width: var(--rt-border-width-thin);display:flex;flex-direction:column;padding:var(--rt-space-4);gap:var(--rt-space-4)}.rt-date-range-panel__title{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-lg);font-weight:var(--rt-font-weight-semibold);text-align:center}.rt-date-range-panel__body{display:flex;align-items:flex-start;gap:var(--rt-space-4)}.rt-date-range-panel__presets{display:flex;flex:0 0 auto;flex-direction:column;align-self:stretch;padding-right:var(--rt-space-4);border-right:var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-1)}.rt-date-range-panel__preset{justify-content:flex-start;white-space:nowrap}.rt-date-range-panel .rt-date-range-panel__calendar{--rt-calendar-day-justify: center;--rt-calendar-column-gap: 0;--rt-calendar-range-inner-radius: 0;flex:1 1 auto;min-inline-size:calc(var(--rt-size-10) * 14 + var(--rt-space-6))}.rt-date-range-panel__footer{display:flex;align-items:center;padding-top:var(--rt-space-2);border-top:var(--rt-date-range-panel-divider-width) solid var(--rt-color-border-subtle);gap:var(--rt-space-2)}.rt-date-range-panel__summary{flex:1 1 auto;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-date-range-panel--sheet{padding-inline:0}.rt-date-range-panel--sheet .rt-date-range-panel__body{flex-direction:column;align-items:stretch}.rt-date-range-panel--sheet .rt-date-range-panel__presets{flex-direction:row;padding-right:0;padding-bottom:var(--rt-space-1);border-right:none;gap:var(--rt-space-2);overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none}.rt-date-range-panel--sheet .rt-date-range-panel__preset{flex:0 0 auto}.rt-date-range-panel--sheet .rt-date-range-panel__calendar{--rt-calendar-month-count: 1;--rt-calendar-day-size: var(--rt-date-range-panel-sheet-day-size);min-inline-size:0}}\n"] }]
|
|
394
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], sheet: [{ type: i0.Input, args: [{ isSignal: true, alias: "sheet", required: false }] }], now: [{ type: i0.Input, args: [{ isSignal: true, alias: "now", required: false }] }], picked: [{ type: i0.Output, args: ["picked"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
|
|
395
|
+
|
|
396
|
+
const BEM_BLOCK = 'rt-date-range';
|
|
397
|
+
/**
|
|
398
|
+
* Поле диапазона дат со своей панелью кита, визуально и по токенам идентичное rt-input (host — box
|
|
399
|
+
* `--rt-input-*`, input — прозрачный `__field`). Кнопка в конце поля открывает
|
|
400
|
+
* `rt-date-range-panel`: на широком экране в поповере, на узком — в нижней шторке. CVA через общий
|
|
401
|
+
* `RtFormControlBase`: clearable, авто-подсветка invalid, read-only представление.
|
|
402
|
+
*
|
|
403
|
+
* `value` — пара дней `{ start, end }` в форме `YYYY-MM-DD` или `null`. Текст в поле — две даты в
|
|
404
|
+
* порядке языка интерфейса через тире (`12.10.2026 — 15.10.2026` под `ru`); набирается так же.
|
|
405
|
+
* Нечитаемый или лежащий за границами текст оставляет значение прежним и помечает поле ошибкой.
|
|
406
|
+
*/
|
|
407
|
+
class RtDateRangeComponent extends RtFormControlBase {
|
|
408
|
+
constructor() {
|
|
409
|
+
super(...arguments);
|
|
410
|
+
/** Локаль кита: приложение, меняющее язык на ходу, меняет её, и текст поля пересчитывается. */
|
|
411
|
+
this.#locale = inject(RT_KIT_LOCALE);
|
|
412
|
+
/** Порядок дня, месяца и года в тексте поля — по локали кита. */
|
|
413
|
+
this.#layout = computed(() => rtDateLayout(this.#locale()), /* @ts-ignore */
|
|
414
|
+
...(ngDevMode ? [{ debugName: "#layout" }] : /* istanbul ignore next */ []));
|
|
415
|
+
this.t = inject(RT_KIT_LABELS);
|
|
416
|
+
/** Узкий экран: панель открывается в нижней шторке, а не в поповере. */
|
|
417
|
+
this.narrow = inject(BreakpointsService).narrow;
|
|
418
|
+
this.fieldEl = viewChild('fieldEl', /* @ts-ignore */
|
|
419
|
+
...(ngDevMode ? [{ debugName: "fieldEl" }] : /* istanbul ignore next */ []));
|
|
420
|
+
this.popover = viewChild(RtPopoverDirective, /* @ts-ignore */
|
|
421
|
+
...(ngDevMode ? [{ debugName: "popover" }] : /* istanbul ignore next */ []));
|
|
422
|
+
/** Набранный текст не читается как диапазон в границах: поле помечено ошибкой. */
|
|
423
|
+
this.textInvalid = signal(false, /* @ts-ignore */
|
|
424
|
+
...(ngDevMode ? [{ debugName: "textInvalid" }] : /* istanbul ignore next */ []));
|
|
425
|
+
this.sheetOpen = signal(false, /* @ts-ignore */
|
|
426
|
+
...(ngDevMode ? [{ debugName: "sheetOpen" }] : /* istanbul ignore next */ []));
|
|
427
|
+
/** Подсказка формы текста буквами кита: `дд.мм.гггг — дд.мм.гггг` под русскими метками. */
|
|
428
|
+
this.shape = computed(() => {
|
|
429
|
+
const labels = this.t();
|
|
430
|
+
return rtRangeShape(this.#layout(), {
|
|
431
|
+
day: labels.uiShapeDay,
|
|
432
|
+
month: labels.uiShapeMonth,
|
|
433
|
+
year: labels.uiShapeYear,
|
|
434
|
+
hour: labels.uiShapeHour,
|
|
435
|
+
minute: labels.uiShapeMinute,
|
|
436
|
+
});
|
|
437
|
+
}, /* @ts-ignore */
|
|
438
|
+
...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
|
|
439
|
+
/** Значение, прочитанное из формы: не пара дней по порядку поле показывает пустой. */
|
|
440
|
+
this.range = computed(() => rtRangeRead(this.value()), /* @ts-ignore */
|
|
441
|
+
...(ngDevMode ? [{ debugName: "range" }] : /* istanbul ignore next */ []));
|
|
442
|
+
this.text = computed(() => rtRangeText(this.range(), this.#layout()), /* @ts-ignore */
|
|
443
|
+
...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
|
|
444
|
+
this.hasValue = computed(() => this.range() !== null, /* @ts-ignore */
|
|
445
|
+
...(ngDevMode ? [{ debugName: "hasValue" }] : /* istanbul ignore next */ []));
|
|
446
|
+
/** Ширина поля в знаках — по длине формы значения, как у поля даты. */
|
|
447
|
+
this.fieldSize = computed(() => this.shape().length, /* @ts-ignore */
|
|
448
|
+
...(ngDevMode ? [{ debugName: "fieldSize" }] : /* istanbul ignore next */ []));
|
|
449
|
+
/** Подсказка обрезается многоточием в узком поле, поэтому шаблон целиком виден при наведении. */
|
|
450
|
+
this.shapeTitle = computed(() => (this.hasValue() ? null : this.shape()), /* @ts-ignore */
|
|
451
|
+
...(ngDevMode ? [{ debugName: "shapeTitle" }] : /* istanbul ignore next */ []));
|
|
452
|
+
/** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */
|
|
453
|
+
this.appearance = input('outline', /* @ts-ignore */
|
|
454
|
+
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
455
|
+
this.displayText = computed(() => this.#format(this.range()), /* @ts-ignore */
|
|
456
|
+
...(ngDevMode ? [{ debugName: "displayText" }] : /* istanbul ignore next */ []));
|
|
457
|
+
/** Первый допустимый день `YYYY-MM-DD`. */
|
|
458
|
+
this.min = input(null, /* @ts-ignore */
|
|
459
|
+
...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
460
|
+
/** Последний допустимый день `YYYY-MM-DD`. */
|
|
461
|
+
this.max = input(null, /* @ts-ignore */
|
|
462
|
+
...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
463
|
+
}
|
|
464
|
+
/** Локаль кита: приложение, меняющее язык на ходу, меняет её, и текст поля пересчитывается. */
|
|
465
|
+
#locale;
|
|
466
|
+
/** Порядок дня, месяца и года в тексте поля — по локали кита. */
|
|
467
|
+
#layout;
|
|
468
|
+
/** Значение из формы снимает ошибку набора: в поле теперь стоит оно. */
|
|
469
|
+
writeValue(value) {
|
|
470
|
+
super.writeValue(value);
|
|
471
|
+
this.textInvalid.set(false);
|
|
472
|
+
}
|
|
473
|
+
getEmptyValue() {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
focusAfterClear() {
|
|
477
|
+
this.fieldEl()?.nativeElement.focus();
|
|
478
|
+
}
|
|
479
|
+
clearValue() {
|
|
480
|
+
super.clearValue();
|
|
481
|
+
this.#accept(null);
|
|
482
|
+
}
|
|
483
|
+
/** Набор текста: значение меняется, только когда текст читается как диапазон в границах. */
|
|
484
|
+
onTyped(event) {
|
|
485
|
+
const text = event.target.value;
|
|
486
|
+
if (text.trim() === '') {
|
|
487
|
+
this.#commit(null);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const read = rtRangeParse(text, this.#layout());
|
|
491
|
+
if (read === null || !rtRangeInBounds(read, this.min(), this.max())) {
|
|
492
|
+
this.textInvalid.set(true);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
this.#commit(read);
|
|
496
|
+
}
|
|
497
|
+
/** Кнопка в конце поля: на узком экране открывает шторку, на широком поповер открывает сам. */
|
|
498
|
+
openPanel() {
|
|
499
|
+
if (this.narrow() && !this.isDisabled()) {
|
|
500
|
+
this.sheetOpen.set(true);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
closePanel() {
|
|
504
|
+
this.sheetOpen.set(false);
|
|
505
|
+
this.popover()?.close();
|
|
506
|
+
}
|
|
507
|
+
onPicked(value) {
|
|
508
|
+
this.#commit(value);
|
|
509
|
+
this.markTouched();
|
|
510
|
+
}
|
|
511
|
+
onBlur() {
|
|
512
|
+
this.markTouched();
|
|
513
|
+
}
|
|
514
|
+
#commit(value) {
|
|
515
|
+
this.value.set(value);
|
|
516
|
+
this.emitChange(value);
|
|
517
|
+
this.#accept(value);
|
|
518
|
+
}
|
|
519
|
+
/** Текст в поле — принятое значение, ошибки набора нет. */
|
|
520
|
+
#accept(value) {
|
|
521
|
+
this.textInvalid.set(false);
|
|
522
|
+
const node = this.fieldEl()?.nativeElement;
|
|
523
|
+
if (node !== undefined) {
|
|
524
|
+
node.value = rtRangeText(value, this.#layout());
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/** Плоский текст для режима чтения: диапазон по локали, `15 – 20 мар. 2026 г.` под `ru`. */
|
|
528
|
+
#format(range) {
|
|
529
|
+
if (range === null) {
|
|
530
|
+
return '';
|
|
531
|
+
}
|
|
532
|
+
return new Intl.DateTimeFormat(this.#locale(), { dateStyle: 'medium', timeZone: 'UTC' }).formatRange(Date.parse(range.start), Date.parse(range.end));
|
|
533
|
+
}
|
|
534
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDateRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
535
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDateRangeComponent, isStandalone: true, selector: "rt-date-range", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.rt-date-range--disabled": "isDisabled()", "class.rt-date-range--invalid": "isInvalid() || textInvalid()", "class.rt-date-range--readonly": "isReadonly()", "class.rt-date-range--borderless": "!bordered()", "class.rt-date-range--appearance--fill": "appearance() === 'fill'", "class.rt-date-range--size--sm": "size() === 'sm'", "class.rt-date-range--size--lg": "size() === 'lg'" }, classAttribute: "rt-date-range" }, providers: [
|
|
536
|
+
// Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.
|
|
537
|
+
{ provide: RtFormControlBase, useExisting: forwardRef(() => RtDateRangeComponent) },
|
|
538
|
+
], viewQueries: [{ propertyName: "fieldEl", first: true, predicate: ["fieldEl"], descendants: true, isSignal: true }, { propertyName: "popover", first: true, predicate: RtPopoverDirective, descendants: true, isSignal: true }], usesInheritance: true, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-date-range\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"date-range-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '\u2014' }}</span>\n } @else {\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"date-range-control\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [value]=\"text()\"\n [disabled]=\"isDisabled()\"\n [attr.placeholder]=\"shape()\"\n [attr.title]=\"shapeTitle()\"\n [attr.size]=\"fieldSize()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || textInvalid() || null\"\n (input)=\"onTyped($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"date-range-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon-button\n rtElem=\"open\"\n qa-dataid=\"date-range-open\"\n icon=\"ico-calendar\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiOpenCalendar\"\n [disabled]=\"isDisabled()\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"narrow() || isDisabled()\"\n (clicked)=\"openPanel()\" />\n\n <ng-template #panelTpl>\n <div rtElem=\"popup\" qa-dataid=\"date-range-popup\">\n <rt-date-range-panel [value]=\"range()\" [min]=\"min()\" [max]=\"max()\" (picked)=\"onPicked($event)\" (closed)=\"closePanel()\" />\n </div>\n </ng-template>\n\n @if (narrow()) {\n <rt-bottom-sheet qa-dataid=\"date-range-sheet\" [open]=\"sheetOpen()\" (openChange)=\"sheetOpen.set($event)\">\n @if (sheetOpen()) {\n <rt-date-range-panel\n sheet\n [value]=\"range()\"\n [min]=\"min()\"\n [max]=\"max()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n }\n </rt-bottom-sheet>\n }\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-range{--rt-date-range-radius: var(--rt-input-radius);--rt-date-range-fill-radius: var(--rt-radius-sm);position:relative;display:inline-flex;width:100%;min-height:var(--rt-input-height);box-sizing:border-box;align-items:center;padding:var(--rt-input-padding-y) var(--rt-input-padding-x);border:var(--rt-input-border-width) solid var(--rt-input-color-border);border-radius:var(--rt-date-range-radius);background-color:var(--rt-input-color-bg);color:var(--rt-input-color-text);cursor:text;font-size:var(--rt-input-font-size);gap:var(--rt-space-sm);line-height:var(--rt-input-line-height);transition:var(--rt-input-transition)}.rt-date-range:focus-within{border-color:var(--rt-input-color-border-focus);box-shadow:var(--rt-input-focus-shadow);outline:2px solid transparent;outline-offset:var(--rt-input-focus-outline-offset)}.rt-date-range--borderless{border-color:transparent}.rt-date-range--appearance--fill{border-color:transparent;border-radius:var(--rt-date-range-fill-radius) var(--rt-date-range-fill-radius) 0 0;border-bottom-color:var(--rt-color-field-fill-underline);background-color:var(--rt-color-bg-surface-subtle-2)}.rt-date-range--invalid{border-color:var(--rt-input-color-border-error)}.rt-date-range--invalid:focus-within{box-shadow:var(--rt-input-focus-shadow-error)}.rt-date-range--disabled{cursor:not-allowed;opacity:var(--rt-input-disabled-opacity)}.rt-date-range--size--sm{min-height:var(--rt-input-height-sm)}.rt-date-range--size--lg{min-height:var(--rt-input-height-lg)}.rt-date-range--readonly{padding-right:0;padding-left:0;border-color:transparent;background-color:transparent;cursor:default}.rt-date-range__readonly{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-date-range__readonly--empty{color:var(--rt-field-value-empty-color)}.rt-date-range__field{min-width:0;flex:1 1 auto;padding:0;border:none;background:transparent;color:inherit;font:inherit;outline:none;text-overflow:ellipsis}.rt-date-range__field:disabled{cursor:not-allowed}.rt-date-range__clear,.rt-date-range__open{flex-shrink:0}.rt-date-range__popup{border:var(--rt-overlay-select-panel-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-overlay-select-radius);background-color:var(--rt-color-bg-surface);box-shadow:var(--rt-overlay-select-shadow)}.rt-date-range[data-rt-radius=none]{--rt-date-range-radius: var(--rt-radius-none)}.rt-date-range[data-rt-radius=xs]{--rt-date-range-radius: var(--rt-radius-xs)}.rt-date-range[data-rt-radius=sm]{--rt-date-range-radius: var(--rt-radius-sm)}.rt-date-range[data-rt-radius=ms]{--rt-date-range-radius: var(--rt-radius-ms)}.rt-date-range[data-rt-radius=md]{--rt-date-range-radius: var(--rt-radius-md)}.rt-date-range[data-rt-radius=lg]{--rt-date-range-radius: var(--rt-radius-lg)}.rt-date-range[data-rt-radius=xl]{--rt-date-range-radius: var(--rt-radius-xl)}.rt-date-range[data-rt-radius=\"2xl\"]{--rt-date-range-radius: var(--rt-radius-2xl)}.rt-date-range[data-rt-radius=full]{--rt-date-range-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "component", type:
|
|
539
|
+
// standalone components / directives
|
|
540
|
+
RtBottomSheetComponent, selector: "rt-bottom-sheet", inputs: ["open"], outputs: ["openChange"] }, { kind: "component", type: RtDateRangePanelComponent, selector: "rt-date-range-panel", inputs: ["value", "min", "max", "sheet", "now"], outputs: ["picked", "closed"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "directive", type: RtPopoverDirective, selector: "[rtPopover]", inputs: ["rtPopover", "rtPopoverTrigger", "rtPopoverWidth", "rtPopoverAlign", "rtPopoverFitViewport", "rtPopoverContext", "rtPopoverPanelClass", "rtPopoverDisabled", "rtPopoverOffsetY", "rtPopoverOffsetX"], outputs: ["rtPopoverOpened", "rtPopoverClosed"], exportAs: ["rtPopover"] }, { 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 }); }
|
|
541
|
+
}
|
|
542
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDateRangeComponent, decorators: [{
|
|
543
|
+
type: Component,
|
|
544
|
+
args: [{ selector: 'rt-date-range', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
545
|
+
// standalone components / directives
|
|
546
|
+
RtBottomSheetComponent,
|
|
547
|
+
RtDateRangePanelComponent,
|
|
548
|
+
RtIconButtonComponent,
|
|
549
|
+
RtPopoverDirective,
|
|
550
|
+
BlockDirective,
|
|
551
|
+
ElemDirective,
|
|
552
|
+
ModDirective,
|
|
553
|
+
], providers: [
|
|
554
|
+
// Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.
|
|
555
|
+
{ provide: RtFormControlBase, useExisting: forwardRef(() => RtDateRangeComponent) },
|
|
556
|
+
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
557
|
+
class: BEM_BLOCK,
|
|
558
|
+
'[class.rt-date-range--disabled]': 'isDisabled()',
|
|
559
|
+
'[class.rt-date-range--invalid]': 'isInvalid() || textInvalid()',
|
|
560
|
+
'[class.rt-date-range--readonly]': 'isReadonly()',
|
|
561
|
+
'[class.rt-date-range--borderless]': '!bordered()',
|
|
562
|
+
'[class.rt-date-range--appearance--fill]': "appearance() === 'fill'",
|
|
563
|
+
'[class.rt-date-range--size--sm]': "size() === 'sm'",
|
|
564
|
+
'[class.rt-date-range--size--lg]': "size() === 'lg'",
|
|
565
|
+
}, template: "<ng-container rtBlock=\"rt-date-range\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" qa-dataid=\"date-range-readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '\u2014' }}</span>\n } @else {\n <input\n #fieldEl\n rtElem=\"field\"\n qa-dataid=\"date-range-control\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [value]=\"text()\"\n [disabled]=\"isDisabled()\"\n [attr.placeholder]=\"shape()\"\n [attr.title]=\"shapeTitle()\"\n [attr.size]=\"fieldSize()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"isInvalid() || textInvalid() || null\"\n (input)=\"onTyped($event)\"\n (blur)=\"onBlur()\" />\n @if (showClearButton()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"date-range-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n <rt-icon-button\n rtElem=\"open\"\n qa-dataid=\"date-range-open\"\n icon=\"ico-calendar\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n rtPopoverAlign=\"end\"\n [ariaLabel]=\"t().uiOpenCalendar\"\n [disabled]=\"isDisabled()\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"narrow() || isDisabled()\"\n (clicked)=\"openPanel()\" />\n\n <ng-template #panelTpl>\n <div rtElem=\"popup\" qa-dataid=\"date-range-popup\">\n <rt-date-range-panel [value]=\"range()\" [min]=\"min()\" [max]=\"max()\" (picked)=\"onPicked($event)\" (closed)=\"closePanel()\" />\n </div>\n </ng-template>\n\n @if (narrow()) {\n <rt-bottom-sheet qa-dataid=\"date-range-sheet\" [open]=\"sheetOpen()\" (openChange)=\"sheetOpen.set($event)\">\n @if (sheetOpen()) {\n <rt-date-range-panel\n sheet\n [value]=\"range()\"\n [min]=\"min()\"\n [max]=\"max()\"\n (picked)=\"onPicked($event)\"\n (closed)=\"closePanel()\" />\n }\n </rt-bottom-sheet>\n }\n }\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-date-range{--rt-date-range-radius: var(--rt-input-radius);--rt-date-range-fill-radius: var(--rt-radius-sm);position:relative;display:inline-flex;width:100%;min-height:var(--rt-input-height);box-sizing:border-box;align-items:center;padding:var(--rt-input-padding-y) var(--rt-input-padding-x);border:var(--rt-input-border-width) solid var(--rt-input-color-border);border-radius:var(--rt-date-range-radius);background-color:var(--rt-input-color-bg);color:var(--rt-input-color-text);cursor:text;font-size:var(--rt-input-font-size);gap:var(--rt-space-sm);line-height:var(--rt-input-line-height);transition:var(--rt-input-transition)}.rt-date-range:focus-within{border-color:var(--rt-input-color-border-focus);box-shadow:var(--rt-input-focus-shadow);outline:2px solid transparent;outline-offset:var(--rt-input-focus-outline-offset)}.rt-date-range--borderless{border-color:transparent}.rt-date-range--appearance--fill{border-color:transparent;border-radius:var(--rt-date-range-fill-radius) var(--rt-date-range-fill-radius) 0 0;border-bottom-color:var(--rt-color-field-fill-underline);background-color:var(--rt-color-bg-surface-subtle-2)}.rt-date-range--invalid{border-color:var(--rt-input-color-border-error)}.rt-date-range--invalid:focus-within{box-shadow:var(--rt-input-focus-shadow-error)}.rt-date-range--disabled{cursor:not-allowed;opacity:var(--rt-input-disabled-opacity)}.rt-date-range--size--sm{min-height:var(--rt-input-height-sm)}.rt-date-range--size--lg{min-height:var(--rt-input-height-lg)}.rt-date-range--readonly{padding-right:0;padding-left:0;border-color:transparent;background-color:transparent;cursor:default}.rt-date-range__readonly{color:var(--rt-field-value-color);font-size:var(--rt-field-value-font-size)}.rt-date-range__readonly--empty{color:var(--rt-field-value-empty-color)}.rt-date-range__field{min-width:0;flex:1 1 auto;padding:0;border:none;background:transparent;color:inherit;font:inherit;outline:none;text-overflow:ellipsis}.rt-date-range__field:disabled{cursor:not-allowed}.rt-date-range__clear,.rt-date-range__open{flex-shrink:0}.rt-date-range__popup{border:var(--rt-overlay-select-panel-border-width) solid var(--rt-color-border-subtle);border-radius:var(--rt-overlay-select-radius);background-color:var(--rt-color-bg-surface);box-shadow:var(--rt-overlay-select-shadow)}.rt-date-range[data-rt-radius=none]{--rt-date-range-radius: var(--rt-radius-none)}.rt-date-range[data-rt-radius=xs]{--rt-date-range-radius: var(--rt-radius-xs)}.rt-date-range[data-rt-radius=sm]{--rt-date-range-radius: var(--rt-radius-sm)}.rt-date-range[data-rt-radius=ms]{--rt-date-range-radius: var(--rt-radius-ms)}.rt-date-range[data-rt-radius=md]{--rt-date-range-radius: var(--rt-radius-md)}.rt-date-range[data-rt-radius=lg]{--rt-date-range-radius: var(--rt-radius-lg)}.rt-date-range[data-rt-radius=xl]{--rt-date-range-radius: var(--rt-radius-xl)}.rt-date-range[data-rt-radius=\"2xl\"]{--rt-date-range-radius: var(--rt-radius-2xl)}.rt-date-range[data-rt-radius=full]{--rt-date-range-radius: var(--rt-radius-full)}}\n"] }]
|
|
566
|
+
}], propDecorators: { fieldEl: [{ type: i0.ViewChild, args: ['fieldEl', { isSignal: true }] }], popover: [{ type: i0.ViewChild, args: [i0.forwardRef(() => RtPopoverDirective), { isSignal: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }] } });
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Generated bundle index. Do not edit.
|
|
570
|
+
*/
|
|
571
|
+
|
|
572
|
+
export { ERtDateRangePreset, RtDateRangeComponent };
|
|
573
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-date-range.mjs.map
|