@pep/term-deck 1.0.32 → 1.2.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 (67) hide show
  1. package/dist/bin/term-deck.js +2381 -13
  2. package/dist/bin/term-deck.js.map +1 -1
  3. package/dist/index.d.ts +9 -1
  4. package/dist/index.js +211 -3
  5. package/dist/index.js.map +1 -1
  6. package/package.json +4 -4
  7. package/README.md +0 -422
  8. package/examples/slides/01-welcome.md +0 -9
  9. package/examples/slides/02-features.md +0 -12
  10. package/examples/slides/03-colors.md +0 -17
  11. package/examples/slides/04-ascii-art.md +0 -11
  12. package/examples/slides/05-gradients.md +0 -14
  13. package/examples/slides/06-themes.md +0 -13
  14. package/examples/slides/07-markdown.md +0 -13
  15. package/examples/slides/08-controls.md +0 -13
  16. package/examples/slides/09-thanks.md +0 -11
  17. package/examples/slides/deck.config.ts +0 -13
  18. package/examples/slides-hacker/01-welcome.md +0 -9
  19. package/examples/slides-hacker/02-features.md +0 -12
  20. package/examples/slides-hacker/03-colors.md +0 -17
  21. package/examples/slides-hacker/04-ascii-art.md +0 -11
  22. package/examples/slides-hacker/05-gradients.md +0 -14
  23. package/examples/slides-hacker/06-themes.md +0 -13
  24. package/examples/slides-hacker/07-markdown.md +0 -13
  25. package/examples/slides-hacker/08-controls.md +0 -13
  26. package/examples/slides-hacker/09-thanks.md +0 -11
  27. package/examples/slides-hacker/deck.config.ts +0 -13
  28. package/examples/slides-matrix/01-welcome.md +0 -9
  29. package/examples/slides-matrix/02-features.md +0 -12
  30. package/examples/slides-matrix/03-colors.md +0 -17
  31. package/examples/slides-matrix/04-ascii-art.md +0 -11
  32. package/examples/slides-matrix/05-gradients.md +0 -14
  33. package/examples/slides-matrix/06-themes.md +0 -13
  34. package/examples/slides-matrix/07-markdown.md +0 -13
  35. package/examples/slides-matrix/08-controls.md +0 -13
  36. package/examples/slides-matrix/09-thanks.md +0 -11
  37. package/examples/slides-matrix/deck.config.ts +0 -13
  38. package/examples/slides-minimal/01-welcome.md +0 -9
  39. package/examples/slides-minimal/02-features.md +0 -12
  40. package/examples/slides-minimal/03-colors.md +0 -17
  41. package/examples/slides-minimal/04-ascii-art.md +0 -11
  42. package/examples/slides-minimal/05-gradients.md +0 -14
  43. package/examples/slides-minimal/06-themes.md +0 -13
  44. package/examples/slides-minimal/07-markdown.md +0 -13
  45. package/examples/slides-minimal/08-controls.md +0 -13
  46. package/examples/slides-minimal/09-thanks.md +0 -11
  47. package/examples/slides-minimal/deck.config.ts +0 -13
  48. package/examples/slides-neon/01-welcome.md +0 -9
  49. package/examples/slides-neon/02-features.md +0 -12
  50. package/examples/slides-neon/03-colors.md +0 -17
  51. package/examples/slides-neon/04-ascii-art.md +0 -11
  52. package/examples/slides-neon/05-gradients.md +0 -14
  53. package/examples/slides-neon/06-themes.md +0 -13
  54. package/examples/slides-neon/07-markdown.md +0 -13
  55. package/examples/slides-neon/08-controls.md +0 -13
  56. package/examples/slides-neon/09-thanks.md +0 -11
  57. package/examples/slides-neon/deck.config.ts +0 -13
  58. package/examples/slides-retro/01-welcome.md +0 -9
  59. package/examples/slides-retro/02-features.md +0 -12
  60. package/examples/slides-retro/03-colors.md +0 -17
  61. package/examples/slides-retro/04-ascii-art.md +0 -11
  62. package/examples/slides-retro/05-gradients.md +0 -14
  63. package/examples/slides-retro/06-themes.md +0 -13
  64. package/examples/slides-retro/07-markdown.md +0 -13
  65. package/examples/slides-retro/08-controls.md +0 -13
  66. package/examples/slides-retro/09-thanks.md +0 -11
  67. package/examples/slides-retro/deck.config.ts +0 -13
package/dist/index.d.ts CHANGED
@@ -647,6 +647,14 @@ interface ThemeObject extends Theme {
647
647
  */
648
648
  declare function createTheme(yaml: string): ThemeObject;
649
649
 
650
+ declare const _default$4: ThemeObject;
651
+
652
+ declare const _default$3: ThemeObject;
653
+
654
+ declare const _default$2: ThemeObject;
655
+
656
+ declare const _default$1: ThemeObject;
657
+
650
658
  declare const _default: ThemeObject;
651
659
 
652
660
  /**
@@ -672,4 +680,4 @@ declare const _default: ThemeObject;
672
680
  */
673
681
  declare function defineConfig(config: DeckConfig): DeckConfig;
674
682
 
675
- export { type DeckConfig, type Slide, type SlideFrontmatter, type Theme, type ThemeObject, createTheme, defineConfig, _default as matrixTheme };
683
+ export { type DeckConfig, type Slide, type SlideFrontmatter, type Theme, type ThemeObject, createTheme, defineConfig, _default as hackerTheme, _default$4 as matrixTheme, _default$1 as minimalTheme, _default$3 as neonTheme, _default$2 as retroTheme };
package/dist/index.js CHANGED
@@ -142,8 +142,8 @@ function createThemeFromMerge(base, overrides) {
142
142
  }
143
143
  };
144
144
  }
145
- function createTheme(yaml2) {
146
- const parsed = parse(yaml2);
145
+ function createTheme(yaml6) {
146
+ const parsed = parse(yaml6);
147
147
  const validated = safeParse(ThemeSchema, parsed, "theme");
148
148
  return {
149
149
  ...validated,
@@ -205,11 +205,219 @@ window:
205
205
  `;
206
206
  var matrix_default = createTheme(yaml);
207
207
 
208
+ // themes/neon.ts
209
+ var yaml2 = `
210
+ name: neon
211
+ description: Hot pink and electric blue neon cyberpunk theme
212
+ author: term-deck
213
+ version: 1.0.0
214
+
215
+ colors:
216
+ primary: "#ff0099"
217
+ accent: "#00ffff"
218
+ background: "#0a0014"
219
+ text: "#ffffff"
220
+ muted: "#9933ff"
221
+
222
+ gradients:
223
+ fire:
224
+ - "#ff0099"
225
+ - "#ff0066"
226
+ - "#ff3399"
227
+ cool:
228
+ - "#00ffff"
229
+ - "#0099ff"
230
+ - "#6600ff"
231
+ pink:
232
+ - "#ff0099"
233
+ - "#ff33cc"
234
+ - "#ff66ff"
235
+ hf:
236
+ - "#ff0099"
237
+ - "#00ffff"
238
+ - "#9933ff"
239
+
240
+ glyphs: "\u2593\u2592\u2591\u2588\u2580\u2584\u258C\u2590\u25A0\u25A1\u25AA\u25AB\u25CF\u25CB\u25CA\u25D8\u25D9\u2666\u2663\u2660\u2665\u2605\u2606\u2302\u207F\xB2\xB3\xC6\xD8\u221E\u2248\u2260\xB1\xD7\xF7"
241
+
242
+ animations:
243
+ revealSpeed: 1.2
244
+ matrixDensity: 60
245
+ glitchIterations: 7
246
+ lineDelay: 25
247
+ matrixInterval: 70
248
+
249
+ window:
250
+ borderStyle: line
251
+ shadow: true
252
+ padding:
253
+ top: 1
254
+ bottom: 1
255
+ left: 2
256
+ right: 2
257
+ `;
258
+ var neon_default = createTheme(yaml2);
259
+
260
+ // themes/retro.ts
261
+ var yaml3 = `
262
+ name: retro
263
+ description: 80s synthwave retro theme with purple and orange
264
+ author: term-deck
265
+ version: 1.0.0
266
+
267
+ colors:
268
+ primary: "#ff6ec7"
269
+ accent: "#ffa600"
270
+ background: "#1a0033"
271
+ text: "#ffd5ff"
272
+ muted: "#7d4e9f"
273
+
274
+ gradients:
275
+ fire:
276
+ - "#ffa600"
277
+ - "#ff6ec7"
278
+ - "#ff0080"
279
+ cool:
280
+ - "#00d4ff"
281
+ - "#7d4e9f"
282
+ - "#ff0080"
283
+ pink:
284
+ - "#ff6ec7"
285
+ - "#ff99dd"
286
+ - "#ffccff"
287
+ hf:
288
+ - "#ffa600"
289
+ - "#ff6ec7"
290
+ - "#00d4ff"
291
+
292
+ glyphs: "\u25B2\u25BC\u25C4\u25BA\u266A\u266B\u25A0\u25A1\u25AA\u25AB\u25CF\u25CB\u25CA\u2605\u2606\u2302\u2234\u2235\u2248\u2260\xB1\xD7\xF7\u03B1\u03B2\u03B3\u03B4\u03BB\u03C0\u03C3\u03C6\u03C9"
293
+
294
+ animations:
295
+ revealSpeed: 0.8
296
+ matrixDensity: 40
297
+ glitchIterations: 4
298
+ lineDelay: 40
299
+ matrixInterval: 90
300
+
301
+ window:
302
+ borderStyle: line
303
+ shadow: true
304
+ padding:
305
+ top: 1
306
+ bottom: 1
307
+ left: 2
308
+ right: 2
309
+ `;
310
+ var retro_default = createTheme(yaml3);
311
+
312
+ // themes/minimal.ts
313
+ var yaml4 = `
314
+ name: minimal
315
+ description: Clean monochrome theme with minimal animations
316
+ author: term-deck
317
+ version: 1.0.0
318
+
319
+ colors:
320
+ primary: "#ffffff"
321
+ accent: "#888888"
322
+ background: "#000000"
323
+ text: "#e0e0e0"
324
+ muted: "#555555"
325
+
326
+ gradients:
327
+ fire:
328
+ - "#ffffff"
329
+ - "#cccccc"
330
+ - "#aaaaaa"
331
+ cool:
332
+ - "#ffffff"
333
+ - "#bbbbbb"
334
+ - "#888888"
335
+ pink:
336
+ - "#e0e0e0"
337
+ - "#c0c0c0"
338
+ - "#a0a0a0"
339
+ hf:
340
+ - "#ffffff"
341
+ - "#d0d0d0"
342
+ - "#999999"
343
+
344
+ glyphs: "\u2502\u2500\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550\u2551\u2554\u2557\u255A\u255D\u2560\u2563\u2566\u2569\u256C"
345
+
346
+ animations:
347
+ revealSpeed: 0.5
348
+ matrixDensity: 20
349
+ glitchIterations: 2
350
+ lineDelay: 50
351
+ matrixInterval: 120
352
+
353
+ window:
354
+ borderStyle: line
355
+ shadow: false
356
+ padding:
357
+ top: 1
358
+ bottom: 1
359
+ left: 2
360
+ right: 2
361
+ `;
362
+ var minimal_default = createTheme(yaml4);
363
+
364
+ // themes/hacker.ts
365
+ var yaml5 = `
366
+ name: hacker
367
+ description: Classic green terminal hacker aesthetic
368
+ author: term-deck
369
+ version: 1.0.0
370
+
371
+ colors:
372
+ primary: "#00ff00"
373
+ accent: "#00cc00"
374
+ background: "#001100"
375
+ text: "#00ff00"
376
+ muted: "#006600"
377
+
378
+ gradients:
379
+ fire:
380
+ - "#00ff00"
381
+ - "#00ee00"
382
+ - "#00dd00"
383
+ cool:
384
+ - "#00ff00"
385
+ - "#00cc00"
386
+ - "#009900"
387
+ pink:
388
+ - "#00ff00"
389
+ - "#00dd00"
390
+ - "#00bb00"
391
+ hf:
392
+ - "#00ff00"
393
+ - "#00cc00"
394
+ - "#008800"
395
+
396
+ glyphs: "01\uFF71\uFF72\uFF73\uFF74\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C\uFF9D"
397
+
398
+ animations:
399
+ revealSpeed: 1.5
400
+ matrixDensity: 70
401
+ glitchIterations: 8
402
+ lineDelay: 15
403
+ matrixInterval: 60
404
+
405
+ window:
406
+ borderStyle: line
407
+ shadow: true
408
+ padding:
409
+ top: 1
410
+ bottom: 1
411
+ left: 2
412
+ right: 2
413
+ `;
414
+ var hacker_default = createTheme(yaml5);
415
+
208
416
  // src/index.ts
209
417
  function defineConfig(config) {
210
418
  return DeckConfigSchema.parse(config);
211
419
  }
212
420
 
213
- export { createTheme, defineConfig, matrix_default as matrixTheme };
421
+ export { createTheme, defineConfig, hacker_default as hackerTheme, matrix_default as matrixTheme, minimal_default as minimalTheme, neon_default as neonTheme, retro_default as retroTheme };
214
422
  //# sourceMappingURL=index.js.map
215
423
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schemas/theme.ts","../src/schemas/config.ts","../src/schemas/validation.ts","../src/core/theme.ts","../src/themes/matrix/index.ts","../src/index.ts"],"names":["z","yaml","parseYaml"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema for validating hex color strings.\n * Accepts 6-digit hex colors with # prefix (e.g., #ff0066)\n */\nexport const HexColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/, {\n message: 'Color must be a valid hex color (e.g., #ff0066)',\n})\n\nexport type HexColor = z.infer<typeof HexColorSchema>\n\n/**\n * Schema for validating gradient color arrays.\n * A gradient requires at least 2 hex colors.\n */\nexport const GradientSchema = z.array(HexColorSchema).min(2, {\n message: 'Gradient must have at least 2 colors',\n})\n\nexport type Gradient = z.infer<typeof GradientSchema>\n\n/**\n * Schema for validating theme objects.\n * Defines the visual appearance of the presentation deck.\n */\nexport const ThemeSchema = z.object({\n // Theme metadata\n name: z.string().min(1, { message: 'Theme name is required' }),\n description: z.string().optional(),\n author: z.string().optional(),\n version: z.string().optional(),\n\n // Color palette\n colors: z.object({\n primary: HexColorSchema,\n secondary: HexColorSchema.optional(),\n accent: HexColorSchema,\n background: HexColorSchema,\n text: HexColorSchema,\n muted: HexColorSchema,\n success: HexColorSchema.optional(),\n warning: HexColorSchema.optional(),\n error: HexColorSchema.optional(),\n }),\n\n // Named gradients for bigText\n gradients: z.record(z.string(), GradientSchema).refine(\n (g) => Object.keys(g).length >= 1,\n { message: 'At least one gradient must be defined' }\n ),\n\n // Glyph set for matrix rain background\n glyphs: z.string().min(10, {\n message: 'Glyph set must have at least 10 characters',\n }),\n\n // Animation settings\n animations: z.object({\n // Speed multiplier (1.0 = normal, 0.5 = half speed, 2.0 = double speed)\n revealSpeed: z.number().min(0.1).max(5.0).default(1.0),\n // Matrix rain density (number of drops)\n matrixDensity: z.number().min(10).max(200).default(50),\n // Glitch effect iterations\n glitchIterations: z.number().min(1).max(20).default(5),\n // Delay between lines during reveal (ms)\n lineDelay: z.number().min(0).max(500).default(30),\n // Matrix rain update interval (ms)\n matrixInterval: z.number().min(20).max(200).default(80),\n }),\n\n // Window appearance\n window: z.object({\n // Border style\n borderStyle: z.enum(['line', 'double', 'rounded', 'none']).default('line'),\n // Shadow effect\n shadow: z.boolean().default(true),\n // Padding inside windows\n padding: z.object({\n top: z.number().min(0).max(5).default(1),\n bottom: z.number().min(0).max(5).default(1),\n left: z.number().min(0).max(10).default(2),\n right: z.number().min(0).max(10).default(2),\n }).optional(),\n }).optional(),\n})\n\nexport type Theme = z.infer<typeof ThemeSchema>\n\n// ============================================================================\n// Color Token System\n// ============================================================================\n\n/**\n * Valid color tokens for inline styling in slide body content.\n * Tokens can be either:\n * - Built-in colors: GREEN, ORANGE, CYAN, PINK, WHITE, GRAY\n * - Theme-mapped colors: PRIMARY, SECONDARY, ACCENT, MUTED, TEXT, BACKGROUND\n *\n * Usage in slides: {GREEN}colored text{/}\n */\nexport const ColorTokens = [\n 'GREEN',\n 'ORANGE',\n 'CYAN',\n 'PINK',\n 'WHITE',\n 'GRAY',\n 'PRIMARY', // Maps to theme.colors.primary\n 'SECONDARY', // Maps to theme.colors.secondary\n 'ACCENT', // Maps to theme.colors.accent\n 'MUTED', // Maps to theme.colors.muted\n 'TEXT', // Maps to theme.colors.text\n 'BACKGROUND', // Maps to theme.colors.background\n] as const\n\n/**\n * Type for valid color token names.\n */\nexport type ColorToken = typeof ColorTokens[number]\n\n/**\n * Pattern for matching color tokens in slide content.\n * Matches: {GREEN}, {ORANGE}, {CYAN}, {PINK}, {WHITE}, {GRAY},\n * {PRIMARY}, {SECONDARY}, {ACCENT}, {MUTED}, {TEXT}, {BACKGROUND}, {/}\n *\n * The {/} token closes any open color tag.\n */\nexport const COLOR_TOKEN_PATTERN = /\\{(GREEN|ORANGE|CYAN|PINK|WHITE|GRAY|PRIMARY|SECONDARY|ACCENT|MUTED|TEXT|BACKGROUND|\\/)\\}/g\n\n// ============================================================================\n// Partial Theme for Extension\n// ============================================================================\n\n/**\n * Deep partial utility type that makes all nested properties optional.\n * Used for theme extension where only specific fields need to be overridden.\n */\nexport type DeepPartial<T> = T extends object ? {\n [P in keyof T]?: DeepPartial<T[P]>\n} : T\n\n/**\n * Partial theme type for use with theme.extend() functionality.\n * All fields (including nested) become optional.\n */\nexport type PartialTheme = DeepPartial<Theme>\n\n/**\n * Schema for validating partial theme objects.\n * All fields become optional recursively, allowing partial overrides.\n * Used for theme extension validation.\n */\nexport const PartialThemeSchema = ThemeSchema.deepPartial()\n\n// ============================================================================\n// Default Theme\n// ============================================================================\n\n/**\n * Default matrix/cyberpunk theme.\n * Used when no theme is specified or as a base for theme extension.\n */\nexport const DEFAULT_THEME: Theme = {\n name: 'matrix',\n description: 'Default cyberpunk/matrix theme',\n\n colors: {\n primary: '#00cc66',\n accent: '#ff6600',\n background: '#0a0a0a',\n text: '#ffffff',\n muted: '#666666',\n },\n\n gradients: {\n fire: ['#ff6600', '#ff3300', '#ff0066'],\n cool: ['#00ccff', '#0066ff', '#6600ff'],\n pink: ['#ff0066', '#ff0099', '#cc00ff'],\n hf: ['#99cc00', '#00cc66', '#00cccc'],\n },\n\n glyphs: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789',\n\n animations: {\n revealSpeed: 1.0,\n matrixDensity: 50,\n glitchIterations: 5,\n lineDelay: 30,\n matrixInterval: 80,\n },\n\n window: {\n borderStyle: 'line',\n shadow: true,\n padding: {\n top: 1,\n bottom: 1,\n left: 2,\n right: 2,\n },\n },\n}\n","import { z } from 'zod'\nimport { ThemeSchema } from './theme'\n\n/**\n * Schema for presentation settings.\n * Controls how the presentation behaves during runtime.\n */\nexport const SettingsSchema = z.object({\n // Start slide (0-indexed)\n startSlide: z.number().min(0).default(0),\n // Loop back to first slide after last\n loop: z.boolean().default(false),\n // Auto-advance slides (ms, 0 = disabled)\n autoAdvance: z.number().min(0).default(0),\n // Show slide numbers\n showSlideNumbers: z.boolean().default(false),\n // Show progress bar\n showProgress: z.boolean().default(false),\n})\n\nexport type Settings = z.infer<typeof SettingsSchema>\n\n/**\n * Schema for export settings.\n * Controls the output dimensions and quality of exported videos/GIFs.\n */\nexport const ExportSettingsSchema = z.object({\n // Output width in characters (min 80, max 400)\n width: z.number().min(80).max(400).default(120),\n // Output height in characters (min 24, max 100)\n height: z.number().min(24).max(100).default(40),\n // Frames per second for video (min 10, max 60)\n fps: z.number().min(10).max(60).default(30),\n})\n\nexport type ExportSettings = z.infer<typeof ExportSettingsSchema>\n\n/**\n * Schema for validating deck configuration (deck.config.ts).\n * Defines the complete configuration for a presentation deck.\n */\nexport const DeckConfigSchema = z.object({\n // Presentation metadata\n title: z.string().optional(),\n author: z.string().optional(),\n date: z.string().optional(),\n\n // Theme preset (optional - uses 'matrix' if not specified)\n // Available presets: 'matrix'\n themePreset: z.enum(['matrix']).optional(),\n\n // Theme object (optional - for advanced customization)\n // If both themePreset and theme are specified, theme takes precedence\n theme: ThemeSchema.optional(),\n\n // Presentation settings\n settings: SettingsSchema.optional(),\n\n // Export settings\n export: ExportSettingsSchema.optional(),\n})\n\nexport type DeckConfig = z.infer<typeof DeckConfigSchema>\n","import { z, ZodError } from 'zod'\n\n/**\n * Custom error class for validation failures.\n * Extends Error with a specific name for easy identification.\n */\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Format Zod errors into user-friendly messages.\n * Formats each issue with its field path and message.\n *\n * @param error - The ZodError to format\n * @param context - A description of what was being validated (e.g., \"theme\", \"slide frontmatter\")\n * @returns A formatted string with all validation issues\n *\n * @example\n * const error = new ZodError([...])\n * formatZodError(error, 'theme')\n * // Returns:\n * // \"Invalid theme:\n * // - colors.primary: Color must be a valid hex color (e.g., #ff0066)\n * // - name: Theme name is required\"\n */\nexport function formatZodError(error: ZodError, context: string): string {\n const issues = error.issues.map((issue) => {\n const path = issue.path.join('.')\n return ` - ${path ? `${path}: ` : ''}${issue.message}`\n })\n\n return `Invalid ${context}:\\n${issues.join('\\n')}`\n}\n\n/**\n * Parse data with a Zod schema and throw a ValidationError with friendly messages on failure.\n *\n * @param schema - The Zod schema to validate against\n * @param data - The data to validate\n * @param context - A description of what's being validated (e.g., \"theme\", \"slide frontmatter\")\n * @returns The parsed and validated data\n * @throws {ValidationError} If validation fails\n *\n * @example\n * const theme = safeParse(ThemeSchema, rawData, 'theme')\n * // Throws ValidationError with formatted message if invalid\n */\nexport function safeParse<T>(\n schema: z.ZodSchema<T>,\n data: unknown,\n context: string\n): T {\n const result = schema.safeParse(data)\n\n if (!result.success) {\n throw new ValidationError(formatZodError(result.error, context))\n }\n\n return result.data\n}\n","import { parse as parseYaml } from 'yaml'\nimport deepmerge from 'deepmerge'\nimport type { Theme, PartialTheme } from '../schemas/theme'\nimport { ThemeSchema } from '../schemas/theme'\nimport { safeParse } from '../schemas/validation'\n\n/**\n * Theme object with extension capability.\n * Extends the base Theme type with an extend() method that allows\n * Tailwind-style theme customization.\n */\nexport interface ThemeObject extends Theme {\n /**\n * Create a new theme by merging overrides into this theme.\n * Uses deep merge with array replacement strategy.\n *\n * @param overrides - Partial theme object with values to override\n * @returns A new ThemeObject with the merged values\n *\n * @example\n * const custom = matrix.extend({\n * colors: { primary: '#ff0066' }\n * })\n *\n * @example\n * // Chained extensions\n * const custom = matrix\n * .extend({ colors: { primary: '#ff0066' } })\n * .extend({ animations: { revealSpeed: 0.5 } })\n */\n extend(overrides: PartialTheme): ThemeObject\n}\n\n/**\n * Create a ThemeObject from validated Theme and overrides.\n * Internal helper that merges themes and adds the extend() method.\n *\n * @param base - A validated Theme object\n * @param overrides - Partial theme with values to override\n * @returns A ThemeObject with extension capability\n */\nexport function createThemeFromMerge(base: Theme, overrides: PartialTheme): ThemeObject {\n // Deep merge, with overrides taking precedence\n const merged = deepmerge(base, overrides, {\n // Arrays should be replaced, not concatenated\n arrayMerge: (_, source) => source,\n }) as Theme\n\n // Re-validate the merged result\n const validated = safeParse(ThemeSchema, merged, 'merged theme')\n\n return {\n ...validated,\n extend(newOverrides: PartialTheme): ThemeObject {\n return createThemeFromMerge(validated, newOverrides)\n },\n }\n}\n\n/**\n * Create a theme from a YAML string.\n * Parses the YAML, validates it against ThemeSchema, and returns a ThemeObject\n * with extension capability.\n *\n * @param yaml - The YAML string containing the theme definition\n * @returns A validated ThemeObject with extend() method\n * @throws {Error} If the YAML syntax is invalid\n * @throws {ValidationError} If the parsed data doesn't match ThemeSchema\n *\n * @example\n * const theme = createTheme(`\n * name: custom\n * colors:\n * primary: \"#ff0066\"\n * accent: \"#00ff66\"\n * background: \"#000000\"\n * text: \"#ffffff\"\n * muted: \"#666666\"\n * gradients:\n * main:\n * - \"#ff0066\"\n * - \"#00ff66\"\n * glyphs: \"0123456789ABCDEF\"\n * animations:\n * revealSpeed: 1.0\n * matrixDensity: 30\n * glitchIterations: 3\n * lineDelay: 20\n * matrixInterval: 100\n * `)\n */\nexport function createTheme(yaml: string): ThemeObject {\n const parsed = parseYaml(yaml)\n const validated = safeParse(ThemeSchema, parsed, 'theme')\n\n return {\n ...validated,\n extend(overrides: PartialTheme): ThemeObject {\n return createThemeFromMerge(validated, overrides)\n },\n }\n}\n\n// Re-export commonly used functions for convenience\nexport { ThemeError, formatThemeError } from './theme-errors'\nexport {\n createGradients,\n applyGradient,\n resolveColorToken,\n colorTokensToBlessedTags,\n BUILTIN_COLORS,\n} from './theme-colors'\nexport type { GradientFunction } from './theme-colors'\n","import { createTheme } from '../../core/theme'\n\nconst yaml = `\nname: matrix\ndescription: Default cyberpunk/matrix theme\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#00cc66\"\n accent: \"#ff6600\"\n background: \"#0a0a0a\"\n text: \"#ffffff\"\n muted: \"#666666\"\n\ngradients:\n fire:\n - \"#ff6600\"\n - \"#ff3300\"\n - \"#ff0066\"\n cool:\n - \"#00ccff\"\n - \"#0066ff\"\n - \"#6600ff\"\n pink:\n - \"#ff0066\"\n - \"#ff0099\"\n - \"#cc00ff\"\n hf:\n - \"#99cc00\"\n - \"#00cc66\"\n - \"#00cccc\"\n\nglyphs: \"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789\"\n\nanimations:\n revealSpeed: 1.0\n matrixDensity: 50\n glitchIterations: 5\n lineDelay: 30\n matrixInterval: 80\n\nwindow:\n borderStyle: line\n shadow: true\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`\n\nexport default createTheme(yaml)\n","/**\n * Public API for term-deck\n *\n * Exports functions and types for use in deck.config.ts files\n * and external integrations.\n */\n\nimport { DeckConfigSchema, type DeckConfig } from './schemas/config.js';\nimport { type Theme } from './schemas/theme.js';\nimport { type Slide, type SlideFrontmatter } from './schemas/slide.js';\nimport { createTheme, type ThemeObject } from './core/theme.js';\n\n/**\n * Define deck configuration with validation\n *\n * Usage in deck.config.ts:\n * ```typescript\n * import { defineConfig } from 'term-deck'\n * import matrix from '@term-deck/theme-matrix'\n *\n * export default defineConfig({\n * title: 'My Presentation',\n * theme: matrix,\n * })\n * ```\n */\nexport function defineConfig(config: DeckConfig): DeckConfig {\n return DeckConfigSchema.parse(config);\n}\n\n// Re-export theme creation\nexport { createTheme };\nexport type { ThemeObject };\n\n// Re-export built-in themes\nexport { default as matrixTheme } from './themes/matrix/index.js';\n\n// Re-export types for consumers\nexport type { DeckConfig, Theme, Slide, SlideFrontmatter };\n"]}
1
+ {"version":3,"sources":["../src/schemas/theme.ts","../src/schemas/config.ts","../src/schemas/validation.ts","../src/core/theme.ts","../src/themes/matrix/index.ts","../themes/neon.ts","../themes/retro.ts","../themes/minimal.ts","../themes/hacker.ts","../src/index.ts"],"names":["z","yaml","parseYaml"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\n/**\n * Schema for validating hex color strings.\n * Accepts 6-digit hex colors with # prefix (e.g., #ff0066)\n */\nexport const HexColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/, {\n message: 'Color must be a valid hex color (e.g., #ff0066)',\n})\n\nexport type HexColor = z.infer<typeof HexColorSchema>\n\n/**\n * Schema for validating gradient color arrays.\n * A gradient requires at least 2 hex colors.\n */\nexport const GradientSchema = z.array(HexColorSchema).min(2, {\n message: 'Gradient must have at least 2 colors',\n})\n\nexport type Gradient = z.infer<typeof GradientSchema>\n\n/**\n * Schema for validating theme objects.\n * Defines the visual appearance of the presentation deck.\n */\nexport const ThemeSchema = z.object({\n // Theme metadata\n name: z.string().min(1, { message: 'Theme name is required' }),\n description: z.string().optional(),\n author: z.string().optional(),\n version: z.string().optional(),\n\n // Color palette\n colors: z.object({\n primary: HexColorSchema,\n secondary: HexColorSchema.optional(),\n accent: HexColorSchema,\n background: HexColorSchema,\n text: HexColorSchema,\n muted: HexColorSchema,\n success: HexColorSchema.optional(),\n warning: HexColorSchema.optional(),\n error: HexColorSchema.optional(),\n }),\n\n // Named gradients for bigText\n gradients: z.record(z.string(), GradientSchema).refine(\n (g) => Object.keys(g).length >= 1,\n { message: 'At least one gradient must be defined' }\n ),\n\n // Glyph set for matrix rain background\n glyphs: z.string().min(10, {\n message: 'Glyph set must have at least 10 characters',\n }),\n\n // Animation settings\n animations: z.object({\n // Speed multiplier (1.0 = normal, 0.5 = half speed, 2.0 = double speed)\n revealSpeed: z.number().min(0.1).max(5.0).default(1.0),\n // Matrix rain density (number of drops)\n matrixDensity: z.number().min(10).max(200).default(50),\n // Glitch effect iterations\n glitchIterations: z.number().min(1).max(20).default(5),\n // Delay between lines during reveal (ms)\n lineDelay: z.number().min(0).max(500).default(30),\n // Matrix rain update interval (ms)\n matrixInterval: z.number().min(20).max(200).default(80),\n }),\n\n // Window appearance\n window: z.object({\n // Border style\n borderStyle: z.enum(['line', 'double', 'rounded', 'none']).default('line'),\n // Shadow effect\n shadow: z.boolean().default(true),\n // Padding inside windows\n padding: z.object({\n top: z.number().min(0).max(5).default(1),\n bottom: z.number().min(0).max(5).default(1),\n left: z.number().min(0).max(10).default(2),\n right: z.number().min(0).max(10).default(2),\n }).optional(),\n }).optional(),\n})\n\nexport type Theme = z.infer<typeof ThemeSchema>\n\n// ============================================================================\n// Color Token System\n// ============================================================================\n\n/**\n * Valid color tokens for inline styling in slide body content.\n * Tokens can be either:\n * - Built-in colors: GREEN, ORANGE, CYAN, PINK, WHITE, GRAY\n * - Theme-mapped colors: PRIMARY, SECONDARY, ACCENT, MUTED, TEXT, BACKGROUND\n *\n * Usage in slides: {GREEN}colored text{/}\n */\nexport const ColorTokens = [\n 'GREEN',\n 'ORANGE',\n 'CYAN',\n 'PINK',\n 'WHITE',\n 'GRAY',\n 'PRIMARY', // Maps to theme.colors.primary\n 'SECONDARY', // Maps to theme.colors.secondary\n 'ACCENT', // Maps to theme.colors.accent\n 'MUTED', // Maps to theme.colors.muted\n 'TEXT', // Maps to theme.colors.text\n 'BACKGROUND', // Maps to theme.colors.background\n] as const\n\n/**\n * Type for valid color token names.\n */\nexport type ColorToken = typeof ColorTokens[number]\n\n/**\n * Pattern for matching color tokens in slide content.\n * Matches: {GREEN}, {ORANGE}, {CYAN}, {PINK}, {WHITE}, {GRAY},\n * {PRIMARY}, {SECONDARY}, {ACCENT}, {MUTED}, {TEXT}, {BACKGROUND}, {/}\n *\n * The {/} token closes any open color tag.\n */\nexport const COLOR_TOKEN_PATTERN = /\\{(GREEN|ORANGE|CYAN|PINK|WHITE|GRAY|PRIMARY|SECONDARY|ACCENT|MUTED|TEXT|BACKGROUND|\\/)\\}/g\n\n// ============================================================================\n// Partial Theme for Extension\n// ============================================================================\n\n/**\n * Deep partial utility type that makes all nested properties optional.\n * Used for theme extension where only specific fields need to be overridden.\n */\nexport type DeepPartial<T> = T extends object ? {\n [P in keyof T]?: DeepPartial<T[P]>\n} : T\n\n/**\n * Partial theme type for use with theme.extend() functionality.\n * All fields (including nested) become optional.\n */\nexport type PartialTheme = DeepPartial<Theme>\n\n/**\n * Schema for validating partial theme objects.\n * All fields become optional recursively, allowing partial overrides.\n * Used for theme extension validation.\n */\nexport const PartialThemeSchema = ThemeSchema.deepPartial()\n\n// ============================================================================\n// Default Theme\n// ============================================================================\n\n/**\n * Default matrix/cyberpunk theme.\n * Used when no theme is specified or as a base for theme extension.\n */\nexport const DEFAULT_THEME: Theme = {\n name: 'matrix',\n description: 'Default cyberpunk/matrix theme',\n\n colors: {\n primary: '#00cc66',\n accent: '#ff6600',\n background: '#0a0a0a',\n text: '#ffffff',\n muted: '#666666',\n },\n\n gradients: {\n fire: ['#ff6600', '#ff3300', '#ff0066'],\n cool: ['#00ccff', '#0066ff', '#6600ff'],\n pink: ['#ff0066', '#ff0099', '#cc00ff'],\n hf: ['#99cc00', '#00cc66', '#00cccc'],\n },\n\n glyphs: 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789',\n\n animations: {\n revealSpeed: 1.0,\n matrixDensity: 50,\n glitchIterations: 5,\n lineDelay: 30,\n matrixInterval: 80,\n },\n\n window: {\n borderStyle: 'line',\n shadow: true,\n padding: {\n top: 1,\n bottom: 1,\n left: 2,\n right: 2,\n },\n },\n}\n","import { z } from 'zod'\nimport { ThemeSchema } from './theme'\n\n/**\n * Schema for presentation settings.\n * Controls how the presentation behaves during runtime.\n */\nexport const SettingsSchema = z.object({\n // Start slide (0-indexed)\n startSlide: z.number().min(0).default(0),\n // Loop back to first slide after last\n loop: z.boolean().default(false),\n // Auto-advance slides (ms, 0 = disabled)\n autoAdvance: z.number().min(0).default(0),\n // Show slide numbers\n showSlideNumbers: z.boolean().default(false),\n // Show progress bar\n showProgress: z.boolean().default(false),\n})\n\nexport type Settings = z.infer<typeof SettingsSchema>\n\n/**\n * Schema for export settings.\n * Controls the output dimensions and quality of exported videos/GIFs.\n */\nexport const ExportSettingsSchema = z.object({\n // Output width in characters (min 80, max 400)\n width: z.number().min(80).max(400).default(120),\n // Output height in characters (min 24, max 100)\n height: z.number().min(24).max(100).default(40),\n // Frames per second for video (min 10, max 60)\n fps: z.number().min(10).max(60).default(30),\n})\n\nexport type ExportSettings = z.infer<typeof ExportSettingsSchema>\n\n/**\n * Schema for validating deck configuration (deck.config.ts).\n * Defines the complete configuration for a presentation deck.\n */\nexport const DeckConfigSchema = z.object({\n // Presentation metadata\n title: z.string().optional(),\n author: z.string().optional(),\n date: z.string().optional(),\n\n // Theme preset (optional - uses 'matrix' if not specified)\n // Available presets: 'matrix'\n themePreset: z.enum(['matrix']).optional(),\n\n // Theme object (optional - for advanced customization)\n // If both themePreset and theme are specified, theme takes precedence\n theme: ThemeSchema.optional(),\n\n // Presentation settings\n settings: SettingsSchema.optional(),\n\n // Export settings\n export: ExportSettingsSchema.optional(),\n})\n\nexport type DeckConfig = z.infer<typeof DeckConfigSchema>\n","import { z, ZodError } from 'zod'\n\n/**\n * Custom error class for validation failures.\n * Extends Error with a specific name for easy identification.\n */\nexport class ValidationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Format Zod errors into user-friendly messages.\n * Formats each issue with its field path and message.\n *\n * @param error - The ZodError to format\n * @param context - A description of what was being validated (e.g., \"theme\", \"slide frontmatter\")\n * @returns A formatted string with all validation issues\n *\n * @example\n * const error = new ZodError([...])\n * formatZodError(error, 'theme')\n * // Returns:\n * // \"Invalid theme:\n * // - colors.primary: Color must be a valid hex color (e.g., #ff0066)\n * // - name: Theme name is required\"\n */\nexport function formatZodError(error: ZodError, context: string): string {\n const issues = error.issues.map((issue) => {\n const path = issue.path.join('.')\n return ` - ${path ? `${path}: ` : ''}${issue.message}`\n })\n\n return `Invalid ${context}:\\n${issues.join('\\n')}`\n}\n\n/**\n * Parse data with a Zod schema and throw a ValidationError with friendly messages on failure.\n *\n * @param schema - The Zod schema to validate against\n * @param data - The data to validate\n * @param context - A description of what's being validated (e.g., \"theme\", \"slide frontmatter\")\n * @returns The parsed and validated data\n * @throws {ValidationError} If validation fails\n *\n * @example\n * const theme = safeParse(ThemeSchema, rawData, 'theme')\n * // Throws ValidationError with formatted message if invalid\n */\nexport function safeParse<T>(\n schema: z.ZodSchema<T>,\n data: unknown,\n context: string\n): T {\n const result = schema.safeParse(data)\n\n if (!result.success) {\n throw new ValidationError(formatZodError(result.error, context))\n }\n\n return result.data\n}\n","import { parse as parseYaml } from 'yaml'\nimport deepmerge from 'deepmerge'\nimport type { Theme, PartialTheme } from '../schemas/theme'\nimport { ThemeSchema } from '../schemas/theme'\nimport { safeParse } from '../schemas/validation'\n\n/**\n * Theme object with extension capability.\n * Extends the base Theme type with an extend() method that allows\n * Tailwind-style theme customization.\n */\nexport interface ThemeObject extends Theme {\n /**\n * Create a new theme by merging overrides into this theme.\n * Uses deep merge with array replacement strategy.\n *\n * @param overrides - Partial theme object with values to override\n * @returns A new ThemeObject with the merged values\n *\n * @example\n * const custom = matrix.extend({\n * colors: { primary: '#ff0066' }\n * })\n *\n * @example\n * // Chained extensions\n * const custom = matrix\n * .extend({ colors: { primary: '#ff0066' } })\n * .extend({ animations: { revealSpeed: 0.5 } })\n */\n extend(overrides: PartialTheme): ThemeObject\n}\n\n/**\n * Create a ThemeObject from validated Theme and overrides.\n * Internal helper that merges themes and adds the extend() method.\n *\n * @param base - A validated Theme object\n * @param overrides - Partial theme with values to override\n * @returns A ThemeObject with extension capability\n */\nexport function createThemeFromMerge(base: Theme, overrides: PartialTheme): ThemeObject {\n // Deep merge, with overrides taking precedence\n const merged = deepmerge(base, overrides, {\n // Arrays should be replaced, not concatenated\n arrayMerge: (_, source) => source,\n }) as Theme\n\n // Re-validate the merged result\n const validated = safeParse(ThemeSchema, merged, 'merged theme')\n\n return {\n ...validated,\n extend(newOverrides: PartialTheme): ThemeObject {\n return createThemeFromMerge(validated, newOverrides)\n },\n }\n}\n\n/**\n * Create a theme from a YAML string.\n * Parses the YAML, validates it against ThemeSchema, and returns a ThemeObject\n * with extension capability.\n *\n * @param yaml - The YAML string containing the theme definition\n * @returns A validated ThemeObject with extend() method\n * @throws {Error} If the YAML syntax is invalid\n * @throws {ValidationError} If the parsed data doesn't match ThemeSchema\n *\n * @example\n * const theme = createTheme(`\n * name: custom\n * colors:\n * primary: \"#ff0066\"\n * accent: \"#00ff66\"\n * background: \"#000000\"\n * text: \"#ffffff\"\n * muted: \"#666666\"\n * gradients:\n * main:\n * - \"#ff0066\"\n * - \"#00ff66\"\n * glyphs: \"0123456789ABCDEF\"\n * animations:\n * revealSpeed: 1.0\n * matrixDensity: 30\n * glitchIterations: 3\n * lineDelay: 20\n * matrixInterval: 100\n * `)\n */\nexport function createTheme(yaml: string): ThemeObject {\n const parsed = parseYaml(yaml)\n const validated = safeParse(ThemeSchema, parsed, 'theme')\n\n return {\n ...validated,\n extend(overrides: PartialTheme): ThemeObject {\n return createThemeFromMerge(validated, overrides)\n },\n }\n}\n\n// Re-export commonly used functions for convenience\nexport { ThemeError, formatThemeError } from './theme-errors'\nexport {\n createGradients,\n applyGradient,\n resolveColorToken,\n colorTokensToBlessedTags,\n BUILTIN_COLORS,\n} from './theme-colors'\nexport type { GradientFunction } from './theme-colors'\n","import { createTheme } from '../../core/theme'\n\nconst yaml = `\nname: matrix\ndescription: Default cyberpunk/matrix theme\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#00cc66\"\n accent: \"#ff6600\"\n background: \"#0a0a0a\"\n text: \"#ffffff\"\n muted: \"#666666\"\n\ngradients:\n fire:\n - \"#ff6600\"\n - \"#ff3300\"\n - \"#ff0066\"\n cool:\n - \"#00ccff\"\n - \"#0066ff\"\n - \"#6600ff\"\n pink:\n - \"#ff0066\"\n - \"#ff0099\"\n - \"#cc00ff\"\n hf:\n - \"#99cc00\"\n - \"#00cc66\"\n - \"#00cccc\"\n\nglyphs: \"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン0123456789\"\n\nanimations:\n revealSpeed: 1.0\n matrixDensity: 50\n glitchIterations: 5\n lineDelay: 30\n matrixInterval: 80\n\nwindow:\n borderStyle: line\n shadow: true\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`\n\nexport default createTheme(yaml)\n","import { createTheme } from '../src/core/theme.js';\n\nconst yaml = `\nname: neon\ndescription: Hot pink and electric blue neon cyberpunk theme\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#ff0099\"\n accent: \"#00ffff\"\n background: \"#0a0014\"\n text: \"#ffffff\"\n muted: \"#9933ff\"\n\ngradients:\n fire:\n - \"#ff0099\"\n - \"#ff0066\"\n - \"#ff3399\"\n cool:\n - \"#00ffff\"\n - \"#0099ff\"\n - \"#6600ff\"\n pink:\n - \"#ff0099\"\n - \"#ff33cc\"\n - \"#ff66ff\"\n hf:\n - \"#ff0099\"\n - \"#00ffff\"\n - \"#9933ff\"\n\nglyphs: \"▓▒░█▀▄▌▐■□▪▫●○◊◘◙♦♣♠♥★☆⌂ⁿ²³ÆØ∞≈≠±×÷\"\n\nanimations:\n revealSpeed: 1.2\n matrixDensity: 60\n glitchIterations: 7\n lineDelay: 25\n matrixInterval: 70\n\nwindow:\n borderStyle: line\n shadow: true\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`;\n\nexport default createTheme(yaml);\n","import { createTheme } from '../src/core/theme.js';\n\nconst yaml = `\nname: retro\ndescription: 80s synthwave retro theme with purple and orange\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#ff6ec7\"\n accent: \"#ffa600\"\n background: \"#1a0033\"\n text: \"#ffd5ff\"\n muted: \"#7d4e9f\"\n\ngradients:\n fire:\n - \"#ffa600\"\n - \"#ff6ec7\"\n - \"#ff0080\"\n cool:\n - \"#00d4ff\"\n - \"#7d4e9f\"\n - \"#ff0080\"\n pink:\n - \"#ff6ec7\"\n - \"#ff99dd\"\n - \"#ffccff\"\n hf:\n - \"#ffa600\"\n - \"#ff6ec7\"\n - \"#00d4ff\"\n\nglyphs: \"▲▼◄►♪♫■□▪▫●○◊★☆⌂∴∵≈≠±×÷αβγδλπσφω\"\n\nanimations:\n revealSpeed: 0.8\n matrixDensity: 40\n glitchIterations: 4\n lineDelay: 40\n matrixInterval: 90\n\nwindow:\n borderStyle: line\n shadow: true\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`;\n\nexport default createTheme(yaml);\n","import { createTheme } from '../src/core/theme.js';\n\nconst yaml = `\nname: minimal\ndescription: Clean monochrome theme with minimal animations\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#ffffff\"\n accent: \"#888888\"\n background: \"#000000\"\n text: \"#e0e0e0\"\n muted: \"#555555\"\n\ngradients:\n fire:\n - \"#ffffff\"\n - \"#cccccc\"\n - \"#aaaaaa\"\n cool:\n - \"#ffffff\"\n - \"#bbbbbb\"\n - \"#888888\"\n pink:\n - \"#e0e0e0\"\n - \"#c0c0c0\"\n - \"#a0a0a0\"\n hf:\n - \"#ffffff\"\n - \"#d0d0d0\"\n - \"#999999\"\n\nglyphs: \"│─┌┐└┘├┤┬┴┼═║╔╗╚╝╠╣╦╩╬\"\n\nanimations:\n revealSpeed: 0.5\n matrixDensity: 20\n glitchIterations: 2\n lineDelay: 50\n matrixInterval: 120\n\nwindow:\n borderStyle: line\n shadow: false\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`;\n\nexport default createTheme(yaml);\n","import { createTheme } from '../src/core/theme.js';\n\nconst yaml = `\nname: hacker\ndescription: Classic green terminal hacker aesthetic\nauthor: term-deck\nversion: 1.0.0\n\ncolors:\n primary: \"#00ff00\"\n accent: \"#00cc00\"\n background: \"#001100\"\n text: \"#00ff00\"\n muted: \"#006600\"\n\ngradients:\n fire:\n - \"#00ff00\"\n - \"#00ee00\"\n - \"#00dd00\"\n cool:\n - \"#00ff00\"\n - \"#00cc00\"\n - \"#009900\"\n pink:\n - \"#00ff00\"\n - \"#00dd00\"\n - \"#00bb00\"\n hf:\n - \"#00ff00\"\n - \"#00cc00\"\n - \"#008800\"\n\nglyphs: \"01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン\"\n\nanimations:\n revealSpeed: 1.5\n matrixDensity: 70\n glitchIterations: 8\n lineDelay: 15\n matrixInterval: 60\n\nwindow:\n borderStyle: line\n shadow: true\n padding:\n top: 1\n bottom: 1\n left: 2\n right: 2\n`;\n\nexport default createTheme(yaml);\n","/**\n * Public API for term-deck\n *\n * Exports functions and types for use in deck.config.ts files\n * and external integrations.\n */\n\nimport { DeckConfigSchema, type DeckConfig } from './schemas/config.js';\nimport { type Theme } from './schemas/theme.js';\nimport { type Slide, type SlideFrontmatter } from './schemas/slide.js';\nimport { createTheme, type ThemeObject } from './core/theme.js';\n\n/**\n * Define deck configuration with validation\n *\n * Usage in deck.config.ts:\n * ```typescript\n * import { defineConfig } from 'term-deck'\n * import matrix from '@term-deck/theme-matrix'\n *\n * export default defineConfig({\n * title: 'My Presentation',\n * theme: matrix,\n * })\n * ```\n */\nexport function defineConfig(config: DeckConfig): DeckConfig {\n return DeckConfigSchema.parse(config);\n}\n\n// Re-export theme creation\nexport { createTheme };\nexport type { ThemeObject };\n\n// Re-export built-in themes\nexport { default as matrixTheme } from './themes/matrix/index.js';\nexport { default as neonTheme } from '../themes/neon.js';\nexport { default as retroTheme } from '../themes/retro.js';\nexport { default as minimalTheme } from '../themes/minimal.js';\nexport { default as hackerTheme } from '../themes/hacker.js';\n\n// Re-export types for consumers\nexport type { DeckConfig, Theme, Slide, SlideFrontmatter };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pep/term-deck",
3
- "version": "1.0.32",
3
+ "version": "1.2.0",
4
4
  "description": "Terminal presentation tool with a cyberpunk aesthetic",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,7 +22,8 @@
22
22
  "license": "MIT",
23
23
  "repository": {
24
24
  "type": "git",
25
- "url": "https://github.com/PepijnSenders/term-deck.git"
25
+ "url": "https://github.com/PepijnSenders/term-deck.git",
26
+ "directory": "packages/cli"
26
27
  },
27
28
  "bugs": {
28
29
  "url": "https://github.com/PepijnSenders/term-deck/issues"
@@ -34,7 +35,6 @@
34
35
  "files": [
35
36
  "dist/",
36
37
  "themes/",
37
- "examples/",
38
38
  "LICENSE",
39
39
  "README.md"
40
40
  ],
@@ -65,7 +65,7 @@
65
65
  "scripts": {
66
66
  "dev": "tsx bin/term-deck.ts",
67
67
  "build": "tsup",
68
- "test": "vitest",
68
+ "test": "vitest run",
69
69
  "typecheck": "tsc --noEmit"
70
70
  }
71
71
  }