@byldpartners/ui 0.0.1 → 0.0.2
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 +49 -33
- package/bin/init.cjs +258 -0
- package/dist/chunk-464G63BO.cjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/theme/web.cjs.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -17,13 +17,13 @@ pnpm add @byldpartners/ui
|
|
|
17
17
|
**Web:**
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
|
|
20
|
+
npm install react react-dom tailwindcss
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
**React Native:**
|
|
23
|
+
**React Native (Expo):**
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
|
|
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
|
-
|
|
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,38 @@ function App() {
|
|
|
56
69
|
}
|
|
57
70
|
```
|
|
58
71
|
|
|
59
|
-
|
|
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.
|
|
74
|
+
**1. Install dependencies and generate config files:**
|
|
66
75
|
|
|
67
|
-
```
|
|
68
|
-
@
|
|
69
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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`
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
module.exports = withUniwindConfig(config, {
|
|
81
|
-
cssEntryFile: './global.css',
|
|
82
|
-
});
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**3. Import CSS** in your `App.tsx`:
|
|
85
|
+
**2. Import CSS and wrap with `ThemeProvider` in your `App.tsx`:**
|
|
86
86
|
|
|
87
87
|
```tsx
|
|
88
88
|
import './global.css';
|
|
89
|
-
import { Button } from "@byldpartners/ui";
|
|
89
|
+
import { ThemeProvider, Button } from "@byldpartners/ui";
|
|
90
90
|
|
|
91
91
|
export default function App() {
|
|
92
92
|
return (
|
|
93
|
-
<
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
<ThemeProvider defaultTheme="default">
|
|
94
|
+
<Button variant="default" onPress={() => console.log("pressed")}>
|
|
95
|
+
Get Started
|
|
96
|
+
</Button>
|
|
97
|
+
</ThemeProvider>
|
|
96
98
|
);
|
|
97
99
|
}
|
|
98
100
|
```
|
|
99
101
|
|
|
102
|
+
> **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.
|
|
103
|
+
|
|
100
104
|
Both platforms use the same Tailwind semantic classes (`bg-primary`, `text-foreground`, `rounded-md`, etc.) — web via Tailwind CSS, native via uniwind.
|
|
101
105
|
|
|
102
106
|
## Components
|
|
@@ -153,13 +157,25 @@ function ThemeSwitcher() {
|
|
|
153
157
|
}
|
|
154
158
|
```
|
|
155
159
|
|
|
156
|
-
### Native — Tailwind dark mode
|
|
160
|
+
### Native — ThemeProvider + Tailwind dark mode
|
|
161
|
+
|
|
162
|
+
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`.
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
import { ThemeProvider } from "@byldpartners/ui";
|
|
157
166
|
|
|
158
|
-
|
|
167
|
+
export default function App() {
|
|
168
|
+
return (
|
|
169
|
+
<ThemeProvider defaultTheme="default">
|
|
170
|
+
{/* your app */}
|
|
171
|
+
</ThemeProvider>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
159
175
|
|
|
160
176
|
### Custom themes
|
|
161
177
|
|
|
162
|
-
Define a custom preset and pass it to the
|
|
178
|
+
Define a custom preset and pass it to the provider:
|
|
163
179
|
|
|
164
180
|
```tsx
|
|
165
181
|
import { ThemeProvider } from "@byldpartners/ui";
|
package/bin/init.cjs
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
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
|
+
|
|
183
|
+
fs.writeFileSync(
|
|
184
|
+
cssPath,
|
|
185
|
+
generateNativeCss(lightColors, darkColors, "./node_modules/@byldpartners/ui/src"),
|
|
186
|
+
"utf-8"
|
|
187
|
+
);
|
|
188
|
+
console.log(`✓ Created ${path.relative(cwd, cssPath)}`);
|
|
189
|
+
|
|
190
|
+
if (fs.existsSync(metroPath)) {
|
|
191
|
+
console.log(
|
|
192
|
+
"⚠ metro.config.js already exists — skipped. Make sure it uses withUniwindConfig (see README)."
|
|
193
|
+
);
|
|
194
|
+
} else {
|
|
195
|
+
fs.writeFileSync(metroPath, generateMetroConfig(), "utf-8");
|
|
196
|
+
console.log(`✓ Created ${path.relative(cwd, metroPath)}`);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
console.log("");
|
|
200
|
+
console.log("Next steps:");
|
|
201
|
+
console.log(" 1. Add import './global.css' to your App.tsx");
|
|
202
|
+
console.log(" 2. Wrap your app with <ThemeProvider> from @byldpartners/ui");
|
|
203
|
+
} else {
|
|
204
|
+
const cssPath = path.join(cwd, "app.css");
|
|
205
|
+
|
|
206
|
+
fs.writeFileSync(
|
|
207
|
+
cssPath,
|
|
208
|
+
generateWebCss(lightColors, radiusTokens, "./node_modules/@byldpartners/ui/src"),
|
|
209
|
+
"utf-8"
|
|
210
|
+
);
|
|
211
|
+
console.log(`✓ Created ${path.relative(cwd, cssPath)}`);
|
|
212
|
+
|
|
213
|
+
console.log("");
|
|
214
|
+
console.log("Next steps:");
|
|
215
|
+
console.log(" 1. Import './app.css' in your entry file");
|
|
216
|
+
console.log(" 2. Wrap your app with <ThemeProvider> from @byldpartners/ui");
|
|
217
|
+
}
|
|
218
|
+
} else if (command === "generate-theme") {
|
|
219
|
+
// --- Monorepo theme generation ---
|
|
220
|
+
const outWeb = getArg(args, "--out-web");
|
|
221
|
+
const outNative = getArg(args, "--out-native");
|
|
222
|
+
const webSource = getArg(args, "--web-source");
|
|
223
|
+
const nativeSource = getArg(args, "--native-source");
|
|
224
|
+
const webExtraImports = getArg(args, "--web-imports");
|
|
225
|
+
|
|
226
|
+
if (!outWeb && !outNative) {
|
|
227
|
+
console.error(
|
|
228
|
+
"Usage: byldpartners-ui generate-theme --source <ui-src-path> --out-web <path> --out-native <path>"
|
|
229
|
+
);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (outWeb) {
|
|
234
|
+
const extras = webExtraImports ? webExtraImports.split(",") : undefined;
|
|
235
|
+
fs.writeFileSync(
|
|
236
|
+
outWeb,
|
|
237
|
+
generateWebCss(lightColors, radiusTokens, webSource || "./node_modules/@byldpartners/ui/src", extras),
|
|
238
|
+
"utf-8"
|
|
239
|
+
);
|
|
240
|
+
console.log(`✓ Generated ${outWeb}`);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (outNative) {
|
|
244
|
+
fs.writeFileSync(
|
|
245
|
+
outNative,
|
|
246
|
+
generateNativeCss(lightColors, darkColors, nativeSource || "./node_modules/@byldpartners/ui/src"),
|
|
247
|
+
"utf-8"
|
|
248
|
+
);
|
|
249
|
+
console.log(`✓ Generated ${outNative}`);
|
|
250
|
+
}
|
|
251
|
+
} else {
|
|
252
|
+
console.error("Commands:");
|
|
253
|
+
console.error(" init --platform <web|native> Set up a new project");
|
|
254
|
+
console.error(" generate-theme [options] Regenerate theme CSS files");
|
|
255
|
+
console.error("");
|
|
256
|
+
console.error("Run with --help after a command for details.");
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
@@ -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"]}
|