@openpresentation/opf 0.15.1 → 0.16.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 (73) hide show
  1. package/README.md +4 -0
  2. package/dist/{catalog-refs-BSfGELpt.d.ts → catalog-refs-_anZs-Qz.d.ts} +1 -1
  3. package/dist/{catalog-schemas-CinPh5WA.d.ts → catalog-schemas-BZCjgAxu.d.ts} +1 -1
  4. package/dist/catalog.d.ts +2 -2
  5. package/dist/catalog.js +609 -121
  6. package/dist/{chunk-5FTUIDUH.js → chunk-3XDRQYWZ.js} +1 -1
  7. package/dist/{chunk-O744SXXA.js → chunk-5PDN7BN6.js} +202 -95
  8. package/dist/{chunk-VGAOJEY7.js → chunk-5TO6I3GB.js} +1 -1
  9. package/dist/{chunk-3RKB4RDJ.js → chunk-5UEUAW57.js} +4 -2
  10. package/dist/{chunk-ZPU46TFA.js → chunk-6OR326EA.js} +1 -1
  11. package/dist/{chunk-UBFJ2QHH.js → chunk-BSYQDWT4.js} +12 -2
  12. package/dist/{chunk-3JG4YXWF.js → chunk-FQSIIADJ.js} +12 -5
  13. package/dist/chunk-K4DQQIT4.js +319 -0
  14. package/dist/chunk-KINQFU6X.js +51 -0
  15. package/dist/{chunk-374R35TJ.js → chunk-NAWQR7MN.js} +1 -1
  16. package/dist/{chunk-QDI75P2M.js → chunk-PX5AWL7Y.js} +141 -13
  17. package/dist/{chunk-U4J75TRG.js → chunk-SMLMI6IZ.js} +5 -2
  18. package/dist/{chunk-TWQJLI6E.js → chunk-UM24JFUE.js} +2 -2
  19. package/dist/{chunk-2CJPC4HI.js → chunk-WEDGVC5W.js} +185 -11
  20. package/dist/{composition-D2tghM82.d.ts → composition-D4ADF5c-.d.ts} +88 -9
  21. package/dist/composition.d.ts +2 -2
  22. package/dist/composition.js +1 -1
  23. package/dist/convert.d.ts +3 -3
  24. package/dist/convert.js +7 -7
  25. package/dist/data.d.ts +27 -10
  26. package/dist/data.js +2 -2
  27. package/dist/deck.d.ts +77 -0
  28. package/dist/deck.js +12 -0
  29. package/dist/diff.js +5 -5
  30. package/dist/docs.js +24 -24
  31. package/dist/examples.d.ts +1 -1
  32. package/dist/examples.js +2992 -748
  33. package/dist/format.js +2 -2
  34. package/dist/index.d.ts +9 -8
  35. package/dist/index.js +15 -13
  36. package/dist/markdown.d.ts +6 -7
  37. package/dist/markdown.js +7 -7
  38. package/dist/{pagination-wedbe7eq.d.ts → pagination-DzZPFheM.d.ts} +2 -2
  39. package/dist/pagination.d.ts +3 -3
  40. package/dist/pagination.js +4 -4
  41. package/dist/patch.js +4 -4
  42. package/dist/{presentation-CDKQVkyI.d.ts → presentation-COrFuj2g.d.ts} +16 -8
  43. package/dist/repo-readme.js +1 -1
  44. package/dist/schemas.d.ts +14 -0
  45. package/dist/schemas.js +1 -1
  46. package/dist/spec/catalogs/layouts/business-model-canvas.json +66 -1
  47. package/dist/spec/catalogs/layouts/capability-map.json +53 -3
  48. package/dist/spec/catalogs/layouts/chart-2x.json +32 -8
  49. package/dist/spec/catalogs/layouts/chart-3x-bottom-vertical-title-left.json +16 -10
  50. package/dist/spec/catalogs/layouts/chart-3x-left-title-center.json +16 -10
  51. package/dist/spec/catalogs/layouts/chart-3x-left.json +16 -10
  52. package/dist/spec/catalogs/layouts/chart-3x-right-title-center.json +16 -10
  53. package/dist/spec/catalogs/layouts/chart-3x-right.json +16 -10
  54. package/dist/spec/catalogs/layouts/chart-3x-top-vertical-title-left.json +16 -10
  55. package/dist/spec/catalogs/layouts/chart-3x.json +48 -12
  56. package/dist/spec/catalogs/layouts/dashboard.json +37 -5
  57. package/dist/spec/catalogs/layouts/image-2x.json +32 -8
  58. package/dist/spec/catalogs/layouts/image-3x.json +48 -12
  59. package/dist/spec/catalogs/layouts/index.json +1 -1
  60. package/dist/spec/catalogs/layouts/kpi-scorecard.json +48 -3
  61. package/dist/spec/catalogs/layouts/logic-tree.json +69 -0
  62. package/dist/spec/catalogs/layouts/market-size.json +26 -2
  63. package/dist/spec/catalogs/layouts/org-chart.json +53 -6
  64. package/dist/spec/catalogs/manifest.json +3 -3
  65. package/dist/spec/schemas/layout.schema.json +172 -5
  66. package/dist/spec/schemas/opf.schema.json +11 -6
  67. package/dist/types.d.ts +9 -31
  68. package/dist/{validation-types-BOcY9GTs.d.ts → validation-types-HxIgJfKx.d.ts} +2 -2
  69. package/dist/validator.d.ts +6 -6
  70. package/dist/validator.js +3 -3
  71. package/dist/yaml.d.ts +4 -4
  72. package/dist/yaml.js +8 -321
  73. package/package.json +5 -1
package/dist/format.js CHANGED
@@ -1,2 +1,2 @@
1
- export { OPFFormatError, format, isFormatted, sortPresentationKeys } from './chunk-ZPU46TFA.js';
2
- import './chunk-2CJPC4HI.js';
1
+ export { OPFFormatError, format, isFormatted, sortPresentationKeys } from './chunk-6OR326EA.js';
2
+ import './chunk-WEDGVC5W.js';
package/dist/index.d.ts CHANGED
@@ -1,20 +1,21 @@
1
1
  export { SchemaEntry, SchemaName, audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './schemas.js';
2
2
  export { DEFAULT_CHART_PALETTE, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validate, validateCatalogRecord, validationRules } from './validator.js';
3
- export { B as BuiltinVariableInfo, C as Contract, D as DEFAULT_VARIABLE_DATE_FORMAT, O as OPFVariableError, R as ResolveVariablesOptions, b as ResolveVariablesResult, c as VARIABLE_KINDS, d as ValidateFonts, V as ValidateOptions, e as ValidationCategory, f as ValidationChecks, a as ValidationReport, g as ValidationRuleCost, h as ValidationRuleInfo, i as ValidationThresholds, j as VariableDeclaration, k as VariableDiagnostic, l as VariableDiagnosticCode, m as VariableDiagnosticSeverity, n as VariableInfo, o as VariableKind, p as VariableUse, q as VariableUseForm, r as VariableValues, s as coerceVariableValue, t as formatVariableNumber, u as hasContentVariables, v as isTemplate, w as listBuiltinVariables, x as listVariables, y as resolveVariables, z as validationCategories, A as variableDeclarations } from './validation-types-BOcY9GTs.js';
3
+ export { B as BuiltinVariableInfo, C as Contract, D as DEFAULT_VARIABLE_DATE_FORMAT, O as OPFVariableError, R as ResolveVariablesOptions, b as ResolveVariablesResult, c as VARIABLE_KINDS, d as ValidateFonts, V as ValidateOptions, e as ValidationCategory, f as ValidationChecks, a as ValidationReport, g as ValidationRuleCost, h as ValidationRuleInfo, i as ValidationThresholds, j as VariableDeclaration, k as VariableDiagnostic, l as VariableDiagnosticCode, m as VariableDiagnosticSeverity, n as VariableInfo, o as VariableKind, p as VariableUse, q as VariableUseForm, r as VariableValues, s as coerceVariableValue, t as formatVariableNumber, u as hasContentVariables, v as isTemplate, w as listBuiltinVariables, x as listVariables, y as resolveVariables, z as validationCategories, A as variableDeclarations } from './validation-types-HxIgJfKx.js';
4
4
  export { SpecFileEntry, SpecFileKind, SpecFilePath, specFileEntries, specFileKinds, specFilePaths } from './spec-files.js';
5
- import { P as Presentation } from './presentation-CDKQVkyI.js';
5
+ import { P as Presentation } from './presentation-COrFuj2g.js';
6
6
  export { Audience, ChartType, ColorScheme, FontScheme, Language, Layout, Narrative, Purpose, SocialPlatform, Theme, Tone } from './types.js';
7
- import { C as CatalogKind, U as UnresolvedReferenceDiagnostic, b as CatalogOptions, a as Catalog, R as RecordProvenance } from './catalog-refs-BSfGELpt.js';
8
- export { c as CATALOG_GROUP_PATTERN, d as CATALOG_REFERENCE_PATTERN, e as CatalogRecordMap, f as CatalogRecords, g as CatalogReferenceSite, O as OPFCatalogsOptionError, h as OPFUnresolvedReferenceError, i as ResolvedReference, j as catalogGroupSource, k as catalogKinds, l as catalogRecords, m as catalogReferenceSites, p as parseReference, r as resolveReference, u as unresolvedReference } from './catalog-refs-BSfGELpt.js';
7
+ import { a as CatalogKind, U as UnresolvedReferenceDiagnostic, b as CatalogOptions, C as Catalog, R as RecordProvenance } from './catalog-refs-_anZs-Qz.js';
8
+ export { c as CATALOG_GROUP_PATTERN, d as CATALOG_REFERENCE_PATTERN, e as CatalogRecordMap, f as CatalogRecords, g as CatalogReferenceSite, O as OPFCatalogsOptionError, h as OPFUnresolvedReferenceError, i as ResolvedReference, j as catalogGroupSource, k as catalogKinds, l as catalogRecords, m as catalogReferenceSites, p as parseReference, r as resolveReference, u as unresolvedReference } from './catalog-refs-_anZs-Qz.js';
9
9
  export { a as Finding, d as FindingCategory, e as FindingFix, f as FindingFocus, b as FindingLocation, F as FindingReport, c as FindingSeverity, g as FindingSuggestion, J as JsonPatchOperation, V as ValidationIssue } from './finding-CT_f_vbD.js';
10
- export { a as CHART_TYPES, C as ComposeSlideOptions, E as ENGINE_DEFAULT_CHART_TYPES, b as ENGINE_DEFAULT_COLOR_SCHEME, c as ENGINE_DEFAULT_FONT_SCHEME, d as ENGINE_DEFAULT_THEME, e as FontFamilies, F as Fonts, f as LANGUAGES, g as LanguageFamilyName, h as LanguageVocabulary, L as LayoutDiagnostic, M as MeasureTextWidth, S as SOCIAL_PLATFORMS, i as SocialPlatformVocabulary, T as TextMeasurement, j as TextStyle, n as normalizeLanguageFamily } from './composition-D2tghM82.js';
11
- export { C as CatalogDisplayKind, a as CatalogRecordKind, c as catalogDisplayKinds, b as catalogSchemaNames } from './catalog-schemas-CinPh5WA.js';
12
- export { O as OPFPaginationError, P as PaginatedPage, a as PaginationMapping, b as PaginationOptions, c as PaginationResult, d as PresentationPaginationOptions, e as PresentationPaginationResult, S as SlideContext, f as SlideContextDiagnostic, g as SlideContextOptions, p as paginate, h as paginateSlide, r as resolveSlideContext } from './pagination-wedbe7eq.js';
10
+ export { a as CHART_TYPES, C as ComposeSlideOptions, E as ENGINE_DEFAULT_CHART_TYPES, b as ENGINE_DEFAULT_COLOR_SCHEME, c as ENGINE_DEFAULT_FONT_SCHEME, d as ENGINE_DEFAULT_THEME, e as FontFamilies, F as Fonts, f as LANGUAGES, g as LanguageFamilyName, h as LanguageVocabulary, L as LayoutDiagnostic, M as MeasureTextWidth, S as SOCIAL_PLATFORMS, i as SocialPlatformVocabulary, T as TextMeasurement, j as TextStyle, n as normalizeLanguageFamily } from './composition-D4ADF5c-.js';
11
+ export { C as CatalogDisplayKind, a as CatalogRecordKind, c as catalogDisplayKinds, b as catalogSchemaNames } from './catalog-schemas-BZCjgAxu.js';
12
+ export { O as OPFPaginationError, P as PaginatedPage, a as PaginationMapping, b as PaginationOptions, c as PaginationResult, d as PresentationPaginationOptions, e as PresentationPaginationResult, S as SlideContext, f as SlideContextDiagnostic, g as SlideContextOptions, p as paginate, h as paginateSlide, r as resolveSlideContext } from './pagination-DzZPFheM.js';
13
13
  export { ApplyPatchOptions, OPFPatchError, OPFPatchValidationError, PatchResult, applyPatch } from './patch.js';
14
14
  export { DiffOptions, MergeConflict, MergeOptions, MergeResult, PresentationDiff, diff, merge } from './diff.js';
15
15
  export { FormatOptions, OPFFormatError, format } from './format.js';
16
16
  export { FromMarkdownOptions, FromMarkdownResult, OPFMarkdownError, ToMarkdownOptions, ToMarkdownResult, fromMarkdown, toMarkdown } from './markdown.js';
17
- export { DataCell, DataImportOptions, ImportDataOptions, OPFDataImportError, TabularData, importData, parseTabularData } from './data.js';
17
+ export { DECK_FORMATS, DeckFormat, ReadDeckOptions, ReadDeckResult, WriteDeckOptions, deckFormatOf, readDeck, writeDeck } from './deck.js';
18
+ export { DataCell, DataImportOptions, ImportDataOptions, ImportedChart, ImportedChartData, ImportedChartType, ImportedTable, OPFDataImportError, TabularData, importData, parseTabularData } from './data.js';
18
19
  export { I as ChartComboSeries, C as ChartMapping, a as ChartNumberFix, b as ChartNumberFixOperation, c as ChartNumberFixOptions, D as DataCellValue, d as DataColumn, e as DataDiagnostic, f as DataDiagnosticCode, g as DataResolveOptions, h as DataSourceRef, i as DataStyledCell, j as DataTableCell, k as DataTableHeader, l as DataTableValue, m as DataTextRun, n as Dataset, o as DatasetRef, R as ResolvedChartData, p as ResolvedTableData, q as chartNumber, r as datasetDiagnostics, s as formatDataNumber, t as fromExcelNumberFormat, u as inlineChartData, v as inlineDatasets, w as inlineTableData, x as isDatasetRef, y as isXYChartType, z as numberFormatError, A as resolveChartData, B as resolveTableData, E as suggestChartNumberFix, F as tableCellDisplayValue, G as toExcelNumberFormat, H as unusedDatasets } from './chart-data-BnNqgnC-.js';
19
20
  export { FONT_POLICY, FontAvailability, FontAvailabilityCode, FontAvailabilityDiagnostic, FontLicenseClass, FontPolicyDecision, FontPolicyEntry, FontPolicyTable, FontReplacement, FontReplacementCompatibility, FontReplacementMeasurement, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './font-policy.js';
20
21
  import './json-BFSdESOE.js';
package/dist/index.js CHANGED
@@ -1,20 +1,22 @@
1
1
  export { specFileEntries, specFileKinds, specFilePaths } from './chunk-HXHOZ7AH.js';
2
- export { OPFDataImportError, importData, parseTabularData } from './chunk-U4J75TRG.js';
3
- export { fromMarkdown, toMarkdown } from './chunk-3JG4YXWF.js';
4
- export { OPFMarkdownError } from './chunk-3RKB4RDJ.js';
5
- export { diff, merge } from './chunk-TWQJLI6E.js';
6
- export { OPFPatchError, OPFPatchValidationError, applyPatch } from './chunk-5FTUIDUH.js';
7
- export { OPFFormatError, format } from './chunk-ZPU46TFA.js';
8
- export { OPFPaginationError, paginate, paginateSlide } from './chunk-UBFJ2QHH.js';
9
- import './chunk-374R35TJ.js';
10
- import './chunk-VGAOJEY7.js';
11
- export { DEFAULT_CHART_PALETTE, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-QDI75P2M.js';
12
- import { isRecord, visitContentPayloads, listVariables, resolveDesignRecords, resolveFontFamilies, resolveCanvasDimensions, imageBackground } from './chunk-O744SXXA.js';
13
- export { CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, OPFVariableError, SOCIAL_PLATFORMS, VARIABLE_KINDS, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unusedDatasets, variableDeclarations } from './chunk-O744SXXA.js';
2
+ export { OPFDataImportError, importData, parseTabularData } from './chunk-SMLMI6IZ.js';
3
+ export { DECK_FORMATS, deckFormatOf, readDeck, writeDeck } from './chunk-KINQFU6X.js';
4
+ export { fromMarkdown, toMarkdown } from './chunk-FQSIIADJ.js';
5
+ import './chunk-K4DQQIT4.js';
6
+ export { OPFMarkdownError } from './chunk-5UEUAW57.js';
7
+ export { diff, merge } from './chunk-UM24JFUE.js';
8
+ export { OPFPatchError, OPFPatchValidationError, applyPatch } from './chunk-3XDRQYWZ.js';
9
+ export { OPFFormatError, format } from './chunk-6OR326EA.js';
10
+ export { OPFPaginationError, paginate, paginateSlide } from './chunk-BSYQDWT4.js';
11
+ import './chunk-NAWQR7MN.js';
12
+ import './chunk-5TO6I3GB.js';
13
+ export { DEFAULT_CHART_PALETTE, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-PX5AWL7Y.js';
14
+ import { isRecord, visitContentPayloads, listVariables, resolveDesignRecords, resolveFontFamilies, resolveCanvasDimensions, imageBackground } from './chunk-5PDN7BN6.js';
15
+ export { CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, OPFVariableError, SOCIAL_PLATFORMS, VARIABLE_KINDS, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unusedDatasets, variableDeclarations } from './chunk-5PDN7BN6.js';
14
16
  export { catalogDisplayKinds, catalogSchemaNames } from './chunk-TRDXRRQK.js';
15
17
  import { embeddedCopy, checkCatalogsOption, catalogReferenceSites, parseReference, catalogGroupDeclared, resolveReference, dottedPath, unresolvedReference, recordReferenceSites, catalogGroupSource, registeredCatalog, catalogKinds, CATALOG_GROUP_PATTERN } from './chunk-SPFV27O5.js';
16
18
  export { CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, OPFCatalogsOptionError, OPFUnresolvedReferenceError, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, parseReference, resolveReference, unresolvedReference } from './chunk-SPFV27O5.js';
17
- export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-2CJPC4HI.js';
19
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-WEDGVC5W.js';
18
20
  export { FONT_POLICY, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './chunk-WXSPETQ6.js';
19
21
 
20
22
  // src/catalog-helpers.ts
@@ -1,8 +1,8 @@
1
- import { a as Catalog } from './catalog-refs-BSfGELpt.js';
2
- import { P as Presentation } from './presentation-CDKQVkyI.js';
3
- import { a as Finding, b as FindingLocation, F as FindingReport } from './finding-CT_f_vbD.js';
4
- import { V as ValidateOptions } from './validation-types-BOcY9GTs.js';
5
- import './composition-D2tghM82.js';
1
+ import { C as Catalog } from './catalog-refs-_anZs-Qz.js';
2
+ import { P as Presentation } from './presentation-COrFuj2g.js';
3
+ import { a as Finding, b as FindingLocation } from './finding-CT_f_vbD.js';
4
+ import { V as ValidateOptions, a as ValidationReport } from './validation-types-HxIgJfKx.js';
5
+ import './composition-D4ADF5c-.js';
6
6
  import './chart-data-BnNqgnC-.js';
7
7
  import './json-BFSdESOE.js';
8
8
 
@@ -45,7 +45,7 @@ interface FromMarkdownOptions extends ParseOptions {
45
45
  /** Catalogs the host registered, for the references check of `validate: true` (the default). Nothing is fetched. */
46
46
  catalogs?: readonly Catalog[];
47
47
  }
48
- interface FromMarkdownResult {
48
+ interface FromMarkdownResult extends ValidationReport {
49
49
  /** The converted deck. Always an object; when `valid` is false it is a best effort that does not validate. */
50
50
  presentation: Presentation;
51
51
  /** True when there are no errors (Markdown syntax errors and OPF validation errors both count). */
@@ -54,7 +54,6 @@ interface FromMarkdownResult {
54
54
  findings: (Finding & {
55
55
  location: FindingLocation;
56
56
  })[];
57
- counts: FindingReport["counts"];
58
57
  }
59
58
  /** Convert Markdown in the OPF dialect to an OPF document. Never throws for malformed content; read `valid` and `findings`. */
60
59
  declare function fromMarkdown(markdown: string, options?: FromMarkdownOptions): FromMarkdownResult;
package/dist/markdown.js CHANGED
@@ -1,9 +1,9 @@
1
- export { fromMarkdown, toMarkdown } from './chunk-3JG4YXWF.js';
2
- export { OPFMarkdownError } from './chunk-3RKB4RDJ.js';
3
- import './chunk-374R35TJ.js';
4
- import './chunk-VGAOJEY7.js';
5
- import './chunk-QDI75P2M.js';
6
- import './chunk-O744SXXA.js';
1
+ export { fromMarkdown, toMarkdown } from './chunk-FQSIIADJ.js';
2
+ export { OPFMarkdownError } from './chunk-5UEUAW57.js';
3
+ import './chunk-NAWQR7MN.js';
4
+ import './chunk-5TO6I3GB.js';
5
+ import './chunk-PX5AWL7Y.js';
6
+ import './chunk-5PDN7BN6.js';
7
7
  import './chunk-TRDXRRQK.js';
8
8
  import './chunk-SPFV27O5.js';
9
- import './chunk-2CJPC4HI.js';
9
+ import './chunk-WEDGVC5W.js';
@@ -1,5 +1,5 @@
1
- import { C as ComposeSlideOptions, F as Fonts, L as LayoutDiagnostic } from './composition-D2tghM82.js';
2
- import { U as UnresolvedReferenceDiagnostic, R as RecordProvenance, b as CatalogOptions } from './catalog-refs-BSfGELpt.js';
1
+ import { C as ComposeSlideOptions, F as Fonts, L as LayoutDiagnostic } from './composition-D4ADF5c-.js';
2
+ import { U as UnresolvedReferenceDiagnostic, R as RecordProvenance, b as CatalogOptions } from './catalog-refs-_anZs-Qz.js';
3
3
 
4
4
  /**
5
5
  * One slide's composition context: the layout, canvas, theme and font families that `composeSlide` needs,
@@ -1,4 +1,4 @@
1
- import './composition-D2tghM82.js';
2
- import './catalog-refs-BSfGELpt.js';
3
- export { O as OPFPaginationError, P as PaginatedPage, a as PaginationMapping, b as PaginationOptions, c as PaginationResult, d as PresentationPaginationOptions, e as PresentationPaginationResult, p as paginate, h as paginateSlide } from './pagination-wedbe7eq.js';
1
+ import './composition-D4ADF5c-.js';
2
+ import './catalog-refs-_anZs-Qz.js';
3
+ export { O as OPFPaginationError, P as PaginatedPage, a as PaginationMapping, b as PaginationOptions, c as PaginationResult, d as PresentationPaginationOptions, e as PresentationPaginationResult, p as paginate, h as paginateSlide } from './pagination-DzZPFheM.js';
4
4
  import './chart-data-BnNqgnC-.js';
@@ -1,6 +1,6 @@
1
- export { OPFPaginationError, paginate, paginateSlide } from './chunk-UBFJ2QHH.js';
2
- import './chunk-QDI75P2M.js';
3
- import './chunk-O744SXXA.js';
1
+ export { OPFPaginationError, paginate, paginateSlide } from './chunk-BSYQDWT4.js';
2
+ import './chunk-PX5AWL7Y.js';
3
+ import './chunk-5PDN7BN6.js';
4
4
  import './chunk-TRDXRRQK.js';
5
5
  import './chunk-SPFV27O5.js';
6
- import './chunk-2CJPC4HI.js';
6
+ import './chunk-WEDGVC5W.js';
package/dist/patch.js CHANGED
@@ -1,6 +1,6 @@
1
- export { OPFPatchError, OPFPatchValidationError, applyPatch, applyPatchWithInverse, escapePointerToken, formatPointer, getAtPointer, hasPointer, invertPatch, jsonEqual, normalizePatch, parsePointer, pointerFromPath, readPointer, splitPointer, unescapePointerToken } from './chunk-5FTUIDUH.js';
2
- import './chunk-QDI75P2M.js';
3
- import './chunk-O744SXXA.js';
1
+ export { OPFPatchError, OPFPatchValidationError, applyPatch, applyPatchWithInverse, escapePointerToken, formatPointer, getAtPointer, hasPointer, invertPatch, jsonEqual, normalizePatch, parsePointer, pointerFromPath, readPointer, splitPointer, unescapePointerToken } from './chunk-3XDRQYWZ.js';
2
+ import './chunk-PX5AWL7Y.js';
3
+ import './chunk-5PDN7BN6.js';
4
4
  import './chunk-TRDXRRQK.js';
5
5
  import './chunk-SPFV27O5.js';
6
- import './chunk-2CJPC4HI.js';
6
+ import './chunk-WEDGVC5W.js';
@@ -443,11 +443,11 @@ type ContentPayload = {
443
443
  */
444
444
  text?: (string | TextRun[]);
445
445
  /**
446
- * Generic list payload. Each item is either a plain string, a TextRun[] rich text sequence, or a ListItem object. List nesting uses item.level rather than nested content payloads.
446
+ * Structured list payload (type 'list'). Each item is either a plain string, a TextRun[] rich text sequence, or a ListItem object with optional `description`. List nesting uses item.level rather than nested content payloads. Use `items` when entries share a shape or any entry needs a `description`; use `bullets` for plain talking points. Both draw the same marker, nesting and numbering. A block or region holds `items` or `bullets`, never both, and `items` cannot sit beside `text`.
447
447
  */
448
448
  items?: ListItem[];
449
449
  /**
450
- * Text-style bullet payload. Presence of this field infers type 'text'.
450
+ * Prose bullet payload: short talking points, each standing alone. Presence of this field infers type 'text', so it may sit beside `text` in one payload. Entries have no `description`; use `items` for entries with supporting detail.
451
451
  */
452
452
  bullets?: BulletItem[];
453
453
  /**
@@ -983,7 +983,7 @@ interface Design {
983
983
  */
984
984
  contentDirection?: ("horizontal" | "vertical");
985
985
  /**
986
- * Where the primary chart sits relative to supporting content. Effective value: slide design, then deck design, then the layout record's design.chartPrimary. When the slide has no promoted regions and no composition.mode of its own, and its root nodes mix at least one chart with other content, the first chart becomes a primary track and the other nodes form one synthetic sub-grid: 'left'/'right' is a two-track row and 'top'/'bottom' a two-track column, weighted 3:2 in favor of the chart; explicit root columns and weights are ignored while it applies. 'none' (the default) keeps the ordinary automatic grid with equal weight.
986
+ * Where the primary chart sits relative to supporting content. Effective value: slide design, then deck design, then the layout record's design.chartPrimary. When the slide has no promoted regions and no composition.mode of its own, and its root nodes mix at least one chart with other content, the first chart becomes a primary track and the other nodes form one synthetic sub-grid: 'left'/'right' is a two-track row and 'top'/'bottom' a two-track column, weighted 3:2 in favor of the chart; explicit root columns and weights are ignored while it applies. 'none' (the default) keeps the ordinary automatic grid with equal weight. It is shorthand for a placeholder group (layout.schema.json PlaceholderGroup): the slide composes exactly as on a layout record whose root composition is that weighted row or column and whose placeholders are the chart and one automatic group of the other content, and while it applies it replaces the layout record's own placeholder groups as well.
987
987
  */
988
988
  chartPrimary?: ("none" | "top" | "bottom" | "left" | "right");
989
989
  /**
@@ -2259,11 +2259,11 @@ interface Slide {
2259
2259
  */
2260
2260
  text?: (string | TextRun[]);
2261
2261
  /**
2262
- * Full-slide generic list payload. Presence of this field infers type 'list'. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for layout-agnostic blocks.
2262
+ * Full-slide structured list payload. Presence of this field infers type 'list'. Entries are strings, TextRun[] or objects with `text`, optional `description` (supporting detail under the entry), `level` and `start`. Use `items` when entries share a shape (features, steps, options, risks) or any entry needs a `description`; use `bullets` for plain talking points. Both draw the same marker, nesting and numbering; they differ in the inferred kind and in `description`, which only `items` accepts. At slide root, multiple content payload kinds with no explicit type, blocks, or regions are accepted as shorthand for layout-agnostic blocks, so `items` next to `text` or `bullets` composes as separate blocks side by side.
2263
2263
  */
2264
2264
  items?: ListItem[];
2265
2265
  /**
2266
- * Full-slide text-style bullet payload. Presence of this field infers type 'text'.
2266
+ * Full-slide prose bullet payload: short talking points, each standing alone. Presence of this field infers type 'text', so it may sit beside `text` in one payload. Entries are strings, TextRun[] or objects with `text`, `level` and `start`; there is no `description` (use `items` for entries with supporting detail).
2267
2267
  */
2268
2268
  bullets?: BulletItem[];
2269
2269
  /**
@@ -2679,6 +2679,10 @@ interface Table {
2679
2679
  */
2680
2680
  dataset?: string;
2681
2681
  fields?: DatasetFields1;
2682
+ /**
2683
+ * Text alternative for the table: what it shows (the point and the key numbers), not 'a table'. The preview exposes it as the table's accessible name (role group with aria-label; the cells stay readable) and the PowerPoint export writes it as the table frame's alternative text (descr); import reads it back. An empty string hides a purely decorative table, with the same meaning as an empty Asset alt. The alt is a summary read before the cells, which stay readable, so it is most useful for a large or dense table; validate does not require one and does not report a missing one.
2684
+ */
2685
+ alt?: string;
2682
2686
  }
2683
2687
  /**
2684
2688
  * A cell with explicit visual style or merged geometry. Its position remains its array column index; use null placeholders for every covered grid position.
@@ -3027,6 +3031,10 @@ interface Table1 {
3027
3031
  */
3028
3032
  dataset?: string;
3029
3033
  fields?: DatasetFields1;
3034
+ /**
3035
+ * Text alternative for the table: what it shows (the point and the key numbers), not 'a table'. The preview exposes it as the table's accessible name (role group with aria-label; the cells stay readable) and the PowerPoint export writes it as the table frame's alternative text (descr); import reads it back. An empty string hides a purely decorative table, with the same meaning as an empty Asset alt. The alt is a summary read before the cells, which stay readable, so it is most useful for a large or dense table; validate does not require one and does not report a missing one.
3036
+ */
3037
+ alt?: string;
3030
3038
  }
3031
3039
  /**
3032
3040
  * Arrangement within this group. Only minFontSize and overflow inherit from the parent; strict overflow cannot be weakened.
@@ -3132,7 +3140,7 @@ interface Design1 {
3132
3140
  */
3133
3141
  contentDirection?: ("horizontal" | "vertical");
3134
3142
  /**
3135
- * Where the primary chart sits relative to supporting content. Effective value: slide design, then deck design, then the layout record's design.chartPrimary. When the slide has no promoted regions and no composition.mode of its own, and its root nodes mix at least one chart with other content, the first chart becomes a primary track and the other nodes form one synthetic sub-grid: 'left'/'right' is a two-track row and 'top'/'bottom' a two-track column, weighted 3:2 in favor of the chart; explicit root columns and weights are ignored while it applies. 'none' (the default) keeps the ordinary automatic grid with equal weight.
3143
+ * Where the primary chart sits relative to supporting content. Effective value: slide design, then deck design, then the layout record's design.chartPrimary. When the slide has no promoted regions and no composition.mode of its own, and its root nodes mix at least one chart with other content, the first chart becomes a primary track and the other nodes form one synthetic sub-grid: 'left'/'right' is a two-track row and 'top'/'bottom' a two-track column, weighted 3:2 in favor of the chart; explicit root columns and weights are ignored while it applies. 'none' (the default) keeps the ordinary automatic grid with equal weight. It is shorthand for a placeholder group (layout.schema.json PlaceholderGroup): the slide composes exactly as on a layout record whose root composition is that weighted row or column and whose placeholders are the chart and one automatic group of the other content, and while it applies it replaces the layout record's own placeholder groups as well.
3136
3144
  */
3137
3145
  chartPrimary?: ("none" | "top" | "bottom" | "left" | "right");
3138
3146
  /**
@@ -3146,7 +3154,7 @@ interface Design1 {
3146
3154
  [k: string]: unknown;
3147
3155
  }
3148
3156
  /**
3149
- * Portable dynamic composition. Slide fields override the resolved layout. Nested groups arrange their children independently, inheriting only minFontSize and overflow. Explicit promoted regions retain their positions.
3157
+ * Portable dynamic composition. Slide fields override the resolved layout. Nested groups (content groups here, placeholder groups in a layout record) arrange their children independently, inheriting only minFontSize and overflow. Explicit promoted regions retain their positions.
3150
3158
  *
3151
3159
  * This interface was referenced by `Presentation`'s JSON-Schema
3152
3160
  * via the `definition` "Composition".
@@ -3399,4 +3407,4 @@ interface CatalogRecords7 {
3399
3407
  };
3400
3408
  }
3401
3409
 
3402
- export type { Presentation as P };
3410
+ export type { Chart as C, Presentation as P };
@@ -1,5 +1,5 @@
1
1
  // src/generated/repo-readme.ts
2
- var repoReadmeRaw = '# Open Presentation Format (OPF)\n\n[![npm version](https://img.shields.io/npm/v/@openpresentation/opf?label=npm)](https://www.npmjs.com/package/@openpresentation/opf)\n[![npm downloads](https://img.shields.io/npm/dw/@openpresentation/opf)](https://www.npmjs.com/package/@openpresentation/opf)\n[![license](https://img.shields.io/npm/l/@openpresentation/opf)](./LICENSE)\n\nPublic npm package: [`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf) (`npm install @openpresentation/opf`).\n\nOpen Presentation Format is the portable, human-readable JSON document format for slide decks.\n\nThis repository is the canonical home for the OPF **spec**, **JSON Schemas**, **catalog presets**, examples, generated developer types, local validation tooling, and integration docs for the render/edit/convert toolkit. OpenPresentation publishes open-source code and documentation only; it does not provide hosted APIs, hosted rendering functions, queues, storage, authentication, jobs, previews, SLAs, telemetry, or managed infrastructure.\n\nFor AI agents, use the [OPF skill set](docs/agent-skills.md) for authoring, layout, presets, editing, export, and schema inspection.\n\nPublished CLI 0.11.0 installs all six skills into your project with `npx @openpresentation/cli@0.11.0 skills install`. It uses local copies, preserves existing instructions and refuses to overwrite customized skills. See the [installation and update guide](docs/agent-skills.md) for personal or agent-specific targets and source development.\n\nFor a fresh Node 24 project that installs **published** packages (not this\ncheckout), follow the [developer quickstart](docs/quickstart.md) and the\n[compatibility matrix](docs/compatibility-matrix.md).\n\nFor LLM authoring, start with [the authoring guide](docs/llm-authoring.md), [dynamic composition](docs/dynamic-composition.md), and [local ecosystem verification](docs/ecosystem-development.md).\n\n## File naming\n\nOpen Presentation Format documents are JSON files. Use `*.opf.json` for complete OPF presentation documents, for example `board-review.opf.json` or `deck.opf.json`.\n\nAvoid using bare `*.opf` for OPF JSON. The `.opf` extension is already used by other document and project formats, while `.opf.json` keeps the OPF identity and still makes the underlying JSON format clear to editors, validators, agents, and version-control tooling.\n\n## Naming and reuse\n\nThe format name is **Open Presentation Format**. The schemas, catalogs, packages, and local tooling in this repository are free and open source under the MIT license, so third-party tools may read, write, validate, render, convert, and describe support for Open Presentation Format without adopting any product-specific branding.\n\n## Why OPF\n\n`.pptx` is a zipped bundle of XML. Humans can\'t diff it, LLMs can\'t read or write it reliably, and git can\'t track it meaningfully. Every change looks like a binary blob.\n\nOPF is plain JSON. A human can open it in an editor. A model can read and write it without guessing at schema-by-example. Decks live in git like the rest of your work.\n\nThat\'s the shift that lets LLMs actually *author* decks. When the format stops fighting them, models can do the work that matters \u2014 narrative structure, persuasive framing, data analysis, chart recommendations, ruthless revision passes \u2014 instead of wrestling with `<p:sp>` tags.\n\nAnd they don\'t start from a blank canvas. [pptx.gallery](https://pptx.gallery) is the human-browsable reference for OPF catalog presets: layouts, themes, color schemes, font schemes, chart types, narratives, audiences, purposes, tones, languages, and social platforms.\n\n## Start in three steps\n\n1. **Install the coordinated published packages** on Node 24. See [the developer quickstart](docs/quickstart.md) for the current pin set: core 0.14.0, renderer 0.14.0, editor 0.14.2, PPTX 0.14.0 and CLI 0.11.0.\n2. **Author, validate, paginate, preview and export.** Copy [`docs/quickstart/developer-quickstart.opf.json`](./docs/quickstart/developer-quickstart.opf.json) and run the commands in that guide. `validate` / `opf validate` is one local checker for format, references, accessibility, layout and content ([guide](docs/validate.md)), not visual verification.\n3. **Know the limits.** The [compatibility matrix](docs/compatibility-matrix.md) lists shipped APIs versus renderer issue 24, native PowerPoint issue 87, and other deferred work. Browse presets at [pptx.gallery](https://pptx.gallery).\n\nYour deck can live in git from the first commit. After installing dependencies and supplying referenced assets, these commands run locally without a model provider, account or hosted OPF API.\n\n## JavaScript and TypeScript\n\nThe canonical JavaScript/TypeScript package is published at [`packages/javascript`](./packages/javascript) as [`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf). The schema is pre-stable (0.x \u2014 expect breaking changes between minor versions until 1.0). Its responsibility is local and format-level only:\n\n- export the canonical schemas from [`spec/`](./spec)\n- export the pinned default catalog (the pptx.gallery snapshot in [`spec/catalogs/`](./spec/catalogs)) as the opt-in `@openpresentation/opf/catalog`, for hosts to register\n- export a typed raw spec file manifest for package-addressable `spec/` content\n- generate TypeScript types, with `Presentation` as the top-level type\n- validate OPF JSON and catalog records locally\n\nIt does not render `.pptx`, parse `.pptx`, generate content with AI, fetch remote catalogs, call hosted APIs, or provide managed services. Render/edit/convert packages live in separate MIT repos that depend on `@openpresentation/opf`. The format package also exposes pure composition geometry so those packages share layout behavior.\n\n## Toolkit libraries\n\nThe local toolkit lives in sibling repositories. See [ecosystem development](docs/ecosystem-development.md) for coordinated builds and verification, and [dynamic composition](docs/dynamic-composition.md) for portable layout rules.\n\n| Repo | Role | Boundary |\n|---|---|---|\n| `opf-render` | OPF to SVG/PNG/PDF | Local and embeddable rendering library |\n| `opf-editor` | WYSIWYG bindings/components | Headless editor primitives plus optional UI components |\n| `opf-pptx` | OPF to PPTX and PPTX to OPF | Pure local import/export library for browser and server use where supported |\n\nThese repos provide OSS primitives only. Downstream applications own hosting, auth, storage, collaboration, queues, previews, analytics, support, and workflow UX.\n\n## Usage\n\nInstall from npm:\n\n```sh\npnpm add @openpresentation/opf\n# or: npm install @openpresentation/opf\n```\n\nTo work on the package itself, clone this repo and build the workspace:\n\n```sh\npnpm install\npnpm build\n```\n\nUse the format package from JavaScript or TypeScript:\n\n```ts\nimport { presentation, validate } from "@openpresentation/opf";\nimport { defaultCatalog } from "@openpresentation/opf/catalog";\n\nimport type { Presentation } from "@openpresentation/opf";\n\nconst deck: Presentation = {\n name: "Quarterly Review",\n slides: [{ title: "Quarterly Review", items: ["Revenue", "Product", "Hiring"] }],\n};\n\nconst report = validate(deck);\nconsole.log(report.valid); // no finding has severity "error"\nconsole.log(report.findings); // every finding: rule id, severity, category, JSON Pointer path, message, fixes\n// Core ships no catalog records in its main entry; a host registers the catalogs it trusts.\nconsole.log(validate({ ...deck, design: { theme: "classic" } }, { catalogs: [defaultCatalog] }).valid);\nconsole.log(Object.keys(defaultCatalog.audiences).length);\n```\n\nUse focused imports when you only need one surface:\n\n```ts\nimport { presentation } from "@openpresentation/opf/schemas";\nimport { defaultCatalog } from "@openpresentation/opf/catalog";\nimport { specFileEntries } from "@openpresentation/opf/spec-files";\nimport { validate } from "@openpresentation/opf/validator";\nimport type { Presentation } from "@openpresentation/opf/types";\n```\n\nUse raw JSON when an engine or resolver needs package-addressable files:\n\n```ts\nimport presentationSchema from "@openpresentation/opf/spec/schemas/opf.schema.json" with {\n type: "json",\n};\n```\n\nUse the [installable OPF CLI](./packages/cli/README.md) to create, validate, and edit files locally:\n\n```sh\npnpm --filter @openpresentation/cli build\nnode packages/cli/dist/index.js create deck.opf.json --title "Decision brief"\nnode packages/cli/dist/index.js validate deck.opf.json\nnode packages/cli/dist/index.js edit deck.opf.json --patch changes.json --in-place\n```\n\nSee [CSV and JSON data import](./docs/data-import.md) for editable tables and charts in the editor, CLI, and package API, and [content conversions](./docs/conversions.md) for the pure converters (`@openpresentation/opf/convert`) that change a block\'s kind, nest list items, restructure a slide and split or merge slides, and [Markdown and outlines](./docs/markdown.md) for the deterministic Markdown dialect (`@openpresentation/opf/markdown`, `opf from-md`, `opf to-md`) that reads and writes a whole deck as text.\n\n[OPF as YAML](./docs/yaml.md) describes the strict YAML form of a deck (`@openpresentation/opf/yaml`, `opf from-yaml`, `opf to-yaml`, `.opf.yaml` files in every command, editor autocomplete); JSON stays the canonical form.\n\nSee [Templates and variables](./docs/templates-and-variables.md) for fillable OPF templates: typed variables, `{{id}}` tokens, `opf fill` and `resolveVariables`.\n\n## Layout\n\n| Path | Contents |\n|---|---|\n| [`spec/schemas/opf.schema.json`](./spec/schemas/opf.schema.json) | Canonical JSON Schema for top-level OPF `Presentation` documents. |\n| [`docs/how-opf-works.md`](./docs/how-opf-works.md) | Conceptual introduction: the document model, content shapes, catalog resolution, and the validation philosophy. Start here. |\n| [`docs/design-resolution.md`](./docs/design-resolution.md) | The design precedence algorithm (slide design \u2192 deck design \u2192 resolved theme \u2192 engine defaults) with worked examples. |\n| [`docs/schema-reference.md`](./docs/schema-reference.md) | Author-facing reference for top-level OPF fields and every presentation schema `$defs` object/type. |\n| [`docs/catalog-schema-reference.md`](./docs/catalog-schema-reference.md) | Author-facing reference for every companion catalog schema. |\n| [`docs/content-payloads.md`](./docs/content-payloads.md) | Author-facing notes for slide and region content payloads, including chart and table object shapes. |\n| [`docs/footnotes-citations-captions.md`](./docs/footnotes-citations-captions.md) | Citations (`cite`), inline footnotes, the deck `references` list, captions on images, charts, tables and videos, and how every engine draws them. |\n| [`docs/examples.md`](./docs/examples.md) | Guide to the expanded scenario-oriented examples under `examples/gallery/`. |\n| [`docs/live-editor.md`](./docs/live-editor.md) | Browser canvas, live OPF editing, font loading, published packages, and current fidelity limits. |\n| [`docs/release-process.md`](./docs/release-process.md) | Maintainer runbook for tagging, trusted npm publishing, verification, and GitHub release notes. |\n| [`spec/schemas/*.schema.json`](./spec/schemas) | Companion schemas for catalog records and sub-objects. |\n| [`spec/catalogs/<catalog-kind>/`](./spec/catalogs) | The pinned snapshot of the default catalog pptx.gallery publishes (shipped as `@openpresentation/opf/catalog`). |\n| [`spec/openapi.yaml`](./spec/openapi.yaml) | Optional reference OpenAPI contract for downstream services that choose to expose OPF over HTTP. OpenPresentation does not host this API. |\n| [`examples/technical/`](./examples/technical) | Focused OPF fixtures for validator, renderer, catalog-resolution, design, content-payload, and region behavior. |\n| [`examples/gallery/`](./examples/gallery) | Broader OPF example decks organized by industry, function, education, government, presentation type, international, and design/media scenarios. |\n| [`packages/javascript/`](./packages/javascript) | Public pre-stable source for `@openpresentation/opf`. |\n| [`packages/cli/`](./packages/cli) | Installable local CLI for creating, validating, editing, and inspecting OPF. |\n| [`legacy/`](./legacy) | Tombstone for service-specific clients, CLIs, tool integrations, and workflows removed from the OpenPresentation OSS repo. |\n\n## OpenPresentation Boundary\n\nOpenPresentation defines the format, bundled presets, local validation, examples, docs, and planned local render/edit/convert libraries. It does not provide hosted functions or managed product surfaces.\n\nFuture non-JavaScript OPF packages should follow the same local-first boundary: Python and Go packages should expose schemas, types/models, catalogs, validation, and package-addressable assets. Future toolkit packages should expose embeddable library APIs with no required network calls, hosted callbacks, hidden telemetry, or managed infrastructure assumptions.\n\nThe published JavaScript package copies package-addressable OPF schemas, catalogs, reference assets, and the optional reference `spec/openapi.yaml` from `spec/`. It intentionally remains `@openpresentation/opf` instead of introducing a separate `@openpresentation/opf-spec` package so downstream imports can advance by semver-pinning one canonical package.\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n';
2
+ var repoReadmeRaw = '# Open Presentation Format (OPF)\n\n[![npm version](https://img.shields.io/npm/v/@openpresentation/opf?label=npm)](https://www.npmjs.com/package/@openpresentation/opf)\n[![npm downloads](https://img.shields.io/npm/dw/@openpresentation/opf)](https://www.npmjs.com/package/@openpresentation/opf)\n[![license](https://img.shields.io/npm/l/@openpresentation/opf)](./LICENSE)\n\nPublic npm package: [`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf) (`npm install @openpresentation/opf`).\n\nOpen Presentation Format is the portable, human-readable JSON document format for slide decks.\n\nThis repository is the canonical home for the OPF **spec**, **JSON Schemas**, **catalog presets**, examples, generated developer types, local validation tooling, and integration docs for the render/edit/convert toolkit. OpenPresentation publishes open-source code and documentation only; it does not provide hosted APIs, hosted rendering functions, queues, storage, authentication, jobs, previews, SLAs, telemetry, or managed infrastructure.\n\nFor AI agents, use the [OPF skill set](docs/agent-skills.md) for authoring, layout, presets, editing, export, and schema inspection.\n\nPublished CLI 0.15.0 installs all six skills into your project with `npx @openpresentation/cli@0.15.0 skills install`. It uses local copies, preserves existing instructions and refuses to overwrite customized skills. See the [installation and update guide](docs/agent-skills.md) for personal or agent-specific targets and source development.\n\nFor a fresh Node 24 project that installs **published** packages (not this\ncheckout), follow the [developer quickstart](docs/quickstart.md) and the\n[compatibility matrix](docs/compatibility-matrix.md).\n\nFor LLM authoring, start with [the authoring guide](docs/llm-authoring.md), [dynamic composition](docs/dynamic-composition.md), and [local ecosystem verification](docs/ecosystem-development.md).\n\n## File naming\n\nOpen Presentation Format documents are JSON files. Use `*.opf.json` for complete OPF presentation documents, for example `board-review.opf.json` or `deck.opf.json`.\n\nAvoid using bare `*.opf` for OPF JSON. The `.opf` extension is already used by other document and project formats, while `.opf.json` keeps the OPF identity and still makes the underlying JSON format clear to editors, validators, agents, and version-control tooling.\n\n## Naming and reuse\n\nThe format name is **Open Presentation Format**. The schemas, catalogs, packages, and local tooling in this repository are free and open source under the MIT license, so third-party tools may read, write, validate, render, convert, and describe support for Open Presentation Format without adopting any product-specific branding.\n\n## Why OPF\n\n`.pptx` is a zipped bundle of XML. Humans can\'t diff it, LLMs can\'t read or write it reliably, and git can\'t track it meaningfully. Every change looks like a binary blob.\n\nOPF is plain JSON. A human can open it in an editor. A model can read and write it without guessing at schema-by-example. Decks live in git like the rest of your work.\n\nThat\'s the shift that lets LLMs actually *author* decks. When the format stops fighting them, models can do the work that matters \u2014 narrative structure, persuasive framing, data analysis, chart recommendations, ruthless revision passes \u2014 instead of wrestling with `<p:sp>` tags.\n\nAnd they don\'t start from a blank canvas. [pptx.gallery](https://pptx.gallery) is the human-browsable reference for OPF catalog presets: layouts, themes, color schemes, font schemes, chart types, narratives, audiences, purposes, tones, languages, and social platforms.\n\n## Start in three steps\n\n1. **Install the coordinated published packages** on Node 24. See [the developer quickstart](docs/quickstart.md) for the current pin set: core 0.15.1, renderer 0.15.0, editor 0.15.0, PPTX 0.15.0 and CLI 0.15.0.\n2. **Author, validate, paginate, preview and export.** Copy [`docs/quickstart/developer-quickstart.opf.json`](./docs/quickstart/developer-quickstart.opf.json) and run the commands in that guide. From code, `exportDeck(presentation, { format: "pdf" })` of `@openpresentation/cli/api` is the simple path to a PDF, PNG, SVG or PPTX file. `validate` / `opf validate` is one local checker for format, references, accessibility, layout and content ([guide](docs/validate.md)), not visual verification.\n3. **Know the limits.** The [compatibility matrix](docs/compatibility-matrix.md) lists shipped APIs versus renderer issue 24, native PowerPoint issue 87, and other deferred work. Browse presets at [pptx.gallery](https://pptx.gallery).\n\nYour deck can live in git from the first commit. After installing dependencies and supplying referenced assets, these commands run locally without a model provider, account or hosted OPF API.\n\n## JavaScript and TypeScript\n\nThe canonical JavaScript/TypeScript package is published at [`packages/javascript`](./packages/javascript) as [`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf). The schema is pre-stable (0.x \u2014 expect breaking changes between minor versions until 1.0). Its responsibility is local and format-level only:\n\n- export the canonical schemas from [`spec/`](./spec)\n- export the pinned default catalog (the pptx.gallery snapshot in [`spec/catalogs/`](./spec/catalogs)) as the opt-in `@openpresentation/opf/catalog`, for hosts to register\n- export a typed raw spec file manifest for package-addressable `spec/` content\n- generate TypeScript types, with `Presentation` as the top-level type\n- validate OPF JSON and catalog records locally\n\nIt does not render `.pptx`, parse `.pptx`, generate content with AI, fetch remote catalogs, call hosted APIs, or provide managed services. Render/edit/convert packages live in separate MIT repos that depend on `@openpresentation/opf`. The format package also exposes pure composition geometry so those packages share layout behavior.\n\n## Toolkit libraries\n\nOPF is five packages. **Core** (`@openpresentation/opf`) reads and writes the text formats (JSON, YAML, Markdown) and validates. **The CLI package** (`@openpresentation/cli`) is the `opf` command and the library API `@openpresentation/cli/api`, which reads and writes files (`exportDeck`, `importDeck`). **Render** (`opf-render`) and **PPTX** (`opf-pptx`) are the engines behind them, installed as needed. **The editor** (`opf-editor`) is the headless editing layer. The engines and the editor live in sibling repositories. See [ecosystem development](docs/ecosystem-development.md) for coordinated builds and verification, and [dynamic composition](docs/dynamic-composition.md) for portable layout rules.\n\n| Repo | Role | Boundary |\n|---|---|---|\n| `cli` (`@openpresentation/cli`, this repository) | `opf` command; `cli/api`: `exportDeck`, `importDeck`, `readDeck` | Reads and writes files; calls the engines below as optional peers |\n| `opf-render` | OPF to SVG/PNG/PDF | Local and embeddable rendering library |\n| `opf-editor` | WYSIWYG bindings/components | Headless editor primitives plus optional UI components |\n| `opf-pptx` | OPF to PPTX and PPTX to OPF | Pure local import/export library for browser and server use where supported |\n\nThese repos provide OSS primitives only. Downstream applications own hosting, auth, storage, collaboration, queues, previews, analytics, support, and workflow UX.\n\n## Usage\n\nInstall from npm:\n\n```sh\npnpm add @openpresentation/opf\n# or: npm install @openpresentation/opf\n```\n\nTo work on the package itself, clone this repo and build the workspace:\n\n```sh\npnpm install\npnpm build\n```\n\nUse the format package from JavaScript or TypeScript:\n\n```ts\nimport { presentation, validate } from "@openpresentation/opf";\nimport { defaultCatalog } from "@openpresentation/opf/catalog";\n\nimport type { Presentation } from "@openpresentation/opf";\n\nconst deck: Presentation = {\n name: "Quarterly Review",\n slides: [{ title: "Quarterly Review", items: ["Revenue", "Product", "Hiring"] }],\n};\n\nconst report = validate(deck);\nconsole.log(report.valid); // no finding has severity "error"\nconsole.log(report.findings); // every finding: rule id, severity, category, JSON Pointer path, message, fixes\n// Core ships no catalog records in its main entry; a host registers the catalogs it trusts.\nconsole.log(validate({ ...deck, design: { theme: "classic" } }, { catalogs: [defaultCatalog] }).valid);\nconsole.log(Object.keys(defaultCatalog.audiences).length);\n```\n\nExport and import files from code with the CLI package\'s library API (the engines `@openpresentation/opf-render` and `@openpresentation/opf-pptx` are optional peers, installed as needed):\n\n```ts\nimport { readDeck, exportDeck, importDeck } from "@openpresentation/cli/api";\n\nconst { presentation } = readDeck(text, { filename: "deck.opf.md" }); // JSON, YAML or Markdown\nconst { files } = await exportDeck(presentation, { format: "pdf" }); // [{ name, type, bytes }]\nconst imported = await importDeck(pptxBytes); // PPTX to OPF\n```\n\nUse focused imports when you only need one surface:\n\n```ts\nimport { presentation } from "@openpresentation/opf/schemas";\nimport { defaultCatalog } from "@openpresentation/opf/catalog";\nimport { specFileEntries } from "@openpresentation/opf/spec-files";\nimport { validate } from "@openpresentation/opf/validator";\nimport type { Presentation } from "@openpresentation/opf/types";\n```\n\nUse raw JSON when an engine or resolver needs package-addressable files:\n\n```ts\nimport presentationSchema from "@openpresentation/opf/spec/schemas/opf.schema.json" with {\n type: "json",\n};\n```\n\nUse the [installable OPF CLI](./packages/cli/README.md) to create, validate, and edit files locally:\n\n```sh\npnpm --filter @openpresentation/cli build\nnode packages/cli/dist/index.js create deck.opf.json --title "Decision brief"\nnode packages/cli/dist/index.js validate deck.opf.json\nnode packages/cli/dist/index.js edit deck.opf.json --patch changes.json --in-place\n```\n\nSee [CSV and JSON data import](./docs/data-import.md) for editable tables and charts in the editor, CLI, and package API, and [content conversions](./docs/conversions.md) for the pure converters (`@openpresentation/opf/convert`) that change a block\'s kind, nest list items, restructure a slide and split or merge slides, and [Markdown and outlines](./docs/markdown.md) for the deterministic Markdown dialect (`@openpresentation/opf/markdown`, `opf from-md`, `opf to-md`) that reads and writes a whole deck as text.\n\n[OPF as YAML](./docs/yaml.md) describes the strict YAML form of a deck (`@openpresentation/opf/yaml`, `opf from-yaml`, `opf to-yaml`, `.opf.yaml` files in every command, editor autocomplete); JSON stays the canonical form. A deck can equally be a Markdown file, `deck.opf.md`: every command reads and writes it (see [Markdown decks in every command](./docs/markdown.md#markdown-decks-in-every-command)), and `readDeck` / `writeDeck` read and write a deck in JSON, YAML or Markdown with one call.\n\nSee [Templates and variables](./docs/templates-and-variables.md) for fillable OPF templates: typed variables, `{{id}}` tokens, `opf fill` and `resolveVariables`.\n\n## Layout\n\n| Path | Contents |\n|---|---|\n| [`spec/schemas/opf.schema.json`](./spec/schemas/opf.schema.json) | Canonical JSON Schema for top-level OPF `Presentation` documents. |\n| [`docs/how-opf-works.md`](./docs/how-opf-works.md) | Conceptual introduction: the document model, content shapes, catalog resolution, and the validation philosophy. Start here. |\n| [`docs/design-resolution.md`](./docs/design-resolution.md) | The design precedence algorithm (slide design \u2192 deck design \u2192 resolved theme \u2192 engine defaults) with worked examples. |\n| [`docs/schema-reference.md`](./docs/schema-reference.md) | Author-facing reference for top-level OPF fields and every presentation schema `$defs` object/type. |\n| [`docs/catalog-schema-reference.md`](./docs/catalog-schema-reference.md) | Author-facing reference for every companion catalog schema. |\n| [`docs/content-payloads.md`](./docs/content-payloads.md) | Author-facing notes for slide and region content payloads, including chart and table object shapes. |\n| [`docs/footnotes-citations-captions.md`](./docs/footnotes-citations-captions.md) | Citations (`cite`), inline footnotes, the deck `references` list, captions on images, charts, tables and videos, and how every engine draws them. |\n| [`docs/examples.md`](./docs/examples.md) | Guide to the expanded scenario-oriented examples under `examples/gallery/`. |\n| [`docs/live-editor.md`](./docs/live-editor.md) | Browser canvas, live OPF editing, font loading, published packages, and current fidelity limits. |\n| [`docs/release-process.md`](./docs/release-process.md) | Maintainer runbook for tagging, trusted npm publishing, verification, and GitHub release notes. |\n| [`spec/schemas/*.schema.json`](./spec/schemas) | Companion schemas for catalog records and sub-objects. |\n| [`spec/catalogs/<catalog-kind>/`](./spec/catalogs) | The pinned snapshot of the default catalog pptx.gallery publishes (shipped as `@openpresentation/opf/catalog`). |\n| [`spec/openapi.yaml`](./spec/openapi.yaml) | Optional reference OpenAPI contract for downstream services that choose to expose OPF over HTTP. OpenPresentation does not host this API. |\n| [`examples/technical/`](./examples/technical) | Focused OPF fixtures for validator, renderer, catalog-resolution, design, content-payload, and region behavior. |\n| [`examples/gallery/`](./examples/gallery) | Broader OPF example decks organized by industry, function, education, government, presentation type, international, and design/media scenarios. |\n| [`packages/javascript/`](./packages/javascript) | Public pre-stable source for `@openpresentation/opf`. |\n| [`packages/cli/`](./packages/cli) | Installable local CLI for creating, validating, editing, and inspecting OPF. |\n| [`legacy/`](./legacy) | Tombstone for service-specific clients, CLIs, tool integrations, and workflows removed from the OpenPresentation OSS repo. |\n\n## OpenPresentation Boundary\n\nOpenPresentation defines the format, bundled presets, local validation, examples, docs, and planned local render/edit/convert libraries. It does not provide hosted functions or managed product surfaces.\n\nFuture non-JavaScript OPF packages should follow the same local-first boundary: Python and Go packages should expose schemas, types/models, catalogs, validation, and package-addressable assets. Future toolkit packages should expose embeddable library APIs with no required network calls, hosted callbacks, hidden telemetry, or managed infrastructure assumptions.\n\nThe published JavaScript package copies package-addressable OPF schemas, catalogs, reference assets, and the optional reference `spec/openapi.yaml` from `spec/`. It intentionally remains `@openpresentation/opf` instead of introducing a separate `@openpresentation/opf-spec` package so downstream imports can advance by semver-pinning one canonical package.\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n';
3
3
 
4
4
  // src/repo-readme.ts
5
5
  var repoReadme = repoReadmeRaw;
package/dist/schemas.d.ts CHANGED
@@ -103,6 +103,13 @@ declare const theme: JsonSchemaDocument & {
103
103
  };
104
104
  declare const layout: JsonSchemaDocument & {
105
105
  readonly $defs: {
106
+ readonly "PlaceholderEntry": JsonObject;
107
+ readonly "PlaceholderGroup": JsonObject;
108
+ readonly "PlaceholderGroupEntry2": JsonObject;
109
+ readonly "PlaceholderGroup2": JsonObject;
110
+ readonly "PlaceholderGroupEntry3": JsonObject;
111
+ readonly "PlaceholderGroup3": JsonObject;
112
+ readonly "GroupedPlaceholder": JsonObject;
106
113
  readonly "Placeholder": JsonObject;
107
114
  readonly "ImagePlacement": JsonObject;
108
115
  readonly "DesignHints": JsonObject;
@@ -232,6 +239,13 @@ declare const schemas: {
232
239
  };
233
240
  readonly layout: JsonSchemaDocument & {
234
241
  readonly $defs: {
242
+ readonly "PlaceholderEntry": JsonObject;
243
+ readonly "PlaceholderGroup": JsonObject;
244
+ readonly "PlaceholderGroupEntry2": JsonObject;
245
+ readonly "PlaceholderGroup2": JsonObject;
246
+ readonly "PlaceholderGroupEntry3": JsonObject;
247
+ readonly "PlaceholderGroup3": JsonObject;
248
+ readonly "GroupedPlaceholder": JsonObject;
235
249
  readonly "Placeholder": JsonObject;
236
250
  readonly "ImagePlacement": JsonObject;
237
251
  readonly "DesignHints": JsonObject;
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-2CJPC4HI.js';
1
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-WEDGVC5W.js';
@@ -15,7 +15,63 @@
15
15
  "type": "title"
16
16
  },
17
17
  {
18
- "type": "text"
18
+ "type": "group",
19
+ "composition": {
20
+ "mode": "row"
21
+ },
22
+ "placeholders": [
23
+ {
24
+ "type": "text"
25
+ },
26
+ {
27
+ "type": "group",
28
+ "composition": {
29
+ "mode": "column"
30
+ },
31
+ "placeholders": [
32
+ {
33
+ "type": "text"
34
+ },
35
+ {
36
+ "type": "text"
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ "type": "text"
42
+ },
43
+ {
44
+ "type": "group",
45
+ "composition": {
46
+ "mode": "column"
47
+ },
48
+ "placeholders": [
49
+ {
50
+ "type": "text"
51
+ },
52
+ {
53
+ "type": "text"
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "type": "text"
59
+ }
60
+ ]
61
+ },
62
+ {
63
+ "type": "group",
64
+ "composition": {
65
+ "mode": "row"
66
+ },
67
+ "placeholders": [
68
+ {
69
+ "type": "text"
70
+ },
71
+ {
72
+ "type": "text"
73
+ }
74
+ ]
19
75
  }
20
76
  ],
21
77
  "tags": [
@@ -25,5 +81,14 @@
25
81
  ],
26
82
  "preview": {
27
83
  "vectorSrc": "https://www.pptx.gallery/layout-previews/business-model-canvas.svg"
84
+ },
85
+ "composition": {
86
+ "mode": "column",
87
+ "weights": [
88
+ 2,
89
+ 1
90
+ ],
91
+ "padding": 0.04,
92
+ "gap": 0.02
28
93
  }
29
94
  }
@@ -8,15 +8,62 @@
8
8
  "titleAlignment": "left",
9
9
  "contentAlignment": "left",
10
10
  "contentBox": true,
11
- "contentDirection": "horizontal",
12
- "imageFit": "cover"
11
+ "contentDirection": "horizontal"
13
12
  },
14
13
  "placeholders": [
15
14
  {
16
15
  "type": "title"
17
16
  },
18
17
  {
19
- "type": "image"
18
+ "type": "group",
19
+ "composition": {
20
+ "mode": "column"
21
+ },
22
+ "placeholders": [
23
+ {
24
+ "type": "text"
25
+ },
26
+ {
27
+ "type": "text"
28
+ },
29
+ {
30
+ "type": "text"
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "type": "group",
36
+ "composition": {
37
+ "mode": "column"
38
+ },
39
+ "placeholders": [
40
+ {
41
+ "type": "text"
42
+ },
43
+ {
44
+ "type": "text"
45
+ },
46
+ {
47
+ "type": "text"
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "type": "group",
53
+ "composition": {
54
+ "mode": "column"
55
+ },
56
+ "placeholders": [
57
+ {
58
+ "type": "text"
59
+ },
60
+ {
61
+ "type": "text"
62
+ },
63
+ {
64
+ "type": "text"
65
+ }
66
+ ]
20
67
  }
21
68
  ],
22
69
  "tags": [
@@ -26,5 +73,8 @@
26
73
  ],
27
74
  "preview": {
28
75
  "vectorSrc": "https://www.pptx.gallery/layout-previews/capability-map.svg"
76
+ },
77
+ "composition": {
78
+ "mode": "row"
29
79
  }
30
80
  }
@@ -14,16 +14,40 @@
14
14
  "type": "title"
15
15
  },
16
16
  {
17
- "type": "chart"
17
+ "type": "group",
18
+ "composition": {
19
+ "mode": "column",
20
+ "weights": [
21
+ 2,
22
+ 1
23
+ ]
24
+ },
25
+ "placeholders": [
26
+ {
27
+ "type": "chart"
28
+ },
29
+ {
30
+ "type": "text"
31
+ }
32
+ ]
18
33
  },
19
34
  {
20
- "type": "text"
21
- },
22
- {
23
- "type": "chart"
24
- },
25
- {
26
- "type": "text"
35
+ "type": "group",
36
+ "composition": {
37
+ "mode": "column",
38
+ "weights": [
39
+ 2,
40
+ 1
41
+ ]
42
+ },
43
+ "placeholders": [
44
+ {
45
+ "type": "chart"
46
+ },
47
+ {
48
+ "type": "text"
49
+ }
50
+ ]
27
51
  }
28
52
  ],
29
53
  "composition": {