@echodial/deck 0.1.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/LICENSE +21 -0
- package/README.md +1327 -0
- package/bin/deck.mjs +219 -0
- package/build.mjs +338 -0
- package/dist/api-buckets.json +10486 -0
- package/dist/api.json +57896 -0
- package/dist/brand/deck-apple-touch-icon.png +0 -0
- package/dist/brand/deck-logo-dark.svg +1 -0
- package/dist/brand/deck-logo-light.svg +1 -0
- package/dist/brand/deck-logo-stacked.svg +1 -0
- package/dist/brand/deck-logo.svg +1 -0
- package/dist/brand/deck-mark.svg +7 -0
- package/dist/brand/deck-og.png +0 -0
- package/dist/collisions.json +223 -0
- package/dist/deck-adapters.js +482 -0
- package/dist/deck-adapters.min.js +23 -0
- package/dist/deck-extras.js +823 -0
- package/dist/deck-extras.min.js +5 -0
- package/dist/deck-icons.svg +184 -0
- package/dist/deck.bundle.js +2638 -0
- package/dist/deck.bundle.min.js +86 -0
- package/dist/deck.css +7904 -0
- package/dist/deck.esm.js +2644 -0
- package/dist/deck.js +1331 -0
- package/dist/deck.min.css +32 -0
- package/dist/deck.min.js +60 -0
- package/dist/layers/anchor.css +192 -0
- package/dist/layers/buttons.css +210 -0
- package/dist/layers/charts.css +337 -0
- package/dist/layers/combobox.css +248 -0
- package/dist/layers/components.css +868 -0
- package/dist/layers/container.css +199 -0
- package/dist/layers/datagrid.css +335 -0
- package/dist/layers/datepicker.css +305 -0
- package/dist/layers/forms.css +401 -0
- package/dist/layers/gradients.css +302 -0
- package/dist/layers/inputs.css +522 -0
- package/dist/layers/layers.css +87 -0
- package/dist/layers/layout.css +235 -0
- package/dist/layers/logical.css +226 -0
- package/dist/layers/media.css +400 -0
- package/dist/layers/mobile.css +245 -0
- package/dist/layers/motion.css +379 -0
- package/dist/layers/nav.css +771 -0
- package/dist/layers/perf.css +234 -0
- package/dist/layers/print.css +198 -0
- package/dist/layers/reset.css +103 -0
- package/dist/layers/space3d.css +280 -0
- package/dist/layers/toasts.css +201 -0
- package/dist/layers/tokens.css +229 -0
- package/dist/layers/type.css +114 -0
- package/dist/layers/utilities.css +241 -0
- package/dist/sizes.json +52 -0
- package/dist/usage.json +6340 -0
- package/package.json +94 -0
- package/src/00-layers.css +87 -0
- package/src/01-tokens.css +229 -0
- package/src/02-reset.css +103 -0
- package/src/03-type.css +114 -0
- package/src/04-layout.css +235 -0
- package/src/05-buttons.css +210 -0
- package/src/06-forms.css +401 -0
- package/src/07-components.css +868 -0
- package/src/08-mobile.css +245 -0
- package/src/09-utilities.css +241 -0
- package/src/10-datepicker.css +305 -0
- package/src/11-combobox.css +248 -0
- package/src/12-datagrid.css +335 -0
- package/src/13-toasts.css +201 -0
- package/src/14-charts.css +337 -0
- package/src/16-motion.css +379 -0
- package/src/18-container.css +199 -0
- package/src/19-logical.css +226 -0
- package/src/20-gradients.css +302 -0
- package/src/21-space3d.css +280 -0
- package/src/22-nav.css +771 -0
- package/src/23-inputs.css +522 -0
- package/src/24-media.css +400 -0
- package/src/25-anchor.css +192 -0
- package/src/26-perf.css +234 -0
- package/src/99-print.css +198 -0
- package/src/brand/deck-apple-touch-icon.png +0 -0
- package/src/brand/deck-logo-dark.svg +1 -0
- package/src/brand/deck-logo-light.svg +1 -0
- package/src/brand/deck-logo-stacked.svg +1 -0
- package/src/brand/deck-logo.svg +1 -0
- package/src/brand/deck-mark.svg +7 -0
- package/src/brand/deck-og.png +0 -0
- package/src/brand/sources.json +7 -0
- package/src/deck-icons.svg +184 -0
- package/src/js/deck-adapters.js +482 -0
- package/src/js/deck-extras.js +823 -0
- package/src/js/deck.js +1331 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Deck — 01 Tokens
|
|
3
|
+
Everything is a custom property. Change a hue, retheme the whole app.
|
|
4
|
+
No build step. No purge. No config file.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
/* Layer order is declared in 00-layers.css. */
|
|
8
|
+
|
|
9
|
+
@layer deck.tokens {
|
|
10
|
+
|
|
11
|
+
:root {
|
|
12
|
+
color-scheme: light dark;
|
|
13
|
+
|
|
14
|
+
/* --- Hue control -------------------------------------------------------
|
|
15
|
+
These six numbers are the whole palette. Set --hue-brand to 12 and the
|
|
16
|
+
framework becomes rust. Set it to 265 and it becomes violet. Buttons,
|
|
17
|
+
focus rings, links, charts, and shadows all follow.
|
|
18
|
+
---------------------------------------------------------------------- */
|
|
19
|
+
--hue-brand: 196; /* harbor teal */
|
|
20
|
+
--hue-accent: 42; /* signal amber */
|
|
21
|
+
--hue-good: 152; /* starboard */
|
|
22
|
+
--hue-warn: 74; /* caution */
|
|
23
|
+
--hue-bad: 24; /* port light */
|
|
24
|
+
--hue-neutral: 232; /* chart ink */
|
|
25
|
+
|
|
26
|
+
--chroma-brand: .118;
|
|
27
|
+
--chroma-accent: .142;
|
|
28
|
+
--chroma-status: .132;
|
|
29
|
+
--chroma-neutral: .012; /* neutrals carry a trace of the ink hue */
|
|
30
|
+
|
|
31
|
+
/* --- Brand ramp -------------------------------------------------------- */
|
|
32
|
+
--brand-50: oklch(97.4% calc(var(--chroma-brand) * .16) var(--hue-brand));
|
|
33
|
+
--brand-100: oklch(94.2% calc(var(--chroma-brand) * .30) var(--hue-brand));
|
|
34
|
+
--brand-200: oklch(88.6% calc(var(--chroma-brand) * .48) var(--hue-brand));
|
|
35
|
+
--brand-300: oklch(80.4% calc(var(--chroma-brand) * .70) var(--hue-brand));
|
|
36
|
+
--brand-400: oklch(70.2% calc(var(--chroma-brand) * .90) var(--hue-brand));
|
|
37
|
+
--brand-500: oklch(60.8% var(--chroma-brand) var(--hue-brand));
|
|
38
|
+
--brand-600: oklch(51.6% var(--chroma-brand) var(--hue-brand));
|
|
39
|
+
--brand-700: oklch(43.4% calc(var(--chroma-brand) * .92) var(--hue-brand));
|
|
40
|
+
--brand-800: oklch(35.6% calc(var(--chroma-brand) * .78) var(--hue-brand));
|
|
41
|
+
--brand-900: oklch(28.2% calc(var(--chroma-brand) * .62) var(--hue-brand));
|
|
42
|
+
--brand-950: oklch(20.4% calc(var(--chroma-brand) * .46) var(--hue-brand));
|
|
43
|
+
|
|
44
|
+
/* --- Neutral ramp ------------------------------------------------------ */
|
|
45
|
+
--ink-0: oklch(100% 0 0);
|
|
46
|
+
--ink-25: oklch(99.1% calc(var(--chroma-neutral) * .5) var(--hue-neutral));
|
|
47
|
+
--ink-50: oklch(97.8% var(--chroma-neutral) var(--hue-neutral));
|
|
48
|
+
--ink-100: oklch(95.4% calc(var(--chroma-neutral) * 1.4) var(--hue-neutral));
|
|
49
|
+
--ink-200: oklch(91.2% calc(var(--chroma-neutral) * 1.8) var(--hue-neutral));
|
|
50
|
+
--ink-300: oklch(84.6% calc(var(--chroma-neutral) * 2.2) var(--hue-neutral));
|
|
51
|
+
--ink-400: oklch(70.8% calc(var(--chroma-neutral) * 2.6) var(--hue-neutral));
|
|
52
|
+
--ink-500: oklch(58.4% calc(var(--chroma-neutral) * 2.8) var(--hue-neutral));
|
|
53
|
+
--ink-600: oklch(47.6% calc(var(--chroma-neutral) * 2.8) var(--hue-neutral));
|
|
54
|
+
--ink-700: oklch(38.2% calc(var(--chroma-neutral) * 2.6) var(--hue-neutral));
|
|
55
|
+
--ink-800: oklch(29.4% calc(var(--chroma-neutral) * 2.4) var(--hue-neutral));
|
|
56
|
+
--ink-900: oklch(22.6% calc(var(--chroma-neutral) * 2.2) var(--hue-neutral));
|
|
57
|
+
--ink-950: oklch(16.2% calc(var(--chroma-neutral) * 2.0) var(--hue-neutral));
|
|
58
|
+
--ink-1000: oklch(11.4% calc(var(--chroma-neutral) * 1.8) var(--hue-neutral));
|
|
59
|
+
|
|
60
|
+
/* --- Status ------------------------------------------------------------ */
|
|
61
|
+
--good-100: oklch(94% calc(var(--chroma-status) * .3) var(--hue-good));
|
|
62
|
+
--good-500: oklch(62% var(--chroma-status) var(--hue-good));
|
|
63
|
+
--good-600: oklch(52% var(--chroma-status) var(--hue-good));
|
|
64
|
+
--good-700: oklch(44% var(--chroma-status) var(--hue-good));
|
|
65
|
+
--warn-100: oklch(95% calc(var(--chroma-status) * .32) var(--hue-warn));
|
|
66
|
+
--warn-500: oklch(76% var(--chroma-status) var(--hue-warn));
|
|
67
|
+
--warn-700: oklch(50% var(--chroma-status) var(--hue-warn));
|
|
68
|
+
--bad-100: oklch(94.5% calc(var(--chroma-status) * .3) var(--hue-bad));
|
|
69
|
+
--bad-500: oklch(58% calc(var(--chroma-status) * 1.25) var(--hue-bad));
|
|
70
|
+
--bad-600: oklch(52% calc(var(--chroma-status) * 1.25) var(--hue-bad));
|
|
71
|
+
--bad-700: oklch(44% calc(var(--chroma-status) * 1.1) var(--hue-bad));
|
|
72
|
+
--accent-100: oklch(95% calc(var(--chroma-accent) * .3) var(--hue-accent));
|
|
73
|
+
--accent-500: oklch(74% var(--chroma-accent) var(--hue-accent));
|
|
74
|
+
--accent-700: oklch(52% calc(var(--chroma-accent) * .9) var(--hue-accent));
|
|
75
|
+
|
|
76
|
+
/* --- Semantic surfaces (auto light/dark) -------------------------------- */
|
|
77
|
+
--bg: light-dark(var(--ink-50), var(--ink-1000));
|
|
78
|
+
--bg-sunken: light-dark(var(--ink-100), oklch(8.6% .012 var(--hue-neutral)));
|
|
79
|
+
--surface: light-dark(var(--ink-0), var(--ink-950));
|
|
80
|
+
--surface-2: light-dark(var(--ink-25), var(--ink-900));
|
|
81
|
+
--surface-hover:light-dark(var(--ink-50), var(--ink-900));
|
|
82
|
+
--line: light-dark(var(--ink-200), oklch(28% .016 var(--hue-neutral)));
|
|
83
|
+
--line-strong: light-dark(var(--ink-300), oklch(36% .018 var(--hue-neutral)));
|
|
84
|
+
|
|
85
|
+
--text: light-dark(var(--ink-900), var(--ink-100));
|
|
86
|
+
--text-muted: light-dark(var(--ink-600), var(--ink-400));
|
|
87
|
+
--text-faint: light-dark(var(--ink-500), var(--ink-500));
|
|
88
|
+
/* --- Ink on a coloured surface ----------------------------------------
|
|
89
|
+
One per saturated surface. These are the static values: they are correct
|
|
90
|
+
for the shipped hues but they are guesses about any hue you set, which
|
|
91
|
+
is what the @supports block below fixes.
|
|
92
|
+
-------------------------------------------------------------------- */
|
|
93
|
+
--text-on-brand: oklch(99% .01 var(--hue-brand));
|
|
94
|
+
--text-on-accent: oklch(24% .06 var(--hue-accent));
|
|
95
|
+
--text-on-good: oklch(99% .01 var(--hue-good));
|
|
96
|
+
--text-on-warn: oklch(24% .06 var(--hue-warn));
|
|
97
|
+
--text-on-bad: oklch(99% .01 var(--hue-bad));
|
|
98
|
+
|
|
99
|
+
--brand: light-dark(var(--brand-600), var(--brand-400));
|
|
100
|
+
--brand-hover: light-dark(var(--brand-700), var(--brand-300));
|
|
101
|
+
--brand-soft: light-dark(var(--brand-50), oklch(26% .05 var(--hue-brand)));
|
|
102
|
+
--brand-soft-text: light-dark(var(--brand-800), var(--brand-200));
|
|
103
|
+
|
|
104
|
+
--focus: light-dark(var(--brand-500), var(--brand-300));
|
|
105
|
+
|
|
106
|
+
/* --- Space: 4px base, plus fluid steps for page rhythm ------------------ */
|
|
107
|
+
--space-0: 0;
|
|
108
|
+
--space-px: 1px;
|
|
109
|
+
--space-1: .25rem;
|
|
110
|
+
--space-2: .5rem;
|
|
111
|
+
--space-3: .75rem;
|
|
112
|
+
--space-4: 1rem;
|
|
113
|
+
--space-5: 1.25rem;
|
|
114
|
+
--space-6: 1.5rem;
|
|
115
|
+
--space-8: 2rem;
|
|
116
|
+
--space-10: 2.5rem;
|
|
117
|
+
--space-12: 3rem;
|
|
118
|
+
--space-16: 4rem;
|
|
119
|
+
--space-20: 5rem;
|
|
120
|
+
--space-24: 6rem;
|
|
121
|
+
--space-section: clamp(2.5rem, 1.4rem + 5.5vw, 6rem);
|
|
122
|
+
--space-gutter: clamp(1rem, .55rem + 2.2vw, 2rem);
|
|
123
|
+
|
|
124
|
+
/* --- Radius: intentionally not one value ------------------------------- */
|
|
125
|
+
--r-xs: 4px; /* chips, tags, kbd */
|
|
126
|
+
--r-sm: 7px; /* inputs, buttons */
|
|
127
|
+
--r-md: 12px; /* cards, menus */
|
|
128
|
+
--r-lg: 18px; /* sheets, modals, hero panels */
|
|
129
|
+
--r-full: 999px;
|
|
130
|
+
|
|
131
|
+
/* --- Elevation: tinted with the ink hue, never flat black -------------- */
|
|
132
|
+
--shadow-color: var(--hue-neutral);
|
|
133
|
+
--shadow-1: 0 1px 2px oklch(20% .03 var(--shadow-color) / .06),
|
|
134
|
+
0 1px 1px oklch(20% .03 var(--shadow-color) / .04);
|
|
135
|
+
--shadow-2: 0 2px 4px oklch(20% .03 var(--shadow-color) / .05),
|
|
136
|
+
0 4px 12px oklch(20% .03 var(--shadow-color) / .07);
|
|
137
|
+
--shadow-3: 0 4px 8px oklch(20% .03 var(--shadow-color) / .06),
|
|
138
|
+
0 12px 28px oklch(20% .03 var(--shadow-color) / .10);
|
|
139
|
+
--shadow-4: 0 8px 16px oklch(20% .03 var(--shadow-color) / .08),
|
|
140
|
+
0 24px 56px oklch(20% .03 var(--shadow-color) / .14);
|
|
141
|
+
--shadow-inset: inset 0 1px 0 oklch(100% 0 0 / .6);
|
|
142
|
+
|
|
143
|
+
/* A legible floor for text over a photo. Eased rather than a flat wash: a
|
|
144
|
+
50% black overlay dulls the whole image, while this only darkens where
|
|
145
|
+
the text actually sits. Shared by .g-scrim and .carousel-caption so the
|
|
146
|
+
two cannot drift apart. */
|
|
147
|
+
--scrim: linear-gradient(to top,
|
|
148
|
+
oklch(12% .02 var(--hue-neutral) / .82) 0%,
|
|
149
|
+
oklch(12% .02 var(--hue-neutral) / .62) 22%,
|
|
150
|
+
oklch(12% .02 var(--hue-neutral) / .28) 48%,
|
|
151
|
+
transparent 78%);
|
|
152
|
+
|
|
153
|
+
/* --- Type -------------------------------------------------------------- */
|
|
154
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI Variable Text",
|
|
155
|
+
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
156
|
+
--font-mono: ui-monospace, "SF Mono", "Cascadia Mono", "Roboto Mono",
|
|
157
|
+
Menlo, Consolas, monospace;
|
|
158
|
+
--font-display: var(--font-sans);
|
|
159
|
+
|
|
160
|
+
--text-2xs: .6875rem;
|
|
161
|
+
--text-xs: .75rem;
|
|
162
|
+
--text-sm: .8125rem;
|
|
163
|
+
--text-base: .9375rem;
|
|
164
|
+
--text-md: 1.0625rem;
|
|
165
|
+
--text-lg: clamp(1.125rem, 1.06rem + .32vw, 1.3125rem);
|
|
166
|
+
--text-xl: clamp(1.3125rem, 1.19rem + .62vw, 1.625rem);
|
|
167
|
+
--text-2xl: clamp(1.5625rem, 1.33rem + 1.16vw, 2.125rem);
|
|
168
|
+
--text-3xl: clamp(1.875rem, 1.44rem + 2.16vw, 2.875rem);
|
|
169
|
+
--text-4xl: clamp(2.25rem, 1.5rem + 3.75vw, 3.75rem);
|
|
170
|
+
|
|
171
|
+
--leading-tight: 1.12;
|
|
172
|
+
--leading-snug: 1.3;
|
|
173
|
+
--leading-normal: 1.55;
|
|
174
|
+
--leading-loose: 1.72;
|
|
175
|
+
--measure: 68ch;
|
|
176
|
+
|
|
177
|
+
/* --- Motion ------------------------------------------------------------ */
|
|
178
|
+
--ease-out: cubic-bezier(.22, 1, .36, 1);
|
|
179
|
+
--ease-in-out: cubic-bezier(.65, 0, .35, 1);
|
|
180
|
+
--ease-spring: linear(0, .18 6%, .53 14%, .89 24%, 1.04 32%, 1.06 40%, 1);
|
|
181
|
+
--dur-1: 110ms;
|
|
182
|
+
--dur-2: 190ms;
|
|
183
|
+
--dur-3: 300ms;
|
|
184
|
+
|
|
185
|
+
/* --- Controls ---------------------------------------------------------- */
|
|
186
|
+
--tap: 44px; /* minimum touch target, everywhere */
|
|
187
|
+
--control-h-sm: 34px;
|
|
188
|
+
--control-h: 42px;
|
|
189
|
+
--control-h-lg: 50px;
|
|
190
|
+
--ring: 0 0 0 3px light-dark(oklch(from var(--focus) l c h / .32),
|
|
191
|
+
oklch(from var(--focus) l c h / .42));
|
|
192
|
+
|
|
193
|
+
--z-sticky: 100;
|
|
194
|
+
--z-nav: 200;
|
|
195
|
+
--z-sheet: 300;
|
|
196
|
+
--z-modal: 400;
|
|
197
|
+
--z-toast: 500;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* contrast-color() resolves against the colour as it actually computes, so
|
|
201
|
+
these follow --hue-brand and friends wherever they are dragged. It returns
|
|
202
|
+
only black or white and it aims at AA (4.5:1), which is why every surface
|
|
203
|
+
that carries text is kept out of the 55-65% lightness band -- see
|
|
204
|
+
--good-600 and --bad-600 above. Baseline Newly Available, so the static
|
|
205
|
+
values in :root stand in where it is missing. */
|
|
206
|
+
@supports (color: contrast-color(red)) {
|
|
207
|
+
:root {
|
|
208
|
+
--text-on-brand: contrast-color(var(--brand-600));
|
|
209
|
+
--text-on-accent: contrast-color(var(--accent-500));
|
|
210
|
+
--text-on-good: contrast-color(var(--good-600));
|
|
211
|
+
--text-on-warn: contrast-color(var(--warn-500));
|
|
212
|
+
--text-on-bad: contrast-color(var(--bad-600));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* Explicit theme override beats the OS setting */
|
|
217
|
+
[data-theme="light"] { color-scheme: light; }
|
|
218
|
+
[data-theme="dark"] { color-scheme: dark; }
|
|
219
|
+
|
|
220
|
+
/* Dark mode wants slightly less shadow and slightly more border */
|
|
221
|
+
@media (prefers-color-scheme: dark) {
|
|
222
|
+
:root {
|
|
223
|
+
--shadow-2: 0 2px 4px oklch(0% 0 0 / .3), 0 4px 12px oklch(0% 0 0 / .34);
|
|
224
|
+
--shadow-3: 0 4px 10px oklch(0% 0 0 / .34), 0 14px 30px oklch(0% 0 0 / .4);
|
|
225
|
+
--shadow-4: 0 10px 20px oklch(0% 0 0 / .4), 0 28px 60px oklch(0% 0 0 / .5);
|
|
226
|
+
--shadow-inset: inset 0 1px 0 oklch(100% 0 0 / .06);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Deck — 03 Type
|
|
3
|
+
========================================================================== */
|
|
4
|
+
|
|
5
|
+
@layer deck.type {
|
|
6
|
+
|
|
7
|
+
h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {
|
|
8
|
+
font-family: var(--font-display);
|
|
9
|
+
font-weight: 640;
|
|
10
|
+
line-height: var(--leading-tight);
|
|
11
|
+
letter-spacing: -.021em;
|
|
12
|
+
color: var(--text);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
h1, .h1 { font-size: var(--text-3xl); letter-spacing: -.031em; }
|
|
16
|
+
h2, .h2 { font-size: var(--text-2xl); letter-spacing: -.026em; }
|
|
17
|
+
h3, .h3 { font-size: var(--text-xl); }
|
|
18
|
+
h4, .h4 { font-size: var(--text-lg); letter-spacing: -.014em; }
|
|
19
|
+
h5, .h5 { font-size: var(--text-md); letter-spacing: -.008em; font-weight: 620; }
|
|
20
|
+
h6, .h6 { font-size: var(--text-base); letter-spacing: 0; font-weight: 640; }
|
|
21
|
+
|
|
22
|
+
.display {
|
|
23
|
+
font-size: var(--text-4xl);
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
line-height: 1.04;
|
|
26
|
+
letter-spacing: -.036em;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.lede {
|
|
30
|
+
font-size: var(--text-md);
|
|
31
|
+
line-height: var(--leading-loose);
|
|
32
|
+
color: var(--text-muted);
|
|
33
|
+
max-inline-size: var(--measure);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
small { font-size: var(--text-sm); }
|
|
37
|
+
|
|
38
|
+
strong, b { font-weight: 640; }
|
|
39
|
+
|
|
40
|
+
a {
|
|
41
|
+
color: var(--brand);
|
|
42
|
+
text-decoration-thickness: 1px;
|
|
43
|
+
text-underline-offset: .18em;
|
|
44
|
+
text-decoration-color: color-mix(in oklab, currentColor 40%, transparent);
|
|
45
|
+
transition: color var(--dur-1) var(--ease-out),
|
|
46
|
+
text-decoration-color var(--dur-1) var(--ease-out);
|
|
47
|
+
}
|
|
48
|
+
a:hover { color: var(--brand-hover); text-decoration-color: currentColor; }
|
|
49
|
+
|
|
50
|
+
.link-quiet { color: var(--text); text-decoration: none; }
|
|
51
|
+
.link-quiet:hover { color: var(--brand); text-decoration: underline; }
|
|
52
|
+
|
|
53
|
+
code, kbd, samp, pre { font-family: var(--font-mono); font-size: .92em; }
|
|
54
|
+
|
|
55
|
+
:not(pre) > code {
|
|
56
|
+
background: var(--surface-2);
|
|
57
|
+
border: 1px solid var(--line);
|
|
58
|
+
border-radius: var(--r-xs);
|
|
59
|
+
padding: .12em .38em;
|
|
60
|
+
color: light-dark(var(--brand-800), var(--brand-200));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
pre {
|
|
64
|
+
background: var(--ink-950);
|
|
65
|
+
color: var(--ink-100);
|
|
66
|
+
padding: var(--space-4);
|
|
67
|
+
border-radius: var(--r-md);
|
|
68
|
+
overflow-x: auto;
|
|
69
|
+
line-height: 1.6;
|
|
70
|
+
font-size: var(--text-sm);
|
|
71
|
+
-webkit-overflow-scrolling: touch;
|
|
72
|
+
}
|
|
73
|
+
pre code { background: none; border: 0; padding: 0; color: inherit; }
|
|
74
|
+
|
|
75
|
+
kbd {
|
|
76
|
+
display: inline-block;
|
|
77
|
+
background: var(--surface);
|
|
78
|
+
border: 1px solid var(--line-strong);
|
|
79
|
+
border-block-end-width: 2px;
|
|
80
|
+
border-radius: var(--r-xs);
|
|
81
|
+
padding: .1em .42em;
|
|
82
|
+
font-size: var(--text-xs);
|
|
83
|
+
line-height: 1.5;
|
|
84
|
+
color: var(--text-muted);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
blockquote {
|
|
88
|
+
border-inline-start: 3px solid var(--brand-300);
|
|
89
|
+
padding-inline-start: var(--space-4);
|
|
90
|
+
color: var(--text-muted);
|
|
91
|
+
font-size: var(--text-md);
|
|
92
|
+
line-height: var(--leading-loose);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
mark {
|
|
96
|
+
background: var(--accent-100);
|
|
97
|
+
color: light-dark(var(--ink-900), var(--ink-900));
|
|
98
|
+
padding: .05em .2em;
|
|
99
|
+
border-radius: var(--r-xs);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
abbr[title] { text-decoration: underline dotted; cursor: help; }
|
|
103
|
+
|
|
104
|
+
/* Prose: for anything that came out of a WYSIWYG or markdown */
|
|
105
|
+
.prose { max-inline-size: var(--measure); }
|
|
106
|
+
.prose > * + * { margin-block-start: var(--space-4); }
|
|
107
|
+
.prose > * + :is(h2, h3, h4) { margin-block-start: var(--space-8); }
|
|
108
|
+
.prose :is(ul, ol) { padding-inline-start: var(--space-6); display: grid; gap: var(--space-2); }
|
|
109
|
+
.prose ul { list-style: disc; }
|
|
110
|
+
.prose ol { list-style: decimal; }
|
|
111
|
+
.prose li::marker { color: var(--text-faint); }
|
|
112
|
+
.prose img { border-radius: var(--r-md); }
|
|
113
|
+
.prose hr { margin-block: var(--space-8); }
|
|
114
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Deck — 09 Utilities
|
|
3
|
+
A short list on purpose. Utilities are for the last 10 percent of a layout,
|
|
4
|
+
not for rebuilding a button out of fourteen class names.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
@layer deck.utilities {
|
|
8
|
+
|
|
9
|
+
/* --- Display ------------------------------------------------------------ */
|
|
10
|
+
.hidden { display: none; }
|
|
11
|
+
.block { display: block; }
|
|
12
|
+
.inline-block { display: inline-block; }
|
|
13
|
+
.flex { display: flex; }
|
|
14
|
+
.inline-flex { display: inline-flex; }
|
|
15
|
+
.contents { display: contents; }
|
|
16
|
+
|
|
17
|
+
/* --- Flex and grid ------------------------------------------------------ */
|
|
18
|
+
.flex-row { flex-direction: row; }
|
|
19
|
+
.flex-col { flex-direction: column; }
|
|
20
|
+
.wrap { flex-wrap: wrap; }
|
|
21
|
+
.nowrap { flex-wrap: nowrap; white-space: nowrap; }
|
|
22
|
+
.items-start { align-items: flex-start; }
|
|
23
|
+
.items-center { align-items: center; }
|
|
24
|
+
.items-end { align-items: flex-end; }
|
|
25
|
+
.items-stretch { align-items: stretch; }
|
|
26
|
+
.items-baseline { align-items: baseline; }
|
|
27
|
+
.justify-start { justify-content: flex-start; }
|
|
28
|
+
.justify-center { justify-content: center; }
|
|
29
|
+
.justify-end { justify-content: flex-end; }
|
|
30
|
+
.justify-between { justify-content: space-between; }
|
|
31
|
+
.place-center { place-items: center; }
|
|
32
|
+
.grow { flex: 1 1 auto; min-inline-size: 0; }
|
|
33
|
+
.shrink-0 { flex: 0 0 auto; }
|
|
34
|
+
/* Pushes this element and everything after it to the far end of a flex
|
|
35
|
+
row. The one-class replacement for a spacer div. */
|
|
36
|
+
.push { margin-inline-start: auto; }
|
|
37
|
+
|
|
38
|
+
.gap-0 { gap: 0; }
|
|
39
|
+
.gap-1 { gap: var(--space-1); }
|
|
40
|
+
.gap-2 { gap: var(--space-2); }
|
|
41
|
+
.gap-3 { gap: var(--space-3); }
|
|
42
|
+
.gap-4 { gap: var(--space-4); }
|
|
43
|
+
.gap-6 { gap: var(--space-6); }
|
|
44
|
+
.gap-8 { gap: var(--space-8); }
|
|
45
|
+
|
|
46
|
+
/* --- Spacing ------------------------------------------------------------ */
|
|
47
|
+
/* The scale is 0 1 2 3 4 6 8, declared in 04-layout.css. Every family below
|
|
48
|
+
implements all seven, so a step that exists anywhere exists everywhere. */
|
|
49
|
+
.p-0 { padding: 0; } .p-1 { padding: var(--space-1); }
|
|
50
|
+
.p-2 { padding: var(--space-2); } .p-3 { padding: var(--space-3); }
|
|
51
|
+
.p-4 { padding: var(--space-4); } .p-6 { padding: var(--space-6); }
|
|
52
|
+
.p-8 { padding: var(--space-8); }
|
|
53
|
+
|
|
54
|
+
.px-0 { padding-inline: 0; } .px-1 { padding-inline: var(--space-1); }
|
|
55
|
+
.px-2 { padding-inline: var(--space-2); } .px-3 { padding-inline: var(--space-3); }
|
|
56
|
+
.px-4 { padding-inline: var(--space-4); } .px-6 { padding-inline: var(--space-6); }
|
|
57
|
+
.px-8 { padding-inline: var(--space-8); }
|
|
58
|
+
|
|
59
|
+
.py-0 { padding-block: 0; } .py-1 { padding-block: var(--space-1); }
|
|
60
|
+
.py-2 { padding-block: var(--space-2); } .py-3 { padding-block: var(--space-3); }
|
|
61
|
+
.py-4 { padding-block: var(--space-4); } .py-6 { padding-block: var(--space-6); }
|
|
62
|
+
.py-8 { padding-block: var(--space-8); }
|
|
63
|
+
|
|
64
|
+
.m-0 { margin: 0; }
|
|
65
|
+
.mt-0 { margin-block-start: 0; } .mt-1 { margin-block-start: var(--space-1); }
|
|
66
|
+
.mt-2 { margin-block-start: var(--space-2); } .mt-3 { margin-block-start: var(--space-3); }
|
|
67
|
+
.mt-4 { margin-block-start: var(--space-4); } .mt-6 { margin-block-start: var(--space-6); }
|
|
68
|
+
.mt-8 { margin-block-start: var(--space-8); }
|
|
69
|
+
.mb-0 { margin-block-end: 0; } .mb-1 { margin-block-end: var(--space-1); }
|
|
70
|
+
.mb-2 { margin-block-end: var(--space-2); } .mb-3 { margin-block-end: var(--space-3); }
|
|
71
|
+
.mb-4 { margin-block-end: var(--space-4); } .mb-6 { margin-block-end: var(--space-6); }
|
|
72
|
+
.mb-8 { margin-block-end: var(--space-8); }
|
|
73
|
+
.mx-auto { margin-inline: auto; }
|
|
74
|
+
|
|
75
|
+
/* --- Sizing ------------------------------------------------------------- */
|
|
76
|
+
.w-full { inline-size: 100%; }
|
|
77
|
+
.w-auto { inline-size: auto; }
|
|
78
|
+
.h-full { block-size: 100%; }
|
|
79
|
+
.min-h-screen { min-block-size: 100dvh; }
|
|
80
|
+
.max-w-prose { max-inline-size: var(--measure); }
|
|
81
|
+
.max-w-sm { max-inline-size: 24rem; }
|
|
82
|
+
.max-w-md { max-inline-size: 34rem; }
|
|
83
|
+
.max-w-lg { max-inline-size: 48rem; }
|
|
84
|
+
.square { aspect-ratio: 1; }
|
|
85
|
+
|
|
86
|
+
/* --- Type --------------------------------------------------------------- */
|
|
87
|
+
.text-2xs { font-size: var(--text-2xs); }
|
|
88
|
+
.text-xs { font-size: var(--text-xs); }
|
|
89
|
+
/* One step down the type scale, for secondary text and dense rows. */
|
|
90
|
+
.text-sm { font-size: var(--text-sm); }
|
|
91
|
+
.text-base { font-size: var(--text-base); }
|
|
92
|
+
.text-md { font-size: var(--text-md); }
|
|
93
|
+
.text-lg { font-size: var(--text-lg); }
|
|
94
|
+
.text-xl { font-size: var(--text-xl); }
|
|
95
|
+
.text-2xl { font-size: var(--text-2xl); }
|
|
96
|
+
|
|
97
|
+
.fw-normal { font-weight: 400; }
|
|
98
|
+
.fw-medium { font-weight: 540; }
|
|
99
|
+
/* Semibold. The weight for a label or a name that needs to lead without
|
|
100
|
+
becoming a heading. */
|
|
101
|
+
.fw-semi { font-weight: 620; }
|
|
102
|
+
.fw-bold { font-weight: 700; }
|
|
103
|
+
|
|
104
|
+
.text-start { text-align: start; }
|
|
105
|
+
.text-center { text-align: center; }
|
|
106
|
+
.text-end { text-align: end; }
|
|
107
|
+
|
|
108
|
+
/* Secondary text colour. Still meets contrast against every surface Deck
|
|
109
|
+
defines, so it is safe for body copy rather than decoration only. */
|
|
110
|
+
.text-muted { color: var(--text-muted); }
|
|
111
|
+
.text-faint { color: var(--text-faint); }
|
|
112
|
+
.text-brand { color: var(--brand); }
|
|
113
|
+
.text-good { color: var(--good-700); }
|
|
114
|
+
.text-warn { color: var(--warn-700); }
|
|
115
|
+
.text-bad { color: var(--bad-700); }
|
|
116
|
+
.text-inherit { color: inherit; }
|
|
117
|
+
|
|
118
|
+
/* Tabular figures, so numbers line up in a column and do not jitter when
|
|
119
|
+
they change. */
|
|
120
|
+
.nums { font-variant-numeric: tabular-nums; }
|
|
121
|
+
.mono { font-family: var(--font-mono); }
|
|
122
|
+
.uppercase { text-transform: uppercase; letter-spacing: .04em; }
|
|
123
|
+
.capitalize { text-transform: capitalize; }
|
|
124
|
+
.no-underline { text-decoration: none; }
|
|
125
|
+
|
|
126
|
+
.truncate {
|
|
127
|
+
overflow: hidden;
|
|
128
|
+
text-overflow: ellipsis;
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
min-inline-size: 0;
|
|
131
|
+
}
|
|
132
|
+
.clamp-2, .clamp-3 {
|
|
133
|
+
display: -webkit-box;
|
|
134
|
+
-webkit-box-orient: vertical;
|
|
135
|
+
overflow: hidden;
|
|
136
|
+
}
|
|
137
|
+
.clamp-2 { -webkit-line-clamp: 2; line-clamp: 2; }
|
|
138
|
+
.clamp-3 { -webkit-line-clamp: 3; line-clamp: 3; }
|
|
139
|
+
|
|
140
|
+
/* --- Surfaces ----------------------------------------------------------- */
|
|
141
|
+
.bg-surface { background: var(--surface); }
|
|
142
|
+
.bg-sunken { background: var(--bg-sunken); }
|
|
143
|
+
.bg-brand { background: var(--brand-600); color: var(--text-on-brand); }
|
|
144
|
+
.bg-soft { background: var(--brand-soft); color: var(--brand-soft-text); }
|
|
145
|
+
.bg-none { background: none; }
|
|
146
|
+
|
|
147
|
+
.border { border: 1px solid var(--line); }
|
|
148
|
+
.border-t { border-block-start: 1px solid var(--line); }
|
|
149
|
+
.border-b { border-block-end: 1px solid var(--line); }
|
|
150
|
+
.border-brand { border-color: var(--brand-400); }
|
|
151
|
+
.border-0 { border: 0; }
|
|
152
|
+
|
|
153
|
+
.r-xs { border-radius: var(--r-xs); }
|
|
154
|
+
.r-sm { border-radius: var(--r-sm); }
|
|
155
|
+
.r-md { border-radius: var(--r-md); }
|
|
156
|
+
.r-lg { border-radius: var(--r-lg); }
|
|
157
|
+
.r-full { border-radius: var(--r-full); }
|
|
158
|
+
|
|
159
|
+
.shadow-0 { box-shadow: none; }
|
|
160
|
+
.shadow-1 { box-shadow: var(--shadow-1); }
|
|
161
|
+
.shadow-2 { box-shadow: var(--shadow-2); }
|
|
162
|
+
.shadow-3 { box-shadow: var(--shadow-3); }
|
|
163
|
+
.shadow-4 { box-shadow: var(--shadow-4); }
|
|
164
|
+
|
|
165
|
+
/* --- Position and overflow ---------------------------------------------- */
|
|
166
|
+
.relative { position: relative; }
|
|
167
|
+
.absolute { position: absolute; }
|
|
168
|
+
.fixed { position: fixed; }
|
|
169
|
+
.sticky { position: sticky; }
|
|
170
|
+
.inset-0 { inset: 0; }
|
|
171
|
+
.z-1 { z-index: 1; }
|
|
172
|
+
.overflow-hidden { overflow: hidden; }
|
|
173
|
+
.overflow-auto { overflow: auto; }
|
|
174
|
+
.overflow-clip { overflow: clip; }
|
|
175
|
+
|
|
176
|
+
.opacity-60 { opacity: .6; }
|
|
177
|
+
.pointer-none { pointer-events: none; }
|
|
178
|
+
.no-select { user-select: none; }
|
|
179
|
+
.cursor-pointer { cursor: pointer; }
|
|
180
|
+
|
|
181
|
+
/* --- Accessibility ------------------------------------------------------ */
|
|
182
|
+
.sr-only {
|
|
183
|
+
position: absolute;
|
|
184
|
+
inline-size: 1px;
|
|
185
|
+
block-size: 1px;
|
|
186
|
+
padding: 0;
|
|
187
|
+
margin: -1px;
|
|
188
|
+
overflow: hidden;
|
|
189
|
+
clip-path: inset(50%);
|
|
190
|
+
white-space: nowrap;
|
|
191
|
+
border: 0;
|
|
192
|
+
}
|
|
193
|
+
.skip-link {
|
|
194
|
+
position: absolute;
|
|
195
|
+
inset-block-start: -100%;
|
|
196
|
+
inset-inline-start: var(--space-4);
|
|
197
|
+
z-index: var(--z-toast);
|
|
198
|
+
background: var(--brand-600);
|
|
199
|
+
color: var(--text-on-brand);
|
|
200
|
+
padding: var(--space-3) var(--space-4);
|
|
201
|
+
border-radius: var(--r-sm);
|
|
202
|
+
}
|
|
203
|
+
.skip-link:focus { inset-block-start: var(--space-4); }
|
|
204
|
+
|
|
205
|
+
/* --- Responsive variants (mobile first: these turn ON at the breakpoint) - */
|
|
206
|
+
@media (min-width: 40rem) {
|
|
207
|
+
.sm\:hidden { display: none; }
|
|
208
|
+
.sm\:block { display: block; }
|
|
209
|
+
.sm\:flex { display: flex; }
|
|
210
|
+
.sm\:row { flex-direction: row; }
|
|
211
|
+
.sm\:w-auto { inline-size: auto; }
|
|
212
|
+
.sm\:text-start { text-align: start; }
|
|
213
|
+
}
|
|
214
|
+
@media (min-width: 48rem) {
|
|
215
|
+
.md\:hidden { display: none; }
|
|
216
|
+
.md\:block { display: block; }
|
|
217
|
+
.md\:flex { display: flex; }
|
|
218
|
+
.md\:grid-d { display: grid; }
|
|
219
|
+
.md\:row { flex-direction: row; }
|
|
220
|
+
.md\:col { flex-direction: column; }
|
|
221
|
+
.md\:items-center { align-items: center; }
|
|
222
|
+
.md\:justify-between { justify-content: space-between; }
|
|
223
|
+
.md\:w-auto { inline-size: auto; }
|
|
224
|
+
.md\:text-center { text-align: center; }
|
|
225
|
+
.md\:p-8 { padding: var(--space-8); }
|
|
226
|
+
.md\:gap-6 { gap: var(--space-6); }
|
|
227
|
+
}
|
|
228
|
+
@media (min-width: 64rem) {
|
|
229
|
+
.lg\:hidden { display: none; }
|
|
230
|
+
.lg\:block { display: block; }
|
|
231
|
+
.lg\:flex { display: flex; }
|
|
232
|
+
.lg\:grid-d { display: grid; }
|
|
233
|
+
.lg\:row { flex-direction: row; }
|
|
234
|
+
.lg\:gap-8 { gap: var(--space-8); }
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Show only to one input type */
|
|
238
|
+
@media (pointer: fine) { .touch-only { display: none; } }
|
|
239
|
+
@media (pointer: coarse) { .mouse-only { display: none; } }
|
|
240
|
+
@media print { .no-print { display: none !important; } }
|
|
241
|
+
}
|
package/dist/sizes.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.1.0",
|
|
3
|
+
"note": "Generated by build.mjs. Do not edit. Brotli is quality 11 with a size hint.",
|
|
4
|
+
"files": {
|
|
5
|
+
"deck.min.css": {
|
|
6
|
+
"raw": 172846,
|
|
7
|
+
"gzip": 32710,
|
|
8
|
+
"brotli": 26693
|
|
9
|
+
},
|
|
10
|
+
"deck-icons.svg": {
|
|
11
|
+
"raw": 110032,
|
|
12
|
+
"gzip": 33559,
|
|
13
|
+
"brotli": 27148
|
|
14
|
+
},
|
|
15
|
+
"deck.min.js": {
|
|
16
|
+
"raw": 32556,
|
|
17
|
+
"gzip": 10003,
|
|
18
|
+
"brotli": 8897
|
|
19
|
+
},
|
|
20
|
+
"deck-extras.min.js": {
|
|
21
|
+
"raw": 15854,
|
|
22
|
+
"gzip": 6497,
|
|
23
|
+
"brotli": 5692
|
|
24
|
+
},
|
|
25
|
+
"deck-adapters.min.js": {
|
|
26
|
+
"raw": 11294,
|
|
27
|
+
"gzip": 4518,
|
|
28
|
+
"brotli": 3974
|
|
29
|
+
},
|
|
30
|
+
"deck.bundle.min.js": {
|
|
31
|
+
"raw": 59728,
|
|
32
|
+
"gzip": 19515,
|
|
33
|
+
"brotli": 17297
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"totals": {
|
|
37
|
+
"core": {
|
|
38
|
+
"gzip": 76272,
|
|
39
|
+
"brotli": 62738
|
|
40
|
+
},
|
|
41
|
+
"bundle": {
|
|
42
|
+
"gzip": 85784,
|
|
43
|
+
"brotli": 71138
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"sample": {
|
|
47
|
+
"icons": 12,
|
|
48
|
+
"raw": 19419,
|
|
49
|
+
"gzip": 6927,
|
|
50
|
+
"brotli": 5705
|
|
51
|
+
}
|
|
52
|
+
}
|