create-refrakt 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { scaffold } from './scaffold.js';
2
+ import { scaffold, scaffoldTheme } from './scaffold.js';
3
3
  import * as path from 'node:path';
4
4
  const args = process.argv.slice(2);
5
5
  let projectName;
6
6
  let theme = '@refrakt-md/lumina';
7
+ let type = 'site';
8
+ let scope;
7
9
  for (let i = 0; i < args.length; i++) {
8
10
  const arg = args[i];
9
11
  if (arg === '--theme' || arg === '-t') {
@@ -13,6 +15,24 @@ for (let i = 0; i < args.length; i++) {
13
15
  process.exit(1);
14
16
  }
15
17
  }
18
+ else if (arg === '--type') {
19
+ const val = args[++i];
20
+ if (val !== 'site' && val !== 'theme') {
21
+ console.error('Error: --type must be "site" or "theme"');
22
+ process.exit(1);
23
+ }
24
+ type = val;
25
+ }
26
+ else if (arg === '--scope' || arg === '-s') {
27
+ scope = args[++i];
28
+ if (!scope) {
29
+ console.error('Error: --scope requires a value');
30
+ process.exit(1);
31
+ }
32
+ if (!scope.startsWith('@')) {
33
+ scope = `@${scope}`;
34
+ }
35
+ }
16
36
  else if (arg === '--help' || arg === '-h') {
17
37
  printUsage();
18
38
  process.exit(0);
@@ -38,26 +58,56 @@ if (!projectName) {
38
58
  }
39
59
  function printUsage() {
40
60
  console.log(`
41
- Usage: create-refrakt <project-name> [options]
61
+ Usage: create-refrakt <name> [options]
42
62
 
43
63
  Options:
44
- --theme, -t <package> Theme package to use (default: @refrakt-md/lumina)
64
+ --type <site|theme> What to create (default: site)
65
+ --theme, -t <package> Theme package to use (sites only, default: @refrakt-md/lumina)
66
+ --scope, -s <scope> npm scope for the package (themes only, e.g., @my-org)
45
67
  --help, -h Show this help message
46
68
 
47
- Example:
69
+ Examples:
48
70
  npx create-refrakt my-site
49
71
  npx create-refrakt my-site --theme @refrakt-md/aurora
72
+ npx create-refrakt my-theme --type theme
73
+ npx create-refrakt my-theme --type theme --scope @my-org
50
74
  `);
51
75
  }
52
76
  const targetDir = path.resolve(process.cwd(), projectName);
53
77
  try {
54
- scaffold({ projectName, targetDir, theme });
78
+ if (type === 'theme') {
79
+ scaffoldTheme({ themeName: projectName, targetDir, scope });
80
+ }
81
+ else {
82
+ scaffold({ projectName, targetDir, theme });
83
+ }
55
84
  }
56
85
  catch (err) {
57
86
  console.error(`\nError: ${err.message}`);
58
87
  process.exit(1);
59
88
  }
60
- console.log(`
89
+ if (type === 'theme') {
90
+ console.log(`
91
+ Done! Your refrakt.md theme package is ready.
92
+
93
+ Next steps:
94
+
95
+ cd ${projectName}
96
+ npm install
97
+ npm run build
98
+
99
+ Then use it in a site:
100
+
101
+ {
102
+ "theme": "${scope ? `${scope}/${projectName}` : projectName}",
103
+ "target": "svelte"
104
+ }
105
+
106
+ Run \`refrakt scaffold-css\` to generate CSS stubs for all runes.
107
+ `);
108
+ }
109
+ else {
110
+ console.log(`
61
111
  Done! Your refrakt.md site is ready.
62
112
 
63
113
  Next steps:
@@ -66,4 +116,5 @@ Next steps:
66
116
  npm install
67
117
  npm run dev
68
118
  `);
119
+ }
69
120
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,WAA+B,CAAC;AACpC,IAAI,KAAK,GAAG,oBAAoB,CAAC;AAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACvC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAC,CAAC;QAChD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,WAAW,GAAG,GAAG,CAAC;IACnB,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,KAAK,CAAC,CAAC;QACvD,UAAU,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,CAAC,WAAW,EAAE,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,UAAU;IAClB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;CAUZ,CAAC,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAE3D,IAAI,CAAC;IACJ,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7C,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,OAAO,CAAC,GAAG,CAAC;;;;;OAKL,WAAW;;;CAGjB,CAAC,CAAC"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,10 @@ export interface ScaffoldOptions {
4
4
  theme: string;
5
5
  }
6
6
  export declare function scaffold(options: ScaffoldOptions): void;
7
+ export interface ThemeScaffoldOptions {
8
+ themeName: string;
9
+ targetDir: string;
10
+ scope?: string;
11
+ }
12
+ export declare function scaffoldTheme(options: ThemeScaffoldOptions): void;
7
13
  //# sourceMappingURL=scaffold.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAoDvD"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAoDvD;AAyED,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAqFjE"}
package/dist/scaffold.js CHANGED
@@ -1,6 +1,11 @@
1
- import { mkdirSync, cpSync, writeFileSync, existsSync, renameSync } from 'node:fs';
1
+ import { mkdirSync, cpSync, writeFileSync, existsSync, renameSync, readFileSync } from 'node:fs';
2
2
  import * as path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ function getRefraktVersion() {
5
+ const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
6
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
7
+ return pkg.version;
8
+ }
4
9
  export function scaffold(options) {
5
10
  const { projectName, targetDir, theme } = options;
6
11
  if (existsSync(targetDir)) {
@@ -31,6 +36,7 @@ export function scaffold(options) {
31
36
  writeFileSync(path.join(targetDir, 'README.md'), generateReadme(projectName));
32
37
  }
33
38
  function generatePackageJson(projectName, theme) {
39
+ const v = `~${getRefraktVersion()}`;
34
40
  const pkg = {
35
41
  name: projectName,
36
42
  private: true,
@@ -44,11 +50,13 @@ function generatePackageJson(projectName, theme) {
44
50
  check: 'svelte-kit sync && svelte-check --tsconfig ./tsconfig.json',
45
51
  },
46
52
  dependencies: {
47
- '@refrakt-md/content': '^0.1.0',
48
- '@refrakt-md/runes': '^0.1.0',
49
- '@refrakt-md/svelte': '^0.1.0',
50
- '@refrakt-md/sveltekit': '^0.1.0',
51
- [theme]: '^0.1.0',
53
+ '@refrakt-md/content': v,
54
+ '@refrakt-md/highlight': v,
55
+ '@refrakt-md/runes': v,
56
+ '@refrakt-md/svelte': v,
57
+ '@refrakt-md/sveltekit': v,
58
+ '@refrakt-md/types': v,
59
+ [theme]: v,
52
60
  '@markdoc/markdoc': '^0.4.0',
53
61
  },
54
62
  devDependencies: {
@@ -69,7 +77,7 @@ function generateRefraktConfig(theme) {
69
77
  const config = {
70
78
  contentDir: './content',
71
79
  theme,
72
- target: 'sveltekit',
80
+ target: 'svelte',
73
81
  };
74
82
  return JSON.stringify(config, null, '\t') + '\n';
75
83
  }
@@ -93,4 +101,483 @@ npm run preview
93
101
  \`\`\`
94
102
  `;
95
103
  }
104
+ export function scaffoldTheme(options) {
105
+ const { themeName, targetDir, scope } = options;
106
+ if (existsSync(targetDir)) {
107
+ throw new Error(`Directory "${targetDir}" already exists`);
108
+ }
109
+ const packageName = scope ? `${scope}/${themeName}` : themeName;
110
+ mkdirSync(path.join(targetDir, 'src'), { recursive: true });
111
+ mkdirSync(path.join(targetDir, 'svelte', 'layouts'), { recursive: true });
112
+ mkdirSync(path.join(targetDir, 'tokens'), { recursive: true });
113
+ mkdirSync(path.join(targetDir, 'styles', 'runes'), { recursive: true });
114
+ mkdirSync(path.join(targetDir, 'test'), { recursive: true });
115
+ mkdirSync(path.join(targetDir, 'preview'), { recursive: true });
116
+ writeFileSync(path.join(targetDir, 'package.json'), generateThemePackageJson(packageName));
117
+ writeFileSync(path.join(targetDir, 'src', 'config.ts'), generateThemeConfig());
118
+ writeFileSync(path.join(targetDir, 'svelte', 'index.ts'), generateThemeSvelteIndex());
119
+ writeFileSync(path.join(targetDir, 'manifest.json'), generateThemeManifest(packageName));
120
+ writeFileSync(path.join(targetDir, 'index.css'), generateThemeIndexCss());
121
+ writeFileSync(path.join(targetDir, 'tokens', 'base.css'), generateThemeBaseTokens());
122
+ writeFileSync(path.join(targetDir, 'tokens', 'dark.css'), generateThemeDarkTokens());
123
+ writeFileSync(path.join(targetDir, 'styles', 'global.css'), generateThemeGlobalCss());
124
+ writeFileSync(path.join(targetDir, 'tsconfig.json'), generateThemeTsconfig());
125
+ writeFileSync(path.join(targetDir, 'svelte', 'layouts', 'DefaultLayout.svelte'), generateThemeDefaultLayout());
126
+ writeFileSync(path.join(targetDir, 'test', 'css-coverage.test.ts'), generateThemeCssCoverageTest());
127
+ writeFileSync(path.join(targetDir, 'preview', 'kitchen-sink.md'), generateThemeKitchenSink());
128
+ writeFileSync(path.join(targetDir, 'base.css'), generateThemeBaseCss());
129
+ writeFileSync(path.join(targetDir, 'svelte', 'tokens.css'), generateThemeTokensBridge());
130
+ }
131
+ function generateThemePackageJson(packageName) {
132
+ const pkg = {
133
+ name: packageName,
134
+ version: '0.1.0',
135
+ type: 'module',
136
+ main: 'dist/config.js',
137
+ types: 'dist/config.d.ts',
138
+ exports: {
139
+ '.': './index.css',
140
+ './base.css': './base.css',
141
+ './transform': {
142
+ types: './dist/config.d.ts',
143
+ default: './dist/config.js',
144
+ },
145
+ './svelte': {
146
+ svelte: './svelte/index.ts',
147
+ default: './svelte/index.ts',
148
+ },
149
+ './manifest': './manifest.json',
150
+ './styles/runes/*.css': './styles/runes/*.css',
151
+ './svelte/tokens.css': './svelte/tokens.css',
152
+ },
153
+ files: [
154
+ 'dist',
155
+ 'base.css',
156
+ 'index.css',
157
+ 'tokens',
158
+ 'styles',
159
+ 'manifest.json',
160
+ 'svelte',
161
+ ],
162
+ scripts: {
163
+ build: 'tsc',
164
+ test: 'vitest run',
165
+ },
166
+ dependencies: {
167
+ '@refrakt-md/theme-base': `~${getRefraktVersion()}`,
168
+ '@refrakt-md/transform': `~${getRefraktVersion()}`,
169
+ '@refrakt-md/types': `~${getRefraktVersion()}`,
170
+ '@refrakt-md/svelte': `~${getRefraktVersion()}`,
171
+ },
172
+ devDependencies: {
173
+ vitest: '^3.0.0',
174
+ postcss: '^8.4.0',
175
+ },
176
+ };
177
+ return JSON.stringify(pkg, null, '\t') + '\n';
178
+ }
179
+ function generateThemeConfig() {
180
+ return `import { baseConfig, mergeThemeConfig } from '@refrakt-md/theme-base';
181
+
182
+ export const themeConfig = mergeThemeConfig(baseConfig, {
183
+ \t// Provide icon SVGs for runes that display them (e.g., Hint)
184
+ \ticons: {
185
+ \t\t// hint: {
186
+ \t\t// note: '<svg xmlns="http://www.w3.org/2000/svg" ...>...</svg>',
187
+ \t\t// warning: '<svg ...>...</svg>',
188
+ \t\t// caution: '<svg ...>...</svg>',
189
+ \t\t// check: '<svg ...>...</svg>',
190
+ \t\t// },
191
+ \t},
192
+
193
+ \t// Override specific rune configs (optional)
194
+ \trunes: {},
195
+ });
196
+ `;
197
+ }
198
+ function generateThemeSvelteIndex() {
199
+ return `import type { SvelteTheme } from '@refrakt-md/svelte';
200
+ import manifest from '../manifest.json';
201
+ import { registry } from '@refrakt-md/theme-base/svelte/registry';
202
+ import { elements } from '@refrakt-md/theme-base/svelte/elements';
203
+ import DefaultLayout from './layouts/DefaultLayout.svelte';
204
+
205
+ export { default as manifest } from '../manifest.json';
206
+
207
+ export const theme: SvelteTheme = {
208
+ \tmanifest: manifest as any,
209
+ \tlayouts: { default: DefaultLayout },
210
+ \tcomponents: registry,
211
+ \telements,
212
+ };
213
+
214
+ export { registry };
215
+ export { behaviors } from '@refrakt-md/theme-base/svelte/behaviors';
216
+ export { default as DefaultLayout } from './layouts/DefaultLayout.svelte';
217
+ `;
218
+ }
219
+ function generateThemeManifest(packageName) {
220
+ const manifest = {
221
+ name: packageName,
222
+ version: '0.1.0',
223
+ target: 'svelte',
224
+ designTokens: './tokens/base.css',
225
+ layouts: {
226
+ default: {
227
+ component: './svelte/layouts/DefaultLayout.svelte',
228
+ regions: ['content'],
229
+ },
230
+ },
231
+ routeRules: [
232
+ { pattern: '**', layout: 'default' },
233
+ ],
234
+ components: {},
235
+ unsupportedRuneBehavior: 'passthrough',
236
+ };
237
+ return JSON.stringify(manifest, null, '\t') + '\n';
238
+ }
239
+ function generateThemeIndexCss() {
240
+ return `/* Design tokens */
241
+ @import './tokens/base.css';
242
+ @import './tokens/dark.css';
243
+
244
+ /* Global styles */
245
+ @import './styles/global.css';
246
+
247
+ /* Rune styles — add imports as you create CSS for each rune */
248
+ /* @import './styles/runes/hint.css'; */
249
+ /* @import './styles/runes/grid.css'; */
250
+ `;
251
+ }
252
+ function generateThemeBaseTokens() {
253
+ return `:root {
254
+ \t/* Typography */
255
+ \t--rf-font-sans: system-ui, -apple-system, sans-serif;
256
+ \t--rf-font-mono: ui-monospace, 'SFMono-Regular', monospace;
257
+
258
+ \t/* Primary color scale */
259
+ \t--rf-color-primary-50: #f0f9ff;
260
+ \t--rf-color-primary-100: #e0f2fe;
261
+ \t--rf-color-primary-500: #3b82f6;
262
+ \t--rf-color-primary-600: #2563eb;
263
+ \t--rf-color-primary-900: #1e3a5f;
264
+
265
+ \t/* Core palette */
266
+ \t--rf-color-text: #1a1a2e;
267
+ \t--rf-color-muted: #64748b;
268
+ \t--rf-color-border: #e2e8f0;
269
+ \t--rf-color-bg: #ffffff;
270
+ \t--rf-color-primary: var(--rf-color-primary-500);
271
+ \t--rf-color-primary-hover: var(--rf-color-primary-600);
272
+
273
+ \t/* Surfaces */
274
+ \t--rf-color-surface: #f8fafc;
275
+ \t--rf-color-surface-hover: #f1f5f9;
276
+ \t--rf-color-surface-active: #e2e8f0;
277
+ \t--rf-color-surface-raised: #ffffff;
278
+
279
+ \t/* Semantic */
280
+ \t--rf-color-info: #3b82f6;
281
+ \t--rf-color-info-bg: #eff6ff;
282
+ \t--rf-color-info-border: #bfdbfe;
283
+ \t--rf-color-warning: #f59e0b;
284
+ \t--rf-color-warning-bg: #fffbeb;
285
+ \t--rf-color-warning-border: #fde68a;
286
+ \t--rf-color-danger: #ef4444;
287
+ \t--rf-color-danger-bg: #fef2f2;
288
+ \t--rf-color-danger-border: #fecaca;
289
+ \t--rf-color-success: #10b981;
290
+ \t--rf-color-success-bg: #ecfdf5;
291
+ \t--rf-color-success-border: #a7f3d0;
292
+
293
+ \t/* Radii */
294
+ \t--rf-radius-sm: 6px;
295
+ \t--rf-radius-md: 10px;
296
+ \t--rf-radius-lg: 16px;
297
+ \t--rf-radius-full: 9999px;
298
+
299
+ \t/* Shadows */
300
+ \t--rf-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06);
301
+ \t--rf-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.07);
302
+ \t--rf-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.08);
303
+ }
304
+ `;
305
+ }
306
+ function generateThemeDarkTokens() {
307
+ return `[data-theme="dark"] {
308
+ \t--rf-color-text: #e2e8f0;
309
+ \t--rf-color-muted: #94a3b8;
310
+ \t--rf-color-border: #334155;
311
+ \t--rf-color-bg: #0f172a;
312
+ \t--rf-color-surface: #1e293b;
313
+ \t--rf-color-surface-hover: #334155;
314
+ \t--rf-color-surface-active: #475569;
315
+ \t--rf-color-surface-raised: #1e293b;
316
+ \t--rf-color-info-bg: #1e3a5f;
317
+ \t--rf-color-info-border: #1e40af;
318
+ \t--rf-color-warning-bg: #451a03;
319
+ \t--rf-color-warning-border: #92400e;
320
+ \t--rf-color-danger-bg: #450a0a;
321
+ \t--rf-color-danger-border: #991b1b;
322
+ \t--rf-color-success-bg: #052e16;
323
+ \t--rf-color-success-border: #166534;
324
+ }
325
+
326
+ @media (prefers-color-scheme: dark) {
327
+ \t:root:not([data-theme="light"]) {
328
+ \t\t--rf-color-text: #e2e8f0;
329
+ \t\t--rf-color-muted: #94a3b8;
330
+ \t\t--rf-color-border: #334155;
331
+ \t\t--rf-color-bg: #0f172a;
332
+ \t\t--rf-color-surface: #1e293b;
333
+ \t\t--rf-color-surface-hover: #334155;
334
+ \t\t--rf-color-surface-active: #475569;
335
+ \t\t--rf-color-surface-raised: #1e293b;
336
+ \t\t--rf-color-info-bg: #1e3a5f;
337
+ \t\t--rf-color-info-border: #1e40af;
338
+ \t\t--rf-color-warning-bg: #451a03;
339
+ \t\t--rf-color-warning-border: #92400e;
340
+ \t\t--rf-color-danger-bg: #450a0a;
341
+ \t\t--rf-color-danger-border: #991b1b;
342
+ \t\t--rf-color-success-bg: #052e16;
343
+ \t\t--rf-color-success-border: #166534;
344
+ \t}
345
+ }
346
+ `;
347
+ }
348
+ function generateThemeGlobalCss() {
349
+ return `/* Global resets and base styles */
350
+ *,
351
+ *::before,
352
+ *::after {
353
+ \tbox-sizing: border-box;
354
+ }
355
+
356
+ body {
357
+ \tfont-family: var(--rf-font-sans);
358
+ \tcolor: var(--rf-color-text);
359
+ \tbackground-color: var(--rf-color-bg);
360
+ \tline-height: 1.6;
361
+ \t-webkit-font-smoothing: antialiased;
362
+ }
363
+ `;
364
+ }
365
+ function generateThemeTsconfig() {
366
+ const config = {
367
+ compilerOptions: {
368
+ target: 'ES2022',
369
+ module: 'ES2022',
370
+ moduleResolution: 'bundler',
371
+ declaration: true,
372
+ outDir: 'dist',
373
+ rootDir: 'src',
374
+ strict: true,
375
+ esModuleInterop: true,
376
+ skipLibCheck: true,
377
+ },
378
+ include: ['src'],
379
+ };
380
+ return JSON.stringify(config, null, '\t') + '\n';
381
+ }
382
+ function generateThemeDefaultLayout() {
383
+ return `<script lang="ts">
384
+ \timport { Renderer } from '@refrakt-md/svelte';
385
+
386
+ \tlet { regions, renderable }: {
387
+ \t\tregions: Record<string, { name: string; mode: string; content: any[] }>;
388
+ \t\trenderable: any;
389
+ \t} = $props();
390
+ </script>
391
+
392
+ {#if regions.header}
393
+ \t<header>
394
+ \t\t<Renderer node={regions.header.content} />
395
+ \t</header>
396
+ {/if}
397
+
398
+ <main>
399
+ \t<Renderer node={renderable} />
400
+ </main>
401
+ `;
402
+ }
403
+ function generateThemeCssCoverageTest() {
404
+ return `import { describe, it, expect } from 'vitest';
405
+ import { readFileSync, readdirSync, existsSync } from 'fs';
406
+ import { join } from 'path';
407
+ import postcss from 'postcss';
408
+ import { themeConfig } from '../src/config.js';
409
+
410
+ const CSS_DIR = join(__dirname, '..', 'styles', 'runes');
411
+
412
+ /** Parse all CSS files and collect every .rf-* class selector */
413
+ function parseAllCssSelectors(): Set<string> {
414
+ \tconst selectors = new Set<string>();
415
+ \tif (!existsSync(CSS_DIR)) return selectors;
416
+
417
+ \tconst files = readdirSync(CSS_DIR).filter(f => f.endsWith('.css'));
418
+ \tfor (const file of files) {
419
+ \t\tconst css = readFileSync(join(CSS_DIR, file), 'utf-8');
420
+ \t\tconst root = postcss.parse(css);
421
+ \t\troot.walkRules(rule => {
422
+ \t\t\tconst matches = rule.selector.matchAll(/\\.rf-[\\w-]+/g);
423
+ \t\t\tfor (const m of matches) {
424
+ \t\t\t\tselectors.add(m[0]);
425
+ \t\t\t}
426
+ \t\t});
427
+ \t}
428
+ \treturn selectors;
429
+ }
430
+
431
+ const allCssSelectors = parseAllCssSelectors();
432
+ const { prefix, runes } = themeConfig;
433
+
434
+ describe('Theme CSS coverage', () => {
435
+ \tit('block selectors exist for styled runes', () => {
436
+ \t\tconst allBlocks = [...new Set(Object.values(runes).map(c => c.block))];
437
+ \t\tconst styledBlocks = allBlocks.filter(block =>
438
+ \t\t\tallCssSelectors.has(\`.\${prefix}-\${block}\`)
439
+ \t\t);
440
+
441
+ \t\tconsole.log(\`CSS coverage: \${styledBlocks.length}/\${allBlocks.length} blocks\`);
442
+ \t\t// Start at 0% — increase this threshold as you add CSS
443
+ \t\texpect(styledBlocks.length).toBeGreaterThanOrEqual(0);
444
+ \t});
445
+ });
446
+ `;
447
+ }
448
+ function generateThemeKitchenSink() {
449
+ return `---
450
+ title: Kitchen Sink
451
+ description: Preview of all major runes for theme development.
452
+ ---
453
+
454
+ # Kitchen Sink
455
+
456
+ This page demonstrates all major rune types. Use it to preview your theme styles.
457
+
458
+ ## Hints
459
+
460
+ {% hint type="note" %}
461
+ This is a **note** hint for general information.
462
+ {% /hint %}
463
+
464
+ {% hint type="warning" %}
465
+ This is a **warning** hint for cautionary messages.
466
+ {% /hint %}
467
+
468
+ {% hint type="caution" %}
469
+ This is a **caution** hint for dangerous actions.
470
+ {% /hint %}
471
+
472
+ {% hint type="check" %}
473
+ This is a **check** hint for success messages.
474
+ {% /hint %}
475
+
476
+ ## Grid
477
+
478
+ {% grid columns=3 %}
479
+
480
+ **Fast**
481
+
482
+ Lightning-fast build times with incremental compilation.
483
+
484
+ ---
485
+
486
+ **Flexible**
487
+
488
+ Supports multiple frameworks and output targets.
489
+
490
+ ---
491
+
492
+ **Extensible**
493
+
494
+ Create custom runes and themes to match your brand.
495
+
496
+ {% /grid %}
497
+
498
+ ## Accordion
499
+
500
+ {% accordion %}
501
+ ### What is refrakt.md?
502
+ A documentation framework that transforms Markdown into rich, interactive pages.
503
+
504
+ ### How do themes work?
505
+ Themes provide an identity transform layer (BEM classes, structure) and optional Svelte components for interactive runes.
506
+
507
+ ### Can I create my own runes?
508
+ Yes! Define a schema in the runes package and add engine config to your theme.
509
+ {% /accordion %}
510
+
511
+ ## Steps
512
+
513
+ {% steps %}
514
+ ### Install dependencies
515
+ \`\`\`sh
516
+ npm install
517
+ \`\`\`
518
+
519
+ ### Configure your theme
520
+ Edit \`src/config.ts\` to customize rune behavior and icons.
521
+
522
+ ### Add CSS styles
523
+ Create CSS files in \`styles/runes/\` for each rune block.
524
+ {% /steps %}
525
+
526
+ ## API Endpoint
527
+
528
+ {% api method="GET" path="/api/users" %}
529
+ Returns a list of all users.
530
+
531
+ ### Parameters
532
+
533
+ | Name | Type | Description |
534
+ |------|------|-------------|
535
+ | limit | number | Max results to return |
536
+ | offset | number | Pagination offset |
537
+ {% /api %}
538
+
539
+ ## Tabs
540
+
541
+ {% tabs %}
542
+ {% tab title="npm" %}
543
+ \`\`\`sh
544
+ npm install @refrakt-md/svelte
545
+ \`\`\`
546
+ {% /tab %}
547
+
548
+ {% tab title="pnpm" %}
549
+ \`\`\`sh
550
+ pnpm add @refrakt-md/svelte
551
+ \`\`\`
552
+ {% /tab %}
553
+
554
+ {% tab title="yarn" %}
555
+ \`\`\`sh
556
+ yarn add @refrakt-md/svelte
557
+ \`\`\`
558
+ {% /tab %}
559
+ {% /tabs %}
560
+
561
+ ## Code Block
562
+
563
+ \`\`\`ts title="example.ts"
564
+ import { themeConfig } from './config';
565
+
566
+ export function greet(name: string): string {
567
+ return \`Hello, \${name}!\`;
568
+ }
569
+ \`\`\`
570
+ `;
571
+ }
572
+ function generateThemeBaseCss() {
573
+ return `/* Base styles — tokens + globals (no rune CSS) */
574
+ @import './tokens/base.css';
575
+ @import './tokens/dark.css';
576
+ @import './styles/global.css';
577
+ `;
578
+ }
579
+ function generateThemeTokensBridge() {
580
+ return `@import '../index.css';
581
+ `;
582
+ }
96
583
  //# sourceMappingURL=scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-refrakt",
3
3
  "description": "Scaffold a new refrakt.md project",
4
- "version": "0.4.0",
4
+ "version": "0.5.1",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -1,7 +1,10 @@
1
1
  import { loadContent } from '@refrakt-md/content';
2
+ import { readFileSync } from 'node:fs';
2
3
  import * as path from 'node:path';
4
+ import type { RefraktConfig } from '@refrakt-md/types';
3
5
 
4
- const contentDir = path.resolve('content');
6
+ const config: RefraktConfig = JSON.parse(readFileSync(path.resolve('refrakt.config.json'), 'utf-8'));
7
+ const contentDir = path.resolve(config.contentDir);
5
8
 
6
9
  export async function load() {
7
10
  const site = await loadContent(contentDir);
@@ -1,15 +1,31 @@
1
1
  import { loadContent } from '@refrakt-md/content';
2
2
  import { serialize, serializeTree } from '@refrakt-md/svelte';
3
+ import { createHighlightTransform } from '@refrakt-md/highlight';
4
+ import type { HighlightTransform } from '@refrakt-md/highlight';
3
5
  import { error } from '@sveltejs/kit';
6
+ import { readFileSync } from 'node:fs';
4
7
  import * as path from 'node:path';
5
8
  import type { PageServerLoad } from './$types';
9
+ import type { RefraktConfig } from '@refrakt-md/types';
6
10
 
7
- const contentDir = path.resolve('content');
11
+ const config: RefraktConfig = JSON.parse(readFileSync(path.resolve('refrakt.config.json'), 'utf-8'));
12
+ const contentDir = path.resolve(config.contentDir);
13
+
14
+ let _hl: HighlightTransform | null = null;
15
+
16
+ async function getHighlightTransform(): Promise<HighlightTransform> {
17
+ const cached = _hl;
18
+ if (cached) return cached;
19
+ const hl = await createHighlightTransform(config.highlight);
20
+ _hl = hl;
21
+ return hl;
22
+ }
8
23
 
9
24
  export const prerender = true;
10
25
 
11
26
  export const load: PageServerLoad = async ({ params }) => {
12
27
  const site = await loadContent(contentDir);
28
+ const hl = await getHighlightTransform();
13
29
  const slug = params.slug || '';
14
30
  const url = '/' + slug;
15
31
 
@@ -19,17 +35,20 @@ export const load: PageServerLoad = async ({ params }) => {
19
35
  error(404, 'Page not found');
20
36
  }
21
37
 
38
+ const renderable = hl(serializeTree(page.renderable));
39
+
22
40
  return {
23
41
  title: page.frontmatter.title ?? '',
24
42
  description: page.frontmatter.description ?? '',
25
- renderable: serializeTree(page.renderable),
43
+ renderable,
26
44
  regions: Object.fromEntries(
27
45
  [...page.layout.regions.entries()].map(([name, region]) => [
28
46
  name,
29
- { name: region.name, mode: region.mode, content: region.content.map(serialize) }
47
+ { name: region.name, mode: region.mode, content: region.content.map(c => hl(serialize(c))) }
30
48
  ])
31
49
  ),
32
50
  url,
51
+ highlightCss: hl.css,
33
52
  };
34
53
  };
35
54
 
@@ -5,6 +5,12 @@
5
5
  let { data } = $props();
6
6
  </script>
7
7
 
8
+ <svelte:head>
9
+ {#if data.highlightCss}
10
+ {@html `<style>${data.highlightCss}</style>`}
11
+ {/if}
12
+ </svelte:head>
13
+
8
14
  <ThemeShell
9
15
  {theme}
10
16
  page={{