@ctzhian/tiptap 2.1.5 → 2.1.6

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.
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  import "../index.css";
9
9
  var EDITABLE = true;
10
10
  var DEFAULT_CONTENT_TYPE = 'html';
11
- var DEFAULT_HTML_CONTENT = "<p></p>\n<h6 id=\"4b8d8c4e-29dc-4674-928b-b9ded0e363ae\" data-toc-id=\"4b8d8c4e-29dc-4674-928b-b9ded0e363ae\"><span data-name=\"watch\" data-type=\"emoji\">\u231A</span> \u8868\u683C\u64CD\u4F5C</h6>\n<table><tbody><tr class=\"table-row\"><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u94FE\u63A5</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u590D\u6742\u6587\u672C</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u56FE\u7247</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u9644\u4EF6</p></th></tr><tr class=\"table-row\"><td colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><a target=\"_blank\" class=\"MuiBox-root css-1ivg9gg\" type=\"icon\" rel=\"noopener noreferrer\" title=\"\u70B9\u51FB\u6B64\u5904\u8DF3\u8F6C\" href=\"http://localhost:8000/components/editor\">\u70B9\u51FB\u6B64\u5904\u8DF3\u8F6C</a></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><code>\u77E5</code><span style=\"background-color: rgb(255, 204, 188); color: rgb(90, 141, 218);\">\u529B</span><span style=\"color: rgb(90, 141, 218);\">\u4F9B</span><sup>\u5386</sup><sub>\u53F2</sub><u>\u52A8</u><s>\u5927</s><span style=\"background-color: rgb(172, 84, 84);\">\u501F</span><mark>\u7B54</mark></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><img src=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" width=\"100\"></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA.txt\" data-size=\"18.27 KB\"></span></p></td></tr><tr class=\"table-row\"><td colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" controls=\"true\" width=\"75%\"></video></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p><audio src=\"http://vjs.zencdn.net/v/oceans.mp4\" controls=\"true\"></audio></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p></td></tr></tbody></table>\n<p></p>\n<h6 id=\"a025f782-910f-4f17-9d0b-8f31f9cde175\" data-toc-id=\"a025f782-910f-4f17-9d0b-8f31f9cde175\"><span data-name=\"page_facing_up\" data-type=\"emoji\">\uD83D\uDCC4</span> \u6587\u672C\u5904\u7406</h6>\n<p>PandaWiki \u662F\u4E00\u6B3E AI \u5927\u6A21<code>\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D</code>\u5EFA\u7CFB\u7EDF\uFF0CF<strong>AQ \u3001 \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI </strong>\u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u501F<span style=\"color: rgb(90, 141, 218);\">\u52A9\u5927\u6A21\u578B\u7684</span><span style=\"background-color: rgb(255, 204, 188); color: rgb(90, 141, 218);\">\u529B\u91CF\u4E3A\u4F60\u63D0</span><span style=\"color: rgb(90, 141, 218);\">\u4F9B AI \u521B</span>\u4F5C\u80FD\u529B\u3002PandaWiki \u662F<u>\u4E00\u6B3E AI \u5927\u6A21\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D\u5EFA\u7CFB\u7EDF\uFF0C\u5E2E</u>\u52A9\u4F60\u5FEB\u901F\u6784\u5EFA\u667A\u80FD\u5316\u7684 <s><u>\u4EA7\u54C1\u6587\u6863\u3001\u6280\u672F</u></s>\u6587\u6863\u3001FAQ \u3001<s> \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684</s>\u529B\u91CF\u7CFB\u7EDF \uFF0C<span style=\"background-color: rgb(172, 84, 84);\">\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE</span>\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u7684\u529B\u91CF\u4E3A<mark>\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001</mark> AI \u641C\u7D22\u3002</p>\n<a target=\"_blank\" type=\"block\" href=\"http://localhost:8000/components/editor\" title=\"\u770B\u98CE\u666F\">\u770B\u98CE\u666F</a>\n<h6>\uD83D\uDCCE \u9644\u4EF6</h6>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA\uFF1F\u8C01\u662F\u6211\u4EEC\u7684\u670B\u53CB\uFF1F\u8FD9\u4E2A\u95EE\u9898\u662F\u9769\u547D\u7684\u9996\u8981\u95EE\u9898\u3002\u4E2D\u56FD\u8FC7\u53BB\u4E00\u5207\u9769\u547D\u6597\u4E89\u6210.txt\" data-size=\"18.27 KB\"></div>\n<p>\u884C\u5185\u9644\u4EF6\uFF1A<span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"font_4856251_qynqqohzdp.js\" data-size=\"412.34 KB\"></span><span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u96F7\u6C60\u9879\u76EE\u8BBE\u8BA1\u65B9\u6848.docx\" data-size=\"635.74 KB\"></span></p>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"b0f4a3e0-639f-4c09-ab33-ea9417939f87.tiff\" data-size=\"3.03 MB\"></div>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u957F\u4EAD\u79D1\u6280\u516C\u53F8\u4ECB\u7ECDPPT-25.07.007_\u526F\u672C.pptx\" data-size=\"40.18 MB\"></div>\n<h6><span data-name=\"loudspeaker\" data-type=\"emoji\">\uD83D\uDCE2</span> \u97F3\u9891</h6>\n<audio src=\"http://vjs.zencdn.net/v/oceans.mp4\" controls=\"true\"></audio>\n<h6 id=\"1739ed5e-f03c-4c2f-b763-37505601c935\" data-toc-id=\"1739ed5e-f03c-4c2f-b763-37505601c935\"><span data-name=\"video_camera\" data-type=\"emoji\">\uD83D\uDCF9</span> \u89C6\u9891</h6>\n<video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" controls=\"true\" width=\"400\" data-align=\"center\"></video>\n<h6 id=\"746ea233-0e30-44a6-849a-090202217299\" data-toc-id=\"746ea233-0e30-44a6-849a-090202217299\">\u26A0\uFE0F \u8B66\u544A\u5757</h6>\n<div data-id=\"alert_5ysakwbhvqv\" data-variant=\"warning\" data-type=\"icon\" data-node=\"alert\"><p>\u6B64\u65F6\u8FD9\u662F\u4E00\u4E2A\u8B66\u544A\u5757\u3002</p></div>\n<h6 id=\"ebb64062-9efb-4de8-887f-7f8b7f9e54ca\" data-toc-id=\"ebb64062-9efb-4de8-887f-7f8b7f9e54ca\"><span data-name=\"bar_chart\" data-type=\"emoji\">\uD83D\uDCCA</span> \u6D41\u7A0B\u56FE\u64CD\u4F5C</h6>\n<div data-type=\"flow\" data-code=\"mindmap\n root((mindmap))\n Origins\n Long history\n ::icon(fa fa-book)\n Popularisation\n British popular psychology author Tony Buzan\n Research\n On effectiveness&lt;br/&gt;and features\n On Automatic creation\n Uses\n Creative techniques\n Strategic planning\n Argument mapping\n Tools\n Pen and paper\n Mermaid\" data-width=\"246px\"></div>\n";
11
+ var DEFAULT_HTML_CONTENT = "<p></p>\n<p><img src=\"https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg\" width=\"100\"></p>\n<p><img src=\"https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg\" width=\"100\"></p>\n<h6 id=\"4b8d8c4e-29dc-4674-928b-b9ded0e363ae\" data-toc-id=\"4b8d8c4e-29dc-4674-928b-b9ded0e363ae\"><span data-name=\"watch\" data-type=\"emoji\">\u231A</span> \u8868\u683C\u64CD\u4F5C</h6>\n<table><tbody><tr class=\"table-row\"><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u94FE\u63A5</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u590D\u6742\u6587\u672C</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u56FE\u7247</p></th><th class=\"table-header\" colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p>\u9644\u4EF6</p></th></tr><tr class=\"table-row\"><td colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><a target=\"_blank\" class=\"MuiBox-root css-1ivg9gg\" type=\"icon\" rel=\"noopener noreferrer\" title=\"\u70B9\u51FB\u6B64\u5904\u8DF3\u8F6C\" href=\"http://localhost:8000/components/editor\">\u70B9\u51FB\u6B64\u5904\u8DF3\u8F6C</a></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><code>\u77E5</code><span style=\"background-color: rgb(255, 204, 188); color: rgb(90, 141, 218);\">\u529B</span><span style=\"color: rgb(90, 141, 218);\">\u4F9B</span><sup>\u5386</sup><sub>\u53F2</sub><u>\u52A8</u><s>\u5927</s><span style=\"background-color: rgb(172, 84, 84);\">\u501F</span><mark>\u7B54</mark></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><img src=\"https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg\" width=\"100\"></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" data-vertical-align=\"middle\" style=\"text-align: center; vertical-align: middle;\"><p><span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA.txt\" data-size=\"18.27 KB\"></span></p></td></tr><tr class=\"table-row\"><td colspan=\"1\" rowspan=\"1\" colwidth=\"361\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" controls=\"true\" width=\"75%\"></video></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p><audio src=\"http://vjs.zencdn.net/v/oceans.mp4\" controls=\"true\"></audio></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p></td><td colspan=\"1\" rowspan=\"1\" data-background-color=\"\" data-text-align=\"center\" style=\"text-align: center;\"><p></p></td></tr></tbody></table>\n<p><img src=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" width=\"100\"></p>\n<h6 id=\"a025f782-910f-4f17-9d0b-8f31f9cde175\" data-toc-id=\"a025f782-910f-4f17-9d0b-8f31f9cde175\"><span data-name=\"page_facing_up\" data-type=\"emoji\">\uD83D\uDCC4</span> \u6587\u672C\u5904\u7406</h6>\n<p>PandaWiki \u662F\u4E00\u6B3E AI \u5927\u6A21<code>\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D</code>\u5EFA\u7CFB\u7EDF\uFF0CF<strong>AQ \u3001 \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI </strong>\u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u501F<span style=\"color: rgb(90, 141, 218);\">\u52A9\u5927\u6A21\u578B\u7684</span><span style=\"background-color: rgb(255, 204, 188); color: rgb(90, 141, 218);\">\u529B\u91CF\u4E3A\u4F60\u63D0</span><span style=\"color: rgb(90, 141, 218);\">\u4F9B AI \u521B</span>\u4F5C\u80FD\u529B\u3002PandaWiki \u662F<u>\u4E00\u6B3E AI \u5927\u6A21\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D\u5EFA\u7CFB\u7EDF\uFF0C\u5E2E</u>\u52A9\u4F60\u5FEB\u901F\u6784\u5EFA\u667A\u80FD\u5316\u7684 <s><u>\u4EA7\u54C1\u6587\u6863\u3001\u6280\u672F</u></s>\u6587\u6863\u3001FAQ \u3001<s> \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684</s>\u529B\u91CF\u7CFB\u7EDF \uFF0C<span style=\"background-color: rgb(172, 84, 84);\">\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE</span>\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u7684\u529B\u91CF\u4E3A<mark>\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001</mark> AI \u641C\u7D22\u3002</p>\n<a target=\"_blank\" type=\"block\" href=\"http://localhost:8000/components/editor\" title=\"\u770B\u98CE\u666F\">\u770B\u98CE\u666F</a>\n<h6>\uD83D\uDCCE \u9644\u4EF6</h6>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA\uFF1F\u8C01\u662F\u6211\u4EEC\u7684\u670B\u53CB\uFF1F\u8FD9\u4E2A\u95EE\u9898\u662F\u9769\u547D\u7684\u9996\u8981\u95EE\u9898\u3002\u4E2D\u56FD\u8FC7\u53BB\u4E00\u5207\u9769\u547D\u6597\u4E89\u6210.txt\" data-size=\"18.27 KB\"></div>\n<p>\u884C\u5185\u9644\u4EF6\uFF1A<span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"font_4856251_qynqqohzdp.js\" data-size=\"412.34 KB\"></span><span data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u96F7\u6C60\u9879\u76EE\u8BBE\u8BA1\u65B9\u6848.docx\" data-size=\"635.74 KB\"></span></p>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"b0f4a3e0-639f-4c09-ab33-ea9417939f87.tiff\" data-size=\"3.03 MB\"></div>\n<div data-tag=\"attachment\" url=\"\" title=\"\" size=\"0\" data-url=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" data-title=\"\u957F\u4EAD\u79D1\u6280\u516C\u53F8\u4ECB\u7ECDPPT-25.07.007_\u526F\u672C.pptx\" data-size=\"40.18 MB\"></div>\n<h6><span data-name=\"loudspeaker\" data-type=\"emoji\">\uD83D\uDCE2</span> \u97F3\u9891</h6>\n<audio src=\"http://vjs.zencdn.net/v/oceans.mp4\" controls=\"true\"></audio>\n<h6 id=\"1739ed5e-f03c-4c2f-b763-37505601c935\" data-toc-id=\"1739ed5e-f03c-4c2f-b763-37505601c935\"><span data-name=\"video_camera\" data-type=\"emoji\">\uD83D\uDCF9</span> \u89C6\u9891</h6>\n<video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" controls=\"true\" width=\"400\" data-align=\"center\"></video>\n<h6 id=\"746ea233-0e30-44a6-849a-090202217299\" data-toc-id=\"746ea233-0e30-44a6-849a-090202217299\">\u26A0\uFE0F \u8B66\u544A\u5757</h6>\n<div data-id=\"alert_5ysakwbhvqv\" data-variant=\"warning\" data-type=\"icon\" data-node=\"alert\"><p>\u6B64\u65F6\u8FD9\u662F\u4E00\u4E2A\u8B66\u544A\u5757\u3002</p></div>\n<h6 id=\"ebb64062-9efb-4de8-887f-7f8b7f9e54ca\" data-toc-id=\"ebb64062-9efb-4de8-887f-7f8b7f9e54ca\"><span data-name=\"bar_chart\" data-type=\"emoji\">\uD83D\uDCCA</span> \u6D41\u7A0B\u56FE\u64CD\u4F5C</h6>\n<div data-type=\"flow\" data-code=\"mindmap\n root((mindmap))\n Origins\n Long history\n ::icon(fa fa-book)\n Popularisation\n British popular psychology author Tony Buzan\n Research\n On effectiveness&lt;br/&gt;and features\n On Automatic creation\n Uses\n Creative techniques\n Strategic planning\n Argument mapping\n Tools\n Pen and paper\n Mermaid\" data-width=\"246px\"></div>\n";
12
12
  var DEFAULT_MARKDOWN_CONTENT = "###### :page_facing_up: \u6587\u672C\u5904\u7406\n\nPandaWiki \u662F\u4E00\u6B3E AI \u5927\u6A21`\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D`\u5EFA\u7CFB\u7EDF\uFF0CF**AQ \u3001 \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI **\u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI \u521B\u4F5C\u80FD\u529B\u3002PandaWiki \u662F++\u4E00\u6B3E AI \u5927\u6A21\u578B\u9A71\u52A8\u7684\u5F00\u6E90\u77E5\u8BC6\u5E93\u642D\u5EFA\u7CFB\u7EDF\uFF0C\u5E2E++\u52A9\u4F60\u5FEB\u901F\u6784\u5EFA\u667A\u80FD\u5316\u7684 ++~~\u4EA7\u54C1\u6587\u6863\u3001\u6280\u672F~~++\u6587\u6863\u3001FAQ \u3001~~ \u535A\u5BA2\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684~~\u529B\u91CF\u7CFB\u7EDF \uFF0C\u501F\u52A9\u5927\u6A21\u578B\u7684\u529B\u91CF\u4E3A\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001 AI \u641C\u7D22 \u7B49\u80FD\u529B\u3002\u7684\u529B\u91CF\u4E3A==\u4F60\u63D0\u4F9B AI \u521B\u4F5C \u3001 AI \u95EE\u7B54 \u3001== AI \u641C\u7D22\u3002\n\n###### :video_camera: \u89C6\u9891\n\n<video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" width=\"400\" controls ></video>\n\n###### \u26A0\uFE0F \u8B66\u544A\u5757\n\n:::alert {#alert_5ysakwbhvqv indent=\"0\" variant=\"warning\" type=\"icon\"}\n\n\u6B64\u65F6\u8FD9\u662F\u4E00\u4E2A\u8B66\u544A\u5757\u3002\n\n:::\n\n###### :bar_chart: \u6D41\u7A0B\u56FE\u64CD\u4F5C\n\n```mermaid\nmindmap\n root((mindmap))\n Origins\n Long history\n ::icon(fa fa-book)\n Popularisation\n British popular psychology author Tony Buzan\n Research\n On effectiveness<br/>and features\n On Automatic creation\n Uses\n Creative techniques\n Strategic planning\n Argument mapping\n Tools\n Pen and paper\n Mermaid\n```\n\n###### :watch: \u8868\u683C\u64CD\u4F5C\n\n\n| \u94FE\u63A5 | \u590D\u6742\u6587\u672C | \u56FE\u7247 | \u9644\u4EF6 |\n| ------------------------------------------------------------------------------------------- | --------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| [\u70B9\u51FB\u6B64\u5904\u8DF3\u8F6C](http://localhost:8000/components/editor) | `\u77E5`\u529B\u4F9B^\u5386^~\u53F2~++\u52A8++~~\u5927~~\u501F==\u7B54== | ![](https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg) | <a href=\"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg\" target=\"_blank\" download=\"\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA.txt\">\u8C01\u662F\u6211\u4EEC\u7684\u654C\u4EBA.txt</a> |\n| <video src=\"https://media.w3.org/2010/05/sintel/trailer.mp4\" width=\"75%\" controls ></video> | \x1F | | |\n\n\n";
13
13
  var Reader = function Reader() {
14
14
  // @ts-ignore
@@ -1,3 +1,5 @@
1
1
  import React from 'react';
2
2
  import { ImageViewerItemProps } from './types';
3
- export declare const ImageViewerItem: React.FC<ImageViewerItemProps>;
3
+ export declare const ImageViewerItem: React.FC<ImageViewerItemProps & {
4
+ onImageClick?: (src: string) => void;
5
+ }>;
@@ -1,20 +1,43 @@
1
- import React from 'react';
2
- import { PhotoView } from 'react-photo-view';
1
+ import React, { useContext } from 'react';
2
+ import { ImageViewerContext } from "./context";
3
3
  export var ImageViewerItem = function ImageViewerItem(_ref) {
4
4
  var src = _ref.src,
5
5
  children = _ref.children,
6
- render = _ref.render,
7
- overlay = _ref.overlay,
8
- width = _ref.width,
9
- height = _ref.height,
10
6
  _ref$triggers = _ref.triggers,
11
- triggers = _ref$triggers === void 0 ? ['onClick'] : _ref$triggers;
12
- return /*#__PURE__*/React.createElement(PhotoView, {
13
- src: src,
14
- render: render,
15
- overlay: overlay,
16
- width: width,
17
- height: height,
18
- triggers: triggers
19
- }, children);
7
+ triggers = _ref$triggers === void 0 ? ['onClick'] : _ref$triggers,
8
+ onImageClick = _ref.onImageClick;
9
+ var context = useContext(ImageViewerContext);
10
+ var handleClick = function handleClick(e) {
11
+ // 如果在拖拽,不处理
12
+ if (e.defaultPrevented) {
13
+ return;
14
+ }
15
+ if (triggers.includes('onClick')) {
16
+ var clickHandler = onImageClick || context.onImageClick;
17
+ if (clickHandler) {
18
+ e.stopPropagation();
19
+ clickHandler(src);
20
+ }
21
+ }
22
+ };
23
+
24
+ // 直接克隆 children 并添加点击事件
25
+ if ( /*#__PURE__*/React.isValidElement(children)) {
26
+ var originalProps = children.props;
27
+ return /*#__PURE__*/React.cloneElement(children, {
28
+ onClick: function onClick(e) {
29
+ // 先调用原来的 onClick
30
+ if (originalProps.onClick) {
31
+ originalProps.onClick(e);
32
+ }
33
+ // 再调用我们的处理
34
+ if (!e.defaultPrevented) {
35
+ handleClick(e);
36
+ }
37
+ },
38
+ 'data-image-viewer-item': true,
39
+ 'data-src': src
40
+ });
41
+ }
42
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
20
43
  };
@@ -4,10 +4,9 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
4
4
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
5
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
- import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';
8
- import { PhotoProvider } from 'react-photo-view';
7
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
8
+ import { PhotoSlider } from 'react-photo-view';
9
9
  import { ImageViewerContext } from "./context";
10
- import { ImageViewerItem } from "./Item";
11
10
  import { customStyles } from "./styles";
12
11
  import { CustomToolbar } from "./Toolbar";
13
12
  export var ImageViewerProvider = function ImageViewerProvider(_ref) {
@@ -16,7 +15,7 @@ export var ImageViewerProvider = function ImageViewerProvider(_ref) {
16
15
  speed = _ref$speed === void 0 ? 500 : _ref$speed,
17
16
  _ref$maskOpacity = _ref.maskOpacity,
18
17
  maskOpacity = _ref$maskOpacity === void 0 ? 0.3 : _ref$maskOpacity,
19
- _onVisibleChange = _ref.onVisibleChange,
18
+ onVisibleChange = _ref.onVisibleChange,
20
19
  _onIndexChange = _ref.onIndexChange,
21
20
  _ref$loop = _ref.loop,
22
21
  loop = _ref$loop === void 0 ? 3 : _ref$loop,
@@ -40,41 +39,24 @@ export var ImageViewerProvider = function ImageViewerProvider(_ref) {
40
39
  _useState4 = _slicedToArray(_useState3, 2),
41
40
  visible = _useState4[0],
42
41
  setVisible = _useState4[1];
43
- var _useState5 = useState(1),
42
+ var _useState5 = useState(0),
44
43
  _useState6 = _slicedToArray(_useState5, 2),
45
- scale = _useState6[0],
46
- setScale = _useState6[1];
44
+ viewIndex = _useState6[0],
45
+ setViewIndex = _useState6[1];
47
46
  var _useState7 = useState(0),
48
47
  _useState8 = _slicedToArray(_useState7, 2),
49
- rotate = _useState8[0],
50
- setRotate = _useState8[1];
51
- var _useState9 = useState(null),
52
- _useState10 = _slicedToArray(_useState9, 2),
53
- onScale = _useState10[0],
54
- setOnScale = _useState10[1];
55
- var _useState11 = useState(null),
56
- _useState12 = _slicedToArray(_useState11, 2),
57
- onRotate = _useState12[0],
58
- setOnRotate = _useState12[1];
59
- var _useState13 = useState(null),
60
- _useState14 = _slicedToArray(_useState13, 2),
61
- onClose = _useState14[0],
62
- setOnClose = _useState14[1];
63
- var imageSrcsRef = useRef([]);
48
+ totalImages = _useState8[0],
49
+ setTotalImages = _useState8[1];
50
+ var containerRef = useRef(null);
64
51
  var overlayStateRef = useRef({
65
52
  scale: 1,
66
53
  rotate: 0,
67
- visible: false,
68
- onScale: null,
69
- onRotate: null,
70
- onClose: null,
71
- index: undefined
72
- });
73
- var callbacksRef = useRef({
74
54
  onScale: null,
75
55
  onRotate: null,
76
56
  onClose: null
77
57
  });
58
+
59
+ // 注入自定义样式
78
60
  useEffect(function () {
79
61
  if (typeof document !== 'undefined' && !document.getElementById('image-viewer-custom-styles')) {
80
62
  var styleElement = document.createElement('style');
@@ -83,69 +65,115 @@ export var ImageViewerProvider = function ImageViewerProvider(_ref) {
83
65
  document.head.appendChild(styleElement);
84
66
  }
85
67
  }, []);
86
- useLayoutEffect(function () {
87
- var state = overlayStateRef.current;
88
- setScale(state.scale);
89
- setRotate(state.rotate);
90
- setVisible(state.visible);
91
- callbacksRef.current.onScale = state.onScale;
92
- callbacksRef.current.onRotate = state.onRotate;
93
- callbacksRef.current.onClose = state.onClose;
94
- setOnScale(function () {
95
- return state.onScale;
96
- });
97
- setOnRotate(function () {
98
- return state.onRotate;
99
- });
100
- setOnClose(function () {
101
- return state.onClose;
102
- });
103
- if (state.visible && state.index !== undefined) {
104
- var src = imageSrcsRef.current[state.index];
68
+
69
+ // DOM 中动态收集所有图片数据(按照 DOM 顺序)
70
+ var collectImagesFromDOM = useCallback(function () {
71
+ if (!containerRef.current) return [];
72
+ var items = containerRef.current.querySelectorAll('[data-image-viewer-item]');
73
+ var result = [];
74
+ items.forEach(function (item) {
75
+ var src = item.getAttribute('data-src');
105
76
  if (src) {
106
- setCurrentSrc(src);
107
- }
108
- }
109
- });
110
- useEffect(function () {
111
- var srcs = [];
112
- React.Children.forEach(children, function (child) {
113
- if ( /*#__PURE__*/React.isValidElement(child) && child.type === ImageViewerItem) {
114
- var src = child.props.src;
115
- if (src) {
116
- srcs.push(src);
117
- }
77
+ result.push({
78
+ src: src,
79
+ key: src
80
+ });
118
81
  }
119
82
  });
120
- imageSrcsRef.current = srcs;
121
- }, [children]);
122
- var contextValue = {
123
- setCurrentSrc: setCurrentSrc,
124
- visible: visible,
125
- setVisible: setVisible,
126
- scale: scale,
127
- setScale: setScale,
128
- rotate: rotate,
129
- setRotate: setRotate,
130
- getScale: function getScale() {
131
- return overlayStateRef.current.scale;
132
- },
133
- getRotate: function getRotate() {
134
- return overlayStateRef.current.rotate;
135
- },
136
- onScale: callbacksRef.current.onScale,
137
- setOnScale: setOnScale,
138
- onRotate: callbacksRef.current.onRotate,
139
- setOnRotate: setOnRotate,
140
- onClose: callbacksRef.current.onClose,
141
- setOnClose: setOnClose
142
- };
83
+ return result;
84
+ }, []);
85
+
86
+ // 处理图片点击
87
+ var handleImageClick = useCallback(function (src) {
88
+ // 每次点击时动态从 DOM 收集图片列表
89
+ var images = collectImagesFromDOM();
90
+ var index = images.findIndex(function (img) {
91
+ return img.src === src;
92
+ });
93
+ if (index !== -1) {
94
+ setViewIndex(index);
95
+ setCurrentSrc(src);
96
+ setTotalImages(images.length);
97
+ setVisible(true);
98
+ onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(true, index);
99
+ }
100
+ }, [collectImagesFromDOM, onVisibleChange]);
101
+
102
+ // 上一张
103
+ var handlePrevImage = useCallback(function () {
104
+ var images = collectImagesFromDOM();
105
+ if (images.length === 0) return;
106
+ var newIndex = viewIndex > 0 ? viewIndex - 1 : images.length - 1;
107
+ setViewIndex(newIndex);
108
+ setCurrentSrc(images[newIndex].src);
109
+ _onIndexChange === null || _onIndexChange === void 0 || _onIndexChange(newIndex);
110
+ }, [viewIndex, collectImagesFromDOM, _onIndexChange]);
111
+
112
+ // 下一张
113
+ var handleNextImage = useCallback(function () {
114
+ var images = collectImagesFromDOM();
115
+ if (images.length === 0) return;
116
+ var newIndex = viewIndex < images.length - 1 ? viewIndex + 1 : 0;
117
+ setViewIndex(newIndex);
118
+ setCurrentSrc(images[newIndex].src);
119
+ _onIndexChange === null || _onIndexChange === void 0 || _onIndexChange(newIndex);
120
+ }, [viewIndex, collectImagesFromDOM, _onIndexChange]);
121
+ var contextValue = React.useMemo(function () {
122
+ return {
123
+ currentSrc: currentSrc,
124
+ visible: visible,
125
+ currentIndex: viewIndex,
126
+ totalImages: totalImages,
127
+ getScale: function getScale() {
128
+ return overlayStateRef.current.scale;
129
+ },
130
+ getRotate: function getRotate() {
131
+ return overlayStateRef.current.rotate;
132
+ },
133
+ getOnScale: function getOnScale() {
134
+ return overlayStateRef.current.onScale;
135
+ },
136
+ getOnRotate: function getOnRotate() {
137
+ return overlayStateRef.current.onRotate;
138
+ },
139
+ getOnClose: function getOnClose() {
140
+ return overlayStateRef.current.onClose;
141
+ },
142
+ onImageClick: handleImageClick,
143
+ onPrevImage: handlePrevImage,
144
+ onNextImage: handleNextImage
145
+ };
146
+ }, [currentSrc, visible, viewIndex, totalImages, handleImageClick, handlePrevImage, handleNextImage]);
143
147
  var handleSpeed = typeof speed === 'function' ? speed : function () {
144
- return typeof speed === 'number' ? speed : 500;
148
+ return speed;
145
149
  };
150
+
151
+ // 当需要显示时,动态获取图片列表
152
+ var displayImages = React.useMemo(function () {
153
+ if (visible) {
154
+ return collectImagesFromDOM();
155
+ }
156
+ return [];
157
+ }, [visible, collectImagesFromDOM]);
146
158
  return /*#__PURE__*/React.createElement(ImageViewerContext.Provider, {
147
159
  value: contextValue
148
- }, /*#__PURE__*/React.createElement(PhotoProvider, {
160
+ }, /*#__PURE__*/React.createElement("div", {
161
+ ref: containerRef
162
+ }, children), /*#__PURE__*/React.createElement(PhotoSlider, {
163
+ images: displayImages,
164
+ visible: visible,
165
+ index: viewIndex,
166
+ onClose: function onClose() {
167
+ setVisible(false);
168
+ onVisibleChange === null || onVisibleChange === void 0 || onVisibleChange(false, viewIndex);
169
+ },
170
+ onIndexChange: function onIndexChange(index) {
171
+ var _displayImages$index;
172
+ setViewIndex(index);
173
+ var src = (_displayImages$index = displayImages[index]) === null || _displayImages$index === void 0 ? void 0 : _displayImages$index.src;
174
+ if (src) setCurrentSrc(src);
175
+ _onIndexChange === null || _onIndexChange === void 0 || _onIndexChange(index);
176
+ },
149
177
  bannerVisible: false,
150
178
  speed: handleSpeed,
151
179
  maskOpacity: maskOpacity,
@@ -161,44 +189,19 @@ export var ImageViewerProvider = function ImageViewerProvider(_ref) {
161
189
  brokenElement: brokenElement,
162
190
  portalContainer: portalContainer,
163
191
  overlayRender: function overlayRender(_ref2) {
164
- var overlayOnScale = _ref2.onScale,
165
- overlayScale = _ref2.scale,
166
- overlayRotate = _ref2.rotate,
167
- overlayOnRotate = _ref2.onRotate,
168
- overlayOnClose = _ref2.onClose,
169
- index = _ref2.index,
170
- overlayVisible = _ref2.visible;
192
+ var onScale = _ref2.onScale,
193
+ scale = _ref2.scale,
194
+ rotate = _ref2.rotate,
195
+ onRotate = _ref2.onRotate,
196
+ onClose = _ref2.onClose;
171
197
  overlayStateRef.current = {
172
- scale: overlayScale,
173
- rotate: overlayRotate,
174
- visible: overlayVisible,
175
- onScale: overlayOnScale,
176
- onRotate: overlayOnRotate,
177
- onClose: overlayOnClose,
178
- index: index
198
+ scale: scale,
199
+ rotate: rotate,
200
+ onScale: onScale,
201
+ onRotate: onRotate,
202
+ onClose: onClose
179
203
  };
180
204
  return null;
181
- },
182
- onVisibleChange: function onVisibleChange(visible, index) {
183
- setVisible(visible);
184
- if (visible && index !== undefined) {
185
- var src = imageSrcsRef.current[index];
186
- if (src) {
187
- setCurrentSrc(src);
188
- }
189
- }
190
- _onVisibleChange === null || _onVisibleChange === void 0 || _onVisibleChange(visible, index);
191
- },
192
- onIndexChange: function onIndexChange(index) {
193
- if (index !== undefined) {
194
- var src = imageSrcsRef.current[index];
195
- if (src) {
196
- setCurrentSrc(src);
197
- }
198
- }
199
- _onIndexChange === null || _onIndexChange === void 0 || _onIndexChange(index);
200
205
  }
201
- }, children), /*#__PURE__*/React.createElement(CustomToolbar, {
202
- currentSrc: currentSrc
203
- }));
206
+ }), /*#__PURE__*/React.createElement(CustomToolbar, null));
204
207
  };
@@ -1,6 +1,2 @@
1
1
  import React from 'react';
2
- interface CustomToolbarProps {
3
- currentSrc?: string;
4
- }
5
- export declare const CustomToolbar: React.FC<CustomToolbarProps>;
6
- export {};
2
+ export declare const CustomToolbar: React.FC;
@@ -7,19 +7,57 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
7
  import { Box, IconButton, Stack, Tooltip } from '@mui/material';
8
8
  import React, { useCallback, useContext, useEffect, useState } from 'react';
9
9
  import { createPortal } from 'react-dom';
10
- import { AnticlockwiseLineIcon, ClockwiseLineIcon, CloseCircleFillIcon, Download2LineIcon, FullscreenExitLineIcon, FullscreenLineIcon, ResetLeftFillIcon } from "../Icons";
10
+ import { AnticlockwiseLineIcon, ClockwiseLineIcon, CloseCircleFillIcon, Download2LineIcon, FullscreenExitLineIcon, FullscreenLineIcon, ResetLeftFillIcon, SkipLeftIcon, SkipRightIcon } from "../Icons";
11
11
  import { ImageViewerContext } from "./context";
12
- export var CustomToolbar = function CustomToolbar(_ref) {
13
- var currentSrc = _ref.currentSrc;
12
+ var iconButtonSx = {
13
+ color: 'white',
14
+ '&:hover': {
15
+ backgroundColor: 'rgba(255, 255, 255, 0.1)'
16
+ }
17
+ };
18
+ var Divider = function Divider() {
19
+ return /*#__PURE__*/React.createElement(Box, {
20
+ sx: {
21
+ width: '1px',
22
+ height: '24px',
23
+ backgroundColor: 'rgba(255, 255, 255, 0.3)',
24
+ mx: 0.5
25
+ }
26
+ });
27
+ };
28
+ var ZoomInIcon = function ZoomInIcon() {
29
+ return /*#__PURE__*/React.createElement("svg", {
30
+ width: "20",
31
+ height: "20",
32
+ viewBox: "0 0 768 768",
33
+ fill: "currentColor"
34
+ }, /*#__PURE__*/React.createElement("path", {
35
+ d: "M384 640.5q105 0 180.75-75.75t75.75-180.75-75.75-180.75-180.75-75.75-180.75 75.75-75.75 180.75 75.75 180.75 180.75 75.75zM384 64.5q132 0 225.75 93.75t93.75 225.75-93.75 225.75-225.75 93.75-225.75-93.75-93.75-225.75 93.75-225.75 225.75-93.75zM415.5 223.5v129h129v63h-129v129h-63v-129h-129v-63h129v-129h63z"
36
+ }));
37
+ };
38
+ var ZoomOutIcon = function ZoomOutIcon() {
39
+ return /*#__PURE__*/React.createElement("svg", {
40
+ width: "20",
41
+ height: "20",
42
+ viewBox: "0 0 768 768",
43
+ fill: "currentColor"
44
+ }, /*#__PURE__*/React.createElement("path", {
45
+ d: "M384 640.5q105 0 180.75-75.75t75.75-180.75-75.75-180.75-180.75-75.75-180.75 75.75-75.75 180.75 75.75 180.75 180.75 75.75zM384 64.5q132 0 225.75 93.75t93.75 225.75-93.75 225.75-225.75 93.75-225.75-93.75-93.75-225.75 93.75-225.75 225.75-93.75zM223.5 352.5h321v63h-321v-63z"
46
+ }));
47
+ };
48
+ export var CustomToolbar = function CustomToolbar() {
14
49
  var _useContext = useContext(ImageViewerContext),
15
50
  visible = _useContext.visible,
16
- scale = _useContext.scale,
17
- rotate = _useContext.rotate,
51
+ currentSrc = _useContext.currentSrc,
52
+ currentIndex = _useContext.currentIndex,
53
+ totalImages = _useContext.totalImages,
18
54
  getScale = _useContext.getScale,
19
55
  getRotate = _useContext.getRotate,
20
- onScale = _useContext.onScale,
21
- onRotate = _useContext.onRotate,
22
- onClose = _useContext.onClose;
56
+ getOnScale = _useContext.getOnScale,
57
+ getOnRotate = _useContext.getOnRotate,
58
+ getOnClose = _useContext.getOnClose,
59
+ onPrevImage = _useContext.onPrevImage,
60
+ onNextImage = _useContext.onNextImage;
23
61
  var _useState = useState(false),
24
62
  _useState2 = _slicedToArray(_useState, 2),
25
63
  isFullscreen = _useState2[0],
@@ -52,13 +90,31 @@ export var CustomToolbar = function CustomToolbar(_ref) {
52
90
  (_document$exitFullscr = (_document = document).exitFullscreen) === null || _document$exitFullscr === void 0 || _document$exitFullscr.call(_document);
53
91
  }
54
92
  }, []);
93
+ var handleZoom = useCallback(function (delta) {
94
+ var onScaleFn = getOnScale();
95
+ if (onScaleFn) {
96
+ var currentScale = getScale();
97
+ var newScale = Math.max(0.5, Math.min(5, currentScale + delta));
98
+ onScaleFn(newScale);
99
+ }
100
+ }, [getOnScale, getScale]);
101
+ var handleRotate = useCallback(function (delta) {
102
+ var onRotateFn = getOnRotate();
103
+ if (onRotateFn) {
104
+ var currentRotate = getRotate();
105
+ onRotateFn(currentRotate + delta);
106
+ }
107
+ }, [getOnRotate, getRotate]);
55
108
  var handleReset = useCallback(function () {
56
- if (onScale) onScale(1);
57
- if (onRotate) onRotate(0);
58
- }, [onScale, onRotate]);
59
- if (!visible) {
60
- return null;
61
- }
109
+ var _getOnScale, _getOnRotate;
110
+ (_getOnScale = getOnScale()) === null || _getOnScale === void 0 || _getOnScale(1);
111
+ (_getOnRotate = getOnRotate()) === null || _getOnRotate === void 0 || _getOnRotate(0);
112
+ }, [getOnScale, getOnRotate]);
113
+ var handleClose = useCallback(function () {
114
+ var _getOnClose;
115
+ (_getOnClose = getOnClose()) === null || _getOnClose === void 0 || _getOnClose();
116
+ }, [getOnClose]);
117
+ if (!visible) return null;
62
118
  var toolbarContent = /*#__PURE__*/React.createElement(Box, {
63
119
  className: "PhotoView-Slider__toolbar-custom",
64
120
  sx: {
@@ -87,76 +143,55 @@ export var CustomToolbar = function CustomToolbar(_ref) {
87
143
  backdropFilter: 'blur(10px)'
88
144
  }
89
145
  }, /*#__PURE__*/React.createElement(Tooltip, {
146
+ title: "\u4E0A\u4E00\u5F20",
147
+ placement: "top"
148
+ }, /*#__PURE__*/React.createElement(IconButton, {
149
+ onClick: onPrevImage,
150
+ sx: iconButtonSx,
151
+ size: "small",
152
+ disabled: totalImages <= 1
153
+ }, /*#__PURE__*/React.createElement(SkipLeftIcon, {
154
+ sx: {
155
+ fontSize: '20px'
156
+ }
157
+ }))), /*#__PURE__*/React.createElement(Tooltip, {
158
+ title: "\u4E0B\u4E00\u5F20",
159
+ placement: "top"
160
+ }, /*#__PURE__*/React.createElement(IconButton, {
161
+ onClick: onNextImage,
162
+ sx: iconButtonSx,
163
+ size: "small",
164
+ disabled: totalImages <= 1
165
+ }, /*#__PURE__*/React.createElement(SkipRightIcon, {
166
+ sx: {
167
+ fontSize: '20px'
168
+ }
169
+ }))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
90
170
  title: "\u653E\u5927",
91
171
  placement: "top"
92
172
  }, /*#__PURE__*/React.createElement(IconButton, {
93
173
  onClick: function onClick() {
94
- if (onScale) {
95
- var currentScale = getScale();
96
- onScale(Math.min(currentScale + 0.5, 5));
97
- }
98
- },
99
- sx: {
100
- color: 'white',
101
- '&:hover': {
102
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
103
- }
174
+ return handleZoom(0.5);
104
175
  },
176
+ sx: iconButtonSx,
105
177
  size: "small"
106
- }, /*#__PURE__*/React.createElement("svg", {
107
- width: "20",
108
- height: "20",
109
- viewBox: "0 0 768 768",
110
- fill: "currentColor"
111
- }, /*#__PURE__*/React.createElement("path", {
112
- d: "M384 640.5q105 0 180.75-75.75t75.75-180.75-75.75-180.75-180.75-75.75-180.75 75.75-75.75 180.75 75.75 180.75 180.75 75.75zM384 64.5q132 0 225.75 93.75t93.75 225.75-93.75 225.75-225.75 93.75-225.75-93.75-93.75-225.75 93.75-225.75 225.75-93.75zM415.5 223.5v129h129v63h-129v129h-63v-129h-129v-63h129v-129h63z"
113
- })))), /*#__PURE__*/React.createElement(Tooltip, {
178
+ }, /*#__PURE__*/React.createElement(ZoomInIcon, null))), /*#__PURE__*/React.createElement(Tooltip, {
114
179
  title: "\u7F29\u5C0F",
115
180
  placement: "top"
116
181
  }, /*#__PURE__*/React.createElement(IconButton, {
117
182
  onClick: function onClick() {
118
- if (onScale) {
119
- var currentScale = getScale();
120
- onScale(Math.max(currentScale - 0.5, 0.5));
121
- }
122
- },
123
- sx: {
124
- color: 'white',
125
- '&:hover': {
126
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
127
- }
183
+ return handleZoom(-0.5);
128
184
  },
185
+ sx: iconButtonSx,
129
186
  size: "small"
130
- }, /*#__PURE__*/React.createElement("svg", {
131
- width: "20",
132
- height: "20",
133
- viewBox: "0 0 768 768",
134
- fill: "currentColor"
135
- }, /*#__PURE__*/React.createElement("path", {
136
- d: "M384 640.5q105 0 180.75-75.75t75.75-180.75-75.75-180.75-180.75-75.75-180.75 75.75-75.75 180.75 75.75 180.75 180.75 75.75zM384 64.5q132 0 225.75 93.75t93.75 225.75-93.75 225.75-225.75 93.75-225.75-93.75-93.75-225.75 93.75-225.75 225.75-93.75zM223.5 352.5h321v63h-321v-63z"
137
- })))), /*#__PURE__*/React.createElement(Box, {
138
- sx: {
139
- width: '1px',
140
- height: '24px',
141
- backgroundColor: 'rgba(255, 255, 255, 0.3)',
142
- mx: 0.5
143
- }
144
- }), /*#__PURE__*/React.createElement(Tooltip, {
187
+ }, /*#__PURE__*/React.createElement(ZoomOutIcon, null))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
145
188
  title: "\u9006\u65F6\u9488\u65CB\u8F6C",
146
189
  placement: "top"
147
190
  }, /*#__PURE__*/React.createElement(IconButton, {
148
191
  onClick: function onClick() {
149
- if (onRotate) {
150
- var currentRotate = getRotate();
151
- onRotate(currentRotate - 90);
152
- }
153
- },
154
- sx: {
155
- color: 'white',
156
- '&:hover': {
157
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
158
- }
192
+ return handleRotate(-90);
159
193
  },
194
+ sx: iconButtonSx,
160
195
  size: "small"
161
196
  }, /*#__PURE__*/React.createElement(AnticlockwiseLineIcon, {
162
197
  sx: {
@@ -167,86 +202,42 @@ export var CustomToolbar = function CustomToolbar(_ref) {
167
202
  placement: "top"
168
203
  }, /*#__PURE__*/React.createElement(IconButton, {
169
204
  onClick: function onClick() {
170
- if (onRotate) {
171
- var currentRotate = getRotate();
172
- onRotate(currentRotate + 90);
173
- }
174
- },
175
- sx: {
176
- color: 'white',
177
- '&:hover': {
178
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
179
- }
205
+ return handleRotate(90);
180
206
  },
207
+ sx: iconButtonSx,
181
208
  size: "small"
182
209
  }, /*#__PURE__*/React.createElement(ClockwiseLineIcon, {
183
210
  sx: {
184
211
  fontSize: '20px'
185
212
  }
186
- }))), /*#__PURE__*/React.createElement(Box, {
187
- sx: {
188
- width: '1px',
189
- height: '24px',
190
- backgroundColor: 'rgba(255, 255, 255, 0.3)',
191
- mx: 0.5
192
- }
193
- }), /*#__PURE__*/React.createElement(Tooltip, {
213
+ }))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
194
214
  title: "\u91CD\u7F6E",
195
215
  placement: "top"
196
216
  }, /*#__PURE__*/React.createElement(IconButton, {
197
217
  onClick: handleReset,
198
- sx: {
199
- color: 'white',
200
- '&:hover': {
201
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
202
- }
203
- },
218
+ sx: iconButtonSx,
204
219
  size: "small"
205
220
  }, /*#__PURE__*/React.createElement(ResetLeftFillIcon, {
206
221
  sx: {
207
222
  fontSize: '20px'
208
223
  }
209
- }))), currentSrc && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
210
- sx: {
211
- width: '1px',
212
- height: '24px',
213
- backgroundColor: 'rgba(255, 255, 255, 0.3)',
214
- mx: 0.5
215
- }
216
- }), /*#__PURE__*/React.createElement(Tooltip, {
224
+ }))), currentSrc && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
217
225
  title: "\u4E0B\u8F7D",
218
226
  placement: "top"
219
227
  }, /*#__PURE__*/React.createElement(IconButton, {
220
228
  onClick: handleDownload,
221
- sx: {
222
- color: 'white',
223
- '&:hover': {
224
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
225
- }
226
- },
229
+ sx: iconButtonSx,
227
230
  size: "small"
228
231
  }, /*#__PURE__*/React.createElement(Download2LineIcon, {
229
232
  sx: {
230
233
  fontSize: '20px'
231
234
  }
232
- })))), /*#__PURE__*/React.createElement(Box, {
233
- sx: {
234
- width: '1px',
235
- height: '24px',
236
- backgroundColor: 'rgba(255, 255, 255, 0.3)',
237
- mx: 0.5
238
- }
239
- }), /*#__PURE__*/React.createElement(Tooltip, {
235
+ })))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
240
236
  title: isFullscreen ? '退出全屏' : '全屏',
241
237
  placement: "top"
242
238
  }, /*#__PURE__*/React.createElement(IconButton, {
243
239
  onClick: handleFullscreen,
244
- sx: {
245
- color: 'white',
246
- '&:hover': {
247
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
248
- }
249
- },
240
+ sx: iconButtonSx,
250
241
  size: "small"
251
242
  }, isFullscreen ? /*#__PURE__*/React.createElement(FullscreenExitLineIcon, {
252
243
  sx: {
@@ -256,26 +247,12 @@ export var CustomToolbar = function CustomToolbar(_ref) {
256
247
  sx: {
257
248
  fontSize: '20px'
258
249
  }
259
- }))), /*#__PURE__*/React.createElement(Box, {
260
- sx: {
261
- width: '1px',
262
- height: '24px',
263
- backgroundColor: 'rgba(255, 255, 255, 0.3)',
264
- mx: 0.5
265
- }
266
- }), /*#__PURE__*/React.createElement(Tooltip, {
250
+ }))), /*#__PURE__*/React.createElement(Divider, null), /*#__PURE__*/React.createElement(Tooltip, {
267
251
  title: "\u5173\u95ED",
268
252
  placement: "top"
269
253
  }, /*#__PURE__*/React.createElement(IconButton, {
270
- onClick: function onClick() {
271
- return onClose && onClose();
272
- },
273
- sx: {
274
- color: 'white',
275
- '&:hover': {
276
- backgroundColor: 'rgba(255, 255, 255, 0.1)'
277
- }
278
- },
254
+ onClick: handleClose,
255
+ sx: iconButtonSx,
279
256
  size: "small"
280
257
  }, /*#__PURE__*/React.createElement(CloseCircleFillIcon, {
281
258
  sx: {
@@ -1,22 +1,25 @@
1
1
  import React from 'react';
2
2
  export var ImageViewerContext = /*#__PURE__*/React.createContext({
3
- setCurrentSrc: function setCurrentSrc() {},
3
+ currentSrc: '',
4
4
  visible: false,
5
- setVisible: function setVisible() {},
6
- scale: 1,
7
- setScale: function setScale() {},
8
- rotate: 0,
9
- setRotate: function setRotate() {},
5
+ currentIndex: 0,
6
+ totalImages: 0,
10
7
  getScale: function getScale() {
11
8
  return 1;
12
9
  },
13
10
  getRotate: function getRotate() {
14
11
  return 0;
15
12
  },
16
- onScale: null,
17
- setOnScale: function setOnScale() {},
18
- onRotate: null,
19
- setOnRotate: function setOnRotate() {},
20
- onClose: null,
21
- setOnClose: function setOnClose() {}
13
+ getOnScale: function getOnScale() {
14
+ return null;
15
+ },
16
+ getOnRotate: function getOnRotate() {
17
+ return null;
18
+ },
19
+ getOnClose: function getOnClose() {
20
+ return null;
21
+ },
22
+ onImageClick: function onImageClick() {},
23
+ onPrevImage: function onPrevImage() {},
24
+ onNextImage: function onNextImage() {}
22
25
  });
@@ -6,6 +6,8 @@ export type { ImageViewerItemProps, ImageViewerProviderProps } from './types';
6
6
  export { ImageViewerItem, ImageViewerProvider };
7
7
  declare const _default: {
8
8
  Provider: import("react").FC<import("./types").ImageViewerProviderProps>;
9
- Item: import("react").FC<import("./types").ImageViewerItemProps>;
9
+ Item: import("react").FC<import("./types").ImageViewerItemProps & {
10
+ onImageClick?: ((src: string) => void) | undefined;
11
+ }>;
10
12
  };
11
13
  export default _default;
@@ -1,4 +1,4 @@
1
- import React, { ReactNode } from 'react';
1
+ import { ReactNode } from 'react';
2
2
  export interface ImageViewerProviderProps {
3
3
  children: ReactNode;
4
4
  speed?: number | ((type: number) => number);
@@ -22,30 +22,19 @@ export interface ImageViewerProviderProps {
22
22
  export interface ImageViewerItemProps {
23
23
  src: string;
24
24
  children?: ReactNode;
25
- render?: (props: {
26
- attrs: Partial<React.HTMLAttributes<HTMLElement>>;
27
- scale: number;
28
- rotate: number;
29
- }) => ReactNode;
30
- overlay?: ReactNode;
31
- width?: number;
32
- height?: number;
33
25
  triggers?: Array<'onClick' | 'onDoubleClick'>;
34
26
  }
35
27
  export interface ImageViewerContextType {
36
- setCurrentSrc: (src: string) => void;
28
+ currentSrc: string;
37
29
  visible: boolean;
38
- setVisible: (visible: boolean) => void;
39
- scale: number;
40
- setScale: (scale: number) => void;
41
- rotate: number;
42
- setRotate: (rotate: number) => void;
30
+ currentIndex: number;
31
+ totalImages: number;
43
32
  getScale: () => number;
44
33
  getRotate: () => number;
45
- onScale: ((scale: number) => void) | null;
46
- setOnScale: (fn: ((scale: number) => void) | null) => void;
47
- onRotate: ((rotate: number) => void) | null;
48
- setOnRotate: (fn: ((rotate: number) => void) | null) => void;
49
- onClose: (() => void) | null;
50
- setOnClose: (fn: (() => void) | null) => void;
34
+ getOnScale: () => ((scale: number) => void) | null;
35
+ getOnRotate: () => ((rotate: number) => void) | null;
36
+ getOnClose: () => (() => void) | null;
37
+ onImageClick: (src: string) => void;
38
+ onPrevImage: () => void;
39
+ onNextImage: () => void;
51
40
  }
@@ -181,7 +181,7 @@ var ImageViewWrapper = function ImageViewWrapper(_ref) {
181
181
  e.stopPropagation();
182
182
  return;
183
183
  }
184
- // 允许 PhotoView 处理点击事件进行预览
184
+ // 事件会冒泡到 ImageViewerItem 处理
185
185
  };
186
186
  var handleMouseMove = useCallback(function (e) {
187
187
  if (!isDragging || !dragCorner) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ctzhian/tiptap",
3
- "version": "2.1.5",
3
+ "version": "2.1.6",
4
4
  "description": "基于 Tiptap 二次开发的编辑器组件",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",