@openpresentation/opf 0.15.1 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/dist/{catalog-refs-BSfGELpt.d.ts → catalog-refs-C4K4y-vh.d.ts} +1 -1
- package/dist/{catalog-schemas-CinPh5WA.d.ts → catalog-schemas-g7RFQBdc.d.ts} +1 -1
- package/dist/catalog.d.ts +2 -2
- package/dist/catalog.js +3 -23224
- package/dist/{chart-data-BnNqgnC-.d.ts → chart-data-DTxdRRT1.d.ts} +1 -1
- package/dist/{chunk-3JG4YXWF.js → chunk-BIC3SWPK.js} +12 -5
- package/dist/{chunk-O744SXXA.js → chunk-CW7GEAV3.js} +350 -141
- package/dist/{chunk-374R35TJ.js → chunk-ESRYBYLY.js} +1 -1
- package/dist/chunk-IPW5BS3X.js +973 -0
- package/dist/{chunk-3RKB4RDJ.js → chunk-IS5H5JKH.js} +4 -2
- package/dist/{chunk-TWQJLI6E.js → chunk-M4UR3NPN.js} +2 -2
- package/dist/chunk-N4EVOFEA.js +58 -0
- package/dist/{chunk-QDI75P2M.js → chunk-NLNYNBTS.js} +217 -20
- package/dist/{chunk-U4J75TRG.js → chunk-O263APNI.js} +5 -2
- package/dist/{chunk-UBFJ2QHH.js → chunk-O2CX5NEH.js} +36 -14
- package/dist/{chunk-5FTUIDUH.js → chunk-O3CVNJTL.js} +1 -1
- package/dist/{chunk-VGAOJEY7.js → chunk-PPROJP2E.js} +1 -1
- package/dist/{chunk-2CJPC4HI.js → chunk-RA64UQKI.js} +203 -53
- package/dist/chunk-TCD2FB2K.js +319 -0
- package/dist/chunk-WCG3THTD.js +23712 -0
- package/dist/chunk-WWYWFVOI.js +793 -0
- package/dist/{chunk-ZPU46TFA.js → chunk-YT7FMQER.js} +1 -1
- package/dist/{composition-D2tghM82.d.ts → composition-BbZ_9C-c.d.ts} +238 -139
- package/dist/composition.d.ts +3 -3
- package/dist/composition.js +1 -1
- package/dist/conversion-SBpTOwdg.d.ts +444 -0
- package/dist/convert.d.ts +4 -4
- package/dist/convert.js +7 -7
- package/dist/data.d.ts +28 -11
- package/dist/data.js +2 -2
- package/dist/deck-report-Bx3naFlF.d.ts +40 -0
- package/dist/deck.d.ts +47 -0
- package/dist/deck.js +12 -0
- package/dist/diff.d.ts +1 -1
- package/dist/diff.js +5 -5
- package/dist/docs.js +33 -27
- package/dist/examples.d.ts +1 -1
- package/dist/examples.js +3229 -985
- package/dist/{finding-CT_f_vbD.d.ts → finding-CDQ_wH8j.d.ts} +1 -1
- package/dist/format.js +2 -2
- package/dist/index.d.ts +43 -12
- package/dist/index.js +15 -805
- package/dist/markdown.d.ts +7 -8
- package/dist/markdown.js +7 -7
- package/dist/node-engine.d.ts +94 -0
- package/dist/node-engine.js +21 -0
- package/dist/node.d.ts +60 -0
- package/dist/node.js +54 -0
- package/dist/{pagination-wedbe7eq.d.ts → pagination-BhX4M48Y.d.ts} +21 -7
- package/dist/pagination.d.ts +4 -4
- package/dist/pagination.js +4 -4
- package/dist/patch.d.ts +1 -1
- package/dist/patch.js +4 -4
- package/dist/{presentation-CDKQVkyI.d.ts → presentation-fb8CZmRq.d.ts} +28 -83
- package/dist/repo-readme.js +1 -1
- package/dist/schemas.d.ts +14 -0
- package/dist/schemas.js +1 -1
- package/dist/spec/catalogs/layouts/business-model-canvas.json +66 -1
- package/dist/spec/catalogs/layouts/capability-map.json +53 -3
- package/dist/spec/catalogs/layouts/chart-2x.json +32 -8
- package/dist/spec/catalogs/layouts/chart-3x-bottom-vertical-title-left.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x-left-title-center.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x-left.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x-right-title-center.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x-right.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x-top-vertical-title-left.json +16 -10
- package/dist/spec/catalogs/layouts/chart-3x.json +48 -12
- package/dist/spec/catalogs/layouts/dashboard.json +37 -5
- package/dist/spec/catalogs/layouts/image-2x.json +32 -8
- package/dist/spec/catalogs/layouts/image-3x.json +48 -12
- package/dist/spec/catalogs/layouts/index.json +1 -1
- package/dist/spec/catalogs/layouts/kpi-scorecard.json +48 -3
- package/dist/spec/catalogs/layouts/logic-tree.json +69 -0
- package/dist/spec/catalogs/layouts/market-size.json +26 -2
- package/dist/spec/catalogs/layouts/org-chart.json +53 -6
- package/dist/spec/catalogs/manifest.json +3 -3
- package/dist/spec/schemas/layout.schema.json +172 -5
- package/dist/spec/schemas/opf.schema.json +27 -43
- package/dist/types.d.ts +10 -32
- package/dist/{validation-types-BOcY9GTs.d.ts → validation-types-iZbXfES6.d.ts} +19 -8
- package/dist/validator.d.ts +8 -8
- package/dist/validator.js +3 -3
- package/dist/yaml.d.ts +6 -6
- package/dist/yaml.js +8 -321
- package/package.json +38 -1
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"minItems": 1
|
|
37
37
|
}
|
|
38
38
|
],
|
|
39
|
-
"description": "Organization associated with the presentation, usually the presenting company. Array form supports hosts, partners, clients, and sponsors. The primary organization (Organization.role 'primary', else the first item) supplies the default deck logo, the '
|
|
39
|
+
"description": "Organization associated with the presentation, usually the presenting company. Array form supports hosts, partners, clients, and sponsors. The primary organization (Organization.role 'primary', else the first item) supplies the default deck logo, the 'socials' header/footer field and the 'organization.<field>' built-in variables; the others are available by id as 'organization.<id>.<field>' and are not drawn automatically."
|
|
40
40
|
},
|
|
41
41
|
"speaker": {
|
|
42
42
|
"oneOf": [
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"minItems": 1
|
|
48
48
|
}
|
|
49
49
|
],
|
|
50
|
-
"description": "Person presenting the deck. Array form supports panels and multi-speaker decks. The first speaker is the primary speaker: the built-in variables 'speaker.<field>'
|
|
50
|
+
"description": "Person presenting the deck. Array form supports panels and multi-speaker decks. The first speaker is the primary speaker: the built-in variables 'speaker.<field>' read it, 'speakers' lists every name, and 'speaker.<id>.<field>' addresses one by id. A speaker is drawn nowhere else."
|
|
51
51
|
},
|
|
52
52
|
"author": {
|
|
53
53
|
"oneOf": [
|
|
@@ -494,7 +494,7 @@
|
|
|
494
494
|
},
|
|
495
495
|
"Organization": {
|
|
496
496
|
"type": "object",
|
|
497
|
-
"description": "An organization associated with the presentation, typically the presenting company, but also hosts, partners, clients, or sponsors. The primary organization (role 'primary', else the first one) supplies the default deck logo (unless design.logo overrides it)
|
|
497
|
+
"description": "An organization associated with the presentation, typically the presenting company, but also hosts, partners, clients, or sponsors. The primary organization (role 'primary', else the first one) supplies the default deck logo (unless design.logo overrides it) and the 'socials' header/footer field (its socials). Every field is also a built-in variable ('{{organization.name}}', 'var:organization.logo', 'organization.<id>.<field>'). Nothing else about an organization is drawn automatically. See docs/templates-and-variables.md.",
|
|
498
498
|
"required": ["id", "name"],
|
|
499
499
|
"properties": {
|
|
500
500
|
"id": {
|
|
@@ -505,7 +505,7 @@
|
|
|
505
505
|
},
|
|
506
506
|
"name": {
|
|
507
507
|
"type": "string",
|
|
508
|
-
"description": "Display name.
|
|
508
|
+
"description": "Display name. The built-in variable 'organization.name' (primary organization) or 'organization.<id>.name' carries it into any string, such as a header or footer text of '{{organization.name}}'.",
|
|
509
509
|
"examples": ["Acme Corp", "DevConf 2026", "Beta Industries"]
|
|
510
510
|
},
|
|
511
511
|
"legalName": {
|
|
@@ -547,7 +547,7 @@
|
|
|
547
547
|
"role": {
|
|
548
548
|
"type": "string",
|
|
549
549
|
"enum": ["primary", "partner", "client", "sponsor", "host"],
|
|
550
|
-
"description": "Role of the organization relative to the presentation. Only 'primary' has behavior: it selects the primary organization (deck logo,
|
|
550
|
+
"description": "Role of the organization relative to the presentation. Only 'primary' has behavior: it selects the primary organization (deck logo, the 'socials' header/footer field, and the 'organization.<field>' built-ins). When no organization has role 'primary', the first one is primary. 'partner', 'client', 'sponsor' and 'host' are descriptive labels that change nothing."
|
|
551
551
|
},
|
|
552
552
|
"socials": {
|
|
553
553
|
"$ref": "#/$defs/Socials",
|
|
@@ -557,7 +557,7 @@
|
|
|
557
557
|
},
|
|
558
558
|
"Speaker": {
|
|
559
559
|
"type": "object",
|
|
560
|
-
"description": "A person presenting the deck. A speaker is drawn only through built-in variables ('{{speaker.name}}' inside any string, 'var:speaker.photo' as a whole image field)
|
|
560
|
+
"description": "A person presenting the deck. A speaker is drawn only through built-in variables ('{{speaker.name}}' inside any string, a header or footer text included, and 'var:speaker.photo' as a whole image field). No layout, cover or bio slide places a speaker on its own. See docs/templates-and-variables.md.",
|
|
561
561
|
"required": ["id", "name"],
|
|
562
562
|
"properties": {
|
|
563
563
|
"id": {
|
|
@@ -568,12 +568,12 @@
|
|
|
568
568
|
},
|
|
569
569
|
"name": {
|
|
570
570
|
"type": "string",
|
|
571
|
-
"description": "Display name. Built-in variable 'speaker.name' (first speaker) or 'speaker.<id>.name';
|
|
571
|
+
"description": "Display name. Built-in variable 'speaker.name' (first speaker) or 'speaker.<id>.name'; every name is listed by 'speakers'.",
|
|
572
572
|
"examples": ["Alice Chen", "Bob Lee", "Dr. Carla Diaz"]
|
|
573
573
|
},
|
|
574
574
|
"title": {
|
|
575
575
|
"type": "string",
|
|
576
|
-
"description": "Role or title. Built-in variable 'speaker.title'
|
|
576
|
+
"description": "Role or title. Built-in variable 'speaker.title' (or 'speaker.<id>.title'), for example in a footer text of '{{speaker.name}}, {{speaker.title}}'.",
|
|
577
577
|
"examples": ["VP of Engineering", "Founder & CEO", "Chief Product Officer", "Senior Staff Engineer"]
|
|
578
578
|
},
|
|
579
579
|
"photo": {
|
|
@@ -715,7 +715,7 @@
|
|
|
715
715
|
{ "$ref": "#/$defs/HeaderFooter" }
|
|
716
716
|
],
|
|
717
717
|
"description": "Repeated header furniture rendered outside the main slide content. Use false to suppress an inherited header.",
|
|
718
|
-
"examples": [false, { "left": { "
|
|
718
|
+
"examples": [false, { "left": { "text": "{{slide.section}}" }, "right": { "image": "asset:acme-logo" } }]
|
|
719
719
|
},
|
|
720
720
|
"footer": {
|
|
721
721
|
"oneOf": [
|
|
@@ -725,7 +725,7 @@
|
|
|
725
725
|
"description": "Repeated footer furniture rendered outside the main slide content. Use false to suppress an inherited footer.",
|
|
726
726
|
"examples": [
|
|
727
727
|
false,
|
|
728
|
-
{ "left": { "image": "asset:acme-logo" }, "center": { "text": "Confidential" }, "right": { "
|
|
728
|
+
{ "left": { "image": "asset:acme-logo" }, "center": { "text": "Confidential" }, "right": { "text": "{{slide.number}}" } }
|
|
729
729
|
]
|
|
730
730
|
},
|
|
731
731
|
"titleAlignment": {
|
|
@@ -750,7 +750,7 @@
|
|
|
750
750
|
"chartPrimary": {
|
|
751
751
|
"type": "string",
|
|
752
752
|
"enum": ["none", "top", "bottom", "left", "right"],
|
|
753
|
-
"description": "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."
|
|
753
|
+
"description": "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."
|
|
754
754
|
},
|
|
755
755
|
"imageFit": {
|
|
756
756
|
"type": "string",
|
|
@@ -1027,7 +1027,7 @@
|
|
|
1027
1027
|
"additionalProperties": {
|
|
1028
1028
|
"$ref": "#/$defs/Variable"
|
|
1029
1029
|
},
|
|
1030
|
-
"description": "Named variables, keyed by stable kebab-case id. A variable is a typed, named value the deck declares once and uses in many places: a color ('var:<id>' in color fields, the original use), or content that fills a template (text, number, date, image, url, list). Content is referenced inline as '{{<id>}}' inside any string, or whole as 'var:<id>' in a field of the matching type; '\\{{' writes a literal '{{'. A hex string is shorthand for a color variable. A variable with no 'value' is unfilled: expected in a template (root 'template': true), an error in a normal deck. Engines resolve variables with resolveVariables() before composing, rendering or exporting, so a template plus its values previews and exports exactly like the equivalent hand-written deck. Read-only built-in variables come from the deck's own metadata and use dotted names that a user id can never take: 'deck.name', 'deck.description', 'deck.author', 'speaker.name|title|email|phone|bio|photo' (first speaker), 'speakers' (every speaker's name, a list), 'organization.name|legalName|tagline|domain|email|phone|logo' (primary organization), and 'speaker.<id>.<field>' / 'organization.<id>.<field>' by id. They are written the same two ways ('{{speaker.name}}', 'var:speaker.photo'), are never declared, and an unknown built-in path is a validation error; a known one with no source value resolves to nothing with a warning. The id 'speakers' is reserved. See docs/templates-and-variables.md.",
|
|
1030
|
+
"description": "Named variables, keyed by stable kebab-case id. A variable is a typed, named value the deck declares once and uses in many places: a color ('var:<id>' in color fields, the original use), or content that fills a template (text, number, date, image, url, list). Content is referenced inline as '{{<id>}}' inside any string, or whole as 'var:<id>' in a field of the matching type; '\\{{' writes a literal '{{'. A hex string is shorthand for a color variable. A variable with no 'value' is unfilled: expected in a template (root 'template': true), an error in a normal deck. Engines resolve variables with resolveVariables() before composing, rendering or exporting, so a template plus its values previews and exports exactly like the equivalent hand-written deck. Read-only built-in variables come from the deck's own metadata and use dotted names that a user id can never take: 'deck.name', 'deck.description', 'deck.author', 'speaker.name|title|email|phone|bio|photo' (first speaker), 'speakers' (every speaker's name, a list), 'organization.name|legalName|tagline|domain|email|phone|logo' (primary organization), and 'speaker.<id>.<field>' / 'organization.<id>.<field>' by id. They are written the same two ways ('{{speaker.name}}', 'var:speaker.photo'), are never declared, and an unknown built-in path is a validation error; a known one with no source value resolves to nothing with a warning. The id 'speakers' is reserved. Three built-ins are slide-scoped and written only as inline tokens: '{{slide.number}}' (the displayed slide number after pagination), '{{slide.section}}' (the slide's section) and '{{deck.slideCount}}' (the number of slides after pagination). resolveVariables() leaves them as written; they resolve per slide as it is composed (resolveSlideVariables(), and header/footer text in layoutFurniture()), so every 'slide.' name is reserved and 'var:slide.*' or 'var:deck.slideCount' is a validation error. See docs/templates-and-variables.md.",
|
|
1031
1031
|
"examples": [
|
|
1032
1032
|
{
|
|
1033
1033
|
"risk": "#B42318",
|
|
@@ -1835,7 +1835,8 @@
|
|
|
1835
1835
|
},
|
|
1836
1836
|
"HeaderFooterItem": {
|
|
1837
1837
|
"type": "object",
|
|
1838
|
-
"description": "One header/footer zone. Every configured field renders; fields in one zone stack top to bottom in the order logo, image, text,
|
|
1838
|
+
"description": "One header/footer zone. Every configured field renders; fields in one zone stack top to bottom in the order logo, image, text, socials, date. Generated values such as the slide number, the slide count, the section, the organization or the speaker are variables inside text ('{{slide.number}} / {{deck.slideCount}}', '{{organization.name}}'), so one text writes several values in the author's order; a line break is '\\n'. Put a date and a slide number in different zones to keep each on the zone's single line. See docs/templates-and-variables.md.",
|
|
1839
|
+
"additionalProperties": false,
|
|
1839
1840
|
"properties": {
|
|
1840
1841
|
"logo": {
|
|
1841
1842
|
"type": "boolean",
|
|
@@ -1843,24 +1844,14 @@
|
|
|
1843
1844
|
},
|
|
1844
1845
|
"text": {
|
|
1845
1846
|
"type": "string",
|
|
1846
|
-
"description": "
|
|
1847
|
-
"examples": ["Confidential", "Q4 Business Review"]
|
|
1847
|
+
"description": "Text rendered in this zone. Variables resolve inside it like any string: deck-wide ones ('{{organization.name}}', '{{speaker.name}}, {{speaker.title}}', '{{customer}}') before composition, and the slide-scoped built-ins '{{slide.number}}', '{{slide.section}}' and '{{deck.slideCount}}' for each slide as it is laid out. Each '{{slide.number}}' is a live slide-number field: PPTX export writes it as a native field when its value fits within one accepted text line, and as static text with a diagnostic otherwise. '{{deck.slideCount}}' is fixed text, because PowerPoint has no slide-count field. Write '\\{{' for literal braces.",
|
|
1848
|
+
"examples": ["Confidential", "Q4 Business Review", "{{slide.number}} / {{deck.slideCount}}", "{{organization.name}}\n{{slide.section}}"]
|
|
1848
1849
|
},
|
|
1849
1850
|
"image": {
|
|
1850
1851
|
"$ref": "#/$defs/Asset",
|
|
1851
1852
|
"description": "Generic image rendered in this zone, such as a logo, partner mark, certification badge, or icon.",
|
|
1852
1853
|
"examples": ["asset:acme-logo", "./assets/footer-badge.svg"]
|
|
1853
1854
|
},
|
|
1854
|
-
"slideNumber": {
|
|
1855
|
-
"type": "boolean",
|
|
1856
|
-
"description": "Whether to render the current slide number in this zone. PPTX export writes a native slide-number field when its value fits within one accepted text line; a value split across lines exports as static text with a diagnostic."
|
|
1857
|
-
},
|
|
1858
|
-
"slideNumberFormat": {
|
|
1859
|
-
"type": "string",
|
|
1860
|
-
"pattern": "[{]current[}]",
|
|
1861
|
-
"description": "Template for the slide number when slideNumber is true. {current} is the displayed slide number (a native PPTX field when its value fits within one accepted text line); {total} is the number of slides in the rendered or exported deck, written as fixed text because PowerPoint has no slide-count field. Other characters are literal. Defaults to \"{current}\".",
|
|
1862
|
-
"examples": ["{current}", "{current} / {total}", "A-{current}", "Page {current} of {total}"]
|
|
1863
|
-
},
|
|
1864
1855
|
"date": {
|
|
1865
1856
|
"oneOf": [
|
|
1866
1857
|
{ "type": "boolean" },
|
|
@@ -1875,18 +1866,6 @@
|
|
|
1875
1866
|
"description": "Date pattern for date. Tokens: yyyy (2026), yy (26), MMMM (April), MMM (Apr), MM (04), M (4), dd (09), d (9), EEEE (Thursday), EEE (Thu). Text in single quotes and other non-letter characters are literal. Month and weekday names are English, independent of host locale. Defaults to \"M/d/yyyy\" for a current date. PPTX export writes a native current-date field only when its complete value fits within one accepted text line and the pattern matches a PowerPoint en-US date field ('M/d/yyyy'; 'EEEE, MMMM d, yyyy'; 'd MMMM yyyy'; 'MMMM d, yyyy'; 'd-MMM-yy'; 'MMMM yy'; 'MMM-yy'). Other patterns and wrapped fields export as static text with a diagnostic. Full provenance can recover generated-date intent from unchanged supported wrapped dates on OPF reimport; the existing PPTX text remains static.",
|
|
1876
1867
|
"examples": ["MMM d, yyyy", "yyyy-MM-dd", "MMM yyyy", "MMMM d, yyyy"]
|
|
1877
1868
|
},
|
|
1878
|
-
"organization": {
|
|
1879
|
-
"type": "boolean",
|
|
1880
|
-
"description": "Whether to render the primary organization's name from organization (role 'primary', else the first organization)."
|
|
1881
|
-
},
|
|
1882
|
-
"speaker": {
|
|
1883
|
-
"type": "boolean",
|
|
1884
|
-
"description": "Whether to render the primary (first) speaker's name and title from speaker, joined as 'Ada Lovelace, CTO' (just the name when the speaker has no title). It is generated text: without a named speaker the engine reports unresolved-content at this field. PPTX export writes it as static text and import restores the flag from the file's furniture provenance."
|
|
1885
|
-
},
|
|
1886
|
-
"section": {
|
|
1887
|
-
"type": "boolean",
|
|
1888
|
-
"description": "Whether to render the current slide section label."
|
|
1889
|
-
},
|
|
1890
1869
|
"socials": {
|
|
1891
1870
|
"type": "boolean",
|
|
1892
1871
|
"description": "Whether to render the primary organization's social profiles from organization.socials, one line per platform in key order. A handle is formatted through the platform's socialPlatforms record (companyUrlPattern, else profileUrlPattern, else baseUrl, with handlePrefix stripped) and shown as that profile URL without its 'https://' scheme; a value that is already a URL is shown without an 'https://' scheme; an unknown platform key shows the raw value. Exporters link each line to its full URL when one exists. Speaker socials are not rendered by this field."
|
|
@@ -1969,12 +1948,12 @@
|
|
|
1969
1948
|
"items": {
|
|
1970
1949
|
"type": "array",
|
|
1971
1950
|
"items": { "$ref": "#/$defs/ListItem" },
|
|
1972
|
-
"description": "Full-slide
|
|
1951
|
+
"description": "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."
|
|
1973
1952
|
},
|
|
1974
1953
|
"bullets": {
|
|
1975
1954
|
"type": "array",
|
|
1976
1955
|
"items": { "$ref": "#/$defs/BulletItem" },
|
|
1977
|
-
"description": "Full-slide
|
|
1956
|
+
"description": "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)."
|
|
1978
1957
|
},
|
|
1979
1958
|
"numbering": {
|
|
1980
1959
|
"$ref": "#/$defs/NumberingSpec",
|
|
@@ -2187,7 +2166,7 @@
|
|
|
2187
2166
|
},
|
|
2188
2167
|
"section": {
|
|
2189
2168
|
"type": "string",
|
|
2190
|
-
"description": "PowerPoint-style slide section label. Consecutive slides with the same value belong to the same section in presenter view, outlines, and PowerPoint section-aware exports.",
|
|
2169
|
+
"description": "PowerPoint-style slide section label. Consecutive slides with the same value belong to the same section in presenter view, outlines, and PowerPoint section-aware exports. Also the slide-scoped built-in variable '{{slide.section}}', for example in a header text.",
|
|
2191
2170
|
"examples": ["Intro", "Problem", "Solution", "Ask", "Appendix"]
|
|
2192
2171
|
},
|
|
2193
2172
|
"hidden": {
|
|
@@ -2244,7 +2223,7 @@
|
|
|
2244
2223
|
"items": {
|
|
2245
2224
|
"type": "array",
|
|
2246
2225
|
"items": { "$ref": "#/$defs/ListItem" },
|
|
2247
|
-
"description": "
|
|
2226
|
+
"description": "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`.",
|
|
2248
2227
|
"examples": [[
|
|
2249
2228
|
"Sub-second agent latency",
|
|
2250
2229
|
["Drop-in compatible with ", { "text": "OpenAI tool-calling", "bold": true }],
|
|
@@ -2257,7 +2236,7 @@
|
|
|
2257
2236
|
"bullets": {
|
|
2258
2237
|
"type": "array",
|
|
2259
2238
|
"items": { "$ref": "#/$defs/BulletItem" },
|
|
2260
|
-
"description": "
|
|
2239
|
+
"description": "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.",
|
|
2261
2240
|
"examples": [["Sub-second agent latency", "Drop-in compatible with OpenAI tool-calling", "SOC 2 Type II"]]
|
|
2262
2241
|
},
|
|
2263
2242
|
"numbering": {
|
|
@@ -3313,6 +3292,11 @@
|
|
|
3313
3292
|
"fields": {
|
|
3314
3293
|
"$ref": "#/$defs/DatasetFields",
|
|
3315
3294
|
"description": "Dataset tables only: the dataset columns to show, by name and in order. Absent shows every column. An unknown name is a 'dataset-field-unknown' error."
|
|
3295
|
+
},
|
|
3296
|
+
"alt": {
|
|
3297
|
+
"type": "string",
|
|
3298
|
+
"description": "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.",
|
|
3299
|
+
"examples": ["North America grew 46% to $18.1M in Q4, ahead of EMEA at 40%."]
|
|
3316
3300
|
}
|
|
3317
3301
|
}
|
|
3318
3302
|
},
|
|
@@ -3849,7 +3833,7 @@
|
|
|
3849
3833
|
"Composition": {
|
|
3850
3834
|
"type": "object",
|
|
3851
3835
|
"additionalProperties": false,
|
|
3852
|
-
"description": "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.",
|
|
3836
|
+
"description": "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.",
|
|
3853
3837
|
"properties": {
|
|
3854
3838
|
"mode": {
|
|
3855
3839
|
"type": "string",
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { P as Presentation } from './presentation-
|
|
2
|
-
export {
|
|
1
|
+
export { P as Presentation } from './presentation-fb8CZmRq.js';
|
|
2
|
+
export { c as CatalogKind } from './catalog-refs-C4K4y-vh.js';
|
|
3
3
|
export { SchemaName } from './schemas.js';
|
|
4
|
-
export {
|
|
4
|
+
export { F as Finding, a as FindingCategory, b as FindingFix, c as FindingFocus, d as FindingLocation, e as FindingReport, f as FindingSeverity, g as FindingSuggestion, J as JsonPatchOperation, V as ValidationIssue } from './finding-CDQ_wH8j.js';
|
|
5
5
|
import './json-BFSdESOE.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -326,9 +326,9 @@ interface Layout {
|
|
|
326
326
|
description?: string;
|
|
327
327
|
design?: DesignHints;
|
|
328
328
|
/**
|
|
329
|
-
* Ordered regions the layout exposes. This is the single source of truth for what the layout holds: the content kind, the number of body regions and whether it has a title, subtitle or tag are derived from it (layoutContent in @openpresentation/opf), never stored separately. The engine fills 'title', 'subtitle' and 'tag' placeholders from Slide.title, Slide.subtitle and Slide.tag. The other placeholders are content-kind regions that composition uses to size the body and that pickers use to match layouts. Slide content itself lives either in root payload fields or promoted region keys on Slide. Chrome (slide number, footer, date) is not included here; it is owned by Design.header / Design.footer.
|
|
329
|
+
* Ordered regions the layout exposes. This is the single source of truth for what the layout holds: the content kind, the number of body regions and whether it has a title, subtitle or tag are derived from it (layoutContent in @openpresentation/opf, which counts the leaves of placeholder groups), never stored separately. The engine fills 'title', 'subtitle' and 'tag' placeholders from Slide.title, Slide.subtitle and Slide.tag. The other placeholders are content-kind regions that composition uses to size the body and that pickers use to match layouts. An entry may instead be a placeholder group ({ "type": "group", "composition", "placeholders" }) that arranges its own regions inside one cell of this record's composition, so a record can say 'two stacked panels beside a chart' once; groups nest at most three levels. Slide content stays flat: its body payloads fill the leaf regions in reading order (depth first, in array order). Slide content itself lives either in root payload fields, blocks or promoted region keys on Slide. Chrome (slide number, footer, date) is not included here; it is owned by Design.header / Design.footer.
|
|
330
330
|
*/
|
|
331
|
-
placeholders?:
|
|
331
|
+
placeholders?: PlaceholderEntry[];
|
|
332
332
|
/**
|
|
333
333
|
* Free-form labels for filtering and search.
|
|
334
334
|
*/
|
|
@@ -375,7 +375,7 @@ interface DesignHints {
|
|
|
375
375
|
*/
|
|
376
376
|
contentDirection?: ("horizontal" | "vertical");
|
|
377
377
|
/**
|
|
378
|
-
* Where the primary chart sits relative to the other body content. Composition applies it below the slide's and the deck's design.chartPrimary, with the semantics described there.
|
|
378
|
+
* Where the primary chart sits relative to the other body content. Composition applies it below the slide's and the deck's design.chartPrimary, with the semantics described there. It is shorthand for a placeholder group: a record can state the same structure explicitly as a root row or column of the chart and one PlaceholderGroup of the other regions, weighted 3:2.
|
|
379
379
|
*/
|
|
380
380
|
chartPrimary?: ("none" | "top" | "bottom" | "left" | "right");
|
|
381
381
|
/**
|
|
@@ -388,38 +388,16 @@ interface DesignHints {
|
|
|
388
388
|
listBullet?: ("character" | "image");
|
|
389
389
|
}
|
|
390
390
|
/**
|
|
391
|
-
*
|
|
391
|
+
* One entry of a layout's placeholders: a region (Placeholder) or, when its type is 'group', a placeholder group (PlaceholderGroup).
|
|
392
392
|
*
|
|
393
393
|
* This interface was referenced by `Layout`'s JSON-Schema
|
|
394
|
-
* via the `definition` "
|
|
394
|
+
* via the `definition` "PlaceholderEntry".
|
|
395
395
|
*/
|
|
396
|
-
interface
|
|
397
|
-
/**
|
|
398
|
-
* The content kind of the region. This is the one OPF content-kind vocabulary: the same words name a slide's payload fields (text, items, image, video, chart, table, code, metric, quote, timeline). 'title', 'subtitle' and 'tag' are the heading kinds and bind to Slide.title, Slide.subtitle and Slide.tag. 'text' holds text and bullets; 'list' holds items. 'image' is filled by an image payload and 'video' by a video payload. 'metric', 'quote', 'timeline', 'chart', 'table' and 'code' are filled by the payload of the same name; a metric region shows the metric payload with its optional label, description, unit, delta, trend and sentiment.
|
|
399
|
-
*/
|
|
400
|
-
type: ("title" | "subtitle" | "tag" | "text" | "list" | "image" | "video" | "chart" | "table" | "code" | "metric" | "quote" | "timeline");
|
|
401
|
-
placement?: ImagePlacement;
|
|
396
|
+
interface PlaceholderEntry {
|
|
402
397
|
[k: string]: unknown;
|
|
403
398
|
}
|
|
404
399
|
/**
|
|
405
|
-
*
|
|
406
|
-
*/
|
|
407
|
-
interface ImagePlacement {
|
|
408
|
-
/**
|
|
409
|
-
* The slide edge the image bleeds to. In a right-to-left deck 'left' is the start side, drawn at the right.
|
|
410
|
-
*/
|
|
411
|
-
edge: ("left" | "right" | "top" | "bottom");
|
|
412
|
-
/**
|
|
413
|
-
* Share of the slide width (left, right) or height (top, bottom) given to the band. Default 0.5.
|
|
414
|
-
*/
|
|
415
|
-
size?: number;
|
|
416
|
-
/**
|
|
417
|
-
* Draw the frame inside the slide padding on every side of the band instead of edge to edge. Default false.
|
|
418
|
-
*/
|
|
419
|
-
inset?: boolean;
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* 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.
|
|
400
|
+
* Portable dynamic composition. Slide fields override the resolved layout. Nested groups (placeholder groups here, content groups in a slide) arrange their children independently, inheriting only minFontSize and overflow. Explicit promoted regions retain their positions.
|
|
423
401
|
*
|
|
424
402
|
* This interface was referenced by `Layout`'s JSON-Schema
|
|
425
403
|
* via the `definition` "Composition".
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { T as TextMeasurement } from './composition-
|
|
3
|
-
import {
|
|
1
|
+
import { b as Catalog } from './catalog-refs-C4K4y-vh.js';
|
|
2
|
+
import { T as TextMeasurement } from './composition-BbZ_9C-c.js';
|
|
3
|
+
import { f as FindingSeverity, e as FindingReport } from './finding-CDQ_wH8j.js';
|
|
4
4
|
import { J as JsonPrimitive } from './json-BFSdESOE.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -134,9 +134,18 @@ interface BuiltinVariableInfo {
|
|
|
134
134
|
kind: VariableKind;
|
|
135
135
|
/** Short label for pickers, such as "Speaker name". */
|
|
136
136
|
label: string;
|
|
137
|
-
/**
|
|
137
|
+
/**
|
|
138
|
+
* `deck` for a value read once from the document; `slide` for `slide.number`, `slide.section` and
|
|
139
|
+
* `deck.slideCount`, which vary per slide and resolve as each slide is composed (inline tokens only).
|
|
140
|
+
*/
|
|
141
|
+
scope: "deck" | "slide";
|
|
142
|
+
/** The value the document gives it, when it has one (a string, an Asset or the list of names). Never set for a slide-scoped built-in. */
|
|
138
143
|
value?: unknown;
|
|
139
|
-
/**
|
|
144
|
+
/**
|
|
145
|
+
* True when the document has a source value for it. Unavailable built-ins resolve to nothing. A slide-scoped
|
|
146
|
+
* built-in is available when every slide gives it a value: always for `slide.number` and `deck.slideCount`, and
|
|
147
|
+
* for `slide.section` when at least one slide has a section.
|
|
148
|
+
*/
|
|
140
149
|
available: boolean;
|
|
141
150
|
/** Every place the document uses it. */
|
|
142
151
|
uses: VariableUse[];
|
|
@@ -144,7 +153,8 @@ interface BuiltinVariableInfo {
|
|
|
144
153
|
/**
|
|
145
154
|
* The built-in variables of a deck, for pickers and agents: the generic names (`deck.*`, `speaker.*`, `speakers`,
|
|
146
155
|
* `organization.*`) first, then the id-addressed ones (`speaker.<id>.*`, `organization.<id>.*`) of each speaker and
|
|
147
|
-
* organization that has an id
|
|
156
|
+
* organization that has an id, then the slide-scoped `slide.number`, `slide.section` and `deck.slideCount` (scope
|
|
157
|
+
* `slide`, no value). Each carries its kind, current source value and where the document uses it.
|
|
148
158
|
*/
|
|
149
159
|
declare function listBuiltinVariables(presentation: unknown): BuiltinVariableInfo[];
|
|
150
160
|
|
|
@@ -203,7 +213,8 @@ interface Contract {
|
|
|
203
213
|
/**
|
|
204
214
|
* What the layout rules read from a fonts handle (the object `loadFonts()` of the renderer returns): the host's
|
|
205
215
|
* measured text widths. Without one, composition uses core's portable estimate. A function receives the zero-based
|
|
206
|
-
* slide index, so a host can supply a script-aware measurement per slide.
|
|
216
|
+
* slide index, so a host can supply a script-aware measurement per slide. A measurement with `forScripts` (a script
|
|
217
|
+
* planner, such as the renderer's) is asked for each slide's script-aware measurement, the one the engines measure with.
|
|
207
218
|
*/
|
|
208
219
|
interface ValidateFonts {
|
|
209
220
|
textMeasurement?: TextMeasurement | ((slideIndex: number) => TextMeasurement | undefined);
|
|
@@ -273,4 +284,4 @@ interface ValidationReport extends FindingReport {
|
|
|
273
284
|
unfilledVariables?: string[];
|
|
274
285
|
}
|
|
275
286
|
|
|
276
|
-
export { variableDeclarations as A, type BuiltinVariableInfo as B, type Contract as C, DEFAULT_VARIABLE_DATE_FORMAT as D, OPFVariableError as O, type ResolveVariablesOptions as R,
|
|
287
|
+
export { variableDeclarations as A, type BuiltinVariableInfo as B, type Contract as C, DEFAULT_VARIABLE_DATE_FORMAT as D, OPFVariableError as O, type ResolveVariablesOptions as R, VARIABLE_KINDS as V, type ResolveVariablesResult as a, type ValidateFonts as b, type ValidateOptions as c, type ValidationCategory as d, type ValidationChecks as e, type ValidationReport as f, type ValidationRuleCost as g, type ValidationRuleInfo as h, type ValidationThresholds as i, type VariableDeclaration as j, type VariableDiagnostic as k, type VariableDiagnosticCode as l, type VariableDiagnosticSeverity as m, type VariableInfo as n, type VariableKind as o, type VariableUse as p, type VariableUseForm as q, type VariableValues as r, coerceVariableValue as s, formatVariableNumber as t, hasContentVariables as u, isTemplate as v, listBuiltinVariables as w, listVariables as x, resolveVariables as y, validationCategories as z };
|
package/dist/validator.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { a as CatalogRecordKind } from './catalog-schemas-
|
|
2
|
-
import {
|
|
3
|
-
import { P as Presentation } from './presentation-
|
|
4
|
-
import { i as ValidationThresholds, h as ValidationRuleInfo,
|
|
5
|
-
export { C as Contract,
|
|
6
|
-
import './catalog-refs-
|
|
1
|
+
import { a as CatalogRecordKind } from './catalog-schemas-g7RFQBdc.js';
|
|
2
|
+
import { F as Finding } from './finding-CDQ_wH8j.js';
|
|
3
|
+
import { P as Presentation } from './presentation-fb8CZmRq.js';
|
|
4
|
+
import { i as ValidationThresholds, h as ValidationRuleInfo, f as ValidationReport, c as ValidateOptions } from './validation-types-iZbXfES6.js';
|
|
5
|
+
export { C as Contract, b as ValidateFonts, d as ValidationCategory, e as ValidationChecks, g as ValidationRuleCost, z as validationCategories } from './validation-types-iZbXfES6.js';
|
|
6
|
+
import './catalog-refs-C4K4y-vh.js';
|
|
7
7
|
import './schemas.js';
|
|
8
8
|
import './json-BFSdESOE.js';
|
|
9
|
-
import './composition-
|
|
10
|
-
import './chart-data-
|
|
9
|
+
import './composition-BbZ_9C-c.js';
|
|
10
|
+
import './chart-data-DTxdRRT1.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* The series palette opf-render and opf-pptx draw charts with (`CHART_COLORS`), in series order. A host with
|
package/dist/validator.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { DEFAULT_CHART_PALETTE, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-
|
|
2
|
-
export { promotedRegionKeys } from './chunk-
|
|
1
|
+
export { DEFAULT_CHART_PALETTE, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-NLNYNBTS.js';
|
|
2
|
+
export { promotedRegionKeys } from './chunk-CW7GEAV3.js';
|
|
3
3
|
import './chunk-TRDXRRQK.js';
|
|
4
4
|
import './chunk-SPFV27O5.js';
|
|
5
|
-
import './chunk-
|
|
5
|
+
import './chunk-RA64UQKI.js';
|
package/dist/yaml.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { P as Presentation } from './presentation-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import './composition-
|
|
6
|
-
import './chart-data-
|
|
1
|
+
import { b as Catalog } from './catalog-refs-C4K4y-vh.js';
|
|
2
|
+
import { P as Presentation } from './presentation-fb8CZmRq.js';
|
|
3
|
+
import { c as ValidateOptions, f as ValidationReport } from './validation-types-iZbXfES6.js';
|
|
4
|
+
import { F as Finding, d as FindingLocation } from './finding-CDQ_wH8j.js';
|
|
5
|
+
import './composition-BbZ_9C-c.js';
|
|
6
|
+
import './chart-data-DTxdRRT1.js';
|
|
7
7
|
import './json-BFSdESOE.js';
|
|
8
8
|
|
|
9
9
|
/** A finding located in the YAML source: `yaml/<rule>` syntax and dialect errors (category `format`) and the OPF findings of the parsed deck. */
|