@yuva-devlab/tokens 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.
Files changed (48) hide show
  1. package/.prettierignore +12 -0
  2. package/.turbo/turbo-build.log +18 -0
  3. package/CHANGELOG.md +14 -0
  4. package/README.md +56 -0
  5. package/dist/breakpoints.css.d.ts +13 -0
  6. package/dist/breakpoints.css.d.ts.map +1 -0
  7. package/dist/colors.css.d.ts +99 -0
  8. package/dist/colors.css.d.ts.map +1 -0
  9. package/dist/index.cjs +1 -0
  10. package/dist/index.d.ts +11 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +15 -0
  13. package/dist/palettes.css.d.ts +109 -0
  14. package/dist/palettes.css.d.ts.map +1 -0
  15. package/dist/radii.css.d.ts +15 -0
  16. package/dist/radii.css.d.ts.map +1 -0
  17. package/dist/shadows.css.d.ts +15 -0
  18. package/dist/shadows.css.d.ts.map +1 -0
  19. package/dist/spacing.css.d.ts +17 -0
  20. package/dist/spacing.css.d.ts.map +1 -0
  21. package/dist/themes.css.d.ts +7 -0
  22. package/dist/themes.css.d.ts.map +1 -0
  23. package/dist/tokens.css +1 -0
  24. package/dist/transitions.css.d.ts +20 -0
  25. package/dist/transitions.css.d.ts.map +1 -0
  26. package/dist/typography.css.d.ts +40 -0
  27. package/dist/typography.css.d.ts.map +1 -0
  28. package/dist/utils/color-generator.d.ts +39 -0
  29. package/dist/utils/color-generator.d.ts.map +1 -0
  30. package/dist/zindex.css.d.ts +16 -0
  31. package/dist/zindex.css.d.ts.map +1 -0
  32. package/eslint.config.js +8 -0
  33. package/package.json +46 -0
  34. package/prettier.config.js +1 -0
  35. package/src/breakpoints.css.ts +23 -0
  36. package/src/colors.css.ts +73 -0
  37. package/src/index.ts +16 -0
  38. package/src/palettes.css.ts +122 -0
  39. package/src/radii.css.ts +28 -0
  40. package/src/shadows.css.ts +28 -0
  41. package/src/spacing.css.ts +31 -0
  42. package/src/themes.css.ts +181 -0
  43. package/src/transitions.css.ts +38 -0
  44. package/src/typography.css.ts +77 -0
  45. package/src/utils/color-generator.ts +90 -0
  46. package/src/zindex.css.ts +29 -0
  47. package/tsconfig.json +12 -0
  48. package/vite.config.ts +31 -0
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@yuva-devlab/tokens",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "sideEffects": [
9
+ "**/*.css.ts",
10
+ "**/*.css"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ },
18
+ "./tokens.css": "./dist/tokens.css",
19
+ "./package.json": "./package.json"
20
+ },
21
+ "license": "MIT",
22
+ "devDependencies": {
23
+ "@vanilla-extract/vite-plugin": "^5.1.1",
24
+ "vite": "^7.2.4",
25
+ "vite-plugin-dts": "^4.5.4",
26
+ "@yuva-devlab/eslint-config": "0.1.0",
27
+ "@yuva-devlab/colors": "0.1.0",
28
+ "@yuva-devlab/prettier-config": "0.1.0",
29
+ "@yuva-devlab/typescript-config": "0.1.0"
30
+ },
31
+ "dependencies": {
32
+ "@vanilla-extract/css": "^1.17.4"
33
+ },
34
+ "scripts": {
35
+ "build": "vite build",
36
+ "lint": "eslint src",
37
+ "lint:fix": "eslint src --fix",
38
+ "format": "prettier --write .",
39
+ "format:check": "prettier --check .",
40
+ "type-check": "tsc --noEmit",
41
+ "clean:build": "rm -rf dist",
42
+ "clean:node_modules": "rm -rf node_modules",
43
+ "clean:turbo": "rm -rf .turbo",
44
+ "clean": "pnpm run clean:build && pnpm run clean:node_modules && pnpm run clean:turbo"
45
+ }
46
+ }
@@ -0,0 +1 @@
1
+ export { default } from "@yuva-devlab/prettier-config";
@@ -0,0 +1,23 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Responsive breakpoint tokens.
5
+ * Mobile-first approach aligned with common device sizes.
6
+ */
7
+ export const breakpoints = createThemeContract({
8
+ xs: null, // Mobile portrait
9
+ sm: null, // Mobile landscape
10
+ md: null, // Tablet
11
+ lg: null, // Desktop
12
+ xl: null, // Large desktop
13
+ "2xl": null, // Extra large desktop
14
+ });
15
+
16
+ createGlobalTheme(":root", breakpoints, {
17
+ xs: "0px",
18
+ sm: "640px",
19
+ md: "768px",
20
+ lg: "1024px",
21
+ xl: "1280px",
22
+ "2xl": "1536px",
23
+ });
@@ -0,0 +1,73 @@
1
+ import { createGlobalThemeContract } from "@vanilla-extract/css";
2
+
3
+ const semanticGroup = (
4
+ name: string,
5
+ ): {
6
+ main: string;
7
+ onMain: string;
8
+ container: string;
9
+ onContainer: string;
10
+ hover: string;
11
+ active: string;
12
+ subtle: string;
13
+ } => ({
14
+ main: `yd-color-${name}`,
15
+ onMain: `yd-color-on-${name}`,
16
+ container: `yd-color-${name}-container`,
17
+ onContainer: `yd-color-on-${name}-container`,
18
+ hover: `yd-color-${name}-hover`,
19
+ active: `yd-color-${name}-active`,
20
+ subtle: `yd-color-${name}-subtle`,
21
+ });
22
+
23
+ export const colors = createGlobalThemeContract({
24
+ // Semantic Brand Colors (Seed-based)
25
+ brand: {
26
+ primary: semanticGroup("primary"),
27
+ secondary: semanticGroup("secondary"),
28
+ tertiary: semanticGroup("tertiary"),
29
+ danger: semanticGroup("danger"),
30
+ success: semanticGroup("success"),
31
+ warning: semanticGroup("warning"),
32
+ info: semanticGroup("info"),
33
+ },
34
+
35
+ // Text Tokens
36
+ text: {
37
+ primary: "yd-color-text-primary",
38
+ secondary: "yd-color-text-secondary",
39
+ tertiary: "yd-color-text-tertiary",
40
+ disabled: "yd-color-text-disabled",
41
+ onPrimary: "yd-color-text-on-primary",
42
+ onColor: "yd-color-text-on-color",
43
+ inverse: "yd-color-text-inverse",
44
+ },
45
+
46
+ // Background Tokens
47
+ bg: {
48
+ body: "yd-color-bg-body",
49
+ surface: "yd-color-bg-surface",
50
+ surfaceHover: "yd-color-bg-surface-hover",
51
+ surfaceActive: "yd-color-bg-surface-active",
52
+ surfaceRaised: "yd-color-bg-surface-raised",
53
+ surfaceOverlay: "yd-color-bg-surface-overlay",
54
+ canvas: "yd-color-bg-canvas",
55
+ subtle: "yd-color-bg-subtle",
56
+ disabled: "yd-color-bg-disabled",
57
+ },
58
+
59
+ // Border Tokens
60
+ border: {
61
+ subtle: "yd-color-border-subtle",
62
+ default: "yd-color-border-default",
63
+ strong: "yd-color-border-strong",
64
+ interactive: "yd-color-border-interactive",
65
+ disabled: "yd-color-border-disabled",
66
+ },
67
+
68
+ // Interaction Tokens
69
+ interaction: {
70
+ focusRing: "yd-color-focus-ring",
71
+ overlay: "yd-color-overlay",
72
+ },
73
+ });
package/src/index.ts ADDED
@@ -0,0 +1,16 @@
1
+ export { colors } from "./colors.css";
2
+ export { spacing } from "./spacing.css";
3
+ export { typography } from "./typography.css";
4
+ export { radii } from "./radii.css";
5
+ export { shadows } from "./shadows.css";
6
+ export { transitions } from "./transitions.css";
7
+ export { breakpoints } from "./breakpoints.css";
8
+ export { zIndex } from "./zindex.css";
9
+ export { palettes } from "./palettes.css";
10
+
11
+ export {
12
+ // Semantic themes (primary API)
13
+ defaultTheme,
14
+ lightTheme,
15
+ darkTheme,
16
+ } from "./themes.css";
@@ -0,0 +1,122 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ import { generateTonalPalette } from "./utils/color-generator";
4
+
5
+ /**
6
+ * Seed colors for tonal palette generation
7
+ * These are the basis for the entire tonal system.
8
+ */
9
+ export const SEEDS = {
10
+ primary: "#3e6a4d",
11
+ secondary: "#516350",
12
+ tertiary: "#3b6470",
13
+ error: "#ba1a1a",
14
+ neutral: "#5e615b",
15
+ neutralVariant: "#5d6259",
16
+ };
17
+
18
+ /**
19
+ * Complete tonal palette system with 13 levels per color (0-100)
20
+ * These are the foundation colors that semantic tokens map to
21
+ */
22
+ export const palettes = createThemeContract({
23
+ primary: {
24
+ 0: null,
25
+ 10: null,
26
+ 20: null,
27
+ 30: null,
28
+ 40: null,
29
+ 50: null,
30
+ 60: null,
31
+ 70: null,
32
+ 80: null,
33
+ 90: null,
34
+ 95: null,
35
+ 99: null,
36
+ 100: null,
37
+ },
38
+ secondary: {
39
+ 0: null,
40
+ 10: null,
41
+ 20: null,
42
+ 30: null,
43
+ 40: null,
44
+ 50: null,
45
+ 60: null,
46
+ 70: null,
47
+ 80: null,
48
+ 90: null,
49
+ 95: null,
50
+ 99: null,
51
+ 100: null,
52
+ },
53
+ tertiary: {
54
+ 0: null,
55
+ 10: null,
56
+ 20: null,
57
+ 30: null,
58
+ 40: null,
59
+ 50: null,
60
+ 60: null,
61
+ 70: null,
62
+ 80: null,
63
+ 90: null,
64
+ 95: null,
65
+ 99: null,
66
+ 100: null,
67
+ },
68
+ error: {
69
+ 0: null,
70
+ 10: null,
71
+ 20: null,
72
+ 30: null,
73
+ 40: null,
74
+ 50: null,
75
+ 60: null,
76
+ 70: null,
77
+ 80: null,
78
+ 90: null,
79
+ 95: null,
80
+ 99: null,
81
+ 100: null,
82
+ },
83
+ neutral: {
84
+ 0: null,
85
+ 10: null,
86
+ 20: null,
87
+ 30: null,
88
+ 40: null,
89
+ 50: null,
90
+ 60: null,
91
+ 70: null,
92
+ 80: null,
93
+ 90: null,
94
+ 95: null,
95
+ 99: null,
96
+ 100: null,
97
+ },
98
+ neutralVariant: {
99
+ 0: null,
100
+ 10: null,
101
+ 20: null,
102
+ 30: null,
103
+ 40: null,
104
+ 50: null,
105
+ 60: null,
106
+ 70: null,
107
+ 80: null,
108
+ 90: null,
109
+ 95: null,
110
+ 99: null,
111
+ 100: null,
112
+ },
113
+ });
114
+
115
+ createGlobalTheme(":root", palettes, {
116
+ primary: generateTonalPalette(SEEDS.primary),
117
+ secondary: generateTonalPalette(SEEDS.secondary),
118
+ tertiary: generateTonalPalette(SEEDS.tertiary),
119
+ error: generateTonalPalette(SEEDS.error),
120
+ neutral: generateTonalPalette(SEEDS.neutral),
121
+ neutralVariant: generateTonalPalette(SEEDS.neutralVariant),
122
+ });
@@ -0,0 +1,28 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Border radius tokens for modern rounded aesthetic.
5
+ */
6
+ export const radii = createThemeContract({
7
+ none: null,
8
+ xs: null,
9
+ sm: null,
10
+ md: null,
11
+ lg: null,
12
+ xl: null,
13
+ "2xl": null,
14
+ "3xl": null,
15
+ full: null,
16
+ });
17
+
18
+ createGlobalTheme(":root", radii, {
19
+ none: "0",
20
+ xs: "2px",
21
+ sm: "4px",
22
+ md: "8px",
23
+ lg: "12px",
24
+ xl: "16px",
25
+ "2xl": "20px",
26
+ "3xl": "24px",
27
+ full: "9999px",
28
+ });
@@ -0,0 +1,28 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Provides depth and hierarchy through layered shadows.
5
+ */
6
+ export const shadows = createThemeContract({
7
+ none: null,
8
+ xs: null,
9
+ sm: null,
10
+ md: null,
11
+ lg: null,
12
+ xl: null,
13
+ "2xl": null,
14
+ inner: null,
15
+ focus: null, // Accessible focus indicator
16
+ });
17
+
18
+ createGlobalTheme(":root", shadows, {
19
+ none: "none",
20
+ xs: "0 1px 2px 0 rgba(60, 64, 67, 0.15)",
21
+ sm: "0 1px 3px 0 rgba(60, 64, 67, 0.15), 0 1px 2px 0 rgba(60, 64, 67, 0.10)",
22
+ md: "0 4px 6px -1px rgba(60, 64, 67, 0.15), 0 2px 4px -1px rgba(60, 64, 67, 0.10)",
23
+ lg: "0 10px 15px -3px rgba(60, 64, 67, 0.15), 0 4px 6px -2px rgba(60, 64, 67, 0.10)",
24
+ xl: "0 20px 25px -5px rgba(60, 64, 67, 0.15), 0 10px 10px -5px rgba(60, 64, 67, 0.10)",
25
+ "2xl": "0 25px 50px -12px rgba(60, 64, 67, 0.25)",
26
+ inner: "inset 0 2px 4px 0 rgba(60, 64, 67, 0.10)",
27
+ focus: "0 0 0 3px rgba(26, 115, 232, 0.2)",
28
+ });
@@ -0,0 +1,31 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Spacing tokens using 4px base unit for consistent rhythm.
5
+ * Expanded scale for granular control.
6
+ */
7
+ export const spacing = createThemeContract({
8
+ "2xs": null,
9
+ xs: null,
10
+ sm: null,
11
+ md: null,
12
+ lg: null,
13
+ xl: null,
14
+ "2xl": null,
15
+ "3xl": null,
16
+ "4xl": null,
17
+ "5xl": null,
18
+ });
19
+
20
+ createGlobalTheme(":root", spacing, {
21
+ "2xs": "2px",
22
+ xs: "4px",
23
+ sm: "8px",
24
+ md: "12px",
25
+ lg: "16px",
26
+ xl: "24px",
27
+ "2xl": "32px",
28
+ "3xl": "48px",
29
+ "4xl": "64px",
30
+ "5xl": "96px",
31
+ });
@@ -0,0 +1,181 @@
1
+ import {
2
+ createGlobalTheme,
3
+ createTheme,
4
+ globalStyle,
5
+ } from "@vanilla-extract/css";
6
+
7
+ import { colors } from "./colors.css";
8
+ import { palettes } from "./palettes.css";
9
+ import {
10
+ generateSemanticShades,
11
+ type SemanticShades,
12
+ type TonalPalette,
13
+ } from "./utils/color-generator";
14
+
15
+ /**
16
+ * Semantic Color Mapping
17
+ * Instead of hardcoding hex codes, we map semantic roles to specific tones
18
+ * in our foundation palettes. This ensures that changing a foundation seed
19
+ * updates the entire theme consistently.
20
+ */
21
+ const mapTones = (
22
+ palette: TonalPalette,
23
+ mainTone: keyof TonalPalette,
24
+ onMainTone: keyof TonalPalette,
25
+ containerTone: keyof TonalPalette,
26
+ onContainerTone: keyof TonalPalette,
27
+ ): SemanticShades => ({
28
+ main: palette[mainTone],
29
+ onMain: palette[onMainTone],
30
+ container: palette[containerTone],
31
+ onContainer: palette[onContainerTone],
32
+ // Tonal generation for interaction states
33
+ // Note: These can also be mapped if we add more tones to our foundation
34
+ hover: palette[mainTone === 40 ? 50 : 70], // Dynamic hover
35
+ active: palette[mainTone === 40 ? 60 : 60], // Dynamic active
36
+ subtle: palette[95],
37
+ });
38
+
39
+ /**
40
+ * ============================================================================
41
+ * SEMANTIC COLOR THEMES
42
+ * ============================================================================
43
+ * Developer-friendly API that maps to palette values
44
+ */
45
+
46
+ const primaryPalette = mapTones(palettes.primary, 40, 100, 90, 10);
47
+ const secondaryPalette = mapTones(palettes.secondary, 40, 100, 90, 10);
48
+ const tertiaryPalette = mapTones(palettes.tertiary, 40, 100, 90, 10);
49
+ const errorPalette = mapTones(palettes.error, 40, 100, 90, 10);
50
+
51
+ // We keep these as generated for now as they are distinct semantic scales
52
+ const successPalette = generateSemanticShades("#3e6a4d");
53
+ const warningPalette = generateSemanticShades("#815600");
54
+ const infoPalette = generateSemanticShades("#006682");
55
+
56
+ /**
57
+ * Light Theme - Semantic Colors
58
+ * Maps semantic tokens to appropriate palette tones globally on :root.
59
+ */
60
+ createGlobalTheme(":root", colors, {
61
+ brand: {
62
+ primary: primaryPalette,
63
+ secondary: secondaryPalette,
64
+ tertiary: tertiaryPalette,
65
+ danger: errorPalette,
66
+ success: successPalette,
67
+ warning: warningPalette,
68
+ info: infoPalette,
69
+ },
70
+
71
+ text: {
72
+ primary: palettes.neutral[10],
73
+ secondary: palettes.neutralVariant[30],
74
+ tertiary: palettes.neutralVariant[50],
75
+ disabled: palettes.neutral[80],
76
+ onPrimary: palettes.primary[100],
77
+ onColor: palettes.primary[100],
78
+ inverse: palettes.neutral[95],
79
+ },
80
+
81
+ bg: {
82
+ body: palettes.neutral[99],
83
+ surface: palettes.neutral[99],
84
+ surfaceHover: palettes.neutral[95],
85
+ surfaceActive: palettes.neutral[90],
86
+ surfaceRaised: palettes.neutral[100],
87
+ surfaceOverlay: palettes.neutral[100],
88
+ canvas: palettes.neutral[95],
89
+ subtle: palettes.primary[95],
90
+ disabled: palettes.neutral[90],
91
+ },
92
+
93
+ border: {
94
+ subtle: palettes.neutralVariant[90],
95
+ default: palettes.neutralVariant[50],
96
+ strong: palettes.neutralVariant[30],
97
+ interactive: palettes.primary[40],
98
+ disabled: palettes.neutralVariant[80],
99
+ },
100
+
101
+ interaction: {
102
+ focusRing: `0 0 0 3px ${palettes.primary[90]}`,
103
+ overlay: "rgba(0, 0, 0, 0.12)",
104
+ },
105
+ });
106
+
107
+ export const lightTheme = "light-theme";
108
+
109
+ /**
110
+ * Dark Theme - Semantic Colors
111
+ * Maps semantic tokens to appropriate palette tones for dark mode
112
+ */
113
+ const darkPrimaryPalette = mapTones(palettes.primary, 80, 20, 30, 90);
114
+ const darkSecondaryPalette = mapTones(palettes.secondary, 80, 20, 30, 90);
115
+ const darkTertiaryPalette = mapTones(palettes.tertiary, 80, 20, 30, 90);
116
+ const darkErrorPalette = mapTones(palettes.error, 80, 20, 30, 90);
117
+
118
+ const darkSuccessPalette = generateSemanticShades("#3e6a4d", "dark");
119
+ const darkWarningPalette = generateSemanticShades("#815600", "dark");
120
+ const darkInfoPalette = generateSemanticShades("#006682", "dark");
121
+
122
+ export const darkTheme = createTheme(colors, {
123
+ brand: {
124
+ primary: darkPrimaryPalette,
125
+ secondary: darkSecondaryPalette,
126
+ tertiary: darkTertiaryPalette,
127
+ danger: darkErrorPalette,
128
+ success: darkSuccessPalette,
129
+ warning: darkWarningPalette,
130
+ info: darkInfoPalette,
131
+ },
132
+
133
+ text: {
134
+ primary: palettes.neutral[90],
135
+ secondary: palettes.neutralVariant[80],
136
+ tertiary: palettes.neutralVariant[60],
137
+ disabled: palettes.neutral[30],
138
+ onPrimary: palettes.primary[20],
139
+ onColor: palettes.primary[10],
140
+ inverse: palettes.neutral[10],
141
+ },
142
+
143
+ bg: {
144
+ body: palettes.neutral[10],
145
+ surface: palettes.neutral[10],
146
+ surfaceHover: palettes.neutral[20],
147
+ surfaceActive: palettes.neutral[20],
148
+ surfaceRaised: palettes.neutral[20],
149
+ surfaceOverlay: palettes.neutral[20],
150
+ canvas: palettes.neutral[0],
151
+ subtle: palettes.primary[20],
152
+ disabled: palettes.neutral[20],
153
+ },
154
+
155
+ border: {
156
+ subtle: palettes.neutralVariant[30],
157
+ default: palettes.neutralVariant[60],
158
+ strong: palettes.neutralVariant[80],
159
+ interactive: palettes.primary[80],
160
+ disabled: palettes.neutralVariant[20],
161
+ },
162
+
163
+ interaction: {
164
+ focusRing: `0 0 0 3px ${palettes.primary[40]}`,
165
+ overlay: "rgba(255, 255, 255, 0.08)",
166
+ },
167
+ });
168
+
169
+ /**
170
+ * Default theme exports
171
+ */
172
+ export const defaultTheme = lightTheme;
173
+
174
+ /**
175
+ * Global Styles
176
+ * These ensure the core brand experience (like text selection) is consistent.
177
+ */
178
+ globalStyle("::selection", {
179
+ backgroundColor: colors.brand.primary.container,
180
+ color: colors.brand.primary.onContainer,
181
+ });
@@ -0,0 +1,38 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Transition and animation tokens.
5
+ */
6
+ export const transitions = createThemeContract({
7
+ duration: {
8
+ instant: null,
9
+ fast: null,
10
+ normal: null,
11
+ slow: null,
12
+ slower: null,
13
+ },
14
+ easing: {
15
+ standard: null, // Deceleration curve
16
+ emphasized: null, // emphasized easing
17
+ decelerate: null, // Exit animations
18
+ accelerate: null, // Enter animations
19
+ linear: null,
20
+ },
21
+ });
22
+
23
+ createGlobalTheme(":root", transitions, {
24
+ duration: {
25
+ instant: "0ms",
26
+ fast: "100ms",
27
+ normal: "200ms",
28
+ slow: "300ms",
29
+ slower: "500ms",
30
+ },
31
+ easing: {
32
+ standard: "cubic-bezier(0.4, 0.0, 0.2, 1)", // Deceleration
33
+ emphasized: "cubic-bezier(0.2, 0.0, 0, 1)", // emphasized
34
+ decelerate: "cubic-bezier(0.0, 0.0, 0.2, 1)", // Exit
35
+ accelerate: "cubic-bezier(0.4, 0.0, 1, 1)", // Enter
36
+ linear: "linear",
37
+ },
38
+ });
@@ -0,0 +1,77 @@
1
+ import { createGlobalTheme, createThemeContract } from "@vanilla-extract/css";
2
+
3
+ /**
4
+ * Typography tokens using modern font stack.
5
+ * Expanded scale for modern web applications.
6
+ */
7
+ export const typography = createThemeContract({
8
+ fonts: {
9
+ sans: null,
10
+ mono: null,
11
+ display: null,
12
+ },
13
+ fontSizes: {
14
+ xs: null,
15
+ sm: null,
16
+ md: null,
17
+ lg: null,
18
+ xl: null,
19
+ "2xl": null,
20
+ "3xl": null,
21
+ "4xl": null,
22
+ "5xl": null,
23
+ "6xl": null,
24
+ },
25
+ fontWeights: {
26
+ regular: null,
27
+ medium: null,
28
+ semibold: null,
29
+ bold: null,
30
+ },
31
+ lineHeights: {
32
+ tight: null,
33
+ normal: null,
34
+ relaxed: null,
35
+ },
36
+ letterSpacing: {
37
+ tight: null,
38
+ normal: null,
39
+ wide: null,
40
+ },
41
+ });
42
+
43
+ createGlobalTheme(":root", typography, {
44
+ fonts: {
45
+ sans: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
46
+ mono: '"Roboto Mono", "SF Mono", Monaco, "Cascadia Code", "Courier New", monospace',
47
+ display: '"Inter", -apple-system, BlinkMacSystemFont, sans-serif',
48
+ },
49
+ fontSizes: {
50
+ xs: "0.75rem", // 12px
51
+ sm: "0.875rem", // 14px
52
+ md: "1rem", // 16px
53
+ lg: "1.125rem", // 18px
54
+ xl: "1.25rem", // 20px
55
+ "2xl": "1.5rem", // 24px
56
+ "3xl": "1.875rem", // 30px
57
+ "4xl": "2.25rem", // 36px
58
+ "5xl": "3rem", // 48px
59
+ "6xl": "3.75rem", // 60px
60
+ },
61
+ fontWeights: {
62
+ regular: "400",
63
+ medium: "500",
64
+ semibold: "600",
65
+ bold: "700",
66
+ },
67
+ lineHeights: {
68
+ tight: "1.25",
69
+ normal: "1.5",
70
+ relaxed: "1.75",
71
+ },
72
+ letterSpacing: {
73
+ tight: "-0.01em",
74
+ normal: "0",
75
+ wide: "0.025em",
76
+ },
77
+ });