@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.
Files changed (124) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/components/rel-accordion/README.md +13 -13
  3. package/dist/components/rel-accordion/rel-accordion.ts +80 -45
  4. package/dist/components/rel-alert/README.md +15 -15
  5. package/dist/components/rel-alert/rel-alert.ts +149 -158
  6. package/dist/components/rel-avatar/README.md +15 -15
  7. package/dist/components/rel-avatar/rel-avatar.ts +42 -38
  8. package/dist/components/rel-badge/README.md +5 -5
  9. package/dist/components/rel-badge/rel-badge.ts +46 -11
  10. package/dist/components/rel-breadcrumb/README.md +7 -7
  11. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
  12. package/dist/components/rel-button/README.md +20 -20
  13. package/dist/components/rel-button/rel-button.ts +292 -105
  14. package/dist/components/rel-calendar/README.md +5 -5
  15. package/dist/components/rel-calendar/rel-calendar.ts +68 -45
  16. package/dist/components/rel-card/README.md +6 -6
  17. package/dist/components/rel-card/rel-card.ts +88 -35
  18. package/dist/components/rel-cardmedia/README.md +9 -9
  19. package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
  20. package/dist/components/rel-carousel/README.md +3 -3
  21. package/dist/components/rel-carousel/rel-carousel.ts +174 -90
  22. package/dist/components/rel-chart/README.md +8 -8
  23. package/dist/components/rel-chart/rel-chart.ts +59 -41
  24. package/dist/components/rel-checkbox/README.md +7 -7
  25. package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
  26. package/dist/components/rel-chip/README.md +16 -16
  27. package/dist/components/rel-chip/rel-chip.ts +143 -111
  28. package/dist/components/rel-container/README.md +11 -11
  29. package/dist/components/rel-container/rel-container.ts +35 -9
  30. package/dist/components/rel-date-picker/README.md +43 -7
  31. package/dist/components/rel-date-picker/date-format.test.ts +43 -0
  32. package/dist/components/rel-date-picker/date-format.ts +47 -0
  33. package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
  34. package/dist/components/rel-divider/README.md +9 -9
  35. package/dist/components/rel-divider/rel-divider.ts +10 -9
  36. package/dist/components/rel-drawer/README.md +1 -1
  37. package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
  38. package/dist/components/rel-drawer/rel-drawer.ts +88 -25
  39. package/dist/components/rel-kbd/README.md +20 -20
  40. package/dist/components/rel-kbd/rel-kbd.ts +119 -25
  41. package/dist/components/rel-layout/README.md +1 -1
  42. package/dist/components/rel-layout/rel-layout.ts +2 -2
  43. package/dist/components/rel-menu/README.md +15 -15
  44. package/dist/components/rel-menu/rel-menu.ts +155 -88
  45. package/dist/components/rel-menubar/README.md +20 -20
  46. package/dist/components/rel-menubar/rel-menubar.ts +47 -31
  47. package/dist/components/rel-nav-menu/README.md +21 -21
  48. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
  49. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
  50. package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
  51. package/dist/components/rel-navbar/README.md +7 -7
  52. package/dist/components/rel-navbar/rel-navbar.ts +12 -11
  53. package/dist/components/rel-otp/README.md +3 -3
  54. package/dist/components/rel-otp/rel-otp.ts +46 -30
  55. package/dist/components/rel-pagination/README.md +18 -18
  56. package/dist/components/rel-pagination/rel-pagination.ts +141 -90
  57. package/dist/components/rel-popover/README.md +13 -13
  58. package/dist/components/rel-popover/rel-popover-content.ts +39 -14
  59. package/dist/components/rel-popover/rel-popover.ts +18 -7
  60. package/dist/components/rel-progress/README.md +5 -5
  61. package/dist/components/rel-progress/rel-progress.ts +16 -12
  62. package/dist/components/rel-radio/README.md +9 -9
  63. package/dist/components/rel-radio/rel-radio.ts +64 -50
  64. package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
  65. package/dist/components/rel-resizable/README.md +4 -4
  66. package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
  67. package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
  68. package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
  69. package/dist/components/rel-segmented-button/README.md +10 -10
  70. package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
  71. package/dist/components/rel-select/README.md +14 -14
  72. package/dist/components/rel-select/rel-select.ts +120 -188
  73. package/dist/components/rel-sheet/README.md +10 -10
  74. package/dist/components/rel-sheet/rel-sheet.ts +82 -23
  75. package/dist/components/rel-sidebar/README.md +5 -5
  76. package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
  77. package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
  78. package/dist/components/rel-slider/README.md +10 -10
  79. package/dist/components/rel-slider/rel-slider.ts +230 -57
  80. package/dist/components/rel-snackbar/README.md +9 -9
  81. package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
  82. package/dist/components/rel-stepper/README.md +10 -10
  83. package/dist/components/rel-stepper/rel-stepper.ts +110 -46
  84. package/dist/components/rel-switch/README.md +5 -5
  85. package/dist/components/rel-switch/rel-switch.ts +23 -12
  86. package/dist/components/rel-tab/README.md +13 -13
  87. package/dist/components/rel-tab/rel-tab.ts +63 -19
  88. package/dist/components/rel-table/README.md +7 -7
  89. package/dist/components/rel-table/rel-table-body.ts +2 -1
  90. package/dist/components/rel-table/rel-table-caption.ts +10 -7
  91. package/dist/components/rel-table/rel-table-cell.ts +7 -6
  92. package/dist/components/rel-table/rel-table-footer.ts +4 -3
  93. package/dist/components/rel-table/rel-table-head.ts +11 -9
  94. package/dist/components/rel-table/rel-table-header.ts +2 -1
  95. package/dist/components/rel-table/rel-table-row.ts +5 -4
  96. package/dist/components/rel-table/rel-table.ts +16 -7
  97. package/dist/components/rel-textfield/README.md +11 -11
  98. package/dist/components/rel-textfield/rel-textfield.ts +218 -92
  99. package/dist/components/rel-toast/README.md +11 -11
  100. package/dist/components/rel-toast/rel-toast.ts +33 -30
  101. package/dist/components/rel-tooltip/README.md +7 -7
  102. package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
  103. package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
  104. package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
  105. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
  106. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
  107. package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
  108. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
  109. package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
  110. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
  111. package/dist/components/rel-topbar/rel-topbar.ts +31 -29
  112. package/dist/index.d.mts +159 -39
  113. package/dist/index.d.ts +159 -39
  114. package/dist/index.js +3600 -2269
  115. package/dist/index.js.map +1 -1
  116. package/dist/index.mjs +3930 -2600
  117. package/dist/index.mjs.map +1 -1
  118. package/dist/styles/vars.css +866 -363
  119. package/dist/vars-BYCEEKWJ.css +866 -0
  120. package/package.json +5 -3
  121. package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
  122. package/dist/styles/vars-v2.css +0 -525
  123. package/dist/vars-F54UGCHM.css +0 -363
  124. 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-fontFamilies-primary);
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: 12px 16px 12px 10px;
44
- border-radius: var(--rel-borders-radius-border-radius-200);
45
- background-color: var(--rel-surface-toast);
46
- color: #FFFFFF;
47
- font-family: var(--rel-fontFamilies-primary);
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-colors-green-tertiary);
65
+ border-left-color: var(--rel-bg-success);
65
66
  }
66
67
 
67
68
  .snackbar.type-error {
68
- border-left-color: var(--rel-colors-red-primary);
69
+ border-left-color: var(--rel-bg-danger);
69
70
  }
70
71
 
71
72
  .snackbar.type-warning {
72
- border-left-color: var(--rel-colors-orange-warning);
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-colors-green-primary);
78
+ color: var(--rel-bg-success);
78
79
  }
79
80
 
80
81
  .snackbar.type-error .snackbar-icon {
81
- color: var(--rel-colors-red-secondary);
82
+ color: var(--rel-bg-danger);
82
83
  }
83
84
 
84
85
  .snackbar.type-warning .snackbar-icon {
85
- color: var(--rel-colors-yellow-pending);
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
- font-size: var(--rel-fontSizes-sm);
104
- line-height: var(--rel-lineHeights-lineheight-200);
105
- margin-right: 12px;
106
- flex: 1;
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-space-2xs);
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-colors-green-primary);
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 #FFFFFF;
162
+ outline: 2px solid var(--rel-text-static-light);
151
163
  outline-offset: 2px;
152
- border-radius: 2px;
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: #FFFFFF;
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 #FFFFFF;
188
+ outline: 2px solid var(--rel-text-static-light);
177
189
  outline-offset: 2px;
178
- border-radius: 2px;
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-fontFamilies-primary` - Font family
100
- - `--rel-fontSizes-sm` - Label font size
101
- - `--rel-fontWeights-medium` - Default label font weight
102
- - `--rel-fontWeights-semibold` - Active/done label font weight
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-space-2xs` - Gap between indicators and labels (text-right mode)
105
+ - `--rel-spacing-2xs` - Gap between indicators and labels (text-right mode)
106
106
 
107
107
  ### Color Tokens
108
- - `--rel-colors-white` - Indicator background (progress, disabled states)
109
- - `--rel-colors-black` - Active/done indicator background, text, and connector color
110
- - `--rel-colors-gray-border` - Disabled indicator border and inactive connector
111
- - `--rel-colors-gray-light` - Disabled indicator background
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-primary` - Default label text color
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-fontFamilies-primary);
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-fontFamilies-primary);
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-space-2xs);
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-space-2xs);
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-space-2xs);
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-color-border-default);
133
- background: var(--rel-color-bg-primary);
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
- font-size: var(--rel-fontSizes-sm);
155
- color: var(--rel-color-text-primary);
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-space-2xs);
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-space-xs);
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-color-border-default);
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-color-border-default);
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-color-text-heading);
242
- border-color: var(--rel-color-text-heading);
243
- color: var(--rel-color-text-inverse);
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-color-text-heading);
248
- background: var(--rel-color-bg-primary);
249
- color: var(--rel-color-text-heading);
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-color-bg-secondary);
254
- border-color: var(--rel-color-border-default);
255
- color: var(--rel-color-text-disabled);
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-color-text-heading);
315
+ background: var(--rel-text-label);
260
316
  }
261
317
 
262
318
  .rel-step.progress .connector {
263
- background: var(--rel-color-text-heading);
319
+ background: var(--rel-text-label);
264
320
  }
265
321
 
266
322
  .rel-step.done .step-label {
267
- color: var(--rel-color-text-heading);
268
- font-weight: var(--rel-fontWeights-semibold);
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-color-text-heading);
273
- font-weight: var(--rel-fontWeights-semibold);
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-color-text-disabled);
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-color-text-primary);
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: #ffffff;
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 (step.status === "done") {
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
- this.textAlign === "below" ? "text-below" : "text-right",
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 = this.textAlign === "right";
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-colors-black`)
62
- - `--switch-knob-off` - Knob color when unchecked (default: `--rel-colors-white`)
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-colors-black` - ON knob color
70
- - `--rel-colors-white` - OFF knob color
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-surface-surface` - Used in disabled styling
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
- --switch-track: var(--rel-color-text-placeholder);
20
- --switch-knob-on: var(--rel-color-text-primary);
21
- --switch-knob-off: var(--rel-color-bg-primary);
22
- --switch-halo: var(--rel-color-border-default);
23
- --switch-disabled: var(--rel-color-text-disabled);
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: 4px;
53
- right: 4px;
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-color-text-placeholder);
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 6px var(--switch-halo);
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
  }