@regardio/brand 0.7.7 → 0.8.1

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 (44) hide show
  1. package/README.md +53 -6
  2. package/dist/components/button.d.mts +21 -0
  3. package/dist/components/button.mjs +13 -0
  4. package/dist/components/button.stories.d.mts +13750 -0
  5. package/dist/components/button.stories.mjs +81 -0
  6. package/dist/generated/icons/regardio-compass-icon.mjs +3 -5
  7. package/dist/generated/icons/regardio-ensemble-icon-color-full.mjs +118 -132
  8. package/dist/generated/icons/regardio-ensemble-icon-color.mjs +119 -133
  9. package/dist/generated/icons/regardio-ensemble-icon-mono.mjs +59 -30
  10. package/dist/generated/icons/regardio-icon-color-full.mjs +1 -3
  11. package/dist/generated/icons/regardio-icon-color.mjs +1 -3
  12. package/dist/generated/icons/regardio-icon-mono.mjs +4 -6
  13. package/dist/generated/icons/regardio-logo-color-light.mjs +1 -3
  14. package/dist/generated/icons/regardio-logo-color.mjs +3 -5
  15. package/dist/generated/icons/regardio-logo-mono-light.mjs +1 -3
  16. package/dist/generated/icons/regardio-logo-mono.mjs +2 -4
  17. package/dist/generated/icons/regardio-system-bridge-icon.mjs +2 -4
  18. package/dist/generated/icons/regardio-system-circle-icon.mjs +3 -5
  19. package/dist/generated/icons/regardio-system-facet-icon.mjs +3 -5
  20. package/dist/generated/icons/regardio-system-icon.mjs +1 -3
  21. package/dist/generated/icons/regardio-system-plan-icon.mjs +2 -4
  22. package/dist/generated/icons/regardio-system-pursuit-icon.mjs +3 -5
  23. package/dist/generated/icons/regardio-system-spark-icon.mjs +1 -3
  24. package/dist/generated/icons/regardio-system-zest-icon.d.mts +14 -0
  25. package/dist/generated/icons/regardio-system-zest-icon.mjs +19 -0
  26. package/dist/generated/sprites/compass-sprite-provider.mjs +190 -215
  27. package/dist/generated/sprites/compass-sprite.d.mts +1 -1
  28. package/dist/generated/sprites/compass-sprite.mjs +1 -3
  29. package/dist/styles/base.css +76 -0
  30. package/dist/styles/colors.css +178 -0
  31. package/dist/styles/grid.css +60 -0
  32. package/dist/styles/index.css +27 -0
  33. package/dist/styles/storybook.css +2 -0
  34. package/dist/styles/tokens.css +134 -0
  35. package/dist/styles/typography.css +140 -0
  36. package/package.json +44 -30
  37. package/src/components/button.stories.tsx +83 -0
  38. package/src/components/button.tsx +38 -0
  39. package/src/styles/base.css +76 -0
  40. package/src/styles/grid.css +60 -0
  41. package/src/styles/index.css +27 -0
  42. package/src/styles/storybook.css +2 -0
  43. package/src/styles/tokens.css +134 -0
  44. package/src/styles/typography.css +140 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://www.schemastore.org/package.json",
3
3
  "name": "@regardio/brand",
4
- "version": "0.7.7",
4
+ "version": "0.8.1",
5
5
  "private": false,
6
6
  "description": "Regardio Brand Assets",
7
7
  "homepage": "https://github.com/regardio/brand#readme",
@@ -17,11 +17,14 @@
17
17
  "sideEffects": false,
18
18
  "type": "module",
19
19
  "exports": {
20
- "./colors.css": "./src/styles/colors.css",
21
- "./icons/regardio-compass-icon": {
22
- "import": "./dist/generated/icons/regardio-compass-icon.mjs",
23
- "types": "./dist/generated/icons/regardio-compass-icon.d.mts"
24
- },
20
+ "./button": {
21
+ "types": "./dist/components/button.d.mts",
22
+ "import": "./dist/components/button.mjs",
23
+ "default": "./dist/components/button.mjs"
24
+ },
25
+ "./styles/*": "./dist/styles/*",
26
+ "./sprites/*": "./dist/generated/sprites/*",
27
+ "./icons/*": "./dist/generated/icons/*",
25
28
  "./icons/regardio-ensemble-icon-color": {
26
29
  "import": "./dist/generated/icons/regardio-ensemble-icon-color.mjs",
27
30
  "types": "./dist/generated/icons/regardio-ensemble-icon-color.d.mts"
@@ -99,9 +102,15 @@
99
102
  "types": "./dist/generated/sprites/compass-sprite-provider.d.mts"
100
103
  }
101
104
  },
102
- "files": ["dist", "src/styles/colors.css"],
105
+ "files": [
106
+ "dist",
107
+ "src/styles",
108
+ "src/components"
109
+ ],
103
110
  "scripts": {
104
- "build": "tsdown",
111
+ "build": "exec-s build:tsdown build:copy-styles",
112
+ "build:copy-styles": "mkdir -p dist/styles && cp -r src/styles/* dist/styles/",
113
+ "build:tsdown": "tsdown",
105
114
  "clean": "exec-clean .turbo dist src/generated",
106
115
  "dev": "tsdown --watch",
107
116
  "fix": "exec-s fix:pkg fix:md fix:biome",
@@ -109,14 +118,14 @@
109
118
  "fix:md": "lint-md --fix",
110
119
  "fix:pkg": "lint-package --fix",
111
120
  "generate": "exec-s generate:* post-generate:* fix:*",
112
- "generate:compass-base-sprite": "exec-ts scripts/convert-svgs-to-sprite.ts ./src/svg/compass-base ./src/generated/sprites/compass-base.svg",
113
- "generate:compass-base-sprites-components": "exec-ts scripts/build-compass-base-sprites.ts",
121
+ "generate:compass-base-sprite": "tsx scripts/convert-svgs-to-sprite.ts ./src/svg/compass-base ./src/generated/sprites/compass-base.svg",
122
+ "generate:compass-base-sprites-components": "tsx scripts/build-compass-base-sprites.ts",
114
123
  "generate:icons": "svgr --icon --out-dir ./src/generated/icons -- ./src/svg/icons",
115
124
  "lint": "exec-s lint:md lint:biome",
116
125
  "lint:biome": "lint-biome check .",
117
126
  "lint:md": "lint-md",
118
127
  "lint:pkg": "lint-package",
119
- "post-generate:add-return-types": "exec-ts scripts/post-generate-add-return-types.ts",
128
+ "post-generate:add-return-types": "tsx scripts/post-generate-add-return-types.ts",
120
129
  "prepare": "exec-husky",
121
130
  "report": "vitest run --coverage",
122
131
  "ship:hotfix": "ship-hotfix",
@@ -129,35 +138,40 @@
129
138
  "tsdown": "tsdown",
130
139
  "typecheck": "exec-tsc --noEmit"
131
140
  },
141
+ "dependencies": {
142
+ "@fontsource-variable/georama": "5.2.8",
143
+ "@regardio/react": "^0.8.1",
144
+ "@regardio/tailwind": "^0.4.2"
145
+ },
132
146
  "devDependencies": {
133
- "@regardio/dev": "1.16.0",
134
- "@storybook/addon-a11y": "10.2.13",
135
- "@storybook/addon-docs": "10.2.13",
136
- "@storybook/addon-vitest": "10.2.13",
137
- "@storybook/react-vite": "10.2.13",
147
+ "@regardio/dev": "^1.18.0",
148
+ "@storybook/addon-a11y": "10.3.0",
149
+ "@storybook/addon-docs": "10.3.0",
150
+ "@storybook/addon-vitest": "10.3.0",
151
+ "@storybook/react-vite": "10.3.0",
138
152
  "@svgr/cli": "8.1.0",
139
153
  "@svgr/plugin-jsx": "8.1.0",
140
154
  "@svgr/plugin-svgo": "8.1.0",
141
- "@tailwindcss/vite": "4.2.1",
155
+ "@tailwindcss/vite": "4.2.2",
142
156
  "@total-typescript/ts-reset": "0.6.1",
143
- "@types/node": "25.3.2",
157
+ "@types/node": "25.5.0",
144
158
  "@types/react": "19.2.14",
145
159
  "@types/react-dom": "19.2.3",
146
- "@vitejs/plugin-react": "5.1.4",
147
- "@vitest/browser-playwright": "4.0.18",
148
- "@vitest/coverage-v8": "4.0.18",
149
- "@vitest/ui": "4.0.18",
160
+ "@vitejs/plugin-react": "6.0.1",
161
+ "@vitest/browser-playwright": "4.1.0",
162
+ "@vitest/coverage-v8": "4.1.0",
163
+ "@vitest/ui": "4.1.0",
150
164
  "linkedom": "0.18.12",
151
- "node-html-parser": "7.0.2",
165
+ "node-html-parser": "7.1.0",
152
166
  "playwright": "1.58.2",
153
167
  "react": "19.2.4",
154
168
  "react-dom": "19.2.4",
155
- "storybook": "10.2.13",
156
- "svgo": "4.0.0",
157
- "tailwindcss": "4.2.1",
158
- "tsdown": "0.20.3",
169
+ "storybook": "10.3.0",
170
+ "svgo": "4.0.1",
171
+ "tailwindcss": "4.2.2",
172
+ "tsdown": "0.21.4",
159
173
  "typescript": "5.9.3",
160
- "vite": "7.3.1",
161
- "vitest": "4.0.18"
174
+ "vite": "8.0.0",
175
+ "vitest": "4.1.0"
162
176
  }
163
- }
177
+ }
@@ -0,0 +1,83 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Button } from './button';
3
+
4
+ const meta: Meta<typeof Button> = {
5
+ argTypes: {
6
+ children: {
7
+ control: 'text',
8
+ description: 'Button content',
9
+ },
10
+ disabled: {
11
+ control: 'boolean',
12
+ description: 'Disable the button',
13
+ },
14
+ variant: {
15
+ control: 'select',
16
+ description: 'Button style variant',
17
+ options: ['primary', 'secondary', 'outline', 'ghost', 'destructive'],
18
+ },
19
+ },
20
+ component: Button,
21
+ parameters: {
22
+ layout: 'centered',
23
+ },
24
+ tags: ['autodocs'],
25
+ title: 'Regardio Brand/Button',
26
+ } satisfies Meta<typeof Button>;
27
+
28
+ export default meta;
29
+ type Story = StoryObj<typeof meta>;
30
+
31
+ export const Primary: Story = {
32
+ args: {
33
+ children: 'Regardio Button',
34
+ variant: 'primary',
35
+ },
36
+ };
37
+
38
+ export const Secondary: Story = {
39
+ args: {
40
+ children: 'Secondary Button',
41
+ variant: 'secondary',
42
+ },
43
+ };
44
+
45
+ export const Outline: Story = {
46
+ args: {
47
+ children: 'Outline Button',
48
+ variant: 'outline',
49
+ },
50
+ };
51
+
52
+ export const Ghost: Story = {
53
+ args: {
54
+ children: 'Ghost Button',
55
+ variant: 'ghost',
56
+ },
57
+ };
58
+
59
+ export const Destructive: Story = {
60
+ args: {
61
+ children: 'Destructive Button',
62
+ variant: 'destructive',
63
+ },
64
+ };
65
+
66
+ export const Disabled: Story = {
67
+ args: {
68
+ children: 'Disabled Button',
69
+ disabled: true,
70
+ },
71
+ };
72
+
73
+ export const AllVariants: Story = {
74
+ render: () => (
75
+ <div className="flex flex-wrap gap-4">
76
+ <Button variant="primary">Primary</Button>
77
+ <Button variant="secondary">Secondary</Button>
78
+ <Button variant="outline">Outline</Button>
79
+ <Button variant="ghost">Ghost</Button>
80
+ <Button variant="destructive">Destructive</Button>
81
+ </div>
82
+ ),
83
+ };
@@ -0,0 +1,38 @@
1
+ import { Button as BaseButton } from '@regardio/react/button';
2
+ import { cn } from '@regardio/tailwind/utils';
3
+ import type { ComponentProps } from 'react';
4
+
5
+ /**
6
+ * Regardio branded button component
7
+ *
8
+ * Design: Flat blue, no border, ample padding, Georama bold font
9
+ * This represents the Regardio visual identity and should be used
10
+ * consistently across all Regardio applications.
11
+ */
12
+
13
+ export interface ButtonProps extends ComponentProps<typeof BaseButton> {
14
+ className?: string;
15
+ }
16
+
17
+ export const Button = ({ children, className, ...props }: ButtonProps): React.JSX.Element => {
18
+ return (
19
+ <BaseButton
20
+ className={cn(
21
+ 'px-6',
22
+ 'py-3',
23
+ 'text-base',
24
+ 'font-bold',
25
+ 'rounded-lg',
26
+ 'focus-visible:ring-2',
27
+ 'focus-visible:ring-ring',
28
+ 'focus-visible:ring-offset-2',
29
+ className,
30
+ )}
31
+ {...props}
32
+ >
33
+ {children}
34
+ </BaseButton>
35
+ );
36
+ };
37
+
38
+ export type { ButtonVariant } from '@regardio/react/button';
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Base Styles
3
+ * Regardio design decisions for foundational elements
4
+ */
5
+ @layer base {
6
+ /* Design tokens applied to all elements */
7
+ * {
8
+ @apply border-border outline-ring/50;
9
+ }
10
+
11
+ /* Body typography defaults */
12
+ body {
13
+ font-feature-settings:
14
+ "liga" 1,
15
+ "dlig" 1,
16
+ "calt" 1,
17
+ "hlig" 1;
18
+ font-variant-ligatures: common-ligatures discretionary-ligatures contextual historical-ligatures;
19
+ line-height: 1.5;
20
+ }
21
+
22
+ /* Text wrapping improvements */
23
+ p,
24
+ h1,
25
+ h2,
26
+ h3,
27
+ h4,
28
+ h5,
29
+ h6 {
30
+ overflow-wrap: break-word;
31
+ }
32
+
33
+ p {
34
+ text-wrap: pretty;
35
+ }
36
+
37
+ /* Heading typography */
38
+ h1,
39
+ h2,
40
+ h3,
41
+ h4,
42
+ h5,
43
+ h6 {
44
+ line-height: 1.2;
45
+ text-wrap: balance;
46
+ }
47
+
48
+ /* Focus ring styling */
49
+ :focus-visible {
50
+ @apply outline-2 outline-offset-2;
51
+ }
52
+
53
+ /* Selection styling */
54
+ ::selection {
55
+ @apply bg-primary text-primary-foreground;
56
+ }
57
+
58
+ /* Links without class */
59
+ a:not([class]) {
60
+ text-underline-offset: 0.2em;
61
+ }
62
+
63
+ /* Prevent tiny textareas */
64
+ textarea:not([rows]) {
65
+ min-height: 10em;
66
+ }
67
+
68
+ /* Auto-sizing textareas (progressive enhancement) */
69
+ @supports (field-sizing: content) {
70
+ textarea {
71
+ field-sizing: content;
72
+ min-height: 3lh;
73
+ max-height: 50vh;
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Grid Utilities
3
+ * Regardio's standard container and grid layout system
4
+ *
5
+ * Uses tokens defined in tokens.css:
6
+ * - --spacing-grid-max: Maximum container width
7
+ * - --spacing-grid-gutter: Horizontal padding/gap
8
+ */
9
+ @layer components {
10
+ /**
11
+ * Container with max-width and horizontal padding
12
+ */
13
+ .u-container {
14
+ position: relative;
15
+ max-width: var(--spacing-grid-max);
16
+ padding-inline: var(--spacing-grid-gutter);
17
+ margin-inline: auto;
18
+ }
19
+
20
+ /**
21
+ * 12-column CSS Grid with container queries
22
+ */
23
+ .u-grid {
24
+ display: grid;
25
+ grid-template-columns: repeat(12, minmax(0, 1fr));
26
+ grid-auto-flow: dense;
27
+ gap: var(--spacing-grid-gutter);
28
+ width: 100%;
29
+ container-name: grid;
30
+ container-type: inline-size;
31
+ }
32
+
33
+ /**
34
+ * Full-width grid item spanning all 12 columns
35
+ */
36
+ .u-grid-full {
37
+ grid-column: 1 / -1;
38
+ }
39
+
40
+ /**
41
+ * Half-width grid item spanning 6 columns
42
+ */
43
+ .u-grid-half {
44
+ grid-column: span 6;
45
+ }
46
+
47
+ /**
48
+ * Third-width grid item spanning 4 columns
49
+ */
50
+ .u-grid-third {
51
+ grid-column: span 4;
52
+ }
53
+
54
+ /**
55
+ * Quarter-width grid item spanning 3 columns
56
+ */
57
+ .u-grid-quarter {
58
+ grid-column: span 3;
59
+ }
60
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @regardio/brand - Regardio Design System
3
+ *
4
+ * Complete design system including:
5
+ * - OKLCH color scales
6
+ * - Semantic design tokens
7
+ * - Fluid typography system
8
+ * - Base styles (borders, focus, selection, line-heights)
9
+ * - Grid layout system
10
+ *
11
+ * Import this to get the full Regardio visual language.
12
+ */
13
+
14
+ /* OKLCH color scales */
15
+ @import "./colors.css";
16
+
17
+ /* Design tokens (breakpoints, containers, semantic colors, shadows) */
18
+ @import "./tokens.css";
19
+
20
+ /* Fluid typography system with Georama Variable font */
21
+ @import "./typography.css";
22
+
23
+ /* Base styles (borders, focus, selection, line-heights) */
24
+ @import "./base.css";
25
+
26
+ /* Grid layout system (container and grid utilities) */
27
+ @import "./grid.css";
@@ -0,0 +1,2 @@
1
+ @import "tailwindcss";
2
+ @import "./colors.css";
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Regardio Design Tokens
3
+ *
4
+ * Core design decisions for Regardio applications:
5
+ * - Breakpoints and container queries
6
+ * - Semantic color tokens
7
+ * - Surface effects and shadows
8
+ * - Typography scales
9
+ *
10
+ * These tokens define the Regardio brand's visual language.
11
+ */
12
+
13
+ @theme {
14
+ /* Explicit breakpoints - aligned with channel pattern */
15
+ --breakpoint-xs: 480px;
16
+ --breakpoint-sm: 768px;
17
+ --breakpoint-md: 1024px;
18
+ --breakpoint-lg: 1280px;
19
+ --breakpoint-xl: 1600px;
20
+ --breakpoint-2xl: 1920px;
21
+
22
+ /* Container queries - based on 12-column grid fractions (320px-2560px range) */
23
+ /* xs = 4 columns of 12 at 320px (~107px) */
24
+ --container-xs: 160px;
25
+ /* sm = 6 columns of 12 at 480px (~240px) */
26
+ --container-sm: 320px;
27
+ /* md = 8 columns of 12 at 768px (~512px) */
28
+ --container-md: 512px;
29
+ /* lg = 10 columns of 12 at 1024px (~853px) */
30
+ --container-lg: 768px;
31
+ /* xl = full width at md breakpoint */
32
+ --container-xl: 1024px;
33
+ /* 2xl = full width at lg breakpoint */
34
+ --container-2xl: 1280px;
35
+ /* 3xl = full width at xl breakpoint */
36
+ --container-3xl: 1600px;
37
+ /* 4xl = full width at 2xl breakpoint */
38
+ --container-4xl: 1920px;
39
+ /* 5xl = near max assumed width */
40
+ --container-5xl: 2304px;
41
+ /* 6xl = max assumed width */
42
+ --container-6xl: 2560px;
43
+
44
+ /* Semantic color tokens */
45
+ --color-foreground: var(--color-gray-950);
46
+ --color-muted-foreground: var(--color-gray-700);
47
+ --color-background: var(--color-gray-50);
48
+ --color-background-muted: var(--color-white);
49
+ --color-background-subtle: var(--color-gray-100);
50
+ --color-border: var(--color-gray-300);
51
+ --color-border-muted: var(--color-gray-200);
52
+ --color-ring: var(--color-teal-500);
53
+ --color-primary: var(--color-teal-600);
54
+ --color-primary-foreground: var(--color-white);
55
+ --color-primary-hover: var(--color-teal-700);
56
+ --color-secondary: var(--color-green-600);
57
+ --color-secondary-foreground: var(--color-white);
58
+ --color-secondary-hover: var(--color-green-700);
59
+ --color-accent: var(--color-lime-500);
60
+ --color-accent-foreground: var(--color-gray-950);
61
+ --color-accent-hover: var(--color-lime-600);
62
+ --color-muted: var(--color-gray-100);
63
+ --color-destructive: var(--color-red-600);
64
+ --color-destructive-foreground: var(--color-white);
65
+ --color-destructive-hover: var(--color-red-700);
66
+ }
67
+
68
+ :root {
69
+ /* Grid system configuration */
70
+ --spacing-grid-max: 1200px;
71
+ --spacing-grid-gutter: 1.5rem;
72
+
73
+ /* Elevation shadows - light mode */
74
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
75
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
76
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
77
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
78
+
79
+ /* Surface tokens for glass effects - light mode */
80
+ --surface: rgba(255, 255, 255, 0.74);
81
+ --surface-strong: rgba(255, 255, 255, 0.9);
82
+ --surface-subtle: rgba(255, 255, 255, 0.5);
83
+
84
+ /* Inset effects - light mode */
85
+ --inset-glint: rgba(255, 255, 255, 0.82);
86
+ }
87
+
88
+ /* Dark mode overrides */
89
+ .dark {
90
+ /* Semantic colors - dark mode */
91
+ --color-foreground: var(--color-gray-50);
92
+ --color-muted-foreground: var(--color-gray-400);
93
+
94
+ --color-background: var(--color-blue-950);
95
+ --color-background-muted: var(--color-blue-900);
96
+ --color-background-subtle: var(--color-blue-800);
97
+
98
+ --color-border: var(--color-gray-700);
99
+ --color-border-muted: var(--color-gray-800);
100
+
101
+ --color-ring: var(--color-teal-400);
102
+
103
+ --color-primary: var(--color-teal-400);
104
+ --color-primary-foreground: var(--color-gray-950);
105
+ --color-primary-hover: var(--color-teal-300);
106
+
107
+ --color-secondary: var(--color-green-400);
108
+ --color-secondary-foreground: var(--color-gray-950);
109
+ --color-secondary-hover: var(--color-green-300);
110
+
111
+ --color-accent: var(--color-lime-400);
112
+ --color-accent-foreground: var(--color-gray-950);
113
+ --color-accent-hover: var(--color-lime-300);
114
+
115
+ --color-muted: var(--color-gray-800);
116
+
117
+ --color-destructive: var(--color-red-500);
118
+ --color-destructive-foreground: var(--color-white);
119
+ --color-destructive-hover: var(--color-red-400);
120
+
121
+ /* Elevation shadows - dark mode */
122
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
123
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
124
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.5), 0 4px 6px -4px rgb(0 0 0 / 0.4);
125
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.6), 0 8px 10px -6px rgb(0 0 0 / 0.5);
126
+
127
+ /* Surface tokens for glass effects - dark mode */
128
+ --surface: color-mix(in oklab, var(--color-blue-950) 80%, transparent);
129
+ --surface-strong: color-mix(in oklab, var(--color-blue-950) 92%, transparent);
130
+ --surface-subtle: color-mix(in oklab, var(--color-blue-950) 60%, transparent);
131
+
132
+ /* Inset effects - dark mode */
133
+ --inset-glint: rgba(194, 247, 238, 0.14);
134
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Typography System
3
+ * Fluid typography using viewport-based scaling with Georama Variable font
4
+ * Scales automatically between 320px and 2560px viewports
5
+ */
6
+
7
+ @import "@fontsource-variable/georama";
8
+
9
+ @theme {
10
+ /* Font families */
11
+ --font-sans: "Georama Variable", ui-sans-serif, system-ui, sans-serif;
12
+ --font-mono:
13
+ ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, "DejaVu Sans Mono", monospace;
14
+
15
+ /* Fluid font sizes - viewport-based scaling */
16
+ /* Base: 16px at 320px viewport, scales to 18px at 2560px */
17
+ --font-size-xs: clamp(0.75rem, 0.7455rem + 0.0196vw, 0.84rem);
18
+ --font-size-sm: clamp(0.875rem, 0.8696rem + 0.0234vw, 0.98rem);
19
+ --font-size-base: clamp(1rem, 0.9937rem + 0.0272vw, 1.125rem);
20
+ --font-size-lg: clamp(1.125rem, 1.1179rem + 0.0308vw, 1.266rem);
21
+ --font-size-xl: clamp(1.25rem, 1.242rem + 0.0348vw, 1.406rem);
22
+ --font-size-2xl: clamp(1.5rem, 1.4902rem + 0.0424vw, 1.688rem);
23
+ --font-size-3xl: clamp(1.875rem, 1.8627rem + 0.0533vw, 2.109rem);
24
+ --font-size-4xl: clamp(2.25rem, 2.2353rem + 0.0641vw, 2.531rem);
25
+ --font-size-5xl: clamp(3rem, 2.9804rem + 0.0848vw, 3.375rem);
26
+ --font-size-6xl: clamp(3.75rem, 3.7255rem + 0.106vw, 4.219rem);
27
+ --font-size-7xl: clamp(4.5rem, 4.4706rem + 0.1272vw, 5.063rem);
28
+ --font-size-8xl: clamp(6rem, 5.9608rem + 0.1696vw, 6.75rem);
29
+ --font-size-9xl: clamp(8rem, 7.9412rem + 0.2544vw, 9rem);
30
+
31
+ /* Line heights */
32
+ --line-height-none: 1;
33
+ --line-height-tight: 1.25;
34
+ --line-height-snug: 1.375;
35
+ --line-height-normal: 1.5;
36
+ --line-height-relaxed: 1.625;
37
+ --line-height-loose: 2;
38
+
39
+ /* Letter spacing */
40
+ --letter-spacing-tighter: -0.05em;
41
+ --letter-spacing-tight: -0.025em;
42
+ --letter-spacing-normal: 0em;
43
+ --letter-spacing-wide: 0.025em;
44
+ --letter-spacing-wider: 0.05em;
45
+ --letter-spacing-widest: 0.1em;
46
+ }
47
+
48
+ @layer base {
49
+ /* Fluid root font size - scales from 16px at 320px to 27px at 2560px */
50
+ /* This makes ALL rem values fluid throughout the system */
51
+ html {
52
+ font-size: clamp(16px, 14.429px + 0.4911vw, 27px);
53
+ }
54
+
55
+ body {
56
+ font-family: var(--font-sans);
57
+ font-size: var(--font-size-base);
58
+ font-feature-settings:
59
+ "liga" 1,
60
+ "dlig" 1,
61
+ "calt" 1,
62
+ "hlig" 1;
63
+ font-variant-ligatures: common-ligatures discretionary-ligatures contextual historical-ligatures;
64
+ -webkit-font-smoothing: antialiased;
65
+ -moz-osx-font-smoothing: grayscale;
66
+ line-height: var(--line-height-normal);
67
+ }
68
+
69
+ /* Headings with fluid sizing */
70
+ h1 {
71
+ font-size: var(--font-size-5xl);
72
+ font-weight: 700;
73
+ line-height: var(--line-height-tight);
74
+ letter-spacing: var(--letter-spacing-tight);
75
+ }
76
+
77
+ h2 {
78
+ font-size: var(--font-size-4xl);
79
+ font-weight: 700;
80
+ line-height: var(--line-height-tight);
81
+ letter-spacing: var(--letter-spacing-tight);
82
+ }
83
+
84
+ h3 {
85
+ font-size: var(--font-size-3xl);
86
+ font-weight: 600;
87
+ line-height: var(--line-height-snug);
88
+ }
89
+
90
+ h4 {
91
+ font-size: var(--font-size-2xl);
92
+ font-weight: 600;
93
+ line-height: var(--line-height-snug);
94
+ }
95
+
96
+ h5 {
97
+ font-size: var(--font-size-xl);
98
+ font-weight: 600;
99
+ line-height: var(--line-height-snug);
100
+ }
101
+
102
+ h6 {
103
+ font-size: var(--font-size-lg);
104
+ font-weight: 600;
105
+ line-height: var(--line-height-normal);
106
+ }
107
+
108
+ /* Code styling */
109
+ code {
110
+ padding: 2px 7px;
111
+ font-family: var(--font-mono);
112
+ font-size: 0.9em;
113
+ background: color-mix(in oklab, var(--color-background-muted) 82%, var(--color-background) 18%);
114
+ border: 1px solid var(--color-border);
115
+ border-radius: 0.375rem;
116
+ }
117
+
118
+ pre code {
119
+ padding: 0;
120
+ font-size: inherit;
121
+ color: inherit;
122
+ background: transparent;
123
+ border: 0;
124
+ border-radius: 0;
125
+ }
126
+
127
+ pre {
128
+ padding: 1rem;
129
+ overflow-x: auto;
130
+ font-family: var(--font-mono);
131
+ background: var(--color-muted);
132
+ border: 1px solid var(--color-border);
133
+ border-radius: 0.5rem;
134
+ }
135
+
136
+ .dark pre {
137
+ color: var(--color-gray-100);
138
+ background: oklch(15% 0.02 190);
139
+ }
140
+ }