@reliability-design/web 1.3.1 → 1.4.1
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/CHANGELOG.md +22 -0
- package/dist/components/rel-accordion/README.md +13 -13
- package/dist/components/rel-accordion/rel-accordion.ts +80 -45
- package/dist/components/rel-alert/README.md +15 -15
- package/dist/components/rel-alert/rel-alert.ts +149 -158
- package/dist/components/rel-avatar/README.md +15 -15
- package/dist/components/rel-avatar/rel-avatar.ts +42 -38
- package/dist/components/rel-badge/README.md +5 -5
- package/dist/components/rel-badge/rel-badge.ts +46 -11
- package/dist/components/rel-breadcrumb/README.md +7 -7
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
- package/dist/components/rel-button/README.md +20 -20
- package/dist/components/rel-button/rel-button.ts +292 -105
- package/dist/components/rel-calendar/README.md +5 -5
- package/dist/components/rel-calendar/rel-calendar.ts +68 -45
- package/dist/components/rel-card/README.md +6 -6
- package/dist/components/rel-card/rel-card.ts +88 -35
- package/dist/components/rel-cardmedia/README.md +9 -9
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
- package/dist/components/rel-carousel/README.md +3 -3
- package/dist/components/rel-carousel/rel-carousel.ts +174 -90
- package/dist/components/rel-chart/README.md +8 -8
- package/dist/components/rel-chart/rel-chart.ts +59 -41
- package/dist/components/rel-checkbox/README.md +7 -7
- package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
- package/dist/components/rel-chip/README.md +16 -16
- package/dist/components/rel-chip/rel-chip.ts +143 -111
- package/dist/components/rel-container/README.md +11 -11
- package/dist/components/rel-container/rel-container.ts +35 -9
- package/dist/components/rel-date-picker/README.md +43 -7
- package/dist/components/rel-date-picker/date-format.test.ts +43 -0
- package/dist/components/rel-date-picker/date-format.ts +47 -0
- package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
- package/dist/components/rel-divider/README.md +9 -9
- package/dist/components/rel-divider/rel-divider.ts +10 -9
- package/dist/components/rel-drawer/README.md +1 -1
- package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
- package/dist/components/rel-drawer/rel-drawer.ts +88 -25
- package/dist/components/rel-kbd/README.md +20 -20
- package/dist/components/rel-kbd/rel-kbd.ts +119 -25
- package/dist/components/rel-layout/README.md +1 -1
- package/dist/components/rel-layout/rel-layout.ts +2 -2
- package/dist/components/rel-menu/README.md +15 -15
- package/dist/components/rel-menu/rel-menu.ts +155 -88
- package/dist/components/rel-menubar/README.md +20 -20
- package/dist/components/rel-menubar/rel-menubar.ts +47 -31
- package/dist/components/rel-nav-menu/README.md +21 -21
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
- package/dist/components/rel-navbar/README.md +7 -7
- package/dist/components/rel-navbar/rel-navbar.ts +12 -11
- package/dist/components/rel-otp/README.md +3 -3
- package/dist/components/rel-otp/rel-otp.ts +46 -30
- package/dist/components/rel-pagination/README.md +18 -18
- package/dist/components/rel-pagination/rel-pagination.ts +141 -90
- package/dist/components/rel-popover/README.md +13 -13
- package/dist/components/rel-popover/rel-popover-content.ts +39 -14
- package/dist/components/rel-popover/rel-popover.ts +18 -7
- package/dist/components/rel-progress/README.md +5 -5
- package/dist/components/rel-progress/rel-progress.ts +16 -12
- package/dist/components/rel-radio/README.md +9 -9
- package/dist/components/rel-radio/rel-radio.ts +64 -50
- package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
- package/dist/components/rel-resizable/README.md +4 -4
- package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
- package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
- package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
- package/dist/components/rel-segmented-button/README.md +10 -10
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
- package/dist/components/rel-select/README.md +14 -14
- package/dist/components/rel-select/rel-select.ts +120 -188
- package/dist/components/rel-sheet/README.md +10 -10
- package/dist/components/rel-sheet/rel-sheet.ts +82 -23
- package/dist/components/rel-sidebar/README.md +5 -5
- package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
- package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
- package/dist/components/rel-slider/README.md +10 -10
- package/dist/components/rel-slider/rel-slider.ts +230 -57
- package/dist/components/rel-snackbar/README.md +9 -9
- package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
- package/dist/components/rel-stepper/README.md +10 -10
- package/dist/components/rel-stepper/rel-stepper.ts +110 -46
- package/dist/components/rel-switch/README.md +5 -5
- package/dist/components/rel-switch/rel-switch.ts +23 -12
- package/dist/components/rel-tab/README.md +13 -13
- package/dist/components/rel-tab/rel-tab.ts +63 -19
- package/dist/components/rel-table/README.md +7 -7
- package/dist/components/rel-table/rel-table-body.ts +2 -1
- package/dist/components/rel-table/rel-table-caption.ts +10 -7
- package/dist/components/rel-table/rel-table-cell.ts +7 -6
- package/dist/components/rel-table/rel-table-footer.ts +4 -3
- package/dist/components/rel-table/rel-table-head.ts +11 -9
- package/dist/components/rel-table/rel-table-header.ts +2 -1
- package/dist/components/rel-table/rel-table-row.ts +5 -4
- package/dist/components/rel-table/rel-table.ts +16 -7
- package/dist/components/rel-textfield/README.md +11 -11
- package/dist/components/rel-textfield/rel-textfield.ts +218 -92
- package/dist/components/rel-toast/README.md +11 -11
- package/dist/components/rel-toast/rel-toast.ts +33 -30
- package/dist/components/rel-tooltip/README.md +7 -7
- package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
- package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
- package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
- package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
- package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
- package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
- package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
- package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar.ts +31 -29
- package/dist/index.d.mts +159 -39
- package/dist/index.d.ts +159 -39
- package/dist/index.js +3600 -2269
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3930 -2600
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +866 -363
- package/dist/vars-BYCEEKWJ.css +866 -0
- package/package.json +5 -3
- package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
- package/dist/styles/vars-v2.css +0 -525
- package/dist/vars-F54UGCHM.css +0 -363
- package/dist/vars-v2-VMGWTFJZ.css +0 -525
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LitElement, html, css } from "lit";
|
|
2
2
|
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
-
import "../../styles/vars-v2.css";
|
|
4
3
|
import "@reliability-design/icons/rel-icon";
|
|
5
4
|
|
|
6
5
|
export type SnackbarLines = "single" | "double";
|
|
@@ -29,8 +28,9 @@ export class RelSnackbar extends LitElement {
|
|
|
29
28
|
|
|
30
29
|
static styles = css`
|
|
31
30
|
:host {
|
|
31
|
+
color: var(--rel-text-default);
|
|
32
32
|
display: block;
|
|
33
|
-
font-family: var(--rel-
|
|
33
|
+
font-family: var(--rel-fonts-font-family);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
.snackbar {
|
|
@@ -40,11 +40,11 @@ export class RelSnackbar extends LitElement {
|
|
|
40
40
|
min-width: 280px;
|
|
41
41
|
max-width: 500px;
|
|
42
42
|
margin: 0;
|
|
43
|
-
padding:
|
|
44
|
-
border-radius: var(--rel-
|
|
45
|
-
background-color: var(--rel-
|
|
46
|
-
color:
|
|
47
|
-
font-family: var(--rel-
|
|
43
|
+
padding: var(--rel-spacing-sm) var(--rel-spacing-md) var(--rel-spacing-sm) var(--rel-spacing-xs);
|
|
44
|
+
border-radius: var(--rel-border-radius-sm);
|
|
45
|
+
background-color: var(--rel-bg-static-dark);
|
|
46
|
+
color: var(--rel-text-static-light);
|
|
47
|
+
font-family: var(--rel-fonts-font-family);
|
|
48
48
|
box-shadow: var(--rel-shadows-shadow-300);
|
|
49
49
|
animation: slide-up 0.3s ease-out;
|
|
50
50
|
border-left: 4px solid transparent;
|
|
@@ -60,29 +60,30 @@ export class RelSnackbar extends LitElement {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/* Type variants — border accent using semantic DS tokens */
|
|
63
|
+
/* Status fills stay vivid on the always-dark snackbar surface */
|
|
63
64
|
.snackbar.type-success {
|
|
64
|
-
border-left-color: var(--rel-
|
|
65
|
+
border-left-color: var(--rel-bg-success);
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
.snackbar.type-error {
|
|
68
|
-
border-left-color: var(--rel-
|
|
69
|
+
border-left-color: var(--rel-bg-danger);
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
.snackbar.type-warning {
|
|
72
|
-
border-left-color: var(--rel-
|
|
73
|
+
border-left-color: var(--rel-bg-warning);
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
/* Icon color matches type accent */
|
|
76
77
|
.snackbar.type-success .snackbar-icon {
|
|
77
|
-
color: var(--rel-
|
|
78
|
+
color: var(--rel-bg-success);
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
.snackbar.type-error .snackbar-icon {
|
|
81
|
-
color: var(--rel-
|
|
82
|
+
color: var(--rel-bg-danger);
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
.snackbar.type-warning .snackbar-icon {
|
|
85
|
-
color: var(--rel-
|
|
86
|
+
color: var(--rel-bg-warning);
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
.snackbar-icon {
|
|
@@ -99,11 +100,20 @@ export class RelSnackbar extends LitElement {
|
|
|
99
100
|
min-width: 0;
|
|
100
101
|
}
|
|
101
102
|
|
|
102
|
-
.snackbar-message {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
.snackbar-message {
|
|
104
|
+
margin-right: var(--rel-spacing-sm);
|
|
105
|
+
flex: 1;
|
|
106
|
+
|
|
107
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
108
|
+
|
|
109
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
110
|
+
|
|
111
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
112
|
+
|
|
113
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
114
|
+
|
|
115
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
116
|
+
|
|
107
117
|
}
|
|
108
118
|
|
|
109
119
|
.snackbar.two-line .snackbar-message {
|
|
@@ -115,7 +125,7 @@ export class RelSnackbar extends LitElement {
|
|
|
115
125
|
.snackbar-actions {
|
|
116
126
|
display: flex;
|
|
117
127
|
align-items: center;
|
|
118
|
-
gap: var(--rel-spacing-
|
|
128
|
+
gap: var(--rel-spacing-2xs);
|
|
119
129
|
flex-shrink: 0;
|
|
120
130
|
align-self: center;
|
|
121
131
|
}
|
|
@@ -127,15 +137,17 @@ export class RelSnackbar extends LitElement {
|
|
|
127
137
|
.snackbar-action {
|
|
128
138
|
background: none;
|
|
129
139
|
border: none;
|
|
130
|
-
color: var(--rel-
|
|
131
|
-
font-weight: var(--rel-fontWeights-semibold);
|
|
132
|
-
font-size: var(--rel-fontSizes-sm);
|
|
133
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
140
|
+
color: var(--rel-text-static-light);
|
|
134
141
|
cursor: pointer;
|
|
135
142
|
padding: 0;
|
|
136
143
|
display: flex;
|
|
137
144
|
align-items: center;
|
|
138
|
-
transition: opacity 0.2s ease;
|
|
145
|
+
transition: opacity 0.2s ease;
|
|
146
|
+
font-family: var(--rel-action-md-font-family);
|
|
147
|
+
font-weight: var(--rel-action-md-font-weight);
|
|
148
|
+
font-size: var(--rel-action-md-font-size);
|
|
149
|
+
line-height: var(--rel-action-md-line-height);
|
|
150
|
+
letter-spacing: var(--rel-action-md-letter-spacing);
|
|
139
151
|
}
|
|
140
152
|
|
|
141
153
|
.snackbar-action:hover {
|
|
@@ -147,15 +159,15 @@ export class RelSnackbar extends LitElement {
|
|
|
147
159
|
}
|
|
148
160
|
|
|
149
161
|
.snackbar-action:focus-visible {
|
|
150
|
-
outline: 2px solid
|
|
162
|
+
outline: 2px solid var(--rel-text-static-light);
|
|
151
163
|
outline-offset: 2px;
|
|
152
|
-
border-radius:
|
|
164
|
+
border-radius: var(--rel-border-radius-xs);
|
|
153
165
|
}
|
|
154
166
|
|
|
155
167
|
.snackbar-close {
|
|
156
168
|
background: none;
|
|
157
169
|
border: none;
|
|
158
|
-
color:
|
|
170
|
+
color: var(--rel-action-neutral-label-icons-fill-inverse);
|
|
159
171
|
cursor: pointer;
|
|
160
172
|
padding: 0;
|
|
161
173
|
display: flex;
|
|
@@ -173,9 +185,9 @@ export class RelSnackbar extends LitElement {
|
|
|
173
185
|
}
|
|
174
186
|
|
|
175
187
|
.snackbar-close:focus-visible {
|
|
176
|
-
outline: 2px solid
|
|
188
|
+
outline: 2px solid var(--rel-text-static-light);
|
|
177
189
|
outline-offset: 2px;
|
|
178
|
-
border-radius:
|
|
190
|
+
border-radius: var(--rel-border-radius-xs);
|
|
179
191
|
}
|
|
180
192
|
|
|
181
193
|
/* Prevent any inherited transform from firing on button click */
|
|
@@ -288,20 +300,20 @@ export class RelSnackbar extends LitElement {
|
|
|
288
300
|
<div class="${snackbarClasses}">
|
|
289
301
|
<div class="snackbar-body">
|
|
290
302
|
${this.type !== "default" ? this.renderIcon() : ""}
|
|
291
|
-
<div class="snackbar-message">${this.message}</div>
|
|
303
|
+
<div part="label" class="snackbar-message">${this.message}</div>
|
|
292
304
|
</div>
|
|
293
305
|
|
|
294
306
|
<div class="snackbar-actions">
|
|
295
307
|
${this.action
|
|
296
308
|
? html`
|
|
297
|
-
<button class="snackbar-action" @click="${this.onActionClick}">
|
|
309
|
+
<button part="action" class="snackbar-action" @click="${this.onActionClick}">
|
|
298
310
|
${this.action}
|
|
299
311
|
</button>
|
|
300
312
|
`
|
|
301
313
|
: ""}
|
|
302
314
|
${this.iconClose
|
|
303
315
|
? html`
|
|
304
|
-
<button class="snackbar-close" @click="${this.dismiss}">
|
|
316
|
+
<button part="close-button" class="snackbar-close" @click="${this.dismiss}">
|
|
305
317
|
<rel-icon name="close" size="md"></rel-icon>
|
|
306
318
|
</button>
|
|
307
319
|
`
|
|
@@ -96,21 +96,21 @@ None exposed.
|
|
|
96
96
|
## Tokens / CSS Variables
|
|
97
97
|
|
|
98
98
|
### Semantic Tokens
|
|
99
|
-
- `--rel-
|
|
100
|
-
- `--rel-
|
|
101
|
-
- `--rel-
|
|
102
|
-
- `--rel-
|
|
99
|
+
- `--rel-fonts-font-family` - Font family
|
|
100
|
+
- `--rel-body-sm-regular-font-size` - Label font size
|
|
101
|
+
- `--rel-fonts-weight-body-medium` - Default label font weight
|
|
102
|
+
- `--rel-fonts-weight-body-semibold` - Active/done label font weight
|
|
103
103
|
|
|
104
104
|
### Spacing Tokens
|
|
105
|
-
- `--rel-spacing-
|
|
105
|
+
- `--rel-spacing-2xs` - Gap between indicators and labels (text-right mode)
|
|
106
106
|
|
|
107
107
|
### Color Tokens
|
|
108
|
-
- `--rel-
|
|
109
|
-
- `--rel-
|
|
110
|
-
- `--rel-
|
|
111
|
-
- `--rel-
|
|
108
|
+
- `--rel-bg-surface` - Indicator background (progress, disabled states)
|
|
109
|
+
- `--rel-text-default` - Active/done indicator background, text, and connector color
|
|
110
|
+
- `--rel-border-default` - Disabled indicator border and inactive connector
|
|
111
|
+
- `--rel-bg-surface-elevated` - Disabled indicator background
|
|
112
112
|
- `--rel-text-disabled` - Disabled label text color
|
|
113
|
-
- `--rel-text-
|
|
113
|
+
- `--rel-text-default` - Default label text color
|
|
114
114
|
|
|
115
115
|
## Accessibility
|
|
116
116
|
- Steps can be clicked unless in disabled state
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { LitElement, html, css } from "lit";
|
|
2
2
|
import { customElement, property } from "lit/decorators.js";
|
|
3
|
-
import "../../styles/vars-v2.css";
|
|
4
3
|
|
|
5
4
|
export type StepStatus = "done" | "progress" | "disabled";
|
|
6
5
|
export type TextAlign = "right" | "below";
|
|
7
6
|
export type Orientation = "horizontal" | "vertical";
|
|
8
7
|
export type StepperSize = "small" | "large";
|
|
8
|
+
/** Figma "Type": indicator content — default (number, check when done), dot, number, icon. */
|
|
9
|
+
export type StepperType = "default" | "dot" | "number" | "icon";
|
|
10
|
+
/** Figma "Typel": label placement relative to the indicator. */
|
|
11
|
+
export type LabelPlacement = "top" | "centered" | "inverted";
|
|
9
12
|
|
|
10
13
|
export interface Step {
|
|
11
14
|
title: string;
|
|
@@ -22,10 +25,23 @@ export class RelStepper extends LitElement {
|
|
|
22
25
|
|
|
23
26
|
@property({ type: String }) size: StepperSize = "large";
|
|
24
27
|
|
|
28
|
+
@property({ type: String, reflect: true }) type: StepperType = "default";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Figma Typel axis: top = label top-aligned beside the indicator,
|
|
32
|
+
* centered = label vertically centered beside it, inverted = indicator above
|
|
33
|
+
* the label. When unset, the legacy textAlign prop drives the layout
|
|
34
|
+
* (below ≈ inverted, right ≈ centered). Note Figma marks Top+Horizontal
|
|
35
|
+
* as an unsupported combination.
|
|
36
|
+
*/
|
|
37
|
+
@property({ type: String, reflect: true, attribute: "label-placement" })
|
|
38
|
+
labelPlacement?: LabelPlacement;
|
|
39
|
+
|
|
25
40
|
static styles = css`
|
|
26
41
|
:host {
|
|
42
|
+
color: var(--rel-text-default);
|
|
27
43
|
display: block;
|
|
28
|
-
font-family: var(--rel-
|
|
44
|
+
font-family: var(--rel-fonts-font-family);
|
|
29
45
|
}
|
|
30
46
|
|
|
31
47
|
/********************************************
|
|
@@ -33,7 +49,7 @@ export class RelStepper extends LitElement {
|
|
|
33
49
|
********************************************/
|
|
34
50
|
.rel-stepper {
|
|
35
51
|
display: flex;
|
|
36
|
-
font-family: var(--rel-
|
|
52
|
+
font-family: var(--rel-fonts-font-family);
|
|
37
53
|
width: 100%;
|
|
38
54
|
position: relative;
|
|
39
55
|
}
|
|
@@ -78,7 +94,7 @@ export class RelStepper extends LitElement {
|
|
|
78
94
|
align-items: center;
|
|
79
95
|
position: relative;
|
|
80
96
|
flex: 0;
|
|
81
|
-
gap: var(--rel-spacing-
|
|
97
|
+
gap: var(--rel-spacing-2xs);
|
|
82
98
|
}
|
|
83
99
|
|
|
84
100
|
/* Vertical layout variants */
|
|
@@ -94,7 +110,7 @@ export class RelStepper extends LitElement {
|
|
|
94
110
|
align-items: flex-start;
|
|
95
111
|
justify-content: center;
|
|
96
112
|
position: relative;
|
|
97
|
-
gap: var(--rel-spacing-
|
|
113
|
+
gap: var(--rel-spacing-2xs);
|
|
98
114
|
}
|
|
99
115
|
|
|
100
116
|
/* Wrapper for indicator and connector */
|
|
@@ -109,7 +125,7 @@ export class RelStepper extends LitElement {
|
|
|
109
125
|
.step-content {
|
|
110
126
|
display: flex;
|
|
111
127
|
align-items: center;
|
|
112
|
-
gap: var(--rel-spacing-
|
|
128
|
+
gap: var(--rel-spacing-2xs);
|
|
113
129
|
}
|
|
114
130
|
|
|
115
131
|
.text-below-content {
|
|
@@ -129,15 +145,18 @@ export class RelStepper extends LitElement {
|
|
|
129
145
|
justify-content: center;
|
|
130
146
|
width: var(--rel-stepper-indicator-size, 22px);
|
|
131
147
|
height: var(--rel-stepper-indicator-size, 22px);
|
|
132
|
-
border: 2px solid var(--rel-
|
|
133
|
-
background: var(--rel-
|
|
148
|
+
border: 2px solid var(--rel-bg-neutral-elevated-2);
|
|
149
|
+
background: var(--rel-bg-neutral);
|
|
134
150
|
border-radius: 50%;
|
|
135
|
-
font-size: var(--rel-fontSizes-sm);
|
|
136
|
-
font-weight: var(--rel-fontWeights-medium);
|
|
137
151
|
position: relative;
|
|
138
152
|
z-index: 2;
|
|
139
153
|
transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
|
|
140
154
|
flex-shrink: 0;
|
|
155
|
+
font-family: var(--rel-body-sm-semibold-font-family);
|
|
156
|
+
font-weight: var(--rel-body-sm-semibold-font-weight);
|
|
157
|
+
font-size: var(--rel-body-sm-semibold-font-size);
|
|
158
|
+
line-height: var(--rel-body-sm-semibold-line-height);
|
|
159
|
+
letter-spacing: var(--rel-body-sm-semibold-letter-spacing);
|
|
141
160
|
}
|
|
142
161
|
|
|
143
162
|
.indicator svg {
|
|
@@ -146,18 +165,55 @@ export class RelStepper extends LitElement {
|
|
|
146
165
|
display: block;
|
|
147
166
|
}
|
|
148
167
|
|
|
168
|
+
/* Figma Type=Dot: bare dot indicator, no number/icon */
|
|
169
|
+
:host([type="dot"]) .indicator {
|
|
170
|
+
width: 12px;
|
|
171
|
+
height: 12px;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
:host([type="dot"]) .rel-step.done .indicator,
|
|
175
|
+
:host([type="dot"]) .rel-step.progress .indicator {
|
|
176
|
+
background: var(--rel-bg-neutral-inverse-2);
|
|
177
|
+
border-color: var(--rel-bg-neutral-inverse-2);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Figma Typel=Top: label top-aligned against the indicator */
|
|
181
|
+
.rel-stepper.label-top .rel-step {
|
|
182
|
+
align-items: flex-start;
|
|
183
|
+
}
|
|
184
|
+
|
|
149
185
|
/********************************************
|
|
150
186
|
* Labels
|
|
151
187
|
********************************************/
|
|
152
188
|
.step-label {
|
|
153
189
|
white-space: nowrap;
|
|
154
|
-
|
|
155
|
-
|
|
190
|
+
color: var(--rel-text-body);
|
|
191
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
192
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
193
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
194
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
195
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
156
196
|
}
|
|
157
197
|
|
|
158
198
|
/* Horizontal text-below specific */
|
|
199
|
+
.rel-stepper.vertical .rel-step {
|
|
200
|
+
column-gap: var(--rel-spacing-sm);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.rel-stepper.small .step-label {
|
|
204
|
+
font-family: var(--rel-body-sm-regular-font-family);
|
|
205
|
+
font-weight: var(--rel-body-sm-regular-font-weight);
|
|
206
|
+
font-size: var(--rel-body-sm-regular-font-size);
|
|
207
|
+
line-height: var(--rel-body-sm-regular-line-height);
|
|
208
|
+
letter-spacing: var(--rel-body-sm-regular-letter-spacing);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.rel-step.disabled .indicator {
|
|
212
|
+
color: var(--rel-text-caption);
|
|
213
|
+
}
|
|
214
|
+
|
|
159
215
|
.rel-stepper.horizontal.text-below .step-label {
|
|
160
|
-
margin-top: var(--rel-spacing-
|
|
216
|
+
margin-top: var(--rel-spacing-2xs);
|
|
161
217
|
text-align: center;
|
|
162
218
|
}
|
|
163
219
|
|
|
@@ -165,7 +221,7 @@ export class RelStepper extends LitElement {
|
|
|
165
221
|
.rel-stepper.horizontal.text-right .step-label {
|
|
166
222
|
margin-top: 0;
|
|
167
223
|
margin-left: 0;
|
|
168
|
-
margin-right: var(--rel-spacing-
|
|
224
|
+
margin-right: var(--rel-spacing-xs);
|
|
169
225
|
text-align: left;
|
|
170
226
|
}
|
|
171
227
|
|
|
@@ -188,7 +244,7 @@ export class RelStepper extends LitElement {
|
|
|
188
244
|
********************************************/
|
|
189
245
|
.connector {
|
|
190
246
|
position: absolute;
|
|
191
|
-
background: var(--rel-
|
|
247
|
+
background: var(--rel-border-default);
|
|
192
248
|
z-index: 1;
|
|
193
249
|
}
|
|
194
250
|
|
|
@@ -199,7 +255,7 @@ export class RelStepper extends LitElement {
|
|
|
199
255
|
transform: translateY(-50%);
|
|
200
256
|
height: 2px;
|
|
201
257
|
position: absolute;
|
|
202
|
-
background: var(--rel-
|
|
258
|
+
background: var(--rel-border-default);
|
|
203
259
|
}
|
|
204
260
|
|
|
205
261
|
.rel-stepper.horizontal .rel-step:last-child .connector {
|
|
@@ -238,54 +294,54 @@ export class RelStepper extends LitElement {
|
|
|
238
294
|
* Step States
|
|
239
295
|
********************************************/
|
|
240
296
|
.rel-step.done .indicator {
|
|
241
|
-
background: var(--rel-
|
|
242
|
-
border-color: var(--rel-
|
|
243
|
-
color: var(--rel-
|
|
297
|
+
background: var(--rel-bg-neutral-inverse-2);
|
|
298
|
+
border-color: var(--rel-bg-neutral-inverse-2);
|
|
299
|
+
color: var(--rel-text-inverse);
|
|
244
300
|
}
|
|
245
301
|
|
|
246
302
|
.rel-step.progress .indicator {
|
|
247
|
-
border-color: var(--rel-
|
|
248
|
-
background: var(--rel-
|
|
249
|
-
color: var(--rel-
|
|
303
|
+
border-color: var(--rel-border-strong);
|
|
304
|
+
background: var(--rel-bg-neutral);
|
|
305
|
+
color: var(--rel-text-label);
|
|
250
306
|
}
|
|
251
307
|
|
|
252
308
|
.rel-step.disabled .indicator {
|
|
253
|
-
background: var(--rel-
|
|
254
|
-
border-color: var(--rel-
|
|
255
|
-
color: var(--rel-
|
|
309
|
+
background: var(--rel-bg-surface-elevated);
|
|
310
|
+
border-color: var(--rel-border-default);
|
|
311
|
+
color: var(--rel-text-disabled);
|
|
256
312
|
}
|
|
257
313
|
|
|
258
314
|
.rel-step.done .connector {
|
|
259
|
-
background: var(--rel-
|
|
315
|
+
background: var(--rel-text-label);
|
|
260
316
|
}
|
|
261
317
|
|
|
262
318
|
.rel-step.progress .connector {
|
|
263
|
-
background: var(--rel-
|
|
319
|
+
background: var(--rel-text-label);
|
|
264
320
|
}
|
|
265
321
|
|
|
266
322
|
.rel-step.done .step-label {
|
|
267
|
-
color: var(--rel-
|
|
268
|
-
font-weight: var(--rel-
|
|
323
|
+
color: var(--rel-text-label);
|
|
324
|
+
font-weight: var(--rel-body-md-medium-font-weight);
|
|
269
325
|
}
|
|
270
326
|
|
|
271
327
|
.rel-step.progress .step-label {
|
|
272
|
-
color: var(--rel-
|
|
273
|
-
font-weight: var(--rel-
|
|
328
|
+
color: var(--rel-text-label);
|
|
329
|
+
font-weight: var(--rel-body-md-medium-font-weight);
|
|
274
330
|
}
|
|
275
331
|
|
|
276
332
|
.rel-step.disabled .step-label {
|
|
277
|
-
color: var(--rel-
|
|
333
|
+
color: var(--rel-text-disabled);
|
|
278
334
|
}
|
|
279
335
|
|
|
280
336
|
/* Dark mode: ensure progress/done indicator and labels stay readable */
|
|
281
337
|
:host-context(:root[data-theme="dark"]) .rel-step.progress .step-label,
|
|
282
338
|
:host-context(.dark) .rel-step.progress .step-label {
|
|
283
|
-
color: var(--rel-
|
|
339
|
+
color: var(--rel-text-default);
|
|
284
340
|
}
|
|
285
341
|
|
|
286
342
|
:host-context(:root[data-theme="dark"]) .rel-step.progress .indicator,
|
|
287
343
|
:host-context(.dark) .rel-step.progress .indicator {
|
|
288
|
-
color:
|
|
344
|
+
color: var(--rel-text-default);
|
|
289
345
|
}
|
|
290
346
|
|
|
291
347
|
/********************************************
|
|
@@ -362,7 +418,9 @@ export class RelStepper extends LitElement {
|
|
|
362
418
|
}
|
|
363
419
|
|
|
364
420
|
private renderIndicator(step: Step, index: number) {
|
|
365
|
-
if (
|
|
421
|
+
if (this.type === "dot") return html``;
|
|
422
|
+
if (this.type === "number") return html`<span>${index + 1}</span>`;
|
|
423
|
+
if (this.type === "icon" || step.status === "done") {
|
|
366
424
|
return html`
|
|
367
425
|
<svg
|
|
368
426
|
xmlns="http://www.w3.org/2000/svg"
|
|
@@ -383,17 +441,23 @@ export class RelStepper extends LitElement {
|
|
|
383
441
|
}
|
|
384
442
|
|
|
385
443
|
render() {
|
|
444
|
+
// Figma Typel wins when set; otherwise the legacy textAlign drives layout
|
|
445
|
+
// (below ≈ inverted, right ≈ centered).
|
|
446
|
+
const placement: LabelPlacement =
|
|
447
|
+
this.labelPlacement ?? (this.textAlign === "below" ? "inverted" : "centered");
|
|
448
|
+
|
|
386
449
|
const stepperClasses = [
|
|
387
450
|
"rel-stepper",
|
|
388
451
|
this.orientation === "vertical" ? "vertical" : "horizontal",
|
|
389
|
-
|
|
452
|
+
placement === "inverted" ? "text-below" : "text-right",
|
|
453
|
+
placement === "top" ? "label-top" : "",
|
|
390
454
|
this.size === "small" ? "small" : "large",
|
|
391
455
|
]
|
|
392
456
|
.filter(Boolean)
|
|
393
457
|
.join(" ");
|
|
394
458
|
|
|
395
459
|
const isVertical = this.orientation === "vertical";
|
|
396
|
-
const isTextRight =
|
|
460
|
+
const isTextRight = placement !== "inverted";
|
|
397
461
|
|
|
398
462
|
return html`
|
|
399
463
|
<div class="${stepperClasses}">
|
|
@@ -407,46 +471,46 @@ export class RelStepper extends LitElement {
|
|
|
407
471
|
? html`
|
|
408
472
|
<!-- Indicator with connector below -->
|
|
409
473
|
<div class="indicator-wrapper">
|
|
410
|
-
<div class="indicator">
|
|
474
|
+
<div part="indicator" class="indicator">
|
|
411
475
|
${this.renderIndicator(step, idx)}
|
|
412
476
|
</div>
|
|
413
477
|
${idx < this.steps.length - 1
|
|
414
|
-
? html`<div class="connector"></div>`
|
|
478
|
+
? html`<div part="track" class="connector"></div>`
|
|
415
479
|
: ""}
|
|
416
480
|
</div>
|
|
417
481
|
|
|
418
482
|
<!-- Step Label to the right -->
|
|
419
|
-
<div class="step-label">${step.title}</div>
|
|
483
|
+
<div part="label" class="step-label">${step.title}</div>
|
|
420
484
|
`
|
|
421
485
|
: isVertical
|
|
422
486
|
? html`
|
|
423
487
|
<div class="step-content text-below-content">
|
|
424
488
|
<!-- Step Indicator -->
|
|
425
|
-
<div class="indicator">
|
|
489
|
+
<div part="indicator" class="indicator">
|
|
426
490
|
${this.renderIndicator(step, idx)}
|
|
427
491
|
</div>
|
|
428
492
|
|
|
429
493
|
<!-- Step Label -->
|
|
430
|
-
<div class="step-label">${step.title}</div>
|
|
494
|
+
<div part="label" class="step-label">${step.title}</div>
|
|
431
495
|
</div>
|
|
432
496
|
|
|
433
497
|
<!-- Connector -->
|
|
434
498
|
${idx < this.steps.length - 1
|
|
435
|
-
? html`<div class="connector"></div>`
|
|
499
|
+
? html`<div part="track" class="connector"></div>`
|
|
436
500
|
: ""}
|
|
437
501
|
`
|
|
438
502
|
: html`
|
|
439
503
|
<!-- Step Indicator -->
|
|
440
|
-
<div class="indicator">
|
|
504
|
+
<div part="indicator" class="indicator">
|
|
441
505
|
${this.renderIndicator(step, idx)}
|
|
442
506
|
</div>
|
|
443
507
|
|
|
444
508
|
<!-- Step Label -->
|
|
445
|
-
<div class="step-label">${step.title}</div>
|
|
509
|
+
<div part="label" class="step-label">${step.title}</div>
|
|
446
510
|
|
|
447
511
|
<!-- Connector (for horizontal only) -->
|
|
448
512
|
${!isVertical && idx < this.steps.length - 1
|
|
449
|
-
? html`<div class="connector"></div>`
|
|
513
|
+
? html`<div part="track" class="connector"></div>`
|
|
450
514
|
: ""}
|
|
451
515
|
`}
|
|
452
516
|
</div>
|
|
@@ -58,19 +58,19 @@ None exposed.
|
|
|
58
58
|
The component defines these CSS custom properties on `:host` which can be overridden:
|
|
59
59
|
|
|
60
60
|
- `--switch-track` - Track color when unchecked (default: `--rel-text-placeholder`)
|
|
61
|
-
- `--switch-knob-on` - Knob color when checked (default: `--rel-
|
|
62
|
-
- `--switch-knob-off` - Knob color when unchecked (default: `--rel-
|
|
61
|
+
- `--switch-knob-on` - Knob color when checked (default: `--rel-text-default`)
|
|
62
|
+
- `--switch-knob-off` - Knob color when unchecked (default: `--rel-bg-surface`)
|
|
63
63
|
- `--switch-halo` - Focus halo color (default: `--rel-border-default`)
|
|
64
64
|
- `--switch-disabled` - Color for disabled state (default: `--rel-text-disabled`)
|
|
65
65
|
|
|
66
66
|
### Design Token References
|
|
67
67
|
- `--rel-text-placeholder` - Default track color
|
|
68
68
|
- `--rel-text-dark-placeholder` - Hover track color
|
|
69
|
-
- `--rel-
|
|
70
|
-
- `--rel-
|
|
69
|
+
- `--rel-text-default` - ON knob color
|
|
70
|
+
- `--rel-bg-surface` - OFF knob color
|
|
71
71
|
- `--rel-border-default` - Focus halo
|
|
72
72
|
- `--rel-text-disabled` - Disabled state color
|
|
73
|
-
- `--rel-
|
|
73
|
+
- `--rel-bg-neutral-elevated-1` - Used in disabled styling
|
|
74
74
|
|
|
75
75
|
## Accessibility
|
|
76
76
|
- Uses native checkbox input with `role="switch"` and `aria-checked`
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LitElement, html, css } from "lit";
|
|
2
2
|
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
-
import "../../styles/vars-v2.css";
|
|
4
3
|
|
|
5
4
|
@customElement("rel-switch")
|
|
6
5
|
export class RelSwitch extends LitElement {
|
|
@@ -16,11 +15,12 @@ export class RelSwitch extends LitElement {
|
|
|
16
15
|
|
|
17
16
|
static styles = css`
|
|
18
17
|
:host {
|
|
19
|
-
|
|
20
|
-
--switch-
|
|
21
|
-
--switch-knob-
|
|
22
|
-
--switch-
|
|
23
|
-
--switch-
|
|
18
|
+
color: var(--rel-text-default);
|
|
19
|
+
--switch-track: var(--rel-bg-neutral-elevated-2);
|
|
20
|
+
--switch-knob-on: var(--rel-bg-neutral-inverse-2);
|
|
21
|
+
--switch-knob-off: var(--rel-text-static-light);
|
|
22
|
+
--switch-halo: var(--rel-action-overlay-hover-strong);
|
|
23
|
+
--switch-disabled: var(--rel-bg-neutral-elevated-1);
|
|
24
24
|
display: inline-block;
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -49,8 +49,8 @@ export class RelSwitch extends LitElement {
|
|
|
49
49
|
.switch-slider {
|
|
50
50
|
position: absolute;
|
|
51
51
|
top: 50%;
|
|
52
|
-
left:
|
|
53
|
-
right:
|
|
52
|
+
left: var(--rel-spacing-3xs);
|
|
53
|
+
right: var(--rel-spacing-3xs);
|
|
54
54
|
height: 12px;
|
|
55
55
|
background-color: var(--switch-track);
|
|
56
56
|
border-radius: 999px;
|
|
@@ -82,20 +82,31 @@ export class RelSwitch extends LitElement {
|
|
|
82
82
|
|
|
83
83
|
/* Hover */
|
|
84
84
|
.switch-wrapper:hover:not(.switch-disabled) .switch-slider {
|
|
85
|
-
background-color: var(--rel-
|
|
85
|
+
background-color: var(--rel-bg-neutral);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Hover halo — inverse overlay when checked (dark knob), strong overlay otherwise */
|
|
89
|
+
.switch-wrapper:hover:not(.switch-disabled) .switch-slider::before {
|
|
90
|
+
box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-strong);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.switch-wrapper:hover:not(.switch-disabled) input:checked + .switch-slider::before {
|
|
94
|
+
box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-inverse);
|
|
86
95
|
}
|
|
87
96
|
|
|
88
97
|
/* Focus halo */
|
|
89
98
|
.switch-focused .switch-slider::before {
|
|
90
|
-
box-shadow: 0 0 0
|
|
99
|
+
box-shadow: 0 0 0 2px var(--rel-border-focus-inner), 0 0 0 4px var(--rel-border-focus);
|
|
91
100
|
}
|
|
92
101
|
|
|
93
102
|
/* Pressed */
|
|
94
103
|
.switch-pressed .switch-slider::before {
|
|
95
104
|
transform: scale(0.9) translateY(-50%);
|
|
105
|
+
box-shadow: 0 0 0 6px var(--rel-action-overlay-pressed);
|
|
96
106
|
}
|
|
97
107
|
.switch-pressed input:checked + .switch-slider::before {
|
|
98
108
|
transform: scale(0.9) translateY(-50%) translateX(22px);
|
|
109
|
+
box-shadow: 0 0 0 6px var(--rel-action-overlay-dragged);
|
|
99
110
|
}
|
|
100
111
|
|
|
101
112
|
/* Disabled */
|
|
@@ -166,7 +177,7 @@ export class RelSwitch extends LitElement {
|
|
|
166
177
|
.join(" ");
|
|
167
178
|
|
|
168
179
|
return html`
|
|
169
|
-
<label class="${wrapperClasses}">
|
|
180
|
+
<label part="base" class="${wrapperClasses}">
|
|
170
181
|
<input
|
|
171
182
|
type="checkbox"
|
|
172
183
|
role="switch"
|
|
@@ -179,7 +190,7 @@ export class RelSwitch extends LitElement {
|
|
|
179
190
|
@mousedown=${this.handleMouseDown}
|
|
180
191
|
@mouseup=${this.handleMouseUp}
|
|
181
192
|
/>
|
|
182
|
-
<span class="switch-slider"></span>
|
|
193
|
+
<span part="track" class="switch-slider"></span>
|
|
183
194
|
</label>
|
|
184
195
|
`;
|
|
185
196
|
}
|