postext 1.39.1 → 1.40.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 (125) hide show
  1. package/dist/__tests__/comics/frames.test.js +0 -8
  2. package/dist/__tests__/comics/frames.test.js.map +1 -1
  3. package/dist/__tests__/comics/textPanelsStripsSpreads.test.d.ts +2 -0
  4. package/dist/__tests__/comics/textPanelsStripsSpreads.test.d.ts.map +1 -0
  5. package/dist/__tests__/comics/textPanelsStripsSpreads.test.js +277 -0
  6. package/dist/__tests__/comics/textPanelsStripsSpreads.test.js.map +1 -0
  7. package/dist/__tests__/composed/fit.test.js +77 -0
  8. package/dist/__tests__/composed/fit.test.js.map +1 -1
  9. package/dist/__tests__/composed/frameModesChain.test.d.ts +2 -0
  10. package/dist/__tests__/composed/frameModesChain.test.d.ts.map +1 -0
  11. package/dist/__tests__/composed/frameModesChain.test.js +69 -0
  12. package/dist/__tests__/composed/frameModesChain.test.js.map +1 -0
  13. package/dist/__tests__/composed/framePictures.test.d.ts +2 -0
  14. package/dist/__tests__/composed/framePictures.test.d.ts.map +1 -0
  15. package/dist/__tests__/composed/framePictures.test.js +121 -0
  16. package/dist/__tests__/composed/framePictures.test.js.map +1 -0
  17. package/dist/__tests__/composed/frameWritingMode.test.js +79 -3
  18. package/dist/__tests__/composed/frameWritingMode.test.js.map +1 -1
  19. package/dist/__tests__/composed/labels.test.js +19 -0
  20. package/dist/__tests__/composed/labels.test.js.map +1 -1
  21. package/dist/__tests__/composed/labelsMirrored.test.d.ts +2 -0
  22. package/dist/__tests__/composed/labelsMirrored.test.d.ts.map +1 -0
  23. package/dist/__tests__/composed/labelsMirrored.test.js +128 -0
  24. package/dist/__tests__/composed/labelsMirrored.test.js.map +1 -0
  25. package/dist/__tests__/composed/measureMemo.test.d.ts +2 -0
  26. package/dist/__tests__/composed/measureMemo.test.d.ts.map +1 -0
  27. package/dist/__tests__/composed/measureMemo.test.js +45 -0
  28. package/dist/__tests__/composed/measureMemo.test.js.map +1 -0
  29. package/dist/__tests__/composedTemplates.test.js +5 -2
  30. package/dist/__tests__/composedTemplates.test.js.map +1 -1
  31. package/dist/__tests__/exports.test.js +3 -0
  32. package/dist/__tests__/exports.test.js.map +1 -1
  33. package/dist/__tests__/migrate/labelsOnPictures.test.js +49 -1
  34. package/dist/__tests__/migrate/labelsOnPictures.test.js.map +1 -1
  35. package/dist/canvas-backend/composed.d.ts +2 -2
  36. package/dist/canvas-backend/composed.d.ts.map +1 -1
  37. package/dist/canvas-backend/composed.js +11 -2
  38. package/dist/canvas-backend/composed.js.map +1 -1
  39. package/dist/canvas-backend/index.d.ts.map +1 -1
  40. package/dist/canvas-backend/index.js +10 -1
  41. package/dist/canvas-backend/index.js.map +1 -1
  42. package/dist/canvas-backend/mirrorFrame.d.ts +19 -0
  43. package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
  44. package/dist/canvas-backend/mirrorFrame.js +47 -0
  45. package/dist/canvas-backend/mirrorFrame.js.map +1 -1
  46. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  47. package/dist/canvas-backend/renderResourceBlock.js +35 -26
  48. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  49. package/dist/comics/frames.d.ts +5 -0
  50. package/dist/comics/frames.d.ts.map +1 -1
  51. package/dist/comics/frames.js +7 -0
  52. package/dist/comics/frames.js.map +1 -1
  53. package/dist/comics/layoutPage.d.ts +5 -0
  54. package/dist/comics/layoutPage.d.ts.map +1 -1
  55. package/dist/comics/layoutPage.js +9 -0
  56. package/dist/comics/layoutPage.js.map +1 -1
  57. package/dist/comics/sourceMap.d.ts.map +1 -1
  58. package/dist/comics/sourceMap.js +6 -4
  59. package/dist/comics/sourceMap.js.map +1 -1
  60. package/dist/comics/spread.d.ts +6 -1
  61. package/dist/comics/spread.d.ts.map +1 -1
  62. package/dist/comics/spread.js +15 -1
  63. package/dist/comics/spread.js.map +1 -1
  64. package/dist/comics/textPanels.d.ts +30 -6
  65. package/dist/comics/textPanels.d.ts.map +1 -1
  66. package/dist/comics/textPanels.js +226 -69
  67. package/dist/comics/textPanels.js.map +1 -1
  68. package/dist/comics/transform.d.ts.map +1 -1
  69. package/dist/comics/transform.js +4 -2
  70. package/dist/comics/transform.js.map +1 -1
  71. package/dist/composed/labels.d.ts +9 -0
  72. package/dist/composed/labels.d.ts.map +1 -1
  73. package/dist/composed/labels.js +36 -4
  74. package/dist/composed/labels.js.map +1 -1
  75. package/dist/composed/paint.d.ts +10 -6
  76. package/dist/composed/paint.d.ts.map +1 -1
  77. package/dist/composed/paint.js +38 -7
  78. package/dist/composed/paint.js.map +1 -1
  79. package/dist/composed/sourceMap.d.ts.map +1 -1
  80. package/dist/composed/sourceMap.js +7 -1
  81. package/dist/composed/sourceMap.js.map +1 -1
  82. package/dist/composed/templates.d.ts.map +1 -1
  83. package/dist/composed/templates.js +9 -4
  84. package/dist/composed/templates.js.map +1 -1
  85. package/dist/composed/types.d.ts +9 -4
  86. package/dist/composed/types.d.ts.map +1 -1
  87. package/dist/html-backend.d.ts.map +1 -1
  88. package/dist/html-backend.js +36 -14
  89. package/dist/html-backend.js.map +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +2 -2
  93. package/dist/index.js.map +1 -1
  94. package/dist/migrate/pageDesign.d.ts +6 -1
  95. package/dist/migrate/pageDesign.d.ts.map +1 -1
  96. package/dist/migrate/pageDesign.js +26 -10
  97. package/dist/migrate/pageDesign.js.map +1 -1
  98. package/dist/migrate/textToMarkdown.js +4 -3
  99. package/dist/migrate/textToMarkdown.js.map +1 -1
  100. package/dist/pipeline/build.d.ts.map +1 -1
  101. package/dist/pipeline/build.js +67 -10
  102. package/dist/pipeline/build.js.map +1 -1
  103. package/dist/pipeline/calloutLayout.d.ts +11 -0
  104. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  105. package/dist/pipeline/calloutLayout.js +20 -1
  106. package/dist/pipeline/calloutLayout.js.map +1 -1
  107. package/dist/pipeline/composedLayout.d.ts.map +1 -1
  108. package/dist/pipeline/composedLayout.js +103 -24
  109. package/dist/pipeline/composedLayout.js.map +1 -1
  110. package/dist/pipeline/frameLayout.d.ts +5 -1
  111. package/dist/pipeline/frameLayout.d.ts.map +1 -1
  112. package/dist/pipeline/frameLayout.js +1 -0
  113. package/dist/pipeline/frameLayout.js.map +1 -1
  114. package/dist/pipeline/measureMemo.d.ts +39 -0
  115. package/dist/pipeline/measureMemo.d.ts.map +1 -0
  116. package/dist/pipeline/measureMemo.js +61 -0
  117. package/dist/pipeline/measureMemo.js.map +1 -0
  118. package/dist/pipeline/mirrorFrame.d.ts +2 -1
  119. package/dist/pipeline/mirrorFrame.d.ts.map +1 -1
  120. package/dist/pipeline/mirrorFrame.js +31 -5
  121. package/dist/pipeline/mirrorFrame.js.map +1 -1
  122. package/dist/vdt.d.ts +17 -0
  123. package/dist/vdt.d.ts.map +1 -1
  124. package/dist/vdt.js.map +1 -1
  125. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"html-backend.d.ts","sourceRoot":"","sources":["../src/html-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAuBX,aAAa,EACd,MAAM,OAAO,CAAC;AAIf,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA8InF,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;kDAI8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG;QAC5D;;;0BAGkB;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF;;;;;;;;;;;;iEAY6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;4DAGwD;IACxD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1D;;;;;;;2DAOuD;IACvD,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;IACnG;;;wDAGoD;IACpD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C;;;;;;;uEAOmE;IACnE,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B;;;;;;;;;;uBAUmB;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG;QACzB,KAAK,CAAC,EAAE,mBAAmB,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;KACxC,CAAC;CACH;AA4VD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAajE;AAi4FD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IACvB;4EACwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,QAS4B,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,iBAAsB,GAC9B,eAAe,CAuGjB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAEtF"}
1
+ {"version":3,"file":"html-backend.d.ts","sourceRoot":"","sources":["../src/html-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAuBX,aAAa,EACd,MAAM,OAAO,CAAC;AAIf,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA8InF,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;kDAI8C;IAC9C,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG;QAC5D;;;0BAGkB;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;IACF;;;;;;;;;;;;iEAY6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;4DAGwD;IACxD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1D;;;;;;;2DAOuD;IACvD,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;QAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC;IACnG;;;wDAGoD;IACpD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C;;;;;;;uEAOmE;IACnE,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B;;;;;;;;;;uBAUmB;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG;QACzB,KAAK,CAAC,EAAE,mBAAmB,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;KACxC,CAAC;CACH;AA4VD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAajE;AAq5FD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IACvB;4EACwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,QAS4B,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,OAAO,GAAE,iBAAsB,GAC9B,eAAe,CAuGjB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAEtF"}
@@ -25,7 +25,7 @@ import { isHlsMimeType, mediaFragment, videoElementAttributes, videoEmbedAllow }
25
25
  import { renderComicHtml } from './htmlComic';
26
26
  import { comicBlockOnSheet, pageComics } from './comics/transform';
27
27
  import { altWithLabels } from './composed/labelText';
28
- import { figureLabelMatrix, undrawnLabels } from './composed/labels';
28
+ import { figureLabelMatrix, undrawnLabels, unmirrorLabelLayout } from './composed/labels';
29
29
  import { comicFramePaintOrder, composedFrameBlockIds, composedPaintOrder, composedReadingOrder, composedSheetClip, composedSheetClipOnSheet, frameClips, frameContentRect, frameMatrix } from './composed/paint';
30
30
  import { taskBoxSvgBody, taskBoxText } from './taskBox';
31
31
  /**
@@ -2469,9 +2469,15 @@ function renderFigureLabelsHtml(rb, bx, by, options) {
2469
2469
  const n2 = (v) => String(+v.toFixed(4));
2470
2470
  const parts = [];
2471
2471
  for (const label of rb.labels ?? []) {
2472
- const layout = label.layout;
2472
+ let layout = label.layout;
2473
2473
  if (!layout)
2474
2474
  continue;
2475
+ // A vertical label on a mirrored page (#955): set from its unmirrored
2476
+ // layout in a wrapper that reflects the flow's mirror back about the
2477
+ // body, so its runs and cells read as they do on any page.
2478
+ const unmirrored = layout.mirrored === true && !rb.rotation;
2479
+ if (unmirrored)
2480
+ layout = unmirrorLabelLayout(layout, rb.bodyRect.width);
2475
2481
  const m = figureLabelMatrix(layout, bx, by);
2476
2482
  const fonts = { normal: layout.fontString, bold: layout.boldFontString, italic: layout.italicFontString, boldItalic: layout.boldItalicFontString };
2477
2483
  const halo = layout.halo && layout.halo.widthPx > 0
@@ -2501,8 +2507,11 @@ function renderFigureLabelsHtml(rb, bx, by, options) {
2501
2507
  }
2502
2508
  const dir = layout.direction === 'rtl' ? ' dir="rtl"' : '';
2503
2509
  const id = label.id ? ` data-label="${esc(label.id)}"` : '';
2504
- parts.push(`<div class="pt-figure-label"${id}${dir} style="position:absolute;left:0;top:0;width:0;height:0;transform-origin:0 0;` +
2505
- `transform:matrix(${m.map(n2).join(',')});${halo}">` + inner.join('') + '</div>');
2510
+ const box = `<div class="pt-figure-label"${id}${dir} style="position:absolute;left:0;top:0;width:0;height:0;transform-origin:0 0;` +
2511
+ `transform:matrix(${m.map(n2).join(',')});${halo}">` + inner.join('') + '</div>';
2512
+ parts.push(unmirrored
2513
+ ? `<div class="pt-unmirrored" style="position:absolute;left:0;top:0;width:0;height:0;transform-origin:0 0;transform:matrix(-1,0,0,1,${n2(2 * bx + rb.bodyRect.width)},0);">${box}</div>`
2514
+ : box);
2506
2515
  }
2507
2516
  return parts.join('');
2508
2517
  }
@@ -2968,6 +2977,7 @@ verticalRegion, verticalDigits) {
2968
2977
  const plainFlow = !vflow && page.flow?.writingMode !== 'horizontal-tb';
2969
2978
  // A comic page's text panels (#885): each frame's blocks laid over its
2970
2979
  // panel, before the panel's lettering, inside the comic's markup.
2980
+ // Those of a strip (#959) likewise, inside the strip's markup.
2971
2981
  const comicText = new Map();
2972
2982
  const comicTextBlocks = [];
2973
2983
  // On a vertical or right-to-left page the text is set in the page's flow
@@ -2978,15 +2988,22 @@ verticalRegion, verticalDigits) {
2978
2988
  : page.flow?.writingMode === 'horizontal-tb'
2979
2989
  ? `<div class="pt-flow pt-flow-mirrored" style="position:absolute;left:0;top:0;width:${page.width}px;height:${page.height}px;transform:scaleX(-1);transform-origin:${page.flow.mirror.originX / 2}px 0;">${MIRRORED_FLOW_STYLE}`
2980
2990
  : '';
2981
- for (const item of comicFramePaintOrder(page)) {
2982
- if (item.kind !== 'frame' || item.frame.panel === undefined)
2983
- continue;
2984
- const parts = item.blocks.map((b) => ({ id: b.id, html: renderBlock(b, options) }));
2985
- comicTextBlocks.push(...parts);
2986
- const frameHtml = composedFrameOpen(item.frame, 'auto') + parts.map((b) => b.html).join('') + '</div>';
2987
- comicText.set(item.frame.panel, flowBox ? `${flowBox}${frameHtml}</div>` : frameHtml);
2991
+ for (const comic of comics) {
2992
+ for (const item of comicFramePaintOrder(page, comic)) {
2993
+ if (item.kind !== 'frame' || item.frame.panel === undefined)
2994
+ continue;
2995
+ const parts = item.blocks.map((b) => ({ id: b.id, html: renderBlock(b, options) }));
2996
+ comicTextBlocks.push(...parts);
2997
+ const frameHtml = composedFrameOpen(item.frame, 'auto') + parts.map((b) => b.html).join('') + '</div>';
2998
+ const byPanel = comicText.get(comic) ?? new Map();
2999
+ byPanel.set(item.frame.panel, flowBox ? `${flowBox}${frameHtml}</div>` : frameHtml);
3000
+ comicText.set(comic, byPanel);
3001
+ }
2988
3002
  }
2989
- const comicMarkup = (comic) => renderComicPageHtml(page, comic, comics.indexOf(comic), options.vertical ? { ...options, vertical: undefined } : options, comic === page.comic && comicText.size > 0 ? (panel) => comicText.get(panel.index) ?? '' : undefined);
3003
+ const comicMarkup = (comic) => {
3004
+ const text = comicText.get(comic);
3005
+ return renderComicPageHtml(page, comic, comics.indexOf(comic), options.vertical ? { ...options, vertical: undefined } : options, text ? (panel) => text.get(panel.index) ?? '' : undefined);
3006
+ };
2990
3007
  const stripInBlock = (block) => plainFlow && block.comic && !block.hidden ? comicMarkup(comicBlockOnSheet(page, block)) : '';
2991
3008
  const blocks = [];
2992
3009
  for (const col of page.columns) {
@@ -3161,7 +3178,7 @@ function composedFrameOpen(frame, z, facing = false) {
3161
3178
  const [l, t, r, b] = [x, y, x + width, y + height].map(frameNum);
3162
3179
  decls.push(`clip-path:polygon(${l}px ${t}px,${r}px ${t}px,${r}px ${b}px,${l}px ${b}px)`);
3163
3180
  }
3164
- return `<div class="pt-frame" data-frame-id="${esc(frame.id)}" data-layer="${frame.layer}"${facing ? ' data-facing="true" aria-hidden="true"' : ''} style="${decls.join(';')};">`;
3181
+ return `<div class="pt-frame${frame.unmirrorX !== undefined ? ' pt-unmirrored' : ''}" data-frame-id="${esc(frame.id)}" data-layer="${frame.layer}"${facing ? ' data-facing="true" aria-hidden="true"' : ''} style="${decls.join(';')};">`;
3165
3182
  }
3166
3183
  /** The markup of a comic on a page (its comic page, a half of a spread or
3167
3184
  * a strip, on the sheet; #565): see `renderComicHtml`. Its pictures come
@@ -3187,7 +3204,12 @@ function renderComicPageHtml(page, comic, k, options, overPanel) {
3187
3204
  * mirrored layout put it. A box that sets a transform of its own (a
3188
3205
  * stretched dash, a turned design picture) keeps it and stays mirrored. */
3189
3206
  const MIRRORED_FLOW_STYLE = '<style>.pt-flow-mirrored [style*="white-space:pre"],.pt-flow-mirrored img,' +
3190
- '.pt-flow-mirrored svg:not(.pt-char-grid),.pt-flow-mirrored .pt-video{transform:scaleX(-1);}</style>';
3207
+ '.pt-flow-mirrored svg:not(.pt-char-grid),.pt-flow-mirrored .pt-video{transform:scaleX(-1);}' +
3208
+ // A box reflected back about its body (a vertical label, #955) or a
3209
+ // vertical frame of the page placed by a matrix that includes the mirror
3210
+ // (#960): what is in it is not mirrored, so nothing is turned back.
3211
+ '.pt-flow-mirrored .pt-unmirrored [style*="white-space:pre"],.pt-flow-mirrored .pt-unmirrored img,' +
3212
+ '.pt-flow-mirrored .pt-unmirrored svg:not(.pt-char-grid),.pt-flow-mirrored .pt-unmirrored .pt-video{transform:none;}</style>';
3191
3213
  /** The character grid (稿纸) as one SVG path over the page, under the
3192
3214
  * text (see `cjkGridCells`). */
3193
3215
  function renderCharacterGridSvg(cells, width, height) {