@bytechain.cn/colamd 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.github/workflows/release.yml +66 -0
  2. package/.trae/documents/fix-mermaid-colors-and-sankey.md +50 -0
  3. package/CLAUDE.md +87 -0
  4. package/LICENSE +21 -0
  5. package/README.md +540 -0
  6. package/README_CN.md +543 -0
  7. package/demo.md +486 -0
  8. package/dist/main/index.js +735 -0
  9. package/dist/preload/index.js +71 -0
  10. package/dist/renderer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  11. package/dist/renderer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  12. package/dist/renderer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  13. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  14. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  15. package/dist/renderer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  16. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  17. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  18. package/dist/renderer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  19. package/dist/renderer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  20. package/dist/renderer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  21. package/dist/renderer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  22. package/dist/renderer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  23. package/dist/renderer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  24. package/dist/renderer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  25. package/dist/renderer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  26. package/dist/renderer/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  27. package/dist/renderer/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  28. package/dist/renderer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  29. package/dist/renderer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  30. package/dist/renderer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  31. package/dist/renderer/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  32. package/dist/renderer/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  33. package/dist/renderer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  34. package/dist/renderer/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  35. package/dist/renderer/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  36. package/dist/renderer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  37. package/dist/renderer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  38. package/dist/renderer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  39. package/dist/renderer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  40. package/dist/renderer/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  41. package/dist/renderer/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  42. package/dist/renderer/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  43. package/dist/renderer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  44. package/dist/renderer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  45. package/dist/renderer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  46. package/dist/renderer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  47. package/dist/renderer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  48. package/dist/renderer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  49. package/dist/renderer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  50. package/dist/renderer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  51. package/dist/renderer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  52. package/dist/renderer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  53. package/dist/renderer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  54. package/dist/renderer/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  55. package/dist/renderer/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  56. package/dist/renderer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  57. package/dist/renderer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  58. package/dist/renderer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  59. package/dist/renderer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  60. package/dist/renderer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  61. package/dist/renderer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  62. package/dist/renderer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  63. package/dist/renderer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  64. package/dist/renderer/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  65. package/dist/renderer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  66. package/dist/renderer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  67. package/dist/renderer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  68. package/dist/renderer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  69. package/dist/renderer/assets/arc-tTbbM8LO.js +131 -0
  70. package/dist/renderer/assets/architectureDiagram-3BPJPVTR-CEgYow6c.js +8720 -0
  71. package/dist/renderer/assets/blockDiagram-GPEHLZMM-LHyVtPwW.js +3825 -0
  72. package/dist/renderer/assets/c4Diagram-AAUBKEIU-C1P1eJrf.js +2482 -0
  73. package/dist/renderer/assets/channel-upve91Tq.js +7 -0
  74. package/dist/renderer/assets/chunk-2J33WTMH-lag2vhq9.js +24 -0
  75. package/dist/renderer/assets/chunk-4BX2VUAB-BXJ8Ggh-.js +16 -0
  76. package/dist/renderer/assets/chunk-55IACEB6-CiBpxRa1.js +13 -0
  77. package/dist/renderer/assets/chunk-727SXJPM-ODeKQFXC.js +2016 -0
  78. package/dist/renderer/assets/chunk-AQP2D5EJ-BK7xJolB.js +1953 -0
  79. package/dist/renderer/assets/chunk-FMBD7UC4-BxpCZPtz.js +19 -0
  80. package/dist/renderer/assets/chunk-ND2GUHAM-CqqaU9Ue.js +116 -0
  81. package/dist/renderer/assets/chunk-QZHKN3VN-Biq_K124.js +19 -0
  82. package/dist/renderer/assets/classDiagram-4FO5ZUOK-Cq95X99o.js +23 -0
  83. package/dist/renderer/assets/classDiagram-v2-Q7XG4LA2-Cq95X99o.js +23 -0
  84. package/dist/renderer/assets/cose-bilkent-S5V4N54A-XasiD0bu.js +4942 -0
  85. package/dist/renderer/assets/cytoscape.esm-CpHeHM5e.js +30269 -0
  86. package/dist/renderer/assets/dagre-BM42HDAG-Nq84Gfx4.js +705 -0
  87. package/dist/renderer/assets/defaultLocale-B2RvLBDe.js +206 -0
  88. package/dist/renderer/assets/diagram-2AECGRRQ-DwuB1GWt.js +301 -0
  89. package/dist/renderer/assets/diagram-5GNKFQAL-C2tgeI1h.js +169 -0
  90. package/dist/renderer/assets/diagram-KO2AKTUF-D5KzjNBc.js +632 -0
  91. package/dist/renderer/assets/diagram-LMA3HP47-C12xHS1c.js +212 -0
  92. package/dist/renderer/assets/diagram-OG6HWLK6-CnxI9oEa.js +851 -0
  93. package/dist/renderer/assets/erDiagram-TEJ5UH35-D_uPaKwn.js +1227 -0
  94. package/dist/renderer/assets/flowDiagram-I6XJVG4X-B6q_1-tE.js +2332 -0
  95. package/dist/renderer/assets/ganttDiagram-6RSMTGT7-CFo7ifF9.js +3720 -0
  96. package/dist/renderer/assets/gitGraphDiagram-PVQCEYII-WSexHTnq.js +1373 -0
  97. package/dist/renderer/assets/graph-DyX_9f6d.js +1988 -0
  98. package/dist/renderer/assets/index-DW7LS8C1.js +72292 -0
  99. package/dist/renderer/assets/index-dyHEFYvY.css +2184 -0
  100. package/dist/renderer/assets/infoDiagram-5YYISTIA-DaeJdLRq.js +31 -0
  101. package/dist/renderer/assets/init-ZxktEp_H.js +16 -0
  102. package/dist/renderer/assets/ishikawaDiagram-YF4QCWOH-DDCZc35f.js +967 -0
  103. package/dist/renderer/assets/journeyDiagram-JHISSGLW-BEdmpAgl.js +1255 -0
  104. package/dist/renderer/assets/kanban-definition-UN3LZRKU-BEFtQcFb.js +1052 -0
  105. package/dist/renderer/assets/layout-CAJgQHdw.js +2610 -0
  106. package/dist/renderer/assets/linear-B2ggJ8Am.js +340 -0
  107. package/dist/renderer/assets/mindmap-definition-RKZ34NQL-DSxVgHB5.js +1180 -0
  108. package/dist/renderer/assets/ordinal-DSZU4PqD.js +76 -0
  109. package/dist/renderer/assets/pieDiagram-4H26LBE5-CwYoJBuL.js +246 -0
  110. package/dist/renderer/assets/quadrantDiagram-W4KKPZXB-CST9Fvg9.js +1344 -0
  111. package/dist/renderer/assets/requirementDiagram-4Y6WPE33-DtrH52jS.js +1204 -0
  112. package/dist/renderer/assets/sankeyDiagram-5OEKKPKP-ca1tPzJ_.js +1274 -0
  113. package/dist/renderer/assets/sequenceDiagram-3UESZ5HK-Dfp1EJZ7.js +4514 -0
  114. package/dist/renderer/assets/stateDiagram-AJRCARHV-Bha2QoNB.js +450 -0
  115. package/dist/renderer/assets/stateDiagram-v2-BHNVJYJU-DWgFUYu1.js +21 -0
  116. package/dist/renderer/assets/timeline-definition-PNZ67QCA-C3h_-OTj.js +1596 -0
  117. package/dist/renderer/assets/vennDiagram-CIIHVFJN-DFzjSrZi.js +2486 -0
  118. package/dist/renderer/assets/wardley-L42UT6IY-Cx-VbqoS.js +30699 -0
  119. package/dist/renderer/assets/wardleyDiagram-YWT4CUSO-S2D9XqX6.js +975 -0
  120. package/dist/renderer/assets/xychartDiagram-2RQKCTM6-Cfxigbts.js +1932 -0
  121. package/dist/renderer/index.html +19 -0
  122. package/docs/agent-diff-view.md +48 -0
  123. package/electron-builder.yml +57 -0
  124. package/electron.vite.config.ts +30 -0
  125. package/package.json +40 -0
  126. package/resources/entitlements.mac.plist +12 -0
  127. package/resources/icon.icns +0 -0
  128. package/resources/icon.png +0 -0
  129. package/resources/icon.svg +23 -0
  130. package/resources/templates/slides/icon.png +0 -0
  131. package/resources/templates/slides/slides-template.md +74 -0
  132. package/resources/templates/slides/template.html +535 -0
  133. package/scripts/afterPack.js +13 -0
  134. package/src/main/index.ts +881 -0
  135. package/src/preload/index.ts +110 -0
  136. package/src/renderer/editor/editor.ts +204 -0
  137. package/src/renderer/editor/html-view.ts +15 -0
  138. package/src/renderer/editor/plugins/index.ts +76 -0
  139. package/src/renderer/editor/plugins/math-plugin.ts +297 -0
  140. package/src/renderer/editor/plugins/mermaid-plugin-custom.css +431 -0
  141. package/src/renderer/editor/plugins/mermaid-plugin-dark.css +428 -0
  142. package/src/renderer/editor/plugins/mermaid-plugin-elegant.css +443 -0
  143. package/src/renderer/editor/plugins/mermaid-plugin-newsprint.css +208 -0
  144. package/src/renderer/editor/plugins/mermaid-plugin.css +111 -0
  145. package/src/renderer/editor/plugins/mermaid-plugin.ts +679 -0
  146. package/src/renderer/env.d.ts +7 -0
  147. package/src/renderer/index.html +18 -0
  148. package/src/renderer/main.ts +303 -0
  149. package/src/renderer/themes/base.css +509 -0
  150. package/src/renderer/themes/theme-manager.ts +40 -0
  151. package/themes/README.md +280 -0
  152. package/themes/elegant.css +664 -0
  153. package/themes/guizang.css +732 -0
  154. package/tsconfig.json +14 -0
  155. package/tsconfig.main.json +11 -0
  156. package/tsconfig.preload.json +11 -0
  157. package/tsconfig.renderer.json +12 -0
@@ -0,0 +1,509 @@
1
+ *, *::before, *::after {
2
+ box-sizing: border-box;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
6
+
7
+ html, body {
8
+ height: 100%;
9
+ overflow: hidden;
10
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
11
+ background: var(--bg-color);
12
+ color: var(--text-color);
13
+ }
14
+
15
+ #titlebar {
16
+ -webkit-app-region: drag;
17
+ height: 52px;
18
+ flex-shrink: 0;
19
+ position: relative;
20
+ }
21
+
22
+ #agent-dot {
23
+ position: absolute;
24
+ top: 22px;
25
+ right: 16px;
26
+ width: 8px;
27
+ height: 8px;
28
+ border-radius: 50%;
29
+ background: var(--text-muted);
30
+ opacity: 0.3;
31
+ -webkit-app-region: no-drag;
32
+ transition: background 0.3s ease, opacity 0.3s ease;
33
+ }
34
+
35
+ #slides-btn {
36
+ position: absolute;
37
+ top: 14px;
38
+ right: 32px;
39
+ width: 28px;
40
+ height: 28px;
41
+ border-radius: 6px;
42
+ border: none;
43
+ background: transparent;
44
+ color: var(--text-muted);
45
+ font-size: 13px;
46
+ cursor: pointer;
47
+ display: none;
48
+ align-items: center;
49
+ justify-content: center;
50
+ -webkit-app-region: no-drag;
51
+ transition: background 0.15s, color 0.15s;
52
+ }
53
+
54
+ #slides-btn:hover {
55
+ background: var(--accent-soft, rgba(241,117,45,0.12));
56
+ color: #F1752D;
57
+ }
58
+
59
+ #slides-btn.visible {
60
+ display: flex;
61
+ }
62
+
63
+ #agent-dot.active {
64
+ background: #e8913a;
65
+ opacity: 1;
66
+ animation: agent-breathe 2s ease-in-out infinite;
67
+ }
68
+
69
+ #agent-dot.cooldown {
70
+ background: #3dba5c;
71
+ opacity: 1;
72
+ animation: none;
73
+ }
74
+
75
+ @keyframes agent-breathe {
76
+ 0%, 100% { opacity: 0.45; transform: scale(0.95); }
77
+ 50% { opacity: 1; transform: scale(1.05); }
78
+ }
79
+
80
+ #editor {
81
+ height: calc(100vh - 52px);
82
+ overflow-y: auto;
83
+ padding: 0 40px 40px;
84
+ }
85
+
86
+ #source-editor {
87
+ display: none;
88
+ height: calc(100vh - 52px);
89
+ width: 100%;
90
+ padding: 40px;
91
+ box-sizing: border-box;
92
+ border: none;
93
+ outline: none;
94
+ resize: none;
95
+ background: var(--bg-color);
96
+ color: var(--text-color);
97
+ font-family: 'SF Mono', 'Fira Code', Menlo, Monaco, monospace;
98
+ font-size: 14px;
99
+ line-height: 1.7;
100
+ tab-size: 2;
101
+ }
102
+
103
+ #source-editor.visible {
104
+ display: block;
105
+ }
106
+
107
+ #editor.hidden {
108
+ display: none;
109
+ }
110
+
111
+ #editor .ProseMirror {
112
+ outline: none;
113
+ max-width: 780px;
114
+ margin: 0 auto;
115
+ min-height: calc(100vh - 92px);
116
+ font-size: 16px;
117
+ line-height: 1.75;
118
+ color: var(--text-color);
119
+ }
120
+
121
+ #editor .ProseMirror > * + * {
122
+ margin-top: 0.75em;
123
+ }
124
+
125
+ /* Typography */
126
+ #editor .ProseMirror h1 {
127
+ font-size: 2em;
128
+ font-weight: 700;
129
+ margin-top: 1.5em;
130
+ margin-bottom: 0.5em;
131
+ line-height: 1.25;
132
+ padding-bottom: 0.3em;
133
+ border-bottom: 1px solid var(--border-color);
134
+ }
135
+
136
+ #editor .ProseMirror h2 {
137
+ font-size: 1.5em;
138
+ font-weight: 600;
139
+ margin-top: 1.25em;
140
+ margin-bottom: 0.5em;
141
+ line-height: 1.3;
142
+ padding-bottom: 0.25em;
143
+ border-bottom: 1px solid var(--border-color);
144
+ }
145
+
146
+ #editor .ProseMirror h3 {
147
+ font-size: 1.25em;
148
+ font-weight: 600;
149
+ margin-top: 1em;
150
+ margin-bottom: 0.5em;
151
+ }
152
+
153
+ #editor .ProseMirror h4,
154
+ #editor .ProseMirror h5,
155
+ #editor .ProseMirror h6 {
156
+ font-weight: 600;
157
+ margin-top: 1em;
158
+ margin-bottom: 0.5em;
159
+ }
160
+
161
+ #editor .ProseMirror p {
162
+ margin: 0.5em 0;
163
+ }
164
+
165
+ #editor .ProseMirror a {
166
+ color: var(--link-color);
167
+ text-decoration: none;
168
+ }
169
+
170
+ #editor .ProseMirror a:hover {
171
+ text-decoration: underline;
172
+ }
173
+
174
+ #editor .ProseMirror strong {
175
+ font-weight: 600;
176
+ }
177
+
178
+ /* Code */
179
+ #editor .ProseMirror code {
180
+ background: var(--code-bg);
181
+ padding: 2px 6px;
182
+ border-radius: 3px;
183
+ font-size: 0.875em;
184
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
185
+ }
186
+
187
+ #editor .ProseMirror pre {
188
+ background: var(--code-block-bg);
189
+ color: var(--code-block-text, var(--text-color));
190
+ padding: 16px;
191
+ border-radius: 6px;
192
+ overflow-x: auto;
193
+ margin: 1em 0;
194
+ }
195
+
196
+ #editor .ProseMirror pre code {
197
+ background: none;
198
+ padding: 0;
199
+ font-size: 0.875em;
200
+ line-height: 1.6;
201
+ }
202
+
203
+ /* Blockquote */
204
+ #editor .ProseMirror blockquote {
205
+ border-left: 4px solid var(--blockquote-border);
206
+ padding-left: 16px;
207
+ margin: 1em 0;
208
+ color: var(--text-muted);
209
+ }
210
+
211
+ /* Lists */
212
+ #editor .ProseMirror ul,
213
+ #editor .ProseMirror ol {
214
+ padding-left: 24px;
215
+ margin: 0.5em 0;
216
+ }
217
+
218
+ #editor .ProseMirror li {
219
+ margin: 0.25em 0;
220
+ }
221
+
222
+ #editor .ProseMirror li > p {
223
+ margin: 0;
224
+ }
225
+
226
+ /* Table */
227
+ #editor .ProseMirror table {
228
+ border-collapse: collapse;
229
+ width: 100%;
230
+ margin: 1em 0;
231
+ }
232
+
233
+ #editor .ProseMirror th,
234
+ #editor .ProseMirror td {
235
+ border: 1px solid var(--border-color);
236
+ padding: 8px 12px;
237
+ text-align: left;
238
+ }
239
+
240
+ #editor .ProseMirror th {
241
+ background: var(--table-header-bg);
242
+ font-weight: 600;
243
+ }
244
+
245
+ /* HR */
246
+ #editor .ProseMirror hr {
247
+ border: none;
248
+ border-top: 2px solid var(--border-color);
249
+ margin: 2em 0;
250
+ }
251
+
252
+ /* Image */
253
+ #editor .ProseMirror img {
254
+ max-width: 100%;
255
+ border-radius: 4px;
256
+ }
257
+
258
+ #editor .ProseMirror ::selection {
259
+ background: var(--selection-bg);
260
+ }
261
+
262
+ /* ======= THEMES ======= */
263
+
264
+ body, body.theme-light {
265
+ --bg-color: #ffffff;
266
+ --text-color: #24292f;
267
+ --text-muted: #656d76;
268
+ --border-color: #d0d7de;
269
+ --link-color: #0969da;
270
+ --code-bg: rgba(175, 184, 193, 0.2);
271
+ --code-block-bg: #f6f8fa;
272
+ --blockquote-border: #d0d7de;
273
+ --table-header-bg: #f6f8fa;
274
+ --selection-bg: rgba(9, 105, 218, 0.15);
275
+ }
276
+
277
+ body.theme-dark {
278
+ --bg-color: #0d1117;
279
+ --text-color: #e6edf3;
280
+ --text-muted: #8b949e;
281
+ --border-color: #30363d;
282
+ --link-color: #58a6ff;
283
+ --code-bg: rgba(110, 118, 129, 0.3);
284
+ --code-block-bg: #161b22;
285
+ --blockquote-border: #30363d;
286
+ --table-header-bg: #161b22;
287
+ --selection-bg: rgba(88, 166, 255, 0.2);
288
+ }
289
+
290
+ body.theme-elegant {
291
+ --bg-color: #f0edea;
292
+ --text-color: #2c2c2c;
293
+ --text-muted: #777;
294
+ --border-color: #d8d3ce;
295
+ --link-color: #c44b2b;
296
+ --code-bg: #e0d8cf;
297
+ --code-block-bg: #e8e2db;
298
+ --code-block-text: #3d3530;
299
+ --blockquote-border: #c44b2b;
300
+ --blockquote-bg: #eae6e1;
301
+ --table-header-bg: #eae6e1;
302
+ --table-border: #d8d3ce;
303
+ --selection-bg: rgba(196, 75, 43, 0.2);
304
+ }
305
+
306
+ body.theme-elegant #editor .ProseMirror {
307
+ font-family: 'LXGW WenKai', 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', Georgia, serif;
308
+ line-height: 1.9;
309
+ }
310
+
311
+ body.theme-elegant #editor .ProseMirror strong {
312
+ color: #c44b2b;
313
+ }
314
+
315
+ body.theme-elegant #editor .ProseMirror code {
316
+ color: #c44b2b;
317
+ }
318
+
319
+ body.theme-elegant #editor .ProseMirror pre {
320
+ color: var(--code-block-text);
321
+ }
322
+
323
+ body.theme-elegant #editor .ProseMirror pre code {
324
+ color: inherit;
325
+ }
326
+
327
+ body.theme-elegant #editor .ProseMirror blockquote {
328
+ background: var(--blockquote-bg);
329
+ padding: 15px 20px 15px 25px;
330
+ }
331
+
332
+ body.theme-elegant #editor .ProseMirror table th {
333
+ border-bottom: 2px solid #c44b2b;
334
+ }
335
+
336
+ body.theme-elegant #editor .ProseMirror table td {
337
+ border-left: none;
338
+ border-right: none;
339
+ }
340
+
341
+ body.theme-newsprint {
342
+ --bg-color: #f5f2eb;
343
+ --text-color: #1a1a1a;
344
+ --text-muted: #666;
345
+ --border-color: #d4d0c8;
346
+ --link-color: #2c5f8a;
347
+ --code-bg: rgba(0, 0, 0, 0.05);
348
+ --code-block-bg: #eae6de;
349
+ --blockquote-border: #999;
350
+ --table-header-bg: #eae6de;
351
+ --selection-bg: rgba(44, 95, 138, 0.15);
352
+ }
353
+
354
+ body.theme-newsprint #editor .ProseMirror {
355
+ font-family: 'PT Serif', Georgia, serif;
356
+ }
357
+
358
+ /* Scrollbar */
359
+ ::-webkit-scrollbar {
360
+ width: 6px;
361
+ }
362
+
363
+ ::-webkit-scrollbar-track {
364
+ background: transparent;
365
+ }
366
+
367
+ ::-webkit-scrollbar-thumb {
368
+ background: var(--border-color);
369
+ border-radius: 3px;
370
+ }
371
+
372
+ /* Math blocks */
373
+ .math-inline {
374
+ display: inline;
375
+ padding: 2px 4px;
376
+ border-radius: 3px;
377
+ background: var(--code-bg);
378
+ cursor: default;
379
+ }
380
+
381
+ .math-inline .katex {
382
+ font-size: 1.1em;
383
+ }
384
+
385
+ .math-block {
386
+ display: block;
387
+ padding: 0.875em;
388
+ margin: 1em 0;
389
+ border-radius: 6px;
390
+ background: var(--code-block-bg);
391
+ text-align: center;
392
+ overflow-x: auto;
393
+ }
394
+
395
+ .math-block .katex {
396
+ font-size: 1.2em;
397
+ }
398
+
399
+ /* Dark theme: KaTeX color overrides */
400
+ body.theme-dark .math-inline,
401
+ body.theme-dark .math-block {
402
+ color: var(--text-color);
403
+ }
404
+
405
+ body.theme-dark .katex {
406
+ color: var(--text-color);
407
+ }
408
+
409
+ body.theme-dark .katex .mord,
410
+ body.theme-dark .katex .mbin,
411
+ body.theme-dark .katex .mrel,
412
+ body.theme-dark .katex .mopen,
413
+ body.theme-dark .katex .mclose,
414
+ body.theme-dark .katex .mpunct,
415
+ body.theme-dark .katex .minner {
416
+ color: var(--text-color);
417
+ }
418
+
419
+ /* KaTeX scrollbar in block math for dark theme */
420
+ body.theme-dark .math-block::-webkit-scrollbar-thumb {
421
+ background: #30363d;
422
+ }
423
+
424
+ body.theme-elegant .math-block::-webkit-scrollbar-thumb {
425
+ background: #c4bbb0;
426
+ }
427
+
428
+ /* Elegant theme: KaTeX color overrides */
429
+ body.theme-elegant .math-inline,
430
+ body.theme-elegant .math-block {
431
+ color: var(--text-color);
432
+ }
433
+
434
+ body.theme-elegant .katex {
435
+ color: #3d3530;
436
+ }
437
+
438
+ body.theme-elegant .katex .mord,
439
+ body.theme-elegant .katex .mbin,
440
+ body.theme-elegant .katex .mrel,
441
+ body.theme-elegant .katex .mopen,
442
+ body.theme-elegant .katex .mclose,
443
+ body.theme-elegant .katex .mpunct,
444
+ body.theme-elegant .katex .minner {
445
+ color: #3d3530;
446
+ }
447
+
448
+ /* Plugin raw mode — editable inputs */
449
+ .math-inline-raw {
450
+ width: auto;
451
+ min-width: 60px;
452
+ border: 1px solid var(--border-color);
453
+ border-radius: 4px;
454
+ padding: 2px 6px;
455
+ font-size: 0.875em;
456
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
457
+ color: var(--text-color);
458
+ background: var(--code-bg);
459
+ outline: none;
460
+ }
461
+ .math-inline-raw:focus {
462
+ border-color: var(--link-color);
463
+ }
464
+
465
+ textarea.math-block-raw {
466
+ width: 100%;
467
+ min-height: 60px;
468
+ border: 1px solid var(--border-color);
469
+ border-radius: 6px;
470
+ padding: 14px;
471
+ font-size: 0.875em;
472
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
473
+ color: var(--code-block-text, var(--text-color));
474
+ background: var(--code-block-bg);
475
+ outline: none;
476
+ resize: vertical;
477
+ line-height: 1.6;
478
+ white-space: pre-wrap;
479
+ }
480
+ textarea.math-block-raw:focus {
481
+ border-color: var(--link-color);
482
+ }
483
+
484
+ /* Inline context menu for PNG export */
485
+ #cola-context-menu {
486
+ position: fixed;
487
+ display: none;
488
+ z-index: 99999;
489
+ background: var(--bg-color);
490
+ border: 1px solid var(--border-color);
491
+ border-radius: 6px;
492
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
493
+ padding: 4px;
494
+ min-width: 180px;
495
+ }
496
+
497
+ .cola-menu-item {
498
+ padding: 6px 16px;
499
+ border-radius: 4px;
500
+ cursor: pointer;
501
+ font-size: 13px;
502
+ color: var(--text-color);
503
+ white-space: nowrap;
504
+ }
505
+
506
+ .cola-menu-item:hover {
507
+ background: var(--accent-soft, rgba(241, 117, 45, 0.12));
508
+ color: #F1752D;
509
+ }
@@ -0,0 +1,40 @@
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
+ export function applyTheme(name: string, customCSS?: string): void {
11
+ const body = document.body
12
+
13
+ // Remove all theme classes
14
+ Object.values(themes).forEach(cls => body.classList.remove(cls))
15
+ body.classList.remove('theme-custom')
16
+
17
+ // Remove custom theme style
18
+ if (customStyleEl) {
19
+ customStyleEl.remove()
20
+ customStyleEl = null
21
+ }
22
+
23
+ if (customCSS || name.startsWith('custom:')) {
24
+ if (customCSS) {
25
+ customStyleEl = document.createElement('style')
26
+ customStyleEl.textContent = customCSS
27
+ document.head.appendChild(customStyleEl)
28
+ }
29
+ body.classList.add('theme-custom')
30
+ } else if (themes[name]) {
31
+ body.classList.add(themes[name])
32
+ }
33
+
34
+ // Persist theme choice
35
+ localStorage.setItem('colamd-theme', name)
36
+ }
37
+
38
+ export function loadSavedTheme(): string {
39
+ return localStorage.getItem('colamd-theme') || 'elegant'
40
+ }