@scttlnd/fintech-design-system 0.2.0 → 0.3.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/AGENTS.md +1 -1
- package/README.md +9 -3
- package/dist/components/Badge.d.mts +9 -0
- package/dist/components/Badge.mjs +18 -0
- package/dist/components/Badge.mjs.map +1 -0
- package/dist/components/Button.d.mts +6 -0
- package/dist/components/Button.mjs +14 -0
- package/dist/components/Button.mjs.map +1 -0
- package/dist/components/Field.d.mts +20 -0
- package/dist/components/Field.mjs +57 -0
- package/dist/components/Field.mjs.map +1 -0
- package/dist/components/Menu.d.mts +18 -0
- package/dist/components/Menu.mjs +109 -0
- package/dist/components/Menu.mjs.map +1 -0
- package/dist/components/Meter.d.mts +39 -0
- package/dist/components/Meter.mjs +82 -0
- package/dist/components/Meter.mjs.map +1 -0
- package/dist/components/Metric.d.mts +17 -0
- package/dist/components/Metric.mjs +34 -0
- package/dist/components/Metric.mjs.map +1 -0
- package/dist/components/Notice.d.mts +16 -0
- package/dist/components/Notice.mjs +48 -0
- package/dist/components/Notice.mjs.map +1 -0
- package/dist/components/Panel.d.mts +13 -0
- package/dist/components/Panel.mjs +42 -0
- package/dist/components/Panel.mjs.map +1 -0
- package/dist/index.d.mts +10 -125
- package/dist/index.mjs +9 -365
- package/dist/lib/cn.d.mts +2 -0
- package/dist/lib/cn.mjs +7 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/package.json +18 -3
- package/styles/components/badge.css +33 -0
- package/styles/components/button.css +45 -0
- package/styles/components/empty-state.css +20 -0
- package/styles/components/eyebrow.css +11 -0
- package/styles/components/field.css +59 -0
- package/styles/components/grain.css +245 -0
- package/styles/components/menu.css +74 -0
- package/styles/components/meter.css +62 -0
- package/styles/components/metric.css +28 -0
- package/styles/components/notice.css +34 -0
- package/styles/components/panel.css +42 -0
- package/styles/components/tone.css +15 -0
- package/styles/components.css +11 -367
- package/styles/index.css +2 -43
- package/styles/themes/funder.css +76 -8
- package/styles/themes/investor.css +76 -8
- package/styles/themes/portare.css +90 -22
- package/styles/tokens.css +88 -23
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
.fds-button {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
gap: 0.5rem;
|
|
7
|
+
min-height: var(--fds-control-h);
|
|
8
|
+
padding: 0.55rem 1rem;
|
|
9
|
+
border-radius: var(--fds-radius-md);
|
|
10
|
+
font: inherit;
|
|
11
|
+
font-weight: 600;
|
|
12
|
+
cursor: pointer;
|
|
13
|
+
transition:
|
|
14
|
+
background-color var(--fds-duration-fast) var(--fds-ease-out),
|
|
15
|
+
border-color var(--fds-duration-fast) var(--fds-ease-out);
|
|
16
|
+
}
|
|
17
|
+
.fds-button:focus-visible {
|
|
18
|
+
outline: 2px solid var(--fds-focus-ring);
|
|
19
|
+
outline-offset: 2px;
|
|
20
|
+
}
|
|
21
|
+
.fds-button:disabled {
|
|
22
|
+
opacity: 0.5;
|
|
23
|
+
cursor: not-allowed;
|
|
24
|
+
}
|
|
25
|
+
.fds-button--primary {
|
|
26
|
+
background: var(--fds-accent);
|
|
27
|
+
color: var(--fds-on-accent);
|
|
28
|
+
border: 1px solid transparent;
|
|
29
|
+
}
|
|
30
|
+
.fds-button--secondary {
|
|
31
|
+
background: var(--fds-panel-raised);
|
|
32
|
+
color: var(--fds-foreground);
|
|
33
|
+
border: 1px solid var(--fds-line);
|
|
34
|
+
}
|
|
35
|
+
.fds-button--ghost {
|
|
36
|
+
background: transparent;
|
|
37
|
+
color: var(--fds-foreground);
|
|
38
|
+
border: 1px solid transparent;
|
|
39
|
+
}
|
|
40
|
+
@media (prefers-reduced-motion: reduce) {
|
|
41
|
+
.fds-button {
|
|
42
|
+
transition: none;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Empty state */
|
|
3
|
+
.fds-empty {
|
|
4
|
+
padding: 2rem 1rem;
|
|
5
|
+
text-align: center;
|
|
6
|
+
}
|
|
7
|
+
.fds-empty__title {
|
|
8
|
+
margin: 0;
|
|
9
|
+
font-weight: 600;
|
|
10
|
+
}
|
|
11
|
+
.fds-empty__description {
|
|
12
|
+
margin: 0.5rem auto 0;
|
|
13
|
+
max-width: 45ch;
|
|
14
|
+
font-size: 0.875rem;
|
|
15
|
+
color: var(--fds-muted);
|
|
16
|
+
}
|
|
17
|
+
.fds-empty__action {
|
|
18
|
+
margin-top: 1rem;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Shared primitives. Only --fds-* tokens; tones are derived with color-mix so every theme works. */
|
|
3
|
+
|
|
4
|
+
.fds-eyebrow {
|
|
5
|
+
margin: 0;
|
|
6
|
+
font-size: 0.75rem;
|
|
7
|
+
letter-spacing: 0.06em;
|
|
8
|
+
text-transform: uppercase;
|
|
9
|
+
color: var(--fds-muted);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Form controls: 44px targets on touch / small screens, 16px font to stop iOS zoom. */
|
|
3
|
+
.fds-field {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: 0.375rem;
|
|
7
|
+
}
|
|
8
|
+
.fds-field__label {
|
|
9
|
+
font-size: 0.875rem;
|
|
10
|
+
font-weight: 500;
|
|
11
|
+
}
|
|
12
|
+
.fds-field__hint,
|
|
13
|
+
.fds-field__error {
|
|
14
|
+
margin: 0;
|
|
15
|
+
font-size: 0.8125rem;
|
|
16
|
+
}
|
|
17
|
+
.fds-field__hint {
|
|
18
|
+
color: var(--fds-muted);
|
|
19
|
+
}
|
|
20
|
+
.fds-field__error {
|
|
21
|
+
color: var(--fds-danger);
|
|
22
|
+
}
|
|
23
|
+
.fds-control {
|
|
24
|
+
width: 100%;
|
|
25
|
+
min-height: 2.75rem;
|
|
26
|
+
padding: 0.5rem 0.75rem;
|
|
27
|
+
border: 1px solid var(--fds-line);
|
|
28
|
+
border-radius: var(--fds-radius-md);
|
|
29
|
+
background: var(--fds-panel-soft, var(--fds-panel));
|
|
30
|
+
color: var(--fds-foreground);
|
|
31
|
+
font: inherit;
|
|
32
|
+
font-size: 1rem;
|
|
33
|
+
}
|
|
34
|
+
.fds-control--multiline {
|
|
35
|
+
min-height: 6rem;
|
|
36
|
+
resize: vertical;
|
|
37
|
+
}
|
|
38
|
+
.fds-control:focus-visible {
|
|
39
|
+
outline: 2px solid var(--fds-focus-ring);
|
|
40
|
+
outline-offset: 2px;
|
|
41
|
+
border-color: var(--fds-accent);
|
|
42
|
+
}
|
|
43
|
+
.fds-control[aria-invalid="true"] {
|
|
44
|
+
border-color: var(--fds-danger);
|
|
45
|
+
}
|
|
46
|
+
.fds-control:disabled {
|
|
47
|
+
opacity: 0.5;
|
|
48
|
+
cursor: not-allowed;
|
|
49
|
+
}
|
|
50
|
+
@media (min-width: 640px) and (pointer: fine) {
|
|
51
|
+
.fds-control {
|
|
52
|
+
min-height: 2.25rem;
|
|
53
|
+
font-size: 0.875rem;
|
|
54
|
+
}
|
|
55
|
+
.fds-control--multiline {
|
|
56
|
+
min-height: 6rem;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/*
|
|
3
|
+
* Grain surfaces: a quiet, hairline-bordered surface with a soft two-colour glow and fine film grain.
|
|
4
|
+
* On by default for every .fds-panel; opt out with data-fds-grain="off" on the element or any ancestor
|
|
5
|
+
* (for example <html>). Vivid, hero and the other modifiers are explicit classes on .fds-grain.
|
|
6
|
+
* Colours derive from the active theme (accent, panel, line), so every theme works. `light-dark()`
|
|
7
|
+
* follows the theme's `color-scheme`, so no per-theme overrides are needed.
|
|
8
|
+
*/
|
|
9
|
+
/* Browsers without light-dark() keep the plain panel instead of an invalid background. */
|
|
10
|
+
@supports (color: light-dark(#000, #fff)) {
|
|
11
|
+
:root,
|
|
12
|
+
[data-fds-theme] {
|
|
13
|
+
--fds-glow-a: var(--fds-accent-strong);
|
|
14
|
+
--fds-glow-b: light-dark(#6941a5, #a78bfa);
|
|
15
|
+
--fds-glow-warm-a: var(--fds-warn);
|
|
16
|
+
--fds-glow-warm-b: var(--fds-danger);
|
|
17
|
+
/* Glow share (light / dark scheme). Kept low so text contrast is unaffected. */
|
|
18
|
+
--fds-glow-l: 16%;
|
|
19
|
+
--fds-glow-d: 26%;
|
|
20
|
+
/* Grain alpha (light / dark scheme). Grain is a tinted alpha mask: dark specks on light, light on dark. */
|
|
21
|
+
--fds-grain-l: 0.16;
|
|
22
|
+
--fds-grain-d: 0.09;
|
|
23
|
+
--fds-grain-size: 160px;
|
|
24
|
+
--fds-grain-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.9 -.55'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
25
|
+
/* Vivid hues: saturated colour fields with light streaks. Decoration only; put content on a stage. */
|
|
26
|
+
--fds-vivid-indigo-1: #4f30e8;
|
|
27
|
+
--fds-vivid-indigo-2: #8b8ffb;
|
|
28
|
+
--fds-vivid-teal-1: #0d9488;
|
|
29
|
+
--fds-vivid-teal-2: #5eead4;
|
|
30
|
+
--fds-vivid-green-1: #15803d;
|
|
31
|
+
--fds-vivid-green-2: #86efac;
|
|
32
|
+
--fds-vivid-ember-1: #c2410c;
|
|
33
|
+
--fds-vivid-ember-2: #fdba74;
|
|
34
|
+
--fds-stage-bg: #0d0e12;
|
|
35
|
+
--fds-stage-fg: #f4f4f5;
|
|
36
|
+
--fds-stage-muted: #a1a1aa;
|
|
37
|
+
--fds-stage-line: #26272d;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.fds-grain:not(:where([data-fds-grain="off"], [data-fds-grain="off"] *)),
|
|
41
|
+
.fds-panel:not(:where([data-fds-grain="off"], [data-fds-grain="off"] *)) {
|
|
42
|
+
position: relative;
|
|
43
|
+
isolation: isolate;
|
|
44
|
+
border: 1px solid var(--fds-line);
|
|
45
|
+
border-radius: var(--fds-radius-lg);
|
|
46
|
+
color: var(--fds-foreground);
|
|
47
|
+
--fds-tint-1: light-dark(
|
|
48
|
+
color-mix(in oklab, var(--fds-glow-1, var(--fds-glow-a)) var(--fds-glow-l), transparent),
|
|
49
|
+
color-mix(in oklab, var(--fds-glow-1, var(--fds-glow-a)) var(--fds-glow-d), transparent)
|
|
50
|
+
);
|
|
51
|
+
--fds-tint-2: light-dark(
|
|
52
|
+
color-mix(in oklab, var(--fds-glow-2, var(--fds-glow-b)) var(--fds-glow-l), transparent),
|
|
53
|
+
color-mix(in oklab, var(--fds-glow-2, var(--fds-glow-b)) var(--fds-glow-d), transparent)
|
|
54
|
+
);
|
|
55
|
+
background:
|
|
56
|
+
radial-gradient(120% 100% at 0% 0%, var(--fds-tint-1), transparent 62%),
|
|
57
|
+
radial-gradient(100% 90% at 100% 100%, var(--fds-tint-2), transparent 58%), var(--fds-panel);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Grain sits above the gradient and below the content, so text stays crisp. */
|
|
61
|
+
.fds-grain:not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))::before,
|
|
62
|
+
.fds-panel:not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))::before {
|
|
63
|
+
content: "";
|
|
64
|
+
position: absolute;
|
|
65
|
+
inset: 0;
|
|
66
|
+
z-index: -1;
|
|
67
|
+
border-radius: inherit;
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
background: light-dark(
|
|
70
|
+
rgb(0 0 0 / var(--fds-grain-l)),
|
|
71
|
+
rgb(255 255 255 / var(--fds-grain-d))
|
|
72
|
+
);
|
|
73
|
+
-webkit-mask-image: var(--fds-grain-image);
|
|
74
|
+
mask-image: var(--fds-grain-image);
|
|
75
|
+
-webkit-mask-size: var(--fds-grain-size) var(--fds-grain-size);
|
|
76
|
+
mask-size: var(--fds-grain-size) var(--fds-grain-size);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.fds-grain--warm {
|
|
80
|
+
--fds-glow-1: var(--fds-glow-warm-a);
|
|
81
|
+
--fds-glow-2: var(--fds-glow-warm-b);
|
|
82
|
+
}
|
|
83
|
+
.fds-grain--subtle {
|
|
84
|
+
--fds-glow-l: 8%;
|
|
85
|
+
--fds-glow-d: 14%;
|
|
86
|
+
--fds-grain-l: 0.1;
|
|
87
|
+
--fds-grain-d: 0.05;
|
|
88
|
+
}
|
|
89
|
+
.fds-grain--hero {
|
|
90
|
+
--fds-glow-l: 20%;
|
|
91
|
+
--fds-glow-d: 34%;
|
|
92
|
+
padding: clamp(1.5rem, 5vw, 3.5rem);
|
|
93
|
+
border-radius: calc(var(--fds-radius-lg) * 1.5);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* Vivid: a saturated colour field with diagonal light streaks and strong grain, for hero bands and
|
|
98
|
+
* feature panels. Text must sit on a .fds-grain__stage (a near-black inset) so contrast never depends
|
|
99
|
+
* on the gradient. Hues: --indigo (default), --teal, --green, --ember.
|
|
100
|
+
*/
|
|
101
|
+
.fds-grain--vivid {
|
|
102
|
+
--fds-v1: var(--fds-vivid-indigo-1);
|
|
103
|
+
--fds-v2: var(--fds-vivid-indigo-2);
|
|
104
|
+
--fds-grain-l: 0.3;
|
|
105
|
+
--fds-grain-d: 0.3;
|
|
106
|
+
padding: clamp(1rem, 4vw, 2.5rem);
|
|
107
|
+
border-color: transparent;
|
|
108
|
+
background:
|
|
109
|
+
linear-gradient(118deg, transparent 30%, rgb(255 255 255 / 0.28) 30.4%, transparent 31.6%),
|
|
110
|
+
linear-gradient(118deg, transparent 52%, rgb(255 255 255 / 0.18) 52.3%, transparent 53.2%),
|
|
111
|
+
linear-gradient(62deg, transparent 64%, rgb(255 255 255 / 0.22) 64.4%, transparent 65.6%),
|
|
112
|
+
radial-gradient(90% 80% at 15% 10%, var(--fds-v2), transparent 60%),
|
|
113
|
+
radial-gradient(
|
|
114
|
+
80% 90% at 90% 95%,
|
|
115
|
+
color-mix(in oklab, var(--fds-v2) 70%, black),
|
|
116
|
+
transparent 65%
|
|
117
|
+
),
|
|
118
|
+
linear-gradient(160deg, var(--fds-v1), color-mix(in oklab, var(--fds-v1) 55%, black));
|
|
119
|
+
}
|
|
120
|
+
.fds-panel.fds-grain--vivid {
|
|
121
|
+
padding: clamp(1rem, 4vw, 2.5rem);
|
|
122
|
+
}
|
|
123
|
+
.fds-grain--teal {
|
|
124
|
+
--fds-v1: var(--fds-vivid-teal-1);
|
|
125
|
+
--fds-v2: var(--fds-vivid-teal-2);
|
|
126
|
+
}
|
|
127
|
+
.fds-grain--green {
|
|
128
|
+
--fds-v1: var(--fds-vivid-green-1);
|
|
129
|
+
--fds-v2: var(--fds-vivid-green-2);
|
|
130
|
+
}
|
|
131
|
+
.fds-grain--ember {
|
|
132
|
+
--fds-v1: var(--fds-vivid-ember-1);
|
|
133
|
+
--fds-v2: var(--fds-vivid-ember-2);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Near-black inset that carries the content on a vivid field. Same colours in every theme. */
|
|
137
|
+
.fds-grain__stage {
|
|
138
|
+
padding: var(--fds-space-6);
|
|
139
|
+
border: 1px solid var(--fds-stage-line);
|
|
140
|
+
border-radius: var(--fds-radius-md);
|
|
141
|
+
background: var(--fds-stage-bg);
|
|
142
|
+
color: var(--fds-stage-fg);
|
|
143
|
+
font-family: var(--fds-font-mono);
|
|
144
|
+
font-size: var(--fds-text-sm);
|
|
145
|
+
line-height: var(--fds-leading-relaxed);
|
|
146
|
+
box-shadow: 0 18px 48px rgb(0 0 0 / 0.35);
|
|
147
|
+
}
|
|
148
|
+
.fds-grain__stage .fds-eyebrow,
|
|
149
|
+
.fds-grain__stage p {
|
|
150
|
+
color: var(--fds-stage-muted);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Flat hairline cells: dividers instead of shadowed cards. */
|
|
154
|
+
.fds-cells {
|
|
155
|
+
display: grid;
|
|
156
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
|
|
157
|
+
gap: 1px;
|
|
158
|
+
border-block: 1px solid var(--fds-line);
|
|
159
|
+
background: var(--fds-line);
|
|
160
|
+
}
|
|
161
|
+
.fds-cells > * {
|
|
162
|
+
padding: var(--fds-space-6);
|
|
163
|
+
background: var(--fds-background);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* Inline mono chip for commands and identifiers. */
|
|
167
|
+
.fds-code {
|
|
168
|
+
padding: 0.1em 0.45em;
|
|
169
|
+
border: 1px solid var(--fds-line);
|
|
170
|
+
border-radius: var(--fds-radius-sm);
|
|
171
|
+
background: var(--fds-panel-soft);
|
|
172
|
+
font-family: var(--fds-font-mono);
|
|
173
|
+
font-size: 0.875em;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/*
|
|
177
|
+
* Components sit on top of the grain: it is background only. Any component fill that is translucent
|
|
178
|
+
* would let the grain show through, so inside a grain surface those fills are mixed with the panel
|
|
179
|
+
* colour instead of transparent. The result matches the flat-panel look, but is opaque.
|
|
180
|
+
*/
|
|
181
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
182
|
+
.fds-badge {
|
|
183
|
+
background: color-mix(in srgb, var(--fds-badge-color) 12%, var(--fds-panel));
|
|
184
|
+
border-color: color-mix(in srgb, var(--fds-badge-color) 30%, var(--fds-panel));
|
|
185
|
+
}
|
|
186
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
187
|
+
.fds-notice {
|
|
188
|
+
background: color-mix(in srgb, var(--fds-notice-color) 10%, var(--fds-panel));
|
|
189
|
+
border-color: color-mix(in srgb, var(--fds-notice-color) 35%, var(--fds-panel));
|
|
190
|
+
}
|
|
191
|
+
/* Disabled controls use opacity: 0.5, which is see-through. Reproduce it as opaque mixes instead. */
|
|
192
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
193
|
+
:is(.fds-button, .fds-control):disabled {
|
|
194
|
+
opacity: 1;
|
|
195
|
+
}
|
|
196
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
197
|
+
.fds-button--primary:disabled {
|
|
198
|
+
background: color-mix(in srgb, var(--fds-accent) 50%, var(--fds-panel));
|
|
199
|
+
color: color-mix(in srgb, var(--fds-on-accent) 50%, var(--fds-panel));
|
|
200
|
+
}
|
|
201
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
202
|
+
.fds-button--secondary:disabled {
|
|
203
|
+
background: color-mix(in srgb, var(--fds-panel-raised) 50%, var(--fds-panel));
|
|
204
|
+
border-color: color-mix(in srgb, var(--fds-line) 50%, var(--fds-panel));
|
|
205
|
+
color: color-mix(in srgb, var(--fds-foreground) 50%, var(--fds-panel));
|
|
206
|
+
}
|
|
207
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
208
|
+
.fds-button--ghost:disabled {
|
|
209
|
+
color: color-mix(in srgb, var(--fds-foreground) 50%, var(--fds-panel));
|
|
210
|
+
}
|
|
211
|
+
:is(.fds-grain, .fds-panel):not(:where([data-fds-grain="off"], [data-fds-grain="off"] *))
|
|
212
|
+
.fds-control:disabled {
|
|
213
|
+
background: color-mix(in srgb, var(--fds-panel-soft, var(--fds-panel)) 50%, var(--fds-panel));
|
|
214
|
+
border-color: color-mix(in srgb, var(--fds-line) 50%, var(--fds-panel));
|
|
215
|
+
color: color-mix(in srgb, var(--fds-foreground) 50%, var(--fds-panel));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Quiet, technical labelling inside grain surfaces. */
|
|
219
|
+
.fds-grain .fds-eyebrow,
|
|
220
|
+
.fds-panel:not(:where([data-fds-grain="off"], [data-fds-grain="off"] *)) .fds-eyebrow {
|
|
221
|
+
font-family: var(--fds-font-mono);
|
|
222
|
+
letter-spacing: 0.08em;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Decoration only: drop it where it cannot help. */
|
|
226
|
+
@media (forced-colors: active) {
|
|
227
|
+
.fds-grain,
|
|
228
|
+
.fds-panel.fds-grain {
|
|
229
|
+
background: Canvas;
|
|
230
|
+
}
|
|
231
|
+
.fds-grain::before {
|
|
232
|
+
display: none;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
@media print {
|
|
236
|
+
.fds-grain,
|
|
237
|
+
.fds-panel.fds-grain {
|
|
238
|
+
background: none;
|
|
239
|
+
}
|
|
240
|
+
.fds-grain::before {
|
|
241
|
+
display: none;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Menu */
|
|
3
|
+
.fds-menu {
|
|
4
|
+
position: relative;
|
|
5
|
+
display: inline-block;
|
|
6
|
+
}
|
|
7
|
+
.fds-menu__trigger {
|
|
8
|
+
display: inline-flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
width: 2.75rem;
|
|
12
|
+
height: 2.75rem;
|
|
13
|
+
border: 1px solid var(--fds-line);
|
|
14
|
+
border-radius: var(--fds-radius-md);
|
|
15
|
+
background: var(--fds-panel-soft, var(--fds-panel));
|
|
16
|
+
color: var(--fds-muted);
|
|
17
|
+
cursor: pointer;
|
|
18
|
+
}
|
|
19
|
+
.fds-menu__trigger:hover {
|
|
20
|
+
border-color: var(--fds-accent);
|
|
21
|
+
color: var(--fds-foreground);
|
|
22
|
+
}
|
|
23
|
+
.fds-menu__trigger:focus-visible,
|
|
24
|
+
.fds-menu__item:focus-visible {
|
|
25
|
+
outline: 2px solid var(--fds-focus-ring);
|
|
26
|
+
outline-offset: 2px;
|
|
27
|
+
}
|
|
28
|
+
.fds-menu__list {
|
|
29
|
+
position: absolute;
|
|
30
|
+
top: 100%;
|
|
31
|
+
right: 0;
|
|
32
|
+
z-index: var(--fds-z-dropdown);
|
|
33
|
+
min-width: 11rem;
|
|
34
|
+
margin-top: 0.25rem;
|
|
35
|
+
padding: 0.25rem 0;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
border: 1px solid var(--fds-line);
|
|
38
|
+
border-radius: var(--fds-radius-md);
|
|
39
|
+
background: var(--fds-panel);
|
|
40
|
+
box-shadow: var(--fds-shadow-popover);
|
|
41
|
+
}
|
|
42
|
+
.fds-menu__item {
|
|
43
|
+
display: block;
|
|
44
|
+
width: 100%;
|
|
45
|
+
min-height: 2.75rem;
|
|
46
|
+
padding: 0.5rem 0.75rem;
|
|
47
|
+
border: 0;
|
|
48
|
+
background: transparent;
|
|
49
|
+
color: var(--fds-foreground);
|
|
50
|
+
font: inherit;
|
|
51
|
+
text-align: left;
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
}
|
|
54
|
+
.fds-menu__item:hover,
|
|
55
|
+
.fds-menu__item:focus-visible {
|
|
56
|
+
background: var(--fds-panel-raised);
|
|
57
|
+
}
|
|
58
|
+
.fds-menu__item--danger {
|
|
59
|
+
color: var(--fds-danger);
|
|
60
|
+
}
|
|
61
|
+
.fds-menu__item:disabled {
|
|
62
|
+
opacity: 0.5;
|
|
63
|
+
cursor: not-allowed;
|
|
64
|
+
}
|
|
65
|
+
@media (min-width: 640px) and (pointer: fine) {
|
|
66
|
+
.fds-menu__trigger {
|
|
67
|
+
width: 2.25rem;
|
|
68
|
+
height: 2.25rem;
|
|
69
|
+
}
|
|
70
|
+
.fds-menu__item {
|
|
71
|
+
min-height: 2.25rem;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Meters */
|
|
3
|
+
.fds-meter {
|
|
4
|
+
height: 0.5rem;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
border-radius: 999px;
|
|
7
|
+
background: var(--fds-line);
|
|
8
|
+
}
|
|
9
|
+
.fds-meter--thin {
|
|
10
|
+
height: 0.375rem;
|
|
11
|
+
}
|
|
12
|
+
.fds-meter__fill {
|
|
13
|
+
height: 100%;
|
|
14
|
+
border-radius: inherit;
|
|
15
|
+
background: var(--fds-accent);
|
|
16
|
+
}
|
|
17
|
+
.fds-segmeter {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: 0.25rem;
|
|
21
|
+
}
|
|
22
|
+
.fds-segmeter__segment {
|
|
23
|
+
width: 0.5rem;
|
|
24
|
+
height: 1rem;
|
|
25
|
+
border-radius: 2px;
|
|
26
|
+
background: var(--fds-line);
|
|
27
|
+
}
|
|
28
|
+
.fds-segmeter__segment--on {
|
|
29
|
+
background: var(--fds-accent);
|
|
30
|
+
}
|
|
31
|
+
.fds-distribution__list {
|
|
32
|
+
display: flex;
|
|
33
|
+
flex-direction: column;
|
|
34
|
+
gap: 0.5rem;
|
|
35
|
+
margin: 0;
|
|
36
|
+
padding: 0;
|
|
37
|
+
list-style: none;
|
|
38
|
+
}
|
|
39
|
+
.fds-distribution__meta {
|
|
40
|
+
display: flex;
|
|
41
|
+
justify-content: space-between;
|
|
42
|
+
gap: 0.75rem;
|
|
43
|
+
margin-bottom: 0.25rem;
|
|
44
|
+
font-size: 0.75rem;
|
|
45
|
+
}
|
|
46
|
+
.fds-distribution__label {
|
|
47
|
+
color: var(--fds-muted-strong, var(--fds-foreground));
|
|
48
|
+
}
|
|
49
|
+
.fds-distribution__value {
|
|
50
|
+
font-weight: 500;
|
|
51
|
+
font-variant-numeric: tabular-nums;
|
|
52
|
+
}
|
|
53
|
+
.fds-distribution__empty,
|
|
54
|
+
.fds-distribution__overflow {
|
|
55
|
+
margin: 0;
|
|
56
|
+
font-size: 0.8125rem;
|
|
57
|
+
color: var(--fds-muted);
|
|
58
|
+
}
|
|
59
|
+
.fds-distribution__overflow {
|
|
60
|
+
margin-top: 0.5rem;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Metric / KeyValue */
|
|
3
|
+
.fds-metric,
|
|
4
|
+
.fds-keyvalue {
|
|
5
|
+
padding: 0.75rem;
|
|
6
|
+
border: 1px solid var(--fds-line);
|
|
7
|
+
border-radius: var(--fds-radius-md);
|
|
8
|
+
background: var(--fds-panel-soft, var(--fds-panel));
|
|
9
|
+
}
|
|
10
|
+
.fds-keyvalue {
|
|
11
|
+
border-color: var(--fds-line-soft, var(--fds-line));
|
|
12
|
+
}
|
|
13
|
+
.fds-metric__label {
|
|
14
|
+
margin: 0;
|
|
15
|
+
font-size: 0.75rem;
|
|
16
|
+
color: var(--fds-muted);
|
|
17
|
+
}
|
|
18
|
+
.fds-metric__value {
|
|
19
|
+
margin: 0.5rem 0 0;
|
|
20
|
+
font-size: 1.125rem;
|
|
21
|
+
font-weight: 600;
|
|
22
|
+
font-variant-numeric: tabular-nums;
|
|
23
|
+
}
|
|
24
|
+
.fds-keyvalue__value {
|
|
25
|
+
margin: 0.25rem 0 0;
|
|
26
|
+
font-weight: 500;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Notice */
|
|
3
|
+
.fds-notice {
|
|
4
|
+
--fds-notice-color: var(--fds-accent);
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-wrap: wrap;
|
|
7
|
+
align-items: center;
|
|
8
|
+
justify-content: space-between;
|
|
9
|
+
gap: 0.75rem;
|
|
10
|
+
padding: 0.75rem 1rem;
|
|
11
|
+
border: 1px solid color-mix(in srgb, var(--fds-notice-color) 35%, transparent);
|
|
12
|
+
border-left-width: 4px;
|
|
13
|
+
border-radius: var(--fds-radius-md);
|
|
14
|
+
background: color-mix(in srgb, var(--fds-notice-color) 10%, transparent);
|
|
15
|
+
color: var(--fds-foreground);
|
|
16
|
+
}
|
|
17
|
+
.fds-notice--success {
|
|
18
|
+
--fds-notice-color: var(--fds-success);
|
|
19
|
+
}
|
|
20
|
+
.fds-notice--warn {
|
|
21
|
+
--fds-notice-color: var(--fds-warn);
|
|
22
|
+
}
|
|
23
|
+
.fds-notice--danger {
|
|
24
|
+
--fds-notice-color: var(--fds-danger);
|
|
25
|
+
}
|
|
26
|
+
.fds-notice__title {
|
|
27
|
+
margin: 0;
|
|
28
|
+
font-weight: 600;
|
|
29
|
+
}
|
|
30
|
+
.fds-notice__text {
|
|
31
|
+
font-size: 0.875rem;
|
|
32
|
+
color: var(--fds-muted-strong, var(--fds-foreground));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
@layer fds {
|
|
2
|
+
/* Panel */
|
|
3
|
+
.fds-panel {
|
|
4
|
+
padding: 1rem;
|
|
5
|
+
border: 1px solid var(--fds-line);
|
|
6
|
+
border-radius: var(--fds-radius-lg);
|
|
7
|
+
background: var(--fds-panel);
|
|
8
|
+
color: var(--fds-foreground);
|
|
9
|
+
}
|
|
10
|
+
.fds-panel__header {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: 0.75rem;
|
|
14
|
+
margin-bottom: 1rem;
|
|
15
|
+
}
|
|
16
|
+
.fds-panel__heading {
|
|
17
|
+
min-width: 0;
|
|
18
|
+
}
|
|
19
|
+
.fds-panel__title {
|
|
20
|
+
margin: 0.25rem 0 0;
|
|
21
|
+
font-size: 1.125rem;
|
|
22
|
+
font-weight: 600;
|
|
23
|
+
}
|
|
24
|
+
.fds-panel__help {
|
|
25
|
+
margin: 0.375rem 0 0;
|
|
26
|
+
max-width: 65ch;
|
|
27
|
+
font-size: 0.75rem;
|
|
28
|
+
line-height: 1.5;
|
|
29
|
+
color: var(--fds-muted);
|
|
30
|
+
}
|
|
31
|
+
@media (min-width: 640px) {
|
|
32
|
+
.fds-panel {
|
|
33
|
+
padding: 1.25rem;
|
|
34
|
+
}
|
|
35
|
+
.fds-panel__header {
|
|
36
|
+
flex-direction: row;
|
|
37
|
+
align-items: flex-start;
|
|
38
|
+
justify-content: space-between;
|
|
39
|
+
gap: 1rem;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|