@rdna/radiants 0.1.3 → 0.1.4
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/base.css +1 -1
- package/components/core/AppWindow/AppWindow.meta.ts +69 -0
- package/components/core/AppWindow/AppWindow.schema.json +55 -0
- package/components/core/AppWindow/AppWindow.test.tsx +150 -0
- package/components/core/AppWindow/AppWindow.tsx +830 -0
- package/components/core/Button/Button.test.tsx +18 -0
- package/components/core/Button/Button.tsx +26 -16
- package/components/core/DialPanel/DialPanel.tsx +1 -1
- package/components/core/Separator/Separator.tsx +1 -1
- package/components/core/Tabs/Tabs.tsx +14 -2
- package/components/core/__tests__/smoke.test.tsx +2 -0
- package/components/core/index.ts +1 -0
- package/contract/system.ts +18 -4
- package/dark.css +11 -1
- package/eslint/contract.mjs +1 -1
- package/eslint/index.mjs +10 -0
- package/eslint/rules/no-raw-font-family.mjs +91 -0
- package/eslint/rules/no-raw-line-height.mjs +119 -0
- package/fonts-core.css +70 -0
- package/fonts-editorial.css +45 -0
- package/fonts.css +19 -89
- package/generated/ai-contract.json +11 -2
- package/generated/contract.freshness.json +2 -1
- package/generated/eslint-contract.json +35 -4
- package/generated/figma/contracts/app-window.contract.json +82 -0
- package/generated/figma/primitive/color.tokens.json +9 -0
- package/generated/figma/primitive/shape.tokens.json +0 -4
- package/generated/figma/primitive/typography.tokens.json +16 -4
- package/generated/figma/rdna.tokens.json +28 -11
- package/generated/figma/semantic/semantic.tokens.json +3 -3
- package/generated/figma/tokens.d.ts +1 -1
- package/generated/figma/validation-report.json +1 -1
- package/icons/DesktopIcons.tsx +4 -3
- package/icons/Icon.tsx +10 -2
- package/icons/types.ts +7 -1
- package/meta/index.ts +6 -0
- package/package.json +5 -3
- package/patterns/pretext-type-scale.ts +115 -0
- package/pixel-corners.generated.css +15 -0
- package/schemas/index.ts +2 -0
- package/tokens.css +47 -21
- package/typography.css +10 -5
- package/fonts/PixelCode-Black-Italic.woff2 +0 -0
- package/fonts/PixelCode-Black.woff2 +0 -0
- package/fonts/PixelCode-DemiBold-Italic.woff2 +0 -0
- package/fonts/PixelCode-DemiBold.woff2 +0 -0
- package/fonts/PixelCode-ExtraBlack-Italic.woff2 +0 -0
- package/fonts/PixelCode-ExtraBlack.woff2 +0 -0
- package/fonts/PixelCode-ExtraBold-Italic.woff2 +0 -0
- package/fonts/PixelCode-ExtraBold.woff2 +0 -0
- package/fonts/PixelCode-ExtraLight-Italic.woff2 +0 -0
- package/fonts/PixelCode-ExtraLight.woff2 +0 -0
- package/fonts/PixelCode-Thin-Italic.woff2 +0 -0
- package/fonts/PixelCode-Thin.woff2 +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pretext Type Scale — JS-native fluid typography for canvas-based layouts.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for text sizing in pretext consumers (GoodNews,
|
|
5
|
+
* editorial layouts, future content apps). Mirrors the design intent of the
|
|
6
|
+
* CSS fluid tokens in tokens.css but lives entirely in JS — no DOM, no
|
|
7
|
+
* reflow, no CSS dependency.
|
|
8
|
+
*
|
|
9
|
+
* Each tier defines a clamp(min, base + coeff × containerWidth/100, max)
|
|
10
|
+
* curve. The formula is identical to the CSS `clamp(min, base + Ncqi, max)`
|
|
11
|
+
* pattern, where 1cqi = 1% of container inline size.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* import { resolveFluid, fluidType } from '@rdna/radiants/patterns/pretext-type-scale'
|
|
15
|
+
* const fontSize = resolveFluid('xl', containerWidth) // → px number
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Scale definitions (px values — pretext operates in px)
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
export interface FluidTier {
|
|
23
|
+
/** Minimum size in px (floor) */
|
|
24
|
+
min: number;
|
|
25
|
+
/** Base offset in px (intercept when containerWidth = 0) */
|
|
26
|
+
base: number;
|
|
27
|
+
/** Scaling coefficient (multiplied by containerWidth / 100) */
|
|
28
|
+
coeff: number;
|
|
29
|
+
/** Maximum size in px (ceiling) */
|
|
30
|
+
max: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Fluid type tiers — each maps to the equivalent CSS fluid token.
|
|
35
|
+
*
|
|
36
|
+
* The preferred value is: base + coeff × (containerWidth / 100)
|
|
37
|
+
* This mirrors CSS: base_rem + coeff_cqi where 1cqi = 1% of container.
|
|
38
|
+
*
|
|
39
|
+
* Values derived from the CSS tokens (rem × 16 = px):
|
|
40
|
+
* --font-size-fluid-sm: clamp(0.75rem, 0.7rem + 0.25cqi, 0.875rem)
|
|
41
|
+
* --font-size-fluid-base: clamp(0.875rem, 0.8rem + 0.5cqi, 1.125rem)
|
|
42
|
+
* --font-size-fluid-lg: clamp(1rem, 0.9rem + 0.75cqi, 1.5rem)
|
|
43
|
+
* --font-size-fluid-xl: clamp(1.25rem, 1rem + 1.25cqi, 2rem)
|
|
44
|
+
* --font-size-fluid-2xl: clamp(1.5rem, 1.2rem + 1.75cqi, 2.5rem)
|
|
45
|
+
* --font-size-fluid-3xl: clamp(1.75rem, 1.4rem + 2.5cqi, 3.5rem)
|
|
46
|
+
* --font-size-fluid-4xl: clamp(2rem, 1.5rem + 3.5cqi, 4.5rem)
|
|
47
|
+
*/
|
|
48
|
+
export const fluidType = {
|
|
49
|
+
sm: { min: 12, base: 11.2, coeff: 0.04, max: 14 },
|
|
50
|
+
base: { min: 14, base: 12.8, coeff: 0.08, max: 18 },
|
|
51
|
+
lg: { min: 16, base: 14.4, coeff: 0.12, max: 24 },
|
|
52
|
+
xl: { min: 20, base: 16, coeff: 0.20, max: 32 },
|
|
53
|
+
'2xl': { min: 24, base: 19.2, coeff: 0.28, max: 40 },
|
|
54
|
+
'3xl': { min: 28, base: 22.4, coeff: 0.40, max: 56 },
|
|
55
|
+
'4xl': { min: 32, base: 24, coeff: 0.56, max: 72 },
|
|
56
|
+
} as const satisfies Record<string, FluidTier>;
|
|
57
|
+
|
|
58
|
+
export type FluidTierName = keyof typeof fluidType;
|
|
59
|
+
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Resolver
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compute fluid font size for a given tier and container width.
|
|
66
|
+
*
|
|
67
|
+
* Returns a smooth px value — no Math.round stepping. The caller decides
|
|
68
|
+
* whether to round (canvas measureText handles fractional px fine).
|
|
69
|
+
*
|
|
70
|
+
* @param tier - Named tier from the scale (e.g. 'xl', '3xl')
|
|
71
|
+
* @param containerWidth - Width of the layout container in px
|
|
72
|
+
*/
|
|
73
|
+
export function resolveFluid(tier: FluidTierName, containerWidth: number): number {
|
|
74
|
+
const { min, base, coeff, max } = fluidType[tier];
|
|
75
|
+
return Math.min(max, Math.max(min, base + coeff * containerWidth / 100));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Resolve fluid size from raw tier parameters (for one-off overrides).
|
|
80
|
+
*/
|
|
81
|
+
export function resolveFluidRaw(tier: FluidTier, containerWidth: number): number {
|
|
82
|
+
const { min, base, coeff, max } = tier;
|
|
83
|
+
return Math.min(max, Math.max(min, base + coeff * containerWidth / 100));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Spacing scale — all values are multipliers of bodyLh
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Named spacing roles for editorial layouts.
|
|
92
|
+
*
|
|
93
|
+
* Every spacing value is a multiplier of `bodyLh` (body line-height) so
|
|
94
|
+
* spacing scales proportionally with type size. No magic pixel values.
|
|
95
|
+
*
|
|
96
|
+
* Usage:
|
|
97
|
+
* const gap = bodyLh * spacing.paragraph;
|
|
98
|
+
* const sectionBreak = bodyLh * spacing.section;
|
|
99
|
+
*/
|
|
100
|
+
export const spacing = {
|
|
101
|
+
/** Between paragraphs in the same section */
|
|
102
|
+
paragraph: 0.75,
|
|
103
|
+
/** Before a heading (establishes new section) */
|
|
104
|
+
headingBefore: 1.5,
|
|
105
|
+
/** After a heading (ties heading to its content) */
|
|
106
|
+
headingAfter: 0.5,
|
|
107
|
+
/** Around horizontal rules */
|
|
108
|
+
rule: 0.5,
|
|
109
|
+
/** Between major sections (rule + gap) */
|
|
110
|
+
section: 2,
|
|
111
|
+
/** Column gutter (between column rules) */
|
|
112
|
+
column: 0.5,
|
|
113
|
+
} as const;
|
|
114
|
+
|
|
115
|
+
export type SpacingRole = keyof typeof spacing;
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
.pixel-rounded-xl::after,
|
|
18
18
|
.pixel-rounded-xl--wrapper::after,
|
|
19
19
|
.pixel-rounded-t-sm-b-md::after,
|
|
20
|
+
.pixel-rounded-t-sm::after,
|
|
20
21
|
.pixel-rounded-l-sm::after,
|
|
21
22
|
.pixel-rounded-sm-notl::after {
|
|
22
23
|
content: "";
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
.pixel-rounded-xl,
|
|
47
48
|
.pixel-rounded-xl--wrapper,
|
|
48
49
|
.pixel-rounded-t-sm-b-md,
|
|
50
|
+
.pixel-rounded-t-sm,
|
|
49
51
|
.pixel-rounded-l-sm,
|
|
50
52
|
.pixel-rounded-sm-notl {
|
|
51
53
|
position: relative;
|
|
@@ -58,6 +60,7 @@
|
|
|
58
60
|
.pixel-corners,
|
|
59
61
|
.pixel-rounded-xl,
|
|
60
62
|
.pixel-rounded-t-sm-b-md,
|
|
63
|
+
.pixel-rounded-t-sm,
|
|
61
64
|
.pixel-rounded-l-sm,
|
|
62
65
|
.pixel-rounded-sm-notl {
|
|
63
66
|
border: 1px solid transparent;
|
|
@@ -88,6 +91,10 @@
|
|
|
88
91
|
border-radius: 0;
|
|
89
92
|
}
|
|
90
93
|
|
|
94
|
+
.pixel-rounded-t-sm {
|
|
95
|
+
border-radius: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
91
98
|
.pixel-rounded-l-sm {
|
|
92
99
|
border-radius: 0;
|
|
93
100
|
}
|
|
@@ -198,6 +205,14 @@
|
|
|
198
205
|
clip-path: polygon(0px calc(100% - 9px), 1px calc(100% - 9px), 1px calc(100% - 8px), 1px calc(100% - 6px), 2px calc(100% - 6px), 2px calc(100% - 5px), 3px calc(100% - 5px), 3px calc(100% - 4px), 4px calc(100% - 3px), 5px calc(100% - 3px), 5px calc(100% - 2px), 6px calc(100% - 2px), 6px calc(100% - 1px), 8px calc(100% - 1px), 9px calc(100% - 1px), 9px 100%, calc(100% - 9px) 100%, calc(100% - 9px) calc(100% - 1px), calc(100% - 8px) calc(100% - 1px), calc(100% - 6px) calc(100% - 1px), calc(100% - 6px) calc(100% - 2px), calc(100% - 5px) calc(100% - 2px), calc(100% - 5px) calc(100% - 3px), calc(100% - 4px) calc(100% - 3px), calc(100% - 3px) calc(100% - 4px), calc(100% - 3px) calc(100% - 5px), calc(100% - 2px) calc(100% - 5px), calc(100% - 2px) calc(100% - 6px), calc(100% - 1px) calc(100% - 6px), calc(100% - 1px) calc(100% - 8px), calc(100% - 1px) calc(100% - 9px), 100% calc(100% - 9px), 100% 5px, calc(100% - 1px) 5px, calc(100% - 1px) 3px, calc(100% - 2px) 3px, calc(100% - 2px) 2px, calc(100% - 3px) 2px, calc(100% - 3px) 1px, calc(100% - 5px) 1px, calc(100% - 5px) 0px, 5px 0px, 5px 1px, 3px 1px, 3px 2px, 2px 2px, 2px 3px, 1px 3px, 1px 5px, 0px 5px, 0px 50%, 1px 50%, 1px 5px, 2px 5px, 2px 3px, 3px 3px, 3px 2px, 5px 2px, 5px 1px, calc(100% - 5px) 1px, calc(100% - 5px) 2px, calc(100% - 3px) 2px, calc(100% - 3px) 3px, calc(100% - 2px) 3px, calc(100% - 2px) 5px, calc(100% - 1px) 5px, calc(100% - 1px) calc(100% - 9px), calc(100% - 2px) calc(100% - 9px), calc(100% - 2px) calc(100% - 8px), calc(100% - 2px) calc(100% - 6px), calc(100% - 3px) calc(100% - 6px), calc(100% - 3px) calc(100% - 5px), calc(100% - 4px) calc(100% - 5px), calc(100% - 4px) calc(100% - 4px), calc(100% - 5px) calc(100% - 4px), calc(100% - 5px) calc(100% - 3px), calc(100% - 6px) calc(100% - 3px), calc(100% - 6px) calc(100% - 2px), calc(100% - 8px) calc(100% - 2px), calc(100% - 9px) calc(100% - 2px), calc(100% - 9px) calc(100% - 1px), 9px calc(100% - 1px), 9px calc(100% - 2px), 8px calc(100% - 2px), 6px calc(100% - 2px), 6px calc(100% - 3px), 5px calc(100% - 3px), 5px calc(100% - 4px), 4px calc(100% - 4px), 4px calc(100% - 5px), 3px calc(100% - 5px), 3px calc(100% - 6px), 2px calc(100% - 6px), 2px calc(100% - 8px), 2px calc(100% - 9px), 1px calc(100% - 9px), 1px 50%, 0px 50%);
|
|
199
206
|
}
|
|
200
207
|
|
|
208
|
+
.pixel-rounded-t-sm {
|
|
209
|
+
clip-path: polygon(0px 100%, 100% 100%, 100% 5px, calc(100% - 1px) 5px, calc(100% - 1px) 3px, calc(100% - 2px) 3px, calc(100% - 2px) 2px, calc(100% - 3px) 2px, calc(100% - 3px) 1px, calc(100% - 5px) 1px, calc(100% - 5px) 0px, 5px 0px, 5px 1px, 3px 1px, 3px 2px, 2px 2px, 2px 3px, 1px 3px, 1px 5px, 0px 5px);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.pixel-rounded-t-sm::after {
|
|
213
|
+
clip-path: polygon(0px 100%, 100% 100%, 100% 5px, calc(100% - 1px) 5px, calc(100% - 1px) 3px, calc(100% - 2px) 3px, calc(100% - 2px) 2px, calc(100% - 3px) 2px, calc(100% - 3px) 1px, calc(100% - 5px) 1px, calc(100% - 5px) 0px, 5px 0px, 5px 1px, 3px 1px, 3px 2px, 2px 2px, 2px 3px, 1px 3px, 1px 5px, 0px 5px, 0px 50%, 1px 50%, 1px 5px, 2px 5px, 2px 3px, 3px 3px, 3px 2px, 5px 2px, 5px 1px, calc(100% - 5px) 1px, calc(100% - 5px) 2px, calc(100% - 3px) 2px, calc(100% - 3px) 3px, calc(100% - 2px) 3px, calc(100% - 2px) 5px, calc(100% - 1px) 5px, calc(100% - 1px) 100%, 1px 100%, 1px 50%, 0px 50%);
|
|
214
|
+
}
|
|
215
|
+
|
|
201
216
|
.pixel-rounded-l-sm {
|
|
202
217
|
clip-path: polygon(0px calc(100% - 5px), 1px calc(100% - 5px), 1px calc(100% - 3px), 2px calc(100% - 3px), 2px calc(100% - 2px), 3px calc(100% - 2px), 3px calc(100% - 1px), 5px calc(100% - 1px), 5px 100%, 100% 100%, 100% 0px, 5px 0px, 5px 1px, 3px 1px, 3px 2px, 2px 2px, 2px 3px, 1px 3px, 1px 5px, 0px 5px);
|
|
203
218
|
}
|
package/schemas/index.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import AlertSchema from "../components/core/Alert/Alert.schema.json";
|
|
5
5
|
import AlertDialogSchema from "../components/core/AlertDialog/AlertDialog.schema.json";
|
|
6
|
+
import AppWindowSchema from "../components/core/AppWindow/AppWindow.schema.json";
|
|
6
7
|
import AvatarSchema from "../components/core/Avatar/Avatar.schema.json";
|
|
7
8
|
import BadgeSchema from "../components/core/Badge/Badge.schema.json";
|
|
8
9
|
import BreadcrumbsSchema from "../components/core/Breadcrumbs/Breadcrumbs.schema.json";
|
|
@@ -45,6 +46,7 @@ import TooltipSchema from "../components/core/Tooltip/Tooltip.schema.json";
|
|
|
45
46
|
export const componentData = {
|
|
46
47
|
Alert: { schema: AlertSchema },
|
|
47
48
|
AlertDialog: { schema: AlertDialogSchema },
|
|
49
|
+
AppWindow: { schema: AppWindowSchema },
|
|
48
50
|
Avatar: { schema: AvatarSchema },
|
|
49
51
|
Badge: { schema: BadgeSchema },
|
|
50
52
|
Breadcrumbs: { schema: BreadcrumbsSchema },
|
package/tokens.css
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
--color-pure-black: oklch(0.0000 0.0000 0); /* was #000000 */
|
|
15
15
|
--color-sun-yellow: oklch(0.9126 0.1170 93.68); /* was #FCE184 */
|
|
16
16
|
--color-sky-blue: oklch(0.7701 0.0527 236.81); /* was #95BAD2 */
|
|
17
|
+
--color-sky-blue-dark: oklch(0.47 0.08 237); /* WCAG AA compliant on cream bg (~6:1 contrast) */
|
|
17
18
|
--color-sunset-fuzz: oklch(0.8546 0.1039 68.93); /* was #FCC383 */
|
|
18
19
|
--color-sun-red: oklch(0.7429 0.1568 21.43); /* was #FF7F7F */
|
|
19
20
|
--color-mint: oklch(0.9312 0.0702 142.51); /* was #CEF5CA */
|
|
@@ -46,7 +47,7 @@
|
|
|
46
47
|
--color-sub: oklch(0.1641 0.0044 84.59 / 0.85);
|
|
47
48
|
--color-mute: oklch(0.1641 0.0044 84.59 / 0.6);
|
|
48
49
|
--color-flip: var(--color-cream);
|
|
49
|
-
--color-link: var(--color-sky-blue);
|
|
50
|
+
--color-link: var(--color-sky-blue-dark);
|
|
50
51
|
|
|
51
52
|
/* Borders */
|
|
52
53
|
--color-line: var(--color-ink);
|
|
@@ -64,7 +65,7 @@
|
|
|
64
65
|
--color-content-secondary: oklch(0.1641 0.0044 84.59 / 0.85); /* was rgba(15, 14, 12, 0.85) */
|
|
65
66
|
--color-content-inverted: var(--color-cream);
|
|
66
67
|
--color-content-muted: oklch(0.1641 0.0044 84.59 / 0.6); /* was rgba(15, 14, 12, 0.6) */
|
|
67
|
-
--color-content-link: var(--color-sky-blue);
|
|
68
|
+
--color-content-link: var(--color-sky-blue-dark);
|
|
68
69
|
|
|
69
70
|
/* ============================================
|
|
70
71
|
SEMANTIC TOKENS - Edge
|
|
@@ -181,16 +182,21 @@
|
|
|
181
182
|
|
|
182
183
|
/* ============================================
|
|
183
184
|
TYPOGRAPHY SCALE
|
|
184
|
-
|
|
185
|
+
Perfect fourth (1.333) from 16px base.
|
|
186
|
+
xs/sm are fixed for UI legibility.
|
|
187
|
+
base -> 5xl follow the ratio.
|
|
185
188
|
============================================ */
|
|
186
189
|
|
|
187
|
-
--font-size-xs: 0.625rem;
|
|
188
|
-
--font-size-sm: 0.75rem;
|
|
189
|
-
--font-size-base: 1rem;
|
|
190
|
-
--font-size-lg: 1.
|
|
191
|
-
--font-size-xl: 1.
|
|
192
|
-
--font-size-2xl:
|
|
193
|
-
--font-size-3xl:
|
|
190
|
+
--font-size-xs: 0.625rem; /* 10px - fixed: small labels */
|
|
191
|
+
--font-size-sm: 0.75rem; /* 12px - fixed: buttons, small UI */
|
|
192
|
+
--font-size-base: 1rem; /* 16px - base */
|
|
193
|
+
--font-size-lg: 1.333rem; /* ~21px - base x 1.333 */
|
|
194
|
+
--font-size-xl: 1.777rem; /* ~28px - base x 1.333^2 */
|
|
195
|
+
--font-size-2xl: 2.369rem; /* ~38px - base x 1.333^3 */
|
|
196
|
+
--font-size-3xl: 3.157rem; /* ~50px - base x 1.333^4 */
|
|
197
|
+
--font-size-4xl: 4.209rem; /* ~67px - base x 1.333^5 */
|
|
198
|
+
--font-size-5xl: 5.61rem; /* ~90px - base x 1.333^6 */
|
|
199
|
+
--font-size-display: 5.61rem; /* alias: same as 5xl, named for hero/display use */
|
|
194
200
|
|
|
195
201
|
/* ============================================
|
|
196
202
|
MOTION - Duration
|
|
@@ -237,17 +243,6 @@
|
|
|
237
243
|
|
|
238
244
|
--touch-target-min: 44px; /* WCAG AA minimum */
|
|
239
245
|
--touch-target-comfortable: 48px;
|
|
240
|
-
--touch-target-default: var(--touch-target-comfortable);
|
|
241
|
-
|
|
242
|
-
/* ============================================
|
|
243
|
-
DENSITY
|
|
244
|
-
Attribute-driven spacing/touch affordances
|
|
245
|
-
============================================ */
|
|
246
|
-
|
|
247
|
-
--density-compact: 0.5;
|
|
248
|
-
--density-default: 1;
|
|
249
|
-
--density-comfortable: 1.5;
|
|
250
|
-
--density-scale: var(--density-comfortable);
|
|
251
246
|
|
|
252
247
|
/* ============================================
|
|
253
248
|
Z-INDEX SCALE
|
|
@@ -267,6 +262,37 @@
|
|
|
267
262
|
--z-index-system: 900; /* Invert overlay, system effects */
|
|
268
263
|
}
|
|
269
264
|
|
|
265
|
+
/* =============================================================================
|
|
266
|
+
FLUID TYPOGRAPHY
|
|
267
|
+
Container-query-based fluid scaling.
|
|
268
|
+
Uses cqi (container query inline) units so text scales with
|
|
269
|
+
AppWindow width, not viewport.
|
|
270
|
+
|
|
271
|
+
Formula: clamp(min, preferred, max)
|
|
272
|
+
Preferred uses cqi to create smooth scaling.
|
|
273
|
+
Min/max lock to slightly below/above the static scale values.
|
|
274
|
+
|
|
275
|
+
Outside a container context cqi resolves to 0, so the clamp()
|
|
276
|
+
min value takes over — safe for Taskbar, StartMenu, etc.
|
|
277
|
+
|
|
278
|
+
Placed in @layer base (not @theme) because cqi is a runtime-
|
|
279
|
+
relative unit that Tailwind v4 cannot resolve at build time.
|
|
280
|
+
Use via: text-[length:var(--font-size-fluid-base)] syntax,
|
|
281
|
+
or apply directly in CSS: font-size: var(--font-size-fluid-lg).
|
|
282
|
+
============================================================================= */
|
|
283
|
+
|
|
284
|
+
@layer base {
|
|
285
|
+
:root {
|
|
286
|
+
--font-size-fluid-sm: clamp(0.75rem, 0.7rem + 0.25cqi, 0.875rem);
|
|
287
|
+
--font-size-fluid-base: clamp(0.875rem, 0.8rem + 0.5cqi, 1.125rem);
|
|
288
|
+
--font-size-fluid-lg: clamp(1rem, 0.9rem + 0.75cqi, 1.5rem);
|
|
289
|
+
--font-size-fluid-xl: clamp(1.25rem, 1rem + 1.25cqi, 2rem);
|
|
290
|
+
--font-size-fluid-2xl: clamp(1.5rem, 1.2rem + 1.75cqi, 2.5rem);
|
|
291
|
+
--font-size-fluid-3xl: clamp(1.75rem, 1.4rem + 2.5cqi, 3.5rem);
|
|
292
|
+
--font-size-fluid-4xl: clamp(2rem, 1.5rem + 3.5cqi, 4.5rem);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
270
296
|
/* =============================================================================
|
|
271
297
|
REDUCED MOTION SUPPORT
|
|
272
298
|
Respects user preference for reduced motion
|
package/typography.css
CHANGED
|
@@ -11,23 +11,28 @@
|
|
|
11
11
|
============================================ */
|
|
12
12
|
|
|
13
13
|
h1 {
|
|
14
|
-
@apply
|
|
14
|
+
@apply font-heading font-bold leading-none tracking-tight text-main;
|
|
15
|
+
font-size: var(--font-size-fluid-4xl);
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
h2 {
|
|
18
|
-
@apply
|
|
19
|
+
@apply font-heading font-normal leading-none tracking-tight text-main;
|
|
20
|
+
font-size: var(--font-size-fluid-3xl);
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
h3 {
|
|
22
|
-
@apply
|
|
24
|
+
@apply font-heading font-semibold leading-none tracking-tight text-main;
|
|
25
|
+
font-size: var(--font-size-fluid-2xl);
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
h4 {
|
|
26
|
-
@apply
|
|
29
|
+
@apply font-heading font-medium leading-none tracking-tight text-main;
|
|
30
|
+
font-size: var(--font-size-fluid-xl);
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
h5 {
|
|
30
|
-
@apply
|
|
34
|
+
@apply font-heading font-medium leading-none tracking-tight text-main;
|
|
35
|
+
font-size: var(--font-size-fluid-lg);
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
h6 {
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|