@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.
- 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 +153 -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 +61 -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 +56 -28
- 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 +172 -91
- 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 +151 -39
- package/dist/index.d.ts +151 -39
- package/dist/index.js +3544 -2289
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3876 -2622
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +653 -363
- package/dist/vars-WY2XCF5G.css +653 -0
- package/package.json +3 -2
- 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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LitElement, html, css, nothing } from "lit";
|
|
2
2
|
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
-
import "../../styles/vars-v2.css";
|
|
4
3
|
|
|
5
4
|
interface CalendarDay {
|
|
6
5
|
date: Date;
|
|
@@ -9,6 +8,7 @@ interface CalendarDay {
|
|
|
9
8
|
isToday: boolean;
|
|
10
9
|
isSelected: boolean;
|
|
11
10
|
isDisabled: boolean;
|
|
11
|
+
isWeekend: boolean;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
@customElement("rel-calendar")
|
|
@@ -30,13 +30,13 @@ export class RelCalendar extends LitElement {
|
|
|
30
30
|
static styles = css`
|
|
31
31
|
:host {
|
|
32
32
|
display: block;
|
|
33
|
-
font-family: var(--rel-
|
|
34
|
-
background: var(--rel-
|
|
35
|
-
border: 1px solid var(--rel-border-default
|
|
36
|
-
border-radius: var(--rel-
|
|
37
|
-
padding: var(--rel-spacing-
|
|
33
|
+
font-family: var(--rel-fonts-font-family, sans-serif);
|
|
34
|
+
background: var(--rel-bg-neutral);
|
|
35
|
+
border: 1px solid var(--rel-border-default);
|
|
36
|
+
border-radius: var(--rel-border-radius-sm, 8px);
|
|
37
|
+
padding: var(--rel-spacing-md, 16px);
|
|
38
38
|
max-width: 320px;
|
|
39
|
-
color: var(--rel-text-
|
|
39
|
+
color: var(--rel-text-default);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
:host([disabled]) {
|
|
@@ -48,16 +48,19 @@ export class RelCalendar extends LitElement {
|
|
|
48
48
|
display: flex;
|
|
49
49
|
align-items: center;
|
|
50
50
|
justify-content: space-between;
|
|
51
|
-
margin-bottom: var(--rel-spacing-
|
|
51
|
+
margin-bottom: var(--rel-spacing-sm);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
.header-center {
|
|
55
55
|
display: flex;
|
|
56
56
|
align-items: center;
|
|
57
|
-
gap: var(--rel-spacing-
|
|
58
|
-
|
|
59
|
-
font-
|
|
60
|
-
|
|
57
|
+
gap: var(--rel-spacing-xs);
|
|
58
|
+
color: var(--rel-text-label);
|
|
59
|
+
font-family: var(--rel-body-lg-semibold-font-family);
|
|
60
|
+
font-weight: var(--rel-body-lg-semibold-font-weight);
|
|
61
|
+
font-size: var(--rel-body-lg-regular-font-size);
|
|
62
|
+
line-height: var(--rel-body-lg-regular-line-height);
|
|
63
|
+
letter-spacing: var(--rel-body-lg-regular-letter-spacing);
|
|
61
64
|
}
|
|
62
65
|
|
|
63
66
|
.nav-button {
|
|
@@ -65,75 +68,85 @@ export class RelCalendar extends LitElement {
|
|
|
65
68
|
border: none;
|
|
66
69
|
width: 32px;
|
|
67
70
|
height: 32px;
|
|
68
|
-
border-radius: var(--rel-
|
|
71
|
+
border-radius: var(--rel-border-radius-sm);
|
|
69
72
|
display: flex;
|
|
70
73
|
align-items: center;
|
|
71
74
|
justify-content: center;
|
|
72
75
|
cursor: pointer;
|
|
73
|
-
color: var(--rel-
|
|
76
|
+
color: var(--rel-action-neutral-label-icons-ghost);
|
|
74
77
|
transition: background-color 0.15s ease;
|
|
75
78
|
}
|
|
76
79
|
|
|
77
80
|
.nav-button:hover {
|
|
78
|
-
background: var(--rel-
|
|
81
|
+
background: var(--rel-bg-neutral-elevated-2);
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
.nav-button:focus-visible {
|
|
82
|
-
outline: 2px solid var(--rel-
|
|
85
|
+
outline: 2px solid var(--rel-border-focus);
|
|
83
86
|
outline-offset: 2px;
|
|
84
87
|
}
|
|
85
88
|
|
|
86
89
|
.calendar-grid {
|
|
87
90
|
display: grid;
|
|
88
91
|
grid-template-columns: repeat(7, 1fr);
|
|
89
|
-
gap: var(--rel-spacing-
|
|
92
|
+
gap: var(--rel-spacing-2xs);
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
.weekday {
|
|
93
96
|
text-align: center;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
color: var(--rel-gray-text-placeholder);
|
|
97
|
-
padding: var(--rel-spacing-space-xs);
|
|
97
|
+
color: var(--rel-text-placeholder);
|
|
98
|
+
padding: var(--rel-spacing-xs);
|
|
98
99
|
text-transform: uppercase;
|
|
100
|
+
font-family: var(--rel-body-sm-regular-font-family);
|
|
101
|
+
font-weight: var(--rel-body-xs-medium-font-weight);
|
|
102
|
+
font-size: var(--rel-body-sm-medium-font-size);
|
|
103
|
+
line-height: var(--rel-body-sm-medium-line-height);
|
|
104
|
+
letter-spacing: var(--rel-body-sm-medium-letter-spacing);
|
|
99
105
|
}
|
|
100
106
|
|
|
101
107
|
.day-button {
|
|
102
108
|
aspect-ratio: 1;
|
|
103
109
|
border: none;
|
|
104
110
|
background: transparent;
|
|
105
|
-
border-radius: var(--rel-
|
|
106
|
-
|
|
107
|
-
font-weight: var(--rel-fontWeights-medium);
|
|
108
|
-
color: var(--rel-text-primary);
|
|
111
|
+
border-radius: var(--rel-border-radius-sm);
|
|
112
|
+
color: var(--rel-text-default);
|
|
109
113
|
cursor: pointer;
|
|
110
114
|
position: relative;
|
|
111
115
|
transition: all 0.15s ease;
|
|
112
|
-
font-family: var(--rel-
|
|
116
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
117
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
118
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
119
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
120
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
.day-button:hover:not(:disabled):not(.selected) {
|
|
116
|
-
background: var(--rel-
|
|
124
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* Weekend (Figma Day of a week=Weekend): same color at 70% — full opacity when selected */
|
|
128
|
+
.day-button.weekend:not(.selected) {
|
|
129
|
+
opacity: 0.7;
|
|
117
130
|
}
|
|
118
131
|
|
|
119
132
|
.day-button:focus-visible {
|
|
120
|
-
outline: 2px solid var(--rel-
|
|
133
|
+
outline: 2px solid var(--rel-border-focus);
|
|
121
134
|
outline-offset: -2px;
|
|
122
135
|
z-index: 1;
|
|
123
136
|
}
|
|
124
137
|
|
|
125
138
|
.day-button.today:not(.selected) {
|
|
126
|
-
border: 2px solid var(--rel-
|
|
139
|
+
border: 2px solid var(--rel-border-brand);
|
|
127
140
|
}
|
|
128
141
|
|
|
129
142
|
.day-button.selected {
|
|
130
|
-
background: var(--rel-
|
|
131
|
-
color:
|
|
132
|
-
font-weight: var(--rel-
|
|
143
|
+
background: var(--rel-bg-neutral-inverse-2);
|
|
144
|
+
color: var(--rel-text-inverse);
|
|
145
|
+
font-weight: var(--rel-body-md-semibold-font-weight);
|
|
133
146
|
}
|
|
134
147
|
|
|
135
148
|
.day-button.other-month {
|
|
136
|
-
color: var(--rel-
|
|
149
|
+
color: var(--rel-text-placeholder);
|
|
137
150
|
opacity: 0.5;
|
|
138
151
|
}
|
|
139
152
|
|
|
@@ -149,8 +162,8 @@ export class RelCalendar extends LitElement {
|
|
|
149
162
|
|
|
150
163
|
:host-context([data-theme="dark"]) :host,
|
|
151
164
|
:host-context(.dark) :host {
|
|
152
|
-
background: var(--rel-
|
|
153
|
-
border-color: var(--rel-
|
|
165
|
+
background: var(--rel-bg-neutral);
|
|
166
|
+
border-color: var(--rel-border-default);
|
|
154
167
|
}
|
|
155
168
|
`;
|
|
156
169
|
|
|
@@ -239,6 +252,7 @@ export class RelCalendar extends LitElement {
|
|
|
239
252
|
isToday: this.isSameDay(date, today),
|
|
240
253
|
isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,
|
|
241
254
|
isDisabled: this.isDateDisabledInternal(date),
|
|
255
|
+
isWeekend: date.getDay() === 0 || date.getDay() === 6,
|
|
242
256
|
});
|
|
243
257
|
}
|
|
244
258
|
|
|
@@ -252,6 +266,7 @@ export class RelCalendar extends LitElement {
|
|
|
252
266
|
isToday: this.isSameDay(date, today),
|
|
253
267
|
isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,
|
|
254
268
|
isDisabled: this.isDateDisabledInternal(date),
|
|
269
|
+
isWeekend: date.getDay() === 0 || date.getDay() === 6,
|
|
255
270
|
});
|
|
256
271
|
}
|
|
257
272
|
|
|
@@ -266,6 +281,7 @@ export class RelCalendar extends LitElement {
|
|
|
266
281
|
isToday: this.isSameDay(date, today),
|
|
267
282
|
isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,
|
|
268
283
|
isDisabled: this.isDateDisabledInternal(date),
|
|
284
|
+
isWeekend: date.getDay() === 0 || date.getDay() === 6,
|
|
269
285
|
});
|
|
270
286
|
}
|
|
271
287
|
|
|
@@ -409,9 +425,9 @@ export class RelCalendar extends LitElement {
|
|
|
409
425
|
|
|
410
426
|
return html`
|
|
411
427
|
<div role="grid" aria-label="Calendar">
|
|
412
|
-
<div class="header">
|
|
428
|
+
<div part="header" class="header">
|
|
413
429
|
<button
|
|
414
|
-
class="nav-button"
|
|
430
|
+
part="action" class="nav-button"
|
|
415
431
|
@click=${this.previousMonth}
|
|
416
432
|
aria-label="Previous month"
|
|
417
433
|
?disabled=${this.disabled}
|
|
@@ -421,13 +437,13 @@ export class RelCalendar extends LitElement {
|
|
|
421
437
|
</svg>
|
|
422
438
|
</button>
|
|
423
439
|
|
|
424
|
-
<div class="header-center">
|
|
440
|
+
<div part="label" class="header-center">
|
|
425
441
|
<span>${this.getMonthName()}</span>
|
|
426
442
|
<span>${this.viewYear}</span>
|
|
427
443
|
</div>
|
|
428
444
|
|
|
429
445
|
<button
|
|
430
|
-
class="nav-button"
|
|
446
|
+
part="action" class="nav-button"
|
|
431
447
|
@click=${this.nextMonth}
|
|
432
448
|
aria-label="Next month"
|
|
433
449
|
?disabled=${this.disabled}
|
|
@@ -438,27 +454,27 @@ export class RelCalendar extends LitElement {
|
|
|
438
454
|
</button>
|
|
439
455
|
</div>
|
|
440
456
|
|
|
441
|
-
<div class="calendar-grid" role="row">
|
|
457
|
+
<div part="list" class="calendar-grid" role="row">
|
|
442
458
|
${weekdayLabels.map(
|
|
443
459
|
(label) => html`
|
|
444
|
-
<div class="weekday" role="columnheader" aria-label="${label}">
|
|
460
|
+
<div part="label" class="weekday" role="columnheader" aria-label="${label}">
|
|
445
461
|
${label}
|
|
446
462
|
</div>
|
|
447
463
|
`
|
|
448
464
|
)}
|
|
449
465
|
</div>
|
|
450
466
|
|
|
451
|
-
<div class="calendar-grid">
|
|
467
|
+
<div part="list" class="calendar-grid">
|
|
452
468
|
${days.map(
|
|
453
469
|
(day, index) => html`
|
|
454
470
|
<button
|
|
455
|
-
class="day-button ${day.isSelected ? "selected" : ""} ${day.isToday
|
|
471
|
+
part="item" class="day-button ${day.isSelected ? "selected" : ""} ${day.isToday
|
|
456
472
|
? "today"
|
|
457
|
-
: ""} ${!day.isCurrentMonth ? "other-month" : ""}"
|
|
473
|
+
: ""} ${!day.isCurrentMonth ? "other-month" : ""} ${day.isWeekend ? "weekend" : ""}"
|
|
458
474
|
role="gridcell"
|
|
459
475
|
aria-label="${this.formatISODate(day.date)}"
|
|
460
476
|
aria-selected="${day.isSelected}"
|
|
461
|
-
?disabled=${day.isDisabled
|
|
477
|
+
?disabled=${day.isDisabled}
|
|
462
478
|
@click=${() => this.selectDay(day)}
|
|
463
479
|
@keydown=${(e: KeyboardEvent) => this.handleKeyDown(e, day, index)}
|
|
464
480
|
tabindex="${day.isSelected || (index === 0 && !this.focusedDate) ? 0 : -1}"
|
|
@@ -55,21 +55,21 @@ None exposed.
|
|
|
55
55
|
## Tokens / CSS Variables
|
|
56
56
|
|
|
57
57
|
### Semantic Tokens
|
|
58
|
-
- `--rel-
|
|
58
|
+
- `--rel-fonts-font-family` - Font family
|
|
59
59
|
|
|
60
60
|
### Color Tokens
|
|
61
|
-
- `--rel-
|
|
62
|
-
- `--rel-text-
|
|
61
|
+
- `--rel-bg-surface` - Card background color
|
|
62
|
+
- `--rel-text-default` - Text color
|
|
63
63
|
|
|
64
64
|
### Shadow Tokens
|
|
65
65
|
- `--rel-shadows-shadow-200` - Default elevation shadow
|
|
66
66
|
- `--rel-shadows-shadow-300` - Hover elevation shadow (larger)
|
|
67
67
|
|
|
68
68
|
### Border Tokens
|
|
69
|
-
- `--rel-
|
|
69
|
+
- `--rel-border-radius-md` - Card border radius
|
|
70
70
|
|
|
71
71
|
### Spacing Tokens
|
|
72
|
-
- `--rel-spacing-
|
|
72
|
+
- `--rel-spacing-md` - Internal padding
|
|
73
73
|
|
|
74
74
|
## Accessibility
|
|
75
75
|
- The card itself has no specific ARIA role (it's a generic container)
|
|
@@ -88,7 +88,7 @@ None exposed.
|
|
|
88
88
|
- **Hover effect**: Translates the card upward by 3px (`translateY(-3px)`) and increases shadow depth
|
|
89
89
|
- **Animation**: Uses `transition: transform 0.2s ease, box-shadow 0.2s ease`
|
|
90
90
|
- **Motion preferences**: When `prefers-reduced-motion: reduce`, both hover transform and transitions are disabled
|
|
91
|
-
- The card has consistent padding on all sides via `--rel-spacing-
|
|
91
|
+
- The card has consistent padding on all sides via `--rel-spacing-md`
|
|
92
92
|
- The internal `.card` wrapper is where all styling is applied
|
|
93
93
|
- The component provides no default content styling—you control the layout of slotted elements
|
|
94
94
|
- Works well with CSS Grid or Flexbox for creating card layouts
|
|
@@ -1,35 +1,88 @@
|
|
|
1
|
-
import { LitElement, html, css } from "lit";
|
|
2
|
-
import { customElement } from "lit/decorators.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import { LitElement, html, css, nothing } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-card")
|
|
5
|
+
export class RelCard extends LitElement {
|
|
6
|
+
/**
|
|
7
|
+
* Figma "Type" axis: custom (default) renders slotted content with card
|
|
8
|
+
* padding; media adds a flush media region (slot name="media") above the
|
|
9
|
+
* content — pair it with <rel-card-media>.
|
|
10
|
+
*/
|
|
11
|
+
@property({ type: String, reflect: true })
|
|
12
|
+
type: "custom" | "media" = "custom";
|
|
13
|
+
|
|
14
|
+
static styles = css`
|
|
15
|
+
:host {
|
|
16
|
+
color: var(--rel-text-default);
|
|
17
|
+
display: block;
|
|
18
|
+
font-family: var(--rel-body-lg-regular-font-family);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* Default typography for slotted card content (Figma card roles) */
|
|
22
|
+
::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {
|
|
23
|
+
font-family: var(--rel-headings-md-font-family);
|
|
24
|
+
font-weight: var(--rel-headings-md-font-weight);
|
|
25
|
+
font-size: var(--rel-headings-md-font-size);
|
|
26
|
+
line-height: var(--rel-headings-md-line-height);
|
|
27
|
+
letter-spacing: var(--rel-headings-md-letter-spacing);
|
|
28
|
+
color: var(--rel-text-default);
|
|
29
|
+
margin: 0 0 var(--rel-spacing-2xs) 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
::slotted(p) {
|
|
33
|
+
font-family: var(--rel-body-lg-regular-font-family);
|
|
34
|
+
font-weight: var(--rel-body-lg-regular-font-weight);
|
|
35
|
+
font-size: var(--rel-body-lg-regular-font-size);
|
|
36
|
+
line-height: var(--rel-body-lg-regular-line-height);
|
|
37
|
+
letter-spacing: var(--rel-body-lg-regular-letter-spacing);
|
|
38
|
+
color: var(--rel-text-body);
|
|
39
|
+
margin: 0 0 var(--rel-spacing-xs) 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.card {
|
|
43
|
+
background-color: var(--rel-bg-surface);
|
|
44
|
+
color: var(--rel-text-default);
|
|
45
|
+
border-radius: var(--rel-border-radius-sm);
|
|
46
|
+
border: 1px solid var(--rel-border-default);
|
|
47
|
+
padding: var(--rel-spacing-lg) var(--rel-spacing-md);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Media type: media sits flush against the card edges, content keeps padding */
|
|
51
|
+
:host([type="media"]) .card {
|
|
52
|
+
padding: 0;
|
|
53
|
+
overflow: hidden;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.media {
|
|
57
|
+
display: block;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.media ::slotted(*) {
|
|
61
|
+
display: block;
|
|
62
|
+
width: 100%;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
:host([type="media"]) .content {
|
|
66
|
+
padding: var(--rel-spacing-lg) var(--rel-spacing-md);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:host-context([data-theme="dark"]) .card,
|
|
70
|
+
:host-context(.dark) .card {
|
|
71
|
+
background-color: var(--rel-bg-surface);
|
|
72
|
+
border-color: var(--rel-border-default);
|
|
73
|
+
}
|
|
74
|
+
`;
|
|
75
|
+
|
|
76
|
+
render() {
|
|
77
|
+
return html`
|
|
78
|
+
<div part="base" class="card">
|
|
79
|
+
${this.type === "media"
|
|
80
|
+
? html`<div part="header" class="media"><slot name="media"></slot></div>`
|
|
81
|
+
: nothing}
|
|
82
|
+
<div part="content" class="content">
|
|
83
|
+
<slot></slot>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -79,25 +79,25 @@ None exposed.
|
|
|
79
79
|
## Tokens / CSS Variables
|
|
80
80
|
|
|
81
81
|
### Semantic Tokens
|
|
82
|
-
- `--rel-
|
|
83
|
-
- `--rel-
|
|
84
|
-
- `--rel-
|
|
85
|
-
- `--rel-
|
|
82
|
+
- `--rel-fonts-font-family` - Font family
|
|
83
|
+
- `--rel-body-md-regular-font-size` - Title font size
|
|
84
|
+
- `--rel-body-sm-regular-font-size` - Subtitle font size
|
|
85
|
+
- `--rel-fonts-weight-body-semibold` - Title font weight
|
|
86
86
|
|
|
87
87
|
### Color Tokens
|
|
88
|
-
- `--rel-
|
|
89
|
-
- `--rel-text-
|
|
90
|
-
- `--rel-text-
|
|
88
|
+
- `--rel-bg-surface` - Card background color
|
|
89
|
+
- `--rel-text-default` - General text color
|
|
90
|
+
- `--rel-text-label` - Title color
|
|
91
91
|
|
|
92
92
|
### Shadow Tokens
|
|
93
93
|
- `--rel-shadows-shadow-200` - Default elevation shadow
|
|
94
94
|
- `--rel-shadows-shadow-300` - Hover elevation shadow (larger)
|
|
95
95
|
|
|
96
96
|
### Border Tokens
|
|
97
|
-
- `--rel-
|
|
97
|
+
- `--rel-border-radius-md` - Card border radius
|
|
98
98
|
|
|
99
99
|
### Spacing Tokens
|
|
100
|
-
- `--rel-spacing-
|
|
100
|
+
- `--rel-spacing-md` - Content area padding
|
|
101
101
|
|
|
102
102
|
## Accessibility
|
|
103
103
|
- Image has `alt` attribute for screen reader support
|
|
@@ -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-card-media")
|
|
6
5
|
export class RelCardMedia extends LitElement {
|
|
@@ -11,15 +10,16 @@ export class RelCardMedia extends LitElement {
|
|
|
11
10
|
|
|
12
11
|
static styles = css`
|
|
13
12
|
:host {
|
|
13
|
+
color: var(--rel-text-default);
|
|
14
14
|
display: block;
|
|
15
|
-
font-family: var(--rel-
|
|
15
|
+
font-family: var(--rel-fonts-font-family, sans-serif);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
.card-media {
|
|
19
|
-
background-color: var(--rel-
|
|
20
|
-
color: var(--rel-
|
|
21
|
-
border-radius: var(--rel-
|
|
22
|
-
border: 1px solid var(--rel-
|
|
19
|
+
background-color: var(--rel-bg-surface);
|
|
20
|
+
color: var(--rel-text-default);
|
|
21
|
+
border-radius: var(--rel-border-radius-sm);
|
|
22
|
+
border: 1px solid var(--rel-border-default);
|
|
23
23
|
overflow: hidden;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -31,46 +31,53 @@ export class RelCardMedia extends LitElement {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
.card-content {
|
|
34
|
-
padding: var(--rel-spacing-
|
|
34
|
+
padding: var(--rel-spacing-md);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
.card-content h3 {
|
|
38
|
-
margin: 0 0 4px 0;
|
|
39
|
-
|
|
40
|
-
font-
|
|
41
|
-
|
|
38
|
+
margin: 0 0 4px 0;
|
|
39
|
+
color: var(--rel-text-label);
|
|
40
|
+
font-family: var(--rel-body-md-semibold-font-family);
|
|
41
|
+
font-weight: var(--rel-body-md-semibold-font-weight);
|
|
42
|
+
font-size: var(--rel-body-md-semibold-font-size);
|
|
43
|
+
line-height: var(--rel-body-md-semibold-line-height);
|
|
44
|
+
letter-spacing: var(--rel-body-md-semibold-letter-spacing);
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
.card-content p {
|
|
45
|
-
margin: 0 0 8px 0;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
margin: 0 0 8px 0;
|
|
49
|
+
color: var(--rel-text-default);
|
|
50
|
+
font-family: var(--rel-body-sm-regular-font-family);
|
|
51
|
+
font-weight: var(--rel-body-sm-regular-font-weight);
|
|
52
|
+
font-size: var(--rel-body-sm-regular-font-size);
|
|
53
|
+
line-height: var(--rel-body-sm-regular-line-height);
|
|
54
|
+
letter-spacing: var(--rel-body-sm-regular-letter-spacing);
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
:host-context([data-theme="dark"]) .card-media,
|
|
51
58
|
:host-context(.dark) .card-media {
|
|
52
|
-
background-color: var(--rel-
|
|
53
|
-
border-color: var(--rel-
|
|
59
|
+
background-color: var(--rel-bg-surface);
|
|
60
|
+
border-color: var(--rel-border-default);
|
|
54
61
|
}
|
|
55
62
|
|
|
56
63
|
:host-context([data-theme="dark"]) .card-content h3,
|
|
57
64
|
:host-context(.dark) .card-content h3 {
|
|
58
|
-
color: var(--rel-
|
|
65
|
+
color: var(--rel-text-label);
|
|
59
66
|
}
|
|
60
67
|
`;
|
|
61
68
|
|
|
62
69
|
render() {
|
|
63
70
|
return html`
|
|
64
|
-
<div class="card-media">
|
|
71
|
+
<div part="base" class="card-media">
|
|
65
72
|
${this.imageSrc
|
|
66
73
|
? html`
|
|
67
|
-
<div class="card-image">
|
|
74
|
+
<div part="icon" class="card-image">
|
|
68
75
|
<img src=${this.imageSrc} alt=${this.imageAlt} />
|
|
69
76
|
</div>
|
|
70
77
|
`
|
|
71
78
|
: null}
|
|
72
79
|
|
|
73
|
-
<div class="card-content">
|
|
80
|
+
<div part="content" class="card-content">
|
|
74
81
|
${this.title ? html`<h3>${this.title}</h3>` : null}
|
|
75
82
|
${this.subtitle ? html`<p>${this.subtitle}</p>` : null}
|
|
76
83
|
<slot></slot>
|
|
@@ -140,12 +140,12 @@ Available parts:
|
|
|
140
140
|
The component uses design tokens from the Reliability Design System. All colors, spacing, and typography are inherited from CSS variables.
|
|
141
141
|
|
|
142
142
|
Key tokens used:
|
|
143
|
-
- `--rel-
|
|
143
|
+
- `--rel-bg-*` / `--rel-text-*` / `--rel-border-*` semantic colors
|
|
144
144
|
- `--rel-spacing-*` for spacing
|
|
145
145
|
- `--rel-shadows-*` for shadows
|
|
146
146
|
- `--rel-border-*` for borders
|
|
147
|
-
- Focus outline uses `--rel-
|
|
148
|
-
- Active dot uses `--rel-
|
|
147
|
+
- Focus outline uses `--rel-bg-info`
|
|
148
|
+
- Active dot uses `--rel-bg-brand`
|
|
149
149
|
|
|
150
150
|
## Interaction
|
|
151
151
|
|