@lancc/cmark 1.1.0 → 1.2.1

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 (139) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +21 -21
  3. package/README.md +54 -82
  4. package/assets/abnfDiagram-WEYOIA3C-CKV_7Upb.js +1 -0
  5. package/assets/architectureDiagram-ZHVYKT53-BvLudDvk.js +1 -0
  6. package/assets/blockDiagram-RJAE7QA3--gzkMGi2.js +1 -0
  7. package/assets/c4Diagram-XDPPPE54-ByfRiJGR.js +1 -0
  8. package/assets/chunk-2E7WHVMD-TfbC_dmh.js +1 -0
  9. package/assets/chunk-2Q5K7J3B-0YJgChVo.js +1 -0
  10. package/assets/chunk-4EMNKR2T-DHoYW7g5.js +1 -0
  11. package/assets/chunk-55XCU76K-Cq25Yw_G.js +1 -0
  12. package/assets/chunk-5VM5RSS4-CJaRXFHK.js +1 -0
  13. package/assets/chunk-JWPE2WC7-BP2iXBhe.js +1 -0
  14. package/assets/chunk-VQ5W62QI-B95zur4F.js +1 -0
  15. package/assets/chunk-XXDRQBXY-Ct0MhvQo.js +1 -0
  16. package/assets/chunk-ZCHMQSOR-C5VhW-wL.js +2 -0
  17. package/assets/classDiagram-v2-4MYWR3UA-C1G-Vkj0.js +1 -0
  18. package/assets/cose-bilkent-JH36ORCC-qIQoIBv0.js +1 -0
  19. package/assets/cynefin-EF2NZ3EQ-CR1E3YiZ.js +1 -0
  20. package/assets/cynefinDiagram-WF24UDRP-DaJFvZ3b.js +1 -0
  21. package/assets/cytoscape.esm-SjxgSg6I.js +9 -0
  22. package/assets/dagre-NK4GIZVX-BFRQhpii.js +1 -0
  23. package/assets/diagram-CBK3MWTC-DlueL6XZ.js +1 -0
  24. package/assets/diagram-I5XIIV2D-bITyafYX.js +1 -0
  25. package/assets/diagram-ODIL2UCW-Dlb4hg_-.js +1 -0
  26. package/assets/diagram-PFBEJUXE-CRfen0O7.js +1 -0
  27. package/assets/diagram-RJA3I4VV-CK-FlhGV.js +1 -0
  28. package/assets/diagram-TYUNFSNR-DmgVsxqa.js +1 -0
  29. package/assets/ebnfDiagram-V4P3TTPT-B9KGI9eQ.js +1 -0
  30. package/assets/echarts-CytsvCdp.js +25 -0
  31. package/assets/elk-QONTBCTQ-VgDftvsU.js +1 -0
  32. package/assets/erDiagram-KYQIGQAA-DkpP7sS4.js +1 -0
  33. package/assets/flowDiagram-IUGLLWBU-CRXa9Kxy.js +1 -0
  34. package/assets/ganttDiagram-R7GPNTJY-Cu2I55Wb.js +1 -0
  35. package/assets/gitGraphDiagram-PDYL7XHY-CwSo663I.js +1 -0
  36. package/assets/graph-Dz7AM1Q5.js +1 -0
  37. package/assets/index-BJ-NdQc4.js +100 -0
  38. package/assets/index-eB_q_VA3.css +1 -0
  39. package/assets/infoDiagram-MVDRKAX5-D3Qknzuo.js +1 -0
  40. package/assets/ishikawaDiagram-HPEHV2GE-9qYT75tk.js +1 -0
  41. package/assets/journeyDiagram-BOSHW7O7-DeSrJg9o.js +1 -0
  42. package/assets/kanban-definition-FNSA4HC5-DINkB6G7.js +1 -0
  43. package/assets/katex-DN8cTsI3.js +1 -0
  44. package/assets/markdown-S2mWvoE-.js +5 -0
  45. package/assets/mermaid-T_6Ze_cT.js +7 -0
  46. package/assets/mindmap-definition-6OY57UG3-DW5hqiAe.js +1 -0
  47. package/assets/pegDiagram-ECIUJNBX-BWy_tkzy.js +1 -0
  48. package/assets/pieDiagram-GNMPY74T-CniJbr6l.js +1 -0
  49. package/assets/quadrantDiagram-D57K4MC3-BVnDJkCv.js +1 -0
  50. package/assets/railroadDiagram-Y72NRBL7-BNKZpJJb.js +1 -0
  51. package/assets/requirementDiagram-EQYSW5RA-BETipHj0.js +1 -0
  52. package/assets/sankeyDiagram-SY24JHO5-ByEYqT7T.js +1 -0
  53. package/assets/sequenceDiagram-BLEHNHQU-BqCJ2tKG.js +1 -0
  54. package/assets/sizeCapture-INFHLROL-DlhrWFj-.js +1 -0
  55. package/assets/stateDiagram-v2-A6IESKWZ-DJUBWLTP.js +1 -0
  56. package/assets/swimlanes-B3ENRKFQ-D7k7tF5U.js +1 -0
  57. package/assets/swimlanesDiagram-AYQRV4AK-DoQBgB9o.js +1 -0
  58. package/assets/timeline-definition-JXYKGLGB-BCNhwnn6.js +1 -0
  59. package/assets/usecaseDiagram-WPOLBNNX-DRa_Rgl3.js +1 -0
  60. package/assets/vennDiagram-Q3Y3IDCW-Ba2eaO68.js +1 -0
  61. package/assets/wardleyDiagram-IVAIDKWA-W_i9vzY-.js +1 -0
  62. package/assets/xychartDiagram-4URNHDU4-ByfaGjvc.js +1 -0
  63. package/export-file/github-markdown.css +549 -549
  64. package/export-file/index.html +32 -32
  65. package/index.html +4 -4
  66. package/logo.png +0 -0
  67. package/package.json +1 -1
  68. package/plugin.json +8 -218
  69. package/preload/branch-bar.js +44 -2
  70. package/preload/export-css.js +59 -0
  71. package/preload/git-panel.js +102 -23
  72. package/preload/git-service.js +99 -6
  73. package/preload/host.js +130 -0
  74. package/preload/remote-setup.js +425 -0
  75. package/preload/remote-wizard.js +330 -0
  76. package/preload/rename-note.js +4 -5
  77. package/preload/services.js +6 -15
  78. package/preload/settings-panel.js +468 -356
  79. package/preload/ws-prefs.js +55 -0
  80. package/preload.js +291 -6
  81. package/assets/abnfDiagram-WEYOIA3C-BgXsTF7a.js +0 -1
  82. package/assets/architectureDiagram-ZHVYKT53-BsCWa_qC.js +0 -36
  83. package/assets/blockDiagram-RJAE7QA3-wbIxEiYN.js +0 -140
  84. package/assets/c4Diagram-XDPPPE54-5zdyxFvA.js +0 -38
  85. package/assets/chunk-2E7WHVMD-F85Lca-i.js +0 -88
  86. package/assets/chunk-2Q5K7J3B-CjpAZ0OI.js +0 -1
  87. package/assets/chunk-4EMNKR2T-C8Kbh83c.js +0 -1
  88. package/assets/chunk-55XCU76K-BINcFiLN.js +0 -1
  89. package/assets/chunk-5VM5RSS4-Diy5h2LS.js +0 -15
  90. package/assets/chunk-JWPE2WC7-BXnjDdh1.js +0 -1
  91. package/assets/chunk-VQ5W62QI-BM7ZZo1I.js +0 -1
  92. package/assets/chunk-XXDRQBXY-CW8CjB1w.js +0 -1
  93. package/assets/chunk-ZCHMQSOR-C7ATz1L1.js +0 -2
  94. package/assets/classDiagram-v2-4MYWR3UA-CMoqNk-b.js +0 -217
  95. package/assets/cose-bilkent-JH36ORCC-6rqR5iJk.js +0 -1
  96. package/assets/cynefin-EF2NZ3EQ-DypLIJxl.js +0 -141
  97. package/assets/cynefinDiagram-WF24UDRP-8b2CEBlR.js +0 -62
  98. package/assets/cytoscape.esm-CjX6Hyah.js +0 -331
  99. package/assets/dagre-NK4GIZVX-Dv6vuUbR.js +0 -4
  100. package/assets/diagram-CBK3MWTC-DJgMDeYd.js +0 -24
  101. package/assets/diagram-I5XIIV2D-BB9cMoRW.js +0 -24
  102. package/assets/diagram-ODIL2UCW-BVcRtsdy.js +0 -30
  103. package/assets/diagram-PFBEJUXE-BbGSOtJx.js +0 -3
  104. package/assets/diagram-RJA3I4VV-CzkY_8Fo.js +0 -41
  105. package/assets/diagram-TYUNFSNR-YTl5QdfL.js +0 -200
  106. package/assets/ebnfDiagram-V4P3TTPT-COVjPAjE.js +0 -1
  107. package/assets/echarts-BAPDkhe3.js +0 -61
  108. package/assets/elk-QONTBCTQ-DHsjY8Z_.js +0 -27
  109. package/assets/erDiagram-KYQIGQAA-CUAbTUl1.js +0 -99
  110. package/assets/flowDiagram-IUGLLWBU-CWsiqTQC.js +0 -213
  111. package/assets/ganttDiagram-R7GPNTJY-DetBW0Wm.js +0 -292
  112. package/assets/gitGraphDiagram-PDYL7XHY-ByrdgJmw.js +0 -106
  113. package/assets/graph-D8UmR1vK.js +0 -1
  114. package/assets/index-BLONSItV.css +0 -1
  115. package/assets/index-Cz6qaZbV.js +0 -744
  116. package/assets/infoDiagram-MVDRKAX5-BM48fjhU.js +0 -2
  117. package/assets/ishikawaDiagram-HPEHV2GE-DtHYywHZ.js +0 -70
  118. package/assets/journeyDiagram-BOSHW7O7-DJ1LiRh3.js +0 -139
  119. package/assets/kanban-definition-FNSA4HC5-DPPt8pwJ.js +0 -89
  120. package/assets/katex-CQL9J12G.js +0 -257
  121. package/assets/markdown-DVehI1Sg.js +0 -314
  122. package/assets/mermaid-C_q9pug0.js +0 -312
  123. package/assets/mindmap-definition-6OY57UG3-zbqYOEY6.js +0 -98
  124. package/assets/pegDiagram-ECIUJNBX-e7QG7TMq.js +0 -1
  125. package/assets/pieDiagram-GNMPY74T-Duf6YP0N.js +0 -39
  126. package/assets/quadrantDiagram-D57K4MC3-B2eYoUUy.js +0 -7
  127. package/assets/railroadDiagram-Y72NRBL7-BWCzPcI_.js +0 -1
  128. package/assets/requirementDiagram-EQYSW5RA-HhPMEqB1.js +0 -84
  129. package/assets/sankeyDiagram-SY24JHO5-CMUTwFBB.js +0 -40
  130. package/assets/sequenceDiagram-BLEHNHQU-C9wR2ll7.js +0 -169
  131. package/assets/sizeCapture-INFHLROL-DXfz37S6.js +0 -1
  132. package/assets/stateDiagram-v2-A6IESKWZ-D_gtonhE.js +0 -291
  133. package/assets/swimlanes-B3ENRKFQ-DdJOuuMV.js +0 -1
  134. package/assets/swimlanesDiagram-AYQRV4AK-BWt3HxHV.js +0 -8
  135. package/assets/timeline-definition-JXYKGLGB-DQsdwJe-.js +0 -120
  136. package/assets/usecaseDiagram-WPOLBNNX-DTRyFq7d.js +0 -370
  137. package/assets/vennDiagram-Q3Y3IDCW-dihYszm0.js +0 -34
  138. package/assets/wardleyDiagram-IVAIDKWA-BoPpgYfK.js +0 -78
  139. package/assets/xychartDiagram-4URNHDU4-DoLjYxeB.js +0 -7
@@ -1,33 +1,33 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <style>
6
- html, body { margin: 0; padding: 0; background-color: #ffffff; overflow: hidden; }
7
- .markdown-body { box-sizing: border-box; min-width: 200px; max-width: 980px; margin: 0 auto; padding: 45px; }
8
- .markdown-body table { overflow: hidden!important; word-break: break-all; }
9
- .markdown-body pre { overflow: hidden!important; }
10
- @media (max-width: 767px) { .markdown-body { padding: 15px; } }
11
- </style>
12
- <link rel="stylesheet" href="./github-markdown.css">
13
- <link rel="stylesheet" href="../katex.min.css">
14
- </head>
15
- <body>
16
- <article class="markdown-body"></article>
17
- <script>
18
- window.waitAllImageLoaded = () => {
19
- return new Promise(resolve => {
20
- if (document.images.length === 0) return resolve()
21
- const timeout = setTimeout(() => { resolve() }, 10000)
22
- Promise.all(Array.from(document.images)
23
- .filter(img => !img.complete)
24
- .map(img => new Promise(resolve => { img.onload = img.onerror = resolve })))
25
- .then(() => {
26
- clearTimeout(timeout)
27
- resolve()
28
- })
29
- })
30
- }
31
- </script>
32
- </body>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <style>
6
+ html, body { margin: 0; padding: 0; background-color: #ffffff; overflow: hidden; }
7
+ .markdown-body { box-sizing: border-box; min-width: 200px; max-width: 980px; margin: 0 auto; padding: 45px; }
8
+ .markdown-body table { overflow: hidden!important; word-break: break-all; }
9
+ .markdown-body pre { overflow: hidden!important; }
10
+ @media (max-width: 767px) { .markdown-body { padding: 15px; } }
11
+ </style>
12
+ <link rel="stylesheet" href="./github-markdown.css">
13
+ <link rel="stylesheet" href="../katex.min.css">
14
+ </head>
15
+ <body>
16
+ <article class="markdown-body"></article>
17
+ <script>
18
+ window.waitAllImageLoaded = () => {
19
+ return new Promise(resolve => {
20
+ if (document.images.length === 0) return resolve()
21
+ const timeout = setTimeout(() => { resolve() }, 10000)
22
+ Promise.all(Array.from(document.images)
23
+ .filter(img => !img.complete)
24
+ .map(img => new Promise(resolve => { img.onload = img.onerror = resolve })))
25
+ .then(() => {
26
+ clearTimeout(timeout)
27
+ resolve()
28
+ })
29
+ })
30
+ }
31
+ </script>
32
+ </body>
33
33
  </html>
package/index.html CHANGED
@@ -4,10 +4,10 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>CMark</title>
7
- <script type="module" crossorigin src="./assets/index-Cz6qaZbV.js"></script>
8
- <link rel="modulepreload" crossorigin href="./assets/markdown-DVehI1Sg.js">
9
- <link rel="modulepreload" crossorigin href="./assets/mermaid-C_q9pug0.js">
10
- <link rel="stylesheet" crossorigin href="./assets/index-BLONSItV.css">
7
+ <script type="module" crossorigin src="./assets/index-BJ-NdQc4.js"></script>
8
+ <link rel="modulepreload" crossorigin href="./assets/markdown-S2mWvoE-.js">
9
+ <link rel="modulepreload" crossorigin href="./assets/mermaid-T_6Ze_cT.js">
10
+ <link rel="stylesheet" crossorigin href="./assets/index-eB_q_VA3.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
package/logo.png CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lancc/cmark",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "CMark —— 本地 Markdown 笔记,用 git 同步",
5
5
  "keywords": [
6
6
  "markdown",
package/plugin.json CHANGED
@@ -2,9 +2,15 @@
2
2
  "name": "cmark",
3
3
  "pluginName": "CMark",
4
4
  "title": "CMark",
5
- "version": "1.1.0",
5
+ "version": "1.2.1",
6
6
  "description": "本地 Markdown 笔记,用 Git 管理版本、同步多端",
7
7
  "author": "Lancc",
8
+ "homepage": "https://github.com/LanccBy2016/cmark",
9
+ "platform": [
10
+ "win32",
11
+ "darwin",
12
+ "linux"
13
+ ],
8
14
  "main": "index.html",
9
15
  "preload": "preload.js",
10
16
  "logo": "logo.png",
@@ -21,221 +27,5 @@
21
27
  "cm"
22
28
  ]
23
29
  }
24
- ],
25
- "tools": {
26
- "markdown_render": {
27
- "description": "将 Markdown 文本渲染为图片或 PDF 文件,用于可视化展示或文档导出。\n\n支持扩展语法(可直接使用):\n- Mermaid 图表:```mermaid 代码块\n- ECharts 图表:```echarts 代码块\n- LaTeX 数学公式:$...$(行内)、$$...$$(块级)\n- 任务列表:- [ ] / - [x]\n- 高亮标记:==text==\n- 多语言代码高亮:```js / ```python 等\n\n当需要生成包含图表、流程图、公式或代码展示的内容时优先使用此工具。\n输入内容将被直接渲染,请确保语法正确。",
28
- "inputSchema": {
29
- "type": "object",
30
- "additionalProperties": false,
31
- "properties": {
32
- "markdown": {
33
- "type": "string",
34
- "description": "Markdown 原文内容"
35
- },
36
- "format": {
37
- "type": "string",
38
- "enum": [
39
- "image",
40
- "pdf"
41
- ],
42
- "description": "输出格式:image(图片)或 pdf(文档)"
43
- }
44
- },
45
- "required": [
46
- "markdown",
47
- "format"
48
- ]
49
- },
50
- "outputSchema": {
51
- "type": "object",
52
- "properties": {
53
- "filePath": {
54
- "type": "string",
55
- "description": "生成文件的本地路径"
56
- }
57
- },
58
- "required": [
59
- "filePath"
60
- ]
61
- }
62
- },
63
- "markdown_notes_search": {
64
- "description": "搜索 Markdown 笔记(标题和正文),返回匹配结果摘要,不包含完整正文。",
65
- "inputSchema": {
66
- "type": "object",
67
- "additionalProperties": false,
68
- "properties": {
69
- "query": {
70
- "type": "string",
71
- "description": "搜索关键词"
72
- },
73
- "limit": {
74
- "type": "integer",
75
- "description": "返回结果数量上限",
76
- "default": 10,
77
- "minimum": 1,
78
- "maximum": 50
79
- }
80
- },
81
- "required": [
82
- "query"
83
- ]
84
- },
85
- "outputSchema": {
86
- "type": "object",
87
- "properties": {
88
- "notes": {
89
- "type": "array",
90
- "description": "匹配的笔记摘要列表",
91
- "items": {
92
- "type": "object",
93
- "properties": {
94
- "id": {
95
- "type": "string",
96
- "description": "笔记唯一 ID"
97
- },
98
- "title": {
99
- "type": "string",
100
- "description": "笔记标题"
101
- },
102
- "snippet": {
103
- "type": "string",
104
- "description": "匹配内容摘要"
105
- },
106
- "matchedField": {
107
- "type": "string",
108
- "enum": [
109
- "title",
110
- "content"
111
- ],
112
- "description": "命中的字段"
113
- },
114
- "createAt": {
115
- "type": "integer",
116
- "description": "创建时间戳(毫秒)"
117
- },
118
- "updateAt": {
119
- "type": "integer",
120
- "description": "最后修改时间戳(毫秒)"
121
- },
122
- "wordCount": {
123
- "type": "integer",
124
- "description": "正文字数"
125
- }
126
- },
127
- "required": [
128
- "id",
129
- "title",
130
- "snippet",
131
- "matchedField"
132
- ]
133
- }
134
- },
135
- "hasMore": {
136
- "type": "boolean",
137
- "description": "是否还有更多结果"
138
- }
139
- },
140
- "required": [
141
- "notes",
142
- "total"
143
- ]
144
- }
145
- },
146
- "markdown_notes_get": {
147
- "description": "获取笔记内容。支持获取原始 Markdown 文本或将笔记内容渲染为图片/PDF 文件。",
148
- "inputSchema": {
149
- "type": "object",
150
- "additionalProperties": false,
151
- "properties": {
152
- "id": {
153
- "type": "string",
154
- "description": "笔记唯一 ID"
155
- },
156
- "format": {
157
- "type": "string",
158
- "enum": [
159
- "text",
160
- "image",
161
- "pdf"
162
- ],
163
- "default": "text",
164
- "description": "输出格式:'text' 返回 Markdown 源码;'image'/'pdf' 返回渲染后的本地文件路径。"
165
- }
166
- },
167
- "required": [
168
- "id"
169
- ]
170
- },
171
- "outputSchema": {
172
- "type": "object",
173
- "properties": {
174
- "id": {
175
- "type": "string"
176
- },
177
- "title": {
178
- "type": "string",
179
- "description": "笔记标题"
180
- },
181
- "updateAt": {
182
- "type": "integer",
183
- "description": "最后修改时间戳(毫秒)"
184
- },
185
- "content": {
186
- "type": "string",
187
- "description": "笔记的 Markdown 源码。仅在 format 为 text 时提供。"
188
- },
189
- "filePath": {
190
- "type": "string",
191
- "description": "渲染文件的绝对路径。仅在 format 为 image 或 pdf 时提供。"
192
- },
193
- "mimeType": {
194
- "type": "string",
195
- "description": "内容的标准 MIME 类型(如 text/markdown, image/png, application/pdf)"
196
- }
197
- },
198
- "required": [
199
- "id",
200
- "title"
201
- ]
202
- }
203
- },
204
- "markdown_notes_create": {
205
- "description": "创建一条新的 Markdown 笔记",
206
- "inputSchema": {
207
- "type": "object",
208
- "additionalProperties": false,
209
- "properties": {
210
- "title": {
211
- "type": "string",
212
- "maxLength": 50,
213
- "description": "笔记标题"
214
- },
215
- "content": {
216
- "type": "string",
217
- "description": "笔记内容(Markdown 源码)"
218
- }
219
- },
220
- "required": [
221
- "title",
222
- "content"
223
- ]
224
- },
225
- "outputSchema": {
226
- "type": "object",
227
- "properties": {
228
- "success": {
229
- "type": "boolean",
230
- "description": "是否成功"
231
- },
232
- "message": {
233
- "type": "string",
234
- "description": "结果说明"
235
- }
236
- }
237
- }
238
- }
239
- },
240
- "homepage": "https://github.com/LanccBy2016/cmark"
30
+ ]
241
31
  }
@@ -25,8 +25,10 @@ module.exports = function installBranchBar (win) {
25
25
  var busy = false
26
26
 
27
27
  function $(id) { return doc.getElementById(id) }
28
+ // 不再发 Windows 系统通知(成功失败都打扰)。这条旧版分支条已由 React 版
29
+ // BranchBar.tsx 取代,这里保留空实现只为不破坏内部调用点。
28
30
  function toast (text) {
29
- try { win.ztools.showNotification(text) } catch (e) {}
31
+ void text
30
32
  }
31
33
 
32
34
  function injectCss () {
@@ -35,7 +37,7 @@ module.exports = function installBranchBar (win) {
35
37
  '.sidebar-body{padding-top:36px !important;}',
36
38
  '#' + ROOT + '{position:absolute;top:0;left:0;right:0;height:36px;z-index:6;display:flex;align-items:center;gap:4px;',
37
39
  ' padding:0 8px;box-sizing:border-box;--bfg:#1f2328;--bbd:#e2e6eb;--bsoft:#f4f6f8;--bsub:#7b838d;}',
38
- '@media (prefers-color-scheme:dark){#' + ROOT + '{--bfg:#e6e9ee;--bbd:#3a4149;--bsoft:#2a2f35;--bsub:#8b939e;}}',
40
+ ":root[data-theme='dark'] #" + ROOT + '{--bfg:#e6edf3;--bbd:#30363d;--bsoft:#22272e;--bsub:#8b949e;}',
39
41
  '#' + ROOT + ' .zbb-branch{flex:1;min-width:0;display:flex;align-items:center;gap:5px;height:26px;padding:0 7px;',
40
42
  ' border:1px solid var(--bbd);border-radius:7px;background:transparent;color:var(--bfg);font-size:12px;cursor:pointer;',
41
43
  ' font-family:inherit;transition:background .14s,border-color .14s;}',
@@ -48,6 +50,10 @@ module.exports = function installBranchBar (win) {
48
50
  ' border:1px solid var(--bbd);border-radius:7px;background:transparent;color:var(--bfg);cursor:pointer;opacity:.8;',
49
51
  ' transition:background .14s,opacity .14s;}',
50
52
  '#' + ROOT + ' .zbb-btn:hover{background:var(--bsoft);opacity:1;}',
53
+ '#' + ROOT + '.is-off{opacity:.45;filter:grayscale(1);}',
54
+ '#' + ROOT + '.is-off > *{pointer-events:none;}',
55
+ '#zbb-lock{position:absolute;top:0;left:0;right:0;height:36px;z-index:7;display:none;cursor:not-allowed;}',
56
+ '#zbb-lock.on{display:block;}',
51
57
  '#' + ROOT + ' .zbb-btn:disabled{opacity:.35;cursor:default;}',
52
58
  '#' + ROOT + ' .zbb-btn.busy svg{animation:zbb-spin 1s linear infinite;}',
53
59
  '@keyframes zbb-spin{to{transform:rotate(360deg)}}'
@@ -65,6 +71,24 @@ module.exports = function installBranchBar (win) {
65
71
  sync: '<svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor"><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46A7.93 7.93 0 0 0 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74A7.93 7.93 0 0 0 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></svg>'
66
72
  }
67
73
 
74
+ function gitEnabled () {
75
+ // 优先用 preload 的配置接口(file:// 下 localStorage 可能不可用)
76
+ try {
77
+ const v = win.__CMARK_GIT && win.__CMARK_GIT.get ? win.__CMARK_GIT.get() : undefined
78
+ if (v === true || v === false) return v
79
+ } catch (e) {}
80
+ try { return win.localStorage.getItem('cmark-git-enabled') !== '0' } catch (e) { return true }
81
+ }
82
+
83
+ function applyGitGate () {
84
+ var root = doc.getElementById(ROOT)
85
+ if (!root) return
86
+ var on = gitEnabled()
87
+ root.classList.toggle('is-off', !on)
88
+ var lock = doc.getElementById('zbb-lock')
89
+ if (lock) lock.classList.toggle('on', !on)
90
+ }
91
+
68
92
  function mount () {
69
93
  if (doc.getElementById(ROOT)) return true
70
94
  var sb = doc.querySelector('.sidebar-body')
@@ -83,6 +107,12 @@ module.exports = function installBranchBar (win) {
83
107
  '<button class="zbb-btn" type="button" id="zbb-sync" title="同步(拉取然后推送)">' + ICON.sync + '</button>'
84
108
  ].join('')
85
109
  sb.insertBefore(root, sb.firstChild)
110
+ // Git 集成关掉时整条操作栏置灰、不可点,用覆盖层给出悬浮提示
111
+ var lock = doc.createElement('div')
112
+ lock.id = 'zbb-lock'
113
+ lock.title = '请在设置中开启 Git 集成'
114
+ sb.insertBefore(lock, root.nextSibling)
115
+ applyGitGate()
86
116
 
87
117
  // 左边按钮 = 打开「工作区变更记录」面板
88
118
  $('zbb-open').onclick = function () {
@@ -149,6 +179,18 @@ module.exports = function installBranchBar (win) {
149
179
  })
150
180
  }
151
181
 
182
+ // 供变更面板在 push/pull/sync 之后主动刷新顶部分支与脏标记,
183
+ // 否则要等下一次轮询(约 3 秒)才更新
184
+ try { win.__zbbRefresh = function () { try { refreshState(false) } catch (e) {} } } catch (e) {}
185
+
186
+ // 设置里切换 Git 集成、或窗口重新可见时,同步整条操作栏的可用状态
187
+ try { win.addEventListener('cmark-git-changed', applyGitGate) } catch (e) {}
188
+ try {
189
+ doc.addEventListener('visibilitychange', function () {
190
+ if (doc.visibilityState === 'visible') applyGitGate()
191
+ })
192
+ } catch (e) {}
193
+
152
194
  if (!mount()) {
153
195
  var tries = 0
154
196
  var timer = setInterval(function () {
@@ -0,0 +1,59 @@
1
+ /**
2
+ * 导出文档样式(浅/深两套)
3
+ * preload.js 与 preload/services.js 共用同一份,避免两套实现漂移
4
+ */
5
+ /* 导出文档样式:浅/深两套,跟随当前主题。
6
+ * 之前只写了寥寥几条规则 —— 导出后标题层级、表格、代码高亮、高亮标记全丢;
7
+ * 深色主题下更是浅色壳配深色文字,几乎不可读。 */
8
+ function exportDocCss(theme) {
9
+ const dark = theme === 'dark'
10
+ const c = dark
11
+ ? { bg: '#0d1117', fg: '#e6edf3', muted: '#8b949e', bd: '#30363d', codeBg: '#161b22',
12
+ th: '#161b22', markBg: '#6b5200', markFg: '#ffe08a', accent: '#58a6ff',
13
+ kw: '#ff7b72', str: '#a5d6ff', num: '#79c0ff', fn: '#d2a8ff', vr: '#ffa657', cm: '#8b949e', tag: '#7ee787' }
14
+ : { bg: '#ffffff', fg: '#1f2328', muted: '#57606a', bd: '#d0d7de', codeBg: '#f6f8fa',
15
+ th: '#f6f8fa', markBg: '#fff3b8', markFg: '#6b4a00', accent: '#0969da',
16
+ kw: '#cf222e', str: '#0a3069', num: '#0550ae', fn: '#8250df', vr: '#953800', cm: '#6e7781', tag: '#116329' }
17
+ return [
18
+ ':root{color-scheme:' + (dark ? 'dark' : 'light') + '}',
19
+ 'body{margin:0;background:' + c.bg + ';color:' + c.fg + ';font:16px/1.75 -apple-system,"Segoe UI",system-ui,"Microsoft YaHei",sans-serif;-webkit-font-smoothing:antialiased}',
20
+ '.markdown-body{box-sizing:border-box;max-width:980px;margin:0 auto;padding:45px}',
21
+ '@media (max-width:767px){.markdown-body{padding:18px}}',
22
+ '.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:1.4em 0 .6em;font-weight:600;line-height:1.3}',
23
+ '.markdown-body h1{font-size:2em}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}',
24
+ '.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.9em}',
25
+ '.markdown-body h6{font-size:.85em;color:' + c.muted + '}',
26
+ '.markdown-body h1,.markdown-body h2{border-bottom:1px solid ' + c.bd + ';padding-bottom:.3em}',
27
+ '.markdown-body p{margin:0 0 .85em}',
28
+ '.markdown-body ul,.markdown-body ol{margin:0 0 .85em;padding-left:1.6em}',
29
+ '.markdown-body li{margin:.25em 0}',
30
+ '.markdown-body li>input[type=checkbox]{margin-right:.4em}',
31
+ '.markdown-body hr{height:1px;border:0;background:' + c.bd + ';margin:1.6em 0}',
32
+ '.markdown-body a{color:' + c.accent + ';text-decoration:none}',
33
+ '.markdown-body blockquote{margin:0 0 .85em;padding:.2em 1em;color:' + c.muted + ';border-left:3px solid ' + c.bd + '}',
34
+ '.markdown-body code{background:' + c.codeBg + ';border-radius:4px;padding:.2em .4em;font-size:.9em;font-family:"Cascadia Code",Consolas,"Courier New",monospace}',
35
+ '.markdown-body pre{background:' + c.codeBg + ';border-radius:8px;padding:14px 16px;overflow:auto;line-height:1.6}',
36
+ '.markdown-body pre code{background:none;padding:0;font-size:.9em}',
37
+ '.markdown-body table{border-collapse:collapse;margin:0 0 1em;display:block;overflow:auto}',
38
+ '.markdown-body th,.markdown-body td{border:1px solid ' + c.bd + ';padding:6px 12px}',
39
+ '.markdown-body th{background:' + c.th + ';font-weight:600}',
40
+ '.markdown-body img{max-width:100%}',
41
+ '.markdown-body mark{background:' + c.markBg + ';color:' + c.markFg + ';border-radius:3px;padding:0 2px}',
42
+ '.markdown-body .token.comment,.markdown-body .token.prolog,.markdown-body .token.doctype,.markdown-body .token.cdata{color:' + c.cm + '}',
43
+ '.markdown-body .token.punctuation{color:' + c.fg + '}',
44
+ '.markdown-body .token.keyword,.markdown-body .token.atrule{color:' + c.kw + '}',
45
+ '.markdown-body .token.string,.markdown-body .token.char,.markdown-body .token.attr-name{color:' + c.str + '}',
46
+ '.markdown-body .token.number,.markdown-body .token.boolean,.markdown-body .token.constant,.markdown-body .token.property{color:' + c.num + '}',
47
+ '.markdown-body .token.function,.markdown-body .token.class-name{color:' + c.fn + '}',
48
+ '.markdown-body .token.variable,.markdown-body .token.regex,.markdown-body .token.important{color:' + c.vr + '}',
49
+ '.markdown-body .token.tag,.markdown-body .token.inserted{color:' + c.tag + '}',
50
+ ].join('\n')
51
+ }
52
+
53
+ function exportDocColors(theme) {
54
+ return theme === 'dark'
55
+ ? { bg: '#0d1117', fg: '#e6edf3' }
56
+ : { bg: '#ffffff', fg: '#1f2328' }
57
+ }
58
+
59
+ module.exports = { exportDocCss, exportDocColors }