@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,220 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, DestroyRef, signal, computed, input, booleanAttribute, Directive } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { Validators, NgControl } from '@angular/forms';
|
|
5
|
+
|
|
6
|
+
/** Состояние поля, которому форма ещё ничего не сказала. */
|
|
7
|
+
const PRISTINE_STATE = { invalid: false, errors: null, required: false, interacted: false };
|
|
8
|
+
/** Рассылает ли контрол своё состояние. Переходник сигнальной формы — не рассылает. */
|
|
9
|
+
function emitsEvents(control) {
|
|
10
|
+
return typeof control.events?.pipe === 'function';
|
|
11
|
+
}
|
|
12
|
+
/** Состояние формы, снятое с контрола любого рода. */
|
|
13
|
+
function stateOf(control) {
|
|
14
|
+
return {
|
|
15
|
+
invalid: !!control.invalid && (control.touched || control.dirty),
|
|
16
|
+
errors: control.errors,
|
|
17
|
+
required: control.hasValidator(Validators.required),
|
|
18
|
+
interacted: control.touched || control.dirty,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
class RtFormControlBase {
|
|
22
|
+
#ngControl;
|
|
23
|
+
#destroyRef;
|
|
24
|
+
#onChange;
|
|
25
|
+
#onTouched;
|
|
26
|
+
// Состояние, которым управляет родительский rt-field (через публичные сеттеры):
|
|
27
|
+
// авто-id для связки label[for], read-only режим, зеркало ошибок/required.
|
|
28
|
+
#controlIdAssigned;
|
|
29
|
+
#readonlyAssigned;
|
|
30
|
+
/**
|
|
31
|
+
* Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без
|
|
32
|
+
* этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.
|
|
33
|
+
*/
|
|
34
|
+
#requiredAssigned;
|
|
35
|
+
/** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */
|
|
36
|
+
#pushedState;
|
|
37
|
+
/**
|
|
38
|
+
* Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и
|
|
39
|
+
* внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.
|
|
40
|
+
*/
|
|
41
|
+
#signalControl;
|
|
42
|
+
/** Отключение, назначенное формой через CVA (`setDisabledState`). */
|
|
43
|
+
#disabledByForm;
|
|
44
|
+
/** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */
|
|
45
|
+
#state;
|
|
46
|
+
/**
|
|
47
|
+
* Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь
|
|
48
|
+
* не нужен: его ошибку контрол и так получает от формы.
|
|
49
|
+
*/
|
|
50
|
+
#missingRequired;
|
|
51
|
+
constructor() {
|
|
52
|
+
this.#ngControl = inject(NgControl, { self: true, optional: true });
|
|
53
|
+
this.#destroyRef = inject(DestroyRef);
|
|
54
|
+
this.#onChange = () => undefined;
|
|
55
|
+
this.#onTouched = () => undefined;
|
|
56
|
+
// Состояние, которым управляет родительский rt-field (через публичные сеттеры):
|
|
57
|
+
// авто-id для связки label[for], read-only режим, зеркало ошибок/required.
|
|
58
|
+
this.#controlIdAssigned = signal(null, /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "#controlIdAssigned" }] : /* istanbul ignore next */ []));
|
|
60
|
+
this.#readonlyAssigned = signal(false, /* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [{ debugName: "#readonlyAssigned" }] : /* istanbul ignore next */ []));
|
|
62
|
+
/**
|
|
63
|
+
* Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без
|
|
64
|
+
* этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.
|
|
65
|
+
*/
|
|
66
|
+
this.#requiredAssigned = signal(false, /* @ts-ignore */
|
|
67
|
+
...(ngDevMode ? [{ debugName: "#requiredAssigned" }] : /* istanbul ignore next */ []));
|
|
68
|
+
/** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */
|
|
69
|
+
this.#pushedState = signal(PRISTINE_STATE, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "#pushedState" }] : /* istanbul ignore next */ []));
|
|
71
|
+
/**
|
|
72
|
+
* Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и
|
|
73
|
+
* внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.
|
|
74
|
+
*/
|
|
75
|
+
this.#signalControl = signal(null, /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "#signalControl" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/** Отключение, назначенное формой через CVA (`setDisabledState`). */
|
|
78
|
+
this.#disabledByForm = signal(false, /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "#disabledByForm" }] : /* istanbul ignore next */ []));
|
|
80
|
+
/**
|
|
81
|
+
* Отключение: вход и форма — два независимых источника, поле отключено,
|
|
82
|
+
* если так сказал любой из них. Сводить их в один signal нельзя: форма
|
|
83
|
+
* зовёт `setDisabledState` при связывании контрола, то есть раньше, чем
|
|
84
|
+
* поле впервые обновит своё вью, и мирроринг входа затирал бы её слово —
|
|
85
|
+
* контрол, созданный отключённым, оказывался бы редактируемым.
|
|
86
|
+
*/
|
|
87
|
+
this.isDisabled = computed(() => this.disabled() || this.#disabledByForm(), /* @ts-ignore */
|
|
88
|
+
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
89
|
+
/** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */
|
|
90
|
+
this.#state = computed(() => {
|
|
91
|
+
const control = this.#signalControl();
|
|
92
|
+
return control === null ? this.#pushedState() : stateOf(control);
|
|
93
|
+
}, /* @ts-ignore */
|
|
94
|
+
...(ngDevMode ? [{ debugName: "#state" }] : /* istanbul ignore next */ []));
|
|
95
|
+
/**
|
|
96
|
+
* Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь
|
|
97
|
+
* не нужен: его ошибку контрол и так получает от формы.
|
|
98
|
+
*/
|
|
99
|
+
this.#missingRequired = computed(() => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue(), /* @ts-ignore */
|
|
100
|
+
...(ngDevMode ? [{ debugName: "#missingRequired" }] : /* istanbul ignore next */ []));
|
|
101
|
+
this.isInvalid = computed(() => this.#state().invalid || this.#missingRequired(), /* @ts-ignore */
|
|
102
|
+
...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
|
|
103
|
+
/** Видимость кнопки очистки: включена, есть значение, поле активно. */
|
|
104
|
+
this.showClearButton = computed(() => this.clearable() && this.hasValue() && !this.isDisabled(), /* @ts-ignore */
|
|
105
|
+
...(ngDevMode ? [{ debugName: "showClearButton" }] : /* istanbul ignore next */ []));
|
|
106
|
+
this.size = input('md', /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
108
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
109
|
+
this.controlId = input(null, /* @ts-ignore */
|
|
110
|
+
...(ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []));
|
|
111
|
+
this.ariaLabel = input(null, /* @ts-ignore */
|
|
112
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
113
|
+
this.clearable = input(true, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
114
|
+
/**
|
|
115
|
+
* Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих
|
|
116
|
+
* темах. `false` снимает только resting-рамку; focus/invalid состояния свою
|
|
117
|
+
* рамку показывают всё равно, read-only остаётся плоским.
|
|
118
|
+
*/
|
|
119
|
+
this.bordered = input(true, { ...(ngDevMode ? { debugName: "bordered" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
120
|
+
/** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */
|
|
121
|
+
this.effectiveControlId = computed(() => this.controlId() ?? this.#controlIdAssigned(), /* @ts-ignore */
|
|
122
|
+
...(ngDevMode ? [{ debugName: "effectiveControlId" }] : /* istanbul ignore next */ []));
|
|
123
|
+
/** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */
|
|
124
|
+
this.isReadonly = this.#readonlyAssigned.asReadonly();
|
|
125
|
+
/** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */
|
|
126
|
+
this.invalid = computed(() => this.isInvalid(), /* @ts-ignore */
|
|
127
|
+
...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
|
|
128
|
+
/** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */
|
|
129
|
+
this.errors = computed(() => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null), /* @ts-ignore */
|
|
130
|
+
...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
|
|
131
|
+
/** Обязателен ли контрол — по валидатору формы или по слову rt-field. Для авто-«*». */
|
|
132
|
+
this.required = computed(() => this.#state().required || this.#requiredAssigned(), /* @ts-ignore */
|
|
133
|
+
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
134
|
+
this.value = signal(this.getEmptyValue(), /* @ts-ignore */
|
|
135
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
136
|
+
// Self-inject NgControl + ручная привязка valueAccessor: доступ к
|
|
137
|
+
// control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот
|
|
138
|
+
// спровоцировал бы NG0200 cycle при self-reference).
|
|
139
|
+
if (this.#ngControl !== null) {
|
|
140
|
+
this.#ngControl.valueAccessor = this;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
ngOnInit() {
|
|
144
|
+
const control = this.#ngControl?.control ?? null;
|
|
145
|
+
if (control === null) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Контрол, который состояния не рассылает, — переходник сигнальной формы: событий у
|
|
149
|
+
// него нет вовсе, и подписка на них роняла поле из запуска вместе со всем поддеревом
|
|
150
|
+
// разметки. Состояние у него читается геттерами, поэтому берётся вычислением.
|
|
151
|
+
if (!emitsEvents(control)) {
|
|
152
|
+
this.#signalControl.set(control);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Авто-подсветка invalid + зеркало ошибок/required для rt-field.
|
|
156
|
+
this.#pushedState.set(stateOf(control));
|
|
157
|
+
control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {
|
|
158
|
+
this.#pushedState.set(stateOf(control));
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
writeValue(value) {
|
|
162
|
+
this.value.set(value ?? this.getEmptyValue());
|
|
163
|
+
}
|
|
164
|
+
registerOnChange(fn) {
|
|
165
|
+
this.#onChange = fn;
|
|
166
|
+
}
|
|
167
|
+
registerOnTouched(fn) {
|
|
168
|
+
this.#onTouched = fn;
|
|
169
|
+
}
|
|
170
|
+
setDisabledState(isDisabled) {
|
|
171
|
+
this.#disabledByForm.set(isDisabled);
|
|
172
|
+
}
|
|
173
|
+
/** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */
|
|
174
|
+
assignControlId(id) {
|
|
175
|
+
this.#controlIdAssigned.set(id);
|
|
176
|
+
}
|
|
177
|
+
/** Включить/выключить read-only режим — вызывает родительский rt-field. */
|
|
178
|
+
setReadonly(value) {
|
|
179
|
+
this.#readonlyAssigned.set(value);
|
|
180
|
+
}
|
|
181
|
+
/** Объявить контрол обязательным — вызывает родительский rt-field. */
|
|
182
|
+
setRequired(value) {
|
|
183
|
+
this.#requiredAssigned.set(value);
|
|
184
|
+
}
|
|
185
|
+
/** Очистка значения по кнопке-крестику + возврат фокуса в поле. */
|
|
186
|
+
clear(event) {
|
|
187
|
+
event?.stopPropagation();
|
|
188
|
+
if (this.isDisabled()) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
this.clearValue();
|
|
192
|
+
this.#onChange(this.value());
|
|
193
|
+
this.#onTouched();
|
|
194
|
+
this.focusAfterClear();
|
|
195
|
+
}
|
|
196
|
+
/** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */
|
|
197
|
+
clearValue() {
|
|
198
|
+
this.value.set(this.getEmptyValue());
|
|
199
|
+
}
|
|
200
|
+
/** Прокидывает change наружу — для обработчиков пользовательского ввода. */
|
|
201
|
+
emitChange(value) {
|
|
202
|
+
this.#onChange(value);
|
|
203
|
+
}
|
|
204
|
+
/** Помечает контрол touched — для blur/close-обработчиков. */
|
|
205
|
+
markTouched() {
|
|
206
|
+
this.#onTouched();
|
|
207
|
+
}
|
|
208
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFormControlBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
209
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtFormControlBase, isStandalone: true, inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
210
|
+
}
|
|
211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFormControlBase, decorators: [{
|
|
212
|
+
type: Directive
|
|
213
|
+
}], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], controlId: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], bordered: [{ type: i0.Input, args: [{ isSignal: true, alias: "bordered", required: false }] }] } });
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Generated bundle index. Do not edit.
|
|
217
|
+
*/
|
|
218
|
+
|
|
219
|
+
export { RtFormControlBase };
|
|
220
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-form-control.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-form-control.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/form-control/rt-form-control.base.ts","../../../projects/ui-kit-v2/src/lib/components/form-control/rt-tools-ui-kit-v2-form-control.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validators } from '@angular/forms';\n\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\n/**\n * Базовый класс input-семейства common/ui. Владеет единым CVA-ядром:\n * - self-injected `NgControl` + ручная привязка `valueAccessor` (без\n * `NG_VALUE_ACCESSOR` provider — иначе NG0200 cycle при self-reference),\n * что даёт доступ к `control.invalid/touched` для авто-подсветки ошибки;\n * - сигнал значения `value`, состояния `isDisabled`/`isInvalid` (отключение\n * складывается из входа `disabled` и слова формы — см. `isDisabled`);\n * - общие инпуты `size`/`disabled`/`controlId`/`ariaLabel`/`clearable`;\n * - оркестрацию очистки (`clear`) через абстрактные хуки конкретного поля.\n *\n * Конкретные поля реализуют `getEmptyValue`/`hasValue`/`focusAfterClear`. Поля\n * с отдельным display-состоянием (autocomplete, input-number) дополнительно\n * переопределяют `writeValue`/`clearValue`, синхронизируя свой display-сигнал.\n */\n/**\n * Состояние формы, каким его видит поле: негодность, ошибки и обязательность.\n *\n * Собрано одной записью затем, что источников у него два и говорят они по-разному. Прежняя\n * привязка рассылает состояние событиями контрола, сигнальная — не рассылает вовсе и отдаёт\n * его чтениями своего переходника. Порознь эти два пути дали бы полю два набора сигналов, и\n * обёртке пришлось бы знать, какой из них живой.\n */\ninterface IControlState {\n invalid: boolean;\n errors: ValidationErrors | null;\n required: boolean;\n /** Касались ли контрола или правили его: до этого пустое обязательное поле не краснеет. */\n interacted: boolean;\n}\n\n/** Состояние поля, которому форма ещё ничего не сказала. */\nconst PRISTINE_STATE: IControlState = { invalid: false, errors: null, required: false, interacted: false };\n\n/** Рассылает ли контрол своё состояние. Переходник сигнальной формы — не рассылает. */\nfunction emitsEvents(control: AbstractControl): boolean {\n return typeof (control.events as { pipe?: unknown } | undefined)?.pipe === 'function';\n}\n\n/** Состояние формы, снятое с контрола любого рода. */\nfunction stateOf(control: AbstractControl): IControlState {\n return {\n invalid: !!control.invalid && (control.touched || control.dirty),\n errors: control.errors,\n required: control.hasValidator(Validators.required),\n interacted: control.touched || control.dirty,\n };\n}\n\n@Directive()\nexport abstract class RtFormControlBase<TValue> implements ControlValueAccessor, OnInit {\n readonly #ngControl: NgControl | null = inject(NgControl, { self: true, optional: true });\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n #onChange: (value: TValue) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n // Состояние, которым управляет родительский rt-field (через публичные сеттеры):\n // авто-id для связки label[for], read-only режим, зеркало ошибок/required.\n readonly #controlIdAssigned: WritableSignal<string | null> = signal<string | null>(null);\n readonly #readonlyAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /**\n * Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без\n * этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.\n */\n readonly #requiredAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */\n readonly #pushedState: WritableSignal<IControlState> = signal<IControlState>(PRISTINE_STATE);\n /**\n * Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и\n * внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.\n */\n readonly #signalControl: WritableSignal<AbstractControl | null> = signal<AbstractControl | null>(null);\n /** Отключение, назначенное формой через CVA (`setDisabledState`). */\n readonly #disabledByForm: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly value: WritableSignal<TValue>;\n /**\n * Отключение: вход и форма — два независимых источника, поле отключено,\n * если так сказал любой из них. Сводить их в один signal нельзя: форма\n * зовёт `setDisabledState` при связывании контрола, то есть раньше, чем\n * поле впервые обновит своё вью, и мирроринг входа затирал бы её слово —\n * контрол, созданный отключённым, оказывался бы редактируемым.\n */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.#disabledByForm());\n /** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */\n readonly #state: Signal<IControlState> = computed((): IControlState => {\n const control: AbstractControl | null = this.#signalControl();\n return control === null ? this.#pushedState() : stateOf(control);\n });\n\n /**\n * Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь\n * не нужен: его ошибку контрол и так получает от формы.\n */\n readonly #missingRequired: Signal<boolean> = computed(\n (): boolean => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue()\n );\n\n protected readonly isInvalid: Signal<boolean> = computed((): boolean => this.#state().invalid || this.#missingRequired());\n\n /** Видимость кнопки очистки: включена, есть значение, поле активно. */\n protected readonly showClearButton: Signal<boolean> = computed(\n (): boolean => this.clearable() && this.hasValue() && !this.isDisabled()\n );\n\n /** Есть ли в поле значение — гейт видимости крестика. */\n protected abstract readonly hasValue: Signal<boolean>;\n\n public readonly size: InputSignal<IRtInput.Size> = input<IRtInput.Size>('md');\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly controlId: InputSignal<string | null> = input<string | null>(null);\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n public readonly clearable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих\n * темах. `false` снимает только resting-рамку; focus/invalid состояния свою\n * рамку показывают всё равно, read-only остаётся плоским.\n */\n public readonly bordered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */\n public readonly effectiveControlId: Signal<string | null> = computed(\n (): string | null => this.controlId() ?? this.#controlIdAssigned()\n );\n\n /** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */\n public readonly isReadonly: Signal<boolean> = this.#readonlyAssigned.asReadonly();\n\n /** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */\n public readonly invalid: Signal<boolean> = computed((): boolean => this.isInvalid());\n\n /** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */\n public readonly errors: Signal<ValidationErrors | null> = computed(\n (): ValidationErrors | null => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null)\n );\n\n /** Обязателен ли контрол — по валидатору формы или по слову rt-field. Для авто-«*». */\n public readonly required: Signal<boolean> = computed((): boolean => this.#state().required || this.#requiredAssigned());\n\n /** Текст read-only представления. Реализуется конкретным контролом. */\n public abstract readonly displayText: Signal<string>;\n\n constructor() {\n this.value = signal<TValue>(this.getEmptyValue());\n // Self-inject NgControl + ручная привязка valueAccessor: доступ к\n // control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот\n // спровоцировал бы NG0200 cycle при self-reference).\n if (this.#ngControl !== null) {\n this.#ngControl.valueAccessor = this;\n }\n }\n\n public ngOnInit(): void {\n const control: AbstractControl | null = this.#ngControl?.control ?? null;\n if (control === null) {\n return;\n }\n // Контрол, который состояния не рассылает, — переходник сигнальной формы: событий у\n // него нет вовсе, и подписка на них роняла поле из запуска вместе со всем поддеревом\n // разметки. Состояние у него читается геттерами, поэтому берётся вычислением.\n if (!emitsEvents(control)) {\n this.#signalControl.set(control);\n return;\n }\n // Авто-подсветка invalid + зеркало ошибок/required для rt-field.\n this.#pushedState.set(stateOf(control));\n control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((): void => {\n this.#pushedState.set(stateOf(control));\n });\n }\n\n public writeValue(value: TValue | null): void {\n this.value.set(value ?? this.getEmptyValue());\n }\n\n public registerOnChange(fn: (value: TValue) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.#disabledByForm.set(isDisabled);\n }\n\n /** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */\n public assignControlId(id: string): void {\n this.#controlIdAssigned.set(id);\n }\n\n /** Включить/выключить read-only режим — вызывает родительский rt-field. */\n public setReadonly(value: boolean): void {\n this.#readonlyAssigned.set(value);\n }\n\n /** Объявить контрол обязательным — вызывает родительский rt-field. */\n public setRequired(value: boolean): void {\n this.#requiredAssigned.set(value);\n }\n\n /** Очистка значения по кнопке-крестику + возврат фокуса в поле. */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) {\n return;\n }\n this.clearValue();\n this.#onChange(this.value());\n this.#onTouched();\n this.focusAfterClear();\n }\n\n /** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */\n protected clearValue(): void {\n this.value.set(this.getEmptyValue());\n }\n\n /** Прокидывает change наружу — для обработчиков пользовательского ввода. */\n protected emitChange(value: TValue): void {\n this.#onChange(value);\n }\n\n /** Помечает контрол touched — для blur/close-обработчиков. */\n protected markTouched(): void {\n this.#onTouched();\n }\n\n /** Пустое значение поля (тип-специфично: \"\", null, []). */\n protected abstract getEmptyValue(): TValue;\n\n /** Возврат фокуса после очистки (в input или на trigger-кнопку). */\n protected abstract focusAfterClear(): void;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
4
|
+
import { RT_KIT_LABELS } from '@rt-tools/ui-kit-v2/core';
|
|
5
|
+
import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
|
|
6
|
+
import { RtLogoComponent } from '@rt-tools/ui-kit-v2/logo';
|
|
7
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
8
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
9
|
+
|
|
10
|
+
const BEM_BLOCK = 'rt-header';
|
|
11
|
+
/**
|
|
12
|
+
* Общий хедер приложения.
|
|
13
|
+
*
|
|
14
|
+
* Слева — slot 35×45 под back-button (rt-icon-button arrow-left, ghost variant),
|
|
15
|
+
* который виден по входному сигналу `canGoBack` и эмитит `backClick`. Когда
|
|
16
|
+
* `canGoBack=false` (default) — slot полностью скрыт через display:none, wordmark
|
|
17
|
+
* выравнивается слева.
|
|
18
|
+
*
|
|
19
|
+
* Далее — wordmark, справа — action-иконки (rt-icon-button шагом md): опциональная «Пригласить пользователя»
|
|
20
|
+
* (`showInvite`), слот колокольчика и профиль.
|
|
21
|
+
*
|
|
22
|
+
* Колокольчик уведомлений — проекция `[rtHeaderBell]`: домен кладёт в слот
|
|
23
|
+
* `rt-notifications-bell` (общий попап-компонент), хедер про его устройство не знает.
|
|
24
|
+
*
|
|
25
|
+
* Темизация — через семантические `--rt-color-bg-surface` / `--rt-color-text-primary`,
|
|
26
|
+
* dark override карточного фона выполняется в SCSS (header navy совпадает с фоном
|
|
27
|
+
* страницы в dark).
|
|
28
|
+
*/
|
|
29
|
+
class RtHeaderComponent {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.t = inject(RT_KIT_LABELS);
|
|
32
|
+
this.canGoBack = input(false, { ...(ngDevMode ? { debugName: "canGoBack" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
33
|
+
/** Показывать action-иконку «Пригласить пользователя» слева от колокола. */
|
|
34
|
+
this.showInvite = input(false, { ...(ngDevMode ? { debugName: "showInvite" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
35
|
+
this.backClick = output();
|
|
36
|
+
this.inviteClick = output();
|
|
37
|
+
this.profileClick = output();
|
|
38
|
+
}
|
|
39
|
+
onBackClick() {
|
|
40
|
+
this.backClick.emit();
|
|
41
|
+
}
|
|
42
|
+
onInviteClick() {
|
|
43
|
+
this.inviteClick.emit();
|
|
44
|
+
}
|
|
45
|
+
onProfileClick() {
|
|
46
|
+
this.profileClick.emit();
|
|
47
|
+
}
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
49
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtHeaderComponent, isStandalone: true, selector: "rt-header", inputs: { canGoBack: { classPropertyName: "canGoBack", publicName: "canGoBack", isSignal: true, isRequired: false, transformFunction: null }, showInvite: { classPropertyName: "showInvite", publicName: "showInvite", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { backClick: "backClick", inviteClick: "inviteClick", profileClick: "profileClick" }, host: { classAttribute: "rt-header" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiInviteUser\"\n [tooltip]=\"t().uiInviteUser\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiProfile\"\n [tooltip]=\"t().uiProfile\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-header{--rt-header-radius: var(--rt-radius-lg);--rt-header-shadow: var(--rt-shadow-card-soft);--rt-header-back-transition-duration: var(--rt-duration-base);display:block;height:45px;padding:0 var(--rt-space-5);background:var(--rt-color-bg-surface);border-bottom-left-radius:var(--rt-header-radius);border-bottom-right-radius:var(--rt-header-radius);box-shadow:var(--rt-header-shadow);color:var(--rt-color-text-primary)}.rt-header__content{display:flex;width:100%;max-width:var(--rt-header-content-max-width, 100%);height:100%;align-items:center;margin:0 auto;gap:0}.rt-header__back{display:inline-flex;overflow:hidden;width:0;height:45px;align-items:center;justify-content:flex-start;opacity:0;pointer-events:none;transform:translate(-8px);transition:width var(--rt-header-back-transition-duration) cubic-bezier(.34,1.56,.64,1),opacity var(--rt-header-back-transition-duration) ease-out,transform var(--rt-header-back-transition-duration) cubic-bezier(.34,1.56,.64,1)}.rt-header__back--visible{width:35px;opacity:1;pointer-events:auto;transform:translate(0)}.rt-header__logo{display:flex;min-width:0;flex:1 0 0;align-items:center}.rt-header[data-rt-radius=none]{--rt-header-radius: var(--rt-radius-none)}.rt-header[data-rt-radius=xs]{--rt-header-radius: var(--rt-radius-xs)}.rt-header[data-rt-radius=sm]{--rt-header-radius: var(--rt-radius-sm)}.rt-header[data-rt-radius=ms]{--rt-header-radius: var(--rt-radius-ms)}.rt-header[data-rt-radius=md]{--rt-header-radius: var(--rt-radius-md)}.rt-header[data-rt-radius=lg]{--rt-header-radius: var(--rt-radius-lg)}.rt-header[data-rt-radius=xl]{--rt-header-radius: var(--rt-radius-xl)}.rt-header[data-rt-radius=\"2xl\"]{--rt-header-radius: var(--rt-radius-2xl)}.rt-header[data-rt-radius=full]{--rt-header-radius: var(--rt-radius-full)}[data-theme=dark] .rt-header{background:var(--rt-color-bg-nav)}@media(prefers-reduced-motion:reduce){.rt-header__back{transition:none}}}\n"], dependencies: [{ kind: "component", type:
|
|
50
|
+
// standalone components / directives
|
|
51
|
+
RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtLogoComponent, selector: "rt-logo", inputs: ["variant", "height", "aspect", "ariaLabel"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
52
|
+
}
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtHeaderComponent, decorators: [{
|
|
54
|
+
type: Component,
|
|
55
|
+
args: [{ selector: 'rt-header', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
56
|
+
// standalone components / directives
|
|
57
|
+
RtIconButtonComponent,
|
|
58
|
+
RtLogoComponent,
|
|
59
|
+
BlockDirective,
|
|
60
|
+
ElemDirective,
|
|
61
|
+
ModDirective,
|
|
62
|
+
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
63
|
+
class: BEM_BLOCK,
|
|
64
|
+
}, template: "<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiInviteUser\"\n [tooltip]=\"t().uiInviteUser\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiProfile\"\n [tooltip]=\"t().uiProfile\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-header{--rt-header-radius: var(--rt-radius-lg);--rt-header-shadow: var(--rt-shadow-card-soft);--rt-header-back-transition-duration: var(--rt-duration-base);display:block;height:45px;padding:0 var(--rt-space-5);background:var(--rt-color-bg-surface);border-bottom-left-radius:var(--rt-header-radius);border-bottom-right-radius:var(--rt-header-radius);box-shadow:var(--rt-header-shadow);color:var(--rt-color-text-primary)}.rt-header__content{display:flex;width:100%;max-width:var(--rt-header-content-max-width, 100%);height:100%;align-items:center;margin:0 auto;gap:0}.rt-header__back{display:inline-flex;overflow:hidden;width:0;height:45px;align-items:center;justify-content:flex-start;opacity:0;pointer-events:none;transform:translate(-8px);transition:width var(--rt-header-back-transition-duration) cubic-bezier(.34,1.56,.64,1),opacity var(--rt-header-back-transition-duration) ease-out,transform var(--rt-header-back-transition-duration) cubic-bezier(.34,1.56,.64,1)}.rt-header__back--visible{width:35px;opacity:1;pointer-events:auto;transform:translate(0)}.rt-header__logo{display:flex;min-width:0;flex:1 0 0;align-items:center}.rt-header[data-rt-radius=none]{--rt-header-radius: var(--rt-radius-none)}.rt-header[data-rt-radius=xs]{--rt-header-radius: var(--rt-radius-xs)}.rt-header[data-rt-radius=sm]{--rt-header-radius: var(--rt-radius-sm)}.rt-header[data-rt-radius=ms]{--rt-header-radius: var(--rt-radius-ms)}.rt-header[data-rt-radius=md]{--rt-header-radius: var(--rt-radius-md)}.rt-header[data-rt-radius=lg]{--rt-header-radius: var(--rt-radius-lg)}.rt-header[data-rt-radius=xl]{--rt-header-radius: var(--rt-radius-xl)}.rt-header[data-rt-radius=\"2xl\"]{--rt-header-radius: var(--rt-radius-2xl)}.rt-header[data-rt-radius=full]{--rt-header-radius: var(--rt-radius-full)}[data-theme=dark] .rt-header{background:var(--rt-color-bg-nav)}@media(prefers-reduced-motion:reduce){.rt-header__back{transition:none}}}\n"] }]
|
|
65
|
+
}], propDecorators: { canGoBack: [{ type: i0.Input, args: [{ isSignal: true, alias: "canGoBack", required: false }] }], showInvite: [{ type: i0.Input, args: [{ isSignal: true, alias: "showInvite", required: false }] }], backClick: [{ type: i0.Output, args: ["backClick"] }], inviteClick: [{ type: i0.Output, args: ["inviteClick"] }], profileClick: [{ type: i0.Output, args: ["profileClick"] }] } });
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Generated bundle index. Do not edit.
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
export { RtHeaderComponent };
|
|
72
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-header.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-header.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/header/rt-header.component.html","../../../projects/ui-kit-v2/src/lib/components/header/rt-tools-ui-kit-v2-header.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtLogoComponent } from '@rt-tools/ui-kit-v2/logo';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\n\nconst BEM_BLOCK: string = 'rt-header';\n\n/**\n * Общий хедер приложения.\n *\n * Слева — slot 35×45 под back-button (rt-icon-button arrow-left, ghost variant),\n * который виден по входному сигналу `canGoBack` и эмитит `backClick`. Когда\n * `canGoBack=false` (default) — slot полностью скрыт через display:none, wordmark\n * выравнивается слева.\n *\n * Далее — wordmark, справа — action-иконки (rt-icon-button шагом md): опциональная «Пригласить пользователя»\n * (`showInvite`), слот колокольчика и профиль.\n *\n * Колокольчик уведомлений — проекция `[rtHeaderBell]`: домен кладёт в слот\n * `rt-notifications-bell` (общий попап-компонент), хедер про его устройство не знает.\n *\n * Темизация — через семантические `--rt-color-bg-surface` / `--rt-color-text-primary`,\n * dark override карточного фона выполняется в SCSS (header navy совпадает с фоном\n * страницы в dark).\n */\n@Component({\n selector: 'rt-header',\n templateUrl: './rt-header.component.html',\n styleUrls: ['./rt-header.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n RtLogoComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtHeaderComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly canGoBack: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Показывать action-иконку «Пригласить пользователя» слева от колокола. */\n public readonly showInvite: InputSignalWithTransform<boolean, boolean | string> = input<boolean, boolean | string>(false, {\n transform: booleanAttribute,\n });\n\n public readonly backClick: OutputEmitterRef<void> = output<void>();\n public readonly inviteClick: OutputEmitterRef<void> = output<void>();\n public readonly profileClick: OutputEmitterRef<void> = output<void>();\n\n protected onBackClick(): void {\n this.backClick.emit();\n }\n\n protected onInviteClick(): void {\n this.inviteClick.emit();\n }\n\n protected onProfileClick(): void {\n this.profileClick.emit();\n }\n}\n","<ng-container rtBlock=\"rt-header\">\n <div rtElem=\"content\">\n <rt-icon-button\n rtElem=\"back\"\n qa-dataid=\"header-back\"\n icon=\"arrow-left\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiBack\"\n [tooltip]=\"t().uiBack\"\n [rtMod]=\"{ visible: canGoBack() }\"\n (clicked)=\"onBackClick()\" />\n\n <div rtElem=\"logo\" qa-dataid=\"header-logo\">\n <rt-logo variant=\"wordmark\" height=\"15\" />\n </div>\n\n @if (showInvite()) {\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-invite\"\n icon=\"user-plus\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiInviteUser\"\n [tooltip]=\"t().uiInviteUser\"\n (clicked)=\"onInviteClick()\" />\n }\n\n <ng-content select=\"[rtHeaderBell]\" />\n\n <rt-icon-button\n rtElem=\"action\"\n qa-dataid=\"header-profile\"\n icon=\"user\"\n variant=\"ghost\"\n size=\"md\"\n radius=\"full\"\n [ariaLabel]=\"t().uiProfile\"\n [tooltip]=\"t().uiProfile\"\n (clicked)=\"onProfileClick()\" />\n </div>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAqBA,MAAM,SAAS,GAAW,WAAW;AAErC;;;;;;;;;;;;;;;;;AAiBG;MAoBU,iBAAiB,CAAA;AAnB9B,IAAA,WAAA,GAAA;AAoBuB,QAAA,IAAA,CAAA,CAAC,GAA2B,MAAM,CAAC,aAAa,CAAC;QAEpD,IAAA,CAAA,SAAS,GAAoD,KAAK,CAAwB,KAAK,iFAC3G,SAAS,EAAE,gBAAgB,EAAA,CAC7B;;QAGc,IAAA,CAAA,UAAU,GAAwD,KAAK,CAA4B,KAAK,kFACpH,SAAS,EAAE,gBAAgB,EAAA,CAC7B;QAEc,IAAA,CAAA,SAAS,GAA2B,MAAM,EAAQ;QAClD,IAAA,CAAA,WAAW,GAA2B,MAAM,EAAQ;QACpD,IAAA,CAAA,YAAY,GAA2B,MAAM,EAAQ;AAaxE,IAAA;IAXa,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;IAEU,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IAC3B;IAEU,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC5B;8GA1BS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,ujBC5D9B,q6CA6CA,EAAA,MAAA,EAAA,CAAA,06DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA;;ADIQ,gBAAA,qBAAqB,8PACrB,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,aAAa,wEACb,YAAY,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAOP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAnB7B,SAAS;+BACI,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;;wBAEL,qBAAqB;wBACrB,eAAe;wBACf,cAAc;wBACd,aAAa;wBACb,YAAY;AACf,qBAAA,EAAA,cAAA,EACe,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,KAAK,EAAE,SAAS;AACnB,qBAAA,EAAA,QAAA,EAAA,q6CAAA,EAAA,MAAA,EAAA,CAAA,06DAAA,CAAA,EAAA;;;AE1DL;;AAEG;;;;"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { computed, input, booleanAttribute, numberAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';
|
|
4
|
+
import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
|
|
5
|
+
import * as i1 from '@rt-tools/ui-kit-v2/radius';
|
|
6
|
+
import { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';
|
|
7
|
+
import { RtRippleDirective } from '@rt-tools/ui-kit-v2/ripple';
|
|
8
|
+
import { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';
|
|
9
|
+
|
|
10
|
+
const BEM_BLOCK = 'rt-icon-button';
|
|
11
|
+
/**
|
|
12
|
+
* Универсальная icon-only кнопка кита.
|
|
13
|
+
*
|
|
14
|
+
* Рендерит свой собственный `<button type="...">` внутри template (НЕ host-button).
|
|
15
|
+
* Все цвета и размеры — через семантические `--rt-*` токены; геометрия квадрата
|
|
16
|
+
* берётся из `--rt-icon-button-size`, а без него — из шага `size`. Свойство, заданное на теге
|
|
17
|
+
* `<rt-icon-button>` или выше, доходит до кнопки; так же и `--rt-icon-button-bg`.
|
|
18
|
+
*
|
|
19
|
+
* Loading state — заменяет иконку на `<rt-icon name="spinner">` и блокирует
|
|
20
|
+
* клики (`button[disabled]`). Active state управляет `aria-pressed` (для toggle-кнопок).
|
|
21
|
+
* Indicator — небольшой dot top-right через BEM-элемент `__indicator`.
|
|
22
|
+
*
|
|
23
|
+
* BEM-разметка — через `rtBlock="rt-icon-button"` + `[rtMod]` объект; камелкейс
|
|
24
|
+
* модификаторов автоматически конвертируется директивой в kebab-case
|
|
25
|
+
* (`hasIndicator` → `rt-icon-button--has-indicator`).
|
|
26
|
+
*/
|
|
27
|
+
class RtIconButtonComponent {
|
|
28
|
+
constructor() {
|
|
29
|
+
/**
|
|
30
|
+
* Размер дочерней `<rt-icon>`. По умолчанию маппится 1-к-1 от размера кнопки,
|
|
31
|
+
* но потребитель может задать свой: у крупной кнопки-действия (плавающая
|
|
32
|
+
* кнопка чата) иконка во весь диаметр выглядит тяжеловесно, а сама кнопка
|
|
33
|
+
* должна остаться большой — в неё целятся пальцем.
|
|
34
|
+
*/
|
|
35
|
+
this.resolvedIconSize = computed(() => {
|
|
36
|
+
const map = {
|
|
37
|
+
'2xs': 'sm',
|
|
38
|
+
xs: 'sm',
|
|
39
|
+
sm: 'sm',
|
|
40
|
+
md: 'md',
|
|
41
|
+
lg: 'lg',
|
|
42
|
+
xl: 'xl',
|
|
43
|
+
'2xl': '2xl',
|
|
44
|
+
};
|
|
45
|
+
return this.iconSize() ?? map[this.size()];
|
|
46
|
+
}, /* @ts-ignore */
|
|
47
|
+
...(ngDevMode ? [{ debugName: "resolvedIconSize" }] : /* istanbul ignore next */ []));
|
|
48
|
+
/** Кнопка отключена, если установлен disabled ИЛИ loading. */
|
|
49
|
+
this.isDisabled = computed(() => this.disabled() || this.loading(), /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
51
|
+
/**
|
|
52
|
+
* BEM-модификаторы для `[rtMod]`. Собираем в .ts (а не в шаблоне), потому что
|
|
53
|
+
* Angular template-parser не поддерживает computed property keys в inline-объектах.
|
|
54
|
+
* camelCase ключи `hasIndicator` директива автоматически конвертирует в `has-indicator`.
|
|
55
|
+
*/
|
|
56
|
+
this.bemMods = computed(() => ({
|
|
57
|
+
[this.variant()]: true,
|
|
58
|
+
[this.size()]: true,
|
|
59
|
+
loading: this.loading(),
|
|
60
|
+
active: this.active(),
|
|
61
|
+
hasIndicator: this.indicator(),
|
|
62
|
+
}), /* @ts-ignore */
|
|
63
|
+
...(ngDevMode ? [{ debugName: "bemMods" }] : /* istanbul ignore next */ []));
|
|
64
|
+
/**
|
|
65
|
+
* Имя иконки в наборе кита. Нужно оно или `glyph`; когда переданы оба, побеждает имя. Нет ни
|
|
66
|
+
* того ни другого — значок кит не рисует, и кнопка показывает вложенное содержимое: свой
|
|
67
|
+
* рисунок приложения встаёт в кнопку с её размером, формой и состояниями.
|
|
68
|
+
*/
|
|
69
|
+
this.icon = input(null, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
71
|
+
/** Имя Material вместо имени кита — рисуется так же, как вход `glyph` у `rt-icon`. */
|
|
72
|
+
this.glyph = input(null, /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "glyph" }] : /* istanbul ignore next */ []));
|
|
74
|
+
/** Доступное имя для screen-reader'ов — обязательно (icon-only кнопка). */
|
|
75
|
+
this.ariaLabel = input.required(/* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/** Семантическая палитра. */
|
|
78
|
+
this.variant = input('ghost', /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
80
|
+
/**
|
|
81
|
+
* Цвет самой иконки. Default `current` — иконка наследует цвет текста кнопки
|
|
82
|
+
* (поведение по умолчанию). Явное значение нужно, когда иконка должна
|
|
83
|
+
* отличаться от текста кнопки — например крестик-очистка внутри поля,
|
|
84
|
+
* который должен совпадать по цвету с иконками-аффордансами самого поля.
|
|
85
|
+
*/
|
|
86
|
+
this.iconColor = input('current', /* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [{ debugName: "iconColor" }] : /* istanbul ignore next */ []));
|
|
88
|
+
/**
|
|
89
|
+
* Залитый рисунок значка вместо контурного — как `fill` у `rt-icon`. Рисует его материальный
|
|
90
|
+
* набор; значок своего набора один и от признака не меняется.
|
|
91
|
+
*/
|
|
92
|
+
this.iconFill = input(false, { ...(ngDevMode ? { debugName: "iconFill" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
93
|
+
/** Размер квадрата. */
|
|
94
|
+
this.size = input('md', /* @ts-ignore */
|
|
95
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
96
|
+
/** Размер иконки; пусто — берётся от размера кнопки. */
|
|
97
|
+
this.iconSize = input(null, /* @ts-ignore */
|
|
98
|
+
...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
|
|
99
|
+
/** HTML-type для нативного `<button>`. */
|
|
100
|
+
this.type = input('button', /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
|
|
102
|
+
/**
|
|
103
|
+
* Текст styled-tooltip'а (`rtTooltip`), показывается на hover/focus. Пустая
|
|
104
|
+
* строка → tooltip выключен. Для icon-only кнопок обычно дублирует `ariaLabel`.
|
|
105
|
+
*/
|
|
106
|
+
this.tooltip = input('', /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []));
|
|
108
|
+
/**
|
|
109
|
+
* Tabindex внутренней `<button>`. Default `0` (в обычном таб-порядке).
|
|
110
|
+
* Значение `-1` исключает кнопку из таб-навигации, оставляя клик мышью —
|
|
111
|
+
* нужно для вспомогательных аффордансов вроде крестика-очистки внутри поля.
|
|
112
|
+
*/
|
|
113
|
+
this.tabIndex = input(0, { ...(ngDevMode ? { debugName: "tabIndex" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
114
|
+
/** Состояние загрузки: показывает spinner вместо иконки + disabled. */
|
|
115
|
+
this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
116
|
+
/** Нативное отключение кнопки. */
|
|
117
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
118
|
+
/** Toggle-состояние — превращается в `aria-pressed="true"`. */
|
|
119
|
+
this.active = input(false, { ...(ngDevMode ? { debugName: "active" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
120
|
+
/** Бейдж-индикатор (dot top-right через BEM-модификатор). */
|
|
121
|
+
this.indicator = input(false, { ...(ngDevMode ? { debugName: "indicator" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
122
|
+
/** Эмиттит MouseEvent при клике (только когда не disabled и не loading). */
|
|
123
|
+
this.clicked = output();
|
|
124
|
+
}
|
|
125
|
+
onClick(event) {
|
|
126
|
+
if (this.isDisabled()) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
this.clicked.emit(event);
|
|
130
|
+
}
|
|
131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtIconButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtIconButtonComponent, isStandalone: true, selector: "rt-icon-button", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, glyph: { classPropertyName: "glyph", publicName: "glyph", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, iconColor: { classPropertyName: "iconColor", publicName: "iconColor", isSignal: true, isRequired: false, transformFunction: null }, iconFill: { classPropertyName: "iconFill", publicName: "iconFill", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, iconSize: { classPropertyName: "iconSize", publicName: "iconSize", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, indicator: { classPropertyName: "indicator", publicName: "indicator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { classAttribute: "rt-icon-button" }, hostDirectives: [{ directive: i1.RtRadiusDirective, inputs: ["radius", "radius"] }], ngImport: i0, template: "<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"tooltip()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [glyph]=\"glyph()\" [size]=\"resolvedIconSize()\" [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button:focus-visible{box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"], dependencies: [{ kind: "component", type:
|
|
133
|
+
// standalone components / directives
|
|
134
|
+
RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "directive", type: RtRippleDirective, selector: "[rtRipple]", inputs: ["rippleDisabled"] }, { kind: "directive", type: RtTooltipDirective, selector: "[rtTooltip]", inputs: ["rtTooltip", "rtTooltipPlacement", "rtTooltipWhenTruncated"], exportAs: ["rtTooltip"] }, { kind: "directive", type: BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtIconButtonComponent, decorators: [{
|
|
137
|
+
type: Component,
|
|
138
|
+
args: [{ selector: 'rt-icon-button', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
|
|
139
|
+
// standalone components / directives
|
|
140
|
+
RtIconComponent,
|
|
141
|
+
RtRippleDirective,
|
|
142
|
+
RtTooltipDirective,
|
|
143
|
+
BlockDirective,
|
|
144
|
+
ElemDirective,
|
|
145
|
+
ModDirective,
|
|
146
|
+
], hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }], host: {
|
|
147
|
+
class: BEM_BLOCK,
|
|
148
|
+
}, template: "<button\n rtBlock=\"rt-icon-button\"\n qa-dataid=\"icon-button-control\"\n rtRipple\n [rippleDisabled]=\"isDisabled() || loading()\"\n [rtTooltip]=\"tooltip()\"\n [rtMod]=\"bemMods()\"\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"active() ? 'true' : null\"\n [attr.tabindex]=\"tabIndex()\"\n (click)=\"onClick($event)\">\n @if (loading()) {\n <rt-icon rtElem=\"spinner\" name=\"spinner\" color=\"current\" [size]=\"resolvedIconSize()\" />\n } @else if (icon() || glyph()) {\n <rt-icon rtElem=\"icon\" [color]=\"iconColor()\" [name]=\"icon()\" [glyph]=\"glyph()\" [size]=\"resolvedIconSize()\" [fill]=\"iconFill()\" />\n } @else {\n <span rtElem=\"content\" qa-dataid=\"icon-button-content\"><ng-content /></span>\n }\n @if (indicator()) {\n <span rtElem=\"indicator\" aria-hidden=\"true\"></span>\n }\n</button>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-icon-button{display:inline-flex;--rt-icon-button-color: var(--rt-color-text-primary)}rt-icon-button .rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md);--rt-icon-button-indicator-radius: var(--rt-radius-full);--rt-icon-button-focus-shadow: var(--rt-shadow-focus-ring);--rt-icon-button-shadow: var(--rt-shadow-none);--rt-icon-button-shadow-hover: var(--rt-icon-button-shadow);--rt-icon-button-color-hover: var(--rt-icon-button-color);--rt-icon-button-transition-duration: var(--rt-duration-fast);--rt-icon-button-bg-variant: transparent;--rt-icon-button-size-step: var(--rt-control-height-md);position:relative;display:inline-flex;width:var(--rt-icon-button-size, var(--rt-icon-button-size-step));height:var(--rt-icon-button-size, var(--rt-icon-button-size-step));align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--rt-icon-button-radius);background-color:var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant));box-shadow:var(--rt-icon-button-shadow);color:var(--rt-icon-button-color);cursor:pointer;transition:background-color var(--rt-icon-button-transition-duration) ease,box-shadow var(--rt-icon-button-transition-duration) ease}rt-icon-button .rt-icon-button--2xs{--rt-icon-button-size-step: var(--rt-size-5)}rt-icon-button .rt-icon-button--xs{--rt-icon-button-size-step: 22px}rt-icon-button .rt-icon-button--sm{--rt-icon-button-size-step: var(--rt-control-height-sm)}rt-icon-button .rt-icon-button--md{--rt-icon-button-size-step: var(--rt-control-height-md)}rt-icon-button .rt-icon-button--lg{--rt-icon-button-size-step: var(--rt-control-height-lg)}rt-icon-button .rt-icon-button--xl{--rt-icon-button-size-step: var(--rt-control-height-xl)}rt-icon-button .rt-icon-button--2xl{--rt-icon-button-size-step: var(--rt-control-height-2xl)}rt-icon-button .rt-icon-button:hover:not(:disabled){box-shadow:var(--rt-icon-button-shadow-hover)}rt-icon-button .rt-icon-button--ghost:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover));color:var(--rt-icon-button-color-hover)}rt-icon-button .rt-icon-button--ghost.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--primary{--rt-icon-button-bg-variant: var(--rt-color-action-primary);color:var(--rt-color-action-on-primary)}rt-icon-button .rt-icon-button--primary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-color-action-primary-hover))}rt-icon-button .rt-icon-button--secondary{--rt-icon-button-bg-variant: var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-primary)}rt-icon-button .rt-icon-button--secondary:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger{color:var(--rt-color-state-danger)}rt-icon-button .rt-icon-button--danger:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--danger.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--success{color:var(--rt-color-state-success)}rt-icon-button .rt-icon-button--success:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--success.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button--warning{color:var(--rt-color-state-warning)}rt-icon-button .rt-icon-button--warning:hover:not(:disabled){background-color:var(--rt-icon-button-bg-hover, var(--rt-icon-button-color-bg-hover))}rt-icon-button .rt-icon-button--warning.rt-icon-button--active{background-color:var(--rt-icon-button-color-bg-hover)}rt-icon-button .rt-icon-button:disabled{background-color:color-mix(in srgb,var(--rt-icon-button-bg, var(--rt-icon-button-bg-variant)) var(--rt-icon-button-disabled-fill),transparent);cursor:not-allowed;opacity:var(--rt-icon-button-disabled-opacity)}rt-icon-button .rt-icon-button:disabled .rt-icon svg{color:var(--rt-icon-button-disabled-color)}rt-icon-button .rt-icon-button:focus-visible{box-shadow:var(--rt-icon-button-focus-shadow);outline:2px solid transparent;outline-offset:2px}rt-icon-button .rt-icon-button__content{display:inline-flex;align-items:center;justify-content:center;color:inherit;line-height:1}rt-icon-button .rt-icon-button__spinner{--rt-icon-button-spin-duration: 1s;animation:rt-icon-button-spin var(--rt-icon-button-spin-duration) linear infinite}rt-icon-button .rt-icon-button__indicator{position:absolute;width:8px;height:8px;border-radius:var(--rt-icon-button-indicator-radius);background:var(--rt-color-state-danger);inset-block-start:-2px;inset-inline-end:-2px;pointer-events:none}rt-icon-button[data-rt-radius=none]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-none)}rt-icon-button[data-rt-radius=xs]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xs)}rt-icon-button[data-rt-radius=sm]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-sm)}rt-icon-button[data-rt-radius=ms]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-ms)}rt-icon-button[data-rt-radius=md]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-md)}rt-icon-button[data-rt-radius=lg]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-lg)}rt-icon-button[data-rt-radius=xl]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-xl)}rt-icon-button[data-rt-radius=\"2xl\"]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-2xl)}rt-icon-button[data-rt-radius=full]>.rt-icon-button{--rt-icon-button-radius: var(--rt-radius-full)}@keyframes rt-icon-button-spin{to{transform:rotate(360deg)}}}\n"] }]
|
|
149
|
+
}], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], glyph: [{ type: i0.Input, args: [{ isSignal: true, alias: "glyph", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], iconColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconColor", required: false }] }], iconFill: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconFill", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], iconSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconSize", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], indicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicator", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Модель `<rt-icon-button>`: один корневой неймспейс с префиксом `I`.
|
|
153
|
+
* Внутри — литеральные union-типы для variant / size / type, чтобы:
|
|
154
|
+
* - использовать как контракт `input()` сигналов компонента;
|
|
155
|
+
* - переиспользовать в `argTypes` Storybook.
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Generated bundle index. Do not edit.
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
export { RtIconButtonComponent };
|
|
163
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-icon-button.mjs.map
|