collabmd 0.1.44 → 0.1.45

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 (170) hide show
  1. package/dist/client/assets/{chunk-AXR3VHVW-0GTk_evH.js → chunk-ERSWUTIN-ME9RVNel.js} +3 -3
  2. package/dist/client/assets/{chunk-CZQZEIFA-DT3N9fo7.js → chunk-YGJVY4SA-CjSe7Bx7.js} +2 -2
  3. package/dist/client/assets/{comment-threads-D-iKphIp.js → comment-threads-DDegmaFO.js} +1 -1
  4. package/dist/client/assets/drawio-editor-ClE8jpoG.js +9 -0
  5. package/dist/client/assets/drawioEditor-CXaTM9Ds.js +2 -0
  6. package/dist/client/assets/editor-session-GTwZS6Df.js +16 -0
  7. package/dist/client/assets/embedded-editor-base-CiNEc8vy.css +1 -0
  8. package/dist/client/assets/{en-GADW4C6J-DQ6zyCEM.js → en-7NFCYGKX-BrgYZAEe.js} +1 -1
  9. package/dist/client/assets/{excalidraw-editor-BHu6k8d4.js → excalidraw-editor-BZVM81BO.js} +2 -2
  10. package/dist/client/assets/excalidraw-editor-CyGwOhLz.css +1 -0
  11. package/dist/client/assets/excalidraw-scene-C8n9CHsK.js +176 -0
  12. package/dist/client/assets/excalidrawEditor-DxJanCze.js +2 -0
  13. package/dist/client/assets/export-page-CUfws2T-.js +39 -0
  14. package/dist/client/assets/exportDocument-BCuxqXDY.js +2 -0
  15. package/dist/client/assets/exportDocument-DV-OX74E.css +1 -0
  16. package/dist/client/assets/image-QXRYHUNP-lfTHE3bb.js +1 -0
  17. package/dist/client/assets/index-C3YnUgMD.css +1 -0
  18. package/dist/client/assets/index-D2wXraJ1.js +2 -0
  19. package/dist/client/assets/main-DtiGz7uI.js +795 -0
  20. package/dist/client/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
  21. package/dist/client/assets/preview-diagram-utils-txBCoW8d.js +1 -0
  22. package/dist/client/assets/quick-switcher-controller-shW_6vPY.js +12 -0
  23. package/dist/client/assets/room-CQLoqtMo.js +1 -0
  24. package/dist/client/assets/runtime-config-DSGmGE9V.js +1 -0
  25. package/dist/client/assets/vault-api-client-C6bcGwy-.js +5 -0
  26. package/dist/client/assets/{yjs-provider-reset-guard-Cox4nxwu.js → yjs-provider-reset-guard-DE0vINDP.js} +1 -1
  27. package/dist/client/drawio-editor.html +3 -2
  28. package/dist/client/excalidraw-editor.html +3 -2
  29. package/dist/client/export-document.html +4 -3
  30. package/dist/client/index.html +97 -27
  31. package/package.json +10 -12
  32. package/src/client/app/drawio-editor-entry.js +0 -3
  33. package/src/client/app/drawio-editor.html +1 -0
  34. package/src/client/app/excalidraw-editor-entry.js +0 -3
  35. package/src/client/app/excalidraw-editor.html +1 -0
  36. package/src/client/app/export-document-entry.js +0 -3
  37. package/src/client/app/export-document.html +1 -0
  38. package/src/client/app/index.html +94 -24
  39. package/src/client/app/main-entry.js +0 -5
  40. package/src/client/application/app-shell/chat-feature.js +180 -124
  41. package/src/client/application/app-shell/comments-feature.js +1 -1
  42. package/src/client/application/app-shell/git-feature.js +4 -9
  43. package/src/client/application/app-shell/presence-feature.js +16 -10
  44. package/src/client/application/app-shell/ui-feature-shell.js +33 -15
  45. package/src/client/application/app-shell/ui-feature-sidebar.js +74 -1
  46. package/src/client/application/app-shell/ui-feature-tab-activity.js +2 -2
  47. package/src/client/application/app-shell/workspace-feature.js +22 -83
  48. package/src/client/application/app-shell-elements.js +7 -1
  49. package/src/client/application/diagram-chrome.js +161 -166
  50. package/src/client/application/diagram-preview-export.js +7 -34
  51. package/src/client/application/diagram-preview-hydrator.js +1 -19
  52. package/src/client/application/markdown-frontmatter.js +0 -2
  53. package/src/client/application/mermaid-preview-hydrator.js +1 -14
  54. package/src/client/application/plantuml-preview-hydrator.js +0 -10
  55. package/src/client/application/preview-diagram-utils.js +31 -2
  56. package/src/client/application/preview-render-compiler.js +2 -1
  57. package/src/client/application/preview-renderer.js +2 -2
  58. package/src/client/application/quick-switcher-loader.js +3 -1
  59. package/src/client/application/workspace-preview-controller.js +0 -3
  60. package/src/client/bootstrap/collabmd-app-shell.js +125 -39
  61. package/src/client/domain/excalidraw-collaboration.js +0 -2
  62. package/src/client/domain/room.js +38 -0
  63. package/src/client/export/export-pipeline.js +6 -34
  64. package/src/client/infrastructure/auth-client.js +4 -10
  65. package/src/client/infrastructure/browser-notification-port.js +33 -20
  66. package/src/client/infrastructure/browser-preferences-port.js +36 -9
  67. package/src/client/infrastructure/editor-view-adapter.js +87 -3
  68. package/src/client/infrastructure/lobby-presence.js +1 -0
  69. package/src/client/infrastructure/vault-api-client.js +25 -0
  70. package/src/client/infrastructure/workspace-sync-client.js +13 -1
  71. package/src/client/presentation/comment-overview-controller.js +18 -53
  72. package/src/client/presentation/comment-ui/comment-ui-card.js +1 -12
  73. package/src/client/presentation/comment-ui/comment-ui-layout.js +242 -219
  74. package/src/client/presentation/comment-ui/comment-ui-render.js +32 -45
  75. package/src/client/presentation/comment-ui/comment-ui-shared.js +65 -14
  76. package/src/client/presentation/comment-ui-controller.js +5 -1
  77. package/src/client/presentation/file-action-controller.js +32 -0
  78. package/src/client/presentation/file-explorer-controller.js +33 -3
  79. package/src/client/presentation/file-explorer-view.js +49 -5
  80. package/src/client/presentation/file-tree-state.js +10 -4
  81. package/src/client/presentation/quick-switcher-controller.js +243 -72
  82. package/src/client/presentation/quick-switcher-text-search.js +2 -2
  83. package/src/client/presentation/toast-controller.js +3 -0
  84. package/src/client/styles/components/feedback.css +6 -0
  85. package/src/client/styles/features/collaboration-chat.css +49 -53
  86. package/src/client/styles/features/collaboration-presence.css +9 -7
  87. package/src/client/styles/features/comment-card.css +25 -11
  88. package/src/client/styles/features/comment-overlays.css +0 -4
  89. package/src/client/styles/features/comment-overview.css +44 -21
  90. package/src/client/styles/features/comments-drawer.css +2 -100
  91. package/src/client/styles/features/diagram-preview.css +5 -18
  92. package/src/client/styles/features/embedded-preview.css +8 -33
  93. package/src/client/styles/features/quick-switcher.css +8 -0
  94. package/src/client/styles/foundation/tokens.css +1 -0
  95. package/src/client/styles/layout/editor-page.css +40 -0
  96. package/src/client/styles/layout/responsive.css +31 -1
  97. package/src/client/styles/layout/shell.css +25 -6
  98. package/src/client/styles/layout/sidebar.css +47 -15
  99. package/src/client/styles/overrides/codemirror.css +217 -15
  100. package/src/server/application/workspace-reconciliation.js +1 -1
  101. package/src/server/create-app-server.js +2 -3
  102. package/src/server/domain/bases/base-query-service.js +1 -77
  103. package/src/server/domain/comment-overview.js +10 -3
  104. package/src/server/domain/docx-exporter.js +24 -33
  105. package/src/server/domain/ripgrep-search-service.js +3 -1
  106. package/src/server/domain/workspace-state.js +32 -11
  107. package/src/server/infrastructure/git/diff-service.js +24 -13
  108. package/src/server/infrastructure/git/git-service.js +40 -10
  109. package/src/server/infrastructure/git/history-service.js +42 -29
  110. package/src/server/infrastructure/git/path-utils.js +1 -1
  111. package/src/server/infrastructure/git/responses.js +0 -95
  112. package/src/server/infrastructure/github/github-app-client.js +22 -15
  113. package/src/server/infrastructure/http/create-request-handler.js +2 -8
  114. package/src/server/infrastructure/http/create-vault-api-command-handler.js +5 -5
  115. package/src/server/infrastructure/http/http-errors.js +7 -1
  116. package/dist/client/assets/bases-preview-controller-2pLHk0uk.js +0 -143
  117. package/dist/client/assets/button-BCEiw4Rw.js +0 -1
  118. package/dist/client/assets/diagram-action-icons-aa_KOv9h.js +0 -36
  119. package/dist/client/assets/drawio-editor-DDvFoarP.js +0 -9
  120. package/dist/client/assets/drawio-embed-controller-BD1GTRwn.js +0 -1
  121. package/dist/client/assets/drawioEditor-Bu5grlH5.js +0 -2
  122. package/dist/client/assets/editor-session-DGlpiAsK.js +0 -16
  123. package/dist/client/assets/embedded-editor-base-C9roKYpW.css +0 -1
  124. package/dist/client/assets/excalidraw-editor-Cr_184EF.css +0 -1
  125. package/dist/client/assets/excalidraw-embed-controller-y2fenN_g.js +0 -1
  126. package/dist/client/assets/excalidraw-embed-reconciler-DGiagExg.js +0 -1
  127. package/dist/client/assets/excalidraw-scene-BvsQ6mLP.js +0 -176
  128. package/dist/client/assets/excalidrawEditor-4vFE--Uw.js +0 -2
  129. package/dist/client/assets/export-page-Cby8JzPO.js +0 -39
  130. package/dist/client/assets/exportDocument-C9v-bc7I.css +0 -1
  131. package/dist/client/assets/exportDocument-CRHCfsdo.js +0 -2
  132. package/dist/client/assets/file-history-view-controller-BDjEV9xJ.js +0 -112
  133. package/dist/client/assets/git-diff-view-controller-DgdM1aqb.js +0 -150
  134. package/dist/client/assets/git-panel-controller-BDTR2HVp.js +0 -207
  135. package/dist/client/assets/image-XGD7JQR6-XDUWHRpO.js +0 -1
  136. package/dist/client/assets/index-7xOyXDhP.css +0 -1
  137. package/dist/client/assets/index-Bz1KuQ6y.js +0 -2
  138. package/dist/client/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  139. package/dist/client/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  140. package/dist/client/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  141. package/dist/client/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  142. package/dist/client/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  143. package/dist/client/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  144. package/dist/client/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  145. package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  146. package/dist/client/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  147. package/dist/client/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  148. package/dist/client/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  149. package/dist/client/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  150. package/dist/client/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  151. package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  152. package/dist/client/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  153. package/dist/client/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  154. package/dist/client/assets/main-Ci07m9oP.js +0 -152
  155. package/dist/client/assets/preview-diagram-utils-n_bbJA9V.js +0 -1
  156. package/dist/client/assets/quick-switcher-controller-CoiYvllm.js +0 -12
  157. package/dist/client/assets/room-CDrmIdDt.js +0 -1
  158. package/dist/client/assets/runtime-config-CDgeuPWN.js +0 -1
  159. package/dist/client/assets/runtime-config-loader-BHGniHP5.js +0 -1
  160. package/dist/client/assets/runtime-paths-DvpihCEq.js +0 -1
  161. package/dist/client/assets/segmented-control-DJrHSz8M.js +0 -1
  162. package/dist/client/assets/vault-api-client-sLB2bo56.js +0 -1
  163. package/dist/client/assets/vault-paths-CVkuh0j-.js +0 -5
  164. package/src/client/bootstrap/lazy-controller-feature.js +0 -433
  165. package/src/client/infrastructure/backlinks-api-client.js +0 -16
  166. package/src/client/infrastructure/plantuml-api-client.js +0 -19
  167. package/src/client/infrastructure/runtime-config-loader.js +0 -56
  168. package/src/server/infrastructure/git/command-runner.js +0 -49
  169. package/src/server/infrastructure/git/errors.js +0 -8
  170. package/src/server/infrastructure/http/create-esm-proxy-handler.js +0 -130
@@ -181,6 +181,43 @@
181
181
  min-width: 0;
182
182
  }
183
183
 
184
+ .toolbar-search-trigger {
185
+ flex-shrink: 0;
186
+ min-height: 30px;
187
+ padding-inline: var(--space-2);
188
+ border-color: var(--color-divider);
189
+ background: var(--color-surface-offset);
190
+ color: var(--color-text-muted);
191
+ box-shadow: none;
192
+ }
193
+
194
+ .toolbar-search-trigger:hover {
195
+ border-color: var(--color-border);
196
+ background: var(--color-surface-dynamic);
197
+ color: var(--color-text);
198
+ }
199
+
200
+ .toolbar-search-trigger > svg {
201
+ color: var(--color-primary);
202
+ }
203
+
204
+ .toolbar-search-label {
205
+ font-weight: 600;
206
+ }
207
+
208
+ .toolbar-search-kbd {
209
+ margin-left: var(--space-1);
210
+ padding: 2px 5px;
211
+ border: 1px solid var(--color-divider);
212
+ border-radius: var(--radius-xs);
213
+ background: var(--color-surface);
214
+ color: var(--color-text-faint);
215
+ font-family: var(--font-body);
216
+ font-size: var(--text-meta);
217
+ font-weight: 600;
218
+ line-height: 1.4;
219
+ }
220
+
184
221
  .toolbar-room-name {
185
222
  overflow: hidden;
186
223
  text-overflow: ellipsis;
@@ -196,6 +233,9 @@
196
233
  }
197
234
 
198
235
  .toolbar-center {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: var(--space-3);
199
239
  flex-shrink: 0;
200
240
  }
201
241
 
@@ -19,9 +19,16 @@
19
19
  left: 0;
20
20
  bottom: 0;
21
21
  z-index: 100;
22
+ width: min(var(--sidebar-width), calc(100vw - 32px));
23
+ min-width: min(var(--sidebar-width), calc(100vw - 32px));
24
+ max-width: min(var(--sidebar-width), calc(100vw - 32px));
22
25
  box-shadow: var(--shadow-lg);
23
26
  }
24
27
 
28
+ .sidebar-resizer {
29
+ display: none;
30
+ }
31
+
25
32
  .sidebar.collapsed {
26
33
  display: none;
27
34
  }
@@ -42,6 +49,10 @@
42
49
  }
43
50
 
44
51
  .toolbar-center {
52
+ gap: 0;
53
+ }
54
+
55
+ .toolbar-center .view-toggle {
45
56
  display: none;
46
57
  }
47
58
 
@@ -72,6 +83,25 @@
72
83
  font-size: var(--text-xs);
73
84
  }
74
85
 
86
+ .toolbar-search-trigger {
87
+ width: 28px;
88
+ min-width: 28px;
89
+ min-height: 28px;
90
+ padding: 0;
91
+ border-color: transparent;
92
+ background: transparent;
93
+ }
94
+
95
+ .toolbar-search-trigger:hover {
96
+ border-color: transparent;
97
+ background: var(--color-surface-offset);
98
+ }
99
+
100
+ .toolbar-search-label,
101
+ .toolbar-search-kbd {
102
+ display: none;
103
+ }
104
+
75
105
  .toolbar-badge {
76
106
  max-width: 68px;
77
107
  overflow: hidden;
@@ -419,7 +449,7 @@
419
449
  right: var(--space-2);
420
450
  left: var(--space-2);
421
451
  width: auto;
422
- max-height: calc(100vh - var(--toolbar-h) - var(--space-6));
452
+ max-height: calc(var(--app-viewport-height, 100dvh) - var(--toolbar-h) - var(--space-6));
423
453
  }
424
454
 
425
455
  .chat-form {
@@ -155,7 +155,6 @@
155
155
  --preview-floating-comments-width: var(--panel-comments-width);
156
156
  --preview-floating-outline-width: var(--panel-outline-width);
157
157
  --preview-content-max-width: var(--preview-content-width);
158
- --preview-comment-rail-inset: 10px;
159
158
  position: relative;
160
159
  display: flex;
161
160
  flex: 1;
@@ -173,14 +172,12 @@
173
172
  }
174
173
 
175
174
  .preview-content {
176
- --preview-comment-rail-reserved: 0px;
177
- --preview-comment-rail-offset: 0px;
178
175
  position: relative;
179
176
  min-width: 0;
180
177
  max-width: var(--preview-content-max-width);
181
178
  margin: 0 auto;
182
179
  overflow: visible;
183
- padding: var(--space-6) calc(var(--space-6) + var(--preview-comment-rail-reserved)) var(--space-12) var(--space-6);
180
+ padding: var(--space-6) var(--space-6) var(--space-12);
184
181
  color: var(--color-text);
185
182
  font-family: var(--font-body);
186
183
  font-size: var(--text-sm);
@@ -228,9 +225,15 @@
228
225
 
229
226
  .preview-content.is-plantuml-file-preview,
230
227
  .preview-content.is-mermaid-file-preview {
228
+ display: flex;
229
+ flex-direction: column;
230
+ box-sizing: border-box;
231
231
  width: 100%;
232
232
  min-height: 100%;
233
+ height: 100%;
233
234
  max-width: none;
235
+ margin: 0;
236
+ padding: var(--space-3);
234
237
  }
235
238
 
236
239
  .preview-content.is-drawio-file-preview {
@@ -247,7 +250,13 @@
247
250
 
248
251
  .preview-content.is-mermaid-file-preview [data-preview-render-host='true'],
249
252
  .preview-content.is-plantuml-file-preview [data-preview-render-host='true'] {
250
- min-height: 100%;
253
+ display: flex;
254
+ flex: 1;
255
+ flex-direction: column;
256
+ width: 100%;
257
+ max-width: none;
258
+ min-width: 0;
259
+ min-height: 0;
251
260
  }
252
261
 
253
262
  .preview-content.is-drawio-file-preview [data-preview-render-host='true'],
@@ -282,8 +291,18 @@
282
291
 
283
292
  .preview-content.is-mermaid-file-preview .mermaid-shell,
284
293
  .preview-content.is-plantuml-file-preview .plantuml-shell {
285
- min-height: 100%;
294
+ flex: 1;
295
+ min-height: 0;
296
+ height: auto;
286
297
  margin: 0;
298
+ grid-template-rows: auto minmax(0, 1fr);
299
+ }
300
+
301
+ .preview-content.is-mermaid-file-preview .mermaid-frame,
302
+ .preview-content.is-plantuml-file-preview .plantuml-frame {
303
+ height: 100%;
304
+ min-height: 0;
305
+ max-height: none;
287
306
  }
288
307
 
289
308
  .preview-content.is-drawio-file-preview .drawio-embed,
@@ -1,11 +1,12 @@
1
1
  /* ===== SIDEBAR ===== */
2
2
 
3
3
  .sidebar {
4
+ position: relative;
4
5
  display: flex;
5
6
  flex-direction: column;
6
- width: 260px;
7
- min-width: 260px;
8
- max-width: 260px;
7
+ width: var(--sidebar-width);
8
+ min-width: var(--sidebar-width);
9
+ max-width: var(--sidebar-width);
9
10
  overflow: hidden;
10
11
  border-right: 1px solid var(--color-divider);
11
12
  background: var(--color-surface);
@@ -19,6 +20,36 @@
19
20
  border-right: none;
20
21
  }
21
22
 
23
+ .sidebar.is-resizing {
24
+ transition: none;
25
+ }
26
+
27
+ .sidebar-resizer {
28
+ position: absolute;
29
+ top: 0;
30
+ right: 0;
31
+ bottom: 0;
32
+ z-index: 5;
33
+ width: 8px;
34
+ padding: 0;
35
+ border: 0;
36
+ border-right: 2px solid transparent;
37
+ cursor: col-resize;
38
+ touch-action: none;
39
+ transition: border-color var(--transition-interactive);
40
+ }
41
+
42
+ .sidebar-resizer:hover,
43
+ .sidebar-resizer:focus-visible,
44
+ .sidebar.is-resizing .sidebar-resizer {
45
+ border-right-color: var(--color-primary);
46
+ opacity: 0.72;
47
+ }
48
+
49
+ .sidebar-resizer:focus-visible {
50
+ outline: none;
51
+ }
52
+
22
53
  .sidebar-backdrop,
23
54
  .sidebar-backdrop[hidden] {
24
55
  display: none;
@@ -70,7 +101,8 @@
70
101
  font-weight: 600;
71
102
  }
72
103
 
73
- .sidebar-create-btn[aria-expanded='true'] {
104
+ .sidebar-create-btn[aria-expanded='true'],
105
+ .sidebar-options-btn[aria-expanded='true'] {
74
106
  border-color: var(--interactive-border);
75
107
  background: var(--interactive-surface);
76
108
  color: var(--color-primary);
@@ -328,8 +360,8 @@ body.is-file-tree-dragging * {
328
360
  .create-menu {
329
361
  position: fixed;
330
362
  z-index: 1010;
331
- width: min(280px, calc(100vw - 16px));
332
- padding: var(--space-2);
363
+ width: min(240px, calc(100vw - 24px));
364
+ padding: 6px;
333
365
  border: 1px solid var(--color-border);
334
366
  border-radius: var(--radius-lg);
335
367
  background: oklch(from var(--color-surface) l c h / 0.98);
@@ -340,7 +372,7 @@ body.is-file-tree-dragging * {
340
372
  .create-menu-group,
341
373
  .create-action-sheet-group,
342
374
  .create-action-sheet-header {
343
- padding: 0 var(--space-2);
375
+ padding: 0 10px;
344
376
  color: var(--color-text-faint);
345
377
  font-size: var(--text-meta);
346
378
  font-weight: 700;
@@ -350,7 +382,7 @@ body.is-file-tree-dragging * {
350
382
 
351
383
  .create-menu-group:not(:first-child),
352
384
  .create-action-sheet-group:not(:first-child) {
353
- margin-top: 8px;
385
+ margin-top: 10px;
354
386
  }
355
387
 
356
388
  .create-action-sheet-header {
@@ -360,10 +392,10 @@ body.is-file-tree-dragging * {
360
392
  .create-menu-item {
361
393
  display: flex;
362
394
  align-items: center;
363
- gap: var(--space-2);
395
+ gap: 8px;
364
396
  width: 100%;
365
- margin-top: 2px;
366
- padding: var(--space-2);
397
+ min-height: 36px;
398
+ padding: 0 10px;
367
399
  border: none;
368
400
  border-radius: var(--radius-md);
369
401
  background: transparent;
@@ -384,19 +416,19 @@ body.is-file-tree-dragging * {
384
416
  display: inline-flex;
385
417
  align-items: center;
386
418
  justify-content: center;
387
- width: 18px;
388
- min-width: 18px;
419
+ width: 16px;
420
+ min-width: 16px;
389
421
  color: var(--color-text-muted);
390
422
  }
391
423
 
392
424
  .create-menu-item-copy {
393
425
  display: grid;
394
- gap: 2px;
426
+ gap: 1px;
395
427
  min-width: 0;
396
428
  }
397
429
 
398
430
  .create-menu-item-label {
399
- font-size: var(--text-sm);
431
+ font-size: var(--text-xs);
400
432
  font-weight: 600;
401
433
  }
402
434
 
@@ -56,38 +56,174 @@
56
56
  border-bottom: 1px solid var(--color-divider);
57
57
  }
58
58
 
59
+ .cm-panels-bottom {
60
+ border-top: 1px solid var(--color-divider);
61
+ }
62
+
59
63
  .cm-panel.cm-search {
60
- gap: var(--space-2);
64
+ display: flex;
65
+ flex-wrap: wrap;
66
+ gap: 4px 8px;
67
+ width: 100%;
61
68
  align-items: center;
62
- padding: var(--space-2);
63
- background: oklch(from var(--color-surface) l c h / 0.98);
69
+ padding: 8px !important;
70
+ border-top: 0;
71
+ background: var(--color-surface);
64
72
  color: var(--color-text);
65
- box-shadow: inset 0 -1px 0 var(--color-divider);
66
73
  font-family: var(--font-body);
67
74
  }
68
75
 
76
+ .cm-panel.cm-search > * {
77
+ margin: 0 !important;
78
+ }
79
+
69
80
  .cm-panel.cm-search label {
70
81
  display: inline-flex;
71
82
  align-items: center;
72
- gap: 6px;
83
+ min-height: 22px;
84
+ gap: var(--space-1);
85
+ padding: 0 8px 0 6px;
86
+ border: 1px solid transparent;
87
+ border-radius: var(--radius-sm);
88
+ background: transparent;
73
89
  color: var(--color-text-muted);
74
- font-size: var(--text-xs);
90
+ font-size: var(--text-meta) !important;
75
91
  font-weight: 600;
92
+ line-height: 1;
93
+ white-space: nowrap !important;
94
+ transition:
95
+ background var(--transition-interactive),
96
+ border-color var(--transition-interactive),
97
+ color var(--transition-interactive);
98
+ }
99
+
100
+ .cm-panel.cm-search label:hover {
101
+ background: var(--color-surface-offset);
102
+ color: var(--color-text);
103
+ }
104
+
105
+ .cm-panel.cm-search label:has(input:checked) {
106
+ border-color: var(--interactive-border);
107
+ background: var(--interactive-surface);
108
+ color: var(--color-primary);
109
+ }
110
+
111
+ .cm-panel.cm-search label input[type='checkbox'] {
112
+ width: 13px;
113
+ height: 13px;
114
+ margin: 0;
115
+ accent-color: var(--color-primary);
76
116
  }
77
117
 
78
118
  .cm-panel.cm-search .cm-textfield {
79
- min-height: 32px;
80
- padding: 0 var(--space-2);
119
+ width: auto;
120
+ min-width: 0;
121
+ min-height: var(--control-h-sm);
122
+ padding: 0 10px;
81
123
  border: 1px solid var(--color-border);
82
124
  border-radius: var(--radius-sm);
83
125
  background: var(--color-surface-offset);
84
126
  color: var(--color-text);
85
127
  font-family: var(--font-body);
86
- font-size: var(--text-sm);
128
+ font-size: var(--text-ui-sm);
129
+ line-height: 1;
130
+ transition:
131
+ background var(--transition-interactive),
132
+ border-color var(--transition-interactive),
133
+ box-shadow var(--transition-interactive);
134
+ }
135
+
136
+ .cm-panel.cm-search .cm-textfield:hover:not(:focus) {
137
+ border-color: color-mix(in oklab, var(--color-border) 70%, var(--color-text-faint) 30%);
138
+ }
139
+
140
+ .cm-panel.cm-search .cm-textfield:focus {
141
+ outline: none;
142
+ border-color: var(--color-primary);
143
+ background: var(--color-surface);
144
+ box-shadow: var(--shadow-focus);
145
+ }
146
+
147
+ .cm-panel.cm-search .cm-textfield::placeholder {
148
+ color: var(--color-text-faint);
149
+ }
150
+
151
+ .cm-panel.cm-search > input[name='search'] {
152
+ order: 1;
153
+ flex: 1 1 120px;
154
+ }
155
+
156
+ .cm-panel.cm-search > button[name='next'] {
157
+ order: 2;
158
+ }
159
+
160
+ .cm-panel.cm-search > button[name='prev'] {
161
+ order: 3;
162
+ }
163
+
164
+ .cm-panel.cm-search > button[name='select'] {
165
+ order: 4;
166
+ }
167
+
168
+ .cm-panel.cm-search > button[name='close'] {
169
+ order: 5;
170
+ }
171
+
172
+ .cm-panel.cm-search > label:has(input[name='case']) {
173
+ order: 6;
174
+ }
175
+
176
+ .cm-panel.cm-search > label:has(input[name='re']) {
177
+ order: 7;
178
+ }
179
+
180
+ .cm-panel.cm-search > label:has(input[name='word']) {
181
+ order: 8;
182
+ }
183
+
184
+ .cm-panel.cm-search > br {
185
+ display: none;
186
+ }
187
+
188
+ .cm-panel.cm-search::before,
189
+ .cm-panel.cm-search::after {
190
+ content: '';
191
+ flex: 0 0 100%;
192
+ width: 0;
193
+ height: 0;
194
+ min-height: 0;
195
+ padding: 0;
196
+ font-size: 0;
197
+ line-height: 0;
198
+ }
199
+
200
+ .cm-panel.cm-search::before {
201
+ order: 6;
202
+ }
203
+
204
+ .cm-panel.cm-search::after {
205
+ order: 9;
206
+ }
207
+
208
+ .cm-panel.cm-search > input[name='replace'] {
209
+ order: 10;
210
+ flex: 1 1 120px;
211
+ }
212
+
213
+ .cm-panel.cm-search > button[name='replace'] {
214
+ order: 11;
215
+ }
216
+
217
+ .cm-panel.cm-search > button[name='replaceAll'] {
218
+ order: 12;
87
219
  }
88
220
 
89
221
  .cm-panel.cm-search .cm-button {
90
- min-height: 32px;
222
+ display: inline-flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ min-width: 0;
226
+ min-height: var(--control-h-sm);
91
227
  padding: 0 10px;
92
228
  border: 1px solid var(--color-border);
93
229
  border-radius: var(--radius-sm);
@@ -96,26 +232,85 @@
96
232
  font-family: var(--font-body);
97
233
  font-size: var(--text-xs);
98
234
  font-weight: 600;
235
+ line-height: 1;
236
+ white-space: nowrap;
237
+ transition:
238
+ transform var(--transition-interactive),
239
+ background var(--transition-interactive),
240
+ border-color var(--transition-interactive),
241
+ color var(--transition-interactive);
99
242
  }
100
243
 
101
244
  .cm-panel.cm-search .cm-button:hover:not(:disabled),
102
245
  .cm-panel.cm-search .cm-button:focus-visible {
103
246
  background: var(--color-surface-dynamic);
104
- outline: none;
247
+ border-color: color-mix(in oklab, var(--color-border) 70%, var(--color-text-faint) 30%);
248
+ }
249
+
250
+ .cm-panel.cm-search .cm-button:active {
251
+ transform: scale(0.97);
252
+ }
253
+
254
+ .cm-panel.cm-search > button[name='close'] {
255
+ position: static !important;
256
+ align-self: start;
257
+ width: 24px;
258
+ min-width: 24px;
259
+ height: 24px;
260
+ min-height: 24px;
261
+ padding: 0;
262
+ border: 1px solid transparent;
263
+ border-radius: var(--radius-sm);
264
+ background: transparent;
265
+ color: var(--color-text-faint);
266
+ font-size: 20px;
267
+ line-height: 1;
268
+ transition:
269
+ background var(--transition-interactive),
270
+ color var(--transition-interactive);
271
+ }
272
+
273
+ .cm-panel.cm-search > button[name='close']:hover,
274
+ .cm-panel.cm-search > button[name='close']:focus-visible {
275
+ background: var(--color-surface-offset);
276
+ color: var(--color-text);
105
277
  }
106
278
 
107
279
  @media (max-width: 768px) {
108
280
  .cm-panel.cm-search {
109
- flex-wrap: wrap;
110
- align-items: stretch;
281
+ gap: 6px;
282
+ padding: 8px;
283
+ }
284
+
285
+ .cm-panel.cm-search > input[name='search'] {
286
+ flex: 0 0 calc(100% - 38px);
287
+ }
288
+
289
+ .cm-panel.cm-search > button[name='close'] {
290
+ order: 2;
291
+ }
292
+
293
+ .cm-panel.cm-search > button[name='next'] {
294
+ order: 3;
295
+ }
296
+
297
+ .cm-panel.cm-search > button[name='prev'] {
298
+ order: 4;
299
+ }
300
+
301
+ .cm-panel.cm-search > button[name='select'] {
302
+ order: 5;
303
+ }
304
+
305
+ .cm-panel.cm-search > input[name='replace'] {
306
+ flex: 0 0 100%;
111
307
  }
112
308
 
113
309
  .cm-panel.cm-search label {
114
- flex: 1 1 100%;
310
+ min-height: 32px;
115
311
  }
116
312
 
117
313
  .cm-panel.cm-search .cm-textfield {
118
- width: 100%;
119
314
  min-height: 40px;
120
315
  font-size: 16px;
121
316
  }
@@ -124,4 +319,11 @@
124
319
  min-height: 40px;
125
320
  padding: 0 12px;
126
321
  }
322
+
323
+ .cm-panel.cm-search > button[name='close'] {
324
+ width: 32px;
325
+ min-width: 32px;
326
+ height: 32px;
327
+ min-height: 32px;
328
+ }
127
329
  }
@@ -135,7 +135,7 @@ export class WorkspaceReconciliation {
135
135
  async initialize({ snapshot = null } = {}) {
136
136
  const effectiveSnapshot = snapshot ?? await this.vaultFileStore.scanWorkspaceState();
137
137
  this.replaceWorkspaceState(effectiveSnapshot);
138
- await this.baseQueryService?.initializeFromWorkspaceState?.(effectiveSnapshot);
138
+ await this.baseQueryService?.snapshotStore?.initializeFromWorkspaceState?.(effectiveSnapshot);
139
139
  this.getWorkspaceRoom()?.replaceWorkspaceEntries(effectiveSnapshot.entries, {
140
140
  generatedAt: effectiveSnapshot.scannedAt,
141
141
  });
@@ -7,7 +7,7 @@ import { BacklinkIndex } from './domain/backlink-index.js';
7
7
  import { BaseQueryService } from './domain/bases/base-query-service.js';
8
8
  import { CollaborationDocumentStore } from './domain/collaboration/collaboration-document-store.js';
9
9
  import { CollaborationRoom } from './domain/collaboration/collaboration-room.js';
10
- import { DocxExporter } from './domain/docx-exporter.js';
10
+ import { renderDocx } from './domain/docx-exporter.js';
11
11
  import { GitService } from './infrastructure/git/git-service.js';
12
12
  import { GitHubAppClient } from './infrastructure/github/github-app-client.js';
13
13
  import { GitHubSetupFlow } from './infrastructure/github/github-setup-flow.js';
@@ -80,7 +80,6 @@ export function createAppServer(config = loadConfig()) {
80
80
  workspaceStateProvider: () => workspaceMutationCoordinator?.workspaceState ?? null,
81
81
  workspaceStateSynchronizer: () => fileSystemSyncService?.flushPendingChanges?.(),
82
82
  });
83
- const docxExporter = new DocxExporter();
84
83
  const plantUmlRenderer = new PlantUmlRenderer({
85
84
  serverUrl: config.plantumlServerUrl,
86
85
  });
@@ -144,7 +143,7 @@ export function createAppServer(config = loadConfig()) {
144
143
  vaultFileStore,
145
144
  backlinkIndex,
146
145
  baseQueryService,
147
- docxExporter,
146
+ renderDocx,
148
147
  roomRegistry,
149
148
  plantUmlRenderer,
150
149
  gitService,