@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,88 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, signal, input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
5
|
+
import { RT_KIT_LABELS } from '@rt-tools/ui-kit-v2/core';
|
|
6
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
7
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
8
|
+
|
|
9
|
+
const DRAG_DISMISS_THRESHOLD_PX = 80;
|
|
10
|
+
function clampDragDelta(deltaY) {
|
|
11
|
+
return Math.max(0, deltaY);
|
|
12
|
+
}
|
|
13
|
+
function shouldDismissDrag(deltaY) {
|
|
14
|
+
return deltaY > DRAG_DISMISS_THRESHOLD_PX;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const BEM_BLOCK = 'rt-bottom-sheet';
|
|
18
|
+
class RtBottomSheetComponent {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.#document = inject(DOCUMENT);
|
|
21
|
+
this.#onDragMove = (event) => this.#handleDragMove(event);
|
|
22
|
+
this.#onDragEnd = () => this.#handleDragEnd();
|
|
23
|
+
this.#dragStartY = 0;
|
|
24
|
+
this.t = inject(RT_KIT_LABELS);
|
|
25
|
+
this.dragDeltaY = signal(0, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "dragDeltaY" }] : /* istanbul ignore next */ []));
|
|
27
|
+
this.dragging = signal(false, /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []));
|
|
29
|
+
this.open = input.required({ ...(ngDevMode ? { debugName: "open" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
30
|
+
this.openChange = output();
|
|
31
|
+
}
|
|
32
|
+
#document;
|
|
33
|
+
#onDragMove;
|
|
34
|
+
#onDragEnd;
|
|
35
|
+
#dragStartY;
|
|
36
|
+
onDragStart(event) {
|
|
37
|
+
this.#dragStartY = event.clientY;
|
|
38
|
+
this.dragging.set(true);
|
|
39
|
+
this.dragDeltaY.set(0);
|
|
40
|
+
this.#document.addEventListener('pointermove', this.#onDragMove);
|
|
41
|
+
this.#document.addEventListener('pointerup', this.#onDragEnd);
|
|
42
|
+
}
|
|
43
|
+
dismiss() {
|
|
44
|
+
this.openChange.emit(false);
|
|
45
|
+
}
|
|
46
|
+
#handleDragMove(event) {
|
|
47
|
+
this.dragDeltaY.set(clampDragDelta(event.clientY - this.#dragStartY));
|
|
48
|
+
}
|
|
49
|
+
#handleDragEnd() {
|
|
50
|
+
this.dragging.set(false);
|
|
51
|
+
this.#document.removeEventListener('pointermove', this.#onDragMove);
|
|
52
|
+
this.#document.removeEventListener('pointerup', this.#onDragEnd);
|
|
53
|
+
if (shouldDismissDrag(this.dragDeltaY())) {
|
|
54
|
+
this.openChange.emit(false);
|
|
55
|
+
}
|
|
56
|
+
this.dragDeltaY.set(0);
|
|
57
|
+
}
|
|
58
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtBottomSheetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
59
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: RtBottomSheetComponent, isStandalone: true, selector: "rt-bottom-sheet", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { openChange: "openChange" }, host: { properties: { "class.rt-bottom-sheet--open": "open()", "attr.inert": "open() ? null : \"\"" }, classAttribute: "rt-bottom-sheet" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-bottom-sheet\">\n <button\n type=\"button\"\n rtElem=\"backdrop\"\n qa-dataid=\"bottom-sheet-backdrop\"\n [attr.aria-label]=\"t().bottomSheetClose\"\n (click)=\"dismiss()\"></button>\n <div\n rtElem=\"panel\"\n qa-dataid=\"bottom-sheet-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [rtMod]=\"{ dragging: dragging() }\"\n [style.transform]=\"dragging() ? 'translateY(' + dragDeltaY() + 'px)' : null\">\n <div rtElem=\"handle\" qa-dataid=\"bottom-sheet-handle\" (pointerdown)=\"onDragStart($event)\"></div>\n <div rtElem=\"header\" qa-dataid=\"bottom-sheet-header\">\n <ng-content select=\"[sheetHeader]\" />\n </div>\n <ng-content />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-bottom-sheet{--rt-bottom-sheet-radius: var(--rt-radius-2xl);--rt-bottom-sheet-handle-radius: var(--rt-radius-xs);--rt-bottom-sheet-shadow: var(--rt-shadow-card-soft);--rt-bottom-sheet-transition-duration: var(--rt-duration-base);position:fixed;z-index:1000;inset:0;pointer-events:none}.rt-bottom-sheet__backdrop{position:absolute;padding:0;border:none;background:var(--rt-overlay-black-50);cursor:pointer;inset:0;opacity:0;transition:opacity var(--rt-bottom-sheet-transition-duration) ease}.rt-bottom-sheet__panel{position:absolute;right:0;bottom:0;left:0;display:flex;max-height:80vh;flex-direction:column;border-radius:var(--rt-bottom-sheet-radius) var(--rt-bottom-sheet-radius) 0 0;background:var(--rt-color-bg-surface);box-shadow:var(--rt-bottom-sheet-shadow);transform:translateY(100%);transition:transform var(--rt-bottom-sheet-transition-duration) ease}.rt-bottom-sheet__panel--dragging{transition:none}.rt-bottom-sheet__handle{width:40px;height:4px;align-self:center;border-radius:var(--rt-bottom-sheet-handle-radius);margin:var(--rt-space-4) 0;background:var(--rt-color-border-default);cursor:grab;touch-action:none}.rt-bottom-sheet__header{display:flex;justify-content:center;padding:0 var(--rt-space-5) var(--rt-space-4);color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-bottom-sheet--open{pointer-events:auto}.rt-bottom-sheet--open .rt-bottom-sheet__backdrop{opacity:1}.rt-bottom-sheet--open .rt-bottom-sheet__panel{transform:translateY(0)}.rt-bottom-sheet[data-rt-radius=none]{--rt-bottom-sheet-radius: var(--rt-radius-none)}.rt-bottom-sheet[data-rt-radius=xs]{--rt-bottom-sheet-radius: var(--rt-radius-xs)}.rt-bottom-sheet[data-rt-radius=sm]{--rt-bottom-sheet-radius: var(--rt-radius-sm)}.rt-bottom-sheet[data-rt-radius=ms]{--rt-bottom-sheet-radius: var(--rt-radius-ms)}.rt-bottom-sheet[data-rt-radius=md]{--rt-bottom-sheet-radius: var(--rt-radius-md)}.rt-bottom-sheet[data-rt-radius=lg]{--rt-bottom-sheet-radius: var(--rt-radius-lg)}.rt-bottom-sheet[data-rt-radius=xl]{--rt-bottom-sheet-radius: var(--rt-radius-xl)}.rt-bottom-sheet[data-rt-radius=\"2xl\"]{--rt-bottom-sheet-radius: var(--rt-radius-2xl)}.rt-bottom-sheet[data-rt-radius=full]{--rt-bottom-sheet-radius: var(--rt-radius-full)}}\n"], dependencies: [{ kind: "directive", type:
|
|
60
|
+
// rt-tools
|
|
61
|
+
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 }); }
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtBottomSheetComponent, decorators: [{
|
|
64
|
+
type: Component,
|
|
65
|
+
args: [{ selector: 'rt-bottom-sheet', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
66
|
+
// rt-tools
|
|
67
|
+
BlockDirective,
|
|
68
|
+
ElemDirective,
|
|
69
|
+
ModDirective,
|
|
70
|
+
// transloco
|
|
71
|
+
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
72
|
+
class: BEM_BLOCK,
|
|
73
|
+
'[class.rt-bottom-sheet--open]': 'open()',
|
|
74
|
+
// Закрытый лист остаётся в разметке ради анимации, и спрятан он только
|
|
75
|
+
// стилями — а `opacity`/`pointer-events` не убирают узел ни из порядка
|
|
76
|
+
// табуляции, ни из дерева доступности. Без `inert` страница с закрытым
|
|
77
|
+
// листом держала бы в табуляции невидимую кнопку «Закрыть», а
|
|
78
|
+
// скринридер объявлял бы модальный диалог, которого не видно.
|
|
79
|
+
'[attr.inert]': 'open() ? null : ""',
|
|
80
|
+
}, template: "<ng-container rtBlock=\"rt-bottom-sheet\">\n <button\n type=\"button\"\n rtElem=\"backdrop\"\n qa-dataid=\"bottom-sheet-backdrop\"\n [attr.aria-label]=\"t().bottomSheetClose\"\n (click)=\"dismiss()\"></button>\n <div\n rtElem=\"panel\"\n qa-dataid=\"bottom-sheet-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [rtMod]=\"{ dragging: dragging() }\"\n [style.transform]=\"dragging() ? 'translateY(' + dragDeltaY() + 'px)' : null\">\n <div rtElem=\"handle\" qa-dataid=\"bottom-sheet-handle\" (pointerdown)=\"onDragStart($event)\"></div>\n <div rtElem=\"header\" qa-dataid=\"bottom-sheet-header\">\n <ng-content select=\"[sheetHeader]\" />\n </div>\n <ng-content />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-bottom-sheet{--rt-bottom-sheet-radius: var(--rt-radius-2xl);--rt-bottom-sheet-handle-radius: var(--rt-radius-xs);--rt-bottom-sheet-shadow: var(--rt-shadow-card-soft);--rt-bottom-sheet-transition-duration: var(--rt-duration-base);position:fixed;z-index:1000;inset:0;pointer-events:none}.rt-bottom-sheet__backdrop{position:absolute;padding:0;border:none;background:var(--rt-overlay-black-50);cursor:pointer;inset:0;opacity:0;transition:opacity var(--rt-bottom-sheet-transition-duration) ease}.rt-bottom-sheet__panel{position:absolute;right:0;bottom:0;left:0;display:flex;max-height:80vh;flex-direction:column;border-radius:var(--rt-bottom-sheet-radius) var(--rt-bottom-sheet-radius) 0 0;background:var(--rt-color-bg-surface);box-shadow:var(--rt-bottom-sheet-shadow);transform:translateY(100%);transition:transform var(--rt-bottom-sheet-transition-duration) ease}.rt-bottom-sheet__panel--dragging{transition:none}.rt-bottom-sheet__handle{width:40px;height:4px;align-self:center;border-radius:var(--rt-bottom-sheet-handle-radius);margin:var(--rt-space-4) 0;background:var(--rt-color-border-default);cursor:grab;touch-action:none}.rt-bottom-sheet__header{display:flex;justify-content:center;padding:0 var(--rt-space-5) var(--rt-space-4);color:var(--rt-color-text-primary);font-weight:var(--rt-font-weight-semibold)}.rt-bottom-sheet--open{pointer-events:auto}.rt-bottom-sheet--open .rt-bottom-sheet__backdrop{opacity:1}.rt-bottom-sheet--open .rt-bottom-sheet__panel{transform:translateY(0)}.rt-bottom-sheet[data-rt-radius=none]{--rt-bottom-sheet-radius: var(--rt-radius-none)}.rt-bottom-sheet[data-rt-radius=xs]{--rt-bottom-sheet-radius: var(--rt-radius-xs)}.rt-bottom-sheet[data-rt-radius=sm]{--rt-bottom-sheet-radius: var(--rt-radius-sm)}.rt-bottom-sheet[data-rt-radius=ms]{--rt-bottom-sheet-radius: var(--rt-radius-ms)}.rt-bottom-sheet[data-rt-radius=md]{--rt-bottom-sheet-radius: var(--rt-radius-md)}.rt-bottom-sheet[data-rt-radius=lg]{--rt-bottom-sheet-radius: var(--rt-radius-lg)}.rt-bottom-sheet[data-rt-radius=xl]{--rt-bottom-sheet-radius: var(--rt-radius-xl)}.rt-bottom-sheet[data-rt-radius=\"2xl\"]{--rt-bottom-sheet-radius: var(--rt-radius-2xl)}.rt-bottom-sheet[data-rt-radius=full]{--rt-bottom-sheet-radius: var(--rt-radius-full)}}\n"] }]
|
|
81
|
+
}], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: true }] }], openChange: [{ type: i0.Output, args: ["openChange"] }] } });
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Generated bundle index. Do not edit.
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
export { RtBottomSheetComponent };
|
|
88
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-bottom-sheet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-bottom-sheet.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.logic.ts","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.component.ts","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-bottom-sheet.component.html","../../../projects/ui-kit-v2/src/lib/components/bottom-sheet/rt-tools-ui-kit-v2-bottom-sheet.ts"],"sourcesContent":["export const DRAG_DISMISS_THRESHOLD_PX: number = 80;\n\nexport function clampDragDelta(deltaY: number): number {\n return Math.max(0, deltaY);\n}\n\nexport function shouldDismissDrag(deltaY: number): boolean {\n return deltaY > DRAG_DISMISS_THRESHOLD_PX;\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\n// rt-tools\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { clampDragDelta, shouldDismissDrag } from './rt-bottom-sheet.logic';\n\nconst BEM_BLOCK: string = 'rt-bottom-sheet';\n\n@Component({\n selector: 'rt-bottom-sheet',\n templateUrl: './rt-bottom-sheet.component.html',\n styleUrl: './rt-bottom-sheet.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // transloco\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-bottom-sheet--open]': 'open()',\n // Закрытый лист остаётся в разметке ради анимации, и спрятан он только\n // стилями — а `opacity`/`pointer-events` не убирают узел ни из порядка\n // табуляции, ни из дерева доступности. Без `inert` страница с закрытым\n // листом держала бы в табуляции невидимую кнопку «Закрыть», а\n // скринридер объявлял бы модальный диалог, которого не видно.\n '[attr.inert]': 'open() ? null : \"\"',\n },\n})\nexport class RtBottomSheetComponent {\n readonly #document: Document = inject(DOCUMENT);\n readonly #onDragMove: (event: PointerEvent) => void = (event: PointerEvent): void => this.#handleDragMove(event);\n readonly #onDragEnd: () => void = (): void => this.#handleDragEnd();\n\n #dragStartY: number = 0;\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly dragDeltaY: WritableSignal<number> = signal<number>(0);\n protected readonly dragging: WritableSignal<boolean> = signal<boolean>(false);\n\n public readonly open: InputSignalWithTransform<boolean, BooleanInput> = input.required<boolean, BooleanInput>({\n transform: booleanAttribute,\n });\n public readonly openChange: OutputEmitterRef<boolean> = output<boolean>();\n\n protected onDragStart(event: PointerEvent): void {\n this.#dragStartY = event.clientY;\n this.dragging.set(true);\n this.dragDeltaY.set(0);\n this.#document.addEventListener('pointermove', this.#onDragMove);\n this.#document.addEventListener('pointerup', this.#onDragEnd);\n }\n\n protected dismiss(): void {\n this.openChange.emit(false);\n }\n\n #handleDragMove(event: PointerEvent): void {\n this.dragDeltaY.set(clampDragDelta(event.clientY - this.#dragStartY));\n }\n\n #handleDragEnd(): void {\n this.dragging.set(false);\n this.#document.removeEventListener('pointermove', this.#onDragMove);\n this.#document.removeEventListener('pointerup', this.#onDragEnd);\n if (shouldDismissDrag(this.dragDeltaY())) {\n this.openChange.emit(false);\n }\n this.dragDeltaY.set(0);\n }\n}\n","<ng-container rtBlock=\"rt-bottom-sheet\">\n <button\n type=\"button\"\n rtElem=\"backdrop\"\n qa-dataid=\"bottom-sheet-backdrop\"\n [attr.aria-label]=\"t().bottomSheetClose\"\n (click)=\"dismiss()\"></button>\n <div\n rtElem=\"panel\"\n qa-dataid=\"bottom-sheet-panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n [rtMod]=\"{ dragging: dragging() }\"\n [style.transform]=\"dragging() ? 'translateY(' + dragDeltaY() + 'px)' : null\">\n <div rtElem=\"handle\" qa-dataid=\"bottom-sheet-handle\" (pointerdown)=\"onDragStart($event)\"></div>\n <div rtElem=\"header\" qa-dataid=\"bottom-sheet-header\">\n <ng-content select=\"[sheetHeader]\" />\n </div>\n <ng-content />\n </div>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, ElementRef, Renderer2, computed, input, booleanAttribute, afterNextRender, untracked, effect, HostBinding, Directive } from '@angular/core';
|
|
4
|
+
import { rtKitDefault, RT_RADIUS_DEFAULT } from '@rt-tools/ui-kit-v2/core';
|
|
5
|
+
import * as i2 from '@rt-tools/ui-kit-v2/radius';
|
|
6
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
7
|
+
import { RtIconRegistry, RT_ICON_GLYPH_STRATEGY, RtIconFontService, resolveIconGlyph, RT_ICON_MATERIAL_PRESET_SELECTOR, iconMaterialDrawn } from '@rt-tools/ui-kit-v2/icon';
|
|
8
|
+
import * as i1 from '@rt-tools/ui-kit-v2/ripple';
|
|
9
|
+
import { RtRippleDirective } from '@rt-tools/ui-kit-v2/ripple';
|
|
10
|
+
|
|
11
|
+
const BEM_BLOCK = 'rt-button';
|
|
12
|
+
/** Длительность затухания спиннера при выходе из загрузки. */
|
|
13
|
+
const LOADING_FADE_OUT_MS = 300;
|
|
14
|
+
/** Запас поверх затухания, после которого подпись возвращается без анимации. */
|
|
15
|
+
const LOADING_FADE_OUT_BUFFER_MS = 50;
|
|
16
|
+
/**
|
|
17
|
+
* Директива стилизованной кнопки. Применяется к `<button>` или `<a>`
|
|
18
|
+
* (для ссылок-кнопок с `routerLink`/`href`).
|
|
19
|
+
*
|
|
20
|
+
* Иконка и лейбл рендерятся внутрь элемента через `Renderer2`, чтобы можно
|
|
21
|
+
* было применять директиву к существующему элементу без обёртки.
|
|
22
|
+
* Поддерживает анимированный переход в/из loading.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```html
|
|
26
|
+
* <button rtButton label="Войти" theme="primary"></button>
|
|
27
|
+
* <button rtButton label="Скачать" icon="ico-download" theme="success"></button>
|
|
28
|
+
* <button rtButton icon="pencil" theme="info" appearance="text"></button>
|
|
29
|
+
* <button rtButton label="Сохранение..." [loading]="saving()" [disabled]="saving()"></button>
|
|
30
|
+
* <a rtButton label="Главная" [routerLink]="'/'"></a>
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
class RtButtonDirective {
|
|
34
|
+
#el;
|
|
35
|
+
#renderer;
|
|
36
|
+
#doc;
|
|
37
|
+
#iconRegistry;
|
|
38
|
+
#glyphStrategy;
|
|
39
|
+
#fontReady;
|
|
40
|
+
/* С чего стартуют три входа, которые приложение вправе задать киту разом. Значение считается
|
|
41
|
+
из настроек при объявлении входа: так публичный вид входа не меняется — ни тип, ни имя, — а
|
|
42
|
+
вход, написанный в разметке, по-прежнему перебивает всё. Цена — настройки читаются один раз,
|
|
43
|
+
когда узел создан. */
|
|
44
|
+
#appearance;
|
|
45
|
+
#size;
|
|
46
|
+
#iconEl;
|
|
47
|
+
#labelEl;
|
|
48
|
+
#spinnerEl;
|
|
49
|
+
#wasLoading;
|
|
50
|
+
constructor() {
|
|
51
|
+
this.#el = inject(ElementRef);
|
|
52
|
+
this.#renderer = inject(Renderer2);
|
|
53
|
+
this.#doc = inject(DOCUMENT);
|
|
54
|
+
this.#iconRegistry = inject(RtIconRegistry);
|
|
55
|
+
this.#glyphStrategy = inject(RT_ICON_GLYPH_STRATEGY);
|
|
56
|
+
this.#fontReady = inject(RtIconFontService).ready;
|
|
57
|
+
/* С чего стартуют три входа, которые приложение вправе задать киту разом. Значение считается
|
|
58
|
+
из настроек при объявлении входа: так публичный вид входа не меняется — ни тип, ни имя, — а
|
|
59
|
+
вход, написанный в разметке, по-прежнему перебивает всё. Цена — настройки читаются один раз,
|
|
60
|
+
когда узел создан. */
|
|
61
|
+
this.#appearance = rtKitDefault('button', (it) => it.appearance, 'filled');
|
|
62
|
+
this.#size = rtKitDefault('button', (it) => it.size, 'md');
|
|
63
|
+
this.#iconEl = null;
|
|
64
|
+
this.#labelEl = null;
|
|
65
|
+
this.#spinnerEl = null;
|
|
66
|
+
this.#wasLoading = false;
|
|
67
|
+
this.isIconOnly = computed(() => !!this.icon() && !this.label(), /* @ts-ignore */
|
|
68
|
+
...(ngDevMode ? [{ debugName: "isIconOnly" }] : /* istanbul ignore next */ []));
|
|
69
|
+
/** Текстовый лейбл кнопки. Если null — кнопка только с иконкой. */
|
|
70
|
+
this.label = input(null, /* @ts-ignore */
|
|
71
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
72
|
+
/**
|
|
73
|
+
* Значок кнопки: имя кита (`check`) или имя Material (`arrow_back`). Имя Material рисуется
|
|
74
|
+
* так же, как вход `glyph` у `rt-icon`: парой из перечня кита или лигатурой шрифта — по
|
|
75
|
+
* настройке `glyphStrategy` у `provideRtIcons()`. Если null — без иконки.
|
|
76
|
+
*/
|
|
77
|
+
this.icon = input(null, /* @ts-ignore */
|
|
78
|
+
...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
79
|
+
/** Сторона размещения иконки относительно лейбла. */
|
|
80
|
+
this.iconPos = input('left', /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "iconPos" }] : /* istanbul ignore next */ []));
|
|
82
|
+
/** Семантическая палитра. */
|
|
83
|
+
this.theme = input('primary', /* @ts-ignore */
|
|
84
|
+
...(ngDevMode ? [{ debugName: "theme" }] : /* istanbul ignore next */ []));
|
|
85
|
+
/** Внешний вид (filled / outlined / text). Умолчание — из настроек кита. */
|
|
86
|
+
this.appearance = input(this.#appearance, /* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
|
|
88
|
+
/** Размер. Умолчание — из настроек кита. */
|
|
89
|
+
this.size = input(this.#size, /* @ts-ignore */
|
|
90
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
91
|
+
/** Состояние загрузки: показывает спиннер вместо иконки, блокирует клики. */
|
|
92
|
+
this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
93
|
+
/** Кастомный CSS-класс иконки в loading. Если null — встроенный CSS-спиннер. */
|
|
94
|
+
this.loadingIcon = input(null, /* @ts-ignore */
|
|
95
|
+
...(ngDevMode ? [{ debugName: "loadingIcon" }] : /* istanbul ignore next */ []));
|
|
96
|
+
/**
|
|
97
|
+
* Подпись во время загрузки. `hide` оставляет подпись и иконку в кнопке невидимыми — ширина
|
|
98
|
+
* не скачет, — а спиннер ставит по центру; имя кнопки для скринридера остаётся.
|
|
99
|
+
*/
|
|
100
|
+
this.loadingLabel = input('keep', /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []));
|
|
102
|
+
/**
|
|
103
|
+
* Положение двухпозиционной кнопки: `true` — нажата, `false` — отжата, `null` — положения нет
|
|
104
|
+
* вовсе.
|
|
105
|
+
*
|
|
106
|
+
* Три значения, а не два, потому что обычная кнопка переключателем не является и объявлять
|
|
107
|
+
* себя двухпозиционной не должна: сказанное вспомогательным средствам «эта кнопка отжата» на
|
|
108
|
+
* кнопке, которая просто запускает действие, — ложь, а не умолчание. Отжатое положение при
|
|
109
|
+
* этом объявляется наравне с нажатым: молчащая в отжатом виде кнопка неотличима от обычной, и
|
|
110
|
+
* о втором положении узнают только нажав.
|
|
111
|
+
*
|
|
112
|
+
* Само по нажатию положение не меняется: кнопка говорит о нажатии наружу, а положение
|
|
113
|
+
* возвращает вызывающий — иначе вид кнопки и состояние приложения расходятся при первом же
|
|
114
|
+
* отказе сохранения.
|
|
115
|
+
*/
|
|
116
|
+
this.pressed = input(null, /* @ts-ignore */
|
|
117
|
+
...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
|
|
118
|
+
afterNextRender(() => untracked(() => this.#updateContent()));
|
|
119
|
+
effect(() => {
|
|
120
|
+
this.label();
|
|
121
|
+
this.icon();
|
|
122
|
+
this.iconPos();
|
|
123
|
+
this.loading();
|
|
124
|
+
this.loadingIcon();
|
|
125
|
+
this.loadingLabel();
|
|
126
|
+
// Лигатура до готовности шрифтов скрыта: готовность перерисовывает содержимое.
|
|
127
|
+
this.#fontReady();
|
|
128
|
+
untracked(() => this.#updateContent());
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** Положение наружу: атрибута нет вовсе там, где положения у кнопки не бывает. */
|
|
132
|
+
get ariaPressed() {
|
|
133
|
+
const pressed = this.pressed();
|
|
134
|
+
return pressed === null ? null : String(pressed);
|
|
135
|
+
}
|
|
136
|
+
get hostClasses() {
|
|
137
|
+
const theme = this.theme();
|
|
138
|
+
const appearance = this.appearance();
|
|
139
|
+
const size = this.size();
|
|
140
|
+
return {
|
|
141
|
+
[BEM_BLOCK]: true,
|
|
142
|
+
[`${BEM_BLOCK}--${theme}`]: theme !== 'primary',
|
|
143
|
+
[`${BEM_BLOCK}--outlined`]: appearance === 'outlined',
|
|
144
|
+
[`${BEM_BLOCK}--text`]: appearance === 'text',
|
|
145
|
+
[`${BEM_BLOCK}--loading`]: this.loading(),
|
|
146
|
+
[`${BEM_BLOCK}--loading-label-hidden`]: this.loading() && this.loadingLabel() === 'hide',
|
|
147
|
+
[`${BEM_BLOCK}--icon-only`]: this.isIconOnly(),
|
|
148
|
+
[`${BEM_BLOCK}--${size}`]: size !== 'md',
|
|
149
|
+
[`${BEM_BLOCK}--pressed`]: this.pressed() === true,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
#updateContent() {
|
|
153
|
+
const button = this.#el.nativeElement;
|
|
154
|
+
const isLoading = this.loading();
|
|
155
|
+
const wasLoading = this.#wasLoading;
|
|
156
|
+
this.#wasLoading = isLoading;
|
|
157
|
+
if (wasLoading && !isLoading) {
|
|
158
|
+
this.#transitionFromLoading(button);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.#clearContent(button);
|
|
162
|
+
if (isLoading) {
|
|
163
|
+
this.#renderLoading(button);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.#renderIconAndLabel(button);
|
|
167
|
+
}
|
|
168
|
+
#transitionFromLoading(button) {
|
|
169
|
+
const spinnerEl = this.#spinnerEl;
|
|
170
|
+
if (spinnerEl === null) {
|
|
171
|
+
this.#restoreContent(button);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
spinnerEl.style.animation = `rt-button-fade-out ${LOADING_FADE_OUT_MS}ms ease-out forwards`;
|
|
175
|
+
// settled-гард делает animationend и страховочный таймаут взаимно
|
|
176
|
+
// идемпотентными — сработает и снимет listener только то, что раньше.
|
|
177
|
+
// Без таймаута подпись возвращалась бы только по анимации, а она не
|
|
178
|
+
// идёт, пока кнопка спрятана (свёрнутая панель, неактивная вкладка):
|
|
179
|
+
// выход из загрузки не наступал никогда, и на кнопке навсегда
|
|
180
|
+
// оставался голый спиннер.
|
|
181
|
+
let settled = false;
|
|
182
|
+
const finish = () => {
|
|
183
|
+
if (settled) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
settled = true;
|
|
187
|
+
spinnerEl.removeEventListener('animationend', finish);
|
|
188
|
+
this.#restoreContent(button);
|
|
189
|
+
};
|
|
190
|
+
spinnerEl.addEventListener('animationend', finish);
|
|
191
|
+
setTimeout(finish, LOADING_FADE_OUT_MS + LOADING_FADE_OUT_BUFFER_MS);
|
|
192
|
+
}
|
|
193
|
+
#restoreContent(button) {
|
|
194
|
+
this.#clearContent(button);
|
|
195
|
+
this.#renderIconAndLabel(button);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Чистим по классу, а не по своим ссылкам. Под серверным рендером разметку
|
|
199
|
+
* кнопки рисует сервер: после гидратации лейбл и иконка уже лежат в DOM, но создавал их
|
|
200
|
+
* другой экземпляр директивы, и `#labelEl` у клиентского — пустой. Ссылки
|
|
201
|
+
* тогда не находят ничего, а `#renderIconAndLabel` дорисовывает второй
|
|
202
|
+
* лейбл — подпись кнопки удваивается («СохранитьСохранить»).
|
|
203
|
+
*/
|
|
204
|
+
#clearContent(button) {
|
|
205
|
+
const ownClasses = [`${BEM_BLOCK}__icon`, `${BEM_BLOCK}__label`, `${BEM_BLOCK}__spinner`];
|
|
206
|
+
// Обход по детям, а не селектором `:scope >`: тот же код исполняется на
|
|
207
|
+
// сервере, где DOM эмулированный и селекторный движок урезан
|
|
208
|
+
for (const child of Array.from(button.children)) {
|
|
209
|
+
if (ownClasses.some((ownClass) => child.classList.contains(ownClass))) {
|
|
210
|
+
this.#renderer.removeChild(button, child);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
this.#iconEl = null;
|
|
214
|
+
this.#labelEl = null;
|
|
215
|
+
this.#spinnerEl = null;
|
|
216
|
+
}
|
|
217
|
+
#renderLoading(button) {
|
|
218
|
+
const loadingIcon = this.loadingIcon();
|
|
219
|
+
const loader = loadingIcon ? this.#createIcon(loadingIcon) : this.#createSpinner();
|
|
220
|
+
if (this.loadingLabel() === 'hide') {
|
|
221
|
+
// Обычное содержимое остаётся и держит ширину; стили гасят его и ставят
|
|
222
|
+
// загрузчик поверх по центру
|
|
223
|
+
this.#renderIconAndLabel(button);
|
|
224
|
+
this.#renderer.addClass(loader, `${BEM_BLOCK}__loader`);
|
|
225
|
+
this.#renderer.appendChild(button, loader);
|
|
226
|
+
if (!loadingIcon) {
|
|
227
|
+
this.#spinnerEl = loader;
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (loadingIcon) {
|
|
232
|
+
this.#iconEl = loader;
|
|
233
|
+
this.#renderer.appendChild(button, this.#iconEl);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.#spinnerEl = loader;
|
|
237
|
+
this.#renderer.appendChild(button, this.#spinnerEl);
|
|
238
|
+
}
|
|
239
|
+
const label = this.label();
|
|
240
|
+
if (label) {
|
|
241
|
+
this.#labelEl = this.#createLabel(label);
|
|
242
|
+
this.#renderer.appendChild(button, this.#labelEl);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
#renderIconAndLabel(button) {
|
|
246
|
+
const iconClass = this.icon();
|
|
247
|
+
const label = this.label();
|
|
248
|
+
const pos = this.iconPos();
|
|
249
|
+
const iconEl = iconClass ? this.#createIcon(iconClass) : null;
|
|
250
|
+
const labelEl = label ? this.#createLabel(label) : null;
|
|
251
|
+
if (pos === 'left') {
|
|
252
|
+
if (iconEl) {
|
|
253
|
+
this.#renderer.appendChild(button, iconEl);
|
|
254
|
+
}
|
|
255
|
+
if (labelEl) {
|
|
256
|
+
this.#renderer.appendChild(button, labelEl);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
if (labelEl) {
|
|
261
|
+
this.#renderer.appendChild(button, labelEl);
|
|
262
|
+
}
|
|
263
|
+
if (iconEl) {
|
|
264
|
+
this.#renderer.appendChild(button, iconEl);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.#iconEl = iconEl;
|
|
268
|
+
this.#labelEl = labelEl;
|
|
269
|
+
}
|
|
270
|
+
#createIcon(iconName) {
|
|
271
|
+
const resolved = resolveIconGlyph(null, iconName, this.#glyphStrategy);
|
|
272
|
+
if (resolved?.kind === 'kit') {
|
|
273
|
+
return this.#createKitIcon(resolved.name);
|
|
274
|
+
}
|
|
275
|
+
return this.#createGlyph(iconName);
|
|
276
|
+
}
|
|
277
|
+
#createKitIcon(name) {
|
|
278
|
+
const svg = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
|
279
|
+
svg.setAttribute('focusable', 'false');
|
|
280
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
281
|
+
svg.setAttribute('viewBox', '0 0 24 24');
|
|
282
|
+
svg.classList.add(`${BEM_BLOCK}__icon`);
|
|
283
|
+
// Тот же путь, что и у компонента значка: имя просится у реестра, а он ходит за файлом
|
|
284
|
+
// один раз на страницу — значок, спрошенный обеими разметками сразу, едет одним запросом.
|
|
285
|
+
const drawing = this.#drawingOf(name);
|
|
286
|
+
this.#iconRegistry.request(name, drawing);
|
|
287
|
+
const use = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'use');
|
|
288
|
+
use.setAttribute('href', this.#iconRegistry.symbolHref(name, drawing));
|
|
289
|
+
svg.appendChild(use);
|
|
290
|
+
return svg;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Набор рисунка — как у компонента значка: материальный рисунок под разметкой с признаком
|
|
294
|
+
* материального набора, если у имени он есть. Признак читается при каждой отрисовке
|
|
295
|
+
* содержимого, а после первой отрисовки она повторяется — контейнер к тому времени на месте.
|
|
296
|
+
*/
|
|
297
|
+
#drawingOf(name) {
|
|
298
|
+
const underMaterial = this.#el.nativeElement.closest(RT_ICON_MATERIAL_PRESET_SELECTOR) !== null;
|
|
299
|
+
return underMaterial && iconMaterialDrawn.has(name) ? 'material' : 'base';
|
|
300
|
+
}
|
|
301
|
+
/** Лигатура шрифта Material Symbols для имени без пары. Шрифт подключает приложение. */
|
|
302
|
+
#createGlyph(glyph) {
|
|
303
|
+
const el = this.#renderer.createElement('span');
|
|
304
|
+
this.#renderer.addClass(el, `${BEM_BLOCK}__icon`);
|
|
305
|
+
this.#renderer.addClass(el, `${BEM_BLOCK}__glyph`);
|
|
306
|
+
if (!this.#fontReady()) {
|
|
307
|
+
this.#renderer.addClass(el, `${BEM_BLOCK}__glyph--pending`);
|
|
308
|
+
}
|
|
309
|
+
this.#renderer.setAttribute(el, 'aria-hidden', 'true');
|
|
310
|
+
this.#renderer.appendChild(el, this.#renderer.createText(glyph));
|
|
311
|
+
return el;
|
|
312
|
+
}
|
|
313
|
+
#createLabel(text) {
|
|
314
|
+
const el = this.#renderer.createElement('span');
|
|
315
|
+
this.#renderer.addClass(el, `${BEM_BLOCK}__label`);
|
|
316
|
+
this.#renderer.appendChild(el, this.#renderer.createText(text));
|
|
317
|
+
return el;
|
|
318
|
+
}
|
|
319
|
+
#createSpinner() {
|
|
320
|
+
const wrapper = this.#renderer.createElement('span');
|
|
321
|
+
this.#renderer.addClass(wrapper, `${BEM_BLOCK}__spinner`);
|
|
322
|
+
const circle = this.#renderer.createElement('span');
|
|
323
|
+
this.#renderer.addClass(circle, `${BEM_BLOCK}__spinner-circle`);
|
|
324
|
+
this.#renderer.appendChild(wrapper, circle);
|
|
325
|
+
return wrapper;
|
|
326
|
+
}
|
|
327
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
328
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtButtonDirective, isStandalone: true, selector: "button[rtButton], a[rtButton]", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPos: { classPropertyName: "iconPos", publicName: "iconPos", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIcon: { classPropertyName: "loadingIcon", publicName: "loadingIcon", isSignal: true, isRequired: false, transformFunction: null }, loadingLabel: { classPropertyName: "loadingLabel", publicName: "loadingLabel", isSignal: true, isRequired: false, transformFunction: null }, pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-pressed": "this.ariaPressed", "class": "this.hostClasses" } }, providers: [
|
|
329
|
+
{
|
|
330
|
+
provide: RT_RADIUS_DEFAULT,
|
|
331
|
+
useFactory: () => rtKitDefault('button', (it) => it.radius, null),
|
|
332
|
+
},
|
|
333
|
+
], hostDirectives: [{ directive: i1.RtRippleDirective, inputs: ["rippleDisabled", "rippleDisabled"] }, { directive: i2.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0 }); }
|
|
334
|
+
}
|
|
335
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtButtonDirective, decorators: [{
|
|
336
|
+
type: Directive,
|
|
337
|
+
args: [{
|
|
338
|
+
selector: 'button[rtButton], a[rtButton]',
|
|
339
|
+
hostDirectives: [
|
|
340
|
+
{ directive: RtRippleDirective, inputs: ['rippleDisabled'] },
|
|
341
|
+
{ directive: RtRadiusDirective, inputs: ['radius'] },
|
|
342
|
+
],
|
|
343
|
+
/* Шаг скругления без входа берётся из настроек кита: приложение, скруглившее все кнопки разом,
|
|
344
|
+
называет шаг один раз, а вход на кнопке по-прежнему сильнее. */
|
|
345
|
+
providers: [
|
|
346
|
+
{
|
|
347
|
+
provide: RT_RADIUS_DEFAULT,
|
|
348
|
+
useFactory: () => rtKitDefault('button', (it) => it.radius, null),
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
}]
|
|
352
|
+
}], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconPos: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPos", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIcon", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], pressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "pressed", required: false }] }], ariaPressed: [{
|
|
353
|
+
type: HostBinding,
|
|
354
|
+
args: ['attr.aria-pressed']
|
|
355
|
+
}], hostClasses: [{
|
|
356
|
+
type: HostBinding,
|
|
357
|
+
args: ['class']
|
|
358
|
+
}] } });
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Generated bundle index. Do not edit.
|
|
362
|
+
*/
|
|
363
|
+
|
|
364
|
+
export { RtButtonDirective };
|
|
365
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-button.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-button.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/button/rt-button.directive.ts","../../../projects/ui-kit-v2/src/lib/components/button/rt-tools-ui-kit-v2-button.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n effect,\n ElementRef,\n HostBinding,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n Renderer2,\n Signal,\n untracked,\n} from '@angular/core';\n\nimport { IRtKitConfig } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitDefault } from '@rt-tools/ui-kit-v2/core';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RT_RADIUS_DEFAULT, TRtRadius } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport {\n RT_ICON_GLYPH_STRATEGY,\n RT_ICON_MATERIAL_PRESET_SELECTOR,\n RtIconFontService,\n RtIconRegistry,\n resolveIconGlyph,\n} from '@rt-tools/ui-kit-v2/icon';\nimport { iconMaterialDrawn } from '@rt-tools/ui-kit-v2/icon';\nimport { RtRippleDirective } from '@rt-tools/ui-kit-v2/ripple';\nimport { IButton } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-button';\n\n/** Длительность затухания спиннера при выходе из загрузки. */\nconst LOADING_FADE_OUT_MS: number = 300;\n\n/** Запас поверх затухания, после которого подпись возвращается без анимации. */\nconst LOADING_FADE_OUT_BUFFER_MS: number = 50;\n\n/**\n * Директива стилизованной кнопки. Применяется к `<button>` или `<a>`\n * (для ссылок-кнопок с `routerLink`/`href`).\n *\n * Иконка и лейбл рендерятся внутрь элемента через `Renderer2`, чтобы можно\n * было применять директиву к существующему элементу без обёртки.\n * Поддерживает анимированный переход в/из loading.\n *\n * @example\n * ```html\n * <button rtButton label=\"Войти\" theme=\"primary\"></button>\n * <button rtButton label=\"Скачать\" icon=\"ico-download\" theme=\"success\"></button>\n * <button rtButton icon=\"pencil\" theme=\"info\" appearance=\"text\"></button>\n * <button rtButton label=\"Сохранение...\" [loading]=\"saving()\" [disabled]=\"saving()\"></button>\n * <a rtButton label=\"Главная\" [routerLink]=\"'/'\"></a>\n * ```\n */\n@Directive({\n selector: 'button[rtButton], a[rtButton]',\n hostDirectives: [\n { directive: RtRippleDirective, inputs: ['rippleDisabled'] },\n { directive: RtRadiusDirective, inputs: ['radius'] },\n ],\n /* Шаг скругления без входа берётся из настроек кита: приложение, скруглившее все кнопки разом,\n называет шаг один раз, а вход на кнопке по-прежнему сильнее. */\n providers: [\n {\n provide: RT_RADIUS_DEFAULT,\n useFactory: (): TRtRadius | null =>\n rtKitDefault('button', (it: IRtKitConfig.Button): TRtRadius | null | undefined => it.radius, null),\n },\n ],\n})\nexport class RtButtonDirective {\n readonly #el: ElementRef<HTMLButtonElement | HTMLAnchorElement> = inject<ElementRef<HTMLButtonElement | HTMLAnchorElement>>(ElementRef);\n readonly #renderer: Renderer2 = inject(Renderer2);\n readonly #doc: Document = inject(DOCUMENT);\n readonly #iconRegistry: RtIconRegistry = inject(RtIconRegistry);\n readonly #glyphStrategy: IRtIcon.GlyphStrategy = inject(RT_ICON_GLYPH_STRATEGY);\n readonly #fontReady: Signal<boolean> = inject(RtIconFontService).ready;\n\n /* С чего стартуют три входа, которые приложение вправе задать киту разом. Значение считается\n из настроек при объявлении входа: так публичный вид входа не меняется — ни тип, ни имя, — а\n вход, написанный в разметке, по-прежнему перебивает всё. Цена — настройки читаются один раз,\n когда узел создан. */\n readonly #appearance: IButton.Appearance = rtKitDefault(\n 'button',\n (it: IRtKitConfig.Button): IButton.Appearance | undefined => it.appearance,\n 'filled'\n );\n readonly #size: IButton.Size = rtKitDefault('button', (it: IRtKitConfig.Button): IButton.Size | undefined => it.size, 'md');\n\n #iconEl: HTMLElement | null = null;\n #labelEl: HTMLElement | null = null;\n #spinnerEl: HTMLElement | null = null;\n #wasLoading: boolean = false;\n\n protected readonly isIconOnly: Signal<boolean> = computed(() => !!this.icon() && !this.label());\n\n /** Текстовый лейбл кнопки. Если null — кнопка только с иконкой. */\n public readonly label: InputSignal<string | null> = input<string | null>(null);\n /**\n * Значок кнопки: имя кита (`check`) или имя Material (`arrow_back`). Имя Material рисуется\n * так же, как вход `glyph` у `rt-icon`: парой из перечня кита или лигатурой шрифта — по\n * настройке `glyphStrategy` у `provideRtIcons()`. Если null — без иконки.\n */\n public readonly icon: InputSignal<string | null> = input<string | null>(null);\n /** Сторона размещения иконки относительно лейбла. */\n public readonly iconPos: InputSignal<IButton.IconPos> = input<IButton.IconPos>('left');\n /** Семантическая палитра. */\n public readonly theme: InputSignal<IButton.Theme> = input<IButton.Theme>('primary');\n /** Внешний вид (filled / outlined / text). Умолчание — из настроек кита. */\n public readonly appearance: InputSignal<IButton.Appearance> = input<IButton.Appearance>(this.#appearance);\n /** Размер. Умолчание — из настроек кита. */\n public readonly size: InputSignal<IButton.Size> = input<IButton.Size>(this.#size);\n /** Состояние загрузки: показывает спиннер вместо иконки, блокирует клики. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n /** Кастомный CSS-класс иконки в loading. Если null — встроенный CSS-спиннер. */\n public readonly loadingIcon: InputSignal<string | null> = input<string | null>(null);\n /**\n * Подпись во время загрузки. `hide` оставляет подпись и иконку в кнопке невидимыми — ширина\n * не скачет, — а спиннер ставит по центру; имя кнопки для скринридера остаётся.\n */\n public readonly loadingLabel: InputSignal<IButton.LoadingLabel> = input<IButton.LoadingLabel>('keep');\n\n /**\n * Положение двухпозиционной кнопки: `true` — нажата, `false` — отжата, `null` — положения нет\n * вовсе.\n *\n * Три значения, а не два, потому что обычная кнопка переключателем не является и объявлять\n * себя двухпозиционной не должна: сказанное вспомогательным средствам «эта кнопка отжата» на\n * кнопке, которая просто запускает действие, — ложь, а не умолчание. Отжатое положение при\n * этом объявляется наравне с нажатым: молчащая в отжатом виде кнопка неотличима от обычной, и\n * о втором положении узнают только нажав.\n *\n * Само по нажатию положение не меняется: кнопка говорит о нажатии наружу, а положение\n * возвращает вызывающий — иначе вид кнопки и состояние приложения расходятся при первом же\n * отказе сохранения.\n */\n public readonly pressed: InputSignal<boolean | null> = input<boolean | null>(null);\n\n constructor() {\n afterNextRender(() => untracked(() => this.#updateContent()));\n\n effect(() => {\n this.label();\n this.icon();\n this.iconPos();\n this.loading();\n this.loadingIcon();\n this.loadingLabel();\n // Лигатура до готовности шрифтов скрыта: готовность перерисовывает содержимое.\n this.#fontReady();\n\n untracked(() => this.#updateContent());\n });\n }\n\n /** Положение наружу: атрибута нет вовсе там, где положения у кнопки не бывает. */\n @HostBinding('attr.aria-pressed')\n protected get ariaPressed(): string | null {\n const pressed: boolean | null = this.pressed();\n\n return pressed === null ? null : String(pressed);\n }\n\n @HostBinding('class')\n protected get hostClasses(): Record<string, boolean> {\n const theme: IButton.Theme = this.theme();\n const appearance: IButton.Appearance = this.appearance();\n const size: IButton.Size = this.size();\n\n return {\n [BEM_BLOCK]: true,\n [`${BEM_BLOCK}--${theme}`]: theme !== 'primary',\n [`${BEM_BLOCK}--outlined`]: appearance === 'outlined',\n [`${BEM_BLOCK}--text`]: appearance === 'text',\n [`${BEM_BLOCK}--loading`]: this.loading(),\n [`${BEM_BLOCK}--loading-label-hidden`]: this.loading() && this.loadingLabel() === 'hide',\n [`${BEM_BLOCK}--icon-only`]: this.isIconOnly(),\n [`${BEM_BLOCK}--${size}`]: size !== 'md',\n [`${BEM_BLOCK}--pressed`]: this.pressed() === true,\n };\n }\n\n #updateContent(): void {\n const button: HTMLButtonElement | HTMLAnchorElement = this.#el.nativeElement;\n const isLoading: boolean = this.loading();\n const wasLoading: boolean = this.#wasLoading;\n this.#wasLoading = isLoading;\n\n if (wasLoading && !isLoading) {\n this.#transitionFromLoading(button);\n return;\n }\n\n this.#clearContent(button);\n\n if (isLoading) {\n this.#renderLoading(button);\n return;\n }\n\n this.#renderIconAndLabel(button);\n }\n\n #transitionFromLoading(button: HTMLElement): void {\n const spinnerEl: HTMLElement | null = this.#spinnerEl;\n\n if (spinnerEl === null) {\n this.#restoreContent(button);\n return;\n }\n\n spinnerEl.style.animation = `rt-button-fade-out ${LOADING_FADE_OUT_MS}ms ease-out forwards`;\n\n // settled-гард делает animationend и страховочный таймаут взаимно\n // идемпотентными — сработает и снимет listener только то, что раньше.\n // Без таймаута подпись возвращалась бы только по анимации, а она не\n // идёт, пока кнопка спрятана (свёрнутая панель, неактивная вкладка):\n // выход из загрузки не наступал никогда, и на кнопке навсегда\n // оставался голый спиннер.\n let settled: boolean = false;\n\n const finish: () => void = (): void => {\n if (settled) {\n return;\n }\n settled = true;\n spinnerEl.removeEventListener('animationend', finish);\n this.#restoreContent(button);\n };\n\n spinnerEl.addEventListener('animationend', finish);\n setTimeout(finish, LOADING_FADE_OUT_MS + LOADING_FADE_OUT_BUFFER_MS);\n }\n\n #restoreContent(button: HTMLElement): void {\n this.#clearContent(button);\n this.#renderIconAndLabel(button);\n }\n\n /**\n * Чистим по классу, а не по своим ссылкам. Под серверным рендером разметку\n * кнопки рисует сервер: после гидратации лейбл и иконка уже лежат в DOM, но создавал их\n * другой экземпляр директивы, и `#labelEl` у клиентского — пустой. Ссылки\n * тогда не находят ничего, а `#renderIconAndLabel` дорисовывает второй\n * лейбл — подпись кнопки удваивается («СохранитьСохранить»).\n */\n #clearContent(button: HTMLElement): void {\n const ownClasses: ReadonlyArray<string> = [`${BEM_BLOCK}__icon`, `${BEM_BLOCK}__label`, `${BEM_BLOCK}__spinner`];\n\n // Обход по детям, а не селектором `:scope >`: тот же код исполняется на\n // сервере, где DOM эмулированный и селекторный движок урезан\n for (const child of Array.from(button.children)) {\n if (ownClasses.some((ownClass: string): boolean => child.classList.contains(ownClass))) {\n this.#renderer.removeChild(button, child);\n }\n }\n\n this.#iconEl = null;\n this.#labelEl = null;\n this.#spinnerEl = null;\n }\n\n #renderLoading(button: HTMLElement): void {\n const loadingIcon: string | null = this.loadingIcon();\n const loader: HTMLElement = loadingIcon ? this.#createIcon(loadingIcon) : this.#createSpinner();\n\n if (this.loadingLabel() === 'hide') {\n // Обычное содержимое остаётся и держит ширину; стили гасят его и ставят\n // загрузчик поверх по центру\n this.#renderIconAndLabel(button);\n this.#renderer.addClass(loader, `${BEM_BLOCK}__loader`);\n this.#renderer.appendChild(button, loader);\n if (!loadingIcon) {\n this.#spinnerEl = loader;\n }\n return;\n }\n\n if (loadingIcon) {\n this.#iconEl = loader;\n this.#renderer.appendChild(button, this.#iconEl);\n } else {\n this.#spinnerEl = loader;\n this.#renderer.appendChild(button, this.#spinnerEl);\n }\n\n const label: string | null = this.label();\n if (label) {\n this.#labelEl = this.#createLabel(label);\n this.#renderer.appendChild(button, this.#labelEl);\n }\n }\n\n #renderIconAndLabel(button: HTMLElement): void {\n const iconClass: string | null = this.icon();\n const label: string | null = this.label();\n const pos: IButton.IconPos = this.iconPos();\n\n const iconEl: HTMLElement | null = iconClass ? this.#createIcon(iconClass) : null;\n const labelEl: HTMLElement | null = label ? this.#createLabel(label) : null;\n\n if (pos === 'left') {\n if (iconEl) {\n this.#renderer.appendChild(button, iconEl);\n }\n if (labelEl) {\n this.#renderer.appendChild(button, labelEl);\n }\n } else {\n if (labelEl) {\n this.#renderer.appendChild(button, labelEl);\n }\n if (iconEl) {\n this.#renderer.appendChild(button, iconEl);\n }\n }\n\n this.#iconEl = iconEl;\n this.#labelEl = labelEl;\n }\n\n #createIcon(iconName: string): HTMLElement {\n const resolved: IRtIcon.Resolved | null = resolveIconGlyph(null, iconName, this.#glyphStrategy);\n if (resolved?.kind === 'kit') {\n return this.#createKitIcon(resolved.name);\n }\n return this.#createGlyph(iconName);\n }\n\n #createKitIcon(name: IRtIcon.Name): HTMLElement {\n const svg: SVGSVGElement = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('focusable', 'false');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.classList.add(`${BEM_BLOCK}__icon`);\n\n // Тот же путь, что и у компонента значка: имя просится у реестра, а он ходит за файлом\n // один раз на страницу — значок, спрошенный обеими разметками сразу, едет одним запросом.\n const drawing: IRtIcon.Drawing = this.#drawingOf(name);\n this.#iconRegistry.request(name, drawing);\n\n const use: SVGUseElement = this.#doc.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttribute('href', this.#iconRegistry.symbolHref(name, drawing));\n svg.appendChild(use);\n\n return svg as unknown as HTMLElement;\n }\n\n /**\n * Набор рисунка — как у компонента значка: материальный рисунок под разметкой с признаком\n * материального набора, если у имени он есть. Признак читается при каждой отрисовке\n * содержимого, а после первой отрисовки она повторяется — контейнер к тому времени на месте.\n */\n #drawingOf(name: IRtIcon.Name): IRtIcon.Drawing {\n const underMaterial: boolean = this.#el.nativeElement.closest(RT_ICON_MATERIAL_PRESET_SELECTOR) !== null;\n return underMaterial && iconMaterialDrawn.has(name) ? 'material' : 'base';\n }\n\n /** Лигатура шрифта Material Symbols для имени без пары. Шрифт подключает приложение. */\n #createGlyph(glyph: string): HTMLElement {\n const el: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(el, `${BEM_BLOCK}__icon`);\n this.#renderer.addClass(el, `${BEM_BLOCK}__glyph`);\n if (!this.#fontReady()) {\n this.#renderer.addClass(el, `${BEM_BLOCK}__glyph--pending`);\n }\n this.#renderer.setAttribute(el, 'aria-hidden', 'true');\n this.#renderer.appendChild(el, this.#renderer.createText(glyph));\n return el;\n }\n\n #createLabel(text: string): HTMLElement {\n const el: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(el, `${BEM_BLOCK}__label`);\n this.#renderer.appendChild(el, this.#renderer.createText(text));\n return el;\n }\n\n #createSpinner(): HTMLElement {\n const wrapper: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(wrapper, `${BEM_BLOCK}__spinner`);\n\n const circle: HTMLElement = this.#renderer.createElement('span') as HTMLElement;\n this.#renderer.addClass(circle, `${BEM_BLOCK}__spinner-circle`);\n this.#renderer.appendChild(wrapper, circle);\n\n return wrapper;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|