@reliability-design/web 1.3.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/components/rel-accordion/README.md +13 -13
- package/dist/components/rel-accordion/rel-accordion.ts +80 -45
- package/dist/components/rel-alert/README.md +15 -15
- package/dist/components/rel-alert/rel-alert.ts +149 -158
- package/dist/components/rel-avatar/README.md +15 -15
- package/dist/components/rel-avatar/rel-avatar.ts +42 -38
- package/dist/components/rel-badge/README.md +5 -5
- package/dist/components/rel-badge/rel-badge.ts +46 -11
- package/dist/components/rel-breadcrumb/README.md +7 -7
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
- package/dist/components/rel-button/README.md +20 -20
- package/dist/components/rel-button/rel-button.ts +292 -105
- package/dist/components/rel-calendar/README.md +5 -5
- package/dist/components/rel-calendar/rel-calendar.ts +68 -45
- package/dist/components/rel-card/README.md +6 -6
- package/dist/components/rel-card/rel-card.ts +88 -35
- package/dist/components/rel-cardmedia/README.md +9 -9
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
- package/dist/components/rel-carousel/README.md +3 -3
- package/dist/components/rel-carousel/rel-carousel.ts +174 -90
- package/dist/components/rel-chart/README.md +8 -8
- package/dist/components/rel-chart/rel-chart.ts +59 -41
- package/dist/components/rel-checkbox/README.md +7 -7
- package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
- package/dist/components/rel-chip/README.md +16 -16
- package/dist/components/rel-chip/rel-chip.ts +143 -111
- package/dist/components/rel-container/README.md +11 -11
- package/dist/components/rel-container/rel-container.ts +35 -9
- package/dist/components/rel-date-picker/README.md +43 -7
- package/dist/components/rel-date-picker/date-format.test.ts +43 -0
- package/dist/components/rel-date-picker/date-format.ts +47 -0
- package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
- package/dist/components/rel-divider/README.md +9 -9
- package/dist/components/rel-divider/rel-divider.ts +10 -9
- package/dist/components/rel-drawer/README.md +1 -1
- package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
- package/dist/components/rel-drawer/rel-drawer.ts +88 -25
- package/dist/components/rel-kbd/README.md +20 -20
- package/dist/components/rel-kbd/rel-kbd.ts +119 -25
- package/dist/components/rel-layout/README.md +1 -1
- package/dist/components/rel-layout/rel-layout.ts +2 -2
- package/dist/components/rel-menu/README.md +15 -15
- package/dist/components/rel-menu/rel-menu.ts +155 -88
- package/dist/components/rel-menubar/README.md +20 -20
- package/dist/components/rel-menubar/rel-menubar.ts +47 -31
- package/dist/components/rel-nav-menu/README.md +21 -21
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
- package/dist/components/rel-navbar/README.md +7 -7
- package/dist/components/rel-navbar/rel-navbar.ts +12 -11
- package/dist/components/rel-otp/README.md +3 -3
- package/dist/components/rel-otp/rel-otp.ts +46 -30
- package/dist/components/rel-pagination/README.md +18 -18
- package/dist/components/rel-pagination/rel-pagination.ts +141 -90
- package/dist/components/rel-popover/README.md +13 -13
- package/dist/components/rel-popover/rel-popover-content.ts +39 -14
- package/dist/components/rel-popover/rel-popover.ts +18 -7
- package/dist/components/rel-progress/README.md +5 -5
- package/dist/components/rel-progress/rel-progress.ts +16 -12
- package/dist/components/rel-radio/README.md +9 -9
- package/dist/components/rel-radio/rel-radio.ts +64 -50
- package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
- package/dist/components/rel-resizable/README.md +4 -4
- package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
- package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
- package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
- package/dist/components/rel-segmented-button/README.md +10 -10
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
- package/dist/components/rel-select/README.md +14 -14
- package/dist/components/rel-select/rel-select.ts +120 -188
- package/dist/components/rel-sheet/README.md +10 -10
- package/dist/components/rel-sheet/rel-sheet.ts +82 -23
- package/dist/components/rel-sidebar/README.md +5 -5
- package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
- package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
- package/dist/components/rel-slider/README.md +10 -10
- package/dist/components/rel-slider/rel-slider.ts +230 -57
- package/dist/components/rel-snackbar/README.md +9 -9
- package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
- package/dist/components/rel-stepper/README.md +10 -10
- package/dist/components/rel-stepper/rel-stepper.ts +110 -46
- package/dist/components/rel-switch/README.md +5 -5
- package/dist/components/rel-switch/rel-switch.ts +23 -12
- package/dist/components/rel-tab/README.md +13 -13
- package/dist/components/rel-tab/rel-tab.ts +63 -19
- package/dist/components/rel-table/README.md +7 -7
- package/dist/components/rel-table/rel-table-body.ts +2 -1
- package/dist/components/rel-table/rel-table-caption.ts +10 -7
- package/dist/components/rel-table/rel-table-cell.ts +7 -6
- package/dist/components/rel-table/rel-table-footer.ts +4 -3
- package/dist/components/rel-table/rel-table-head.ts +11 -9
- package/dist/components/rel-table/rel-table-header.ts +2 -1
- package/dist/components/rel-table/rel-table-row.ts +5 -4
- package/dist/components/rel-table/rel-table.ts +16 -7
- package/dist/components/rel-textfield/README.md +11 -11
- package/dist/components/rel-textfield/rel-textfield.ts +218 -92
- package/dist/components/rel-toast/README.md +11 -11
- package/dist/components/rel-toast/rel-toast.ts +33 -30
- package/dist/components/rel-tooltip/README.md +7 -7
- package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
- package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
- package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
- package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
- package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
- package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
- package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
- package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar.ts +31 -29
- package/dist/index.d.mts +159 -39
- package/dist/index.d.ts +159 -39
- package/dist/index.js +3600 -2269
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3930 -2600
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +866 -363
- package/dist/vars-BYCEEKWJ.css +866 -0
- package/package.json +5 -3
- package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
- package/dist/styles/vars-v2.css +0 -525
- package/dist/vars-F54UGCHM.css +0 -363
- package/dist/vars-v2-VMGWTFJZ.css +0 -525
|
@@ -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-
|
|
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-
|
|
112
|
+
gap: var(--rel-spacing-xs);
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
.label {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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-
|
|
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
|
-
|
|
113
|
-
|
|
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-
|
|
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-
|
|
127
|
-
padding: var(--rel-spacing-
|
|
128
|
-
background: var(--rel-
|
|
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-
|
|
131
|
-
|
|
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-
|
|
178
|
+
border-color: var(--rel-border-strong);
|
|
141
179
|
}
|
|
142
180
|
|
|
143
181
|
.trigger-button:focus-visible {
|
|
144
|
-
outline: 2px solid var(--rel-
|
|
182
|
+
outline: 2px solid var(--rel-border-focus);
|
|
145
183
|
outline-offset: 2px;
|
|
146
|
-
border-color: var(--rel-
|
|
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-
|
|
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-
|
|
195
|
+
border-color: var(--rel-border-danger);
|
|
158
196
|
}
|
|
159
197
|
|
|
160
198
|
.trigger-button.error:focus-visible {
|
|
161
|
-
outline-color: var(--rel-
|
|
162
|
-
border-color: var(--rel-
|
|
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-
|
|
168
|
-
font-
|
|
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-
|
|
173
|
-
font-
|
|
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-
|
|
224
|
+
color: var(--rel-text-default);
|
|
179
225
|
}
|
|
180
226
|
|
|
181
227
|
.trigger-content.placeholder {
|
|
182
|
-
color: var(--rel-
|
|
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-
|
|
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-
|
|
240
|
+
padding: var(--rel-spacing-3xs);
|
|
195
241
|
cursor: pointer;
|
|
196
|
-
color: var(--rel-
|
|
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-
|
|
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-
|
|
206
|
-
color: var(--rel-
|
|
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-
|
|
265
|
+
background: var(--rel-bg-surface);
|
|
220
266
|
border: 1px solid var(--rel-border-default);
|
|
221
|
-
border-radius: var(--rel-
|
|
267
|
+
border-radius: var(--rel-border-radius-sm);
|
|
222
268
|
box-shadow: var(--rel-shadows-shadow-300);
|
|
223
|
-
padding: var(--rel-spacing-
|
|
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-
|
|
237
|
-
gap: var(--rel-spacing-
|
|
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-
|
|
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-
|
|
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-
|
|
301
|
+
background: var(--rel-bg-surface-elevated);
|
|
256
302
|
}
|
|
257
303
|
|
|
258
304
|
.nav-button:focus-visible {
|
|
259
|
-
outline: 2px solid var(--rel-
|
|
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-
|
|
271
|
-
background: var(--rel-
|
|
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-
|
|
274
|
-
|
|
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-
|
|
332
|
+
background: var(--rel-bg-surface-elevated);
|
|
285
333
|
}
|
|
286
334
|
|
|
287
335
|
.dropdown-trigger:focus-visible {
|
|
288
|
-
outline: 2px solid var(--rel-
|
|
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-
|
|
346
|
+
background: var(--rel-bg-surface);
|
|
299
347
|
border: 1px solid var(--rel-border-default);
|
|
300
|
-
border-radius: var(--rel-
|
|
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-
|
|
360
|
+
padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
|
|
313
361
|
cursor: pointer;
|
|
314
|
-
|
|
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-
|
|
372
|
+
background: var(--rel-bg-surface-elevated);
|
|
321
373
|
}
|
|
322
374
|
|
|
323
375
|
.dropdown-item.selected {
|
|
324
|
-
background: var(--rel-
|
|
376
|
+
background: var(--rel-bg-info-light);
|
|
325
377
|
color: var(--rel-text-info);
|
|
326
|
-
font-weight: var(--rel-
|
|
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-
|
|
333
|
-
margin-bottom: var(--rel-spacing-
|
|
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
|
-
|
|
339
|
-
|
|
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-
|
|
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-
|
|
356
|
-
|
|
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-
|
|
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-
|
|
423
|
+
background: var(--rel-bg-surface-elevated);
|
|
367
424
|
}
|
|
368
425
|
|
|
369
426
|
.day-button:focus-visible {
|
|
370
|
-
outline: 2px solid var(--rel-
|
|
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-
|
|
433
|
+
border: 2px solid var(--rel-border-brand);
|
|
377
434
|
}
|
|
378
435
|
|
|
379
436
|
.day-button.selected {
|
|
380
|
-
background: var(--rel-
|
|
381
|
-
color: var(--rel-
|
|
382
|
-
font-weight: var(--rel-
|
|
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-
|
|
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-
|
|
63
|
-
- `--rel-
|
|
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-
|
|
66
|
+
- `--rel-border-default` - Divider line color
|
|
67
67
|
|
|
68
68
|
### Border Tokens
|
|
69
|
-
- `--rel-
|
|
69
|
+
- `--rel-stroke-sm` - Line thickness (width/height)
|
|
70
70
|
|
|
71
71
|
### Spacing Tokens
|
|
72
|
-
- `--rel-spacing-
|
|
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-
|
|
88
|
-
- `margin: var(--rel-spacing-
|
|
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-
|
|
91
|
+
- `width: var(--rel-stroke-sm)`
|
|
92
92
|
- `height: 100%`
|
|
93
|
-
- `margin: 0 var(--rel-spacing-
|
|
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-
|
|
18
|
-
color: var(--rel-
|
|
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-
|
|
25
|
-
background-color: var(--rel-
|
|
26
|
-
margin: var(--rel-spacing-
|
|
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-
|
|
32
|
-
background-color: var(--rel-
|
|
33
|
-
margin: 0 var(--rel-spacing-
|
|
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
|
}
|