@rt-tools/ui-kit-v2 0.17.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 +18 -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-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 -23819
- 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/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/field/CONTEXT.md +18 -2
- package/src/lib/components/select/rt-select.component.scss +4 -0
- package/src/styles/_semantic.scss +1 -1
- package/styles/tokens.css +8 -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-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 -9599
- package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Signal, InputSignal, OutputEmitterRef } from '@angular/core';
|
|
3
|
+
import { IRtIcon } from '@rt-tools/ui-kit-v2/core';
|
|
4
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Контракты полосы массовых действий. Один корневой неймспейс с префиксом `I`.
|
|
8
|
+
*
|
|
9
|
+
* Отличие от договора первого кита одно и оно намеренное: произвольного объекта
|
|
10
|
+
* стилей на действии здесь нет. Вид кнопки называется именем из набора кита —
|
|
11
|
+
* значение цвета в разметку не приходит вовсе.
|
|
12
|
+
*/
|
|
13
|
+
declare namespace IRtActionBar {
|
|
14
|
+
/** Вид действия: тем же именем, каким его зовёт кнопка кита. */
|
|
15
|
+
type Look = 'plain' | 'danger';
|
|
16
|
+
/**
|
|
17
|
+
* Одно нажатие в полосе. Либо `run` — то, что действие делает, — либо `menu`:
|
|
18
|
+
* вложенный список. Действие с вложенным списком само не срабатывает: оно
|
|
19
|
+
* заголовок группы, и запуск его наравне с раскрытием запустил бы то, чего
|
|
20
|
+
* человек не выбирал.
|
|
21
|
+
*/
|
|
22
|
+
interface Action {
|
|
23
|
+
readonly label: string;
|
|
24
|
+
readonly icon?: IRtIcon.Name;
|
|
25
|
+
readonly look?: IRtActionBar.Look;
|
|
26
|
+
readonly run?: () => void;
|
|
27
|
+
readonly menu?: readonly IRtActionBar.Action[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Настройка полосы целиком. Счёт приходит парой: сколько выбрано и сколько
|
|
31
|
+
* всего. Полоса ничего из этого не считает — ей дают числа.
|
|
32
|
+
*/
|
|
33
|
+
interface Config {
|
|
34
|
+
readonly selected: number;
|
|
35
|
+
readonly total: number;
|
|
36
|
+
readonly actions: readonly IRtActionBar.Action[];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Сколько полоса держится в разметке после закрытия — ровно длительность ухода
|
|
41
|
+
* из стилей.
|
|
42
|
+
*
|
|
43
|
+
* Число живёт здесь, а не только в правиле стиля: разметку снимает держатель, и,
|
|
44
|
+
* разойдясь с правилом, он обрывает уход на полпути. Держателю и стилям нужно
|
|
45
|
+
* одно и то же число, поэтому оно объявлено рядом с договором, а не в одном из них.
|
|
46
|
+
*/
|
|
47
|
+
declare const RT_ACTION_BAR_LEAVE_MS: number;
|
|
48
|
+
|
|
49
|
+
/** Действие вместе с готовой записью модификаторов: шаблон методов не зовёт. */
|
|
50
|
+
interface IActionView {
|
|
51
|
+
readonly action: IRtActionBar.Action;
|
|
52
|
+
readonly modifiers: Readonly<Record<string, boolean>>;
|
|
53
|
+
/**
|
|
54
|
+
* Имя кнопки для вспомогательных средств — у действия со значком. На грубом указателе подпись
|
|
55
|
+
* снята правилом стиля, а значок немой: без имени кнопка осталась бы безымянной.
|
|
56
|
+
*/
|
|
57
|
+
readonly ariaLabel: string | null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Полоса массовых действий: счёт слева, действия рядом, крестик справа.
|
|
61
|
+
*
|
|
62
|
+
* Своего состояния не держит вовсе — ни выбранного, ни открытости. Ей дают
|
|
63
|
+
* настройку входом, а наружу она сообщает две вещи: что нажали действие и что
|
|
64
|
+
* нажали крестик. Держатель `rt-action-bar-holder` решает, стоит ли она в
|
|
65
|
+
* разметке и где над страницей приколота.
|
|
66
|
+
*
|
|
67
|
+
* Действие с вложенным списком само не срабатывает: оно заголовок группы, и
|
|
68
|
+
* список раскрывается всплывающим слоем кита. Нажатие пункта списка закрывает
|
|
69
|
+
* полосу так же, как нажатие обычного действия: где человек нажал — в полосе
|
|
70
|
+
* или на шаг глубже — о трате выбранного не говорит ничего.
|
|
71
|
+
*/
|
|
72
|
+
declare class RtActionBarComponent {
|
|
73
|
+
#private;
|
|
74
|
+
protected readonly countText: Signal<string>;
|
|
75
|
+
protected readonly closeLabel: Signal<string>;
|
|
76
|
+
/**
|
|
77
|
+
* Действия с готовыми модификаторами. Признак значка стоит модификатором, а не
|
|
78
|
+
* условием в шаблоне: подпись у действия со значком снимает правило стиля по
|
|
79
|
+
* грубому указателю, и решать это условием значило бы увезти оформление в код.
|
|
80
|
+
*/
|
|
81
|
+
protected readonly actions: Signal<readonly IActionView[]>;
|
|
82
|
+
readonly config: InputSignal<IRtActionBar.Config>;
|
|
83
|
+
readonly actionRun: OutputEmitterRef<IRtActionBar.Action>;
|
|
84
|
+
readonly closed: OutputEmitterRef<void>;
|
|
85
|
+
protected onAction(action: IRtActionBar.Action): void;
|
|
86
|
+
protected onClose(): void;
|
|
87
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtActionBarComponent, never>;
|
|
88
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtActionBarComponent, "rt-action-bar", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; }, { "actionRun": "actionRun"; "closed": "closed"; }, never, never, true, [{ directive: typeof i1.RtRadiusDirective; inputs: { "radius": "radius"; }; outputs: {}; }]>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Держатель полосы массовых действий: решает, стоит ли она в разметке, и прикалывает
|
|
93
|
+
* её над страницей. Настройку читает у службы, которую потребитель объявил на своём
|
|
94
|
+
* уровне — там, где у него живёт список.
|
|
95
|
+
*
|
|
96
|
+
* Полоса открывается счётом выбранного, а не своим признаком: два источника одного
|
|
97
|
+
* признака расходятся молча, и признак, оставшийся поднятым над опустевшим выбором,
|
|
98
|
+
* держал бы полосу над страницей, где ничего не выбрано.
|
|
99
|
+
*
|
|
100
|
+
* После закрытия полоса остаётся в разметке ровно на длительность ухода — число одно
|
|
101
|
+
* и лежит в договоре рядом. Разойдясь с правилом стиля, держатель обрывал бы уход на
|
|
102
|
+
* полпути.
|
|
103
|
+
*/
|
|
104
|
+
declare class RtActionBarHolderComponent {
|
|
105
|
+
#private;
|
|
106
|
+
protected readonly config: Signal<IRtActionBar.Config>;
|
|
107
|
+
/** Выбрано ли что-нибудь: этим полоса и открывается. */
|
|
108
|
+
protected readonly opened: Signal<boolean>;
|
|
109
|
+
/** Стоит ли полоса в разметке: она остаётся в ней и на время ухода. */
|
|
110
|
+
protected readonly shown: Signal<boolean>;
|
|
111
|
+
protected readonly leaving: Signal<boolean>;
|
|
112
|
+
constructor();
|
|
113
|
+
/** Крестик сообщает наружу; выбранное отпускает служба, которой список и владеет. */
|
|
114
|
+
protected onClosed(): void;
|
|
115
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtActionBarHolderComponent, never>;
|
|
116
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtActionBarHolderComponent, "rt-action-bar-holder", never, {}, {}, never, never, true, never>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Настройка полосы массовых действий: держатель её читает, список — пишет.
|
|
121
|
+
*
|
|
122
|
+
* Служба без корня намеренно. Тот, кто отмечает строки, и тот, кто рисует полосу,
|
|
123
|
+
* стоят на разной глубине одного экрана, и передавать настройку вниз через всё,
|
|
124
|
+
* что между ними, значит рассказать о полосе каждому из них. Потребитель
|
|
125
|
+
* объявляет службу на своём уровне — там, где у него живёт список.
|
|
126
|
+
*/
|
|
127
|
+
declare class RtActionBarService {
|
|
128
|
+
#private;
|
|
129
|
+
readonly config: Signal<IRtActionBar.Config>;
|
|
130
|
+
/** Список действий. Счёт не трогается: он приходит своим вызовом. */
|
|
131
|
+
setActions(actions: readonly IRtActionBar.Action[]): void;
|
|
132
|
+
/** Счёт выбранного. Полоса открывается именно им. */
|
|
133
|
+
setCounts(selected: number, total: number): void;
|
|
134
|
+
/** Отпустить выбранное: счёт обнуляется, список действий остаётся. */
|
|
135
|
+
clearSelection(): void;
|
|
136
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtActionBarService, never>;
|
|
137
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { IRtActionBar, RT_ACTION_BAR_LEAVE_MS, RtActionBarComponent, RtActionBarHolderComponent, RtActionBarService };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InputSignal } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Смысловая секция внутри асайда: единый вертикальный ритм между полями и
|
|
6
|
+
* необязательный заголовок одного стиля. Заменяет разнобой из `fieldset`,
|
|
7
|
+
* самопальных `div`-секций, `h3` и `<legend>`, которым раньше каждый диалог
|
|
8
|
+
* группировал контент по-своему.
|
|
9
|
+
*
|
|
10
|
+
* Заголовок (`[heading]`) рендерится только когда задан. Соседние секции
|
|
11
|
+
* автоматически разделяются верхней границей — отдельный разделитель в
|
|
12
|
+
* потребителе не нужен.
|
|
13
|
+
*
|
|
14
|
+
* Внутри секция размечена словарём формы панели: тело — колонкой контролов,
|
|
15
|
+
* заголовок — заголовком раздела. Ритм между ними приходит зазорами словаря,
|
|
16
|
+
* поэтому панель, собранная из готовых секций, и панель, размеченная словарём
|
|
17
|
+
* вручную, стоят одинаково.
|
|
18
|
+
*/
|
|
19
|
+
declare class RtAsideSectionComponent {
|
|
20
|
+
readonly heading: InputSignal<string | null>;
|
|
21
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideSectionComponent, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideSectionComponent, "rt-aside-section", never, { "heading": { "alias": "heading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { RtAsideSectionComponent };
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { BooleanInput } from '@angular/cdk/coercion';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { Signal, ElementRef, InputSignal, InputSignalWithTransform, WritableSignal, Renderer2, Injector, InjectionToken, OutputEmitterRef } from '@angular/core';
|
|
4
|
+
import { OverlayRef, ComponentType } from '@angular/cdk/overlay';
|
|
5
|
+
import { Subject, Observable } from 'rxjs';
|
|
6
|
+
import { TRtRadius, IRtIcon, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';
|
|
7
|
+
import { IRtTag } from '@rt-tools/ui-kit-v2/tag';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Варианты ширины side-sheet:
|
|
11
|
+
* - `sm` — 400px (`--rt-aside-width-sm`)
|
|
12
|
+
* - `md` — 540px (`--rt-aside-width-md`, дефолт)
|
|
13
|
+
* - `lg` — 720px (`--rt-aside-width-lg`)
|
|
14
|
+
*/
|
|
15
|
+
type TRtAsideSize = 'sm' | 'md' | 'lg';
|
|
16
|
+
/**
|
|
17
|
+
* Раскладка контентной зоны side-sheet:
|
|
18
|
+
* - `default` — контентная зона сама скроллится при overflow (штатный режим);
|
|
19
|
+
* - `tabs` — контент — это `rt-tabs`: внешняя зона перестаёт быть скроллером,
|
|
20
|
+
* полоса вкладок прибита, скроллится только контент активной вкладки
|
|
21
|
+
* (`rt-tabs__content`).
|
|
22
|
+
*/
|
|
23
|
+
type TRtAsideContentLayout = 'default' | 'tabs';
|
|
24
|
+
/**
|
|
25
|
+
* Презентационный styled-frame для side-sheet.
|
|
26
|
+
*
|
|
27
|
+
* Видимость / backdrop / scroll-block / ESC / slide-in анимация — НЕ внутренняя
|
|
28
|
+
* ответственность компонента. Это обеспечивает CDK Overlay через
|
|
29
|
+
* `RtAsideService.open()`. rt-aside здесь — стилизованная "рамка" с size-вариантами
|
|
30
|
+
* и тремя слотами: `rt-aside-header`, содержимое и `rt-aside-footer`.
|
|
31
|
+
*
|
|
32
|
+
* Содержимое лежит в одной зоне `.rt-aside__content` — она и держит инсет панели,
|
|
33
|
+
* и прокручивается. Пока зоны не было, каждый корневой узел содержимого получал
|
|
34
|
+
* инсет и прокрутку сам по себе: разделы делили высоту панели между собой, а
|
|
35
|
+
* обводка фокуса поля срезалась краем такого мини-скроллера.
|
|
36
|
+
*
|
|
37
|
+
* Семантика — `role="complementary"` (mirror rt-dialog имеет `role="dialog"`,
|
|
38
|
+
* aside — другая роль, side-sheet не обязательно блокирующий).
|
|
39
|
+
*
|
|
40
|
+
* `ViewEncapsulation.None` — стили префиксованы `.rt-aside`, чтобы соседние
|
|
41
|
+
* rt-aside-header / rt-aside-footer работали с одним BEM-блоком без
|
|
42
|
+
* cross-encapsulation хака.
|
|
43
|
+
*/
|
|
44
|
+
declare class RtAsideComponent {
|
|
45
|
+
#private;
|
|
46
|
+
protected readonly frame: Signal<ElementRef<HTMLElement>>;
|
|
47
|
+
protected readonly hasRequestError: Signal<boolean>;
|
|
48
|
+
readonly size: InputSignal<TRtAsideSize>;
|
|
49
|
+
readonly contentLayout: InputSignal<TRtAsideContentLayout>;
|
|
50
|
+
readonly width: InputSignal<string | null>;
|
|
51
|
+
readonly ariaLabel: InputSignal<string | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Ошибка неудавшегося запроса. Пока она есть, между шапкой и содержимым стоит блок ошибки с
|
|
54
|
+
* кнопкой копирования; `null` и `undefined` — ошибки нет, любое другое значение её показывает.
|
|
55
|
+
*/
|
|
56
|
+
readonly requestError: InputSignal<unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* Держать Tab внутри панели. При включении фокус уходит на `[cdkFocusInitial]` или первый
|
|
59
|
+
* элемент под Tab, а когда панель уходит или вход гаснет, возвращается туда, где стоял.
|
|
60
|
+
*/
|
|
61
|
+
readonly trapFocus: InputSignalWithTransform<boolean, BooleanInput>;
|
|
62
|
+
/** Идёт запрос: панель накрыта слоем с крутилкой и помечена занятой. */
|
|
63
|
+
readonly pending: InputSignalWithTransform<boolean, BooleanInput>;
|
|
64
|
+
constructor();
|
|
65
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideComponent, never>;
|
|
66
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideComponent, "rt-aside", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "contentLayout": { "alias": "contentLayout"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "requestError": { "alias": "requestError"; "required": false; "isSignal": true; }; "trapFocus": { "alias": "trapFocus"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; }, {}, never, ["rt-aside-header", "*", "rt-aside-footer"], true, never>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Жест закрытия, на который панель не закрылась: `Escape` или нажатие по подложке. Панель
|
|
71
|
+
* отказывает в нём под `disableClose()` и когда жест выключен настройкой открытия.
|
|
72
|
+
*/
|
|
73
|
+
type TRtAsideCloseRequest = 'escape' | 'backdrop';
|
|
74
|
+
/**
|
|
75
|
+
* Хэндл к программно открытой side-sheet (через `RtAsideService.open()`).
|
|
76
|
+
*
|
|
77
|
+
* Контент-компонент инжектит `RtAsideRef` и закрывает aside через `.close(result?)`.
|
|
78
|
+
* Родитель ждёт результата через `.afterClosed()`.
|
|
79
|
+
*
|
|
80
|
+
* Generic `<T>` — тип результата `close(result)`. Дефолт `unknown` — если результат
|
|
81
|
+
* не нужен, оставляй generic пустым.
|
|
82
|
+
*
|
|
83
|
+
* Lifecycle close():
|
|
84
|
+
* 1. Race-guard `#isClosing` гарантирует один эмит даже при двойном вызове.
|
|
85
|
+
* 2. Снимает `rt-aside-overlay--open` и ставит `rt-aside-overlay--leaving` на host —
|
|
86
|
+
* CSS-transition (200ms) играет slide-out.
|
|
87
|
+
* 3. Эмиттит result в `afterClosed()` СРАЗУ (consumer не ждёт анимацию).
|
|
88
|
+
* 4. Через `setTimeout(200ms)` зовёт `overlayRef.dispose()` — overlay убран после анимации.
|
|
89
|
+
*
|
|
90
|
+
* Слой, снятый без `close()` — переходом по адресу (`disposeOnNavigation`) или уничтожением
|
|
91
|
+
* хозяина, — тоже завершает `afterClosed()`: подписчик получает `undefined`.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* \`\`\`ts
|
|
95
|
+
* // в контент-компоненте
|
|
96
|
+
* private readonly asideRef = inject(RtAsideRef<{ saved: boolean }>);
|
|
97
|
+
* onSave(): void { this.asideRef.close({ saved: true }); }
|
|
98
|
+
*
|
|
99
|
+
* // в родителе
|
|
100
|
+
* asideService.open(EditAsideComponent).afterClosed().subscribe(result => {...});
|
|
101
|
+
* \`\`\`
|
|
102
|
+
*/
|
|
103
|
+
declare class RtAsideRef<T = unknown> {
|
|
104
|
+
#private;
|
|
105
|
+
/**
|
|
106
|
+
* Runtime-флаг, блокирующий close() через ESC / backdrop click.
|
|
107
|
+
*
|
|
108
|
+
* Default `false`. Включай (`asideRef.disableClose.set(true)`) на время
|
|
109
|
+
* in-flight submit'а, чтобы юзер не потерял введённые в форму данные.
|
|
110
|
+
* Программный `close(result)` гейтом не задет — он всегда закрывает.
|
|
111
|
+
*/
|
|
112
|
+
readonly disableClose: WritableSignal<boolean>;
|
|
113
|
+
/**
|
|
114
|
+
* `closeRequestsSource` наполняет служба: она слушает жесты и знает, отказала ли в них панель.
|
|
115
|
+
* Хэндл только завершает поток вместе с панелью.
|
|
116
|
+
*/
|
|
117
|
+
constructor(overlayRef: OverlayRef, renderer: Renderer2, closeRequestsSource?: Subject<TRtAsideCloseRequest>);
|
|
118
|
+
/** Закрывает overlay со slide-out анимацией; эмиттит result в `afterClosed()` синхронно. */
|
|
119
|
+
close(result?: T): void;
|
|
120
|
+
/** Эмиттит один раз — результат `close(result)` или `undefined` при снятом слое — и завершается. */
|
|
121
|
+
afterClosed(): Observable<T | undefined>;
|
|
122
|
+
/**
|
|
123
|
+
* Жесты закрытия, в которых панель отказала: `Escape` и нажатие по подложке под
|
|
124
|
+
* `disableClose()` или выключенные настройкой. Завершается вместе с панелью.
|
|
125
|
+
*/
|
|
126
|
+
closeRequests(): Observable<TRtAsideCloseRequest>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Позиционирование side-sheet — у какого края viewport "приклеена" панель.
|
|
131
|
+
*/
|
|
132
|
+
type TRtAsidePosition = 'right' | 'left';
|
|
133
|
+
/**
|
|
134
|
+
* Конфигурация открытия side-sheet через `RtAsideService.open()`.
|
|
135
|
+
*/
|
|
136
|
+
interface IRtAsideConfig<TData = unknown> {
|
|
137
|
+
/** Данные, доступные внутри aside'а через `inject(RT_ASIDE_DATA)`. */
|
|
138
|
+
data?: TData;
|
|
139
|
+
/** Дополнительный CSS-класс для backdrop (поверх стандартного `rt-aside-backdrop`). */
|
|
140
|
+
backdropClass?: string | string[];
|
|
141
|
+
/** Дополнительный CSS-класс для panel-обёртки overlay (поверх `rt-aside-overlay`). */
|
|
142
|
+
panelClass?: string | string[];
|
|
143
|
+
/** Закрывать aside по клику на backdrop. По дефолту `true`. */
|
|
144
|
+
closeOnBackdropClick?: boolean;
|
|
145
|
+
/** Закрывать aside по ESC. По дефолту `true`. */
|
|
146
|
+
closeOnEscape?: boolean;
|
|
147
|
+
/** К какому краю viewport "приклеить" панель. По дефолту `"right"`. */
|
|
148
|
+
position?: TRtAsidePosition;
|
|
149
|
+
/**
|
|
150
|
+
* Injector хозяина панели — обычно `inject(Injector)` открывающего компонента. Он становится
|
|
151
|
+
* родителем портала: содержимое видит провайдеры хозяина. Уничтожение хозяина закрывает
|
|
152
|
+
* панель через `close()`. Без него родитель — корневой injector, и панель живёт сама по себе.
|
|
153
|
+
*/
|
|
154
|
+
injector?: Injector;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Программный API для открытия side-sheet поверх CDK Overlay.
|
|
158
|
+
*
|
|
159
|
+
* Архитектурно зеркалит `RtDialogService`, отличаясь только positionStrategy
|
|
160
|
+
* (edge-anchored: `right('0')` / `left('0')` + `top('0')`) и slide-in анимацией,
|
|
161
|
+
* которая триггерится через CSS-классы на overlay host (`Renderer2` инжектится
|
|
162
|
+
* через `RendererFactory2`, потому что в service нет ComponentRef).
|
|
163
|
+
*
|
|
164
|
+
* Lifecycle:
|
|
165
|
+
* 1. `overlay.create({ panelClass: [..., '--entering'] })` — host получает initial
|
|
166
|
+
* CSS-стейт (translateX(±100%)).
|
|
167
|
+
* 2. `overlayRef.attach(portal)` — контент-компонент монтируется в host.
|
|
168
|
+
* 3. На следующий paint (`requestAnimationFrame`) сервис снимает `--entering` и
|
|
169
|
+
* добавляет `--open` — CSS-transition сделает slide-in.
|
|
170
|
+
* 4. На `ref.close(result)` ref добавляет `--leaving`, эмиттит result синхронно,
|
|
171
|
+
* deferred `dispose()` через 200ms (длительность анимации).
|
|
172
|
+
*
|
|
173
|
+
* Альтернатива rt-dialog — для длинных форм / мастеров / side-panels, где
|
|
174
|
+
* центрированная модалка ощущается тесной. Не предназначено для подтверждений
|
|
175
|
+
* или коротких диалогов (для этого — `RtDialogService`).
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* \`\`\`ts
|
|
179
|
+
* private readonly asideService = inject(RtAsideService);
|
|
180
|
+
*
|
|
181
|
+
* openProfile(userId: number): void {
|
|
182
|
+
* const ref = this.asideService.open<GuestProfileAsideComponent, { userId: number }, void>(
|
|
183
|
+
* GuestProfileAsideComponent,
|
|
184
|
+
* { data: { userId }, position: "right" }
|
|
185
|
+
* );
|
|
186
|
+
* ref.afterClosed().subscribe(() => this.reloadList());
|
|
187
|
+
* }
|
|
188
|
+
*
|
|
189
|
+
* // контент-компонент
|
|
190
|
+
* @Component({ ... })
|
|
191
|
+
* export class GuestProfileAsideComponent {
|
|
192
|
+
* readonly data = inject(RT_ASIDE_DATA) as { userId: number };
|
|
193
|
+
* readonly #ref = inject(RtAsideRef);
|
|
194
|
+
* close(): void { this.#ref.close(); }
|
|
195
|
+
* }
|
|
196
|
+
* \`\`\`
|
|
197
|
+
*/
|
|
198
|
+
declare class RtAsideService {
|
|
199
|
+
#private;
|
|
200
|
+
constructor();
|
|
201
|
+
open<TComponent, TData = unknown, TResult = unknown>(component: ComponentType<TComponent>, config?: IRtAsideConfig<TData>): RtAsideRef<TResult>;
|
|
202
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideService, never>;
|
|
203
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<any>;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Injection token для передачи данных в side-sheet, открытую через `RtAsideService.open()`.
|
|
208
|
+
*
|
|
209
|
+
* Пользовательский компонент-контент aside'а инжектит токен и получает данные,
|
|
210
|
+
* переданные в `IRtAsideConfig.data`. Тип значения задаётся generic'ом — `inject(RT_ASIDE_DATA)`
|
|
211
|
+
* вернёт `unknown`, прокастуй через `inject(RT_ASIDE_DATA) as MyDataType` ИЛИ
|
|
212
|
+
* объяви токен с конкретным generic'ом в feature-либе.
|
|
213
|
+
*
|
|
214
|
+
* Намеренно отдельный токен от `RT_DIALOG_DATA`, чтобы type-checker не путал контексты
|
|
215
|
+
* (rt-dialog vs rt-aside) — оба сервиса могут существовать в одном DI-дереве.
|
|
216
|
+
*
|
|
217
|
+
* @example
|
|
218
|
+
* \`\`\`ts
|
|
219
|
+
* @Component({...})
|
|
220
|
+
* export class GuestProfileAsideComponent {
|
|
221
|
+
* readonly data = inject(RT_ASIDE_DATA) as { userId: number };
|
|
222
|
+
* }
|
|
223
|
+
*
|
|
224
|
+
* // parent
|
|
225
|
+
* asideService.open(GuestProfileAsideComponent, { data: { userId: 42 } });
|
|
226
|
+
* \`\`\`
|
|
227
|
+
*/
|
|
228
|
+
declare const RT_ASIDE_DATA: InjectionToken<unknown>;
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Контракты `rt-aside-header`. Один корневой неймспейс с
|
|
232
|
+
* префиксом `I`. `Badge` описывает один тег в ряду под заголовком — обёртка
|
|
233
|
+
* над `rt-tag`-инпутами с дефолтами, чтобы потребитель задавал только нужное.
|
|
234
|
+
*/
|
|
235
|
+
declare namespace IRtAsideHeader {
|
|
236
|
+
/** Конфиг одного бэйджа в ряду под заголовком (проксирует инпуты `rt-tag`). */
|
|
237
|
+
interface Badge {
|
|
238
|
+
/** Текст бэйджа. */
|
|
239
|
+
value: string;
|
|
240
|
+
/** Палитра. Дефолт потребления — `neutral`. */
|
|
241
|
+
severity?: IRtTag.Severity;
|
|
242
|
+
/** Вид заливки. Дефолт потребления — `solid`. */
|
|
243
|
+
appearance?: IRtTag.Appearance;
|
|
244
|
+
/** Шаг скругления метки. Пусто — `md`. */
|
|
245
|
+
radius?: TRtRadius | null;
|
|
246
|
+
/** Префикс-иконка. */
|
|
247
|
+
icon?: IRtIcon.Name | null;
|
|
248
|
+
/**
|
|
249
|
+
* Ссылка-назначение. Если задана — бэйдж рендерится якорем и открывает
|
|
250
|
+
* URL в новой вкладке (`target="_blank"`); иначе это обычный тег.
|
|
251
|
+
*/
|
|
252
|
+
href?: string;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Заголовок side-sheet'а; работает в двух modes:
|
|
258
|
+
*
|
|
259
|
+
* 1. **Programmatic** (через `RtAsideService.open()`) — `RtAsideRef` провайдится
|
|
260
|
+
* оверлей-инжектором; стрелка «назад» дёргает `asideRef.close()` напрямую,
|
|
261
|
+
* consumer подписан на `afterClosed()`.
|
|
262
|
+
* 2. **Route-driven** (через `[rtContainerRightSidenavPanel]` driver в
|
|
263
|
+
* rt-container'е) — `RtAsideRef` НЕ провайдится (overlay принадлежит
|
|
264
|
+
* rt-container'у, не RtAsideService). Consumer слушает `(dismiss)` output и
|
|
265
|
+
* сам зовёт `panel.close()`.
|
|
266
|
+
*
|
|
267
|
+
* Оба пути живут одновременно: `onDismiss()` сперва эмитит output, затем (если
|
|
268
|
+
* есть) дёргает optional `asideRef.close()`.
|
|
269
|
+
*
|
|
270
|
+
* Доменные действия (отклонить / удалить / снять с публикации и т.п.)
|
|
271
|
+
* проецируются в слот `[asideActions]` как ряд `rt-icon-button` справа от title.
|
|
272
|
+
*
|
|
273
|
+
* Слот `[asideHeaderContent]` — строка под заголовком на всю ширину шапки: поиск, вкладки,
|
|
274
|
+
* сводка. Пустой слот места не занимает.
|
|
275
|
+
*
|
|
276
|
+
* `ViewEncapsulation.None` — для единообразия с rt-dialog-header (стили
|
|
277
|
+
* префиксованы `.rt-aside-header`).
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```html
|
|
281
|
+
* <rt-aside-header title="Профиль пользователя" />
|
|
282
|
+
* <rt-aside-header title="Создание записи" [closable]="false" />
|
|
283
|
+
* <rt-aside-header title="Детали" (dismiss)="onClose()">
|
|
284
|
+
* <rt-icon-button asideActions icon="ico-error" variant="danger"
|
|
285
|
+
* ariaLabel="Отклонить" (clicked)="reject()" />
|
|
286
|
+
* </rt-aside-header>
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
declare class RtAsideHeaderComponent {
|
|
290
|
+
#private;
|
|
291
|
+
/** Текст заголовка — рендерится в `<h2>`. Null/пустая строка вместе с
|
|
292
|
+
* `[loading]=true` показывают skeleton вместо title. */
|
|
293
|
+
protected readonly t: Signal<TRtKitLabelMap>;
|
|
294
|
+
readonly title: InputSignal<string | null>;
|
|
295
|
+
/**
|
|
296
|
+
* Мелкий приглушённый надзаголовок НАД основным title (контекст действия:
|
|
297
|
+
* «Создание записи», «Запись № 6»). Null (дефолт) — обычный
|
|
298
|
+
* однострочный хедер. Overline не участвует в skeleton-режиме — это
|
|
299
|
+
* статичный текст, известный до загрузки данных.
|
|
300
|
+
*/
|
|
301
|
+
readonly overline: InputSignal<string | null>;
|
|
302
|
+
/**
|
|
303
|
+
* Приглушённая подпись ПОД заголовком: что делается в панели. Null (дефолт) —
|
|
304
|
+
* строки нет. Как надзаголовок, в skeleton-режиме не участвует.
|
|
305
|
+
*/
|
|
306
|
+
readonly subtitle: InputSignal<string | null>;
|
|
307
|
+
/**
|
|
308
|
+
* Ряд бэйджей (`rt-tag`) под заголовком — контекст сущности (статус, метка
|
|
309
|
+
* записи и т.п.). Пустой массив (дефолт) — ряд не рендерится. Async-данные:
|
|
310
|
+
* потребитель отдаёт `[]` пока сущность не зарезолвилась.
|
|
311
|
+
*/
|
|
312
|
+
readonly badges: InputSignal<readonly IRtAsideHeader.Badge[]>;
|
|
313
|
+
/** Показывать кнопку закрытия в углу заголовка. Дефолт `true`. */
|
|
314
|
+
readonly closable: InputSignalWithTransform<boolean, BooleanInput>;
|
|
315
|
+
/** Показывать skeleton вместо title (loading-state aside'а пока данные
|
|
316
|
+
* резолвятся через async fasade). Дефолт `false`. */
|
|
317
|
+
readonly loading: InputSignalWithTransform<boolean, BooleanInput>;
|
|
318
|
+
/**
|
|
319
|
+
* Эмитится при клике по стрелке «назад» — намерение пользователя закрыть
|
|
320
|
+
* aside (intent, не «закрыто»). Route-driven consumer слушает этот output и
|
|
321
|
+
* дёргает `panel.close()` сам. Имя `dismiss` вместо `close` — ESLint
|
|
322
|
+
* `@angular-eslint/no-output-native` блокирует output с именем стандартного
|
|
323
|
+
* DOM-события (`close`).
|
|
324
|
+
*/
|
|
325
|
+
readonly dismiss: OutputEmitterRef<void>;
|
|
326
|
+
protected onDismiss(): void;
|
|
327
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideHeaderComponent, never>;
|
|
328
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideHeaderComponent, "rt-aside-header", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "overline": { "alias": "overline"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "dismiss": "dismiss"; }, never, ["[asideActions]", "[asideHeaderContent]"], true, never>;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Footer-слот для композиции внутри `<rt-aside>`. Две зоны через именованные
|
|
333
|
+
* слоты: `[asideDismiss]` (слева — «Закрыть», `appearance="text"`, всегда) и
|
|
334
|
+
* `[asidePrimary]` (справа — единственный позитивный глагол: Сохранить /
|
|
335
|
+
* Отправить / Опубликовать, если есть). Раскладка `justify-content:
|
|
336
|
+
* space-between`. Доменные/деструктивные действия в футер не кладём — они
|
|
337
|
+
* проецируются иконками в `<rt-aside-header>` слот `[asideActions]`.
|
|
338
|
+
*
|
|
339
|
+
* Только две именованные зоны — безатрибутный контент НЕ проецируется (контент
|
|
340
|
+
* без `asideDismiss`/`asidePrimary` не отрендерится).
|
|
341
|
+
*
|
|
342
|
+
* `ViewEncapsulation.None` — для единообразия с rt-aside.
|
|
343
|
+
*
|
|
344
|
+
* @example
|
|
345
|
+
* \`\`\`html
|
|
346
|
+
* <rt-aside-footer>
|
|
347
|
+
* <button rtButton asideDismiss appearance="text" (click)="onClose()">Закрыть</button>
|
|
348
|
+
* <button rtButton asidePrimary theme="primary" (click)="save()">Сохранить</button>
|
|
349
|
+
* </rt-aside-footer>
|
|
350
|
+
* \`\`\`
|
|
351
|
+
*/
|
|
352
|
+
declare class RtAsideFooterComponent {
|
|
353
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideFooterComponent, never>;
|
|
354
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideFooterComponent, "rt-aside-footer", never, {}, {}, never, ["[asideDismiss]", "[asidePrimary]"], true, never>;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Блок ошибки запроса боковой панели: надпись и кнопка, которая кладёт в буфер обмена время и
|
|
359
|
+
* ошибку. Перенос `rtui-aside-error-box` первого кита без Material.
|
|
360
|
+
*
|
|
361
|
+
* Обычно его рисует сама панель по входу `requestError`; отдельно он нужен приложению, которое
|
|
362
|
+
* показывает ошибку в другом месте.
|
|
363
|
+
*/
|
|
364
|
+
declare class RtAsideErrorBoxComponent {
|
|
365
|
+
#private;
|
|
366
|
+
protected readonly title: Signal<string>;
|
|
367
|
+
protected readonly copied: WritableSignal<boolean>;
|
|
368
|
+
protected readonly buttonLabel: Signal<string>;
|
|
369
|
+
protected readonly buttonIcon: Signal<string | null>;
|
|
370
|
+
/** Ошибка, пришедшая от неудавшегося запроса: уходит в копию как JSON. */
|
|
371
|
+
readonly error: InputSignal<unknown>;
|
|
372
|
+
constructor();
|
|
373
|
+
protected onCopy(): void;
|
|
374
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideErrorBoxComponent, never>;
|
|
375
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideErrorBoxComponent, "rt-aside-error-box", never, { "error": { "alias": "error"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Окно, которое видит пользователь, закрывая панель с несохранёнными правками. Три
|
|
380
|
+
* исхода: закрыть без сохранения, закрыть с сохранением, остаться. Открывает его
|
|
381
|
+
* общая основа асайда, поэтому наружу компонент не экспортируется.
|
|
382
|
+
*
|
|
383
|
+
* Отказ от правок подан красной кнопкой: это единственный исход, после которого
|
|
384
|
+
* введённое не вернуть.
|
|
385
|
+
*/
|
|
386
|
+
declare class RtAsideUnsavedDialogComponent {
|
|
387
|
+
#private;
|
|
388
|
+
protected readonly t: Signal<TRtKitLabelMap>;
|
|
389
|
+
protected onDiscard(): void;
|
|
390
|
+
protected onSave(): void;
|
|
391
|
+
protected onStay(): void;
|
|
392
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RtAsideUnsavedDialogComponent, never>;
|
|
393
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtAsideUnsavedDialogComponent, "rt-aside-unsaved-dialog", never, {}, {}, never, never, true, never>;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/** Что делает панель, когда её просят закрыться. */
|
|
397
|
+
declare enum ERtAsideCloseIntent {
|
|
398
|
+
/** Ничего: идёт запись, и закрытие посреди неё потеряло бы её результат. */
|
|
399
|
+
Ignore = "ignore",
|
|
400
|
+
/** Закрыться сразу: терять нечего. */
|
|
401
|
+
Close = "close",
|
|
402
|
+
/** Спросить, что сделать с несохранёнными правками. */
|
|
403
|
+
Ask = "ask"
|
|
404
|
+
}
|
|
405
|
+
/** Исход окна с несохранёнными правками. */
|
|
406
|
+
declare enum ERtAsideUnsavedOutcome {
|
|
407
|
+
/** Закрыть без сохранения. */
|
|
408
|
+
Discard = "discard",
|
|
409
|
+
/** Закрыть с сохранением. */
|
|
410
|
+
Save = "save",
|
|
411
|
+
/** Остаться в панели. */
|
|
412
|
+
Stay = "stay"
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Гард закрытия, который панель ставит на себя: признак нетронутости формы и
|
|
416
|
+
* запись, которую зовёт исход «закрыть с сохранением».
|
|
417
|
+
*/
|
|
418
|
+
interface IRtAsideUnsavedGuard {
|
|
419
|
+
pristine: Signal<boolean>;
|
|
420
|
+
save: () => void;
|
|
421
|
+
}
|
|
422
|
+
/** Состояние панели на момент намерения закрыть её. */
|
|
423
|
+
interface IRtAsideCloseState {
|
|
424
|
+
submitting: boolean;
|
|
425
|
+
guarded: boolean;
|
|
426
|
+
pristine: boolean;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Решение по намерению закрыть панель. Одно на все четыре пути закрытия: кнопку
|
|
430
|
+
* в шапке, кнопку в футере, нажатие мимо панели и клавишу Esc — иначе Esc обошёл
|
|
431
|
+
* бы то, что ловит кнопка.
|
|
432
|
+
*/
|
|
433
|
+
declare function resolveCloseIntent(state: IRtAsideCloseState): ERtAsideCloseIntent;
|
|
434
|
+
|
|
435
|
+
export { ERtAsideCloseIntent, ERtAsideUnsavedOutcome, IRtAsideHeader, RT_ASIDE_DATA, RtAsideComponent, RtAsideErrorBoxComponent, RtAsideFooterComponent, RtAsideHeaderComponent, RtAsideRef, RtAsideService, RtAsideUnsavedDialogComponent, resolveCloseIntent };
|
|
436
|
+
export type { IRtAsideCloseState, IRtAsideConfig, IRtAsideUnsavedGuard, TRtAsideCloseRequest, TRtAsideContentLayout, TRtAsidePosition, TRtAsideSize };
|