@rt-tools/ui-kit-v2 0.41.0 → 0.43.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/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +4 -4
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +22 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +155 -100
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1778 -18
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +22 -5
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +34 -11
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +725 -47
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +6 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +217 -6
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/calendar/CONTEXT.md +4 -2
- package/src/lib/components/calendar/rt-calendar.component.scss +29 -2
- package/src/lib/components/date-picker/CONTEXT.md +5 -0
- package/src/lib/components/date-picker/panel/CONTEXT.md +42 -0
- package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +55 -2
- package/src/lib/components/page-header/CONTEXT.md +35 -1
- package/src/lib/components/page-header/bar/rt-page-bar.component.scss +161 -0
- package/src/lib/components/page-header/rail/rt-page-actions.component.scss +115 -0
- package/src/lib/components/page-header/rail/rt-page-phone-menu.component.scss +129 -0
- package/src/lib/components/page-header/rail/rt-page-rail.component.scss +281 -0
- package/src/lib/components/page-header/rail/rt-page-user.component.scss +76 -0
- package/src/lib/components/page-header/rt-page-header.component.scss +5 -0
- package/src/lib/components/page-header/stories/component/test-page-header-vertical.component.scss +72 -0
- package/src/lib/components/page-header/stories/component/test-page-table.component.scss +81 -0
- package/src/lib/components/page-header/user/rt-page-header-user.component.scss +6 -0
- package/src/lib/components/stepper/CONTEXT.md +34 -2
- package/src/lib/components/stepper/rt-stepper.component.scss +62 -43
- package/src/lib/components/tabs/CONTEXT.md +30 -1
- package/src/lib/components/tabs/rt-tabs-arrows.scss +140 -0
- package/src/lib/components/tabs/rt-tabs-more-menu.scss +126 -0
- package/src/lib/components/tabs/rt-tabs-more.component.scss +29 -0
- package/src/lib/components/tabs/rt-tabs.component.scss +18 -61
- package/src/lib/components/workspace/CONTEXT.md +11 -1
- package/src/lib/components/workspace/rt-workspace.component.scss +51 -3
- package/src/rich-editor/lib/components/chat/CONTEXT.md +12 -2
- package/src/rich-editor/lib/components/chat/rt-chat-messenger.scss +9 -3
- package/src/rich-editor/lib/components/chat/rt-chat-translation.scss +92 -0
- package/types/rt-tools-ui-kit-v2-calendar.d.ts +13 -1
- package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-date-picker.d.ts +157 -5
- package/types/rt-tools-ui-kit-v2-page-header.d.ts +202 -2
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +25 -0
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +20 -6
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +120 -1
- package/types/rt-tools-ui-kit-v2-workspace.d.ts +33 -1
|
@@ -42,6 +42,31 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
42
42
|
args: [{ selector: "ng-template[rtStepLabel]" }]
|
|
43
43
|
}]
|
|
44
44
|
});
|
|
45
|
+
const HALF_BAR = .5;
|
|
46
|
+
function labelSegment(index, total) {
|
|
47
|
+
if (total <= 1 || index <= 0) return {
|
|
48
|
+
start: 0,
|
|
49
|
+
size: 100,
|
|
50
|
+
anchor: "start"
|
|
51
|
+
};
|
|
52
|
+
if (index >= total - 1) return {
|
|
53
|
+
start: 0,
|
|
54
|
+
size: 100,
|
|
55
|
+
anchor: "end"
|
|
56
|
+
};
|
|
57
|
+
const share = index / (total - 1);
|
|
58
|
+
const size = Math.min(2 * share, 2 - 2 * share);
|
|
59
|
+
if (size < HALF_BAR) return {
|
|
60
|
+
start: 0,
|
|
61
|
+
size: 100,
|
|
62
|
+
anchor: share < HALF_BAR ? "start" : "end"
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
start: Math.max(0, 2 * share - 1) * 100,
|
|
66
|
+
size: size * 100,
|
|
67
|
+
anchor: "center"
|
|
68
|
+
};
|
|
69
|
+
}
|
|
45
70
|
const BEM_BLOCK = "rt-stepper";
|
|
46
71
|
function stepState(index, current) {
|
|
47
72
|
if (current < 0) return "neutral";
|
|
@@ -71,13 +96,11 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
71
96
|
state: stepState(index, current)
|
|
72
97
|
}));
|
|
73
98
|
}, ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
74
|
-
this.
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return "center";
|
|
80
|
-
}, ...ngDevMode ? [{ debugName: "labelAnchor" }] : /* istanbul ignore next */ []);
|
|
99
|
+
this.labelSegment = computed(() => labelSegment(this.#safeIndex(), this.steps().length), ...ngDevMode ? [{ debugName: "labelSegment" }] : /* istanbul ignore next */ []);
|
|
100
|
+
this.points = computed(() => {
|
|
101
|
+
const current = this.#safeIndex();
|
|
102
|
+
return this.steps().map((_step, index) => stepState(index, current));
|
|
103
|
+
}, ...ngDevMode ? [{ debugName: "points" }] : /* istanbul ignore next */ []);
|
|
81
104
|
this.descriptionParagraphs = computed(() => {
|
|
82
105
|
const text = this.currentStep()?.description ?? "";
|
|
83
106
|
if (text.length === 0) return [];
|
|
@@ -147,8 +170,8 @@ var RtStepperComponent = class RtStepperComponent {
|
|
|
147
170
|
inputs: ["radius", "radius"]
|
|
148
171
|
}],
|
|
149
172
|
ngImport: i0,
|
|
150
|
-
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p
|
|
151
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-point-shadow
|
|
173
|
+
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n @let segment = labelSegment();\n <p\n rtElem=\"label\"\n qa-dataid=\"stepper-label\"\n [rtMod]=\"{ anchor: segment.anchor }\"\n [style.margin-inline-start.%]=\"segment.start\"\n [style.inline-size.%]=\"segment.size\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"line\" aria-hidden=\"true\">\n <span rtElem=\"track\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" [style.width.%]=\"progressPercent()\"></span>\n </span>\n <ul rtElem=\"points\">\n @for (state of points(); track $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: state === 'current',\n complete: state === 'complete',\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n",
|
|
174
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-halo: var(--rt-stepper-point-shadow, var(--rt-shadow-step-indicator));--rt-stepper-transition-duration: var(--rt-duration-fast);display:flex;flex-direction:column;gap:var(--rt-space-4)}rt-stepper .rt-stepper__rail{display:flex;flex-direction:column;padding-inline:var(--rt-stepper-inset, 0)}rt-stepper .rt-stepper__label{margin:0;color:var(--rt-stepper-label-color, var(--rt-stepper-current-color, var(--rt-color-stepper-current)));font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-normal);overflow-wrap:anywhere;transition:margin-inline-start var(--rt-stepper-transition-duration) ease-out,inline-size var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__label--anchor--start{text-align:start}rt-stepper .rt-stepper__label--anchor--center{text-align:center}rt-stepper .rt-stepper__label--anchor--end{text-align:end}rt-stepper .rt-stepper__track-band{position:relative;display:flex;align-items:flex-end;block-size:21px}rt-stepper .rt-stepper__line{position:absolute;block-size:2px;inset-block-end:7px;inset-inline:4px}rt-stepper .rt-stepper__track,rt-stepper .rt-stepper__progress{position:absolute;border-radius:var(--rt-stepper-radius);inset-block:0;inset-inline-start:0}rt-stepper .rt-stepper__track{background:var(--rt-stepper-track-color, var(--rt-color-stepper-track));inset-inline-end:0}rt-stepper .rt-stepper__progress{background:var(--rt-stepper-progress-color, var(--rt-color-stepper-progress));transition:width var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__points{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0;margin:0;inline-size:100%;list-style:none}rt-stepper .rt-stepper__point{border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-track-color, var(--rt-color-stepper-track));block-size:8px;inline-size:8px;transition:inline-size var(--rt-stepper-transition-duration) ease-out,block-size var(--rt-stepper-transition-duration) ease-out,background var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__point--complete{background:var(--rt-stepper-progress-color, var(--rt-color-stepper-progress))}rt-stepper .rt-stepper__point--current{background:var(--rt-stepper-current-color, var(--rt-color-stepper-current));block-size:16px;box-shadow:var(--rt-stepper-halo);inline-size:16px}rt-stepper .rt-stepper__description{margin:0;color:var(--rt-stepper-description-color, var(--rt-color-text-primary));font-size:var(--rt-text-xs);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}rt-stepper .rt-stepper__description+rt-stepper .rt-stepper__description{margin-block-start:var(--rt-space-2)}rt-stepper.rt-stepper--vertical>.rt-stepper{--rt-stepper-mark-size: var(--rt-size-6);--rt-stepper-mark-font-size: var(--rt-text-xs);--rt-stepper-mark-bg: var(--rt-stepper-mark-neutral-bg, var(--rt-color-text-muted));--rt-stepper-mark-color: var(--rt-stepper-mark-neutral-color, var(--rt-color-text-inverse));--rt-stepper-line-width: var(--rt-border-width-thin);--rt-stepper-item-gap: var(--rt-space-6);padding:0;margin:0;gap:0;list-style:none}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item{position:relative;display:flex;align-items:flex-start;gap:var(--rt-space-4);padding-block-end:var(--rt-stepper-item-gap)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:last-child{padding-block-end:0}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:not(:last-child):after{position:absolute;background:var(--rt-stepper-line-color, var(--rt-color-border-default));content:\"\";inline-size:var(--rt-stepper-line-width);inset-block:calc(var(--rt-stepper-mark-size) + var(--rt-space-1)) var(--rt-space-1);inset-inline-start:calc((var(--rt-stepper-mark-size) - var(--rt-stepper-line-width)) / 2)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--complete{--rt-stepper-mark-bg: var( --rt-stepper-mark-complete-bg, var(--rt-stepper-progress-color, var(--rt-color-stepper-progress)) );--rt-stepper-mark-color: var(--rt-stepper-mark-complete-color, var(--rt-color-text-inverse))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--current{--rt-stepper-mark-bg: var( --rt-stepper-mark-current-bg, var(--rt-stepper-current-color, var(--rt-color-stepper-current)) );--rt-stepper-mark-color: var(--rt-stepper-mark-current-color, var(--rt-neutral-950))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--upcoming{--rt-stepper-mark-bg: var(--rt-stepper-mark-upcoming-bg, var(--rt-stepper-track-color, var(--rt-color-stepper-track)));--rt-stepper-mark-color: var(--rt-stepper-mark-upcoming-color, var(--rt-color-text-primary))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__mark{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-mark-bg);block-size:var(--rt-stepper-mark-size);color:var(--rt-stepper-mark-color);font-size:var(--rt-stepper-mark-font-size);font-weight:var(--rt-font-weight-medium);inline-size:var(--rt-stepper-mark-size);line-height:1}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__body{display:flex;min-width:0;flex-direction:column;gap:var(--rt-space-1);padding-block-start:var(--rt-space-1)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-label{color:var(--rt-stepper-step-label-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);line-height:var(--rt-leading-snug);overflow-wrap:anywhere}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-description{margin:0;color:var(--rt-stepper-step-description-color, var(--rt-color-text-muted));font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug)}rt-stepper[data-rt-radius=none]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-none)}rt-stepper[data-rt-radius=xs]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xs)}rt-stepper[data-rt-radius=sm]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-sm)}rt-stepper[data-rt-radius=ms]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-ms)}rt-stepper[data-rt-radius=md]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-md)}rt-stepper[data-rt-radius=lg]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-lg)}rt-stepper[data-rt-radius=xl]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xl)}rt-stepper[data-rt-radius=\"2xl\"]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-2xl)}rt-stepper[data-rt-radius=full]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-full)}}\n"],
|
|
152
175
|
dependencies: [
|
|
153
176
|
{
|
|
154
177
|
kind: "directive",
|
|
@@ -208,8 +231,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
208
231
|
class: BEM_BLOCK,
|
|
209
232
|
"[class.rt-stepper--vertical]": "orientation() === 'vertical'"
|
|
210
233
|
},
|
|
211
|
-
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p
|
|
212
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-point-shadow
|
|
234
|
+
template: "@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n @let segment = labelSegment();\n <p\n rtElem=\"label\"\n qa-dataid=\"stepper-label\"\n [rtMod]=\"{ anchor: segment.anchor }\"\n [style.margin-inline-start.%]=\"segment.start\"\n [style.inline-size.%]=\"segment.size\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"line\" aria-hidden=\"true\">\n <span rtElem=\"track\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" [style.width.%]=\"progressPercent()\"></span>\n </span>\n <ul rtElem=\"points\">\n @for (state of points(); track $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: state === 'current',\n complete: state === 'complete',\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n",
|
|
235
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stepper{display:block}rt-stepper .rt-stepper{--rt-stepper-radius: var(--rt-radius-full);--rt-stepper-halo: var(--rt-stepper-point-shadow, var(--rt-shadow-step-indicator));--rt-stepper-transition-duration: var(--rt-duration-fast);display:flex;flex-direction:column;gap:var(--rt-space-4)}rt-stepper .rt-stepper__rail{display:flex;flex-direction:column;padding-inline:var(--rt-stepper-inset, 0)}rt-stepper .rt-stepper__label{margin:0;color:var(--rt-stepper-label-color, var(--rt-stepper-current-color, var(--rt-color-stepper-current)));font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-regular);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-normal);overflow-wrap:anywhere;transition:margin-inline-start var(--rt-stepper-transition-duration) ease-out,inline-size var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__label--anchor--start{text-align:start}rt-stepper .rt-stepper__label--anchor--center{text-align:center}rt-stepper .rt-stepper__label--anchor--end{text-align:end}rt-stepper .rt-stepper__track-band{position:relative;display:flex;align-items:flex-end;block-size:21px}rt-stepper .rt-stepper__line{position:absolute;block-size:2px;inset-block-end:7px;inset-inline:4px}rt-stepper .rt-stepper__track,rt-stepper .rt-stepper__progress{position:absolute;border-radius:var(--rt-stepper-radius);inset-block:0;inset-inline-start:0}rt-stepper .rt-stepper__track{background:var(--rt-stepper-track-color, var(--rt-color-stepper-track));inset-inline-end:0}rt-stepper .rt-stepper__progress{background:var(--rt-stepper-progress-color, var(--rt-color-stepper-progress));transition:width var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__points{position:relative;display:flex;align-items:center;justify-content:space-between;padding:0;margin:0;inline-size:100%;list-style:none}rt-stepper .rt-stepper__point{border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-track-color, var(--rt-color-stepper-track));block-size:8px;inline-size:8px;transition:inline-size var(--rt-stepper-transition-duration) ease-out,block-size var(--rt-stepper-transition-duration) ease-out,background var(--rt-stepper-transition-duration) ease-out}rt-stepper .rt-stepper__point--complete{background:var(--rt-stepper-progress-color, var(--rt-color-stepper-progress))}rt-stepper .rt-stepper__point--current{background:var(--rt-stepper-current-color, var(--rt-color-stepper-current));block-size:16px;box-shadow:var(--rt-stepper-halo);inline-size:16px}rt-stepper .rt-stepper__description{margin:0;color:var(--rt-stepper-description-color, var(--rt-color-text-primary));font-size:var(--rt-text-xs);letter-spacing:var(--rt-letter-spacing-wide);line-height:var(--rt-leading-snug)}rt-stepper .rt-stepper__description+rt-stepper .rt-stepper__description{margin-block-start:var(--rt-space-2)}rt-stepper.rt-stepper--vertical>.rt-stepper{--rt-stepper-mark-size: var(--rt-size-6);--rt-stepper-mark-font-size: var(--rt-text-xs);--rt-stepper-mark-bg: var(--rt-stepper-mark-neutral-bg, var(--rt-color-text-muted));--rt-stepper-mark-color: var(--rt-stepper-mark-neutral-color, var(--rt-color-text-inverse));--rt-stepper-line-width: var(--rt-border-width-thin);--rt-stepper-item-gap: var(--rt-space-6);padding:0;margin:0;gap:0;list-style:none}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item{position:relative;display:flex;align-items:flex-start;gap:var(--rt-space-4);padding-block-end:var(--rt-stepper-item-gap)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:last-child{padding-block-end:0}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item:not(:last-child):after{position:absolute;background:var(--rt-stepper-line-color, var(--rt-color-border-default));content:\"\";inline-size:var(--rt-stepper-line-width);inset-block:calc(var(--rt-stepper-mark-size) + var(--rt-space-1)) var(--rt-space-1);inset-inline-start:calc((var(--rt-stepper-mark-size) - var(--rt-stepper-line-width)) / 2)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--complete{--rt-stepper-mark-bg: var( --rt-stepper-mark-complete-bg, var(--rt-stepper-progress-color, var(--rt-color-stepper-progress)) );--rt-stepper-mark-color: var(--rt-stepper-mark-complete-color, var(--rt-color-text-inverse))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--current{--rt-stepper-mark-bg: var( --rt-stepper-mark-current-bg, var(--rt-stepper-current-color, var(--rt-color-stepper-current)) );--rt-stepper-mark-color: var(--rt-stepper-mark-current-color, var(--rt-neutral-950))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__item--state--upcoming{--rt-stepper-mark-bg: var(--rt-stepper-mark-upcoming-bg, var(--rt-stepper-track-color, var(--rt-color-stepper-track)));--rt-stepper-mark-color: var(--rt-stepper-mark-upcoming-color, var(--rt-color-text-primary))}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__mark{display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;border-radius:var(--rt-stepper-radius);background:var(--rt-stepper-mark-bg);block-size:var(--rt-stepper-mark-size);color:var(--rt-stepper-mark-color);font-size:var(--rt-stepper-mark-font-size);font-weight:var(--rt-font-weight-medium);inline-size:var(--rt-stepper-mark-size);line-height:1}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__body{display:flex;min-width:0;flex-direction:column;gap:var(--rt-space-1);padding-block-start:var(--rt-space-1)}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-label{color:var(--rt-stepper-step-label-color, var(--rt-color-text-primary));font-size:var(--rt-text-sm);line-height:var(--rt-leading-snug);overflow-wrap:anywhere}rt-stepper.rt-stepper--vertical>.rt-stepper .rt-stepper__step-description{margin:0;color:var(--rt-stepper-step-description-color, var(--rt-color-text-muted));font-size:var(--rt-text-xs);line-height:var(--rt-leading-snug)}rt-stepper[data-rt-radius=none]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-none)}rt-stepper[data-rt-radius=xs]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xs)}rt-stepper[data-rt-radius=sm]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-sm)}rt-stepper[data-rt-radius=ms]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-ms)}rt-stepper[data-rt-radius=md]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-md)}rt-stepper[data-rt-radius=lg]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-lg)}rt-stepper[data-rt-radius=xl]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-xl)}rt-stepper[data-rt-radius=\"2xl\"]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-2xl)}rt-stepper[data-rt-radius=full]>.rt-stepper{--rt-stepper-radius: var(--rt-radius-full)}}\n"]
|
|
213
236
|
}]
|
|
214
237
|
}],
|
|
215
238
|
propDecorators: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-stepper.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stepper/rt-step-label.directive.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtStepper } from './rt-stepper.model';\n\n/**\n * Шаблон подписи шага в вертикальном списке: разметка вместо строки `label`, например выделенное\n * слово. Обстановка — сам шаг и его номер с нуля.\n *\n * @example\n * ```html\n * <rt-stepper orientation=\"vertical\" [steps]=\"steps\" [currentIndex]=\"-1\">\n * <ng-template rtStepLabel let-step let-index=\"index\">\n * @if (index === 3) { Войдите под логином <strong>LOGIN</strong> } @else { {{ step.label }} }\n * </ng-template>\n * </rt-stepper>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtStepLabel]',\n})\nexport class RtStepLabelDirective {\n public readonly template: TemplateRef<IRtStepper.LabelContext> = inject<TemplateRef<IRtStepper.LabelContext>>(TemplateRef);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n public static ngTemplateContextGuard(_directive: RtStepLabelDirective, context: unknown): context is IRtStepper.LabelContext {\n return true;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtStepLabelDirective } from './rt-step-label.directive';\nimport { IRtStepper } from './rt-stepper.model';\n\nconst BEM_BLOCK: string = 'rt-stepper';\n\n/** Шаг вертикального списка, собранный для шаблона: номер для метки и состояние. */\ninterface IStepItem {\n readonly step: IRtStepper.Step;\n readonly index: number;\n readonly state: IRtStepper.StepState;\n}\n\n/** Состояние шага по номеру текущего; номер меньше нуля — текущего нет. */\nfunction stepState(index: number, current: number): IRtStepper.StepState {\n if (current < 0) {\n return 'neutral';\n }\n if (index < current) {\n return 'complete';\n }\n return index === current ? 'current' : 'upcoming';\n}\n\n/**\n * Линейный прогресс-степпер: тонкая полоса, набор точек и подпись\n * текущего шага. Шаги задаются через input `steps` (массив `IRtStepper.Step`\n * со связкой label + description), активный шаг — через `currentIndex`.\n *\n * Активная точка увеличена и подсвечивается янтарным; над ней висит подпись\n * текущего шага (тоже янтарная, выравнивается по краю на крайних шагах).\n * Пройденные точки и заполненная часть полосы — progress-цвет; будущие точки\n * и трек — приглушённый цвет (в dark-теме оба ухода от яркого синего). Под\n * полосой — описание текущего шага, многоабзацное (`\\n\\n`). Сам список названий\n * шагов на ui не выводится — публичен только текущий, остальные читаются\n * скринридером через aria.\n *\n * `orientation=\"vertical\"` показывает все шаги списком: у каждого круглая метка с номером и\n * подпись справа, метки соединены линией. Подпись — строка `label` или шаблон `rtStepLabel`.\n * `currentIndex` меньше нуля значит «текущего шага нет»: список — статичная инструкция, все метки\n * нейтральные. Шаги в списке не нажимаются и фокуса не принимают.\n */\n@Component({\n selector: 'rt-stepper',\n templateUrl: './rt-stepper.component.html',\n styleUrl: './rt-stepper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-stepper--vertical]': \"orientation() === 'vertical'\",\n },\n})\nexport class RtStepperComponent {\n /**\n * Номер шага, зажатый в набор. Индекс приходит снаружи и может выйти за\n * границы; полоса и якорь подписи это уже переживали, а вот объявление для\n * скринридера — нет: при `currentIndex: 99` на трёх шагах на прогрессбаре\n * оказывалось `aria-valuenow=\"100\"` при `aria-valuemax=\"3\"`, а подпись шага\n * пропадала вовсе. Зажимаем один раз здесь, чтобы показ и объявление не\n * могли разойтись.\n */\n readonly #safeIndex: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n return Math.max(0, Math.min(this.currentIndex(), total - 1));\n });\n\n protected readonly currentStep: Signal<IRtStepper.Step | null> = computed(\n (): IRtStepper.Step | null => this.steps()[this.#safeIndex()] ?? null\n );\n\n /** Номер текущего шага для скринридера: `0`, когда шагов нет вовсе. */\n protected readonly currentStepNumber: Signal<number> = computed((): number => (this.steps().length === 0 ? 0 : this.#safeIndex() + 1));\n\n /**\n * Доля заполненной полосы от 0 до 100. На один шаг и меньше — 0%, иначе\n * `idx / (total - 1)`. Без clamp в шаблоне получаем переполнение если\n * передадут `currentIndex > total`.\n */\n protected readonly progressPercent: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n if (total <= 1) {\n return 0;\n }\n return (this.#safeIndex() / (total - 1)) * 100;\n });\n\n protected readonly totalSteps: Signal<number> = computed((): number => this.steps().length);\n\n protected readonly labelTemplate: Signal<RtStepLabelDirective | undefined> = contentChild(RtStepLabelDirective);\n\n /**\n * Шаги вертикального списка с состоянием. Номер текущего здесь не зажимается: меньше нуля —\n * текущего нет, и все шаги нейтральные; больше последнего — пройдены все.\n */\n protected readonly items: Signal<readonly IStepItem[]> = computed((): readonly IStepItem[] => {\n const current: number = this.currentIndex();\n\n return this.steps().map((step: IRtStepper.Step, index: number): IStepItem => ({ step, index, state: stepState(index, current) }));\n });\n\n /**\n * Якорь подписи текущего шага: подпись висит над активной точкой и не должна\n * вылезать за края рельсы. Первый шаг — выравнивание по левому краю точки,\n * последний — по правому, остальные центрируются над точкой.\n */\n protected readonly labelAnchor: Signal<'start' | 'center' | 'end'> = computed((): 'start' | 'center' | 'end' => {\n const total: number = this.steps().length;\n const idx: number = this.#safeIndex();\n if (idx <= 0) {\n return 'start';\n }\n if (idx >= total - 1) {\n return 'end';\n }\n return 'center';\n });\n\n /** Абзацы описания текущего шага: бэк отдаёт плоскую строку, делим по `\\n\\n`. */\n protected readonly descriptionParagraphs: Signal<readonly string[]> = computed((): readonly string[] => {\n const text: string = this.currentStep()?.description ?? '';\n if (text.length === 0) {\n return [];\n }\n return text.split('\\n\\n');\n });\n\n public readonly steps: InputSignal<readonly IRtStepper.Step[]> = input<readonly IRtStepper.Step[]>([]);\n\n public readonly orientation: InputSignal<IRtStepper.Orientation> = input<IRtStepper.Orientation>('horizontal');\n\n public readonly currentIndex: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n}\n","@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n <p rtElem=\"label\" qa-dataid=\"stepper-label\" [rtMod]=\"{ anchor: labelAnchor() }\" [style.left.%]=\"progressPercent()\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"track\" aria-hidden=\"true\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" aria-hidden=\"true\" [style.width.%]=\"progressPercent()\"></span>\n <ul rtElem=\"points\">\n @for (step of steps(); track $index; let i = $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: i === currentIndex(),\n complete: i < currentIndex(),\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-stepper.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stepper/rt-step-label.directive.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.logic.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.ts","../../../projects/ui-kit-v2/src/lib/components/stepper/rt-stepper.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtStepper } from './rt-stepper.model';\n\n/**\n * Шаблон подписи шага в вертикальном списке: разметка вместо строки `label`, например выделенное\n * слово. Обстановка — сам шаг и его номер с нуля.\n *\n * @example\n * ```html\n * <rt-stepper orientation=\"vertical\" [steps]=\"steps\" [currentIndex]=\"-1\">\n * <ng-template rtStepLabel let-step let-index=\"index\">\n * @if (index === 3) { Войдите под логином <strong>LOGIN</strong> } @else { {{ step.label }} }\n * </ng-template>\n * </rt-stepper>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtStepLabel]',\n})\nexport class RtStepLabelDirective {\n public readonly template: TemplateRef<IRtStepper.LabelContext> = inject<TemplateRef<IRtStepper.LabelContext>>(TemplateRef);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n public static ngTemplateContextGuard(_directive: RtStepLabelDirective, context: unknown): context is IRtStepper.LabelContext {\n return true;\n }\n}\n","import { IRtStepper } from './rt-stepper.model';\n\n/** Половина полосы: отрезок уже неё подпись не держит. */\nconst HALF_BAR: number = 0.5;\n\n/**\n * Отрезок подписи текущего шага. Первый и последний шаг берут всю полосу и прижимаются к её краю.\n * Средний стоит в отрезке с центром над своей точкой шириной в два расстояния до ближнего края:\n * так подпись центрирована над точкой и не выходит за полосу, а длинная переносится внутри отрезка.\n * Так же собран и макет: сдвинуть текст к краю по его собственной ширине макет не умеет.\n * Отрезок у края уже половины полосы даёт подписи в одно-два слова, поэтому там подпись берёт всю\n * полосу и прижимается к ближнему краю, как у крайнего шага.\n */\nexport function labelSegment(index: number, total: number): IRtStepper.LabelSegment {\n if (total <= 1 || index <= 0) {\n return { start: 0, size: 100, anchor: 'start' };\n }\n if (index >= total - 1) {\n return { start: 0, size: 100, anchor: 'end' };\n }\n\n const share: number = index / (total - 1);\n const size: number = Math.min(2 * share, 2 - 2 * share);\n\n if (size < HALF_BAR) {\n return { start: 0, size: 100, anchor: share < HALF_BAR ? 'start' : 'end' };\n }\n\n return {\n start: Math.max(0, 2 * share - 1) * 100,\n size: size * 100,\n anchor: 'center',\n };\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtStepLabelDirective } from './rt-step-label.directive';\nimport { labelSegment } from './rt-stepper.logic';\nimport { IRtStepper } from './rt-stepper.model';\n\nconst BEM_BLOCK: string = 'rt-stepper';\n\n/** Шаг вертикального списка, собранный для шаблона: номер для метки и состояние. */\ninterface IStepItem {\n readonly step: IRtStepper.Step;\n readonly index: number;\n readonly state: IRtStepper.StepState;\n}\n\n/** Состояние шага по номеру текущего; номер меньше нуля — текущего нет. */\nfunction stepState(index: number, current: number): IRtStepper.StepState {\n if (current < 0) {\n return 'neutral';\n }\n if (index < current) {\n return 'complete';\n }\n return index === current ? 'current' : 'upcoming';\n}\n\n/**\n * Линейный прогресс-степпер: тонкая полоса, набор точек и подпись\n * текущего шага. Шаги задаются через input `steps` (массив `IRtStepper.Step`\n * со связкой label + description), активный шаг — через `currentIndex`.\n *\n * Активная точка увеличена и подсвечивается янтарным; над ней стоит подпись\n * текущего шага (тоже янтарная): по центру над точкой, на крайних шагах у края\n * полосы, у среднего шага возле края — тоже у ближнего края. За полосу подпись не\n * выходит, длинная переносится. Полоса тянется по ширине места, шагов сколько угодно;\n * отступ точек от краёв задаёт приложение свойством `--rt-stepper-inset`.\n * Пройденные точки и заполненная часть полосы — progress-цвет; будущие точки\n * и трек — приглушённый цвет (в dark-теме оба ухода от яркого синего). Под\n * полосой — описание текущего шага, многоабзацное (`\\n\\n`). Сам список названий\n * шагов на ui не выводится — публичен только текущий, остальные читаются\n * скринридером через aria.\n *\n * `orientation=\"vertical\"` показывает все шаги списком: у каждого круглая метка с номером и\n * подпись справа, метки соединены линией. Подпись — строка `label` или шаблон `rtStepLabel`.\n * `currentIndex` меньше нуля значит «текущего шага нет»: список — статичная инструкция, все метки\n * нейтральные. Шаги в списке не нажимаются и фокуса не принимают.\n */\n@Component({\n selector: 'rt-stepper',\n templateUrl: './rt-stepper.component.html',\n styleUrl: './rt-stepper.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // standalone components / directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-stepper--vertical]': \"orientation() === 'vertical'\",\n },\n})\nexport class RtStepperComponent {\n /**\n * Номер шага, зажатый в набор. Индекс приходит снаружи и может выйти за\n * границы; полоса и якорь подписи это уже переживали, а вот объявление для\n * скринридера — нет: при `currentIndex: 99` на трёх шагах на прогрессбаре\n * оказывалось `aria-valuenow=\"100\"` при `aria-valuemax=\"3\"`, а подпись шага\n * пропадала вовсе. Зажимаем один раз здесь, чтобы показ и объявление не\n * могли разойтись.\n */\n readonly #safeIndex: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n return Math.max(0, Math.min(this.currentIndex(), total - 1));\n });\n\n protected readonly currentStep: Signal<IRtStepper.Step | null> = computed(\n (): IRtStepper.Step | null => this.steps()[this.#safeIndex()] ?? null\n );\n\n /** Номер текущего шага для скринридера: `0`, когда шагов нет вовсе. */\n protected readonly currentStepNumber: Signal<number> = computed((): number => (this.steps().length === 0 ? 0 : this.#safeIndex() + 1));\n\n /**\n * Доля заполненной полосы от 0 до 100. На один шаг и меньше — 0%, иначе\n * `idx / (total - 1)`. Без clamp в шаблоне получаем переполнение если\n * передадут `currentIndex > total`.\n */\n protected readonly progressPercent: Signal<number> = computed((): number => {\n const total: number = this.steps().length;\n if (total <= 1) {\n return 0;\n }\n return (this.#safeIndex() / (total - 1)) * 100;\n });\n\n protected readonly totalSteps: Signal<number> = computed((): number => this.steps().length);\n\n protected readonly labelTemplate: Signal<RtStepLabelDirective | undefined> = contentChild(RtStepLabelDirective);\n\n /**\n * Шаги вертикального списка с состоянием. Номер текущего здесь не зажимается: меньше нуля —\n * текущего нет, и все шаги нейтральные; больше последнего — пройдены все.\n */\n protected readonly items: Signal<readonly IStepItem[]> = computed((): readonly IStepItem[] => {\n const current: number = this.currentIndex();\n\n return this.steps().map((step: IRtStepper.Step, index: number): IStepItem => ({ step, index, state: stepState(index, current) }));\n });\n\n /**\n * Отрезок полосы под подписью текущего шага: подпись центрирована над точкой и не выходит за\n * полосу, на первом шаге прижата к началу, на последнем к концу. Средний шаг, у которого над\n * точкой меньше половины полосы, прижимается к ближнему краю. Считает чистая функция рядом.\n */\n protected readonly labelSegment: Signal<IRtStepper.LabelSegment> = computed((): IRtStepper.LabelSegment =>\n labelSegment(this.#safeIndex(), this.steps().length)\n );\n\n /**\n * Состояние каждой точки по зажатому номеру — тому же, что у подписи и заполнения: при номере\n * за пределами набора текущей становится последняя точка, а не ни одна.\n */\n protected readonly points: Signal<readonly IRtStepper.StepState[]> = computed((): readonly IRtStepper.StepState[] => {\n const current: number = this.#safeIndex();\n\n return this.steps().map((_step: IRtStepper.Step, index: number): IRtStepper.StepState => stepState(index, current));\n });\n\n /** Абзацы описания текущего шага: бэк отдаёт плоскую строку, делим по `\\n\\n`. */\n protected readonly descriptionParagraphs: Signal<readonly string[]> = computed((): readonly string[] => {\n const text: string = this.currentStep()?.description ?? '';\n if (text.length === 0) {\n return [];\n }\n return text.split('\\n\\n');\n });\n\n public readonly steps: InputSignal<readonly IRtStepper.Step[]> = input<readonly IRtStepper.Step[]>([]);\n\n public readonly orientation: InputSignal<IRtStepper.Orientation> = input<IRtStepper.Orientation>('horizontal');\n\n public readonly currentIndex: InputSignalWithTransform<number, number | string> = input<number, number | string>(0, {\n transform: numberAttribute,\n });\n}\n","@let current = currentStep();\n@if (orientation() === 'vertical') {\n <!--\n Вертикальный список: шаги — пункты нумерованного списка, номер рисует метка, а не список.\n role=\"list\" явно: Safari снимает смысл списка с <ol> без маркеров.\n -->\n <ol rtBlock=\"rt-stepper\" qa-dataid=\"stepper-list\" role=\"list\">\n @for (item of items(); track item.index) {\n <li\n rtElem=\"item\"\n qa-dataid=\"stepper-item\"\n [rtMod]=\"{ state: item.state }\"\n [attr.aria-current]=\"item.state === 'current' ? 'step' : null\">\n <span rtElem=\"mark\" qa-dataid=\"stepper-mark\" aria-hidden=\"true\">{{ item.index + 1 }}</span>\n <div rtElem=\"body\">\n <div rtElem=\"step-label\" qa-dataid=\"stepper-step-label\">\n @if (labelTemplate(); as label) {\n <ng-container\n [ngTemplateOutlet]=\"label.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item.step, index: item.index }\" />\n } @else {\n {{ item.step.label }}\n }\n </div>\n @if (item.step.description) {\n <p rtElem=\"step-description\" qa-dataid=\"stepper-step-description\">{{ item.step.description }}</p>\n }\n </div>\n </li>\n }\n </ol>\n} @else {\n <div\n rtBlock=\"rt-stepper\"\n qa-dataid=\"stepper\"\n role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"totalSteps()\"\n [attr.aria-valuenow]=\"currentStepNumber()\"\n [attr.aria-valuetext]=\"current?.label ?? null\">\n <div rtElem=\"rail\">\n @if (current) {\n @let segment = labelSegment();\n <p\n rtElem=\"label\"\n qa-dataid=\"stepper-label\"\n [rtMod]=\"{ anchor: segment.anchor }\"\n [style.margin-inline-start.%]=\"segment.start\"\n [style.inline-size.%]=\"segment.size\">\n {{ current.label }}\n </p>\n }\n <div rtElem=\"track-band\">\n <span rtElem=\"line\" aria-hidden=\"true\">\n <span rtElem=\"track\"></span>\n <span rtElem=\"progress\" qa-dataid=\"stepper-progress\" [style.width.%]=\"progressPercent()\"></span>\n </span>\n <ul rtElem=\"points\">\n @for (state of points(); track $index) {\n <li\n rtElem=\"point\"\n qa-dataid=\"stepper-point\"\n aria-hidden=\"true\"\n [rtMod]=\"{\n current: state === 'current',\n complete: state === 'complete',\n }\"></li>\n }\n </ul>\n </div>\n </div>\n @for (paragraph of descriptionParagraphs(); track $index) {\n <p rtElem=\"description\" qa-dataid=\"stepper-description\">{{ paragraph }}</p>\n }\n </div>\n}\n"],"mappings":"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"}
|