@ryndesign/cli 0.2.4 → 0.2.5

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.
@@ -8,6 +8,13 @@ import fs from "fs/promises";
8
8
  import { existsSync } from "fs";
9
9
  import path from "path";
10
10
  import { execSync } from "child_process";
11
+ import { fileURLToPath } from "url";
12
+ function getPackageRoot() {
13
+ if (typeof __dirname !== "undefined") {
14
+ return path.resolve(__dirname, "..");
15
+ }
16
+ return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
17
+ }
11
18
  var init_default = defineCommand({
12
19
  meta: {
13
20
  name: "init",
@@ -17,27 +24,34 @@ var init_default = defineCommand({
17
24
  template: {
18
25
  type: "string",
19
26
  description: "Template to use (minimal or full)",
20
- default: "minimal"
27
+ default: "full"
21
28
  },
22
29
  platforms: {
23
30
  type: "string",
24
31
  description: "Comma-separated list of target platforms"
32
+ },
33
+ "dark-mode": {
34
+ type: "boolean",
35
+ description: "Enable dark mode support"
25
36
  }
26
37
  },
27
38
  async run({ args }) {
28
- p.intro(pc.bgCyan(pc.black(" RynDesign Init ")));
29
- const template = args.template || await p.select({
39
+ const isInteractive = !args.platforms || args["dark-mode"] === void 0;
40
+ if (isInteractive) {
41
+ p.intro(pc.bgCyan(pc.black(" RynDesign Init ")));
42
+ }
43
+ const template = args.template || (isInteractive ? await p.select({
30
44
  message: "Choose a template:",
31
45
  options: [
32
46
  { value: "minimal", label: "Minimal", hint: "Basic color, spacing, typography tokens" },
33
47
  { value: "full", label: "Full", hint: "Complete token set with shadows, borders, gradients" }
34
48
  ]
35
- });
49
+ }) : "full");
36
50
  if (p.isCancel(template)) {
37
51
  p.cancel("Operation cancelled.");
38
52
  process.exit(0);
39
53
  }
40
- const platformsInput = args.platforms || await p.multiselect({
54
+ const platformsInput = args.platforms || (isInteractive ? await p.multiselect({
41
55
  message: "Select target platforms:",
42
56
  initialValues: ["react", "swiftui"],
43
57
  options: [
@@ -51,29 +65,38 @@ var init_default = defineCommand({
51
65
  { value: "android-view", label: "Android View" }
52
66
  ],
53
67
  required: true
54
- });
68
+ }) : ["react"]);
55
69
  if (p.isCancel(platformsInput)) {
56
70
  p.cancel("Operation cancelled.");
57
71
  process.exit(0);
58
72
  }
59
- const platforms = Array.isArray(platformsInput) ? platformsInput : platformsInput.split(",").map((s2) => s2.trim());
60
- const darkMode = await p.confirm({
73
+ const platforms = Array.isArray(platformsInput) ? platformsInput : platformsInput.split(",").map((s) => s.trim());
74
+ const darkMode = args["dark-mode"] !== void 0 ? args["dark-mode"] : isInteractive ? await p.confirm({
61
75
  message: "Enable dark mode support?",
62
76
  initialValue: true
63
- });
77
+ }) : true;
64
78
  if (p.isCancel(darkMode)) {
65
79
  p.cancel("Operation cancelled.");
66
80
  process.exit(0);
67
81
  }
68
- const s = p.spinner();
69
- s.start("Creating project files...");
82
+ const log = (msg) => {
83
+ if (isInteractive) return;
84
+ console.log(msg);
85
+ };
86
+ let spinner2;
87
+ if (isInteractive) {
88
+ spinner2 = p.spinner();
89
+ spinner2.start("Creating project files...");
90
+ } else {
91
+ log("Creating project files...");
92
+ }
70
93
  const cwd = process.cwd();
94
+ const pkgRoot = getPackageRoot();
95
+ const templateDir = path.join(pkgRoot, "templates");
96
+ const componentsDir = path.join(pkgRoot, "components");
71
97
  await fs.mkdir(path.join(cwd, "tokens"), { recursive: true });
72
98
  await fs.mkdir(path.join(cwd, "components"), { recursive: true });
73
99
  await fs.mkdir(path.join(cwd, "generated"), { recursive: true });
74
- const templateDir = path.resolve(
75
- typeof __dirname !== "undefined" ? path.resolve(__dirname, "../../templates") : path.resolve(new URL(".", import.meta.url).pathname, "../../templates")
76
- );
77
100
  const templateFile = template === "full" ? "full.tokens.json" : "minimal.tokens.json";
78
101
  try {
79
102
  const templateContent = await fs.readFile(
@@ -113,16 +136,19 @@ var init_default = defineCommand({
113
136
  }
114
137
  const configContent = generateConfig(platforms, darkMode);
115
138
  await fs.writeFile(path.join(cwd, "ryndesign.config.ts"), configContent);
116
- try {
117
- const buttonComp = await fs.readFile(
118
- path.join(templateDir, "../components/button.component.json"),
119
- "utf-8"
120
- );
121
- await fs.writeFile(
122
- path.join(cwd, "components", "button.component.json"),
123
- buttonComp
124
- );
125
- } catch {
139
+ const componentsToCopy = template === "full" ? ["button", "input", "card", "checkbox", "toggle", "badge", "avatar"] : ["button"];
140
+ for (const comp of componentsToCopy) {
141
+ try {
142
+ const content = await fs.readFile(
143
+ path.join(componentsDir, `${comp}.component.json`),
144
+ "utf-8"
145
+ );
146
+ await fs.writeFile(
147
+ path.join(cwd, "components", `${comp}.component.json`),
148
+ content
149
+ );
150
+ } catch {
151
+ }
126
152
  }
127
153
  const gitignorePath = path.join(cwd, ".gitignore");
128
154
  try {
@@ -158,30 +184,51 @@ var init_default = defineCommand({
158
184
  if (!pkg.devDependencies || typeof pkg.devDependencies !== "object") pkg.devDependencies = {};
159
185
  const devDeps = pkg.devDependencies;
160
186
  devDeps["@ryndesign/cli"] = "latest";
187
+ devDeps["@ryndesign/preview"] = "latest";
161
188
  for (const platform of platforms) {
162
189
  devDeps[`@ryndesign/generator-${platform}`] = "latest";
163
190
  }
164
191
  await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + "\n");
165
- s.stop("Project files created!");
166
- const installSpinner = p.spinner();
167
- installSpinner.start("Installing dependencies...");
168
- try {
169
- const pm = detectPackageManager(cwd);
170
- execSync(`${pm} install`, { cwd, stdio: "pipe" });
171
- installSpinner.stop("Dependencies installed!");
172
- } catch {
173
- installSpinner.stop(pc.yellow("Could not auto-install. Run `npm install` manually."));
192
+ if (spinner2) {
193
+ spinner2.stop("Project files created!");
194
+ } else {
195
+ log("Project files created!");
196
+ }
197
+ if (isInteractive) {
198
+ const installSpinner = p.spinner();
199
+ installSpinner.start("Installing dependencies...");
200
+ try {
201
+ const pm = detectPackageManager(cwd);
202
+ execSync(`${pm} install`, { cwd, stdio: "pipe" });
203
+ installSpinner.stop("Dependencies installed!");
204
+ } catch {
205
+ installSpinner.stop(pc.yellow("Could not auto-install. Run `npm install` manually."));
206
+ }
207
+ } else {
208
+ log("Installing dependencies...");
209
+ try {
210
+ const pm = detectPackageManager(cwd);
211
+ execSync(`${pm} install`, { cwd, stdio: "pipe" });
212
+ log("Dependencies installed!");
213
+ } catch {
214
+ log("Could not auto-install. Run `npm install` manually.");
215
+ }
216
+ }
217
+ if (isInteractive) {
218
+ p.note(
219
+ [
220
+ `${pc.green("tokens/")} - Your design tokens`,
221
+ `${pc.green("components/")} - Component definitions`,
222
+ `${pc.green("generated/")} - Generated output (gitignored)`,
223
+ `${pc.green("ryndesign.config.ts")} - Configuration`
224
+ ].join("\n"),
225
+ "Project structure"
226
+ );
227
+ p.outro(pc.green("Run `ryndesign generate` to generate your design system!"));
228
+ } else {
229
+ log("\nProject initialized successfully!");
230
+ log("Run `ryndesign generate` to generate your design system!");
174
231
  }
175
- p.note(
176
- [
177
- `${pc.green("tokens/")} - Your design tokens`,
178
- `${pc.green("components/")} - Component definitions`,
179
- `${pc.green("generated/")} - Generated output (gitignored)`,
180
- `${pc.green("ryndesign.config.ts")} - Configuration`
181
- ].join("\n"),
182
- "Project structure"
183
- );
184
- p.outro(pc.green("Run `ryndesign generate` to generate your design system!"));
185
232
  }
186
233
  });
187
234
  function generateConfig(platforms, darkMode) {
@@ -293,4 +340,4 @@ function detectPackageManager(cwd) {
293
340
  export {
294
341
  init_default as default
295
342
  };
296
- //# sourceMappingURL=init-IF35F2N7.js.map
343
+ //# sourceMappingURL=init-7MH56KZN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { fileURLToPath } from 'node:url';\n\nfunction getPackageRoot(): string {\n if (typeof __dirname !== 'undefined') {\n return path.resolve(__dirname, '..');\n }\n return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');\n}\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'full',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n 'dark-mode': {\n type: 'boolean',\n description: 'Enable dark mode support',\n },\n },\n async run({ args }) {\n const isInteractive = !args.platforms || args['dark-mode'] === undefined;\n\n if (isInteractive) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n }\n\n const template = args.template || (isInteractive\n ? await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string\n : 'full');\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || (isInteractive\n ? await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[]\n : ['react']);\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = args['dark-mode'] !== undefined\n ? args['dark-mode']\n : (isInteractive\n ? await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n })\n : true);\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const log = (msg: string) => {\n if (isInteractive) return;\n console.log(msg);\n };\n\n let spinner: ReturnType<typeof p.spinner> | undefined;\n if (isInteractive) {\n spinner = p.spinner();\n spinner.start('Creating project files...');\n } else {\n log('Creating project files...');\n }\n\n const cwd = process.cwd();\n const pkgRoot = getPackageRoot();\n const templateDir = path.join(pkgRoot, 'templates');\n const componentsDir = path.join(pkgRoot, 'components');\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy component templates\n const componentsToCopy = template === 'full'\n ? ['button', 'input', 'card', 'checkbox', 'toggle', 'badge', 'avatar']\n : ['button'];\n\n for (const comp of componentsToCopy) {\n try {\n const content = await fs.readFile(\n path.join(componentsDir, `${comp}.component.json`),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', `${comp}.component.json`),\n content\n );\n } catch {\n // Skip if not found\n }\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Ensure package.json exists, then add scripts and dependencies\n const pkgJsonPath = path.join(cwd, 'package.json');\n let pkg: Record<string, unknown>;\n try {\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n pkg = JSON.parse(pkgContent);\n } catch {\n const dirName = path.basename(cwd);\n pkg = {\n name: dirName,\n version: '1.0.0',\n private: true,\n type: 'module',\n };\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== 'object') pkg.scripts = {};\n const scripts = pkg.scripts as Record<string, string>;\n if (!scripts['generate']) scripts['generate'] = 'ryndesign generate';\n if (!scripts['preview']) scripts['preview'] = 'ryndesign preview';\n\n if (!pkg.devDependencies || typeof pkg.devDependencies !== 'object') pkg.devDependencies = {};\n const devDeps = pkg.devDependencies as Record<string, string>;\n devDeps['@ryndesign/cli'] = 'latest';\n devDeps['@ryndesign/preview'] = 'latest';\n for (const platform of platforms) {\n devDeps[`@ryndesign/generator-${platform}`] = 'latest';\n }\n\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n\n if (spinner) {\n spinner.stop('Project files created!');\n } else {\n log('Project files created!');\n }\n\n // Install dependencies\n if (isInteractive) {\n const installSpinner = p.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n const pm = detectPackageManager(cwd);\n execSync(`${pm} install`, { cwd, stdio: 'pipe' });\n installSpinner.stop('Dependencies installed!');\n } catch {\n installSpinner.stop(pc.yellow('Could not auto-install. Run `npm install` manually.'));\n }\n } else {\n log('Installing dependencies...');\n try {\n const pm = detectPackageManager(cwd);\n execSync(`${pm} install`, { cwd, stdio: 'pipe' });\n log('Dependencies installed!');\n } catch {\n log('Could not auto-install. Run `npm install` manually.');\n }\n }\n\n if (isInteractive) {\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n } else {\n log('\\nProject initialized successfully!');\n log('Run `ryndesign generate` to generate your design system!');\n }\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 100: { $value: '#F3F4F6' },\n 400: { $value: '#9CA3AF' },\n 800: { $value: '#1F2937' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n\nfunction detectPackageManager(cwd: string): string {\n try {\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('bun')) return 'bun';\n } catch {}\n\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(path.join(cwd, 'bun.lockb'))) return 'bun';\n return 'npm';\n}\n"],"mappings":"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","names":["spinner"]}
@@ -6,6 +6,9 @@ import "./chunk-DGUM43GV.js";
6
6
  // src/commands/preview.ts
7
7
  import { defineCommand } from "citty";
8
8
  import pc from "picocolors";
9
+ import { createRequire } from "module";
10
+ import { pathToFileURL } from "url";
11
+ import path from "path";
9
12
  var preview_default = defineCommand({
10
13
  meta: {
11
14
  name: "preview",
@@ -34,11 +37,17 @@ var preview_default = defineCommand({
34
37
  const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
35
38
  let previewModule;
36
39
  try {
37
- previewModule = await import("@ryndesign/preview");
40
+ const localRequire = createRequire(path.resolve(process.cwd(), "package.json"));
41
+ const previewPath = localRequire.resolve("@ryndesign/preview");
42
+ previewModule = await import(pathToFileURL(previewPath).href);
38
43
  } catch {
39
- console.log(pc.yellow("Preview package not found. Install @ryndesign/preview"));
40
- console.log(pc.gray(" npm install @ryndesign/preview"));
41
- return;
44
+ try {
45
+ previewModule = await import("@ryndesign/preview");
46
+ } catch {
47
+ console.log(pc.yellow("Preview package not found. Install @ryndesign/preview"));
48
+ console.log(pc.gray(" npm install @ryndesign/preview"));
49
+ return;
50
+ }
42
51
  }
43
52
  await previewModule.startPreviewServer({
44
53
  port,
@@ -49,4 +58,4 @@ var preview_default = defineCommand({
49
58
  export {
50
59
  preview_default as default
51
60
  };
52
- //# sourceMappingURL=preview-EOO6TMLY.js.map
61
+ //# sourceMappingURL=preview-5IWH7EKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/preview.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n const config = await loadConfig(args.config as string);\n const port = args.port\n ? parseInt(args.port as string, 10)\n : config?.preview?.port ?? 4400;\n\n let previewModule;\n try {\n const localRequire = createRequire(path.resolve(process.cwd(), 'package.json'));\n const previewPath = localRequire.resolve('@ryndesign/preview');\n previewModule = await import(pathToFileURL(previewPath).href);\n } catch {\n // Fallback: try direct import (works when CLI is installed locally)\n try {\n previewModule = await import('@ryndesign/preview');\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' npm install @ryndesign/preview'));\n return;\n }\n }\n\n await previewModule.startPreviewServer({\n port,\n open: args.open as boolean,\n });\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAGjB,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,gCAAyB,CAAC;AAE9C,UAAM,SAAS,MAAM,WAAW,KAAK,MAAgB;AACrD,UAAM,OAAO,KAAK,OACd,SAAS,KAAK,MAAgB,EAAE,IAChC,QAAQ,SAAS,QAAQ;AAE7B,QAAI;AACJ,QAAI;AACF,YAAM,eAAe,cAAc,KAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc,CAAC;AAC9E,YAAM,cAAc,aAAa,QAAQ,oBAAoB;AAC7D,sBAAgB,MAAM,OAAO,cAAc,WAAW,EAAE;AAAA,IAC1D,QAAQ;AAEN,UAAI;AACF,wBAAgB,MAAM,OAAO,oBAAoB;AAAA,MACnD,QAAQ;AACN,gBAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,gBAAQ,IAAI,GAAG,KAAK,kCAAkC,CAAC;AACvD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,mBAAmB;AAAA,MACrC;AAAA,MACA,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryndesign/cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "CLI for RynDesign design system generator",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -28,7 +28,9 @@
28
28
  }
29
29
  },
30
30
  "files": [
31
- "dist"
31
+ "dist",
32
+ "templates",
33
+ "components"
32
34
  ],
33
35
  "dependencies": {
34
36
  "citty": "^0.1.6",
@@ -0,0 +1,20 @@
1
+ {
2
+ "$description": "Dark theme overrides",
3
+ "$extensions": {
4
+ "com.ryndesign.theme": { "name": "dark", "extends": "default" }
5
+ },
6
+ "color": {
7
+ "$type": "color",
8
+ "background": {
9
+ "primary": { "$value": "{color.gray.900}" },
10
+ "secondary": { "$value": "{color.gray.800}" }
11
+ },
12
+ "text": {
13
+ "primary": { "$value": "{color.gray.50}" },
14
+ "secondary": { "$value": "{color.gray.400}" }
15
+ },
16
+ "border": {
17
+ "default": { "$value": "{color.gray.700}" }
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,186 @@
1
+ {
2
+ "color": {
3
+ "$type": "color",
4
+ "primary": { "$value": "#3B82F6", "$description": "Primary brand color" },
5
+ "secondary": { "$value": "#6366F1", "$description": "Secondary brand color" },
6
+ "success": { "$value": "#10B981" },
7
+ "warning": { "$value": "#F59E0B" },
8
+ "error": { "$value": "#EF4444" },
9
+ "info": { "$value": "#3B82F6" },
10
+ "white": { "$value": "#FFFFFF" },
11
+ "black": { "$value": "#000000" },
12
+ "gray": {
13
+ "50": { "$value": "#F9FAFB" },
14
+ "100": { "$value": "#F3F4F6" },
15
+ "200": { "$value": "#E5E7EB" },
16
+ "300": { "$value": "#D1D5DB" },
17
+ "400": { "$value": "#9CA3AF" },
18
+ "500": { "$value": "#6B7280" },
19
+ "600": { "$value": "#4B5563" },
20
+ "700": { "$value": "#374151" },
21
+ "800": { "$value": "#1F2937" },
22
+ "900": { "$value": "#111827" }
23
+ },
24
+ "background": {
25
+ "primary": { "$value": "{color.white}" },
26
+ "secondary": { "$value": "{color.gray.50}" },
27
+ "tertiary": { "$value": "{color.gray.100}" }
28
+ },
29
+ "text": {
30
+ "primary": { "$value": "{color.gray.900}" },
31
+ "secondary": { "$value": "{color.gray.600}" },
32
+ "tertiary": { "$value": "{color.gray.400}" },
33
+ "inverse": { "$value": "{color.white}" }
34
+ },
35
+ "border": {
36
+ "default": { "$value": "{color.gray.200}" },
37
+ "strong": { "$value": "{color.gray.400}" }
38
+ }
39
+ },
40
+ "spacing": {
41
+ "$type": "dimension",
42
+ "xs": { "$value": "4px" },
43
+ "sm": { "$value": "8px" },
44
+ "md": { "$value": "16px" },
45
+ "lg": { "$value": "24px" },
46
+ "xl": { "$value": "32px" },
47
+ "2xl": { "$value": "48px" },
48
+ "3xl": { "$value": "64px" },
49
+ "4xl": { "$value": "96px" }
50
+ },
51
+ "borderRadius": {
52
+ "$type": "dimension",
53
+ "none": { "$value": "0px" },
54
+ "sm": { "$value": "4px" },
55
+ "md": { "$value": "8px" },
56
+ "lg": { "$value": "12px" },
57
+ "xl": { "$value": "16px" },
58
+ "2xl": { "$value": "24px" },
59
+ "full": { "$value": "9999px" }
60
+ },
61
+ "fontSize": {
62
+ "$type": "dimension",
63
+ "xs": { "$value": "12px" },
64
+ "sm": { "$value": "14px" },
65
+ "md": { "$value": "16px" },
66
+ "lg": { "$value": "18px" },
67
+ "xl": { "$value": "20px" },
68
+ "2xl": { "$value": "24px" },
69
+ "3xl": { "$value": "30px" },
70
+ "4xl": { "$value": "36px" }
71
+ },
72
+ "fontWeight": {
73
+ "$type": "fontWeight",
74
+ "normal": { "$value": 400 },
75
+ "medium": { "$value": 500 },
76
+ "semibold": { "$value": 600 },
77
+ "bold": { "$value": 700 }
78
+ },
79
+ "lineHeight": {
80
+ "$type": "number",
81
+ "tight": { "$value": 1.25 },
82
+ "normal": { "$value": 1.5 },
83
+ "relaxed": { "$value": 1.75 }
84
+ },
85
+ "duration": {
86
+ "$type": "duration",
87
+ "fast": { "$value": "150ms" },
88
+ "normal": { "$value": "250ms" },
89
+ "slow": { "$value": "400ms" }
90
+ },
91
+ "shadow": {
92
+ "$type": "shadow",
93
+ "sm": {
94
+ "$value": {
95
+ "color": "#0000000D",
96
+ "offsetX": "0px",
97
+ "offsetY": "1px",
98
+ "blur": "2px",
99
+ "spread": "0px"
100
+ }
101
+ },
102
+ "md": {
103
+ "$value": {
104
+ "color": "#0000001A",
105
+ "offsetX": "0px",
106
+ "offsetY": "4px",
107
+ "blur": "6px",
108
+ "spread": "-1px"
109
+ }
110
+ },
111
+ "lg": {
112
+ "$value": {
113
+ "color": "#0000001A",
114
+ "offsetX": "0px",
115
+ "offsetY": "10px",
116
+ "blur": "15px",
117
+ "spread": "-3px"
118
+ }
119
+ }
120
+ },
121
+ "border": {
122
+ "$type": "border",
123
+ "default": {
124
+ "$value": {
125
+ "color": "{color.border.default}",
126
+ "width": "1px",
127
+ "style": "solid"
128
+ }
129
+ }
130
+ },
131
+ "typography": {
132
+ "$type": "typography",
133
+ "heading": {
134
+ "lg": {
135
+ "$value": {
136
+ "fontFamily": "Inter, sans-serif",
137
+ "fontSize": "{fontSize.3xl}",
138
+ "fontWeight": "{fontWeight.bold}",
139
+ "lineHeight": "{lineHeight.tight}"
140
+ }
141
+ },
142
+ "md": {
143
+ "$value": {
144
+ "fontFamily": "Inter, sans-serif",
145
+ "fontSize": "{fontSize.2xl}",
146
+ "fontWeight": "{fontWeight.semibold}",
147
+ "lineHeight": "{lineHeight.tight}"
148
+ }
149
+ },
150
+ "sm": {
151
+ "$value": {
152
+ "fontFamily": "Inter, sans-serif",
153
+ "fontSize": "{fontSize.xl}",
154
+ "fontWeight": "{fontWeight.semibold}",
155
+ "lineHeight": "{lineHeight.tight}"
156
+ }
157
+ }
158
+ },
159
+ "body": {
160
+ "lg": {
161
+ "$value": {
162
+ "fontFamily": "Inter, sans-serif",
163
+ "fontSize": "{fontSize.lg}",
164
+ "fontWeight": "{fontWeight.normal}",
165
+ "lineHeight": "{lineHeight.normal}"
166
+ }
167
+ },
168
+ "md": {
169
+ "$value": {
170
+ "fontFamily": "Inter, sans-serif",
171
+ "fontSize": "{fontSize.md}",
172
+ "fontWeight": "{fontWeight.normal}",
173
+ "lineHeight": "{lineHeight.normal}"
174
+ }
175
+ },
176
+ "sm": {
177
+ "$value": {
178
+ "fontFamily": "Inter, sans-serif",
179
+ "fontSize": "{fontSize.sm}",
180
+ "fontWeight": "{fontWeight.normal}",
181
+ "lineHeight": "{lineHeight.normal}"
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "color": {
3
+ "$type": "color",
4
+ "primary": { "$value": "#3B82F6", "$description": "Primary brand color" },
5
+ "secondary": { "$value": "#6366F1", "$description": "Secondary brand color" },
6
+ "white": { "$value": "#FFFFFF" },
7
+ "black": { "$value": "#000000" },
8
+ "gray": {
9
+ "50": { "$value": "#F9FAFB" },
10
+ "100": { "$value": "#F3F4F6" },
11
+ "200": { "$value": "#E5E7EB" },
12
+ "300": { "$value": "#D1D5DB" },
13
+ "400": { "$value": "#9CA3AF" },
14
+ "500": { "$value": "#6B7280" },
15
+ "600": { "$value": "#4B5563" },
16
+ "700": { "$value": "#374151" },
17
+ "800": { "$value": "#1F2937" },
18
+ "900": { "$value": "#111827" }
19
+ },
20
+ "background": {
21
+ "primary": { "$value": "{color.white}" },
22
+ "secondary": { "$value": "{color.gray.50}" }
23
+ },
24
+ "text": {
25
+ "primary": { "$value": "{color.gray.900}" },
26
+ "secondary": { "$value": "{color.gray.600}" }
27
+ },
28
+ "border": {
29
+ "default": { "$value": "{color.gray.200}" }
30
+ }
31
+ },
32
+ "spacing": {
33
+ "$type": "dimension",
34
+ "xs": { "$value": "4px" },
35
+ "sm": { "$value": "8px" },
36
+ "md": { "$value": "16px" },
37
+ "lg": { "$value": "24px" },
38
+ "xl": { "$value": "32px" },
39
+ "2xl": { "$value": "48px" }
40
+ },
41
+ "borderRadius": {
42
+ "$type": "dimension",
43
+ "none": { "$value": "0px" },
44
+ "sm": { "$value": "4px" },
45
+ "md": { "$value": "8px" },
46
+ "lg": { "$value": "12px" },
47
+ "full": { "$value": "9999px" }
48
+ },
49
+ "fontSize": {
50
+ "$type": "dimension",
51
+ "xs": { "$value": "12px" },
52
+ "sm": { "$value": "14px" },
53
+ "md": { "$value": "16px" },
54
+ "lg": { "$value": "18px" },
55
+ "xl": { "$value": "20px" },
56
+ "2xl": { "$value": "24px" },
57
+ "3xl": { "$value": "30px" }
58
+ },
59
+ "fontWeight": {
60
+ "$type": "fontWeight",
61
+ "normal": { "$value": 400 },
62
+ "medium": { "$value": 500 },
63
+ "semibold": { "$value": 600 },
64
+ "bold": { "$value": 700 }
65
+ },
66
+ "duration": {
67
+ "$type": "duration",
68
+ "fast": { "$value": "150ms" },
69
+ "normal": { "$value": "250ms" },
70
+ "slow": { "$value": "400ms" }
71
+ }
72
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'minimal',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n\n const template = args.template || await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string;\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[];\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n });\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start('Creating project files...');\n\n const cwd = process.cwd();\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n // ESM-compatible path resolution\n const templateDir = path.resolve(\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(new URL('.', import.meta.url).pathname, '../../templates')\n );\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n // If templates not found, create a basic one inline\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy button component\n try {\n const buttonComp = await fs.readFile(\n path.join(templateDir, '../components/button.component.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', 'button.component.json'),\n buttonComp\n );\n } catch {\n // Skip if not found\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Ensure package.json exists, then add scripts and dependencies\n const pkgJsonPath = path.join(cwd, 'package.json');\n let pkg: Record<string, unknown>;\n try {\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n pkg = JSON.parse(pkgContent);\n } catch {\n // No package.json yet — create one\n const dirName = path.basename(cwd);\n pkg = {\n name: dirName,\n version: '1.0.0',\n private: true,\n type: 'module',\n };\n }\n\n if (!pkg.scripts || typeof pkg.scripts !== 'object') pkg.scripts = {};\n const scripts = pkg.scripts as Record<string, string>;\n if (!scripts['generate']) scripts['generate'] = 'ryndesign generate';\n if (!scripts['preview']) scripts['preview'] = 'ryndesign preview';\n\n // Add generator packages as devDependencies\n if (!pkg.devDependencies || typeof pkg.devDependencies !== 'object') pkg.devDependencies = {};\n const devDeps = pkg.devDependencies as Record<string, string>;\n devDeps['@ryndesign/cli'] = 'latest';\n for (const platform of platforms) {\n devDeps[`@ryndesign/generator-${platform}`] = 'latest';\n }\n\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n\n s.stop('Project files created!');\n\n // Install dependencies\n const installSpinner = p.spinner();\n installSpinner.start('Installing dependencies...');\n try {\n const pm = detectPackageManager(cwd);\n execSync(`${pm} install`, { cwd, stdio: 'pipe' });\n installSpinner.stop('Dependencies installed!');\n } catch {\n installSpinner.stop(pc.yellow('Could not auto-install. Run `npm install` manually.'));\n }\n\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 100: { $value: '#F3F4F6' },\n 400: { $value: '#9CA3AF' },\n 800: { $value: '#1F2937' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n\nfunction detectPackageManager(cwd: string): string {\n try {\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.startsWith('pnpm')) return 'pnpm';\n if (userAgent.startsWith('yarn')) return 'yarn';\n if (userAgent.startsWith('bun')) return 'bun';\n } catch {}\n\n // Check for lock files\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(path.join(cwd, 'bun.lockb'))) return 'bun';\n return 'npm';\n}\n"],"mappings":"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","names":["s"]}