@san-siva/blogkit 1.1.34 → 1.1.36

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 (50) hide show
  1. package/dist/assets/collapse.svg +16 -0
  2. package/dist/assets/expand.svg +4 -0
  3. package/dist/assets/info.svg +1 -1
  4. package/dist/assets/reset.svg +4 -0
  5. package/dist/assets/tick.svg +1 -1
  6. package/dist/assets/zoom-in.svg +17 -0
  7. package/dist/assets/zoom-out.svg +17 -0
  8. package/dist/cjs/components/MermaidControls.js +17 -0
  9. package/dist/cjs/components/MermaidControls.js.map +1 -0
  10. package/dist/cjs/components/MermaidViewport.js +14 -0
  11. package/dist/cjs/components/MermaidViewport.js.map +1 -0
  12. package/dist/cjs/dynamicComponents/MermaidDynamic.js +52 -75
  13. package/dist/cjs/dynamicComponents/MermaidDynamic.js.map +1 -1
  14. package/dist/cjs/hooks/usePanZoom.js +77 -0
  15. package/dist/cjs/hooks/usePanZoom.js.map +1 -0
  16. package/dist/cjs/index.css +1 -1
  17. package/dist/cjs/index.css.map +1 -1
  18. package/dist/cjs/styles/Mermaid.module.scss.js +1 -1
  19. package/dist/esm/components/MermaidControls.js +13 -0
  20. package/dist/esm/components/MermaidControls.js.map +1 -0
  21. package/dist/esm/components/MermaidViewport.js +10 -0
  22. package/dist/esm/components/MermaidViewport.js.map +1 -0
  23. package/dist/esm/dynamicComponents/MermaidDynamic.js +52 -75
  24. package/dist/esm/dynamicComponents/MermaidDynamic.js.map +1 -1
  25. package/dist/esm/hooks/usePanZoom.js +75 -0
  26. package/dist/esm/hooks/usePanZoom.js.map +1 -0
  27. package/dist/esm/index.css +1 -1
  28. package/dist/esm/index.css.map +1 -1
  29. package/dist/esm/styles/Mermaid.module.scss.js +1 -1
  30. package/dist/types/components/MermaidControls.d.ts +11 -0
  31. package/dist/types/components/MermaidControls.d.ts.map +1 -0
  32. package/dist/types/components/MermaidViewport.d.ts +12 -0
  33. package/dist/types/components/MermaidViewport.d.ts.map +1 -0
  34. package/dist/types/dynamicComponents/MermaidDynamic.d.ts.map +1 -1
  35. package/dist/types/hooks/usePanZoom.d.ts +23 -0
  36. package/dist/types/hooks/usePanZoom.d.ts.map +1 -0
  37. package/package.json +1 -1
  38. package/src/assets/collapse.svg +16 -0
  39. package/src/assets/expand.svg +4 -0
  40. package/src/assets/info.svg +1 -1
  41. package/src/assets/reset.svg +4 -0
  42. package/src/assets/tick.svg +1 -1
  43. package/src/assets/zoom-in.svg +17 -0
  44. package/src/assets/zoom-out.svg +17 -0
  45. package/src/components/MermaidControls.tsx +54 -0
  46. package/src/components/MermaidViewport.tsx +40 -0
  47. package/src/dynamicComponents/MermaidDynamic.tsx +101 -131
  48. package/src/hooks/usePanZoom.ts +105 -0
  49. package/src/styles/Mermaid.module.scss +72 -4
  50. package/src/styles/Mermaid.module.scss.d.ts +10 -0
@@ -0,0 +1,16 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+
3
+ <svg width="800px" height="800px" viewBox="0 0 48 48" fill="#313030" xmlns="http://www.w3.org/2000/svg">
4
+ <title>collapse-fullscreen</title>
5
+ <g id="Layer_2" data-name="Layer 2">
6
+ <g id="invisible_box" data-name="invisible box">
7
+ <rect width="48" height="48" fill="none"/>
8
+ </g>
9
+ <g id="icons_Q2" data-name="icons Q2">
10
+ <g>
11
+ <path d="M8,26a2,2,0,0,0-2,2.3A2.1,2.1,0,0,0,8.1,30h7.1L4.7,40.5a2,2,0,0,0-.2,2.8A1.8,1.8,0,0,0,6,44a2,2,0,0,0,1.4-.6L18,32.8v7.1A2.1,2.1,0,0,0,19.7,42,2,2,0,0,0,22,40V28a2,2,0,0,0-2-2Z"/>
12
+ <path d="M43.7,4.8a2,2,0,0,0-3.1-.2L30,15.2V8.1A2.1,2.1,0,0,0,28.3,6,2,2,0,0,0,26,8V20a2,2,0,0,0,2,2H39.9A2.1,2.1,0,0,0,42,20.3,2,2,0,0,0,40,18H32.8L43.4,7.5A2.3,2.3,0,0,0,43.7,4.8Z"/>
13
+ </g>
14
+ </g>
15
+ </g>
16
+ </svg>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
2
+ <svg width="800px" height="800px" viewBox="-2 -2 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M14 10L21 3M21 3H16.5M21 3V7.5M10 14L3 21M3 21H7.5M3 21L3 16.5" stroke="#313030" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
4
+ </svg>
@@ -1,3 +1,3 @@
1
1
  <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M12 17C12.2833 17 12.5208 16.9042 12.7125 16.7125C12.9042 16.5208 13 16.2833 13 16C13 15.7167 12.9042 15.4792 12.7125 15.2875C12.5208 15.0958 12.2833 15 12 15C11.7167 15 11.4792 15.0958 11.2875 15.2875C11.0958 15.4792 11 15.7167 11 16C11 16.2833 11.0958 16.5208 11.2875 16.7125C11.4792 16.9042 11.7167 17 12 17ZM11 13H13V7H11V13ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22Z" fill="#4242FA"/>
2
+ <path d="M12 17C12.2833 17 12.5208 16.9042 12.7125 16.7125C12.9042 16.5208 13 16.2833 13 16C13 15.7167 12.9042 15.4792 12.7125 15.2875C12.5208 15.0958 12.2833 15 12 15C11.7167 15 11.4792 15.0958 11.2875 15.2875C11.0958 15.4792 11 15.7167 11 16C11 16.2833 11.0958 16.5208 11.2875 16.7125C11.4792 16.9042 11.7167 17 12 17ZM11 13H13V7H11V13ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22Z" fill="#3F51B5"/>
3
3
  </svg>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
2
+ <svg fill="#313030" width="800px" height="800px" viewBox="0 0 1920 1920" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M960 0v213.333c411.627 0 746.667 334.934 746.667 746.667S1371.627 1706.667 960 1706.667 213.333 1371.733 213.333 960c0-197.013 78.4-382.507 213.334-520.747v254.08H640V106.667H53.333V320h191.04C88.64 494.08 0 720.96 0 960c0 529.28 430.613 960 960 960s960-430.72 960-960S1489.387 0 960 0" fill-rule="evenodd"/>
4
+ </svg>
@@ -1,3 +1,3 @@
1
1
  <svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M21.3333 35.7707L8.78133 23.2187L12.552 19.448L21.3333 28.2293L48 1.56267V0H0V48H48V26.6667V9.104L21.3333 35.7707Z" fill="#4242FA"/>
2
+ <path d="M21.3333 35.7707L8.78133 23.2187L12.552 19.448L21.3333 28.2293L48 1.56267V0H0V48H48V26.6667V9.104L21.3333 35.7707Z" fill="#3F51B5"/>
3
3
  </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg width="800px" height="800px" viewBox="-1 -1 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
4
+
5
+ <title>zoom-in</title>
6
+ <desc>Created with Sketch Beta.</desc>
7
+ <defs>
8
+
9
+ </defs>
10
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
11
+ <g id="Icon-Set" sketch:type="MSLayerGroup" transform="translate(-308.000000, -1139.000000)" fill="#313030" stroke="#313030" stroke-width="1.5" stroke-linejoin="round">
12
+ <path d="M321.46,1163.45 C315.17,1163.45 310.07,1158.44 310.07,1152.25 C310.07,1146.06 315.17,1141.04 321.46,1141.04 C327.75,1141.04 332.85,1146.06 332.85,1152.25 C332.85,1158.44 327.75,1163.45 321.46,1163.45 L321.46,1163.45 Z M339.688,1169.25 L331.429,1161.12 C333.592,1158.77 334.92,1155.67 334.92,1152.25 C334.92,1144.93 328.894,1139 321.46,1139 C314.026,1139 308,1144.93 308,1152.25 C308,1159.56 314.026,1165.49 321.46,1165.49 C324.672,1165.49 327.618,1164.38 329.932,1162.53 L338.225,1170.69 C338.629,1171.09 339.284,1171.09 339.688,1170.69 C340.093,1170.3 340.093,1169.65 339.688,1169.25 L339.688,1169.25 Z M326.519,1151.41 L322.522,1151.41 L322.522,1147.41 C322.522,1146.85 322.075,1146.41 321.523,1146.41 C320.972,1146.41 320.524,1146.85 320.524,1147.41 L320.524,1151.41 L316.529,1151.41 C315.978,1151.41 315.53,1151.59 315.53,1152.14 C315.53,1152.7 315.978,1153.41 316.529,1153.41 L320.524,1153.41 L320.524,1157.41 C320.524,1157.97 320.972,1158.41 321.523,1158.41 C322.075,1158.41 322.522,1157.97 322.522,1157.41 L322.522,1153.41 L326.519,1153.41 C327.07,1153.41 327.518,1152.96 327.518,1152.41 C327.518,1151.86 327.07,1151.41 326.519,1151.41 L326.519,1151.41 Z" id="zoom-in" sketch:type="MSShapeGroup">
13
+
14
+ </path>
15
+ </g>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg width="800px" height="800px" viewBox="-1 -1 34 34" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
4
+
5
+ <title>zoom-out</title>
6
+ <desc>Created with Sketch Beta.</desc>
7
+ <defs>
8
+
9
+ </defs>
10
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
11
+ <g id="Icon-Set" sketch:type="MSLayerGroup" transform="translate(-360.000000, -1139.000000)" fill="#313030" stroke="#313030" stroke-width="1.5" stroke-linejoin="round">
12
+ <path d="M373.46,1163.45 C367.17,1163.45 362.071,1158.44 362.071,1152.25 C362.071,1146.06 367.17,1141.04 373.46,1141.04 C379.75,1141.04 384.85,1146.06 384.85,1152.25 C384.85,1158.44 379.75,1163.45 373.46,1163.45 L373.46,1163.45 Z M391.688,1169.25 L383.429,1161.12 C385.592,1158.77 386.92,1155.67 386.92,1152.25 C386.92,1144.93 380.894,1139 373.46,1139 C366.026,1139 360,1144.93 360,1152.25 C360,1159.56 366.026,1165.49 373.46,1165.49 C376.672,1165.49 379.618,1164.38 381.932,1162.53 L390.225,1170.69 C390.629,1171.09 391.284,1171.09 391.688,1170.69 C392.093,1170.3 392.093,1169.65 391.688,1169.25 L391.688,1169.25 Z M378.689,1151.41 L368.643,1151.41 C368.102,1151.41 367.663,1151.84 367.663,1152.37 C367.663,1152.9 368.102,1153.33 368.643,1153.33 L378.689,1153.33 C379.23,1153.33 379.669,1152.9 379.669,1152.37 C379.669,1151.84 379.23,1151.41 378.689,1151.41 L378.689,1151.41 Z" id="zoom-out" sketch:type="MSShapeGroup">
13
+
14
+ </path>
15
+ </g>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var Mermaid_module = require('../styles/Mermaid.module.scss.js');
7
+
8
+ const MermaidControls = ({ className, isExpanded, onZoomIn, onZoomOut, onReset, onToggleExpand, }) => {
9
+ const toggleLabel = isExpanded ? 'Close fullscreen' : 'Expand to fullscreen';
10
+ const toggleModifier = isExpanded
11
+ ? Mermaid_module.default['mermaid__controls__btn--collapse']
12
+ : Mermaid_module.default['mermaid__controls__btn--expand'];
13
+ return (jsxRuntime.jsxs("div", { className: className, children: [jsxRuntime.jsx("button", { className: `${Mermaid_module.default['mermaid__controls__btn']} ${Mermaid_module.default['mermaid__controls__btn--zoom-in']}`, onClick: onZoomIn, "aria-label": "Zoom in", title: "Zoom in" }), jsxRuntime.jsx("button", { className: `${Mermaid_module.default['mermaid__controls__btn']} ${Mermaid_module.default['mermaid__controls__btn--zoom-out']}`, onClick: onZoomOut, "aria-label": "Zoom out", title: "Zoom out" }), jsxRuntime.jsx("button", { className: `${Mermaid_module.default['mermaid__controls__btn']} ${Mermaid_module.default['mermaid__controls__btn--reset']}`, onClick: onReset, "aria-label": "Reset view", title: "Reset view" }), jsxRuntime.jsx("button", { className: `${Mermaid_module.default['mermaid__controls__btn']} ${toggleModifier}`, onClick: onToggleExpand, "aria-label": toggleLabel, title: toggleLabel })] }));
14
+ };
15
+
16
+ exports.default = MermaidControls;
17
+ //# sourceMappingURL=MermaidControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MermaidControls.js","sources":["../../../src/components/MermaidControls.tsx"],"sourcesContent":["import styles from '../styles/Mermaid.module.scss';\n\ninterface MermaidControlsProps {\n\tclassName: string;\n\tisExpanded: boolean;\n\tonZoomIn: () => void;\n\tonZoomOut: () => void;\n\tonReset: () => void;\n\tonToggleExpand: () => void;\n}\n\nconst MermaidControls = ({\n\tclassName,\n\tisExpanded,\n\tonZoomIn,\n\tonZoomOut,\n\tonReset,\n\tonToggleExpand,\n}: MermaidControlsProps) => {\n\tconst toggleLabel = isExpanded ? 'Close fullscreen' : 'Expand to fullscreen';\n\tconst toggleModifier = isExpanded\n\t\t? styles['mermaid__controls__btn--collapse']\n\t\t: styles['mermaid__controls__btn--expand'];\n\treturn (\n\t\t<div className={className}>\n\t\t\t<button\n\t\t\t\tclassName={`${styles['mermaid__controls__btn']} ${styles['mermaid__controls__btn--zoom-in']}`}\n\t\t\t\tonClick={onZoomIn}\n\t\t\t\taria-label=\"Zoom in\"\n\t\t\t\ttitle=\"Zoom in\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tclassName={`${styles['mermaid__controls__btn']} ${styles['mermaid__controls__btn--zoom-out']}`}\n\t\t\t\tonClick={onZoomOut}\n\t\t\t\taria-label=\"Zoom out\"\n\t\t\t\ttitle=\"Zoom out\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tclassName={`${styles['mermaid__controls__btn']} ${styles['mermaid__controls__btn--reset']}`}\n\t\t\t\tonClick={onReset}\n\t\t\t\taria-label=\"Reset view\"\n\t\t\t\ttitle=\"Reset view\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tclassName={`${styles['mermaid__controls__btn']} ${toggleModifier}`}\n\t\t\t\tonClick={onToggleExpand}\n\t\t\t\taria-label={toggleLabel}\n\t\t\t\ttitle={toggleLabel}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nexport default MermaidControls;\n"],"names":["styles","_jsxs","_jsx"],"mappings":";;;;;;;AAWA,MAAM,eAAe,GAAG,CAAC,EACxB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,SAAS,EACT,OAAO,EACP,cAAc,GACQ,KAAI;IAC1B,MAAM,WAAW,GAAG,UAAU,GAAG,kBAAkB,GAAG,sBAAsB;IAC5E,MAAM,cAAc,GAAG;AACtB,UAAEA,sBAAM,CAAC,kCAAkC;AAC3C,UAAEA,sBAAM,CAAC,gCAAgC,CAAC;IAC3C,QACCC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,SAAS,aACxBC,cAAA,CAAA,QAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGF,sBAAM,CAAC,wBAAwB,CAAC,CAAA,CAAA,EAAIA,sBAAM,CAAC,iCAAiC,CAAC,EAAE,EAC7F,OAAO,EAAE,QAAQ,EAAA,YAAA,EACN,SAAS,EACpB,KAAK,EAAC,SAAS,EAAA,CACd,EACFE,cAAA,CAAA,QAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGF,sBAAM,CAAC,wBAAwB,CAAC,IAAIA,sBAAM,CAAC,kCAAkC,CAAC,CAAA,CAAE,EAC9F,OAAO,EAAE,SAAS,EAAA,YAAA,EACP,UAAU,EACrB,KAAK,EAAC,UAAU,EAAA,CACf,EACFE,cAAA,CAAA,QAAA,EAAA,EACC,SAAS,EAAE,GAAGF,sBAAM,CAAC,wBAAwB,CAAC,CAAA,CAAA,EAAIA,sBAAM,CAAC,+BAA+B,CAAC,CAAA,CAAE,EAC3F,OAAO,EAAE,OAAO,EAAA,YAAA,EACL,YAAY,EACvB,KAAK,EAAC,YAAY,GACjB,EACFE,cAAA,CAAA,QAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGF,sBAAM,CAAC,wBAAwB,CAAC,CAAA,CAAA,EAAI,cAAc,CAAA,CAAE,EAClE,OAAO,EAAE,cAAc,EAAA,YAAA,EACX,WAAW,EACvB,KAAK,EAAE,WAAW,EAAA,CACjB,CAAA,EAAA,CACG;AAER;;;;"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ const MermaidViewport = ({ className, draggingClassName, pan, contentRef, contentId, hidden, }) => (jsxRuntime.jsx("div", { className: `${className} ${pan.isDragging ? draggingClassName : ''}`, style: hidden ? { display: 'none' } : undefined, onMouseDown: pan.onMouseDown, onMouseMove: pan.onMouseMove, onMouseUp: pan.onMouseUp, onMouseLeave: pan.onMouseUp, children: jsxRuntime.jsx("div", { style: {
8
+ transform: `translate(${pan.transform.x}px, ${pan.transform.y}px) scale(${pan.transform.scale})`,
9
+ transformOrigin: '0 0',
10
+ transition: pan.isDragging ? 'none' : 'transform 0.1s ease',
11
+ }, children: jsxRuntime.jsx("div", { ref: contentRef, id: contentId }) }) }));
12
+
13
+ exports.default = MermaidViewport;
14
+ //# sourceMappingURL=MermaidViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MermaidViewport.js","sources":["../../../src/components/MermaidViewport.tsx"],"sourcesContent":["import type { PanZoom } from '../hooks/usePanZoom';\n\ninterface MermaidViewportProps {\n\tclassName: string;\n\tdraggingClassName: string;\n\tpan: PanZoom;\n\tcontentRef: React.RefObject<HTMLDivElement>;\n\tcontentId?: string;\n\thidden?: boolean;\n}\n\nconst MermaidViewport = ({\n\tclassName,\n\tdraggingClassName,\n\tpan,\n\tcontentRef,\n\tcontentId,\n\thidden,\n}: MermaidViewportProps) => (\n\t<div\n\t\tclassName={`${className} ${pan.isDragging ? draggingClassName : ''}`}\n\t\tstyle={hidden ? { display: 'none' } : undefined}\n\t\tonMouseDown={pan.onMouseDown}\n\t\tonMouseMove={pan.onMouseMove}\n\t\tonMouseUp={pan.onMouseUp}\n\t\tonMouseLeave={pan.onMouseUp}\n\t>\n\t\t<div\n\t\t\tstyle={{\n\t\t\t\ttransform: `translate(${pan.transform.x}px, ${pan.transform.y}px) scale(${pan.transform.scale})`,\n\t\t\t\ttransformOrigin: '0 0',\n\t\t\t\ttransition: pan.isDragging ? 'none' : 'transform 0.1s ease',\n\t\t\t}}\n\t\t>\n\t\t\t<div ref={contentRef} id={contentId} />\n\t\t</div>\n\t</div>\n);\n\nexport default MermaidViewport;\n"],"names":["_jsx"],"mappings":";;;;;;AAWA,MAAM,eAAe,GAAG,CAAC,EACxB,SAAS,EACT,iBAAiB,EACjB,GAAG,EACH,UAAU,EACV,SAAS,EACT,MAAM,GACgB,MACtBA,cAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAC,UAAU,GAAG,iBAAiB,GAAG,EAAE,EAAE,EACpE,KAAK,EAAE,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/C,WAAW,EAAE,GAAG,CAAC,WAAW,EAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,EAC5B,SAAS,EAAE,GAAG,CAAC,SAAS,EACxB,YAAY,EAAE,GAAG,CAAC,SAAS,EAAA,QAAA,EAE3BA,cAAA,CAAA,KAAA,EAAA,EACC,KAAK,EAAE;AACN,YAAA,SAAS,EAAE,CAAA,UAAA,EAAa,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA,IAAA,EAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA,UAAA,EAAa,GAAG,CAAC,SAAS,CAAC,KAAK,CAAA,CAAA,CAAG;AAChG,YAAA,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,MAAM,GAAG,qBAAqB;AAC3D,SAAA,EAAA,QAAA,EAEDA,cAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAA,CAAI,EAAA,CAClC,EAAA,CACD;;;;"}
@@ -5,7 +5,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var react = require('react');
8
+ var reactDom = require('react-dom');
8
9
  var mermaid = require('mermaid');
10
+ var MermaidControls = require('../components/MermaidControls.js');
11
+ var MermaidViewport = require('../components/MermaidViewport.js');
12
+ var usePanZoom = require('../hooks/usePanZoom.js');
9
13
  var CalloutStatic = require('../staticComponents/CalloutStatic.js');
10
14
  var Mermaid_module = require('../styles/Mermaid.module.scss.js');
11
15
 
@@ -25,102 +29,75 @@ mermaid.initialize({
25
29
  diagramMarginX: 0,
26
30
  },
27
31
  });
28
- const MIN_SCALE = 0.5;
29
- const MAX_SCALE = 4;
30
- const ZOOM_STEP = 0.15;
31
32
  const Mermaid = ({ code = '', id = '', hasMarginUp = false, hasMarginDown = false, }) => {
32
33
  const [enabled, setEnabled] = react.useState(false);
33
34
  const [error, setError] = react.useState(null);
34
- const [transform, setTransform] = react.useState({ scale: 1, x: 0, y: 0 });
35
- const [isDragging, setIsDragging] = react.useState(false);
35
+ const [isExpanded, setIsExpanded] = react.useState(false);
36
36
  const mermaidReference = react.useRef(null);
37
- const viewportRef = react.useRef(null);
37
+ const modalMermaidReference = react.useRef(null);
38
38
  const renderCount = react.useRef(0);
39
- const transformRef = react.useRef({ scale: 1, x: 0, y: 0 });
40
- const isDraggingRef = react.useRef(false);
41
- const dragStart = react.useRef({
42
- mouseX: 0,
43
- mouseY: 0,
44
- transformX: 0,
45
- transformY: 0,
46
- });
47
- const applyTransform = react.useCallback((updater) => {
48
- const next = updater(transformRef.current);
49
- transformRef.current = next;
50
- setTransform(next);
51
- }, []);
52
- const initializeMermaid = react.useCallback(async () => {
53
- if (!mermaidReference.current || !code)
54
- return;
55
- const renderId = `mermaid-diagram-${id}-${++renderCount.current}`;
56
- document.getElementById(renderId)?.remove();
39
+ const inline = usePanZoom.usePanZoom();
40
+ const modal = usePanZoom.usePanZoom();
41
+ const renderInto = react.useCallback(async (target, prefix) => {
42
+ if (!target || !code)
43
+ return false;
44
+ const renderId = `${prefix}-${id}-${++renderCount.current}`;
57
45
  try {
58
46
  const { svg, bindFunctions } = await mermaid.render(renderId, code);
59
- if (!mermaidReference.current || !svg)
60
- return;
61
- mermaidReference.current.innerHTML = svg;
62
- bindFunctions?.(mermaidReference.current);
63
- setEnabled(true);
47
+ if (!svg)
48
+ return false;
49
+ target.innerHTML = svg;
50
+ bindFunctions?.(target);
51
+ return true;
64
52
  }
65
53
  catch (err) {
66
54
  const message = err instanceof Error ? err.message : 'Failed to render diagram';
67
55
  setError(message);
56
+ return false;
68
57
  }
69
58
  }, [code, id]);
70
59
  react.useEffect(() => {
71
60
  if (!code)
72
61
  return;
73
62
  setError(null);
74
- applyTransform(() => ({ scale: 1, x: 0, y: 0 }));
75
- const timer = setTimeout(initializeMermaid, 100);
63
+ inline.reset();
64
+ const timer = setTimeout(() => {
65
+ renderInto(mermaidReference.current, 'mermaid-diagram').then(ok => {
66
+ if (ok)
67
+ setEnabled(true);
68
+ });
69
+ }, 100);
76
70
  return () => clearTimeout(timer);
77
- }, [code, initializeMermaid, applyTransform]);
78
- const handleMouseDown = react.useCallback((e) => {
79
- e.preventDefault();
80
- isDraggingRef.current = true;
81
- setIsDragging(true);
82
- dragStart.current = {
83
- mouseX: e.clientX,
84
- mouseY: e.clientY,
85
- transformX: transformRef.current.x,
86
- transformY: transformRef.current.y,
87
- };
88
- }, []);
89
- const handleMouseMove = react.useCallback((e) => {
90
- if (!isDraggingRef.current)
71
+ }, [code, renderInto, inline.reset]);
72
+ react.useEffect(() => {
73
+ if (!isExpanded)
74
+ return;
75
+ modal.reset();
76
+ const timer = setTimeout(() => {
77
+ renderInto(modalMermaidReference.current, 'mermaid-modal');
78
+ }, 0);
79
+ return () => clearTimeout(timer);
80
+ }, [isExpanded, renderInto, modal.reset]);
81
+ react.useEffect(() => {
82
+ if (!isExpanded)
91
83
  return;
92
- applyTransform(prev => ({
93
- ...prev,
94
- x: dragStart.current.transformX + (e.clientX - dragStart.current.mouseX),
95
- y: dragStart.current.transformY + (e.clientY - dragStart.current.mouseY),
96
- }));
97
- }, [applyTransform]);
98
- const handleMouseUp = react.useCallback(() => {
99
- isDraggingRef.current = false;
100
- setIsDragging(false);
101
- }, []);
102
- const zoomIn = react.useCallback(() => {
103
- applyTransform(prev => ({
104
- ...prev,
105
- scale: Math.min(prev.scale * (1 + ZOOM_STEP), MAX_SCALE),
106
- }));
107
- }, [applyTransform]);
108
- const zoomOut = react.useCallback(() => {
109
- applyTransform(prev => ({
110
- ...prev,
111
- scale: Math.max(prev.scale * (1 - ZOOM_STEP), MIN_SCALE),
112
- }));
113
- }, [applyTransform]);
114
- const resetView = react.useCallback(() => {
115
- applyTransform(() => ({ scale: 1, x: 0, y: 0 }));
116
- }, [applyTransform]);
84
+ const onKey = (e) => {
85
+ if (e.key === 'Escape')
86
+ setIsExpanded(false);
87
+ };
88
+ const previousOverflow = document.body.style.overflow;
89
+ document.body.style.overflow = 'hidden';
90
+ window.addEventListener('keydown', onKey);
91
+ return () => {
92
+ document.body.style.overflow = previousOverflow;
93
+ window.removeEventListener('keydown', onKey);
94
+ };
95
+ }, [isExpanded]);
117
96
  return (jsxRuntime.jsxs("div", { className: `${Mermaid_module.default.mermaid}
118
97
  ${hasMarginUp ? Mermaid_module.default['margin-top--1'] : ''}
119
- ${hasMarginDown ? Mermaid_module.default['margin-bottom--2'] : ''}`, children: [error ? (jsxRuntime.jsx(CalloutStatic.default, { type: "error", children: jsxRuntime.jsxs("p", { children: [jsxRuntime.jsx("b", { children: "Diagram error:" }), " ", error] }) })) : !enabled ? (jsxRuntime.jsx(CalloutStatic.default, { type: "info", children: jsxRuntime.jsx("p", { children: "Rendering diagram..." }) })) : (jsxRuntime.jsxs("div", { className: Mermaid_module.default['mermaid__controls'], children: [jsxRuntime.jsx("button", { className: Mermaid_module.default['mermaid__controls__btn'], onClick: zoomIn, children: "+" }), jsxRuntime.jsx("button", { className: Mermaid_module.default['mermaid__controls__btn'], onClick: zoomOut, children: "\u2212" }), jsxRuntime.jsx("button", { className: Mermaid_module.default['mermaid__controls__btn'], onClick: resetView, children: "Reset" })] })), jsxRuntime.jsx("div", { ref: viewportRef, className: `${Mermaid_module.default['mermaid__viewport']} ${isDragging ? Mermaid_module.default['mermaid__viewport--dragging'] : ''}`, style: enabled ? undefined : { display: 'none' }, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseUp: handleMouseUp, onMouseLeave: handleMouseUp, children: jsxRuntime.jsx("div", { style: {
120
- transform: `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`,
121
- transformOrigin: '0 0',
122
- transition: isDragging ? 'none' : 'transform 0.1s ease',
123
- }, children: jsxRuntime.jsx("div", { ref: mermaidReference, id: id }) }) })] }));
98
+ ${hasMarginDown ? Mermaid_module.default['margin-bottom--2'] : ''}`, children: [error ? (jsxRuntime.jsx(CalloutStatic.default, { type: "error", children: jsxRuntime.jsxs("p", { children: [jsxRuntime.jsx("b", { children: "Diagram error:" }), " ", error] }) })) : !enabled ? (jsxRuntime.jsx(CalloutStatic.default, { type: "info", children: jsxRuntime.jsx("p", { children: "Rendering diagram..." }) })) : (jsxRuntime.jsx(MermaidControls.default, { className: Mermaid_module.default['mermaid__controls'], isExpanded: false, onZoomIn: inline.zoomIn, onZoomOut: inline.zoomOut, onReset: inline.reset, onToggleExpand: () => setIsExpanded(true) })), jsxRuntime.jsx(MermaidViewport.default, { className: Mermaid_module.default['mermaid__viewport'], draggingClassName: Mermaid_module.default['mermaid__viewport--dragging'], pan: inline, contentRef: mermaidReference, contentId: id, hidden: !enabled }), isExpanded &&
99
+ typeof document !== 'undefined' &&
100
+ reactDom.createPortal(jsxRuntime.jsx("div", { className: Mermaid_module.default['mermaid__modal'], onClick: () => setIsExpanded(false), role: "dialog", "aria-modal": "true", children: jsxRuntime.jsxs("div", { className: Mermaid_module.default['mermaid__modal__content'], onClick: e => e.stopPropagation(), children: [jsxRuntime.jsx(MermaidControls.default, { className: Mermaid_module.default['mermaid__modal__controls'], isExpanded: true, onZoomIn: modal.zoomIn, onZoomOut: modal.zoomOut, onReset: modal.reset, onToggleExpand: () => setIsExpanded(false) }), jsxRuntime.jsx(MermaidViewport.default, { className: Mermaid_module.default['mermaid__modal__viewport'], draggingClassName: Mermaid_module.default['mermaid__modal__viewport--dragging'], pan: modal, contentRef: modalMermaidReference })] }) }), document.body)] }));
124
101
  };
125
102
 
126
103
  exports.default = Mermaid;
@@ -1 +1 @@
1
- {"version":3,"file":"MermaidDynamic.js","sources":["../../../src/dynamicComponents/MermaidDynamic.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport mermaid from 'mermaid';\n\nimport CalloutStatic from '../staticComponents/CalloutStatic';\nimport styles from '../styles/Mermaid.module.scss';\n\ninterface MermaidProperties {\n\tcode: string;\n\tid: string;\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nmermaid.initialize({\n\tstartOnLoad: false,\n\ttheme: 'default',\n\ttimeline: {\n\t\tuseMaxWidth: true,\n\t\tdiagramMarginX: 0,\n\t},\n\tflowchart: {\n\t\tuseMaxWidth: true,\n\t\tdiagramPadding: 0,\n\t},\n\tsequence: {\n\t\tuseMaxWidth: true,\n\t\tdiagramMarginX: 0,\n\t},\n});\n\nconst MIN_SCALE = 0.5;\nconst MAX_SCALE = 4;\nconst ZOOM_STEP = 0.15;\n\nconst Mermaid = ({\n\tcode = '',\n\tid = '',\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: MermaidProperties) => {\n\tconst [enabled, setEnabled] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [transform, setTransform] = useState({ scale: 1, x: 0, y: 0 });\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst mermaidReference = useRef<HTMLDivElement>(null);\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst renderCount = useRef(0);\n\tconst transformRef = useRef({ scale: 1, x: 0, y: 0 });\n\tconst isDraggingRef = useRef(false);\n\tconst dragStart = useRef({\n\t\tmouseX: 0,\n\t\tmouseY: 0,\n\t\ttransformX: 0,\n\t\ttransformY: 0,\n\t});\n\n\tconst applyTransform = useCallback(\n\t\t(\n\t\t\tupdater: (\n\t\t\t\tprev: typeof transformRef.current\n\t\t\t) => typeof transformRef.current\n\t\t) => {\n\t\t\tconst next = updater(transformRef.current);\n\t\t\ttransformRef.current = next;\n\t\t\tsetTransform(next);\n\t\t},\n\t\t[]\n\t);\n\n\tconst initializeMermaid = useCallback(async () => {\n\t\tif (!mermaidReference.current || !code) return;\n\t\tconst renderId = `mermaid-diagram-${id}-${++renderCount.current}`;\n\t\tdocument.getElementById(renderId)?.remove();\n\t\ttry {\n\t\t\tconst { svg, bindFunctions } = await mermaid.render(renderId, code);\n\t\t\tif (!mermaidReference.current || !svg) return;\n\t\t\tmermaidReference.current.innerHTML = svg;\n\t\t\tbindFunctions?.(mermaidReference.current);\n\t\t\tsetEnabled(true);\n\t\t} catch (err) {\n\t\t\tconst message =\n\t\t\t\terr instanceof Error ? err.message : 'Failed to render diagram';\n\t\t\tsetError(message);\n\t\t}\n\t}, [code, id]);\n\n\tuseEffect(() => {\n\t\tif (!code) return;\n\t\tsetError(null);\n\t\tapplyTransform(() => ({ scale: 1, x: 0, y: 0 }));\n\t\tconst timer = setTimeout(initializeMermaid, 100);\n\t\treturn () => clearTimeout(timer);\n\t}, [code, initializeMermaid, applyTransform]);\n\n\n\n\tconst handleMouseDown = useCallback((e: React.MouseEvent) => {\n\t\te.preventDefault();\n\t\tisDraggingRef.current = true;\n\t\tsetIsDragging(true);\n\t\tdragStart.current = {\n\t\t\tmouseX: e.clientX,\n\t\t\tmouseY: e.clientY,\n\t\t\ttransformX: transformRef.current.x,\n\t\t\ttransformY: transformRef.current.y,\n\t\t};\n\t}, []);\n\n\tconst handleMouseMove = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDraggingRef.current) return;\n\t\t\tapplyTransform(prev => ({\n\t\t\t\t...prev,\n\t\t\t\tx:\n\t\t\t\t\tdragStart.current.transformX + (e.clientX - dragStart.current.mouseX),\n\t\t\t\ty:\n\t\t\t\t\tdragStart.current.transformY + (e.clientY - dragStart.current.mouseY),\n\t\t\t}));\n\t\t},\n\t\t[applyTransform]\n\t);\n\n\tconst handleMouseUp = useCallback(() => {\n\t\tisDraggingRef.current = false;\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst zoomIn = useCallback(() => {\n\t\tapplyTransform(prev => ({\n\t\t\t...prev,\n\t\t\tscale: Math.min(prev.scale * (1 + ZOOM_STEP), MAX_SCALE),\n\t\t}));\n\t}, [applyTransform]);\n\n\tconst zoomOut = useCallback(() => {\n\t\tapplyTransform(prev => ({\n\t\t\t...prev,\n\t\t\tscale: Math.max(prev.scale * (1 - ZOOM_STEP), MIN_SCALE),\n\t\t}));\n\t}, [applyTransform]);\n\n\tconst resetView = useCallback(() => {\n\t\tapplyTransform(() => ({ scale: 1, x: 0, y: 0 }));\n\t}, [applyTransform]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.mermaid}\n\t\t\t\t${hasMarginUp ? styles['margin-top--1'] : ''}\n\t\t\t\t${hasMarginDown ? styles['margin-bottom--2'] : ''}`}\n\t\t>\n\t\t\t{error ? (\n\t\t\t\t<CalloutStatic type=\"error\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<b>Diagram error:</b> {error}\n\t\t\t\t\t</p>\n\t\t\t\t</CalloutStatic>\n\t\t\t) : !enabled ? (\n\t\t\t\t<CalloutStatic type=\"info\">\n\t\t\t\t\t<p>Rendering diagram...</p>\n\t\t\t\t</CalloutStatic>\n\t\t\t) : (\n\t\t\t\t<div className={styles['mermaid__controls']}>\n\t\t\t\t\t<button className={styles['mermaid__controls__btn']} onClick={zoomIn}>\n\t\t\t\t\t\t+\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName={styles['mermaid__controls__btn']}\n\t\t\t\t\t\tonClick={zoomOut}\n\t\t\t\t\t>\n\t\t\t\t\t\t−\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName={styles['mermaid__controls__btn']}\n\t\t\t\t\t\tonClick={resetView}\n\t\t\t\t\t>\n\t\t\t\t\t\tReset\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div\n\t\t\t\tref={viewportRef}\n\t\t\t\tclassName={`${styles['mermaid__viewport']} ${\n\t\t\t\t\tisDragging ? styles['mermaid__viewport--dragging'] : ''\n\t\t\t\t}`}\n\t\t\t\tstyle={enabled ? undefined : { display: 'none' }}\n\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\tonMouseMove={handleMouseMove}\n\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\tonMouseLeave={handleMouseUp}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\ttransform: `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`,\n\t\t\t\t\t\ttransformOrigin: '0 0',\n\t\t\t\t\t\ttransition: isDragging ? 'none' : 'transform 0.1s ease',\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div ref={mermaidReference} id={id} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default Mermaid;\n"],"names":["useState","useRef","useCallback","useEffect","_jsxs","styles","_jsx","CalloutStatic"],"mappings":"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"}
1
+ {"version":3,"file":"MermaidDynamic.js","sources":["../../../src/dynamicComponents/MermaidDynamic.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport mermaid from 'mermaid';\n\nimport MermaidControls from '../components/MermaidControls';\nimport MermaidViewport from '../components/MermaidViewport';\nimport { usePanZoom } from '../hooks/usePanZoom';\nimport CalloutStatic from '../staticComponents/CalloutStatic';\nimport styles from '../styles/Mermaid.module.scss';\n\ninterface MermaidProperties {\n\tcode: string;\n\tid: string;\n\thasMarginUp?: boolean;\n\thasMarginDown?: boolean;\n}\n\nmermaid.initialize({\n\tstartOnLoad: false,\n\ttheme: 'default',\n\ttimeline: {\n\t\tuseMaxWidth: true,\n\t\tdiagramMarginX: 0,\n\t},\n\tflowchart: {\n\t\tuseMaxWidth: true,\n\t\tdiagramPadding: 0,\n\t},\n\tsequence: {\n\t\tuseMaxWidth: true,\n\t\tdiagramMarginX: 0,\n\t},\n});\n\nconst Mermaid = ({\n\tcode = '',\n\tid = '',\n\thasMarginUp = false,\n\thasMarginDown = false,\n}: MermaidProperties) => {\n\tconst [enabled, setEnabled] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [isExpanded, setIsExpanded] = useState(false);\n\n\tconst mermaidReference = useRef<HTMLDivElement>(null);\n\tconst modalMermaidReference = useRef<HTMLDivElement>(null);\n\tconst renderCount = useRef(0);\n\n\tconst inline = usePanZoom();\n\tconst modal = usePanZoom();\n\n\tconst renderInto = useCallback(\n\t\tasync (target: HTMLDivElement | null, prefix: string) => {\n\t\t\tif (!target || !code) return false;\n\t\t\tconst renderId = `${prefix}-${id}-${++renderCount.current}`;\n\t\t\ttry {\n\t\t\t\tconst { svg, bindFunctions } = await mermaid.render(renderId, code);\n\t\t\t\tif (!svg) return false;\n\t\t\t\ttarget.innerHTML = svg;\n\t\t\t\tbindFunctions?.(target);\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to render diagram';\n\t\t\t\tsetError(message);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[code, id]\n\t);\n\n\tuseEffect(() => {\n\t\tif (!code) return;\n\t\tsetError(null);\n\t\tinline.reset();\n\t\tconst timer = setTimeout(() => {\n\t\t\trenderInto(mermaidReference.current, 'mermaid-diagram').then(ok => {\n\t\t\t\tif (ok) setEnabled(true);\n\t\t\t});\n\t\t}, 100);\n\t\treturn () => clearTimeout(timer);\n\t}, [code, renderInto, inline.reset]);\n\n\tuseEffect(() => {\n\t\tif (!isExpanded) return;\n\t\tmodal.reset();\n\t\tconst timer = setTimeout(() => {\n\t\t\trenderInto(modalMermaidReference.current, 'mermaid-modal');\n\t\t}, 0);\n\t\treturn () => clearTimeout(timer);\n\t}, [isExpanded, renderInto, modal.reset]);\n\n\tuseEffect(() => {\n\t\tif (!isExpanded) return;\n\t\tconst onKey = (e: KeyboardEvent) => {\n\t\t\tif (e.key === 'Escape') setIsExpanded(false);\n\t\t};\n\t\tconst previousOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = 'hidden';\n\t\twindow.addEventListener('keydown', onKey);\n\t\treturn () => {\n\t\t\tdocument.body.style.overflow = previousOverflow;\n\t\t\twindow.removeEventListener('keydown', onKey);\n\t\t};\n\t}, [isExpanded]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`${styles.mermaid}\n\t\t\t\t${hasMarginUp ? styles['margin-top--1'] : ''}\n\t\t\t\t${hasMarginDown ? styles['margin-bottom--2'] : ''}`}\n\t\t>\n\t\t\t{error ? (\n\t\t\t\t<CalloutStatic type=\"error\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<b>Diagram error:</b> {error}\n\t\t\t\t\t</p>\n\t\t\t\t</CalloutStatic>\n\t\t\t) : !enabled ? (\n\t\t\t\t<CalloutStatic type=\"info\">\n\t\t\t\t\t<p>Rendering diagram...</p>\n\t\t\t\t</CalloutStatic>\n\t\t\t) : (\n\t\t\t\t<MermaidControls\n\t\t\t\t\tclassName={styles['mermaid__controls']}\n\t\t\t\t\tisExpanded={false}\n\t\t\t\t\tonZoomIn={inline.zoomIn}\n\t\t\t\t\tonZoomOut={inline.zoomOut}\n\t\t\t\t\tonReset={inline.reset}\n\t\t\t\t\tonToggleExpand={() => setIsExpanded(true)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<MermaidViewport\n\t\t\t\tclassName={styles['mermaid__viewport']}\n\t\t\t\tdraggingClassName={styles['mermaid__viewport--dragging']}\n\t\t\t\tpan={inline}\n\t\t\t\tcontentRef={mermaidReference}\n\t\t\t\tcontentId={id}\n\t\t\t\thidden={!enabled}\n\t\t\t/>\n\n\t\t\t{isExpanded &&\n\t\t\t\ttypeof document !== 'undefined' &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={styles['mermaid__modal']}\n\t\t\t\t\t\tonClick={() => setIsExpanded(false)}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={styles['mermaid__modal__content']}\n\t\t\t\t\t\t\tonClick={e => e.stopPropagation()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<MermaidControls\n\t\t\t\t\t\t\t\tclassName={styles['mermaid__modal__controls']}\n\t\t\t\t\t\t\t\tisExpanded={true}\n\t\t\t\t\t\t\t\tonZoomIn={modal.zoomIn}\n\t\t\t\t\t\t\t\tonZoomOut={modal.zoomOut}\n\t\t\t\t\t\t\t\tonReset={modal.reset}\n\t\t\t\t\t\t\t\tonToggleExpand={() => setIsExpanded(false)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<MermaidViewport\n\t\t\t\t\t\t\t\tclassName={styles['mermaid__modal__viewport']}\n\t\t\t\t\t\t\t\tdraggingClassName={styles['mermaid__modal__viewport--dragging']}\n\t\t\t\t\t\t\t\tpan={modal}\n\t\t\t\t\t\t\t\tcontentRef={modalMermaidReference}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default Mermaid;\n"],"names":["useState","useRef","usePanZoom","useCallback","useEffect","_jsxs","styles","_jsx","CalloutStatic","MermaidControls","MermaidViewport","createPortal"],"mappings":";;;;;;;;;;;;;;AAoBA,OAAO,CAAC,UAAU,CAAC;AAClB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,QAAQ,EAAE;AACT,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,CAAC;AACjB,KAAA;AACD,IAAA,SAAS,EAAE;AACV,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,CAAC;AACjB,KAAA;AACD,IAAA,QAAQ,EAAE;AACT,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,CAAC;AACjB,KAAA;AACD,CAAA,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,EAChB,IAAI,GAAG,EAAE,EACT,EAAE,GAAG,EAAE,EACP,WAAW,GAAG,KAAK,EACnB,aAAa,GAAG,KAAK,GACF,KAAI;IACvB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;AAEnD,IAAA,MAAM,gBAAgB,GAAGC,YAAM,CAAiB,IAAI,CAAC;AACrD,IAAA,MAAM,qBAAqB,GAAGA,YAAM,CAAiB,IAAI,CAAC;AAC1D,IAAA,MAAM,WAAW,GAAGA,YAAM,CAAC,CAAC,CAAC;AAE7B,IAAA,MAAM,MAAM,GAAGC,qBAAU,EAAE;AAC3B,IAAA,MAAM,KAAK,GAAGA,qBAAU,EAAE;IAE1B,MAAM,UAAU,GAAGC,iBAAW,CAC7B,OAAO,MAA6B,EAAE,MAAc,KAAI;AACvD,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,WAAW,CAAC,OAAO,CAAA,CAAE;AAC3D,QAAA,IAAI;AACH,YAAA,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;AACnE,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;AACtB,YAAA,MAAM,CAAC,SAAS,GAAG,GAAG;AACtB,YAAA,aAAa,GAAG,MAAM,CAAC;AACvB,YAAA,OAAO,IAAI;QACZ;QAAE,OAAO,GAAG,EAAE;AACb,YAAA,MAAM,OAAO,GACZ,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,0BAA0B;YAChE,QAAQ,CAAC,OAAO,CAAC;AACjB,YAAA,OAAO,KAAK;QACb;AACD,IAAA,CAAC,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,CACV;IAEDC,eAAS,CAAC,MAAK;AACd,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,QAAQ,CAAC,IAAI,CAAC;QACd,MAAM,CAAC,KAAK,EAAE;AACd,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAK;AAC7B,YAAA,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,IAAG;AACjE,gBAAA,IAAI,EAAE;oBAAE,UAAU,CAAC,IAAI,CAAC;AACzB,YAAA,CAAC,CAAC;QACH,CAAC,EAAE,GAAG,CAAC;AACP,QAAA,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC;IACjC,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAEpCA,eAAS,CAAC,MAAK;AACd,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,KAAK,CAAC,KAAK,EAAE;AACb,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAK;AAC7B,YAAA,UAAU,CAAC,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC;QAC3D,CAAC,EAAE,CAAC,CAAC;AACL,QAAA,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC;IACjC,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzCA,eAAS,CAAC,MAAK;AACd,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,MAAM,KAAK,GAAG,CAAC,CAAgB,KAAI;AAClC,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,aAAa,CAAC,KAAK,CAAC;AAC7C,QAAA,CAAC;QACD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;QACrD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AACvC,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC;AACzC,QAAA,OAAO,MAAK;YACX,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,gBAAgB;AAC/C,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC;AAC7C,QAAA,CAAC;AACF,IAAA,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;AAEhB,IAAA,QACCC,eAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAE,CAAA,EAAGC,sBAAM,CAAC,OAAO;MACzB,WAAW,GAAGA,sBAAM,CAAC,eAAe,CAAC,GAAG,EAAE;AAC1C,IAAA,EAAA,aAAa,GAAGA,sBAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAA,CAAE,aAEnD,KAAK,IACLC,cAAA,CAACC,qBAAa,EAAA,EAAC,IAAI,EAAC,OAAO,EAAA,QAAA,EAC1BH,eAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,CACCE,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,CAAqB,EAAA,GAAA,EAAE,KAAK,IACzB,EAAA,CACW,IACb,CAAC,OAAO,IACXA,cAAA,CAACC,qBAAa,EAAA,EAAC,IAAI,EAAC,MAAM,EAAA,QAAA,EACzBD,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,CAA2B,EAAA,CACZ,KAEhBA,eAACE,uBAAe,EAAA,EACf,SAAS,EAAEH,sBAAM,CAAC,mBAAmB,CAAC,EACtC,UAAU,EAAE,KAAK,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EACvB,SAAS,EAAE,MAAM,CAAC,OAAO,EACzB,OAAO,EAAE,MAAM,CAAC,KAAK,EACrB,cAAc,EAAE,MAAM,aAAa,CAAC,IAAI,CAAC,EAAA,CACxC,CACF,EACDC,cAAA,CAACG,uBAAe,EAAA,EACf,SAAS,EAAEJ,sBAAM,CAAC,mBAAmB,CAAC,EACtC,iBAAiB,EAAEA,sBAAM,CAAC,6BAA6B,CAAC,EACxD,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,EAAE,EACb,MAAM,EAAE,CAAC,OAAO,EAAA,CACf,EAED,UAAU;gBACV,OAAO,QAAQ,KAAK,WAAW;gBAC/BK,qBAAY,CACXJ,cAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAED,sBAAM,CAAC,gBAAgB,CAAC,EACnC,OAAO,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,EACnC,IAAI,EAAC,QAAQ,EAAA,YAAA,EACF,MAAM,EAAA,QAAA,EAEjBD,eAAA,CAAA,KAAA,EAAA,EACC,SAAS,EAAEC,sBAAM,CAAC,yBAAyB,CAAC,EAC5C,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAA,QAAA,EAAA,CAEjCC,cAAA,CAACE,uBAAe,EAAA,EACf,SAAS,EAAEH,sBAAM,CAAC,0BAA0B,CAAC,EAC7C,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,KAAK,CAAC,MAAM,EACtB,SAAS,EAAE,KAAK,CAAC,OAAO,EACxB,OAAO,EAAE,KAAK,CAAC,KAAK,EACpB,cAAc,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,EAAA,CACzC,EACFC,cAAA,CAACG,uBAAe,EAAA,EACf,SAAS,EAAEJ,sBAAM,CAAC,0BAA0B,CAAC,EAC7C,iBAAiB,EAAEA,sBAAM,CAAC,oCAAoC,CAAC,EAC/D,GAAG,EAAE,KAAK,EACV,UAAU,EAAE,qBAAqB,EAAA,CAChC,CAAA,EAAA,CACG,EAAA,CACD,EACN,QAAQ,CAAC,IAAI,CACb,CAAA,EAAA,CACG;AAER;;;;"}
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ const DEFAULT_INITIAL_TRANSFORM = { scale: 1, x: 0, y: 0 };
6
+ const DEFAULT_MIN_SCALE = 0.5;
7
+ const DEFAULT_MAX_SCALE = 4;
8
+ const DEFAULT_ZOOM_STEP = 0.15;
9
+ const usePanZoom = ({ initialTransform = DEFAULT_INITIAL_TRANSFORM, minScale = DEFAULT_MIN_SCALE, maxScale = DEFAULT_MAX_SCALE, zoomStep = DEFAULT_ZOOM_STEP, } = {}) => {
10
+ const [transform, setTransform] = react.useState(initialTransform);
11
+ const [isDragging, setIsDragging] = react.useState(false);
12
+ const transformRef = react.useRef(initialTransform);
13
+ const isDraggingRef = react.useRef(false);
14
+ const dragStart = react.useRef({
15
+ mouseX: 0,
16
+ mouseY: 0,
17
+ transformX: 0,
18
+ transformY: 0,
19
+ });
20
+ const apply = react.useCallback((updater) => {
21
+ const next = updater(transformRef.current);
22
+ transformRef.current = next;
23
+ setTransform(next);
24
+ }, []);
25
+ const onMouseDown = react.useCallback((e) => {
26
+ e.preventDefault();
27
+ isDraggingRef.current = true;
28
+ setIsDragging(true);
29
+ dragStart.current = {
30
+ mouseX: e.clientX,
31
+ mouseY: e.clientY,
32
+ transformX: transformRef.current.x,
33
+ transformY: transformRef.current.y,
34
+ };
35
+ }, []);
36
+ const onMouseMove = react.useCallback((e) => {
37
+ if (!isDraggingRef.current)
38
+ return;
39
+ apply(prev => ({
40
+ ...prev,
41
+ x: dragStart.current.transformX + (e.clientX - dragStart.current.mouseX),
42
+ y: dragStart.current.transformY + (e.clientY - dragStart.current.mouseY),
43
+ }));
44
+ }, [apply]);
45
+ const onMouseUp = react.useCallback(() => {
46
+ isDraggingRef.current = false;
47
+ setIsDragging(false);
48
+ }, []);
49
+ const zoomIn = react.useCallback(() => {
50
+ apply(prev => ({
51
+ ...prev,
52
+ scale: Math.min(prev.scale * (1 + zoomStep), maxScale),
53
+ }));
54
+ }, [apply, zoomStep, maxScale]);
55
+ const zoomOut = react.useCallback(() => {
56
+ apply(prev => ({
57
+ ...prev,
58
+ scale: Math.max(prev.scale * (1 - zoomStep), minScale),
59
+ }));
60
+ }, [apply, zoomStep, minScale]);
61
+ const reset = react.useCallback(() => {
62
+ apply(() => initialTransform);
63
+ }, [apply, initialTransform]);
64
+ return {
65
+ transform,
66
+ isDragging,
67
+ onMouseDown,
68
+ onMouseMove,
69
+ onMouseUp,
70
+ zoomIn,
71
+ zoomOut,
72
+ reset,
73
+ };
74
+ };
75
+
76
+ exports.usePanZoom = usePanZoom;
77
+ //# sourceMappingURL=usePanZoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePanZoom.js","sources":["../../../src/hooks/usePanZoom.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport interface Transform {\n\tscale: number;\n\tx: number;\n\ty: number;\n}\n\nexport interface UsePanZoomOptions {\n\tinitialTransform?: Transform;\n\tminScale?: number;\n\tmaxScale?: number;\n\tzoomStep?: number;\n}\n\nconst DEFAULT_INITIAL_TRANSFORM: Transform = { scale: 1, x: 0, y: 0 };\nconst DEFAULT_MIN_SCALE = 0.5;\nconst DEFAULT_MAX_SCALE = 4;\nconst DEFAULT_ZOOM_STEP = 0.15;\n\nexport const usePanZoom = ({\n\tinitialTransform = DEFAULT_INITIAL_TRANSFORM,\n\tminScale = DEFAULT_MIN_SCALE,\n\tmaxScale = DEFAULT_MAX_SCALE,\n\tzoomStep = DEFAULT_ZOOM_STEP,\n}: UsePanZoomOptions = {}) => {\n\tconst [transform, setTransform] = useState<Transform>(initialTransform);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst transformRef = useRef<Transform>(initialTransform);\n\tconst isDraggingRef = useRef(false);\n\tconst dragStart = useRef({\n\t\tmouseX: 0,\n\t\tmouseY: 0,\n\t\ttransformX: 0,\n\t\ttransformY: 0,\n\t});\n\n\tconst apply = useCallback((updater: (prev: Transform) => Transform) => {\n\t\tconst next = updater(transformRef.current);\n\t\ttransformRef.current = next;\n\t\tsetTransform(next);\n\t}, []);\n\n\tconst onMouseDown = useCallback((e: React.MouseEvent) => {\n\t\te.preventDefault();\n\t\tisDraggingRef.current = true;\n\t\tsetIsDragging(true);\n\t\tdragStart.current = {\n\t\t\tmouseX: e.clientX,\n\t\t\tmouseY: e.clientY,\n\t\t\ttransformX: transformRef.current.x,\n\t\t\ttransformY: transformRef.current.y,\n\t\t};\n\t}, []);\n\n\tconst onMouseMove = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (!isDraggingRef.current) return;\n\t\t\tapply(prev => ({\n\t\t\t\t...prev,\n\t\t\t\tx:\n\t\t\t\t\tdragStart.current.transformX + (e.clientX - dragStart.current.mouseX),\n\t\t\t\ty:\n\t\t\t\t\tdragStart.current.transformY + (e.clientY - dragStart.current.mouseY),\n\t\t\t}));\n\t\t},\n\t\t[apply]\n\t);\n\n\tconst onMouseUp = useCallback(() => {\n\t\tisDraggingRef.current = false;\n\t\tsetIsDragging(false);\n\t}, []);\n\n\tconst zoomIn = useCallback(() => {\n\t\tapply(prev => ({\n\t\t\t...prev,\n\t\t\tscale: Math.min(prev.scale * (1 + zoomStep), maxScale),\n\t\t}));\n\t}, [apply, zoomStep, maxScale]);\n\n\tconst zoomOut = useCallback(() => {\n\t\tapply(prev => ({\n\t\t\t...prev,\n\t\t\tscale: Math.max(prev.scale * (1 - zoomStep), minScale),\n\t\t}));\n\t}, [apply, zoomStep, minScale]);\n\n\tconst reset = useCallback(() => {\n\t\tapply(() => initialTransform);\n\t}, [apply, initialTransform]);\n\n\treturn {\n\t\ttransform,\n\t\tisDragging,\n\t\tonMouseDown,\n\t\tonMouseMove,\n\t\tonMouseUp,\n\t\tzoomIn,\n\t\tzoomOut,\n\t\treset,\n\t};\n};\n\nexport type PanZoom = ReturnType<typeof usePanZoom>;\n"],"names":["useState","useRef","useCallback"],"mappings":"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"}