@bytechain.cn/colamd 1.5.0 → 1.5.1-beta.2

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 (193) hide show
  1. package/.trae/specs/optimize-theme-loading/checklist.md +20 -0
  2. package/.trae/specs/optimize-theme-loading/spec.md +103 -0
  3. package/.trae/specs/optimize-theme-loading/tasks.md +40 -0
  4. package/CHANGELOG.md +323 -0
  5. package/CLAUDE.md +56 -0
  6. package/README.md +422 -26
  7. package/README_CN.md +480 -28
  8. package/android/app/build/.npmkeep +0 -0
  9. package/android/app/build.gradle +76 -0
  10. package/android/app/capacitor.build.gradle +24 -0
  11. package/android/app/proguard-rules.pro +21 -0
  12. package/android/app/release.keystore +0 -0
  13. package/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +26 -0
  14. package/android/app/src/main/AndroidManifest.xml +64 -0
  15. package/android/app/src/main/java/cn/bytechain/colamd/MainActivity.java +180 -0
  16. package/android/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  17. package/android/app/src/main/res/drawable/splash.png +0 -0
  18. package/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  19. package/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  20. package/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  21. package/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  22. package/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  23. package/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  24. package/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  25. package/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  26. package/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  27. package/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  28. package/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +34 -0
  29. package/android/app/src/main/res/layout/activity_main.xml +12 -0
  30. package/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  31. package/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  32. package/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  33. package/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  34. package/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  35. package/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  36. package/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  37. package/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  38. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  39. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  40. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  41. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  42. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  43. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  44. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  45. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  46. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  47. package/android/app/src/main/res/values/ic_launcher_background.xml +4 -0
  48. package/android/app/src/main/res/values/strings.xml +7 -0
  49. package/android/app/src/main/res/values/styles.xml +22 -0
  50. package/android/app/src/main/res/xml/file_paths.xml +5 -0
  51. package/android/app/src/main/res/xml/network_security_config.xml +8 -0
  52. package/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +18 -0
  53. package/android/build.gradle +29 -0
  54. package/android/capacitor.settings.gradle +21 -0
  55. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  56. package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  57. package/android/gradle.properties +22 -0
  58. package/android/gradlew +248 -0
  59. package/android/gradlew.bat +92 -0
  60. package/android/settings.gradle +5 -0
  61. package/android/variables.gradle +16 -0
  62. package/bytechain.cn-colamd-1.5.1-beta.2.tgz +0 -0
  63. package/capacitor.config.js +29 -0
  64. package/capacitor.config.ts +30 -0
  65. package/demo.md +191 -484
  66. package/dist/main/index.js +77 -46
  67. package/dist/renderer/assets/{arc-tTbbM8LO.js → arc-CPdeInCG.js} +1 -1
  68. package/dist/renderer/assets/{architectureDiagram-3BPJPVTR-CEgYow6c.js → architectureDiagram-3BPJPVTR-BAbnaR9G.js} +4 -3
  69. package/dist/renderer/assets/{blockDiagram-GPEHLZMM-LHyVtPwW.js → blockDiagram-GPEHLZMM-CYSWjnJg.js} +5 -4
  70. package/dist/renderer/assets/{c4Diagram-AAUBKEIU-C1P1eJrf.js → c4Diagram-AAUBKEIU-Rb1tstnr.js} +3 -2
  71. package/dist/renderer/assets/{channel-upve91Tq.js → channel-DpG2A6fE.js} +1 -1
  72. package/dist/renderer/assets/{chunk-2J33WTMH-lag2vhq9.js → chunk-2J33WTMH-DFc0Jxy_.js} +1 -1
  73. package/dist/renderer/assets/{chunk-4BX2VUAB-BXJ8Ggh-.js → chunk-4BX2VUAB-BhRxDTNn.js} +1 -1
  74. package/dist/renderer/assets/{chunk-55IACEB6-CiBpxRa1.js → chunk-55IACEB6-DEgMVBk8.js} +1 -1
  75. package/dist/renderer/assets/{chunk-727SXJPM-ODeKQFXC.js → chunk-727SXJPM-bjBIfiz8.js} +5 -5
  76. package/dist/renderer/assets/{chunk-AQP2D5EJ-BK7xJolB.js → chunk-AQP2D5EJ-DwQMzTzD.js} +3 -3
  77. package/dist/renderer/assets/{chunk-FMBD7UC4-BxpCZPtz.js → chunk-FMBD7UC4-CkphwJzs.js} +1 -1
  78. package/dist/renderer/assets/{chunk-ND2GUHAM-CqqaU9Ue.js → chunk-ND2GUHAM-oU09z4y4.js} +1 -1
  79. package/dist/renderer/assets/{chunk-QZHKN3VN-Biq_K124.js → chunk-QZHKN3VN-rCbVuPBn.js} +1 -1
  80. package/dist/renderer/assets/{classDiagram-v2-Q7XG4LA2-Cq95X99o.js → classDiagram-4FO5ZUOK-DGS2faoM.js} +7 -6
  81. package/dist/renderer/assets/{classDiagram-4FO5ZUOK-Cq95X99o.js → classDiagram-v2-Q7XG4LA2-DGS2faoM.js} +7 -6
  82. package/dist/renderer/assets/{cose-bilkent-S5V4N54A-XasiD0bu.js → cose-bilkent-S5V4N54A-iqY6-EwA.js} +2 -1
  83. package/dist/renderer/assets/{dagre-BM42HDAG-Nq84Gfx4.js → dagre-BM42HDAG-5t3X5sDa.js} +4 -3
  84. package/dist/renderer/assets/{diagram-2AECGRRQ-DwuB1GWt.js → diagram-2AECGRRQ-DzHiYDPh.js} +4 -3
  85. package/dist/renderer/assets/{diagram-5GNKFQAL-C2tgeI1h.js → diagram-5GNKFQAL-BiNv6Keq.js} +5 -4
  86. package/dist/renderer/assets/{diagram-KO2AKTUF-D5KzjNBc.js → diagram-KO2AKTUF-ClzeDG6f.js} +4 -3
  87. package/dist/renderer/assets/{diagram-LMA3HP47-C12xHS1c.js → diagram-LMA3HP47-CGkw7wII.js} +4 -3
  88. package/dist/renderer/assets/{diagram-OG6HWLK6-CnxI9oEa.js → diagram-OG6HWLK6-Dl-Hyk1_.js} +5 -4
  89. package/dist/renderer/assets/{erDiagram-TEJ5UH35-D_uPaKwn.js → erDiagram-TEJ5UH35-BxUN79Qb.js} +5 -4
  90. package/dist/renderer/assets/{flowDiagram-I6XJVG4X-B6q_1-tE.js → flowDiagram-I6XJVG4X-CzFk-KNI.js} +7 -6
  91. package/dist/renderer/assets/{ganttDiagram-6RSMTGT7-CFo7ifF9.js → ganttDiagram-6RSMTGT7-C2xl6Igx.js} +3 -2
  92. package/dist/renderer/assets/{gitGraphDiagram-PVQCEYII-WSexHTnq.js → gitGraphDiagram-PVQCEYII-_fn7XCa7.js} +5 -4
  93. package/dist/renderer/assets/{graph-DyX_9f6d.js → graph-CDoHYrHm.js} +1 -1
  94. package/dist/renderer/assets/index-B4uDgADr.js +530 -0
  95. package/dist/renderer/assets/index-CBcVpA3d.js +30 -0
  96. package/dist/renderer/assets/index-CGj1spkU.js +27 -0
  97. package/dist/renderer/assets/{index-dyHEFYvY.css → index-CeFpoCKV.css} +443 -400
  98. package/dist/renderer/assets/index-D4CPFkph.js +9 -0
  99. package/dist/renderer/assets/{index-DW7LS8C1.js → index-DAlXyxzt.js} +1183 -346
  100. package/dist/renderer/assets/index-DxOzbfR-.js +110 -0
  101. package/dist/renderer/assets/index-Y89U1ptl.js +9 -0
  102. package/dist/renderer/assets/{infoDiagram-5YYISTIA-DaeJdLRq.js → infoDiagram-5YYISTIA-DL6XIxLz.js} +3 -2
  103. package/dist/renderer/assets/{ishikawaDiagram-YF4QCWOH-DDCZc35f.js → ishikawaDiagram-YF4QCWOH-BUZLjRo-.js} +2 -1
  104. package/dist/renderer/assets/{journeyDiagram-JHISSGLW-BEdmpAgl.js → journeyDiagram-JHISSGLW-C4rH_mQM.js} +5 -4
  105. package/dist/renderer/assets/{kanban-definition-UN3LZRKU-BEFtQcFb.js → kanban-definition-UN3LZRKU-DRbrBcWV.js} +3 -2
  106. package/dist/renderer/assets/{layout-CAJgQHdw.js → layout-DZl4n4qu.js} +2 -2
  107. package/dist/renderer/assets/{linear-B2ggJ8Am.js → linear-B0Krxg21.js} +1 -1
  108. package/dist/renderer/assets/{mindmap-definition-RKZ34NQL-DSxVgHB5.js → mindmap-definition-RKZ34NQL-DdmPsWrn.js} +4 -3
  109. package/dist/renderer/assets/{pieDiagram-4H26LBE5-CwYoJBuL.js → pieDiagram-4H26LBE5-BPZLqwG0.js} +5 -4
  110. package/dist/renderer/assets/preload-helper-tXtZnHb0.js +88 -0
  111. package/dist/renderer/assets/{quadrantDiagram-W4KKPZXB-CST9Fvg9.js → quadrantDiagram-W4KKPZXB-Dr-oWRk9.js} +3 -2
  112. package/dist/renderer/assets/{requirementDiagram-4Y6WPE33-DtrH52jS.js → requirementDiagram-4Y6WPE33-B6QZd0lo.js} +4 -3
  113. package/dist/renderer/assets/{sankeyDiagram-5OEKKPKP-ca1tPzJ_.js → sankeyDiagram-5OEKKPKP-Cyl9ojEt.js} +2 -1
  114. package/dist/renderer/assets/{sequenceDiagram-3UESZ5HK-Dfp1EJZ7.js → sequenceDiagram-3UESZ5HK-D48Yr9T6.js} +4 -3
  115. package/dist/renderer/assets/{stateDiagram-AJRCARHV-Bha2QoNB.js → stateDiagram-AJRCARHV-qyb8ETsa.js} +7 -6
  116. package/dist/renderer/assets/{stateDiagram-v2-BHNVJYJU-DWgFUYu1.js → stateDiagram-v2-BHNVJYJU-DmDOyyrJ.js} +5 -4
  117. package/dist/renderer/assets/{timeline-definition-PNZ67QCA-C3h_-OTj.js → timeline-definition-PNZ67QCA-C-KQxTi1.js} +3 -2
  118. package/dist/renderer/assets/{vennDiagram-CIIHVFJN-DFzjSrZi.js → vennDiagram-CIIHVFJN-BdaZlnH-.js} +2 -1
  119. package/dist/renderer/assets/{wardley-L42UT6IY-Cx-VbqoS.js → wardley-L42UT6IY-b-_GPpqL.js} +1 -1
  120. package/dist/renderer/assets/{wardleyDiagram-YWT4CUSO-S2D9XqX6.js → wardleyDiagram-YWT4CUSO-B2hBE-EE.js} +4 -3
  121. package/dist/renderer/assets/web-BKE0SH0E.js +36 -0
  122. package/dist/renderer/assets/web-CBsFp24u.js +564 -0
  123. package/dist/renderer/assets/web-Dc8YgoHP.js +24 -0
  124. package/dist/renderer/assets/web-TfDzToU7.js +58 -0
  125. package/dist/renderer/assets/{xychartDiagram-2RQKCTM6-Cfxigbts.js → xychartDiagram-2RQKCTM6-CSvswDTY.js} +3 -2
  126. package/dist/renderer/index.html +62 -3
  127. package/docs/academic-demo.md +566 -0
  128. package/docs/demo.html +748 -0
  129. package/docs/demo.md +546 -0
  130. package/docs/demo.pdf +0 -0
  131. package/docs/theme-paradigm.md +658 -0
  132. package/electron-builder.yml +7 -0
  133. package/electron.vite.config.js +31 -0
  134. package/electron.vite.config.ts +1 -1
  135. package/ios/App/App/AppDelegate.swift +49 -0
  136. package/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png +0 -0
  137. package/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
  138. package/ios/App/App/Assets.xcassets/Contents.json +6 -0
  139. package/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +23 -0
  140. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  141. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  142. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  143. package/ios/App/App/Base.lproj/LaunchScreen.storyboard +32 -0
  144. package/ios/App/App/Base.lproj/Main.storyboard +19 -0
  145. package/ios/App/App/Info.plist +49 -0
  146. package/ios/App/App.xcodeproj/project.pbxproj +408 -0
  147. package/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  148. package/ios/App/Podfile +28 -0
  149. package/package.json +23 -3
  150. package/resources/templates/slides/template-forest-ink.html +540 -0
  151. package/scripts/generate-icons.js +102 -0
  152. package/src/main/index.ts +87 -63
  153. package/src/preload/index.d.ts +51 -0
  154. package/src/preload/index.js +70 -0
  155. package/src/renderer/capacitor-api.ts +713 -0
  156. package/src/renderer/editor/editor.ts +87 -4
  157. package/src/renderer/editor/plugins/index.ts +24 -32
  158. package/src/renderer/editor/plugins/math-plugin.ts +1 -1
  159. package/src/renderer/editor/plugins/mermaid-plugin-custom.css +13 -398
  160. package/src/renderer/editor/plugins/mermaid-plugin.ts +62 -71
  161. package/src/renderer/editor/plugins/themes/base/dark.css +23 -0
  162. package/src/renderer/editor/plugins/themes/base/elegant.css +32 -0
  163. package/src/renderer/editor/plugins/themes/base/light.css +20 -0
  164. package/src/renderer/editor/plugins/themes/base/newsprint.css +27 -0
  165. package/src/renderer/editor/plugins/themes/components/mermaid/academic.css +43 -0
  166. package/src/renderer/editor/plugins/themes/components/mermaid/dark.css +20 -0
  167. package/src/renderer/editor/plugins/themes/components/mermaid/elegant.css +24 -0
  168. package/src/renderer/editor/plugins/themes/components/mermaid/light.css +21 -0
  169. package/src/renderer/editor/plugins/themes/components/mermaid/newsprint.css +26 -0
  170. package/src/renderer/editor/plugins/themes/components/mermaid/variables.css +592 -0
  171. package/src/renderer/editor/plugins/themes/foundation.css +143 -0
  172. package/src/renderer/editor/plugins/themes/theme-manager.ts +92 -0
  173. package/src/renderer/env.d.ts +4 -1
  174. package/src/renderer/index.html +59 -1
  175. package/src/renderer/main.ts +432 -57
  176. package/src/renderer/mobile.css +429 -0
  177. package/themes/README.md +3 -0
  178. package/themes/academic-paper.css +1321 -0
  179. package/themes/elegant.css +14 -7
  180. package/themes/forest-ink.css +664 -0
  181. package/themes/pixso-design.css +1261 -0
  182. package/themes/swiss-design.css +596 -0
  183. package/themes/template.css +498 -0
  184. package/tsconfig.main.json +1 -0
  185. package/tsconfig.main.tsbuildinfo +1 -0
  186. package/tsconfig.preload.json +1 -0
  187. package/tsconfig.preload.tsbuildinfo +1 -0
  188. package/tsconfig.renderer.json +1 -0
  189. package/tsconfig.renderer.tsbuildinfo +1 -0
  190. package/tsconfig.tsbuildinfo +1 -0
  191. package/.trae/documents/fix-mermaid-colors-and-sankey.md +0 -50
  192. package/src/renderer/themes/theme-manager.ts +0 -40
  193. /package/src/renderer/{themes → editor/plugins/themes}/base.css +0 -0
@@ -0,0 +1,143 @@
1
+ /*
2
+ * ColaMD 主题系统:Foundation (基础层)
3
+ * 职责:全局 CSS 变量定义 + Mermaid 变量抽象 + 排版/颜色/间距语义化
4
+ * 版本:v2.0 (模块化架构)
5
+ */
6
+
7
+ /* ================================================================
8
+ 1. 全局 CSS Reset
9
+ ================================================================ */
10
+ *, *::before, *::after {
11
+ box-sizing: border-box;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+
16
+ html, body {
17
+ height: 100%;
18
+ overflow: hidden;
19
+ }
20
+
21
+ /* ================================================================
22
+ 2. CSS 变量系统 (语义化命名空间)
23
+ 命名规则:
24
+ --color-* 颜色
25
+ --font-* 字体
26
+ --space-* 间距
27
+ --radius-* 圆角
28
+ --mermaid-* Mermaid 图表的变量抽象 (core 20 variables)
29
+ ================================================================ */
30
+ :root {
31
+ /* ---- 2.1 基础排版 ---- */
32
+ --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
33
+ --font-family-heading: var(--font-family-base);
34
+ --font-family-code: 'SF Mono', 'Fira Code', Menlo, Consolas, monospace;
35
+ --font-family-math: var(--font-family-base);
36
+ --font-size-root: 16px;
37
+ --line-height-base: 1.75;
38
+ --font-weight-bold: 600;
39
+
40
+ /* ---- 2.2 语义化颜色 ---- */
41
+ --color-bg: #ffffff;
42
+ --color-text: #24292f;
43
+ --color-text-muted: #656d76;
44
+ --color-border: #d0d7de;
45
+ --color-link: #0969da;
46
+ --color-accent: #6366f1;
47
+ --color-accent-dark: #4f46e5;
48
+ --color-accent-light: #eef2ff;
49
+ --color-selection-bg: rgba(9, 105, 218, 0.15);
50
+
51
+ /* ---- 2.3 代码块 ---- */
52
+ --code-bg: rgba(175, 184, 193, 0.2);
53
+ --code-color: var(--color-accent);
54
+ --code-block-bg: #f6f8fa;
55
+ --code-block-text: var(--color-text);
56
+ --code-block-color: var(--code-block-text);
57
+
58
+ /* ---- 2.4 引用块 ---- */
59
+ --blockquote-bg: transparent;
60
+ --blockquote-border: var(--color-border);
61
+ --blockquote-color: var(--color-text-muted);
62
+
63
+ /* ---- 2.5 表格 ---- */
64
+ --table-header-bg: #f6f8fa;
65
+ --table-border: var(--color-border);
66
+ --table-stripe: rgba(0, 0, 0, 0.03);
67
+ --table-hover-bg: transparent;
68
+
69
+ /* ---- 2.6 分割线 ---- */
70
+ --hr-color: var(--color-border);
71
+
72
+ /* ---- 2.7 滚动条 ---- */
73
+ --scrollbar-width: 6px;
74
+ --scrollbar-thumb: #d1d5db;
75
+ --scrollbar-thumb-hover: #9ca3af;
76
+
77
+ /* ---- 2.8 圆角系统 ---- */
78
+ --radius-sm: 3px;
79
+ --radius-md: 6px;
80
+ --radius-lg: 10px;
81
+ --radius-xl: 16px;
82
+
83
+ /* ================================================================
84
+ 2.9 Mermaid 图表变量抽象 (核心 20 变量体系)
85
+ 每个变量都对应 Mermaid SVG 中的具体视觉属性
86
+ 修改配色只需覆盖这些变量即可
87
+ ================================================================ */
88
+
89
+ /* -- 容器 -- */
90
+ --mermaid-background: var(--code-block-bg);
91
+ --mermaid-border-color: var(--color-border);
92
+ --mermaid-border-radius: var(--radius-md);
93
+ --mermaid-padding: 20px;
94
+
95
+ /* -- 字体 -- */
96
+ --mermaid-font-family: var(--font-family-base);
97
+ --mermaid-font-size: 14px;
98
+
99
+ /* -- 节点 (Node) -- */
100
+ --mermaid-node-stroke: var(--color-border);
101
+ --mermaid-node-fill: var(--code-bg);
102
+ --mermaid-node-text: var(--color-text);
103
+ --mermaid-node-stroke-width: 1.5px;
104
+
105
+ /* -- 连线 (Edge) -- */
106
+ --mermaid-edge-stroke: var(--color-border);
107
+ --mermaid-edge-stroke-width: 1.5px;
108
+
109
+ /* -- 聚类 (Cluster / Subgraph) -- */
110
+ --mermaid-cluster-stroke: var(--color-accent);
111
+ --mermaid-cluster-fill: rgba(99, 102, 241, 0.06);
112
+ --mermaid-cluster-dasharray: 4,4;
113
+
114
+ /* -- 标签 (Labels) -- */
115
+ --mermaid-label-text: var(--color-text);
116
+ --mermaid-label-bg: var(--mermaid-background);
117
+ --mermaid-edge-label-bg: var(--mermaid-background);
118
+ --mermaid-edge-label-text: var(--color-text-muted);
119
+ --mermaid-title-text: var(--color-text);
120
+ --mermaid-axis-text: var(--color-text-muted);
121
+
122
+ /* -- 特殊状态 -- */
123
+ --mermaid-highlight: var(--color-accent);
124
+ --mermaid-person-stroke: var(--color-text);
125
+ --mermaid-person-fill: var(--mermaid-node-fill);
126
+
127
+ /* -- 色板 (Color Scale: 用于 Pie/Gantt/Quadrant 等多色场景) -- */
128
+ --mermaid-cscale0: #6366f1;
129
+ --mermaid-cscale1: #ec4899;
130
+ --mermaid-cscale2: #06b6d4;
131
+ --mermaid-cscale3: #10b981;
132
+ --mermaid-cscale4: #f59e0b;
133
+ --mermaid-cscale5: #f43f5e;
134
+ --mermaid-cscale6: #3b82f6;
135
+ --mermaid-cscale7: #8b5cf6;
136
+ --mermaid-cscale8: #14b8a6;
137
+ --mermaid-cscale9: #eab308;
138
+ --mermaid-cscale10: #84cc16;
139
+ --mermaid-cscale11: #f97316;
140
+
141
+ /* -- 文本偏移 (跨主题通用) -- */
142
+ --mermaid-label-offset-y: -3px;
143
+ }
@@ -0,0 +1,92 @@
1
+ const themes: Record<string, string> = {
2
+ light: 'theme-light',
3
+ dark: 'theme-dark',
4
+ elegant: 'theme-elegant',
5
+ newsprint: 'theme-newsprint'
6
+ }
7
+
8
+ let customStyleEl: HTMLStyleElement | null = null
9
+
10
+ /** 已导入的自定义主题缓存:name → { css, template } */
11
+ const customThemeCache = new Map<string, { css: string; template: string | null }>()
12
+
13
+ /**
14
+ * 从 CSS 中解析 `/* @template: <name> *​/` 指令
15
+ * @param css 导入的自定义 CSS 内容
16
+ * @returns 模版名称(light/dark/elegant/newsprint),无指令返回 null
17
+ */
18
+ function parseTemplateDirective(css: string): string | null {
19
+ const match = css.match(/\/\*\s*@template:\s*(\w+)\s*\*\//)
20
+ return match && themes[match[1]] ? match[1] : null
21
+ }
22
+
23
+ /**
24
+ * 缓存导入的自定义主题 CSS 和模版引用
25
+ * @param name 主题文件名(不含 custom: 前缀)
26
+ * @param css 自定义 CSS 内容
27
+ */
28
+ export function setCachedCustomTheme(name: string, css: string): void {
29
+ const template = parseTemplateDirective(css)
30
+ customThemeCache.set(name, { css, template })
31
+ }
32
+
33
+ /**
34
+ * 获取已缓存的自定义主题信息
35
+ * @param name 主题文件名
36
+ */
37
+ export function getCachedCustomTheme(name: string): { css: string; template: string | null } | undefined {
38
+ return customThemeCache.get(name)
39
+ }
40
+
41
+ /**
42
+ * 应用主题:内建主题添加对应 class,自定义主题注入 CSS 并叠加模版
43
+ * @param name 主题名称(light/dark/elegant/newsprint 或 custom:<name>)
44
+ * @param customCSS 自定义 CSS 内容(可选,导入时传入;切换时从缓存恢复)
45
+ */
46
+ export function applyTheme(name: string, customCSS?: string): void {
47
+ const body = document.body
48
+
49
+ // 移除所有主题 class
50
+ Object.values(themes).forEach(cls => body.classList.remove(cls))
51
+ body.classList.remove('theme-custom')
52
+
53
+ // 移除自定义主题 <style>
54
+ if (customStyleEl) {
55
+ customStyleEl.remove()
56
+ customStyleEl = null
57
+ }
58
+
59
+ if (customCSS || name.startsWith('custom:')) {
60
+ const key = name.startsWith('custom:') ? name.slice(7) : name
61
+
62
+ // 如果传入了新 CSS,更新缓存
63
+ if (customCSS) {
64
+ setCachedCustomTheme(key, customCSS)
65
+ }
66
+
67
+ const cached = customThemeCache.get(key)
68
+
69
+ // 注入自定义 CSS
70
+ if (cached) {
71
+ customStyleEl = document.createElement('style')
72
+ customStyleEl.textContent = cached.css
73
+ document.head.appendChild(customStyleEl)
74
+
75
+ // 如果声明了模版引用,叠加模版 class 作为变量基础
76
+ if (cached.template && themes[cached.template]) {
77
+ body.classList.add(themes[cached.template])
78
+ }
79
+ }
80
+
81
+ body.classList.add('theme-custom')
82
+ } else if (themes[name]) {
83
+ body.classList.add(themes[name])
84
+ }
85
+
86
+ // 持久化主题选择
87
+ localStorage.setItem('colamd-theme', name)
88
+ }
89
+
90
+ export function loadSavedTheme(): string {
91
+ return localStorage.getItem('colamd-theme') || 'elegant'
92
+ }
@@ -1,7 +1,10 @@
1
+ /// <reference types="vite/client" />
1
2
  import type { ElectronAPI } from '../preload/index'
3
+ import type { CapacitorBridgeAPI } from './capacitor-api'
2
4
 
3
5
  declare global {
4
6
  interface Window {
5
- electronAPI: ElectronAPI
7
+ electronAPI?: ElectronAPI
8
+ capacitorAPI?: CapacitorBridgeAPI
6
9
  }
7
10
  }
@@ -3,14 +3,72 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; font-src 'self' data: https:; img-src 'self' data: blob: https: http: file:; connect-src 'self';">
6
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://localhost:*; style-src 'self' 'unsafe-inline' http://localhost:*; font-src 'self' data: https:; img-src 'self' data: blob: https: http: file:; connect-src 'self' ws://localhost:* http://localhost:*;">
7
7
  <title>ColaMD</title>
8
+ <style>
9
+ #menu-btn, #mobile-menu { display: none; }
10
+ </style>
8
11
  </head>
9
12
  <body>
10
13
  <div id="titlebar">
14
+ <button id="menu-btn" title="Menu">
15
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
16
+ <rect y="3" width="20" height="2" rx="1" fill="currentColor"/>
17
+ <rect y="9" width="20" height="2" rx="1" fill="currentColor"/>
18
+ <rect y="15" width="20" height="2" rx="1" fill="currentColor"/>
19
+ </svg>
20
+ </button>
11
21
  <div id="agent-dot"></div>
12
22
  <button id="slides-btn" title="Open as Slides">&#9654;</button>
13
23
  </div>
24
+ <nav id="mobile-menu">
25
+ <div id="menu-overlay"></div>
26
+ <div id="menu-panel">
27
+ <div id="menu-header">
28
+ <span id="menu-title">ColaMD</span>
29
+ <button id="menu-close-btn" title="Close">
30
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
31
+ <line x1="5" y1="5" x2="15" y2="15"/>
32
+ <line x1="15" y1="5" x2="5" y2="15"/>
33
+ </svg>
34
+ </button>
35
+ </div>
36
+ <div id="menu-body">
37
+ <div class="menu-section">
38
+ <div class="menu-section-title">File</div>
39
+ <button class="menu-item" data-action="new">New</button>
40
+ <button class="menu-item" data-action="open">Open...</button>
41
+ <button class="menu-item" data-action="save">Save</button>
42
+ <button class="menu-item" data-action="save-as">Save As...</button>
43
+ </div>
44
+ <div class="menu-section">
45
+ <div class="menu-section-title">Export</div>
46
+ <button class="menu-item" data-action="export-pdf">Export PDF</button>
47
+ <button class="menu-item" data-action="export-html">Export HTML</button>
48
+ <button class="menu-item" data-action="export-slides">Export Slides</button>
49
+ </div>
50
+ <div class="menu-section">
51
+ <div class="menu-section-title">Slides</div>
52
+ <button class="menu-item" data-action="new-slides">New Slides</button>
53
+ <button class="menu-item" data-action="open-as-slides">Open as Slides</button>
54
+ </div>
55
+ <div class="menu-section">
56
+ <div class="menu-section-title">Theme</div>
57
+ <div id="menu-theme-list"></div>
58
+ <button class="menu-item" data-action="import-theme">Import Theme...</button>
59
+ </div>
60
+ <div class="menu-section" id="menu-plugins-section" style="display:none">
61
+ <div class="menu-section-title">Plugins</div>
62
+ <div id="menu-plugin-list"></div>
63
+ </div>
64
+ <div class="menu-section">
65
+ <div class="menu-section-title">About</div>
66
+ <button class="menu-item" data-action="about">About ColaMD</button>
67
+ <button class="menu-item" data-action="exit">Exit</button>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </nav>
14
72
  <div id="editor"></div>
15
73
  <textarea id="source-editor" spellcheck="false"></textarea>
16
74
  <script type="module" src="./main.ts"></script>