@openpresentation/opf 0.22.1 → 0.23.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 (59) hide show
  1. package/dist/browser.js +16 -16
  2. package/dist/{chunk-MAJHCGOW.js → chunk-3FWUA763.js} +4 -4
  3. package/dist/{chunk-SPCONMIY.js → chunk-4I3XPRAO.js} +1 -1
  4. package/dist/{chunk-7XNAMCGT.js → chunk-B2XALDGS.js} +6 -6
  5. package/dist/{chunk-LKMR3OLD.js → chunk-BOWBPSFF.js} +26 -9
  6. package/dist/{chunk-YUIEWE5B.js → chunk-CNOLYQ4C.js} +2 -2
  7. package/dist/{chunk-2SENTA2R.js → chunk-F55S5HDP.js} +1 -1
  8. package/dist/{chunk-23MOKE4B.js → chunk-L67MPTPZ.js} +43 -9
  9. package/dist/{chunk-VKNFZEMG.js → chunk-N3ZPLGK5.js} +137 -16
  10. package/dist/{chunk-KUNXFN7B.js → chunk-NIA2WEXN.js} +1 -1
  11. package/dist/{chunk-MG34DCDB.js → chunk-PLV7P236.js} +2 -2
  12. package/dist/{chunk-3T7MNRBY.js → chunk-TILQBXPZ.js} +1 -1
  13. package/dist/{chunk-BULGAKBY.js → chunk-TMOQ532D.js} +2 -2
  14. package/dist/{chunk-MLMTXXM4.js → chunk-VHNG75IH.js} +5 -5
  15. package/dist/{chunk-YSJRBRHB.js → chunk-VIOSRKMA.js} +1 -1
  16. package/dist/{chunk-SBWIZSPB.js → chunk-XKUEEDDN.js} +5 -5
  17. package/dist/{chunk-X3PQMMAY.js → chunk-YMBA3V2O.js} +1 -1
  18. package/dist/{chunk-3UAVON3O.js → chunk-ZIRSAFRC.js} +99 -0
  19. package/dist/{composition-CkHn6JrM.d.ts → composition-qX-igJe5.d.ts} +147 -15
  20. package/dist/composition.d.ts +1 -1
  21. package/dist/composition.js +1 -1
  22. package/dist/conversion-CY34E5WI.js +19 -0
  23. package/dist/{conversion-CSD65VLi.d.ts → conversion-t-YYHWL-.d.ts} +17 -5
  24. package/dist/convert.d.ts +2 -2
  25. package/dist/convert.js +7 -7
  26. package/dist/data.d.ts +1 -1
  27. package/dist/data.js +2 -2
  28. package/dist/{deck-report-vnWmXBjq.d.ts → deck-report-CJ6gd_6-.d.ts} +2 -2
  29. package/dist/deck.d.ts +5 -5
  30. package/dist/deck.js +10 -10
  31. package/dist/diff.js +5 -5
  32. package/dist/docs.js +9 -9
  33. package/dist/examples.d.ts +1 -1
  34. package/dist/examples.js +213 -0
  35. package/dist/format.js +2 -2
  36. package/dist/index.d.ts +11 -11
  37. package/dist/index.js +20 -20
  38. package/dist/markdown.d.ts +3 -3
  39. package/dist/markdown.js +7 -7
  40. package/dist/node-engine.d.ts +7 -7
  41. package/dist/node-engine.js +20 -20
  42. package/dist/{pagination-C4jzAtFy.d.ts → pagination-LiWxhbsz.d.ts} +3 -1
  43. package/dist/pagination.d.ts +2 -2
  44. package/dist/pagination.js +4 -4
  45. package/dist/patch.js +4 -4
  46. package/dist/{presentation-fN6tORPZ.d.ts → presentation-Dn-fm0iY.d.ts} +35 -0
  47. package/dist/repo-readme.js +1 -1
  48. package/dist/schemas.d.ts +2 -0
  49. package/dist/schemas.js +1 -1
  50. package/dist/spec/schemas/opf.schema.json +40 -0
  51. package/dist/types.d.ts +1 -1
  52. package/dist/{validation-types-B21fZfb2.d.ts → validation-types-CzPKoKWo.d.ts} +1 -1
  53. package/dist/{validator-Cflv4F9e.d.ts → validator-BuAV_HUo.d.ts} +2 -2
  54. package/dist/validator.d.ts +4 -4
  55. package/dist/validator.js +3 -3
  56. package/dist/yaml.d.ts +3 -3
  57. package/dist/yaml.js +7 -7
  58. package/package.json +5 -5
  59. package/dist/conversion-JDFXRXTK.js +0 -19
package/dist/browser.js CHANGED
@@ -1,20 +1,20 @@
1
- import { OPFApiError } from './chunk-MAJHCGOW.js';
2
- export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, edit, embed, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, stats, updateFromCatalog } from './chunk-MAJHCGOW.js';
1
+ import { OPFApiError } from './chunk-3FWUA763.js';
2
+ export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, edit, embed, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, stats, updateFromCatalog } from './chunk-3FWUA763.js';
3
3
  export { specFileEntries, specFileKinds, specFilePaths } from './chunk-UJSAR6GF.js';
4
- export { OPFDataImportError, ingest, parseTabularData } from './chunk-SPCONMIY.js';
5
- export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-MLMTXXM4.js';
6
- export { fromMarkdown, toMarkdown } from './chunk-SBWIZSPB.js';
7
- import './chunk-7XNAMCGT.js';
8
- export { OPFMarkdownError } from './chunk-3T7MNRBY.js';
9
- export { diff, merge } from './chunk-BULGAKBY.js';
10
- export { OPFPatchError, OPFPatchValidationError, applyPatch } from './chunk-YSJRBRHB.js';
11
- export { OPFFormatError, format } from './chunk-X3PQMMAY.js';
12
- export { OPFPaginationError, paginate, paginateSlide } from './chunk-YUIEWE5B.js';
13
- import './chunk-KUNXFN7B.js';
14
- import './chunk-2SENTA2R.js';
15
- export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-23MOKE4B.js';
16
- export { CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, LOGO_SHAPES, OPFCatalogsOptionError, OPFUnresolvedReferenceError, OPFVariableError, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, VARIABLE_KINDS, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, parseReference, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveReference, resolveSlideVariables, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unresolvedReference, unusedDatasets, variableDeclarations } from './chunk-VKNFZEMG.js';
17
- export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-3UAVON3O.js';
4
+ export { OPFDataImportError, ingest, parseTabularData } from './chunk-4I3XPRAO.js';
5
+ export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-VHNG75IH.js';
6
+ export { fromMarkdown, toMarkdown } from './chunk-XKUEEDDN.js';
7
+ import './chunk-B2XALDGS.js';
8
+ export { OPFMarkdownError } from './chunk-TILQBXPZ.js';
9
+ export { diff, merge } from './chunk-TMOQ532D.js';
10
+ export { OPFPatchError, OPFPatchValidationError, applyPatch } from './chunk-VIOSRKMA.js';
11
+ export { OPFFormatError, format } from './chunk-YMBA3V2O.js';
12
+ export { OPFPaginationError, paginate, paginateSlide } from './chunk-CNOLYQ4C.js';
13
+ import './chunk-NIA2WEXN.js';
14
+ import './chunk-F55S5HDP.js';
15
+ export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-L67MPTPZ.js';
16
+ export { CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, LOGO_SHAPES, OPFCatalogsOptionError, OPFUnresolvedReferenceError, OPFVariableError, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, VARIABLE_KINDS, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, parseReference, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveReference, resolveSlideVariables, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unresolvedReference, unusedDatasets, variableDeclarations } from './chunk-N3ZPLGK5.js';
17
+ export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-ZIRSAFRC.js';
18
18
  export { FONT_POLICY, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './chunk-F7PLNWHQ.js';
19
19
 
20
20
  // src/browser.ts
@@ -1,7 +1,7 @@
1
- import { OPFDataImportError, parseTabularData } from './chunk-SPCONMIY.js';
2
- import { applyPatchWithInverse } from './chunk-YSJRBRHB.js';
3
- import { validate, OPFValidationError } from './chunk-23MOKE4B.js';
4
- import { embeddedCopy, checkCatalogsOption, catalogReferenceSites, parseReference, catalogGroupDeclared, resolveReference, dottedPath, unresolvedReference, recordReferenceSites, catalogGroupSource, registeredCatalog, catalogKinds, CATALOG_GROUP_PATTERN, isRecord, visitContentPayloads, annotationText, listVariables, resolveVariables, LOGO_SHAPES, resolveDesignRecords, resolveFontFamilies, resolveCanvasDimensions, imageBackground } from './chunk-VKNFZEMG.js';
1
+ import { OPFDataImportError, parseTabularData } from './chunk-4I3XPRAO.js';
2
+ import { applyPatchWithInverse } from './chunk-VIOSRKMA.js';
3
+ import { validate, OPFValidationError } from './chunk-L67MPTPZ.js';
4
+ import { embeddedCopy, checkCatalogsOption, catalogReferenceSites, parseReference, catalogGroupDeclared, resolveReference, dottedPath, unresolvedReference, recordReferenceSites, catalogGroupSource, registeredCatalog, catalogKinds, CATALOG_GROUP_PATTERN, isRecord, visitContentPayloads, annotationText, listVariables, resolveVariables, LOGO_SHAPES, resolveDesignRecords, resolveFontFamilies, resolveCanvasDimensions, imageBackground } from './chunk-N3ZPLGK5.js';
5
5
 
6
6
  // src/api-errors.ts
7
7
  var OPFApiError = class extends Error {
@@ -1,4 +1,4 @@
1
- import { chartNumber } from './chunk-VKNFZEMG.js';
1
+ import { chartNumber } from './chunk-N3ZPLGK5.js';
2
2
 
3
3
  // src/data.ts
4
4
  var OPFDataImportError = class extends Error {
@@ -1,9 +1,9 @@
1
- import { NOT_CHECKED, Ctx } from './chunk-3T7MNRBY.js';
2
- import { sortPresentationKeys } from './chunk-X3PQMMAY.js';
3
- import { same } from './chunk-2SENTA2R.js';
4
- import { validate } from './chunk-23MOKE4B.js';
5
- import { checkCatalogsOption } from './chunk-VKNFZEMG.js';
6
- import { presentation } from './chunk-3UAVON3O.js';
1
+ import { NOT_CHECKED, Ctx } from './chunk-TILQBXPZ.js';
2
+ import { sortPresentationKeys } from './chunk-YMBA3V2O.js';
3
+ import { same } from './chunk-F55S5HDP.js';
4
+ import { validate } from './chunk-L67MPTPZ.js';
5
+ import { checkCatalogsOption } from './chunk-N3ZPLGK5.js';
6
+ import { presentation } from './chunk-ZIRSAFRC.js';
7
7
  import { Parser, parseDocument, isMap, Document, visit, isScalar, isAlias, isSeq } from 'yaml';
8
8
 
9
9
  var MAX_ALIAS_COUNT = 100;
@@ -1,8 +1,8 @@
1
- import { defaultCatalogs } from './chunk-MG34DCDB.js';
2
- import { localAssetSources, OPFApiError, parseSlideSelection, OPFExportError, asApiError, OPFImportError } from './chunk-MAJHCGOW.js';
3
- import { deckFormatOf, readDeckReport, stringify } from './chunk-MLMTXXM4.js';
4
- import { paginate } from './chunk-YUIEWE5B.js';
5
- import { validate, OPFValidationError } from './chunk-23MOKE4B.js';
1
+ import { defaultCatalogs } from './chunk-PLV7P236.js';
2
+ import { localAssetSources, OPFApiError, parseSlideSelection, OPFExportError, asApiError, OPFImportError } from './chunk-3FWUA763.js';
3
+ import { deckFormatOf, readDeckReport, stringify } from './chunk-VHNG75IH.js';
4
+ import { paginate } from './chunk-CNOLYQ4C.js';
5
+ import { validate, OPFValidationError } from './chunk-L67MPTPZ.js';
6
6
  import { link, stat, readdir, lstat, readFile, open, unlink, mkdir, rename } from 'fs/promises';
7
7
  import path6 from 'path';
8
8
  import { readFileSync, statSync, realpathSync } from 'fs';
@@ -117,7 +117,19 @@ function localAssetProblems(deck, root) {
117
117
  }
118
118
  var RENDER_PACKAGE = "@openpresentation/opf-render";
119
119
  var PPTX_PACKAGE = "@openpresentation/opf-pptx";
120
- var PEER_RANGES = { [RENDER_PACKAGE]: "^0.22.0", [PPTX_PACKAGE]: "^0.22.0" };
120
+ var PEER_RANGES = { [RENDER_PACKAGE]: "^0.23.0", [PPTX_PACKAGE]: "^0.23.0" };
121
+ var PPTX_TEXT_OPTIONS_FROM = "0.22.0";
122
+ var numbers = (version) => version.replace(/[-+].*$/, "").split(".").map((part) => Number.parseInt(part, 10) || 0);
123
+ function atLeast(version, minimum) {
124
+ const [a, b] = [numbers(version), numbers(minimum)];
125
+ for (let i = 0; i < 3; i++) if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0);
126
+ return true;
127
+ }
128
+ function requirePptxOptions(pptx, options, flags = false) {
129
+ const asked = [options.bodyText === "native" ? flags ? "--body-text native" : 'bodyText: "native"' : void 0, options.slideNumbers ? flags ? "--slide-numbers" : "slideNumbers" : void 0].filter(Boolean);
130
+ if (asked.length && pptx.version !== "unknown" && !atLeast(pptx.version, PPTX_TEXT_OPTIONS_FROM))
131
+ throw new OPFApiError(`${asked.join(" and ")} needs ${pptx.name}@${PPTX_TEXT_OPTIONS_FROM} or later; ${pptx.version} is installed and would ignore it.`, "peer-too-old", { details: { package: pptx.name } });
132
+ }
121
133
  var RENDER_EXTRAS = {
122
134
  /** The faces of the office pack, which the CLI and `convert` always load (every format). */
123
135
  fonts: ["@expo-google-fonts/roboto@0.4.3", "@expo-google-fonts/roboto-mono@0.4.2", "@expo-google-fonts/caladea@0.4.2", "@expo-google-fonts/arimo@0.4.3", "@expo-google-fonts/tinos@0.4.2", "@expo-google-fonts/cousine@0.4.3", "@expo-google-fonts/gelasio@0.4.1", "@expo-google-fonts/noto-sans@0.4.2"],
@@ -618,9 +630,11 @@ function resolveExportOptions(options) {
618
630
  const charts = oneOf("charts", options.charts, ["auto", "native", "picture"]);
619
631
  const provenance = oneOf("provenance", options.provenance, ["full", "references-only", "none"]);
620
632
  const images = oneOf("images", options.images, ["compatible", "preserve"]);
633
+ const bodyText = oneOf("bodyText", options.bodyText, ["measured", "native"]);
634
+ const slideNumbers = oneOf("slideNumbers", options.slideNumbers, ["static", "live"]);
621
635
  const text = oneOf("text", options.text, EXPORT_TEXT);
622
636
  if (options.raster && format !== "pdf") throw invalid("raster applies to format pdf.");
623
- if ((charts !== void 0 || provenance !== void 0 || images !== void 0) && format !== "pptx") throw invalid("charts, provenance and images apply to format pptx.");
637
+ if ((charts !== void 0 || provenance !== void 0 || images !== void 0 || bodyText !== void 0 || slideNumbers !== void 0) && format !== "pptx") throw invalid("charts, provenance, images, bodyText and slideNumbers apply to format pptx.");
624
638
  if (options.scale !== void 0 && format !== "png" && format !== "pdf") throw invalid("scale applies to format png (and raster pdf).");
625
639
  if (options.includeHidden && format === "pptx") throw invalid("includeHidden applies to per-slide image and PDF output; the PPTX keeps a hidden slide as a hidden slide.");
626
640
  if (options.slides !== void 0 && format === "pptx") throw invalid("slides is not available for pptx: the whole presentation is exported.");
@@ -705,6 +719,7 @@ async function drawWith(presentation, handle, options, ctx, environment) {
705
719
  const run = (extra) => ({ fonts: fontSummary(), ...pagination ? { pagination } : {}, skippedHidden, ...extra });
706
720
  try {
707
721
  if (format === "pptx") {
722
+ requirePptxOptions(pptx, options, ctx.flags);
708
723
  const module = pptx.module;
709
724
  const bytes = await module.toPptx(deck, {
710
725
  fonts: handle,
@@ -718,6 +733,8 @@ async function drawWith(presentation, handle, options, ctx, environment) {
718
733
  ...options.charts ? { chartex: options.charts === "picture" ? "fallback" : options.charts } : {},
719
734
  ...options.provenance ? { provenance: options.provenance === "none" ? false : options.provenance } : {},
720
735
  ...options.images ? { imageFormat: options.images } : {},
736
+ ...options.bodyText ? { bodyText: options.bodyText } : {},
737
+ ...options.slideNumbers ? { slideNumberFields: options.slideNumbers } : {},
721
738
  ...date ? { date } : {}
722
739
  });
723
740
  return run({ files: [{ name: `${stem}.pptx`, type: MEDIA2.pptx, bytes }], skippedHidden: [] });
@@ -898,7 +915,7 @@ function targetOf(output, options, flags) {
898
915
  checkOutputPattern(output, exported === "png" || exported === "svg");
899
916
  return exported ? { kind: "export", format: exported, zip: false } : { kind: "deck", format: deck };
900
917
  }
901
- var EXPORT_ONLY = ["slides", "includeHidden", "paginate", "scale", "raster", "text", "charts", "provenance", "images", "date", "fonts", "assetDir"];
918
+ var EXPORT_ONLY = ["slides", "includeHidden", "paginate", "scale", "raster", "text", "charts", "provenance", "images", "bodyText", "slideNumbers", "date", "fonts", "assetDir"];
902
919
  var given = (value) => value !== void 0 && value !== false && !(Array.isArray(value) && value.length === 0);
903
920
  function checkApplicable(source, target, options, flags) {
904
921
  const name = (key) => flags ? `--${key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}` : key;
@@ -911,7 +928,7 @@ function checkApplicable(source, target, options, flags) {
911
928
  }
912
929
  const format = target.format;
913
930
  if (given(options.raster) && format !== "pdf") throw invalid2(`${name("raster")} applies to pdf output.`);
914
- if ((options.charts !== void 0 || options.provenance !== void 0 || options.images !== void 0) && format !== "pptx") throw invalid2(`${names("charts", "provenance", "images")} apply to pptx output.`);
931
+ if ((options.charts !== void 0 || options.provenance !== void 0 || options.images !== void 0 || options.bodyText !== void 0 || options.slideNumbers !== void 0) && format !== "pptx") throw invalid2(`${names("charts", "provenance", "images", "bodyText", "slideNumbers")} apply to pptx output.`);
915
932
  if (options.scale !== void 0 && format !== "png" && format !== "pdf") throw invalid2(`${name("scale")} applies to png output (and raster pdf).`);
916
933
  if (given(options.includeHidden) && format === "pptx") throw invalid2(`${name("includeHidden")} applies to per-slide image and PDF output; the PPTX keeps a hidden slide as a hidden slide.`);
917
934
  if (options.slides !== void 0 && format === "pptx") throw invalid2(`${name("slides")} is not available for pptx output: the whole presentation is exported.`);
@@ -1,5 +1,5 @@
1
- import { assertValid, resolveSlideScriptMeasurement, resolveSlideContext } from './chunk-23MOKE4B.js';
2
- import { resolveSlideVariables, checkCatalogsOption, usesSlideBuiltin, composeSlide, codeHighlightSlice, tableRowBoundaries, visitContentPayloads, regionAccepts, slideTokenSpans, sliceNumberedItems } from './chunk-VKNFZEMG.js';
1
+ import { assertValid, resolveSlideScriptMeasurement, resolveSlideContext } from './chunk-L67MPTPZ.js';
2
+ import { resolveSlideVariables, checkCatalogsOption, usesSlideBuiltin, composeSlide, codeHighlightSlice, tableRowBoundaries, visitContentPayloads, regionAccepts, slideTokenSpans, sliceNumberedItems } from './chunk-N3ZPLGK5.js';
3
3
 
4
4
  // src/pagination.ts
5
5
  var OPFPaginationError = class extends Error {
@@ -1,4 +1,4 @@
1
- import { validate } from './chunk-23MOKE4B.js';
1
+ import { validate } from './chunk-L67MPTPZ.js';
2
2
 
3
3
  // src/convert/shared.ts
4
4
  var CONTENT_KEYS = ["text", "items", "bullets", "image", "video", "chart", "table", "code", "metric", "quote", "timeline"];
@@ -1,5 +1,5 @@
1
- import { promotedRegionKeys, VARIABLE_KINDS, resolveChartData, chartPaletteForFill, chartSeriesPalette, normalizeHexColor, resolveChartColors, colorContrast, imageBackground, tableGrid, timelineTextColor, LOGO_SHAPES, visitContentPayloads, readingRows, visualReadingOrder, intrinsicImageSize, resolveReference, textWidthMeasurer, resolveColorRef, resolveDesignRecords, resolveFontFamilies, checkCatalogsOption, provenanceOf, unresolvedReference, OPFUnresolvedReferenceError, resolveColorRoles, resolveCanvasDimensions, resolveSlideVariables, defaultSlideBackground, isRecord, hasContentVariables, isTemplate, instantiateForValidation, layoutTemplateIssues, resolveScriptFonts, catalogReferenceSites, parseReference, catalogGroupDeclared, pointerPath, unusedDatasets, MAX_COMPOSITION_DEPTH, datasetDiagnostics, pathFor, catalogRecords, collectCitations, numberingFindings, walkCitationRuns, resolveTableData, resolveChartOptions, chartOptionTarget, codeHighlightLines, chartNumberFixesByCell, catalogKinds, catalogGroupSource, registeredCatalog, OPFCompositionError, composeSlide } from './chunk-VKNFZEMG.js';
2
- import { schemas, schemaEntries } from './chunk-3UAVON3O.js';
1
+ import { promotedRegionKeys, VARIABLE_KINDS, resolveChartData, chartPaletteForFill, chartSeriesPalette, normalizeHexColor, resolveChartColors, colorContrast, imageBackground, tableGrid, timelineTextColor, LOGO_SHAPES, visitContentPayloads, readingRows, visualReadingOrder, intrinsicImageSize, resolveReference, textWidthMeasurer, resolveColorRef, resolveDesignRecords, resolveFontFamilies, checkCatalogsOption, provenanceOf, unresolvedReference, OPFUnresolvedReferenceError, resolveColorRoles, resolveCanvasDimensions, resolveSlideVariables, normalizeColorVariant, isRecord, hasContentVariables, isTemplate, instantiateForValidation, layoutTemplateIssues, resolveScriptFonts, defaultSlideBackground, catalogReferenceSites, parseReference, catalogGroupDeclared, pointerPath, unusedDatasets, MAX_COMPOSITION_DEPTH, datasetDiagnostics, pathFor, catalogRecords, collectCitations, numberingFindings, walkCitationRuns, resolveTableData, resolveChartOptions, chartOptionTarget, codeHighlightLines, chartNumberFixesByCell, catalogKinds, catalogGroupSource, registeredCatalog, OPFCompositionError, composeSlide } from './chunk-N3ZPLGK5.js';
2
+ import { schemas, schemaEntries } from './chunk-ZIRSAFRC.js';
3
3
  import Ajv2020 from 'ajv/dist/2020.js';
4
4
  import addFormats from 'ajv-formats';
5
5
  import { parseTree, printParseErrorCode, getNodePath } from 'jsonc-parser';
@@ -1230,9 +1230,9 @@ function simulateVision(hex, model) {
1230
1230
  }
1231
1231
  var PAGE = "#FFFFFF";
1232
1232
  var colorFrom = (scheme, slot, fallback) => typeof slot === "string" ? slot.startsWith("#") ? normalizeHexColor(slot) ?? fallback : normalizeHexColor(scheme[slot]) ?? fallback : fallback;
1233
- function backdropOf(definition, scheme, text, variables) {
1233
+ function backdropOf(definition, scheme, text, variables, canvasColor) {
1234
1234
  const resolve2 = (value, fallback) => backgroundColorRef(value, scheme, variables, fallback);
1235
- const canvas = defaultSlideBackground(scheme);
1235
+ const canvas = canvasColor ?? defaultSlideBackground(scheme);
1236
1236
  if (!definition) return { kind: "solid", color: canvas };
1237
1237
  if (imageBackground(definition)) return { kind: "image", opacity: imageBackground(definition)?.opacity ?? 1, base: PAGE };
1238
1238
  if (typeof definition === "string") return { kind: "solid", color: colorFrom(scheme, definition, canvas) };
@@ -1299,6 +1299,34 @@ function decisionColor(definition, scheme, variables = {}) {
1299
1299
  return void 0;
1300
1300
  }
1301
1301
  }
1302
+ var THEME_SLOTS = /* @__PURE__ */ new Set(["light1", "light2", "dark1", "dark2"]);
1303
+ function colorChoice(levels, scheme, variables = {}) {
1304
+ let variantOnly = false;
1305
+ let picture;
1306
+ for (const level of levels) {
1307
+ const definition = level.background;
1308
+ const slot = typeof definition === "string" ? definition : rec(definition).type === "theme" ? rec(definition).slot : void 0;
1309
+ const themeSlot = THEME_SLOTS.has(slot) ? slot : void 0;
1310
+ const isPicture = imageBackground(definition) !== void 0 || rec(definition).type === "gradient";
1311
+ const variant = normalizeColorVariant(level.variant);
1312
+ if (variant) {
1313
+ const fill = definition !== void 0 && !variantOnly && !themeSlot && !isPicture ? decisionColor(definition, scheme, variables) : void 0;
1314
+ const own2 = definition !== void 0 && !variantOnly && !themeSlot;
1315
+ return { variant, ...fill ? { background: fill } : {}, drawn: variantOnly ? picture : { definition: own2 ? definition : void 0 } };
1316
+ }
1317
+ if (variantOnly || definition === void 0 || definition === null || definition === false) continue;
1318
+ if (themeSlot) return { variant: { background: themeSlot } };
1319
+ if (isPicture) {
1320
+ const tone = rec(definition).tone;
1321
+ if (tone === "dark" || tone === "light") return { variant: { background: tone === "dark" ? "dark1" : "light1" } };
1322
+ variantOnly = true;
1323
+ picture = { definition };
1324
+ continue;
1325
+ }
1326
+ return { background: decisionColor(definition, scheme, variables) };
1327
+ }
1328
+ return {};
1329
+ }
1302
1330
  function resolveDesign(document, index, context) {
1303
1331
  const deck = rec(document.design), own2 = rec(rec(rec(document.slides)[index]).design);
1304
1332
  const { options, diagnostics, resolved } = context;
@@ -1307,11 +1335,12 @@ function resolveDesign(document, index, context) {
1307
1335
  const fontDiagnostic = diagnostics.find((diagnostic) => diagnostic.kind === "fontSchemes");
1308
1336
  const dimensions = { width: options.width, height: options.height };
1309
1337
  const variables = rec(document.variables);
1310
- const roles = resolveColorRoles(colorScheme, { background: decisionColor(own2.background ?? deck.background ?? theme.background, colorScheme, variables) });
1338
+ const choice = colorChoice([own2, deck, theme], colorScheme, variables);
1339
+ const roles = resolveColorRoles(colorScheme, { background: choice.background, variant: choice.variant });
1311
1340
  const dark = roles.dark;
1312
1341
  const text = roles.text;
1313
- const backdrop = backdropOf(own2.background ?? deck.background ?? theme.background, colorScheme, text, variables);
1314
- const picture = imageBackground(own2.background ?? deck.background ?? theme.background);
1342
+ const backdrop = backdropOf(choice.drawn ? choice.drawn.definition : own2.background ?? deck.background ?? theme.background, colorScheme, text, variables, roles.map.bg1 === "light1" ? void 0 : roles.background);
1343
+ const picture = imageBackground(choice.drawn ? choice.drawn.definition : own2.background ?? deck.background ?? theme.background);
1315
1344
  const backgroundImage = picture && own2.background !== void 0 ? { source: picture.src, fit: picture.fit, path: `/slides/${index}/design/background` } : picture && deck.background !== void 0 ? { source: picture.src, fit: picture.fit, path: "/design/background" } : void 0;
1316
1345
  return {
1317
1346
  theme,
@@ -1321,6 +1350,10 @@ function resolveDesign(document, index, context) {
1321
1350
  dimensions,
1322
1351
  backdrop,
1323
1352
  dark,
1353
+ variant: roles.variant,
1354
+ map: roles.map,
1355
+ accents: roles.accents,
1356
+ neutrals: roles.neutrals,
1324
1357
  colors: {
1325
1358
  background: roles.background,
1326
1359
  surface: roles.surface,
@@ -3629,6 +3662,7 @@ function resolveSlideContext(presentation, index, options = {}) {
3629
3662
  } else diagnostics.push(unresolvedReference(presentation, "layouts", slide.layout, `slides.${index}.layout`, catalogs));
3630
3663
  }
3631
3664
  if (options.strictReferences && diagnostics.length) throw new OPFUnresolvedReferenceError(diagnostics);
3665
+ const roles = resolveColorRoles(colorScheme, colorChoice([rec2(slide.design), rec2(deck.design), theme], colorScheme, rec2(deck.variables)));
3632
3666
  const composeOptions = {
3633
3667
  ...resolveCanvasDimensions(design.dimensions ?? theme.dimensions),
3634
3668
  ...layout ? { layout } : {},
@@ -3637,7 +3671,7 @@ function resolveSlideContext(presentation, index, options = {}) {
3637
3671
  slideNumber: options.slideNumber ?? index + 1,
3638
3672
  slideCount: options.slideCount ?? slides.length,
3639
3673
  fontFamilies: resolveFontFamilies(fontScheme),
3640
- darkBackground: resolveColorRoles(colorScheme, { background: decisionColor(design.background ?? theme.background, colorScheme, rec2(deck.variables)) }).dark,
3674
+ darkBackground: roles.dark,
3641
3675
  ...theme.background !== void 0 ? { themeBackground: theme.background } : {},
3642
3676
  // OPF 0.19: a theme may carry the shared design keys (between the deck's design and the layout record's).
3643
3677
  ...theme.design !== void 0 && rec2(theme.design) === theme.design ? { themeDesign: theme.design } : {},
@@ -3645,7 +3679,7 @@ function resolveSlideContext(presentation, index, options = {}) {
3645
3679
  ...options.date !== void 0 ? { date: options.date } : {}
3646
3680
  };
3647
3681
  const resolvedSlide = resolveSlideVariables(slide, { slideNumber: composeOptions.slideNumber, slideCount: composeOptions.slideCount, presentation, darkBackground: composeOptions.darkBackground === true });
3648
- return { slide: resolvedSlide, options: composeOptions, diagnostics, resolved: { theme, colorScheme, fontScheme, fontSchemePath: records.fontSchemePath, ...layout ? { layout } : {}, provenance: { ...layoutProvenance ? { layout: layoutProvenance } : {}, ...records.provenance } } };
3682
+ return { slide: resolvedSlide, options: composeOptions, diagnostics, resolved: { theme, colorScheme, roles, fontScheme, fontSchemePath: records.fontSchemePath, ...layout ? { layout } : {}, provenance: { ...layoutProvenance ? { layout: layoutProvenance } : {}, ...records.provenance } } };
3649
3683
  }
3650
3684
 
3651
3685
  // src/rule-slides.ts
@@ -3451,27 +3451,141 @@ function readableLink(link, background, text2) {
3451
3451
  const contrast2 = linkHex && backgroundHex ? colorContrast(linkHex, backgroundHex) : void 0;
3452
3452
  return contrast2 !== void 0 && contrast2 < MIN_LINK_CONTRAST ? text2 : link;
3453
3453
  }
3454
+ var ACCENT_SLOTS = ["accent1", "accent2", "accent3", "accent4", "accent5", "accent6"];
3455
+ var MAPS = {
3456
+ light1: { bg1: "light1", tx1: "dark1", bg2: "light2", tx2: "dark2" },
3457
+ light2: { bg1: "light2", tx1: "dark1", bg2: "light2", tx2: "dark2" },
3458
+ dark1: { bg1: "dark1", tx1: "light1", bg2: "dark2", tx2: "light2" },
3459
+ dark2: { bg1: "dark2", tx1: "light1", bg2: "dark2", tx2: "light2" }
3460
+ };
3461
+ function normalizeColorVariant(value) {
3462
+ if (typeof value === "string") return Object.hasOwn(MAPS, value) ? { background: value } : void 0;
3463
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
3464
+ const { background, accents } = value;
3465
+ if (typeof background !== "string" || !Object.hasOwn(MAPS, background)) return void 0;
3466
+ if (accents === void 0) return { background };
3467
+ return Array.isArray(accents) && accents.length === 6 && ACCENT_SLOTS.every((slot) => accents.includes(slot)) ? { background, accents: [...accents] } : void 0;
3468
+ }
3469
+ function isColorVariant(value) {
3470
+ return normalizeColorVariant(value) !== void 0;
3471
+ }
3472
+ function colorMapFor(variant) {
3473
+ const normalized = normalizeColorVariant(variant);
3474
+ const base = MAPS[normalized?.background ?? "light1"];
3475
+ return { ...base, accents: normalized?.accents ? [...normalized.accents] : ACCENT_SLOTS };
3476
+ }
3477
+ var OOXML_SLOT = { light1: "lt1", light2: "lt2", dark1: "dk1", dark2: "dk2" };
3478
+ function clrMapAttributes(map) {
3479
+ return {
3480
+ bg1: OOXML_SLOT[map.bg1],
3481
+ tx1: OOXML_SLOT[map.tx1],
3482
+ bg2: OOXML_SLOT[map.bg2],
3483
+ tx2: OOXML_SLOT[map.tx2],
3484
+ accent1: map.accents[0],
3485
+ accent2: map.accents[1],
3486
+ accent3: map.accents[2],
3487
+ accent4: map.accents[3],
3488
+ accent5: map.accents[4],
3489
+ accent6: map.accents[5],
3490
+ hlink: "hlink",
3491
+ folHlink: "folHlink"
3492
+ };
3493
+ }
3494
+ function rgbToHsl([r, g, b]) {
3495
+ const red = r / 255, green = g / 255, blue = b / 255, max = Math.max(red, green, blue), min = Math.min(red, green, blue), l = (max + min) / 2;
3496
+ if (max === min) return [0, 0, l];
3497
+ const d = max - min, s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
3498
+ const h = max === red ? (green - blue) / d + (green < blue ? 6 : 0) : max === green ? (blue - red) / d + 2 : (red - green) / d + 4;
3499
+ return [h / 6, s, l];
3500
+ }
3501
+ function hslToRgb([h, s, l]) {
3502
+ if (s === 0) return [l * 255, l * 255, l * 255];
3503
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s, p = 2 * l - q;
3504
+ const channel = (t) => {
3505
+ const u = t < 0 ? t + 1 : t > 1 ? t - 1 : t;
3506
+ return 255 * (u < 1 / 6 ? p + (q - p) * 6 * u : u < 0.5 ? q : u < 2 / 3 ? p + (q - p) * (2 / 3 - u) * 6 : p);
3507
+ };
3508
+ return [channel(h + 1 / 3), channel(h), channel(h - 1 / 3)];
3509
+ }
3510
+ function applyLuminance(hex, lumMod = 1e5, lumOff = 0) {
3511
+ const channels2 = opaqueChannels(hex);
3512
+ if (!channels2) return hex;
3513
+ const [h, s, l] = rgbToHsl(channels2);
3514
+ return hexOfChannels(hslToRgb([h, s, Math.min(1, Math.max(0, l * lumMod / 1e5 + lumOff / 1e5))]));
3515
+ }
3516
+ function mixTowardsBackground(slot, slotHex, backgroundHex, share) {
3517
+ const from = opaqueChannels(slotHex), to = opaqueChannels(backgroundHex);
3518
+ if (!from || !to) return { slot, hex: slotHex };
3519
+ const own3 = rgbToHsl(from)[2], target = rgbToHsl(to)[2] + share * (own3 - rgbToHsl(to)[2]);
3520
+ let lumMod = 1e5, lumOff = 0;
3521
+ if (target >= own3) {
3522
+ const k = own3 >= 1 ? 0 : (target - own3) / (1 - own3);
3523
+ lumMod = Math.round((1 - k) * 1e5);
3524
+ lumOff = Math.round(k * 1e5);
3525
+ } else lumMod = Math.round(target / own3 * 1e5);
3526
+ return { slot, hex: applyLuminance(slotHex, lumMod, lumOff), ...lumMod !== 1e5 ? { lumMod } : {}, ...lumOff !== 0 ? { lumOff } : {} };
3527
+ }
3528
+ var NEUTRAL_SHARES = { border: 0.2, gridline: 0.15, axisLine: 0.25, chartText: 0.65, codeComment: 0.65 };
3454
3529
  function resolveColorRoles(colorScheme, options = {}) {
3455
3530
  const slot = (name, fallback) => slotKeepingAlpha(colorScheme, name, fallback);
3456
- const background = keepAlpha(options.background) ?? defaultSlideBackground(colorScheme);
3457
- const dark = isDarkColor(background);
3458
- const text2 = dark ? slot("light1", "#FFFFFF") : keepAlpha(colorScheme.text) ?? slot("dark1", "#111827");
3459
- const surface = keepAlpha(colorScheme.surface) ?? (dark ? slot("dark2", "#1E293B") : slot("light2", "#F8FAFC"));
3531
+ const FALLBACK2 = { light1: "#FFFFFF", light2: "#F8FAFC", dark1: "#111827", dark2: "#1E293B" };
3532
+ const explicit = normalizeColorVariant(options.variant);
3533
+ const explicitBackground = keepAlpha(options.background);
3534
+ const dark = explicit ? explicit.background.startsWith("dark") : options.tone ? options.tone === "dark" : isDarkColor(explicitBackground ?? defaultSlideBackground(colorScheme));
3535
+ const variant = explicit ?? { background: dark ? "dark1" : "light1" };
3536
+ const map = colorMapFor(variant);
3537
+ const slotColor = (name) => slot(name, FALLBACK2[name]);
3538
+ const bg1 = map.bg1 === "light1" ? defaultSlideBackground(colorScheme) : slotColor(map.bg1);
3539
+ const background = explicitBackground ?? bg1;
3540
+ const tx1 = slotColor(map.tx1), bg2 = slotColor(map.bg2), tx2 = slotColor(map.tx2);
3541
+ const text2 = dark ? tx1 : keepAlpha(colorScheme.text) ?? tx1;
3542
+ const surface = keepAlpha(colorScheme.surface) ?? bg2;
3543
+ const accents = map.accents.map((name) => slot(name, "#000000"));
3544
+ const neutrals = schemeNeutrals({ bg1: explicitBackground ?? bg1, tx1, bg2, tx2, dark });
3460
3545
  return {
3461
- primary: keepAlpha(colorScheme.primary) ?? slot("accent1", "#2563EB"),
3462
- secondary: keepAlpha(colorScheme.secondary) ?? slot("accent2", "#0F766E"),
3463
- accent: keepAlpha(colorScheme.accent) ?? slot("accent3", "#F59E0B"),
3546
+ primary: keepAlpha(colorScheme.primary) ?? accents[0],
3547
+ secondary: keepAlpha(colorScheme.secondary) ?? accents[1],
3548
+ accent: keepAlpha(colorScheme.accent) ?? accents[2],
3464
3549
  background,
3465
3550
  surface,
3466
3551
  surfaceAlt: surfaceAltColor(surface, text2),
3467
- border: dark ? "#475569" : "#CBD5E1",
3552
+ border: neutrals.border.hex,
3468
3553
  text: text2,
3469
- textSecondary: keepAlpha(colorScheme.textSecondary) ?? (dark ? slot("light2", "#E2E8F0") : slot("dark2", "#334155")),
3554
+ textSecondary: keepAlpha(colorScheme.textSecondary) ?? tx2,
3470
3555
  hyperlink: readableLink(slot("hyperlink", DEFAULT_HYPERLINK), background, text2),
3471
3556
  followedHyperlink: slot("followedHyperlink", DEFAULT_FOLLOWED_HYPERLINK),
3472
- dark
3557
+ dark,
3558
+ variant,
3559
+ map,
3560
+ accents,
3561
+ neutrals
3473
3562
  };
3474
3563
  }
3564
+ function schemeNeutrals(colors) {
3565
+ const { bg1, tx1, bg2, tx2, dark } = colors;
3566
+ const opaque = (value) => normalizeHexColor(value) ?? value;
3567
+ const [back, front, second, secondText] = [opaque(bg1), opaque(tx1), opaque(bg2), opaque(tx2)];
3568
+ const share = (amount) => mixTowardsBackground("tx1", front, back, amount);
3569
+ const panel = dark ? { slot: "bg2", hex: second } : { slot: "tx1", hex: front };
3570
+ const textOnPanel = (colorContrast(back, panel.hex) ?? 0) >= (colorContrast(front, panel.hex) ?? 0) ? { slot: "bg1", hex: back } : { slot: "tx1", hex: front };
3571
+ const comment = mixTowardsBackground(textOnPanel.slot, textOnPanel.hex, panel.hex, NEUTRAL_SHARES.codeComment);
3572
+ return {
3573
+ border: share(NEUTRAL_SHARES.border),
3574
+ gridline: share(NEUTRAL_SHARES.gridline),
3575
+ axisLine: share(NEUTRAL_SHARES.axisLine),
3576
+ chartText: share(NEUTRAL_SHARES.chartText),
3577
+ outline: { slot: "bg1", hex: back },
3578
+ trendNeutral: { slot: "tx2", hex: secondText },
3579
+ codePanel: panel,
3580
+ codeText: textOnPanel,
3581
+ codeComment: comment
3582
+ };
3583
+ }
3584
+ function readableSchemeColor(fill, roles) {
3585
+ const light = { slot: "bg1", hex: normalizeHexColor(roles.background) ?? roles.background };
3586
+ const ink = { slot: "tx1", hex: normalizeHexColor(roles.text) ?? roles.text };
3587
+ return (colorContrast(light.hex, fill) ?? 0) >= (colorContrast(ink.hex, fill) ?? 0) ? light : ink;
3588
+ }
3475
3589
  function luminance(value) {
3476
3590
  if (typeof value !== "string") return void 0;
3477
3591
  let hex = value.trim();
@@ -3609,8 +3723,8 @@ function chartPaletteForFill(fill, palette) {
3609
3723
  }
3610
3724
  var CHART_SERIES_TINT_MIX = 0.4;
3611
3725
  function chartSeriesPalette(colorScheme = {}, colors, context = {}) {
3612
- const accents = [1, 2, 3, 4, 5, 6].map((number) => {
3613
- const slot = `accent${number}`;
3726
+ const order = context.accents && context.accents.length === 6 && ACCENT_SLOTS.every((slot) => context.accents.includes(slot)) ? context.accents : ACCENT_SLOTS;
3727
+ const accents = order.map((slot) => {
3614
3728
  return normalizeHexColor(colorScheme?.[slot]) ?? normalizeHexColor(ENGINE_DEFAULT_COLOR_SCHEME[slot]) ?? "#000000";
3615
3729
  });
3616
3730
  const palette = [...accents, ...accents.map((accent) => mixChannels(opaqueChannels(accent), [255, 255, 255], CHART_SERIES_TINT_MIX))];
@@ -4397,6 +4511,13 @@ function codeSyntaxPaletteForScheme(scheme, options = {}) {
4397
4511
  const pick = (role, slot, fallback) => normalize(record9[role]) ?? normalize(record9[slot]) ?? fallback;
4398
4512
  return codeSyntaxPalette({ primary: pick("primary", "accent1", "#2563EB"), secondary: pick("secondary", "accent2", "#0F766E"), accent: pick("accent", "accent3", "#F59E0B") }, options);
4399
4513
  }
4514
+ function codeSyntaxPaletteForRoles(roles, options = {}) {
4515
+ const { neutrals } = roles;
4516
+ return codeSyntaxPalette(
4517
+ { primary: roles.primary, secondary: roles.secondary, accent: roles.accent, mutedText: neutrals.codeComment.hex },
4518
+ { background: neutrals.codePanel.hex, foreground: neutrals.codeText.hex, ...options }
4519
+ );
4520
+ }
4400
4521
 
4401
4522
  // src/metric-trend.ts
4402
4523
  var METRIC_DEFAULT_SENTIMENT = Object.freeze({ up: "positive", down: "negative", flat: "neutral" });
@@ -4545,16 +4666,16 @@ var blend = (from, to, amount) => {
4545
4666
  const a = channels(from), b = channels(to);
4546
4667
  return toHex(a.map((value, index) => value + (b[index] - value) * amount));
4547
4668
  };
4548
- function codeHighlightColors(scheme, palette = codeSyntaxPaletteForScheme(scheme)) {
4669
+ function codeHighlightColors(scheme, palette = codeSyntaxPaletteForScheme(scheme), panel = CODE_PANEL_BACKGROUND) {
4549
4670
  const record9 = scheme && typeof scheme === "object" ? scheme : {};
4550
4671
  const primary = normalize(record9.primary) ?? normalize(record9.accent1) ?? "#2563EB";
4551
4672
  const [hue, saturation] = toHsl(primary);
4552
4673
  const tint = fromHsl(hue, Math.min(saturation, 0.7), 0.45);
4553
- const band = blend(CODE_PANEL_BACKGROUND, tint, CODE_HIGHLIGHT_BAND_TINT);
4674
+ const band = blend(panel, tint, CODE_HIGHLIGHT_BAND_TINT);
4554
4675
  const lit = {}, dim = {};
4555
4676
  for (const key of Object.keys(palette)) {
4556
4677
  lit[key] = legible(palette[key], band, CODE_SYNTAX_MIN_CONTRAST);
4557
- dim[key] = legible(blend(palette[key], CODE_PANEL_BACKGROUND, CODE_HIGHLIGHT_DIM), CODE_PANEL_BACKGROUND, CODE_SYNTAX_MIN_CONTRAST);
4678
+ dim[key] = legible(blend(palette[key], panel, CODE_HIGHLIGHT_DIM), panel, CODE_SYNTAX_MIN_CONTRAST);
4558
4679
  }
4559
4680
  return { band, lit, dim };
4560
4681
  }
@@ -7279,4 +7400,4 @@ function resolveCanvasDimensions(input) {
7279
7400
  return { width, height };
7280
7401
  }
7281
7402
 
7282
- export { AUTO_LAYOUT, CAPTIONABLE_FIELDS, CAPTION_FONT_RATIO, CAPTION_MAX_RATIO, CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_HIGHLIGHT_MUTED_MIN_CONTRAST, CHART_HIGHLIGHT_MUTED_MIX, CHART_SERIES_MIN_DIFFERENCE, CHART_SERIES_MIN_LIGHTNESS_STEP, CHART_SERIES_TIER_SIZE, CHART_SERIES_TINT_MIX, CHART_TEXT_PX, CHART_TYPES, CITATION_MARKER_RAISE, CITATION_MARKER_SCALE, CODE_HIGHLIGHT_LANGUAGES, CODE_HIGHLIGHT_MAX_LENGTH, CODE_PANEL_BACKGROUND, CODE_PANEL_FOREGROUND, CODE_SYNTAX_MIN_CONTRAST, DARK_BACKGROUND_LUMINANCE, DEFAULT_CHART_LABEL_SEPARATOR, DEFAULT_FURNITURE_DATE_FORMAT, DEFAULT_VARIABLE_DATE_FORMAT, DESIGN_HINT_KEYS, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, FONT_SIZE_GRID_PER_PX, FOOTNOTE_MAX_RATIO, FURNITURE_GAP, FURNITURE_IMAGE_SHARE, FURNITURE_ZONE_GUTTER, HEADING_AREAS, LANGUAGES, LAYOUT_BODY_KINDS, LOGO_SHAPES, MAX_COMPOSITION_DEPTH, MAX_NUMBERING_LEVELS, MAX_NUMBERING_VALUE, MAX_REGION_BLOCKS, MAX_ROMAN_VALUE, MAX_TEMPLATE_TRACKS, METRIC_TREND_MIN_CONTRAST, METRIC_TREND_SHAPES, NUMBERING_STYLES, NUMBERING_SUFFIXES, OPFCatalogsOptionError, OPFCompositionError, OPFLayoutTemplateError, OPFUnresolvedReferenceError, OPFVariableError, PATTERN_PRESETS, PATTERN_PRESET_ALIASES, PATTERN_TILE_SIZE, PICTURE_BULLET_SCALE, PROMOTED_REGION_KEY, REGION_ANCHORS, REGION_FLOWS, REGION_KINDS, REGION_ROLES, RESERVED_REGION_NAMES, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, SURFACE_ALT_MIN_CONTRAST, SURFACE_ALT_MIX, THEME_DESIGN_KEYS, TIMELINE_OUTLINE_MIN_CONTRAST, TIMELINE_STATUSES, TIMELINE_TEXT_MIN_CONTRAST, VARIABLE_KINDS, allocateRows, annotationText, bindRegions, blockKind, captionSettings, catalogGroupDeclared, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartColorForFill, chartHighlightColors, chartHighlightMarks, chartLabelText, chartNumber, chartNumberFixesByCell, chartOptionSupport, chartOptionTarget, chartPaletteForFill, chartSeriesPalette, chartTextSize, chartValueAxis, checkCatalogsOption, citationMarkerText, codeHighlightBands, codeHighlightColors, codeHighlightLines, codeHighlightSlice, codeLineNumbers, codeLineRuns, codeSyntaxPalette, codeSyntaxPaletteForScheme, coerceVariableValue, collectCitations, colorContrast, composeLayoutAreas, composeSlide, datasetDiagnostics, defaultSlideBackground, dottedPath, embeddedCopy, fitImage, fitList, fitRichText, fitText, formatChartLabelNumber, formatChartLabelPercent, formatDataNumber, formatFurnitureDate, formatListNumber, formatVariableNumber, fromExcelNumberFormat, gridFlowShape, hasContentVariables, imageBackground, imageShape, inlineChartData, inlineDatasets, inlineTableData, instantiateForValidation, intrinsicImageAspect, intrinsicImageSize, isDarkColor, isDatasetRef, isLayoutTemplate, isRecord, isTemplate, isXYChartType, layoutCaption, layoutCode, layoutContent, layoutFootnotes, layoutFurniture, layoutMetric, layoutQuote, layoutRegion, layoutStructure, layoutTable, layoutTemplate, layoutTemplateIssues, layoutTimeline, layoutWatermark, listBuiltinVariables, listColumnBreaks, listNumbers, listVariables, maxIntervalsFor, measureText, measureTextOutline, metricTrendColor, metricTrendMark, metricTrendPoints, niceScale, normalizeHexColor, normalizeLanguageFamily, numberFormatError, numberingAtLevel, numberingFindings, numberingStyleDraws, paragraphDirection, paragraphDirectionAt, parseReference, pathFor, patternBitmap, patternRuns, physicalAlignment, placeTextLines, placedImageBlocks, pointerPath, promotedRegionKeys, provenanceOf, readingRows, recordReferenceSites, referencesSlide, regionAccepts, regionRoleRank, registeredCatalog, resolveCanvasDimensions, resolveChartColors, resolveChartData, resolveChartOptions, resolveCodeLanguage, resolveColorRef, resolveColorRoles, resolveDesignHints, resolveDesignRecords, resolveFontFamilies, resolveFontScheme, resolveLogo, resolveNumbering, resolvePatternPreset, resolveReference, resolveScriptFonts, resolveSlideDirection, resolveSlideVariables, resolveSocialProfile, resolveTableData, resolveTextStyle, resolveVariables, rootNodes, scriptFontRole, sliceNumberedItems, slideCitations, slideTokenSpans, snapFontSizeDown, snapFontSizeUp, stackCategoryValues, suggestChartNumberFix, surfaceAltColor, tableCellDisplayValue, tableGrid, tableRowBoundaries, textColorForFill, textWidthMeasurer, timelineMarkerShapes, timelineTextColor, toExcelNumberFormat, tokenizeCode, unresolvedReference, unusedDatasets, usesSlideBuiltin, variableDeclarations, visitContentPayloads, visualReadingOrder, walkCitationRuns, wrapText };
7403
+ export { AUTO_LAYOUT, CAPTIONABLE_FIELDS, CAPTION_FONT_RATIO, CAPTION_MAX_RATIO, CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_HIGHLIGHT_MUTED_MIN_CONTRAST, CHART_HIGHLIGHT_MUTED_MIX, CHART_SERIES_MIN_DIFFERENCE, CHART_SERIES_MIN_LIGHTNESS_STEP, CHART_SERIES_TIER_SIZE, CHART_SERIES_TINT_MIX, CHART_TEXT_PX, CHART_TYPES, CITATION_MARKER_RAISE, CITATION_MARKER_SCALE, CODE_HIGHLIGHT_LANGUAGES, CODE_HIGHLIGHT_MAX_LENGTH, CODE_PANEL_BACKGROUND, CODE_PANEL_FOREGROUND, CODE_SYNTAX_MIN_CONTRAST, DARK_BACKGROUND_LUMINANCE, DEFAULT_CHART_LABEL_SEPARATOR, DEFAULT_FURNITURE_DATE_FORMAT, DEFAULT_VARIABLE_DATE_FORMAT, DESIGN_HINT_KEYS, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, FONT_SIZE_GRID_PER_PX, FOOTNOTE_MAX_RATIO, FURNITURE_GAP, FURNITURE_IMAGE_SHARE, FURNITURE_ZONE_GUTTER, HEADING_AREAS, LANGUAGES, LAYOUT_BODY_KINDS, LOGO_SHAPES, MAX_COMPOSITION_DEPTH, MAX_NUMBERING_LEVELS, MAX_NUMBERING_VALUE, MAX_REGION_BLOCKS, MAX_ROMAN_VALUE, MAX_TEMPLATE_TRACKS, METRIC_TREND_MIN_CONTRAST, METRIC_TREND_SHAPES, NEUTRAL_SHARES, NUMBERING_STYLES, NUMBERING_SUFFIXES, OPFCatalogsOptionError, OPFCompositionError, OPFLayoutTemplateError, OPFUnresolvedReferenceError, OPFVariableError, PATTERN_PRESETS, PATTERN_PRESET_ALIASES, PATTERN_TILE_SIZE, PICTURE_BULLET_SCALE, PROMOTED_REGION_KEY, REGION_ANCHORS, REGION_FLOWS, REGION_KINDS, REGION_ROLES, RESERVED_REGION_NAMES, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, SURFACE_ALT_MIN_CONTRAST, SURFACE_ALT_MIX, THEME_DESIGN_KEYS, TIMELINE_OUTLINE_MIN_CONTRAST, TIMELINE_STATUSES, TIMELINE_TEXT_MIN_CONTRAST, VARIABLE_KINDS, allocateRows, annotationText, applyLuminance, bindRegions, blockKind, captionSettings, catalogGroupDeclared, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartColorForFill, chartHighlightColors, chartHighlightMarks, chartLabelText, chartNumber, chartNumberFixesByCell, chartOptionSupport, chartOptionTarget, chartPaletteForFill, chartSeriesPalette, chartTextSize, chartValueAxis, checkCatalogsOption, citationMarkerText, clrMapAttributes, codeHighlightBands, codeHighlightColors, codeHighlightLines, codeHighlightSlice, codeLineNumbers, codeLineRuns, codeSyntaxPalette, codeSyntaxPaletteForRoles, codeSyntaxPaletteForScheme, coerceVariableValue, collectCitations, colorContrast, colorMapFor, composeLayoutAreas, composeSlide, datasetDiagnostics, defaultSlideBackground, dottedPath, embeddedCopy, fitImage, fitList, fitRichText, fitText, formatChartLabelNumber, formatChartLabelPercent, formatDataNumber, formatFurnitureDate, formatListNumber, formatVariableNumber, fromExcelNumberFormat, gridFlowShape, hasContentVariables, imageBackground, imageShape, inlineChartData, inlineDatasets, inlineTableData, instantiateForValidation, intrinsicImageAspect, intrinsicImageSize, isColorVariant, isDarkColor, isDatasetRef, isLayoutTemplate, isRecord, isTemplate, isXYChartType, layoutCaption, layoutCode, layoutContent, layoutFootnotes, layoutFurniture, layoutMetric, layoutQuote, layoutRegion, layoutStructure, layoutTable, layoutTemplate, layoutTemplateIssues, layoutTimeline, layoutWatermark, listBuiltinVariables, listColumnBreaks, listNumbers, listVariables, maxIntervalsFor, measureText, measureTextOutline, metricTrendColor, metricTrendMark, metricTrendPoints, niceScale, normalizeColorVariant, normalizeHexColor, normalizeLanguageFamily, numberFormatError, numberingAtLevel, numberingFindings, numberingStyleDraws, paragraphDirection, paragraphDirectionAt, parseReference, pathFor, patternBitmap, patternRuns, physicalAlignment, placeTextLines, placedImageBlocks, pointerPath, promotedRegionKeys, provenanceOf, readableSchemeColor, readingRows, recordReferenceSites, referencesSlide, regionAccepts, regionRoleRank, registeredCatalog, resolveCanvasDimensions, resolveChartColors, resolveChartData, resolveChartOptions, resolveCodeLanguage, resolveColorRef, resolveColorRoles, resolveDesignHints, resolveDesignRecords, resolveFontFamilies, resolveFontScheme, resolveLogo, resolveNumbering, resolvePatternPreset, resolveReference, resolveScriptFonts, resolveSlideDirection, resolveSlideVariables, resolveSocialProfile, resolveTableData, resolveTextStyle, resolveVariables, rootNodes, scriptFontRole, sliceNumberedItems, slideCitations, slideTokenSpans, snapFontSizeDown, snapFontSizeUp, stackCategoryValues, suggestChartNumberFix, surfaceAltColor, tableCellDisplayValue, tableGrid, tableRowBoundaries, textColorForFill, textWidthMeasurer, timelineMarkerShapes, timelineTextColor, toExcelNumberFormat, tokenizeCode, unresolvedReference, unusedDatasets, usesSlideBuiltin, variableDeclarations, visitContentPayloads, visualReadingOrder, walkCitationRuns, wrapText };
@@ -1,4 +1,4 @@
1
- import { runText } from './chunk-2SENTA2R.js';
1
+ import { runText } from './chunk-F55S5HDP.js';
2
2
 
3
3
  // src/convert/text-lines.ts
4
4
  var LIST_PREFIX = /^([ \t]*)(?:([-*•+]|\d{1,3}[.)])[ \t]+)?/;
@@ -1,5 +1,5 @@
1
- import { OPFApiError } from './chunk-MAJHCGOW.js';
2
- import { CATALOG_SCHEMA } from './chunk-23MOKE4B.js';
1
+ import { OPFApiError } from './chunk-3FWUA763.js';
2
+ import { CATALOG_SCHEMA } from './chunk-L67MPTPZ.js';
3
3
  import { CATALOG_SCHEMA as CATALOG_SCHEMA$1, gallery } from '@openpresentation/gallery';
4
4
 
5
5
  function galleryMismatch(declared, reads = CATALOG_SCHEMA) {
@@ -1,4 +1,4 @@
1
- import { isRecord, same } from './chunk-2SENTA2R.js';
1
+ import { isRecord, same } from './chunk-F55S5HDP.js';
2
2
  import { parseDocument, YAMLMap, Scalar, stringify } from 'yaml';
3
3
 
4
4
  // src/not-checked.ts
@@ -1,5 +1,5 @@
1
- import { jsonEqual, formatPointer } from './chunk-YSJRBRHB.js';
2
- import { annotationText } from './chunk-VKNFZEMG.js';
1
+ import { jsonEqual, formatPointer } from './chunk-VIOSRKMA.js';
2
+ import { annotationText } from './chunk-N3ZPLGK5.js';
3
3
 
4
4
  // src/diff-match.ts
5
5
  var DEFAULT_MATCH_THRESHOLD = 0.5;
@@ -1,8 +1,8 @@
1
- import { fromMarkdown, toMarkdown } from './chunk-SBWIZSPB.js';
2
- import { fromYaml, toYaml } from './chunk-7XNAMCGT.js';
3
- import { NOT_CHECKED } from './chunk-3T7MNRBY.js';
4
- import { parseSource, validate, OPFValidationError } from './chunk-23MOKE4B.js';
5
- import { checkCatalogsOption } from './chunk-VKNFZEMG.js';
1
+ import { fromMarkdown, toMarkdown } from './chunk-XKUEEDDN.js';
2
+ import { fromYaml, toYaml } from './chunk-B2XALDGS.js';
3
+ import { NOT_CHECKED } from './chunk-TILQBXPZ.js';
4
+ import { parseSource, validate, OPFValidationError } from './chunk-L67MPTPZ.js';
5
+ import { checkCatalogsOption } from './chunk-N3ZPLGK5.js';
6
6
 
7
7
  // src/deck-report.ts
8
8
  var DECK_FORMATS = ["json", "yaml", "markdown"];
@@ -1,4 +1,4 @@
1
- import { validate } from './chunk-23MOKE4B.js';
1
+ import { validate } from './chunk-L67MPTPZ.js';
2
2
 
3
3
  // src/patch.ts
4
4
  var OPFPatchError = class extends Error {
@@ -1,8 +1,8 @@
1
- import { Ctx, splitLines, lineRange, readYamlMapping, NOT_CHECKED, OPFMarkdownError, writeYaml, readCsv, DECIMAL, csvField, scalarText } from './chunk-3T7MNRBY.js';
2
- import { parseQuoteLines, levelsFromIndents, parseCodeFence, splitWhen, fenceCode } from './chunk-KUNXFN7B.js';
3
- import { same, isRecord, runText, isPlainRun, FORMATTING } from './chunk-2SENTA2R.js';
4
- import { validate } from './chunk-23MOKE4B.js';
5
- import { checkCatalogsOption, PROMOTED_REGION_KEY } from './chunk-VKNFZEMG.js';
1
+ import { Ctx, splitLines, lineRange, readYamlMapping, NOT_CHECKED, OPFMarkdownError, writeYaml, readCsv, DECIMAL, csvField, scalarText } from './chunk-TILQBXPZ.js';
2
+ import { parseQuoteLines, levelsFromIndents, parseCodeFence, splitWhen, fenceCode } from './chunk-NIA2WEXN.js';
3
+ import { same, isRecord, runText, isPlainRun, FORMATTING } from './chunk-F55S5HDP.js';
4
+ import { validate } from './chunk-L67MPTPZ.js';
5
+ import { checkCatalogsOption, PROMOTED_REGION_KEY } from './chunk-N3ZPLGK5.js';
6
6
 
7
7
  // src/markdown/canon.ts
8
8
  var FORMAT_KEYS = FORMATTING;
@@ -1,4 +1,4 @@
1
- import { presentation } from './chunk-3UAVON3O.js';
1
+ import { presentation } from './chunk-ZIRSAFRC.js';
2
2
 
3
3
  // src/format.ts
4
4
  var OPFFormatError = class extends Error {