slotdeck 0.1.2 → 0.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 (104) hide show
  1. package/README.md +86 -6
  2. package/dist/deck/alternatives.d.ts +34 -0
  3. package/dist/deck/alternatives.js +370 -0
  4. package/dist/deck/alternatives.js.map +1 -0
  5. package/dist/deck/design.d.ts +40 -0
  6. package/dist/deck/design.js +112 -0
  7. package/dist/deck/design.js.map +1 -0
  8. package/dist/deck/validate.d.ts +18 -0
  9. package/dist/deck/validate.js +38 -2
  10. package/dist/deck/validate.js.map +1 -1
  11. package/dist/index.d.ts +22 -1
  12. package/dist/index.js +13 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/node.d.ts +7 -0
  15. package/dist/node.js +29 -0
  16. package/dist/node.js.map +1 -1
  17. package/dist/plan/catalog.js +3 -1
  18. package/dist/plan/catalog.js.map +1 -1
  19. package/dist/plan/edit.js +6 -2
  20. package/dist/plan/edit.js.map +1 -1
  21. package/dist/plan/plan.d.ts +10 -0
  22. package/dist/plan/plan.js +8 -0
  23. package/dist/plan/plan.js.map +1 -1
  24. package/dist/plan/review.d.ts +43 -0
  25. package/dist/plan/review.js +141 -0
  26. package/dist/plan/review.js.map +1 -0
  27. package/dist/plan/write.d.ts +5 -0
  28. package/dist/plan/write.js +11 -4
  29. package/dist/plan/write.js.map +1 -1
  30. package/dist/preview/pagus.d.ts +30 -0
  31. package/dist/preview/pagus.js +45 -0
  32. package/dist/preview/pagus.js.map +1 -0
  33. package/dist/preview/patterns.d.ts +27 -0
  34. package/dist/preview/patterns.js +35 -0
  35. package/dist/preview/patterns.js.map +1 -0
  36. package/dist/preview/provider.d.ts +30 -0
  37. package/dist/preview/provider.js +11 -0
  38. package/dist/preview/provider.js.map +1 -0
  39. package/dist/render/render.d.ts +18 -1
  40. package/dist/render/render.js +28 -8
  41. package/dist/render/render.js.map +1 -1
  42. package/dist/render/repeat.d.ts +17 -2
  43. package/dist/render/repeat.js +150 -4
  44. package/dist/render/repeat.js.map +1 -1
  45. package/dist/render/text.d.ts +6 -0
  46. package/dist/render/text.js +24 -0
  47. package/dist/render/text.js.map +1 -1
  48. package/dist/template/budgets.d.ts +33 -0
  49. package/dist/template/budgets.js +38 -0
  50. package/dist/template/budgets.js.map +1 -0
  51. package/dist/template/change.d.ts +18 -1
  52. package/dist/template/change.js +33 -3
  53. package/dist/template/change.js.map +1 -1
  54. package/dist/template/check.d.ts +3 -0
  55. package/dist/template/check.js +53 -3
  56. package/dist/template/check.js.map +1 -1
  57. package/dist/template/derive.d.ts +54 -0
  58. package/dist/template/derive.js +402 -0
  59. package/dist/template/derive.js.map +1 -0
  60. package/dist/template/draft.d.ts +7 -0
  61. package/dist/template/draft.js +17 -1
  62. package/dist/template/draft.js.map +1 -1
  63. package/dist/template/instruct.js +11 -5
  64. package/dist/template/instruct.js.map +1 -1
  65. package/dist/template/manifest.d.ts +22 -0
  66. package/dist/template/manifest.js +17 -1
  67. package/dist/template/manifest.js.map +1 -1
  68. package/dist/template/sample.d.ts +17 -0
  69. package/dist/template/sample.js +27 -2
  70. package/dist/template/sample.js.map +1 -1
  71. package/dist/text/fontkit.d.ts +18 -0
  72. package/dist/text/fontkit.js +91 -0
  73. package/dist/text/fontkit.js.map +1 -0
  74. package/dist/text/fonts.d.ts +45 -0
  75. package/dist/text/fonts.js +59 -0
  76. package/dist/text/fonts.js.map +1 -0
  77. package/dist/text/layout.d.ts +12 -0
  78. package/dist/text/layout.js +104 -0
  79. package/dist/text/layout.js.map +1 -0
  80. package/dist/text/measure.d.ts +85 -0
  81. package/dist/text/measure.js +369 -0
  82. package/dist/text/measure.js.map +1 -0
  83. package/dist/text/styles.d.ts +123 -0
  84. package/dist/text/styles.js +417 -0
  85. package/dist/text/styles.js.map +1 -0
  86. package/dist/tools.d.ts +12 -0
  87. package/dist/tools.js +32 -6
  88. package/dist/tools.js.map +1 -1
  89. package/docs/README.md +15 -5
  90. package/docs/api-reference.md +278 -8
  91. package/docs/changelog.md +135 -0
  92. package/docs/chat-tools.md +22 -5
  93. package/docs/deck-format.md +6 -0
  94. package/docs/design-checks.md +216 -0
  95. package/docs/generating.md +4 -1
  96. package/docs/layout-freedom.md +255 -3
  97. package/docs/manifest-format.md +19 -3
  98. package/docs/preview.md +217 -0
  99. package/docs/providers.md +1 -1
  100. package/docs/rendering.md +8 -0
  101. package/docs/template-studio.md +110 -11
  102. package/docs/text-fit.md +456 -0
  103. package/docs/troubleshooting.md +13 -2
  104. package/package.json +7 -1
package/dist/tools.js CHANGED
@@ -4,6 +4,7 @@ import { isImageRef } from './deck/spec.js';
4
4
  import { resolveAssets } from './plan/assets.js';
5
5
  import { planEdit } from './plan/edit.js';
6
6
  import { editPlan, planOutline, writeDeck } from './plan/plan.js';
7
+ import { previewExtension } from './preview/provider.js';
7
8
  import { renderDeck } from './render/render.js';
8
9
  import { readJson, writeJson } from './store.js';
9
10
  export const TOOL_NAMES = {
@@ -18,6 +19,8 @@ export const storeKeys = {
18
19
  deck: (id) => `deck/${id}.json`,
19
20
  pptx: (id) => `pptx/${id}.pptx`,
20
21
  asset: (id) => `asset/${id}`,
22
+ /** A slide's picture: `extension` is `svg` or `png`, as the preview provider made it. */
23
+ preview: (id, slide, extension) => `preview/${id}/slide-${String(slide).padStart(2, '0')}.${extension}`,
21
24
  };
22
25
  const definitions = [
23
26
  {
@@ -112,6 +115,8 @@ export function presentationTools(options) {
112
115
  plan.assets = options.assets;
113
116
  if (options.numberPatterns)
114
117
  plan.numberPatterns = options.numberPatterns;
118
+ if (options.review)
119
+ plan.review = options.review;
115
120
  if (options.onProgress)
116
121
  plan.onProgress = (event) => options.onProgress?.(event, tool);
117
122
  if (signal)
@@ -180,7 +185,23 @@ export function presentationTools(options) {
180
185
  if (warnings.length > 0) {
181
186
  output.warnings = warnings.map((issue) => `slide ${issue.slide}${issue.slot ? ` ${issue.slot}` : ''}: ${issue.message}`);
182
187
  }
183
- return { id, output, pptx };
188
+ // Pictures of the slides are an extra: the presentation stands when they cannot be made.
189
+ let previews;
190
+ if (options.preview) {
191
+ try {
192
+ previews = await options.preview.renderSlides(signal ? { pptx, signal } : { pptx });
193
+ const keys = previews.map((picture) => storeKeys.preview(id, picture.slide, previewExtension(picture)));
194
+ await Promise.all(previews.map((picture, index) => store.set(keys[index], picture.data)));
195
+ output.previews = keys;
196
+ }
197
+ catch (error) {
198
+ if (signal?.aborted)
199
+ throw error;
200
+ previews = undefined;
201
+ output.preview_error = error instanceof Error ? error.message : String(error);
202
+ }
203
+ }
204
+ return { id, output, pptx, previews };
184
205
  };
185
206
  const text = (args, name) => {
186
207
  const value = args[name];
@@ -231,8 +252,8 @@ export function presentationTools(options) {
231
252
  if (!plan)
232
253
  throw new ToolInputError(`There is no plan with id "${planId}"`);
233
254
  const written = await writeDeck(template, plan, planOptions(TOOL_NAMES.create, signal));
234
- const { output, pptx } = await finish(TOOL_NAMES.create, written.deck, written.warnings, signal);
235
- return { output: { ...output, plan_id: planId }, deck: written.deck, pptx };
255
+ const { output, pptx, previews } = await finish(TOOL_NAMES.create, written.deck, written.warnings, signal);
256
+ return withPreviews({ output: { ...output, plan_id: planId }, deck: written.deck, pptx }, previews);
236
257
  },
237
258
  async [TOOL_NAMES.edit](args, signal) {
238
259
  const deckId = text(args, 'presentation_id');
@@ -241,12 +262,12 @@ export function presentationTools(options) {
241
262
  throw new ToolInputError(`There is no presentation with id "${deckId}"`);
242
263
  const editOptions = { ...planOptions(TOOL_NAMES.edit, signal), ...(canMakePhotos ? {} : { imageDensity: 'none' }) };
243
264
  const edited = await planEdit(template, deck, text(args, 'instruction'), editOptions);
244
- const { output, pptx } = await finish(TOOL_NAMES.edit, edited.deck, edited.warnings, signal);
245
- return {
265
+ const { output, pptx, previews } = await finish(TOOL_NAMES.edit, edited.deck, edited.warnings, signal);
266
+ return withPreviews({
246
267
  output: { ...output, summary: edited.summary, rewritten_slides: edited.rewritten, previous_presentation_id: deckId },
247
268
  deck: edited.deck,
248
269
  pptx,
249
- };
270
+ }, previews);
250
271
  },
251
272
  };
252
273
  return {
@@ -267,6 +288,11 @@ export function presentationTools(options) {
267
288
  },
268
289
  };
269
290
  }
291
+ function withPreviews(result, previews) {
292
+ if (previews)
293
+ result.previews = previews;
294
+ return result;
295
+ }
270
296
  class ToolInputError extends Error {
271
297
  }
272
298
  //# sourceMappingURL=tools.js.map
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/docs/README.md CHANGED
@@ -37,8 +37,11 @@ slotdeck makes new PowerPoint files from an existing PowerPoint template.
37
37
  | [generating.md](generating.md) | Make a deck from a brief, or change one by instruction, with a language model |
38
38
  | [chat-tools.md](chat-tools.md) | Give a chat model the four presentation tools and store what they produce |
39
39
  | [providers.md](providers.md) | Connect your own language model or image source, including an internal gateway |
40
- | [layout-freedom.md](layout-freedom.md) | Vary the number of cards, enlarge text, and derive several patterns from one slide |
40
+ | [layout-freedom.md](layout-freedom.md) | Vary the number of cards, enlarge text, derive several patterns from one slide, and find other layouts for a slide |
41
41
  | [languages.md](languages.md) | Make right-to-left decks from a left-to-right template, or the reverse |
42
+ | [text-fit.md](text-fit.md) | Measure text with the template's fonts: overflow in lines, shrinking to fit, budgets from measurement |
43
+ | [preview.md](preview.md) | Get a picture of each slide without PowerPoint, and know how close it is |
44
+ | [design-checks.md](design-checks.md) | Find empty boxes, uneven cards and orphan words by measurement, and have drafts reviewed while a deck is written |
42
45
  | [template-studio.md](template-studio.md) | Draft a manifest with a model, check it, change it by hand or by instruction |
43
46
  | [api-reference.md](api-reference.md) | Look up any export: its signature and what it does |
44
47
  | [troubleshooting.md](troubleshooting.md) | Find the meaning of an error or warning, and the known limits |
@@ -50,6 +53,7 @@ slotdeck makes new PowerPoint files from an existing PowerPoint template.
50
53
  | --- | --- | --- |
51
54
  | Turn deck JSON into a pptx | `renderDeck` | none |
52
55
  | Check deck JSON before rendering | `validateDeck` | none |
56
+ | See which other layouts a slide's content fits | `slideAlternatives` | none |
53
57
  | Brief in, pptx out | `generateDeck` | text: 2 plus repairs; images: one per photo |
54
58
  | Brief in, deck JSON out | `planDeck` | 2 plus repairs |
55
59
  | Show a plan first, write later | `planOutline`, `editPlan`, `writeDeck` | 1 each, `writeDeck` plus repairs |
@@ -58,19 +62,25 @@ slotdeck makes new PowerPoint files from an existing PowerPoint template.
58
62
  | Describe a new template | `draftManifest` | 1 per slide, plus 1 |
59
63
  | Verify a manifest against its pptx | `checkManifest` | none |
60
64
  | See whether a manifest's budgets hold | `sampleDeck` then `renderDeck` | none |
65
+ | Know whether a text fits its box, in lines | `loadTemplate` with `fonts`, or `textMeasurer` | none |
66
+ | Set budgets from what the boxes hold | `measuredBudgets` | none |
67
+ | Show a deck or a template's layouts as pictures | `previewDeck`, `patternPreviews` with a `PreviewProvider` | none |
68
+ | List design problems of a deck | `checkDesign` | none |
69
+ | Have drafts checked for design while a deck is written | `review: designReview(template)` on the planner | none of its own; each repair is one writing call |
61
70
  | Change a manifest by operations | `changeManifest` | none |
71
+ | Add a mirrored or text-only variant of a pattern | `changeManifest` with `derivePattern`; `patternVariants` lists what is possible | none |
62
72
  | Change a manifest by instruction | `editManifest` | 1 or 2 |
63
73
  | List the shapes of a template | `inspectTemplate`, `studioView` | none |
64
74
 
65
75
  ## Facts worth knowing before writing code
66
76
 
67
77
  - The package is ESM only (`import`, not `require`) and needs Node 22.18 or later.
68
- - Entry points: `slotdeck` (everything that runs anywhere) and `slotdeck/node` (`directoryStore`, which uses
69
- the file system).
78
+ - Entry points: `slotdeck` (everything that runs anywhere) and `slotdeck/node` (`directoryStore` and
79
+ `fontFiles`, which use the file system).
70
80
  - All binary data is `Uint8Array`. In Node a `Buffer` is a `Uint8Array`, so `fs.readFileSync(path)` can be
71
81
  passed directly.
72
- - Functions that call a model are `async`. `renderDeck`, `validateDeck`, `checkManifest`, `sampleDeck`,
73
- `changeManifest`, `inspectTemplate` and `studioView` are synchronous.
82
+ - Functions that call a model are `async`. `renderDeck`, `validateDeck`, `slideAlternatives`, `checkManifest`,
83
+ `sampleDeck`, `changeManifest`, `patternVariants`, `inspectTemplate` and `studioView` are synchronous.
74
84
  - A deck never contains binary data. Pictures are referenced by an **asset id** and passed to the renderer as
75
85
  a map from id to bytes.
76
86
  - Nothing is written to disk and nothing is sent anywhere by slotdeck itself, except what your own provider
@@ -16,10 +16,11 @@ every field.
16
16
  ### `loadTemplate`
17
17
 
18
18
  ```ts
19
- function loadTemplate(pptx: Uint8Array, manifest: TemplateManifest): Template;
19
+ function loadTemplate(pptx: Uint8Array, manifest: TemplateManifest, options?: TemplateOptions): Template;
20
20
  ```
21
21
 
22
- Unzips a template once. Reuse the result.
22
+ Unzips a template once. Reuse the result. `options.fonts` gives it font metrics, which turns on text measuring
23
+ everywhere the template is used (see "Measuring text" below).
23
24
 
24
25
  ### `renderDeck`
25
26
 
@@ -45,6 +46,26 @@ function extractAssets(template: Template, deck: DeckSpec, pptx: Uint8Array): Re
45
46
 
46
47
  Reads a deck's pictures back from a pptx rendered from it, by asset id.
47
48
 
49
+ ### `slideAlternatives`
50
+
51
+ ```ts
52
+ function slideAlternatives(manifest: TemplateManifest, deck: DeckSpec, slide: number, options?: AlternativesOptions): SlideAlternative[];
53
+
54
+ interface AlternativesOptions { layout?: LayoutMode; patterns?: string[] }
55
+ interface SlideAlternative {
56
+ pattern: string; // a pattern that has a place for everything the slide says
57
+ description: string; // what that pattern is for
58
+ slide: SlideSpec; // the slide written for that pattern
59
+ changes: string[]; // what was done where the content was not copied slot for slot
60
+ dropped: string[]; // slots of the original whose photo or icon has no place
61
+ warnings: Issue[]; // what validateDeck says about the new slide
62
+ }
63
+ ```
64
+
65
+ The other patterns that can hold what slide number `slide` (from 1) of a deck says, with the slide written for
66
+ each. Synchronous, no model, no words changed. Throws a `RangeError` when the deck has no such slide. See
67
+ "Another layout for the same slide" in [layout-freedom.md](layout-freedom.md).
68
+
48
69
  ### `DeckValidationError`
49
70
 
50
71
  ```ts
@@ -66,13 +87,18 @@ Tell the kinds of slot value apart when walking a deck.
66
87
  ### Types
67
88
 
68
89
  ```ts
69
- interface Template { pkg: PptxPackage; manifest: TemplateManifest }
90
+ interface Template { pkg: PptxPackage; manifest: TemplateManifest; fonts?: FontMetrics }
91
+ interface TemplateOptions { fonts?: FontMetrics }
70
92
 
71
93
  interface RenderOptions { assets?: Record<string, Uint8Array>; layout?: LayoutMode }
72
- interface RenderResult { pptx: Uint8Array; warnings: Issue[] }
94
+ interface RenderResult {
95
+ pptx: Uint8Array;
96
+ warnings: Issue[];
97
+ shrunk: Array<{ slide: number; slot: string; size: number; scale: number }>; // texts set smaller to fit; empty without shrinkText
98
+ }
73
99
 
74
100
  type LayoutMode = 'strict' | 'adaptive';
75
- interface ValidateOptions { layout?: LayoutMode; assets?: Iterable<string> }
101
+ interface ValidateOptions { layout?: LayoutMode; assets?: Iterable<string>; measure?: TextMeasurer }
76
102
  interface Issue { severity: 'error' | 'warning'; slide?: number; slot?: string; message: string }
77
103
 
78
104
  interface DeckSpec {
@@ -219,6 +245,7 @@ interface PlanOptions {
219
245
  patterns?: string[];
220
246
  numberPatterns?: 'from-brief' | 'always' | 'never';
221
247
  maxRepairs?: number;
248
+ review?: DeckReview; // a second look at every draft; see "Design checks and reviews"
222
249
  onProgress?: (event: PlanProgress) => void;
223
250
  signal?: AbortSignal;
224
251
  }
@@ -296,6 +323,7 @@ const storeKeys: {
296
323
  deck(id: string): string; // 'deck/<id>.json'
297
324
  pptx(id: string): string; // 'pptx/<id>.pptx'
298
325
  asset(id: string): string; // 'asset/<id>'
326
+ preview(id: string, slide: number, extension: string): string; // 'preview/<id>/slide-03.svg'
299
327
  };
300
328
  ```
301
329
 
@@ -331,7 +359,9 @@ interface PresentationToolsOptions {
331
359
  layout?: LayoutMode;
332
360
  fields?: Record<string, string>;
333
361
  numberPatterns?: 'from-brief' | 'always' | 'never';
362
+ review?: DeckReview; // a second look at every draft the tools write
334
363
  thumbnail?: (patternId: string) => string | undefined;
364
+ preview?: PreviewProvider; // draws every presentation the tools create or change
335
365
  newId?: (kind: 'plan' | 'deck') => string;
336
366
  onProgress?: (event: GenerateProgress, tool: string) => void;
337
367
  }
@@ -340,7 +370,7 @@ interface PresentationTools {
340
370
  call(name: string, args: unknown, context?: { signal?: AbortSignal }): Promise<ToolResult>;
341
371
  }
342
372
  interface ToolDefinition { name: string; description: string; parameters: JsonSchema }
343
- interface ToolResult { output: Record<string, unknown>; plan?: DeckPlan; deck?: DeckSpec; pptx?: Uint8Array }
373
+ interface ToolResult { output: Record<string, unknown>; plan?: DeckPlan; deck?: DeckSpec; pptx?: Uint8Array; previews?: SlidePreview[] }
344
374
  ```
345
375
 
346
376
  ## Providers
@@ -439,6 +469,17 @@ function changeManifest(template: Template, changes: ManifestChange[]): ChangeRe
439
469
  function editManifest(template: Template, instruction: string, options: ManifestEditOptions): Promise<ManifestEditResult>;
440
470
  ```
441
471
 
472
+ ### `patternVariants`, `VARIANTS`
473
+
474
+ ```ts
475
+ function patternVariants(template: Template, pattern: string): VariantOption[];
476
+ const VARIANTS: readonly ['mirror', 'text-only', 'without'];
477
+ type PatternVariant = (typeof VARIANTS)[number];
478
+ ```
479
+
480
+ The variants of a pattern that `changeManifest` can derive with `{ op: 'derivePattern' }`, each with whether
481
+ the pattern's slide allows it. See [template-studio.md](template-studio.md).
482
+
442
483
  ### `describeManifest`, `describeSlot`
443
484
 
444
485
  ```ts
@@ -493,6 +534,7 @@ interface DraftOptions {
493
534
  name?: string;
494
535
  slideImage?: (slide: number) => SlidePicture | undefined | Promise<SlidePicture | undefined>;
495
536
  slides?: number[];
537
+ variants?: Array<'mirror' | 'text-only'>; // also add these variants of every pattern that allows them
496
538
  concurrency?: number;
497
539
  onProgress?: (event: { done: number; total: number; slide: number }) => void;
498
540
  signal?: AbortSignal;
@@ -500,18 +542,19 @@ interface DraftOptions {
500
542
  interface DraftResult { manifest: TemplateManifest; skipped: Array<{ slide: number; reason: string }>; issues: ManifestIssue[] }
501
543
 
502
544
  interface ManifestIssue { severity: 'error' | 'warning'; pattern?: string; slot?: string; message: string }
503
- interface SampleOptions { fill?: number; items?: 'drawn' | 'max' | 'min' }
545
+ interface SampleOptions { fill?: number; items?: 'drawn' | 'max' | 'min'; fit?: 'budget' | 'box' }
504
546
 
505
547
  type ManifestChange =
506
548
  | { op: 'setManifest'; name?: string; language?: string; direction?: Direction; alignOnDirectionChange?: AlignPolicy; textScale?: number | null }
507
549
  | { op: 'addPattern'; slide: number; id: string; description?: string }
508
550
  | { op: 'copyPattern'; pattern: string; id: string; description?: string }
551
+ | { op: 'derivePattern'; pattern: string; variant: PatternVariant; slot?: string; id?: string; description?: string }
509
552
  | { op: 'removePattern'; pattern: string }
510
553
  | { op: 'setPattern'; pattern: string; id?: string; description?: string; figures?: boolean }
511
554
  | { op: 'addSlot'; pattern: string; shape: string; role: Role; name?: string; optional?: boolean }
512
555
  | { op: 'removeSlot'; pattern: string; slot: string }
513
556
  | ({ op: 'setSlot'; pattern: string; slot: string } & SlotPatch)
514
- | { op: 'setRepeat'; pattern: string; min?: number; max?: number; item?: string; span?: { left: number; right: number } | null }
557
+ | { op: 'setRepeat'; pattern: string; min?: number; max?: number; item?: string; span?: { left: number; right: number } | null; widen?: number | null }
515
558
  | { op: 'removeRepeat'; pattern: string };
516
559
 
517
560
  interface SlotPatch {
@@ -547,6 +590,7 @@ interface ChangeResult {
547
590
  rejected: Array<{ index: number; change: ManifestChange; reason: string }>;
548
591
  issues: ManifestIssue[];
549
592
  }
593
+ interface VariantOption { variant: PatternVariant; slot?: string; available: boolean; note: string }
550
594
  interface ManifestEditOptions { llm: LlmProvider; signal?: AbortSignal }
551
595
  interface ManifestEditResult extends ChangeResult { note: string }
552
596
 
@@ -582,6 +626,230 @@ interface SlideInfo { number: number; part: string; layout: string; shapes: Shap
582
626
  interface TemplateInfo { slideWidth: number; slideHeight: number; defaultFontSize: number; slides: SlideInfo[] }
583
627
  ```
584
628
 
629
+ ## Design checks and reviews
630
+
631
+ Explained in [design-checks.md](design-checks.md). Both need a template loaded with fonts.
632
+
633
+ ### `checkDesign`
634
+
635
+ ```ts
636
+ function checkDesign(template: Template, deck: DeckSpec, options?: DesignOptions): DesignIssue[];
637
+ ```
638
+
639
+ Lists design problems that follow from measurement alone: text that runs over its box, boxes and cards left
640
+ mostly empty, headings that end in a lone word. Synchronous, no model, no picture.
641
+
642
+ ### `designReview`
643
+
644
+ ```ts
645
+ function designReview(template: Template, options?: DesignOptions): DeckReview;
646
+ ```
647
+
648
+ The design checks as a review for the planner's `review` option. Reports `empty`, `uneven` and `orphan`.
649
+
650
+ ### `visionReview`
651
+
652
+ ```ts
653
+ function visionReview(options: VisionReviewOptions): DeckReview;
654
+ ```
655
+
656
+ A review by a model that looks at pictures of the draft's slides, drawn by a `PreviewProvider` that gives
657
+ bitmap pictures. Not run against a live model; see the cautions in [design-checks.md](design-checks.md).
658
+
659
+ ### Types
660
+
661
+ ```ts
662
+ type DesignKind = 'overflow' | 'empty' | 'uneven' | 'orphan';
663
+ interface DesignIssue { severity: 'warning'; slide: number; slot: string; kind: DesignKind; message: string } // an Issue with a kind
664
+ interface DesignOptions {
665
+ layout?: LayoutMode;
666
+ kinds?: DesignKind[]; // default: all four
667
+ emptyBelow?: number; // default 1/3
668
+ headingSize?: number; // points; default 20
669
+ }
670
+
671
+ // A second look at a draft deck: problems to send back to the writing model.
672
+ type DeckReview = (deck: DeckSpec, context: { signal?: AbortSignal }) => Issue[] | Promise<Issue[]>;
673
+
674
+ interface VisionReviewOptions {
675
+ template: Template;
676
+ llm: LlmProvider; // a model that accepts pictures
677
+ preview: PreviewProvider; // must give PNG, JPEG, WebP or GIF
678
+ icons?: IconDef[];
679
+ assets?: AssetDef[];
680
+ layout?: LayoutMode; // default 'adaptive'
681
+ slidesPerRequest?: number; // default 6
682
+ }
683
+ ```
684
+
685
+ ## Slide previews
686
+
687
+ Explained in [preview.md](preview.md). slotdeck draws nothing itself: a `PreviewProvider` is a renderer you plug in.
688
+
689
+ ### `pagusPreviews`
690
+
691
+ ```ts
692
+ function pagusPreviews(core: PagusCore, renderer: PagusRenderer, options?: PagusOptions): PreviewProvider;
693
+
694
+ interface PagusCore { parse(data: ArrayBuffer): Promise<{ slides: readonly unknown[]; slideSize: unknown }> } // the `@pagus-kit/core` module
695
+ interface PagusRenderer { renderSlide(slide: never, slideSize: never, options?: never): { svg: string; width: number; height: number } } // the `@pagus-kit/renderer` module
696
+ interface PagusOptions { scale?: number; fontSubstitutes?: Record<string, string>; fontCss?: string }
697
+ ```
698
+
699
+ A provider that draws slides with the Pagus library, which you install and pass in:
700
+ `pagusPreviews(pagusCore, pagusRenderer)` after `import * as pagusCore from '@pagus-kit/core'` and
701
+ `import * as pagusRenderer from '@pagus-kit/renderer'`. One SVG for each slide, with the text as real text for a
702
+ browser to set. Paragraphs that start with a right-to-left letter are marked as running right to left.
703
+
704
+ ### `previewDeck`
705
+
706
+ ```ts
707
+ function previewDeck(template: Template, deck: DeckSpec, preview: PreviewProvider, options?: PreviewDeckOptions): Promise<{ pptx: Uint8Array; previews: SlidePreview[] }>;
708
+ ```
709
+
710
+ `renderDeck`, then the provider: the pptx and a picture of each of its slides.
711
+
712
+ ### `patternPreviews`
713
+
714
+ ```ts
715
+ function patternPreviews(template: Template, preview: PreviewProvider, options?: SampleOptions & { signal?: AbortSignal }): Promise<Record<string, SlidePreview>>;
716
+ ```
717
+
718
+ A picture of every pattern, by pattern id: each pattern's slide of the template's sample deck.
719
+
720
+ ### `previewExtension`
721
+
722
+ ```ts
723
+ function previewExtension(preview: { mimeType: string }): string; // 'svg', 'png', 'jpg', ...
724
+ ```
725
+
726
+ The file extension for a preview's type, for naming it in a store or on disk.
727
+
728
+ ### Types
729
+
730
+ ```ts
731
+ // What slotdeck needs from a slide renderer. Implement it to plug in any renderer.
732
+ interface PreviewProvider {
733
+ renderSlides(request: PreviewRequest): Promise<SlidePreview[]>; // one picture for each slide asked for, in slide order
734
+ }
735
+ interface PreviewRequest {
736
+ pptx: Uint8Array;
737
+ slides?: number[]; // 1-based; every slide when left out
738
+ signal?: AbortSignal;
739
+ }
740
+ interface SlidePreview {
741
+ slide: number; // 1-based
742
+ mimeType: string; // 'image/svg+xml', 'image/png'
743
+ data: Uint8Array; // SVG as UTF-8 text, or the bitmap's bytes
744
+ width?: number; // pixels
745
+ height?: number;
746
+ }
747
+ interface PreviewDeckOptions { assets?: Record<string, Uint8Array>; layout?: LayoutMode; signal?: AbortSignal }
748
+ ```
749
+
750
+ ## Measuring text
751
+
752
+ Explained in [text-fit.md](text-fit.md). All of it is optional: without fonts nothing here is used.
753
+
754
+ ### `fontkitMetrics`
755
+
756
+ ```ts
757
+ function fontkitMetrics(fontkit: FontkitModule, files: FontFiles): FontMetrics;
758
+
759
+ type FontFiles = Record<string, Uint8Array | Uint8Array[]>; // typeface name as the template states it -> its font files
760
+ interface FontkitModule { create(buffer: never, postscriptName?: string): unknown } // the `fontkit` module itself
761
+ ```
762
+
763
+ Font metrics from font files, read with the `fontkit` library, which you install and pass in:
764
+ `fontkitMetrics(fontkit, { Calibri: [regularBytes, boldBytes] })` after `import * as fontkit from 'fontkit'`.
765
+ Reads TrueType, OpenType, collections, WOFF and WOFF2.
766
+
767
+ ### `fontFiles` (from `slotdeck/node`)
768
+
769
+ ```ts
770
+ function fontFiles(fontkit: FontkitModule, directory: string, typefaces: Iterable<string>): FontFiles;
771
+ ```
772
+
773
+ Finds the font files of the given typefaces in a folder, such as the system's font folder, by the family name
774
+ each file states. Typefaces with no file there are left out.
775
+
776
+ ### `templateFonts`
777
+
778
+ ```ts
779
+ function templateFonts(template: Template, language?: string): TemplateFont[];
780
+ ```
781
+
782
+ The typefaces a template's text slots are set in, with the weights and slants used: the font files to supply.
783
+ `language` (default: the manifest's) adds the typeface that text of that language is set in.
784
+
785
+ ### `textMeasurer`
786
+
787
+ ```ts
788
+ function textMeasurer(template: Template, fonts?: FontMetrics): TextMeasurer;
789
+ ```
790
+
791
+ A measurer for a template. `fonts` defaults to the fonts the template was loaded with; it throws when there
792
+ are none. Pass the result to `validateDeck` as `measure`, or call `fit` yourself.
793
+
794
+ ### `measuredBudgets`
795
+
796
+ ```ts
797
+ function measuredBudgets(template: Template, options?: BudgetOptions): MeasuredBudget[];
798
+ ```
799
+
800
+ How many characters each text slot's box holds, as measured, with a budget to set. The template must have
801
+ fonts.
802
+
803
+ ### Types
804
+
805
+ ```ts
806
+ // What slotdeck needs from a font library. Implement it to use a library other than fontkit.
807
+ interface FontMetrics {
808
+ face(typeface: string, style: FontStyle): FontFace | undefined; // undefined: the typeface was not supplied
809
+ fallback?(codePoint: number, style: FontStyle): FontFace | undefined; // a face for a character the chosen one lacks
810
+ }
811
+ interface FontStyle { bold: boolean; italic: boolean }
812
+ interface FontFace {
813
+ has(codePoint: number): boolean;
814
+ advances(text: string, kerning: boolean): number[]; // the advance of each glyph after shaping, in ems
815
+ substitute?: boolean; // stands in for a weight or slant that was not supplied
816
+ }
817
+
818
+ interface TemplateFont { typeface: string; bold: boolean; italic: boolean }
819
+
820
+ interface TextMeasurer {
821
+ fit(pattern: string | PatternDef, slot: string | TextSlotDef, text: string | string[], options?: FitOptions): TextFit | undefined;
822
+ missingFonts(): TemplateFont[];
823
+ }
824
+ interface FitOptions {
825
+ textScale?: number; // the factor on body text the deck is rendered with; default 1
826
+ shrink?: ShrinkLimit; // allow the text to be set smaller when it does not fit
827
+ items?: number; // for a slot of a row of items: how many items the slide has
828
+ }
829
+ interface ShrinkLimit { to: number; minSize?: number } // the shape of the manifest's shrinkText
830
+ interface TextFit {
831
+ fits: boolean;
832
+ lines: number; // lines the text takes
833
+ capacity: number; // lines of this text the box holds
834
+ overflow: number; // lines that do not fit
835
+ height: number; // points the text takes
836
+ room: number; // points the box gives
837
+ widthRatio: number; // for a box that does not wrap: longest line / box width
838
+ size: number; // font size of the first paragraph, in points
839
+ sizes: number[]; // font size of each paragraph
840
+ scale: number; // the factor the text was shrunk by; 1 when it was not
841
+ fitsChars: number; // about how many characters of such text the box holds
842
+ paragraphs: string[][]; // the lines of each paragraph
843
+ widths: number[][]; // the width of each of those lines, in points
844
+ lineRoom: number[]; // the width a line of each paragraph may take, in points
845
+ sampleLines: number; // lines the template's own sample text takes in the slot; 0 when there is none to compare with
846
+ approximate: boolean; // a typeface, weight or outline was stood in for
847
+ }
848
+
849
+ interface BudgetOptions { sample?: string; margin?: number } // margin defaults to 0.9
850
+ interface MeasuredBudget { pattern: string; slot: string; maxChars?: number; fits: number; suggested: number }
851
+ ```
852
+
585
853
  ## Manifest types
586
854
 
587
855
  Described field by field in [manifest-format.md](manifest-format.md).
@@ -601,6 +869,7 @@ interface TemplateManifest {
601
869
  direction: Direction;
602
870
  alignOnDirectionChange?: AlignPolicy;
603
871
  textScale?: number; // enlarges body text in every deck made from the template
872
+ shrinkText?: { to: number; minSize?: number }; // lets text that does not fit be set smaller; needs fonts
604
873
  patterns: PatternDef[];
605
874
  }
606
875
  interface PatternDef {
@@ -620,6 +889,7 @@ interface RepeatDef {
620
889
  max?: number;
621
890
  span?: { left: number; right: number };
622
891
  columns?: number;
892
+ widen?: number; // fewer items on a line than drawn grow up to this factor to fill the row
623
893
  }
624
894
  type SlotDef = TextSlotDef | ImageSlotDef | TableSlotDef | ChartSlotDef;
625
895