aitu-app 0.5.14

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 (237) hide show
  1. package/.DS_Store +0 -0
  2. package/README.md +47 -0
  3. package/_headers +84 -0
  4. package/_redirects +2 -0
  5. package/assets/ChatMessagesArea-CkUX81uB.js +251 -0
  6. package/assets/ChatMessagesArea-Di0Z80Zh.css +1 -0
  7. package/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/assets/Tableau10-B-NsZVaP.js +1 -0
  67. package/assets/Tableau10-Dnlau_Wv.js +1 -0
  68. package/assets/ToolboxDrawer-By1XMh8B.js +87 -0
  69. package/assets/ToolboxDrawer-fPqvDLQE.css +1 -0
  70. package/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  71. package/assets/ai-analyze-Db-iXol6.js +1 -0
  72. package/assets/arc-BZXVqUcI.js +1 -0
  73. package/assets/arc-ajYHRRnk.js +1 -0
  74. package/assets/array-B5oSNiGi.js +1 -0
  75. package/assets/array-BKyUJesY.js +1 -0
  76. package/assets/batch-image-generation-Baqb01Lm.js +6 -0
  77. package/assets/batch-image-generation-CbLMWmjk.css +1 -0
  78. package/assets/blockDiagram-38ab4fdb-BT3H_WVv.js +118 -0
  79. package/assets/blockDiagram-38ab4fdb-u0xYP3Lt.js +118 -0
  80. package/assets/c4Diagram-3d4e48cf-CBvM6zjM.js +10 -0
  81. package/assets/c4Diagram-3d4e48cf-WOIEVidH.js +10 -0
  82. package/assets/channel-BP25wTsw.js +1 -0
  83. package/assets/channel-HzrLNFUg.js +1 -0
  84. package/assets/classDiagram-70f12bd4-BMutcvFi.js +2 -0
  85. package/assets/classDiagram-70f12bd4-Cl9U1r5F.js +2 -0
  86. package/assets/classDiagram-v2-f2320105-C0agtbR4.js +2 -0
  87. package/assets/classDiagram-v2-f2320105-tCBzATK6.js +2 -0
  88. package/assets/clone-B69pF7Y_.js +1 -0
  89. package/assets/clone-oX7o-l4R.js +1 -0
  90. package/assets/createText-2e5e7dd3-CZ9_fscE.js +5 -0
  91. package/assets/createText-2e5e7dd3-idrqgJjU.js +7 -0
  92. package/assets/edges-e0da2a9e-C-RyePMV.js +4 -0
  93. package/assets/edges-e0da2a9e-DJXAjJSL.js +4 -0
  94. package/assets/erDiagram-9861fffd-DWJR_3zL.js +51 -0
  95. package/assets/erDiagram-9861fffd-x2Kcy95-.js +51 -0
  96. package/assets/flowDb-956e92f1-BgKjOIdz.js +10 -0
  97. package/assets/flowDb-956e92f1-CF6y18Tn.js +10 -0
  98. package/assets/flowDiagram-66a62f08-BPPw0wPU.js +4 -0
  99. package/assets/flowDiagram-66a62f08-CSAllSFf.js +4 -0
  100. package/assets/flowDiagram-v2-96b9c2cf-B-UGyXRi.js +1 -0
  101. package/assets/flowDiagram-v2-96b9c2cf-Cm596kxZ.js +1 -0
  102. package/assets/flowchart-elk-definition-4a651766-9XSRJbsr.js +139 -0
  103. package/assets/flowchart-elk-definition-4a651766-DWFN9DN3.js +139 -0
  104. package/assets/ganttDiagram-c361ad54-D9tbz9tQ.js +257 -0
  105. package/assets/ganttDiagram-c361ad54-ot5pUYpT.js +257 -0
  106. package/assets/gitGraphDiagram-72cf32ee-BFV3Mt8C.js +70 -0
  107. package/assets/gitGraphDiagram-72cf32ee-C6qFzgGh.js +70 -0
  108. package/assets/graph-BxwlF7JS.js +1 -0
  109. package/assets/graph-D-2Ldvxg.js +1 -0
  110. package/assets/grid-image-cM9AmYC8.js +1 -0
  111. package/assets/has-CgdIPiQG.js +1 -0
  112. package/assets/hasIn-4iY02rGN.js +1 -0
  113. package/assets/index-3862675e-CVZnpwDN.js +1 -0
  114. package/assets/index-3862675e-DqdI9cab.js +1 -0
  115. package/assets/index-B2dvADz8.css +1 -0
  116. package/assets/index-BicRPzXC.js +1 -0
  117. package/assets/index-Bs7-jmv6.css +1 -0
  118. package/assets/index-BwSGXyRr.js +99 -0
  119. package/assets/index-C1XdOOAn.css +1 -0
  120. package/assets/index-C4AKKbpQ.css +1 -0
  121. package/assets/index-CkpXFt8n.js +1 -0
  122. package/assets/index-CrxF9gFe.js +42 -0
  123. package/assets/index-DBWqXBIQ.js +93 -0
  124. package/assets/index-DI_5V2-m.js +3 -0
  125. package/assets/index-DWUAFoZG.js +2064 -0
  126. package/assets/index-Dn0YtZ2R.js +3 -0
  127. package/assets/index-e05Rs4M6.js +12 -0
  128. package/assets/index.dom-C3-224fz.js +1 -0
  129. package/assets/infoDiagram-f8f76790-CnrpwoOt.js +7 -0
  130. package/assets/infoDiagram-f8f76790-FKC1Sy9Y.js +7 -0
  131. package/assets/init-A0kIFD9x.js +1 -0
  132. package/assets/init-Gi6I4Gst.js +1 -0
  133. package/assets/inspiration-board-B_-BBBHt.js +1 -0
  134. package/assets/isEmpty-Dj2GV0v-.js +1 -0
  135. package/assets/journeyDiagram-49397b02-B7fP21sU.js +139 -0
  136. package/assets/journeyDiagram-49397b02-Dp3X9XWq.js +139 -0
  137. package/assets/katex-BbEIqZs1.js +261 -0
  138. package/assets/katex-Cu_Erd72.js +261 -0
  139. package/assets/layout-BD3yCK_X.js +1 -0
  140. package/assets/layout-DHHYqX7p.js +1 -0
  141. package/assets/line-B3bNrkzn.js +1 -0
  142. package/assets/line-B86HLuqu.js +1 -0
  143. package/assets/linear-DU2Ciymb.js +1 -0
  144. package/assets/linear-wCAlMhOS.js +1 -0
  145. package/assets/mermaid.core-DfVvnpgz.js +91 -0
  146. package/assets/mindmap-definition-fc14e90a-D1sxE3xG.js +425 -0
  147. package/assets/mindmap-definition-fc14e90a-YuSOJC7P.js +425 -0
  148. package/assets/ordinal-BRr1uYdk.js +1 -0
  149. package/assets/ordinal-Cboi1Yqb.js +1 -0
  150. package/assets/path-CY0bYimO.js +1 -0
  151. package/assets/path-CbwjOpE9.js +1 -0
  152. package/assets/photo-wall-splitter-BVU2e0aS.js +1 -0
  153. package/assets/pick-Cvlwra4g.js +1 -0
  154. package/assets/pieDiagram-8a3498a8-B6mJUqro.js +35 -0
  155. package/assets/pieDiagram-8a3498a8-B91bWgo_.js +35 -0
  156. package/assets/quadrantDiagram-120e2f19-BxS8fQEz.js +7 -0
  157. package/assets/quadrantDiagram-120e2f19-DwudONqx.js +7 -0
  158. package/assets/requirementDiagram-deff3bca-DygaMIoy.js +52 -0
  159. package/assets/requirementDiagram-deff3bca-v9xlgfS8.js +52 -0
  160. package/assets/sankeyDiagram-04a897e0-BV23dp4l.js +8 -0
  161. package/assets/sankeyDiagram-04a897e0-BXCiXiyw.js +8 -0
  162. package/assets/sequenceDiagram-704730f1-CObRpNi4.js +122 -0
  163. package/assets/sequenceDiagram-704730f1-Ck69A6wI.js +122 -0
  164. package/assets/settings-dialog-BlCO49C4.js +1 -0
  165. package/assets/settings-dialog-QUxXj54T.css +1 -0
  166. package/assets/stateDiagram-587899a1-J_G6I0oo.js +1 -0
  167. package/assets/stateDiagram-587899a1-z-tKclr3.js +1 -0
  168. package/assets/stateDiagram-v2-d93cdb3a-DsThtOzP.js +1 -0
  169. package/assets/stateDiagram-v2-d93cdb3a-XIvq5t8a.js +1 -0
  170. package/assets/styles-6aaf32cf-1fjuNMUk.js +207 -0
  171. package/assets/styles-6aaf32cf-DT2rVNfQ.js +207 -0
  172. package/assets/styles-9a916d00-fLeUSina.js +160 -0
  173. package/assets/styles-9a916d00-q64Umkis.js +160 -0
  174. package/assets/styles-c10674c1-BWlxVc3Q.js +116 -0
  175. package/assets/styles-c10674c1-CtYpjMYU.js +116 -0
  176. package/assets/svgDrawCommon-08f97a94-C_DhKfny.js +1 -0
  177. package/assets/svgDrawCommon-08f97a94-DSBqmUv2.js +1 -0
  178. package/assets/timeline-definition-85554ec2-AKpzwLPN.js +61 -0
  179. package/assets/timeline-definition-85554ec2-dTkYwoLF.js +61 -0
  180. package/assets/ttd-dialog-CxiaIUuJ.js +47 -0
  181. package/assets/ttd-dialog-DCapefb6.css +1 -0
  182. package/assets/upload-4sxUU7q_.js +1 -0
  183. package/assets/video-recovery-service-BckHbSyK.js +1 -0
  184. package/assets/web-vitals-DcvjKPr-.js +1 -0
  185. package/assets/winbox.bundle.min-CoRPjCs5.js +1 -0
  186. package/assets/xlsx-CkFp8p6R.js +105 -0
  187. package/assets/xychartDiagram-e933f94c-DCmvL0ag.js +7 -0
  188. package/assets/xychartDiagram-e933f94c-aqOiXp_u.js +7 -0
  189. package/batch-image.html +1616 -0
  190. package/favicon.ico +0 -0
  191. package/icons/README.md +55 -0
  192. package/icons/aitu10.png +0 -0
  193. package/icons/android-chrome-192x192.png +0 -0
  194. package/icons/android-chrome-512x512.png +0 -0
  195. package/icons/apple-touch-icon.png +0 -0
  196. package/icons/favicon-16x16.png +0 -0
  197. package/icons/favicon-16x16.svg +539 -0
  198. package/icons/favicon-32x32.png +0 -0
  199. package/icons/favicon-32x32.svg +539 -0
  200. package/icons/favicon-new.svg +539 -0
  201. package/icons/favicon-new.svg.png +0 -0
  202. package/icons/icon-192x192.svg +539 -0
  203. package/icons/icon-512x512.svg +539 -0
  204. package/icons/icon-96x96.png +0 -0
  205. package/icons/icon-96x96.svg +539 -0
  206. package/iframe-test.html +340 -0
  207. package/index.html +105 -0
  208. package/init.json +6 -0
  209. package/logo/cardid.jpg +0 -0
  210. package/logo/group-qr.png +0 -0
  211. package/logo/logo_drawnix_h.svg +539 -0
  212. package/logo/logo_drawnix_h_dark.svg +539 -0
  213. package/logo/logo_drawnix_new.svg +539 -0
  214. package/manifest.json +52 -0
  215. package/package.json +31 -0
  216. package/product_showcase/aitu-01.png +0 -0
  217. package/product_showcase/aitu-02.png +0 -0
  218. package/product_showcase/aitu-03.png +0 -0
  219. package/product_showcase/aitu-04.png +0 -0
  220. package/product_showcase/aitu-05.png +0 -0
  221. package/product_showcase/aitu-06.png +0 -0
  222. package/product_showcase/case-1.png +0 -0
  223. package/product_showcase/case-2.png +0 -0
  224. package/robots.txt +13 -0
  225. package/sitemap.xml +29 -0
  226. package/sw-debug/app.js +3069 -0
  227. package/sw-debug/console-entry.js +80 -0
  228. package/sw-debug/log-entry.js +452 -0
  229. package/sw-debug/log-panel.js +309 -0
  230. package/sw-debug/postmessage-entry.js +117 -0
  231. package/sw-debug/status-panel.js +125 -0
  232. package/sw-debug/styles.css +2103 -0
  233. package/sw-debug/sw-communication.js +208 -0
  234. package/sw-debug/utils.js +112 -0
  235. package/sw-debug.html +685 -0
  236. package/sw.js +58 -0
  237. package/version.json +10 -0
@@ -0,0 +1,340 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Aitu iframe 嵌入测试</title>
7
+ <style>
8
+ body {
9
+ margin: 0;
10
+ padding: 20px;
11
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
12
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
13
+ color: #333;
14
+ }
15
+
16
+ .container {
17
+ max-width: 1200px;
18
+ margin: 0 auto;
19
+ background: white;
20
+ border-radius: 12px;
21
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
22
+ overflow: hidden;
23
+ }
24
+
25
+ .header {
26
+ background: linear-gradient(45deg, #667eea, #764ba2);
27
+ color: white;
28
+ padding: 20px;
29
+ text-align: center;
30
+ }
31
+
32
+ .header h1 {
33
+ margin: 0;
34
+ font-size: 2em;
35
+ }
36
+
37
+ .header p {
38
+ margin: 10px 0 0 0;
39
+ opacity: 0.9;
40
+ }
41
+
42
+ .content {
43
+ padding: 20px;
44
+ }
45
+
46
+ .test-section {
47
+ margin-bottom: 30px;
48
+ }
49
+
50
+ .test-section h2 {
51
+ color: #667eea;
52
+ border-bottom: 2px solid #667eea;
53
+ padding-bottom: 5px;
54
+ margin-bottom: 15px;
55
+ }
56
+
57
+ .iframe-container {
58
+ position: relative;
59
+ width: 100%;
60
+ height: 600px;
61
+ border: 2px solid #e1e5e9;
62
+ border-radius: 8px;
63
+ margin: 10px 0;
64
+ overflow: hidden;
65
+ background: #f8f9fa;
66
+ }
67
+
68
+ .iframe-container iframe {
69
+ width: 100%;
70
+ height: 100%;
71
+ border: none;
72
+ }
73
+
74
+ .iframe-info {
75
+ background: #f8f9fa;
76
+ padding: 10px 15px;
77
+ border-radius: 6px;
78
+ margin: 10px 0;
79
+ font-size: 0.9em;
80
+ border-left: 4px solid #667eea;
81
+ }
82
+
83
+ .status {
84
+ display: inline-block;
85
+ padding: 4px 8px;
86
+ border-radius: 4px;
87
+ font-size: 0.8em;
88
+ margin-left: 10px;
89
+ }
90
+
91
+ .status.success {
92
+ background: #d4edda;
93
+ color: #155724;
94
+ }
95
+
96
+ .status.error {
97
+ background: #f8d7da;
98
+ color: #721c24;
99
+ }
100
+
101
+ .note {
102
+ background: #fff3cd;
103
+ color: #856404;
104
+ padding: 12px;
105
+ border-radius: 6px;
106
+ border-left: 4px solid #ffc107;
107
+ margin: 15px 0;
108
+ }
109
+
110
+ .controls {
111
+ margin: 15px 0;
112
+ display: flex;
113
+ gap: 10px;
114
+ flex-wrap: wrap;
115
+ }
116
+
117
+ .btn {
118
+ padding: 8px 16px;
119
+ border: none;
120
+ border-radius: 6px;
121
+ cursor: pointer;
122
+ font-size: 0.9em;
123
+ transition: all 0.2s;
124
+ }
125
+
126
+ .btn-primary {
127
+ background: #667eea;
128
+ color: white;
129
+ }
130
+
131
+ .btn-primary:hover {
132
+ background: #5a6fd8;
133
+ }
134
+
135
+ .btn-secondary {
136
+ background: #6c757d;
137
+ color: white;
138
+ }
139
+
140
+ .btn-secondary:hover {
141
+ background: #5a6268;
142
+ }
143
+ </style>
144
+ </head>
145
+ <body>
146
+ <div class="container">
147
+ <div class="header">
148
+ <h1>🎨 Aitu iframe 嵌入测试</h1>
149
+ <p>模拟 api.tu-zi.com 和其他域名嵌入当前应用的效果</p>
150
+ </div>
151
+
152
+ <div class="content">
153
+ <!-- 本地测试 - 模拟本地域名嵌入 -->
154
+ <div class="test-section">
155
+ <h2>本地环境嵌入测试 <span class="status success">✓ 允许</span></h2>
156
+ <div class="iframe-info">
157
+ <strong>场景:</strong> 本地开发环境嵌入当前应用<br>
158
+ <strong>状态:</strong> 本地域名已在白名单中,应该正常显示<br>
159
+ <strong>用途:</strong> 验证本地开发时的嵌入效果
160
+ </div>
161
+ <div class="controls">
162
+ <button class="btn btn-primary" onclick="loadLocalIframe()">嵌入当前应用</button>
163
+ <button class="btn btn-secondary" onclick="reloadIframe('local-iframe')">重新加载</button>
164
+ </div>
165
+ <div class="iframe-container">
166
+ <iframe id="local-iframe" src="" title="本地嵌入Aitu应用"></iframe>
167
+ </div>
168
+ </div>
169
+
170
+ <!-- 模拟 api.tu-zi.com 嵌入 -->
171
+ <div class="test-section">
172
+ <h2>api.tu-zi.com 嵌入测试 <span class="status success">✓ 允许</span></h2>
173
+ <div class="iframe-info">
174
+ <strong>场景:</strong> 模拟 api.tu-zi.com 网站嵌入当前应用<br>
175
+ <strong>状态:</strong> api.tu-zi.com 已在白名单中,应该正常显示<br>
176
+ <strong>用途:</strong> 验证生产环境中的嵌入效果
177
+ </div>
178
+ <div class="note">
179
+ <strong>注意:</strong> 这个测试页面本身运行在当前域名下,所以可以成功嵌入。在实际部署中,api.tu-zi.com 的页面可以通过同样的方式嵌入此应用。
180
+ </div>
181
+ <div class="controls">
182
+ <button class="btn btn-primary" onclick="loadCurrentApp()">嵌入当前应用</button>
183
+ <button class="btn btn-primary" onclick="loadAppWithQuery('source=api.tu-zi.com')">带来源参数嵌入</button>
184
+ <button class="btn btn-secondary" onclick="reloadIframe('tuzi-iframe')">重新加载</button>
185
+ </div>
186
+ <div class="iframe-container">
187
+ <iframe id="tuzi-iframe" src="" title="模拟api.tu-zi.com嵌入"></iframe>
188
+ </div>
189
+ </div>
190
+
191
+ <!-- 未授权域名测试 -->
192
+ <div class="test-section">
193
+ <h2>未授权域名嵌入测试 <span class="status error">✗ 应该被阻止</span></h2>
194
+ <div class="iframe-info">
195
+ <strong>场景:</strong> 模拟未授权域名尝试嵌入当前应用<br>
196
+ <strong>状态:</strong> 应该被CSP策略阻止<br>
197
+ <strong>用途:</strong> 验证安全策略的有效性
198
+ </div>
199
+ <div class="note">
200
+ <strong>说明:</strong> 由于这个测试页面运行在当前域名下,无法真实模拟外部域名的阻止效果。但在实际部署中,其他未授权域名将无法嵌入此应用。
201
+ </div>
202
+ <div class="controls">
203
+ <button class="btn btn-secondary" disabled>无法在此测试</button>
204
+ </div>
205
+ <div class="iframe-container">
206
+ <div style="padding: 50px; text-align: center; color: #666;">
207
+ <p>❌ 未授权域名将被阻止嵌入</p>
208
+ <small>实际效果需要在不同域名下测试</small>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <!-- 嵌入参数测试 -->
214
+ <div class="test-section">
215
+ <h2>嵌入参数测试</h2>
216
+ <div class="iframe-info">
217
+ 测试不同的URL参数和嵌入选项
218
+ </div>
219
+ <div class="controls">
220
+ <button class="btn btn-primary" onclick="loadWithParams('embed=true')">嵌入模式</button>
221
+ <button class="btn btn-primary" onclick="loadWithParams('readonly=true')">只读模式</button>
222
+ <button class="btn btn-primary" onclick="loadWithParams('toolbar=false')">隐藏工具栏</button>
223
+ <button class="btn btn-secondary" onclick="clearIframe('param-iframe')">清空</button>
224
+ </div>
225
+ <div class="iframe-container">
226
+ <iframe id="param-iframe" src="" title="参数测试"></iframe>
227
+ </div>
228
+ </div>
229
+
230
+ <!-- CSP 策略说明 -->
231
+ <div class="test-section">
232
+ <h2>CSP 策略配置</h2>
233
+ <div class="note">
234
+ 为了允许当前应用被其他域名通过iframe嵌入,需要配置以下HTTP响应头:
235
+ <pre style="margin: 10px 0; padding: 10px; background: #f1f3f4; border-radius: 4px; font-size: 0.85em;">Content-Security-Policy: frame-ancestors 'self' localhost:* 127.0.0.1:* https://api.tu-zi.com
236
+ X-Frame-Options: ALLOWALL</pre>
237
+ </div>
238
+ <div class="iframe-info">
239
+ <strong>当前策略允许嵌入的父域名:</strong><br>
240
+ • localhost (任意端口) - 本地开发环境<br>
241
+ • 127.0.0.1 (任意端口) - 本地IP访问<br>
242
+ • https://api.tu-zi.com - 生产环境授权域名<br>
243
+ • 同域名 (self) - 同域内嵌入
244
+ </div>
245
+ <div class="note">
246
+ <strong>使用说明:</strong><br>
247
+ 1. 在 api.tu-zi.com 的网站中可以使用 <code>&lt;iframe src="你的应用URL"&gt;&lt;/iframe&gt;</code> 来嵌入此应用<br>
248
+ 2. 其他未授权域名将收到 "Refused to frame" 错误,无法嵌入<br>
249
+ 3. 配置已添加到 Vite 开发服务器、Netlify _headers 文件和 netlify.toml 中<br>
250
+ 4. Netlify 部署后会自动应用这些CSP策略
251
+ </div>
252
+ <div class="note">
253
+ <strong>验证部署:</strong><br>
254
+ 部署后可以通过浏览器开发者工具的 Network 标签查看响应头,确认包含:<br>
255
+ <code>Content-Security-Policy: frame-ancestors 'self' localhost:* 127.0.0.1:* *.localhost:* https://api.tu-zi.com</code>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+
261
+ <script>
262
+ // 获取当前页面的基础URL
263
+ function getBaseUrl() {
264
+ return 'https://ai-tu.netlify.app/';
265
+ }
266
+
267
+ // 加载本地iframe - 嵌入当前应用
268
+ function loadLocalIframe() {
269
+ const iframe = document.getElementById('local-iframe');
270
+ const baseUrl = getBaseUrl();
271
+ iframe.src = baseUrl;
272
+ console.log('Embedding current app in local iframe:', baseUrl);
273
+ }
274
+
275
+ // 嵌入当前应用
276
+ function loadCurrentApp() {
277
+ const iframe = document.getElementById('tuzi-iframe');
278
+ const baseUrl = getBaseUrl();
279
+ iframe.src = baseUrl;
280
+ console.log('Embedding current app:', baseUrl);
281
+ }
282
+
283
+ // 带查询参数嵌入当前应用
284
+ function loadAppWithQuery(query) {
285
+ const iframe = document.getElementById('tuzi-iframe');
286
+ const baseUrl = getBaseUrl();
287
+ iframe.src = `${baseUrl}?${query}`;
288
+ console.log('Embedding current app with query:', `${baseUrl}?${query}`);
289
+ }
290
+
291
+ // 带参数加载
292
+ function loadWithParams(params) {
293
+ const iframe = document.getElementById('param-iframe');
294
+ const baseUrl = getBaseUrl();
295
+ iframe.src = `${baseUrl}?${params}`;
296
+ console.log('Loading with params:', `${baseUrl}?${params}`);
297
+ }
298
+
299
+ // 重新加载指定iframe
300
+ function reloadIframe(iframeId) {
301
+ const iframe = document.getElementById(iframeId);
302
+ const src = iframe.src;
303
+ iframe.src = '';
304
+ setTimeout(() => {
305
+ iframe.src = src;
306
+ }, 100);
307
+ }
308
+
309
+ // 清空iframe
310
+ function clearIframe(iframeId) {
311
+ const iframe = document.getElementById(iframeId);
312
+ iframe.src = '';
313
+ }
314
+
315
+ // 监听iframe加载事件
316
+ document.addEventListener('DOMContentLoaded', function() {
317
+ const iframes = document.querySelectorAll('iframe');
318
+ iframes.forEach(iframe => {
319
+ iframe.addEventListener('load', function() {
320
+ console.log(`Iframe loaded successfully: ${this.id}`);
321
+ });
322
+
323
+ iframe.addEventListener('error', function() {
324
+ console.log(`Iframe failed to load: ${this.id}`);
325
+ });
326
+ });
327
+ });
328
+
329
+ // 检测CSP违规
330
+ document.addEventListener('securitypolicyviolation', function(e) {
331
+ console.log('CSP Violation:', {
332
+ directive: e.violatedDirective,
333
+ blockedURI: e.blockedURI,
334
+ lineNumber: e.lineNumber,
335
+ sourceFile: e.sourceFile
336
+ });
337
+ });
338
+ </script>
339
+ </body>
340
+ </html>
package/index.html ADDED
@@ -0,0 +1,105 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <!-- 权限策略:禁止 unload 事件(不影响 beforeunload) -->
6
+ <!-- 基本 SEO Meta 标签 (中文) -->
7
+ <title>爱图 - AI图片视频创作</title>
8
+ <meta name="description" content="爱图是一款强大的AI图片视频创作工具(https://github.com/ljquan/aitu),集成思维导图、流程图等功能。基于 Plait 框架开发,支持插件扩展,提供自动保存、无限画布等特性。爱创作,图未来。">
9
+ <meta name="keywords" content="爱图,Aitu,白板工具,白板,思维导图,流程图,开源白板,开源思维导图,在线绘图,在线白板,协作工具,协作白板,Plait 框架">
10
+ <!-- 基本 SEO Meta 标签 (英文) -->
11
+ <meta name="description" lang="en" content="Aitu is a powerful open-source whiteboard tool featuring mind mapping and flowchart capabilities. Built on the Plait framework, it offers plugin extensibility, auto-save, infinite canvas, and more. Love Creation, Visualize the Future.">
12
+ <meta name="keywords" lang="en" content="Aitu,whiteboard tool, whiteboard,mind mapping,flowchart,open source whiteboard, open source mind mapping,online drawing,collaboration tool, collaboration whiteboard,Plait framework">
13
+ <!-- Open Graph Meta 标签 (中文) -->
14
+ <meta property="og:title" content="爱图 - AI图片视频创作 | 思维导图 | 流程图 | 白板 | 协作白板">
15
+ <meta property="og:description" content="爱图一体化AI图片视频创作工具(在线白板 | 协作白板),支持思维导图、流程图,基于 Plait 框架开发">
16
+ <meta property="og:type" content="website">
17
+ <meta property="og:url" content="https://opentu.ai">
18
+ <meta property="og:site_name" content="爱图">
19
+ <!-- Open Graph Meta 标签 (英文) -->
20
+ <meta property="og:title" lang="en" content="Aitu - Open Source Whiteboard | Mind Mapping | Flowchart | Whiteboard | Collaboration Whiteboard">
21
+ <meta property="og:description" lang="en" content="An integrated open-source whiteboard tool(online whiteboard | collaboration whiteboard) supporting mind mapping and flowcharts, built on the Plait framework">
22
+ <!-- Twitter Card Meta 标签 (英文) -->
23
+ <meta name="twitter:card" content="summary_large_image">
24
+ <meta name="twitter:title" content="Aitu - Open Source Whiteboard | Mind Mapping | Flowchart | Whiteboard | Collaboration Whiteboard">
25
+ <meta name="twitter:description" content="An integrated open-source whiteboard tool(online whiteboard | collaboration whiteboard) supporting mind mapping and flowcharts, built on the Plait framework">
26
+ <!-- 其他重要 Meta 标签 -->
27
+ <meta name="robots" content="index, follow">
28
+ <meta name="author" content="Aitu Team">
29
+ <link rel="canonical" href="https://opentu.ai">
30
+ <!-- 语言替代链接 -->
31
+ <link rel="alternate" hreflang="zh-CN" href="https://opentu.ai">
32
+ <!-- <link rel="alternate" hreflang="en" href="https://drawnix.com/en"> -->
33
+ <link rel="alternate" hreflang="x-default" href="https://opentu.ai">
34
+ <!-- 结构化数据 (JSON-LD) - 中英双语 -->
35
+ <script type="application/ld+json">
36
+ {
37
+ "@context": "https://schema.org",
38
+ "@type": "SoftwareApplication",
39
+ "name": "Aitu",
40
+ "alternateName": ["爱图", "AI图片视频创作", "Open Source Whiteboard Tool"],
41
+ "description": {
42
+ "zh-CN": "爱图是一款强大的AI图片视频创作工具,集成思维导图、流程图等功能。基于 Plait 框架开发,支持插件扩展,提供自动保存、无限画布等特性。",
43
+ "en": "Aitu is a powerful open-source whiteboard tool featuring mind mapping and flowchart capabilities. Built on the Plait framework, it offers plugin extensibility, auto-save, infinite canvas, and more."
44
+ },
45
+ "url": "https://opentu.ai",
46
+ "applicationCategory": "DesignApplication",
47
+ "operatingSystem": "Any",
48
+ "offers": {
49
+ "@type": "Offer",
50
+ "price": "0",
51
+ "priceCurrency": "USD"
52
+ },
53
+ "creator": {
54
+ "@type": "Organization",
55
+ "name": "Aitu Team"
56
+ },
57
+ "keywords": ["whiteboard", "mind mapping", "flowchart", "open source", "思维导图", "流程图", "白板"],
58
+ "inLanguage": ["zh-CN", "en"],
59
+ "license": "https://github.com/ljquan/aitu/blob/master/LICENSE"
60
+ }
61
+ </script>
62
+ <!-- base href 由构建工具处理,CDN 模式下使用相对路径 -->
63
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
64
+ <meta name="app-version" content="0.5.14" />
65
+
66
+ <link rel="icon" type="image/svg+xml" sizes="16x16" href="./icons/favicon-16x16.svg" />
67
+ <link rel="icon" type="image/svg+xml" sizes="32x32" href="./icons/favicon-32x32.svg" />
68
+ <link rel="icon" type="image/svg+xml" href="./icons/favicon-new.svg" />
69
+ <link rel="icon" type="image/ico" href="./favicon.ico" />
70
+
71
+ <!-- PWA Manifest -->
72
+ <link rel="manifest" href="./manifest.json?v=0.1.0" />
73
+
74
+ <!-- PWA Meta Tags -->
75
+ <meta name="theme-color" content="#ffffff" />
76
+ <meta name="apple-mobile-web-app-capable" content="yes" />
77
+ <meta name="apple-mobile-web-app-status-bar-style" content="default" />
78
+ <meta name="apple-mobile-web-app-title" content="爱图" />
79
+ <meta name="mobile-web-app-capable" content="yes" />
80
+ <meta name="msapplication-TileColor" content="#ffffff" />
81
+ <meta name="msapplication-tap-highlight" content="no" />
82
+
83
+ <!-- Apple Touch Icons -->
84
+ <link rel="apple-touch-icon" sizes="192x192" href="./icons/icon-192x192.svg" />
85
+
86
+ <!-- Windows Tiles -->
87
+ <meta name="msapplication-TileImage" content="./icons/icon-192x192.svg" />
88
+ <meta name="msapplication-square310x310logo" content="./icons/icon-512x512.svg" />
89
+
90
+ <script type="module" crossorigin src="./assets/index-DWUAFoZG.js"></script>
91
+ <link rel="stylesheet" crossorigin href="./assets/index-B2dvADz8.css">
92
+ </head>
93
+ <body>
94
+ <div id="root"></div>
95
+ </body>
96
+ <!-- PostHog Analytics -->
97
+ <script>
98
+ !function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init Dr Ur fi Lr zr ci Or jr capture Ai calculateEventProperties qr register register_once register_for_session unregister unregister_for_session Jr getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Gr Br createPersonProfile Vr Cr Kr opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Hr debug O Wr getPageViewId captureTraceFeedback captureTraceMetric Rr".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
99
+ posthog.init('phc_13URtidKwTR9POlwnB153NsN99shRykvPguKWf3vZVn', {
100
+ api_host: 'https://us.i.posthog.com',
101
+ defaults: '2025-11-30',
102
+ person_profiles: 'identified_only'
103
+ })
104
+ </script>
105
+ </html>
package/init.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "drawnix",
3
+ "version": 1,
4
+ "source": "web",
5
+ "elements": []
6
+ }
Binary file
Binary file