@reliability-design/web 1.3.0 → 1.4.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 (123) hide show
  1. package/dist/components/rel-accordion/README.md +13 -13
  2. package/dist/components/rel-accordion/rel-accordion.ts +80 -45
  3. package/dist/components/rel-alert/README.md +15 -15
  4. package/dist/components/rel-alert/rel-alert.ts +161 -159
  5. package/dist/components/rel-avatar/README.md +15 -15
  6. package/dist/components/rel-avatar/rel-avatar.ts +42 -38
  7. package/dist/components/rel-badge/README.md +5 -5
  8. package/dist/components/rel-badge/rel-badge.ts +69 -17
  9. package/dist/components/rel-breadcrumb/README.md +7 -7
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
  11. package/dist/components/rel-button/README.md +20 -20
  12. package/dist/components/rel-button/rel-button.ts +327 -105
  13. package/dist/components/rel-calendar/README.md +5 -5
  14. package/dist/components/rel-calendar/rel-calendar.ts +61 -45
  15. package/dist/components/rel-card/README.md +6 -6
  16. package/dist/components/rel-card/rel-card.ts +88 -35
  17. package/dist/components/rel-cardmedia/README.md +9 -9
  18. package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
  19. package/dist/components/rel-carousel/README.md +3 -3
  20. package/dist/components/rel-carousel/rel-carousel.ts +174 -90
  21. package/dist/components/rel-chart/README.md +8 -8
  22. package/dist/components/rel-chart/rel-chart.ts +59 -41
  23. package/dist/components/rel-checkbox/README.md +7 -7
  24. package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
  25. package/dist/components/rel-chip/README.md +16 -16
  26. package/dist/components/rel-chip/rel-chip.ts +143 -111
  27. package/dist/components/rel-container/README.md +11 -11
  28. package/dist/components/rel-container/rel-container.ts +35 -9
  29. package/dist/components/rel-date-picker/README.md +43 -7
  30. package/dist/components/rel-date-picker/date-format.test.ts +43 -0
  31. package/dist/components/rel-date-picker/date-format.ts +47 -0
  32. package/dist/components/rel-date-picker/rel-date-picker.ts +257 -83
  33. package/dist/components/rel-divider/README.md +9 -9
  34. package/dist/components/rel-divider/rel-divider.ts +10 -9
  35. package/dist/components/rel-drawer/README.md +1 -1
  36. package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
  37. package/dist/components/rel-drawer/rel-drawer.ts +56 -28
  38. package/dist/components/rel-kbd/README.md +20 -20
  39. package/dist/components/rel-kbd/rel-kbd.ts +119 -25
  40. package/dist/components/rel-layout/README.md +1 -1
  41. package/dist/components/rel-layout/rel-layout.ts +2 -2
  42. package/dist/components/rel-menu/README.md +15 -15
  43. package/dist/components/rel-menu/rel-menu.ts +155 -88
  44. package/dist/components/rel-menubar/README.md +20 -20
  45. package/dist/components/rel-menubar/rel-menubar.ts +47 -31
  46. package/dist/components/rel-nav-menu/README.md +21 -21
  47. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
  48. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
  49. package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
  50. package/dist/components/rel-navbar/README.md +7 -7
  51. package/dist/components/rel-navbar/rel-navbar.ts +12 -11
  52. package/dist/components/rel-otp/README.md +3 -3
  53. package/dist/components/rel-otp/rel-otp.ts +46 -30
  54. package/dist/components/rel-pagination/README.md +18 -18
  55. package/dist/components/rel-pagination/rel-pagination.ts +141 -90
  56. package/dist/components/rel-popover/README.md +13 -13
  57. package/dist/components/rel-popover/rel-popover-content.ts +39 -14
  58. package/dist/components/rel-popover/rel-popover.ts +18 -7
  59. package/dist/components/rel-progress/README.md +5 -5
  60. package/dist/components/rel-progress/rel-progress.ts +16 -12
  61. package/dist/components/rel-radio/README.md +9 -9
  62. package/dist/components/rel-radio/rel-radio.ts +64 -50
  63. package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
  64. package/dist/components/rel-resizable/README.md +4 -4
  65. package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
  66. package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
  67. package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
  68. package/dist/components/rel-segmented-button/README.md +10 -10
  69. package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
  70. package/dist/components/rel-select/README.md +14 -14
  71. package/dist/components/rel-select/rel-select.ts +120 -188
  72. package/dist/components/rel-sheet/README.md +10 -10
  73. package/dist/components/rel-sheet/rel-sheet.ts +82 -23
  74. package/dist/components/rel-sidebar/README.md +5 -5
  75. package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
  76. package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
  77. package/dist/components/rel-slider/README.md +10 -10
  78. package/dist/components/rel-slider/rel-slider.ts +230 -57
  79. package/dist/components/rel-snackbar/README.md +9 -9
  80. package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
  81. package/dist/components/rel-stepper/README.md +10 -10
  82. package/dist/components/rel-stepper/rel-stepper.ts +110 -46
  83. package/dist/components/rel-switch/README.md +5 -5
  84. package/dist/components/rel-switch/rel-switch.ts +23 -12
  85. package/dist/components/rel-tab/README.md +13 -13
  86. package/dist/components/rel-tab/rel-tab.ts +73 -23
  87. package/dist/components/rel-table/README.md +7 -7
  88. package/dist/components/rel-table/rel-table-body.ts +2 -1
  89. package/dist/components/rel-table/rel-table-caption.ts +10 -7
  90. package/dist/components/rel-table/rel-table-cell.ts +7 -6
  91. package/dist/components/rel-table/rel-table-footer.ts +4 -3
  92. package/dist/components/rel-table/rel-table-head.ts +11 -9
  93. package/dist/components/rel-table/rel-table-header.ts +2 -1
  94. package/dist/components/rel-table/rel-table-row.ts +5 -4
  95. package/dist/components/rel-table/rel-table.ts +16 -7
  96. package/dist/components/rel-textfield/README.md +11 -11
  97. package/dist/components/rel-textfield/rel-textfield.ts +718 -397
  98. package/dist/components/rel-toast/README.md +11 -11
  99. package/dist/components/rel-toast/rel-toast.ts +33 -30
  100. package/dist/components/rel-tooltip/README.md +7 -7
  101. package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
  102. package/dist/components/rel-topbar/rel-topbar-actions.ts +5 -2
  103. package/dist/components/rel-topbar/rel-topbar-brand.ts +12 -5
  104. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +14 -8
  105. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +8 -5
  106. package/dist/components/rel-topbar/rel-topbar-item.ts +27 -22
  107. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +4 -1
  108. package/dist/components/rel-topbar/rel-topbar-profile.ts +71 -50
  109. package/dist/components/rel-topbar/rel-topbar-utilities.ts +5 -2
  110. package/dist/components/rel-topbar/rel-topbar.ts +37 -29
  111. package/dist/index.d.mts +227 -40
  112. package/dist/index.d.ts +227 -40
  113. package/dist/index.js +3930 -2247
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +4311 -2629
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +653 -346
  118. package/dist/vars-WY2XCF5G.css +653 -0
  119. package/package.json +3 -2
  120. package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
  121. package/dist/styles/vars-v2.css +0 -525
  122. package/dist/vars-I2PC74XD.css +0 -346
  123. package/dist/vars-v2-VMGWTFJZ.css +0 -525
@@ -1,7 +1,6 @@
1
1
  import { LitElement, html, css, nothing } from "lit";
2
2
  import { customElement, property, state, query } from "lit/decorators.js";
3
3
  import "@reliability-design/icons/rel-icon";
4
- import "../../styles/vars-v2.css";
5
4
  import "../rel-button/rel-button";
6
5
 
7
6
  interface RangeDay {
@@ -13,6 +12,7 @@ interface RangeDay {
13
12
  isDraftTo: boolean;
14
13
  isInRange: boolean;
15
14
  isDisabled: boolean;
15
+ isWeekend: boolean;
16
16
  }
17
17
 
18
18
  interface QuickSelect {
@@ -55,8 +55,9 @@ export class RelRangePicker extends LitElement {
55
55
 
56
56
  static styles = css`
57
57
  :host {
58
+ color: var(--rel-text-default);
58
59
  display: inline-block;
59
- font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
60
+ font-family: var(--rel-body-md-regular-font-family);
60
61
  position: relative;
61
62
  }
62
63
 
@@ -75,36 +76,39 @@ export class RelRangePicker extends LitElement {
75
76
  display: flex;
76
77
  align-items: center;
77
78
  justify-content: space-between;
78
- gap: var(--rel-spacing-space-xs, 8px);
79
- padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);
80
- background: var(--rel-color-bg-primary, #fff);
81
- border: 1px solid var(--rel-color-border-default, #ddd);
82
- border-radius: var(--rel-borders-radius-border-radius-200, 8px);
83
- font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
84
- font-size: var(--rel-fontSizes-md, 14px);
85
- color: var(--rel-color-text-primary, #333);
79
+ gap: var(--rel-spacing-xs, 8px);
80
+ padding: var(--rel-spacing-sm, 12px) var(--rel-spacing-md, 16px);
81
+ background: var(--rel-bg-surface);
82
+ border: 1px solid var(--rel-border-default);
83
+ border-radius: var(--rel-border-radius-sm, 8px);
84
+ color: var(--rel-text-default);
86
85
  cursor: pointer;
87
86
  width: 100%;
88
87
  text-align: left;
89
88
  transition: border-color 0.15s ease;
89
+ font-family: var(--rel-body-md-regular-font-family);
90
+ font-weight: var(--rel-body-md-regular-font-weight);
91
+ font-size: var(--rel-body-md-regular-font-size);
92
+ line-height: var(--rel-body-md-regular-line-height);
93
+ letter-spacing: var(--rel-body-md-regular-letter-spacing);
90
94
  }
91
95
 
92
96
  .trigger-button:hover:not(:disabled) {
93
- border-color: var(--rel-color-border-strong, #999);
97
+ border-color: var(--rel-border-accent);
94
98
  }
95
99
 
96
100
  .trigger-button:focus-visible {
97
- outline: 2px solid var(--rel-color-border-focus, #0091ea);
101
+ outline: 2px solid var(--rel-border-focus);
98
102
  outline-offset: 2px;
99
103
  }
100
104
 
101
105
  .trigger-content {
102
106
  flex: 1;
103
- color: var(--rel-color-text-primary, #333);
107
+ color: var(--rel-text-default);
104
108
  }
105
109
 
106
110
  .trigger-content.placeholder {
107
- color: var(--rel-color-text-placeholder, #a9a9a9);
111
+ color: var(--rel-text-placeholder);
108
112
  }
109
113
 
110
114
  /* ── Popover shell ── */
@@ -113,9 +117,9 @@ export class RelRangePicker extends LitElement {
113
117
  top: calc(100% + 4px);
114
118
  left: 0;
115
119
  z-index: 2147483647;
116
- border: 1px solid var(--rel-color-border-default, #ddd);
117
- border-radius: var(--rel-borders-radius-border-radius-200, 8px);
118
- background: var(--rel-color-bg-primary, #fff);
120
+ border: 1px solid var(--rel-border-default);
121
+ border-radius: var(--rel-border-radius-sm, 8px);
122
+ background: var(--rel-bg-neutral);
119
123
  box-shadow: var(--rel-shadows-shadow-200);
120
124
  overflow: visible;
121
125
  display: none;
@@ -139,6 +143,8 @@ export class RelRangePicker extends LitElement {
139
143
 
140
144
  /* ── Two-panel wrapper ── */
141
145
  .picker-wrapper {
146
+ font-family: var(--rel-body-lg-regular-font-family);
147
+ font-weight: var(--rel-body-lg-regular-font-weight);
142
148
  display: flex;
143
149
  flex-direction: row;
144
150
  align-items: stretch;
@@ -149,8 +155,9 @@ export class RelRangePicker extends LitElement {
149
155
  width: 280px;
150
156
  flex-shrink: 0;
151
157
  flex-grow: 0;
152
- border-right: 1px solid var(--rel-color-border-default, #ddd);
153
- padding: 12px;
158
+ border-right: 1px solid var(--rel-border-default);
159
+ padding: var(--rel-spacing-sm);
160
+ background: var(--rel-bg-surface-elevated);
154
161
  display: flex;
155
162
  flex-direction: column;
156
163
  gap: 0;
@@ -166,31 +173,32 @@ export class RelRangePicker extends LitElement {
166
173
  display: flex;
167
174
  align-items: center;
168
175
  justify-content: space-between;
169
- padding: 10px 12px;
176
+ padding: 10px var(--rel-spacing-sm);
170
177
  cursor: pointer;
171
- font-size: 13px;
172
- font-weight: var(--rel-fontWeights-medium, 500);
173
- font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
174
- color: var(--rel-color-text-primary, #333);
175
- background: var(--rel-color-bg-tertiary, #f5f5f5);
178
+ font-family: var(--rel-body-sm-medium-font-family);
179
+ font-weight: var(--rel-body-sm-medium-font-weight);
180
+ font-size: var(--rel-body-sm-medium-font-size);
181
+ line-height: var(--rel-body-sm-medium-line-height);
182
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
183
+ color: var(--rel-action-neutral-label-icons-link);
184
+ background: var(--rel-bg-neutral-elevated-1);
176
185
  border: none;
177
- border-radius: var(--rel-borders-radius-border-radius-200, 8px);
186
+ border-radius: var(--rel-border-radius-sm, 8px);
178
187
  width: 100%;
179
188
  white-space: nowrap;
180
189
  overflow: hidden;
181
190
  text-overflow: ellipsis;
182
191
  transition: background 0.15s ease;
183
- line-height: 1.3;
184
192
  }
185
193
 
186
194
  .preset-item:hover:not(.active) {
187
- background: var(--rel-color-bg-hover, #eeeeee);
195
+ background: var(--rel-action-overlay-hover);
188
196
  }
189
197
 
190
198
  .preset-item.active {
191
- background: #1A1A1A;
192
- color: #FFFFFF;
193
- font-weight: var(--rel-fontWeights-semibold, 600);
199
+ background: var(--rel-bg-neutral-inverse-2);
200
+ color: var(--rel-text-inverse);
201
+ font-weight: var(--rel-body-sm-semibold-font-weight);
194
202
  }
195
203
 
196
204
  .preset-item.full-width {
@@ -203,7 +211,7 @@ export class RelRangePicker extends LitElement {
203
211
  align-items: center;
204
212
  gap: 8px;
205
213
  padding: 14px 8px 4px;
206
- border-top: 1px solid var(--rel-color-border-default, #ddd);
214
+ border-top: 1px solid var(--rel-border-default);
207
215
  margin-top: auto;
208
216
  }
209
217
 
@@ -217,31 +225,36 @@ export class RelRangePicker extends LitElement {
217
225
  position: absolute;
218
226
  top: -8px;
219
227
  left: 10px;
220
- font-size: 11px;
221
- font-weight: var(--rel-fontWeights-medium, 500);
222
- color: var(--rel-color-text-secondary, #9e9e9e);
223
- background: var(--rel-color-bg-primary, #fff);
228
+ /* Figma: the FROM/TO tag is the nested TextField's floating label (body-sm-regular) */
229
+ font-family: var(--rel-body-sm-regular-font-family);
230
+ font-weight: var(--rel-body-sm-regular-font-weight);
231
+ font-size: var(--rel-body-sm-regular-font-size);
232
+ line-height: var(--rel-body-sm-regular-line-height);
233
+ letter-spacing: var(--rel-body-sm-regular-letter-spacing);
234
+ color: var(--rel-text-body);
235
+ background: var(--rel-bg-surface);
224
236
  padding: 0 3px;
225
- line-height: 1;
226
237
  }
227
238
 
228
239
  .date-input-value {
229
240
  display: block;
230
- border: 1px solid var(--rel-color-border-default, #ddd);
231
- border-radius: var(--rel-borders-radius-border-radius-200, 8px);
241
+ border: 1px solid var(--rel-border-default);
242
+ border-radius: var(--rel-border-radius-sm, 8px);
232
243
  padding: 6px 8px;
233
- font-size: var(--rel-fontSizes-md, 14px);
234
- font-weight: var(--rel-fontWeights-semibold, 600);
235
- font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
236
- color: var(--rel-color-text-primary, #333);
237
- background: var(--rel-color-bg-primary, #fff);
244
+ color: var(--rel-text-default);
245
+ background: var(--rel-bg-surface);
238
246
  width: 100%;
239
247
  box-sizing: border-box;
248
+ font-family: var(--rel-body-md-semibold-font-family);
249
+ font-weight: var(--rel-body-md-semibold-font-weight);
250
+ font-size: var(--rel-body-md-semibold-font-size);
251
+ line-height: var(--rel-body-md-semibold-line-height);
252
+ letter-spacing: var(--rel-body-md-semibold-letter-spacing);
240
253
  }
241
254
 
242
255
  .date-input-value.empty {
243
- color: var(--rel-color-text-placeholder, #a9a9a9);
244
- font-weight: var(--rel-fontWeights-regular, 400);
256
+ color: var(--rel-text-placeholder);
257
+ font-weight: var(--rel-body-md-regular-font-weight);
245
258
  }
246
259
 
247
260
  /* ── Right panel: calendar ── */
@@ -263,24 +276,27 @@ export class RelRangePicker extends LitElement {
263
276
  }
264
277
 
265
278
  .month-label {
266
- font-size: 15px;
267
- font-weight: var(--rel-fontWeights-semibold, 600);
268
- color: var(--rel-color-text-heading, #2b2b2b);
279
+ font-family: var(--rel-body-lg-semibold-font-family);
280
+ font-weight: var(--rel-body-lg-semibold-font-weight);
281
+ font-size: var(--rel-body-lg-regular-font-size);
282
+ line-height: var(--rel-body-lg-regular-line-height);
283
+ letter-spacing: var(--rel-body-lg-regular-letter-spacing);
284
+ color: var(--rel-text-label);
269
285
  }
270
286
 
271
287
  .nav-btn {
272
288
  background: none;
273
289
  border: none;
274
290
  cursor: pointer;
275
- color: var(--rel-color-text-primary, #333);
276
- padding: 4px;
277
- border-radius: var(--rel-borders-radius-border-radius-200, 8px);
291
+ color: var(--rel-action-neutral-label-icons-ghost);
292
+ padding: var(--rel-spacing-2xs);
293
+ border-radius: var(--rel-border-radius-sm, 8px);
278
294
  display: flex;
279
295
  align-items: center;
280
296
  transition: background 0.15s ease;
281
297
  }
282
298
 
283
- .nav-btn:hover { background: var(--rel-color-bg-hover, #f5f5f5); }
299
+ .nav-btn:hover { background: var(--rel-action-overlay-hover); }
284
300
 
285
301
  /* ── Weekday header ── */
286
302
  .week-header {
@@ -290,10 +306,14 @@ export class RelRangePicker extends LitElement {
290
306
  }
291
307
 
292
308
  .week-day {
293
- font-size: var(--rel-fontSizes-sm, 12px);
294
- font-weight: var(--rel-fontWeights-semibold, 600);
295
- color: var(--rel-color-text-secondary, #9e9e9e);
309
+ color: var(--rel-text-body);
296
310
  padding: 2px 0;
311
+ /* Figma: sm-regular family + xs-medium weight on sm-medium metrics */
312
+ font-family: var(--rel-body-sm-regular-font-family);
313
+ font-weight: var(--rel-body-xs-medium-font-weight);
314
+ font-size: var(--rel-body-sm-medium-font-size);
315
+ line-height: var(--rel-body-sm-medium-line-height);
316
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
297
317
  text-align: center;
298
318
  }
299
319
 
@@ -323,15 +343,15 @@ export class RelRangePicker extends LitElement {
323
343
  }
324
344
 
325
345
  .day-cell.in-range {
326
- background: var(--rel-color-bg-selected, #eeeeee);
346
+ background: var(--rel-bg-neutral-elevated-2);
327
347
  }
328
348
 
329
349
  .day-cell.range-start:not(.range-end) {
330
- background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #eeeeee) 50%);
350
+ background: linear-gradient(to right, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);
331
351
  }
332
352
 
333
353
  .day-cell.range-end:not(.range-start) {
334
- background: linear-gradient(to left, transparent 50%, var(--rel-color-bg-selected, #eeeeee) 50%);
354
+ background: linear-gradient(to left, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);
335
355
  }
336
356
 
337
357
  .day-cell.range-start.range-end {
@@ -346,72 +366,51 @@ export class RelRangePicker extends LitElement {
346
366
  align-items: center;
347
367
  justify-content: center;
348
368
  border-radius: 50%;
349
- font-size: 13px;
350
- font-weight: var(--rel-fontWeights-medium, 500);
351
- font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
352
- color: var(--rel-color-text-primary, #333);
369
+ font-family: var(--rel-body-sm-medium-font-family);
370
+ font-weight: var(--rel-body-sm-medium-font-weight);
371
+ font-size: var(--rel-body-sm-medium-font-size);
372
+ line-height: var(--rel-body-sm-medium-line-height);
373
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
374
+ color: var(--rel-text-default);
353
375
  position: relative;
354
376
  z-index: 1;
355
377
  transition: background 0.15s ease;
356
- line-height: 1;
357
378
  }
358
379
 
359
380
  .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):hover .day-inner {
360
- background: var(--rel-color-bg-hover, #f5f5f5);
381
+ background: var(--rel-action-overlay-hover);
382
+ }
383
+
384
+ /* Pressed (Figma State=Active): elevated-2 fill on the day circle */
385
+ .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):active .day-inner {
386
+ background: var(--rel-bg-neutral-elevated-2);
387
+ }
388
+
389
+ /* Weekend (Figma Day of a week=Weekend): 70% text opacity unless a range endpoint */
390
+ .day-cell.weekend:not(.range-start):not(.range-end) .day-inner {
391
+ opacity: 0.7;
361
392
  }
362
393
 
363
394
  /* Today: green outline */
364
395
  .day-cell.today:not(.range-start):not(.range-end) .day-inner {
365
- border: 2px solid var(--rel-colors-green-primary, #00f49c);
396
+ font-weight: var(--rel-body-md-medium-font-weight);
397
+ border: 2px solid var(--rel-border-brand);
366
398
  }
367
399
 
368
400
  /* Range endpoints: dark fill */
369
401
  .day-cell.range-start .day-inner,
370
402
  .day-cell.range-end .day-inner {
371
- background: #1A1A1A;
372
- color: #FFFFFF;
373
- font-weight: var(--rel-fontWeights-semibold, 600);
403
+ background: var(--rel-action-brand-fill);
404
+ color: var(--rel-action-brand-label-icons-primary);
405
+ font-weight: var(--rel-body-sm-semibold-font-weight);
374
406
  }
375
407
 
376
408
  /* Today AND endpoint: green ring + dark fill */
377
409
  .day-cell.today.range-start .day-inner,
378
410
  .day-cell.today.range-end .day-inner {
379
- background: #1A1A1A;
380
- color: #FFFFFF;
381
- border: 2px solid var(--rel-colors-green-primary, #00f49c);
382
- }
383
-
384
- /* ── Dark mode overrides ── */
385
- :host-context([data-theme="dark"]) .day-cell.in-range,
386
- :host-context(.dark) .day-cell.in-range {
387
- background: var(--rel-color-bg-selected, #404040);
388
- }
389
-
390
- :host-context([data-theme="dark"]) .day-cell.range-start:not(.range-end),
391
- :host-context(.dark) .day-cell.range-start:not(.range-end) {
392
- background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);
393
- }
394
-
395
- :host-context([data-theme="dark"]) .day-cell.range-end:not(.range-start),
396
- :host-context(.dark) .day-cell.range-end:not(.range-start) {
397
- background: linear-gradient(to left, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);
398
- }
399
-
400
- :host-context([data-theme="dark"]) .day-cell.range-start .day-inner,
401
- :host-context([data-theme="dark"]) .day-cell.range-end .day-inner,
402
- :host-context(.dark) .day-cell.range-start .day-inner,
403
- :host-context(.dark) .day-cell.range-end .day-inner {
404
- background: #F5F5F5;
405
- color: #1A1A1A;
406
- }
407
-
408
- :host-context([data-theme="dark"]) .day-cell.today.range-start .day-inner,
409
- :host-context([data-theme="dark"]) .day-cell.today.range-end .day-inner,
410
- :host-context(.dark) .day-cell.today.range-start .day-inner,
411
- :host-context(.dark) .day-cell.today.range-end .day-inner {
412
- background: #F5F5F5;
413
- color: #1A1A1A;
414
- border: 2px solid var(--rel-colors-green-primary, #00f49c);
411
+ background: var(--rel-action-brand-fill);
412
+ color: var(--rel-action-brand-label-icons-primary);
413
+ border: 2px solid var(--rel-border-brand);
415
414
  }
416
415
 
417
416
  /* ── Footer ── */
@@ -420,7 +419,7 @@ export class RelRangePicker extends LitElement {
420
419
  align-items: center;
421
420
  justify-content: space-between;
422
421
  padding-top: 12px;
423
- border-top: 1px solid var(--rel-color-border-default, #ddd);
422
+ border-top: 1px solid var(--rel-border-default);
424
423
  margin-top: auto;
425
424
  gap: 8px;
426
425
  }
@@ -783,6 +782,7 @@ export class RelRangePicker extends LitElement {
783
782
  isDraftTo: false,
784
783
  isInRange: false,
785
784
  isDisabled: true,
785
+ isWeekend: date.getDay() === 0 || date.getDay() === 6,
786
786
  });
787
787
  }
788
788
 
@@ -807,6 +807,7 @@ export class RelRangePicker extends LitElement {
807
807
  isDraftTo,
808
808
  isInRange,
809
809
  isDisabled: this.isDateDisabled(date),
810
+ isWeekend: date.getDay() === 0 || date.getDay() === 6,
810
811
  });
811
812
  }
812
813
 
@@ -822,6 +823,7 @@ export class RelRangePicker extends LitElement {
822
823
  isDraftTo: false,
823
824
  isInRange: false,
824
825
  isDisabled: true,
826
+ isWeekend: date.getDay() === 0 || date.getDay() === 6,
825
827
  });
826
828
  }
827
829
 
@@ -896,7 +898,7 @@ export class RelRangePicker extends LitElement {
896
898
  `
897
899
  : html`
898
900
  <button
899
- class="trigger-button"
901
+ part="trigger" class="trigger-button"
900
902
  type="button"
901
903
  ?disabled=${this.disabled}
902
904
  aria-haspopup="dialog"
@@ -914,23 +916,23 @@ export class RelRangePicker extends LitElement {
914
916
  `}
915
917
 
916
918
  ${isPopup && this.open
917
- ? html`<div class="backdrop" @click=${this.cancelPopover}></div>`
919
+ ? html`<div part="overlay" class="backdrop" @click=${this.cancelPopover}></div>`
918
920
  : nothing}
919
921
 
920
922
  <div
921
- class="popover ${this.open ? "open" : ""} ${isPopup ? "popup" : ""}"
923
+ part="panel" class="popover ${this.open ? "open" : ""} ${isPopup ? "popup" : ""}"
922
924
  role="dialog"
923
925
  aria-label="Select date range"
924
926
  >
925
927
  <div class="picker-wrapper">
926
928
 
927
929
  <!-- ── Left: Quick select ── -->
928
- <div class="presets">
930
+ <div part="list" class="presets">
929
931
  <div class="presets-grid" role="list" aria-label="Quick date selections">
930
932
  ${quickSelects.map(
931
933
  (qs) => html`
932
934
  <button
933
- class="preset-item ${qs.fullWidth ? "full-width" : ""} ${this.draftActivePreset === qs.label ? "active" : ""}"
935
+ part="option" class="preset-item ${qs.fullWidth ? "full-width" : ""} ${this.draftActivePreset === qs.label ? "active" : ""}"
934
936
  type="button"
935
937
  role="listitem"
936
938
  ?disabled=${this.disabled}
@@ -940,8 +942,8 @@ export class RelRangePicker extends LitElement {
940
942
  <span>${qs.label}</span>
941
943
  ${this.draftActivePreset === qs.label
942
944
  ? html`<svg width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true">
943
- <circle cx="12" cy="12" r="12" fill="#00F49C"/>
944
- <path d="M7 12.5l3.5 3.5 6.5-7" stroke="#000000" stroke-width="2"
945
+ <circle cx="12" cy="12" r="12" fill="var(--rel-bg-brand)"/>
946
+ <path d="M7 12.5l3.5 3.5 6.5-7" stroke="var(--rel-text-static-dark)" stroke-width="2"
945
947
  stroke-linecap="round" stroke-linejoin="round"/>
946
948
  </svg>`
947
949
  : nothing}
@@ -971,7 +973,7 @@ export class RelRangePicker extends LitElement {
971
973
 
972
974
  <div class="calendar-header">
973
975
  <button
974
- class="nav-btn"
976
+ part="action" class="nav-btn"
975
977
  type="button"
976
978
  aria-label="Previous month"
977
979
  @click=${this.previousMonth}
@@ -980,7 +982,7 @@ export class RelRangePicker extends LitElement {
980
982
  </button>
981
983
  <span class="month-label">${this.getMonthName()} ${this.viewYear}</span>
982
984
  <button
983
- class="nav-btn"
985
+ part="action" class="nav-btn"
984
986
  type="button"
985
987
  aria-label="Next month"
986
988
  @click=${this.nextMonth}
@@ -1000,7 +1002,7 @@ export class RelRangePicker extends LitElement {
1000
1002
  </div>
1001
1003
 
1002
1004
  <div
1003
- class="calendar-grid"
1005
+ part="list" class="calendar-grid"
1004
1006
  role="grid"
1005
1007
  aria-label="Select date range"
1006
1008
  @mouseleave=${() => { this.hoverDate = null; }}
@@ -1014,6 +1016,7 @@ export class RelRangePicker extends LitElement {
1014
1016
  day.isToday ? "today" : "",
1015
1017
  day.isDisabled ? "disabled" : "",
1016
1018
  !day.isCurrentMonth ? "other-month" : "",
1019
+ day.isWeekend ? "weekend" : "",
1017
1020
  ]
1018
1021
  .filter(Boolean)
1019
1022
  .join(" ");
@@ -1033,7 +1036,7 @@ export class RelRangePicker extends LitElement {
1033
1036
  })}
1034
1037
  </div>
1035
1038
 
1036
- <div class="calendar-footer">
1039
+ <div part="footer" class="calendar-footer">
1037
1040
  <rel-button
1038
1041
  variant="secondary"
1039
1042
  size="small"
@@ -124,10 +124,10 @@ Draggable separator between panels.
124
124
  ## Styling
125
125
 
126
126
  All styling uses Reliability Design System tokens:
127
- - Borders: `--rel-borders-width-stroke-100`
128
- - Colors: `--rel-colors-gray-*`, `--rel-colors-blue-primary`, `--rel-colors-white`
129
- - Spacing: `--rel-spacing-space-*`
130
- - Border radius: `--rel-borders-radius-border-radius-*`
127
+ - Borders: `--rel-stroke-sm`
128
+ - Colors: `--rel-bg-neutral-elevated-*`, `--rel-bg-info`, `--rel-bg-surface`
129
+ - Spacing: `--rel-spacing-*`
130
+ - Border radius: `--rel-border-radius-*`
131
131
 
132
132
  Panels have `overflow: auto` by default for scrollable content.
133
133
 
@@ -9,7 +9,9 @@ export class RelResizableGroup extends LitElement {
9
9
  * PUBLIC API
10
10
  * ======================= */
11
11
 
12
- @property({ type: String }) direction: "horizontal" | "vertical" = "horizontal";
12
+ // reflect: CSS targets :host([direction="…"]) for flex-direction — without
13
+ // reflection, setting the property in JS leaves the layout unchanged.
14
+ @property({ type: String, reflect: true }) direction: "horizontal" | "vertical" = "horizontal";
13
15
 
14
16
  /* =======================
15
17
  * INTERNAL STATE
@@ -28,6 +30,7 @@ export class RelResizableGroup extends LitElement {
28
30
 
29
31
  static styles = css`
30
32
  :host {
33
+ color: var(--rel-text-default);
31
34
  display: flex;
32
35
  width: 100%;
33
36
  height: 100%;
@@ -135,10 +138,18 @@ export class RelResizableGroup extends LitElement {
135
138
  * ======================= */
136
139
 
137
140
  private onPointerDown = (e: PointerEvent) => {
138
- const target = e.composedPath()[0] as HTMLElement;
139
- if (target.tagName !== "REL-RESIZABLE-HANDLE") return;
141
+ // Find the handle anywhere in the composed path — a pointerdown on the
142
+ // visible `.grabber` (which lives inside the handle's shadow DOM) makes
143
+ // composedPath()[0] a <div>, not the handle, so indexing [0] would abort
144
+ // the drag whenever the user grabs the obvious target.
145
+ const handle = e
146
+ .composedPath()
147
+ .find(
148
+ (el): el is RelResizableHandle =>
149
+ el instanceof HTMLElement && el.tagName === "REL-RESIZABLE-HANDLE"
150
+ );
151
+ if (!handle) return;
140
152
 
141
- const handle = target as RelResizableHandle;
142
153
  const handleIndex = this.handles.indexOf(handle);
143
154
  if (handleIndex === -1) return;
144
155
 
@@ -1,6 +1,5 @@
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
  @customElement("rel-resizable-handle")
6
5
  export class RelResizableHandle extends LitElement {
@@ -26,13 +25,14 @@ export class RelResizableHandle extends LitElement {
26
25
 
27
26
  static styles = css`
28
27
  :host {
28
+ color: var(--rel-text-default);
29
29
  display: flex;
30
30
  align-items: center;
31
31
  justify-content: center;
32
32
  flex-shrink: 0;
33
33
  position: relative;
34
34
  outline: none;
35
- background: var(--rel-color-border-default);
35
+ background: var(--rel-border-default);
36
36
  transition: background 0.15s ease;
37
37
  }
38
38
 
@@ -50,17 +50,21 @@ export class RelResizableHandle extends LitElement {
50
50
 
51
51
  :host(:hover),
52
52
  :host(:focus-visible) {
53
- background: var(--rel-color-bg-selected);
53
+ background: var(--rel-bg-neutral-elevated-1);
54
+ }
55
+
56
+ :host([dragging]) {
57
+ background: var(--rel-bg-neutral-elevated-3);
54
58
  }
55
59
 
56
60
  :host(:focus-visible) {
57
- outline: 2px solid var(--rel-colors-blue-primary);
61
+ outline: 2px solid var(--rel-border-focus);
58
62
  outline-offset: 2px;
59
63
  }
60
64
 
61
65
  .grabber {
62
- background: var(--rel-color-icon-primary);
63
- border-radius: var(--rel-borders-radius-border-radius-500);
66
+ background: var(--rel-text-body);
67
+ border-radius: var(--rel-border-radius-full-rounded);
64
68
  transition: background 0.15s ease;
65
69
  }
66
70
 
@@ -76,15 +80,15 @@ export class RelResizableHandle extends LitElement {
76
80
 
77
81
  :host(:hover) .grabber,
78
82
  :host(:focus-visible) .grabber {
79
- background: var(--rel-color-bg-primary);
83
+ background: var(--rel-bg-surface);
80
84
  }
81
85
 
82
86
  :host([data-dragging]) {
83
- background: var(--rel-color-bg-selected);
87
+ background: var(--rel-bg-neutral-elevated-1);
84
88
  }
85
89
 
86
90
  :host([data-dragging]) .grabber {
87
- background: var(--rel-color-text-primary);
91
+ background: var(--rel-text-default);
88
92
  }
89
93
 
90
94
  @media (prefers-reduced-motion: reduce) {
@@ -23,7 +23,18 @@ export class RelResizablePanel extends LitElement {
23
23
  * ======================= */
24
24
 
25
25
  static styles = css`
26
+ /* Default typography for slotted panel headings (Figma headings-md) */
27
+ ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {
28
+ font-family: var(--rel-headings-md-font-family);
29
+ font-weight: var(--rel-headings-md-font-weight);
30
+ font-size: var(--rel-headings-md-font-size);
31
+ line-height: var(--rel-headings-md-line-height);
32
+ letter-spacing: var(--rel-headings-md-letter-spacing);
33
+ }
34
+
26
35
  :host {
36
+ padding: var(--rel-spacing-md);
37
+ color: var(--rel-text-default);
27
38
  display: flex;
28
39
  flex-direction: column;
29
40
  overflow: auto;