@lepid-labs/styles 1.0.0 → 1.0.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/css.d.ts +8 -0
- package/luminous-precision/components/badge.css +25 -0
- package/luminous-precision/components/button-group.css +130 -0
- package/luminous-precision/components/button-hold.css +112 -0
- package/luminous-precision/components/status-card.css +159 -0
- package/luminous-precision/components/stepper.css +108 -0
- package/luminous-precision/components/tabs.css +42 -0
- package/luminous-precision/design.md +33 -2
- package/luminous-precision/index.css +4 -0
- package/luminous-precision/tokens.css +6 -0
- package/neon-butterfly/components/badge.css +25 -0
- package/neon-butterfly/components/button-group.css +128 -0
- package/neon-butterfly/components/button-hold.css +112 -0
- package/neon-butterfly/components/status-card.css +156 -0
- package/neon-butterfly/components/stepper.css +107 -0
- package/neon-butterfly/components/tabs.css +42 -0
- package/neon-butterfly/design.md +32 -2
- package/neon-butterfly/index.css +4 -0
- package/neon-butterfly/tokens.css +6 -0
- package/package.json +58 -15
- package/summer-cloud/components/badge.css +26 -0
- package/summer-cloud/components/button-group.css +131 -0
- package/summer-cloud/components/button-hold.css +132 -0
- package/summer-cloud/components/status-card.css +158 -0
- package/summer-cloud/components/stepper.css +101 -0
- package/summer-cloud/components/tabs.css +42 -0
- package/summer-cloud/design.md +35 -1
- package/summer-cloud/index.css +4 -0
- package/summer-cloud/tokens.css +6 -0
package/css.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Type declaration for every CSS entry point in this package.
|
|
2
|
+
//
|
|
3
|
+
// TypeScript >= 6 (and 5.6+ with noUncheckedSideEffectImports) requires a
|
|
4
|
+
// side-effect import such as `import "@lepid-labs/styles/neon-butterfly"` to
|
|
5
|
+
// resolve to a module with types. CSS files have none, so every CSS subpath
|
|
6
|
+
// in package.json's "exports" carries a "types" condition pointing here.
|
|
7
|
+
// Bundlers and Node keep resolving the "default" condition to the .css file.
|
|
8
|
+
export {};
|
|
@@ -17,3 +17,28 @@
|
|
|
17
17
|
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--success { background: rgba(71, 227, 78, 0.15); color: var(--ld-success); }
|
|
18
18
|
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--warning { background: rgba(255, 184, 108, 0.15); color: var(--ld-warning); }
|
|
19
19
|
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--danger { background: rgba(255, 77, 109, 0.15); color: var(--ld-danger); }
|
|
20
|
+
|
|
21
|
+
/* Compact size — dashboard pills inside .ld-status-card__meta and row trails. */
|
|
22
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--sm {
|
|
23
|
+
padding: 0.125rem 0.375rem;
|
|
24
|
+
font-size: 9px;
|
|
25
|
+
letter-spacing: 0.06em;
|
|
26
|
+
}
|
|
27
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge[href] { text-decoration: none; }
|
|
28
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge[href]:hover { filter: brightness(1.1); }
|
|
29
|
+
|
|
30
|
+
/* Pulse — the one solid, glowing call to action (work is waiting on you). */
|
|
31
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--pulse {
|
|
32
|
+
background: var(--ld-warning);
|
|
33
|
+
border-color: transparent;
|
|
34
|
+
color: var(--ld-on-primary);
|
|
35
|
+
box-shadow: 0 0 8px color-mix(in srgb, var(--ld-warning) 60%, transparent);
|
|
36
|
+
animation: ld-lp-badge-pulse 2s ease-in-out infinite;
|
|
37
|
+
}
|
|
38
|
+
@keyframes ld-lp-badge-pulse {
|
|
39
|
+
0%, 100% { box-shadow: 0 0 6px color-mix(in srgb, var(--ld-warning) 50%, transparent); }
|
|
40
|
+
50% { box-shadow: 0 0 16px color-mix(in srgb, var(--ld-warning) 90%, transparent); }
|
|
41
|
+
}
|
|
42
|
+
@media (prefers-reduced-motion: reduce) {
|
|
43
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-badge--pulse { animation: none; }
|
|
44
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/* luminous-precision — button group: one lit-border track on a sunken well;
|
|
2
|
+
* the segments inside go chromeless and the pressed one lights up in orchid. */
|
|
3
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: stretch;
|
|
6
|
+
gap: 2px;
|
|
7
|
+
max-width: 100%;
|
|
8
|
+
padding: 3px;
|
|
9
|
+
background: var(--ld-surface-sunken);
|
|
10
|
+
border: 1px solid var(--ld-border-lit);
|
|
11
|
+
border-radius: var(--ld-radius);
|
|
12
|
+
}
|
|
13
|
+
/* --block: fill the row, equal-width segments */
|
|
14
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group--block {
|
|
15
|
+
display: flex;
|
|
16
|
+
}
|
|
17
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group--block > .ld-btn {
|
|
18
|
+
flex: 1 1 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* segments: the track is the chrome, so the button drops its own */
|
|
22
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn {
|
|
23
|
+
justify-content: center;
|
|
24
|
+
background: transparent;
|
|
25
|
+
border-color: transparent;
|
|
26
|
+
border-radius: calc(var(--ld-radius) - 3px);
|
|
27
|
+
color: var(--ld-faint);
|
|
28
|
+
white-space: nowrap;
|
|
29
|
+
transition:
|
|
30
|
+
background var(--ld-transition),
|
|
31
|
+
border-color var(--ld-transition),
|
|
32
|
+
color var(--ld-transition),
|
|
33
|
+
box-shadow var(--ld-transition);
|
|
34
|
+
}
|
|
35
|
+
/* variants tint the label only — a solid fill would break the track */
|
|
36
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--primary {
|
|
37
|
+
color: var(--ld-primary);
|
|
38
|
+
}
|
|
39
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--accent {
|
|
40
|
+
color: var(--ld-accent);
|
|
41
|
+
}
|
|
42
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--danger {
|
|
43
|
+
color: var(--ld-danger);
|
|
44
|
+
}
|
|
45
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn:hover,
|
|
46
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn:focus-visible {
|
|
47
|
+
background: var(--ld-surface);
|
|
48
|
+
border-color: transparent;
|
|
49
|
+
color: var(--ld-on-surface);
|
|
50
|
+
animation: none;
|
|
51
|
+
}
|
|
52
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn:focus-visible {
|
|
53
|
+
/* an outline, not the border: it must stay visible on the pressed segment */
|
|
54
|
+
outline: 1px solid var(--ld-primary);
|
|
55
|
+
outline-offset: 1px;
|
|
56
|
+
}
|
|
57
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--primary:hover,
|
|
58
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--primary:focus-visible {
|
|
59
|
+
color: var(--ld-primary);
|
|
60
|
+
}
|
|
61
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--accent:hover,
|
|
62
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--accent:focus-visible {
|
|
63
|
+
color: var(--ld-accent);
|
|
64
|
+
}
|
|
65
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--danger:hover,
|
|
66
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--danger:focus-visible {
|
|
67
|
+
color: var(--ld-danger);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* pressed segment (toggle / segmented use): raised orchid pane with a soft glow */
|
|
71
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn--active,
|
|
72
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn[aria-pressed="true"] {
|
|
73
|
+
background: var(--ld-surface);
|
|
74
|
+
border-color: var(--ld-primary-border);
|
|
75
|
+
color: var(--ld-primary);
|
|
76
|
+
box-shadow: 0 0 12px var(--ld-primary-glow);
|
|
77
|
+
}
|
|
78
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn:disabled {
|
|
79
|
+
background: transparent;
|
|
80
|
+
color: var(--ld-faint);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* Sliding pill: with exactly one pressed segment, its chrome moves to one
|
|
84
|
+
* lit segment on the track, pinned to the segment by anchor positioning, so a
|
|
85
|
+
* change of selection travels instead of blinking. Its inline edges transition
|
|
86
|
+
* separately — with data-ld-dir ("forward" | "back", set by ButtonGroup) the
|
|
87
|
+
* edge nearer the target leads and the far edge trails, stretching the pill
|
|
88
|
+
* across the gap; without it the pill just slides. Several pressed segments
|
|
89
|
+
* (multi-toggle), or no anchor positioning, keep the per-segment chrome above. */
|
|
90
|
+
@supports (anchor-name: --ld-a) and (anchor-scope: --ld-a) {
|
|
91
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group {
|
|
92
|
+
position: relative;
|
|
93
|
+
isolation: isolate;
|
|
94
|
+
anchor-scope: --ld-btn-group-active;
|
|
95
|
+
}
|
|
96
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group:not(:has(> :is(.ld-btn--active, .ld-btn[aria-pressed="true"]) ~ :is(.ld-btn--active, .ld-btn[aria-pressed="true"]))) > :is(.ld-btn--active, .ld-btn[aria-pressed="true"]) {
|
|
97
|
+
anchor-name: --ld-btn-group-active;
|
|
98
|
+
background: transparent;
|
|
99
|
+
border-color: transparent;
|
|
100
|
+
box-shadow: none;
|
|
101
|
+
}
|
|
102
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group:where(:has(> :is(.ld-btn--active, .ld-btn[aria-pressed="true"])):not(:has(> :is(.ld-btn--active, .ld-btn[aria-pressed="true"]) ~ :is(.ld-btn--active, .ld-btn[aria-pressed="true"]))))::before {
|
|
103
|
+
content: "";
|
|
104
|
+
position: absolute;
|
|
105
|
+
z-index: -1;
|
|
106
|
+
position-anchor: --ld-btn-group-active;
|
|
107
|
+
inset-block: anchor(top) anchor(bottom);
|
|
108
|
+
inset-inline: anchor(start) anchor(end);
|
|
109
|
+
background: var(--ld-surface);
|
|
110
|
+
border: 1px solid var(--ld-primary-border);
|
|
111
|
+
border-radius: calc(var(--ld-radius) - 3px);
|
|
112
|
+
box-shadow: 0 0 12px var(--ld-primary-glow);
|
|
113
|
+
pointer-events: none;
|
|
114
|
+
transition: inset-inline-start var(--ld-slide-lead), inset-inline-end var(--ld-slide-lead);
|
|
115
|
+
}
|
|
116
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group[data-ld-dir="forward"]::before {
|
|
117
|
+
transition: inset-inline-start var(--ld-slide-trail), inset-inline-end var(--ld-slide-lead);
|
|
118
|
+
}
|
|
119
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group[data-ld-dir="back"]::before {
|
|
120
|
+
transition: inset-inline-start var(--ld-slide-lead), inset-inline-end var(--ld-slide-trail);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@media (prefers-reduced-motion: reduce) {
|
|
125
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group > .ld-btn,
|
|
126
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group::before,
|
|
127
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn-group[data-ld-dir]::before {
|
|
128
|
+
transition: none;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* luminous-precision — hold-to-confirm button: rose ring, orchid/teal for the other variants, bloom at 100%
|
|
2
|
+
*
|
|
3
|
+
* Contract: .ld-btn--hold composes with .ld-btn and any variant. The consumer
|
|
4
|
+
* writes one number, --ld-hold in [0, 1]; the ring fill is pure CSS.
|
|
5
|
+
* data-ld-hold="holding" | "fired" carries the behavioural state.
|
|
6
|
+
*/
|
|
7
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold {
|
|
8
|
+
--ld-hold: 0;
|
|
9
|
+
--ld-hold-color: var(--ld-on-surface); /* neutral on its own */
|
|
10
|
+
position: relative;
|
|
11
|
+
gap: var(--ld-space-3);
|
|
12
|
+
padding: var(--ld-space-2) var(--ld-space-3) var(--ld-space-2) var(--ld-space-2);
|
|
13
|
+
text-align: left;
|
|
14
|
+
user-select: none;
|
|
15
|
+
-webkit-user-select: none;
|
|
16
|
+
touch-action: none; /* a touch hold must not turn into a scroll */
|
|
17
|
+
}
|
|
18
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold.ld-btn--primary {
|
|
19
|
+
--ld-hold-color: var(--ld-primary);
|
|
20
|
+
}
|
|
21
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold.ld-btn--accent {
|
|
22
|
+
--ld-hold-color: var(--ld-accent);
|
|
23
|
+
}
|
|
24
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold.ld-btn--danger {
|
|
25
|
+
--ld-hold-color: var(--ld-danger);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ring: the icon well, wrapped by a conic fill masked to a 3px stroke */
|
|
29
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__ring {
|
|
30
|
+
position: relative;
|
|
31
|
+
display: inline-grid;
|
|
32
|
+
place-items: center;
|
|
33
|
+
flex: none;
|
|
34
|
+
width: 2.25rem;
|
|
35
|
+
height: 2.25rem;
|
|
36
|
+
border-radius: 50%;
|
|
37
|
+
background: var(--ld-surface-sunken);
|
|
38
|
+
color: var(--ld-hold-color);
|
|
39
|
+
}
|
|
40
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__ring::before {
|
|
41
|
+
content: "";
|
|
42
|
+
position: absolute;
|
|
43
|
+
inset: 0;
|
|
44
|
+
border-radius: 50%;
|
|
45
|
+
background: conic-gradient(var(--ld-hold-color) calc(var(--ld-hold) * 360deg), var(--ld-border-lit) 0);
|
|
46
|
+
-webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2.5px));
|
|
47
|
+
mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2.5px));
|
|
48
|
+
}
|
|
49
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__ring > svg {
|
|
50
|
+
width: 1rem;
|
|
51
|
+
height: 1rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__body {
|
|
55
|
+
display: flex;
|
|
56
|
+
flex-direction: column;
|
|
57
|
+
align-items: flex-start;
|
|
58
|
+
gap: 0.125rem;
|
|
59
|
+
line-height: 1.2;
|
|
60
|
+
}
|
|
61
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__label {
|
|
62
|
+
font-weight: var(--ld-font-weight-bold);
|
|
63
|
+
}
|
|
64
|
+
/* the hint and meter restate the ring, so state is never color-only */
|
|
65
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__hint {
|
|
66
|
+
font-size: 11px;
|
|
67
|
+
font-weight: var(--ld-font-weight);
|
|
68
|
+
letter-spacing: normal;
|
|
69
|
+
text-transform: none;
|
|
70
|
+
color: var(--ld-faint);
|
|
71
|
+
}
|
|
72
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn__meter {
|
|
73
|
+
margin-left: auto;
|
|
74
|
+
min-width: 3.5ch;
|
|
75
|
+
text-align: right;
|
|
76
|
+
font-family: var(--ld-font-mono);
|
|
77
|
+
font-variant-numeric: tabular-nums;
|
|
78
|
+
font-size: 12px;
|
|
79
|
+
color: var(--ld-faint);
|
|
80
|
+
}
|
|
81
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold[data-ld-hold="holding"] .ld-btn__meter {
|
|
82
|
+
color: var(--ld-hold-color);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* fired: the post-commit flash */
|
|
86
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold[data-ld-hold="fired"] {
|
|
87
|
+
box-shadow: 0 0 24px color-mix(in srgb, var(--ld-hold-color) 45%, transparent);
|
|
88
|
+
animation: ld-lp-hold-fired 0.6s ease-out;
|
|
89
|
+
}
|
|
90
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold[data-ld-hold="fired"] .ld-btn__ring {
|
|
91
|
+
box-shadow: 0 0 16px color-mix(in srgb, var(--ld-hold-color) 55%, transparent);
|
|
92
|
+
}
|
|
93
|
+
@keyframes ld-lp-hold-fired {
|
|
94
|
+
from {
|
|
95
|
+
box-shadow: 0 0 32px color-mix(in srgb, var(--ld-hold-color) 70%, transparent);
|
|
96
|
+
}
|
|
97
|
+
to {
|
|
98
|
+
box-shadow: 0 0 24px color-mix(in srgb, var(--ld-hold-color) 45%, transparent);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* reduced motion: the ring still fills (it is the state, not decoration);
|
|
103
|
+
* only the flash and glow go */
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold[data-ld-hold="fired"] {
|
|
106
|
+
animation: none;
|
|
107
|
+
box-shadow: none;
|
|
108
|
+
}
|
|
109
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-btn--hold[data-ld-hold="fired"] .ld-btn__ring {
|
|
110
|
+
box-shadow: none;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/* luminous-precision — status card: a dense dashboard card whose left edge, ring, and
|
|
2
|
+
* flash carry state (generalized from pulse's repo card).
|
|
3
|
+
* .ld-status-card--<tone> left edge in the semantic color
|
|
4
|
+
* [data-ld-attention="<tone>"] outline + glow ring calling for action
|
|
5
|
+
* [data-ld-changed] replays the change flash while present */
|
|
6
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card {
|
|
7
|
+
--ld-status-attention: var(--ld-warning);
|
|
8
|
+
position: relative;
|
|
9
|
+
display: flex;
|
|
10
|
+
flex-direction: column;
|
|
11
|
+
padding: 0;
|
|
12
|
+
background: var(--ld-surface-glass);
|
|
13
|
+
border: 1px solid var(--ld-border);
|
|
14
|
+
border-top-color: var(--ld-border-lit);
|
|
15
|
+
border-left: 3px solid transparent;
|
|
16
|
+
border-radius: var(--ld-radius-lg);
|
|
17
|
+
backdrop-filter: blur(var(--ld-blur));
|
|
18
|
+
-webkit-backdrop-filter: blur(var(--ld-blur));
|
|
19
|
+
color: var(--ld-on-surface);
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
transition: background var(--ld-transition), box-shadow var(--ld-transition);
|
|
22
|
+
}
|
|
23
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card:hover { box-shadow: 0 0 12px var(--ld-primary-glow); }
|
|
24
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card--info { border-left-color: var(--ld-info); }
|
|
25
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card--success { border-left-color: var(--ld-success); }
|
|
26
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card--warning { border-left-color: var(--ld-warning); }
|
|
27
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card--danger { border-left-color: var(--ld-danger); }
|
|
28
|
+
|
|
29
|
+
/* attention ring — the tone rides on the attribute value */
|
|
30
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-attention] {
|
|
31
|
+
outline: 1px solid color-mix(in srgb, var(--ld-status-attention) 70%, transparent);
|
|
32
|
+
box-shadow: 0 0 14px color-mix(in srgb, var(--ld-status-attention) 35%, transparent);
|
|
33
|
+
}
|
|
34
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-attention]:hover {
|
|
35
|
+
box-shadow: 0 0 18px color-mix(in srgb, var(--ld-status-attention) 55%, transparent);
|
|
36
|
+
}
|
|
37
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-attention="info"] { --ld-status-attention: var(--ld-info); }
|
|
38
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-attention="success"] { --ld-status-attention: var(--ld-success); }
|
|
39
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-attention="danger"] { --ld-status-attention: var(--ld-danger); }
|
|
40
|
+
|
|
41
|
+
/* change flash — fades from a primary tint back to the resting glass */
|
|
42
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-changed] { animation: ld-lp-status-flash 30s ease-out forwards; }
|
|
43
|
+
@keyframes ld-lp-status-flash {
|
|
44
|
+
from { background: color-mix(in srgb, var(--ld-primary) 20%, var(--ld-surface)); }
|
|
45
|
+
to { background: var(--ld-surface-glass); }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__watermark {
|
|
49
|
+
position: absolute;
|
|
50
|
+
top: 0;
|
|
51
|
+
left: -0.25rem;
|
|
52
|
+
width: 2rem;
|
|
53
|
+
height: 2rem;
|
|
54
|
+
color: var(--ld-on-surface);
|
|
55
|
+
opacity: 0.12;
|
|
56
|
+
pointer-events: none;
|
|
57
|
+
rotate: -25deg;
|
|
58
|
+
}
|
|
59
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__watermark > svg { width: 100%; height: 100%; }
|
|
60
|
+
|
|
61
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__head {
|
|
62
|
+
display: flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
justify-content: space-between;
|
|
65
|
+
gap: var(--ld-space-2);
|
|
66
|
+
padding: 0.625rem 0.75rem 0.5rem 0.875rem;
|
|
67
|
+
}
|
|
68
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__title {
|
|
69
|
+
min-width: 0;
|
|
70
|
+
overflow: hidden;
|
|
71
|
+
font-family: var(--ld-font-display);
|
|
72
|
+
letter-spacing: -0.01em;
|
|
73
|
+
font-size: var(--ld-text-sm);
|
|
74
|
+
font-weight: var(--ld-font-weight-medium);
|
|
75
|
+
white-space: nowrap;
|
|
76
|
+
text-overflow: ellipsis;
|
|
77
|
+
color: inherit;
|
|
78
|
+
text-decoration: none;
|
|
79
|
+
transition: color var(--ld-transition);
|
|
80
|
+
}
|
|
81
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__title[href]:hover { color: var(--ld-primary); }
|
|
82
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__prefix { color: var(--ld-faint); }
|
|
83
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__prefix::after { content: " // "; opacity: 0.5; }
|
|
84
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__meta {
|
|
85
|
+
display: flex;
|
|
86
|
+
align-items: center;
|
|
87
|
+
gap: 0.375rem;
|
|
88
|
+
flex-shrink: 0;
|
|
89
|
+
}
|
|
90
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__note {
|
|
91
|
+
font-size: 11px;
|
|
92
|
+
color: var(--ld-faint);
|
|
93
|
+
white-space: nowrap;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__rows {
|
|
97
|
+
list-style: none;
|
|
98
|
+
margin: 0;
|
|
99
|
+
padding: 0;
|
|
100
|
+
border-top: 1px solid var(--ld-border);
|
|
101
|
+
}
|
|
102
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__row {
|
|
103
|
+
display: grid;
|
|
104
|
+
grid-template-columns: auto 1fr auto;
|
|
105
|
+
align-items: baseline;
|
|
106
|
+
gap: 0.375rem;
|
|
107
|
+
padding: 0.3rem 0.75rem 0.3rem 0.875rem;
|
|
108
|
+
font-size: 12px;
|
|
109
|
+
color: inherit;
|
|
110
|
+
text-decoration: none;
|
|
111
|
+
transition: background 0.1s;
|
|
112
|
+
}
|
|
113
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__row[href]:hover { background: color-mix(in srgb, var(--ld-primary) 8%, transparent); }
|
|
114
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__row-lead {
|
|
115
|
+
min-width: 1.5rem;
|
|
116
|
+
font-size: 11px;
|
|
117
|
+
font-weight: var(--ld-font-weight-bold);
|
|
118
|
+
color: var(--ld-faint);
|
|
119
|
+
text-align: right;
|
|
120
|
+
font-variant-numeric: tabular-nums;
|
|
121
|
+
}
|
|
122
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__row-main {
|
|
123
|
+
min-width: 0;
|
|
124
|
+
overflow: hidden;
|
|
125
|
+
white-space: nowrap;
|
|
126
|
+
text-overflow: ellipsis;
|
|
127
|
+
color: var(--ld-on-surface);
|
|
128
|
+
}
|
|
129
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__row-trail {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
gap: var(--ld-space-1);
|
|
133
|
+
flex-shrink: 0;
|
|
134
|
+
font-size: 10px;
|
|
135
|
+
color: var(--ld-faint);
|
|
136
|
+
}
|
|
137
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__footer {
|
|
138
|
+
display: block;
|
|
139
|
+
padding: 0.3rem 0.875rem;
|
|
140
|
+
border-top: 1px solid var(--ld-border);
|
|
141
|
+
font-size: 11px;
|
|
142
|
+
color: var(--ld-faint);
|
|
143
|
+
text-decoration: none;
|
|
144
|
+
transition: color var(--ld-transition);
|
|
145
|
+
}
|
|
146
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__footer[href]:hover { color: var(--ld-accent); }
|
|
147
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card__empty {
|
|
148
|
+
margin: 0;
|
|
149
|
+
padding: 0.375rem 0.875rem 0.5rem;
|
|
150
|
+
border-top: 1px solid var(--ld-border);
|
|
151
|
+
font-size: 12px;
|
|
152
|
+
color: var(--ld-faint);
|
|
153
|
+
opacity: 0.7;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@media (prefers-reduced-motion: reduce) {
|
|
157
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card { transition: none; }
|
|
158
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-status-card[data-ld-changed] { animation: none; }
|
|
159
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/* luminous-precision — stepper: a milestone rail with labelled step nodes.
|
|
2
|
+
* Orchid rail and complete nodes; the current node lights up electric teal,
|
|
3
|
+
* the theme's active-path signal.
|
|
4
|
+
* .ld-stepper__step--complete solid orchid node, dark icon
|
|
5
|
+
* .ld-stepper__step--current indigo node, 2px teal border, teal glow
|
|
6
|
+
* .ld-stepper__step--upcoming sunken node, hairline border, faint icon
|
|
7
|
+
* The fill follows the state modifiers — no progress value to compute. */
|
|
8
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper {
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: flex-start;
|
|
11
|
+
list-style: none;
|
|
12
|
+
margin: 0;
|
|
13
|
+
padding: 0;
|
|
14
|
+
}
|
|
15
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step {
|
|
16
|
+
position: relative;
|
|
17
|
+
flex: 1 1 0;
|
|
18
|
+
min-width: 0;
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
align-items: center;
|
|
22
|
+
gap: var(--ld-space-2);
|
|
23
|
+
text-align: center;
|
|
24
|
+
}
|
|
25
|
+
/* rail segment: from this node's centre to the next node's centre; the track is
|
|
26
|
+
* ::before, the fill ::after. Segments meet under the nodes, so the rail reads
|
|
27
|
+
* as one bar and the fill ends exactly at the current node. */
|
|
28
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step::before,
|
|
29
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step::after {
|
|
30
|
+
content: "";
|
|
31
|
+
position: absolute;
|
|
32
|
+
top: 0.75rem;
|
|
33
|
+
left: 50%;
|
|
34
|
+
width: 100%;
|
|
35
|
+
height: 0.5rem;
|
|
36
|
+
border-radius: 1rem;
|
|
37
|
+
}
|
|
38
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step:last-child::before,
|
|
39
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step:last-child::after { display: none; }
|
|
40
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step::before {
|
|
41
|
+
background: var(--ld-surface-sunken);
|
|
42
|
+
box-shadow: inset 0 0 0 1px var(--ld-border);
|
|
43
|
+
}
|
|
44
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step::after {
|
|
45
|
+
width: 0;
|
|
46
|
+
background: var(--ld-primary);
|
|
47
|
+
box-shadow: 0 0 8px var(--ld-primary-glow);
|
|
48
|
+
transition: width var(--ld-transition);
|
|
49
|
+
}
|
|
50
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--complete::after { width: 100%; }
|
|
51
|
+
|
|
52
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__node {
|
|
53
|
+
position: relative;
|
|
54
|
+
z-index: 1;
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
width: 2rem;
|
|
59
|
+
height: 2rem;
|
|
60
|
+
border-radius: 50%;
|
|
61
|
+
box-sizing: border-box;
|
|
62
|
+
font-family: var(--ld-font-mono);
|
|
63
|
+
font-size: 12px;
|
|
64
|
+
font-weight: var(--ld-font-weight-bold);
|
|
65
|
+
line-height: 1;
|
|
66
|
+
transition: background var(--ld-transition), color var(--ld-transition), box-shadow var(--ld-transition);
|
|
67
|
+
}
|
|
68
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__node > svg { width: 1rem; height: 1rem; }
|
|
69
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--complete .ld-stepper__node {
|
|
70
|
+
background: var(--ld-primary);
|
|
71
|
+
color: var(--ld-on-primary);
|
|
72
|
+
box-shadow: 0 0 8px var(--ld-primary-glow);
|
|
73
|
+
}
|
|
74
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--current .ld-stepper__node {
|
|
75
|
+
background: var(--ld-surface);
|
|
76
|
+
border: 2px solid var(--ld-accent);
|
|
77
|
+
color: var(--ld-accent);
|
|
78
|
+
box-shadow: 0 0 12px var(--ld-accent-glow);
|
|
79
|
+
}
|
|
80
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--upcoming .ld-stepper__node {
|
|
81
|
+
background: var(--ld-surface-sunken);
|
|
82
|
+
border: 1px solid var(--ld-border);
|
|
83
|
+
color: var(--ld-faint);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* label voice: uppercase 600 mono, tracked 0.05em */
|
|
87
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__label {
|
|
88
|
+
font-family: var(--ld-font-mono);
|
|
89
|
+
font-size: 12px;
|
|
90
|
+
font-weight: var(--ld-font-weight-medium);
|
|
91
|
+
text-transform: uppercase;
|
|
92
|
+
letter-spacing: var(--ld-tracking-wide);
|
|
93
|
+
line-height: 1.3;
|
|
94
|
+
color: var(--ld-faint);
|
|
95
|
+
transition: color var(--ld-transition), text-shadow var(--ld-transition);
|
|
96
|
+
}
|
|
97
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--complete .ld-stepper__label { color: var(--ld-on-surface); }
|
|
98
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--current .ld-stepper__label {
|
|
99
|
+
color: var(--ld-accent);
|
|
100
|
+
text-shadow: 0 0 8px var(--ld-accent-glow);
|
|
101
|
+
}
|
|
102
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step--upcoming .ld-stepper__label { color: var(--ld-faint); }
|
|
103
|
+
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__step::after,
|
|
106
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__node,
|
|
107
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-stepper__label { transition: none; }
|
|
108
|
+
}
|
|
@@ -31,3 +31,45 @@
|
|
|
31
31
|
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabpanel {
|
|
32
32
|
padding: var(--ld-space-3) 0;
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
/* Sliding indicator: one bar on the tablist, pinned to the active tab by
|
|
36
|
+
* anchor positioning, takes over the underline. Its inline edges transition
|
|
37
|
+
* separately — with data-ld-dir ("forward" | "back", set by the Tabs
|
|
38
|
+
* component) the edge nearer the target leads and the far edge trails, so the
|
|
39
|
+
* bar reaches for the tab; without it the bar just slides. Browsers without
|
|
40
|
+
* anchor positioning keep the static underline above. */
|
|
41
|
+
@supports (anchor-name: --ld-a) and (anchor-scope: --ld-a) {
|
|
42
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs {
|
|
43
|
+
position: relative;
|
|
44
|
+
anchor-scope: --ld-tab-active;
|
|
45
|
+
}
|
|
46
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs :is(.ld-tab--active, .ld-tab[aria-selected="true"]) {
|
|
47
|
+
anchor-name: --ld-tab-active;
|
|
48
|
+
border-bottom-color: transparent;
|
|
49
|
+
}
|
|
50
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs:where(:has(.ld-tab--active, .ld-tab[aria-selected="true"]))::after {
|
|
51
|
+
content: "";
|
|
52
|
+
position: absolute;
|
|
53
|
+
position-anchor: --ld-tab-active;
|
|
54
|
+
inset-block-end: anchor(bottom);
|
|
55
|
+
inset-inline: anchor(start) anchor(end);
|
|
56
|
+
block-size: 2px;
|
|
57
|
+
background: var(--ld-accent);
|
|
58
|
+
box-shadow: 0 0 10px var(--ld-accent-glow), 0 0 2px var(--ld-accent);
|
|
59
|
+
pointer-events: none;
|
|
60
|
+
transition: inset-inline-start var(--ld-slide-lead), inset-inline-end var(--ld-slide-lead);
|
|
61
|
+
}
|
|
62
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs[data-ld-dir="forward"]::after {
|
|
63
|
+
transition: inset-inline-start var(--ld-slide-trail), inset-inline-end var(--ld-slide-lead);
|
|
64
|
+
}
|
|
65
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs[data-ld-dir="back"]::after {
|
|
66
|
+
transition: inset-inline-start var(--ld-slide-lead), inset-inline-end var(--ld-slide-trail);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@media (prefers-reduced-motion: reduce) {
|
|
71
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs::after,
|
|
72
|
+
:where([data-ld-style="luminous-precision"], [data-ld-style="luminous-precision"] *).ld-tabs[data-ld-dir]::after {
|
|
73
|
+
transition: none;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -56,25 +56,56 @@ tonal layers and glow, not drop shadows. Never pure white or pure black.
|
|
|
56
56
|
Class prefix `ld-` (shared token/class contract with the other themes).
|
|
57
57
|
|
|
58
58
|
- **Card** `.ld-card` — glass pane, 1rem radius, lit top edge.
|
|
59
|
+
- **Status card** `.ld-status-card` — dense dashboard card, 1rem radius, Sora title (from pulse's repo
|
|
60
|
+
card): 3px left edge takes a semantic `--<tone>`, `data-ld-attention="<tone>"`
|
|
61
|
+
adds an outline + glow ring, `data-ld-changed` replays a 30s tint flash.
|
|
62
|
+
Parts: `__watermark`, `__head`, `__prefix`, `__title`, `__meta`, `__note`,
|
|
63
|
+
`__rows`, `__row` (`-lead`/`-main`/`-trail`), `__footer`, `__empty`.
|
|
59
64
|
- **NavLink** `.ld-link` — glass list row; hover shifts to solid indigo and
|
|
60
65
|
lights a 2px teal bar on the left edge.
|
|
61
66
|
- **Button** `.ld-btn` — ghost by default; `--primary` is the one solid fill
|
|
62
67
|
(orchid, dark text), `--accent` teal ghost, `--danger` rose ghost. `--sm` is a
|
|
63
68
|
compact size scaled to `.ld-badge`, for inline and table-row actions.
|
|
69
|
+
- **Hold button** `.ld-btn--hold` (+ `__ring`, `__body`, `__label`, `__hint`,
|
|
70
|
+
`__meter`) — hold-to-confirm: a 3px conic ring around the icon well fills
|
|
71
|
+
as `--ld-hold` goes 0→1; `--danger` paints it rose, `--primary` orchid,
|
|
72
|
+
`--accent` teal, neutral alone. `data-ld-hold="fired"` blooms the button
|
|
73
|
+
and ring in the ring color (dropped under reduced motion; the fill stays).
|
|
74
|
+
Window: `--ld-hold-duration` 300 ms. The ring *is* the confirmation.
|
|
75
|
+
- **Button group** `.ld-btn-group` (+ `--block`) — one long track with
|
|
76
|
+
`.ld-btn` segments lined up inside; the track owns the chrome and the
|
|
77
|
+
segments drop theirs. Lit-border track on the sunken well; faint mono
|
|
78
|
+
labels. The pressed segment (`aria-pressed="true"` / `.ld-btn--active`) is a
|
|
79
|
+
raised pane with an orchid border, orchid label and soft glow; no hover
|
|
80
|
+
pulse inside the track.
|
|
81
|
+
With one pressed segment the chrome is a single sliding pane: the edge
|
|
82
|
+
nearer the new segment leads, the far edge trails on a tight spring with barely any overshoot
|
|
83
|
+
(`--ld-slide-lead` / `--ld-slide-trail`, direction from `data-ld-dir`).
|
|
84
|
+
Variants tint the label only; `--block` fills the row with equal-width
|
|
85
|
+
segments. Use `role="group"` + `aria-label`.
|
|
64
86
|
- **Form** `.ld-input`, `.ld-textarea`, `.ld-select`, `.ld-label`,
|
|
65
87
|
`.ld-field`, `.ld-checkbox`, `.ld-radio`, `.ld-switch`, `.ld-choice` —
|
|
66
88
|
checked/focus states glow teal.
|
|
67
89
|
- **Badge** `.ld-badge` — pill chip: 15% tint of its hue behind
|
|
68
|
-
full-saturation text (+ semantic modifiers).
|
|
90
|
+
full-saturation text (+ semantic modifiers). `--sm` is the 9px dashboard
|
|
91
|
+
pill; `--pulse` the one solid amber call to action with a breathing glow.
|
|
69
92
|
- **Alert** `.ld-alert` — glass, 3px left bar carries the semantic color.
|
|
70
93
|
- **Dialog** `.ld-dialog` — native `<dialog>`, indigo pane with orchid glow,
|
|
71
94
|
Sora title, blurred obsidian backdrop.
|
|
72
95
|
- **Tabs** `.ld-tabs`/`.ld-tab`/`.ld-tabpanel` — active tab underlined in
|
|
73
|
-
teal with text glow
|
|
96
|
+
teal with text glow; the underline is one lit bar that reaches for the new
|
|
97
|
+
tab and settles with barely any overshoot (same slide tokens).
|
|
74
98
|
- **Table** `.ld-table` — lit header rule; row hover shifts glass and lights
|
|
75
99
|
the teal left bar.
|
|
76
100
|
- **Progress** `.ld-progress`, **Spinner** `.ld-spinner` — glowing orchid
|
|
77
101
|
indicators (`--accent` bar variant in teal).
|
|
102
|
+
- **Stepper** `.ld-stepper` (+ `__step`, `__node`, `__label`) — milestone
|
|
103
|
+
rail: glowing orchid fill on a sunken track, 2rem nodes, uppercase mono
|
|
104
|
+
labels. `__step--complete` is a solid orchid node; `--current` lights the
|
|
105
|
+
active path in teal — 2px teal border, teal icon and glow, teal label;
|
|
106
|
+
`--upcoming` a hairline sunken node in faint. The rail is per-step
|
|
107
|
+
(`::before` track, `::after` fill), so the fill follows the modifiers and
|
|
108
|
+
`aria-current="step"` marks the active node.
|
|
78
109
|
- **Muted text** `.ld-muted` — faint secondary/empty-state text;
|
|
79
110
|
`color: var(--ld-faint)`, italic.
|
|
80
111
|
- **Pre / log block** `.ld-pre` — command/log `<pre>`; the surface-sunken
|