@reliability-design/web 1.3.1 → 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 +153 -158
  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 +46 -11
  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 +292 -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 +154 -82
  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 +63 -19
  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 +172 -91
  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 +1 -2
  103. package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
  104. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
  105. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
  106. package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
  107. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
  108. package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
  109. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
  110. package/dist/components/rel-topbar/rel-topbar.ts +31 -29
  111. package/dist/index.d.mts +151 -39
  112. package/dist/index.d.ts +151 -39
  113. package/dist/index.js +3544 -2289
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +3876 -2622
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +653 -363
  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-F54UGCHM.css +0 -363
  123. package/dist/vars-v2-VMGWTFJZ.css +0 -525
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Token-based date formatting for rel-date-picker's selected-value display.
3
+ *
4
+ * Pure (Date + Intl only, no DOM) so it is unit-testable in Node. Tokens are
5
+ * matched longest-first; anything else (separators like `-` `/` `.` and spaces)
6
+ * passes through literally. Wrap literal text that contains token letters in
7
+ * square brackets, e.g. `[Week of] YYYY-MM-DD`.
8
+ *
9
+ * | Token | Meaning | Example (2026-07-21) |
10
+ * |-------|------------------------|----------------------|
11
+ * | YYYY | 4-digit year | 2026 |
12
+ * | YY | 2-digit year | 26 |
13
+ * | MMMM | full month (locale) | July |
14
+ * | MMM | short month (locale) | Jul |
15
+ * | MM | 2-digit month | 07 |
16
+ * | M | month number | 7 |
17
+ * | DD | 2-digit day | 21 |
18
+ * | D | day number | 21 |
19
+ */
20
+ export function formatDatePattern(
21
+ date: Date,
22
+ pattern: string,
23
+ locale = "en-US"
24
+ ): string {
25
+ const pad = (n: number) => String(n).padStart(2, "0");
26
+ const year = date.getFullYear();
27
+ const month = date.getMonth() + 1;
28
+ const day = date.getDate();
29
+
30
+ const tokens: Record<string, string> = {
31
+ YYYY: String(year),
32
+ YY: String(year).slice(-2),
33
+ MMMM: new Intl.DateTimeFormat(locale, { month: "long" }).format(date),
34
+ MMM: new Intl.DateTimeFormat(locale, { month: "short" }).format(date),
35
+ MM: pad(month),
36
+ M: String(month),
37
+ DD: pad(day),
38
+ D: String(day),
39
+ };
40
+
41
+ // `\[([^\]]*)\]` captures a bracketed literal (emitted without the brackets);
42
+ // otherwise the matched token is substituted from the map.
43
+ return pattern.replace(
44
+ /\[([^\]]*)\]|YYYY|YY|MMMM|MMM|MM|M|DD|D/g,
45
+ (match, literal) => (literal !== undefined ? literal : tokens[match])
46
+ );
47
+ }
@@ -1,5 +1,6 @@
1
1
  import { LitElement, html, css, nothing } from "lit";
2
2
  import { customElement, property, state, query } from "lit/decorators.js";
3
+ import { formatDatePattern } from "./date-format";
3
4
 
4
5
  interface CalendarDay {
5
6
  date: Date;
@@ -30,6 +31,20 @@ export class RelDatePicker extends LitElement {
30
31
 
31
32
  @property({ type: String, attribute: "week-start" }) weekStart: "sun" | "mon" = "sun";
32
33
  @property({ type: String }) locale = "en-US";
34
+
35
+ // ── Display formatting of the SELECTED value ──
36
+ // `displayFormat` is a token pattern (YYYY-MM-DD, MM/DD/YYYY, DD/MM/YYYY, …);
37
+ // see date-format.ts for the token table. `formatDate` is a full callback and
38
+ // takes precedence. When neither is set the locale long date is used, so
39
+ // existing consumers are unaffected. Neither affects parsing, the popup
40
+ // calendar, or accessibility — only the visible trigger text.
41
+ @property({ type: String, attribute: "display-format" }) displayFormat: string | null = null;
42
+ /**
43
+ * Full control over the selected-value display; wins over `displayFormat`.
44
+ * Reactive (attribute:false) so assigning it after render re-renders the
45
+ * trigger — frameworks set callbacks as properties post-creation.
46
+ */
47
+ @property({ attribute: false }) formatDate?: (date: Date) => string;
33
48
  @property({ type: Boolean, reflect: true }) open = false;
34
49
  @property({ type: Boolean, attribute: "close-on-select" }) closeOnSelect = true;
35
50
  @property({ type: Boolean }) clearable = false;
@@ -66,8 +81,9 @@ export class RelDatePicker extends LitElement {
66
81
 
67
82
  static styles = css`
68
83
  :host {
84
+ color: var(--rel-text-default);
69
85
  display: block;
70
- font-family: var(--rel-fontFamilies-primary);
86
+ font-family: var(--rel-fonts-font-family);
71
87
  position: relative;
72
88
  }
73
89
 
@@ -93,28 +109,47 @@ export class RelDatePicker extends LitElement {
93
109
  .date-picker-wrapper {
94
110
  display: flex;
95
111
  flex-direction: column;
96
- gap: var(--rel-spacing-space-xs);
112
+ gap: var(--rel-spacing-xs);
97
113
  }
98
114
 
99
115
  .label {
100
- font-size: var(--rel-fontSizes-sm);
101
- font-weight: var(--rel-fontWeights-medium);
102
- color: var(--rel-text-heading);
116
+ color: var(--rel-text-label);
117
+
118
+ font-family: var(--rel-body-sm-medium-font-family);
119
+
120
+ font-weight: var(--rel-body-sm-medium-font-weight);
121
+
122
+ font-size: var(--rel-body-sm-medium-font-size);
123
+
124
+ line-height: var(--rel-body-sm-medium-line-height);
125
+
126
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
127
+
103
128
  }
104
129
 
105
130
  .required-mark {
106
- color: var(--rel-error-surface-default, #cc0000);
131
+ color: var(--rel-text-danger);
107
132
  margin-left: 2px;
108
133
  }
109
134
 
110
135
  /* Support text (helperText / errorMessage) */
111
136
  .date-picker-support {
112
- font-size: var(--rel-fontSizes-xs);
113
- color: var(--rel-color-text-placeholder);
137
+ color: var(--rel-text-placeholder);
138
+
139
+ font-family: var(--rel-body-xs-regular-font-family);
140
+
141
+ font-weight: var(--rel-body-xs-regular-font-weight);
142
+
143
+ font-size: var(--rel-body-xs-regular-font-size);
144
+
145
+ line-height: var(--rel-body-xs-regular-line-height);
146
+
147
+ letter-spacing: var(--rel-body-xs-regular-letter-spacing);
148
+
114
149
  }
115
150
 
116
151
  .date-picker-support.error {
117
- color: var(--rel-error-surface-default, #cc0000);
152
+ color: var(--rel-text-danger);
118
153
  }
119
154
 
120
155
  .trigger-button {
@@ -123,87 +158,98 @@ export class RelDatePicker extends LitElement {
123
158
  display: flex;
124
159
  align-items: center;
125
160
  justify-content: space-between;
126
- gap: var(--rel-spacing-space-xs);
127
- padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
128
- background: var(--rel-color-bg-primary);
161
+ gap: var(--rel-spacing-xs);
162
+ padding: var(--rel-spacing-sm) var(--rel-spacing-md);
163
+ background: var(--rel-bg-surface);
129
164
  border: 1px solid var(--rel-border-default);
130
- border-radius: var(--rel-borders-radius-border-radius-200);
131
- font-family: var(--rel-fontFamilies-primary);
132
- font-size: var(--rel-fontSizes-md);
133
- color: var(--rel-text-primary);
165
+ border-radius: var(--rel-border-radius-sm);
166
+ color: var(--rel-text-default);
134
167
  cursor: pointer;
135
168
  transition: all 0.15s ease;
136
169
  text-align: left;
170
+ font-family: var(--rel-body-md-regular-font-family);
171
+ font-weight: var(--rel-body-md-regular-font-weight);
172
+ font-size: var(--rel-body-md-regular-font-size);
173
+ line-height: var(--rel-body-md-regular-line-height);
174
+ letter-spacing: var(--rel-body-md-regular-letter-spacing);
137
175
  }
138
176
 
139
177
  .trigger-button:hover:not(:disabled) {
140
- border-color: var(--rel-color-border-strong);
178
+ border-color: var(--rel-border-strong);
141
179
  }
142
180
 
143
181
  .trigger-button:focus-visible {
144
- outline: 2px solid var(--rel-color-border-focus);
182
+ outline: 2px solid var(--rel-border-focus);
145
183
  outline-offset: 2px;
146
- border-color: var(--rel-color-border-focus);
184
+ border-color: var(--rel-border-focus);
147
185
  }
148
186
 
149
187
  .trigger-button:disabled {
150
188
  cursor: not-allowed;
151
- background: var(--rel-surface-secondary);
189
+ background: var(--rel-bg-surface-elevated);
152
190
  }
153
191
 
154
192
  /* Error state */
155
193
  .trigger-button.error,
156
194
  .trigger-button.error:hover:not(:disabled) {
157
- border-color: var(--rel-error-surface-default, #cc0000);
195
+ border-color: var(--rel-border-danger);
158
196
  }
159
197
 
160
198
  .trigger-button.error:focus-visible {
161
- outline-color: var(--rel-error-surface-default, #cc0000);
162
- border-color: var(--rel-error-surface-default, #cc0000);
199
+ outline-color: var(--rel-border-danger);
200
+ border-color: var(--rel-border-danger);
163
201
  }
164
202
 
165
203
  /* Size variants (medium is the base .trigger-button style) */
166
204
  .date-picker-wrapper.small .trigger-button {
167
- padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
168
- font-size: var(--rel-fontSizes-sm);
205
+ padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
206
+ font-family: var(--rel-body-sm-regular-font-family);
207
+ font-weight: var(--rel-body-sm-regular-font-weight);
208
+ font-size: var(--rel-body-sm-regular-font-size);
209
+ line-height: var(--rel-body-sm-regular-line-height);
210
+ letter-spacing: var(--rel-body-sm-regular-letter-spacing);
169
211
  }
170
212
 
171
213
  .date-picker-wrapper.large .trigger-button {
172
- padding: var(--rel-spacing-space-md) var(--rel-spacing-space-md);
173
- font-size: var(--rel-fontSizes-lg);
214
+ padding: var(--rel-spacing-md) var(--rel-spacing-md);
215
+ font-family: var(--rel-body-lg-regular-font-family);
216
+ font-weight: var(--rel-body-lg-regular-font-weight);
217
+ font-size: var(--rel-body-lg-regular-font-size);
218
+ line-height: var(--rel-body-lg-regular-line-height);
219
+ letter-spacing: var(--rel-body-lg-regular-letter-spacing);
174
220
  }
175
221
 
176
222
  .trigger-content {
177
223
  flex: 1;
178
- color: var(--rel-text-primary);
224
+ color: var(--rel-text-default);
179
225
  }
180
226
 
181
227
  .trigger-content.placeholder {
182
- color: var(--rel-colors-gray-placeholder);
228
+ color: var(--rel-text-placeholder);
183
229
  }
184
230
 
185
231
  .trigger-icons {
186
232
  display: flex;
187
233
  align-items: center;
188
- gap: var(--rel-spacing-space-2xs);
234
+ gap: var(--rel-spacing-2xs);
189
235
  }
190
236
 
191
237
  .icon-button {
192
238
  background: none;
193
239
  border: none;
194
- padding: var(--rel-spacing-space-3xs);
240
+ padding: var(--rel-spacing-3xs);
195
241
  cursor: pointer;
196
- color: var(--rel-color-text-placeholder);
242
+ color: var(--rel-text-placeholder);
197
243
  display: flex;
198
244
  align-items: center;
199
245
  justify-content: center;
200
- border-radius: var(--rel-borders-radius-border-radius-100);
246
+ border-radius: var(--rel-border-radius-xs);
201
247
  transition: all 0.15s ease;
202
248
  }
203
249
 
204
250
  .icon-button:hover {
205
- background: var(--rel-surface-secondary);
206
- color: var(--rel-color-text-primary);
251
+ background: var(--rel-bg-surface-elevated);
252
+ color: var(--rel-text-default);
207
253
  }
208
254
 
209
255
  .icon-button svg {
@@ -216,11 +262,11 @@ export class RelDatePicker extends LitElement {
216
262
  top: calc(100% + 4px);
217
263
  left: 0;
218
264
  z-index: 1000;
219
- background: var(--rel-color-bg-primary);
265
+ background: var(--rel-bg-surface);
220
266
  border: 1px solid var(--rel-border-default);
221
- border-radius: var(--rel-borders-radius-border-radius-200);
267
+ border-radius: var(--rel-border-radius-sm);
222
268
  box-shadow: var(--rel-shadows-shadow-300);
223
- padding: var(--rel-spacing-space-md);
269
+ padding: var(--rel-spacing-md);
224
270
  min-width: 280px;
225
271
  display: none;
226
272
  }
@@ -233,8 +279,8 @@ export class RelDatePicker extends LitElement {
233
279
  display: flex;
234
280
  align-items: center;
235
281
  justify-content: space-between;
236
- margin-bottom: var(--rel-spacing-space-md);
237
- gap: var(--rel-spacing-space-xs);
282
+ margin-bottom: var(--rel-spacing-md);
283
+ gap: var(--rel-spacing-xs);
238
284
  }
239
285
 
240
286
  .nav-button {
@@ -242,21 +288,21 @@ export class RelDatePicker extends LitElement {
242
288
  border: none;
243
289
  width: 32px;
244
290
  height: 32px;
245
- border-radius: var(--rel-borders-radius-border-radius-200);
291
+ border-radius: var(--rel-border-radius-sm);
246
292
  display: flex;
247
293
  align-items: center;
248
294
  justify-content: center;
249
295
  cursor: pointer;
250
- color: var(--rel-color-text-primary);
296
+ color: var(--rel-text-default);
251
297
  transition: background-color 0.15s ease;
252
298
  }
253
299
 
254
300
  .nav-button:hover {
255
- background: var(--rel-surface-secondary);
301
+ background: var(--rel-bg-surface-elevated);
256
302
  }
257
303
 
258
304
  .nav-button:focus-visible {
259
- outline: 2px solid var(--rel-color-border-focus);
305
+ outline: 2px solid var(--rel-border-focus);
260
306
  outline-offset: 2px;
261
307
  }
262
308
 
@@ -267,25 +313,27 @@ export class RelDatePicker extends LitElement {
267
313
 
268
314
  .dropdown-trigger {
269
315
  width: 100%;
270
- padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
271
- background: var(--rel-color-bg-primary);
316
+ padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
317
+ background: var(--rel-bg-surface);
272
318
  border: 1px solid var(--rel-border-default);
273
- border-radius: var(--rel-borders-radius-border-radius-200);
274
- font-family: var(--rel-fontFamilies-primary);
275
- font-size: var(--rel-fontSizes-sm);
276
- font-weight: var(--rel-fontWeights-medium);
277
- color: var(--rel-text-heading);
319
+ border-radius: var(--rel-border-radius-sm);
320
+ color: var(--rel-text-label);
278
321
  cursor: pointer;
279
322
  text-align: center;
280
323
  transition: all 0.15s ease;
324
+ font-family: var(--rel-body-sm-medium-font-family);
325
+ font-weight: var(--rel-body-sm-medium-font-weight);
326
+ font-size: var(--rel-body-sm-medium-font-size);
327
+ line-height: var(--rel-body-sm-medium-line-height);
328
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
281
329
  }
282
330
 
283
331
  .dropdown-trigger:hover {
284
- background: var(--rel-surface-secondary);
332
+ background: var(--rel-bg-surface-elevated);
285
333
  }
286
334
 
287
335
  .dropdown-trigger:focus-visible {
288
- outline: 2px solid var(--rel-color-border-focus);
336
+ outline: 2px solid var(--rel-border-focus);
289
337
  outline-offset: 2px;
290
338
  }
291
339
 
@@ -295,9 +343,9 @@ export class RelDatePicker extends LitElement {
295
343
  left: 0;
296
344
  right: 0;
297
345
  z-index: 10;
298
- background: var(--rel-color-bg-primary);
346
+ background: var(--rel-bg-surface);
299
347
  border: 1px solid var(--rel-border-default);
300
- border-radius: var(--rel-borders-radius-border-radius-200);
348
+ border-radius: var(--rel-border-radius-sm);
301
349
  box-shadow: var(--rel-shadows-shadow-200);
302
350
  max-height: 200px;
303
351
  overflow-y: auto;
@@ -309,81 +357,90 @@ export class RelDatePicker extends LitElement {
309
357
  }
310
358
 
311
359
  .dropdown-item {
312
- padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
360
+ padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
313
361
  cursor: pointer;
314
- font-size: var(--rel-fontSizes-sm);
315
- color: var(--rel-text-primary);
362
+ color: var(--rel-text-default);
316
363
  transition: background-color 0.15s ease;
364
+ font-family: var(--rel-body-sm-regular-font-family);
365
+ font-weight: var(--rel-body-sm-regular-font-weight);
366
+ font-size: var(--rel-body-sm-regular-font-size);
367
+ line-height: var(--rel-body-sm-regular-line-height);
368
+ letter-spacing: var(--rel-body-sm-regular-letter-spacing);
317
369
  }
318
370
 
319
371
  .dropdown-item:hover {
320
- background: var(--rel-surface-secondary);
372
+ background: var(--rel-bg-surface-elevated);
321
373
  }
322
374
 
323
375
  .dropdown-item.selected {
324
- background: var(--rel-background-info);
376
+ background: var(--rel-bg-info-light);
325
377
  color: var(--rel-text-info);
326
- font-weight: var(--rel-fontWeights-semibold);
378
+ font-weight: var(--rel-body-md-semibold-font-weight);
327
379
  }
328
380
 
329
381
  .weekdays {
330
382
  display: grid;
331
383
  grid-template-columns: repeat(7, 1fr);
332
- gap: var(--rel-spacing-space-3xs);
333
- margin-bottom: var(--rel-spacing-space-xs);
384
+ gap: var(--rel-spacing-3xs);
385
+ margin-bottom: var(--rel-spacing-xs);
334
386
  }
335
387
 
336
388
  .weekday {
337
389
  text-align: center;
338
- font-size: var(--rel-fontSizes-xs);
339
- font-weight: var(--rel-fontWeights-semibold);
340
- color: var(--rel-color-text-placeholder);
341
- padding: var(--rel-spacing-space-xs);
390
+ color: var(--rel-text-placeholder);
391
+ padding: var(--rel-spacing-xs);
342
392
  text-transform: uppercase;
393
+ font-family: var(--rel-body-xs-semibold-font-family);
394
+ font-weight: var(--rel-body-xs-semibold-font-weight);
395
+ font-size: var(--rel-body-xs-semibold-font-size);
396
+ line-height: var(--rel-body-xs-semibold-line-height);
397
+ letter-spacing: var(--rel-body-xs-semibold-letter-spacing);
343
398
  }
344
399
 
345
400
  .calendar-grid {
346
401
  display: grid;
347
402
  grid-template-columns: repeat(7, 1fr);
348
- gap: var(--rel-spacing-space-3xs);
403
+ gap: var(--rel-spacing-3xs);
349
404
  }
350
405
 
351
406
  .day-button {
352
407
  aspect-ratio: 1;
353
408
  border: none;
354
409
  background: transparent;
355
- border-radius: var(--rel-borders-radius-border-radius-200);
356
- font-size: var(--rel-fontSizes-sm);
357
- font-weight: var(--rel-fontWeights-medium);
358
- color: var(--rel-text-primary);
410
+ border-radius: var(--rel-border-radius-sm);
411
+ color: var(--rel-text-default);
359
412
  cursor: pointer;
360
413
  position: relative;
361
414
  transition: all 0.15s ease;
362
- font-family: var(--rel-fontFamilies-primary);
415
+ font-family: var(--rel-body-sm-medium-font-family);
416
+ font-weight: var(--rel-body-sm-medium-font-weight);
417
+ font-size: var(--rel-body-sm-medium-font-size);
418
+ line-height: var(--rel-body-sm-medium-line-height);
419
+ letter-spacing: var(--rel-body-sm-medium-letter-spacing);
363
420
  }
364
421
 
365
422
  .day-button:hover:not(:disabled):not(.selected) {
366
- background: var(--rel-surface-secondary);
423
+ background: var(--rel-bg-surface-elevated);
367
424
  }
368
425
 
369
426
  .day-button:focus-visible {
370
- outline: 2px solid var(--rel-color-border-focus);
427
+ outline: 2px solid var(--rel-border-focus);
371
428
  outline-offset: -2px;
372
429
  z-index: 1;
373
430
  }
374
431
 
375
432
  .day-button.today:not(.selected) {
376
- border: 2px solid var(--rel-colors-green-primary);
433
+ border: 2px solid var(--rel-border-brand);
377
434
  }
378
435
 
379
436
  .day-button.selected {
380
- background: var(--rel-colors-green-primary);
381
- color: var(--rel-color-text-inverse);
382
- font-weight: var(--rel-fontWeights-semibold);
437
+ background: var(--rel-action-brand-fill);
438
+ color: var(--rel-action-brand-label-icons-primary);
439
+ font-weight: var(--rel-body-md-semibold-font-weight);
383
440
  }
384
441
 
385
442
  .day-button.other-month {
386
- color: var(--rel-colors-gray-placeholder);
443
+ color: var(--rel-text-placeholder);
387
444
  opacity: 0.5;
388
445
  }
389
446
 
@@ -483,6 +540,21 @@ export class RelDatePicker extends LitElement {
483
540
  const date = this.parseISODate(iso);
484
541
  if (!date) return iso;
485
542
 
543
+ // 1) explicit callback wins (fall back on error so a bad callback can't
544
+ // blank the field)
545
+ if (typeof this.formatDate === "function") {
546
+ try {
547
+ const out = this.formatDate(date);
548
+ if (typeof out === "string") return out;
549
+ } catch {
550
+ /* fall through to the default */
551
+ }
552
+ }
553
+ // 2) token pattern (e.g. "YYYY-MM-DD")
554
+ if (this.displayFormat) {
555
+ return formatDatePattern(date, this.displayFormat, this.locale);
556
+ }
557
+ // 3) backward-compatible locale long date
486
558
  return new Intl.DateTimeFormat(this.locale, {
487
559
  year: "numeric",
488
560
  month: "long",
@@ -832,9 +904,9 @@ export class RelDatePicker extends LitElement {
832
904
  .join(" ");
833
905
 
834
906
  return html`
835
- <div class="${wrapperClasses}">
907
+ <div part="base" class="${wrapperClasses}">
836
908
  ${this.label
837
- ? html`<label class="label" id="date-picker-label"
909
+ ? html`<label part="label" class="label" id="date-picker-label"
838
910
  >${this.label}${this.required
839
911
  ? html`<span class="required-mark" aria-hidden="true">*</span>`
840
912
  : nothing}</label
@@ -59,17 +59,17 @@ None exposed.
59
59
  ## Tokens / CSS Variables
60
60
 
61
61
  ### Semantic Tokens
62
- - `--rel-fontFamilies-primary` - Font family
63
- - `--rel-colors-gray-primary` - Text color (not used visually, but set)
62
+ - `--rel-fonts-font-family` - Font family
63
+ - `--rel-text-default` - Text color (not used visually, but set)
64
64
 
65
65
  ### Color Tokens
66
- - `--rel-colors-gray-border` - Divider line color
66
+ - `--rel-border-default` - Divider line color
67
67
 
68
68
  ### Border Tokens
69
- - `--rel-borders-width-stroke-100` - Line thickness (width/height)
69
+ - `--rel-stroke-sm` - Line thickness (width/height)
70
70
 
71
71
  ### Spacing Tokens
72
- - `--rel-spacing-space-md` - Margin around divider
72
+ - `--rel-spacing-md` - Margin around divider
73
73
 
74
74
  ## Accessibility
75
75
  - Uses `role="separator"` for proper ARIA semantics
@@ -84,13 +84,13 @@ None exposed.
84
84
  ## Notes / Edge Cases
85
85
  - **Horizontal orientation**:
86
86
  - `width: 100%`
87
- - `height: var(--rel-borders-width-stroke-100)`
88
- - `margin: var(--rel-spacing-space-md) 0` (vertical margin)
87
+ - `height: var(--rel-stroke-sm)`
88
+ - `margin: var(--rel-spacing-md) 0` (vertical margin)
89
89
 
90
90
  - **Vertical orientation**:
91
- - `width: var(--rel-borders-width-stroke-100)`
91
+ - `width: var(--rel-stroke-sm)`
92
92
  - `height: 100%`
93
- - `margin: 0 var(--rel-spacing-space-md)` (horizontal margin)
93
+ - `margin: 0 var(--rel-spacing-md)` (horizontal margin)
94
94
  - Uses `align-self: stretch` to fill parent height
95
95
 
96
96
  - The divider is purely visual and has `background: transparent` on the host element
@@ -7,6 +7,7 @@
7
7
 
8
8
  static styles = css`
9
9
  :host {
10
+ color: var(--rel-text-default);
10
11
  display: block;
11
12
  }
12
13
 
@@ -14,23 +15,23 @@
14
15
  position: relative;
15
16
  display: flex;
16
17
  background: transparent;
17
- font-family: var(--rel-fontFamilies-primary);
18
- color: var(--rel-color-text-primary);
18
+ font-family: var(--rel-fonts-font-family);
19
+ color: var(--rel-text-default);
19
20
  }
20
21
 
21
22
  /* Horizontal */
22
23
  .rel-divider.horizontal {
23
24
  width: 100%;
24
- height: var(--rel-borders-width-stroke-100);
25
- background-color: var(--rel-color-border-divider);
26
- margin: var(--rel-spacing-space-md) 0;
25
+ height: var(--rel-stroke-sm);
26
+ background-color: var(--rel-bg-neutral-elevated-2);
27
+ margin: var(--rel-spacing-md) 0;
27
28
  }
28
29
 
29
30
  /* Vertical */
30
31
  .rel-divider.vertical {
31
- width: var(--rel-borders-width-stroke-100);
32
- background-color: var(--rel-color-border-divider);
33
- margin: 0 var(--rel-spacing-space-md);
32
+ width: var(--rel-stroke-sm);
33
+ background-color: var(--rel-bg-neutral-elevated-2);
34
+ margin: 0 var(--rel-spacing-md);
34
35
  align-self: stretch;
35
36
  height: 100%;
36
37
  }
@@ -47,7 +48,7 @@
47
48
 
48
49
  render() {
49
50
  return html`
50
- <div class="rel-divider ${this.orientation}" role="separator"></div>
51
+ <div part="base" class="rel-divider ${this.orientation}" role="separator"></div>
51
52
  `;
52
53
  }
53
54
  }
@@ -154,7 +154,7 @@ rel-drawer::part(panel) {
154
154
  }
155
155
 
156
156
  rel-drawer::part(handle) {
157
- background: var(--rel-colors-blue-primary);
157
+ background: var(--rel-bg-info);
158
158
  }
159
159
  ```
160
160
 
@@ -7,7 +7,7 @@ export class RelDrawerFooter extends LitElement {
7
7
  .drawer-footer {
8
8
  display: flex;
9
9
  justify-content: flex-end;
10
- gap: var(--rel-spacing-space-xs);
10
+ gap: var(--rel-spacing-xs);
11
11
  }
12
12
  `;
13
13