@ethlete/components 1.0.0-next.78 → 1.0.0-next.79
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 +113 -0
- package/design/accordion.ts +73 -0
- package/design/avatar.ts +90 -0
- package/design/badge.ts +48 -0
- package/design/banner.ts +77 -0
- package/design/bracket.ts +457 -0
- package/design/breadcrumb.ts +145 -0
- package/design/button.ts +49 -0
- package/design/calendar.ts +306 -0
- package/design/card.ts +92 -0
- package/design/carousel.ts +240 -0
- package/design/chart.ts +512 -0
- package/design/checkbox.ts +275 -0
- package/design/chip.ts +64 -0
- package/design/config.json +4 -1
- package/design/control.ts +19 -0
- package/design/copy-button.ts +59 -0
- package/design/description-list.ts +41 -0
- package/design/dialog.ts +214 -0
- package/design/divider.ts +27 -0
- package/design/empty-state.ts +45 -0
- package/design/floating-action.ts +55 -0
- package/design/grid.ts +148 -0
- package/design/input.ts +86 -0
- package/design/kbd.ts +19 -0
- package/design/loader.ts +152 -0
- package/design/masonry.ts +115 -0
- package/design/match.ts +131 -0
- package/design/menu.ts +143 -0
- package/design/notification.ts +129 -0
- package/design/otp-input.ts +107 -0
- package/design/pagination.ts +120 -0
- package/design/picture.ts +80 -0
- package/design/progress-steps.ts +79 -0
- package/design/query-error.ts +60 -0
- package/design/radio-group.ts +132 -0
- package/design/scheduler.ts +369 -0
- package/design/scrollable.ts +218 -0
- package/design/scrollbar.ts +47 -0
- package/design/sdk/assets/fallback.svg +1 -0
- package/design/sdk/assets/tall.svg +1 -0
- package/design/sdk/assets/wide.svg +1 -0
- package/design/sdk/components/accent-on-light/accent-on-light.css +35 -0
- package/design/sdk/components/accent-on-light/accent-on-light.ts +10 -0
- package/design/sdk/components/accent-on-light/shared/controls.ts +46 -0
- package/design/sdk/components/accordion/accordion.css +17 -0
- package/design/sdk/components/accordion/accordion.ts +64 -0
- package/design/sdk/components/avatar/avatar.css +14 -0
- package/design/sdk/components/avatar/avatar.ts +78 -0
- package/design/sdk/components/badge/badge.css +13 -0
- package/design/sdk/components/badge/badge.ts +52 -0
- package/design/sdk/components/banner/banner.css +18 -0
- package/design/sdk/components/banner/banner.ts +87 -0
- package/design/sdk/components/bracket/bracket.css +59 -0
- package/design/sdk/components/bracket/bracket.ts +143 -0
- package/design/sdk/components/breadcrumb/breadcrumb.css +25 -0
- package/design/sdk/components/breadcrumb/breadcrumb.ts +81 -0
- package/design/sdk/components/button/button.css +33 -0
- package/design/sdk/components/button/button.ts +50 -7
- package/design/sdk/components/calendar/calendar.css +33 -0
- package/design/sdk/components/calendar/calendar.ts +96 -0
- package/design/sdk/components/card/card.css +19 -0
- package/design/sdk/components/card/card.ts +61 -0
- package/design/sdk/components/carousel/carousel.css +44 -0
- package/design/sdk/components/carousel/carousel.ts +74 -0
- package/design/sdk/components/chart/chart.css +56 -0
- package/design/sdk/components/chart/chart.ts +98 -0
- package/design/sdk/components/chip/chip.css +18 -0
- package/design/sdk/components/chip/chip.ts +76 -0
- package/design/sdk/components/copy-button/copy-button.css +14 -0
- package/design/sdk/components/copy-button/copy-button.ts +59 -0
- package/design/sdk/components/description-list/description-list.css +7 -0
- package/design/sdk/components/description-list/description-list.ts +53 -0
- package/design/sdk/components/dialog/dialog.css +29 -0
- package/design/sdk/components/dialog/dialog.ts +78 -0
- package/design/sdk/components/divider/divider.css +26 -0
- package/design/sdk/components/divider/divider.ts +43 -0
- package/design/sdk/components/empty-state/empty-state.css +15 -0
- package/design/sdk/components/empty-state/empty-state.ts +56 -0
- package/design/sdk/components/floating-action/floating-action.css +51 -0
- package/design/sdk/components/floating-action/floating-action.ts +63 -0
- package/design/sdk/components/form-field/form-field.ts +23 -5
- package/design/sdk/components/grid/grid.css +17 -0
- package/design/sdk/components/grid/grid.ts +80 -0
- package/design/sdk/components/input/input.css +75 -0
- package/design/sdk/components/input/input.ts +79 -0
- package/design/sdk/components/kbd/kbd.css +25 -0
- package/design/sdk/components/kbd/kbd.ts +57 -0
- package/design/sdk/components/loader/loader.css +37 -0
- package/design/sdk/components/loader/loader.ts +68 -0
- package/design/sdk/components/masonry/masonry.css +7 -0
- package/design/sdk/components/masonry/masonry.ts +42 -0
- package/design/sdk/components/match/match.css +25 -0
- package/design/sdk/components/match/match.ts +76 -0
- package/design/sdk/components/menu/menu.css +22 -0
- package/design/sdk/components/menu/menu.ts +91 -0
- package/design/sdk/components/notification/notification.css +32 -0
- package/design/sdk/components/notification/notification.ts +106 -0
- package/design/sdk/components/otp-input/otp-input.css +35 -0
- package/design/sdk/components/otp-input/otp-input.ts +64 -0
- package/design/sdk/components/pagination/pagination.css +14 -0
- package/design/sdk/components/pagination/pagination.ts +75 -0
- package/design/sdk/components/picture/picture.css +37 -0
- package/design/sdk/components/picture/picture.ts +96 -0
- package/design/sdk/components/progress-steps/progress-steps.css +37 -0
- package/design/sdk/components/progress-steps/progress-steps.ts +91 -0
- package/design/sdk/components/query-error/query-error.css +33 -0
- package/design/sdk/components/query-error/query-error.ts +120 -0
- package/design/sdk/components/scheduler/scheduler.css +55 -0
- package/design/sdk/components/scheduler/scheduler.ts +239 -0
- package/design/sdk/components/scrollable/scrollable.css +58 -0
- package/design/sdk/components/scrollable/scrollable.ts +133 -0
- package/design/sdk/components/scrollbar/scrollbar.css +78 -0
- package/design/sdk/components/scrollbar/scrollbar.ts +123 -0
- package/design/sdk/components/select/select.ts +1 -1
- package/design/sdk/components/select/shared/select-part.ts +16 -1
- package/design/sdk/components/select-panel/select-panel.css +3 -0
- package/design/sdk/components/select-panel/select-panel.ts +124 -0
- package/design/sdk/components/skeleton/skeleton.css +22 -0
- package/design/sdk/components/skeleton/skeleton.ts +50 -0
- package/design/sdk/components/slider/slider.css +52 -0
- package/design/sdk/components/slider/slider.ts +86 -0
- package/design/sdk/components/standings/standings.css +33 -0
- package/design/sdk/components/standings/standings.ts +130 -0
- package/design/sdk/components/stat-tile/stat-tile.css +15 -0
- package/design/sdk/components/stat-tile/stat-tile.ts +84 -0
- package/design/sdk/components/stream/stream.css +48 -0
- package/design/sdk/components/stream/stream.ts +38 -0
- package/design/sdk/components/switch/switch.css +35 -0
- package/design/sdk/components/switch/switch.ts +63 -0
- package/design/sdk/components/table/table.css +67 -0
- package/design/sdk/components/table/table.ts +160 -0
- package/design/sdk/components/tabs/tabs.css +13 -0
- package/design/sdk/components/tabs/tabs.ts +74 -0
- package/design/sdk/components/textarea/textarea.css +116 -0
- package/design/sdk/components/textarea/textarea.ts +64 -0
- package/design/sdk/components/timeline/timeline.css +30 -0
- package/design/sdk/components/timeline/timeline.ts +87 -0
- package/design/sdk/components/toolbar/toolbar.css +24 -0
- package/design/sdk/components/toolbar/toolbar.ts +87 -0
- package/design/sdk/components/tooltip/tooltip.css +15 -0
- package/design/sdk/components/tooltip/tooltip.ts +28 -0
- package/design/sdk/components/tree/selected-tint.css +15 -0
- package/design/sdk/components/tree/tree.ts +70 -0
- package/design/sdk/foundations/colors/colors.css +108 -4
- package/design/sdk/foundations/elevation/elevation.css +6 -0
- package/design/sdk/foundations/elevation/elevation.ts +11 -0
- package/design/sdk/foundations/elevation/shared/elevation/scene.css +101 -0
- package/design/sdk/foundations/elevation/shared/elevation/scene.ts +74 -0
- package/design/sdk/foundations/icons/icons.ts +119 -0
- package/design/skeleton.ts +67 -0
- package/design/slider.ts +155 -0
- package/design/standings.ts +161 -0
- package/design/stat-tile.ts +109 -0
- package/design/stream.ts +92 -0
- package/design/switch.ts +83 -0
- package/design/table.ts +302 -0
- package/design/tabs.ts +75 -0
- package/design/textarea.ts +92 -0
- package/design/timeline.ts +52 -0
- package/design/toolbar.ts +95 -0
- package/design/tooltip.ts +87 -0
- package/fesm2022/ethlete-components.mjs +228 -187
- package/fesm2022/ethlete-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/accordion/accordion.component.css +2 -1
- package/src/lib/avatar/avatar.component.css +10 -0
- package/src/lib/badge/badge.component.css +2 -2
- package/src/lib/banner/banner.component.css +3 -1
- package/src/lib/breadcrumb/breadcrumb-outlet.component.css +5 -0
- package/src/lib/breadcrumb/breadcrumb.component.css +5 -1
- package/src/lib/button/button.component.css +19 -0
- package/src/lib/button/icon-button.component.css +19 -20
- package/src/lib/button/split-button.component.css +5 -1
- package/src/lib/calendar/calendar.component.css +13 -3
- package/src/lib/card/card.component.css +4 -0
- package/src/lib/carousel/carousel-autoplay-styles.component.css +1 -1
- package/src/lib/carousel/carousel.component.css +2 -2
- package/src/lib/chart/chart-axis.component.css +3 -3
- package/src/lib/chip/chip.component.css +8 -2
- package/src/lib/description-list/description-list.component.css +2 -1
- package/src/lib/empty-state/empty-state.component.css +4 -0
- package/src/lib/floating-action/floating-action-styles.component.css +27 -0
- package/src/lib/focus-ring/focus-ring-styles.component.css +4 -1
- package/src/lib/forms/checkbox/checkbox.component.css +31 -5
- package/src/lib/forms/color-input/color-input.component.css +3 -1
- package/src/lib/forms/color-input/color-picker-panel.component.css +6 -2
- package/src/lib/forms/date-time/date-input/date-input.component.css +1 -1
- package/src/lib/forms/date-time/date-time-input/date-time-input.component.css +1 -1
- package/src/lib/forms/date-time/duration-input/duration-input.component.css +1 -1
- package/src/lib/forms/date-time/range-input-shell-styles.component.css +1 -1
- package/src/lib/forms/date-time/time-input/time-input.component.css +1 -1
- package/src/lib/forms/description/description.component.css +7 -0
- package/src/lib/forms/dropzone/dropzone.component.css +26 -0
- package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +4 -2
- package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +54 -5
- package/src/lib/forms/form-field/form-field-textarea-styles.component.css +62 -0
- package/src/lib/forms/form-field/form-field.component.css +6 -0
- package/src/lib/forms/form-field/headless/label.directive.css +1 -1
- package/src/lib/forms/input/input.component.css +6 -2
- package/src/lib/forms/input/number-input.component.css +2 -2
- package/src/lib/forms/input/password-input.component.css +4 -3
- package/src/lib/forms/otp-input/otp-input.component.css +23 -4
- package/src/lib/forms/phone-input/phone-input.component.css +4 -3
- package/src/lib/forms/rating/rating.component.css +2 -1
- package/src/lib/forms/rich-text-editor/rich-text-editor.component.css +1 -1
- package/src/lib/forms/selection-card-styles.component.css +3 -2
- package/src/lib/forms/selection-list/checkbox-group/checkbox-group-select-all.component.css +4 -2
- package/src/lib/forms/selection-list/checkbox-group/checkbox-option.component.css +4 -2
- package/src/lib/forms/selection-list/radio-group/radio.component.css +5 -2
- package/src/lib/forms/selection-list/segmented-button-group/segmented-button.component.css +2 -1
- package/src/lib/forms/slider/range-slider.component.css +98 -6
- package/src/lib/forms/slider/slider.component.css +96 -4
- package/src/lib/forms/switch/switch.component.css +47 -4
- package/src/lib/forms/tag-input/tag-input.component.css +2 -2
- package/src/lib/forms/textarea/textarea-autosize-styles.component.css +2 -3
- package/src/lib/forms/textarea/textarea.component.css +7 -2
- package/src/lib/grid/grid-item-toolbar.component.css +10 -0
- package/src/lib/grid/grid-item.component.css +6 -1
- package/src/lib/loader/brand-loader/brand-loader.component.css +4 -1
- package/src/lib/loader/progress-bar/progress-bar.component.css +1 -1
- package/src/lib/loader/spinner/spinner-styles.component.css +1 -1
- package/src/lib/match/match-card.component.css +9 -3
- package/src/lib/match/match-score.component.css +4 -1
- package/src/lib/menu/menu-selection-item.component.css +1 -1
- package/src/lib/menu/menu.component.css +5 -0
- package/src/lib/overlay/overlay-container.component.css +4 -0
- package/src/lib/pagination/pagination.component.css +4 -0
- package/src/lib/progress-steps/progress-step.component.css +4 -4
- package/src/lib/query-error/query-error.component.css +4 -0
- package/src/lib/scheduler/scheduler-appointment-styles.component.css +21 -5
- package/src/lib/scheduler/scheduler-month-view.component.css +4 -2
- package/src/lib/scheduler/scheduler-time-grid-view.component.css +8 -2
- package/src/lib/scrollable/headless/scrollable-navigation.component.css +1 -1
- package/src/lib/standings/standings-pick.component.css +1 -1
- package/src/lib/standings/standings.component.css +10 -10
- package/src/lib/stat-tile/stat-tile-sparkline.component.css +1 -1
- package/src/lib/stream/consent/stream-consent.component.css +99 -0
- package/src/lib/stream/error/stream-player-error.component.css +100 -0
- package/src/lib/stream/loading/stream-player-loading.component.css +16 -0
- package/src/lib/stream/pip/pip-slot-placeholder.component.css +68 -0
- package/src/lib/stream/stream-player-slot-styles.component.css +4 -0
- package/src/lib/table/table-resize-grip.component.css +2 -1
- package/src/lib/table/table-select-cell.component.css +45 -15
- package/src/lib/table/table.component.css +15 -5
- package/src/lib/tabs/tab-bar-styles.component.css +1 -1
- package/src/lib/tabs/tabs/tab-group.component.css +111 -0
- package/src/lib/time-picker/time-picker.component.css +2 -1
- package/src/lib/timeline/timeline-item.component.css +5 -1
- package/src/lib/toolbar/toolbar.component.css +4 -0
- package/src/lib/tooltip/tooltip.component.css +14 -0
- package/types/ethlete-components.d.ts +11 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.kbd-frame {
|
|
2
|
+
padding: 2.4rem 1.6rem;
|
|
3
|
+
background: var(--et-surface-background-solid);
|
|
4
|
+
color: var(--et-surface-color-solid);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.kbd-text {
|
|
8
|
+
margin: 0;
|
|
9
|
+
font-size: 1.4rem;
|
|
10
|
+
line-height: 1.6;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.kbd-list {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: 1.2rem;
|
|
17
|
+
font-size: 1.3rem;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.kbd-row {
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
gap: 1.6rem;
|
|
25
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { kbd, kbdStyles } from '@ethlete/components/design/kbd';
|
|
2
|
+
import { definePart, drawing } from '@design-system';
|
|
3
|
+
import frame from './kbd.css?inline';
|
|
4
|
+
|
|
5
|
+
type Platform = 'apple' | 'other';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
form: 'single' | 'combo' | 'in-text' | 'shortcut-list';
|
|
9
|
+
platform: Platform;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const MOD = { apple: '⌘', other: 'Ctrl' } as const;
|
|
13
|
+
const SHIFT = { apple: '⇧', other: 'Shift' } as const;
|
|
14
|
+
const ALT = { apple: '⌥', other: 'Alt' } as const;
|
|
15
|
+
|
|
16
|
+
const SHORTCUTS = (p: Platform) => [
|
|
17
|
+
{ label: 'Save', keys: [MOD[p], 'S'] },
|
|
18
|
+
{ label: 'Undo', keys: [MOD[p], 'Z'] },
|
|
19
|
+
{ label: 'Redo', keys: [MOD[p], SHIFT[p], 'Z'] },
|
|
20
|
+
{ label: 'Move up a level', keys: [ALT[p], '↑'] },
|
|
21
|
+
{ label: 'Next page', keys: ['PgDn'] },
|
|
22
|
+
{ label: 'Zoom in', keys: [MOD[p], '+'] },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const render = ({ form, platform: p }: Props) => {
|
|
26
|
+
switch (form) {
|
|
27
|
+
case 'single':
|
|
28
|
+
return kbd({ keys: ['Esc'] });
|
|
29
|
+
case 'combo':
|
|
30
|
+
return kbd({ keys: [MOD[p], 'K'] });
|
|
31
|
+
case 'in-text':
|
|
32
|
+
return `<p class="kbd-text">Press ${kbd({ keys: [MOD[p], 'K'] })} to open the palette, then ${kbd({ keys: ['Esc'] })} to dismiss it.</p>`;
|
|
33
|
+
case 'shortcut-list':
|
|
34
|
+
return `<div class="kbd-list">${SHORTCUTS(p)
|
|
35
|
+
.map(({ label, keys }) => `<div class="kbd-row"><span>${label}</span>${kbd({ keys })}</div>`)
|
|
36
|
+
.join('')}</div>`;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default definePart({
|
|
41
|
+
note: "Today's look",
|
|
42
|
+
madeBy: ['claude-opus-5-5'],
|
|
43
|
+
states: {
|
|
44
|
+
single: { form: 'single', platform: 'apple' },
|
|
45
|
+
'combo-apple': { form: 'combo', platform: 'apple' },
|
|
46
|
+
'combo-other': { form: 'combo', platform: 'other' },
|
|
47
|
+
'in-text': { form: 'in-text', platform: 'apple' },
|
|
48
|
+
'shortcut-list-apple': { form: 'shortcut-list', platform: 'apple' },
|
|
49
|
+
'shortcut-list-other': { form: 'shortcut-list', platform: 'other' },
|
|
50
|
+
},
|
|
51
|
+
widths: [480],
|
|
52
|
+
render: (props: Props) =>
|
|
53
|
+
drawing({
|
|
54
|
+
body: `<div class="kbd-frame">${render(props)}</div>`,
|
|
55
|
+
styles: [kbdStyles, frame].join('\n'),
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
.loader-frame {
|
|
2
|
+
padding: 2.4rem 1.6rem;
|
|
3
|
+
background: var(--et-surface-background-solid);
|
|
4
|
+
color: var(--et-surface-color-solid);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.loader-row {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: 2.4rem;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.loader-column {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: 2rem;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@layer components {
|
|
20
|
+
.et-spinner.et-color--brand {
|
|
21
|
+
--et-spinner-color: var(--et-theme-color-ink-solid);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.et-progress-bar.et-color--brand {
|
|
25
|
+
--et-progress-bar-indicator-color: var(--et-theme-color-ink-solid);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.et-brand-loader .et-brand-loader__outline {
|
|
29
|
+
stroke: var(--et-theme-color-ink-solid);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.et-brand-loader .et-brand-loader__fill {
|
|
33
|
+
stroke: var(--et-theme-color-ink-solid);
|
|
34
|
+
stroke-width: 0.7;
|
|
35
|
+
stroke-linejoin: round;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { brandLoader, loaderStyles, progressBar, spinner } from '@ethlete/components/design/loader';
|
|
2
|
+
import { definePart, drawing } from '@design-system';
|
|
3
|
+
import frame from './loader.css?inline';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
form: 'spinner' | 'spinner-determinate' | 'spinner-themed' | 'progress-bar' | 'progress-bar-themed' | 'brand-loader';
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const row = (items: string[]) => `<div class="loader-row">${items.join('')}</div>`;
|
|
10
|
+
|
|
11
|
+
const column = (items: string[]) => `<div class="loader-column">${items.join('')}</div>`;
|
|
12
|
+
|
|
13
|
+
const render = ({ form }: Props) => {
|
|
14
|
+
switch (form) {
|
|
15
|
+
case 'spinner':
|
|
16
|
+
return row([
|
|
17
|
+
spinner(),
|
|
18
|
+
spinner({ diameter: 45, strokeWidth: 2 }),
|
|
19
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true }),
|
|
20
|
+
spinner({ diameter: 72, strokeWidth: 4, track: true }),
|
|
21
|
+
]);
|
|
22
|
+
case 'spinner-determinate':
|
|
23
|
+
return row([
|
|
24
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, value: 0 }),
|
|
25
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, value: 65 }),
|
|
26
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, value: 100 }),
|
|
27
|
+
spinner({ diameter: 45, strokeWidth: 2, value: 65 }),
|
|
28
|
+
]);
|
|
29
|
+
case 'spinner-themed':
|
|
30
|
+
return row([
|
|
31
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, color: 'brand' }),
|
|
32
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, value: 65, color: 'brand' }),
|
|
33
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, color: 'danger' }),
|
|
34
|
+
spinner({ diameter: 45, strokeWidth: 2, track: true, color: 'warning' }),
|
|
35
|
+
]);
|
|
36
|
+
case 'progress-bar':
|
|
37
|
+
return column([progressBar({ value: 42 }), progressBar({ value: 100 }), progressBar()]);
|
|
38
|
+
case 'progress-bar-themed':
|
|
39
|
+
return column([
|
|
40
|
+
progressBar({ value: 42, color: 'brand' }),
|
|
41
|
+
progressBar({ color: 'brand' }),
|
|
42
|
+
progressBar({ value: 42, color: 'danger' }),
|
|
43
|
+
progressBar({ value: 42, color: 'warning' }),
|
|
44
|
+
]);
|
|
45
|
+
case 'brand-loader':
|
|
46
|
+
return row([brandLoader()]);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default definePart({
|
|
51
|
+
note: 'Decided rules only',
|
|
52
|
+
madeBy: ['claude-opus-5-5'],
|
|
53
|
+
states: {
|
|
54
|
+
spinner: { form: 'spinner' },
|
|
55
|
+
'spinner-determinate': { form: 'spinner-determinate' },
|
|
56
|
+
'spinner-themed': { form: 'spinner-themed' },
|
|
57
|
+
'progress-bar': { form: 'progress-bar' },
|
|
58
|
+
'progress-bar-themed': { form: 'progress-bar-themed' },
|
|
59
|
+
'brand-loader': { form: 'brand-loader' },
|
|
60
|
+
},
|
|
61
|
+
checks: { skip: ['CLIPPED'] },
|
|
62
|
+
widths: [480],
|
|
63
|
+
render: (props: Props) =>
|
|
64
|
+
drawing({
|
|
65
|
+
body: `<div class="loader-frame">${render(props)}</div>`,
|
|
66
|
+
styles: [loaderStyles, frame].join('\n'),
|
|
67
|
+
}),
|
|
68
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { masonry, MasonryMockItem, masonryStyles } from '@ethlete/components/design/masonry';
|
|
2
|
+
import { definePart, drawing } from '@design-system';
|
|
3
|
+
import frame from './masonry.css?inline';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
items: 'rest' | 'uneven' | 'few';
|
|
7
|
+
width?: number;
|
|
8
|
+
columnWidth?: number;
|
|
9
|
+
dir?: 'rtl';
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const tiles = (heights: readonly number[]): MasonryMockItem[] =>
|
|
13
|
+
heights.map((height, index) => ({ title: `Card ${index + 1}`, subtitle: `Height ${height}`, height }));
|
|
14
|
+
|
|
15
|
+
const ITEMS = {
|
|
16
|
+
rest: tiles([120, 160, 140, 180, 120, 150, 140, 110]),
|
|
17
|
+
uneven: tiles([80, 260, 120, 60, 200, 90, 170, 70, 130]),
|
|
18
|
+
few: tiles([120, 160, 100]),
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default definePart({
|
|
22
|
+
note: "Today's look",
|
|
23
|
+
madeBy: ['claude-opus-5-5'],
|
|
24
|
+
states: {
|
|
25
|
+
rest: { items: 'rest', columnWidth: 130 },
|
|
26
|
+
uneven: { items: 'uneven', columnWidth: 130 },
|
|
27
|
+
narrow: { items: 'rest', columnWidth: 130, width: 280 },
|
|
28
|
+
'single-column': { items: 'few' },
|
|
29
|
+
rtl: { items: 'rest', columnWidth: 130, dir: 'rtl' },
|
|
30
|
+
},
|
|
31
|
+
widths: [480],
|
|
32
|
+
render: (props: Props) =>
|
|
33
|
+
drawing({
|
|
34
|
+
body: `<div class="t-frame">${masonry({
|
|
35
|
+
items: ITEMS[props.items],
|
|
36
|
+
width: props.width,
|
|
37
|
+
columnWidth: props.columnWidth,
|
|
38
|
+
dir: props.dir,
|
|
39
|
+
})}</div>`,
|
|
40
|
+
styles: [masonryStyles, frame].join('\n'),
|
|
41
|
+
}),
|
|
42
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
.t-frame {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
padding: 1.6rem;
|
|
4
|
+
background: var(--et-surface-background-solid);
|
|
5
|
+
color: var(--et-surface-color-solid);
|
|
6
|
+
font-size: 1.4rem;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@layer components {
|
|
10
|
+
.et-match-card.et-focus-ring {
|
|
11
|
+
--_et-focus-ring-color: var(--et-theme-color-ink-solid);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.et-match-card:where([data-winner='home']) .et-match-card-side:where([data-side='home']),
|
|
15
|
+
.et-match-card:where([data-winner='away']) .et-match-card-side:where([data-side='away']) {
|
|
16
|
+
--_et-match-card-side-marker-color: light-dark(
|
|
17
|
+
var(--et-theme-color-ink-solid),
|
|
18
|
+
var(--et-theme-color-primary-solid)
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.et-match-card-live-dot {
|
|
23
|
+
background: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { matchCard, MatchMockOptions, matchStyles } from '@ethlete/components/design/match';
|
|
2
|
+
import { definePart, drawing } from '@design-system';
|
|
3
|
+
import frame from './match.css?inline';
|
|
4
|
+
|
|
5
|
+
type Props = { card: MatchMockOptions };
|
|
6
|
+
|
|
7
|
+
const HOME = { name: 'Northbridge Rovers', code: 'NBR', subtitle: 'Northbridge', seed: 1 };
|
|
8
|
+
const AWAY = { name: 'Harbor City', code: 'HBC', subtitle: 'Harbor', seed: 4 };
|
|
9
|
+
|
|
10
|
+
const finished: MatchMockOptions = {
|
|
11
|
+
home: HOME,
|
|
12
|
+
away: AWAY,
|
|
13
|
+
status: 'finished',
|
|
14
|
+
homeScore: 2,
|
|
15
|
+
awayScore: 1,
|
|
16
|
+
winnerSide: 'home',
|
|
17
|
+
label: 'Matchday 12',
|
|
18
|
+
startTime: '10/31/2026 8:00 PM',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default definePart({
|
|
22
|
+
note: 'scale of the decided shape, Q182, lead merge',
|
|
23
|
+
madeBy: ['claude-opus-5-5'],
|
|
24
|
+
states: {
|
|
25
|
+
finished: { card: finished },
|
|
26
|
+
live: {
|
|
27
|
+
card: {
|
|
28
|
+
home: HOME,
|
|
29
|
+
away: AWAY,
|
|
30
|
+
status: 'live',
|
|
31
|
+
homeScore: 1,
|
|
32
|
+
awayScore: 1,
|
|
33
|
+
label: 'Matchday 12',
|
|
34
|
+
liveColor: 'danger',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
scheduled: {
|
|
38
|
+
card: { home: HOME, away: AWAY, status: 'scheduled', label: 'Matchday 13', startTime: '11/07/2026 6:30 PM' },
|
|
39
|
+
},
|
|
40
|
+
series: {
|
|
41
|
+
card: {
|
|
42
|
+
home: HOME,
|
|
43
|
+
away: AWAY,
|
|
44
|
+
status: 'finished',
|
|
45
|
+
homeScore: 1,
|
|
46
|
+
awayScore: 2,
|
|
47
|
+
winnerSide: 'away',
|
|
48
|
+
gameScores: [
|
|
49
|
+
{ home: 13, away: 11 },
|
|
50
|
+
{ home: 9, away: 13 },
|
|
51
|
+
{ home: 10, away: 13 },
|
|
52
|
+
],
|
|
53
|
+
label: 'Semi-final, best of 3',
|
|
54
|
+
showSeeds: true,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
outcome: {
|
|
58
|
+
card: { home: HOME, away: AWAY, status: 'finished', resultKind: 'outcome', winnerSide: 'away', label: 'Round 3' },
|
|
59
|
+
},
|
|
60
|
+
tbd: {
|
|
61
|
+
card: { home: HOME, status: 'scheduled', label: 'Final', startTime: '11/21/2026 7:00 PM' },
|
|
62
|
+
},
|
|
63
|
+
compact: { card: { ...finished, size: 'compact' } },
|
|
64
|
+
expanded: { card: { ...finished, size: 'expanded' } },
|
|
65
|
+
wide: { card: { ...finished, size: 'wide' } },
|
|
66
|
+
hover: { card: { ...finished, interactive: true, force: 'hover' } },
|
|
67
|
+
'focus-visible': { card: { ...finished, interactive: true, force: 'focus-visible' } },
|
|
68
|
+
},
|
|
69
|
+
widths: [280, 480, 720],
|
|
70
|
+
render: (props: Props) =>
|
|
71
|
+
drawing({
|
|
72
|
+
// Lib bug: et-match-score clips its 25px digit box to 24px (overflow: hidden at line-height 1.2), reported.
|
|
73
|
+
body: `<div class="t-frame">${matchCard(props.card)}</div>`,
|
|
74
|
+
styles: [matchStyles, frame].join('\n'),
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.menu-frame {
|
|
2
|
+
display: flex;
|
|
3
|
+
padding: 0.8rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.menu-frame .et-menu {
|
|
7
|
+
--et-menu-max-height: 100rem;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@layer components {
|
|
11
|
+
.et-menu .et-menu-selection-item:not(.et-menu-selection-item--has-icon) .et-menu-item-check,
|
|
12
|
+
.et-menu .et-menu-selection-item--has-icon:is([aria-checked='true'], [aria-checked='mixed']) .et-menu-item-check {
|
|
13
|
+
color: var(--et-theme-color-ink-solid);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@layer components {
|
|
18
|
+
.et-menu .et-menu-item[data-active]:focus-visible {
|
|
19
|
+
outline: 2px solid var(--et-theme-color-ink-solid);
|
|
20
|
+
outline-offset: -2px;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { menu, type MenuMockRow, menuStyles } from '@ethlete/components/design/menu';
|
|
2
|
+
import { definePart, drawing, interactionRows } from '@design-system';
|
|
3
|
+
import edge from './menu.css?inline';
|
|
4
|
+
|
|
5
|
+
type ItemInteraction = 'hover' | 'active' | 'focus-visible';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
rows: MenuMockRow[];
|
|
9
|
+
forced?: ItemInteraction;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const MARK = 'data-et-control="item"';
|
|
13
|
+
|
|
14
|
+
const force = (interaction?: ItemInteraction) =>
|
|
15
|
+
[MARK, interaction && `data-et-force="${interaction}"`].filter(Boolean).join(' ');
|
|
16
|
+
|
|
17
|
+
const row = (label: string, extra: Partial<Extract<MenuMockRow, { label: string }>> = {}) =>
|
|
18
|
+
({ label, attributes: MARK, ...extra }) as MenuMockRow;
|
|
19
|
+
|
|
20
|
+
const FULL: MenuMockRow[] = [
|
|
21
|
+
{ kind: 'label', label: 'Document' },
|
|
22
|
+
row('Rename', { shortcut: 'F2' }),
|
|
23
|
+
row('Duplicate', { shortcut: 'Ctrl D' }),
|
|
24
|
+
row('Move to', { submenu: true }),
|
|
25
|
+
row('Export as PDF', { disabled: true }),
|
|
26
|
+
{ kind: 'separator' },
|
|
27
|
+
{
|
|
28
|
+
kind: 'checkbox-group',
|
|
29
|
+
label: 'Show',
|
|
30
|
+
items: [
|
|
31
|
+
{ kind: 'checkbox', label: 'Comments', checked: true, attributes: MARK },
|
|
32
|
+
{ kind: 'checkbox', label: 'Suggestions', attributes: MARK },
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{ kind: 'separator' },
|
|
36
|
+
{
|
|
37
|
+
kind: 'radio-group',
|
|
38
|
+
label: 'Sort by',
|
|
39
|
+
items: [
|
|
40
|
+
{ kind: 'radio', label: 'Name', checked: true, attributes: MARK },
|
|
41
|
+
{ kind: 'radio', label: 'Date', attributes: MARK },
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{ kind: 'separator' },
|
|
45
|
+
row('Delete', { destructive: true }),
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const withForced = (rows: MenuMockRow[], forced?: ItemInteraction): MenuMockRow[] =>
|
|
49
|
+
rows.map((entry, index) =>
|
|
50
|
+
index === 1 && 'label' in entry && entry.kind !== 'label'
|
|
51
|
+
? ({ ...entry, active: !!forced, attributes: force(forced) } as MenuMockRow)
|
|
52
|
+
: entry,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const { states, grid } = interactionRows(
|
|
56
|
+
{
|
|
57
|
+
item: { rows: [row('Rename'), row('Duplicate', { shortcut: 'Ctrl D' }), row('Move to', { submenu: true })] },
|
|
58
|
+
checked: {
|
|
59
|
+
rows: [
|
|
60
|
+
{ kind: 'checkbox', label: 'Suggestions', attributes: MARK },
|
|
61
|
+
{ kind: 'checkbox', label: 'Comments', checked: true, attributes: MARK },
|
|
62
|
+
{ kind: 'radio', label: 'Name', checked: true, attributes: MARK },
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
} satisfies Record<string, Props>,
|
|
66
|
+
{
|
|
67
|
+
interactions: ['hover', 'active', 'focus-visible'],
|
|
68
|
+
force: (props: Props, interaction: ItemInteraction): Props => ({ ...props, forced: interaction }),
|
|
69
|
+
},
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
export default definePart({
|
|
73
|
+
note: 'Decided rules only',
|
|
74
|
+
madeBy: ['claude-opus-5-5'],
|
|
75
|
+
states: {
|
|
76
|
+
menu: { rows: FULL },
|
|
77
|
+
...states,
|
|
78
|
+
disabled: { rows: [row('Rename'), row('Export as PDF', { disabled: true }), row('Duplicate')] },
|
|
79
|
+
'submenu-open': { rows: [row('Rename'), row('Move to', { submenu: 'open', active: true }), row('Duplicate')] },
|
|
80
|
+
},
|
|
81
|
+
grid,
|
|
82
|
+
widths: [480],
|
|
83
|
+
controls: {
|
|
84
|
+
item: { kind: 'row', input: ['pointer', 'keyboard'], disabled: true },
|
|
85
|
+
},
|
|
86
|
+
render: ({ rows, forced }: Props) =>
|
|
87
|
+
drawing({
|
|
88
|
+
body: `<div class="menu-frame">${menu({ rows: withForced(rows, forced), color: 'brand' })}</div>`,
|
|
89
|
+
styles: [menuStyles, edge].join('\n'),
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
.notification-frame {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
align-items: flex-end;
|
|
5
|
+
padding: 2.4rem 1.6rem;
|
|
6
|
+
background: var(--et-surface-background-solid);
|
|
7
|
+
color: var(--et-surface-color-solid);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@layer components {
|
|
11
|
+
.et-notification {
|
|
12
|
+
border-inline-start-color: var(--et-theme-color-ink-solid);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.et-notification .et-notification-icon {
|
|
16
|
+
color: var(--et-theme-color-ink-solid);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.et-notification .et-notification-spinner {
|
|
20
|
+
--et-spinner-color: var(--et-theme-color-ink-solid);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.et-notification .et-focus-ring {
|
|
24
|
+
--_et-focus-ring-color: var(--et-theme-color-ink-solid);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@layer components {
|
|
29
|
+
.et-notification-dismiss-btn:focus-visible {
|
|
30
|
+
opacity: 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { notification, notificationStack, notificationStyles } from '@ethlete/components/design/notification';
|
|
2
|
+
import { definePart, drawing } from '@design-system';
|
|
3
|
+
import edge from './notification.css?inline';
|
|
4
|
+
|
|
5
|
+
type Interaction = 'hover' | 'active' | 'focus-visible';
|
|
6
|
+
|
|
7
|
+
type Status = 'success' | 'error' | 'info' | 'loading';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
status: Status | 'stack';
|
|
11
|
+
close?: Interaction;
|
|
12
|
+
action?: Interaction;
|
|
13
|
+
secondary?: Interaction;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const PANE = 'data-et-surface-fill';
|
|
17
|
+
|
|
18
|
+
const mark = (control: string, interaction?: Interaction) =>
|
|
19
|
+
[`data-et-control="${control}" data-can-animate`, interaction && `data-et-force="${interaction}"`]
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.join(' ');
|
|
22
|
+
|
|
23
|
+
const draw = (status: Status, { close, action, secondary }: Omit<Props, 'status'> = {}) => {
|
|
24
|
+
const controls = {
|
|
25
|
+
dismissAttributes: mark('close', close),
|
|
26
|
+
attributes: PANE,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
switch (status) {
|
|
30
|
+
case 'success':
|
|
31
|
+
return notification({
|
|
32
|
+
status,
|
|
33
|
+
title: 'Kick-off moved',
|
|
34
|
+
message: 'Both teams and the referee get an email with the new time.',
|
|
35
|
+
action: { label: 'Undo', attributes: mark('action', action) },
|
|
36
|
+
...controls,
|
|
37
|
+
});
|
|
38
|
+
case 'error':
|
|
39
|
+
return notification({
|
|
40
|
+
status,
|
|
41
|
+
color: 'danger',
|
|
42
|
+
title: 'Result not saved',
|
|
43
|
+
message: 'The connection dropped before the server answered.',
|
|
44
|
+
action: { label: 'Retry', attributes: mark('action', action) },
|
|
45
|
+
secondaryAction: { label: 'Details', attributes: mark('secondary', secondary) },
|
|
46
|
+
...controls,
|
|
47
|
+
});
|
|
48
|
+
case 'info':
|
|
49
|
+
return notification({
|
|
50
|
+
status,
|
|
51
|
+
title: 'Round 4 is open',
|
|
52
|
+
message: 'Predictions close at kick-off of the first match.',
|
|
53
|
+
...controls,
|
|
54
|
+
});
|
|
55
|
+
case 'loading':
|
|
56
|
+
return notification({
|
|
57
|
+
status,
|
|
58
|
+
title: 'Uploading 3 files',
|
|
59
|
+
message: 'You can keep working while this runs.',
|
|
60
|
+
...controls,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const render = ({ status, ...interactions }: Props) =>
|
|
66
|
+
status === 'stack'
|
|
67
|
+
? notificationStack((['loading', 'info', 'error', 'success'] as const).map((each) => draw(each)))
|
|
68
|
+
: draw(status, interactions);
|
|
69
|
+
|
|
70
|
+
export default definePart({
|
|
71
|
+
note: 'The SDK notification (et-notification), drawn by its mock from @ethlete/components/design: one notification per status with title, message, dismiss icon button and, where the status has them, a primary and a secondary text-button action; the four statuses in the stack column. The pane sits one surface level above the page, as the component forces elevation 1. Error takes the danger theme (the semantic error theme); success, info and loading take the theme around them, since the design product registers no success theme.',
|
|
72
|
+
madeBy: ['claude-opus-5-5'],
|
|
73
|
+
states: {
|
|
74
|
+
success: { status: 'success' },
|
|
75
|
+
error: { status: 'error' },
|
|
76
|
+
info: { status: 'info' },
|
|
77
|
+
loading: { status: 'loading' },
|
|
78
|
+
'close-hover': { status: 'error', close: 'hover' },
|
|
79
|
+
'close-focus-visible': { status: 'error', close: 'focus-visible' },
|
|
80
|
+
'action-focus-visible': { status: 'error', action: 'focus-visible' },
|
|
81
|
+
'secondary-focus-visible': { status: 'error', secondary: 'focus-visible' },
|
|
82
|
+
'success-close-focus-visible': { status: 'success', close: 'focus-visible' },
|
|
83
|
+
'success-action-focus-visible': { status: 'success', action: 'focus-visible' },
|
|
84
|
+
stack: { status: 'stack' },
|
|
85
|
+
},
|
|
86
|
+
widths: [480],
|
|
87
|
+
contrast: {
|
|
88
|
+
exceptions: [
|
|
89
|
+
{
|
|
90
|
+
selector: '.et-notification-message',
|
|
91
|
+
reason:
|
|
92
|
+
"Today the message is the muted surface colour at 0.65 opacity; its contrast is an open point, not this round's question.",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
controls: {
|
|
97
|
+
close: { kind: 'button', input: ['pointer', 'keyboard'] },
|
|
98
|
+
action: { kind: 'button', input: ['pointer', 'keyboard'] },
|
|
99
|
+
secondary: { kind: 'button', input: ['pointer', 'keyboard'] },
|
|
100
|
+
},
|
|
101
|
+
render: (props: Props) =>
|
|
102
|
+
drawing({
|
|
103
|
+
body: `<div class="notification-frame">${render(props)}</div>`,
|
|
104
|
+
styles: [notificationStyles, edge].join('\n'),
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
.t-frame {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
display: grid;
|
|
4
|
+
justify-items: start;
|
|
5
|
+
gap: 1.6rem;
|
|
6
|
+
padding: 1.6rem;
|
|
7
|
+
background: var(--et-surface-background-solid);
|
|
8
|
+
color: var(--et-surface-color-solid);
|
|
9
|
+
font-size: 1.4rem;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@layer components {
|
|
13
|
+
et-otp-input .et-otp-input-segment[data-caret] {
|
|
14
|
+
border-color: var(--et-theme-color-ink-solid);
|
|
15
|
+
outline-color: var(--et-theme-color-ink-solid);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
et-otp-input .et-otp-input-segment .et-otp-input-caret {
|
|
19
|
+
background: var(--et-theme-color-ink-solid);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
et-otp-input > et-label .et-label-required-marker {
|
|
23
|
+
color: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@media (hover: hover) {
|
|
27
|
+
et-otp-input:not(:has(.et-otp-input-native:read-only)):hover .et-otp-input-segment:not([data-caret]) {
|
|
28
|
+
border-color: var(--et-surface-interaction-hover-solid);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
et-otp-input[data-error]:not(:has(.et-otp-input-native:read-only)):hover .et-otp-input-segment:not([data-caret]) {
|
|
32
|
+
border-color: var(--et-theme-color-ink-solid);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|