@kernlang/core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +661 -0
  2. package/dist/codegen-core.d.ts +30 -0
  3. package/dist/codegen-core.js +751 -0
  4. package/dist/codegen-core.js.map +1 -0
  5. package/dist/config.d.ts +69 -0
  6. package/dist/config.js +78 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/decompiler.d.ts +2 -0
  9. package/dist/decompiler.js +44 -0
  10. package/dist/decompiler.js.map +1 -0
  11. package/dist/errors.d.ts +12 -0
  12. package/dist/errors.js +40 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +23 -0
  15. package/dist/index.js +28 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/parser.d.ts +4 -0
  18. package/dist/parser.js +380 -0
  19. package/dist/parser.js.map +1 -0
  20. package/dist/scanner.d.ts +40 -0
  21. package/dist/scanner.js +380 -0
  22. package/dist/scanner.js.map +1 -0
  23. package/dist/spec.d.ts +17 -0
  24. package/dist/spec.js +101 -0
  25. package/dist/spec.js.map +1 -0
  26. package/dist/styles-react.d.ts +3 -0
  27. package/dist/styles-react.js +20 -0
  28. package/dist/styles-react.js.map +1 -0
  29. package/dist/styles-tailwind.d.ts +8 -0
  30. package/dist/styles-tailwind.js +197 -0
  31. package/dist/styles-tailwind.js.map +1 -0
  32. package/dist/template-catalog.d.ts +26 -0
  33. package/dist/template-catalog.js +228 -0
  34. package/dist/template-catalog.js.map +1 -0
  35. package/dist/template-engine.d.ts +33 -0
  36. package/dist/template-engine.js +196 -0
  37. package/dist/template-engine.js.map +1 -0
  38. package/dist/types.d.ts +94 -0
  39. package/dist/types.js +11 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/utils.d.ts +12 -0
  42. package/dist/utils.js +62 -0
  43. package/dist/utils.js.map +1 -0
  44. package/dist/version-adapters.d.ts +76 -0
  45. package/dist/version-adapters.js +172 -0
  46. package/dist/version-adapters.js.map +1 -0
  47. package/dist/version-detect.d.ts +30 -0
  48. package/dist/version-detect.js +63 -0
  49. package/dist/version-detect.js.map +1 -0
  50. package/package.json +20 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Project Scanner — detects project conventions and generates kern.config.ts
3
+ *
4
+ * Scans config files (package.json, tsconfig.json, .prettierrc, etc.)
5
+ * to auto-generate a KernConfig that matches the project's setup.
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { resolve } from 'path';
9
+ import { detectVersionsFromPackageJson } from './version-detect.js';
10
+ import { DEFAULT_CONFIG } from './config.js';
11
+ // ── Main Entry ───────────────────────────────────────────────────────────
12
+ export function scanProject(cwd) {
13
+ const config = {};
14
+ const info = {
15
+ packageManager: null,
16
+ typescript: null,
17
+ formatting: null,
18
+ editorConfig: null,
19
+ typeLibraries: [],
20
+ };
21
+ const detections = [];
22
+ detectFromPackageJson(cwd, config, info, detections);
23
+ detectFromTsconfig(cwd, config, info, detections);
24
+ detectFromPrettierrc(cwd, info, detections);
25
+ detectFromEditorConfig(cwd, info, detections);
26
+ detectPackageManager(cwd, info, detections);
27
+ return { config, info, detections };
28
+ }
29
+ // ── Detector: package.json ───────────────────────────────────────────────
30
+ function detectFromPackageJson(cwd, config, info, detections) {
31
+ const pkgPath = resolve(cwd, 'package.json');
32
+ if (!existsSync(pkgPath))
33
+ return;
34
+ let pkg;
35
+ try {
36
+ pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ const deps = (pkg.dependencies ?? {});
42
+ const devDeps = (pkg.devDependencies ?? {});
43
+ const allDeps = { ...devDeps, ...deps };
44
+ // ── Target detection (priority order) ──
45
+ const target = detectTarget(allDeps);
46
+ if (target) {
47
+ config.target = target;
48
+ detections.push({ source: 'package.json', field: 'target', value: target, confidence: 'high' });
49
+ }
50
+ // ── Framework versions (reuse core utility) ──
51
+ const versions = detectVersionsFromPackageJson(pkg);
52
+ if (versions.nextjs || versions.tailwind) {
53
+ config.frameworkVersions = versions;
54
+ if (versions.nextjs) {
55
+ detections.push({ source: 'package.json', field: 'frameworkVersions.nextjs', value: versions.nextjs, confidence: 'high' });
56
+ }
57
+ if (versions.tailwind) {
58
+ detections.push({ source: 'package.json', field: 'frameworkVersions.tailwind', value: versions.tailwind, confidence: 'high' });
59
+ }
60
+ }
61
+ // ── i18n detection ──
62
+ if (allDeps['next-intl']) {
63
+ config.i18n = { enabled: true, hookName: 'useTranslations', importPath: 'next-intl' };
64
+ detections.push({ source: 'package.json', field: 'i18n', value: 'next-intl (useTranslations)', confidence: 'high' });
65
+ }
66
+ else if (allDeps['react-i18next']) {
67
+ config.i18n = { enabled: true, hookName: 'useTranslation', importPath: 'react-i18next' };
68
+ detections.push({ source: 'package.json', field: 'i18n', value: 'react-i18next (useTranslation)', confidence: 'high' });
69
+ }
70
+ else {
71
+ config.i18n = { enabled: false };
72
+ detections.push({ source: 'package.json', field: 'i18n', value: 'disabled (no i18n library found)', confidence: 'medium' });
73
+ }
74
+ // ── UI library detection ──
75
+ if (allDeps['@shadcn/ui'] || pkg.name === 'shadcn' || existsSync(resolve(cwd, 'components.json'))) {
76
+ config.components = { ...config.components, uiLibrary: '@/components/ui' };
77
+ detections.push({ source: 'package.json', field: 'components.uiLibrary', value: '@/components/ui (shadcn)', confidence: 'high' });
78
+ }
79
+ else if (allDeps['@mui/material']) {
80
+ config.components = { ...config.components, uiLibrary: '@mui/material' };
81
+ detections.push({ source: 'package.json', field: 'components.uiLibrary', value: '@mui/material', confidence: 'high' });
82
+ }
83
+ else if (allDeps['@chakra-ui/react']) {
84
+ config.components = { ...config.components, uiLibrary: '@chakra-ui/react' };
85
+ detections.push({ source: 'package.json', field: 'components.uiLibrary', value: '@chakra-ui/react', confidence: 'high' });
86
+ }
87
+ // ── Express extras ──
88
+ if (target === 'express') {
89
+ const express = {};
90
+ if (allDeps['helmet']) {
91
+ express.helmet = true;
92
+ detections.push({ source: 'package.json', field: 'express.helmet', value: 'true', confidence: 'high' });
93
+ }
94
+ if (allDeps['compression']) {
95
+ express.compression = true;
96
+ detections.push({ source: 'package.json', field: 'express.compression', value: 'true', confidence: 'high' });
97
+ }
98
+ if (Object.keys(express).length > 0) {
99
+ config.express = express;
100
+ }
101
+ }
102
+ // ── Type libraries (report only) ──
103
+ const typeLibs = ['zod', 'valibot', 'prisma', '@prisma/client', 'drizzle-orm', 'yup', 'io-ts'];
104
+ for (const lib of typeLibs) {
105
+ if (allDeps[lib]) {
106
+ info.typeLibraries.push(lib);
107
+ detections.push({ source: 'package.json', field: 'info.typeLibraries', value: lib, confidence: 'medium' });
108
+ }
109
+ }
110
+ }
111
+ function detectTarget(allDeps) {
112
+ // Priority: most specific framework first
113
+ if (allDeps['next'])
114
+ return 'nextjs';
115
+ if (allDeps['react-native'])
116
+ return 'native';
117
+ if (allDeps['express'])
118
+ return 'express';
119
+ if (allDeps['tailwindcss'] && !allDeps['next'])
120
+ return 'tailwind';
121
+ if (allDeps['react'])
122
+ return 'web';
123
+ return null;
124
+ }
125
+ // ── Detector: tsconfig.json ──────────────────────────────────────────────
126
+ function detectFromTsconfig(cwd, config, info, detections) {
127
+ const tsconfigPath = resolve(cwd, 'tsconfig.json');
128
+ if (!existsSync(tsconfigPath))
129
+ return;
130
+ let tsconfig;
131
+ try {
132
+ tsconfig = parseJsonWithComments(readFileSync(tsconfigPath, 'utf-8'));
133
+ }
134
+ catch {
135
+ return;
136
+ }
137
+ // Follow extends one level
138
+ let baseConfig = {};
139
+ const extendsPath = tsconfig.extends;
140
+ if (extendsPath) {
141
+ try {
142
+ const resolvedExtends = resolve(cwd, extendsPath);
143
+ if (existsSync(resolvedExtends)) {
144
+ baseConfig = parseJsonWithComments(readFileSync(resolvedExtends, 'utf-8'));
145
+ }
146
+ }
147
+ catch {
148
+ // ignore
149
+ }
150
+ }
151
+ // Merge compiler options (tsconfig overrides base)
152
+ const baseOpts = (baseConfig.compilerOptions ?? {});
153
+ const opts = { ...baseOpts, ...(tsconfig.compilerOptions ?? {}) };
154
+ const strict = opts.strict === true;
155
+ const module = opts.module ?? null;
156
+ const paths = (opts.paths ?? {});
157
+ info.typescript = { strict, pathAliases: paths, module };
158
+ detections.push({ source: 'tsconfig.json', field: 'info.typescript.strict', value: String(strict), confidence: 'high' });
159
+ if (module) {
160
+ detections.push({ source: 'tsconfig.json', field: 'info.typescript.module', value: module, confidence: 'medium' });
161
+ }
162
+ // Extract path aliases → componentRoot
163
+ const aliasKeys = Object.keys(paths);
164
+ const atAlias = aliasKeys.find(k => k.startsWith('@/'));
165
+ if (atAlias) {
166
+ config.components = { ...config.components, componentRoot: '@/components' };
167
+ detections.push({ source: 'tsconfig.json', field: 'components.componentRoot', value: '@/components (from @/* alias)', confidence: 'medium' });
168
+ }
169
+ }
170
+ // ── Detector: .prettierrc ────────────────────────────────────────────────
171
+ function detectFromPrettierrc(cwd, info, detections) {
172
+ const candidates = ['.prettierrc', '.prettierrc.json'];
173
+ let raw = null;
174
+ let source = '';
175
+ for (const name of candidates) {
176
+ const p = resolve(cwd, name);
177
+ if (existsSync(p)) {
178
+ try {
179
+ raw = readFileSync(p, 'utf-8');
180
+ source = name;
181
+ break;
182
+ }
183
+ catch {
184
+ // continue
185
+ }
186
+ }
187
+ }
188
+ if (!raw)
189
+ return;
190
+ let prettier;
191
+ try {
192
+ prettier = JSON.parse(raw);
193
+ }
194
+ catch {
195
+ return;
196
+ }
197
+ const semicolons = prettier.semi !== false;
198
+ const singleQuote = prettier.singleQuote === true;
199
+ const tabWidth = typeof prettier.tabWidth === 'number' ? prettier.tabWidth : 2;
200
+ const trailingComma = typeof prettier.trailingComma === 'string' ? prettier.trailingComma : 'es5';
201
+ info.formatting = { semicolons, singleQuote, tabWidth, trailingComma };
202
+ detections.push({ source, field: 'info.formatting', value: `semi=${semicolons} quote=${singleQuote ? 'single' : 'double'} tab=${tabWidth}`, confidence: 'medium' });
203
+ }
204
+ // ── Detector: .editorconfig ──────────────────────────────────────────────
205
+ function detectFromEditorConfig(cwd, info, detections) {
206
+ const ecPath = resolve(cwd, '.editorconfig');
207
+ if (!existsSync(ecPath))
208
+ return;
209
+ let raw;
210
+ try {
211
+ raw = readFileSync(ecPath, 'utf-8');
212
+ }
213
+ catch {
214
+ return;
215
+ }
216
+ // Simple line-by-line parse — find [*] section
217
+ const lines = raw.split('\n');
218
+ let inGlobal = false;
219
+ let indentStyle = 'space';
220
+ let indentSize = 2;
221
+ for (const line of lines) {
222
+ const trimmed = line.trim();
223
+ if (trimmed.startsWith('[')) {
224
+ inGlobal = trimmed === '[*]';
225
+ continue;
226
+ }
227
+ if (!inGlobal)
228
+ continue;
229
+ const [key, rawVal] = trimmed.split('=').map(s => s.trim());
230
+ const val = rawVal?.replace(/[#;].*$/, '').trim();
231
+ if (key === 'indent_style' && val)
232
+ indentStyle = val;
233
+ if (key === 'indent_size' && val)
234
+ indentSize = parseInt(val, 10) || 2;
235
+ }
236
+ info.editorConfig = { indentStyle, indentSize };
237
+ detections.push({ source: '.editorconfig', field: 'info.editorConfig', value: `${indentStyle} (${indentSize})`, confidence: 'medium' });
238
+ }
239
+ // ── Detector: package manager (lockfile) ─────────────────────────────────
240
+ function detectPackageManager(cwd, info, detections) {
241
+ const lockfiles = [
242
+ ['pnpm-lock.yaml', 'pnpm'],
243
+ ['yarn.lock', 'yarn'],
244
+ ['bun.lockb', 'bun'],
245
+ ['package-lock.json', 'npm'],
246
+ ];
247
+ for (const [file, manager] of lockfiles) {
248
+ if (existsSync(resolve(cwd, file))) {
249
+ info.packageManager = manager;
250
+ detections.push({ source: file, field: 'info.packageManager', value: manager, confidence: 'high' });
251
+ return;
252
+ }
253
+ }
254
+ }
255
+ // ── Config Source Generator ──────────────────────────────────────────────
256
+ export function generateConfigSource(result) {
257
+ const { config } = result;
258
+ const lines = [];
259
+ lines.push("import type { KernConfig } from '@kernlang/core';");
260
+ lines.push('');
261
+ lines.push('const config: KernConfig = {');
262
+ // target — always emit when detected (explicit is better than implicit default)
263
+ if (config.target) {
264
+ lines.push(` target: '${config.target}',`);
265
+ }
266
+ // frameworkVersions
267
+ if (config.frameworkVersions) {
268
+ const fv = config.frameworkVersions;
269
+ const entries = [];
270
+ if (fv.nextjs)
271
+ entries.push(`nextjs: '${fv.nextjs}'`);
272
+ if (fv.tailwind)
273
+ entries.push(`tailwind: '${fv.tailwind}'`);
274
+ if (entries.length > 0) {
275
+ lines.push(` frameworkVersions: { ${entries.join(', ')} },`);
276
+ }
277
+ }
278
+ // i18n
279
+ if (config.i18n) {
280
+ if (config.i18n.enabled === false) {
281
+ lines.push(' i18n: { enabled: false },');
282
+ }
283
+ else if (config.i18n.hookName && config.i18n.importPath) {
284
+ if (config.i18n.hookName !== DEFAULT_CONFIG.i18n.hookName ||
285
+ config.i18n.importPath !== DEFAULT_CONFIG.i18n.importPath) {
286
+ lines.push(' i18n: {');
287
+ lines.push(' enabled: true,');
288
+ lines.push(` hookName: '${config.i18n.hookName}',`);
289
+ lines.push(` importPath: '${config.i18n.importPath}',`);
290
+ lines.push(' },');
291
+ }
292
+ }
293
+ }
294
+ // components
295
+ if (config.components) {
296
+ const comp = config.components;
297
+ const compEntries = [];
298
+ if (comp.uiLibrary && comp.uiLibrary !== DEFAULT_CONFIG.components.uiLibrary) {
299
+ compEntries.push(`uiLibrary: '${comp.uiLibrary}'`);
300
+ }
301
+ if (comp.componentRoot && comp.componentRoot !== DEFAULT_CONFIG.components.componentRoot) {
302
+ compEntries.push(`componentRoot: '${comp.componentRoot}'`);
303
+ }
304
+ if (compEntries.length > 0) {
305
+ lines.push(` components: { ${compEntries.join(', ')} },`);
306
+ }
307
+ }
308
+ // express
309
+ if (config.express) {
310
+ const ex = config.express;
311
+ const exEntries = [];
312
+ if (ex.helmet)
313
+ exEntries.push('helmet: true');
314
+ if (ex.compression)
315
+ exEntries.push('compression: true');
316
+ if (exEntries.length > 0) {
317
+ lines.push(` express: { ${exEntries.join(', ')} },`);
318
+ }
319
+ }
320
+ lines.push('};');
321
+ lines.push('');
322
+ lines.push('export default config;');
323
+ lines.push('');
324
+ return lines.join('\n');
325
+ }
326
+ // ── Summary Formatter ────────────────────────────────────────────────────
327
+ const ANSI_GREEN = '\x1b[32m';
328
+ const ANSI_YELLOW = '\x1b[33m';
329
+ const ANSI_DIM = '\x1b[2m';
330
+ const ANSI_BOLD = '\x1b[1m';
331
+ const ANSI_RESET = '\x1b[0m';
332
+ const INFO_FIELDS = new Set([
333
+ 'info.typescript.strict',
334
+ 'info.typescript.module',
335
+ 'info.formatting',
336
+ 'info.editorConfig',
337
+ 'info.typeLibraries',
338
+ 'info.packageManager',
339
+ ]);
340
+ export function formatScanSummary(result) {
341
+ const lines = [];
342
+ lines.push('');
343
+ lines.push(` ${ANSI_BOLD}KERN scan${ANSI_RESET} — project analysis`);
344
+ lines.push('');
345
+ // Group detections by source
346
+ const bySource = new Map();
347
+ for (const d of result.detections) {
348
+ const existing = bySource.get(d.source) ?? [];
349
+ existing.push(d);
350
+ bySource.set(d.source, existing);
351
+ }
352
+ for (const [source, dets] of bySource) {
353
+ lines.push(` ${ANSI_DIM}${source}${ANSI_RESET}`);
354
+ for (const d of dets) {
355
+ const isInfo = INFO_FIELDS.has(d.field);
356
+ const marker = isInfo ? `${ANSI_YELLOW}-${ANSI_RESET}` : `${ANSI_GREEN}✓${ANSI_RESET}`;
357
+ lines.push(` ${marker} ${d.field}: ${d.value}`);
358
+ }
359
+ lines.push('');
360
+ }
361
+ if (result.detections.length === 0) {
362
+ lines.push(' No project configuration detected.');
363
+ lines.push('');
364
+ }
365
+ return lines.join('\n');
366
+ }
367
+ // ── Helpers ──────────────────────────────────────────────────────────────
368
+ function parseJsonWithComments(raw) {
369
+ // Strip comments while preserving string contents.
370
+ // Matches strings first (to skip them), then comments to remove.
371
+ const stripped = raw
372
+ .replace(/"(?:[^"\\]|\\.)*"|\/\/.*$|\/\*[\s\S]*?\*\//gm, (match) => {
373
+ // Keep strings as-is, remove comments
374
+ return match.startsWith('"') ? match : '';
375
+ })
376
+ // Remove trailing commas before } or ]
377
+ .replace(/,\s*([}\]])/g, '$1');
378
+ return JSON.parse(stripped);
379
+ }
380
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
package/dist/spec.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Kern v2 Specification
3
+ *
4
+ * The LLM-native language. Swiss-engineered.
5
+ * Designed by 3 AIs through forge + tribunal + brainstorm.
6
+ *
7
+ * Foundation: indent-based, semantic names, key=value props
8
+ * Styles: shorthand blocks in {} with CSS escape hatch
9
+ * Meta: theme nodes ($ref), pseudo-selectors (:press, :hover)
10
+ * Targets: Next.js, React+Tailwind, React Native, Express
11
+ */
12
+ export declare const KERN_VERSION = "2.0.0";
13
+ export declare const IR_GRAMMAR = "\ndocument = node+\nnode = indent type (SP prop)* (SP style)? (SP themeref)* NL child*\nchild = node\nindent = \" \"*\ntype = ident\nprop = ident \"=\" value\nvalue = quoted | bare\nquoted = '\"' [^\"]* '\"'\nbare = [^\\s{$]+\nstyle = \"{\" spair (\",\" spair)* \"}\"\nspair = sident \":\" svalue | \":\" pseudo \":\" sident \":\" svalue\npseudo = \"press\" | \"hover\" | \"active\" | \"focus\"\nsident = shorthand | ident\nsvalue = [^,}]+\nthemeref = \"$\" ident\nident = [A-Za-z_][A-Za-z0-9_-]*\nSP = \" \"+\nNL = \"\\n\" | EOF\n";
14
+ export declare const NODE_TYPES: readonly ["screen", "row", "col", "card", "scroll", "text", "image", "progress", "divider", "button", "input", "modal", "list", "item", "tabs", "tab", "header", "theme", "server", "route", "middleware", "handler", "schema", "stream", "spawn", "timer", "on", "env", "cli", "command", "arg", "flag", "import", "separator", "table", "scoreboard", "metric", "spinner", "progress", "box", "gradient", "state", "repl", "guard", "parallel", "dispatch", "then", "each", "generateMetadata", "notFound", "redirect", "fetch", "type", "interface", "field", "fn", "machine", "transition", "error", "module", "export", "config", "store", "test", "describe", "it", "event", "hook", "provider", "effect", "memo", "callback", "ref", "context", "cleanup", "prop", "returns", "template", "slot", "body"];
15
+ export type IRNodeType = (typeof NODE_TYPES)[number];
16
+ export declare const STYLE_SHORTHANDS: Record<string, string>;
17
+ export declare const VALUE_SHORTHANDS: Record<string, string>;
package/dist/spec.js ADDED
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Kern v2 Specification
3
+ *
4
+ * The LLM-native language. Swiss-engineered.
5
+ * Designed by 3 AIs through forge + tribunal + brainstorm.
6
+ *
7
+ * Foundation: indent-based, semantic names, key=value props
8
+ * Styles: shorthand blocks in {} with CSS escape hatch
9
+ * Meta: theme nodes ($ref), pseudo-selectors (:press, :hover)
10
+ * Targets: Next.js, React+Tailwind, React Native, Express
11
+ */
12
+ export const KERN_VERSION = '2.0.0';
13
+ // ── Grammar ─────────────────────────────────────────────────────────────
14
+ export const IR_GRAMMAR = `
15
+ document = node+
16
+ node = indent type (SP prop)* (SP style)? (SP themeref)* NL child*
17
+ child = node
18
+ indent = " "*
19
+ type = ident
20
+ prop = ident "=" value
21
+ value = quoted | bare
22
+ quoted = '"' [^"]* '"'
23
+ bare = [^\\s{$]+
24
+ style = "{" spair ("," spair)* "}"
25
+ spair = sident ":" svalue | ":" pseudo ":" sident ":" svalue
26
+ pseudo = "press" | "hover" | "active" | "focus"
27
+ sident = shorthand | ident
28
+ svalue = [^,}]+
29
+ themeref = "$" ident
30
+ ident = [A-Za-z_][A-Za-z0-9_-]*
31
+ SP = " "+
32
+ NL = "\\n" | EOF
33
+ `;
34
+ // ── Node Types ──────────────────────────────────────────────────────────
35
+ export const NODE_TYPES = [
36
+ // Layout
37
+ 'screen', 'row', 'col', 'card', 'scroll',
38
+ // Content
39
+ 'text', 'image', 'progress', 'divider',
40
+ // Interactive
41
+ 'button', 'input', 'modal',
42
+ // Lists
43
+ 'list', 'item',
44
+ // Navigation
45
+ 'tabs', 'tab', 'header',
46
+ // Meta
47
+ 'theme',
48
+ // Backend
49
+ 'server', 'route', 'middleware', 'handler', 'schema',
50
+ 'stream', 'spawn', 'timer', 'on', 'env',
51
+ // CLI
52
+ 'cli', 'command', 'arg', 'flag', 'import',
53
+ // Terminal
54
+ 'separator', 'table', 'scoreboard', 'metric',
55
+ 'spinner', 'progress', 'box', 'gradient',
56
+ 'state', 'repl', 'guard', 'parallel', 'dispatch', 'then', 'each',
57
+ // Next.js production patterns
58
+ 'generateMetadata', 'notFound', 'redirect', 'fetch',
59
+ // Core Language — type system, functions, state machines
60
+ 'type', 'interface', 'field', 'fn',
61
+ 'machine', 'transition',
62
+ 'error', 'module', 'export',
63
+ 'config', 'store',
64
+ 'test', 'describe', 'it',
65
+ 'event',
66
+ // React — hooks, providers, effects
67
+ 'hook', 'provider', 'effect',
68
+ 'memo', 'callback', 'ref', 'context', 'cleanup',
69
+ 'prop', 'returns',
70
+ // Template system
71
+ 'template', 'slot', 'body',
72
+ ];
73
+ // ── Style Shorthands (FROZEN at v1.0 — 30 entries) ──────────────────────
74
+ // Any CSS property not in this map uses the escape hatch: "property":"value"
75
+ // This map will NOT grow. Use quoted keys for new CSS properties.
76
+ export const STYLE_SHORTHANDS = {
77
+ // Spacing
78
+ p: 'padding', m: 'margin',
79
+ pt: 'paddingTop', pb: 'paddingBottom', pl: 'paddingLeft', pr: 'paddingRight',
80
+ mt: 'marginTop', mb: 'marginBottom', ml: 'marginLeft', mr: 'marginRight',
81
+ // Sizing
82
+ w: 'width', h: 'height', f: 'flex',
83
+ // Colors
84
+ bg: 'backgroundColor', c: 'color', bc: 'borderColor',
85
+ // Typography
86
+ fs: 'fontSize', fw: 'fontWeight', ta: 'textAlign',
87
+ // Borders
88
+ br: 'borderRadius', bw: 'borderWidth',
89
+ // Layout
90
+ jc: 'justifyContent', ai: 'alignItems', fd: 'flexDirection',
91
+ // Effects
92
+ shadow: 'elevation',
93
+ };
94
+ // ── Justify/Align Value Shorthands ──────────────────────────────────────
95
+ export const VALUE_SHORTHANDS = {
96
+ sb: 'space-between', sa: 'space-around', se: 'space-evenly',
97
+ center: 'center', start: 'flex-start', end: 'flex-end',
98
+ stretch: 'stretch', bold: 'bold',
99
+ full: '100%',
100
+ };
101
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function expandStyleKey(key: string): string;
2
+ export declare function expandStyleValue(value: string): string | number;
3
+ export declare function expandStyles(styles: Record<string, string>): Record<string, string | number>;
@@ -0,0 +1,20 @@
1
+ import { STYLE_SHORTHANDS, VALUE_SHORTHANDS } from './spec.js';
2
+ export function expandStyleKey(key) {
3
+ return STYLE_SHORTHANDS[key] || key;
4
+ }
5
+ export function expandStyleValue(value) {
6
+ if (VALUE_SHORTHANDS[value])
7
+ return VALUE_SHORTHANDS[value];
8
+ const num = Number(value);
9
+ if (!isNaN(num) && value !== '')
10
+ return num;
11
+ return value;
12
+ }
13
+ export function expandStyles(styles) {
14
+ const result = {};
15
+ for (const [k, v] of Object.entries(styles)) {
16
+ result[expandStyleKey(k)] = expandStyleValue(v);
17
+ }
18
+ return result;
19
+ }
20
+ //# sourceMappingURL=styles-react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-react.js","sourceRoot":"","sources":["../src/styles-react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,gBAAgB,CAAC,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA8B;IACzD,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const DEFAULT_COLORS: Record<string, string>;
2
+ export declare function stylesToTailwind(styles: Record<string, string>, colors?: Record<string, string>): string;
3
+ export declare function pxToTw(prefix: string, v: string): string;
4
+ export declare function colorToTw(prefix: string, v: string, colors?: Record<string, string>): string;
5
+ export declare function fsTw(v: string): string;
6
+ export declare function fwTw(v: string): string;
7
+ export declare function addPx(v: string): string;
8
+ export declare function cssKebab(s: string): string;