pptx-react-viewer 4.49.0 → 4.51.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 (124) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +38 -4
  3. package/dist/{AiChatPanel-S4WNQCY4.js → AiChatPanel-EV22O7UO.js} +19 -20
  4. package/dist/AiChatPanel-EV22O7UO.js.br +0 -0
  5. package/dist/AiChatPanel-EV22O7UO.js.gz +0 -0
  6. package/dist/{AiChatPanel-NKTBHT5B.mjs → AiChatPanel-R323KNGN.mjs} +1 -2
  7. package/dist/AiChatPanel-R323KNGN.mjs.br +0 -0
  8. package/dist/AiChatPanel-R323KNGN.mjs.gz +0 -0
  9. package/dist/{chunk-Z62JFXMZ.mjs → chunk-ACFR4LFQ.mjs} +577 -1028
  10. package/dist/chunk-ACFR4LFQ.mjs.br +0 -0
  11. package/dist/chunk-ACFR4LFQ.mjs.gz +0 -0
  12. package/dist/chunk-DDJ634MV.js.br +0 -0
  13. package/dist/chunk-DDJ634MV.js.gz +0 -0
  14. package/dist/{chunk-YKLL2Z33.mjs → chunk-ETJ752B5.mjs} +597 -1871
  15. package/dist/chunk-ETJ752B5.mjs.br +0 -0
  16. package/dist/chunk-ETJ752B5.mjs.gz +0 -0
  17. package/dist/chunk-QIUK53JR.mjs.br +0 -0
  18. package/dist/chunk-QIUK53JR.mjs.gz +0 -0
  19. package/dist/{chunk-ME5QRTVS.js → chunk-V3XADJ2O.js} +763 -1214
  20. package/dist/chunk-V3XADJ2O.js.br +0 -0
  21. package/dist/chunk-V3XADJ2O.js.gz +0 -0
  22. package/dist/{chunk-2ZXXHNNR.js → chunk-VI5DQRQZ.js} +2052 -3325
  23. package/dist/chunk-VI5DQRQZ.js.br +0 -0
  24. package/dist/chunk-VI5DQRQZ.js.gz +0 -0
  25. package/dist/{chunk-JAI42EXQ.js → chunk-Z22RD3E2.js} +41 -12
  26. package/dist/chunk-Z22RD3E2.js.br +0 -0
  27. package/dist/chunk-Z22RD3E2.js.gz +0 -0
  28. package/dist/{chunk-PFV626ED.mjs → chunk-ZCGYPCZM.mjs} +37 -8
  29. package/dist/chunk-ZCGYPCZM.mjs.br +0 -0
  30. package/dist/chunk-ZCGYPCZM.mjs.gz +0 -0
  31. package/dist/i18n/de.cjs +1138 -221
  32. package/dist/i18n/de.cjs.br +0 -0
  33. package/dist/i18n/de.cjs.gz +0 -0
  34. package/dist/i18n/de.mjs +1138 -221
  35. package/dist/i18n/de.mjs.br +0 -0
  36. package/dist/i18n/de.mjs.gz +0 -0
  37. package/dist/i18n/es.cjs +1138 -221
  38. package/dist/i18n/es.cjs.br +0 -0
  39. package/dist/i18n/es.cjs.gz +0 -0
  40. package/dist/i18n/es.mjs +1138 -221
  41. package/dist/i18n/es.mjs.br +0 -0
  42. package/dist/i18n/es.mjs.gz +0 -0
  43. package/dist/i18n/fr.cjs +1138 -221
  44. package/dist/i18n/fr.cjs.br +0 -0
  45. package/dist/i18n/fr.cjs.gz +0 -0
  46. package/dist/i18n/fr.mjs +1138 -221
  47. package/dist/i18n/fr.mjs.br +0 -0
  48. package/dist/i18n/fr.mjs.gz +0 -0
  49. package/dist/i18n/zh-CN.cjs +1138 -221
  50. package/dist/i18n/zh-CN.cjs.br +0 -0
  51. package/dist/i18n/zh-CN.cjs.gz +0 -0
  52. package/dist/i18n/zh-CN.mjs +1138 -221
  53. package/dist/i18n/zh-CN.mjs.br +0 -0
  54. package/dist/i18n/zh-CN.mjs.gz +0 -0
  55. package/dist/index.d.ts +56 -27
  56. package/dist/index.js +28 -24
  57. package/dist/index.js.br +0 -0
  58. package/dist/index.js.gz +0 -0
  59. package/dist/index.mjs +3 -3
  60. package/dist/index.mjs.br +0 -0
  61. package/dist/index.mjs.gz +0 -0
  62. package/dist/internals.d.ts +105 -94
  63. package/dist/internals.js +81 -81
  64. package/dist/internals.js.br +0 -0
  65. package/dist/internals.js.gz +0 -0
  66. package/dist/internals.mjs +2 -2
  67. package/dist/internals.mjs.br +0 -0
  68. package/dist/internals.mjs.gz +0 -0
  69. package/dist/pptx-viewer-canvas.css +1 -1
  70. package/dist/pptx-viewer-canvas.css.br +0 -0
  71. package/dist/pptx-viewer-canvas.css.gz +0 -0
  72. package/dist/pptx-viewer.css +1 -1
  73. package/dist/pptx-viewer.css.br +0 -0
  74. package/dist/pptx-viewer.css.gz +0 -0
  75. package/dist/viewer/index.d.ts +58 -24
  76. package/dist/viewer/index.js +23 -19
  77. package/dist/viewer/index.js.br +0 -0
  78. package/dist/viewer/index.js.gz +0 -0
  79. package/dist/viewer/index.mjs +3 -3
  80. package/dist/viewer/index.mjs.br +0 -0
  81. package/dist/viewer/index.mjs.gz +0 -0
  82. package/dist/{y-webrtc-2H7UYAQD.mjs → y-webrtc-HRGGVQZH.mjs} +1 -1
  83. package/dist/y-webrtc-HRGGVQZH.mjs.br +0 -0
  84. package/dist/y-webrtc-HRGGVQZH.mjs.gz +0 -0
  85. package/dist/{y-webrtc-DVPQNFLL.js → y-webrtc-QVVT5PCK.js} +124 -124
  86. package/dist/y-webrtc-QVVT5PCK.js.br +0 -0
  87. package/dist/y-webrtc-QVVT5PCK.js.gz +0 -0
  88. package/dist/{y-websocket-WORVRRQS.mjs → y-websocket-46M6UFI7.mjs} +1 -1
  89. package/dist/y-websocket-46M6UFI7.mjs.br +0 -0
  90. package/dist/y-websocket-46M6UFI7.mjs.gz +0 -0
  91. package/dist/{y-websocket-TN4OKPXQ.js → y-websocket-EDOMWMAD.js} +78 -78
  92. package/dist/y-websocket-EDOMWMAD.js.br +0 -0
  93. package/dist/y-websocket-EDOMWMAD.js.gz +0 -0
  94. package/package.json +3 -3
  95. package/dist/AiChatPanel-NKTBHT5B.mjs.br +0 -0
  96. package/dist/AiChatPanel-NKTBHT5B.mjs.gz +0 -0
  97. package/dist/AiChatPanel-S4WNQCY4.js.br +0 -0
  98. package/dist/AiChatPanel-S4WNQCY4.js.gz +0 -0
  99. package/dist/chunk-2ZXXHNNR.js.br +0 -0
  100. package/dist/chunk-2ZXXHNNR.js.gz +0 -0
  101. package/dist/chunk-3VVZGHHY.mjs.br +0 -0
  102. package/dist/chunk-3VVZGHHY.mjs.gz +0 -0
  103. package/dist/chunk-JAI42EXQ.js.br +0 -0
  104. package/dist/chunk-JAI42EXQ.js.gz +0 -0
  105. package/dist/chunk-ME5QRTVS.js.br +0 -0
  106. package/dist/chunk-ME5QRTVS.js.gz +0 -0
  107. package/dist/chunk-NUNDT6EL.js.br +0 -0
  108. package/dist/chunk-NUNDT6EL.js.gz +0 -0
  109. package/dist/chunk-PFV626ED.mjs.br +0 -0
  110. package/dist/chunk-PFV626ED.mjs.gz +0 -0
  111. package/dist/chunk-YKLL2Z33.mjs.br +0 -0
  112. package/dist/chunk-YKLL2Z33.mjs.gz +0 -0
  113. package/dist/chunk-Z62JFXMZ.mjs.br +0 -0
  114. package/dist/chunk-Z62JFXMZ.mjs.gz +0 -0
  115. package/dist/y-webrtc-2H7UYAQD.mjs.br +0 -0
  116. package/dist/y-webrtc-2H7UYAQD.mjs.gz +0 -0
  117. package/dist/y-webrtc-DVPQNFLL.js.br +0 -0
  118. package/dist/y-webrtc-DVPQNFLL.js.gz +0 -0
  119. package/dist/y-websocket-TN4OKPXQ.js.br +0 -0
  120. package/dist/y-websocket-TN4OKPXQ.js.gz +0 -0
  121. package/dist/y-websocket-WORVRRQS.mjs.br +0 -0
  122. package/dist/y-websocket-WORVRRQS.mjs.gz +0 -0
  123. package/dist/{chunk-NUNDT6EL.js → chunk-DDJ634MV.js} +436 -436
  124. package/dist/{chunk-3VVZGHHY.mjs → chunk-QIUK53JR.mjs} +436 -436
package/CHANGELOG.md CHANGED
@@ -7,6 +7,131 @@ 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.51.0](https://github.com/ChristopherVR/ooxml/releases/tag/pptx-react-viewer@4.51.0) - 2026-10-23
11
+
12
+ ### Features
13
+
14
+ - **react:** Let hosts translate the viewer through PptxI18nProvider ([d171dc1](https://github.com/ChristopherVR/ooxml/commit/d171dc1ccabdea3c27cac11db9971fd5d23bdab7))
15
+
16
+ ### Bug Fixes
17
+
18
+ - **xlsx:** Close the open code scanning alerts in core ([0f6b643](https://github.com/ChristopherVR/ooxml/commit/0f6b64306e57958a097caaf7085d63479766acb3))
19
+ - **pptx:** Apply theme picks in place and keep theme tiles stable ([ecb6385](https://github.com/ChristopherVR/ooxml/commit/ecb6385a8e211b60461f842eb4a88945555796e5))
20
+
21
+ ### Refactor
22
+
23
+ - **react:** Route translations through an internal useTranslation hook ([cbe1912](https://github.com/ChristopherVR/ooxml/commit/cbe1912f38747ca01a07fc7475c0103574b5fb62))
24
+
25
+ ### Testing
26
+
27
+ - **pptx:** Copy fixture Buffers by value in the chart save harnesses ([#181](https://github.com/ChristopherVR/ooxml/issues/181)) ([90ce9e4](https://github.com/ChristopherVR/ooxml/commit/90ce9e4704be388ef1ee8723c0b745c3457f07e7))
28
+
29
+ ## [4.50.0](https://github.com/ChristopherVR/ooxml/releases/tag/pptx-react-viewer@4.50.0) - 2026-10-23
30
+
31
+ ### Features
32
+
33
+ - **chart:** Model pie-of-pie split options and date axis time units ([82e3a08](https://github.com/ChristopherVR/ooxml/commit/82e3a08de62696cdd1632a07783b78019ed8e91b))
34
+ - **chart:** Add neutral chart edit operations over ChartSpace ([af3c35b](https://github.com/ChristopherVR/ooxml/commit/af3c35bc9fb61833dd94aec813d8d7a16829d733))
35
+ - **drawingml:** Add the neutral rich text body model, reader and writer ([14539db](https://github.com/ChristopherVR/ooxml/commit/14539dba2f3f8018d73dd956fb25b61d385f36a5))
36
+ - **diagram:** Share smartart node text projection and reconciliation ([a284df7](https://github.com/ChristopherVR/ooxml/commit/a284df74bc9a1dee5003be0c7b3e9df4b44b5a9c))
37
+ - **diagram:** Expose smartart node paragraphs to word and excel ([c48a282](https://github.com/ChristopherVR/ooxml/commit/c48a2821587f86bfcfd58722f06f71e00834539f))
38
+ - **chart:** Add the neutral chart data sheet model ([a681ccb](https://github.com/ChristopherVR/ooxml/commit/a681ccb4b39eef5af6a419cc340029f7bd13eb56))
39
+ - **ui:** Add the shared chart data sheet element ([0a87377](https://github.com/ChristopherVR/ooxml/commit/0a873776e44afbd9f2c672bafdc42e941cfd3957))
40
+ - **pptx:** Export the one default undo depth ([9320c81](https://github.com/ChristopherVR/ooxml/commit/9320c81872b1508d79293b5abddc5e9abf7136db))
41
+ - **diagram:** Add the product-neutral SmartArt gallery catalogue ([219e709](https://github.com/ChristopherVR/ooxml/commit/219e709651e480cd7e6be0c26625d5933b3699be))
42
+ - **ui:** Add shared SmartArt picker and pptx insert dialogs ([85085d9](https://github.com/ChristopherVR/ooxml/commit/85085d9f21e9dc9b54c08d36c8e63f63db0b3f88))
43
+ - **react:** Use the shared insert smartart and chart dialogs ([17948b1](https://github.com/ChristopherVR/ooxml/commit/17948b126c406fd15b7b58998dafc227e5e09ee3))
44
+ - **diagram:** Resolve cached smartart drawing shapes into a neutral view ([cba3609](https://github.com/ChristopherVR/ooxml/commit/cba360940c0ed00270917b2d56f5456055e10ea3))
45
+ - **chart:** Add format-target edits and typed chart edit intents ([10e1ee3](https://github.com/ChristopherVR/ooxml/commit/10e1ee3536407edc388f1ed9a4fba97632ad17b6))
46
+ - **pptx:** Save chart title and legend edits through writeChartSpace ([f29502f](https://github.com/ChristopherVR/ooxml/commit/f29502fcf5ace041780d0fbd413fb180fad38fbc))
47
+ - **pptx:** Save chart axis edits through writeChartSpace ([457eeaf](https://github.com/ChristopherVR/ooxml/commit/457eeaf1c7517380ef901d985ce96a923a008da7))
48
+ - **pptx:** Save chart series data edits through writeChartSpace ([e2c156b](https://github.com/ChristopherVR/ooxml/commit/e2c156b34224b743c2355c240e57c0973d931e17))
49
+ - **ui:** Add the shared pptx autosave and recovery controllers ([318997a](https://github.com/ChristopherVR/ooxml/commit/318997a5984e5479dfc913d7cad7785458329fbb))
50
+ - **ui:** Draw the pptx effects inspector from shared field descriptors ([3e5afa8](https://github.com/ChristopherVR/ooxml/commit/3e5afa829164142fd4a97866db24efe861c6db1e))
51
+ - **ui:** Draw the pptx line options from shared field descriptors ([6194f50](https://github.com/ChristopherVR/ooxml/commit/6194f509e0715ce9d653a49742402693952cbfee))
52
+ - **ui:** Draw the pptx size and position fields from descriptors ([edd890a](https://github.com/ChristopherVR/ooxml/commit/edd890a291dc01af63cfdb8c245b131d298868bc))
53
+ - **ui:** Draw the pptx text box options from shared field descriptors ([bf34da5](https://github.com/ChristopherVR/ooxml/commit/bf34da5910f4623e189b0ff7b6ffe37f632dd949))
54
+ - **chart:** Move the embedded workbook writer into chart/workbook ([b766e1b](https://github.com/ChristopherVR/ooxml/commit/b766e1bbc67fdde7959c5c5b06bde46e41e07ccd))
55
+ - **chart:** Share the chart design galleries and add quick layouts ([c95c89a](https://github.com/ChristopherVR/ooxml/commit/c95c89aab3ac5cdd6cdb500e033d0b799533343e))
56
+ - **chart:** Apply chart data sheet edits to a chart space ([d181cda](https://github.com/ChristopherVR/ooxml/commit/d181cda21ad1c87b7b20e3a7476754b455baea43))
57
+ - **chart:** Model, parse and write chartex parts ([07f1d0f](https://github.com/ChristopherVR/ooxml/commit/07f1d0f99ef2a3c0132feedd9c2d626045938985))
58
+ - **chart:** Add neutral chartex edit operations ([a48f991](https://github.com/ChristopherVR/ooxml/commit/a48f991b83c83ab411040f6fd7ca44bd8a24ad19))
59
+ - **pptx:** Save chartex edits through writeChartExSpace ([b4b7ca6](https://github.com/ChristopherVR/ooxml/commit/b4b7ca6ec1eb9201777419197db363ad868eaeb3))
60
+ - **diagram:** Write edits back into an existing smartart data part ([2393535](https://github.com/ChristopherVR/ooxml/commit/23935356efb880f8963bd3b03cc04a67f1bb0b27))
61
+ - **docx:** Change smartart layouts and draw diagrams without a cache ([5758d49](https://github.com/ChristopherVR/ooxml/commit/5758d49d2bd307b5cbaa663392660365ea2567c6))
62
+ - **chart:** Keep unmodelled chart-space children in edited parts ([3b4e506](https://github.com/ChristopherVR/ooxml/commit/3b4e5064d421af3f6ad1a3ee37132dd93e60b79c))
63
+ - **chart:** Keep band formats and picture options verbatim ([502f3a4](https://github.com/ChristopherVR/ooxml/commit/502f3a4ac646fce0b79fcf4a0eaf796758eaa704))
64
+ - **pptx:** Expose smartart add shape before and above ([9427df7](https://github.com/ChristopherVR/ooxml/commit/9427df74947c45b487f944c33f33c629f5264753))
65
+ - **diagram:** Share the outline levels of a diagram's nodes ([d20e8cf](https://github.com/ChristopherVR/ooxml/commit/d20e8cf0bcfe2b9b8c5c6e06f5701adb0ef68673))
66
+ - **ui:** Add the pptx-ui-smartart-text-pane alias ([89dc5f1](https://github.com/ChristopherVR/ooxml/commit/89dc5f16edb98cbab866132f7de9548562cd0d4b))
67
+ - **ui:** Add shape before and above to the smartart design ribbon ([6a1c8d8](https://github.com/ChristopherVR/ooxml/commit/6a1c8d88414c4d2673ea289da043032558c10db3))
68
+ - **ui:** Draw the pptx inspector Recent Colors on the shared colour grid ([#174](https://github.com/ChristopherVR/ooxml/issues/174)) ([8f99d4a](https://github.com/ChristopherVR/ooxml/commit/8f99d4a3b1bf0750b51279b374992ffe338fb33a))
69
+
70
+ ### Bug Fixes
71
+
72
+ - **chart:** Drop an unused import from the title edits ([ecb2f09](https://github.com/ChristopherVR/ooxml/commit/ecb2f0985cc5e487d51c1111859dff2a5e644bfb))
73
+ - **ui:** Keep the smartart picker css on design tokens ([a58dddd](https://github.com/ChristopherVR/ooxml/commit/a58dddd33cfb6a81ebc0100796d972a88e8bf756))
74
+ - **chart:** Keep the chart data table in line with written cells ([67387d4](https://github.com/ChristopherVR/ooxml/commit/67387d47ead5b31431143f1514b139a7728ae5be))
75
+ - **pptx:** Read bare chartex elements and named axis units ([d0db2ca](https://github.com/ChristopherVR/ooxml/commit/d0db2caf07721b154a404bbd0158867c352be3e2))
76
+ - **react:** Autosave uncommitted inline text ([84e4b15](https://github.com/ChristopherVR/ooxml/commit/84e4b1507bd1d4d8959dfc3af67d89a506131cc6))
77
+ - **xlsx:** Never rewrite a chart part the model cannot carry ([ac136f7](https://github.com/ChristopherVR/ooxml/commit/ac136f7319080e129106b452504ca915310367f3))
78
+
79
+ ### Other
80
+
81
+ - Neutral chart edit operations (wave6-3) ([6c283c3](https://github.com/ChristopherVR/ooxml/commit/6c283c3b863b75ae00ef407db1903c42b9785212))
82
+ - Neutral text model and shared smartart node text (wave6-4) ([10b6a35](https://github.com/ChristopherVR/ooxml/commit/10b6a359d10de68064ef8d0f525227d77631be93))
83
+ - Shared chart data sheet (wave6-5) ([b546a73](https://github.com/ChristopherVR/ooxml/commit/b546a73c0eff334308473e8d970e72cd674534e0))
84
+ - Pptx headless controllers (wave6-2) ([41dc33b](https://github.com/ChristopherVR/ooxml/commit/41dc33be23af816e33e08983f29e08621d5ae32f))
85
+ - Shared smartart picker and insert dialogs (wave6-6) ([60c4372](https://github.com/ChristopherVR/ooxml/commit/60c437219dc3e495238bb0760e17a8036e511f41))
86
+ - Smartart drawing view, edit operations and data writer (wave6-8) ([c2fe92b](https://github.com/ChristopherVR/ooxml/commit/c2fe92b05f243b5d5a9af2aed867a26957095bbd))
87
+ - Shared chart format pane (wave6-7) ([0324c80](https://github.com/ChristopherVR/ooxml/commit/0324c80633332e602ce813bc64b0e231ab6b64af))
88
+ - Pptx chart save through writeChartSpace (wave6-9) ([5ea372f](https://github.com/ChristopherVR/ooxml/commit/5ea372f859ced6b11455e8e09a0425793cf7cd67))
89
+ - Pptx autosave, recovery and collaboration controllers (wave6-10) ([e48da7a](https://github.com/ChristopherVR/ooxml/commit/e48da7a6ffb025682d27314d537868355512916f))
90
+ - Pptx inspector field descriptors (wave6-12) ([a360ffc](https://github.com/ChristopherVR/ooxml/commit/a360ffcbec5303ebe7d427c5e442f99d82e72d06))
91
+ - Word chart editing (wave6-11) ([45ecd4b](https://github.com/ChristopherVR/ooxml/commit/45ecd4b144f4195cfa4cbe85763b87fbca162470))
92
+ - Shared chart design galleries and Visio chart editing (wave6-14) ([692e476](https://github.com/ChristopherVR/ooxml/commit/692e4763f28083d3d280b78a2e1a73e13f77499b))
93
+ - Neutral chartex model, parser, writer and edits (wave6-15) ([933b9c9](https://github.com/ChristopherVR/ooxml/commit/933b9c9bd78f3fb2825f2b5233b525791004f296))
94
+ - Bring wave6-integration into wave6-13 ([0b881ed](https://github.com/ChristopherVR/ooxml/commit/0b881ed1a85fe81295e0e68f7f92bd137e65f91b))
95
+ - Word SmartArt editing (wave6-13) ([751ba15](https://github.com/ChristopherVR/ooxml/commit/751ba157ca578e8ff6b57371a243180101ed562e))
96
+ - Autosave uncommitted inline text (wave6-10b) ([d75cc4d](https://github.com/ChristopherVR/ooxml/commit/d75cc4dc43d86717653481c6237679117ad586a6))
97
+ - Word chart Format pane, chart resizing and shared pane translations (wave6-17) ([d6ac348](https://github.com/ChristopherVR/ooxml/commit/d6ac3489fd3e8ed959f4978b4de8fd4674ee71b3))
98
+ - Shared pptx canvas gestures, group selection and show steps (wave6-16) ([2f0df81](https://github.com/ChristopherVR/ooxml/commit/2f0df81355f1c3e4db3e12a8d39489b5d4c23825))
99
+ - Excel SmartArt editing on the shared diagram core (wave6-20) ([c5fdb99](https://github.com/ChristopherVR/ooxml/commit/c5fdb9919cfce94ae9daac4d1079ca235c0c5183))
100
+ - Excel chart editing over ChartSpace (wave6-18) ([ce75f7f](https://github.com/ChristopherVR/ooxml/commit/ce75f7faba40314ebc8c6de2a43c757328aa4c40))
101
+ - Pptx SmartArt text pane on the shared element (wave6-19) ([e025597](https://github.com/ChristopherVR/ooxml/commit/e025597647c9b19da2c8a308e0cc44734c569c4d))
102
+ - Bring origin/main into wave 6 ([2fedfaa](https://github.com/ChristopherVR/ooxml/commit/2fedfaae708c279044fdf86ea192315e366f80da))
103
+
104
+ ### Refactor
105
+
106
+ - **drawingml:** Densify list style levels without self-assignment ([17276de](https://github.com/ChristopherVR/ooxml/commit/17276de4cc32eecc5a03de995e21aadd1d03a1af))
107
+ - **pptx:** Use the shared chart data sheet in every binding ([d47fd8d](https://github.com/ChristopherVR/ooxml/commit/d47fd8df56053bb21ca0d1eaa053b678201f7132))
108
+ - **react:** Adapt the shared history, key and ai controllers ([5b48aa7](https://github.com/ChristopherVR/ooxml/commit/5b48aa7f4de8365ccc10e533ece34f5c0d0c8069))
109
+ - **diagram:** Move smartart node operations and reflow to diagram ([bd35fff](https://github.com/ChristopherVR/ooxml/commit/bd35fff8ddee181f47358bc5a96a3969b2f330fa))
110
+ - **diagram:** Move the fabricated smartart data part writer ([d6fd6da](https://github.com/ChristopherVR/ooxml/commit/d6fd6daf55eeaefdfe3c32e772ea9b2423179998))
111
+ - **react:** Adapt the shared autosave and recovery controllers ([a240063](https://github.com/ChristopherVR/ooxml/commit/a240063f91d3418064be0c6db8422d5975d9125f))
112
+ - **react:** Adapt the shared collaboration provider and session ([eba178c](https://github.com/ChristopherVR/ooxml/commit/eba178cfa1bc3db638170c3cf9f74d998b54f064))
113
+ - **chart:** Build the chartex summary from the neutral model ([78ee4b0](https://github.com/ChristopherVR/ooxml/commit/78ee4b0ab816d0338b8615834ba9bbf09c43b8cc))
114
+ - **chart:** Split the chartex axis parser and share the test part ([a514e2f](https://github.com/ChristopherVR/ooxml/commit/a514e2f8a8c655b9e3e1f67c9da23234504c4cf6))
115
+ - **diagram:** Move built-in smartart definitions to diagram/builtin ([d673145](https://github.com/ChristopherVR/ooxml/commit/d6731456c840ef85032e490f60c3492b36cd7445))
116
+ - **ui:** Ship the chart Format pane's own translations ([d6c3d65](https://github.com/ChristopherVR/ooxml/commit/d6c3d6539cf8f28ba5032959a7e2bbd0076f15ae))
117
+ - **ui:** Run every pptx canvas gesture on the shared controller ([f10083a](https://github.com/ChristopherVR/ooxml/commit/f10083abf1c3dfc34dd7d2b0e0107ad8dadd0343))
118
+ - **ui:** Decide pptx slide show steps once for every binding ([582e31f](https://github.com/ChristopherVR/ooxml/commit/582e31ff532e343f589e3345360783e275704172))
119
+ - **diagram:** Share smartart node edits, tree order and inserts ([42b3ba1](https://github.com/ChristopherVR/ooxml/commit/42b3ba18f9b3369d3c69ae4615d755daaeb966fa))
120
+ - **diagram:** Share the smartart ui strings with every product ([b96c393](https://github.com/ChristopherVR/ooxml/commit/b96c393e820e88317bda0dea1ab25eb9e20b8b26))
121
+ - **pptx:** Use the shared smartart text pane in every binding ([329aee5](https://github.com/ChristopherVR/ooxml/commit/329aee50261d17801f0a2f8f36752e0c57abd93e))
122
+
123
+ ### Testing
124
+
125
+ - **pptx:** Prove neutral chart edits load as pptx chart edits ([8ac6160](https://github.com/ChristopherVR/ooxml/commit/8ac616029886e87f6c76b829297b574f63742519))
126
+ - **pptx:** Pin smartart text parity with the neutral text model ([a7ffb36](https://github.com/ChristopherVR/ooxml/commit/a7ffb36b635521e0aaa756747f6283df3611aa32))
127
+ - **pptx:** Follow the lint style in the chart data sheet tests ([f8679da](https://github.com/ChristopherVR/ooxml/commit/f8679da6613dde9d737b8f0518023c99320a5d50))
128
+ - **pptx:** Add the chart save harness for the neutral writer ([974c497](https://github.com/ChristopherVR/ooxml/commit/974c497dd6fc8945596bcb9b8ca04ad6dd7a1eb0))
129
+ - **pptx:** Leave workbook-dependent label flags out of the save harness ([79297e5](https://github.com/ChristopherVR/ooxml/commit/79297e52145624fde9a1fb27c9c09ab7ae3323fa))
130
+
131
+ ### Chores
132
+
133
+ - Format files the wave 6 merges left unformatted ([77bb7eb](https://github.com/ChristopherVR/ooxml/commit/77bb7eba1e3ed7984525ea862a189ac7d467f7dd))
134
+
10
135
  ## [4.49.0](https://github.com/ChristopherVR/ooxml/releases/tag/pptx-react-viewer@4.49.0) - 2026-10-23
11
136
 
12
137
  ### Features
package/README.md CHANGED
@@ -128,9 +128,9 @@ const bytes = await viewerRef.current?.getContent(); // Uint8Array of a valid .p
128
128
  | `defaultThemeKey` | `string` | n/a | Initial File > Options > Appearance selection when no persisted preference exists |
129
129
  | `availableThemes` | `ThemeCatalogEntry[]` | n/a | Theme choices offered by File > Options > Appearance (defaults to the built-in catalog) |
130
130
  | `onThemeChange` | `(key: string) => void` | n/a | Host hook for the appearance picker; when set, the host owns persisting the choice |
131
- | `defaultLocale` | `string` | n/a | Initial locale code when no persisted preference exists |
132
- | `availableLocales` | `LocaleCatalogEntry[]` | n/a | Locale choices offered by File > Options > Language (defaults to the registered i18next locales) |
133
- | `onLocaleChange` | `(code: string) => void` | n/a | Host hook for the language picker; when set, the host owns applying/persisting the switch |
131
+ | `defaultLocale` | `string` | n/a | Initial locale code when no persisted preference exists. Ignored inside a `PptxI18nProvider`, whose `locale` is the language |
132
+ | `availableLocales` | `LocaleCatalogEntry[]` | n/a | Locale choices offered by File > Options > Language (defaults to the registered i18next locales; inside a `PptxI18nProvider` no default: pass two or more with `onLocaleChange`) |
133
+ | `onLocaleChange` | `(code: string) => void` | n/a | Host hook for the language picker; when set, the host owns applying/persisting the switch. Inside a `PptxI18nProvider` the host always owns it, and without this callback the Language category is left out |
134
134
  | `accountAuth` | `AccountAuthConfig` | n/a | Optional sign-in hook point for File > Account (disabled unless `enabled: true`) |
135
135
 
136
136
  ### `PowerPointViewerHandle` (via `ref`)
@@ -267,7 +267,41 @@ The underlying palettes (`vermilionLightColors`, `vermilionDarkColors`) and radi
267
267
 
268
268
  ## Localization (i18n)
269
269
 
270
- UI labels go through [i18next](https://www.i18next.com/) / [react-i18next](https://react.i18next.com/) with dotted keys such as `pptx.statusBar.allSaved`. Initialise an i18next instance and wrap your app in `I18nextProvider` (the demo's `demos/pptx/demo-react/i18n.ts` shows a minimal config, including a `parseMissingKeyHandler` that derives Title Case labels for any key you don't explicitly translate). `pptx-react-viewer/i18n` exports `translationsEn` (the English dictionary), `keyToLabel` (the fallback), and a `TranslationKey` type you can use to type-check a new locale dictionary (`Record<TranslationKey, string>`) at compile time. Add a new language by supplying a resource bundle under its language code. See the [Localization guide](https://christophervr.github.io/ooxml/pptx/guide/localization) for full wiring examples and how to contribute a translation upstream; the live demo's language picker is a working reference.
270
+ UI labels go through [i18next](https://www.i18next.com/) / [react-i18next](https://react.i18next.com/) with dotted keys such as `pptx.statusBar.allSaved`, or through your own i18n library with `PptxI18nProvider` (see below). Initialise an i18next instance and wrap your app in `I18nextProvider` (the demo's `demos/pptx/demo-react/i18n.ts` shows a minimal config, including a `parseMissingKeyHandler` that derives Title Case labels for any key you don't explicitly translate). `pptx-react-viewer/i18n` exports `translationsEn` (the English dictionary), `keyToLabel` (the fallback), and a `TranslationKey` type you can use to type-check a new locale dictionary (`Record<TranslationKey, string>`) at compile time. Add a new language by supplying a resource bundle under its language code. See the [Localization guide](https://christophervr.github.io/ooxml/pptx/guide/localization) for full wiring examples and how to contribute a translation upstream; the live demo's language picker is a working reference.
271
+
272
+ ### Use your own i18n library
273
+
274
+ To translate the viewer with Lingui, FormatJS or any other library, wrap it (or the standalone building blocks) in `PptxI18nProvider` and pass a `translate(key, params)` function plus the active `locale`:
275
+
276
+ ```tsx
277
+ import { i18n } from '@lingui/core';
278
+ import { useLingui } from '@lingui/react';
279
+ import { LOCALE_CATALOG, PowerPointViewer, PptxI18nProvider } from 'pptx-react-viewer';
280
+ import type { PptxTranslate } from 'pptx-react-viewer';
281
+
282
+ import { dynamicActivate } from './i18n'; // loads a catalog, then calls i18n.activate(code)
283
+
284
+ // Module level, so it never changes: the viewer re-translates when `locale` changes.
285
+ const translate: PptxTranslate = (key, params) => i18n._(key, params);
286
+ const LOCALES = LOCALE_CATALOG.filter((entry) => ['en', 'fr'].includes(entry.code));
287
+
288
+ function TranslatedViewer({ content }: { content: Uint8Array }) {
289
+ const { i18n: active } = useLingui(); // re-renders when the language changes
290
+ return (
291
+ <PptxI18nProvider locale={active.locale} translate={translate}>
292
+ <PowerPointViewer
293
+ content={content}
294
+ availableLocales={LOCALES}
295
+ onLocaleChange={(code) => void dynamicActivate(code)}
296
+ />
297
+ </PptxI18nProvider>
298
+ );
299
+ }
300
+ ```
301
+
302
+ `translate` receives the viewer's params unchanged: `defaultValue`, `count` and the values of the `{{name}}` placeholders. Use the same names in your catalog (`{name}` in ICU syntax); `count` is a plain value, so pluralise in your catalog. `{{name}}` placeholders left in the text you return are filled too, so the shipped dictionaries work as they are: `const translate: PptxTranslate = (key) => translationsFr[key];`. A miss (the key itself, an empty string, nothing, or a throw) shows the built-in English text, then the call's default text, then a label derived from the key, never a raw key. Keep `translate` stable (a module-level function or `useCallback`): the viewer re-translates whenever `translate` or `locale` changes.
303
+
304
+ Inside a provider the host owns the language: the viewer never calls `changeLanguage`, ignores `defaultLocale` and never restores a stored language choice. File > Options > Language appears only with `onLocaleChange` and two or more `availableLocales`; a pick calls `onLocaleChange`, and the selection follows `locale` (`fr-CA` selects an offered `fr`). A `PowerPointViewer` reads the provider nearest above it; a provider rendered inside the viewer is ignored. `i18next` and `react-i18next` stay required peer dependencies in 4.x: install them, but inside a provider the viewer does not use them. `PptxI18nProvider` is React-only: the Vue and Angular bindings delegate to vue-i18n and ngx-translate, and Vanilla and Svelte take `messages` dictionaries.
271
305
 
272
306
  ## How it's built
273
307
 
@@ -1,9 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkJAI42EXQ_js = require('./chunk-JAI42EXQ.js');
3
+ var chunkZ22RD3E2_js = require('./chunk-Z22RD3E2.js');
4
4
  require('./chunk-PIRHQTI4.js');
5
5
  var react = require('react');
6
- var reactI18next = require('react-i18next');
7
6
  var lu = require('react-icons/lu');
8
7
  var ai = require('ooxml-ui/pptx/ai');
9
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -302,7 +301,7 @@ function AiComposer({
302
301
  prefillText,
303
302
  prefillNonce
304
303
  }) {
305
- const { t } = reactI18next.useTranslation();
304
+ const { t } = chunkZ22RD3E2_js.useTranslation();
306
305
  const [value, setValue] = react.useState("");
307
306
  const textareaRef = react.useRef(null);
308
307
  const appliedNonce = react.useRef(void 0);
@@ -365,7 +364,7 @@ function AiComposer({
365
364
  disabled: value.trim().length === 0,
366
365
  title: t("pptx.ai.send"),
367
366
  "aria-label": t("pptx.ai.send"),
368
- className: chunkJAI42EXQ_js.cn(
367
+ className: chunkZ22RD3E2_js.cn(
369
368
  "shrink-0 rounded-sm p-1.5 transition-colors",
370
369
  value.trim().length === 0 ? "text-muted-foreground/50" : "bg-primary text-primary-foreground hover:bg-primary/90"
371
370
  ),
@@ -387,7 +386,7 @@ function AiFocusBar({
387
386
  onStopPick,
388
387
  onClearPicks
389
388
  }) {
390
- const { t } = reactI18next.useTranslation();
389
+ const { t } = chunkZ22RD3E2_js.useTranslation();
391
390
  const chips = ai.focusTargetChips(targets, slides);
392
391
  const twoTables = ai.isTwoTableFocus(targets, slides);
393
392
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-border bg-secondary/30", children: [
@@ -396,7 +395,7 @@ function AiFocusBar({
396
395
  chips.map((chip) => /* @__PURE__ */ jsxRuntime.jsx(
397
396
  "span",
398
397
  {
399
- className: chunkJAI42EXQ_js.cn(
398
+ className: chunkZ22RD3E2_js.cn(
400
399
  "inline-flex max-w-[10rem] items-center rounded-full px-2 py-0.5 text-[11px]",
401
400
  hasPicks || isPinned ? "bg-primary/15 text-primary" : "bg-muted text-muted-foreground"
402
401
  ),
@@ -433,7 +432,7 @@ function AiFocusBar({
433
432
  title: t("pptx.ai.pickElement"),
434
433
  "aria-label": t("pptx.ai.pickAria"),
435
434
  "aria-pressed": pickMode,
436
- className: chunkJAI42EXQ_js.cn(
435
+ className: chunkZ22RD3E2_js.cn(
437
436
  "rounded-sm p-1 max-md:min-w-[44px]! max-md:min-h-[44px]! flex items-center justify-center",
438
437
  pickMode ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent"
439
438
  ),
@@ -502,7 +501,7 @@ function relativeTime(from, now = Date.now()) {
502
501
  return `${weeks}w ago`;
503
502
  }
504
503
  function AiHistoryList({ chats, activeChatId, onResume, onDelete }) {
505
- const { t } = reactI18next.useTranslation();
504
+ const { t } = chunkZ22RD3E2_js.useTranslation();
506
505
  if (chats.length === 0) {
507
506
  return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-3 py-4 text-center text-[12px] text-muted-foreground", children: t("pptx.ai.historyEmpty") });
508
507
  }
@@ -512,7 +511,7 @@ function AiHistoryList({ chats, activeChatId, onResume, onDelete }) {
512
511
  {
513
512
  type: "button",
514
513
  onClick: () => onResume(chat.id),
515
- className: chunkJAI42EXQ_js.cn(
514
+ className: chunkZ22RD3E2_js.cn(
516
515
  "flex min-w-0 flex-1 items-start gap-2 rounded-sm px-2 py-1.5 text-left hover:bg-accent",
517
516
  chat.id === activeChatId && "bg-accent/60"
518
517
  ),
@@ -551,7 +550,7 @@ function AiHistoryMenu({
551
550
  onNewChat,
552
551
  onClose
553
552
  }) {
554
- const { t } = reactI18next.useTranslation();
553
+ const { t } = chunkZ22RD3E2_js.useTranslation();
555
554
  const ref = react.useRef(null);
556
555
  react.useEffect(() => {
557
556
  const handler = (e) => {
@@ -617,7 +616,7 @@ function appliedThemeFromPart(part) {
617
616
  return { summary: out.summary ?? "Theme updated", previous: out.previous ?? {} };
618
617
  }
619
618
  function AiAppliedThemeCard({ summary, onUndo }) {
620
- const { t } = reactI18next.useTranslation();
619
+ const { t } = chunkZ22RD3E2_js.useTranslation();
621
620
  const [undone, setUndone] = react.useState(false);
622
621
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 rounded-md border border-primary/30 bg-primary/5 px-2.5 py-1.5 text-[12px]", children: [
623
622
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuPalette, { className: "w-3.5 h-3.5 shrink-0 text-primary" }),
@@ -663,7 +662,7 @@ var ICONS = {
663
662
  tool: lu.LuWrench
664
663
  };
665
664
  function AiToolCallCard({ part }) {
666
- const { t } = reactI18next.useTranslation();
665
+ const { t } = chunkZ22RD3E2_js.useTranslation();
667
666
  const failed = part.state === "output-error";
668
667
  const done = part.state === "output-available";
669
668
  const running = !failed && !done;
@@ -676,17 +675,17 @@ function AiToolCallCard({ part }) {
676
675
  /* @__PURE__ */ jsxRuntime.jsx(
677
676
  Icon,
678
677
  {
679
- className: chunkJAI42EXQ_js.cn(
678
+ className: chunkZ22RD3E2_js.cn(
680
679
  "w-3.5 h-3.5 shrink-0",
681
680
  failed ? "text-destructive" : "text-muted-foreground"
682
681
  )
683
682
  }
684
683
  ),
685
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkJAI42EXQ_js.cn("truncate", failed ? "text-destructive" : "text-foreground"), children: activity.label }),
684
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkZ22RD3E2_js.cn("truncate", failed ? "text-destructive" : "text-foreground"), children: activity.label }),
686
685
  /* @__PURE__ */ jsxRuntime.jsxs(
687
686
  "span",
688
687
  {
689
- className: chunkJAI42EXQ_js.cn(
688
+ className: chunkZ22RD3E2_js.cn(
690
689
  "ml-auto inline-flex items-center gap-1 rounded-sm px-1.5 py-0.5 text-[10px]",
691
690
  failed ? "bg-destructive/15 text-destructive" : done ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground"
692
691
  ),
@@ -711,7 +710,7 @@ function AiToolCallCard({ part }) {
711
710
  ] });
712
711
  }
713
712
  function AiMessageList({ messages, isStreaming, bridge }) {
714
- const { t } = reactI18next.useTranslation();
713
+ const { t } = chunkZ22RD3E2_js.useTranslation();
715
714
  const endRef = react.useRef(null);
716
715
  react.useEffect(() => {
717
716
  endRef.current?.scrollIntoView({ block: "end" });
@@ -734,7 +733,7 @@ function AiMessageList({ messages, isStreaming, bridge }) {
734
733
  /* @__PURE__ */ jsxRuntime.jsx(
735
734
  "div",
736
735
  {
737
- className: chunkJAI42EXQ_js.cn(
736
+ className: chunkZ22RD3E2_js.cn(
738
737
  "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full",
739
738
  isUser ? "bg-secondary text-muted-foreground" : "bg-primary/15 text-primary"
740
739
  ),
@@ -780,7 +779,7 @@ function AiMessageList({ messages, isStreaming, bridge }) {
780
779
  ] });
781
780
  }
782
781
  function AiProposalCard({ proposal, onAccept, onReject }) {
783
- const { t } = reactI18next.useTranslation();
782
+ const { t } = chunkZ22RD3E2_js.useTranslation();
784
783
  const lines = proposal.summary.map(ai.humanizeDiffLine);
785
784
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-primary/40 bg-primary/5 p-2.5", children: [
786
785
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-primary", children: t("pptx.ai.proposedChange") }),
@@ -822,7 +821,7 @@ function AiConversation({
822
821
  aiPanel,
823
822
  deckId
824
823
  }) {
825
- const { t } = reactI18next.useTranslation();
824
+ const { t } = chunkZ22RD3E2_js.useTranslation();
826
825
  const chat = useAiConversation(useChat, session, config, bridge, {
827
826
  // Live "AI as a collaborator" focus: as each tool runs, navigate to and
828
827
  // highlight the slide / element(s) it touches so the canvas mirrors the
@@ -987,7 +986,7 @@ function AiChatPanel({
987
986
  onClose,
988
987
  panelWidth
989
988
  }) {
990
- const { t } = reactI18next.useTranslation();
989
+ const { t } = chunkZ22RD3E2_js.useTranslation();
991
990
  const { state, session, initError } = useAiChat(bridge, config);
992
991
  const deckId = react.useMemo(() => ai.deckIdFromBridge(bridge), [bridge]);
993
992
  return /* @__PURE__ */ jsxRuntime.jsxs(
Binary file
Binary file
@@ -1,7 +1,6 @@
1
- import { cn } from './chunk-PFV626ED.mjs';
1
+ import { useTranslation, cn } from './chunk-ZCGYPCZM.mjs';
2
2
  import './chunk-UV2HVMKZ.mjs';
3
3
  import { useMemo, useRef, useState, useEffect, useReducer, useCallback } from 'react';
4
- import { useTranslation } from 'react-i18next';
5
4
  import { LuSparkles, LuX, LuLoaderCircle, LuTriangleAlert, LuHistory, LuMessageSquarePlus, LuTrash2, LuPlus, LuGitMerge, LuCrosshair, LuPinOff, LuPin, LuUser, LuBot, LuCheck, LuSquare, LuSend, LuMessageSquare, LuPalette, LuUndo2, LuWrench, LuStickyNote, LuFilm, LuNavigation, LuSearch, LuMove, LuChartColumn, LuLayoutTemplate, LuTable, LuShapes, LuType, LuEye } from 'react-icons/lu';
6
5
  import { deckIdFromBridge, isAiAvailable, createAiChatSession, extractReadyToolCalls, toolCanvasTarget, createChatHistoryStore, focusTargetChips, isTwoTableFocus, mergeTablesDirective, toRenderableParts, humanizeDiffLine, buildDeckContext, describeToolActivity, summarizeToolArgs, toolLabel } from 'ooxml-ui/pptx/ai';
7
6
  import { jsxs, jsx } from 'react/jsx-runtime';
Binary file
Binary file