@setsquare/ui 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/CHANGELOG.md +70 -0
- package/LICENSE +202 -0
- package/NOTICE +49 -0
- package/README.md +313 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +4 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +59 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/tokens.d.ts +5 -0
- package/dist/lib/tokens.d.ts.map +1 -0
- package/dist/lib/tokens.js +22 -0
- package/dist/lib/tokens.js.map +1 -0
- package/dist/lib/use-element-width.d.ts +4 -0
- package/dist/lib/use-element-width.d.ts.map +1 -0
- package/dist/lib/use-element-width.js +17 -0
- package/dist/lib/use-element-width.js.map +1 -0
- package/dist/lint/index.d.ts +41 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +648 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/shell/app-header.d.ts +13 -0
- package/dist/shell/app-header.d.ts.map +1 -0
- package/dist/shell/app-header.js +11 -0
- package/dist/shell/app-header.js.map +1 -0
- package/dist/shell/dashboard-shell.d.ts +67 -0
- package/dist/shell/dashboard-shell.d.ts.map +1 -0
- package/dist/shell/dashboard-shell.js +168 -0
- package/dist/shell/dashboard-shell.js.map +1 -0
- package/dist/shell/page-header.d.ts +19 -0
- package/dist/shell/page-header.d.ts.map +1 -0
- package/dist/shell/page-header.js +11 -0
- package/dist/shell/page-header.js.map +1 -0
- package/dist/shell/right-panel.d.ts +25 -0
- package/dist/shell/right-panel.d.ts.map +1 -0
- package/dist/shell/right-panel.js +37 -0
- package/dist/shell/right-panel.js.map +1 -0
- package/dist/shell/sidebar.d.ts +68 -0
- package/dist/shell/sidebar.d.ts.map +1 -0
- package/dist/shell/sidebar.js +68 -0
- package/dist/shell/sidebar.js.map +1 -0
- package/dist/shell/site-footer.d.ts +28 -0
- package/dist/shell/site-footer.d.ts.map +1 -0
- package/dist/shell/site-footer.js +15 -0
- package/dist/shell/site-footer.js.map +1 -0
- package/dist/shell/site-header-padding.d.ts +7 -0
- package/dist/shell/site-header-padding.d.ts.map +1 -0
- package/dist/shell/site-header-padding.js +27 -0
- package/dist/shell/site-header-padding.js.map +1 -0
- package/dist/shell/site-header.d.ts +23 -0
- package/dist/shell/site-header.d.ts.map +1 -0
- package/dist/shell/site-header.js +13 -0
- package/dist/shell/site-header.js.map +1 -0
- package/dist/shell/site-menu.d.ts +27 -0
- package/dist/shell/site-menu.d.ts.map +1 -0
- package/dist/shell/site-menu.js +56 -0
- package/dist/shell/site-menu.js.map +1 -0
- package/dist/shell/site-nav-link.d.ts +24 -0
- package/dist/shell/site-nav-link.d.ts.map +1 -0
- package/dist/shell/site-nav-link.js +35 -0
- package/dist/shell/site-nav-link.js.map +1 -0
- package/dist/shell/site-nav.d.ts +12 -0
- package/dist/shell/site-nav.d.ts.map +1 -0
- package/dist/shell/site-nav.js +9 -0
- package/dist/shell/site-nav.js.map +1 -0
- package/dist/shell/site-path.d.ts +8 -0
- package/dist/shell/site-path.d.ts.map +1 -0
- package/dist/shell/site-path.js +11 -0
- package/dist/shell/site-path.js.map +1 -0
- package/dist/shell/site-shell.d.ts +25 -0
- package/dist/shell/site-shell.d.ts.map +1 -0
- package/dist/shell/site-shell.js +17 -0
- package/dist/shell/site-shell.js.map +1 -0
- package/dist/styles/styles.css +10 -0
- package/dist/styles/theme.css +579 -0
- package/dist/styles/tokens.css +295 -0
- package/dist/testing/index.d.ts +321 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +1175 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tokens.json +982 -0
- package/dist/ui/alert.d.ts +35 -0
- package/dist/ui/alert.d.ts.map +1 -0
- package/dist/ui/alert.js +65 -0
- package/dist/ui/alert.js.map +1 -0
- package/dist/ui/avatar.d.ts +16 -0
- package/dist/ui/avatar.d.ts.map +1 -0
- package/dist/ui/avatar.js +13 -0
- package/dist/ui/avatar.js.map +1 -0
- package/dist/ui/badge.d.ts +13 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +24 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/breadcrumbs.d.ts +13 -0
- package/dist/ui/breadcrumbs.d.ts.map +1 -0
- package/dist/ui/breadcrumbs.js +12 -0
- package/dist/ui/breadcrumbs.js.map +1 -0
- package/dist/ui/button-styles.d.ts +24 -0
- package/dist/ui/button-styles.d.ts.map +1 -0
- package/dist/ui/button-styles.js +50 -0
- package/dist/ui/button-styles.js.map +1 -0
- package/dist/ui/button.d.ts +27 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +30 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/calendar.d.ts +19 -0
- package/dist/ui/calendar.d.ts.map +1 -0
- package/dist/ui/calendar.js +52 -0
- package/dist/ui/calendar.js.map +1 -0
- package/dist/ui/card.d.ts +30 -0
- package/dist/ui/card.d.ts.map +1 -0
- package/dist/ui/card.js +18 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/checkbox.d.ts +36 -0
- package/dist/ui/checkbox.d.ts.map +1 -0
- package/dist/ui/checkbox.js +38 -0
- package/dist/ui/checkbox.js.map +1 -0
- package/dist/ui/code-block.d.ts +20 -0
- package/dist/ui/code-block.d.ts.map +1 -0
- package/dist/ui/code-block.js +22 -0
- package/dist/ui/code-block.js.map +1 -0
- package/dist/ui/combo-box.d.ts +17 -0
- package/dist/ui/combo-box.d.ts.map +1 -0
- package/dist/ui/combo-box.js +14 -0
- package/dist/ui/combo-box.js.map +1 -0
- package/dist/ui/copy-button.d.ts +14 -0
- package/dist/ui/copy-button.d.ts.map +1 -0
- package/dist/ui/copy-button.js +36 -0
- package/dist/ui/copy-button.js.map +1 -0
- package/dist/ui/date-field.d.ts +38 -0
- package/dist/ui/date-field.d.ts.map +1 -0
- package/dist/ui/date-field.js +78 -0
- package/dist/ui/date-field.js.map +1 -0
- package/dist/ui/dialog.d.ts +41 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +69 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/disclosure.d.ts +18 -0
- package/dist/ui/disclosure.d.ts.map +1 -0
- package/dist/ui/disclosure.js +15 -0
- package/dist/ui/disclosure.js.map +1 -0
- package/dist/ui/empty-state.d.ts +17 -0
- package/dist/ui/empty-state.d.ts.map +1 -0
- package/dist/ui/empty-state.js +9 -0
- package/dist/ui/empty-state.js.map +1 -0
- package/dist/ui/error-state.d.ts +45 -0
- package/dist/ui/error-state.d.ts.map +1 -0
- package/dist/ui/error-state.js +88 -0
- package/dist/ui/error-state.js.map +1 -0
- package/dist/ui/field.d.ts +46 -0
- package/dist/ui/field.d.ts.map +1 -0
- package/dist/ui/field.js +79 -0
- package/dist/ui/field.js.map +1 -0
- package/dist/ui/file-upload.d.ts +54 -0
- package/dist/ui/file-upload.d.ts.map +1 -0
- package/dist/ui/file-upload.js +170 -0
- package/dist/ui/file-upload.js.map +1 -0
- package/dist/ui/form.d.ts +56 -0
- package/dist/ui/form.d.ts.map +1 -0
- package/dist/ui/form.js +137 -0
- package/dist/ui/form.js.map +1 -0
- package/dist/ui/grid-list.d.ts +24 -0
- package/dist/ui/grid-list.d.ts.map +1 -0
- package/dist/ui/grid-list.js +21 -0
- package/dist/ui/grid-list.js.map +1 -0
- package/dist/ui/hero.d.ts +36 -0
- package/dist/ui/hero.d.ts.map +1 -0
- package/dist/ui/hero.js +19 -0
- package/dist/ui/hero.js.map +1 -0
- package/dist/ui/icon-button.d.ts +18 -0
- package/dist/ui/icon-button.d.ts.map +1 -0
- package/dist/ui/icon-button.js +13 -0
- package/dist/ui/icon-button.js.map +1 -0
- package/dist/ui/icon.d.ts +20 -0
- package/dist/ui/icon.d.ts.map +1 -0
- package/dist/ui/icon.js +26 -0
- package/dist/ui/icon.js.map +1 -0
- package/dist/ui/kbd.d.ts +7 -0
- package/dist/ui/kbd.d.ts.map +1 -0
- package/dist/ui/kbd.js +7 -0
- package/dist/ui/kbd.js.map +1 -0
- package/dist/ui/link-card.d.ts +23 -0
- package/dist/ui/link-card.d.ts.map +1 -0
- package/dist/ui/link-card.js +19 -0
- package/dist/ui/link-card.js.map +1 -0
- package/dist/ui/list-box.d.ts +17 -0
- package/dist/ui/list-box.d.ts.map +1 -0
- package/dist/ui/list-box.js +18 -0
- package/dist/ui/list-box.js.map +1 -0
- package/dist/ui/menu.d.ts +31 -0
- package/dist/ui/menu.d.ts.map +1 -0
- package/dist/ui/menu.js +40 -0
- package/dist/ui/menu.js.map +1 -0
- package/dist/ui/number-field.d.ts +19 -0
- package/dist/ui/number-field.d.ts.map +1 -0
- package/dist/ui/number-field.js +19 -0
- package/dist/ui/number-field.js.map +1 -0
- package/dist/ui/prose.d.ts +12 -0
- package/dist/ui/prose.d.ts.map +1 -0
- package/dist/ui/prose.js +11 -0
- package/dist/ui/prose.js.map +1 -0
- package/dist/ui/radio-group.d.ts +20 -0
- package/dist/ui/radio-group.d.ts.map +1 -0
- package/dist/ui/radio-group.js +16 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/scroll-region.d.ts +18 -0
- package/dist/ui/scroll-region.d.ts.map +1 -0
- package/dist/ui/scroll-region.js +29 -0
- package/dist/ui/scroll-region.js.map +1 -0
- package/dist/ui/search-field.d.ts +12 -0
- package/dist/ui/search-field.d.ts.map +1 -0
- package/dist/ui/search-field.js +12 -0
- package/dist/ui/search-field.js.map +1 -0
- package/dist/ui/search.d.ts +43 -0
- package/dist/ui/search.d.ts.map +1 -0
- package/dist/ui/search.js +45 -0
- package/dist/ui/search.js.map +1 -0
- package/dist/ui/section.d.ts +50 -0
- package/dist/ui/section.d.ts.map +1 -0
- package/dist/ui/section.js +25 -0
- package/dist/ui/section.js.map +1 -0
- package/dist/ui/segmented-control.d.ts +18 -0
- package/dist/ui/segmented-control.d.ts.map +1 -0
- package/dist/ui/segmented-control.js +17 -0
- package/dist/ui/segmented-control.js.map +1 -0
- package/dist/ui/select.d.ts +18 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +13 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/selection-bar.d.ts +28 -0
- package/dist/ui/selection-bar.d.ts.map +1 -0
- package/dist/ui/selection-bar.js +35 -0
- package/dist/ui/selection-bar.js.map +1 -0
- package/dist/ui/sheet.d.ts +21 -0
- package/dist/ui/sheet.d.ts.map +1 -0
- package/dist/ui/sheet.js +16 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/skeleton.d.ts +31 -0
- package/dist/ui/skeleton.d.ts.map +1 -0
- package/dist/ui/skeleton.js +38 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/slider.d.ts +31 -0
- package/dist/ui/slider.d.ts.map +1 -0
- package/dist/ui/slider.js +33 -0
- package/dist/ui/slider.js.map +1 -0
- package/dist/ui/spinner.d.ts +27 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +21 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split.d.ts +14 -0
- package/dist/ui/split.d.ts.map +1 -0
- package/dist/ui/split.js +11 -0
- package/dist/ui/split.js.map +1 -0
- package/dist/ui/stat-list.d.ts +25 -0
- package/dist/ui/stat-list.d.ts.map +1 -0
- package/dist/ui/stat-list.js +14 -0
- package/dist/ui/stat-list.js.map +1 -0
- package/dist/ui/steps.d.ts +23 -0
- package/dist/ui/steps.d.ts.map +1 -0
- package/dist/ui/steps.js +16 -0
- package/dist/ui/steps.js.map +1 -0
- package/dist/ui/switch.d.ts +13 -0
- package/dist/ui/switch.d.ts.map +1 -0
- package/dist/ui/switch.js +12 -0
- package/dist/ui/switch.js.map +1 -0
- package/dist/ui/table.d.ts +25 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +29 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tag.d.ts +14 -0
- package/dist/ui/tag.d.ts.map +1 -0
- package/dist/ui/tag.js +11 -0
- package/dist/ui/tag.js.map +1 -0
- package/dist/ui/text-field.d.ts +27 -0
- package/dist/ui/text-field.d.ts.map +1 -0
- package/dist/ui/text-field.js +17 -0
- package/dist/ui/text-field.js.map +1 -0
- package/dist/ui/text-link.d.ts +17 -0
- package/dist/ui/text-link.d.ts.map +1 -0
- package/dist/ui/text-link.js +15 -0
- package/dist/ui/text-link.js.map +1 -0
- package/dist/ui/theme-switcher.d.ts +26 -0
- package/dist/ui/theme-switcher.d.ts.map +1 -0
- package/dist/ui/theme-switcher.js +32 -0
- package/dist/ui/theme-switcher.js.map +1 -0
- package/dist/ui/theme.d.ts +54 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +135 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/toast.d.ts +34 -0
- package/dist/ui/toast.d.ts.map +1 -0
- package/dist/ui/toast.js +69 -0
- package/dist/ui/toast.js.map +1 -0
- package/dist/ui/tooltip.d.ts +10 -0
- package/dist/ui/tooltip.d.ts.map +1 -0
- package/dist/ui/tooltip.js +10 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/package.json +123 -0
- package/templates/next/error.tsx +32 -0
- package/templates/next/loading.tsx +19 -0
- package/templates/next/not-found.tsx +18 -0
- package/templates/next/page-transition.tsx +33 -0
- package/templates/next/portal-layout.tsx +70 -0
- package/templates/next/prefetch-on-intent.ts +31 -0
- package/templates/next/root-layout.tsx +16 -0
- package/templates/next/site-layout.tsx +58 -0
- package/templates/next/site-nav.ts +16 -0
- package/templates/next/site-not-found.tsx +21 -0
- package/templates/next/site-router.tsx +17 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/* @setsquare/ui theme — generated from tokens/tokens.json by scripts/build-css.mjs. Do not edit. */
|
|
2
|
+
@theme {
|
|
3
|
+
--breakpoint-md: 48rem;
|
|
4
|
+
--breakpoint-lg: 64rem;
|
|
5
|
+
--breakpoint-xl: 80rem;
|
|
6
|
+
--color-*: initial;
|
|
7
|
+
--font-*: initial;
|
|
8
|
+
--radius-*: initial;
|
|
9
|
+
--shadow-*: initial;
|
|
10
|
+
}
|
|
11
|
+
/* reference: utilities read the token variables; the values here are fallbacks only */
|
|
12
|
+
@theme reference {
|
|
13
|
+
--radius-sm: 4px;
|
|
14
|
+
--radius-md: 6px;
|
|
15
|
+
--radius-lg: 8px;
|
|
16
|
+
--radius-xl: 12px;
|
|
17
|
+
--radius-full: 9999px;
|
|
18
|
+
--font-sans: "Atkinson Hyperlegible Next", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
19
|
+
--font-mono: "Atkinson Hyperlegible Mono", ui-monospace, "SF Mono", Menlo, monospace;
|
|
20
|
+
}
|
|
21
|
+
@theme inline {
|
|
22
|
+
--color-brand: var(--brand);
|
|
23
|
+
--color-brand-subtle: var(--brand-subtle);
|
|
24
|
+
--color-background: var(--background);
|
|
25
|
+
--color-foreground: var(--foreground);
|
|
26
|
+
--color-card: var(--card);
|
|
27
|
+
--color-card-foreground: var(--card-foreground);
|
|
28
|
+
--color-popover: var(--popover);
|
|
29
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
30
|
+
--color-muted: var(--muted);
|
|
31
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
32
|
+
--color-secondary: var(--secondary);
|
|
33
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
34
|
+
--color-accent: var(--accent);
|
|
35
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
36
|
+
--color-primary: var(--primary);
|
|
37
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
38
|
+
--color-border: var(--border);
|
|
39
|
+
--color-input: var(--input);
|
|
40
|
+
--color-ring: var(--ring);
|
|
41
|
+
--color-destructive: var(--destructive);
|
|
42
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
43
|
+
--color-destructive-subtle: var(--destructive-subtle);
|
|
44
|
+
--color-success: var(--success);
|
|
45
|
+
--color-success-subtle: var(--success-subtle);
|
|
46
|
+
--color-warning: var(--warning);
|
|
47
|
+
--color-warning-subtle: var(--warning-subtle);
|
|
48
|
+
--color-overlay: var(--overlay);
|
|
49
|
+
--color-sidebar: var(--sidebar);
|
|
50
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
51
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
52
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
53
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
54
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
55
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
56
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
57
|
+
--color-primary-hover: color-mix(in oklab, var(--primary) 86%, var(--foreground));
|
|
58
|
+
--color-destructive-hover: color-mix(in oklab, var(--destructive) 86%, var(--foreground));
|
|
59
|
+
--spacing-target: var(--target-min);
|
|
60
|
+
/* Layer 1 of a field: the painted box's height, or the target floor if that is taller. Inline, so a
|
|
61
|
+
subtree that overrides --control-height or --target-min gets its own value. */
|
|
62
|
+
--spacing-control-target: max(var(--target-min), var(--control-height));
|
|
63
|
+
--spacing-control: var(--control-height);
|
|
64
|
+
--spacing-control-sm: var(--control-height-sm);
|
|
65
|
+
--spacing-control-lg: var(--control-height-lg);
|
|
66
|
+
/* max-w-site and max-w-site-narrow, for anyone laying a public page out with utilities of their own */
|
|
67
|
+
--container-site: var(--site-max);
|
|
68
|
+
--container-site-narrow: var(--site-max-narrow);
|
|
69
|
+
--spacing-nav-item: var(--nav-item-height);
|
|
70
|
+
--spacing-header: var(--header-height);
|
|
71
|
+
--spacing-sidebar: var(--sidebar-width);
|
|
72
|
+
--spacing-sidebar-collapsed: var(--sidebar-width-collapsed);
|
|
73
|
+
--spacing-panel: var(--panel-width);
|
|
74
|
+
--spacing-choice: var(--choice-size);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@utility focus-ring {
|
|
78
|
+
outline: var(--focus-width) solid var(--ring);
|
|
79
|
+
outline-offset: var(--focus-offset);
|
|
80
|
+
}
|
|
81
|
+
@utility focus-ring-inset {
|
|
82
|
+
outline: var(--focus-width) solid var(--ring);
|
|
83
|
+
outline-offset: calc(var(--focus-width) * -1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* A link in running text. Underlined, because colour can't carry it: brand is under 3:1 against body text in
|
|
87
|
+
every theme (G183 asks for 3:1 when colour is the only cue; F73 is the failure). The underline thickens on
|
|
88
|
+
hover. The colour comes separately (text-brand, or the surrounding colour), so it can be overridden. */
|
|
89
|
+
@utility text-link {
|
|
90
|
+
text-decoration-line: underline;
|
|
91
|
+
text-decoration-thickness: 1px;
|
|
92
|
+
text-underline-offset: 3px;
|
|
93
|
+
border-radius: var(--radius-sm);
|
|
94
|
+
cursor: pointer;
|
|
95
|
+
outline: none;
|
|
96
|
+
&:hover,
|
|
97
|
+
&[data-hovered] {
|
|
98
|
+
text-decoration-thickness: 2px;
|
|
99
|
+
}
|
|
100
|
+
&:focus-visible,
|
|
101
|
+
&[data-focus-visible] {
|
|
102
|
+
outline: var(--focus-width) solid var(--ring);
|
|
103
|
+
outline-offset: var(--focus-offset);
|
|
104
|
+
}
|
|
105
|
+
&[data-disabled],
|
|
106
|
+
&[aria-disabled='true'] {
|
|
107
|
+
cursor: not-allowed;
|
|
108
|
+
text-decoration-style: dotted;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Fields in three layers. The <input> (or trigger button, or segment group) is Layer 1: it is the whole
|
|
113
|
+
target, --spacing-control-target tall, with no click handler to route a larger wrapper to it. Layer 2,
|
|
114
|
+
the box people see, is painted behind it by ::before, inset by the band between the two heights, so a
|
|
115
|
+
single-line box paints at --control-height. Layer 3 is the text.
|
|
116
|
+
States go on the pseudo-element: focus-within:before:focus-ring, group-data-invalid/field:before:… */
|
|
117
|
+
@utility field-paint {
|
|
118
|
+
/* The band between the target and the paint, for children that clip their own ground to it. */
|
|
119
|
+
--field-band: calc((max(var(--target-min), var(--control-height)) - var(--control-height)) / 2);
|
|
120
|
+
position: relative;
|
|
121
|
+
isolation: isolate;
|
|
122
|
+
&::before {
|
|
123
|
+
content: '';
|
|
124
|
+
position: absolute;
|
|
125
|
+
z-index: -1;
|
|
126
|
+
inset-inline: 0;
|
|
127
|
+
/* The band off the top and bottom: a single-line box paints at --control-height, and a box that wraps
|
|
128
|
+
(a date range on a narrow screen) paints around both lines. */
|
|
129
|
+
inset-block: var(--field-band);
|
|
130
|
+
border: 1px solid var(--input);
|
|
131
|
+
border-radius: var(--radius-md);
|
|
132
|
+
background-color: var(--background);
|
|
133
|
+
pointer-events: none;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/* A text input that is Layer 1 of a field-paint box. The transparent block borders are the band between
|
|
137
|
+
the target and the paint, so anything the browser paints on the input itself (autofill) stays inside
|
|
138
|
+
the painted box; the elliptical radius makes the inner corners match it. */
|
|
139
|
+
@utility field-input {
|
|
140
|
+
--field-band: calc((max(var(--target-min), var(--control-height)) - var(--control-height)) / 2);
|
|
141
|
+
height: max(var(--target-min), var(--control-height));
|
|
142
|
+
width: 100%;
|
|
143
|
+
min-width: 0;
|
|
144
|
+
border: 1px solid transparent;
|
|
145
|
+
border-block-width: calc(var(--field-band) + 1px);
|
|
146
|
+
border-radius: var(--radius-md) / calc(var(--radius-md) + var(--field-band));
|
|
147
|
+
background-color: transparent;
|
|
148
|
+
background-clip: padding-box;
|
|
149
|
+
outline: none;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* ---------- the site layer: what a public page is made of, usable from any Tailwind 4 app ----------
|
|
153
|
+
Structure only: grounds, spacing and widths come from tokens a product can re-point. The React components
|
|
154
|
+
(Section, Card, Prose…) apply these same utilities. */
|
|
155
|
+
|
|
156
|
+
/* A box that shows a site shell at its own width, not the viewport's: a preview in documentation, a design
|
|
157
|
+
review. Inside it the site-md/lg/xl variants follow the box (a container query) instead of the window, and
|
|
158
|
+
the fluid sizes, which read --site-vw (1vw elsewhere), follow it too. A real page needs none of this: there
|
|
159
|
+
the shell spans the window and the variants are ordinary media queries. Give it a width; it clips nothing.
|
|
160
|
+
The fluid tokens are declared again here: on :root their --site-vw has already become 1vw. */
|
|
161
|
+
@utility site-preview {
|
|
162
|
+
container: site-preview / inline-size;
|
|
163
|
+
--site-vw: 1cqi;
|
|
164
|
+
--site-gutter: clamp(20px, calc(3.2 * var(--site-vw, 1vw)), 44px);
|
|
165
|
+
--section-y: clamp(56px, calc(7 * var(--site-vw, 1vw)), 112px);
|
|
166
|
+
--section-y-tight: clamp(40px, calc(5 * var(--site-vw, 1vw)), 80px);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* The content width of a public page, centred, with the gutter either side. */
|
|
170
|
+
@utility site-container {
|
|
171
|
+
width: 100%;
|
|
172
|
+
max-width: calc(var(--site-max) + 2 * var(--site-gutter));
|
|
173
|
+
margin-inline: auto;
|
|
174
|
+
padding-inline: var(--site-gutter);
|
|
175
|
+
}
|
|
176
|
+
@utility site-container-narrow {
|
|
177
|
+
width: 100%;
|
|
178
|
+
max-width: calc(var(--site-max-narrow) + 2 * var(--site-gutter));
|
|
179
|
+
margin-inline: auto;
|
|
180
|
+
padding-inline: var(--site-gutter);
|
|
181
|
+
}
|
|
182
|
+
/* A full-width band: one section of the page. For a decorative bleed inside it, add overflow-clip, never
|
|
183
|
+
overflow-hidden: clip makes no scroll container, so focus can't scroll it. */
|
|
184
|
+
@utility section-band {
|
|
185
|
+
position: relative;
|
|
186
|
+
padding-block: var(--section-y);
|
|
187
|
+
}
|
|
188
|
+
@utility section-band-tight {
|
|
189
|
+
position: relative;
|
|
190
|
+
padding-block: var(--section-y-tight);
|
|
191
|
+
}
|
|
192
|
+
/* The alternate ground. At AAA the border meets 3:1, so bands read by edge as well as by shade. */
|
|
193
|
+
@utility section-band-raised {
|
|
194
|
+
position: relative;
|
|
195
|
+
padding-block: var(--section-y);
|
|
196
|
+
background-color: var(--card);
|
|
197
|
+
border-block: 1px solid var(--border);
|
|
198
|
+
}
|
|
199
|
+
/* A section's eyebrow, heading and intro, inside --measure, with the space before its content. */
|
|
200
|
+
@utility section-head {
|
|
201
|
+
max-width: var(--measure);
|
|
202
|
+
margin-bottom: var(--space-12);
|
|
203
|
+
& > * + * {
|
|
204
|
+
margin-top: var(--space-3);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/* A short label above a heading. Sentence case: a product with a brand of its own may capitalise it. */
|
|
208
|
+
@utility eyebrow {
|
|
209
|
+
font-size: 13px;
|
|
210
|
+
line-height: 20px;
|
|
211
|
+
font-weight: 600;
|
|
212
|
+
color: var(--muted-foreground);
|
|
213
|
+
}
|
|
214
|
+
/* Long text: a privacy notice, a guide. Inside --measure, with --paragraph-gap between blocks (both larger at
|
|
215
|
+
AAA), and line spacing of 1.6, over 1.4.8's 1.5. Tailwind's reset takes list markers off; these put them
|
|
216
|
+
back, so lists read as lists. */
|
|
217
|
+
@utility site-prose {
|
|
218
|
+
max-width: var(--measure);
|
|
219
|
+
font-size: 1rem;
|
|
220
|
+
line-height: 1.6;
|
|
221
|
+
& > * + * {
|
|
222
|
+
margin-top: var(--paragraph-gap);
|
|
223
|
+
}
|
|
224
|
+
& h2 {
|
|
225
|
+
margin-top: 2em;
|
|
226
|
+
font-size: 1.375rem;
|
|
227
|
+
line-height: 1.3;
|
|
228
|
+
font-weight: 700;
|
|
229
|
+
}
|
|
230
|
+
& h3 {
|
|
231
|
+
margin-top: 1.5em;
|
|
232
|
+
font-size: 1.125rem;
|
|
233
|
+
line-height: 1.4;
|
|
234
|
+
font-weight: 700;
|
|
235
|
+
}
|
|
236
|
+
& :is(h2, h3) + * {
|
|
237
|
+
margin-top: 0.5em;
|
|
238
|
+
}
|
|
239
|
+
& ul {
|
|
240
|
+
list-style: disc;
|
|
241
|
+
padding-inline-start: 1.5em;
|
|
242
|
+
}
|
|
243
|
+
& ol {
|
|
244
|
+
list-style: decimal;
|
|
245
|
+
padding-inline-start: 1.5em;
|
|
246
|
+
}
|
|
247
|
+
& li + li {
|
|
248
|
+
margin-top: 0.5em;
|
|
249
|
+
}
|
|
250
|
+
& code {
|
|
251
|
+
font-family: var(--font-mono);
|
|
252
|
+
font-size: 0.875em;
|
|
253
|
+
padding: 0.1em 0.35em;
|
|
254
|
+
border-radius: var(--radius-sm);
|
|
255
|
+
background-color: var(--muted);
|
|
256
|
+
}
|
|
257
|
+
& strong {
|
|
258
|
+
font-weight: 700;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
@utility card-surface {
|
|
262
|
+
position: relative;
|
|
263
|
+
padding: var(--space-6);
|
|
264
|
+
border: 1px solid var(--border);
|
|
265
|
+
border-radius: var(--radius-lg);
|
|
266
|
+
background-color: var(--card);
|
|
267
|
+
}
|
|
268
|
+
/* Cards as many to a row as fit at 18rem or more, one to a row on a phone. */
|
|
269
|
+
@utility card-grid {
|
|
270
|
+
display: grid;
|
|
271
|
+
gap: var(--space-6);
|
|
272
|
+
grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr));
|
|
273
|
+
}
|
|
274
|
+
/* Text beside media, stacking once the two don't fit at 22rem each. min-width: 0 keeps a code block from
|
|
275
|
+
widening its column past the page. */
|
|
276
|
+
@utility split {
|
|
277
|
+
display: grid;
|
|
278
|
+
gap: var(--space-12);
|
|
279
|
+
grid-template-columns: repeat(auto-fit, minmax(min(22rem, 100%), 1fr));
|
|
280
|
+
align-items: center;
|
|
281
|
+
& > * {
|
|
282
|
+
min-width: 0;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/* Numbered steps on an <ol>. The number is generated content, so it is read out; give the <ol> role="list",
|
|
286
|
+
because Tailwind's reset takes the markers off and VoiceOver in Safari then drops the list. */
|
|
287
|
+
@utility steps {
|
|
288
|
+
display: grid;
|
|
289
|
+
gap: var(--space-6);
|
|
290
|
+
grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
|
|
291
|
+
counter-reset: step;
|
|
292
|
+
list-style: none;
|
|
293
|
+
padding: 0;
|
|
294
|
+
& > li {
|
|
295
|
+
counter-increment: step;
|
|
296
|
+
}
|
|
297
|
+
& > li::before {
|
|
298
|
+
content: counter(step);
|
|
299
|
+
display: block;
|
|
300
|
+
margin-bottom: var(--space-2);
|
|
301
|
+
font-family: var(--font-mono);
|
|
302
|
+
font-size: 13px;
|
|
303
|
+
line-height: 20px;
|
|
304
|
+
color: var(--muted-foreground);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/* Figures on a <dl>: each <div> holds a <dt> (what it counts) and a <dd> (the figure), shown figure first, and
|
|
308
|
+
may hold a second <dd>, the figure's source, shown last. The order is visual only; a screen reader reads
|
|
309
|
+
what it counts, the figure, then the source. */
|
|
310
|
+
@utility stat-list {
|
|
311
|
+
display: grid;
|
|
312
|
+
gap: var(--space-6);
|
|
313
|
+
grid-template-columns: repeat(auto-fit, minmax(min(10rem, 100%), 1fr));
|
|
314
|
+
& > div {
|
|
315
|
+
display: flex;
|
|
316
|
+
flex-direction: column;
|
|
317
|
+
gap: var(--space-1);
|
|
318
|
+
}
|
|
319
|
+
& dt {
|
|
320
|
+
font-size: 13px;
|
|
321
|
+
line-height: 20px;
|
|
322
|
+
color: var(--muted-foreground);
|
|
323
|
+
}
|
|
324
|
+
& dd {
|
|
325
|
+
margin: 0;
|
|
326
|
+
}
|
|
327
|
+
& dd:first-of-type {
|
|
328
|
+
order: -1;
|
|
329
|
+
font-size: 2rem;
|
|
330
|
+
line-height: 1.1;
|
|
331
|
+
font-weight: 700;
|
|
332
|
+
}
|
|
333
|
+
& dd + dd {
|
|
334
|
+
font-size: 13px;
|
|
335
|
+
line-height: 20px;
|
|
336
|
+
color: var(--muted-foreground);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/* A short label in a pill: "Open source", "dev only". Not a status; StatusBadge is. */
|
|
340
|
+
@utility tag {
|
|
341
|
+
display: inline-flex;
|
|
342
|
+
align-items: center;
|
|
343
|
+
gap: var(--space-1);
|
|
344
|
+
padding: 2px 10px;
|
|
345
|
+
border: 1px solid var(--border);
|
|
346
|
+
border-radius: var(--radius-full);
|
|
347
|
+
background-color: var(--background);
|
|
348
|
+
font-size: 13px;
|
|
349
|
+
line-height: 20px;
|
|
350
|
+
font-weight: 600;
|
|
351
|
+
color: var(--foreground);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
@layer base {
|
|
355
|
+
html {
|
|
356
|
+
scroll-padding-top: calc(var(--header-height) + var(--space-4));
|
|
357
|
+
scroll-padding-bottom: calc(var(--toast-region-height, 0px) + var(--space-4));
|
|
358
|
+
}
|
|
359
|
+
/* A public page with a sticky SiteHeader: its measured height (SiteHeaderPadding keeps it current), 4rem until
|
|
360
|
+
that runs. A public page without one needs no top padding. */
|
|
361
|
+
:root:has([data-site-shell]:not(.site-preview *)) {
|
|
362
|
+
scroll-padding-top: var(--space-4);
|
|
363
|
+
}
|
|
364
|
+
:root:has([data-site-header-sticky]:not(.site-preview *)) {
|
|
365
|
+
scroll-padding-top: calc(var(--site-header-height, 4rem) + var(--space-4));
|
|
366
|
+
}
|
|
367
|
+
body {
|
|
368
|
+
background: var(--background);
|
|
369
|
+
color: var(--foreground);
|
|
370
|
+
font-family: var(--font-sans);
|
|
371
|
+
-webkit-font-smoothing: antialiased;
|
|
372
|
+
}
|
|
373
|
+
.lucide { stroke-width: 1.75; }
|
|
374
|
+
/* Tailwind's reset strips links to plain text. A link nobody styled — in Markdown, CMS content or a plain
|
|
375
|
+
<a> in a paragraph — gets the text-link look back, so it is never marked by colour alone. */
|
|
376
|
+
a[href]:not([class]) {
|
|
377
|
+
color: var(--brand);
|
|
378
|
+
text-decoration-line: underline;
|
|
379
|
+
text-decoration-thickness: 1px;
|
|
380
|
+
text-underline-offset: 3px;
|
|
381
|
+
}
|
|
382
|
+
a[href]:not([class]):hover {
|
|
383
|
+
text-decoration-thickness: 2px;
|
|
384
|
+
}
|
|
385
|
+
/* One cursor rule: the hand on everything that can be pressed, not only links, because a button and a
|
|
386
|
+
link that look alike should act alike. Disabled things say so. Zero specificity, so any class wins;
|
|
387
|
+
the components set the same on their targets (Layer 1). No WCAG criterion covers the cursor: this is
|
|
388
|
+
for consistency. */
|
|
389
|
+
:where(
|
|
390
|
+
button,
|
|
391
|
+
input:is([type='button'], [type='submit'], [type='reset'], [type='checkbox'], [type='radio'], [type='file']),
|
|
392
|
+
select,
|
|
393
|
+
summary,
|
|
394
|
+
label:has(input:is([type='checkbox'], [type='radio'])),
|
|
395
|
+
[role='button'],
|
|
396
|
+
[role='link'],
|
|
397
|
+
[role='tab'],
|
|
398
|
+
[role='checkbox'],
|
|
399
|
+
[role='radio'],
|
|
400
|
+
[role='switch'],
|
|
401
|
+
[role='option'],
|
|
402
|
+
[role='menuitem'],
|
|
403
|
+
[role='menuitemcheckbox'],
|
|
404
|
+
[role='menuitemradio']
|
|
405
|
+
) {
|
|
406
|
+
cursor: pointer;
|
|
407
|
+
}
|
|
408
|
+
:where(:disabled, [aria-disabled='true'], [data-disabled]) {
|
|
409
|
+
cursor: not-allowed;
|
|
410
|
+
}
|
|
411
|
+
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
|
|
412
|
+
outline: var(--focus-width) solid var(--ring);
|
|
413
|
+
outline-offset: var(--focus-offset);
|
|
414
|
+
}
|
|
415
|
+
@media (forced-colors: active) {
|
|
416
|
+
[data-focus-visible], :focus-visible { outline-color: Highlight; }
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/* ---------- overlays: slide by motion-distance (0 at AAA: fade only) ---------- */
|
|
421
|
+
[data-overlay][data-entering] { animation: setsquare-fade var(--duration-panel) var(--ease-standard); }
|
|
422
|
+
[data-overlay][data-exiting] { animation: setsquare-fade var(--duration-exit) var(--ease-standard) reverse; }
|
|
423
|
+
[data-sheet][data-entering] { animation: setsquare-sheet var(--duration-panel) var(--ease-standard); }
|
|
424
|
+
[data-sheet][data-exiting] { animation: setsquare-sheet var(--duration-exit) var(--ease-standard) reverse; }
|
|
425
|
+
[data-sheet="right"] { --sheet-from: calc(var(--motion-distance) * 3) 0; }
|
|
426
|
+
[data-sheet="left"] { --sheet-from: calc(var(--motion-distance) * -3) 0; }
|
|
427
|
+
[data-sheet="top"] { --sheet-from: 0 calc(var(--motion-distance) * -1); }
|
|
428
|
+
@keyframes setsquare-fade { from { opacity: 0; } }
|
|
429
|
+
@keyframes setsquare-sheet { from { opacity: 0; translate: var(--sheet-from, 0 0); } }
|
|
430
|
+
@keyframes setsquare-toast { from { opacity: 0; translate: 0 var(--motion-distance); } }
|
|
431
|
+
|
|
432
|
+
/* ---------- view transitions: the shell is the anchor, content moves ---------- */
|
|
433
|
+
::view-transition { pointer-events: none; }
|
|
434
|
+
::view-transition-group(shell-header), ::view-transition-group(shell-sidebar), ::view-transition-group(site-header) { animation: none; z-index: 100; }
|
|
435
|
+
::view-transition-old(shell-header), ::view-transition-old(shell-sidebar), ::view-transition-old(site-header) { display: none; }
|
|
436
|
+
::view-transition-new(shell-header), ::view-transition-new(shell-sidebar), ::view-transition-new(site-header) { animation: none; }
|
|
437
|
+
/* A page leaves, then the next arrives. Chromium paints only the transition's images, so the new page is hidden
|
|
438
|
+
until its turn. Safari (WebKit) also paints the live new page beneath them, and ShellMain has no ground of its
|
|
439
|
+
own, so the new page would show through the old one as it leaves. So for exactly the exit, the old page's place
|
|
440
|
+
is covered with the ground ShellMain sits on, and the right panel's with its own: in both engines the old page
|
|
441
|
+
fades into the ground, then Safari shows the new page as the cover lifts and Chromium fades it in. The cover is
|
|
442
|
+
on the image pair, which holds only the old image. A right panel that stays crossfades in the browser's own way;
|
|
443
|
+
one that leaves (the next page has none) is opaque already, so it holds until the old page has gone and goes
|
|
444
|
+
with it, rather than fading over the new page in Safari. */
|
|
445
|
+
::view-transition-image-pair(.page-exit) { animation: var(--duration-exit) linear setsquare-cover; }
|
|
446
|
+
::view-transition-old(.page-exit) { animation: var(--duration-exit) var(--ease-standard) both setsquare-page-out; }
|
|
447
|
+
::view-transition-new(.page-enter) { animation: var(--duration-enter) var(--ease-standard) var(--duration-exit) both setsquare-page-in; }
|
|
448
|
+
::view-transition-old(shell-panel):only-child { animation: var(--duration-exit) step-end both setsquare-cut; }
|
|
449
|
+
@keyframes setsquare-cover { from, to { background-color: var(--background); } }
|
|
450
|
+
@keyframes setsquare-cut { to { opacity: 0; } }
|
|
451
|
+
::view-transition-old(.panel-swap) { animation: var(--duration-exit) var(--ease-standard) both setsquare-fade reverse; }
|
|
452
|
+
::view-transition-new(.panel-swap) { animation: var(--duration-enter) var(--ease-standard) both setsquare-fade; }
|
|
453
|
+
@keyframes setsquare-page-out { to { opacity: 0; translate: 0 calc(var(--motion-distance) * -1); } }
|
|
454
|
+
@keyframes setsquare-page-in { from { opacity: 0; translate: 0 var(--motion-distance); } }
|
|
455
|
+
|
|
456
|
+
@media (prefers-reduced-motion: reduce) {
|
|
457
|
+
[data-overlay], [data-sheet] { animation-duration: 0s !important; }
|
|
458
|
+
::view-transition-old(*), ::view-transition-new(*), ::view-transition-group(*) {
|
|
459
|
+
animation-duration: 0s !important;
|
|
460
|
+
animation-delay: 0s !important;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
@utility text-title {
|
|
465
|
+
font-family: var(--font-sans);
|
|
466
|
+
font-size: 24px;
|
|
467
|
+
line-height: 32px;
|
|
468
|
+
font-weight: 700;
|
|
469
|
+
letter-spacing: -0.01em;
|
|
470
|
+
}
|
|
471
|
+
@utility text-heading {
|
|
472
|
+
font-family: var(--font-sans);
|
|
473
|
+
font-size: 18px;
|
|
474
|
+
line-height: 28px;
|
|
475
|
+
font-weight: 600;
|
|
476
|
+
}
|
|
477
|
+
@utility text-subheading {
|
|
478
|
+
font-family: var(--font-sans);
|
|
479
|
+
font-size: 16px;
|
|
480
|
+
line-height: 24px;
|
|
481
|
+
font-weight: 600;
|
|
482
|
+
}
|
|
483
|
+
@utility text-body {
|
|
484
|
+
font-family: var(--font-sans);
|
|
485
|
+
font-size: 15px;
|
|
486
|
+
line-height: 24px;
|
|
487
|
+
font-weight: 400;
|
|
488
|
+
}
|
|
489
|
+
@utility text-ui {
|
|
490
|
+
font-family: var(--font-sans);
|
|
491
|
+
font-size: 14px;
|
|
492
|
+
line-height: 20px;
|
|
493
|
+
font-weight: 400;
|
|
494
|
+
}
|
|
495
|
+
@utility text-ui-strong {
|
|
496
|
+
font-family: var(--font-sans);
|
|
497
|
+
font-size: 14px;
|
|
498
|
+
line-height: 20px;
|
|
499
|
+
font-weight: 600;
|
|
500
|
+
}
|
|
501
|
+
@utility text-caption {
|
|
502
|
+
font-family: var(--font-sans);
|
|
503
|
+
font-size: 13px;
|
|
504
|
+
line-height: 20px;
|
|
505
|
+
font-weight: 400;
|
|
506
|
+
}
|
|
507
|
+
@utility text-caption-strong {
|
|
508
|
+
font-family: var(--font-sans);
|
|
509
|
+
font-size: 13px;
|
|
510
|
+
line-height: 20px;
|
|
511
|
+
font-weight: 600;
|
|
512
|
+
}
|
|
513
|
+
@utility text-display {
|
|
514
|
+
font-family: var(--font-sans);
|
|
515
|
+
font-size: clamp(36px, calc(1.6667rem + 2.9167 * var(--site-vw, 1vw)), 64px);
|
|
516
|
+
line-height: 1.05;
|
|
517
|
+
font-weight: 700;
|
|
518
|
+
letter-spacing: -0.02em;
|
|
519
|
+
overflow-wrap: break-word;
|
|
520
|
+
}
|
|
521
|
+
@utility text-display-page {
|
|
522
|
+
font-family: var(--font-sans);
|
|
523
|
+
font-size: clamp(32px, calc(1.6667rem + 1.6667 * var(--site-vw, 1vw)), 48px);
|
|
524
|
+
line-height: 1.1;
|
|
525
|
+
font-weight: 700;
|
|
526
|
+
letter-spacing: -0.015em;
|
|
527
|
+
overflow-wrap: break-word;
|
|
528
|
+
}
|
|
529
|
+
@utility text-display-section {
|
|
530
|
+
font-family: var(--font-sans);
|
|
531
|
+
font-size: clamp(24px, calc(1.25rem + 1.25 * var(--site-vw, 1vw)), 36px);
|
|
532
|
+
line-height: 1.15;
|
|
533
|
+
font-weight: 700;
|
|
534
|
+
letter-spacing: -0.01em;
|
|
535
|
+
overflow-wrap: break-word;
|
|
536
|
+
}
|
|
537
|
+
@utility text-lead {
|
|
538
|
+
font-family: var(--font-sans);
|
|
539
|
+
font-size: clamp(17px, calc(1rem + 0.3125 * var(--site-vw, 1vw)), 20px);
|
|
540
|
+
line-height: 1.5;
|
|
541
|
+
font-weight: 400;
|
|
542
|
+
overflow-wrap: break-word;
|
|
543
|
+
}
|
|
544
|
+
@utility text-code {
|
|
545
|
+
font-family: var(--font-mono);
|
|
546
|
+
font-size: 13px;
|
|
547
|
+
line-height: 20px;
|
|
548
|
+
font-weight: 400;
|
|
549
|
+
}
|
|
550
|
+
@custom-variant site-md {
|
|
551
|
+
@media (width >= 48rem) {
|
|
552
|
+
&:where(:not(.site-preview *)) {
|
|
553
|
+
@slot;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
@container site-preview (width >= 48rem) {
|
|
557
|
+
@slot;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
@custom-variant site-lg {
|
|
561
|
+
@media (width >= 64rem) {
|
|
562
|
+
&:where(:not(.site-preview *)) {
|
|
563
|
+
@slot;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
@container site-preview (width >= 64rem) {
|
|
567
|
+
@slot;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
@custom-variant site-xl {
|
|
571
|
+
@media (width >= 80rem) {
|
|
572
|
+
&:where(:not(.site-preview *)) {
|
|
573
|
+
@slot;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
@container site-preview (width >= 80rem) {
|
|
577
|
+
@slot;
|
|
578
|
+
}
|
|
579
|
+
}
|