pptx-react-viewer 4.73.1 → 4.74.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/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ A release listed with no entries carried no Conventional Commit in this package'
7
7
  scope: scripts/release-plan.mjs releases whenever any published file changes, not only on
8
8
  conventional commits.
9
9
 
10
+ ## [4.74.0](https://github.com/ChristopherVR/ooxml/releases/tag/pptx-react-viewer@4.74.0) - 2026-11-11
11
+
12
+ ### Features
13
+
14
+ - **pptx:** Export a slide thumbnail building block in every binding ([#242](https://github.com/ChristopherVR/ooxml/issues/242)) ([f717202](https://github.com/ChristopherVR/ooxml/commit/f717202d7af2cbb01b65cf2d02f598bff1dbb492))
15
+
10
16
  ## [4.73.1](https://github.com/ChristopherVR/ooxml/releases/tag/pptx-react-viewer@4.73.1) - 2026-11-09
11
17
 
12
18
  ### Dependencies
@@ -36,6 +36,113 @@ function useThemeStyle(theme) {
36
36
  return vars;
37
37
  }, [theme]);
38
38
  }
39
+ function getReactSlideBackgroundStyle(slide, slideSize) {
40
+ const style = pptx.getSlideBackgroundStyle(slide, slideSize);
41
+ return {
42
+ backgroundColor: style["background-color"],
43
+ backgroundImage: slide?.backgroundImage ? void 0 : style["background-image"],
44
+ backgroundSize: style["background-size"],
45
+ backgroundRepeat: style["background-repeat"]
46
+ };
47
+ }
48
+ function SlideThumbnailImpl({
49
+ slide,
50
+ templateElements,
51
+ canvasSize,
52
+ previewWidth,
53
+ fieldContext,
54
+ tableStyleContext
55
+ }) {
56
+ const safeCanvasWidth = Math.max(canvasSize.width, 1);
57
+ const safeCanvasHeight = Math.max(canvasSize.height, 1);
58
+ const layout = pptx.slideThumbnailLayout(
59
+ safeCanvasWidth,
60
+ safeCanvasHeight,
61
+ previewWidth ?? chunkP2COO2QO_js.SLIDE_NAV_THUMBNAIL_WIDTH
62
+ );
63
+ const { height: previewHeight, scale } = layout;
64
+ const previewElements = pptx.buildPreviewElements(slide, templateElements);
65
+ const slideFieldContext = pptx.deriveSlideFieldContext(fieldContext, slide);
66
+ const { t } = chunkP2COO2QO_js.useTranslation();
67
+ const transitionBadge = pptx.slideThumbnailTransitionBadge(slide, t);
68
+ return /* @__PURE__ */ jsxRuntime.jsxs(
69
+ "div",
70
+ {
71
+ className: previewWidth === void 0 ? "relative w-full overflow-hidden rounded border border-border bg-white" : "relative w-full overflow-hidden bg-white",
72
+ style: {
73
+ height: previewHeight,
74
+ ...getReactSlideBackgroundStyle(slide, {
75
+ widthPx: safeCanvasWidth,
76
+ heightPx: safeCanvasHeight
77
+ })
78
+ },
79
+ children: [
80
+ /* @__PURE__ */ jsxRuntime.jsxs(
81
+ "div",
82
+ {
83
+ className: "absolute top-0 left-0 origin-top-left",
84
+ style: {
85
+ width: safeCanvasWidth,
86
+ height: safeCanvasHeight,
87
+ transform: `scale(${scale})`,
88
+ transformOrigin: "top left",
89
+ ...pptx.deviceStrokeStageStyle(scale)
90
+ },
91
+ children: [
92
+ /* @__PURE__ */ jsxRuntime.jsx(chunkXG4WSJ4O_js.SlideBackgroundImageLayer, { slide }),
93
+ previewElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
94
+ chunkXG4WSJ4O_js.StaticElementRenderer,
95
+ {
96
+ element,
97
+ activeSlide: slide,
98
+ allSlides: [slide],
99
+ zIndex: index,
100
+ fieldContext: slideFieldContext,
101
+ tableStyleContext
102
+ },
103
+ element.id
104
+ ))
105
+ ]
106
+ }
107
+ ),
108
+ transitionBadge && /* @__PURE__ */ jsxRuntime.jsx(
109
+ "div",
110
+ {
111
+ "data-pptx-thumbnail-transition": "",
112
+ title: transitionBadge.title,
113
+ style: pptx.slideThumbnailTransitionBadgeStyle(layout),
114
+ children: transitionBadge.label
115
+ }
116
+ )
117
+ ]
118
+ }
119
+ );
120
+ }
121
+ function slideThumbnailPropsEqual(prev, next) {
122
+ if (prev.previewWidth !== next.previewWidth) {
123
+ return false;
124
+ }
125
+ if (prev.slide !== next.slide) {
126
+ return false;
127
+ }
128
+ if (prev.templateElements !== next.templateElements) {
129
+ return false;
130
+ }
131
+ if (prev.fieldContext !== next.fieldContext) {
132
+ return false;
133
+ }
134
+ if (prev.tableStyleContext !== next.tableStyleContext) {
135
+ return false;
136
+ }
137
+ if (prev.canvasSize.width !== next.canvasSize.width || prev.canvasSize.height !== next.canvasSize.height) {
138
+ return false;
139
+ }
140
+ return true;
141
+ }
142
+ var SlideThumbnail = /* @__PURE__ */ React108__default.default.memo(
143
+ SlideThumbnailImpl,
144
+ slideThumbnailPropsEqual
145
+ );
39
146
  function getInitials(name) {
40
147
  const parts = name.trim().split(/\s+/u);
41
148
  if (parts.length >= 2) {
@@ -525,134 +632,6 @@ function SlideContextMenu({
525
632
  }
526
633
  );
527
634
  }
528
- function getReactSlideBackgroundStyle(slide, slideSize) {
529
- const style = pptx.getSlideBackgroundStyle(slide, slideSize);
530
- return {
531
- backgroundColor: style["background-color"],
532
- backgroundImage: slide?.backgroundImage ? void 0 : style["background-image"],
533
- backgroundSize: style["background-size"],
534
- backgroundRepeat: style["background-repeat"]
535
- };
536
- }
537
- function SlideThumbnailImpl({
538
- slide,
539
- templateElements,
540
- canvasSize,
541
- previewWidth,
542
- fieldContext,
543
- tableStyleContext
544
- }) {
545
- const safeCanvasWidth = Math.max(canvasSize.width, 1);
546
- const safeCanvasHeight = Math.max(canvasSize.height, 1);
547
- const width = previewWidth ?? chunkP2COO2QO_js.SLIDE_NAV_THUMBNAIL_WIDTH;
548
- const scale = width / safeCanvasWidth;
549
- const previewHeight = pptx.editorThumbnailHeight(safeCanvasWidth, safeCanvasHeight, width);
550
- const previewElements = pptx.buildPreviewElements(slide, templateElements);
551
- const slideFieldContext = pptx.deriveSlideFieldContext(fieldContext, slide);
552
- const { t } = chunkP2COO2QO_js.useTranslation();
553
- const transitionLabel = slide.transition ? (() => {
554
- const opt = chunkP2COO2QO_js.SLIDE_TRANSITION_OPTIONS.find((o) => o.value === slide.transition?.type);
555
- return opt ? t(opt.i18nKey) : slide.transition.type;
556
- })() : void 0;
557
- return /* @__PURE__ */ jsxRuntime.jsx(
558
- "div",
559
- {
560
- className: previewWidth === void 0 ? "relative w-full overflow-hidden rounded border border-border bg-white" : "relative w-full overflow-hidden bg-white",
561
- style: {
562
- height: previewHeight,
563
- ...getReactSlideBackgroundStyle(slide, {
564
- widthPx: safeCanvasWidth,
565
- heightPx: safeCanvasHeight
566
- })
567
- },
568
- children: /* @__PURE__ */ jsxRuntime.jsxs(
569
- "div",
570
- {
571
- className: "absolute top-0 left-0 origin-top-left",
572
- style: {
573
- width: safeCanvasWidth,
574
- height: safeCanvasHeight,
575
- transform: `scale(${scale})`,
576
- transformOrigin: "top left",
577
- ...pptx.deviceStrokeStageStyle(scale)
578
- },
579
- children: [
580
- /* @__PURE__ */ jsxRuntime.jsx(chunkXG4WSJ4O_js.SlideBackgroundImageLayer, { slide }),
581
- slide.transition && slide.transition.type !== "none" && slide.transition.type !== "cut" && /* @__PURE__ */ jsxRuntime.jsx(
582
- "div",
583
- {
584
- className: "absolute top-0.5 right-0.5 z-10 px-1 py-px rounded bg-primary/80 text-[7px] text-white leading-tight pointer-events-none",
585
- title: t("pptx.slideThumbnail.transitionTooltip", { name: transitionLabel }),
586
- children: transitionLabel
587
- }
588
- ),
589
- previewElements.map((element, index) => /* @__PURE__ */ jsxRuntime.jsx(
590
- chunkXG4WSJ4O_js.StaticElementRenderer,
591
- {
592
- element,
593
- activeSlide: slide,
594
- allSlides: [slide],
595
- zIndex: index,
596
- fieldContext: slideFieldContext,
597
- tableStyleContext
598
- },
599
- element.id
600
- ))
601
- ]
602
- }
603
- )
604
- }
605
- );
606
- }
607
- function slideThumbnailPropsEqual(prev, next) {
608
- if (prev.previewWidth !== next.previewWidth) {
609
- return false;
610
- }
611
- if (prev.slide.id !== next.slide.id) {
612
- return false;
613
- }
614
- if (prev.slide.isDirty !== next.slide.isDirty) {
615
- return false;
616
- }
617
- if (prev.slide.hidden !== next.slide.hidden) {
618
- return false;
619
- }
620
- if (prev.slide.elements !== next.slide.elements) {
621
- return false;
622
- }
623
- if (prev.slide.showMasterShapes !== next.slide.showMasterShapes) {
624
- return false;
625
- }
626
- if (prev.slide.backgroundColor !== next.slide.backgroundColor) {
627
- return false;
628
- }
629
- if (prev.slide.backgroundImage !== next.slide.backgroundImage) {
630
- return false;
631
- }
632
- if (prev.slide.backgroundGradient !== next.slide.backgroundGradient) {
633
- return false;
634
- }
635
- if (prev.slide.backgroundPattern !== next.slide.backgroundPattern) {
636
- return false;
637
- }
638
- if (prev.templateElements !== next.templateElements) {
639
- return false;
640
- }
641
- if (prev.fieldContext !== next.fieldContext) {
642
- return false;
643
- }
644
- if (prev.tableStyleContext !== next.tableStyleContext) {
645
- return false;
646
- }
647
- if (prev.canvasSize.width !== next.canvasSize.width || prev.canvasSize.height !== next.canvasSize.height) {
648
- return false;
649
- }
650
- return true;
651
- }
652
- var SlideThumbnail = /* @__PURE__ */ React108__default.default.memo(
653
- SlideThumbnailImpl,
654
- slideThumbnailPropsEqual
655
- );
656
635
  function LazyThumbnailInner({
657
636
  slide,
658
637
  templateElements,
@@ -2853,7 +2832,7 @@ function AccountPage() {
2853
2832
  refreshUsage();
2854
2833
  setTimeout(() => setCleared(false), 4e3);
2855
2834
  };
2856
- const version = "4.73.1" ;
2835
+ const version = "4.74.0" ;
2857
2836
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 max-w-[700px] space-y-6", children: [
2858
2837
  /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cardClass, children: [
2859
2838
  /* @__PURE__ */ jsxRuntime.jsxs("h2", { className: "flex items-center gap-2 text-sm font-semibold", children: [
@@ -10600,17 +10579,8 @@ function SlideCardImpl({
10600
10579
  }
10601
10580
  );
10602
10581
  }
10603
- function arePropsEqual(prev, next) {
10604
- if (prev.slide.id !== next.slide.id) {
10605
- return false;
10606
- }
10607
- if (prev.slide.isDirty !== next.slide.isDirty) {
10608
- return false;
10609
- }
10610
- if (prev.slide.hidden !== next.slide.hidden) {
10611
- return false;
10612
- }
10613
- if (prev.slide.elements !== next.slide.elements) {
10582
+ function slideCardPropsEqual(prev, next) {
10583
+ if (prev.slide !== next.slide) {
10614
10584
  return false;
10615
10585
  }
10616
10586
  if (prev.index !== next.index) {
@@ -10642,7 +10612,7 @@ function arePropsEqual(prev, next) {
10642
10612
  }
10643
10613
  return true;
10644
10614
  }
10645
- var SlideCard = /* @__PURE__ */ React108__default.default.memo(SlideCardImpl, arePropsEqual);
10615
+ var SlideCard = /* @__PURE__ */ React108__default.default.memo(SlideCardImpl, slideCardPropsEqual);
10646
10616
  var ICON_CLASS = "h-3.5 w-3.5 text-muted-foreground";
10647
10617
  function SorterContextMenu({
10648
10618
  x,
@@ -13970,28 +13940,7 @@ function ScaledSlidePreviewImpl({
13970
13940
  );
13971
13941
  }
13972
13942
  function scaledSlidePreviewPropsEqual(prev, next) {
13973
- if (prev.slide.id !== next.slide.id) {
13974
- return false;
13975
- }
13976
- if (prev.slide.isDirty !== next.slide.isDirty) {
13977
- return false;
13978
- }
13979
- if (prev.slide.hidden !== next.slide.hidden) {
13980
- return false;
13981
- }
13982
- if (prev.slide.elements !== next.slide.elements) {
13983
- return false;
13984
- }
13985
- if (prev.slide.showMasterShapes !== next.slide.showMasterShapes) {
13986
- return false;
13987
- }
13988
- if (prev.slide.backgroundColor !== next.slide.backgroundColor) {
13989
- return false;
13990
- }
13991
- if (prev.slide.backgroundImage !== next.slide.backgroundImage) {
13992
- return false;
13993
- }
13994
- if (prev.slide.backgroundGradient !== next.slide.backgroundGradient) {
13943
+ if (prev.slide !== next.slide) {
13995
13944
  return false;
13996
13945
  }
13997
13946
  if (prev.templateElements !== next.templateElements) {
@@ -35646,6 +35595,7 @@ exports.PptxI18nProvider = PptxI18nProvider;
35646
35595
  exports.SlideCanvas = SlideCanvas;
35647
35596
  exports.SlideTemplateGalleryDialog = SlideTemplateGalleryDialog;
35648
35597
  exports.SlideTemplatePreview = SlideTemplatePreview;
35598
+ exports.SlideThumbnail = SlideThumbnail;
35649
35599
  exports.SlidesPaneSidebar = SlidesPaneSidebar;
35650
35600
  exports.Toolbar = Toolbar;
35651
35601
  exports.UserAvatarBar = UserAvatarBar;
Binary file
Binary file