@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,2590 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, makeEnvironmentProviders, signal, computed, Pipe, Injectable, input, Directive, Injector, DestroyRef, effect, LOCALE_ID, ElementRef, booleanAttribute, output } from '@angular/core';
|
|
3
|
+
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
|
|
4
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { map, Subject, filter, debounce, timer } from 'rxjs';
|
|
6
|
+
import { DOCUMENT, formatDate } from '@angular/common';
|
|
7
|
+
import { StorageService, PlatformService, WINDOW } from '@rt-tools/core';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Настройки кита, которые приложение дало на старте.
|
|
11
|
+
*
|
|
12
|
+
* Токен объявлен **значением**, а не сигналом, и этим отличается от подписей и
|
|
13
|
+
* от темы: настройки — снимок старта. Их читают один раз, когда узел создан, и
|
|
14
|
+
* поздняя подмена на уже нарисованное не действует. Тому, что меняется на живой
|
|
15
|
+
* странице, место во входе узла или в службе темы.
|
|
16
|
+
*
|
|
17
|
+
* Умолчание — пустой объект: кит без единой настройки рисует то же, что рисовал
|
|
18
|
+
* до их появления.
|
|
19
|
+
*/
|
|
20
|
+
const RT_KIT_CONFIG = new InjectionToken('RT_KIT_CONFIG', {
|
|
21
|
+
providedIn: 'root',
|
|
22
|
+
factory: () => ({}),
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Разрешение умолчания — одно место на весь кит, а не повтор в каждом узле.
|
|
26
|
+
*
|
|
27
|
+
* Порядок от частного к общему: вход на месте вызова, умолчание узла, общее
|
|
28
|
+
* умолчание, умолчание кита. Первый найденный ответ выигрывает, поиск на нём
|
|
29
|
+
* останавливается. Вход на месте сюда не приходит вовсе — он перебивает всё
|
|
30
|
+
* тем, что значение отсюда становится лишь тем, **с чего вход стартует**.
|
|
31
|
+
*
|
|
32
|
+
* Зовётся в поле класса: там есть контекст внедрения.
|
|
33
|
+
*
|
|
34
|
+
* ```typescript
|
|
35
|
+
* readonly #size: IButton.Size = rtKitDefault('button', (it: IRtKitConfig.Button): IButton.Size | undefined => it.size, 'md');
|
|
36
|
+
* public readonly size: InputSignal<IButton.Size> = input<IButton.Size>(this.#size);
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @param node Имя узла — ключ раздела умолчаний по узлам.
|
|
40
|
+
* @param pick Что взять из умолчаний этого узла.
|
|
41
|
+
* @param fallback Умолчание кита: то, что рисуется, когда не сказано ничего.
|
|
42
|
+
* @param pickCommon Что взять из общих умолчаний, если поле живёт и там. Поля,
|
|
43
|
+
* стоящего на обоих уровнях, сегодня нет ни одного — ступень объявлена под
|
|
44
|
+
* поле, которое назовёт владелец, и до тех пор не зовётся.
|
|
45
|
+
*/
|
|
46
|
+
function rtKitDefault(node, pick, fallback, pickCommon) {
|
|
47
|
+
const config = inject(RT_KIT_CONFIG);
|
|
48
|
+
const nodeSettings = config.components?.[node];
|
|
49
|
+
const fromNode = nodeSettings === undefined ? undefined : pick(nodeSettings);
|
|
50
|
+
if (fromNode !== undefined) {
|
|
51
|
+
return fromNode;
|
|
52
|
+
}
|
|
53
|
+
const global = config.global;
|
|
54
|
+
const fromCommon = pickCommon === undefined || global === undefined ? undefined : pickCommon(global);
|
|
55
|
+
return fromCommon ?? fallback;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Отдаёт киту настройки приложения.
|
|
59
|
+
*
|
|
60
|
+
* Раздача необязательна: без неё работают умолчания кита. Частично заданный
|
|
61
|
+
* объект не обнуляет остальное — неназванное поле проваливается на уровень
|
|
62
|
+
* выше.
|
|
63
|
+
*
|
|
64
|
+
* ```typescript
|
|
65
|
+
* export const appConfig: ApplicationConfig = {
|
|
66
|
+
* providers: [
|
|
67
|
+
* provideRtKit({
|
|
68
|
+
* global: { theme: 'auto' },
|
|
69
|
+
* components: { button: { size: 'lg' }, aside: { closeOnEscape: false } },
|
|
70
|
+
* }),
|
|
71
|
+
* ],
|
|
72
|
+
* };
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @param config Настройки целиком. Всё в них необязательно.
|
|
76
|
+
*/
|
|
77
|
+
function provideRtKit(config) {
|
|
78
|
+
return makeEnvironmentProviders([{ provide: RT_KIT_CONFIG, useValue: config }]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Английские подписи кита — умолчание, а не локализация.
|
|
83
|
+
*
|
|
84
|
+
* Кит рисует часть текста сам: кнопки диалогов, тексты ошибок поля, расшифровки
|
|
85
|
+
* иконок для скринридера. Своего языка у него нет и быть не может — его знает
|
|
86
|
+
* приложение и отдаёт функцией-переводчиком (`provideRtKitLabels`). Этот набор
|
|
87
|
+
* стоит под ней умолчанием, чтобы кит без единой настройки не рисовал пустоты:
|
|
88
|
+
* среди ключей много `aria`-подписей, и пустая там означает кнопку без имени
|
|
89
|
+
* для скринридера.
|
|
90
|
+
*
|
|
91
|
+
* Набор задаёт и **перечень ключей**: `TRtKitLabelKey` выводится отсюда, поэтому
|
|
92
|
+
* опечатка в ключе не доживает до рантайма.
|
|
93
|
+
*
|
|
94
|
+
* Места вида `{{name}}` заполняются параметрами — их принимает `rtKitLabel()`.
|
|
95
|
+
*/
|
|
96
|
+
/** Число дней во множественном числе: в английском формы «few» и «many» совпадают с «other». */
|
|
97
|
+
const COUNT_DAYS = '{{count}} days';
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/typedef -- аннотация стёрла бы литеральный тип, на котором стоит TRtKitLabelKey
|
|
99
|
+
const RT_KIT_LABELS_EN = {
|
|
100
|
+
asideCopyErrorInfo: 'Copy error info',
|
|
101
|
+
asideRequestError: 'Request Error',
|
|
102
|
+
bottomSheetClose: 'Close',
|
|
103
|
+
chatAttachAria: 'Attach a file',
|
|
104
|
+
chatAttachTooltip: 'Attach a file',
|
|
105
|
+
chatAttachmentFallback: 'Attachment',
|
|
106
|
+
chatCollapse: 'Collapse chat',
|
|
107
|
+
chatComposerAria: 'Message input',
|
|
108
|
+
chatComposerHint: 'Enter to send, Shift + Enter for a new line',
|
|
109
|
+
chatDeleteAria: 'Delete message',
|
|
110
|
+
chatDeleteTooltip: 'Delete',
|
|
111
|
+
chatDropOverlay: 'Drop the files to attach them to your message',
|
|
112
|
+
chatEmptyHint: 'Chat is not available yet.',
|
|
113
|
+
chatEmptyThread: 'No messages yet.',
|
|
114
|
+
chatExpand: 'Expand chat to full screen',
|
|
115
|
+
chatMessageDeleted: 'Message deleted',
|
|
116
|
+
chatPlaceholder: 'Type a message',
|
|
117
|
+
chatRefreshAria: 'Refresh messages',
|
|
118
|
+
chatRefreshTooltip: 'Refresh messages',
|
|
119
|
+
chatRetryAria: 'Send again',
|
|
120
|
+
chatRetryTooltip: 'Retry',
|
|
121
|
+
chatSendAria: 'Send message',
|
|
122
|
+
chatSendLabel: 'Send',
|
|
123
|
+
chatStatusFailed: 'Not sent',
|
|
124
|
+
chatStatusRead: 'Read',
|
|
125
|
+
chatStatusSending: 'Sending',
|
|
126
|
+
chatStatusSent: 'Delivered',
|
|
127
|
+
chatStopAria: 'Stop the answer',
|
|
128
|
+
chatStopLabel: 'Stop',
|
|
129
|
+
chatTitle: 'Chat',
|
|
130
|
+
counterDecrease: 'Decrease',
|
|
131
|
+
counterIncrease: 'Increase',
|
|
132
|
+
dataListClearFilters: 'Clear filters',
|
|
133
|
+
dataListHorizontalScrollbar: 'Horizontal scrollbar shown',
|
|
134
|
+
dataListPlaceholder: 'No Data Found',
|
|
135
|
+
dataListRefresh: 'Refresh',
|
|
136
|
+
dataListSearchPlaceholder: 'Search...',
|
|
137
|
+
dataListSelectAll: 'Select all',
|
|
138
|
+
dataListSelected: 'Selected: {{count}}',
|
|
139
|
+
dataListSettingsHint: 'Change columns visibility and order, show(hide) scrollbar',
|
|
140
|
+
dataListSettingsTitle: 'Edit table configuration',
|
|
141
|
+
dataListTableConfig: 'Table configuration',
|
|
142
|
+
dataListVerticalScrollbar: 'Vertical scrollbar shown',
|
|
143
|
+
dynamicInputPlaceholder: 'Type and press Enter',
|
|
144
|
+
dynamicSelectorAdd: 'Add',
|
|
145
|
+
dynamicSelectorApply: 'Apply',
|
|
146
|
+
dynamicSelectorClear: 'Clear list',
|
|
147
|
+
dynamicSelectorDrag: 'Hold to drag',
|
|
148
|
+
dynamicSelectorEdit: 'Edit',
|
|
149
|
+
dynamicSelectorMulti: 'Multi selection',
|
|
150
|
+
dynamicSelectorMultiHint: 'Hold Ctrl or Cmd to tick several rows',
|
|
151
|
+
dynamicSelectorNoResults: 'No results',
|
|
152
|
+
dynamicSelectorNothingToChoose: 'There are no available items to choose',
|
|
153
|
+
dynamicSelectorRemove: 'Remove the item',
|
|
154
|
+
dynamicSelectorReset: 'Reset to initial list',
|
|
155
|
+
dynamicSelectorSearch: 'Search...',
|
|
156
|
+
dataTableActions: 'Actions',
|
|
157
|
+
dataTableCopied: 'Copied!',
|
|
158
|
+
dataTableCopy: 'Copy',
|
|
159
|
+
dataTableFilterClear: 'Clear filter',
|
|
160
|
+
dataTableFilterOperatorContains: 'Contains',
|
|
161
|
+
dataTableFilterOperatorEquals: 'Equal',
|
|
162
|
+
dataTableFilterOperatorGreaterThan: 'More than',
|
|
163
|
+
dataTableFilterOperatorLessThan: 'Less than',
|
|
164
|
+
dataTableFilterOperatorNotEquals: 'Not equal',
|
|
165
|
+
dataTableFilterSelectPlaceholder: 'Chose filter',
|
|
166
|
+
dataTableFilterValuePlaceholder: 'Type in filter value',
|
|
167
|
+
dataTableSelectPage: 'Select the rows of this page',
|
|
168
|
+
dataTableSelectRow: 'Select row',
|
|
169
|
+
fieldErrorEmail: 'Invalid email',
|
|
170
|
+
fieldErrorMax: 'Value is too large',
|
|
171
|
+
fieldErrorMaxLength: 'Value is too long',
|
|
172
|
+
fieldErrorMin: 'Value is too small',
|
|
173
|
+
fieldErrorMinLength: 'Value is too short',
|
|
174
|
+
fieldErrorPattern: 'Invalid format',
|
|
175
|
+
fieldErrorRequired: 'Required field',
|
|
176
|
+
photoViewerClose: 'Close viewer',
|
|
177
|
+
photoViewerNext: 'Next photo',
|
|
178
|
+
photoViewerPrev: 'Previous photo',
|
|
179
|
+
sideMenuBack: 'Main menu',
|
|
180
|
+
sideMenuFavoriteAdd: 'Add to favourites',
|
|
181
|
+
sideMenuFavoriteDrag: 'Hold button to drag',
|
|
182
|
+
sideMenuFavoriteRemove: 'Remove from favourites',
|
|
183
|
+
sideMenuFavorites: 'Favourites',
|
|
184
|
+
sideMenuFavoritesCollapse: 'Collapse favourites',
|
|
185
|
+
sideMenuFavoritesExpand: 'Expand favourites',
|
|
186
|
+
sideMenuNothingFound: 'Nothing found',
|
|
187
|
+
sideMenuPin: 'Pin submenu',
|
|
188
|
+
sideMenuResize: 'Resize submenu',
|
|
189
|
+
sideMenuSearch: 'Search',
|
|
190
|
+
sideMenuUnpin: 'Unpin submenu',
|
|
191
|
+
themeToggleLabel: 'Switch theme',
|
|
192
|
+
uiActions: 'Actions',
|
|
193
|
+
uiApply: 'Apply',
|
|
194
|
+
uiAuditEmptyHint: 'Deal events will appear here — stage changes and other actions.',
|
|
195
|
+
uiBack: 'Back',
|
|
196
|
+
uiBackToList: 'Back to list',
|
|
197
|
+
uiBaseline: 'was {{value}}',
|
|
198
|
+
uiCancel: 'Cancel',
|
|
199
|
+
uiChangeAgent: 'Change agent',
|
|
200
|
+
uiChooseFile: 'Choose file',
|
|
201
|
+
uiChooseMonth: 'Choose month and year',
|
|
202
|
+
uiClear: 'Clear',
|
|
203
|
+
uiClearFilters: 'Clear filters',
|
|
204
|
+
uiClose: 'Close',
|
|
205
|
+
uiCollapse: 'Collapse',
|
|
206
|
+
uiColumnLocked: 'Column is pinned',
|
|
207
|
+
uiColumnSettings: 'Column settings',
|
|
208
|
+
uiColumnSettingsTitle: 'Configure columns',
|
|
209
|
+
uiCommentOptional: 'Comment (optional)',
|
|
210
|
+
uiConfirm: 'Confirm',
|
|
211
|
+
uiConfirmAction: 'Confirm action',
|
|
212
|
+
uiContinue: 'Continue',
|
|
213
|
+
uiCopied: 'Copied',
|
|
214
|
+
uiCopy: 'Copy',
|
|
215
|
+
uiCurrentStage: 'Current stage',
|
|
216
|
+
uiDate: 'Date',
|
|
217
|
+
uiDaysFew: COUNT_DAYS,
|
|
218
|
+
uiDaysMany: COUNT_DAYS,
|
|
219
|
+
uiDaysOne: '{{count}} day',
|
|
220
|
+
uiDaysOther: COUNT_DAYS,
|
|
221
|
+
uiDetails: 'Details',
|
|
222
|
+
uiDiscardChanges: 'Discard Changes',
|
|
223
|
+
uiDone: 'Done',
|
|
224
|
+
uiDownload: 'Download',
|
|
225
|
+
uiDownloadFile: 'Download: {{name}}',
|
|
226
|
+
uiDragColumn: 'Drag column',
|
|
227
|
+
uiExpand: 'Expand',
|
|
228
|
+
uiFileDropOverlay: 'Drop the files to attach them',
|
|
229
|
+
uiFilterChoose: 'Choose',
|
|
230
|
+
uiFilterContains: 'Contains',
|
|
231
|
+
uiFilterEndsWith: 'Ends with',
|
|
232
|
+
uiFilterEquals: 'Equals',
|
|
233
|
+
uiFilterGreaterThan: 'Greater than',
|
|
234
|
+
uiFilterLessThan: 'Less than',
|
|
235
|
+
uiFilterNotEquals: 'Does not equal',
|
|
236
|
+
uiFilterStartsWith: 'Starts with',
|
|
237
|
+
uiFilterValue: 'Filter value',
|
|
238
|
+
uiFilters: 'Filters',
|
|
239
|
+
uiForward: 'Forward',
|
|
240
|
+
uiHide: 'Hide',
|
|
241
|
+
uiHideColumn: 'Hide column',
|
|
242
|
+
uiHidePassword: 'Hide password',
|
|
243
|
+
uiHint: 'Hint',
|
|
244
|
+
uiHistory: 'History',
|
|
245
|
+
uiHours: 'Hours',
|
|
246
|
+
uiImageCropperFrame: 'Crop frame',
|
|
247
|
+
uiImageCropperHandleE: 'Right edge of the crop frame',
|
|
248
|
+
uiImageCropperHandleN: 'Top edge of the crop frame',
|
|
249
|
+
uiImageCropperHandleNe: 'Top right corner of the crop frame',
|
|
250
|
+
uiImageCropperHandleNw: 'Top left corner of the crop frame',
|
|
251
|
+
uiImageCropperHandleS: 'Bottom edge of the crop frame',
|
|
252
|
+
uiImageCropperHandleSe: 'Bottom right corner of the crop frame',
|
|
253
|
+
uiImageCropperHandleSw: 'Bottom left corner of the crop frame',
|
|
254
|
+
uiImageCropperHandleW: 'Left edge of the crop frame',
|
|
255
|
+
uiImageCropperPlaceholder: 'Choose an image to crop',
|
|
256
|
+
uiImageCropperRefusal: 'The image could not be read',
|
|
257
|
+
uiImageUploadApply: 'Apply',
|
|
258
|
+
uiImageUploadCancel: 'Cancel',
|
|
259
|
+
uiImageUploadChange: 'Click to change the image',
|
|
260
|
+
uiImageUploadChoose: 'Choose file',
|
|
261
|
+
uiImageUploadDrop: 'Drag and drop an image here or',
|
|
262
|
+
uiImageUploadImage: 'Current image',
|
|
263
|
+
uiInviteUser: 'Invite user',
|
|
264
|
+
uiItemsPerPage: 'Items per page',
|
|
265
|
+
uiLast30Days: 'Last 30 days',
|
|
266
|
+
uiLast7Days: 'Last 7 days',
|
|
267
|
+
uiLastMonth: 'Last month',
|
|
268
|
+
uiLiveOnSite: 'On the site now',
|
|
269
|
+
uiLoadMore: 'Load more',
|
|
270
|
+
uiMainNav: 'Main navigation',
|
|
271
|
+
uiMinutes: 'Minutes',
|
|
272
|
+
uiMore: 'More',
|
|
273
|
+
uiMoreActions: 'More actions',
|
|
274
|
+
uiMoveStage: 'Move',
|
|
275
|
+
uiMoveStageAria: 'Move stage',
|
|
276
|
+
uiNavMenu: 'Navigation menu',
|
|
277
|
+
uiNavUnread: 'Unread',
|
|
278
|
+
uiNextMonth: 'Next month',
|
|
279
|
+
uiNextPage: 'Next page',
|
|
280
|
+
uiNextYear: 'Next year',
|
|
281
|
+
uiNightGridAria: 'Occupancy grid',
|
|
282
|
+
uiNoData: 'No data yet',
|
|
283
|
+
uiNoOptions: 'No options',
|
|
284
|
+
uiNoRows: 'No data',
|
|
285
|
+
uiNothingFound: 'Nothing found',
|
|
286
|
+
uiNotifications: 'Notifications',
|
|
287
|
+
uiNow: 'Now',
|
|
288
|
+
uiOpenCalendar: 'Open the calendar',
|
|
289
|
+
uiPageOf: 'Page {{page}} of {{last}}',
|
|
290
|
+
uiPagination: 'Pagination',
|
|
291
|
+
uiPerPage: 'Items per page:',
|
|
292
|
+
uiPeriod: 'Period',
|
|
293
|
+
uiPickAgent: 'Select an agent',
|
|
294
|
+
uiPickAnotherAgent: 'Select a different agent',
|
|
295
|
+
uiPickEndDate: 'Pick the end date',
|
|
296
|
+
uiPickStartDate: 'Pick the start date',
|
|
297
|
+
uiPickTransition: 'Select a transition',
|
|
298
|
+
uiPrevMonth: 'Previous month',
|
|
299
|
+
uiPrevPage: 'Previous page',
|
|
300
|
+
uiPrevYear: 'Previous year',
|
|
301
|
+
uiProfile: 'Profile',
|
|
302
|
+
uiQuickRanges: 'Quick ranges',
|
|
303
|
+
uiRangeEmpty: '0 of 0',
|
|
304
|
+
uiRangeOf: '{{from}}–{{to}} of {{total}}',
|
|
305
|
+
uiRemove: 'Delete',
|
|
306
|
+
uiRename: 'Rename',
|
|
307
|
+
uiReplace: 'Replace',
|
|
308
|
+
uiReplaceAgentTitle: 'Replace agent',
|
|
309
|
+
uiReset: 'Reset',
|
|
310
|
+
uiResetDefaults: 'Reset to defaults',
|
|
311
|
+
uiResizeDetails: 'Resize details pane',
|
|
312
|
+
uiResizeList: 'Resize list pane',
|
|
313
|
+
uiRefresh: 'Refresh',
|
|
314
|
+
uiRevert: 'Revert',
|
|
315
|
+
uiSave: 'Save',
|
|
316
|
+
uiSaveNewAgent: 'Save the new agent',
|
|
317
|
+
uiScrollDown: 'Scroll down',
|
|
318
|
+
uiSearch: 'Search',
|
|
319
|
+
uiSectionInProgress: '{{label}} — section under development',
|
|
320
|
+
uiSelectAll: 'Select all',
|
|
321
|
+
uiSelectValues: 'Select values',
|
|
322
|
+
uiSelectedCount: 'Selected: {{count}}',
|
|
323
|
+
uiSelectedOf: 'Selected: {{count}} of {{total}}',
|
|
324
|
+
uiShapeDay: 'dd',
|
|
325
|
+
uiShapeHour: 'hh',
|
|
326
|
+
uiShapeMinute: 'mm',
|
|
327
|
+
uiShapeMonth: 'mm',
|
|
328
|
+
uiShapeYear: 'yyyy',
|
|
329
|
+
uiShow: 'Show',
|
|
330
|
+
uiShowColumn: 'Show column',
|
|
331
|
+
uiShowDetails: 'Show details',
|
|
332
|
+
uiShowPassword: 'Show password',
|
|
333
|
+
uiStageNoteHint: 'Internal note — the client will not see it.',
|
|
334
|
+
uiStageTransition: 'Stage transition',
|
|
335
|
+
uiSubscribeNotifications: 'Subscribe to notifications',
|
|
336
|
+
uiTabInvalid: 'This tab contains errors',
|
|
337
|
+
uiTargetStage: 'Target stage',
|
|
338
|
+
uiTargetStageRequired: 'Select a target stage.',
|
|
339
|
+
uiThisMonth: 'This month',
|
|
340
|
+
uiThreadListEmptyHint: 'New threads will appear here.',
|
|
341
|
+
uiTime: 'Time',
|
|
342
|
+
uiToList: 'To list',
|
|
343
|
+
uiToday: 'Today',
|
|
344
|
+
uiUnsavedDiscard: 'Close without saving',
|
|
345
|
+
uiUnsavedMessage: 'The panel has edits that have not been saved yet. Choose what to do with them.',
|
|
346
|
+
uiUnsavedSave: 'Save and close',
|
|
347
|
+
uiUnsavedStay: 'Stay',
|
|
348
|
+
uiUnsavedTitle: 'Unsaved changes',
|
|
349
|
+
uiWelcomeAria: 'Welcome message for a new user',
|
|
350
|
+
uiYearOverYear: 'YoY',
|
|
351
|
+
uiYesterday: 'Yesterday',
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
/** Места вида `{{name}}` — их заполняет `interpolate`. */
|
|
355
|
+
const PLACEHOLDER = /\{\{\s*(\w+)\s*\}\}/g;
|
|
356
|
+
/**
|
|
357
|
+
* Подставляет параметры в подпись.
|
|
358
|
+
*
|
|
359
|
+
* Нужна английскому умолчанию: приложение свои подстановки делает само —
|
|
360
|
+
* функция-переводчик обязана вернуть готовую строку. Место, для которого
|
|
361
|
+
* параметра не дали, остаётся как есть: пустота на его месте прочиталась бы как
|
|
362
|
+
* законченная фраза, а `{{name}}` виден и чинится.
|
|
363
|
+
*/
|
|
364
|
+
function interpolate(text, params) {
|
|
365
|
+
if (params === undefined) {
|
|
366
|
+
return text;
|
|
367
|
+
}
|
|
368
|
+
return text.replace(PLACEHOLDER, (match, name) => (Object.hasOwn(params, name) ? String(params[name]) : match));
|
|
369
|
+
}
|
|
370
|
+
/** Английское умолчание: кит без единой настройки рисует текст, а не пустоты. */
|
|
371
|
+
const defaultTranslator = (key, params) => interpolate(RT_KIT_LABELS_EN[key], params);
|
|
372
|
+
/**
|
|
373
|
+
* Функция, которой кит получает подписи. Её отдаёт приложение —
|
|
374
|
+
* `provideRtKitLabels()`.
|
|
375
|
+
*
|
|
376
|
+
* Токен объявлен **сигналом**, а не просто функцией: приложение, меняющее язык
|
|
377
|
+
* на ходу, кладёт в него новую функцию, и всё, что от неё считано,
|
|
378
|
+
* пересчитывается само.
|
|
379
|
+
*/
|
|
380
|
+
const RT_KIT_TRANSLATOR = new InjectionToken('RT_KIT_TRANSLATOR', {
|
|
381
|
+
providedIn: 'root',
|
|
382
|
+
factory: () => signal(defaultTranslator).asReadonly(),
|
|
383
|
+
});
|
|
384
|
+
/**
|
|
385
|
+
* Активная локаль. Ею кит форматирует даты — больше ни для чего она ему не
|
|
386
|
+
* нужна.
|
|
387
|
+
*
|
|
388
|
+
* Данные локали для `DatePipe` регистрирует приложение: без них пайп падает
|
|
389
|
+
* `Missing locale data`, и кит за это не отвечает.
|
|
390
|
+
*/
|
|
391
|
+
const RT_KIT_LOCALE = new InjectionToken('RT_KIT_LOCALE', {
|
|
392
|
+
providedIn: 'root',
|
|
393
|
+
factory: () => signal('en').asReadonly(),
|
|
394
|
+
});
|
|
395
|
+
/**
|
|
396
|
+
* Все подписи кита разом, ключ → готовая строка.
|
|
397
|
+
*
|
|
398
|
+
* Этим пользуются компоненты: `t().uiClose` вместо ключа по одному. Карта
|
|
399
|
+
* строится один раз на приложение (`providedIn: 'root'`) и пересчитывается,
|
|
400
|
+
* только когда приложение сменило функцию-переводчик.
|
|
401
|
+
*
|
|
402
|
+
* Подпись, которой переводчик не дал (вернул пустое или упал), берётся
|
|
403
|
+
* английской: пустая `aria`-подпись означает кнопку без имени для скринридера.
|
|
404
|
+
*/
|
|
405
|
+
const RT_KIT_LABELS = new InjectionToken('RT_KIT_LABELS', {
|
|
406
|
+
providedIn: 'root',
|
|
407
|
+
factory: () => {
|
|
408
|
+
const translator = inject(RT_KIT_TRANSLATOR);
|
|
409
|
+
return computed(() => {
|
|
410
|
+
const translate = translator();
|
|
411
|
+
const map = {};
|
|
412
|
+
for (const key of Object.keys(RT_KIT_LABELS_EN)) {
|
|
413
|
+
map[key] = translate(key) || RT_KIT_LABELS_EN[key];
|
|
414
|
+
}
|
|
415
|
+
return map;
|
|
416
|
+
});
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
/**
|
|
420
|
+
* Одна подпись, а не вся карта.
|
|
421
|
+
*
|
|
422
|
+
* Карте не годятся две вещи: подпись с подстановками (параметры приходят из
|
|
423
|
+
* состояния компонента) и подпись, ключ которой выбирается на ходу — кнопка
|
|
424
|
+
* «свернуть ↔ развернуть», текст ошибки поля по сработавшему валидатору. Обе
|
|
425
|
+
* берутся отсюда. Зовётся в поле класса, в инъекционном контексте.
|
|
426
|
+
*
|
|
427
|
+
* ```typescript
|
|
428
|
+
* readonly #range: Signal<string> = rtKitLabel('uiRangeOf', this.#rangeParams);
|
|
429
|
+
* readonly #expand: Signal<string> = rtKitLabel(computed(() => (this.expanded() ? 'chatCollapse' : 'chatExpand')));
|
|
430
|
+
* ```
|
|
431
|
+
*
|
|
432
|
+
* @param key Ключ подписи — значением или сигналом, если он меняется. Пустой
|
|
433
|
+
* ключ даёт пустую строку: у поля без сработавшего валидатора подписи нет, и
|
|
434
|
+
* умолчание тут показало бы ошибку там, где её не случилось.
|
|
435
|
+
* @param params Подстановки — значением или сигналом, если они меняются.
|
|
436
|
+
*/
|
|
437
|
+
function rtKitLabel(key, params) {
|
|
438
|
+
const translator = inject(RT_KIT_TRANSLATOR);
|
|
439
|
+
return computed(() => {
|
|
440
|
+
const resolvedKey = typeof key === 'function' ? key() : key;
|
|
441
|
+
if (resolvedKey === '') {
|
|
442
|
+
return '';
|
|
443
|
+
}
|
|
444
|
+
const resolved = typeof params === 'function' ? params() : params;
|
|
445
|
+
return translator()(resolvedKey, resolved) || defaultTranslator(resolvedKey, resolved);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Отдаёт киту подписи приложения.
|
|
450
|
+
*
|
|
451
|
+
* Без него кит работает на английском умолчании — оно вшито и покрывает все
|
|
452
|
+
* ключи, поэтому пустой кнопки на экране не бывает никогда.
|
|
453
|
+
*
|
|
454
|
+
* ```typescript
|
|
455
|
+
* export const appConfig: ApplicationConfig = {
|
|
456
|
+
* providers: [
|
|
457
|
+
* provideRtKitLabels({
|
|
458
|
+
* translator: computed(() => (key, params) => transloco.translate(`rtKit.${key}`, params)),
|
|
459
|
+
* locale: toSignal(transloco.langChanges$, { initialValue: transloco.getActiveLang() }),
|
|
460
|
+
* }),
|
|
461
|
+
* ],
|
|
462
|
+
* };
|
|
463
|
+
* ```
|
|
464
|
+
*
|
|
465
|
+
* Способ доставки — дело приложения: Transloco, `$localize`, собственный
|
|
466
|
+
* словарь. Кит знает только ключи и то, что на них отвечают строкой.
|
|
467
|
+
*
|
|
468
|
+
* @param source Функция-переводчик и активная локаль. Локаль необязательна —
|
|
469
|
+
* без неё кит форматирует даты по-английски.
|
|
470
|
+
*/
|
|
471
|
+
function provideRtKitLabels(source) {
|
|
472
|
+
const providers = [{ provide: RT_KIT_TRANSLATOR, useValue: source.translator }];
|
|
473
|
+
if (source.locale !== undefined) {
|
|
474
|
+
providers.push({ provide: RT_KIT_LOCALE, useValue: source.locale });
|
|
475
|
+
}
|
|
476
|
+
return makeEnvironmentProviders(providers);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Подпись кита по ключу — для значений, приходящих из контекста шаблона.
|
|
481
|
+
*
|
|
482
|
+
* Шаблон не зовёт методов: имя раздела приходит элементом цикла, и посчитать подпись заранее
|
|
483
|
+
* нечем. Пайп чистый, поэтому функция-переводчик передаётся ему вторым доводом — сменившись,
|
|
484
|
+
* она пересчитывает подпись сама.
|
|
485
|
+
*/
|
|
486
|
+
class RtKitLabelPipe {
|
|
487
|
+
transform(key, translator, params) {
|
|
488
|
+
return translator(key, params);
|
|
489
|
+
}
|
|
490
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtKitLabelPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
491
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.1.6", ngImport: i0, type: RtKitLabelPipe, isStandalone: true, name: "rtKitLabel" }); }
|
|
492
|
+
}
|
|
493
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtKitLabelPipe, decorators: [{
|
|
494
|
+
type: Pipe,
|
|
495
|
+
args: [{
|
|
496
|
+
name: 'rtKitLabel',
|
|
497
|
+
pure: true,
|
|
498
|
+
}]
|
|
499
|
+
}] });
|
|
500
|
+
|
|
501
|
+
/** Порог узкого вьюпорта — тот же, что у `$breakpoint-lg` в стилях кита. */
|
|
502
|
+
const NARROW_VIEWPORT_QUERY = '(max-width: 1080px)';
|
|
503
|
+
/**
|
|
504
|
+
* Обёртка над CDK `BreakpointObserver` — публикует reactive signals для
|
|
505
|
+
* mobile/tablet/desktop матчей. `toSignal()` обёртывает CDK Observable в Signal
|
|
506
|
+
* с `initialValue` для CSR-safe рендера.
|
|
507
|
+
*/
|
|
508
|
+
class BreakpointsService {
|
|
509
|
+
constructor() {
|
|
510
|
+
this.#observer = inject(BreakpointObserver);
|
|
511
|
+
this.mobile = toSignal(this.#match([Breakpoints.HandsetPortrait, Breakpoints.HandsetLandscape]), {
|
|
512
|
+
initialValue: false,
|
|
513
|
+
});
|
|
514
|
+
this.tablet = toSignal(this.#match([Breakpoints.TabletPortrait, Breakpoints.TabletLandscape]), {
|
|
515
|
+
initialValue: false,
|
|
516
|
+
});
|
|
517
|
+
this.desktop = toSignal(this.#match([Breakpoints.WebPortrait, Breakpoints.WebLandscape]), {
|
|
518
|
+
initialValue: true,
|
|
519
|
+
});
|
|
520
|
+
/**
|
|
521
|
+
* Узкий вьюпорт (≤1080px, планшет + мобила) — единый порог для компонентов,
|
|
522
|
+
* которые на узком экране подменяют развёрнутый контрол на компактный
|
|
523
|
+
* (напр. `rt-filter-control`: сегменты → `rt-select`). Совпадает с
|
|
524
|
+
* брейкпоинтом 1080px из SCSS-конвенции кита. `initialValue: false` — на
|
|
525
|
+
* SSR/CSR до первого matchMedia рендерим desktop-вариант.
|
|
526
|
+
*/
|
|
527
|
+
this.narrow = toSignal(this.#match([NARROW_VIEWPORT_QUERY]), {
|
|
528
|
+
initialValue: false,
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
#observer;
|
|
532
|
+
#match(queries) {
|
|
533
|
+
return this.#observer.observe(queries).pipe(map((state) => state.matches));
|
|
534
|
+
}
|
|
535
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BreakpointsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
536
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BreakpointsService, providedIn: 'root' }); }
|
|
537
|
+
}
|
|
538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: BreakpointsService, decorators: [{
|
|
539
|
+
type: Injectable,
|
|
540
|
+
args: [{ providedIn: 'root' }]
|
|
541
|
+
}] });
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Лёгкая типизированная pub/sub-шина поверх RxJS `Subject`. Не зависит от
|
|
545
|
+
* Angular DI и UI: эмиттер (например, стор) и потребитель (например, layout-
|
|
546
|
+
* контейнер) развязаны — отправитель не знает, кто и как отрисует событие.
|
|
547
|
+
*
|
|
548
|
+
* - `emit` — опубликовать событие;
|
|
549
|
+
* - `onEmit` — поток всех событий;
|
|
550
|
+
* - `ofType` — поток событий конкретного типа (для точечной подписки).
|
|
551
|
+
*/
|
|
552
|
+
class MessageBus {
|
|
553
|
+
#eventSource = new Subject();
|
|
554
|
+
emit(event) {
|
|
555
|
+
this.#eventSource.next(event);
|
|
556
|
+
}
|
|
557
|
+
onEmit() {
|
|
558
|
+
return this.#eventSource.asObservable();
|
|
559
|
+
}
|
|
560
|
+
ofType(type) {
|
|
561
|
+
return this.#eventSource.asObservable().pipe(filter((event) => event.type === type));
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Шина уведомлений приложения. Эмиттеры (сторы) публикуют сюда событие с
|
|
567
|
+
* готовым текстом и severity и больше ничего не знают об отрисовке. Подписчик
|
|
568
|
+
* (`rt-toaster`) слушает `onEmit()` и показывает toast'ы.
|
|
569
|
+
*
|
|
570
|
+
* Convenience-методы `success/info/warning/error` собирают событие: первым
|
|
571
|
+
* аргументом — текст для пользователя, вторым (необязательно) — доменный
|
|
572
|
+
* action-тип для точечной фильтрации через `ofType`. Если тип не передан,
|
|
573
|
+
* подставляется значение severity.
|
|
574
|
+
*/
|
|
575
|
+
class NotificationBus {
|
|
576
|
+
#bus = new MessageBus();
|
|
577
|
+
emit(event) {
|
|
578
|
+
this.#bus.emit(event);
|
|
579
|
+
}
|
|
580
|
+
onEmit() {
|
|
581
|
+
return this.#bus.onEmit();
|
|
582
|
+
}
|
|
583
|
+
ofType(type) {
|
|
584
|
+
return this.#bus.ofType(type);
|
|
585
|
+
}
|
|
586
|
+
success(message, type = 'success', options = {}) {
|
|
587
|
+
this.emit({ type, payload: { message, severity: 'success', ...options } });
|
|
588
|
+
}
|
|
589
|
+
info(message, type = 'info', options = {}) {
|
|
590
|
+
this.emit({ type, payload: { message, severity: 'info', ...options } });
|
|
591
|
+
}
|
|
592
|
+
warning(message, type = 'warning', options = {}) {
|
|
593
|
+
this.emit({ type, payload: { message, severity: 'warning', ...options } });
|
|
594
|
+
}
|
|
595
|
+
error(message, type = 'danger', options = {}) {
|
|
596
|
+
this.emit({ type, payload: { message, severity: 'danger', ...options } });
|
|
597
|
+
}
|
|
598
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NotificationBus, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
599
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NotificationBus, providedIn: 'root' }); }
|
|
600
|
+
}
|
|
601
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: NotificationBus, decorators: [{
|
|
602
|
+
type: Injectable,
|
|
603
|
+
args: [{ providedIn: 'root' }]
|
|
604
|
+
}] });
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Местный кусок темы: узел рисует своё поддерево в своей теме, а страница
|
|
608
|
+
* вокруг остаётся как была.
|
|
609
|
+
*
|
|
610
|
+
* Работает в обе стороны — тёмная карточка внутри светлой страницы и светлая
|
|
611
|
+
* внутри тёмной, — и переключает весь набор свойств, а не часть: фон, текст,
|
|
612
|
+
* рамки, тени. Ближний признак выигрывает у дальнего, повторённый внутри
|
|
613
|
+
* такого же ничего не меняет, а снятый возвращает поддерево к теме страницы.
|
|
614
|
+
*
|
|
615
|
+
* Выбора человека и хранилища не трогает вовсе: это слово разметки об одном
|
|
616
|
+
* месте, а не переключение темы.
|
|
617
|
+
*
|
|
618
|
+
* ```html
|
|
619
|
+
* <section [rtTheme]="'dark'">…</section>
|
|
620
|
+
* ```
|
|
621
|
+
*
|
|
622
|
+
* Пустое значение темой не считается и признака не ставит.
|
|
623
|
+
*/
|
|
624
|
+
class RtThemeScopeDirective {
|
|
625
|
+
constructor() {
|
|
626
|
+
this.rtTheme = input('', /* @ts-ignore */
|
|
627
|
+
...(ngDevMode ? [{ debugName: "rtTheme" }] : /* istanbul ignore next */ []));
|
|
628
|
+
}
|
|
629
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThemeScopeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
630
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtThemeScopeDirective, isStandalone: true, selector: "[rtTheme]", inputs: { rtTheme: { classPropertyName: "rtTheme", publicName: "rtTheme", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-theme": "rtTheme() || null" } }, ngImport: i0 }); }
|
|
631
|
+
}
|
|
632
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtThemeScopeDirective, decorators: [{
|
|
633
|
+
type: Directive,
|
|
634
|
+
args: [{
|
|
635
|
+
selector: '[rtTheme]',
|
|
636
|
+
host: {
|
|
637
|
+
'[attr.data-theme]': 'rtTheme() || null',
|
|
638
|
+
},
|
|
639
|
+
}]
|
|
640
|
+
}], propDecorators: { rtTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtTheme", required: false }] }] } });
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Ключи браузерного хранилища, которые кит занимает под себя. Единый реестр
|
|
644
|
+
* вместо констант, разбросанных по компонентам: так видно весь занятый
|
|
645
|
+
* неймспейс и не возникает двух ключей на одно и то же. Значения читает и пишет
|
|
646
|
+
* только `StorageService` из `@rt-tools/core`.
|
|
647
|
+
*
|
|
648
|
+
* Неймспейс `rt.` отделяет их от ключей приложения-потребителя.
|
|
649
|
+
*/
|
|
650
|
+
var ERtStorageKeys;
|
|
651
|
+
(function (ERtStorageKeys) {
|
|
652
|
+
/** Выбранная тема оформления: переживает перезагрузку и смену пользователя */
|
|
653
|
+
ERtStorageKeys["Theme"] = "rt.theme";
|
|
654
|
+
/** Префикс, а не полный ключ: итоговый вид — `rt.table.columns.<tableId>`. */
|
|
655
|
+
ERtStorageKeys["TableColumnsPrefix"] = "rt.table.columns.";
|
|
656
|
+
/** Настройки боковых меню: один объект, в нём каждое меню под своим номером. */
|
|
657
|
+
ERtStorageKeys["SideMenu"] = "rt.side-menu";
|
|
658
|
+
})(ERtStorageKeys || (ERtStorageKeys = {}));
|
|
659
|
+
|
|
660
|
+
const DEFAULT_CHOICE = 'light';
|
|
661
|
+
/** Запрос, которым браузер отвечает о предпочтении тёмного вида. */
|
|
662
|
+
const DARK_QUERY = '(prefers-color-scheme: dark)';
|
|
663
|
+
/**
|
|
664
|
+
* Глобальный сервис темы. Применяет `data-theme` к `<html>` через DOM-эффект,
|
|
665
|
+
* персистит выбор под единственным device-level ключом. Тема не привязана к
|
|
666
|
+
* пользователю: на одном устройстве последняя выставленная тема переживает
|
|
667
|
+
* вход, выход и перезагрузку.
|
|
668
|
+
*
|
|
669
|
+
* Хранится **выбор**, а не вид, в который он разрешился: «за машиной»,
|
|
670
|
+
* записанное тёмным видом, перестало бы идти за машиной с первой же
|
|
671
|
+
* перезагрузки, и на экране ничто бы об этом не сказало.
|
|
672
|
+
*/
|
|
673
|
+
class ThemeService {
|
|
674
|
+
#storage;
|
|
675
|
+
#document;
|
|
676
|
+
#platform;
|
|
677
|
+
/**
|
|
678
|
+
* Окно берётся не полем, а в `#watchMachine`, под проверкой среды: фабрика `WINDOW` бросает
|
|
679
|
+
* там, где у документа нет окна, — служба корневая, и упав при создании, она роняла бы
|
|
680
|
+
* серверную прорисовку каждой страницы с компонентом кита.
|
|
681
|
+
*/
|
|
682
|
+
#injector;
|
|
683
|
+
#config;
|
|
684
|
+
#destroyRef;
|
|
685
|
+
#choice;
|
|
686
|
+
/** Что ответила машина про тёмный вид. Меняется на живой странице — потому сигнал. */
|
|
687
|
+
#machinePrefersDark;
|
|
688
|
+
constructor() {
|
|
689
|
+
this.#storage = inject(StorageService);
|
|
690
|
+
this.#document = inject(DOCUMENT);
|
|
691
|
+
this.#platform = inject(PlatformService);
|
|
692
|
+
/**
|
|
693
|
+
* Окно берётся не полем, а в `#watchMachine`, под проверкой среды: фабрика `WINDOW` бросает
|
|
694
|
+
* там, где у документа нет окна, — служба корневая, и упав при создании, она роняла бы
|
|
695
|
+
* серверную прорисовку каждой страницы с компонентом кита.
|
|
696
|
+
*/
|
|
697
|
+
this.#injector = inject(Injector);
|
|
698
|
+
this.#config = inject(RT_KIT_CONFIG);
|
|
699
|
+
this.#destroyRef = inject(DestroyRef);
|
|
700
|
+
this.#choice = signal(this.#readOrDefault(), /* @ts-ignore */
|
|
701
|
+
...(ngDevMode ? [{ debugName: "#choice" }] : /* istanbul ignore next */ []));
|
|
702
|
+
/** Что ответила машина про тёмный вид. Меняется на живой странице — потому сигнал. */
|
|
703
|
+
this.#machinePrefersDark = signal(false, /* @ts-ignore */
|
|
704
|
+
...(ngDevMode ? [{ debugName: "#machinePrefersDark" }] : /* istanbul ignore next */ []));
|
|
705
|
+
/** Что выбрано: два вида и «за машиной». Хранится именно это. */
|
|
706
|
+
this.choice = this.#choice.asReadonly();
|
|
707
|
+
/** Вид, в котором страница нарисована. «За машиной» разрешается здесь. */
|
|
708
|
+
this.current = computed(() => {
|
|
709
|
+
const choice = this.#choice();
|
|
710
|
+
if (choice !== 'auto') {
|
|
711
|
+
return choice;
|
|
712
|
+
}
|
|
713
|
+
return this.#machinePrefersDark() ? 'dark' : 'light';
|
|
714
|
+
}, /* @ts-ignore */
|
|
715
|
+
...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
|
|
716
|
+
this.isDark = computed(() => this.current() === 'dark', /* @ts-ignore */
|
|
717
|
+
...(ngDevMode ? [{ debugName: "isDark" }] : /* istanbul ignore next */ []));
|
|
718
|
+
this.#watchMachine();
|
|
719
|
+
effect(() => {
|
|
720
|
+
const mode = this.current();
|
|
721
|
+
const choice = this.#choice();
|
|
722
|
+
// Prerender/SSR-окружение не даёт documentElement.dataset — тему
|
|
723
|
+
// применяем только в браузере, серверный HTML остаётся в light.
|
|
724
|
+
if (!this.#platform.isPlatformBrowser) {
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
this.#document.documentElement.dataset['theme'] = mode;
|
|
728
|
+
this.#storage.setItem(ERtStorageKeys.Theme, choice);
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* Переключает светлое и тёмное.
|
|
733
|
+
*
|
|
734
|
+
* Из «за машиной» уходит в противоположность тому, что сейчас на экране:
|
|
735
|
+
* человек жмёт переключатель, глядя на нарисованное, и ждёт обратного ему.
|
|
736
|
+
*/
|
|
737
|
+
toggle() {
|
|
738
|
+
this.#choice.set(this.current() === 'light' ? 'dark' : 'light');
|
|
739
|
+
}
|
|
740
|
+
setTheme(theme) {
|
|
741
|
+
this.#choice.set(theme);
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* Подписка на ответ браузера о тёмном виде — одна, на весь век службы.
|
|
745
|
+
*
|
|
746
|
+
* Без неё «за машиной» превратилось бы в четвёртый способ записать вид той
|
|
747
|
+
* минуты, когда страницу открыли: настройка машины меняется на живой
|
|
748
|
+
* странице, и выбор обязан идти за ней без перезагрузки.
|
|
749
|
+
*/
|
|
750
|
+
#watchMachine() {
|
|
751
|
+
if (!this.#platform.isPlatformBrowser || !this.#document.defaultView) {
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
const view = this.#injector.get(WINDOW);
|
|
755
|
+
/*
|
|
756
|
+
* Спросить машину умеет не всякое окно, назвавшееся браузерным: среда тестов потребителя
|
|
757
|
+
* даёт именно такое. Служба корневая — упав здесь, она роняет каждый тест, поднявший хоть
|
|
758
|
+
* один компонент кита, и чинить это потребителю нечем. Проверка среды тут не поможет: она
|
|
759
|
+
* отвечает про место прорисовки, а вопрос — про умение самого окна.
|
|
760
|
+
*/
|
|
761
|
+
if (typeof view.matchMedia !== 'function') {
|
|
762
|
+
return;
|
|
763
|
+
}
|
|
764
|
+
const query = view.matchMedia(DARK_QUERY);
|
|
765
|
+
this.#machinePrefersDark.set(query.matches);
|
|
766
|
+
const listener = (event) => {
|
|
767
|
+
this.#machinePrefersDark.set(event.matches);
|
|
768
|
+
};
|
|
769
|
+
query.addEventListener('change', listener);
|
|
770
|
+
this.#destroyRef.onDestroy(() => query.removeEventListener('change', listener));
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* Что выбрано на старте: сохранённое, а если его нет или оно киту незнакомо —
|
|
774
|
+
* общее умолчание настроек, за ним умолчание кита.
|
|
775
|
+
*
|
|
776
|
+
* Слово, оставленное прошлым выпуском кита или рукой в консоли, выбором не
|
|
777
|
+
* считается: отвечают настройки.
|
|
778
|
+
*/
|
|
779
|
+
#readOrDefault() {
|
|
780
|
+
const fallback = this.#config.global?.theme ?? DEFAULT_CHOICE;
|
|
781
|
+
const stored = this.#storage.getItem(ERtStorageKeys.Theme) ?? null;
|
|
782
|
+
return stored === 'light' || stored === 'dark' || stored === 'auto' ? stored : fallback;
|
|
783
|
+
}
|
|
784
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
785
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ThemeService, providedIn: 'root' }); }
|
|
786
|
+
}
|
|
787
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ThemeService, decorators: [{
|
|
788
|
+
type: Injectable,
|
|
789
|
+
args: [{ providedIn: 'root' }]
|
|
790
|
+
}], ctorParameters: () => [] });
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* Штамп последнего взаимодействия для превью списков чатов: событие за сегодня
|
|
794
|
+
* показывается временем («14:05»), за вчера и ранее — датой («18.07.2026»), чтобы
|
|
795
|
+
* старые чаты не выглядели сегодняшними (G121).
|
|
796
|
+
*/
|
|
797
|
+
class RtDayStampPipe {
|
|
798
|
+
#locale = inject(LOCALE_ID);
|
|
799
|
+
transform(value) {
|
|
800
|
+
if (value == null || value === '') {
|
|
801
|
+
return '—';
|
|
802
|
+
}
|
|
803
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
804
|
+
if (Number.isNaN(date.getTime())) {
|
|
805
|
+
return '—';
|
|
806
|
+
}
|
|
807
|
+
const now = new Date();
|
|
808
|
+
const isToday = date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate();
|
|
809
|
+
return formatDate(date, isToday ? 'HH:mm' : 'dd.MM.yyyy', this.#locale);
|
|
810
|
+
}
|
|
811
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDayStampPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
812
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.1.6", ngImport: i0, type: RtDayStampPipe, isStandalone: true, name: "rtDayStamp" }); }
|
|
813
|
+
}
|
|
814
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDayStampPipe, decorators: [{
|
|
815
|
+
type: Pipe,
|
|
816
|
+
args: [{ name: 'rtDayStamp' }]
|
|
817
|
+
}] });
|
|
818
|
+
|
|
819
|
+
/**
|
|
820
|
+
* Триггер бесконечной прокрутки. Вешается на элемент-«маяк» в конце списка;
|
|
821
|
+
* когда маяк приближается к области видимости — эмитит `(loadMore)`, чтобы
|
|
822
|
+
* потребитель догрузил следующую страницу и ДОБАВИЛ её к уже показанным
|
|
823
|
+
* сущностям (а не перезаписал).
|
|
824
|
+
*
|
|
825
|
+
* Использует `IntersectionObserver`, поэтому не зависит от того, какой предок
|
|
826
|
+
* владеет вертикальным скроллом: контент скроллится в `.rt-container__content`
|
|
827
|
+
* shell'а, а не в самом feature-компоненте, и браузер сам клипует маяк
|
|
828
|
+
* скроллящими предками при расчёте пересечения.
|
|
829
|
+
*
|
|
830
|
+
* `rootMargin` расширяет нижнюю кромку корня, чтобы триггерить догрузку
|
|
831
|
+
* ЗАРАНЕЕ (по умолчанию за половину вьюпорта до низа) — страница успевает
|
|
832
|
+
* подгрузиться прежде, чем пользователь упрётся в конец списка. Пока идёт
|
|
833
|
+
* запрос или страниц больше нет, потребитель ставит `[disabled]="true"` —
|
|
834
|
+
* наблюдение приостанавливается.
|
|
835
|
+
*/
|
|
836
|
+
class RtInfiniteScrollDirective {
|
|
837
|
+
#host;
|
|
838
|
+
// Конструкторы вроде IntersectionObserver объявлены на globalThis, а не на
|
|
839
|
+
// интерфейсе Window — токен отдаёт тот же объект, тип лишь уточняется.
|
|
840
|
+
#window;
|
|
841
|
+
#observer;
|
|
842
|
+
constructor() {
|
|
843
|
+
this.#host = inject(ElementRef);
|
|
844
|
+
// Конструкторы вроде IntersectionObserver объявлены на globalThis, а не на
|
|
845
|
+
// интерфейсе Window — токен отдаёт тот же объект, тип лишь уточняется.
|
|
846
|
+
this.#window = inject(WINDOW);
|
|
847
|
+
this.#observer = null;
|
|
848
|
+
/** Пауза наблюдения: `true`, пока идёт догрузка или страниц больше нет. */
|
|
849
|
+
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
850
|
+
/**
|
|
851
|
+
* Запас корня снизу — за сколько до низа триггерить догрузку. CSS-формат
|
|
852
|
+
* `rootMargin` (px или %). Default `50%` — половина вьюпорта заранее.
|
|
853
|
+
*/
|
|
854
|
+
this.rootMargin = input('50%', /* @ts-ignore */
|
|
855
|
+
...(ngDevMode ? [{ debugName: "rootMargin" }] : /* istanbul ignore next */ []));
|
|
856
|
+
this.loadMore = output();
|
|
857
|
+
effect(() => {
|
|
858
|
+
// Читаем оба сигнала, чтобы effect пересоздавал наблюдатель при их
|
|
859
|
+
// смене. После завершения догрузки (disabled false-edge) нужен
|
|
860
|
+
// свежий observe: IntersectionObserver не шлёт повторный колбэк,
|
|
861
|
+
// если пересечение с прошлого раза не менялось.
|
|
862
|
+
const disabled = this.disabled();
|
|
863
|
+
const rootMargin = this.rootMargin();
|
|
864
|
+
this.#disconnect();
|
|
865
|
+
if (!disabled) {
|
|
866
|
+
this.#observe(rootMargin);
|
|
867
|
+
}
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
ngOnDestroy() {
|
|
871
|
+
this.#disconnect();
|
|
872
|
+
}
|
|
873
|
+
#observe(rootMargin) {
|
|
874
|
+
const view = this.#window;
|
|
875
|
+
if (typeof view.IntersectionObserver === 'undefined') {
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
this.#observer = new view.IntersectionObserver((entries) => {
|
|
879
|
+
const reached = entries.some((entry) => entry.isIntersecting);
|
|
880
|
+
if (reached) {
|
|
881
|
+
this.loadMore.emit();
|
|
882
|
+
}
|
|
883
|
+
}, { root: null, threshold: 0, rootMargin });
|
|
884
|
+
this.#observer.observe(this.#host.nativeElement);
|
|
885
|
+
}
|
|
886
|
+
#disconnect() {
|
|
887
|
+
this.#observer?.disconnect();
|
|
888
|
+
this.#observer = null;
|
|
889
|
+
}
|
|
890
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtInfiniteScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
891
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtInfiniteScrollDirective, isStandalone: true, selector: "[rtInfiniteScroll]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, rootMargin: { classPropertyName: "rootMargin", publicName: "rootMargin", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loadMore: "loadMore" }, ngImport: i0 }); }
|
|
892
|
+
}
|
|
893
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtInfiniteScrollDirective, decorators: [{
|
|
894
|
+
type: Directive,
|
|
895
|
+
args: [{
|
|
896
|
+
selector: '[rtInfiniteScroll]',
|
|
897
|
+
}]
|
|
898
|
+
}], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], rootMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootMargin", required: false }] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }] } });
|
|
899
|
+
|
|
900
|
+
/* Built by the generator `tools/build-tokens-v2.mjs` from `tokens.source.mjs` — edited there, not here. */
|
|
901
|
+
/** All the styling properties declared by the kit. */
|
|
902
|
+
const RT_DESIGN_TOKEN_NAMES = [
|
|
903
|
+
'--rt-amber-400',
|
|
904
|
+
'--rt-border-width-medium',
|
|
905
|
+
'--rt-border-width-thick',
|
|
906
|
+
'--rt-border-width-thin',
|
|
907
|
+
'--rt-bp-lg',
|
|
908
|
+
'--rt-bp-md',
|
|
909
|
+
'--rt-bp-sm',
|
|
910
|
+
'--rt-bp-xl',
|
|
911
|
+
'--rt-brand-100',
|
|
912
|
+
'--rt-brand-200',
|
|
913
|
+
'--rt-brand-300',
|
|
914
|
+
'--rt-brand-400',
|
|
915
|
+
'--rt-brand-50',
|
|
916
|
+
'--rt-brand-500',
|
|
917
|
+
'--rt-brand-600',
|
|
918
|
+
'--rt-brand-700',
|
|
919
|
+
'--rt-brand-800',
|
|
920
|
+
'--rt-brand-900',
|
|
921
|
+
'--rt-brand-950',
|
|
922
|
+
'--rt-btn-tint-active',
|
|
923
|
+
'--rt-btn-tint-hover',
|
|
924
|
+
'--rt-charcoal-700',
|
|
925
|
+
'--rt-charcoal-800',
|
|
926
|
+
'--rt-charcoal-900',
|
|
927
|
+
'--rt-charcoal-950',
|
|
928
|
+
'--rt-charcoal-border',
|
|
929
|
+
'--rt-charcoal-border-strong',
|
|
930
|
+
'--rt-chat-bubble-date',
|
|
931
|
+
'--rt-chat-bubble-in-author',
|
|
932
|
+
'--rt-chat-bubble-in-bg',
|
|
933
|
+
'--rt-chat-bubble-own-author',
|
|
934
|
+
'--rt-chat-bubble-own-bg',
|
|
935
|
+
'--rt-chat-status-read',
|
|
936
|
+
'--rt-color-action-danger',
|
|
937
|
+
'--rt-color-action-danger-active',
|
|
938
|
+
'--rt-color-action-danger-hover',
|
|
939
|
+
'--rt-color-action-danger-on-surface',
|
|
940
|
+
'--rt-color-action-disabled',
|
|
941
|
+
'--rt-color-action-info',
|
|
942
|
+
'--rt-color-action-info-active',
|
|
943
|
+
'--rt-color-action-info-hover',
|
|
944
|
+
'--rt-color-action-info-on-surface',
|
|
945
|
+
'--rt-color-action-on-danger',
|
|
946
|
+
'--rt-color-action-on-disabled',
|
|
947
|
+
'--rt-color-action-on-info',
|
|
948
|
+
'--rt-color-action-on-primary',
|
|
949
|
+
'--rt-color-action-on-secondary',
|
|
950
|
+
'--rt-color-action-on-success',
|
|
951
|
+
'--rt-color-action-on-warning',
|
|
952
|
+
'--rt-color-action-primary',
|
|
953
|
+
'--rt-color-action-primary-active',
|
|
954
|
+
'--rt-color-action-primary-hover',
|
|
955
|
+
'--rt-color-action-primary-on-surface',
|
|
956
|
+
'--rt-color-action-primary-soft',
|
|
957
|
+
'--rt-color-action-primary-subtle',
|
|
958
|
+
'--rt-color-action-secondary',
|
|
959
|
+
'--rt-color-action-secondary-active',
|
|
960
|
+
'--rt-color-action-secondary-hover',
|
|
961
|
+
'--rt-color-action-secondary-on-surface',
|
|
962
|
+
'--rt-color-action-success',
|
|
963
|
+
'--rt-color-action-success-active',
|
|
964
|
+
'--rt-color-action-success-hover',
|
|
965
|
+
'--rt-color-action-success-on-surface',
|
|
966
|
+
'--rt-color-action-warning',
|
|
967
|
+
'--rt-color-action-warning-active',
|
|
968
|
+
'--rt-color-action-warning-hover',
|
|
969
|
+
'--rt-color-action-warning-on-surface',
|
|
970
|
+
'--rt-color-bg-hover',
|
|
971
|
+
'--rt-color-bg-inverse',
|
|
972
|
+
'--rt-color-bg-nav',
|
|
973
|
+
'--rt-color-bg-overlay',
|
|
974
|
+
'--rt-color-bg-page',
|
|
975
|
+
'--rt-color-bg-page-auth',
|
|
976
|
+
'--rt-color-bg-subtle',
|
|
977
|
+
'--rt-color-bg-surface',
|
|
978
|
+
'--rt-color-bg-surface-auth-card',
|
|
979
|
+
'--rt-color-bg-surface-subtle',
|
|
980
|
+
'--rt-color-bg-surface-subtle-2',
|
|
981
|
+
'--rt-color-border-default',
|
|
982
|
+
'--rt-color-border-focus',
|
|
983
|
+
'--rt-color-border-strong',
|
|
984
|
+
'--rt-color-border-subtle',
|
|
985
|
+
'--rt-color-field-fill-underline',
|
|
986
|
+
'--rt-color-skeleton-base',
|
|
987
|
+
'--rt-color-skeleton-wave',
|
|
988
|
+
'--rt-color-state-danger',
|
|
989
|
+
'--rt-color-state-danger-bg',
|
|
990
|
+
'--rt-color-state-error-text',
|
|
991
|
+
'--rt-color-state-info',
|
|
992
|
+
'--rt-color-state-info-bg',
|
|
993
|
+
'--rt-color-state-success',
|
|
994
|
+
'--rt-color-state-success-bg',
|
|
995
|
+
'--rt-color-state-success-text',
|
|
996
|
+
'--rt-color-state-warning',
|
|
997
|
+
'--rt-color-state-warning-bg',
|
|
998
|
+
'--rt-color-state-warning-text',
|
|
999
|
+
'--rt-color-stepper-current',
|
|
1000
|
+
'--rt-color-stepper-current-subtle',
|
|
1001
|
+
'--rt-color-stepper-progress',
|
|
1002
|
+
'--rt-color-stepper-track',
|
|
1003
|
+
'--rt-color-table-head-bg',
|
|
1004
|
+
'--rt-color-text-disabled',
|
|
1005
|
+
'--rt-color-text-inverse',
|
|
1006
|
+
'--rt-color-text-link',
|
|
1007
|
+
'--rt-color-text-link-hover',
|
|
1008
|
+
'--rt-color-text-muted',
|
|
1009
|
+
'--rt-color-text-primary',
|
|
1010
|
+
'--rt-control-height-2xl',
|
|
1011
|
+
'--rt-control-height-lg',
|
|
1012
|
+
'--rt-control-height-md',
|
|
1013
|
+
'--rt-control-height-sm',
|
|
1014
|
+
'--rt-control-height-xl',
|
|
1015
|
+
'--rt-control-max-width',
|
|
1016
|
+
'--rt-control-panel-max-height',
|
|
1017
|
+
'--rt-control-textarea-min-height-lg',
|
|
1018
|
+
'--rt-control-textarea-min-height-md',
|
|
1019
|
+
'--rt-control-textarea-min-height-sm',
|
|
1020
|
+
'--rt-counter-gap',
|
|
1021
|
+
'--rt-counter-row-color-border',
|
|
1022
|
+
'--rt-counter-row-gap',
|
|
1023
|
+
'--rt-counter-row-hint-color',
|
|
1024
|
+
'--rt-counter-row-hint-font-size',
|
|
1025
|
+
'--rt-counter-row-label-color',
|
|
1026
|
+
'--rt-counter-row-label-font-size',
|
|
1027
|
+
'--rt-counter-row-padding-y',
|
|
1028
|
+
'--rt-counter-value-color',
|
|
1029
|
+
'--rt-counter-value-font-size',
|
|
1030
|
+
'--rt-counter-value-min-width',
|
|
1031
|
+
'--rt-danger-50',
|
|
1032
|
+
'--rt-danger-500',
|
|
1033
|
+
'--rt-danger-600',
|
|
1034
|
+
'--rt-danger-700',
|
|
1035
|
+
'--rt-duration-base',
|
|
1036
|
+
'--rt-duration-fast',
|
|
1037
|
+
'--rt-duration-slow',
|
|
1038
|
+
'--rt-duration-slower',
|
|
1039
|
+
'--rt-field-error-color',
|
|
1040
|
+
'--rt-field-error-font-size',
|
|
1041
|
+
'--rt-field-gap',
|
|
1042
|
+
'--rt-field-hint-color',
|
|
1043
|
+
'--rt-field-hint-font-size',
|
|
1044
|
+
'--rt-field-label-color',
|
|
1045
|
+
'--rt-field-label-font-size',
|
|
1046
|
+
'--rt-field-label-font-weight',
|
|
1047
|
+
'--rt-field-label-help-gap',
|
|
1048
|
+
'--rt-field-required-color',
|
|
1049
|
+
'--rt-field-value-color',
|
|
1050
|
+
'--rt-field-value-empty-color',
|
|
1051
|
+
'--rt-field-value-font-size',
|
|
1052
|
+
'--rt-focus-ring-color',
|
|
1053
|
+
'--rt-focus-ring-color-danger',
|
|
1054
|
+
'--rt-focus-ring-offset',
|
|
1055
|
+
'--rt-focus-ring-width',
|
|
1056
|
+
'--rt-font-family-mono',
|
|
1057
|
+
'--rt-font-family-sans',
|
|
1058
|
+
'--rt-font-weight-bold',
|
|
1059
|
+
'--rt-font-weight-medium',
|
|
1060
|
+
'--rt-font-weight-regular',
|
|
1061
|
+
'--rt-font-weight-semibold',
|
|
1062
|
+
'--rt-gray-350',
|
|
1063
|
+
'--rt-icon-button-color-bg-hover',
|
|
1064
|
+
'--rt-icon-button-disabled-color',
|
|
1065
|
+
'--rt-icon-button-disabled-fill',
|
|
1066
|
+
'--rt-icon-button-disabled-opacity',
|
|
1067
|
+
'--rt-info-50',
|
|
1068
|
+
'--rt-info-500',
|
|
1069
|
+
'--rt-info-600',
|
|
1070
|
+
'--rt-info-700',
|
|
1071
|
+
'--rt-input-border-width',
|
|
1072
|
+
'--rt-input-color-bg',
|
|
1073
|
+
'--rt-input-color-bg-disabled',
|
|
1074
|
+
'--rt-input-color-bg-hover',
|
|
1075
|
+
'--rt-input-color-border',
|
|
1076
|
+
'--rt-input-color-border-error',
|
|
1077
|
+
'--rt-input-color-border-focus',
|
|
1078
|
+
'--rt-input-color-text',
|
|
1079
|
+
'--rt-input-color-text-placeholder',
|
|
1080
|
+
'--rt-input-disabled-opacity',
|
|
1081
|
+
'--rt-input-focus-outline-offset',
|
|
1082
|
+
'--rt-input-focus-shadow',
|
|
1083
|
+
'--rt-input-focus-shadow-error',
|
|
1084
|
+
'--rt-input-font-size',
|
|
1085
|
+
'--rt-input-gap',
|
|
1086
|
+
'--rt-input-height',
|
|
1087
|
+
'--rt-input-height-lg',
|
|
1088
|
+
'--rt-input-height-md',
|
|
1089
|
+
'--rt-input-height-sm',
|
|
1090
|
+
'--rt-input-icon-color',
|
|
1091
|
+
'--rt-input-icon-size',
|
|
1092
|
+
'--rt-input-line-height',
|
|
1093
|
+
'--rt-input-max-width',
|
|
1094
|
+
'--rt-input-padding-x',
|
|
1095
|
+
'--rt-input-padding-y',
|
|
1096
|
+
'--rt-input-panel-max-height',
|
|
1097
|
+
'--rt-input-radius',
|
|
1098
|
+
'--rt-input-transition',
|
|
1099
|
+
'--rt-leading-none',
|
|
1100
|
+
'--rt-leading-normal',
|
|
1101
|
+
'--rt-leading-relaxed',
|
|
1102
|
+
'--rt-leading-snug',
|
|
1103
|
+
'--rt-leading-tight',
|
|
1104
|
+
'--rt-letter-spacing-wide',
|
|
1105
|
+
'--rt-list-action-color',
|
|
1106
|
+
'--rt-list-action-color-bg-hover',
|
|
1107
|
+
'--rt-list-action-color-hover',
|
|
1108
|
+
'--rt-list-action-divider-height',
|
|
1109
|
+
'--rt-list-action-gap',
|
|
1110
|
+
'--rt-list-action-icon-size',
|
|
1111
|
+
'--rt-list-action-radius',
|
|
1112
|
+
'--rt-list-action-shadow',
|
|
1113
|
+
'--rt-list-action-shadow-hover',
|
|
1114
|
+
'--rt-list-content-padding-bottom',
|
|
1115
|
+
'--rt-list-copy-button-bg',
|
|
1116
|
+
'--rt-list-copy-button-bg-hover',
|
|
1117
|
+
'--rt-list-copy-button-color',
|
|
1118
|
+
'--rt-list-copy-button-radius',
|
|
1119
|
+
'--rt-list-copy-button-size',
|
|
1120
|
+
'--rt-list-empty-icon-size',
|
|
1121
|
+
'--rt-list-empty-icon-wrap-bg',
|
|
1122
|
+
'--rt-list-empty-icon-wrap-size',
|
|
1123
|
+
'--rt-list-empty-title-size',
|
|
1124
|
+
'--rt-list-empty-title-weight',
|
|
1125
|
+
'--rt-list-filter-line-height',
|
|
1126
|
+
'--rt-list-placeholder-grow',
|
|
1127
|
+
'--rt-list-placeholder-min-height',
|
|
1128
|
+
'--rt-list-search-color-bg',
|
|
1129
|
+
'--rt-list-search-color-border',
|
|
1130
|
+
'--rt-list-search-color-placeholder',
|
|
1131
|
+
'--rt-list-search-font-size',
|
|
1132
|
+
'--rt-list-search-gap',
|
|
1133
|
+
'--rt-list-search-height',
|
|
1134
|
+
'--rt-list-search-icon-color',
|
|
1135
|
+
'--rt-list-search-icon-size',
|
|
1136
|
+
'--rt-list-search-padding-x',
|
|
1137
|
+
'--rt-list-search-radius',
|
|
1138
|
+
'--rt-list-search-width',
|
|
1139
|
+
'--rt-list-selector-label-color',
|
|
1140
|
+
'--rt-list-settings-icon-color',
|
|
1141
|
+
'--rt-list-settings-item-bg',
|
|
1142
|
+
'--rt-list-settings-item-radius',
|
|
1143
|
+
'--rt-list-table-button-radius',
|
|
1144
|
+
'--rt-list-table-button-size',
|
|
1145
|
+
'--rt-list-table-head-divider-color',
|
|
1146
|
+
'--rt-list-table-icon-color',
|
|
1147
|
+
'--rt-list-table-icon-size',
|
|
1148
|
+
'--rt-list-toolbar-gap',
|
|
1149
|
+
'--rt-list-toolbar-padding-bottom',
|
|
1150
|
+
'--rt-list-toolbar-padding-top',
|
|
1151
|
+
'--rt-mat-blue-100',
|
|
1152
|
+
'--rt-mat-blue-20',
|
|
1153
|
+
'--rt-mat-blue-40',
|
|
1154
|
+
'--rt-mat-blue-60',
|
|
1155
|
+
'--rt-mat-blue-80',
|
|
1156
|
+
'--rt-mat-blue-active',
|
|
1157
|
+
'--rt-mat-blue-hover',
|
|
1158
|
+
'--rt-mat-dark-10',
|
|
1159
|
+
'--rt-mat-dark-20',
|
|
1160
|
+
'--rt-mat-dark-30',
|
|
1161
|
+
'--rt-mat-dark-40',
|
|
1162
|
+
'--rt-mat-green-10',
|
|
1163
|
+
'--rt-mat-green-100',
|
|
1164
|
+
'--rt-mat-green-120',
|
|
1165
|
+
'--rt-mat-green-20',
|
|
1166
|
+
'--rt-mat-green-40',
|
|
1167
|
+
'--rt-mat-green-60',
|
|
1168
|
+
'--rt-mat-green-80',
|
|
1169
|
+
'--rt-mat-green-active',
|
|
1170
|
+
'--rt-mat-green-hover',
|
|
1171
|
+
'--rt-mat-menu-min-width',
|
|
1172
|
+
'--rt-mat-menu-sm-icon-size',
|
|
1173
|
+
'--rt-mat-menu-sm-item-height',
|
|
1174
|
+
'--rt-mat-navy-100',
|
|
1175
|
+
'--rt-mat-neutral-0',
|
|
1176
|
+
'--rt-mat-neutral-10',
|
|
1177
|
+
'--rt-mat-neutral-100',
|
|
1178
|
+
'--rt-mat-neutral-15',
|
|
1179
|
+
'--rt-mat-neutral-20',
|
|
1180
|
+
'--rt-mat-neutral-25',
|
|
1181
|
+
'--rt-mat-neutral-30',
|
|
1182
|
+
'--rt-mat-neutral-35',
|
|
1183
|
+
'--rt-mat-neutral-40',
|
|
1184
|
+
'--rt-mat-neutral-5',
|
|
1185
|
+
'--rt-mat-neutral-60',
|
|
1186
|
+
'--rt-mat-neutral-80',
|
|
1187
|
+
'--rt-mat-neutral-active',
|
|
1188
|
+
'--rt-mat-neutral-hover',
|
|
1189
|
+
'--rt-mat-orange-10',
|
|
1190
|
+
'--rt-mat-orange-100',
|
|
1191
|
+
'--rt-mat-orange-20',
|
|
1192
|
+
'--rt-mat-orange-40',
|
|
1193
|
+
'--rt-mat-orange-5',
|
|
1194
|
+
'--rt-mat-orange-60',
|
|
1195
|
+
'--rt-mat-orange-70',
|
|
1196
|
+
'--rt-mat-orange-80',
|
|
1197
|
+
'--rt-mat-orange-active',
|
|
1198
|
+
'--rt-mat-orange-hover',
|
|
1199
|
+
'--rt-mat-overlay-black-32',
|
|
1200
|
+
'--rt-mat-overlay-black-4',
|
|
1201
|
+
'--rt-mat-overlay-blue-24',
|
|
1202
|
+
'--rt-mat-overlay-blue-8',
|
|
1203
|
+
'--rt-mat-radius-4',
|
|
1204
|
+
'--rt-mat-radius-5',
|
|
1205
|
+
'--rt-mat-red-10',
|
|
1206
|
+
'--rt-mat-red-100',
|
|
1207
|
+
'--rt-mat-red-20',
|
|
1208
|
+
'--rt-mat-red-40',
|
|
1209
|
+
'--rt-mat-red-60',
|
|
1210
|
+
'--rt-mat-red-80',
|
|
1211
|
+
'--rt-mat-red-active',
|
|
1212
|
+
'--rt-mat-red-hover',
|
|
1213
|
+
'--rt-mat-shadow-fab',
|
|
1214
|
+
'--rt-mat-shadow-fab-hover',
|
|
1215
|
+
'--rt-mat-shadow-level-2',
|
|
1216
|
+
'--rt-nav-caret-size',
|
|
1217
|
+
'--rt-nav-color-disabled',
|
|
1218
|
+
'--rt-nav-color-focus',
|
|
1219
|
+
'--rt-nav-header-color-bg',
|
|
1220
|
+
'--rt-nav-header-padding',
|
|
1221
|
+
'--rt-nav-item-color',
|
|
1222
|
+
'--rt-nav-item-color-bg',
|
|
1223
|
+
'--rt-nav-item-color-bg-active',
|
|
1224
|
+
'--rt-nav-item-color-border',
|
|
1225
|
+
'--rt-nav-item-color-caret',
|
|
1226
|
+
'--rt-nav-item-color-hover',
|
|
1227
|
+
'--rt-nav-item-color-pressed',
|
|
1228
|
+
'--rt-nav-item-content-gap',
|
|
1229
|
+
'--rt-nav-item-font-size',
|
|
1230
|
+
'--rt-nav-item-font-weight',
|
|
1231
|
+
'--rt-nav-item-gap',
|
|
1232
|
+
'--rt-nav-item-height',
|
|
1233
|
+
'--rt-nav-item-line-height',
|
|
1234
|
+
'--rt-nav-item-padding',
|
|
1235
|
+
'--rt-nav-marker-color',
|
|
1236
|
+
'--rt-nav-marker-size',
|
|
1237
|
+
'--rt-nav-panel-color-bg',
|
|
1238
|
+
'--rt-nav-panel-color-border',
|
|
1239
|
+
'--rt-nav-panel-column-gap',
|
|
1240
|
+
'--rt-nav-panel-column-width',
|
|
1241
|
+
'--rt-nav-panel-columns',
|
|
1242
|
+
'--rt-nav-panel-group-color',
|
|
1243
|
+
'--rt-nav-panel-group-content-gap',
|
|
1244
|
+
'--rt-nav-panel-group-font-size',
|
|
1245
|
+
'--rt-nav-panel-group-font-weight',
|
|
1246
|
+
'--rt-nav-panel-group-gap',
|
|
1247
|
+
'--rt-nav-panel-item-color',
|
|
1248
|
+
'--rt-nav-panel-item-color-active',
|
|
1249
|
+
'--rt-nav-panel-item-color-bg-active',
|
|
1250
|
+
'--rt-nav-panel-item-color-bg-hover',
|
|
1251
|
+
'--rt-nav-panel-item-content-gap',
|
|
1252
|
+
'--rt-nav-panel-item-font-size',
|
|
1253
|
+
'--rt-nav-panel-item-font-weight',
|
|
1254
|
+
'--rt-nav-panel-item-gap',
|
|
1255
|
+
'--rt-nav-panel-item-height',
|
|
1256
|
+
'--rt-nav-panel-item-padding',
|
|
1257
|
+
'--rt-nav-panel-padding',
|
|
1258
|
+
'--rt-nav-panel-padding-y',
|
|
1259
|
+
'--rt-nav-panel-shadow',
|
|
1260
|
+
'--rt-navy-600',
|
|
1261
|
+
'--rt-navy-900',
|
|
1262
|
+
'--rt-neutral-0',
|
|
1263
|
+
'--rt-neutral-100',
|
|
1264
|
+
'--rt-neutral-200',
|
|
1265
|
+
'--rt-neutral-300',
|
|
1266
|
+
'--rt-neutral-400',
|
|
1267
|
+
'--rt-neutral-50',
|
|
1268
|
+
'--rt-neutral-500',
|
|
1269
|
+
'--rt-neutral-600',
|
|
1270
|
+
'--rt-neutral-700',
|
|
1271
|
+
'--rt-neutral-800',
|
|
1272
|
+
'--rt-neutral-900',
|
|
1273
|
+
'--rt-neutral-950',
|
|
1274
|
+
'--rt-opacity-disabled',
|
|
1275
|
+
'--rt-overlay-amber-16',
|
|
1276
|
+
'--rt-overlay-black-4',
|
|
1277
|
+
'--rt-overlay-black-50',
|
|
1278
|
+
'--rt-overlay-black-8',
|
|
1279
|
+
'--rt-overlay-brand-24',
|
|
1280
|
+
'--rt-overlay-brand-8',
|
|
1281
|
+
'--rt-overlay-danger-16',
|
|
1282
|
+
'--rt-overlay-menu-bg',
|
|
1283
|
+
'--rt-overlay-menu-current-bg',
|
|
1284
|
+
'--rt-overlay-menu-danger-color',
|
|
1285
|
+
'--rt-overlay-menu-danger-label-color',
|
|
1286
|
+
'--rt-overlay-menu-item-icon-size',
|
|
1287
|
+
'--rt-overlay-menu-item-min-height',
|
|
1288
|
+
'--rt-overlay-menu-item-padding-x',
|
|
1289
|
+
'--rt-overlay-menu-item-padding-y',
|
|
1290
|
+
'--rt-overlay-menu-item-weight',
|
|
1291
|
+
'--rt-overlay-menu-min-width',
|
|
1292
|
+
'--rt-overlay-menu-padding-y',
|
|
1293
|
+
'--rt-overlay-menu-radius',
|
|
1294
|
+
'--rt-overlay-menu-shadow',
|
|
1295
|
+
'--rt-overlay-menu-sm-item-icon-size',
|
|
1296
|
+
'--rt-overlay-menu-sm-item-min-height',
|
|
1297
|
+
'--rt-overlay-navy-70',
|
|
1298
|
+
'--rt-overlay-select-check-display',
|
|
1299
|
+
'--rt-overlay-select-option-font-size',
|
|
1300
|
+
'--rt-overlay-select-option-min-height',
|
|
1301
|
+
'--rt-overlay-select-panel-border-width',
|
|
1302
|
+
'--rt-overlay-select-radius',
|
|
1303
|
+
'--rt-overlay-select-selected-bg',
|
|
1304
|
+
'--rt-overlay-select-selected-weight',
|
|
1305
|
+
'--rt-overlay-select-shadow',
|
|
1306
|
+
'--rt-overlay-tooltip-radius',
|
|
1307
|
+
'--rt-overlay-tooltip-shadow',
|
|
1308
|
+
'--rt-overlay-white-25',
|
|
1309
|
+
'--rt-overlay-white-4',
|
|
1310
|
+
'--rt-overlay-white-40',
|
|
1311
|
+
'--rt-overlay-white-50',
|
|
1312
|
+
'--rt-overlay-white-8',
|
|
1313
|
+
'--rt-pagination-arrow-color',
|
|
1314
|
+
'--rt-pagination-arrow-radius',
|
|
1315
|
+
'--rt-pagination-arrow-shadow',
|
|
1316
|
+
'--rt-pagination-arrow-size',
|
|
1317
|
+
'--rt-pagination-box-color-border',
|
|
1318
|
+
'--rt-pagination-box-color-text',
|
|
1319
|
+
'--rt-pagination-box-current-color-bg',
|
|
1320
|
+
'--rt-pagination-box-current-color-border',
|
|
1321
|
+
'--rt-pagination-box-current-color-text',
|
|
1322
|
+
'--rt-pagination-box-current-font-weight',
|
|
1323
|
+
'--rt-pagination-box-radius',
|
|
1324
|
+
'--rt-pagination-box-size',
|
|
1325
|
+
'--rt-pagination-field-color-bg',
|
|
1326
|
+
'--rt-pagination-field-color-border',
|
|
1327
|
+
'--rt-pagination-field-color-text',
|
|
1328
|
+
'--rt-pagination-field-height',
|
|
1329
|
+
'--rt-pagination-field-padding-x',
|
|
1330
|
+
'--rt-pagination-field-radius',
|
|
1331
|
+
'--rt-pagination-gap',
|
|
1332
|
+
'--rt-pagination-justify',
|
|
1333
|
+
'--rt-pagination-nav-gap',
|
|
1334
|
+
'--rt-pagination-padding-x',
|
|
1335
|
+
'--rt-pagination-padding-y',
|
|
1336
|
+
'--rt-pagination-per-page-gap',
|
|
1337
|
+
'--rt-pagination-per-page-label-white-space',
|
|
1338
|
+
'--rt-pagination-range-display',
|
|
1339
|
+
'--rt-profile-avatar-font-size',
|
|
1340
|
+
'--rt-profile-avatar-size',
|
|
1341
|
+
'--rt-profile-item-content-gap',
|
|
1342
|
+
'--rt-profile-item-font-size',
|
|
1343
|
+
'--rt-profile-item-font-weight',
|
|
1344
|
+
'--rt-profile-item-padding-y',
|
|
1345
|
+
'--rt-profile-item-radius',
|
|
1346
|
+
'--rt-profile-menu-min-width',
|
|
1347
|
+
'--rt-profile-menu-padding',
|
|
1348
|
+
'--rt-profile-menu-shadow',
|
|
1349
|
+
'--rt-profile-row-inset',
|
|
1350
|
+
'--rt-profile-theme-icon-padding',
|
|
1351
|
+
'--rt-radius-2xl',
|
|
1352
|
+
'--rt-radius-control',
|
|
1353
|
+
'--rt-radius-full',
|
|
1354
|
+
'--rt-radius-lg',
|
|
1355
|
+
'--rt-radius-md',
|
|
1356
|
+
'--rt-radius-ms',
|
|
1357
|
+
'--rt-radius-none',
|
|
1358
|
+
'--rt-radius-sm',
|
|
1359
|
+
'--rt-radius-xl',
|
|
1360
|
+
'--rt-radius-xs',
|
|
1361
|
+
'--rt-shadow-card',
|
|
1362
|
+
'--rt-shadow-card-soft',
|
|
1363
|
+
'--rt-shadow-dialog',
|
|
1364
|
+
'--rt-shadow-focus-ring',
|
|
1365
|
+
'--rt-shadow-focus-ring-danger',
|
|
1366
|
+
'--rt-shadow-lg',
|
|
1367
|
+
'--rt-shadow-md',
|
|
1368
|
+
'--rt-shadow-nav-panel',
|
|
1369
|
+
'--rt-shadow-none',
|
|
1370
|
+
'--rt-shadow-profile-menu',
|
|
1371
|
+
'--rt-shadow-sm',
|
|
1372
|
+
'--rt-shadow-status-dot',
|
|
1373
|
+
'--rt-shadow-step-indicator',
|
|
1374
|
+
'--rt-shadow-xl',
|
|
1375
|
+
'--rt-size-1',
|
|
1376
|
+
'--rt-size-10',
|
|
1377
|
+
'--rt-size-100',
|
|
1378
|
+
'--rt-size-12',
|
|
1379
|
+
'--rt-size-16',
|
|
1380
|
+
'--rt-size-2',
|
|
1381
|
+
'--rt-size-20',
|
|
1382
|
+
'--rt-size-24',
|
|
1383
|
+
'--rt-size-3',
|
|
1384
|
+
'--rt-size-30',
|
|
1385
|
+
'--rt-size-4',
|
|
1386
|
+
'--rt-size-40',
|
|
1387
|
+
'--rt-size-5',
|
|
1388
|
+
'--rt-size-6',
|
|
1389
|
+
'--rt-size-60',
|
|
1390
|
+
'--rt-size-64',
|
|
1391
|
+
'--rt-size-8',
|
|
1392
|
+
'--rt-slate-300',
|
|
1393
|
+
'--rt-space-0',
|
|
1394
|
+
'--rt-space-0-5',
|
|
1395
|
+
'--rt-space-1',
|
|
1396
|
+
'--rt-space-10',
|
|
1397
|
+
'--rt-space-12',
|
|
1398
|
+
'--rt-space-16',
|
|
1399
|
+
'--rt-space-2',
|
|
1400
|
+
'--rt-space-20',
|
|
1401
|
+
'--rt-space-24',
|
|
1402
|
+
'--rt-space-2xl',
|
|
1403
|
+
'--rt-space-2xs',
|
|
1404
|
+
'--rt-space-3xl',
|
|
1405
|
+
'--rt-space-4',
|
|
1406
|
+
'--rt-space-5',
|
|
1407
|
+
'--rt-space-6',
|
|
1408
|
+
'--rt-space-8',
|
|
1409
|
+
'--rt-space-lg',
|
|
1410
|
+
'--rt-space-md',
|
|
1411
|
+
'--rt-space-sm',
|
|
1412
|
+
'--rt-space-xl',
|
|
1413
|
+
'--rt-space-xs',
|
|
1414
|
+
'--rt-success-100',
|
|
1415
|
+
'--rt-success-400',
|
|
1416
|
+
'--rt-success-50',
|
|
1417
|
+
'--rt-success-500',
|
|
1418
|
+
'--rt-success-600',
|
|
1419
|
+
'--rt-success-700',
|
|
1420
|
+
'--rt-text-2xl',
|
|
1421
|
+
'--rt-text-2xs',
|
|
1422
|
+
'--rt-text-3xl',
|
|
1423
|
+
'--rt-text-3xs',
|
|
1424
|
+
'--rt-text-4xl',
|
|
1425
|
+
'--rt-text-base',
|
|
1426
|
+
'--rt-text-lg',
|
|
1427
|
+
'--rt-text-md',
|
|
1428
|
+
'--rt-text-sm',
|
|
1429
|
+
'--rt-text-xl',
|
|
1430
|
+
'--rt-text-xs',
|
|
1431
|
+
'--rt-textarea-line-height',
|
|
1432
|
+
'--rt-textarea-min-height',
|
|
1433
|
+
'--rt-textarea-min-height-lg',
|
|
1434
|
+
'--rt-textarea-min-height-md',
|
|
1435
|
+
'--rt-textarea-min-height-sm',
|
|
1436
|
+
'--rt-textarea-padding-y',
|
|
1437
|
+
'--rt-toggle-color-border',
|
|
1438
|
+
'--rt-toggle-color-icon',
|
|
1439
|
+
'--rt-toggle-color-thumb',
|
|
1440
|
+
'--rt-toggle-color-track',
|
|
1441
|
+
'--rt-toggle-color-track-on',
|
|
1442
|
+
'--rt-toggle-shadow-border',
|
|
1443
|
+
'--rt-toggle-shadow-thumb',
|
|
1444
|
+
'--rt-warning-50',
|
|
1445
|
+
'--rt-warning-500',
|
|
1446
|
+
'--rt-warning-600',
|
|
1447
|
+
'--rt-warning-700',
|
|
1448
|
+
'--rt-yellow-400',
|
|
1449
|
+
'--rt-z-base',
|
|
1450
|
+
'--rt-z-dropdown',
|
|
1451
|
+
'--rt-z-fixed',
|
|
1452
|
+
'--rt-z-modal',
|
|
1453
|
+
'--rt-z-modal-backdrop',
|
|
1454
|
+
'--rt-z-popover',
|
|
1455
|
+
'--rt-z-sticky',
|
|
1456
|
+
'--rt-z-tooltip',
|
|
1457
|
+
];
|
|
1458
|
+
/** All the consumer's handles: the value comes from the application, until then the fallback works. */
|
|
1459
|
+
const RT_CONSUMER_HANDLE_NAMES = [
|
|
1460
|
+
'--rt-action-bar-menu-bg',
|
|
1461
|
+
'--rt-action-bar-menu-color',
|
|
1462
|
+
'--rt-action-bar-menu-radius',
|
|
1463
|
+
'--rt-action-bar-menu-shadow',
|
|
1464
|
+
'--rt-aside-bg',
|
|
1465
|
+
'--rt-aside-content-inset',
|
|
1466
|
+
'--rt-aside-error-margin-block',
|
|
1467
|
+
'--rt-aside-footer-gap',
|
|
1468
|
+
'--rt-aside-footer-inset',
|
|
1469
|
+
'--rt-aside-footer-justify',
|
|
1470
|
+
'--rt-aside-footer-margin',
|
|
1471
|
+
'--rt-aside-header-inset',
|
|
1472
|
+
'--rt-aside-header-title-leading',
|
|
1473
|
+
'--rt-aside-width',
|
|
1474
|
+
'--rt-data-table-scrollbar-color',
|
|
1475
|
+
'--rt-data-table-scrollbar-horizontal-height',
|
|
1476
|
+
'--rt-data-table-scrollbar-vertical-width',
|
|
1477
|
+
'--rt-data-table-scrollbar-width',
|
|
1478
|
+
'--rt-dialog-bg',
|
|
1479
|
+
'--rt-dialog-border',
|
|
1480
|
+
'--rt-dialog-content-max-height',
|
|
1481
|
+
'--rt-dialog-content-padding',
|
|
1482
|
+
'--rt-dialog-footer-border',
|
|
1483
|
+
'--rt-dialog-footer-padding',
|
|
1484
|
+
'--rt-dialog-header-border',
|
|
1485
|
+
'--rt-dialog-header-padding',
|
|
1486
|
+
'--rt-dialog-title-font-size',
|
|
1487
|
+
'--rt-dialog-title-transform',
|
|
1488
|
+
'--rt-dialog-title-weight',
|
|
1489
|
+
'--rt-dialog-width',
|
|
1490
|
+
'--rt-header-content-max-width',
|
|
1491
|
+
'--rt-header-height',
|
|
1492
|
+
'--rt-icon-button-bg',
|
|
1493
|
+
'--rt-icon-button-bg-hover',
|
|
1494
|
+
'--rt-icon-button-size',
|
|
1495
|
+
'--rt-icon-glyph-font',
|
|
1496
|
+
'--rt-logo-tagline',
|
|
1497
|
+
'--rt-logo-tagline-dark',
|
|
1498
|
+
'--rt-logo-wordmark',
|
|
1499
|
+
'--rt-logo-wordmark-dark',
|
|
1500
|
+
'--rt-page-header-bg',
|
|
1501
|
+
'--rt-table-actions-bg',
|
|
1502
|
+
'--rt-tag-color-bg',
|
|
1503
|
+
'--rt-tag-color-border',
|
|
1504
|
+
'--rt-tag-color-text',
|
|
1505
|
+
'--rt-tag-letter-spacing',
|
|
1506
|
+
'--rt-tag-padding-block',
|
|
1507
|
+
'--rt-tag-padding-inline',
|
|
1508
|
+
'--rt-toast-action-color',
|
|
1509
|
+
'--rt-toast-bg',
|
|
1510
|
+
'--rt-toast-border-color',
|
|
1511
|
+
'--rt-toast-close-color',
|
|
1512
|
+
'--rt-toast-color',
|
|
1513
|
+
'--rt-toast-filled-danger-bg',
|
|
1514
|
+
'--rt-toast-filled-danger-border-color',
|
|
1515
|
+
'--rt-toast-filled-danger-color',
|
|
1516
|
+
'--rt-toast-filled-info-bg',
|
|
1517
|
+
'--rt-toast-filled-info-border-color',
|
|
1518
|
+
'--rt-toast-filled-info-color',
|
|
1519
|
+
'--rt-toast-filled-success-bg',
|
|
1520
|
+
'--rt-toast-filled-success-border-color',
|
|
1521
|
+
'--rt-toast-filled-success-color',
|
|
1522
|
+
'--rt-toast-filled-warning-bg',
|
|
1523
|
+
'--rt-toast-filled-warning-border-color',
|
|
1524
|
+
'--rt-toast-filled-warning-color',
|
|
1525
|
+
'--rt-toast-icon-color',
|
|
1526
|
+
'--rt-toast-progress-color',
|
|
1527
|
+
'--rt-toast-progress-height',
|
|
1528
|
+
'--rt-workspace-aside-size',
|
|
1529
|
+
'--rt-workspace-list-size',
|
|
1530
|
+
];
|
|
1531
|
+
|
|
1532
|
+
/**
|
|
1533
|
+
* Подпись по умолчанию, когда из URL не удалось извлечь имя файла. Нейтральная
|
|
1534
|
+
* и непереводимая: кит не знает языка потребителя, а видимую подпись
|
|
1535
|
+
* вызывающая сторона передаёт вторым аргументом.
|
|
1536
|
+
*/
|
|
1537
|
+
const DEFAULT_ATTACHMENT_NAME = 'file';
|
|
1538
|
+
/**
|
|
1539
|
+
* Извлекает имя файла из URL: последний сегмент пути без query/fragment,
|
|
1540
|
+
* декодированный из percent-encoding. Нужен для вложений, у которых источник
|
|
1541
|
+
* отдаёт только ссылку на скачивание без метаданных (имени/размера).
|
|
1542
|
+
*
|
|
1543
|
+
* @param url Ссылка на файл. Пустая/`null` → `fallback`.
|
|
1544
|
+
* @param fallback Что вернуть, если сегмент пустой или URL не распарсился.
|
|
1545
|
+
*/
|
|
1546
|
+
function fileNameFromUrl(url, fallback = DEFAULT_ATTACHMENT_NAME) {
|
|
1547
|
+
if (!url) {
|
|
1548
|
+
return fallback;
|
|
1549
|
+
}
|
|
1550
|
+
const path = url.split('?')[0].split('#')[0];
|
|
1551
|
+
// У абсолютных URL имя файла живёт только в pathname — отбрасываем протокол и хост,
|
|
1552
|
+
// иначе для ссылки без пути ("https://host/") именем стал бы сам хост.
|
|
1553
|
+
let pathname = path;
|
|
1554
|
+
const schemeIdx = path.indexOf('://');
|
|
1555
|
+
if (schemeIdx !== -1) {
|
|
1556
|
+
const slashIdx = path.indexOf('/', schemeIdx + 3);
|
|
1557
|
+
pathname = slashIdx === -1 ? '' : path.slice(slashIdx);
|
|
1558
|
+
}
|
|
1559
|
+
const segment = pathname.split('/').filter(Boolean).pop() ?? '';
|
|
1560
|
+
if (!segment) {
|
|
1561
|
+
return fallback;
|
|
1562
|
+
}
|
|
1563
|
+
try {
|
|
1564
|
+
return decodeURIComponent(segment);
|
|
1565
|
+
}
|
|
1566
|
+
catch {
|
|
1567
|
+
// Некорректный percent-encoding — показываем сегмент как есть.
|
|
1568
|
+
return segment;
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
|
|
1572
|
+
/**
|
|
1573
|
+
* Форматирует размер файла в байтах в человекочитаемую строку (SI, base-1000).
|
|
1574
|
+
*
|
|
1575
|
+
* Используется десятичная система (1 кБ = 1000 Б), а не двоичная (KiB), —
|
|
1576
|
+
* так размер совпадает с тем, что показывает большинство ОС и файловых менеджеров.
|
|
1577
|
+
* Единицы — латиницей (`B` / `kB` / `MB` / `GB`), как в макете карточки файла.
|
|
1578
|
+
*
|
|
1579
|
+
* @param bytes Размер в байтах. `null`/`undefined`/`NaN`/отрицательное → пустая строка
|
|
1580
|
+
* (caller сам решает, скрывать бейдж или нет).
|
|
1581
|
+
* @returns Строка вида `"82 kB"`, `"1.4 MB"` или `""`, если размер неизвестен.
|
|
1582
|
+
*/
|
|
1583
|
+
function formatFileSize(bytes) {
|
|
1584
|
+
if (bytes === null || bytes === undefined || Number.isNaN(bytes) || bytes < 0) {
|
|
1585
|
+
return '';
|
|
1586
|
+
}
|
|
1587
|
+
if (bytes < 1_000) {
|
|
1588
|
+
return `${bytes} B`;
|
|
1589
|
+
}
|
|
1590
|
+
if (bytes < 1_000_000) {
|
|
1591
|
+
return `${Math.round(bytes / 1_000)} kB`;
|
|
1592
|
+
}
|
|
1593
|
+
if (bytes < 1_000_000_000) {
|
|
1594
|
+
return `${(bytes / 1_000_000).toFixed(1)} MB`;
|
|
1595
|
+
}
|
|
1596
|
+
return `${(bytes / 1_000_000_000).toFixed(1)} GB`;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
/**
|
|
1600
|
+
* Дерево узлов показа разметки: то, во что разборщик переводит присланный текст.
|
|
1601
|
+
*
|
|
1602
|
+
* Перечень узлов закрыт. Разборщик не умеет строить ничего, кроме перечисленного здесь, —
|
|
1603
|
+
* поэтому сырой HTML, картинки и адреса чужих схем в вывод не попадают вовсе: для них тут
|
|
1604
|
+
* просто нет узла, и они остаются видимым текстом.
|
|
1605
|
+
*/
|
|
1606
|
+
/** Род блока — то, чем текст разделён по вертикали. */
|
|
1607
|
+
var ERtMarkdownBlock;
|
|
1608
|
+
(function (ERtMarkdownBlock) {
|
|
1609
|
+
ERtMarkdownBlock["Heading"] = "heading";
|
|
1610
|
+
ERtMarkdownBlock["Paragraph"] = "paragraph";
|
|
1611
|
+
ERtMarkdownBlock["List"] = "list";
|
|
1612
|
+
ERtMarkdownBlock["Quote"] = "quote";
|
|
1613
|
+
ERtMarkdownBlock["Code"] = "code";
|
|
1614
|
+
ERtMarkdownBlock["Table"] = "table";
|
|
1615
|
+
})(ERtMarkdownBlock || (ERtMarkdownBlock = {}));
|
|
1616
|
+
/** Род куска строки — то, чем текст размечен внутри абзаца. */
|
|
1617
|
+
var ERtMarkdownInline;
|
|
1618
|
+
(function (ERtMarkdownInline) {
|
|
1619
|
+
ERtMarkdownInline["Text"] = "text";
|
|
1620
|
+
ERtMarkdownInline["Strong"] = "strong";
|
|
1621
|
+
ERtMarkdownInline["Emphasis"] = "emphasis";
|
|
1622
|
+
ERtMarkdownInline["Strike"] = "strike";
|
|
1623
|
+
ERtMarkdownInline["Code"] = "code";
|
|
1624
|
+
ERtMarkdownInline["Link"] = "link";
|
|
1625
|
+
ERtMarkdownInline["Break"] = "break";
|
|
1626
|
+
})(ERtMarkdownInline || (ERtMarkdownInline = {}));
|
|
1627
|
+
|
|
1628
|
+
/**
|
|
1629
|
+
* Разбор строки на куски: жирный, курсив, зачёркнутый, код и ссылка.
|
|
1630
|
+
*
|
|
1631
|
+
* Всё, чего в этом перечне нет, остаётся текстом — включая угловые скобки, разметку картинки и
|
|
1632
|
+
* ссылку чужой схемы. Вычистки здесь нет и быть не может: разборщик не строит узла, которого не
|
|
1633
|
+
* знает, и присланное показывается ровно так, как приехало.
|
|
1634
|
+
*/
|
|
1635
|
+
/** Схемы, при которых адрес становится ссылкой. Любая другая ссылкой не становится. */
|
|
1636
|
+
const ALLOWED_SCHEMES = ['http://', 'https://', 'mailto:'];
|
|
1637
|
+
/**
|
|
1638
|
+
* Порядок важен: длинные строки стоят раньше коротких, иначе `**` разберётся двумя `*`.
|
|
1639
|
+
* Код стоит первым — внутри него разметка не действует.
|
|
1640
|
+
*/
|
|
1641
|
+
const PAIRED_MARKS = [
|
|
1642
|
+
{ mark: '`', kind: ERtMarkdownInline.Code, nested: false },
|
|
1643
|
+
{ mark: '**', kind: ERtMarkdownInline.Strong, nested: true },
|
|
1644
|
+
{ mark: '__', kind: ERtMarkdownInline.Strong, nested: true },
|
|
1645
|
+
{ mark: '~~', kind: ERtMarkdownInline.Strike, nested: true },
|
|
1646
|
+
{ mark: '*', kind: ERtMarkdownInline.Emphasis, nested: true },
|
|
1647
|
+
{ mark: '_', kind: ERtMarkdownInline.Emphasis, nested: true },
|
|
1648
|
+
];
|
|
1649
|
+
/** Кусок текста. */
|
|
1650
|
+
function textNode(value) {
|
|
1651
|
+
return { kind: ERtMarkdownInline.Text, text: value, children: [], href: null };
|
|
1652
|
+
}
|
|
1653
|
+
/** Перенос строки внутри абзаца: одиночный перенос остаётся переносом. */
|
|
1654
|
+
function breakNode() {
|
|
1655
|
+
return { kind: ERtMarkdownInline.Break, text: '', children: [], href: null };
|
|
1656
|
+
}
|
|
1657
|
+
/** Адрес, который годится в ссылку. Всё прочее ссылкой не становится. */
|
|
1658
|
+
function isAllowedHref(value) {
|
|
1659
|
+
const lowered = value.toLowerCase();
|
|
1660
|
+
return ALLOWED_SCHEMES.some((scheme) => lowered.startsWith(scheme));
|
|
1661
|
+
}
|
|
1662
|
+
/** Разметка картинки узлом не становится и остаётся текстом целиком. */
|
|
1663
|
+
function readImage(source, start) {
|
|
1664
|
+
if (source[start] !== '!' || source[start + 1] !== '[') {
|
|
1665
|
+
return null;
|
|
1666
|
+
}
|
|
1667
|
+
const close = source.indexOf(']', start + 2);
|
|
1668
|
+
if (close === -1 || source[close + 1] !== '(') {
|
|
1669
|
+
return null;
|
|
1670
|
+
}
|
|
1671
|
+
const end = source.indexOf(')', close + 2);
|
|
1672
|
+
return end === -1 ? null : { length: end - start + 1, node: null };
|
|
1673
|
+
}
|
|
1674
|
+
/** Читает `[текст](адрес)`, начиная с открывающей скобки. */
|
|
1675
|
+
function readLink(source, start, nested) {
|
|
1676
|
+
if (source[start] !== '[') {
|
|
1677
|
+
return null;
|
|
1678
|
+
}
|
|
1679
|
+
const close = source.indexOf(']', start + 1);
|
|
1680
|
+
if (close === -1 || source[close + 1] !== '(') {
|
|
1681
|
+
return null;
|
|
1682
|
+
}
|
|
1683
|
+
const end = source.indexOf(')', close + 2);
|
|
1684
|
+
if (end === -1) {
|
|
1685
|
+
return null;
|
|
1686
|
+
}
|
|
1687
|
+
const address = source.slice(close + 2, end).trim();
|
|
1688
|
+
if (!isAllowedHref(address)) {
|
|
1689
|
+
return null;
|
|
1690
|
+
}
|
|
1691
|
+
const label = source.slice(start + 1, close);
|
|
1692
|
+
return {
|
|
1693
|
+
length: end - start + 1,
|
|
1694
|
+
node: { kind: ERtMarkdownInline.Link, text: label, children: nested(label), href: address },
|
|
1695
|
+
};
|
|
1696
|
+
}
|
|
1697
|
+
/** Читает парную разметку, начиная с её открывающей строки. */
|
|
1698
|
+
function readPaired(source, start, nested) {
|
|
1699
|
+
const pair = PAIRED_MARKS.find((candidate) => source.startsWith(candidate.mark, start));
|
|
1700
|
+
if (pair === undefined) {
|
|
1701
|
+
return null;
|
|
1702
|
+
}
|
|
1703
|
+
const from = start + pair.mark.length;
|
|
1704
|
+
const close = source.indexOf(pair.mark, from);
|
|
1705
|
+
if (close === -1 || close === from) {
|
|
1706
|
+
return null;
|
|
1707
|
+
}
|
|
1708
|
+
const inner = source.slice(from, close);
|
|
1709
|
+
return {
|
|
1710
|
+
length: close - start + pair.mark.length,
|
|
1711
|
+
node: {
|
|
1712
|
+
kind: pair.kind,
|
|
1713
|
+
text: pair.nested ? '' : inner,
|
|
1714
|
+
children: pair.nested ? nested(inner) : [],
|
|
1715
|
+
href: null,
|
|
1716
|
+
},
|
|
1717
|
+
};
|
|
1718
|
+
}
|
|
1719
|
+
/** Кусок, начинающийся в этом месте строки. Пустой узел — знаки остаются текстом. */
|
|
1720
|
+
function readAt(source, index, nested) {
|
|
1721
|
+
const taken = readImage(source, index) ?? readLink(source, index, nested) ?? readPaired(source, index, nested);
|
|
1722
|
+
return taken ?? { length: 1, node: null };
|
|
1723
|
+
}
|
|
1724
|
+
/**
|
|
1725
|
+
* Разбирает строку на куски показа.
|
|
1726
|
+
*
|
|
1727
|
+
* @param source Строка без переносов.
|
|
1728
|
+
* @returns Куски строки по порядку; у строки без разметки — один кусок текста.
|
|
1729
|
+
*/
|
|
1730
|
+
function parseInline(source) {
|
|
1731
|
+
const nodes = [];
|
|
1732
|
+
let plain = '';
|
|
1733
|
+
let index = 0;
|
|
1734
|
+
const flush = () => {
|
|
1735
|
+
if (plain !== '') {
|
|
1736
|
+
nodes.push(textNode(plain));
|
|
1737
|
+
plain = '';
|
|
1738
|
+
}
|
|
1739
|
+
};
|
|
1740
|
+
while (index < source.length) {
|
|
1741
|
+
const taken = readAt(source, index, parseInline);
|
|
1742
|
+
if (taken.node === null) {
|
|
1743
|
+
plain += source.slice(index, index + taken.length);
|
|
1744
|
+
}
|
|
1745
|
+
else {
|
|
1746
|
+
flush();
|
|
1747
|
+
nodes.push(taken.node);
|
|
1748
|
+
}
|
|
1749
|
+
index += taken.length;
|
|
1750
|
+
}
|
|
1751
|
+
flush();
|
|
1752
|
+
return nodes;
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
/**
|
|
1756
|
+
* Разбор текста, написанного разметкой, в дерево узлов показа.
|
|
1757
|
+
*
|
|
1758
|
+
* Перечень закрыт: заголовки, абзацы, списки, цитаты, код строкой и блоком, таблицы, жирный,
|
|
1759
|
+
* курсив, зачёркнутый и ссылка. Всё прочее — сырой HTML, картинки, ссылки чужих схем — узлом не
|
|
1760
|
+
* становится и остаётся видимым текстом: вычищать нечего, потому что строить такой узел
|
|
1761
|
+
* разборщик не умеет.
|
|
1762
|
+
*
|
|
1763
|
+
* Одиночный перенос строки внутри абзаца остаётся переносом: тексты пишут деревья, и перенос
|
|
1764
|
+
* там ставят осмысленно.
|
|
1765
|
+
*/
|
|
1766
|
+
/** Ограда блока кода. */
|
|
1767
|
+
const FENCE = '```';
|
|
1768
|
+
/** Заголовок: от одной до шести решёток и пробел. */
|
|
1769
|
+
const HEADING_LINE = /^(#{1,6}) (.*)$/;
|
|
1770
|
+
/** Строка цитаты. */
|
|
1771
|
+
const QUOTE_LINE = /^ {0,3}> ?(.*)$/;
|
|
1772
|
+
/** Пункт простого списка: отступ задаёт уровень вложенности. */
|
|
1773
|
+
const BULLET_LINE = /^( *)[-*+] (.*)$/;
|
|
1774
|
+
/** Пункт нумерованного списка. */
|
|
1775
|
+
const ORDERED_LINE = /^( *)\d+[.)] (.*)$/;
|
|
1776
|
+
/** Знаки, из которых состоит строка-разделитель под шапкой таблицы. */
|
|
1777
|
+
const DIVIDER_CHARS = ['|', '-', ':', ' '];
|
|
1778
|
+
/** Сколько пробелов отступа даёт один уровень вложенности списка. */
|
|
1779
|
+
const SPACES_PER_LEVEL = 2;
|
|
1780
|
+
/** Ширина отступа, которой заменяется знак табуляции. */
|
|
1781
|
+
const TAB_WIDTH = ' ';
|
|
1782
|
+
/** Блок с пустыми полями: род и то, что этому роду нужно, дописывает читающий. */
|
|
1783
|
+
function makeBlock(kind, patch) {
|
|
1784
|
+
return {
|
|
1785
|
+
kind,
|
|
1786
|
+
level: 0,
|
|
1787
|
+
levelName: '',
|
|
1788
|
+
content: [],
|
|
1789
|
+
items: [],
|
|
1790
|
+
ordered: false,
|
|
1791
|
+
code: '',
|
|
1792
|
+
language: null,
|
|
1793
|
+
head: [],
|
|
1794
|
+
rows: [],
|
|
1795
|
+
...patch,
|
|
1796
|
+
};
|
|
1797
|
+
}
|
|
1798
|
+
/** Ячейки строки таблицы: крайние палки не считаются столбцами. */
|
|
1799
|
+
function tableCells(line) {
|
|
1800
|
+
const trimmed = line.trim().replace(/^\|/, '').replace(/\|$/, '');
|
|
1801
|
+
return trimmed.split('|').map((cell) => parseInline(cell.trim()));
|
|
1802
|
+
}
|
|
1803
|
+
/** Строка-разделитель под шапкой таблицы. */
|
|
1804
|
+
function isTableDivider(line) {
|
|
1805
|
+
const trimmed = line.trim();
|
|
1806
|
+
return trimmed.includes('-') && [...trimmed].every((char) => DIVIDER_CHARS.includes(char));
|
|
1807
|
+
}
|
|
1808
|
+
/** Куски нескольких строк подряд, разделённые переносом. */
|
|
1809
|
+
function joinLines(lines) {
|
|
1810
|
+
const nodes = [];
|
|
1811
|
+
lines.forEach((line, index) => {
|
|
1812
|
+
if (index > 0) {
|
|
1813
|
+
nodes.push(breakNode());
|
|
1814
|
+
}
|
|
1815
|
+
nodes.push(...parseInline(line));
|
|
1816
|
+
});
|
|
1817
|
+
return nodes;
|
|
1818
|
+
}
|
|
1819
|
+
/** Пункт списка, если эта строка им является. */
|
|
1820
|
+
function listItemOf(line, ordered) {
|
|
1821
|
+
const match = (ordered ? ORDERED_LINE : BULLET_LINE).exec(line);
|
|
1822
|
+
if (match === null) {
|
|
1823
|
+
return null;
|
|
1824
|
+
}
|
|
1825
|
+
const level = Math.floor(match[1].length / SPACES_PER_LEVEL);
|
|
1826
|
+
return { level, levelName: String(level), content: parseInline(match[2]) };
|
|
1827
|
+
}
|
|
1828
|
+
/** Блок кода: от ограды до ограды либо до конца текста. */
|
|
1829
|
+
function readCode(lines, start) {
|
|
1830
|
+
if (!lines[start].startsWith(FENCE)) {
|
|
1831
|
+
return null;
|
|
1832
|
+
}
|
|
1833
|
+
const language = lines[start].slice(FENCE.length).trim();
|
|
1834
|
+
let end = start + 1;
|
|
1835
|
+
while (end < lines.length && !lines[end].startsWith(FENCE)) {
|
|
1836
|
+
end += 1;
|
|
1837
|
+
}
|
|
1838
|
+
return {
|
|
1839
|
+
next: end < lines.length ? end + 1 : end,
|
|
1840
|
+
block: makeBlock(ERtMarkdownBlock.Code, {
|
|
1841
|
+
code: lines.slice(start + 1, end).join('\n'),
|
|
1842
|
+
language: language === '' ? null : language,
|
|
1843
|
+
}),
|
|
1844
|
+
};
|
|
1845
|
+
}
|
|
1846
|
+
/** Заголовок. */
|
|
1847
|
+
function readHeading(lines, start) {
|
|
1848
|
+
const match = HEADING_LINE.exec(lines[start]);
|
|
1849
|
+
if (match === null) {
|
|
1850
|
+
return null;
|
|
1851
|
+
}
|
|
1852
|
+
return {
|
|
1853
|
+
next: start + 1,
|
|
1854
|
+
block: makeBlock(ERtMarkdownBlock.Heading, {
|
|
1855
|
+
level: match[1].length,
|
|
1856
|
+
levelName: String(match[1].length),
|
|
1857
|
+
content: parseInline(match[2]),
|
|
1858
|
+
}),
|
|
1859
|
+
};
|
|
1860
|
+
}
|
|
1861
|
+
/** Цитата: подряд идущие строки со знаком цитаты. */
|
|
1862
|
+
function readQuote(lines, start) {
|
|
1863
|
+
if (!QUOTE_LINE.test(lines[start])) {
|
|
1864
|
+
return null;
|
|
1865
|
+
}
|
|
1866
|
+
const taken = [];
|
|
1867
|
+
let end = start;
|
|
1868
|
+
while (end < lines.length && QUOTE_LINE.test(lines[end])) {
|
|
1869
|
+
const match = QUOTE_LINE.exec(lines[end]);
|
|
1870
|
+
taken.push(match === null ? '' : match[1]);
|
|
1871
|
+
end += 1;
|
|
1872
|
+
}
|
|
1873
|
+
return { next: end, block: makeBlock(ERtMarkdownBlock.Quote, { content: joinLines(taken) }) };
|
|
1874
|
+
}
|
|
1875
|
+
/** Список: подряд идущие пункты одного рода. */
|
|
1876
|
+
function readList(lines, start) {
|
|
1877
|
+
const ordered = ORDERED_LINE.test(lines[start]);
|
|
1878
|
+
if (!ordered && !BULLET_LINE.test(lines[start])) {
|
|
1879
|
+
return null;
|
|
1880
|
+
}
|
|
1881
|
+
const items = [];
|
|
1882
|
+
let end = start;
|
|
1883
|
+
let item = listItemOf(lines[end], ordered);
|
|
1884
|
+
while (item !== null) {
|
|
1885
|
+
items.push(item);
|
|
1886
|
+
end += 1;
|
|
1887
|
+
item = end < lines.length ? listItemOf(lines[end], ordered) : null;
|
|
1888
|
+
}
|
|
1889
|
+
return { next: end, block: makeBlock(ERtMarkdownBlock.List, { items, ordered }) };
|
|
1890
|
+
}
|
|
1891
|
+
/** Таблица: строка шапки, разделитель под ней и строки значений. */
|
|
1892
|
+
function readTable(lines, start) {
|
|
1893
|
+
const hasDivider = start + 1 < lines.length && isTableDivider(lines[start + 1]);
|
|
1894
|
+
if (!lines[start].includes('|') || !hasDivider) {
|
|
1895
|
+
return null;
|
|
1896
|
+
}
|
|
1897
|
+
const rows = [];
|
|
1898
|
+
let end = start + 2;
|
|
1899
|
+
while (end < lines.length && lines[end].includes('|')) {
|
|
1900
|
+
rows.push(tableCells(lines[end]));
|
|
1901
|
+
end += 1;
|
|
1902
|
+
}
|
|
1903
|
+
return { next: end, block: makeBlock(ERtMarkdownBlock.Table, { head: tableCells(lines[start]), rows }) };
|
|
1904
|
+
}
|
|
1905
|
+
/** Строки, по которым видно, что абзац кончился и начался блок другого рода. */
|
|
1906
|
+
const BLOCK_STARTS = [HEADING_LINE, QUOTE_LINE, BULLET_LINE, ORDERED_LINE];
|
|
1907
|
+
/** Признак того, что строка начинает блок другого рода. */
|
|
1908
|
+
function startsOtherBlock(line) {
|
|
1909
|
+
if (line.trim() === '' || line.startsWith(FENCE)) {
|
|
1910
|
+
return true;
|
|
1911
|
+
}
|
|
1912
|
+
return BLOCK_STARTS.some((start) => start.test(line));
|
|
1913
|
+
}
|
|
1914
|
+
/** Абзац: строки до пустой строки или до начала блока другого рода. */
|
|
1915
|
+
function readParagraph(lines, start) {
|
|
1916
|
+
const taken = [];
|
|
1917
|
+
let end = start;
|
|
1918
|
+
while (end < lines.length && !startsOtherBlock(lines[end])) {
|
|
1919
|
+
taken.push(lines[end]);
|
|
1920
|
+
end += 1;
|
|
1921
|
+
}
|
|
1922
|
+
return { next: end, block: makeBlock(ERtMarkdownBlock.Paragraph, { content: joinLines(taken) }) };
|
|
1923
|
+
}
|
|
1924
|
+
/** Порядок читателей: первым отвечает тот, чью разметку строка несёт. */
|
|
1925
|
+
const BLOCK_READERS = [readCode, readHeading, readTable, readQuote, readList];
|
|
1926
|
+
/** Блок, начинающийся на этой строке. Ничей — значит абзац. */
|
|
1927
|
+
function readBlockAt(lines, start) {
|
|
1928
|
+
for (const reader of BLOCK_READERS) {
|
|
1929
|
+
const read = reader(lines, start);
|
|
1930
|
+
if (read !== null) {
|
|
1931
|
+
return read;
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
return readParagraph(lines, start);
|
|
1935
|
+
}
|
|
1936
|
+
/**
|
|
1937
|
+
* Разбирает текст груза в дерево узлов показа.
|
|
1938
|
+
*
|
|
1939
|
+
* @param source Текст записи. Пустота и отсутствие значения дают пустой список блоков.
|
|
1940
|
+
* @returns Блоки показа по порядку.
|
|
1941
|
+
*/
|
|
1942
|
+
function parseMarkdown(source) {
|
|
1943
|
+
if (source === null || source === undefined || source.trim() === '') {
|
|
1944
|
+
return [];
|
|
1945
|
+
}
|
|
1946
|
+
const lines = source
|
|
1947
|
+
.replace(/\r\n?/g, '\n')
|
|
1948
|
+
.split('\n')
|
|
1949
|
+
.map((line) => line.replace(/\t/g, TAB_WIDTH));
|
|
1950
|
+
const blocks = [];
|
|
1951
|
+
let index = 0;
|
|
1952
|
+
while (index < lines.length) {
|
|
1953
|
+
const read = lines[index].trim() === '' ? null : readBlockAt(lines, index);
|
|
1954
|
+
if (read === null) {
|
|
1955
|
+
index += 1;
|
|
1956
|
+
}
|
|
1957
|
+
else {
|
|
1958
|
+
blocks.push(read.block);
|
|
1959
|
+
index = read.next;
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
return blocks;
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
/** Значение — ровно `true` (флаговые атрибуты). */
|
|
1966
|
+
function isTrue(value) {
|
|
1967
|
+
return value === true;
|
|
1968
|
+
}
|
|
1969
|
+
/** Per-key валидаторы whitelist: ключа нет в карте ⇒ атрибут запрещён. */
|
|
1970
|
+
const ATTR_VALIDATORS = new Map([
|
|
1971
|
+
['bold', isTrue],
|
|
1972
|
+
['italic', isTrue],
|
|
1973
|
+
['underline', isTrue],
|
|
1974
|
+
['strike', isTrue],
|
|
1975
|
+
['blockquote', isTrue],
|
|
1976
|
+
['code-block', isTrue],
|
|
1977
|
+
['list', (value) => value === 'ordered' || value === 'bullet'],
|
|
1978
|
+
['header', (value) => value === 1 || value === 2 || value === 3],
|
|
1979
|
+
]);
|
|
1980
|
+
/** Объект без прототипных сюрпризов — узкая guard-проверка. */
|
|
1981
|
+
function isRecord(value) {
|
|
1982
|
+
return typeof value === 'object' && value !== null;
|
|
1983
|
+
}
|
|
1984
|
+
/** Все ключи атрибутов — из whitelist и с валидным значением. */
|
|
1985
|
+
function isValidAttributes(raw) {
|
|
1986
|
+
return Object.keys(raw).every((key) => {
|
|
1987
|
+
const validate = ATTR_VALIDATORS.get(key);
|
|
1988
|
+
return validate !== undefined && validate(raw[key]);
|
|
1989
|
+
});
|
|
1990
|
+
}
|
|
1991
|
+
/** Нормализует одну op; `null` — если форма нарушена (весь delta тогда отвергается). */
|
|
1992
|
+
function normalizeOp(op) {
|
|
1993
|
+
if (!isRecord(op)) {
|
|
1994
|
+
return null;
|
|
1995
|
+
}
|
|
1996
|
+
const insert = op['insert'];
|
|
1997
|
+
if (typeof insert !== 'string') {
|
|
1998
|
+
return null;
|
|
1999
|
+
}
|
|
2000
|
+
if (Object.keys(op).some((key) => key !== 'insert' && key !== 'attributes')) {
|
|
2001
|
+
return null;
|
|
2002
|
+
}
|
|
2003
|
+
const attrs = op['attributes'];
|
|
2004
|
+
if (attrs === undefined) {
|
|
2005
|
+
return { insert };
|
|
2006
|
+
}
|
|
2007
|
+
if (!isRecord(attrs) || Object.keys(attrs).length === 0 || !isValidAttributes(attrs)) {
|
|
2008
|
+
return null;
|
|
2009
|
+
}
|
|
2010
|
+
return { insert, attributes: attrs };
|
|
2011
|
+
}
|
|
2012
|
+
/**
|
|
2013
|
+
* Приводит сырой вывод Quill 2 к контракту `IQuillDelta`. Quill 2 хранит в
|
|
2014
|
+
* `code-block` язык подсветки (по умолчанию строку `"plain"`), тогда как контракт
|
|
2015
|
+
* и бэк ждут флаг `true`; без приведения бэк отвергает delta как
|
|
2016
|
+
* `invalid_message_delta`. Остальные атрибуты уже в нужной форме — их не трогаем.
|
|
2017
|
+
*/
|
|
2018
|
+
function coerceQuillDeltaOutput(delta) {
|
|
2019
|
+
return {
|
|
2020
|
+
ops: delta.ops.map((op) => {
|
|
2021
|
+
const attrs = op.attributes;
|
|
2022
|
+
const codeBlock = attrs?.['code-block'];
|
|
2023
|
+
if (attrs === undefined || codeBlock === undefined || codeBlock === true) {
|
|
2024
|
+
return op;
|
|
2025
|
+
}
|
|
2026
|
+
return {
|
|
2027
|
+
...op,
|
|
2028
|
+
attributes: { ...op.attributes, 'code-block': true },
|
|
2029
|
+
};
|
|
2030
|
+
}),
|
|
2031
|
+
};
|
|
2032
|
+
}
|
|
2033
|
+
/**
|
|
2034
|
+
* Defensive-нормализация тела rich-сообщения: пропускает только строго валидную
|
|
2035
|
+
* форму (top-level `{ops}`, `ops` непустой массив, `insert` — строка, `attributes`
|
|
2036
|
+
* непустой и из whitelist), иначе `null` — сообщение отрендерится plain-фолбэком
|
|
2037
|
+
* по `message`. Бэк гарантирует форму, но рендер не доверяет входу вслепую.
|
|
2038
|
+
*/
|
|
2039
|
+
function normalizeQuillDelta(raw) {
|
|
2040
|
+
if (!isRecord(raw)) {
|
|
2041
|
+
return null;
|
|
2042
|
+
}
|
|
2043
|
+
const ops = raw['ops'];
|
|
2044
|
+
if (!Array.isArray(ops) || ops.length === 0) {
|
|
2045
|
+
return null;
|
|
2046
|
+
}
|
|
2047
|
+
const clean = [];
|
|
2048
|
+
for (const op of ops) {
|
|
2049
|
+
const normalized = normalizeOp(op);
|
|
2050
|
+
if (normalized === null) {
|
|
2051
|
+
return null;
|
|
2052
|
+
}
|
|
2053
|
+
clean.push(normalized);
|
|
2054
|
+
}
|
|
2055
|
+
return { ops: clean };
|
|
2056
|
+
}
|
|
2057
|
+
|
|
2058
|
+
/**
|
|
2059
|
+
* Тело сообщения чата в rich-формате Quill delta. Форма и whitelist атрибутов
|
|
2060
|
+
* зафиксированы контрактом бэка: только текстовые вставки + ограниченный набор
|
|
2061
|
+
* форматирования, никаких ссылок и вложенных объектов (анонимность).
|
|
2062
|
+
*/
|
|
2063
|
+
|
|
2064
|
+
/** Единый дебаунс полей поиска (мс) — одинаковый по всему киту. */
|
|
2065
|
+
const SEARCH_DEBOUNCE_MS = 300;
|
|
2066
|
+
/**
|
|
2067
|
+
* Дебаунс поля поиска с мгновенным сбросом. Непустой ввод откладывается на
|
|
2068
|
+
* SEARCH_DEBOUNCE_MS (не бить фильтром/запросом на каждый символ), пустое
|
|
2069
|
+
* значение — очистка крестиком или удаление до конца — применяется сразу,
|
|
2070
|
+
* без задержки. Иначе сброс поиска ощущается лагающим.
|
|
2071
|
+
*/
|
|
2072
|
+
function searchDebounce() {
|
|
2073
|
+
return debounce((value) => timer(value.trim() === '' ? 0 : SEARCH_DEBOUNCE_MS));
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
/** Признак материального набора в разметке: атрибут или класс, которые ставит приложение. */
|
|
2077
|
+
const RT_MATERIAL_PRESET_SELECTOR = "[data-preset='material'],.rt-preset-material";
|
|
2078
|
+
/** Класс набора, который несёт узел вне поддерева, где набор объявлен. */
|
|
2079
|
+
const RT_MATERIAL_PRESET_CLASS = 'rt-preset-material';
|
|
2080
|
+
/**
|
|
2081
|
+
* Классы набора для панели наложения, открытой от `origin`. Панель лежит в конце страницы, вне
|
|
2082
|
+
* контейнера с признаком набора, и назначения набора до неё не доходят: она берёт класс набора
|
|
2083
|
+
* сама, если признак стоит над узлом, от которого она открыта. Кит читает признак приложения, а не
|
|
2084
|
+
* ставит свой.
|
|
2085
|
+
*/
|
|
2086
|
+
function materialPresetClassesOf(origin) {
|
|
2087
|
+
return origin.closest(RT_MATERIAL_PRESET_SELECTOR) ? [RT_MATERIAL_PRESET_CLASS] : [];
|
|
2088
|
+
}
|
|
2089
|
+
/**
|
|
2090
|
+
* Классы набора для панели, которую открывает сервис без узла-источника: диалог, боковая панель.
|
|
2091
|
+
* Источником служит узел в фокусе в момент открытия — нажатая кнопка. Панель, открытая не по
|
|
2092
|
+
* нажатию, набор от фокуса не берёт; для неё остаётся `panelClass` приложения.
|
|
2093
|
+
*/
|
|
2094
|
+
function materialPresetClassesOfFocus(document) {
|
|
2095
|
+
const focused = document.activeElement;
|
|
2096
|
+
return focused ? materialPresetClassesOf(focused) : [];
|
|
2097
|
+
}
|
|
2098
|
+
/** Атрибут местного куска темы — его ставит `rtTheme` и читают правила куска в стилях кита. */
|
|
2099
|
+
const RT_THEME_SCOPE_ATTRIBUTE = 'data-theme';
|
|
2100
|
+
/**
|
|
2101
|
+
* Тема местного куска, от которого открыта панель, — значение ближайшего `data-theme` над `origin`.
|
|
2102
|
+
* Панель лежит в конце страницы, вне куска, и без этого рисуется темой страницы: список тёмной
|
|
2103
|
+
* карточки на светлой странице выходил светлым. Тема корня страницы не возвращается: её панель
|
|
2104
|
+
* наследует и так, а признак на панели повторил бы весь набор назначений ещё раз.
|
|
2105
|
+
*/
|
|
2106
|
+
function themeScopeOf(origin) {
|
|
2107
|
+
const scope = origin.closest(`[${RT_THEME_SCOPE_ATTRIBUTE}]`);
|
|
2108
|
+
if (scope === null || scope === origin.ownerDocument.documentElement) {
|
|
2109
|
+
return null;
|
|
2110
|
+
}
|
|
2111
|
+
return scope.getAttribute(RT_THEME_SCOPE_ATTRIBUTE) || null;
|
|
2112
|
+
}
|
|
2113
|
+
function applyThemeScope(pane, theme) {
|
|
2114
|
+
if (theme === null) {
|
|
2115
|
+
pane.removeAttribute(RT_THEME_SCOPE_ATTRIBUTE);
|
|
2116
|
+
}
|
|
2117
|
+
else {
|
|
2118
|
+
pane.setAttribute(RT_THEME_SCOPE_ATTRIBUTE, theme);
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2121
|
+
/**
|
|
2122
|
+
* Переносит тему куска `origin` на коробку панели или снимает её, если кусок ушёл. Зовётся на
|
|
2123
|
+
* каждом открытии: коробка переживает закрытие, а кусок вокруг источника мог смениться.
|
|
2124
|
+
*/
|
|
2125
|
+
function carryThemeScope(pane, origin) {
|
|
2126
|
+
applyThemeScope(pane, themeScopeOf(origin));
|
|
2127
|
+
}
|
|
2128
|
+
/**
|
|
2129
|
+
* Тема местного куска для панели, которую открывает сервис без узла-источника: диалог, боковая
|
|
2130
|
+
* панель. Источником служит узел в фокусе в момент открытия — нажатая кнопка, как у
|
|
2131
|
+
* `materialPresetClassesOfFocus`. Без фокуса, как и под темой корня, возвращает `null`.
|
|
2132
|
+
*/
|
|
2133
|
+
function themeScopeOfFocus(document) {
|
|
2134
|
+
const focused = document.activeElement;
|
|
2135
|
+
return focused ? themeScopeOf(focused) : null;
|
|
2136
|
+
}
|
|
2137
|
+
/**
|
|
2138
|
+
* Переносит на коробку панели тему куска, где стоит фокус. Зовётся до того, как панель заберёт
|
|
2139
|
+
* фокус себе: после этого `activeElement` уже внутри панели, в конце страницы, вне куска.
|
|
2140
|
+
*/
|
|
2141
|
+
function carryThemeScopeOfFocus(pane, document) {
|
|
2142
|
+
applyThemeScope(pane, themeScopeOfFocus(document));
|
|
2143
|
+
}
|
|
2144
|
+
|
|
2145
|
+
/**
|
|
2146
|
+
* Контракты `rt-data-table` — таблицы первого кита во втором, рядом с `rt-table` и вместо неё не
|
|
2147
|
+
* встающей.
|
|
2148
|
+
*
|
|
2149
|
+
* Описание колонки перенесено из первого кита поле в поле, вместе с полями, которых таблица не
|
|
2150
|
+
* рисует: экран приложения переезжает без правок описаний колонок и сохранённых настроек,
|
|
2151
|
+
* меняются только имена. Значения перечислений те же строки, что в первом ките.
|
|
2152
|
+
*/
|
|
2153
|
+
/** Вид колонки: решает, чем рисуется значение ячейки. */
|
|
2154
|
+
var ERtDataTableColumnType;
|
|
2155
|
+
(function (ERtDataTableColumnType) {
|
|
2156
|
+
ERtDataTableColumnType["DATE"] = "date";
|
|
2157
|
+
ERtDataTableColumnType["PERCENT"] = "percent";
|
|
2158
|
+
ERtDataTableColumnType["ARRAY"] = "array";
|
|
2159
|
+
ERtDataTableColumnType["BOOLEAN"] = "boolean";
|
|
2160
|
+
ERtDataTableColumnType["TEXT"] = "text";
|
|
2161
|
+
ERtDataTableColumnType["CURRENCY"] = "currency";
|
|
2162
|
+
ERtDataTableColumnType["CUSTOM"] = "custom";
|
|
2163
|
+
})(ERtDataTableColumnType || (ERtDataTableColumnType = {}));
|
|
2164
|
+
/** Чем колонка отбирает в строке отбора. */
|
|
2165
|
+
var ERtDataTableFilterType;
|
|
2166
|
+
(function (ERtDataTableFilterType) {
|
|
2167
|
+
ERtDataTableFilterType["TEXT"] = "text";
|
|
2168
|
+
ERtDataTableFilterType["NUMBER"] = "number";
|
|
2169
|
+
ERtDataTableFilterType["SELECT"] = "select";
|
|
2170
|
+
ERtDataTableFilterType["DATE"] = "date";
|
|
2171
|
+
})(ERtDataTableFilterType || (ERtDataTableFilterType = {}));
|
|
2172
|
+
/** Цвет значка ячейки. */
|
|
2173
|
+
var ERtDataTableCellColor;
|
|
2174
|
+
(function (ERtDataTableCellColor) {
|
|
2175
|
+
ERtDataTableCellColor["NEUTRAL"] = "neutral";
|
|
2176
|
+
ERtDataTableCellColor["DANGER"] = "danger";
|
|
2177
|
+
ERtDataTableCellColor["WARNING"] = "warning";
|
|
2178
|
+
ERtDataTableCellColor["SUCCESS"] = "success";
|
|
2179
|
+
ERtDataTableCellColor["EMPTY"] = "empty";
|
|
2180
|
+
})(ERtDataTableCellColor || (ERtDataTableCellColor = {}));
|
|
2181
|
+
/**
|
|
2182
|
+
* Класс материального набора на узле. Стоит на хосте семьи и уходит панелям, которые семья открывает
|
|
2183
|
+
* поверх страницы: вне хоста признак вида до них иначе не доходит.
|
|
2184
|
+
*/
|
|
2185
|
+
const RT_PRESET_MATERIAL_CLASS = 'rt-preset-material';
|
|
2186
|
+
/**
|
|
2187
|
+
* Набор оформления таблице даёт узел вокруг неё. Так делает список: класс набора стоит на нём, и
|
|
2188
|
+
* таблица внутри себе класс не ставит. Поставь она его, кусок набора объявил бы на ней весь набор
|
|
2189
|
+
* назначений заново, и значение, заданное приложением на списке, до таблицы бы не дошло.
|
|
2190
|
+
*/
|
|
2191
|
+
const RT_DATA_TABLE_PRESET_FROM_HOST = new InjectionToken('RT_DATA_TABLE_PRESET_FROM_HOST');
|
|
2192
|
+
|
|
2193
|
+
/** Шаги скругления кита — вся шкала, от квадрата до полного круга, по порядку. */
|
|
2194
|
+
const RT_RADIUS_STEPS = ['none', 'xs', 'sm', 'ms', 'md', 'lg', 'xl', '2xl', 'full'];
|
|
2195
|
+
/**
|
|
2196
|
+
* Шаг, который компонент берёт, когда вход скругления пуст.
|
|
2197
|
+
*
|
|
2198
|
+
* Большинству компонентов он не нужен: их скругление по умолчанию стоит в их
|
|
2199
|
+
* собственных стилях. Токен нужен тому, у кого умолчание задаёт приложение, —
|
|
2200
|
+
* кнопке, чья настройка кита называет шаг для всех кнопок сразу.
|
|
2201
|
+
*/
|
|
2202
|
+
const RT_RADIUS_DEFAULT = new InjectionToken('RT_RADIUS_DEFAULT');
|
|
2203
|
+
|
|
2204
|
+
/**
|
|
2205
|
+
* Имена иконок rt-icon. Набор лежит в `assets/icons` пакета, откуда сборка
|
|
2206
|
+
* приложения кладёт его туда, куда указывает `provideRtIcons()`. Большинство
|
|
2207
|
+
* файлов пришло из фрейма iconsLib
|
|
2208
|
+
* (https://www.figma.com/design/x1rxhwomHt1pQRUcM3Zqjb?node-id=2922-7969).
|
|
2209
|
+
*
|
|
2210
|
+
* При добавлении новой иконки: положить SVG в `assets/icons` пакета, добавить
|
|
2211
|
+
* slug сюда, прогнать pnpm exec eslint --fix + pnpm exec prettier --write по этому файлу.
|
|
2212
|
+
* Имя без файла гасит только свой значок: реестр ходит за каждым именем отдельно, и промах
|
|
2213
|
+
* виден пустым местом на экране, а не отказом в прогоне.
|
|
2214
|
+
*
|
|
2215
|
+
* Аннотация типа намеренно не указывается: явный `readonly string[]` потерял бы узкий
|
|
2216
|
+
* литеральный тип, нужный для `IRtIcon.Name` (см. `rt-icon.model.ts`). `as const`
|
|
2217
|
+
* сохраняет литеральные ключи.
|
|
2218
|
+
*/
|
|
2219
|
+
// eslint-disable-next-line @typescript-eslint/typedef -- аннотация стёрла бы литеральный тип, на котором стоит IRtIcon.Name
|
|
2220
|
+
const iconsName = [
|
|
2221
|
+
'alarm-clock',
|
|
2222
|
+
'align-center',
|
|
2223
|
+
'align-justify',
|
|
2224
|
+
'align-left',
|
|
2225
|
+
'align-right',
|
|
2226
|
+
'angle-double-down',
|
|
2227
|
+
'angle-double-left',
|
|
2228
|
+
'angle-double-right',
|
|
2229
|
+
'angle-double-up',
|
|
2230
|
+
'angle-down',
|
|
2231
|
+
'angle-left',
|
|
2232
|
+
'angle-right',
|
|
2233
|
+
'angle-up',
|
|
2234
|
+
'arrow-bottom-old',
|
|
2235
|
+
'arrow-circle-down',
|
|
2236
|
+
'arrow-circle-left',
|
|
2237
|
+
'arrow-circle-right',
|
|
2238
|
+
'arrow-circle-up',
|
|
2239
|
+
'arrow-down',
|
|
2240
|
+
'arrow-down-left',
|
|
2241
|
+
'arrow-down-long',
|
|
2242
|
+
'arrow-down-right',
|
|
2243
|
+
'arrow-left',
|
|
2244
|
+
'arrow-left-old',
|
|
2245
|
+
'arrow-leftlong',
|
|
2246
|
+
'arrow-right',
|
|
2247
|
+
'arrow-right-old',
|
|
2248
|
+
'arrow-rightlong',
|
|
2249
|
+
'arrow-top-old',
|
|
2250
|
+
'arrow-up',
|
|
2251
|
+
'arrow-up-left',
|
|
2252
|
+
'arrow-up-long',
|
|
2253
|
+
'arrow-up-right',
|
|
2254
|
+
'arrows',
|
|
2255
|
+
'arrows-h',
|
|
2256
|
+
'arrows-v',
|
|
2257
|
+
'at',
|
|
2258
|
+
'attach-docx-doc',
|
|
2259
|
+
'attach-eml',
|
|
2260
|
+
'attach-folder',
|
|
2261
|
+
'attach-jpg-png',
|
|
2262
|
+
'attach-msg',
|
|
2263
|
+
'attach-other',
|
|
2264
|
+
'attach-pdf',
|
|
2265
|
+
'attach-ppt-pptx',
|
|
2266
|
+
'attach-txt',
|
|
2267
|
+
'attach-webp',
|
|
2268
|
+
'attach-xlsx-xls',
|
|
2269
|
+
'attach-zip-rar',
|
|
2270
|
+
'ban',
|
|
2271
|
+
'bars',
|
|
2272
|
+
'bell',
|
|
2273
|
+
'bolt',
|
|
2274
|
+
'book',
|
|
2275
|
+
'bookmark',
|
|
2276
|
+
'bookmark-fill',
|
|
2277
|
+
'bot',
|
|
2278
|
+
'box',
|
|
2279
|
+
'briefcase',
|
|
2280
|
+
'building',
|
|
2281
|
+
'burger',
|
|
2282
|
+
'calendar',
|
|
2283
|
+
'calendar-minus',
|
|
2284
|
+
'calendar-plus',
|
|
2285
|
+
'calendar-times',
|
|
2286
|
+
'camera',
|
|
2287
|
+
'chart-bar',
|
|
2288
|
+
'chart-line',
|
|
2289
|
+
'chart-line-2',
|
|
2290
|
+
'chart-pie',
|
|
2291
|
+
'chat-error',
|
|
2292
|
+
'check',
|
|
2293
|
+
'check-circle',
|
|
2294
|
+
'check-double',
|
|
2295
|
+
'check-square',
|
|
2296
|
+
'chevron-circle-down',
|
|
2297
|
+
'chevron-circle-left',
|
|
2298
|
+
'chevron-circle-right',
|
|
2299
|
+
'chevron-circle-up',
|
|
2300
|
+
'chevron-down',
|
|
2301
|
+
'chevron-left',
|
|
2302
|
+
'chevron-right',
|
|
2303
|
+
'chevron-up',
|
|
2304
|
+
'chevron-up-down',
|
|
2305
|
+
'clock',
|
|
2306
|
+
'clone',
|
|
2307
|
+
'close',
|
|
2308
|
+
'cloud',
|
|
2309
|
+
'cloud-download',
|
|
2310
|
+
'cloud-upload',
|
|
2311
|
+
'code',
|
|
2312
|
+
'cog',
|
|
2313
|
+
'comment',
|
|
2314
|
+
'comments',
|
|
2315
|
+
'copy',
|
|
2316
|
+
'credit-card',
|
|
2317
|
+
'database',
|
|
2318
|
+
'desktop',
|
|
2319
|
+
'directions',
|
|
2320
|
+
'directions-alt',
|
|
2321
|
+
'doc-success',
|
|
2322
|
+
'docBox',
|
|
2323
|
+
'ellipsis-h',
|
|
2324
|
+
'ellipsis-v',
|
|
2325
|
+
'email',
|
|
2326
|
+
'equals',
|
|
2327
|
+
'exclamation-circle',
|
|
2328
|
+
'external-link',
|
|
2329
|
+
'eye',
|
|
2330
|
+
'eye-slash',
|
|
2331
|
+
'file',
|
|
2332
|
+
'file-excel',
|
|
2333
|
+
'file-o',
|
|
2334
|
+
'file-pdf',
|
|
2335
|
+
'filter',
|
|
2336
|
+
'filter-fill',
|
|
2337
|
+
'filter-slash',
|
|
2338
|
+
'flag',
|
|
2339
|
+
'flag-fill',
|
|
2340
|
+
'flagman-a',
|
|
2341
|
+
'flagman-b',
|
|
2342
|
+
'flagman-c',
|
|
2343
|
+
'flagman-q',
|
|
2344
|
+
'folder',
|
|
2345
|
+
'folder-open',
|
|
2346
|
+
'fork-spoon',
|
|
2347
|
+
'fullscreen',
|
|
2348
|
+
'globe',
|
|
2349
|
+
'groupen',
|
|
2350
|
+
'hashtag',
|
|
2351
|
+
'heart',
|
|
2352
|
+
'heart-fill',
|
|
2353
|
+
'help',
|
|
2354
|
+
'history',
|
|
2355
|
+
'historyUpdate',
|
|
2356
|
+
'home',
|
|
2357
|
+
'ico-age',
|
|
2358
|
+
'ico-alert',
|
|
2359
|
+
'ico-b',
|
|
2360
|
+
'ico-babyPacifier',
|
|
2361
|
+
'ico-bank',
|
|
2362
|
+
'ico-bill',
|
|
2363
|
+
'ico-bill-striked',
|
|
2364
|
+
'ico-bookmark-right',
|
|
2365
|
+
'ico-books',
|
|
2366
|
+
'ico-burger',
|
|
2367
|
+
'ico-businessman',
|
|
2368
|
+
'ico-c',
|
|
2369
|
+
'ico-calendar',
|
|
2370
|
+
'ico-case',
|
|
2371
|
+
'ico-change',
|
|
2372
|
+
'ico-change-2',
|
|
2373
|
+
'ico-check',
|
|
2374
|
+
'ico-checked',
|
|
2375
|
+
'ico-checked-alert',
|
|
2376
|
+
'ico-cheker',
|
|
2377
|
+
'ico-chevron',
|
|
2378
|
+
'ico-chevron-down',
|
|
2379
|
+
'ico-close',
|
|
2380
|
+
'ico-config',
|
|
2381
|
+
'ico-contragents',
|
|
2382
|
+
'ico-control',
|
|
2383
|
+
'ico-copy',
|
|
2384
|
+
'ico-counterparty',
|
|
2385
|
+
'ico-coworkers',
|
|
2386
|
+
'ico-debt',
|
|
2387
|
+
'ico-director',
|
|
2388
|
+
'ico-doc',
|
|
2389
|
+
'ico-docDocprimary',
|
|
2390
|
+
'ico-docs',
|
|
2391
|
+
'ico-door',
|
|
2392
|
+
'ico-dotted-more-horizontal',
|
|
2393
|
+
'ico-doubleArrows',
|
|
2394
|
+
'ico-download',
|
|
2395
|
+
'ico-eagle',
|
|
2396
|
+
'ico-edit',
|
|
2397
|
+
'ico-edo',
|
|
2398
|
+
'ico-email',
|
|
2399
|
+
'ico-email1',
|
|
2400
|
+
'ico-error',
|
|
2401
|
+
'ico-exit',
|
|
2402
|
+
'ico-eye',
|
|
2403
|
+
'ico-eyeClose',
|
|
2404
|
+
'ico-faq',
|
|
2405
|
+
'ico-farm',
|
|
2406
|
+
'ico-filter',
|
|
2407
|
+
'ico-fine',
|
|
2408
|
+
'ico-gasket',
|
|
2409
|
+
'ico-generator',
|
|
2410
|
+
'ico-grade',
|
|
2411
|
+
'ico-grade-2',
|
|
2412
|
+
'ico-ground-area-transport',
|
|
2413
|
+
'ico-groundArea',
|
|
2414
|
+
'ico-groupen',
|
|
2415
|
+
'ico-hands',
|
|
2416
|
+
'ico-help',
|
|
2417
|
+
'ico-ico-history',
|
|
2418
|
+
'ico-info',
|
|
2419
|
+
'ico-infoFill',
|
|
2420
|
+
'ico-invite',
|
|
2421
|
+
'ico-key',
|
|
2422
|
+
'ico-keyFill',
|
|
2423
|
+
'ico-letter',
|
|
2424
|
+
'ico-level',
|
|
2425
|
+
'ico-level-down',
|
|
2426
|
+
'ico-level-up',
|
|
2427
|
+
'ico-licence',
|
|
2428
|
+
'ico-limit',
|
|
2429
|
+
'ico-link',
|
|
2430
|
+
'ico-link-2',
|
|
2431
|
+
'ico-listadd',
|
|
2432
|
+
'ico-listing',
|
|
2433
|
+
'ico-lock',
|
|
2434
|
+
'ico-locked',
|
|
2435
|
+
'ico-megafon',
|
|
2436
|
+
'ico-new-window',
|
|
2437
|
+
'ico-notification',
|
|
2438
|
+
'ico-notificationOff',
|
|
2439
|
+
'ico-percent-alert',
|
|
2440
|
+
'ico-plus',
|
|
2441
|
+
'ico-referal',
|
|
2442
|
+
'ico-repeat',
|
|
2443
|
+
'ico-reset',
|
|
2444
|
+
'ico-return',
|
|
2445
|
+
'ico-search',
|
|
2446
|
+
'ico-setting',
|
|
2447
|
+
'ico-settings',
|
|
2448
|
+
'ico-site',
|
|
2449
|
+
'ico-snowflake',
|
|
2450
|
+
'ico-spec',
|
|
2451
|
+
'ico-statement',
|
|
2452
|
+
'ico-subuser',
|
|
2453
|
+
'ico-sun',
|
|
2454
|
+
'ico-sunrise',
|
|
2455
|
+
'ico-support',
|
|
2456
|
+
'ico-target',
|
|
2457
|
+
'ico-team',
|
|
2458
|
+
'ico-tech',
|
|
2459
|
+
'ico-telegram',
|
|
2460
|
+
'ico-time',
|
|
2461
|
+
'ico-trash',
|
|
2462
|
+
'ico-try',
|
|
2463
|
+
'ico-txt',
|
|
2464
|
+
'ico-unlock',
|
|
2465
|
+
'ico-upload',
|
|
2466
|
+
'ico-user',
|
|
2467
|
+
'ico-user-2',
|
|
2468
|
+
'ico-users',
|
|
2469
|
+
'ico-users-2',
|
|
2470
|
+
'ico-video-play',
|
|
2471
|
+
'ico-warning',
|
|
2472
|
+
'ico-warranty',
|
|
2473
|
+
'ico-warranty-shield',
|
|
2474
|
+
'ico-xml',
|
|
2475
|
+
'id-card',
|
|
2476
|
+
'image',
|
|
2477
|
+
'images',
|
|
2478
|
+
'inbox',
|
|
2479
|
+
'info',
|
|
2480
|
+
'info-circle',
|
|
2481
|
+
'layers',
|
|
2482
|
+
'link',
|
|
2483
|
+
'list',
|
|
2484
|
+
'lock',
|
|
2485
|
+
'lock-open',
|
|
2486
|
+
'map',
|
|
2487
|
+
'mapYandex',
|
|
2488
|
+
'microsoft',
|
|
2489
|
+
'minus',
|
|
2490
|
+
'minus-circle',
|
|
2491
|
+
'mobile',
|
|
2492
|
+
'money-bill',
|
|
2493
|
+
'moon',
|
|
2494
|
+
'paperclip',
|
|
2495
|
+
'pause',
|
|
2496
|
+
'pencil',
|
|
2497
|
+
'percentage',
|
|
2498
|
+
'phone',
|
|
2499
|
+
'pie-chart',
|
|
2500
|
+
'pin',
|
|
2501
|
+
'plus-circle',
|
|
2502
|
+
'power-off',
|
|
2503
|
+
'print',
|
|
2504
|
+
'qrcode',
|
|
2505
|
+
'question-circle',
|
|
2506
|
+
'refresh',
|
|
2507
|
+
'replay',
|
|
2508
|
+
'reply',
|
|
2509
|
+
'reset',
|
|
2510
|
+
'search',
|
|
2511
|
+
'search-minus',
|
|
2512
|
+
'search-plus',
|
|
2513
|
+
'send',
|
|
2514
|
+
'server',
|
|
2515
|
+
'share-alt',
|
|
2516
|
+
'shield',
|
|
2517
|
+
'sitemap',
|
|
2518
|
+
'sliders-v',
|
|
2519
|
+
'social-facebook',
|
|
2520
|
+
'social-instagram',
|
|
2521
|
+
'social-kakaotalk',
|
|
2522
|
+
'social-line',
|
|
2523
|
+
'social-naver',
|
|
2524
|
+
'social-pinterest',
|
|
2525
|
+
'social-tiktok',
|
|
2526
|
+
'social-vk',
|
|
2527
|
+
'social-wechat',
|
|
2528
|
+
'social-x',
|
|
2529
|
+
'social-xiaohongshu',
|
|
2530
|
+
'social-youtube',
|
|
2531
|
+
'sort-alpha-alt-down',
|
|
2532
|
+
'sort-alpha-alt-up',
|
|
2533
|
+
'sort-alpha-down',
|
|
2534
|
+
'sort-alpha-up',
|
|
2535
|
+
'sort-alt',
|
|
2536
|
+
'sort-alt-slash',
|
|
2537
|
+
'sort-amount-down',
|
|
2538
|
+
'sort-amount-down-alt',
|
|
2539
|
+
'sort-amount-up',
|
|
2540
|
+
'sort-amount-up-alt',
|
|
2541
|
+
'sort-numeric-alt-down',
|
|
2542
|
+
'sort-numeric-alt-up',
|
|
2543
|
+
'sort-numeric-down',
|
|
2544
|
+
'sort-numeric-up',
|
|
2545
|
+
'spinner',
|
|
2546
|
+
'star',
|
|
2547
|
+
'star-fill',
|
|
2548
|
+
'stock',
|
|
2549
|
+
'stop',
|
|
2550
|
+
'sync',
|
|
2551
|
+
'table',
|
|
2552
|
+
'tablet',
|
|
2553
|
+
'tag',
|
|
2554
|
+
'tags',
|
|
2555
|
+
'telegram',
|
|
2556
|
+
'th-large',
|
|
2557
|
+
'ticket',
|
|
2558
|
+
'times-circle',
|
|
2559
|
+
'trash',
|
|
2560
|
+
'troubleshoot',
|
|
2561
|
+
'undo',
|
|
2562
|
+
'unlock',
|
|
2563
|
+
'user',
|
|
2564
|
+
'user-edit',
|
|
2565
|
+
'user-minus',
|
|
2566
|
+
'user-off',
|
|
2567
|
+
'user-plus',
|
|
2568
|
+
'users',
|
|
2569
|
+
'video',
|
|
2570
|
+
'volume-down',
|
|
2571
|
+
'volume-off',
|
|
2572
|
+
'volume-up',
|
|
2573
|
+
'wallet',
|
|
2574
|
+
'warning',
|
|
2575
|
+
'wifi',
|
|
2576
|
+
'window-maximize',
|
|
2577
|
+
'window-minimize',
|
|
2578
|
+
];
|
|
2579
|
+
|
|
2580
|
+
/**
|
|
2581
|
+
* Ядро кита: настройки, словари, среда исполнения, токены, чистые функции и модели,
|
|
2582
|
+
* на которых стоят настройки. Компоненты берут это отсюда, друг у друга — через свои точки входа.
|
|
2583
|
+
*/
|
|
2584
|
+
|
|
2585
|
+
/**
|
|
2586
|
+
* Generated bundle index. Do not edit.
|
|
2587
|
+
*/
|
|
2588
|
+
|
|
2589
|
+
export { BreakpointsService, ERtDataTableCellColor, ERtDataTableColumnType, ERtDataTableFilterType, ERtMarkdownBlock, ERtMarkdownInline, ERtStorageKeys, MessageBus, NotificationBus, RT_CONSUMER_HANDLE_NAMES, RT_DATA_TABLE_PRESET_FROM_HOST, RT_DESIGN_TOKEN_NAMES, RT_KIT_CONFIG, RT_KIT_LABELS, RT_KIT_LABELS_EN, RT_KIT_LOCALE, RT_KIT_TRANSLATOR, RT_MATERIAL_PRESET_CLASS, RT_MATERIAL_PRESET_SELECTOR, RT_PRESET_MATERIAL_CLASS, RT_RADIUS_DEFAULT, RT_RADIUS_STEPS, RT_THEME_SCOPE_ATTRIBUTE, RtDayStampPipe, RtInfiniteScrollDirective, RtKitLabelPipe, RtThemeScopeDirective, SEARCH_DEBOUNCE_MS, ThemeService, breakNode, carryThemeScope, carryThemeScopeOfFocus, coerceQuillDeltaOutput, fileNameFromUrl, formatFileSize, iconsName, materialPresetClassesOf, materialPresetClassesOfFocus, normalizeQuillDelta, parseInline, parseMarkdown, provideRtKit, provideRtKitLabels, rtKitDefault, rtKitLabel, searchDebounce, themeScopeOf, themeScopeOfFocus };
|
|
2590
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-core.mjs.map
|