@openpresentation/opf 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +7 -1
  2. package/dist/{catalogs-BnnkUX9O.d.ts → catalogs-DoVmvDr7.d.ts} +6 -6
  3. package/dist/catalogs.d.ts +2 -2
  4. package/dist/catalogs.js +1 -1
  5. package/dist/{chunk-GQSK3T7X.js → chunk-D3GQIREP.js} +13 -4
  6. package/dist/chunk-EWJNRHXA.js +595 -0
  7. package/dist/{chunk-3GPZMY2W.js → chunk-FHGJX5QK.js} +24 -12
  8. package/dist/{chunk-JA5W5TVA.js → chunk-PQJRDNA6.js} +624 -73
  9. package/dist/{chunk-OZULJBSG.js → chunk-RS5GZ5RW.js} +14 -0
  10. package/dist/{chunk-TWMRZ43O.js → chunk-TU7I3KSB.js} +59 -21
  11. package/dist/{chunk-ZGV6I23P.js → chunk-ZIL7MGZU.js} +50 -5
  12. package/dist/composition.d.ts +257 -10
  13. package/dist/composition.js +1 -1
  14. package/dist/docs.js +58 -10
  15. package/dist/examples.js +2284 -1417
  16. package/dist/index.d.ts +4 -3
  17. package/dist/index.js +7 -6
  18. package/dist/lint.d.ts +70 -0
  19. package/dist/lint.js +5 -0
  20. package/dist/pagination.d.ts +4 -0
  21. package/dist/pagination.js +5 -5
  22. package/dist/{schemas--QRVBhU1.d.ts → schemas-BYe5y8-i.d.ts} +1 -1
  23. package/dist/schemas.d.ts +1 -1
  24. package/dist/schemas.js +1 -1
  25. package/dist/spec/catalogs/layouts/extract/canonical.json +45 -21
  26. package/dist/spec/catalogs/layouts/index.json +10 -0
  27. package/dist/spec/catalogs/layouts/number-1x.json +1 -1
  28. package/dist/spec/catalogs/layouts/number-2x.json +2 -2
  29. package/dist/spec/catalogs/layouts/number-3x.json +3 -3
  30. package/dist/spec/catalogs/layouts/number-4x.json +4 -4
  31. package/dist/spec/catalogs/layouts/number-5x.json +5 -5
  32. package/dist/spec/catalogs/layouts/number-6x.json +6 -6
  33. package/dist/spec/catalogs/layouts/quote-1x.json +13 -0
  34. package/dist/spec/catalogs/layouts/timeline-1x.json +13 -0
  35. package/dist/spec/schemas/layout.schema.json +12 -3
  36. package/dist/spec/schemas/narrative.schema.json +1 -1
  37. package/dist/spec-files.d.ts +1 -1
  38. package/dist/spec-files.js +1 -1
  39. package/dist/types.d.ts +2 -2
  40. package/dist/validator.d.ts +2 -2
  41. package/dist/validator.js +4 -4
  42. package/package.json +11 -6
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- export { S as SchemaEntry, a as SchemaName, b as audience, c as chartType, d as colorScheme, f as fontScheme, l as language, e as layout, n as narrative, p as presentation, g as purpose, s as schemaEntries, h as schemaNames, i as schemas, j as socialPlatform, t as theme, k as tone } from './schemas--QRVBhU1.js';
2
- export { A as Audience, C as CatalogEntry, a as CatalogIndex, b as CatalogIndexRecord, c as CatalogKind, d as CatalogRecord, e as ChartType, f as ColorScheme, F as FontScheme, L as Language, g as Layout, N as Narrative, P as Purpose, S as SocialPlatform, T as Theme, h as Tone, i as audiences, j as catalogEntries, k as catalogIndexes, l as catalogKinds, m as catalogSchemaNames, n as catalogs, o as chartTypes, p as colorSchemes, q as fontSchemes, r as languages, s as layouts, t as narratives, u as purposes, v as socialPlatforms, w as themes, x as tones } from './catalogs-BnnkUX9O.js';
1
+ export { S as SchemaEntry, a as SchemaName, b as audience, c as chartType, d as colorScheme, f as fontScheme, l as language, e as layout, n as narrative, p as presentation, g as purpose, s as schemaEntries, h as schemaNames, i as schemas, j as socialPlatform, t as theme, k as tone } from './schemas-BYe5y8-i.js';
2
+ export { A as Audience, C as CatalogEntry, a as CatalogIndex, b as CatalogIndexRecord, c as CatalogKind, d as CatalogRecord, e as ChartType, f as ColorScheme, F as FontScheme, L as Language, g as Layout, N as Narrative, P as Purpose, S as SocialPlatform, T as Theme, h as Tone, i as audiences, j as catalogEntries, k as catalogIndexes, l as catalogKinds, m as catalogSchemaNames, n as catalogs, o as chartTypes, p as colorSchemes, q as fontSchemes, r as languages, s as layouts, t as narratives, u as purposes, v as socialPlatforms, w as themes, x as tones } from './catalogs-DoVmvDr7.js';
3
3
  export { OPFValidationError, ValidationIssue, ValidationResult, assertValid, assertValidCatalogRecord, assertValidPresentation, validate, validateCatalogRecord, validatePresentation } from './validator.js';
4
4
  export { SpecFileEntry, SpecFileKind, SpecFilePath, specFileEntries, specFileKinds, specFilePaths } from './spec-files.js';
5
5
  export { LayoutPreviewIndex, LayoutPreviewRecord, getLayoutPreview, hasLayoutPreview, layoutPreviewIndex, layoutPreviewSlugs, layoutPreviews } from './previews.js';
6
6
  export { P as Presentation } from './presentation-BMTdX6O1.js';
7
- export { CodeContent, CodeLayout, CodeLayoutDiagnostic, CodeLayoutOptions, CodeLineSegment, CodeLineSource, CodeTextFit, CodeTextPart, ComposeSlideOptions, ComposedFlow, ComposedGroup, ComposedItem, Composition, CompositionCandidate, CompositionDecision, CompositionExplanation, CompositionPenalties, CompositionTrack, FontFamilies, LayoutBox, LayoutDiagnostic, ListEntryLayout, ListFit, ListText, ListValue, MAX_COMPOSITION_DEPTH, MeasureTextWidth, OPFCompositionError, QuoteContent, QuoteLayout, QuoteLayoutDiagnostic, QuoteLayoutOptions, QuoteTextPart, QuoteTextSource, RichTextFit, RichTextFragment, RichTextLine, RichTextOptions, RichTextRun, SlideComposition, TextFit, TextMeasurement, TextStyle, composeSlide, fitList, fitRichText, fitText, layoutCode, layoutQuote, measureText, resolveCanvasDimensions, resolveFontFamilies, resolveTextStyle, textWidthMeasurer, wrapText } from './composition.js';
7
+ export { LintContract, LintDiagnostic, LintLocation, LintOptions, LintReport, LintSeverity, LintSuggestion, lintPresentation, lintSource } from './lint.js';
8
+ export { CodeContent, CodeLayout, CodeLayoutDiagnostic, CodeLayoutOptions, CodeLineSegment, CodeLineSource, CodeTextFit, CodeTextPart, ComposeSlideOptions, ComposedFlow, ComposedGroup, ComposedItem, Composition, CompositionCandidate, CompositionDecision, CompositionExplanation, CompositionPenalties, CompositionTrack, FontFamilies, FurnitureImagePart, FurnitureLayout, FurniturePart, FurniturePartBase, FurnitureTextPart, LayoutBox, LayoutDiagnostic, ListEntryLayout, ListFit, ListText, ListValue, MAX_COMPOSITION_DEPTH, MeasureTextWidth, MetricContent, MetricLayout, MetricLayoutDiagnostic, MetricLayoutOptions, MetricTextPart, MetricTextSource, OPFCompositionError, QuoteContent, QuoteLayout, QuoteLayoutDiagnostic, QuoteLayoutOptions, QuoteTextPart, QuoteTextSource, RichTextFit, RichTextFragment, RichTextLine, RichTextOptions, RichTextRun, SlideComposition, TextFit, TextLineInk, TextMeasurement, TextPlacement, TextPlacementLine, TextStyle, TimelineContent, TimelineEvent, TimelineLayout, TimelineLayoutDiagnostic, TimelineLayoutOptions, TimelineTextPart, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTimeline, measureText, measureTextOutline, placeTextLines, resolveCanvasDimensions, resolveFontFamilies, resolveTextStyle, textColorForFill, textWidthMeasurer, wrapText } from './composition.js';
8
9
  export { OPFPaginationError, PaginatedPage, PaginationMapping, PaginationOptions, PaginationResult, PresentationPaginationOptions, PresentationPaginationResult, paginatePresentation, paginateSlide } from './pagination.js';
9
10
  export { DataCell, DataContentOptions, DataImportOptions, OPFDataImportError, TabularData, createDataContent, parseTabularData } from './data.js';
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
- export { specFileEntries, specFileKinds, specFilePaths } from './chunk-OZULJBSG.js';
1
+ export { specFileEntries, specFileKinds, specFilePaths } from './chunk-RS5GZ5RW.js';
2
2
  export { getLayoutPreview, hasLayoutPreview, layoutPreviewIndex, layoutPreviewSlugs, layoutPreviews } from './chunk-PIQXLBBJ.js';
3
+ export { lintPresentation, lintSource } from './chunk-EWJNRHXA.js';
3
4
  export { OPFDataImportError, createDataContent, parseTabularData } from './chunk-SOSOBKQ2.js';
4
- export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-3GPZMY2W.js';
5
- export { OPFValidationError, assertValid, assertValidCatalogRecord, assertValidPresentation, validate, validateCatalogRecord, validatePresentation } from './chunk-ZGV6I23P.js';
6
- export { MAX_COMPOSITION_DEPTH, OPFCompositionError, composeSlide, fitList, fitRichText, fitText, layoutCode, layoutQuote, measureText, resolveCanvasDimensions, resolveFontFamilies, resolveTextStyle, textWidthMeasurer, wrapText } from './chunk-JA5W5TVA.js';
7
- export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-GQSK3T7X.js';
8
- export { audiences, catalogEntries, catalogIndexes, catalogKinds, catalogSchemaNames, catalogs, chartTypes, colorSchemes, fontSchemes, languages, layouts, narratives, purposes, socialPlatforms, themes, tones } from './chunk-TWMRZ43O.js';
5
+ export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-FHGJX5QK.js';
6
+ export { OPFValidationError, assertValid, assertValidCatalogRecord, assertValidPresentation, validate, validateCatalogRecord, validatePresentation } from './chunk-ZIL7MGZU.js';
7
+ export { MAX_COMPOSITION_DEPTH, OPFCompositionError, chartColorForFill, colorContrast, composeSlide, fitList, fitRichText, fitText, layoutCode, layoutFurniture, layoutMetric, layoutQuote, layoutTimeline, measureText, measureTextOutline, placeTextLines, resolveCanvasDimensions, resolveFontFamilies, resolveTextStyle, textColorForFill, textWidthMeasurer, wrapText } from './chunk-PQJRDNA6.js';
8
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-D3GQIREP.js';
9
+ export { audiences, catalogEntries, catalogIndexes, catalogKinds, catalogSchemaNames, catalogs, chartTypes, colorSchemes, fontSchemes, languages, layouts, narratives, purposes, socialPlatforms, themes, tones } from './chunk-TU7I3KSB.js';
package/dist/lint.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ import { c as CatalogKind } from './catalogs-DoVmvDr7.js';
2
+ import { ValidationIssue } from './validator.js';
3
+ import { J as JsonPrimitive } from './schemas-BYe5y8-i.js';
4
+ import './presentation-BMTdX6O1.js';
5
+
6
+ type LintSeverity = 'error' | 'warning' | 'info';
7
+ interface LintLocation {
8
+ offset: number;
9
+ length: number;
10
+ line: number;
11
+ column: number;
12
+ }
13
+ interface LintSuggestion {
14
+ value: JsonPrimitive;
15
+ label: string;
16
+ origin: 'schema' | 'built-in' | 'loaded' | 'document' | 'contract';
17
+ definition: string;
18
+ }
19
+ interface LintDiagnostic {
20
+ ruleId: string;
21
+ severity: LintSeverity;
22
+ /** JSON Pointer into the document, or the explicitly supplied lint context. */
23
+ path: string;
24
+ scope: 'document' | 'context';
25
+ message: string;
26
+ help: string;
27
+ definition?: string;
28
+ lookup?: string[];
29
+ suggestions?: LintSuggestion[];
30
+ /** Full validation issue retained, including errors inside union alternatives. */
31
+ validation?: ValidationIssue;
32
+ /** Original-source UTF-16 offsets and one-based line/column. */
33
+ location?: LintLocation;
34
+ }
35
+ interface LintContract {
36
+ /** JSON Pointer pattern; a complete '*' segment matches one path segment. */
37
+ path: string;
38
+ allowedValues: JsonPrimitive[];
39
+ severity?: LintSeverity;
40
+ message?: string;
41
+ documentation?: string;
42
+ }
43
+ interface LintOptions {
44
+ /** Records already loaded by the host. This API never fetches catalog URLs. */
45
+ catalogs?: Partial<Record<CatalogKind, readonly unknown[]>>;
46
+ /** Explicit host policy. Document metadata is never interpreted as policy. */
47
+ contracts?: readonly LintContract[];
48
+ }
49
+ interface LintReport {
50
+ valid: boolean;
51
+ schemaValid: boolean | null;
52
+ diagnostics: LintDiagnostic[];
53
+ counts: Record<LintSeverity, number>;
54
+ checks: {
55
+ syntax: 'checked' | 'not-applicable';
56
+ schema: 'checked' | 'not-run';
57
+ catalogReferences: 'local-context' | 'not-run';
58
+ assetReferences: 'registry-only' | 'not-run';
59
+ contracts: 'checked' | 'not-run';
60
+ layout: 'not-checked';
61
+ fonts: 'not-checked';
62
+ nativeExport: 'not-checked';
63
+ };
64
+ }
65
+ /** Read-only lint with actionable schema, local catalog and explicit policy context. */
66
+ declare function lintPresentation(document: unknown, options?: LintOptions): LintReport;
67
+ /** Lint strict JSON source without normalizing whitespace or duplicate keys. */
68
+ declare function lintSource(source: string, options?: LintOptions): LintReport;
69
+
70
+ export { type LintContract, type LintDiagnostic, type LintLocation, type LintOptions, type LintReport, type LintSeverity, type LintSuggestion, lintPresentation, lintSource };
package/dist/lint.js ADDED
@@ -0,0 +1,5 @@
1
+ export { lintPresentation, lintSource } from './chunk-EWJNRHXA.js';
2
+ import './chunk-ZIL7MGZU.js';
3
+ import './chunk-PQJRDNA6.js';
4
+ import './chunk-D3GQIREP.js';
5
+ import './chunk-TU7I3KSB.js';
@@ -21,6 +21,8 @@ interface PaginationMapping {
21
21
  interface PaginatedPage {
22
22
  slideIndex: number;
23
23
  mappings: PaginationMapping[];
24
+ /** Repeated headings/furniture and their metadata sources; separate from body slices. */
25
+ repeatedMappings?: PaginationMapping[];
24
26
  }
25
27
  interface PaginationResult {
26
28
  slides: Record<string, any>[];
@@ -35,6 +37,8 @@ declare class OPFPaginationError extends Error {
35
37
  declare function paginateSlide(input: unknown, options?: PaginationOptions): PaginationResult;
36
38
  interface PresentationPaginationOptions {
37
39
  textMeasurement?: TextMeasurement;
40
+ /** Unscaled reference-pixel clearance for supplied vector text outlines. */
41
+ textRasterPadding?: number;
38
42
  minFontSize?: number;
39
43
  maxSlides?: number;
40
44
  /** Optional host-resolved layout/canvas overrides for each source slide. */
@@ -1,5 +1,5 @@
1
- export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-3GPZMY2W.js';
2
- import './chunk-ZGV6I23P.js';
3
- import './chunk-JA5W5TVA.js';
4
- import './chunk-GQSK3T7X.js';
5
- import './chunk-TWMRZ43O.js';
1
+ export { OPFPaginationError, paginatePresentation, paginateSlide } from './chunk-FHGJX5QK.js';
2
+ import './chunk-ZIL7MGZU.js';
3
+ import './chunk-PQJRDNA6.js';
4
+ import './chunk-D3GQIREP.js';
5
+ import './chunk-TU7I3KSB.js';
@@ -213,4 +213,4 @@ interface SchemaEntry {
213
213
  }
214
214
  declare const schemaEntries: readonly SchemaEntry[];
215
215
 
216
- export { type JsonSchema as J, type SchemaEntry as S, type SchemaName as a, audience as b, chartType as c, colorScheme as d, layout as e, fontScheme as f, purpose as g, schemaNames as h, schemas as i, socialPlatform as j, tone as k, language as l, narrative as n, presentation as p, schemaEntries as s, theme as t };
216
+ export { type JsonPrimitive as J, type SchemaEntry as S, type SchemaName as a, audience as b, chartType as c, colorScheme as d, layout as e, fontScheme as f, purpose as g, schemaNames as h, schemas as i, socialPlatform as j, tone as k, language as l, type JsonSchema as m, narrative as n, presentation as p, schemaEntries as s, theme as t };
package/dist/schemas.d.ts CHANGED
@@ -1 +1 @@
1
- export { S as SchemaEntry, a as SchemaName, b as audience, c as chartType, d as colorScheme, f as fontScheme, l as language, e as layout, n as narrative, p as presentation, g as purpose, s as schemaEntries, h as schemaNames, i as schemas, j as socialPlatform, t as theme, k as tone } from './schemas--QRVBhU1.js';
1
+ export { S as SchemaEntry, a as SchemaName, b as audience, c as chartType, d as colorScheme, f as fontScheme, l as language, e as layout, n as narrative, p as presentation, g as purpose, s as schemaEntries, h as schemaNames, i as schemas, j as socialPlatform, t as theme, k as tone } from './schemas-BYe5y8-i.js';
package/dist/schemas.js CHANGED
@@ -1 +1 @@
1
- export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-GQSK3T7X.js';
1
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-D3GQIREP.js';
@@ -214,7 +214,7 @@
214
214
  "type": "title"
215
215
  },
216
216
  {
217
- "type": "text"
217
+ "type": "metric"
218
218
  }
219
219
  ]
220
220
  },
@@ -226,10 +226,10 @@
226
226
  "type": "title"
227
227
  },
228
228
  {
229
- "type": "text"
229
+ "type": "metric"
230
230
  },
231
231
  {
232
- "type": "text"
232
+ "type": "metric"
233
233
  }
234
234
  ],
235
235
  "composition": {
@@ -244,13 +244,13 @@
244
244
  "type": "title"
245
245
  },
246
246
  {
247
- "type": "text"
247
+ "type": "metric"
248
248
  },
249
249
  {
250
- "type": "text"
250
+ "type": "metric"
251
251
  },
252
252
  {
253
- "type": "text"
253
+ "type": "metric"
254
254
  }
255
255
  ],
256
256
  "composition": {
@@ -265,16 +265,16 @@
265
265
  "type": "title"
266
266
  },
267
267
  {
268
- "type": "text"
268
+ "type": "metric"
269
269
  },
270
270
  {
271
- "type": "text"
271
+ "type": "metric"
272
272
  },
273
273
  {
274
- "type": "text"
274
+ "type": "metric"
275
275
  },
276
276
  {
277
- "type": "text"
277
+ "type": "metric"
278
278
  }
279
279
  ],
280
280
  "composition": {
@@ -290,19 +290,19 @@
290
290
  "type": "title"
291
291
  },
292
292
  {
293
- "type": "text"
293
+ "type": "metric"
294
294
  },
295
295
  {
296
- "type": "text"
296
+ "type": "metric"
297
297
  },
298
298
  {
299
- "type": "text"
299
+ "type": "metric"
300
300
  },
301
301
  {
302
- "type": "text"
302
+ "type": "metric"
303
303
  },
304
304
  {
305
- "type": "text"
305
+ "type": "metric"
306
306
  }
307
307
  ],
308
308
  "composition": {
@@ -318,22 +318,22 @@
318
318
  "type": "title"
319
319
  },
320
320
  {
321
- "type": "text"
321
+ "type": "metric"
322
322
  },
323
323
  {
324
- "type": "text"
324
+ "type": "metric"
325
325
  },
326
326
  {
327
- "type": "text"
327
+ "type": "metric"
328
328
  },
329
329
  {
330
- "type": "text"
330
+ "type": "metric"
331
331
  },
332
332
  {
333
- "type": "text"
333
+ "type": "metric"
334
334
  },
335
335
  {
336
- "type": "text"
336
+ "type": "metric"
337
337
  }
338
338
  ],
339
339
  "composition": {
@@ -556,5 +556,29 @@
556
556
  "id": "blank",
557
557
  "name": "Blank",
558
558
  "placeholders": []
559
+ },
560
+ {
561
+ "id": "quote-1x",
562
+ "name": "Quote 1x",
563
+ "placeholders": [
564
+ {
565
+ "type": "title"
566
+ },
567
+ {
568
+ "type": "quote"
569
+ }
570
+ ]
571
+ },
572
+ {
573
+ "id": "timeline-1x",
574
+ "name": "Timeline 1x",
575
+ "placeholders": [
576
+ {
577
+ "type": "title"
578
+ },
579
+ {
580
+ "type": "timeline"
581
+ }
582
+ ]
559
583
  }
560
584
  ]
@@ -113,6 +113,11 @@
113
113
  "name": "Number 6x",
114
114
  "file": "number-6x.json"
115
115
  },
116
+ {
117
+ "id": "quote-1x",
118
+ "name": "Quote 1x",
119
+ "file": "quote-1x.json"
120
+ },
116
121
  {
117
122
  "id": "table-1x",
118
123
  "name": "Table 1x",
@@ -133,6 +138,11 @@
133
138
  "name": "Text 3x",
134
139
  "file": "text-3x.json"
135
140
  },
141
+ {
142
+ "id": "timeline-1x",
143
+ "name": "Timeline 1x",
144
+ "file": "timeline-1x.json"
145
+ },
136
146
  {
137
147
  "id": "title",
138
148
  "name": "Title",
@@ -7,7 +7,7 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  }
12
12
  ]
13
13
  }
@@ -7,10 +7,10 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  },
12
12
  {
13
- "type": "text"
13
+ "type": "metric"
14
14
  }
15
15
  ],
16
16
  "composition": {
@@ -7,13 +7,13 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  },
12
12
  {
13
- "type": "text"
13
+ "type": "metric"
14
14
  },
15
15
  {
16
- "type": "text"
16
+ "type": "metric"
17
17
  }
18
18
  ],
19
19
  "composition": {
@@ -7,16 +7,16 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  },
12
12
  {
13
- "type": "text"
13
+ "type": "metric"
14
14
  },
15
15
  {
16
- "type": "text"
16
+ "type": "metric"
17
17
  },
18
18
  {
19
- "type": "text"
19
+ "type": "metric"
20
20
  }
21
21
  ],
22
22
  "composition": {
@@ -7,19 +7,19 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  },
12
12
  {
13
- "type": "text"
13
+ "type": "metric"
14
14
  },
15
15
  {
16
- "type": "text"
16
+ "type": "metric"
17
17
  },
18
18
  {
19
- "type": "text"
19
+ "type": "metric"
20
20
  },
21
21
  {
22
- "type": "text"
22
+ "type": "metric"
23
23
  }
24
24
  ],
25
25
  "composition": {
@@ -7,22 +7,22 @@
7
7
  "type": "title"
8
8
  },
9
9
  {
10
- "type": "text"
10
+ "type": "metric"
11
11
  },
12
12
  {
13
- "type": "text"
13
+ "type": "metric"
14
14
  },
15
15
  {
16
- "type": "text"
16
+ "type": "metric"
17
17
  },
18
18
  {
19
- "type": "text"
19
+ "type": "metric"
20
20
  },
21
21
  {
22
- "type": "text"
22
+ "type": "metric"
23
23
  },
24
24
  {
25
- "type": "text"
25
+ "type": "metric"
26
26
  }
27
27
  ],
28
28
  "composition": {
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://openpresentation.org/schema/opf-layout/v1",
3
+ "id": "quote-1x",
4
+ "name": "Quote 1x",
5
+ "placeholders": [
6
+ {
7
+ "type": "title"
8
+ },
9
+ {
10
+ "type": "quote"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://openpresentation.org/schema/opf-layout/v1",
3
+ "id": "timeline-1x",
4
+ "name": "Timeline 1x",
5
+ "placeholders": [
6
+ {
7
+ "type": "title"
8
+ },
9
+ {
10
+ "type": "timeline"
11
+ }
12
+ ]
13
+ }
@@ -59,9 +59,15 @@
59
59
  "List",
60
60
  "Image",
61
61
  "Number",
62
- "Chart"
62
+ "Metric",
63
+ "Chart",
64
+ "Table",
65
+ "Code",
66
+ "Video",
67
+ "Quote",
68
+ "Timeline"
63
69
  ],
64
- "description": "Primary kind of content the layout holds. Drives pickers and AI placement decisions."
70
+ "description": "Primary kind of content the layout holds. Drives pickers and AI placement decisions. Metric is the canonical numeric/KPI category; Number remains an accepted legacy label."
65
71
  },
66
72
  "contentMultiple": {
67
73
  "type": "string",
@@ -267,6 +273,9 @@
267
273
  "subtitle",
268
274
  "tag",
269
275
  "text",
276
+ "metric",
277
+ "quote",
278
+ "timeline",
270
279
  "list",
271
280
  "chart",
272
281
  "picture",
@@ -275,7 +284,7 @@
275
284
  "diagram",
276
285
  "code"
277
286
  ],
278
- "description": "OPF placeholder kind. 'text' and 'list' are flexible textual content regions. The named kinds describe a specific content role used by pickers, AI generation, and engine defaulting."
287
+ "description": "OPF placeholder kind. 'text' and 'list' are flexible textual content regions. 'metric' is a numeric/KPI content region filled by a metric payload, including its optional label, description, unit, delta, and trend. The named kinds describe a specific content role used by pickers, AI generation, and engine defaulting. 'picture' and legacy 'diagram' use image payloads; 'media' uses video. Quote and timeline use their corresponding payload fields."
279
288
  }
280
289
  }
281
290
  },
@@ -175,7 +175,7 @@
175
175
  "quote",
176
176
  "timeline"
177
177
  ],
178
- "description": "Default content kind for the beat's slide. Mirrors ContentPayload.type and helps engines choose a sensible layout when only the beat is specified."
178
+ "description": "Default content kind for the beat's slide. Uses ContentPayload.type names to help engines choose a layout. The legacy shape value is retained for compatibility and requests an image representation; it is not a native ContentPayload type."
179
179
  },
180
180
  "layoutHint": {
181
181
  "type": "string",