@byldpartners/ui 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -17,13 +17,13 @@ pnpm add @byldpartners/ui
17
17
  **Web:**
18
18
 
19
19
  ```bash
20
- pnpm add react react-dom
20
+ npm install react react-dom tailwindcss
21
21
  ```
22
22
 
23
- **React Native:**
23
+ **React Native (Expo):**
24
24
 
25
25
  ```bash
26
- pnpm add react react-native react-native-svg lucide-react-native uniwind
26
+ npm install react react-native react-native-svg lucide-react-native uniwind tailwindcss expo-glass-effect
27
27
  ```
28
28
 
29
29
  | Package | Version | Required | Platform |
@@ -34,15 +34,28 @@ pnpm add react react-native react-native-svg lucide-react-native uniwind
34
34
  | `react-native-svg` | `>=13.0` | Yes | Native |
35
35
  | `lucide-react-native` | `>=0.300` | Yes | Native |
36
36
  | `uniwind` | `>=1.0` | Yes | Native |
37
+ | `tailwindcss` | `>=4.0` | Yes | Both |
37
38
  | `expo-glass-effect` | `>=0.1.0` | No | Native |
38
39
 
40
+ > **Note:** `tailwindcss` is required as a direct dependency in your project because `global.css` uses `@import "tailwindcss"` which Metro needs to resolve at build time.
41
+
39
42
  ## Quick Start
40
43
 
41
44
  ### Web
42
45
 
43
- Wrap your app in `ThemeProvider` and import components:
46
+ **1. Install dependencies and generate config files:**
47
+
48
+ ```bash
49
+ npm install @byldpartners/ui react react-dom tailwindcss
50
+ npx byldpartners-ui init --platform web
51
+ ```
52
+
53
+ This generates `app.css` with Tailwind imports, a `@source` directive pointing to the component library, and all theme color tokens.
54
+
55
+ **2. Import CSS and wrap with `ThemeProvider`:**
44
56
 
45
57
  ```tsx
58
+ import './app.css';
46
59
  import { ThemeProvider, Button } from "@byldpartners/ui";
47
60
 
48
61
  function App() {
@@ -56,47 +69,39 @@ function App() {
56
69
  }
57
70
  ```
58
71
 
59
- The `ThemeProvider` injects CSS custom properties onto `document.documentElement`. Make sure you have Tailwind CSS configured in your project.
60
-
61
- ### React Native
62
-
63
- Components use Tailwind classes via [uniwind](https://uniwind.dev). Set up your project:
72
+ ### React Native (Expo)
64
73
 
65
- **1. Create `global.css`** at your project root:
74
+ **1. Install dependencies and generate config files:**
66
75
 
67
- ```css
68
- @import 'tailwindcss';
69
- @import 'uniwind';
76
+ ```bash
77
+ npm install @byldpartners/ui react-native-svg lucide-react-native uniwind tailwindcss expo-glass-effect
78
+ npx byldpartners-ui init --platform native
70
79
  ```
71
80
 
72
- **2. Configure Metro** in `metro.config.js`:
73
-
74
- ```js
75
- const { getDefaultConfig } = require('expo/metro-config');
76
- const { withUniwindConfig } = require('uniwind/metro');
81
+ This generates:
82
+ - `global.css` — Tailwind/uniwind imports, `@source` directive, and light/dark theme token variants
83
+ - `metro.config.js` — Expo Metro config wrapped with `withUniwindConfig`
84
+ - `uniwind-types.d.ts` Type augmentation that adds `className` to React Native components
77
85
 
78
- const config = getDefaultConfig(__dirname);
79
-
80
- module.exports = withUniwindConfig(config, {
81
- cssEntryFile: './global.css',
82
- });
83
- ```
84
-
85
- **3. Import CSS** in your `App.tsx`:
86
+ **2. Import CSS and wrap with `ThemeProvider` in your `App.tsx`:**
86
87
 
87
88
  ```tsx
88
89
  import './global.css';
89
- import { Button } from "@byldpartners/ui";
90
+ import { ThemeProvider, Button } from "@byldpartners/ui";
90
91
 
91
92
  export default function App() {
92
93
  return (
93
- <Button variant="default" onPress={() => console.log("pressed")}>
94
- Get Started
95
- </Button>
94
+ <ThemeProvider defaultTheme="default">
95
+ <Button variant="default" onPress={() => console.log("pressed")}>
96
+ Get Started
97
+ </Button>
98
+ </ThemeProvider>
96
99
  );
97
100
  }
98
101
  ```
99
102
 
103
+ > **Important:** The `ThemeProvider` is required on both platforms — it initializes the theme context and syncs color tokens at runtime. Without it, `useTheme` calls inside components will throw.
104
+
100
105
  Both platforms use the same Tailwind semantic classes (`bg-primary`, `text-foreground`, `rounded-md`, etc.) — web via Tailwind CSS, native via uniwind.
101
106
 
102
107
  ## Components
@@ -153,13 +158,25 @@ function ThemeSwitcher() {
153
158
  }
154
159
  ```
155
160
 
156
- ### Native — Tailwind dark mode
161
+ ### Native — ThemeProvider + Tailwind dark mode
162
+
163
+ On native, wrap your app in `ThemeProvider` (same as web). Theming works through Tailwind's built-in dark mode via uniwind. Components use semantic classes like `bg-primary` and `text-foreground` which automatically respond to the `@variant light` / `@variant dark` blocks in your `global.css`.
164
+
165
+ ```tsx
166
+ import { ThemeProvider } from "@byldpartners/ui";
157
167
 
158
- On native, theming works through Tailwind's built-in dark mode via uniwind. Components use semantic classes like `bg-primary` and `text-foreground` which automatically respond to your Tailwind theme configuration.
168
+ export default function App() {
169
+ return (
170
+ <ThemeProvider defaultTheme="default">
171
+ {/* your app */}
172
+ </ThemeProvider>
173
+ );
174
+ }
175
+ ```
159
176
 
160
177
  ### Custom themes
161
178
 
162
- Define a custom preset and pass it to the web provider:
179
+ Define a custom preset and pass it to the provider:
163
180
 
164
181
  ```tsx
165
182
  import { ThemeProvider } from "@byldpartners/ui";
package/bin/init.cjs ADDED
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * CLI for @byldpartners/ui project setup and theme generation.
5
+ *
6
+ * Reads theme presets from the package's src/theme/presets/ directory — single
7
+ * source of truth for all generated CSS.
8
+ *
9
+ * Commands:
10
+ *
11
+ * init --platform <web|native>
12
+ * Generates config files for a new consumer project.
13
+ * - native: global.css + metro.config.js
14
+ * - web: app.css
15
+ *
16
+ * generate-theme --source <path-to-ui-src> --out-web <path> --out-native <path>
17
+ * Regenerates theme CSS for the monorepo's own apps.
18
+ * Used by `pnpm generate-theme` at the repo root.
19
+ */
20
+
21
+ const fs = require("fs");
22
+ const path = require("path");
23
+
24
+ // --- Preset parsing ---
25
+
26
+ /**
27
+ * Parse color entries from a preset .ts file.
28
+ * Matches lines like: key: "oklch(...)",
29
+ */
30
+ function parseColors(filePath) {
31
+ const src = fs.readFileSync(filePath, "utf-8");
32
+ const colorsMatch = src.match(/colors:\s*\{([\s\S]*?)\}/);
33
+ if (!colorsMatch) {
34
+ console.error(`Could not parse colors from ${filePath}`);
35
+ process.exit(1);
36
+ }
37
+ const colors = {};
38
+ const lineRegex = /(\w+):\s*"([^"]+)"/g;
39
+ let match;
40
+ while ((match = lineRegex.exec(colorsMatch[1])) !== null) {
41
+ colors[match[1]] = match[2];
42
+ }
43
+ return colors;
44
+ }
45
+
46
+ /**
47
+ * Parse radius entries from tokens.ts.
48
+ */
49
+ function parseRadius(filePath) {
50
+ const src = fs.readFileSync(filePath, "utf-8");
51
+ const radiusMatch = src.match(/radius:\s*\{([\s\S]*?)\}/);
52
+ if (!radiusMatch) {
53
+ console.error(`Could not parse radius from ${filePath}`);
54
+ process.exit(1);
55
+ }
56
+ const radius = {};
57
+ const lineRegex = /["']?(\w+)["']?:\s*"([^"]+)"/g;
58
+ let match;
59
+ while ((match = lineRegex.exec(radiusMatch[1])) !== null) {
60
+ radius[match[1]] = match[2];
61
+ }
62
+ return radius;
63
+ }
64
+
65
+ // --- Helpers ---
66
+
67
+ function colorKeyToCssVar(key) {
68
+ return `--color-${key.replace(/([A-Z])/g, "-$1").toLowerCase()}`;
69
+ }
70
+
71
+ function colorsToLines(colors, indent) {
72
+ return Object.entries(colors)
73
+ .map(([key, value]) => `${indent}${colorKeyToCssVar(key)}: ${value};`)
74
+ .join("\n");
75
+ }
76
+
77
+ // --- CSS generators ---
78
+
79
+ function generateNativeCss(lightColors, darkColors, sourcePath) {
80
+ return [
81
+ '@import "tailwindcss";',
82
+ '@import "uniwind";',
83
+ "",
84
+ `@source "${sourcePath}";`,
85
+ "",
86
+ "/* Theme tokens — light */",
87
+ "",
88
+ "@variant light {",
89
+ colorsToLines(lightColors, " "),
90
+ "}",
91
+ "",
92
+ "/* Theme tokens — dark */",
93
+ "",
94
+ "@variant dark {",
95
+ colorsToLines(darkColors, " "),
96
+ "}",
97
+ "",
98
+ ].join("\n");
99
+ }
100
+
101
+ function generateWebCss(lightColors, radiusTokens, sourcePath, extraImports) {
102
+ const imports = ['@import "tailwindcss";'];
103
+ if (extraImports) {
104
+ for (const imp of extraImports) {
105
+ imports.push(`@import "${imp}";`);
106
+ }
107
+ }
108
+
109
+ return [
110
+ ...imports,
111
+ "",
112
+ `@source "${sourcePath}";`,
113
+ "",
114
+ "@theme {",
115
+ " /* Colors */",
116
+ colorsToLines(lightColors, " "),
117
+ "",
118
+ " /* Radius */",
119
+ ...Object.entries(radiusTokens).map(
120
+ ([key, value]) => ` --radius-${key}: ${value};`
121
+ ),
122
+ "}",
123
+ "",
124
+ "@layer base {",
125
+ " *, *::before, *::after {",
126
+ " border-color: var(--color-border);",
127
+ " }",
128
+ "}",
129
+ "",
130
+ ].join("\n");
131
+ }
132
+
133
+ function generateMetroConfig() {
134
+ return [
135
+ "const { getDefaultConfig } = require('expo/metro-config');",
136
+ "const { withUniwindConfig } = require('uniwind/metro');",
137
+ "",
138
+ "const config = getDefaultConfig(__dirname);",
139
+ "",
140
+ "module.exports = withUniwindConfig(config, {",
141
+ " cssEntryFile: './global.css',",
142
+ "});",
143
+ "",
144
+ ].join("\n");
145
+ }
146
+
147
+ // --- Arg parsing helper ---
148
+
149
+ function getArg(args, flag) {
150
+ const idx = args.indexOf(flag);
151
+ return idx !== -1 ? args[idx + 1] : null;
152
+ }
153
+
154
+ // --- CLI ---
155
+
156
+ const args = process.argv.slice(2);
157
+ const command = args[0];
158
+
159
+ // Resolve preset source directory — default to the package's own src/
160
+ const sourceRoot = getArg(args, "--source") || path.join(__dirname, "..", "src");
161
+ const presetsDir = path.join(sourceRoot, "theme", "presets");
162
+ const tokensFile = path.join(sourceRoot, "theme", "tokens.ts");
163
+
164
+ const lightColors = parseColors(path.join(presetsDir, "default.ts"));
165
+ const darkColors = parseColors(path.join(presetsDir, "dark.ts"));
166
+ const radiusTokens = parseRadius(tokensFile);
167
+
168
+ if (command === "init") {
169
+ // --- External consumer init ---
170
+ const platform = getArg(args, "--platform");
171
+
172
+ if (!platform || !["web", "native"].includes(platform)) {
173
+ console.error("Usage: npx byldpartners-ui init --platform <web|native>");
174
+ process.exit(1);
175
+ }
176
+
177
+ const cwd = process.cwd();
178
+
179
+ if (platform === "native") {
180
+ const cssPath = path.join(cwd, "global.css");
181
+ const metroPath = path.join(cwd, "metro.config.js");
182
+ const uniwindTypesPath = path.join(cwd, "uniwind-types.d.ts");
183
+
184
+ fs.writeFileSync(
185
+ cssPath,
186
+ generateNativeCss(lightColors, darkColors, "./node_modules/@byldpartners/ui/src"),
187
+ "utf-8"
188
+ );
189
+ console.log(`✓ Created ${path.relative(cwd, cssPath)}`);
190
+
191
+ if (fs.existsSync(metroPath)) {
192
+ console.log(
193
+ "⚠ metro.config.js already exists — skipped. Make sure it uses withUniwindConfig (see README)."
194
+ );
195
+ } else {
196
+ fs.writeFileSync(metroPath, generateMetroConfig(), "utf-8");
197
+ console.log(`✓ Created ${path.relative(cwd, metroPath)}`);
198
+ }
199
+
200
+ // Copy uniwind type augmentation so className is recognized on RN components
201
+ const uniwindDtsSource = path.join(__dirname, "..", "src", "uniwind.d.ts");
202
+ fs.copyFileSync(uniwindDtsSource, uniwindTypesPath);
203
+ console.log(`✓ Created ${path.relative(cwd, uniwindTypesPath)}`);
204
+
205
+ console.log("");
206
+ console.log("Next steps:");
207
+ console.log(" 1. Add import './global.css' to your App.tsx");
208
+ console.log(" 2. Wrap your app with <ThemeProvider> from @byldpartners/ui");
209
+ } else {
210
+ const cssPath = path.join(cwd, "app.css");
211
+
212
+ fs.writeFileSync(
213
+ cssPath,
214
+ generateWebCss(lightColors, radiusTokens, "./node_modules/@byldpartners/ui/src"),
215
+ "utf-8"
216
+ );
217
+ console.log(`✓ Created ${path.relative(cwd, cssPath)}`);
218
+
219
+ console.log("");
220
+ console.log("Next steps:");
221
+ console.log(" 1. Import './app.css' in your entry file");
222
+ console.log(" 2. Wrap your app with <ThemeProvider> from @byldpartners/ui");
223
+ }
224
+ } else if (command === "generate-theme") {
225
+ // --- Monorepo theme generation ---
226
+ const outWeb = getArg(args, "--out-web");
227
+ const outNative = getArg(args, "--out-native");
228
+ const webSource = getArg(args, "--web-source");
229
+ const nativeSource = getArg(args, "--native-source");
230
+ const webExtraImports = getArg(args, "--web-imports");
231
+
232
+ if (!outWeb && !outNative) {
233
+ console.error(
234
+ "Usage: byldpartners-ui generate-theme --source <ui-src-path> --out-web <path> --out-native <path>"
235
+ );
236
+ process.exit(1);
237
+ }
238
+
239
+ if (outWeb) {
240
+ const extras = webExtraImports ? webExtraImports.split(",") : undefined;
241
+ fs.writeFileSync(
242
+ outWeb,
243
+ generateWebCss(lightColors, radiusTokens, webSource || "./node_modules/@byldpartners/ui/src", extras),
244
+ "utf-8"
245
+ );
246
+ console.log(`✓ Generated ${outWeb}`);
247
+ }
248
+
249
+ if (outNative) {
250
+ fs.writeFileSync(
251
+ outNative,
252
+ generateNativeCss(lightColors, darkColors, nativeSource || "./node_modules/@byldpartners/ui/src"),
253
+ "utf-8"
254
+ );
255
+ console.log(`✓ Generated ${outNative}`);
256
+ }
257
+ } else {
258
+ console.error("Commands:");
259
+ console.error(" init --platform <web|native> Set up a new project");
260
+ console.error(" generate-theme [options] Regenerate theme CSS files");
261
+ console.error("");
262
+ console.error("Run with --help after a command for details.");
263
+ process.exit(1);
264
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/lucasgismondi/Desktop/dev/byld/internal/byld.ui/packages/ui/dist/chunk-464G63BO.cjs","../src/theme/web.ts","../src/theme/tokens.ts","../src/theme/presets/default.ts","../src/theme/presets/dark.ts","../src/theme/presets/aurora.ts"],"names":[],"mappings":"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","file":"/Users/lucasgismondi/Desktop/dev/byld/internal/byld.ui/packages/ui/dist/chunk-464G63BO.cjs","sourcesContent":[null,"\"use client\";\n\nimport { createContext, useContext, useEffect, useState, createElement } from \"react\";\nimport type { ThemePreset, ThemeTokens, ThemeColors, ThemeRadius, ThemeSpacing, ThemeShadow } from \"./theme.types\";\nimport { defaultPreset } from \"./presets/default\";\nimport { darkPreset } from \"./presets/dark\";\nimport { auroraPreset } from \"./presets/aurora\";\n\n// --- CSS Variable Generation ---\n\nfunction colorToCssVar(key: string): string {\n // camelCase → kebab-case\n return `--color-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}`;\n}\n\nfunction radiusToCssVar(key: string): string {\n return `--radius-${key}`;\n}\n\nfunction spacingToCssVar(key: string): string {\n return `--spacing-${key}`;\n}\n\nfunction generateCssVars(tokens: ThemeTokens): Record<string, string> {\n const vars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(tokens.colors)) {\n vars[colorToCssVar(key)] = value;\n }\n for (const [key, value] of Object.entries(tokens.radius)) {\n vars[radiusToCssVar(key)] = value;\n }\n for (const [key, value] of Object.entries(tokens.spacing)) {\n vars[spacingToCssVar(key)] = value;\n }\n vars[\"--font-family\"] = tokens.typography.fontFamily;\n vars[\"--font-family-mono\"] = tokens.typography.fontFamilyMono;\n\n if (tokens.shadow) {\n for (const [key, value] of Object.entries(tokens.shadow)) {\n vars[`--shadow-${key}`] = value;\n }\n }\n\n return vars;\n}\n\n// Shadow CSS var keys that may have been set by a previous theme and need clearing\nconst SHADOW_KEYS = [\"--shadow-sm\", \"--shadow-md\", \"--shadow-lg\", \"--shadow-xl\"];\n\nfunction applyCssVars(vars: Record<string, string>, element: HTMLElement = document.documentElement) {\n // Clear shadow overrides that may have been set by a previous theme\n for (const key of SHADOW_KEYS) {\n if (!(key in vars)) {\n element.style.removeProperty(key);\n }\n }\n for (const [key, value] of Object.entries(vars)) {\n element.style.setProperty(key, value);\n }\n}\n\n// --- Theme Context ---\n\ninterface ThemeContextValue {\n theme: string;\n setTheme: (name: string) => void;\n tokens: ThemeTokens;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return ctx;\n}\n\n// --- ThemeProvider ---\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n presets?: ThemePreset[];\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"default\",\n presets: customPresets,\n}: ThemeProviderProps) {\n const presets = customPresets ?? [defaultPreset, darkPreset, auroraPreset];\n const presetMap = new Map(presets.map((p) => [p.name, p]));\n\n const [themeName, setThemeName] = useState(defaultTheme);\n\n const currentPreset = presetMap.get(themeName) ?? presets[0];\n const tokens = currentPreset.tokens;\n\n useEffect(() => {\n const vars = generateCssVars(tokens);\n applyCssVars(vars);\n }, [tokens]);\n\n const setTheme = (name: string) => {\n if (presetMap.has(name)) {\n setThemeName(name);\n } else {\n console.warn(`Theme \"${name}\" not found. Available: ${Array.from(presetMap.keys()).join(\", \")}`);\n }\n };\n\n return createElement(\n ThemeContext.Provider,\n { value: { theme: themeName, setTheme, tokens } },\n children,\n );\n}\n\nexport { defaultPreset, darkPreset, auroraPreset };\nexport type { ThemePreset, ThemeTokens, ThemeColors, ThemeRadius, ThemeSpacing, ThemeShadow };\n","import type { ThemeTokens } from \"./theme.types\";\n\n/**\n * Canonical theme token definitions.\n * All values are CSS-compatible strings.\n * Native side converts rem → numbers automatically.\n */\nexport const baseTokens: Omit<ThemeTokens, \"colors\"> = {\n radius: {\n sm: \"0.25rem\",\n md: \"0.375rem\",\n lg: \"0.5rem\",\n xl: \"0.75rem\",\n full: \"9999px\",\n },\n spacing: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n \"3xl\": \"4rem\",\n },\n typography: {\n fontFamily:\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontFamilyMono:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\nimport { baseTokens } from \"../tokens\";\n\nexport const defaultPreset: ThemePreset = {\n name: \"default\",\n tokens: {\n ...baseTokens,\n colors: {\n background: \"oklch(1 0 0)\",\n foreground: \"oklch(0.145 0 0)\",\n card: \"oklch(1 0 0)\",\n cardForeground: \"oklch(0.145 0 0)\",\n popover: \"oklch(1 0 0)\",\n popoverForeground: \"oklch(0.145 0 0)\",\n primary: \"oklch(0.205 0 0)\",\n primaryForeground: \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.965 0 0)\",\n secondaryForeground: \"oklch(0.205 0 0)\",\n muted: \"oklch(0.965 0 0)\",\n mutedForeground: \"oklch(0.556 0 0)\",\n accent: \"oklch(0.965 0 0)\",\n accentForeground: \"oklch(0.205 0 0)\",\n destructive: \"oklch(0.577 0.245 27.325)\",\n destructiveForeground: \"oklch(0.985 0 0)\",\n border: \"oklch(0.922 0 0)\",\n input: \"oklch(0.922 0 0)\",\n ring: \"oklch(0.708 0 0)\",\n },\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\nimport { baseTokens } from \"../tokens\";\n\nexport const darkPreset: ThemePreset = {\n name: \"dark\",\n tokens: {\n ...baseTokens,\n colors: {\n background: \"oklch(0.145 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n card: \"oklch(0.145 0 0)\",\n cardForeground: \"oklch(0.985 0 0)\",\n popover: \"oklch(0.145 0 0)\",\n popoverForeground: \"oklch(0.985 0 0)\",\n primary: \"oklch(0.985 0 0)\",\n primaryForeground: \"oklch(0.205 0 0)\",\n secondary: \"oklch(0.269 0 0)\",\n secondaryForeground: \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n mutedForeground: \"oklch(0.708 0 0)\",\n accent: \"oklch(0.269 0 0)\",\n accentForeground: \"oklch(0.985 0 0)\",\n destructive: \"oklch(0.396 0.141 25.723)\",\n destructiveForeground: \"oklch(0.637 0.237 25.331)\",\n border: \"oklch(0.269 0 0)\",\n input: \"oklch(0.269 0 0)\",\n ring: \"oklch(0.439 0 0)\",\n },\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\n\nexport const auroraPreset: ThemePreset = {\n name: \"aurora\",\n tokens: {\n colors: {\n background: \"oklch(0.18 0.04 270)\",\n foreground: \"oklch(0.93 0.01 250)\",\n card: \"oklch(0.22 0.045 270)\",\n cardForeground: \"oklch(0.93 0.01 250)\",\n popover: \"oklch(0.22 0.045 270)\",\n popoverForeground: \"oklch(0.93 0.01 250)\",\n primary: \"oklch(0.75 0.15 190)\",\n primaryForeground: \"oklch(0.15 0.04 270)\",\n secondary: \"oklch(0.35 0.08 290)\",\n secondaryForeground: \"oklch(0.90 0.03 290)\",\n muted: \"oklch(0.28 0.04 270)\",\n mutedForeground: \"oklch(0.65 0.04 260)\",\n accent: \"oklch(0.30 0.05 270)\",\n accentForeground: \"oklch(0.93 0.01 250)\",\n destructive: \"oklch(0.65 0.22 15)\",\n destructiveForeground: \"oklch(0.95 0.01 15)\",\n border: \"oklch(0.26 0.035 270)\",\n input: \"oklch(0.26 0.035 270)\",\n ring: \"oklch(0.65 0.12 190)\",\n },\n radius: {\n sm: \"0.5rem\",\n md: \"0.75rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n full: \"9999px\",\n },\n spacing: {\n xs: \"0.375rem\",\n sm: \"0.75rem\",\n md: \"1.25rem\",\n lg: \"2rem\",\n xl: \"2.5rem\",\n \"2xl\": \"3.5rem\",\n \"3xl\": \"5rem\",\n },\n typography: {\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontFamilyMono:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n },\n shadow: {\n sm: \"0 1px 3px 0 oklch(0.55 0.12 190 / 0.3), 0 1px 2px -1px oklch(0.55 0.12 190 / 0.2)\",\n md: \"0 4px 8px -1px oklch(0.55 0.12 190 / 0.35), 0 2px 4px -2px oklch(0.55 0.12 190 / 0.25)\",\n lg: \"0 10px 20px -3px oklch(0.55 0.12 190 / 0.4), 0 4px 8px -4px oklch(0.55 0.12 190 / 0.3)\",\n xl: \"0 20px 30px -5px oklch(0.55 0.12 190 / 0.45), 0 8px 12px -6px oklch(0.55 0.12 190 / 0.35)\",\n },\n },\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/byld.ui/byld.ui/packages/ui/dist/chunk-464G63BO.cjs","../src/theme/web.ts","../src/theme/tokens.ts","../src/theme/presets/default.ts","../src/theme/presets/dark.ts","../src/theme/presets/aurora.ts"],"names":[],"mappings":"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","file":"/home/runner/work/byld.ui/byld.ui/packages/ui/dist/chunk-464G63BO.cjs","sourcesContent":[null,"\"use client\";\n\nimport { createContext, useContext, useEffect, useState, createElement } from \"react\";\nimport type { ThemePreset, ThemeTokens, ThemeColors, ThemeRadius, ThemeSpacing, ThemeShadow } from \"./theme.types\";\nimport { defaultPreset } from \"./presets/default\";\nimport { darkPreset } from \"./presets/dark\";\nimport { auroraPreset } from \"./presets/aurora\";\n\n// --- CSS Variable Generation ---\n\nfunction colorToCssVar(key: string): string {\n // camelCase → kebab-case\n return `--color-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}`;\n}\n\nfunction radiusToCssVar(key: string): string {\n return `--radius-${key}`;\n}\n\nfunction spacingToCssVar(key: string): string {\n return `--spacing-${key}`;\n}\n\nfunction generateCssVars(tokens: ThemeTokens): Record<string, string> {\n const vars: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(tokens.colors)) {\n vars[colorToCssVar(key)] = value;\n }\n for (const [key, value] of Object.entries(tokens.radius)) {\n vars[radiusToCssVar(key)] = value;\n }\n for (const [key, value] of Object.entries(tokens.spacing)) {\n vars[spacingToCssVar(key)] = value;\n }\n vars[\"--font-family\"] = tokens.typography.fontFamily;\n vars[\"--font-family-mono\"] = tokens.typography.fontFamilyMono;\n\n if (tokens.shadow) {\n for (const [key, value] of Object.entries(tokens.shadow)) {\n vars[`--shadow-${key}`] = value;\n }\n }\n\n return vars;\n}\n\n// Shadow CSS var keys that may have been set by a previous theme and need clearing\nconst SHADOW_KEYS = [\"--shadow-sm\", \"--shadow-md\", \"--shadow-lg\", \"--shadow-xl\"];\n\nfunction applyCssVars(vars: Record<string, string>, element: HTMLElement = document.documentElement) {\n // Clear shadow overrides that may have been set by a previous theme\n for (const key of SHADOW_KEYS) {\n if (!(key in vars)) {\n element.style.removeProperty(key);\n }\n }\n for (const [key, value] of Object.entries(vars)) {\n element.style.setProperty(key, value);\n }\n}\n\n// --- Theme Context ---\n\ninterface ThemeContextValue {\n theme: string;\n setTheme: (name: string) => void;\n tokens: ThemeTokens;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return ctx;\n}\n\n// --- ThemeProvider ---\n\ninterface ThemeProviderProps {\n children: React.ReactNode;\n defaultTheme?: string;\n presets?: ThemePreset[];\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"default\",\n presets: customPresets,\n}: ThemeProviderProps) {\n const presets = customPresets ?? [defaultPreset, darkPreset, auroraPreset];\n const presetMap = new Map(presets.map((p) => [p.name, p]));\n\n const [themeName, setThemeName] = useState(defaultTheme);\n\n const currentPreset = presetMap.get(themeName) ?? presets[0];\n const tokens = currentPreset.tokens;\n\n useEffect(() => {\n const vars = generateCssVars(tokens);\n applyCssVars(vars);\n }, [tokens]);\n\n const setTheme = (name: string) => {\n if (presetMap.has(name)) {\n setThemeName(name);\n } else {\n console.warn(`Theme \"${name}\" not found. Available: ${Array.from(presetMap.keys()).join(\", \")}`);\n }\n };\n\n return createElement(\n ThemeContext.Provider,\n { value: { theme: themeName, setTheme, tokens } },\n children,\n );\n}\n\nexport { defaultPreset, darkPreset, auroraPreset };\nexport type { ThemePreset, ThemeTokens, ThemeColors, ThemeRadius, ThemeSpacing, ThemeShadow };\n","import type { ThemeTokens } from \"./theme.types\";\n\n/**\n * Canonical theme token definitions.\n * All values are CSS-compatible strings.\n * Native side converts rem → numbers automatically.\n */\nexport const baseTokens: Omit<ThemeTokens, \"colors\"> = {\n radius: {\n sm: \"0.25rem\",\n md: \"0.375rem\",\n lg: \"0.5rem\",\n xl: \"0.75rem\",\n full: \"9999px\",\n },\n spacing: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n \"3xl\": \"4rem\",\n },\n typography: {\n fontFamily:\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontFamilyMono:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\nimport { baseTokens } from \"../tokens\";\n\nexport const defaultPreset: ThemePreset = {\n name: \"default\",\n tokens: {\n ...baseTokens,\n colors: {\n background: \"oklch(1 0 0)\",\n foreground: \"oklch(0.145 0 0)\",\n card: \"oklch(1 0 0)\",\n cardForeground: \"oklch(0.145 0 0)\",\n popover: \"oklch(1 0 0)\",\n popoverForeground: \"oklch(0.145 0 0)\",\n primary: \"oklch(0.205 0 0)\",\n primaryForeground: \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.965 0 0)\",\n secondaryForeground: \"oklch(0.205 0 0)\",\n muted: \"oklch(0.965 0 0)\",\n mutedForeground: \"oklch(0.556 0 0)\",\n accent: \"oklch(0.965 0 0)\",\n accentForeground: \"oklch(0.205 0 0)\",\n destructive: \"oklch(0.577 0.245 27.325)\",\n destructiveForeground: \"oklch(0.985 0 0)\",\n border: \"oklch(0.922 0 0)\",\n input: \"oklch(0.922 0 0)\",\n ring: \"oklch(0.708 0 0)\",\n },\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\nimport { baseTokens } from \"../tokens\";\n\nexport const darkPreset: ThemePreset = {\n name: \"dark\",\n tokens: {\n ...baseTokens,\n colors: {\n background: \"oklch(0.145 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n card: \"oklch(0.145 0 0)\",\n cardForeground: \"oklch(0.985 0 0)\",\n popover: \"oklch(0.145 0 0)\",\n popoverForeground: \"oklch(0.985 0 0)\",\n primary: \"oklch(0.985 0 0)\",\n primaryForeground: \"oklch(0.205 0 0)\",\n secondary: \"oklch(0.269 0 0)\",\n secondaryForeground: \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n mutedForeground: \"oklch(0.708 0 0)\",\n accent: \"oklch(0.269 0 0)\",\n accentForeground: \"oklch(0.985 0 0)\",\n destructive: \"oklch(0.396 0.141 25.723)\",\n destructiveForeground: \"oklch(0.637 0.237 25.331)\",\n border: \"oklch(0.269 0 0)\",\n input: \"oklch(0.269 0 0)\",\n ring: \"oklch(0.439 0 0)\",\n },\n },\n};\n","import type { ThemePreset } from \"../theme.types\";\n\nexport const auroraPreset: ThemePreset = {\n name: \"aurora\",\n tokens: {\n colors: {\n background: \"oklch(0.18 0.04 270)\",\n foreground: \"oklch(0.93 0.01 250)\",\n card: \"oklch(0.22 0.045 270)\",\n cardForeground: \"oklch(0.93 0.01 250)\",\n popover: \"oklch(0.22 0.045 270)\",\n popoverForeground: \"oklch(0.93 0.01 250)\",\n primary: \"oklch(0.75 0.15 190)\",\n primaryForeground: \"oklch(0.15 0.04 270)\",\n secondary: \"oklch(0.35 0.08 290)\",\n secondaryForeground: \"oklch(0.90 0.03 290)\",\n muted: \"oklch(0.28 0.04 270)\",\n mutedForeground: \"oklch(0.65 0.04 260)\",\n accent: \"oklch(0.30 0.05 270)\",\n accentForeground: \"oklch(0.93 0.01 250)\",\n destructive: \"oklch(0.65 0.22 15)\",\n destructiveForeground: \"oklch(0.95 0.01 15)\",\n border: \"oklch(0.26 0.035 270)\",\n input: \"oklch(0.26 0.035 270)\",\n ring: \"oklch(0.65 0.12 190)\",\n },\n radius: {\n sm: \"0.5rem\",\n md: \"0.75rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n full: \"9999px\",\n },\n spacing: {\n xs: \"0.375rem\",\n sm: \"0.75rem\",\n md: \"1.25rem\",\n lg: \"2rem\",\n xl: \"2.5rem\",\n \"2xl\": \"3.5rem\",\n \"3xl\": \"5rem\",\n },\n typography: {\n fontFamily:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontFamilyMono:\n 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n },\n shadow: {\n sm: \"0 1px 3px 0 oklch(0.55 0.12 190 / 0.3), 0 1px 2px -1px oklch(0.55 0.12 190 / 0.2)\",\n md: \"0 4px 8px -1px oklch(0.55 0.12 190 / 0.35), 0 2px 4px -2px oklch(0.55 0.12 190 / 0.25)\",\n lg: \"0 10px 20px -3px oklch(0.55 0.12 190 / 0.4), 0 4px 8px -4px oklch(0.55 0.12 190 / 0.3)\",\n xl: \"0 20px 30px -5px oklch(0.55 0.12 190 / 0.45), 0 8px 12px -6px oklch(0.55 0.12 190 / 0.35)\",\n },\n },\n};\n"]}