@reliability-design/web 1.1.1 → 1.3.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.
Files changed (69) hide show
  1. package/dist/components/rel-accordion/rel-accordion.ts +289 -150
  2. package/dist/components/rel-alert/rel-alert.ts +34 -34
  3. package/dist/components/rel-avatar/README.md +15 -4
  4. package/dist/components/rel-avatar/rel-avatar.ts +138 -94
  5. package/dist/components/rel-badge/README.md +7 -0
  6. package/dist/components/rel-badge/rel-badge.ts +39 -2
  7. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +6 -6
  8. package/dist/components/rel-button/rel-button.ts +96 -28
  9. package/dist/components/rel-calendar/rel-calendar.ts +15 -8
  10. package/dist/components/rel-card/rel-card.ts +9 -17
  11. package/dist/components/rel-cardmedia/rel-cardmedia.ts +20 -23
  12. package/dist/components/rel-carousel/rel-carousel.ts +596 -468
  13. package/dist/components/rel-checkbox/rel-checkbox.ts +68 -16
  14. package/dist/components/rel-chip/README.md +7 -0
  15. package/dist/components/rel-chip/rel-chip.ts +411 -244
  16. package/dist/components/rel-container/rel-container.ts +2 -2
  17. package/dist/components/rel-date-picker/rel-date-picker.ts +23 -19
  18. package/dist/components/rel-divider/rel-divider.ts +3 -3
  19. package/dist/components/rel-drawer/rel-drawer-footer.ts +0 -2
  20. package/dist/components/rel-drawer/rel-drawer.ts +46 -90
  21. package/dist/components/rel-kbd/rel-kbd.ts +94 -118
  22. package/dist/components/rel-layout/rel-layout.ts +49 -58
  23. package/dist/components/rel-menu/rel-menu.ts +359 -359
  24. package/dist/components/rel-menubar/rel-menubar-menu.css +3 -0
  25. package/dist/components/rel-menubar/rel-menubar-menu.ts +2 -1
  26. package/dist/components/rel-menubar/rel-menubar.ts +603 -605
  27. package/dist/components/rel-otp/rel-otp.ts +22 -25
  28. package/dist/components/rel-pagination/rel-pagination.ts +442 -381
  29. package/dist/components/rel-popover/rel-popover-content.ts +6 -5
  30. package/dist/components/rel-popover/rel-popover.ts +26 -7
  31. package/dist/components/rel-progress/rel-progress.ts +10 -9
  32. package/dist/components/rel-radio/rel-radio.ts +228 -172
  33. package/dist/components/rel-range-picker/rel-range-picker.css +349 -0
  34. package/dist/components/rel-range-picker/rel-range-picker.ts +1080 -0
  35. package/dist/components/rel-resizable/rel-resizable-handle.ts +8 -7
  36. package/dist/components/rel-segmented-button/rel-segmented-button.ts +41 -20
  37. package/dist/components/rel-select/README.md +34 -28
  38. package/dist/components/rel-select/rel-select.ts +1015 -275
  39. package/dist/components/rel-sheet/rel-sheet.ts +365 -684
  40. package/dist/components/rel-skeleton/rel-skeleton.ts +139 -0
  41. package/dist/components/rel-slider/rel-slider.ts +49 -27
  42. package/dist/components/rel-snackbar/rel-snackbar.ts +28 -28
  43. package/dist/components/rel-stepper/rel-stepper.ts +11 -10
  44. package/dist/components/rel-switch/rel-switch.ts +7 -6
  45. package/dist/components/rel-tab/rel-tab.ts +15 -29
  46. package/dist/components/rel-textfield/rel-textfield.ts +192 -35
  47. package/dist/components/rel-toast/rel-toast.ts +21 -13
  48. package/dist/components/rel-tooltip/rel-tooltip.ts +123 -123
  49. package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -0
  50. package/dist/components/rel-topbar/rel-topbar-brand.ts +1 -0
  51. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +32 -2
  52. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +1 -1
  53. package/dist/components/rel-topbar/rel-topbar-item.ts +15 -10
  54. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +1 -0
  55. package/dist/components/rel-topbar/rel-topbar-profile.ts +30 -56
  56. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -0
  57. package/dist/components/rel-topbar/rel-topbar.ts +137 -28
  58. package/dist/index.d.mts +310 -193
  59. package/dist/index.d.ts +310 -193
  60. package/dist/index.js +5562 -3526
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +5328 -3284
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/rel-menubar-menu-BEEQDAXW.css +3 -0
  65. package/dist/styles/vars-v2.css +525 -0
  66. package/dist/styles/vars.css +346 -346
  67. package/dist/{vars-TBB4BMSD.css → vars-I2PC74XD.css} +346 -346
  68. package/dist/vars-v2-VMGWTFJZ.css +525 -0
  69. package/package.json +2 -1
@@ -0,0 +1,139 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+
4
+ export type SkeletonShape = "line" | "circle" | "block";
5
+ export type SkeletonAnimation = "pulse" | "shimmer" | "none";
6
+
7
+ @customElement("rel-skeleton")
8
+ export class RelSkeleton extends LitElement {
9
+ @property({ type: String, reflect: true }) shape: SkeletonShape = "block";
10
+ @property({ type: Number }) lines = 1;
11
+ @property({ type: String }) width = "";
12
+ @property({ type: String }) height = "";
13
+ @property({ type: String, reflect: true }) animation: SkeletonAnimation = "pulse";
14
+ @property({ type: Boolean, reflect: true }) loaded = false;
15
+
16
+ protected override updated(changed: Map<string, unknown>) {
17
+ if (changed.has("width") && this.width) this.style.width = this.width;
18
+ if (changed.has("height") && this.height) this.style.height = this.height;
19
+ }
20
+
21
+ static styles = css`
22
+ :host {
23
+ display: block;
24
+ }
25
+
26
+ :host([loaded]) {
27
+ display: none;
28
+ }
29
+
30
+ /* ── Circle: aspect-ratio keeps it square without requiring explicit height ── */
31
+ :host([shape="circle"]) {
32
+ aspect-ratio: 1 / 1;
33
+ }
34
+
35
+ /* ── Base skeleton surface ── */
36
+ .skeleton-shape,
37
+ .skeleton-bar {
38
+ background: var(--rel-skeleton-color, #c8c8c8);
39
+ border-radius: 4px;
40
+ }
41
+
42
+ /* ── Lines layout ── */
43
+ .skeleton-lines {
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 8px;
47
+ width: 100%;
48
+ }
49
+
50
+ .skeleton-bar {
51
+ height: 14px;
52
+ width: 100%;
53
+ }
54
+
55
+ /* Last line shortens to 65% — mimics real paragraph text that doesn't reach the edge */
56
+ .skeleton-bar.is-last {
57
+ width: 65%;
58
+ }
59
+
60
+ /* ── Shape (circle / block) ── */
61
+ .skeleton-shape {
62
+ width: 100%;
63
+ height: 100%;
64
+ min-height: 16px;
65
+ }
66
+
67
+ :host([shape="circle"]) .skeleton-shape {
68
+ border-radius: 50%;
69
+ /* No min-height — circle is sized entirely by host width + aspect-ratio */
70
+ min-height: unset;
71
+ }
72
+
73
+ /* ── Pulse animation ── */
74
+ @keyframes rel-skeleton-pulse {
75
+ 0%, 100% { opacity: 1; }
76
+ 50% { opacity: 0.4; }
77
+ }
78
+
79
+ :host([animation="pulse"]) .skeleton-shape,
80
+ :host([animation="pulse"]) .skeleton-bar {
81
+ animation: rel-skeleton-pulse 1.5s ease-in-out infinite;
82
+ }
83
+
84
+ /* ── Shimmer animation ── */
85
+ @keyframes rel-skeleton-shimmer {
86
+ 0% { background-position: 200% center; }
87
+ 100% { background-position: -200% center; }
88
+ }
89
+
90
+ :host([animation="shimmer"]) .skeleton-shape,
91
+ :host([animation="shimmer"]) .skeleton-bar {
92
+ background: linear-gradient(
93
+ 90deg,
94
+ var(--rel-skeleton-color, #c8c8c8) 25%,
95
+ var(--rel-skeleton-highlight, #e2e2e2) 50%,
96
+ var(--rel-skeleton-color, #c8c8c8) 75%
97
+ );
98
+ background-size: 200% 100%;
99
+ animation: rel-skeleton-shimmer 1.5s linear infinite;
100
+ }
101
+
102
+ /* ── Dark mode ── */
103
+ :host-context([data-theme="dark"]) {
104
+ --rel-skeleton-color: #2a2a2a;
105
+ --rel-skeleton-highlight: #3d3d3d;
106
+ }
107
+
108
+ /* ── Respect reduced-motion preference ── */
109
+ @media (prefers-reduced-motion: reduce) {
110
+ .skeleton-shape,
111
+ .skeleton-bar {
112
+ animation: none !important;
113
+ }
114
+ }
115
+ `;
116
+
117
+ render() {
118
+ if (this.loaded) return html``;
119
+
120
+ if (this.shape === "line") {
121
+ const count = Math.max(1, this.lines);
122
+ return html`
123
+ <div class="skeleton-lines">
124
+ ${Array.from({ length: count }, (_, i) => html`
125
+ <div class="skeleton-bar ${i === count - 1 && count > 1 ? "is-last" : ""}"></div>
126
+ `)}
127
+ </div>
128
+ `;
129
+ }
130
+
131
+ return html`<div class="skeleton-shape"></div>`;
132
+ }
133
+ }
134
+
135
+ declare global {
136
+ interface HTMLElementTagNameMap {
137
+ "rel-skeleton": RelSkeleton;
138
+ }
139
+ }
@@ -1,5 +1,6 @@
1
1
  import { LitElement, html, css } from "lit";
2
2
  import { customElement, property, state } from "lit/decorators.js";
3
+ import "../../styles/vars-v2.css";
3
4
 
4
5
  export type SliderType = "continuous" | "discrete";
5
6
  export type TrackStyle = "solid" | "dotted";
@@ -34,15 +35,15 @@ export class RelSlider extends LitElement {
34
35
  --track-height: 5px;
35
36
  --thumb-size: 10px;
36
37
  --thumb-stroke: 7px;
37
- --thumb-halo-color: var(--rel-border-default);
38
+ --thumb-halo-color: var(--rel-color-border-default);
38
39
  --tick-size: 4px;
39
40
  --shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
40
- --halo: 0 2px 0 var(--rel-surface-surface), 0 6px 10px rgba(0, 0, 0, 0.07);
41
+ --halo: 0 2px 0 var(--rel-color-bg-tertiary), 0 6px 10px rgba(0, 0, 0, 0.07);
41
42
  --marker-width: 24px;
42
43
  --marker-height: 28px;
43
44
 
44
45
  display: block;
45
- font-family: var(--rel-fontFamilies-primary, sans-serif);
46
+ font-family: var(--rel-fontFamilies-primary);
46
47
  }
47
48
 
48
49
  .rel-slider {
@@ -59,7 +60,7 @@ export class RelSlider extends LitElement {
59
60
  left: 0;
60
61
  width: 100%;
61
62
  height: var(--track-height);
62
- background: var(--rel-colors-gray-border);
63
+ background: var(--rel-color-border-default);
63
64
  border-radius: 2px;
64
65
  transform: translateY(-50%);
65
66
  pointer-events: none;
@@ -70,7 +71,7 @@ export class RelSlider extends LitElement {
70
71
  top: 50%;
71
72
  left: 0;
72
73
  height: var(--track-height);
73
- background: var(--rel-colors-black);
74
+ background: var(--rel-color-text-primary);
74
75
  border-radius: 2px;
75
76
  transform: translateY(-50%);
76
77
  pointer-events: none;
@@ -78,12 +79,10 @@ export class RelSlider extends LitElement {
78
79
 
79
80
  .track-active.dotted {
80
81
  background: radial-gradient(
81
- circle,
82
- var(--rel-colors-white) 0 1px,
83
- transparent 1px
84
- )
85
- center/12px 4px repeat-x,
86
- var(--rel-colors-black);
82
+ circle,
83
+ var(--rel-color-text-primary) 0 2px,
84
+ transparent 2px
85
+ ) 0 50%/12px 5px repeat-x;
87
86
  }
88
87
 
89
88
  /* Input */
@@ -164,8 +163,8 @@ export class RelSlider extends LitElement {
164
163
  .thumb-container {
165
164
  position: absolute;
166
165
  left: 0;
167
- top: 23.5%;
168
- transform: translate(-50%, -50%);
166
+ top: 50%;
167
+ transform: translate(-50%, calc(-100% + var(--thumb-size) / 2));
169
168
  pointer-events: none;
170
169
  z-index: 5;
171
170
  display: flex;
@@ -191,7 +190,7 @@ export class RelSlider extends LitElement {
191
190
  .custom-thumb {
192
191
  width: var(--thumb-size);
193
192
  height: var(--thumb-size);
194
- background: var(--rel-colors-black);
193
+ background: var(--rel-color-text-primary);
195
194
  border-radius: 50%;
196
195
  transition: box-shadow 0.15s ease;
197
196
  }
@@ -215,7 +214,7 @@ export class RelSlider extends LitElement {
215
214
  position: absolute;
216
215
  width: var(--tick-size);
217
216
  height: var(--tick-size);
218
- background: var(--rel-colors-gray-primary);
217
+ background: var(--rel-color-text-primary);
219
218
  border-radius: 50%;
220
219
  transform: translate(-50%, -50%);
221
220
  transition: background 0.2s;
@@ -223,7 +222,7 @@ export class RelSlider extends LitElement {
223
222
  }
224
223
 
225
224
  .tick.active {
226
- background: var(--rel-colors-white);
225
+ background: var(--rel-color-bg-primary);
227
226
  }
228
227
 
229
228
  /* Tick labels */
@@ -233,7 +232,7 @@ export class RelSlider extends LitElement {
233
232
  left: 0;
234
233
  width: 100%;
235
234
  font-size: var(--rel-fontSizes-xs);
236
- color: var(--rel-colors-gray-heading);
235
+ color: var(--rel-color-text-heading);
237
236
  pointer-events: none;
238
237
  }
239
238
 
@@ -244,29 +243,29 @@ export class RelSlider extends LitElement {
244
243
 
245
244
  /* Disabled State */
246
245
  .rel-slider.disabled .track {
247
- background: var(--rel-colors-gray-primary);
246
+ background: var(--rel-color-border-default);
248
247
  }
249
248
 
250
249
  .rel-slider.disabled .track-active {
251
- background: var(--rel-colors-gray-placeholder);
250
+ background: var(--rel-color-text-placeholder);
252
251
  }
253
252
 
254
253
  .rel-slider.disabled .track-active.dotted {
255
254
  background: radial-gradient(
256
255
  circle,
257
- var(--rel-surface-surface) 0 1px,
256
+ var(--rel-color-bg-tertiary) 0 1px,
258
257
  transparent 1px
259
258
  )
260
259
  center/12px 4px repeat-x,
261
- var(--rel-colors-gray-placeholder);
260
+ var(--rel-color-text-placeholder);
262
261
  }
263
262
 
264
263
  .rel-slider.disabled .tick {
265
- background: var(--rel-colors-gray-placeholder);
264
+ background: var(--rel-color-text-placeholder);
266
265
  }
267
266
 
268
267
  .rel-slider.disabled .tick-label {
269
- color: var(--rel-colors-gray-placeholder);
268
+ color: var(--rel-color-text-placeholder);
270
269
  }
271
270
 
272
271
  .rel-slider.disabled .slider-input {
@@ -274,13 +273,36 @@ export class RelSlider extends LitElement {
274
273
  }
275
274
 
276
275
  .rel-slider.disabled .custom-thumb {
277
- background: var(--rel-colors-gray-placeholder);
278
- box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-surface-surface);
276
+ background: var(--rel-color-text-placeholder);
277
+ box-shadow: none;
278
+ }
279
+
280
+ .rel-slider.disabled .slider-input:active ~ .thumb-container .custom-thumb,
281
+ .rel-slider.disabled .slider-input:focus-visible ~ .thumb-container .custom-thumb {
282
+ box-shadow: none;
279
283
  }
280
284
 
281
285
  .rel-slider.disabled .value-marker svg path {
282
286
  fill: var(--rel-colors-gray-placeholder);
283
287
  }
288
+
289
+ /* Dark mode overrides */
290
+ :host-context([data-theme="dark"]),
291
+ :host-context(.dark) {
292
+ --thumb-halo-color: var(--rel-color-border-default);
293
+ --halo: 0 2px 0 var(--rel-color-bg-selected),
294
+ 0 6px 10px rgba(0, 0, 0, 0.3);
295
+ }
296
+
297
+ :host-context([data-theme="dark"]) .value-marker svg path,
298
+ :host-context(.dark) .value-marker svg path {
299
+ fill: #2B2B2B;
300
+ }
301
+
302
+ :host-context([data-theme="dark"]) .value-marker text,
303
+ :host-context(.dark) .value-marker text {
304
+ fill: #FFFFFF;
305
+ }
284
306
  `;
285
307
 
286
308
  connectedCallback() {
@@ -381,12 +403,12 @@ export class RelSlider extends LitElement {
381
403
  <svg viewBox="0 0 24 32" xmlns="http://www.w3.org/2000/svg">
382
404
  <path
383
405
  d="M12 0C18.6274 0 24 5.37258 24 12C24 21 12 32 12 32C12 32 0 21 0 12C0 5.37258 5.37258 0 12 0Z"
384
- fill="var(--rel-colors-black)" />
406
+ fill="var(--rel-color-text-primary)" />
385
407
  <text
386
408
  x="12"
387
409
  y="16"
388
410
  text-anchor="middle"
389
- fill="var(--rel-colors-white)"
411
+ fill="var(--rel-color-bg-primary)"
390
412
  font-size="12"
391
413
  font-family="Poppins"
392
414
  font-weight="600">
@@ -1,5 +1,7 @@
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
+ import "@reliability-design/icons/rel-icon";
3
5
 
4
6
  export type SnackbarLines = "single" | "double";
5
7
  export type SnackbarType = "default" | "success" | "error" | "warning";
@@ -38,10 +40,10 @@ export class RelSnackbar extends LitElement {
38
40
  min-width: 280px;
39
41
  max-width: 500px;
40
42
  margin: 0;
41
- padding: 12px 16px;
43
+ padding: 12px 16px 12px 10px;
42
44
  border-radius: var(--rel-borders-radius-border-radius-200);
43
- background-color: var(--rel-colors-black);
44
- color: var(--rel-colors-white);
45
+ background-color: var(--rel-surface-toast);
46
+ color: #FFFFFF;
45
47
  font-family: var(--rel-fontFamilies-primary);
46
48
  box-shadow: var(--rel-shadows-shadow-300);
47
49
  animation: slide-up 0.3s ease-out;
@@ -59,28 +61,28 @@ export class RelSnackbar extends LitElement {
59
61
 
60
62
  /* Type variants — border accent using semantic DS tokens */
61
63
  .snackbar.type-success {
62
- border-left-color: var(--rel-colors-green-600, #16a34a);
64
+ border-left-color: var(--rel-colors-green-tertiary);
63
65
  }
64
66
 
65
67
  .snackbar.type-error {
66
- border-left-color: var(--rel-colors-red-600, #dc2626);
68
+ border-left-color: var(--rel-colors-red-primary);
67
69
  }
68
70
 
69
71
  .snackbar.type-warning {
70
- border-left-color: var(--rel-colors-amber-600, #d97706);
72
+ border-left-color: var(--rel-colors-orange-warning);
71
73
  }
72
74
 
73
75
  /* Icon color matches type accent */
74
76
  .snackbar.type-success .snackbar-icon {
75
- color: var(--rel-colors-green-400, #4ade80);
77
+ color: var(--rel-colors-green-primary);
76
78
  }
77
79
 
78
80
  .snackbar.type-error .snackbar-icon {
79
- color: var(--rel-colors-red-400, #f87171);
81
+ color: var(--rel-colors-red-secondary);
80
82
  }
81
83
 
82
84
  .snackbar.type-warning .snackbar-icon {
83
- color: var(--rel-colors-amber-400, #fbbf24);
85
+ color: var(--rel-colors-yellow-pending);
84
86
  }
85
87
 
86
88
  .snackbar-icon {
@@ -88,7 +90,6 @@ export class RelSnackbar extends LitElement {
88
90
  align-items: center;
89
91
  margin-right: 10px;
90
92
  flex-shrink: 0;
91
- font-size: 14px;
92
93
  }
93
94
 
94
95
  .snackbar-body {
@@ -126,12 +127,14 @@ export class RelSnackbar extends LitElement {
126
127
  .snackbar-action {
127
128
  background: none;
128
129
  border: none;
129
- color: var(--rel-colors-green-400, #4ade80);
130
+ color: var(--rel-colors-green-primary);
130
131
  font-weight: var(--rel-fontWeights-semibold);
131
132
  font-size: var(--rel-fontSizes-sm);
132
133
  font-family: var(--rel-fontFamilies-primary);
133
134
  cursor: pointer;
134
135
  padding: 0;
136
+ display: flex;
137
+ align-items: center;
135
138
  transition: opacity 0.2s ease;
136
139
  }
137
140
 
@@ -144,7 +147,7 @@ export class RelSnackbar extends LitElement {
144
147
  }
145
148
 
146
149
  .snackbar-action:focus-visible {
147
- outline: 2px solid var(--rel-colors-white, #fff);
150
+ outline: 2px solid #FFFFFF;
148
151
  outline-offset: 2px;
149
152
  border-radius: 2px;
150
153
  }
@@ -152,12 +155,9 @@ export class RelSnackbar extends LitElement {
152
155
  .snackbar-close {
153
156
  background: none;
154
157
  border: none;
155
- color: var(--rel-colors-white, #fff);
158
+ color: #FFFFFF;
156
159
  cursor: pointer;
157
- font-size: 16px;
158
160
  padding: 0;
159
- width: 20px;
160
- height: 20px;
161
161
  display: flex;
162
162
  align-items: center;
163
163
  justify-content: center;
@@ -173,7 +173,7 @@ export class RelSnackbar extends LitElement {
173
173
  }
174
174
 
175
175
  .snackbar-close:focus-visible {
176
- outline: 2px solid var(--rel-colors-white, #fff);
176
+ outline: 2px solid #FFFFFF;
177
177
  outline-offset: 2px;
178
178
  border-radius: 2px;
179
179
  }
@@ -263,13 +263,15 @@ export class RelSnackbar extends LitElement {
263
263
  );
264
264
  }
265
265
 
266
- private getIcon(): string {
267
- switch (this.type) {
268
- case "success": return "✓";
269
- case "error": return "✕";
270
- case "warning": return "⚠";
271
- default: return "";
272
- }
266
+ private renderIcon() {
267
+ const iconMap: Record<string, string> = {
268
+ success: "check-circle",
269
+ error: "error",
270
+ warning: "warning",
271
+ };
272
+ const name = iconMap[this.type];
273
+ if (!name) return html``;
274
+ return html`<rel-icon name="${name}" size="lg" class="snackbar-icon"></rel-icon>`;
273
275
  }
274
276
 
275
277
  render() {
@@ -282,12 +284,10 @@ export class RelSnackbar extends LitElement {
282
284
  .filter(Boolean)
283
285
  .join(" ");
284
286
 
285
- const icon = this.getIcon();
286
-
287
287
  return html`
288
288
  <div class="${snackbarClasses}">
289
289
  <div class="snackbar-body">
290
- ${icon ? html`<span class="snackbar-icon">${icon}</span>` : ""}
290
+ ${this.type !== "default" ? this.renderIcon() : ""}
291
291
  <div class="snackbar-message">${this.message}</div>
292
292
  </div>
293
293
 
@@ -302,7 +302,7 @@ export class RelSnackbar extends LitElement {
302
302
  ${this.iconClose
303
303
  ? html`
304
304
  <button class="snackbar-close" @click="${this.dismiss}">
305
- ✖
305
+ <rel-icon name="close" size="md"></rel-icon>
306
306
  </button>
307
307
  `
308
308
  : ""}
@@ -1,5 +1,6 @@
1
1
  import { LitElement, html, css } from "lit";
2
2
  import { customElement, property } from "lit/decorators.js";
3
+ import "../../styles/vars-v2.css";
3
4
 
4
5
  export type StepStatus = "done" | "progress" | "disabled";
5
6
  export type TextAlign = "right" | "below";
@@ -128,14 +129,14 @@ export class RelStepper extends LitElement {
128
129
  justify-content: center;
129
130
  width: var(--rel-stepper-indicator-size, 22px);
130
131
  height: var(--rel-stepper-indicator-size, 22px);
131
- border: 2px solid var(--rel-colors-gray-border);
132
- background: var(--rel-colors-white);
132
+ border: 2px solid var(--rel-color-border-default);
133
+ background: var(--rel-color-bg-primary);
133
134
  border-radius: 50%;
134
135
  font-size: var(--rel-fontSizes-sm);
135
136
  font-weight: var(--rel-fontWeights-medium);
136
137
  position: relative;
137
138
  z-index: 2;
138
- transition: all 0.2s ease;
139
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
139
140
  flex-shrink: 0;
140
141
  }
141
142
 
@@ -151,7 +152,7 @@ export class RelStepper extends LitElement {
151
152
  .step-label {
152
153
  white-space: nowrap;
153
154
  font-size: var(--rel-fontSizes-sm);
154
- color: var(--rel-text-primary, #333);
155
+ color: var(--rel-color-text-primary);
155
156
  }
156
157
 
157
158
  /* Horizontal text-below specific */
@@ -187,7 +188,7 @@ export class RelStepper extends LitElement {
187
188
  ********************************************/
188
189
  .connector {
189
190
  position: absolute;
190
- background: var(--rel-colors-gray-border);
191
+ background: var(--rel-color-border-default);
191
192
  z-index: 1;
192
193
  }
193
194
 
@@ -198,7 +199,7 @@ export class RelStepper extends LitElement {
198
199
  transform: translateY(-50%);
199
200
  height: 2px;
200
201
  position: absolute;
201
- background: var(--rel-colors-gray-border);
202
+ background: var(--rel-color-border-default);
202
203
  }
203
204
 
204
205
  .rel-stepper.horizontal .rel-step:last-child .connector {
@@ -249,9 +250,9 @@ export class RelStepper extends LitElement {
249
250
  }
250
251
 
251
252
  .rel-step.disabled .indicator {
252
- background: var(--rel-colors-gray-light, #fafafa);
253
- border-color: var(--rel-colors-gray-border, #ddd);
254
- color: var(--rel-text-disabled, #9e9e9e);
253
+ background: var(--rel-color-bg-secondary);
254
+ border-color: var(--rel-color-border-default);
255
+ color: var(--rel-color-text-disabled);
255
256
  }
256
257
 
257
258
  .rel-step.done .connector {
@@ -273,7 +274,7 @@ export class RelStepper extends LitElement {
273
274
  }
274
275
 
275
276
  .rel-step.disabled .step-label {
276
- color: var(--rel-text-disabled, #9e9e9e);
277
+ color: var(--rel-color-text-disabled);
277
278
  }
278
279
 
279
280
  /* Dark mode: ensure progress/done indicator and labels stay readable */
@@ -1,5 +1,6 @@
1
1
  import { LitElement, html, css } from "lit";
2
2
  import { customElement, property, state } from "lit/decorators.js";
3
+ import "../../styles/vars-v2.css";
3
4
 
4
5
  @customElement("rel-switch")
5
6
  export class RelSwitch extends LitElement {
@@ -15,11 +16,11 @@ export class RelSwitch extends LitElement {
15
16
 
16
17
  static styles = css`
17
18
  :host {
18
- --switch-track: var(--rel-text-placeholder);
19
- --switch-knob-on: var(--rel-colors-black);
20
- --switch-knob-off: var(--rel-colors-white);
21
- --switch-halo: var(--rel-border-default);
22
- --switch-disabled: var(--rel-text-disabled);
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);
23
24
  display: inline-block;
24
25
  }
25
26
 
@@ -81,7 +82,7 @@ export class RelSwitch extends LitElement {
81
82
 
82
83
  /* Hover */
83
84
  .switch-wrapper:hover:not(.switch-disabled) .switch-slider {
84
- background-color: var(--rel-text-dark-placeholder);
85
+ background-color: var(--rel-color-text-placeholder);
85
86
  }
86
87
 
87
88
  /* Focus halo */
@@ -1,5 +1,7 @@
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
+ import "../rel-badge/rel-badge";
3
5
 
4
6
  export interface TabItem {
5
7
  label: string;
@@ -28,39 +30,39 @@ export class RelTab extends LitElement {
28
30
  static styles = css`
29
31
  :host {
30
32
  --tab-active-color: var(--rel-colors-green-primary);
31
- --tab-text-default: var(--rel-text-primary);
32
- --tab-text-disabled: var(--rel-text-disabled);
33
- --tab-text-hover: var(--rel-text-heading);
33
+ --tab-text-default: var(--rel-color-text-primary);
34
+ --tab-text-disabled: var(--rel-color-text-disabled);
35
+ --tab-text-hover: var(--rel-color-text-heading);
34
36
  --tab-underline-height: 3px;
35
- --tab-hover-color: var(--rel-surface-surface);
37
+ --tab-hover-color: var(--rel-color-bg-tertiary);
36
38
  display: block;
37
39
  font-family: var(--rel-fontFamilies-primary);
38
40
  }
39
41
 
40
42
  .tabs-wrapper {
41
43
  display: flex;
42
- border-bottom: 1px solid var(--rel-border-tab, #c4c4c4);
43
- font-family: var(--rel-fontFamilies-primary, sans-serif);
44
+ border-bottom: 1px solid var(--rel-border-tab);
45
+ font-family: var(--rel-fontFamilies-primary);
44
46
  user-select: none;
45
47
  }
46
48
 
47
49
  .tab {
48
50
  position: relative;
49
- padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);
51
+ padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
50
52
  cursor: pointer;
51
53
  color: var(--tab-text-default);
52
- font-size: var(--rel-fontSizes-md, 14px);
53
- font-weight: var(--rel-fontWeights-medium, 500);
54
+ font-size: var(--rel-fontSizes-md);
55
+ font-weight: var(--rel-fontWeights-medium);
54
56
  transition: color 0.2s ease;
55
57
  display: flex;
56
58
  align-items: center;
57
- gap: var(--rel-spacing-space-2xs, 4px);
59
+ gap: var(--rel-spacing-space-2xs);
58
60
  }
59
61
 
60
62
  .tab:focus-visible {
61
- outline: 2px solid var(--rel-border-info, #0091ea);
63
+ outline: 2px solid var(--rel-color-border-focus);
62
64
  outline-offset: -2px;
63
- border-radius: var(--rel-borders-radius-border-radius-100, 2px);
65
+ border-radius: var(--rel-borders-radius-border-radius-100);
64
66
  }
65
67
 
66
68
  .tab:hover:not(.disabled) .tab-label {
@@ -91,22 +93,6 @@ export class RelTab extends LitElement {
91
93
  background-color: var(--tab-hover-color);
92
94
  }
93
95
 
94
- /* Badge */
95
- .tab-badge {
96
- display: inline-flex;
97
- justify-content: center;
98
- align-items: center;
99
- background: var(--rel-color-brand);
100
- color: #000000;
101
- border-radius: var(--rel-tab-badge-radius, 50%);
102
- font-size: var(--rel-fontSizes-xs);
103
- font-weight: 600;
104
- min-width: var(--rel-tab-badge-min-width, 16px);
105
- text-align: center;
106
- height: var(--rel-tab-badge-height, 16px);
107
- padding: var(--rel-spacing-space-3xs, 2px);
108
- }
109
-
110
96
  /* Tab content */
111
97
  .tab-content {
112
98
  padding: 1rem 0;
@@ -188,7 +174,7 @@ export class RelTab extends LitElement {
188
174
  >
189
175
  <span class="tab-label">${tab.label}</span>
190
176
  ${tab.badge
191
- ? html`<span class="tab-badge">${tab.badge}</span>`
177
+ ? html`<rel-badge number="${tab.badge}" variant="number" size="sm"></rel-badge>`
192
178
  : ""}
193
179
  <span class="tab-underline"></span>
194
180
  </div>