@wonderwhy-er/desktop-commander 0.2.37 → 0.2.39

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 (383) hide show
  1. package/README.md +290 -100
  2. package/dist/command-manager.js +6 -3
  3. package/dist/config-field-definitions.d.ts +41 -0
  4. package/dist/config-field-definitions.js +37 -0
  5. package/dist/config-manager.d.ts +2 -0
  6. package/dist/config-manager.js +22 -2
  7. package/dist/handlers/filesystem-handlers.d.ts +5 -0
  8. package/dist/handlers/filesystem-handlers.js +19 -12
  9. package/dist/remote-device/desktop-commander-integration.js +1 -1
  10. package/dist/remote-device/remote-channel.js +1 -1
  11. package/dist/search-manager.js +31 -38
  12. package/dist/server.js +11 -4
  13. package/dist/terminal-manager.js +4 -2
  14. package/dist/tools/config.d.ts +71 -0
  15. package/dist/tools/config.js +117 -2
  16. package/dist/tools/edit.js +34 -1
  17. package/dist/tools/filesystem.js +91 -3
  18. package/dist/tools/improved-process-tools.js +2 -1
  19. package/dist/tools/schemas.d.ts +3 -0
  20. package/dist/tools/schemas.js +1 -0
  21. package/dist/types.d.ts +0 -1
  22. package/dist/ui/config-editor/app.d.ts +43 -0
  23. package/dist/ui/config-editor/app.js +840 -0
  24. package/dist/ui/config-editor/array-modal.d.ts +19 -0
  25. package/dist/ui/config-editor/array-modal.js +185 -0
  26. package/dist/ui/config-editor/config-editor-runtime.js +150 -0
  27. package/dist/ui/config-editor/index.html +13 -0
  28. package/dist/ui/config-editor/main.js +2 -0
  29. package/dist/ui/config-editor/src/App.d.ts +43 -0
  30. package/dist/ui/config-editor/src/App.js +840 -0
  31. package/dist/ui/config-editor/src/array-modal.d.ts +19 -0
  32. package/dist/ui/config-editor/src/array-modal.js +185 -0
  33. package/dist/ui/config-editor/src/components/layout.d.ts +4 -0
  34. package/dist/ui/config-editor/src/components/layout.js +83 -0
  35. package/dist/ui/config-editor/src/components/toolbar.d.ts +1 -0
  36. package/dist/ui/config-editor/src/components/toolbar.js +21 -0
  37. package/dist/ui/config-editor/src/config-values.d.ts +6 -0
  38. package/dist/ui/config-editor/src/config-values.js +61 -0
  39. package/dist/ui/config-editor/src/contracts.d.ts +14 -0
  40. package/dist/ui/config-editor/src/contracts.js +3 -0
  41. package/dist/ui/config-editor/src/directory-browser.d.ts +6 -0
  42. package/dist/ui/config-editor/src/directory-browser.js +71 -0
  43. package/dist/ui/config-editor/src/layout.d.ts +5 -0
  44. package/dist/ui/config-editor/src/layout.js +90 -0
  45. package/dist/ui/config-editor/src/main.js +2 -0
  46. package/dist/ui/config-editor/src/parsing.d.ts +5 -0
  47. package/dist/ui/config-editor/src/parsing.js +50 -0
  48. package/dist/ui/config-editor/src/toolbar.d.ts +1 -0
  49. package/dist/ui/config-editor/src/toolbar.js +18 -0
  50. package/dist/ui/config-editor/src/types.d.ts +17 -0
  51. package/dist/ui/config-editor/src/types.js +3 -0
  52. package/dist/ui/config-editor/src/utils/config-values.d.ts +9 -0
  53. package/dist/ui/config-editor/src/utils/config-values.js +61 -0
  54. package/dist/ui/config-editor/src/utils/directory-browser.d.ts +31 -0
  55. package/dist/ui/config-editor/src/utils/directory-browser.js +201 -0
  56. package/dist/ui/config-editor/src/utils/parsing.d.ts +8 -0
  57. package/dist/ui/config-editor/src/utils/parsing.js +50 -0
  58. package/dist/ui/config-editor/styles.css +587 -0
  59. package/dist/ui/file-preview/app.d.ts +8 -0
  60. package/dist/ui/file-preview/app.js +2020 -0
  61. package/dist/ui/file-preview/components/code-viewer.d.ts +6 -0
  62. package/dist/ui/file-preview/components/code-viewer.js +73 -0
  63. package/dist/ui/file-preview/components/highlighting.d.ts +2 -0
  64. package/dist/ui/file-preview/components/highlighting.js +54 -0
  65. package/dist/ui/file-preview/components/html-renderer.d.ts +5 -0
  66. package/dist/ui/file-preview/components/html-renderer.js +47 -0
  67. package/dist/ui/file-preview/components/markdown-renderer.d.ts +1 -0
  68. package/dist/ui/file-preview/components/markdown-renderer.js +67 -0
  69. package/dist/ui/file-preview/components/toolbar.d.ts +6 -0
  70. package/dist/ui/file-preview/components/toolbar.js +75 -0
  71. package/dist/ui/file-preview/image-preview.d.ts +3 -0
  72. package/dist/ui/file-preview/image-preview.js +21 -0
  73. package/dist/ui/file-preview/main.js +5 -0
  74. package/dist/ui/file-preview/markdown/editor.d.ts +36 -0
  75. package/dist/ui/file-preview/markdown/editor.js +643 -0
  76. package/dist/ui/file-preview/markdown/linking.d.ts +9 -0
  77. package/dist/ui/file-preview/markdown/linking.js +210 -0
  78. package/dist/ui/file-preview/markdown/outline.d.ts +7 -0
  79. package/dist/ui/file-preview/markdown/outline.js +40 -0
  80. package/dist/ui/file-preview/markdown/preview.d.ts +8 -0
  81. package/dist/ui/file-preview/markdown/preview.js +33 -0
  82. package/dist/ui/file-preview/markdown/slugify.d.ts +3 -0
  83. package/dist/ui/file-preview/markdown/slugify.js +31 -0
  84. package/dist/ui/file-preview/markdown/toc.d.ts +11 -0
  85. package/dist/ui/file-preview/markdown/toc.js +75 -0
  86. package/dist/ui/file-preview/markdown/utils.d.ts +1 -0
  87. package/dist/ui/file-preview/markdown/utils.js +15 -0
  88. package/dist/ui/file-preview/markdown/workspace-controller.d.ts +25 -0
  89. package/dist/ui/file-preview/markdown/workspace-controller.js +40 -0
  90. package/dist/ui/file-preview/preview-runtime.js +399 -13969
  91. package/dist/ui/file-preview/shared/preview-file-types.d.ts +1 -1
  92. package/dist/ui/file-preview/shared/preview-file-types.js +3 -1
  93. package/dist/ui/file-preview/src/App.d.ts +4 -0
  94. package/dist/ui/file-preview/src/App.js +564 -0
  95. package/dist/ui/file-preview/src/components/CodeViewer.d.ts +6 -0
  96. package/dist/ui/file-preview/src/components/CodeViewer.js +60 -0
  97. package/dist/ui/file-preview/src/components/HtmlRenderer.d.ts +8 -0
  98. package/dist/ui/file-preview/src/components/HtmlRenderer.js +45 -0
  99. package/dist/ui/file-preview/src/components/MarkdownRenderer.d.ts +1 -0
  100. package/dist/ui/file-preview/src/components/MarkdownRenderer.js +15 -0
  101. package/dist/ui/file-preview/src/components/editor-toolbar.d.ts +15 -0
  102. package/dist/ui/file-preview/src/components/editor-toolbar.js +384 -0
  103. package/dist/ui/file-preview/src/components/html-renderer.d.ts +1 -5
  104. package/dist/ui/file-preview/src/components/html-renderer.js +11 -27
  105. package/dist/ui/file-preview/src/components/markdown-editor.d.ts +29 -0
  106. package/dist/ui/file-preview/src/components/markdown-editor.js +535 -0
  107. package/dist/ui/file-preview/src/components/markdown-renderer.js +47 -9
  108. package/dist/ui/file-preview/src/directory-controller.d.ts +8 -0
  109. package/dist/ui/file-preview/src/directory-controller.js +233 -0
  110. package/dist/ui/file-preview/src/document-layout.d.ts +20 -0
  111. package/dist/ui/file-preview/src/document-layout.js +109 -0
  112. package/dist/ui/file-preview/src/document-outline.d.ts +17 -0
  113. package/dist/ui/file-preview/src/document-outline.js +97 -0
  114. package/dist/ui/file-preview/src/document-workspace.d.ts +19 -0
  115. package/dist/ui/file-preview/src/document-workspace.js +33 -0
  116. package/dist/ui/file-preview/src/file-type-handlers.d.ts +10 -0
  117. package/dist/ui/file-preview/src/file-type-handlers.js +98 -0
  118. package/dist/ui/file-preview/src/host/external-actions.d.ts +19 -0
  119. package/dist/ui/file-preview/src/host/external-actions.js +94 -0
  120. package/dist/ui/file-preview/src/host/selection-context.d.ts +9 -0
  121. package/dist/ui/file-preview/src/host/selection-context.js +106 -0
  122. package/dist/ui/file-preview/src/markdown/block-merge.d.ts +25 -0
  123. package/dist/ui/file-preview/src/markdown/block-merge.js +86 -0
  124. package/dist/ui/file-preview/src/markdown/conflict-dialog.d.ts +40 -0
  125. package/dist/ui/file-preview/src/markdown/conflict-dialog.js +163 -0
  126. package/dist/ui/file-preview/src/markdown/controller.d.ts +38 -0
  127. package/dist/ui/file-preview/src/markdown/controller.js +921 -0
  128. package/dist/ui/file-preview/src/markdown/editor.d.ts +35 -0
  129. package/dist/ui/file-preview/src/markdown/editor.js +691 -0
  130. package/dist/ui/file-preview/src/markdown/link-modal.d.ts +13 -0
  131. package/dist/ui/file-preview/src/markdown/link-modal.js +213 -0
  132. package/dist/ui/file-preview/src/markdown/linking.d.ts +16 -0
  133. package/dist/ui/file-preview/src/markdown/linking.js +228 -0
  134. package/dist/ui/file-preview/src/markdown/outline.d.ts +2 -0
  135. package/dist/ui/file-preview/src/markdown/outline.js +16 -0
  136. package/dist/ui/file-preview/src/markdown/parser.d.ts +30 -0
  137. package/dist/ui/file-preview/src/markdown/parser.js +38 -0
  138. package/dist/ui/file-preview/src/markdown/preview.d.ts +1 -0
  139. package/dist/ui/file-preview/src/markdown/preview.js +20 -0
  140. package/dist/ui/file-preview/src/markdown/raw-editor.d.ts +8 -0
  141. package/dist/ui/file-preview/src/markdown/raw-editor.js +61 -0
  142. package/dist/ui/file-preview/src/markdown/selection-toolbar.d.ts +14 -0
  143. package/dist/ui/file-preview/src/markdown/selection-toolbar.js +128 -0
  144. package/dist/ui/file-preview/src/markdown/slugify.d.ts +3 -0
  145. package/dist/ui/file-preview/src/markdown/slugify.js +31 -0
  146. package/dist/ui/file-preview/src/markdown/toc.d.ts +11 -0
  147. package/dist/ui/file-preview/src/markdown/toc.js +75 -0
  148. package/dist/ui/file-preview/src/markdown/utils.d.ts +1 -0
  149. package/dist/ui/file-preview/src/markdown/utils.js +15 -0
  150. package/dist/ui/file-preview/src/markdown-workspace/editor.d.ts +36 -0
  151. package/dist/ui/file-preview/src/markdown-workspace/editor.js +643 -0
  152. package/dist/ui/file-preview/src/markdown-workspace/linking.d.ts +9 -0
  153. package/dist/ui/file-preview/src/markdown-workspace/linking.js +210 -0
  154. package/dist/ui/file-preview/src/markdown-workspace/outline.d.ts +7 -0
  155. package/dist/ui/file-preview/src/markdown-workspace/outline.js +40 -0
  156. package/dist/ui/file-preview/src/markdown-workspace/preview.d.ts +8 -0
  157. package/dist/ui/file-preview/src/markdown-workspace/preview.js +33 -0
  158. package/dist/ui/file-preview/src/markdown-workspace/slugify.d.ts +3 -0
  159. package/dist/ui/file-preview/src/markdown-workspace/slugify.js +31 -0
  160. package/dist/ui/file-preview/src/markdown-workspace/toc.d.ts +11 -0
  161. package/dist/ui/file-preview/src/markdown-workspace/toc.js +75 -0
  162. package/dist/ui/file-preview/src/markdown-workspace/utils.d.ts +1 -0
  163. package/dist/ui/file-preview/src/markdown-workspace/utils.js +15 -0
  164. package/dist/ui/file-preview/src/markdown-workspace/workspace-controller.d.ts +25 -0
  165. package/dist/ui/file-preview/src/markdown-workspace/workspace-controller.js +40 -0
  166. package/dist/ui/file-preview/src/model.d.ts +34 -0
  167. package/dist/ui/file-preview/src/panel-actions.d.ts +17 -0
  168. package/dist/ui/file-preview/src/panel-actions.js +182 -0
  169. package/dist/ui/file-preview/src/path-utils.d.ts +6 -0
  170. package/dist/ui/file-preview/src/path-utils.js +64 -0
  171. package/dist/ui/file-preview/src/payload-utils.d.ts +11 -0
  172. package/dist/ui/file-preview/src/payload-utils.js +94 -0
  173. package/dist/ui/file-preview/styles.css +1144 -277
  174. package/dist/ui/file-preview/types.d.ts +1 -0
  175. package/dist/ui/file-preview/types.js +1 -0
  176. package/dist/ui/resources.d.ts +7 -0
  177. package/dist/ui/resources.js +16 -2
  178. package/dist/ui/server-integration.d.ts +13 -0
  179. package/dist/ui/server-integration.js +31 -0
  180. package/dist/ui/shared/ToolHeader.d.ts +9 -0
  181. package/dist/ui/shared/ToolHeader.js +29 -0
  182. package/dist/ui/shared/app-bootstrap.d.ts +9 -0
  183. package/dist/ui/shared/app-bootstrap.js +15 -0
  184. package/dist/ui/shared/compact-row.d.ts +11 -0
  185. package/dist/ui/shared/compact-row.js +18 -0
  186. package/dist/ui/shared/guards.d.ts +1 -0
  187. package/dist/ui/shared/guards.js +3 -0
  188. package/dist/ui/shared/host-context.d.ts +15 -0
  189. package/dist/ui/shared/host-context.js +51 -0
  190. package/dist/ui/shared/host-lifecycle.d.ts +1 -0
  191. package/dist/ui/shared/host-lifecycle.js +8 -2
  192. package/dist/ui/shared/tool-bridge.d.ts +30 -0
  193. package/dist/ui/shared/tool-bridge.js +137 -0
  194. package/dist/ui/shared/tool-shell.d.ts +9 -0
  195. package/dist/ui/shared/tool-shell.js +46 -4
  196. package/dist/ui/shared/ui-event-tracker.d.ts +9 -0
  197. package/dist/ui/shared/ui-event-tracker.js +27 -0
  198. package/dist/ui/shared/widget-state.d.ts +6 -1
  199. package/dist/ui/shared/widget-state.js +102 -4
  200. package/dist/utils/capture.js +3 -3
  201. package/dist/utils/files/base.d.ts +2 -0
  202. package/dist/utils/open-browser.js +1 -1
  203. package/dist/utils/ui-call-context.d.ts +8 -0
  204. package/dist/utils/ui-call-context.js +72 -0
  205. package/dist/version.d.ts +1 -1
  206. package/dist/version.js +1 -1
  207. package/package.json +13 -4
  208. package/dist/data/spec-kit-prompts.json +0 -123
  209. package/dist/handlers/node-handlers.d.ts +0 -6
  210. package/dist/handlers/node-handlers.js +0 -73
  211. package/dist/handlers/test-crash-handler.d.ts +0 -11
  212. package/dist/handlers/test-crash-handler.js +0 -26
  213. package/dist/http-index.d.ts +0 -45
  214. package/dist/http-index.js +0 -51
  215. package/dist/http-server-auto-tunnel.js +0 -667
  216. package/dist/http-server-named-tunnel.d.ts +0 -2
  217. package/dist/http-server-named-tunnel.js +0 -167
  218. package/dist/http-server-tunnel.d.ts +0 -2
  219. package/dist/http-server-tunnel.js +0 -111
  220. package/dist/http-server.d.ts +0 -2
  221. package/dist/http-server.js +0 -270
  222. package/dist/index-oauth.d.ts +0 -2
  223. package/dist/index-oauth.js +0 -201
  224. package/dist/oauth/auth-middleware.d.ts +0 -20
  225. package/dist/oauth/auth-middleware.js +0 -62
  226. package/dist/oauth/index.d.ts +0 -3
  227. package/dist/oauth/index.js +0 -3
  228. package/dist/oauth/oauth-manager.d.ts +0 -80
  229. package/dist/oauth/oauth-manager.js +0 -179
  230. package/dist/oauth/oauth-routes.d.ts +0 -3
  231. package/dist/oauth/oauth-routes.js +0 -377
  232. package/dist/oauth/provider.d.ts +0 -22
  233. package/dist/oauth/provider.js +0 -124
  234. package/dist/oauth/server.d.ts +0 -18
  235. package/dist/oauth/server.js +0 -160
  236. package/dist/oauth/types.d.ts +0 -54
  237. package/dist/oauth/types.js +0 -2
  238. package/dist/remote-device/templates/auth-success.d.ts +0 -1
  239. package/dist/remote-device/templates/auth-success.js +0 -30
  240. package/dist/setup.log +0 -275
  241. package/dist/test-setup.js +0 -14
  242. package/dist/tools/docx/builders/html-builder.d.ts +0 -17
  243. package/dist/tools/docx/builders/html-builder.js +0 -92
  244. package/dist/tools/docx/builders/image.d.ts +0 -14
  245. package/dist/tools/docx/builders/image.js +0 -84
  246. package/dist/tools/docx/builders/index.d.ts +0 -11
  247. package/dist/tools/docx/builders/index.js +0 -11
  248. package/dist/tools/docx/builders/markdown-builder.d.ts +0 -2
  249. package/dist/tools/docx/builders/markdown-builder.js +0 -260
  250. package/dist/tools/docx/builders/paragraph.d.ts +0 -12
  251. package/dist/tools/docx/builders/paragraph.js +0 -29
  252. package/dist/tools/docx/builders/table.d.ts +0 -10
  253. package/dist/tools/docx/builders/table.js +0 -138
  254. package/dist/tools/docx/builders/utils.d.ts +0 -5
  255. package/dist/tools/docx/builders/utils.js +0 -18
  256. package/dist/tools/docx/constants.d.ts +0 -32
  257. package/dist/tools/docx/constants.js +0 -61
  258. package/dist/tools/docx/converters/markdown-to-html.d.ts +0 -17
  259. package/dist/tools/docx/converters/markdown-to-html.js +0 -111
  260. package/dist/tools/docx/create.d.ts +0 -21
  261. package/dist/tools/docx/create.js +0 -386
  262. package/dist/tools/docx/dom.d.ts +0 -139
  263. package/dist/tools/docx/dom.js +0 -448
  264. package/dist/tools/docx/errors.d.ts +0 -28
  265. package/dist/tools/docx/errors.js +0 -48
  266. package/dist/tools/docx/extractors/images.d.ts +0 -14
  267. package/dist/tools/docx/extractors/images.js +0 -40
  268. package/dist/tools/docx/extractors/metadata.d.ts +0 -14
  269. package/dist/tools/docx/extractors/metadata.js +0 -64
  270. package/dist/tools/docx/extractors/sections.d.ts +0 -14
  271. package/dist/tools/docx/extractors/sections.js +0 -61
  272. package/dist/tools/docx/html.d.ts +0 -17
  273. package/dist/tools/docx/html.js +0 -111
  274. package/dist/tools/docx/index.d.ts +0 -10
  275. package/dist/tools/docx/index.js +0 -10
  276. package/dist/tools/docx/markdown.d.ts +0 -84
  277. package/dist/tools/docx/markdown.js +0 -507
  278. package/dist/tools/docx/modify.d.ts +0 -28
  279. package/dist/tools/docx/modify.js +0 -271
  280. package/dist/tools/docx/operations/handlers/index.d.ts +0 -39
  281. package/dist/tools/docx/operations/handlers/index.js +0 -152
  282. package/dist/tools/docx/operations/html-manipulator.d.ts +0 -24
  283. package/dist/tools/docx/operations/html-manipulator.js +0 -352
  284. package/dist/tools/docx/operations/index.d.ts +0 -14
  285. package/dist/tools/docx/operations/index.js +0 -61
  286. package/dist/tools/docx/operations/operation-handlers.d.ts +0 -3
  287. package/dist/tools/docx/operations/operation-handlers.js +0 -67
  288. package/dist/tools/docx/operations/preprocessor.d.ts +0 -14
  289. package/dist/tools/docx/operations/preprocessor.js +0 -44
  290. package/dist/tools/docx/operations/xml-replacer.d.ts +0 -9
  291. package/dist/tools/docx/operations/xml-replacer.js +0 -35
  292. package/dist/tools/docx/operations.d.ts +0 -13
  293. package/dist/tools/docx/operations.js +0 -13
  294. package/dist/tools/docx/ops/delete-paragraph-at-body-index.d.ts +0 -11
  295. package/dist/tools/docx/ops/delete-paragraph-at-body-index.js +0 -23
  296. package/dist/tools/docx/ops/header-replace-text-exact.d.ts +0 -13
  297. package/dist/tools/docx/ops/header-replace-text-exact.js +0 -55
  298. package/dist/tools/docx/ops/index.d.ts +0 -17
  299. package/dist/tools/docx/ops/index.js +0 -70
  300. package/dist/tools/docx/ops/insert-image-after-text.d.ts +0 -24
  301. package/dist/tools/docx/ops/insert-image-after-text.js +0 -128
  302. package/dist/tools/docx/ops/insert-paragraph-after-text.d.ts +0 -12
  303. package/dist/tools/docx/ops/insert-paragraph-after-text.js +0 -74
  304. package/dist/tools/docx/ops/insert-table-after-text.d.ts +0 -19
  305. package/dist/tools/docx/ops/insert-table-after-text.js +0 -57
  306. package/dist/tools/docx/ops/replace-hyperlink-url.d.ts +0 -12
  307. package/dist/tools/docx/ops/replace-hyperlink-url.js +0 -37
  308. package/dist/tools/docx/ops/replace-paragraph-at-body-index.d.ts +0 -9
  309. package/dist/tools/docx/ops/replace-paragraph-at-body-index.js +0 -25
  310. package/dist/tools/docx/ops/replace-paragraph-text-exact.d.ts +0 -21
  311. package/dist/tools/docx/ops/replace-paragraph-text-exact.js +0 -36
  312. package/dist/tools/docx/ops/replace-table-cell-text.d.ts +0 -25
  313. package/dist/tools/docx/ops/replace-table-cell-text.js +0 -85
  314. package/dist/tools/docx/ops/set-color-for-paragraph-exact.d.ts +0 -9
  315. package/dist/tools/docx/ops/set-color-for-paragraph-exact.js +0 -24
  316. package/dist/tools/docx/ops/set-color-for-style.d.ts +0 -13
  317. package/dist/tools/docx/ops/set-color-for-style.js +0 -31
  318. package/dist/tools/docx/ops/set-paragraph-style-at-body-index.d.ts +0 -8
  319. package/dist/tools/docx/ops/set-paragraph-style-at-body-index.js +0 -57
  320. package/dist/tools/docx/ops/table-set-cell-text.d.ts +0 -9
  321. package/dist/tools/docx/ops/table-set-cell-text.js +0 -40
  322. package/dist/tools/docx/parsers/image-extractor.d.ts +0 -18
  323. package/dist/tools/docx/parsers/image-extractor.js +0 -61
  324. package/dist/tools/docx/parsers/index.d.ts +0 -9
  325. package/dist/tools/docx/parsers/index.js +0 -9
  326. package/dist/tools/docx/parsers/paragraph-parser.d.ts +0 -2
  327. package/dist/tools/docx/parsers/paragraph-parser.js +0 -88
  328. package/dist/tools/docx/parsers/table-parser.d.ts +0 -9
  329. package/dist/tools/docx/parsers/table-parser.js +0 -72
  330. package/dist/tools/docx/parsers/xml-parser.d.ts +0 -25
  331. package/dist/tools/docx/parsers/xml-parser.js +0 -71
  332. package/dist/tools/docx/parsers/zip-reader.d.ts +0 -23
  333. package/dist/tools/docx/parsers/zip-reader.js +0 -52
  334. package/dist/tools/docx/read.d.ts +0 -27
  335. package/dist/tools/docx/read.js +0 -308
  336. package/dist/tools/docx/relationships.d.ts +0 -22
  337. package/dist/tools/docx/relationships.js +0 -76
  338. package/dist/tools/docx/structure.d.ts +0 -25
  339. package/dist/tools/docx/structure.js +0 -102
  340. package/dist/tools/docx/styled-html-parser.d.ts +0 -23
  341. package/dist/tools/docx/styled-html-parser.js +0 -1262
  342. package/dist/tools/docx/types.d.ts +0 -213
  343. package/dist/tools/docx/types.js +0 -5
  344. package/dist/tools/docx/utils/escaping.d.ts +0 -13
  345. package/dist/tools/docx/utils/escaping.js +0 -26
  346. package/dist/tools/docx/utils/images.d.ts +0 -9
  347. package/dist/tools/docx/utils/images.js +0 -26
  348. package/dist/tools/docx/utils/index.d.ts +0 -12
  349. package/dist/tools/docx/utils/index.js +0 -17
  350. package/dist/tools/docx/utils/markdown.d.ts +0 -13
  351. package/dist/tools/docx/utils/markdown.js +0 -32
  352. package/dist/tools/docx/utils/paths.d.ts +0 -15
  353. package/dist/tools/docx/utils/paths.js +0 -27
  354. package/dist/tools/docx/utils/versioning.d.ts +0 -25
  355. package/dist/tools/docx/utils/versioning.js +0 -55
  356. package/dist/tools/docx/utils.d.ts +0 -101
  357. package/dist/tools/docx/utils.js +0 -299
  358. package/dist/tools/docx/validate.d.ts +0 -33
  359. package/dist/tools/docx/validate.js +0 -49
  360. package/dist/tools/docx/validators.d.ts +0 -13
  361. package/dist/tools/docx/validators.js +0 -40
  362. package/dist/tools/docx/write.d.ts +0 -17
  363. package/dist/tools/docx/write.js +0 -88
  364. package/dist/tools/docx/xml-view-test.js +0 -63
  365. package/dist/tools/docx/xml-view.d.ts +0 -56
  366. package/dist/tools/docx/xml-view.js +0 -169
  367. package/dist/tools/docx/zip.d.ts +0 -21
  368. package/dist/tools/docx/zip.js +0 -35
  369. package/dist/tools/pdf-processor.js +0 -3
  370. package/dist/tools/search.d.ts +0 -32
  371. package/dist/tools/search.js +0 -202
  372. package/dist/ui/file-preview/src/app.d.ts +0 -4
  373. package/dist/ui/file-preview/src/app.js +0 -800
  374. package/dist/utils/crash-logger.d.ts +0 -18
  375. package/dist/utils/crash-logger.js +0 -44
  376. package/dist/utils/dedent.d.ts +0 -8
  377. package/dist/utils/dedent.js +0 -38
  378. /package/dist/{http-server-auto-tunnel.d.ts → ui/config-editor/main.d.ts} +0 -0
  379. /package/dist/{test-docx.d.ts → ui/config-editor/src/main.d.ts} +0 -0
  380. /package/dist/{tools/docx/xml-view-test.d.ts → ui/file-preview/main.d.ts} +0 -0
  381. /package/dist/ui/file-preview/src/components/{toolbar.d.ts → Toolbar.d.ts} +0 -0
  382. /package/dist/ui/file-preview/src/components/{toolbar.js → Toolbar.js} +0 -0
  383. /package/dist/{tools/pdf-processor.d.ts → ui/file-preview/src/model.js} +0 -0
@@ -3,28 +3,36 @@
3
3
  */
4
4
  :root {
5
5
  color-scheme: light dark;
6
+
7
+ /* Spec variables with light-dark() fallbacks (following customer-segmentation pattern).
8
+ When a host provides --color-* via applyHostStyleVariables, the var() picks it up;
9
+ otherwise the light-dark() fallback keeps the UI legible. */
6
10
  --bg: transparent;
7
- --panel: var(--color-background-primary, Canvas);
8
- --panel-subtle: var(--color-background-tertiary, ButtonFace);
9
- --panel-muted: var(--color-background-muted, ButtonFace);
10
- --text: var(--color-text-primary, CanvasText);
11
- --text-secondary: var(--color-text-secondary, CanvasText);
12
- --muted: var(--color-text-tertiary, GrayText);
13
- --border: var(--color-border-default, GrayText);
14
- --accent: var(--color-accent-primary, LinkText);
15
- --accent-hover: var(--color-accent-primary-hover, var(--accent));
16
- --accent-soft: var(--color-accent-subtle, var(--panel-subtle));
17
- --focus-ring: var(--color-border-focused, var(--accent));
11
+ --panel: var(--color-background-primary, light-dark(#ffffff, #1e1e2e));
12
+ --panel-subtle: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
13
+ --panel-muted: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
14
+ --text: var(--color-text-primary, light-dark(#1a1a2e, #e4e4ef));
15
+ --text-secondary: var(--color-text-secondary, light-dark(#4a4a5a, #a0a0b8));
16
+ --muted: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
17
+ --border: var(--color-border-primary, light-dark(#e2e8f0, #334155));
18
+ --accent: var(--color-text-info, light-dark(#2563eb, #60a5fa));
19
+ --accent-hover: var(--color-text-info, var(--accent));
20
+ --accent-soft: var(--color-background-info, var(--panel-subtle));
21
+ --focus-ring: var(--color-border-primary, var(--accent));
18
22
  --shadow-sm: var(--shadow-sm, none);
19
23
  --success-bg: var(--color-background-success, var(--panel-subtle));
20
24
  --success-border: var(--color-border-success, var(--border));
21
- --success-text: var(--color-text-success, var(--text));
25
+ --success-text: var(--color-text-success, light-dark(#059669, #34d399));
22
26
  --error-bg: var(--color-background-danger, var(--panel-subtle));
23
27
  --error-border: var(--color-border-danger, var(--border));
24
- --error-text: var(--color-text-danger, var(--text));
28
+ --error-text: var(--color-text-danger, light-dark(#dc2626, #f87171));
25
29
  --warning-bg: var(--color-background-warning, var(--panel-subtle));
26
30
  --warning-border: var(--color-border-warning, var(--border));
27
- --warning-text: var(--color-text-warning, var(--text));
31
+ --warning-text: var(--color-text-warning, light-dark(#d97706, #fbbf24));
32
+ }
33
+
34
+ html {
35
+ background: var(--bg);
28
36
  }
29
37
 
30
38
  * {
@@ -42,7 +50,8 @@ body {
42
50
 
43
51
  body.dc-ready {
44
52
  max-height: none;
45
- overflow: visible;
53
+ overflow: auto;
54
+ overflow: clip;
46
55
  }
47
56
 
48
57
  #app {
@@ -64,208 +73,69 @@ body.dc-ready {
64
73
  }
65
74
 
66
75
 
67
- /*
68
- * Reusable styles for the shared tool header component. It provides consistent spacing, alignment, and action presentation across apps.
69
- */
70
- .toolbar {
71
- display: flex;
72
- gap: 10px;
73
- align-items: center;
74
- justify-content: space-between;
75
- padding: 8px 10px;
76
- border: 1px solid var(--border);
77
- border-radius: 12px;
78
- background: var(--panel);
79
- margin-bottom: 0;
80
- box-shadow: var(--shadow-sm);
81
- }
82
-
83
- .meta {
84
- display: flex;
85
- align-items: center;
86
- justify-content: space-between;
87
- gap: 12px;
88
- min-width: 0;
89
- width: 100%;
90
- flex: 1 1 auto;
91
- }
92
-
93
- .meta-main {
94
- display: flex;
95
- align-items: center;
96
- gap: 10px;
97
- min-width: 0;
98
- }
99
-
100
- .file-pill {
101
- width: 52px;
102
- height: 20px;
103
- border-radius: 6px;
104
- display: inline-flex;
105
- align-items: center;
106
- justify-content: center;
107
- font-size: 10px;
108
- font-weight: 700;
109
- letter-spacing: 0.2px;
110
- background: transparent;
111
- color: var(--text);
112
- border: 1px solid var(--border);
113
- flex-shrink: 0;
114
- text-align: center;
115
- }
116
-
117
- .file-pill--md {
118
- background: transparent;
119
- color: var(--text);
120
- border-color: var(--border);
121
- }
122
-
123
- .file-pill--html {
124
- background: transparent;
125
- color: var(--text);
126
- border-color: var(--border);
127
- }
128
-
129
- .file-pill--json {
130
- background: transparent;
131
- color: var(--text);
132
- border-color: var(--border);
133
- }
134
-
135
- .file-pill--text {
136
- background: transparent;
137
- color: var(--muted);
138
- border-color: var(--border);
139
- }
140
-
141
- .meta-text {
142
- display: flex;
143
- flex-direction: row;
144
- align-items: baseline;
145
- min-width: 0;
146
- gap: 8px;
147
- }
148
-
149
- .filename {
150
- font-weight: 600;
151
- white-space: nowrap;
152
- overflow: hidden;
153
- text-overflow: ellipsis;
154
- max-width: 460px;
155
- font-size: 12px;
156
- }
157
-
158
- .filepath {
159
- color: var(--muted);
160
- font-size: 10px;
161
- white-space: nowrap;
162
- overflow: hidden;
163
- text-overflow: ellipsis;
164
- max-width: 360px;
165
- }
166
-
167
- .meta-badges {
76
+ .compact-row {
168
77
  display: flex;
169
78
  align-items: center;
170
79
  gap: 6px;
171
- flex-shrink: 0;
80
+ padding: 6px 2px;
81
+ font-size: 13px;
82
+ color: var(--muted);
83
+ line-height: 1;
84
+ user-select: none;
172
85
  }
173
86
 
174
- .badge {
175
- border-radius: 999px;
176
- border: 1px solid var(--border);
177
- color: var(--muted);
178
- padding: 2px 7px;
179
- font-size: 10px;
180
- background: var(--panel-subtle);
87
+ .compact-row--ready {
88
+ cursor: pointer;
89
+ border-radius: 8px;
90
+ transition: color 150ms ease;
181
91
  }
182
92
 
183
- .actions {
184
- display: flex;
185
- align-items: center;
186
- gap: 6px;
187
- padding-left: 8px;
188
- border-left: 1px solid var(--border);
189
- flex: 0 0 auto;
93
+ .compact-row--ready:hover {
94
+ color: var(--text-secondary);
190
95
  }
191
96
 
192
- .icon-button {
193
- width: 30px;
194
- height: 30px;
195
- border: 1px solid var(--border);
196
- background: var(--panel);
197
- color: var(--muted);
198
- border-radius: 9px;
199
- padding: 0;
200
- display: inline-flex;
201
- align-items: center;
202
- justify-content: center;
203
- cursor: pointer;
204
- transition: transform 120ms ease, box-shadow 120ms ease, background 120ms ease;
97
+ .compact-row--ready:hover .compact-chevron {
98
+ color: var(--text-secondary);
205
99
  }
206
100
 
207
- .icon-button svg {
101
+ .compact-chevron {
208
102
  width: 14px;
209
103
  height: 14px;
210
104
  fill: currentColor;
105
+ color: var(--muted);
106
+ flex-shrink: 0;
107
+ transition: transform 200ms ease, color 150ms ease;
211
108
  }
212
109
 
213
- .icon-button:hover {
214
- background: var(--panel-muted);
215
- border-color: var(--border);
216
- box-shadow: var(--shadow-sm);
110
+ .tool-shell.expanded .compact-chevron {
111
+ transform: rotate(90deg);
217
112
  }
218
113
 
219
- .icon-button:active {
220
- transform: translateY(1px);
114
+ .compact-label {
115
+ color: inherit;
221
116
  }
222
117
 
223
- .icon-button:disabled {
224
- cursor: not-allowed;
225
- opacity: 0.6;
118
+ .compact-filename {
119
+ color: var(--text);
120
+ font-weight: 600;
226
121
  }
227
122
 
228
- .icon-button:focus-visible {
229
- outline: 2px solid var(--border);
230
- outline-offset: 2px;
123
+ .compact-row--ready .compact-label::after {
124
+ content: ' · ';
231
125
  }
232
126
 
233
- .icon-button--secondary {
234
- border-color: var(--border);
235
- background: var(--panel-subtle);
236
- color: var(--text-secondary);
127
+ .compact-row--loading {
128
+ animation: fade-pulse 1.5s ease-in-out infinite;
237
129
  }
238
130
 
239
- @media (max-width: 720px) {
240
- .shell {
241
- padding: 12px;
242
- }
243
-
244
- .toolbar {
245
- gap: 8px;
246
- }
247
-
248
- .meta {
249
- gap: 8px;
250
- }
251
-
252
- .actions {
253
- padding-left: 6px;
254
- }
255
-
256
- .meta-badges {
257
- display: none;
258
- }
259
-
260
- .meta-text {
261
- flex-direction: column;
262
- align-items: flex-start;
263
- gap: 0;
131
+ @keyframes fade-pulse {
132
+ 0%,
133
+ 100% {
134
+ opacity: 0.5;
264
135
  }
265
136
 
266
- .filename,
267
- .filepath {
268
- max-width: 100%;
137
+ 50% {
138
+ opacity: 1;
269
139
  }
270
140
  }
271
141
 
@@ -276,92 +146,115 @@ body.dc-ready {
276
146
  :root {
277
147
  --code-bg: var(--panel);
278
148
  --code-text: var(--color-text-primary, var(--text));
279
- --hljs-keyword: var(--color-text-accent, #8b5cf6);
280
- --hljs-string: var(--color-text-success, #059669);
281
- --hljs-comment: var(--color-text-tertiary, #94a3b8);
282
- --hljs-type: var(--color-text-info, #0f766e);
283
- --hljs-number: var(--color-text-warning, #b45309);
284
- --hljs-attr: var(--color-text-info, #2563eb);
285
- --hljs-built-in: var(--color-text-accent, #6366f1);
286
- --hljs-tag: var(--color-text-info, #0ea5a8);
287
- --content-height: min(82vh, 920px);
149
+ --hljs-keyword: light-dark(#8b5cf6, #a78bfa);
150
+ --hljs-string: var(--color-text-success, light-dark(#059669, #34d399));
151
+ --hljs-comment: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
152
+ --hljs-type: var(--color-text-info, light-dark(#0f766e, #5eead4));
153
+ --hljs-number: var(--color-text-warning, light-dark(#b45309, #fbbf24));
154
+ --hljs-attr: var(--color-text-info, light-dark(#2563eb, #60a5fa));
155
+ --hljs-built-in: light-dark(#6366f1, #818cf8);
156
+ --hljs-tag: var(--color-text-info, light-dark(#0ea5a8, #67e8f9));
157
+ --content-height: 920px;
288
158
  --markdown-text: var(--text);
289
159
  --markdown-muted: var(--text-secondary);
290
160
  --inline-code-bg: var(--panel-subtle);
291
161
  --inline-code-border: var(--border);
292
162
  --inline-code-text: var(--text);
293
- --notice-bg: var(--warning-bg);
294
- --notice-border: var(--warning-border);
295
- --notice-text: var(--warning-text);
163
+ --notice-bg: var(--panel-subtle);
164
+ --notice-border: var(--border);
165
+ --notice-text: var(--text-secondary);
166
+ --toc-rail-width: 320px;
296
167
  }
297
168
 
298
- /* ── Compact row ── */
169
+ /* ── Panel (Claude-style card) ── */
299
170
 
300
- .compact-row {
301
- display: flex;
302
- align-items: center;
303
- gap: 6px;
304
- padding: 6px 2px;
305
- font-size: 13px;
306
- color: var(--muted);
307
- line-height: 1;
308
- user-select: none;
171
+ .panel {
172
+ margin-top: 6px;
173
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
174
+ border-radius: 16px;
175
+ background: var(--panel);
176
+ overflow: hidden;
309
177
  }
310
178
 
311
- .compact-row--ready {
312
- cursor: pointer;
313
- border-radius: 8px;
314
- transition: color 150ms ease;
315
- }
179
+ /* Panel background comes directly from host --color-background-primary.
180
+ No dark-mode adjustment — the host provides the correct color. */
316
181
 
317
- .compact-row--ready:hover { color: var(--text-secondary); }
318
- .compact-row--ready:hover .compact-chevron { color: var(--text-secondary); }
182
+ .tool-shell.collapsed .panel { display: none; }
319
183
 
320
- .compact-chevron {
321
- width: 14px;
322
- height: 14px;
323
- fill: currentColor;
324
- color: var(--muted);
325
- flex-shrink: 0;
326
- transition: transform 200ms ease, color 150ms ease;
184
+ /* When the host hides the summary row (hideSummaryRow: true), it means the host
185
+ provides its own outer frame/card. Strip inner chrome so only content remains. */
186
+ html:has(.fullscreen) {
187
+ height: 100%;
327
188
  }
328
189
 
329
- .tool-shell.expanded .compact-chevron { transform: rotate(90deg); }
330
-
331
- .compact-label { color: inherit; }
332
- .compact-filename { color: var(--text-secondary); font-weight: 500; }
333
- .compact-row--ready .compact-label::after { content: ' · '; }
334
-
335
- .compact-row--loading {
336
- animation: fade-pulse 1.5s ease-in-out infinite;
190
+ html:has(.fullscreen) body {
191
+ height: 100%;
192
+ display: flex;
193
+ flex-direction: column;
337
194
  }
338
195
 
339
- @keyframes fade-pulse {
340
- 0%, 100% { opacity: 0.5; }
341
- 50% { opacity: 1; }
196
+ html:has(.fullscreen) #app {
197
+ flex: 1;
198
+ display: flex;
199
+ flex-direction: column;
342
200
  }
343
201
 
344
- /* ── Panel (Claude-style card) ── */
202
+ .tool-shell.fullscreen {
203
+ flex: 1;
204
+ display: flex;
205
+ flex-direction: column;
206
+ }
345
207
 
346
- .panel {
347
- margin-top: 6px;
348
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
349
- border-radius: 16px;
350
- background: var(--panel);
351
- overflow: hidden;
208
+ .tool-shell.fullscreen .panel {
209
+ margin-top: 0;
210
+ border: none;
211
+ border-radius: 0;
212
+ flex: 1;
213
+ display: flex;
214
+ flex-direction: column;
352
215
  }
353
216
 
354
- @media (prefers-color-scheme: dark) {
355
- .panel {
356
- background: color-mix(in srgb, var(--panel), white 6%);
357
- }
217
+ .tool-shell.fullscreen {
218
+ --content-height: 89vh;
358
219
  }
359
220
 
360
- [data-theme="dark"] .panel {
361
- background: color-mix(in srgb, var(--panel), white 6%);
221
+ .tool-shell.fullscreen .panel-content-wrapper {
222
+ flex: 1;
362
223
  }
363
224
 
364
- .tool-shell.collapsed .panel { display: none; }
225
+ .tool-shell.host-framed .compact-row { display: none; }
226
+ .tool-shell.host-framed .panel {
227
+ margin-top: 0;
228
+ border: none;
229
+ border-radius: 0;
230
+ background: transparent;
231
+ }
232
+ .tool-shell.host-framed .panel-breadcrumb { display: none; }
233
+ .tool-shell.host-framed .panel-footer { display: none; }
234
+ .tool-shell.host-framed .panel { position: relative; }
235
+ .tool-shell.host-framed .panel-topbar {
236
+ position: absolute;
237
+ top: 0;
238
+ right: 0;
239
+ z-index: 10;
240
+ width: auto;
241
+ opacity: 0;
242
+ transition: opacity 0.2s ease 1.5s;
243
+ pointer-events: none;
244
+ padding: 4px 8px;
245
+ gap: 6px;
246
+ background: var(--panel);
247
+ border-radius: 0 0 0 var(--border-radius-md, 6px);
248
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
249
+ }
250
+ .tool-shell.host-framed .panel:hover .panel-topbar,
251
+ .tool-shell.host-framed .panel:focus-within .panel-topbar {
252
+ opacity: 1;
253
+ pointer-events: auto;
254
+ transition: opacity 0.2s ease;
255
+ }
256
+ .tool-shell.host-framed .panel-content-wrapper { max-height: none; overflow: hidden; }
257
+ .tool-shell.host-framed .image-content { background: transparent; }
365
258
 
366
259
  /* ── Top bar ── */
367
260
 
@@ -372,16 +265,19 @@ body.dc-ready {
372
265
  gap: 12px;
373
266
  padding: 10px 16px;
374
267
  border-bottom: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
268
+ overflow: visible;
375
269
  }
376
270
 
377
271
  .panel-breadcrumb {
378
272
  font-size: 13px;
379
273
  color: var(--text-secondary);
274
+ direction: rtl;
275
+ text-align: left;
380
276
  white-space: nowrap;
381
277
  overflow: hidden;
382
278
  text-overflow: ellipsis;
383
- flex: 1 1 0;
384
- width: 0;
279
+ flex: 0 1 auto;
280
+ max-width: 50%;
385
281
  min-width: 0;
386
282
  }
387
283
 
@@ -422,12 +318,49 @@ body.dc-ready {
422
318
  background: var(--panel-subtle);
423
319
  }
424
320
 
321
+ .panel-action--primary {
322
+ color: var(--text);
323
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
324
+ }
325
+
326
+ .panel-action--primary:hover {
327
+ background: color-mix(in srgb, var(--panel-subtle) 58%, var(--border) 42%);
328
+ }
329
+
425
330
  .panel-action:disabled {
426
331
  opacity: 0.35;
427
332
  cursor: not-allowed;
428
333
  }
429
334
 
430
335
  .panel-action svg { flex-shrink: 0; opacity: 0.7; }
336
+
337
+ .panel-action[title] {
338
+ position: relative;
339
+ }
340
+
341
+ .panel-action[title]::after {
342
+ content: attr(title);
343
+ position: absolute;
344
+ bottom: -28px;
345
+ left: 50%;
346
+ transform: translateX(-50%);
347
+ padding: 3px 8px;
348
+ border-radius: 6px;
349
+ background: var(--panel);
350
+ color: var(--text);
351
+ font-size: 11px;
352
+ font-weight: 400;
353
+ white-space: nowrap;
354
+ pointer-events: none;
355
+ opacity: 0;
356
+ transition: opacity 150ms ease;
357
+ z-index: 10;
358
+ box-shadow: 0 2px 8px rgba(0,0,0,0.25);
359
+ }
360
+
361
+ .panel-action[title]:hover::after {
362
+ opacity: 1;
363
+ }
431
364
  .panel-action:hover svg { opacity: 1; }
432
365
 
433
366
  /* ── Footer ── */
@@ -449,41 +382,614 @@ body.dc-ready {
449
382
 
450
383
  /* ── Selection hint (floating tooltip near selection) ── */
451
384
 
452
- .selection-hint {
385
+ .selection-hint {
386
+ position: absolute;
387
+ z-index: 10;
388
+ padding: 4px 10px;
389
+ font-size: 11px;
390
+ color: var(--text-secondary);
391
+ background: var(--panel);
392
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
393
+ border-radius: 6px;
394
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
395
+ white-space: nowrap;
396
+ pointer-events: none;
397
+ opacity: 0;
398
+ transition: opacity 150ms ease;
399
+ }
400
+
401
+ .selection-hint.visible {
402
+ opacity: 1;
403
+ }
404
+
405
+ /* ── Content areas ── */
406
+
407
+ .panel-content-wrapper {
408
+ max-height: var(--content-height);
409
+ overflow: auto;
410
+ position: relative;
411
+ }
412
+
413
+ .panel-content {
414
+ min-height: 0;
415
+ }
416
+
417
+ .source-content .code-viewer { height: 100%; overflow: auto; }
418
+ .html-content .html-rendered-frame { min-height: 300px; height: var(--content-height); }
419
+ .markdown-content { overflow: auto; padding: 0 4px 0 0; }
420
+
421
+ .markdown-content--workspace {
422
+ padding: 0;
423
+ overflow: visible;
424
+ }
425
+
426
+ .markdown-workspace {
427
+ display: flex;
428
+ background: transparent;
429
+ }
430
+
431
+ .markdown-workspace--edit {
432
+ min-height: min(70vh, 880px);
433
+ }
434
+
435
+ .markdown-workspace--with-toc {
436
+ align-items: stretch;
437
+ }
438
+
439
+ .markdown-workspace-main {
440
+ flex: 1 1 auto;
441
+ min-width: 0;
442
+ padding-left: 18px;
443
+ }
444
+
445
+ .markdown-workspace-main--editor {
446
+ display: flex;
447
+ min-height: min(70vh, 880px);
448
+ }
449
+
450
+ .markdown-editor-shell {
451
+ display: grid;
452
+ gap: 14px;
453
+ width: 100%;
454
+ padding: 20px;
455
+ position: relative;
456
+ }
457
+
458
+ .markdown-editor-mode-toggle {
459
+ position: relative;
460
+ display: inline-grid;
461
+ grid-template-columns: repeat(2, minmax(0, 1fr));
462
+ align-items: center;
463
+ gap: 4px;
464
+ padding: 3px 4.5px 3px 3px;
465
+ border-radius: 999px;
466
+ background: color-mix(in srgb, var(--panel-subtle) 72%, transparent);
467
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
468
+ }
469
+
470
+ .markdown-editor-mode-toggle-indicator {
471
+ position: absolute;
472
+ top: 3px;
473
+ bottom: 3px;
474
+ left: 3px;
475
+ width: calc(50% - 3.5px);
476
+ border-radius: 999px;
477
+ background: color-mix(in srgb, var(--panel) 96%, transparent);
478
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
479
+ transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease, background-color 220ms ease;
480
+ pointer-events: none;
481
+ }
482
+
483
+ .markdown-editor-mode-toggle-indicator--markdown {
484
+ transform: translateX(calc(100% + 2.5px));
485
+ }
486
+
487
+ .markdown-editor-mode-option {
488
+ position: relative;
489
+ z-index: 1;
490
+ border: none;
491
+ background: transparent;
492
+ color: var(--text-secondary);
493
+ min-width: 0;
494
+ height: 32px;
495
+ padding: 0 12px;
496
+ border-radius: 999px;
497
+ display: inline-flex;
498
+ align-items: center;
499
+ justify-content: center;
500
+ gap: 6px;
501
+ font: inherit;
502
+ font-size: 12px;
503
+ cursor: pointer;
504
+ transition: color 180ms ease, opacity 180ms ease, transform 220ms cubic-bezier(0.22, 1, 0.36, 1);
505
+ }
506
+
507
+ .markdown-editor-mode-option.is-active {
508
+ color: var(--text);
509
+ transform: translateY(-0.5px);
510
+ }
511
+
512
+ .markdown-editor-mode-option span {
513
+ white-space: nowrap;
514
+ transition: opacity 180ms ease;
515
+ }
516
+
517
+ .markdown-editor-mode-option:not(.is-active) {
518
+ opacity: 0.82;
519
+ }
520
+
521
+ .markdown-editor-mode-option.is-active svg,
522
+ .markdown-editor-mode-option.is-active span {
523
+ opacity: 1;
524
+ }
525
+
526
+ .markdown-editor-pane {
527
+ display: flex;
528
+ flex-direction: column;
529
+ min-height: min(70vh, 840px);
530
+ overflow: visible;
531
+ background: transparent;
532
+ }
533
+
534
+ .markdown-editor-pane--raw {
535
+ max-width: none;
536
+ }
537
+
538
+ .markdown-editor-pane--markdown {
539
+ max-width: none;
540
+ }
541
+
542
+ .markdown-editor-context-menu {
543
+ display: flex;
544
+ flex-wrap: wrap;
545
+ align-items: center;
546
+ gap: 6px;
547
+ padding: 6px;
548
+ background: #171717;
549
+ border: 1px solid color-mix(in srgb, var(--border) 34%, transparent);
550
+ border-radius: 10px;
551
+ position: absolute;
552
+ z-index: 20;
553
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
554
+ }
555
+
556
+ .markdown-editor-context-menu[hidden] {
557
+ display: none;
558
+ }
559
+
560
+ .markdown-format-button {
561
+ border: none;
562
+ background: transparent;
563
+ color: rgba(255, 255, 255, 0.9);
564
+ border-radius: 6px;
565
+ width: 32px;
566
+ height: 32px;
567
+ padding: 0;
568
+ font: inherit;
569
+ font-size: 13px;
570
+ cursor: pointer;
571
+ white-space: nowrap;
572
+ display: inline-flex;
573
+ align-items: center;
574
+ justify-content: center;
575
+ }
576
+
577
+ .markdown-format-button:hover {
578
+ background: rgba(255, 255, 255, 0.14);
579
+ }
580
+
581
+ .markdown-format-button--swatch {
582
+ padding: 0;
583
+ }
584
+
585
+ .markdown-format-size {
586
+ display: inline-flex;
587
+ align-items: center;
588
+ justify-content: center;
589
+ height: 32px;
590
+ border-radius: 6px;
591
+ overflow: hidden;
592
+ background: rgba(255, 255, 255, 0.08);
593
+ }
594
+
595
+ .markdown-format-size select {
596
+ height: 32px;
597
+ border: none;
598
+ background: transparent;
599
+ color: rgba(255, 255, 255, 0.9);
600
+ padding: 0 8px;
601
+ font: inherit;
602
+ font-size: 12px;
603
+ outline: none;
604
+ }
605
+
606
+ .markdown-format-sep {
607
+ width: 1px;
608
+ height: 20px;
609
+ background: rgba(255, 255, 255, 0.14);
610
+ }
611
+
612
+ .markdown-link-modal {
613
+ position: fixed;
614
+ inset: 0;
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: center;
618
+ background: transparent;
619
+ z-index: 30;
620
+ }
621
+
622
+ .markdown-link-modal[hidden] {
623
+ display: none;
624
+ }
625
+
626
+ .markdown-link-modal-card {
627
+ width: min(420px, calc(100% - 32px));
628
+ background: var(--panel);
629
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
630
+ border-radius: 14px;
631
+ padding: 14px;
632
+ box-shadow: 0 18px 44px rgba(15, 23, 42, 0.22);
633
+ }
634
+
635
+ .markdown-link-mode-tabs {
636
+ display: inline-flex;
637
+ gap: 6px;
638
+ margin-bottom: 12px;
639
+ }
640
+
641
+ .markdown-link-mode-tab {
642
+ border: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
643
+ background: transparent;
644
+ color: var(--text-secondary);
645
+ border-radius: 999px;
646
+ padding: 7px 12px;
647
+ font: inherit;
648
+ font-size: 12px;
649
+ cursor: pointer;
650
+ }
651
+
652
+ .markdown-link-mode-tab.is-active {
653
+ color: var(--text);
654
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
655
+ }
656
+
657
+ .markdown-link-modal-label {
658
+ display: block;
659
+ margin-bottom: 8px;
660
+ font-size: 12px;
661
+ font-weight: 600;
662
+ color: var(--text-secondary);
663
+ }
664
+
665
+ .markdown-link-modal-input {
666
+ width: 100%;
667
+ border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
668
+ border-radius: 10px;
669
+ padding: 10px 12px;
670
+ font: inherit;
671
+ font-size: 13px;
672
+ color: var(--text);
673
+ background: color-mix(in srgb, var(--panel-subtle) 68%, transparent);
674
+ }
675
+
676
+ .markdown-link-modal-select {
677
+ appearance: none;
678
+ }
679
+
680
+ .markdown-link-results {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 6px;
684
+ max-height: 160px;
685
+ overflow: auto;
686
+ margin: 10px 0 12px;
687
+ }
688
+
689
+ .markdown-link-results-empty {
690
+ padding: 10px 12px;
691
+ font-size: 12px;
692
+ color: var(--text-secondary);
693
+ border: 1px dashed color-mix(in srgb, var(--border) 45%, transparent);
694
+ border-radius: 10px;
695
+ }
696
+
697
+ .markdown-link-result {
698
+ display: flex;
699
+ flex-direction: column;
700
+ align-items: flex-start;
701
+ gap: 4px;
702
+ width: 100%;
703
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
704
+ background: transparent;
705
+ border-radius: 10px;
706
+ padding: 10px 12px;
707
+ cursor: pointer;
708
+ text-align: left;
709
+ }
710
+
711
+ .markdown-link-result.is-active {
712
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
713
+ }
714
+
715
+ .markdown-link-result-title {
716
+ font-size: 13px;
717
+ color: var(--text);
718
+ }
719
+
720
+ .markdown-link-result-path {
721
+ font-size: 11px;
722
+ color: var(--text-secondary);
723
+ }
724
+
725
+ .markdown-link-modal-actions {
726
+ display: flex;
727
+ justify-content: flex-end;
728
+ gap: 8px;
729
+ margin-top: 12px;
730
+ }
731
+
732
+ .markdown-link-modal-button {
733
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
734
+ background: transparent;
735
+ color: var(--text-secondary);
736
+ border-radius: 10px;
737
+ padding: 8px 12px;
738
+ font: inherit;
739
+ font-size: 13px;
740
+ cursor: pointer;
741
+ }
742
+
743
+ .markdown-link-modal-button--primary {
744
+ color: var(--text);
745
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
746
+ }
747
+
748
+ .markdown-editor-copy-button {
749
+ display: inline-flex;
750
+ align-items: center;
751
+ gap: 5px;
752
+ background: none;
753
+ border: none;
754
+ border-radius: 8px;
755
+ padding: 5px 12px;
756
+ font-size: 13px;
757
+ font-weight: 500;
758
+ color: var(--muted);
759
+ cursor: pointer;
760
+ white-space: nowrap;
761
+ transition: color 150ms ease, background 150ms ease;
762
+ line-height: 1.4;
763
+ font-family: inherit;
764
+ }
765
+
766
+ .markdown-editor-copy-button span {
767
+ white-space: nowrap;
768
+ }
769
+
770
+ .markdown-editor-copy-button:hover {
771
+ color: var(--text);
772
+ }
773
+
774
+ .markdown-editor-copy-button[data-status="Copied!"] {
775
+ color: var(--text);
776
+ }
777
+
778
+ .markdown-editor-copy-button[data-status="Copy failed"] {
779
+ color: #b91c1c;
780
+ }
781
+
782
+ .panel-save-status {
783
+ padding: 4px 10px;
784
+ border-radius: 999px;
785
+ font-size: 12px;
786
+ font-weight: 400;
787
+ color: var(--muted);
788
+ background: none;
789
+ white-space: nowrap;
790
+ pointer-events: none;
791
+ line-height: 1;
792
+ }
793
+
794
+ .panel-save-status--saving {
795
+ color: var(--text);
796
+ }
797
+
798
+ .panel-save-status--saved {
799
+ color: var(--muted);
800
+ opacity: 0.7;
801
+ }
802
+
803
+ .panel-save-status--pending {
804
+ color: var(--muted);
805
+ }
806
+
807
+ .panel-topbar .markdown-editor-mode-toggle {
808
+ margin-left: 2px;
809
+ }
810
+
811
+ .markdown-toc-shell {
812
+ flex: 0 0 var(--toc-rail-width);
813
+ width: var(--toc-rail-width);
814
+ border-right: 1px solid color-mix(in srgb, var(--border) 18%, transparent);
815
+ background: color-mix(in srgb, var(--panel-subtle) 90%, transparent);
816
+ padding: 18px 14px 18px 16px;
817
+ display: flex;
818
+ flex-direction: column;
819
+ align-self: flex-start;
820
+ position: sticky;
821
+ top: 12px;
822
+ max-height: calc(100vh - 120px);
823
+ overflow: visible;
824
+ transition: flex-basis 0.2s ease, width 0.2s ease, padding 0.2s ease;
825
+ }
826
+
827
+ .markdown-toc-header {
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: space-between;
831
+ margin-bottom: 12px;
832
+ min-height: 20px;
833
+ }
834
+
835
+ .markdown-toc-title {
836
+ font-size: 11px;
837
+ font-weight: 700;
838
+ letter-spacing: 0.08em;
839
+ text-transform: uppercase;
840
+ color: var(--text-secondary);
841
+ }
842
+
843
+ .document-outline-toggle {
844
+ border: none;
845
+ background: transparent;
846
+ color: var(--text-secondary);
847
+ cursor: pointer;
848
+ width: 24px;
849
+ height: 24px;
850
+ padding: 0;
851
+ border-radius: 6px;
852
+ display: flex;
853
+ align-items: center;
854
+ justify-content: center;
855
+ flex-shrink: 0;
856
+ opacity: 0.5;
857
+ transition: opacity 0.15s, background 0.15s;
858
+ }
859
+ .document-outline-toggle:hover {
860
+ opacity: 1;
861
+ background: color-mix(in srgb, var(--border) 20%, transparent);
862
+ }
863
+
864
+ .markdown-toc-collapsed {
865
+ flex: 0 0 44px !important;
866
+ width: 44px !important;
867
+ padding: 12px 6px !important;
868
+ overflow: hidden;
869
+ background: transparent !important;
870
+ border-right: none !important;
871
+ }
872
+ .markdown-toc-collapsed .markdown-toc-header {
873
+ justify-content: center;
874
+ }
875
+ .markdown-toc-collapsed .markdown-toc-title,
876
+ .markdown-toc-collapsed .markdown-toc-nav {
877
+ display: none;
878
+ }
879
+ .markdown-toc-collapsed .document-outline-toggle {
880
+ width: 30px;
881
+ height: 30px;
882
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
883
+ border-radius: 8px;
884
+ opacity: 0.7;
885
+ }
886
+
887
+ .markdown-toc-nav {
888
+ display: flex;
889
+ flex-direction: column;
890
+ gap: 4px;
891
+ overflow: auto;
892
+ min-height: 0;
893
+ }
894
+
895
+ .markdown-toc-link {
896
+ border: none;
897
+ background: transparent;
898
+ color: var(--text-secondary);
899
+ text-align: left;
900
+ font: inherit;
901
+ font-size: 13px;
902
+ line-height: 1.35;
903
+ padding: 6px 8px;
904
+ border-radius: 8px;
905
+ cursor: pointer;
906
+ }
907
+
908
+ .markdown-toc-link[data-level="2"] { padding-left: 16px; }
909
+ .markdown-toc-link[data-level="3"] { padding-left: 24px; }
910
+ .markdown-toc-link[data-level="4"] { padding-left: 32px; }
911
+ .markdown-toc-link[data-level="5"] { padding-left: 40px; }
912
+ .markdown-toc-link[data-level="6"] { padding-left: 48px; }
913
+
914
+ .markdown-toc-link:hover {
915
+ color: var(--text);
916
+ background: color-mix(in srgb, var(--panel) 72%, transparent);
917
+ }
918
+
919
+ .markdown-toc-link.is-active {
920
+ color: var(--text);
921
+ background: color-mix(in srgb, var(--panel) 82%, var(--border) 18%);
922
+ }
923
+
924
+ .markdown-link-popover {
453
925
  position: absolute;
454
926
  z-index: 10;
455
- padding: 4px 10px;
456
- font-size: 11px;
457
- color: var(--text-secondary);
927
+ display: flex;
928
+ align-items: center;
929
+ gap: 2px;
458
930
  background: var(--panel);
459
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
931
+ border: 1px solid var(--border);
932
+ border-radius: 8px;
933
+ padding: 4px;
934
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
935
+ }
936
+ .markdown-link-popover[hidden] { display: none; }
937
+ .markdown-link-popover-btn {
938
+ border: none;
939
+ background: transparent;
940
+ color: var(--text-secondary);
941
+ cursor: pointer;
942
+ width: 28px;
943
+ height: 28px;
944
+ padding: 0;
460
945
  border-radius: 6px;
461
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
462
- white-space: nowrap;
463
- pointer-events: none;
464
- opacity: 0;
465
- transition: opacity 150ms ease;
946
+ display: flex;
947
+ align-items: center;
948
+ justify-content: center;
949
+ }
950
+ .markdown-link-popover-btn:hover {
951
+ color: var(--text);
952
+ background: color-mix(in srgb, var(--border) 30%, transparent);
466
953
  }
467
954
 
468
- .selection-hint.visible {
469
- opacity: 1;
955
+ .markdown-editor-root {
956
+ flex: 1 1 auto;
957
+ min-height: 0;
958
+ padding: 0;
959
+ position: relative;
470
960
  }
471
961
 
472
- /* ── Content areas ── */
962
+ .markdown-editor-surface {
963
+ flex: 1 1 auto;
964
+ min-height: min(70vh, 760px);
965
+ outline: none;
966
+ }
473
967
 
474
- .panel-content-wrapper {
475
- max-height: var(--content-height);
476
- overflow: auto;
477
- position: relative;
968
+ .markdown-editor-surface--markdown {
969
+ max-width: none;
970
+ margin: 0;
971
+ padding: 22px 24px 28px;
478
972
  }
479
973
 
480
- .panel-content {
481
- min-height: 0;
974
+ .markdown-editor-textarea {
975
+ width: 100%;
976
+ min-height: min(70vh, 760px);
977
+ border: 0;
978
+ border-radius: 0;
979
+ background: transparent;
980
+ color: var(--text);
981
+ font-family: var(--font-mono, ui-monospace, monospace);
982
+ font-size: 14px;
983
+ line-height: 1.65;
984
+ padding: 18px 20px 24px;
985
+ resize: none;
986
+ overflow: hidden;
987
+ outline: none;
482
988
  }
483
989
 
484
- .source-content .code-viewer { height: 100%; overflow: auto; }
485
- .html-content .html-rendered-frame { min-height: 300px; height: var(--content-height); }
486
- .markdown-content { overflow: auto; padding: 0 4px 0 0; }
990
+ .markdown-editor-textarea:focus {
991
+ box-shadow: none;
992
+ }
487
993
 
488
994
  .image-content {
489
995
  display: flex;
@@ -495,9 +1001,7 @@ body.dc-ready {
495
1001
 
496
1002
  .image-preview {
497
1003
  width: 100%;
498
- height: var(--content-height);
499
1004
  max-width: 920px;
500
- max-height: 100%;
501
1005
  display: flex;
502
1006
  align-items: center;
503
1007
  justify-content: center;
@@ -505,7 +1009,7 @@ body.dc-ready {
505
1009
 
506
1010
  .image-preview img {
507
1011
  max-width: 100%;
508
- max-height: 100%;
1012
+ max-height: var(--content-height);
509
1013
  object-fit: contain;
510
1014
  border-radius: 8px;
511
1015
  border: 1px solid var(--border);
@@ -741,6 +1245,17 @@ body.dc-ready {
741
1245
  border-radius: 10px;
742
1246
  }
743
1247
 
1248
+ .markdown-doc a {
1249
+ color: inherit;
1250
+ text-decoration: underline;
1251
+ text-decoration-color: color-mix(in srgb, var(--text-secondary) 45%, transparent);
1252
+ text-underline-offset: 0.18em;
1253
+ }
1254
+
1255
+ .markdown-doc a:hover {
1256
+ text-decoration-color: currentcolor;
1257
+ }
1258
+
744
1259
  /* ── HTML frame ── */
745
1260
 
746
1261
  .html-rendered-frame {
@@ -755,6 +1270,52 @@ body.dc-ready {
755
1270
  /* ── Responsive ── */
756
1271
 
757
1272
  @media (max-width: 720px) {
1273
+ .markdown-workspace {
1274
+ flex-direction: column;
1275
+ }
1276
+ .markdown-workspace--edit {
1277
+ min-height: auto;
1278
+ }
1279
+ .markdown-workspace--with-toc {
1280
+ background: transparent;
1281
+ }
1282
+ .markdown-editor-shell {
1283
+ padding: 12px;
1284
+ }
1285
+ .markdown-toc-shell {
1286
+ position: static;
1287
+ top: auto;
1288
+ max-height: none;
1289
+ overflow: visible;
1290
+ align-self: stretch;
1291
+ width: 100% !important;
1292
+ flex-basis: auto !important;
1293
+ border-right: none;
1294
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
1295
+ }
1296
+ .markdown-toc-collapsed .markdown-toc-title,
1297
+ .markdown-toc-collapsed .markdown-toc-nav {
1298
+ display: flex;
1299
+ }
1300
+ .document-outline-toggle {
1301
+ display: none;
1302
+ }
1303
+ .markdown-workspace-main {
1304
+ padding-left: 0;
1305
+ }
1306
+ .markdown-toc-nav {
1307
+ max-height: 40vh;
1308
+ }
1309
+ .markdown-editor-root {
1310
+ padding: 0;
1311
+ }
1312
+ .markdown-editor-textarea {
1313
+ min-height: 58vh;
1314
+ padding: 14px;
1315
+ }
1316
+ .markdown-editor-surface--markdown {
1317
+ padding: 16px;
1318
+ }
758
1319
  .markdown-doc { padding: 16px; }
759
1320
  .markdown-doc h1 { font-size: 27px; }
760
1321
  .markdown-doc h2 { font-size: 22px; }
@@ -762,3 +1323,309 @@ body.dc-ready {
762
1323
  .markdown-doc p, .markdown-doc li { font-size: 15px; }
763
1324
  }
764
1325
 
1326
+ /* ── Directory tree ── */
1327
+
1328
+ .directory-content {
1329
+ padding: 12px 16px;
1330
+ font-family: var(--font-mono, ui-monospace, monospace);
1331
+ font-size: 13px;
1332
+ line-height: 1.6;
1333
+ }
1334
+
1335
+ .dir-tree {
1336
+ display: flex;
1337
+ flex-direction: column;
1338
+ }
1339
+
1340
+ .dir-entry, .dir-entry-group {
1341
+ display: flex;
1342
+ flex-direction: column;
1343
+ }
1344
+
1345
+ .dir-row {
1346
+ display: flex;
1347
+ align-items: center;
1348
+ gap: 4px;
1349
+ padding: 2px 6px;
1350
+ border-radius: 4px;
1351
+ cursor: pointer;
1352
+ user-select: none;
1353
+ }
1354
+
1355
+ .dir-row:hover {
1356
+ background: color-mix(in srgb, var(--text) 8%, transparent);
1357
+ }
1358
+
1359
+ .dir-row-file:active {
1360
+ background: color-mix(in srgb, var(--text) 14%, transparent);
1361
+ }
1362
+
1363
+ .dir-row.dir-loading {
1364
+ opacity: 0.5;
1365
+ pointer-events: none;
1366
+ }
1367
+
1368
+ .dir-children {
1369
+ padding-left: 20px;
1370
+ border-left: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
1371
+ margin-left: 11px;
1372
+ }
1373
+
1374
+ .dir-children.dir-collapsed {
1375
+ display: none;
1376
+ }
1377
+
1378
+ .dir-chevron {
1379
+ display: inline-block;
1380
+ width: 14px;
1381
+ text-align: center;
1382
+ font-size: 10px;
1383
+ color: var(--secondary);
1384
+ flex-shrink: 0;
1385
+ transition: transform 0.15s ease;
1386
+ }
1387
+
1388
+ .dir-icon, .file-icon {
1389
+ font-size: 14px;
1390
+ flex-shrink: 0;
1391
+ }
1392
+
1393
+ .dir-name {
1394
+ font-weight: 600;
1395
+ color: var(--text);
1396
+ }
1397
+
1398
+ .dir-name-denied {
1399
+ color: var(--secondary);
1400
+ text-decoration: line-through;
1401
+ }
1402
+
1403
+ .file-name {
1404
+ color: var(--secondary);
1405
+ }
1406
+
1407
+ .dir-row-file:hover .file-name {
1408
+ color: var(--text);
1409
+ }
1410
+
1411
+ .dir-empty {
1412
+ color: var(--secondary);
1413
+ font-style: italic;
1414
+ padding: 4px 6px;
1415
+ }
1416
+
1417
+ .dir-row-warning {
1418
+ cursor: default;
1419
+ opacity: 0.7;
1420
+ font-style: italic;
1421
+ font-size: 12px;
1422
+ }
1423
+
1424
+ .dir-row-warning:hover {
1425
+ background: none;
1426
+ }
1427
+
1428
+ .dir-load-more {
1429
+ cursor: pointer;
1430
+ }
1431
+
1432
+ .dir-load-more:hover {
1433
+ background: color-mix(in srgb, var(--text) 8%, transparent) !important;
1434
+ opacity: 1;
1435
+ }
1436
+
1437
+ .dir-load-more:hover .dir-warning-text {
1438
+ text-decoration: underline;
1439
+ }
1440
+
1441
+ .dir-warning-text {
1442
+ color: var(--secondary);
1443
+ }
1444
+
1445
+ .dir-back-btn {
1446
+ flex-shrink: 0;
1447
+ margin-right: 4px;
1448
+ font-weight: 600;
1449
+ }
1450
+
1451
+ .dir-open-btn {
1452
+ margin-left: 6px;
1453
+ padding: 0 4px;
1454
+ border: none;
1455
+ background: none;
1456
+ cursor: pointer;
1457
+ font-size: 13px;
1458
+ opacity: 0;
1459
+ flex-shrink: 0;
1460
+ border-radius: 3px;
1461
+ pointer-events: none;
1462
+ transition: opacity 0.1s ease;
1463
+ }
1464
+
1465
+ .dir-open-btn:hover {
1466
+ background: color-mix(in srgb, var(--text) 10%, transparent);
1467
+ }
1468
+
1469
+ .dir-row-folder:hover .dir-open-btn {
1470
+ opacity: 0.6;
1471
+ pointer-events: auto;
1472
+ }
1473
+
1474
+ .dir-row-folder:hover .dir-open-btn:hover {
1475
+ opacity: 1;
1476
+ }
1477
+
1478
+ /* === File-changed-on-disk conflict modal === */
1479
+
1480
+ .md-conflict-modal[hidden] {
1481
+ display: none;
1482
+ }
1483
+
1484
+ .md-conflict-modal {
1485
+ position: fixed;
1486
+ inset: 0;
1487
+ background: rgba(0, 0, 0, 0.42);
1488
+ display: grid;
1489
+ place-items: center;
1490
+ z-index: 50;
1491
+ padding: 16px;
1492
+ box-sizing: border-box;
1493
+ }
1494
+
1495
+ .md-conflict-card {
1496
+ width: min(480px, 100%);
1497
+ max-height: min(80vh, 560px);
1498
+ background: var(--panel);
1499
+ color: var(--text);
1500
+ border: 1px solid var(--border);
1501
+ border-radius: 10px;
1502
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
1503
+ padding: 0;
1504
+ display: flex;
1505
+ flex-direction: column;
1506
+ overflow: hidden;
1507
+ }
1508
+
1509
+ .md-conflict-header {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ justify-content: space-between;
1513
+ padding: 14px 16px 10px;
1514
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1515
+ }
1516
+
1517
+ .md-conflict-header h3 {
1518
+ margin: 0;
1519
+ font-size: 14px;
1520
+ font-weight: 600;
1521
+ color: var(--text);
1522
+ }
1523
+
1524
+ .md-conflict-close {
1525
+ display: inline-flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ width: 24px;
1529
+ height: 24px;
1530
+ padding: 0;
1531
+ background: transparent;
1532
+ border: none;
1533
+ border-radius: 4px;
1534
+ color: var(--text-secondary);
1535
+ cursor: pointer;
1536
+ transition: background-color 120ms ease, color 120ms ease;
1537
+ }
1538
+
1539
+ .md-conflict-close:hover {
1540
+ background: var(--panel-subtle);
1541
+ color: var(--text);
1542
+ }
1543
+
1544
+ .md-conflict-close svg {
1545
+ width: 16px;
1546
+ height: 16px;
1547
+ }
1548
+
1549
+ .md-conflict-body {
1550
+ padding: 14px 16px;
1551
+ overflow-y: auto;
1552
+ font-size: 13px;
1553
+ line-height: 1.5;
1554
+ color: var(--text);
1555
+ }
1556
+
1557
+ .md-conflict-body p {
1558
+ margin: 0 0 10px;
1559
+ }
1560
+
1561
+ .md-conflict-body p:last-of-type {
1562
+ margin-bottom: 8px;
1563
+ }
1564
+
1565
+ .md-conflict-body ul {
1566
+ margin: 0 0 4px;
1567
+ padding-left: 20px;
1568
+ color: var(--text-secondary);
1569
+ }
1570
+
1571
+ .md-conflict-body li {
1572
+ margin-bottom: 4px;
1573
+ }
1574
+
1575
+ .md-conflict-filename {
1576
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1577
+ font-weight: 600;
1578
+ word-break: break-all;
1579
+ }
1580
+
1581
+ .md-conflict-footer {
1582
+ display: flex;
1583
+ justify-content: flex-end;
1584
+ gap: 8px;
1585
+ padding: 12px 16px 14px;
1586
+ border-top: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1587
+ background: color-mix(in srgb, var(--panel-subtle) 50%, transparent);
1588
+ }
1589
+
1590
+ .md-conflict-btn {
1591
+ appearance: none;
1592
+ font: inherit;
1593
+ font-size: 13px;
1594
+ font-weight: 500;
1595
+ padding: 7px 14px;
1596
+ border-radius: 6px;
1597
+ cursor: pointer;
1598
+ border: 1px solid var(--border);
1599
+ background: var(--panel);
1600
+ color: var(--text);
1601
+ transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
1602
+ }
1603
+
1604
+ .md-conflict-btn:hover {
1605
+ background: var(--panel-subtle);
1606
+ }
1607
+
1608
+ .md-conflict-btn:focus-visible {
1609
+ outline: 2px solid var(--accent, #4a8cff);
1610
+ outline-offset: 2px;
1611
+ }
1612
+
1613
+ .md-conflict-btn--secondary {
1614
+ color: var(--text-secondary);
1615
+ }
1616
+
1617
+ .md-conflict-btn--secondary:hover {
1618
+ color: var(--text);
1619
+ border-color: color-mix(in srgb, var(--border) 80%, var(--text) 20%);
1620
+ }
1621
+
1622
+ .md-conflict-btn--primary {
1623
+ background: var(--accent, #4a8cff);
1624
+ color: #fff;
1625
+ border-color: color-mix(in srgb, var(--accent, #4a8cff) 85%, black 15%);
1626
+ }
1627
+
1628
+ .md-conflict-btn--primary:hover {
1629
+ background: color-mix(in srgb, var(--accent, #4a8cff) 88%, black 12%);
1630
+ }
1631
+