create-refrakt 0.3.0 → 0.5.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.
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
- let theme = '@refrakt-md/theme-lumina';
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/theme-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
- npx create-refrakt my-site --theme @refrakt-md/theme-aurora
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,0BAA0B,CAAC;AAEvC,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":"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;AAwED,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
@@ -44,11 +44,13 @@ function generatePackageJson(projectName, theme) {
44
44
  check: 'svelte-kit sync && svelte-check --tsconfig ./tsconfig.json',
45
45
  },
46
46
  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',
47
+ '@refrakt-md/content': '^0.4.0',
48
+ '@refrakt-md/highlight': '^0.4.0',
49
+ '@refrakt-md/runes': '^0.4.0',
50
+ '@refrakt-md/svelte': '^0.4.0',
51
+ '@refrakt-md/sveltekit': '^0.4.0',
52
+ '@refrakt-md/types': '^0.4.0',
53
+ [theme]: '^0.4.0',
52
54
  '@markdoc/markdoc': '^0.4.0',
53
55
  },
54
56
  devDependencies: {
@@ -69,7 +71,7 @@ function generateRefraktConfig(theme) {
69
71
  const config = {
70
72
  contentDir: './content',
71
73
  theme,
72
- target: 'sveltekit',
74
+ target: 'svelte',
73
75
  };
74
76
  return JSON.stringify(config, null, '\t') + '\n';
75
77
  }
@@ -93,4 +95,477 @@ npm run preview
93
95
  \`\`\`
94
96
  `;
95
97
  }
98
+ export function scaffoldTheme(options) {
99
+ const { themeName, targetDir, scope } = options;
100
+ if (existsSync(targetDir)) {
101
+ throw new Error(`Directory "${targetDir}" already exists`);
102
+ }
103
+ const packageName = scope ? `${scope}/${themeName}` : themeName;
104
+ mkdirSync(path.join(targetDir, 'src'), { recursive: true });
105
+ mkdirSync(path.join(targetDir, 'svelte', 'layouts'), { recursive: true });
106
+ mkdirSync(path.join(targetDir, 'tokens'), { recursive: true });
107
+ mkdirSync(path.join(targetDir, 'styles', 'runes'), { recursive: true });
108
+ mkdirSync(path.join(targetDir, 'test'), { recursive: true });
109
+ mkdirSync(path.join(targetDir, 'preview'), { recursive: true });
110
+ writeFileSync(path.join(targetDir, 'package.json'), generateThemePackageJson(packageName));
111
+ writeFileSync(path.join(targetDir, 'src', 'config.ts'), generateThemeConfig());
112
+ writeFileSync(path.join(targetDir, 'svelte', 'index.ts'), generateThemeSvelteIndex());
113
+ writeFileSync(path.join(targetDir, 'manifest.json'), generateThemeManifest(packageName));
114
+ writeFileSync(path.join(targetDir, 'index.css'), generateThemeIndexCss());
115
+ writeFileSync(path.join(targetDir, 'tokens', 'base.css'), generateThemeBaseTokens());
116
+ writeFileSync(path.join(targetDir, 'tokens', 'dark.css'), generateThemeDarkTokens());
117
+ writeFileSync(path.join(targetDir, 'styles', 'global.css'), generateThemeGlobalCss());
118
+ writeFileSync(path.join(targetDir, 'tsconfig.json'), generateThemeTsconfig());
119
+ writeFileSync(path.join(targetDir, 'svelte', 'layouts', 'DefaultLayout.svelte'), generateThemeDefaultLayout());
120
+ writeFileSync(path.join(targetDir, 'test', 'css-coverage.test.ts'), generateThemeCssCoverageTest());
121
+ writeFileSync(path.join(targetDir, 'preview', 'kitchen-sink.md'), generateThemeKitchenSink());
122
+ writeFileSync(path.join(targetDir, 'base.css'), generateThemeBaseCss());
123
+ writeFileSync(path.join(targetDir, 'svelte', 'tokens.css'), generateThemeTokensBridge());
124
+ }
125
+ function generateThemePackageJson(packageName) {
126
+ const pkg = {
127
+ name: packageName,
128
+ version: '0.1.0',
129
+ type: 'module',
130
+ main: 'dist/config.js',
131
+ types: 'dist/config.d.ts',
132
+ exports: {
133
+ '.': './index.css',
134
+ './base.css': './base.css',
135
+ './transform': {
136
+ types: './dist/config.d.ts',
137
+ default: './dist/config.js',
138
+ },
139
+ './svelte': {
140
+ svelte: './svelte/index.ts',
141
+ default: './svelte/index.ts',
142
+ },
143
+ './manifest': './manifest.json',
144
+ './styles/runes/*.css': './styles/runes/*.css',
145
+ './svelte/tokens.css': './svelte/tokens.css',
146
+ },
147
+ files: [
148
+ 'dist',
149
+ 'base.css',
150
+ 'index.css',
151
+ 'tokens',
152
+ 'styles',
153
+ 'manifest.json',
154
+ 'svelte',
155
+ ],
156
+ scripts: {
157
+ build: 'tsc',
158
+ test: 'vitest run',
159
+ },
160
+ dependencies: {
161
+ '@refrakt-md/theme-base': '^0.4.0',
162
+ '@refrakt-md/transform': '^0.4.0',
163
+ '@refrakt-md/types': '^0.4.0',
164
+ '@refrakt-md/svelte': '^0.4.0',
165
+ },
166
+ devDependencies: {
167
+ vitest: '^3.0.0',
168
+ postcss: '^8.4.0',
169
+ },
170
+ };
171
+ return JSON.stringify(pkg, null, '\t') + '\n';
172
+ }
173
+ function generateThemeConfig() {
174
+ return `import { baseConfig, mergeThemeConfig } from '@refrakt-md/theme-base';
175
+
176
+ export const themeConfig = mergeThemeConfig(baseConfig, {
177
+ \t// Provide icon SVGs for runes that display them (e.g., Hint)
178
+ \ticons: {
179
+ \t\t// hint: {
180
+ \t\t// note: '<svg xmlns="http://www.w3.org/2000/svg" ...>...</svg>',
181
+ \t\t// warning: '<svg ...>...</svg>',
182
+ \t\t// caution: '<svg ...>...</svg>',
183
+ \t\t// check: '<svg ...>...</svg>',
184
+ \t\t// },
185
+ \t},
186
+
187
+ \t// Override specific rune configs (optional)
188
+ \trunes: {},
189
+ });
190
+ `;
191
+ }
192
+ function generateThemeSvelteIndex() {
193
+ return `import type { SvelteTheme } from '@refrakt-md/svelte';
194
+ import manifest from '../manifest.json';
195
+ import { registry } from '@refrakt-md/theme-base/svelte/registry';
196
+ import { elements } from '@refrakt-md/theme-base/svelte/elements';
197
+ import DefaultLayout from './layouts/DefaultLayout.svelte';
198
+
199
+ export { default as manifest } from '../manifest.json';
200
+
201
+ export const theme: SvelteTheme = {
202
+ \tmanifest: manifest as any,
203
+ \tlayouts: { default: DefaultLayout },
204
+ \tcomponents: registry,
205
+ \telements,
206
+ };
207
+
208
+ export { registry };
209
+ export { behaviors } from '@refrakt-md/theme-base/svelte/behaviors';
210
+ export { default as DefaultLayout } from './layouts/DefaultLayout.svelte';
211
+ `;
212
+ }
213
+ function generateThemeManifest(packageName) {
214
+ const manifest = {
215
+ name: packageName,
216
+ version: '0.1.0',
217
+ target: 'svelte',
218
+ designTokens: './tokens/base.css',
219
+ layouts: {
220
+ default: {
221
+ component: './svelte/layouts/DefaultLayout.svelte',
222
+ regions: ['content'],
223
+ },
224
+ },
225
+ routeRules: [
226
+ { pattern: '**', layout: 'default' },
227
+ ],
228
+ components: {},
229
+ unsupportedRuneBehavior: 'passthrough',
230
+ };
231
+ return JSON.stringify(manifest, null, '\t') + '\n';
232
+ }
233
+ function generateThemeIndexCss() {
234
+ return `/* Design tokens */
235
+ @import './tokens/base.css';
236
+ @import './tokens/dark.css';
237
+
238
+ /* Global styles */
239
+ @import './styles/global.css';
240
+
241
+ /* Rune styles — add imports as you create CSS for each rune */
242
+ /* @import './styles/runes/hint.css'; */
243
+ /* @import './styles/runes/grid.css'; */
244
+ `;
245
+ }
246
+ function generateThemeBaseTokens() {
247
+ return `:root {
248
+ \t/* Typography */
249
+ \t--rf-font-sans: system-ui, -apple-system, sans-serif;
250
+ \t--rf-font-mono: ui-monospace, 'SFMono-Regular', monospace;
251
+
252
+ \t/* Primary color scale */
253
+ \t--rf-color-primary-50: #f0f9ff;
254
+ \t--rf-color-primary-100: #e0f2fe;
255
+ \t--rf-color-primary-500: #3b82f6;
256
+ \t--rf-color-primary-600: #2563eb;
257
+ \t--rf-color-primary-900: #1e3a5f;
258
+
259
+ \t/* Core palette */
260
+ \t--rf-color-text: #1a1a2e;
261
+ \t--rf-color-muted: #64748b;
262
+ \t--rf-color-border: #e2e8f0;
263
+ \t--rf-color-bg: #ffffff;
264
+ \t--rf-color-primary: var(--rf-color-primary-500);
265
+ \t--rf-color-primary-hover: var(--rf-color-primary-600);
266
+
267
+ \t/* Surfaces */
268
+ \t--rf-color-surface: #f8fafc;
269
+ \t--rf-color-surface-hover: #f1f5f9;
270
+ \t--rf-color-surface-active: #e2e8f0;
271
+ \t--rf-color-surface-raised: #ffffff;
272
+
273
+ \t/* Semantic */
274
+ \t--rf-color-info: #3b82f6;
275
+ \t--rf-color-info-bg: #eff6ff;
276
+ \t--rf-color-info-border: #bfdbfe;
277
+ \t--rf-color-warning: #f59e0b;
278
+ \t--rf-color-warning-bg: #fffbeb;
279
+ \t--rf-color-warning-border: #fde68a;
280
+ \t--rf-color-danger: #ef4444;
281
+ \t--rf-color-danger-bg: #fef2f2;
282
+ \t--rf-color-danger-border: #fecaca;
283
+ \t--rf-color-success: #10b981;
284
+ \t--rf-color-success-bg: #ecfdf5;
285
+ \t--rf-color-success-border: #a7f3d0;
286
+
287
+ \t/* Radii */
288
+ \t--rf-radius-sm: 6px;
289
+ \t--rf-radius-md: 10px;
290
+ \t--rf-radius-lg: 16px;
291
+ \t--rf-radius-full: 9999px;
292
+
293
+ \t/* Shadows */
294
+ \t--rf-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06);
295
+ \t--rf-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.07);
296
+ \t--rf-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.08);
297
+ }
298
+ `;
299
+ }
300
+ function generateThemeDarkTokens() {
301
+ return `[data-theme="dark"] {
302
+ \t--rf-color-text: #e2e8f0;
303
+ \t--rf-color-muted: #94a3b8;
304
+ \t--rf-color-border: #334155;
305
+ \t--rf-color-bg: #0f172a;
306
+ \t--rf-color-surface: #1e293b;
307
+ \t--rf-color-surface-hover: #334155;
308
+ \t--rf-color-surface-active: #475569;
309
+ \t--rf-color-surface-raised: #1e293b;
310
+ \t--rf-color-info-bg: #1e3a5f;
311
+ \t--rf-color-info-border: #1e40af;
312
+ \t--rf-color-warning-bg: #451a03;
313
+ \t--rf-color-warning-border: #92400e;
314
+ \t--rf-color-danger-bg: #450a0a;
315
+ \t--rf-color-danger-border: #991b1b;
316
+ \t--rf-color-success-bg: #052e16;
317
+ \t--rf-color-success-border: #166534;
318
+ }
319
+
320
+ @media (prefers-color-scheme: dark) {
321
+ \t:root:not([data-theme="light"]) {
322
+ \t\t--rf-color-text: #e2e8f0;
323
+ \t\t--rf-color-muted: #94a3b8;
324
+ \t\t--rf-color-border: #334155;
325
+ \t\t--rf-color-bg: #0f172a;
326
+ \t\t--rf-color-surface: #1e293b;
327
+ \t\t--rf-color-surface-hover: #334155;
328
+ \t\t--rf-color-surface-active: #475569;
329
+ \t\t--rf-color-surface-raised: #1e293b;
330
+ \t\t--rf-color-info-bg: #1e3a5f;
331
+ \t\t--rf-color-info-border: #1e40af;
332
+ \t\t--rf-color-warning-bg: #451a03;
333
+ \t\t--rf-color-warning-border: #92400e;
334
+ \t\t--rf-color-danger-bg: #450a0a;
335
+ \t\t--rf-color-danger-border: #991b1b;
336
+ \t\t--rf-color-success-bg: #052e16;
337
+ \t\t--rf-color-success-border: #166534;
338
+ \t}
339
+ }
340
+ `;
341
+ }
342
+ function generateThemeGlobalCss() {
343
+ return `/* Global resets and base styles */
344
+ *,
345
+ *::before,
346
+ *::after {
347
+ \tbox-sizing: border-box;
348
+ }
349
+
350
+ body {
351
+ \tfont-family: var(--rf-font-sans);
352
+ \tcolor: var(--rf-color-text);
353
+ \tbackground-color: var(--rf-color-bg);
354
+ \tline-height: 1.6;
355
+ \t-webkit-font-smoothing: antialiased;
356
+ }
357
+ `;
358
+ }
359
+ function generateThemeTsconfig() {
360
+ const config = {
361
+ compilerOptions: {
362
+ target: 'ES2022',
363
+ module: 'ES2022',
364
+ moduleResolution: 'bundler',
365
+ declaration: true,
366
+ outDir: 'dist',
367
+ rootDir: 'src',
368
+ strict: true,
369
+ esModuleInterop: true,
370
+ skipLibCheck: true,
371
+ },
372
+ include: ['src'],
373
+ };
374
+ return JSON.stringify(config, null, '\t') + '\n';
375
+ }
376
+ function generateThemeDefaultLayout() {
377
+ return `<script lang="ts">
378
+ \timport { Renderer } from '@refrakt-md/svelte';
379
+
380
+ \tlet { regions, renderable }: {
381
+ \t\tregions: Record<string, { name: string; mode: string; content: any[] }>;
382
+ \t\trenderable: any;
383
+ \t} = $props();
384
+ </script>
385
+
386
+ {#if regions.header}
387
+ \t<header>
388
+ \t\t<Renderer node={regions.header.content} />
389
+ \t</header>
390
+ {/if}
391
+
392
+ <main>
393
+ \t<Renderer node={renderable} />
394
+ </main>
395
+ `;
396
+ }
397
+ function generateThemeCssCoverageTest() {
398
+ return `import { describe, it, expect } from 'vitest';
399
+ import { readFileSync, readdirSync, existsSync } from 'fs';
400
+ import { join } from 'path';
401
+ import postcss from 'postcss';
402
+ import { themeConfig } from '../src/config.js';
403
+
404
+ const CSS_DIR = join(__dirname, '..', 'styles', 'runes');
405
+
406
+ /** Parse all CSS files and collect every .rf-* class selector */
407
+ function parseAllCssSelectors(): Set<string> {
408
+ \tconst selectors = new Set<string>();
409
+ \tif (!existsSync(CSS_DIR)) return selectors;
410
+
411
+ \tconst files = readdirSync(CSS_DIR).filter(f => f.endsWith('.css'));
412
+ \tfor (const file of files) {
413
+ \t\tconst css = readFileSync(join(CSS_DIR, file), 'utf-8');
414
+ \t\tconst root = postcss.parse(css);
415
+ \t\troot.walkRules(rule => {
416
+ \t\t\tconst matches = rule.selector.matchAll(/\\.rf-[\\w-]+/g);
417
+ \t\t\tfor (const m of matches) {
418
+ \t\t\t\tselectors.add(m[0]);
419
+ \t\t\t}
420
+ \t\t});
421
+ \t}
422
+ \treturn selectors;
423
+ }
424
+
425
+ const allCssSelectors = parseAllCssSelectors();
426
+ const { prefix, runes } = themeConfig;
427
+
428
+ describe('Theme CSS coverage', () => {
429
+ \tit('block selectors exist for styled runes', () => {
430
+ \t\tconst allBlocks = [...new Set(Object.values(runes).map(c => c.block))];
431
+ \t\tconst styledBlocks = allBlocks.filter(block =>
432
+ \t\t\tallCssSelectors.has(\`.\${prefix}-\${block}\`)
433
+ \t\t);
434
+
435
+ \t\tconsole.log(\`CSS coverage: \${styledBlocks.length}/\${allBlocks.length} blocks\`);
436
+ \t\t// Start at 0% — increase this threshold as you add CSS
437
+ \t\texpect(styledBlocks.length).toBeGreaterThanOrEqual(0);
438
+ \t});
439
+ });
440
+ `;
441
+ }
442
+ function generateThemeKitchenSink() {
443
+ return `---
444
+ title: Kitchen Sink
445
+ description: Preview of all major runes for theme development.
446
+ ---
447
+
448
+ # Kitchen Sink
449
+
450
+ This page demonstrates all major rune types. Use it to preview your theme styles.
451
+
452
+ ## Hints
453
+
454
+ {% hint type="note" %}
455
+ This is a **note** hint for general information.
456
+ {% /hint %}
457
+
458
+ {% hint type="warning" %}
459
+ This is a **warning** hint for cautionary messages.
460
+ {% /hint %}
461
+
462
+ {% hint type="caution" %}
463
+ This is a **caution** hint for dangerous actions.
464
+ {% /hint %}
465
+
466
+ {% hint type="check" %}
467
+ This is a **check** hint for success messages.
468
+ {% /hint %}
469
+
470
+ ## Grid
471
+
472
+ {% grid cols=3 %}
473
+ {% feature title="Fast" %}
474
+ Lightning-fast build times with incremental compilation.
475
+ {% /feature %}
476
+
477
+ {% feature title="Flexible" %}
478
+ Supports multiple frameworks and output targets.
479
+ {% /feature %}
480
+
481
+ {% feature title="Extensible" %}
482
+ Create custom runes and themes to match your brand.
483
+ {% /feature %}
484
+ {% /grid %}
485
+
486
+ ## Accordion
487
+
488
+ {% accordion %}
489
+ ### What is refrakt.md?
490
+ A documentation framework that transforms Markdown into rich, interactive pages.
491
+
492
+ ### How do themes work?
493
+ Themes provide an identity transform layer (BEM classes, structure) and optional Svelte components for interactive runes.
494
+
495
+ ### Can I create my own runes?
496
+ Yes! Define a schema in the runes package and add engine config to your theme.
497
+ {% /accordion %}
498
+
499
+ ## Steps
500
+
501
+ {% steps %}
502
+ ### Install dependencies
503
+ \`\`\`sh
504
+ npm install
505
+ \`\`\`
506
+
507
+ ### Configure your theme
508
+ Edit \`src/config.ts\` to customize rune behavior and icons.
509
+
510
+ ### Add CSS styles
511
+ Create CSS files in \`styles/runes/\` for each rune block.
512
+ {% /steps %}
513
+
514
+ ## API Endpoint
515
+
516
+ {% api method="GET" path="/api/users" %}
517
+ Returns a list of all users.
518
+
519
+ ### Parameters
520
+
521
+ | Name | Type | Description |
522
+ |------|------|-------------|
523
+ | limit | number | Max results to return |
524
+ | offset | number | Pagination offset |
525
+ {% /api %}
526
+
527
+ ## Tabs
528
+
529
+ {% tabs %}
530
+ {% tab title="npm" %}
531
+ \`\`\`sh
532
+ npm install @refrakt-md/svelte
533
+ \`\`\`
534
+ {% /tab %}
535
+
536
+ {% tab title="pnpm" %}
537
+ \`\`\`sh
538
+ pnpm add @refrakt-md/svelte
539
+ \`\`\`
540
+ {% /tab %}
541
+
542
+ {% tab title="yarn" %}
543
+ \`\`\`sh
544
+ yarn add @refrakt-md/svelte
545
+ \`\`\`
546
+ {% /tab %}
547
+ {% /tabs %}
548
+
549
+ ## Code Block
550
+
551
+ \`\`\`ts title="example.ts"
552
+ import { themeConfig } from './config';
553
+
554
+ export function greet(name: string): string {
555
+ return \`Hello, \${name}!\`;
556
+ }
557
+ \`\`\`
558
+ `;
559
+ }
560
+ function generateThemeBaseCss() {
561
+ return `/* Base styles — tokens + globals (no rune CSS) */
562
+ @import './tokens/base.css';
563
+ @import './tokens/dark.css';
564
+ @import './styles/global.css';
565
+ `;
566
+ }
567
+ function generateThemeTokensBridge() {
568
+ return `@import '../index.css';
569
+ `;
570
+ }
96
571
  //# 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.3.0",
4
+ "version": "0.5.0",
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={{