pptx-react-viewer 2.20.4 → 2.21.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 (104) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{AiChatPanel-C3PLXWFZ.js → AiChatPanel-BD6NR2AU.js} +24 -24
  3. package/dist/AiChatPanel-BD6NR2AU.js.br +0 -0
  4. package/dist/AiChatPanel-BD6NR2AU.js.gz +0 -0
  5. package/dist/{AiChatPanel-Y4BQX3TL.mjs → AiChatPanel-XMRQE2GY.mjs} +4 -4
  6. package/dist/AiChatPanel-XMRQE2GY.mjs.br +0 -0
  7. package/dist/AiChatPanel-XMRQE2GY.mjs.gz +0 -0
  8. package/dist/{Model3DScene-QJL5F67G.mjs → Model3DScene-HAJKICLT.mjs} +1 -1
  9. package/dist/Model3DScene-HAJKICLT.mjs.br +0 -0
  10. package/dist/Model3DScene-HAJKICLT.mjs.gz +0 -0
  11. package/dist/{Model3DScene-Z4JPG2NB.js → Model3DScene-UXWNLRNQ.js} +2 -2
  12. package/dist/Model3DScene-UXWNLRNQ.js.br +0 -0
  13. package/dist/Model3DScene-UXWNLRNQ.js.gz +0 -0
  14. package/dist/{chunk-KEGEDUJV.js → chunk-3ILDZ7MD.js} +3 -3
  15. package/dist/chunk-3ILDZ7MD.js.br +0 -0
  16. package/dist/chunk-3ILDZ7MD.js.gz +0 -0
  17. package/dist/{chunk-HXFPEJA4.mjs → chunk-5W2W46LY.mjs} +72 -4
  18. package/dist/chunk-5W2W46LY.mjs.br +0 -0
  19. package/dist/{chunk-HXFPEJA4.mjs.gz → chunk-5W2W46LY.mjs.gz} +0 -0
  20. package/dist/{chunk-KXHYUJI7.mjs → chunk-6PRFUWZA.mjs} +7 -10
  21. package/dist/chunk-6PRFUWZA.mjs.br +0 -0
  22. package/dist/chunk-6PRFUWZA.mjs.gz +0 -0
  23. package/dist/{chunk-LBSMBRSD.js → chunk-F7SX4EUT.js} +74 -5
  24. package/dist/chunk-F7SX4EUT.js.br +0 -0
  25. package/dist/{chunk-LBSMBRSD.js.gz → chunk-F7SX4EUT.js.gz} +0 -0
  26. package/dist/{chunk-JL3GWABW.mjs → chunk-GNY4FD3V.mjs} +2 -2
  27. package/dist/chunk-GNY4FD3V.mjs.br +0 -0
  28. package/dist/chunk-GNY4FD3V.mjs.gz +0 -0
  29. package/dist/{chunk-BKBYURH5.js → chunk-HLUJOKES.js} +391 -395
  30. package/dist/chunk-HLUJOKES.js.br +0 -0
  31. package/dist/chunk-HLUJOKES.js.gz +0 -0
  32. package/dist/{chunk-ADWJUL4F.mjs → chunk-II5SCD5L.mjs} +1 -1
  33. package/dist/chunk-II5SCD5L.mjs.br +0 -0
  34. package/dist/chunk-II5SCD5L.mjs.gz +0 -0
  35. package/dist/{chunk-MZOZNBRO.mjs → chunk-L5MNLIQF.mjs} +3 -0
  36. package/dist/chunk-L5MNLIQF.mjs.br +0 -0
  37. package/dist/chunk-L5MNLIQF.mjs.gz +0 -0
  38. package/dist/{chunk-7HF5DSE4.js → chunk-SUNSC3Z5.js} +156 -156
  39. package/dist/chunk-SUNSC3Z5.js.br +0 -0
  40. package/dist/chunk-SUNSC3Z5.js.gz +0 -0
  41. package/dist/{chunk-6CPUGAK7.js → chunk-U6A5FWWE.js} +3 -0
  42. package/dist/chunk-U6A5FWWE.js.br +0 -0
  43. package/dist/chunk-U6A5FWWE.js.gz +0 -0
  44. package/dist/{chunk-BDMESP3M.js → chunk-W3Y3X4AT.js} +1072 -1098
  45. package/dist/chunk-W3Y3X4AT.js.br +0 -0
  46. package/dist/chunk-W3Y3X4AT.js.gz +0 -0
  47. package/dist/{chunk-YHEASDGN.mjs → chunk-Y67QVETX.mjs} +34 -60
  48. package/dist/chunk-Y67QVETX.mjs.br +0 -0
  49. package/dist/chunk-Y67QVETX.mjs.gz +0 -0
  50. package/dist/i18n.js +4 -4
  51. package/dist/i18n.js.br +0 -0
  52. package/dist/i18n.js.gz +0 -0
  53. package/dist/i18n.mjs +1 -1
  54. package/dist/i18n.mjs.br +0 -0
  55. package/dist/i18n.mjs.gz +0 -0
  56. package/dist/index.js +47 -47
  57. package/dist/index.js.br +0 -0
  58. package/dist/index.js.gz +0 -0
  59. package/dist/index.mjs +6 -6
  60. package/dist/index.mjs.br +0 -0
  61. package/dist/index.mjs.gz +0 -0
  62. package/dist/internals.js +79 -79
  63. package/dist/internals.js.br +0 -0
  64. package/dist/internals.js.gz +0 -0
  65. package/dist/internals.mjs +4 -4
  66. package/dist/internals.mjs.br +0 -0
  67. package/dist/internals.mjs.gz +0 -0
  68. package/dist/viewer/index.js +27 -27
  69. package/dist/viewer/index.js.br +0 -0
  70. package/dist/viewer/index.js.gz +0 -0
  71. package/dist/viewer/index.mjs +6 -6
  72. package/dist/viewer/index.mjs.br +0 -0
  73. package/dist/viewer/index.mjs.gz +0 -0
  74. package/package.json +1 -1
  75. package/dist/AiChatPanel-C3PLXWFZ.js.br +0 -0
  76. package/dist/AiChatPanel-C3PLXWFZ.js.gz +0 -0
  77. package/dist/AiChatPanel-Y4BQX3TL.mjs.br +0 -0
  78. package/dist/AiChatPanel-Y4BQX3TL.mjs.gz +0 -0
  79. package/dist/Model3DScene-QJL5F67G.mjs.br +0 -0
  80. package/dist/Model3DScene-QJL5F67G.mjs.gz +0 -0
  81. package/dist/Model3DScene-Z4JPG2NB.js.br +0 -0
  82. package/dist/Model3DScene-Z4JPG2NB.js.gz +0 -0
  83. package/dist/chunk-6CPUGAK7.js.br +0 -0
  84. package/dist/chunk-6CPUGAK7.js.gz +0 -0
  85. package/dist/chunk-7HF5DSE4.js.br +0 -0
  86. package/dist/chunk-7HF5DSE4.js.gz +0 -0
  87. package/dist/chunk-ADWJUL4F.mjs.br +0 -0
  88. package/dist/chunk-ADWJUL4F.mjs.gz +0 -0
  89. package/dist/chunk-BDMESP3M.js.br +0 -0
  90. package/dist/chunk-BDMESP3M.js.gz +0 -0
  91. package/dist/chunk-BKBYURH5.js.br +0 -0
  92. package/dist/chunk-BKBYURH5.js.gz +0 -0
  93. package/dist/chunk-HXFPEJA4.mjs.br +0 -0
  94. package/dist/chunk-JL3GWABW.mjs.br +0 -0
  95. package/dist/chunk-JL3GWABW.mjs.gz +0 -0
  96. package/dist/chunk-KEGEDUJV.js.br +0 -0
  97. package/dist/chunk-KEGEDUJV.js.gz +0 -0
  98. package/dist/chunk-KXHYUJI7.mjs.br +0 -0
  99. package/dist/chunk-KXHYUJI7.mjs.gz +0 -0
  100. package/dist/chunk-LBSMBRSD.js.br +0 -0
  101. package/dist/chunk-MZOZNBRO.mjs.br +0 -0
  102. package/dist/chunk-MZOZNBRO.mjs.gz +0 -0
  103. package/dist/chunk-YHEASDGN.mjs.br +0 -0
  104. package/dist/chunk-YHEASDGN.mjs.gz +0 -0
@@ -71987,6 +71987,12 @@ var PptxHandlerRuntime65 = class _PptxHandlerRuntime28 extends PptxHandlerRuntim
71987
71987
  let pathData;
71988
71988
  let pathWidth;
71989
71989
  let pathHeight;
71990
+ let customGeometryRawData;
71991
+ let customGeometryAdjustHandlesXY;
71992
+ let customGeometryAdjustHandlesPolar;
71993
+ let customGeometryConnectionSites;
71994
+ let customGeometryTextRect;
71995
+ let customGeometryPaths;
71990
71996
  const custGeom = effectiveSpPr?.["a:custGeom"];
71991
71997
  if (custGeom) {
71992
71998
  const customPath = this.parseCustomGeometry(
@@ -71999,6 +72005,19 @@ var PptxHandlerRuntime65 = class _PptxHandlerRuntime28 extends PptxHandlerRuntim
71999
72005
  pathData = customPath.pathData;
72000
72006
  pathWidth = customPath.pathWidth;
72001
72007
  pathHeight = customPath.pathHeight;
72008
+ customGeometryPaths = this.buildStructuredCustomGeometryPaths(
72009
+ custGeom,
72010
+ customPath.pathWidth,
72011
+ customPath.pathHeight
72012
+ );
72013
+ customGeometryRawData = this.extractCustomGeometryRawData(custGeom);
72014
+ const typedHandles = this.extractCustomGeometryAdjustHandles(custGeom);
72015
+ customGeometryAdjustHandlesXY = typedHandles.xy;
72016
+ customGeometryAdjustHandlesPolar = typedHandles.polar;
72017
+ customGeometryConnectionSites = this.extractCustomGeometryConnectionSites(
72018
+ custGeom
72019
+ );
72020
+ customGeometryTextRect = this.extractCustomGeometryTextRect(custGeom);
72002
72021
  }
72003
72022
  }
72004
72023
  const picGeomNode = custGeom ?? effectiveSpPr?.["a:prstGeom"];
@@ -72125,6 +72144,12 @@ var PptxHandlerRuntime65 = class _PptxHandlerRuntime28 extends PptxHandlerRuntim
72125
72144
  pathData,
72126
72145
  pathWidth,
72127
72146
  pathHeight,
72147
+ customGeometryPaths,
72148
+ customGeometryRawData,
72149
+ customGeometryAdjustHandlesXY,
72150
+ customGeometryAdjustHandlesPolar,
72151
+ customGeometryConnectionSites,
72152
+ customGeometryTextRect,
72128
72153
  shapeStyle: this.extractShapeStyle(effectiveSpPr, styleNode),
72129
72154
  rotation,
72130
72155
  skewX,
@@ -97310,6 +97335,14 @@ function computeChartLegendLayout(vm) {
97310
97335
  return { x, y, color: entry2.color, label: entry2.label };
97311
97336
  });
97312
97337
  }
97338
+ function patchChartData(data, patch) {
97339
+ if (patch.chartType && patch.chartType !== data.chartType) {
97340
+ const adapted = chartDataChangeType(data, patch.chartType);
97341
+ const { chartType: _chartType, ...rest } = patch;
97342
+ return { ...adapted, ...rest };
97343
+ }
97344
+ return { ...data, ...patch };
97345
+ }
97313
97346
  function schemaLabel(keys, token2, translate) {
97314
97347
  if (token2 === void 0) {
97315
97348
  return "";
@@ -104053,6 +104086,7 @@ function reorderAnimationTo(animations, source, targetIndex) {
104053
104086
  sorted.splice(targetIndex, 0, moved);
104054
104087
  return reindexOrder(sorted);
104055
104088
  }
104089
+ var MIN_TIMELINE_BAR_WIDTH_PERCENT = 2;
104056
104090
  function buildAnimationTimelineBars(animations) {
104057
104091
  const sorted = [...animations].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
104058
104092
  const total = Math.max(
@@ -104062,7 +104096,10 @@ function buildAnimationTimelineBars(animations) {
104062
104096
  return sorted.map((animation) => ({
104063
104097
  elementId: animation.elementId,
104064
104098
  leftPercent: (animation.delayMs ?? 0) / total * 100,
104065
- widthPercent: (animation.durationMs ?? 500) / total * 100
104099
+ widthPercent: Math.max(
104100
+ (animation.durationMs ?? 500) / total * 100,
104101
+ MIN_TIMELINE_BAR_WIDTH_PERCENT
104102
+ )
104066
104103
  }));
104067
104104
  }
104068
104105
  function reindexOrder(anims) {
@@ -111239,6 +111276,9 @@ var translationsEn = {
111239
111276
  "pptx.notes.strikethrough": "Strikethrough",
111240
111277
  "pptx.notes.toggleRichPlainEditor": "Toggle rich/plain text editor",
111241
111278
  "pptx.notes.underline": "Underline",
111279
+ // Group info panel (element inspector)
111280
+ "pptx.group.childCount": "{{count}} children",
111281
+ "pptx.group.groupedElement": "Grouped element",
111242
111282
  // OLE object properties
111243
111283
  "pptx.ole.embedded": "Embedded",
111244
111284
  "pptx.ole.fileName": "File Name",
@@ -130723,6 +130763,34 @@ var COMMON_FONTS = [
130723
130763
  "Tw Cen MT",
130724
130764
  "Verdana"
130725
130765
  ];
130766
+ function classifyMediaType(mimeType) {
130767
+ if (mimeType.startsWith("audio/")) {
130768
+ return "audio";
130769
+ }
130770
+ if (mimeType.startsWith("video/")) {
130771
+ return "video";
130772
+ }
130773
+ return null;
130774
+ }
130775
+ function resolveTemplateBackgroundRows(activeSlide, slideMasters, fallbackLayoutLabel, fallbackMasterLabel) {
130776
+ const result = {};
130777
+ if (activeSlide.layoutPath) {
130778
+ result.layout = {
130779
+ path: activeSlide.layoutPath,
130780
+ label: activeSlide.layoutName ?? fallbackLayoutLabel,
130781
+ title: activeSlide.layoutName ?? activeSlide.layoutPath
130782
+ };
130783
+ }
130784
+ const master = slideMasters?.find((m) => m.layoutPaths?.includes(activeSlide.layoutPath ?? ""));
130785
+ if (master) {
130786
+ result.master = {
130787
+ path: master.path,
130788
+ label: master.name ?? fallbackMasterLabel,
130789
+ title: master.name ?? master.path
130790
+ };
130791
+ }
130792
+ return result;
130793
+ }
130726
130794
  function partitionTemplateElements(slides) {
130727
130795
  const templateElementsBySlideId = {};
130728
130796
  const nextSlides = slides.map((slide) => {
@@ -133151,7 +133219,7 @@ function sanitizeDownloadFilename(input) {
133151
133219
  function downloadBlob(blob, filename) {
133152
133220
  const url = URL.createObjectURL(blob), anchor = document.createElement("a");
133153
133221
  anchor.href = url;
133154
- anchor.download = filename;
133222
+ anchor.download = sanitizeDownloadFilename(filename);
133155
133223
  document.body.appendChild(anchor);
133156
133224
  anchor.click();
133157
133225
  setTimeout(() => {
@@ -133162,7 +133230,7 @@ function downloadBlob(blob, filename) {
133162
133230
  function downloadDataUrl(dataUrl, filename) {
133163
133231
  const anchor = document.createElement("a");
133164
133232
  anchor.href = dataUrl;
133165
- anchor.download = filename;
133233
+ anchor.download = sanitizeDownloadFilename(filename);
133166
133234
  document.body.appendChild(anchor);
133167
133235
  anchor.click();
133168
133236
  setTimeout(() => {
@@ -135028,7 +135096,6 @@ exports.canvasToJpegData = canvasToJpegData;
135028
135096
  exports.cellRunStyle = cellRunStyle;
135029
135097
  exports.cellStyleToCss = cellStyleToCss;
135030
135098
  exports.centeredSvgTextLines = centeredSvgTextLines;
135031
- exports.chartDataChangeType = chartDataChangeType;
135032
135099
  exports.chartPartToAttrs = chartPartToAttrs;
135033
135100
  exports.chartPreserveAspectRatio = chartPreserveAspectRatio;
135034
135101
  exports.clampCropValue = clampCropValue;
@@ -135040,6 +135107,7 @@ exports.clampTransitionNumber = clampTransitionNumber;
135040
135107
  exports.clampUnitInterval = clampUnitInterval2;
135041
135108
  exports.clampZoomScale = clampZoomScale;
135042
135109
  exports.classifyExtraConnections = classifyExtraConnections;
135110
+ exports.classifyMediaType = classifyMediaType;
135043
135111
  exports.clearAllLocalViewerData = clearAllLocalViewerData;
135044
135112
  exports.clearAudienceContent = clearAudienceContent;
135045
135113
  exports.clearLocalAwareness = clearLocalAwareness;
@@ -135332,6 +135400,7 @@ exports.parsePanoseString = parsePanoseString;
135332
135400
  exports.parsePpactionUrl = parsePpactionUrl;
135333
135401
  exports.parseSegmentsFromRichEditor = parseSegmentsFromRichEditor;
135334
135402
  exports.partitionTemplateElements = partitionTemplateElements;
135403
+ exports.patchChartData = patchChartData;
135335
135404
  exports.pickSupportedMimeType = pickSupportedMimeType;
135336
135405
  exports.pieceLetterSpacing = pieceLetterSpacing;
135337
135406
  exports.placeAudienceWindow = placeAudienceWindow;
@@ -135421,6 +135490,7 @@ exports.resolveSelectionPaneRename = resolveSelectionPaneRename;
135421
135490
  exports.resolveShapeGeometry = resolveShapeGeometry;
135422
135491
  exports.resolveShowSlideIndexes = resolveShowSlideIndexes;
135423
135492
  exports.resolveSlideSizeSelection = resolveSlideSizeSelection;
135493
+ exports.resolveTemplateBackgroundRows = resolveTemplateBackgroundRows;
135424
135494
  exports.resolveThemeCatalogEntry = resolveThemeCatalogEntry;
135425
135495
  exports.resolveTitleBarStatusKey = resolveTitleBarStatusKey;
135426
135496
  exports.resolveTransitionDurationMs = resolveTransitionDurationMs;
@@ -135435,7 +135505,6 @@ exports.runMediaCommand = runMediaCommand;
135435
135505
  exports.runPresentationAction = runPresentationAction;
135436
135506
  exports.safeOpenUrl = safeOpenUrl;
135437
135507
  exports.sanitizeColor = sanitizeColor;
135438
- exports.sanitizeDownloadFilename = sanitizeDownloadFilename;
135439
135508
  exports.sanitizeGradientStops = sanitizeGradientStops;
135440
135509
  exports.sanitizeMathMl = sanitizeMathMl;
135441
135510
  exports.saveAutosaveSnapshot = saveAutosaveSnapshot;
Binary file
@@ -1,5 +1,5 @@
1
- import { translationsEn } from './chunk-MZOZNBRO.mjs';
2
- import { SHAPE_PRESET_DEFS, VIEWER_SHORTCUT_REFERENCE, getAnimationInitialStyle, cloneHistorySnapshot, hasShapeProperties, getImageFitStyle, isImageLikeElement, getImageTilingStyle, runMediaCommand, findMediaElementByElementId, mediaPlaybackAttributes, buildTextBlockStyle, hasTextProperties, toCssWritingMode, toCssTextOrientation, toCssVerticalDirection, buildTextBodyLayoutStyle, buildTextBody3DSceneStyle, buildParagraphs, colorWithOpacity, normalizeHexColor, build3DExtrusionData, getComputedFillStyle, getComputedEffectStyle, getComputedStrokeStyle, isStrokeOnlyPresetElement, resolveShapeGeometry, normalizeStrokeDashType, getSvgStrokeDasharray, buildSvgGradientDef, isCalloutShape, getCalloutLeaderLineGeometry, buildCalloutLeaderLineSvgPath, getCalloutViewBoxBounds, svgLineCap, getCompoundLineOffsets, getCompoundLineWidths, computeSelectionRect, DEFAULT_FONT_FAMILY, cellStyleToCss, rectToCells, isCellInRect, tableContainerCss, buildChartViewModel, resolveChartKind, chartPreserveAspectRatio, buildNotesPdfBytes, buildSlidesPdfBytes, buildPreviewAnimation, buildMotionPathPreview, getRoundRectRadiusPx2, getResolvedShapeClipPath, mediaFallbackVisual, registerPersistentAudio, resolveAutoFitFontScale, getSubstituteFontFamily, parsePanoseString, hasDistinctScriptFonts, nestedTextDecorationStyle, pieceLetterSpacing, resolveMetricTrackingPx, hollowTextFillStyle, TEXT_BUILD_ID_SEP, buildTextBuildSpec, textBuildSpanStyle, apply3dEffects, clampUnitInterval, customGeometryPathsToSvgSubpaths, svgGradientFillRef, computeColumnBoundaries, getTableCellBandStyle, parseDrawingColor, parseDrawingColorOpacity, getCellDiagonalBorders, cellRunStyle, getChartStylePalette, computeChartLegendLayout, mediaFallbackIcon, mediaFallbackLabelKey, MEDIA_CHROME_ATTRIBUTE, convertOmmlToMathMl, sanitizeMathMl, tableCellCss, computeResizedColumnWidths, computeResizedRowHeight, DEFAULT_ROW_HEIGHT, ooxmlGradientAngleToCssDegrees, chartPartToAttrs, splitRunForMetrics, hexToRgbChannels, segmentByScript, resolveFontForScript } from './chunk-HXFPEJA4.mjs';
1
+ import { translationsEn } from './chunk-L5MNLIQF.mjs';
2
+ import { SHAPE_PRESET_DEFS, VIEWER_SHORTCUT_REFERENCE, getAnimationInitialStyle, cloneHistorySnapshot, hasShapeProperties, getImageFitStyle, isImageLikeElement, getImageTilingStyle, runMediaCommand, findMediaElementByElementId, mediaPlaybackAttributes, buildTextBlockStyle, hasTextProperties, toCssWritingMode, toCssTextOrientation, toCssVerticalDirection, buildTextBodyLayoutStyle, buildTextBody3DSceneStyle, buildParagraphs, colorWithOpacity, normalizeHexColor, build3DExtrusionData, getComputedFillStyle, getComputedEffectStyle, getComputedStrokeStyle, isStrokeOnlyPresetElement, resolveShapeGeometry, normalizeStrokeDashType, getSvgStrokeDasharray, buildSvgGradientDef, isCalloutShape, getCalloutLeaderLineGeometry, buildCalloutLeaderLineSvgPath, getCalloutViewBoxBounds, svgLineCap, getCompoundLineOffsets, getCompoundLineWidths, computeSelectionRect, DEFAULT_FONT_FAMILY, cellStyleToCss, rectToCells, isCellInRect, tableContainerCss, buildChartViewModel, resolveChartKind, chartPreserveAspectRatio, buildNotesPdfBytes, buildSlidesPdfBytes, buildPreviewAnimation, buildMotionPathPreview, getRoundRectRadiusPx2, getResolvedShapeClipPath, mediaFallbackVisual, registerPersistentAudio, resolveAutoFitFontScale, getSubstituteFontFamily, parsePanoseString, hasDistinctScriptFonts, nestedTextDecorationStyle, pieceLetterSpacing, resolveMetricTrackingPx, hollowTextFillStyle, TEXT_BUILD_ID_SEP, buildTextBuildSpec, textBuildSpanStyle, apply3dEffects, clampUnitInterval, customGeometryPathsToSvgSubpaths, svgGradientFillRef, computeColumnBoundaries, getTableCellBandStyle, parseDrawingColor, parseDrawingColorOpacity, getCellDiagonalBorders, cellRunStyle, getChartStylePalette, computeChartLegendLayout, mediaFallbackIcon, mediaFallbackLabelKey, MEDIA_CHROME_ATTRIBUTE, convertOmmlToMathMl, sanitizeMathMl, tableCellCss, computeResizedColumnWidths, computeResizedRowHeight, DEFAULT_ROW_HEIGHT, ooxmlGradientAngleToCssDegrees, chartPartToAttrs, splitRunForMetrics, hexToRgbChannels, segmentByScript, resolveFontForScript } from './chunk-5W2W46LY.mjs';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  import React6, { useRef, useState, useEffect, useCallback, useMemo, useLayoutEffect } from 'react';
Binary file
Binary file