@imjp/writenex-astro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +539 -0
  2. package/dist/chunk-5PM6EQE5.js +151 -0
  3. package/dist/chunk-5PM6EQE5.js.map +1 -0
  4. package/dist/chunk-7XU5X6CW.js +1331 -0
  5. package/dist/chunk-7XU5X6CW.js.map +1 -0
  6. package/dist/chunk-AAOQHQPU.js +574 -0
  7. package/dist/chunk-AAOQHQPU.js.map +1 -0
  8. package/dist/chunk-CF2XXJFF.js +1410 -0
  9. package/dist/chunk-CF2XXJFF.js.map +1 -0
  10. package/dist/chunk-CRPZUUDU.js +52 -0
  11. package/dist/chunk-CRPZUUDU.js.map +1 -0
  12. package/dist/chunk-CYLDJ3HZ.js +310 -0
  13. package/dist/chunk-CYLDJ3HZ.js.map +1 -0
  14. package/dist/chunk-KIKIPIFA.js +1 -0
  15. package/dist/chunk-KIKIPIFA.js.map +1 -0
  16. package/dist/chunk-XNTQTTJU.js +145 -0
  17. package/dist/chunk-XNTQTTJU.js.map +1 -0
  18. package/dist/client/index.css +2 -0
  19. package/dist/client/index.css.map +1 -0
  20. package/dist/client/index.js +375 -0
  21. package/dist/client/index.js.map +1 -0
  22. package/dist/client/styles.css +584 -0
  23. package/dist/client/variables.css +304 -0
  24. package/dist/config/index.d.ts +54 -0
  25. package/dist/config/index.js +38 -0
  26. package/dist/config/index.js.map +1 -0
  27. package/dist/config-BmEdBDo_.d.ts +220 -0
  28. package/dist/content-BWR52vD-.d.ts +64 -0
  29. package/dist/discovery/index.d.ts +310 -0
  30. package/dist/discovery/index.js +38 -0
  31. package/dist/discovery/index.js.map +1 -0
  32. package/dist/errors-C0iYiDTv.d.ts +107 -0
  33. package/dist/filesystem/index.d.ts +1292 -0
  34. package/dist/filesystem/index.js +203 -0
  35. package/dist/filesystem/index.js.map +1 -0
  36. package/dist/image-FP7w5ZIs.d.ts +47 -0
  37. package/dist/index.d.ts +64 -0
  38. package/dist/index.js +151 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/loader-55LWCXHA.js +12 -0
  41. package/dist/loader-55LWCXHA.js.map +1 -0
  42. package/dist/loader-CrdnaAWR.d.ts +327 -0
  43. package/dist/server/index.d.ts +357 -0
  44. package/dist/server/index.js +37 -0
  45. package/dist/server/index.js.map +1 -0
  46. package/package.json +94 -0
  47. package/src/client/App.tsx +900 -0
  48. package/src/client/components/ConfigPanel/ConfigPanel.css +553 -0
  49. package/src/client/components/ConfigPanel/ConfigPanel.tsx +396 -0
  50. package/src/client/components/ConfigPanel/index.ts +6 -0
  51. package/src/client/components/CreateContentModal/CreateContentModal.css +327 -0
  52. package/src/client/components/CreateContentModal/CreateContentModal.tsx +216 -0
  53. package/src/client/components/CreateContentModal/index.ts +7 -0
  54. package/src/client/components/Editor/Editor.css +885 -0
  55. package/src/client/components/Editor/Editor.tsx +484 -0
  56. package/src/client/components/Editor/ImageDialog.css +344 -0
  57. package/src/client/components/Editor/ImageDialog.tsx +367 -0
  58. package/src/client/components/Editor/LinkDialog.css +326 -0
  59. package/src/client/components/Editor/LinkDialog.tsx +332 -0
  60. package/src/client/components/Editor/index.ts +6 -0
  61. package/src/client/components/FrontmatterForm/FrontmatterForm.css +468 -0
  62. package/src/client/components/FrontmatterForm/FrontmatterForm.tsx +914 -0
  63. package/src/client/components/FrontmatterForm/index.ts +7 -0
  64. package/src/client/components/Header/Header.css +300 -0
  65. package/src/client/components/Header/Header.tsx +300 -0
  66. package/src/client/components/Header/index.ts +7 -0
  67. package/src/client/components/KeyboardShortcuts/KeyboardShortcuts.css +239 -0
  68. package/src/client/components/KeyboardShortcuts/KeyboardShortcuts.tsx +151 -0
  69. package/src/client/components/KeyboardShortcuts/index.ts +6 -0
  70. package/src/client/components/LazyEditor.tsx +75 -0
  71. package/src/client/components/LiveRegion/LiveRegion.css +19 -0
  72. package/src/client/components/LiveRegion/LiveRegion.tsx +60 -0
  73. package/src/client/components/LiveRegion/index.ts +7 -0
  74. package/src/client/components/SearchReplace/SearchReplacePanel.css +300 -0
  75. package/src/client/components/SearchReplace/SearchReplacePanel.tsx +332 -0
  76. package/src/client/components/SearchReplace/index.ts +7 -0
  77. package/src/client/components/SelectCollectionModal/SelectCollectionModal.css +308 -0
  78. package/src/client/components/SelectCollectionModal/SelectCollectionModal.tsx +223 -0
  79. package/src/client/components/SelectCollectionModal/index.ts +7 -0
  80. package/src/client/components/Sidebar/Sidebar.css +570 -0
  81. package/src/client/components/Sidebar/Sidebar.tsx +617 -0
  82. package/src/client/components/Sidebar/index.ts +7 -0
  83. package/src/client/components/SkipLink/SkipLink.css +51 -0
  84. package/src/client/components/SkipLink/SkipLink.tsx +67 -0
  85. package/src/client/components/SkipLink/index.ts +7 -0
  86. package/src/client/components/UnsavedChangesModal/UnsavedChangesModal.css +233 -0
  87. package/src/client/components/UnsavedChangesModal/UnsavedChangesModal.tsx +160 -0
  88. package/src/client/components/UnsavedChangesModal/index.ts +1 -0
  89. package/src/client/components/VersionHistory/DiffViewer.css +430 -0
  90. package/src/client/components/VersionHistory/DiffViewer.tsx +383 -0
  91. package/src/client/components/VersionHistory/VersionActions.css +318 -0
  92. package/src/client/components/VersionHistory/VersionActions.tsx +277 -0
  93. package/src/client/components/VersionHistory/VersionHistoryPanel.css +369 -0
  94. package/src/client/components/VersionHistory/VersionHistoryPanel.tsx +469 -0
  95. package/src/client/components/VersionHistory/index.ts +9 -0
  96. package/src/client/context/ApiContext.tsx +154 -0
  97. package/src/client/context/ThemeContext.tsx +172 -0
  98. package/src/client/hooks/useAnnounce.ts +201 -0
  99. package/src/client/hooks/useApi.ts +374 -0
  100. package/src/client/hooks/useArrowNavigation.ts +286 -0
  101. package/src/client/hooks/useAutosave.ts +241 -0
  102. package/src/client/hooks/useFocusTrap.ts +178 -0
  103. package/src/client/hooks/useKeyboardShortcuts.ts +203 -0
  104. package/src/client/hooks/useSearch.ts +206 -0
  105. package/src/client/hooks/useVersionHistory.ts +451 -0
  106. package/src/client/index.tsx +70 -0
  107. package/src/client/styles.css +584 -0
  108. package/src/client/utils/focus.ts +57 -0
  109. package/src/client/utils/openInEditor.ts +130 -0
  110. package/src/client/variables.css +304 -0
  111. package/src/config/defaults.ts +109 -0
  112. package/src/config/index.ts +32 -0
  113. package/src/config/loader.ts +174 -0
  114. package/src/config/schema.ts +161 -0
  115. package/src/core/constants.ts +39 -0
  116. package/src/core/errors.ts +739 -0
  117. package/src/core/index.ts +11 -0
  118. package/src/discovery/collections.ts +216 -0
  119. package/src/discovery/index.ts +33 -0
  120. package/src/discovery/patterns.ts +702 -0
  121. package/src/discovery/schema.ts +453 -0
  122. package/src/filesystem/images.ts +798 -0
  123. package/src/filesystem/index.ts +107 -0
  124. package/src/filesystem/reader.ts +452 -0
  125. package/src/filesystem/version-config.ts +390 -0
  126. package/src/filesystem/versions.ts +1339 -0
  127. package/src/filesystem/watcher.ts +226 -0
  128. package/src/filesystem/writer.ts +540 -0
  129. package/src/index.ts +61 -0
  130. package/src/integration.ts +228 -0
  131. package/src/server/assets.ts +254 -0
  132. package/src/server/cache.ts +355 -0
  133. package/src/server/index.ts +33 -0
  134. package/src/server/middleware.ts +209 -0
  135. package/src/server/routes.ts +1428 -0
  136. package/src/types/api.ts +61 -0
  137. package/src/types/config.ts +134 -0
  138. package/src/types/content.ts +64 -0
  139. package/src/types/image.ts +48 -0
  140. package/src/types/index.ts +58 -0
  141. package/src/types/version.ts +117 -0
@@ -0,0 +1,885 @@
1
+ /**
2
+ * @fileoverview Editor component styles
3
+ *
4
+ * Contains styling for the MDXEditor wrapper and dark mode overrides.
5
+ * Full-width editor that adjusts when panels are open.
6
+ * Styling matches Writenex Editor design system.
7
+ */
8
+
9
+ /* ============================================================================
10
+ SEARCH HIGHLIGHT - CSS Highlight API for MDXEditor searchPlugin
11
+ ============================================================================ */
12
+
13
+ ::highlight(MdxSearch) {
14
+ background-color: var(--wn-highlight-alpha-25);
15
+ }
16
+
17
+ ::highlight(MdxFocusSearch) {
18
+ background-color: var(--wn-highlight);
19
+ color: #000000;
20
+ }
21
+
22
+ /* ============================================================================
23
+ EDITOR CONTAINER
24
+ ============================================================================ */
25
+
26
+ .wn-editor {
27
+ display: flex;
28
+ flex-direction: column;
29
+ flex: 1;
30
+ min-width: 0;
31
+ height: 100%;
32
+ background-color: var(--wn-zinc-900);
33
+ }
34
+
35
+ .wn-editor-content {
36
+ flex: 1;
37
+ overflow: auto;
38
+ background-color: var(--wn-zinc-900);
39
+ padding: var(--wn-space-3) var(--wn-space-5);
40
+ }
41
+
42
+ .wn-editor-wrapper {
43
+ height: 100%;
44
+ }
45
+
46
+ /* ============================================================================
47
+ MDXEDITOR DARK MODE OVERRIDES
48
+ Matches Writenex Editor theme.css styling
49
+ ============================================================================ */
50
+
51
+ /* Base MDXEditor variables */
52
+ .mdxeditor {
53
+ /* Background colors */
54
+ --baseBg: var(--wn-zinc-900);
55
+ --baseBgSubtle: var(--wn-zinc-800);
56
+ --baseBgHover: var(--wn-overlay-10);
57
+ --baseBgActive: var(--wn-overlay-15);
58
+ --basePageBg: var(--wn-zinc-950);
59
+
60
+ /* Border colors */
61
+ --baseBorder: var(--wn-zinc-700);
62
+ --baseBorderSubtle: var(--wn-zinc-600);
63
+
64
+ /* Text colors */
65
+ --baseText: var(--wn-zinc-400);
66
+ --baseTextContrast: var(--wn-zinc-300);
67
+ --baseTextMuted: var(--wn-zinc-500);
68
+ --baseTextSubtle: var(--wn-zinc-600);
69
+
70
+ /* Accent colors */
71
+ --accentColor: var(--wn-brand-400);
72
+ --accentColorHover: var(--wn-brand-alpha-20);
73
+
74
+ /* Selection */
75
+ --selectionBg: var(--wn-selection);
76
+
77
+ /* Font */
78
+ --font-body:
79
+ "Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", Roboto,
80
+ "Helvetica Neue", Arial, sans-serif;
81
+ --font-mono:
82
+ ui-monospace, "Cascadia Code", Menlo, Consolas, "Courier New", monospace;
83
+ }
84
+
85
+ /* Editor root */
86
+ .mdxeditor,
87
+ .mdxeditor [class*="_editorRoot_"],
88
+ .mdxeditor [class*="_rootContentEditableWrapper_"] {
89
+ background-color: var(--baseBg) !important;
90
+ }
91
+
92
+ /* Editor content */
93
+ .mdxeditor [data-lexical-editor] {
94
+ color: var(--baseTextContrast) !important;
95
+ font-family: var(--font-body) !important;
96
+ }
97
+
98
+ /* Content editable area - smaller padding like Writenex Editor */
99
+ .mdxeditor [class*="_contentEditable_"] {
100
+ padding: 1rem 1.5rem !important;
101
+ min-height: 100% !important;
102
+ }
103
+
104
+ /* ============================================================================
105
+ PROSE TYPOGRAPHY - Matches Writenex Editor styling
106
+ ============================================================================ */
107
+
108
+ /* Prose base styling */
109
+ .mdxeditor .prose {
110
+ max-width: 75ch !important; /* optimal reading width ~65-75 characters */
111
+ margin-left: auto !important;
112
+ margin-right: auto !important;
113
+ color: var(--wn-zinc-200) !important; /* body text */
114
+ font-size: var(--wn-font-prose) !important; /* 15-16px fluid */
115
+ line-height: 1.75 !important;
116
+ }
117
+
118
+ /* Headings - brighter color, proper spacing */
119
+ .mdxeditor .prose h1 {
120
+ color: var(--wn-zinc-50) !important;
121
+ font-size: var(--wn-font-h1) !important; /* 28-36px fluid */
122
+ font-weight: 700 !important;
123
+ line-height: 1.2 !important;
124
+ margin-top: 0 !important;
125
+ margin-bottom: 0.875rem !important;
126
+ }
127
+
128
+ .mdxeditor .prose h2 {
129
+ color: var(--wn-zinc-50) !important;
130
+ font-size: var(--wn-font-h2) !important; /* 20-24px fluid */
131
+ font-weight: 600 !important;
132
+ line-height: 1.3 !important;
133
+ margin-top: 1.5rem !important;
134
+ margin-bottom: 0.75rem !important;
135
+ }
136
+
137
+ .mdxeditor .prose h3 {
138
+ color: var(--wn-zinc-50) !important;
139
+ font-size: var(--wn-font-h3) !important; /* 18-20px fluid */
140
+ font-weight: 600 !important;
141
+ line-height: 1.4 !important;
142
+ margin-top: 1.25rem !important;
143
+ margin-bottom: 0.5rem !important;
144
+ }
145
+
146
+ .mdxeditor .prose h4 {
147
+ color: var(--wn-zinc-50) !important;
148
+ font-size: var(--wn-font-h4) !important; /* 16-18px fluid */
149
+ font-weight: 600 !important;
150
+ line-height: 1.4 !important;
151
+ margin-top: 1rem !important;
152
+ margin-bottom: 0.5rem !important;
153
+ }
154
+
155
+ .mdxeditor .prose h5 {
156
+ color: var(--wn-zinc-50) !important;
157
+ font-size: var(--wn-font-h5) !important; /* 15-16px, same as prose */
158
+ font-weight: 600 !important;
159
+ line-height: 1.4 !important;
160
+ margin-top: 1rem !important;
161
+ margin-bottom: 0.5rem !important;
162
+ }
163
+
164
+ .mdxeditor .prose h6 {
165
+ color: var(
166
+ --wn-zinc-300
167
+ ) !important; /* slightly muted for visual hierarchy */
168
+ font-size: var(--wn-font-h6) !important; /* 14px */
169
+ font-weight: 600 !important;
170
+ line-height: 1.4 !important;
171
+ text-transform: uppercase !important;
172
+ letter-spacing: 0.05em !important;
173
+ margin-top: 1rem !important;
174
+ margin-bottom: 0.5rem !important;
175
+ }
176
+
177
+ /* Paragraphs */
178
+ .mdxeditor .prose p {
179
+ color: var(--wn-zinc-200) !important;
180
+ margin-top: 0 !important;
181
+ margin-bottom: 1rem !important;
182
+ }
183
+
184
+ /* Strong/Bold text */
185
+ .mdxeditor .prose strong {
186
+ color: var(--wn-zinc-50) !important;
187
+ font-weight: 600 !important;
188
+ }
189
+
190
+ /* Emphasis/Italic text */
191
+ .mdxeditor .prose em {
192
+ color: var(--wn-zinc-200) !important;
193
+ }
194
+
195
+ /* Lists */
196
+ .mdxeditor .prose ul,
197
+ .mdxeditor .prose ol {
198
+ margin-top: 0.5rem !important;
199
+ margin-bottom: 1rem !important;
200
+ padding-left: 1.5rem !important;
201
+ }
202
+
203
+ .mdxeditor .prose li {
204
+ color: var(--wn-zinc-200) !important;
205
+ margin-top: 0.25rem !important;
206
+ margin-bottom: 0.25rem !important;
207
+ }
208
+
209
+ .mdxeditor .prose ul > li::marker {
210
+ color: var(--wn-zinc-500) !important;
211
+ }
212
+
213
+ .mdxeditor .prose ol > li::marker {
214
+ color: var(--wn-zinc-400) !important;
215
+ }
216
+
217
+ /* Lead paragraph (first paragraph after heading) */
218
+ .mdxeditor .prose [class*="lead"] {
219
+ color: var(--wn-zinc-400) !important;
220
+ }
221
+
222
+ /* Placeholder text */
223
+ .mdxeditor .editor-placeholder {
224
+ color: var(--baseTextSubtle) !important;
225
+ }
226
+
227
+ /* ============================================================================
228
+ TOOLBAR - Matches Writenex Editor styling (smaller padding)
229
+ ============================================================================ */
230
+
231
+ .mdxeditor [class*="_toolbarRoot_"],
232
+ .mdxeditor [class*="_toolbar_"] {
233
+ background-color: var(--baseBgSubtle) !important;
234
+ border-color: var(--baseBorder) !important;
235
+ border-bottom: 1px solid var(--baseBorder) !important;
236
+ padding: var(--wn-space-1) var(--wn-space-3) !important;
237
+ gap: 0.125rem !important;
238
+ }
239
+
240
+ /* Toolbar buttons - pointer cursor for all */
241
+ .mdxeditor [class*="_toolbarRoot_"] button,
242
+ .mdxeditor [class*="_toolbar_"] button,
243
+ .mdxeditor [class*="_selectTrigger_"],
244
+ .mdxeditor [class*="_toolbarModeSwitch_"] button,
245
+ .mdxeditor [class*="_codeMirrorToolbar_"] button,
246
+ [class*="_selectItem_"] {
247
+ cursor: pointer !important;
248
+ }
249
+
250
+ .mdxeditor [class*="_toolbarRoot_"] button,
251
+ .mdxeditor [class*="_toolbar_"] button {
252
+ color: var(--baseText) !important;
253
+ border-radius: var(--wn-radius-sm) !important;
254
+ }
255
+
256
+ .mdxeditor [class*="_toolbarRoot_"] button:hover,
257
+ .mdxeditor [class*="_toolbar_"] button:hover {
258
+ background-color: var(--baseBgHover) !important;
259
+ color: var(--baseTextContrast) !important;
260
+ }
261
+
262
+ .mdxeditor [class*="_toolbarRoot_"] button[data-state="on"],
263
+ .mdxeditor [class*="_toolbar_"] button[data-state="on"] {
264
+ background-color: var(--accentColorHover) !important;
265
+ color: var(--accentColor) !important;
266
+ }
267
+
268
+ /* Toolbar select */
269
+ .mdxeditor [class*="_selectTrigger_"] {
270
+ background-color: var(--baseBgHover) !important;
271
+ border-color: var(--baseBorder) !important;
272
+ color: var(--baseTextContrast) !important;
273
+ }
274
+
275
+ .mdxeditor [class*="_selectTrigger_"]:hover {
276
+ background-color: var(--baseBgHover) !important;
277
+ color: var(--baseTextContrast) !important;
278
+ }
279
+
280
+ /* Toolbar separator */
281
+ .mdxeditor [class*="_toolbarRoot_"] [class*="_separator_"],
282
+ .mdxeditor [class*="_toolbar_"] [class*="_separator_"] {
283
+ background-color: var(--baseBorder) !important;
284
+ }
285
+
286
+ /* ============================================================================
287
+ CODE BLOCKS & INLINE CODE
288
+ ============================================================================ */
289
+
290
+ /* Code block wrapper */
291
+ .mdxeditor [class*="_codeMirrorWrapper_"] {
292
+ border-color: var(--baseBorder) !important;
293
+ background-color: var(--baseBg) !important;
294
+ box-shadow: none !important;
295
+ }
296
+
297
+ /* Code block toolbar */
298
+ .mdxeditor [class*="_codeMirrorToolbar_"] {
299
+ background-color: var(--baseBgSubtle) !important;
300
+ border-bottom-color: var(--baseBorder) !important;
301
+ }
302
+
303
+ .mdxeditor [class*="_codeMirrorToolbar_"] button,
304
+ .mdxeditor [class*="_codeMirrorToolbar_"] [class*="_selectTrigger_"] {
305
+ color: var(--baseText) !important;
306
+ }
307
+
308
+ .mdxeditor [class*="_codeMirrorToolbar_"] [class*="_selectTrigger_"]:hover {
309
+ background-color: var(--baseBorder) !important;
310
+ color: var(--baseTextContrast) !important;
311
+ }
312
+
313
+ /* Delete button hover (red) */
314
+ .mdxeditor [class*="_codeMirrorToolbar_"] button:last-child:hover {
315
+ background-color: var(--wn-error-alpha-20) !important;
316
+ color: var(--wn-error-400) !important;
317
+ }
318
+
319
+ /* CodeMirror editor */
320
+ .mdxeditor .cm-editor {
321
+ background-color: var(--baseBg) !important;
322
+ }
323
+
324
+ .mdxeditor .cm-content {
325
+ color: var(--baseTextContrast) !important;
326
+ caret-color: var(--baseTextContrast) !important;
327
+ }
328
+
329
+ .mdxeditor .cm-gutters {
330
+ background-color: var(--baseBgSubtle) !important;
331
+ border-right: 1px solid var(--baseBorder) !important;
332
+ color: var(--baseTextSubtle) !important;
333
+ }
334
+
335
+ .mdxeditor .cm-activeLineGutter {
336
+ background-color: var(--baseBorder) !important;
337
+ color: var(--baseTextContrast) !important;
338
+ }
339
+
340
+ .mdxeditor .cm-activeLine {
341
+ background-color: var(--baseBgActive) !important;
342
+ }
343
+
344
+ .mdxeditor .cm-cursor {
345
+ border-left-color: var(--baseTextContrast) !important;
346
+ }
347
+
348
+ .mdxeditor .cm-selectionBackground {
349
+ background-color: var(--selectionBg) !important;
350
+ }
351
+
352
+ /* Inline code */
353
+ .mdxeditor code:not(pre code) {
354
+ background-color: var(--baseBorder) !important;
355
+ color: var(--baseTextContrast) !important;
356
+ border: 1px solid var(--baseBorderSubtle) !important;
357
+ border-radius: var(--wn-radius-sm) !important;
358
+ padding: var(--wn-space-1) var(--wn-space-2) !important;
359
+ font-family: var(--font-mono) !important;
360
+ }
361
+
362
+ .mdxeditor code:not(pre code) span {
363
+ background-color: transparent !important;
364
+ border: none !important;
365
+ color: inherit !important;
366
+ }
367
+
368
+ /* ============================================================================
369
+ DIALOGS
370
+ ============================================================================ */
371
+
372
+ .mdxeditor [class*="_dialogContent_"] {
373
+ background-color: var(--baseBg) !important;
374
+ border: 1px solid var(--baseBorder) !important;
375
+ color: var(--baseTextContrast) !important;
376
+ }
377
+
378
+ .mdxeditor [class*="_dialogContent_"] input,
379
+ .mdxeditor [class*="_dialogContent_"] textarea {
380
+ background-color: var(--baseBgSubtle) !important;
381
+ border: 1px solid var(--baseBorder) !important;
382
+ color: var(--baseTextContrast) !important;
383
+ }
384
+
385
+ .mdxeditor [class*="_dialogContent_"] input:focus,
386
+ .mdxeditor [class*="_dialogContent_"] textarea:focus {
387
+ border-color: var(--accentColor) !important;
388
+ box-shadow: 0 0 0 2px var(--accentColorHover) !important;
389
+ outline: none !important;
390
+ }
391
+
392
+ .mdxeditor [class*="_dialogContent_"] label {
393
+ color: var(--baseText) !important;
394
+ }
395
+
396
+ /* ============================================================================
397
+ CONTENT ELEMENTS
398
+ ============================================================================ */
399
+
400
+ /* Images - constrain to editor width */
401
+ .mdxeditor img {
402
+ max-width: 100% !important;
403
+ height: auto !important;
404
+ display: block !important;
405
+ margin: var(--wn-space-5) 0 !important;
406
+ border-radius: var(--wn-radius-md) !important;
407
+ }
408
+
409
+ /* Image wrapper from MDXEditor */
410
+ .mdxeditor [class*="_imageWrapper_"] {
411
+ max-width: 100% !important;
412
+ }
413
+
414
+ /* Links */
415
+ .mdxeditor a {
416
+ color: var(--accentColor) !important;
417
+ text-decoration: underline !important;
418
+ }
419
+
420
+ /* Blockquote - matches Writenex Editor */
421
+ .mdxeditor blockquote {
422
+ border-left: 4px solid var(--accentColor) !important;
423
+ background-color: var(--wn-zinc-900) !important;
424
+ padding: var(--wn-space-5) !important;
425
+ margin: var(--wn-space-5) 0 !important;
426
+ border-radius: 0 var(--wn-radius-md) var(--wn-radius-md) 0 !important;
427
+ color: var(--wn-zinc-200) !important;
428
+ }
429
+
430
+ .mdxeditor blockquote p {
431
+ margin: 0 !important;
432
+ }
433
+
434
+ /* Tables */
435
+ .mdxeditor table,
436
+ .mdxeditor th,
437
+ .mdxeditor td {
438
+ border-color: var(--baseBorder) !important;
439
+ }
440
+
441
+ .mdxeditor th {
442
+ background-color: var(--baseBgSubtle) !important;
443
+ }
444
+
445
+ /* ============================================================================
446
+ CHECKLIST
447
+ ============================================================================ */
448
+
449
+ .mdxeditor li[role="checkbox"]::before {
450
+ background-color: var(--baseBgSubtle) !important;
451
+ border-color: var(--baseBorderSubtle) !important;
452
+ }
453
+
454
+ .mdxeditor li[role="checkbox"][aria-checked="true"]::before {
455
+ background-color: var(--accentColor) !important;
456
+ border-color: var(--accentColor) !important;
457
+ }
458
+
459
+ .mdxeditor li[role="checkbox"][aria-checked="true"]::after {
460
+ border-color: #ffffff !important;
461
+ }
462
+
463
+ .mdxeditor li[role="checkbox"]:hover::before {
464
+ border-color: var(--accentColor) !important;
465
+ }
466
+
467
+ .mdxeditor li[role="checkbox"][aria-checked="true"] {
468
+ color: var(--baseTextMuted) !important;
469
+ }
470
+
471
+ /* ============================================================================
472
+ DROPDOWNS & POPOVERS (rendered via portal)
473
+ ============================================================================ */
474
+
475
+ [class*="_selectContainer_"],
476
+ [class*="_toolbarNodeKindSelectContainer_"],
477
+ [class*="_toolbarButtonDropdownContainer_"] {
478
+ background-color: var(--wn-zinc-800) !important;
479
+ border: 1px solid var(--wn-zinc-700) !important;
480
+ color: var(--wn-zinc-300) !important;
481
+ box-shadow: 0 4px 6px -1px var(--wn-backdrop-light) !important;
482
+ max-height: 300px !important;
483
+ overflow-y: auto !important;
484
+ }
485
+
486
+ [class*="_selectItem_"] {
487
+ color: var(--wn-zinc-300) !important;
488
+ background-color: transparent !important;
489
+ }
490
+
491
+ [class*="_selectItem_"]:hover,
492
+ [class*="_selectItem_"][data-highlighted],
493
+ [class*="_selectItem_"][data-state="checked"] {
494
+ background-color: var(--wn-zinc-700) !important;
495
+ color: var(--wn-zinc-300) !important;
496
+ }
497
+
498
+ /* ============================================================================
499
+ DIFF SOURCE TOGGLE
500
+ ============================================================================ */
501
+
502
+ [class*="_diffSourceToggle_"],
503
+ [class*="_toolbarModeSwitch_"] {
504
+ background-color: var(--wn-zinc-800) !important;
505
+ border-color: var(--wn-zinc-700) !important;
506
+ border-radius: var(--wn-radius-md) !important;
507
+ }
508
+
509
+ [class*="_diffSourceToggle_"] button,
510
+ [class*="_toolbarModeSwitch_"] button {
511
+ color: var(--wn-zinc-400) !important;
512
+ padding: var(--wn-space-1) var(--wn-space-3) !important;
513
+ font-size: var(--wn-font-xs) !important; /* 12px */
514
+ }
515
+
516
+ [class*="_diffSourceToggle_"] button:hover,
517
+ [class*="_toolbarModeSwitch_"] button:hover {
518
+ background-color: var(--wn-zinc-700) !important;
519
+ color: var(--wn-zinc-300) !important;
520
+ }
521
+
522
+ [class*="_diffSourceToggle_"] button[data-state="on"],
523
+ [class*="_toolbarModeSwitch_"] button[data-state="on"] {
524
+ background-color: var(--wn-zinc-700) !important;
525
+ color: var(--wn-zinc-300) !important;
526
+ }
527
+
528
+ /* ============================================================================
529
+ SOURCE/DIFF MODE
530
+ ============================================================================ */
531
+
532
+ /* Source editor */
533
+ .mdxeditor [class*="_sourceEditor_"],
534
+ .mdxeditor [class*="_sourceEditor_"] .cm-editor {
535
+ background-color: var(--baseBg) !important;
536
+ color: var(--baseTextContrast) !important;
537
+ }
538
+
539
+ .mdxeditor [class*="_sourceEditor_"] .cm-scroller {
540
+ background-color: var(--baseBg) !important;
541
+ }
542
+
543
+ .mdxeditor [class*="_sourceEditor_"] .cm-content {
544
+ color: var(--baseTextContrast) !important;
545
+ caret-color: var(--baseTextContrast) !important;
546
+ }
547
+
548
+ .mdxeditor [class*="_sourceEditor_"] .cm-content .cm-line {
549
+ color: var(--baseTextContrast) !important;
550
+ }
551
+
552
+ .mdxeditor [class*="_sourceEditor_"] .cm-content .cm-line span {
553
+ color: var(--baseTextContrast) !important;
554
+ }
555
+
556
+ .mdxeditor [class*="_sourceEditor_"] .cm-gutters {
557
+ background-color: var(--baseBgSubtle) !important;
558
+ border-right: 1px solid var(--baseBorder) !important;
559
+ color: var(--baseTextMuted) !important;
560
+ }
561
+
562
+ .mdxeditor [class*="_sourceEditor_"] .cm-activeLineGutter {
563
+ background-color: var(--baseBorder) !important;
564
+ }
565
+
566
+ .mdxeditor [class*="_sourceEditor_"] .cm-activeLine {
567
+ background-color: var(--baseBgActive) !important;
568
+ }
569
+
570
+ /* Diff mode */
571
+ .mdxeditor [class*="_diffEditor_"],
572
+ .mdxeditor .cm-mergeView {
573
+ background-color: var(--wn-zinc-950) !important;
574
+ }
575
+
576
+ .mdxeditor [class*="_diffEditor_"] .cm-editor,
577
+ .mdxeditor .cm-mergeView .cm-scroller {
578
+ background-color: var(--wn-zinc-950) !important;
579
+ }
580
+
581
+ .mdxeditor [class*="_diffEditor_"] .cm-content {
582
+ color: var(--baseTextContrast) !important;
583
+ }
584
+
585
+ .mdxeditor [class*="_diffEditor_"] .cm-gutters,
586
+ .mdxeditor .cm-mergeView .cm-gutters {
587
+ background-color: var(--wn-zinc-900) !important;
588
+ border-right: 1px solid var(--wn-zinc-700) !important;
589
+ color: var(--wn-zinc-500) !important;
590
+ }
591
+
592
+ /* Diff highlighting */
593
+ .mdxeditor .cm-changedLine {
594
+ background-color: var(--wn-success-alpha-15) !important;
595
+ }
596
+
597
+ .mdxeditor .cm-changedText {
598
+ background-color: var(--wn-success-alpha-40) !important;
599
+ }
600
+
601
+ .mdxeditor .cm-deletedChunk {
602
+ background-color: var(--wn-error-alpha-15) !important;
603
+ }
604
+
605
+ /* ============================================================================
606
+ TOOLTIP
607
+ ============================================================================ */
608
+
609
+ .mdxeditor [data-radix-popper-content-wrapper] [class*="tooltipContent"] {
610
+ background-color: var(--wn-zinc-50) !important;
611
+ color: var(--wn-zinc-900) !important;
612
+ }
613
+
614
+ /* ============================================================================
615
+ EDITOR LOADING STATE
616
+ ============================================================================ */
617
+
618
+ .wn-editor-loading {
619
+ display: flex;
620
+ flex: 1;
621
+ flex-direction: column;
622
+ align-items: center;
623
+ justify-content: center;
624
+ gap: var(--wn-space-4);
625
+ color: var(--wn-zinc-500);
626
+ }
627
+
628
+ .wn-editor-loading-spinner {
629
+ width: var(--wn-icon-btn-sm);
630
+ height: var(--wn-icon-btn-sm);
631
+ border: 2px solid var(--wn-zinc-700);
632
+ border-top-color: var(--wn-brand-500);
633
+ border-radius: var(--wn-radius-full);
634
+ animation: wn-spin 1s linear infinite;
635
+ }
636
+
637
+ .wn-editor-loading-text {
638
+ font-size: var(--wn-font-base); /* 14px */
639
+ }
640
+
641
+ @keyframes wn-spin {
642
+ to {
643
+ transform: rotate(360deg);
644
+ }
645
+ }
646
+
647
+ /* ============================================================================
648
+ EDITOR EMPTY STATE
649
+ ============================================================================ */
650
+
651
+ .wn-editor-empty {
652
+ display: flex;
653
+ flex: 1;
654
+ flex-direction: column;
655
+ align-items: center;
656
+ justify-content: center;
657
+ gap: var(--wn-space-5);
658
+ padding: var(--wn-space-8);
659
+ text-align: center;
660
+ }
661
+
662
+ .wn-editor-empty-icon {
663
+ color: var(--wn-zinc-600);
664
+ }
665
+
666
+ .wn-editor-empty-title {
667
+ font-size: var(--wn-font-lg); /* 18px */
668
+ font-weight: 500;
669
+ color: var(--wn-zinc-100);
670
+ }
671
+
672
+ .wn-editor-empty-text {
673
+ max-width: var(--wn-modal-sm);
674
+ font-size: var(--wn-font-base); /* 14px */
675
+ color: var(--wn-zinc-500);
676
+ }
677
+
678
+ .wn-editor-empty-btn {
679
+ display: inline-flex;
680
+ align-items: center;
681
+ gap: var(--wn-space-3);
682
+ margin-top: var(--wn-space-5);
683
+ padding: var(--wn-space-3) var(--wn-space-6);
684
+ background-color: var(--wn-brand-500);
685
+ border: none;
686
+ border-radius: var(--wn-radius-lg);
687
+ font-size: var(--wn-font-base); /* 14px */
688
+ font-weight: 500;
689
+ color: #fff;
690
+ cursor: pointer;
691
+ transition: background-color var(--wn-transition-fast) ease;
692
+ }
693
+
694
+ .wn-editor-empty-btn:hover {
695
+ background-color: var(--wn-brand-600);
696
+ }
697
+
698
+ .wn-editor-empty-btn:focus-visible {
699
+ outline: 2px solid var(--wn-brand-500);
700
+ outline-offset: 2px;
701
+ }
702
+
703
+ .wn-editor-empty-shortcuts {
704
+ display: flex;
705
+ flex-direction: column;
706
+ gap: var(--wn-space-3);
707
+ margin-top: var(--wn-space-7);
708
+ padding-top: var(--wn-space-7);
709
+ border-top: 1px solid var(--wn-zinc-700);
710
+ }
711
+
712
+ .wn-editor-empty-shortcut {
713
+ display: flex;
714
+ align-items: center;
715
+ gap: var(--wn-space-2);
716
+ font-size: var(--wn-font-xs); /* 12px */
717
+ color: var(--wn-zinc-500);
718
+ }
719
+
720
+ .wn-editor-empty-shortcut kbd {
721
+ display: inline-flex;
722
+ align-items: center;
723
+ justify-content: center;
724
+ min-width: var(--wn-icon-btn-sm);
725
+ height: 1.375rem;
726
+ padding: 0 var(--wn-space-2);
727
+ background-color: var(--wn-zinc-800);
728
+ border: 1px solid var(--wn-zinc-700);
729
+ border-radius: var(--wn-radius-sm);
730
+ font-family: inherit;
731
+ font-size: var(--wn-font-xs); /* 12px - increased from 11px for readability */
732
+ font-weight: 500;
733
+ color: var(--wn-zinc-400);
734
+ }
735
+
736
+ /* ============================================================================
737
+ LIGHT MODE OVERRIDES
738
+ ============================================================================ */
739
+
740
+ .wn-light .wn-editor {
741
+ background-color: #fff;
742
+ }
743
+
744
+ .wn-light .wn-editor-content {
745
+ background-color: #fff;
746
+ }
747
+
748
+ .wn-light .wn-editor-loading {
749
+ color: var(--wn-zinc-500);
750
+ }
751
+
752
+ .wn-light .wn-editor-loading-spinner {
753
+ border-color: var(--wn-zinc-200);
754
+ border-top-color: var(--wn-brand-500);
755
+ }
756
+
757
+ .wn-light .wn-editor-empty-icon {
758
+ color: var(--wn-zinc-400);
759
+ }
760
+
761
+ .wn-light .wn-editor-empty-title {
762
+ color: var(--wn-zinc-900);
763
+ }
764
+
765
+ .wn-light .wn-editor-empty-text {
766
+ color: var(--wn-zinc-500);
767
+ }
768
+
769
+ .wn-light .wn-editor-empty-shortcuts {
770
+ border-top-color: var(--wn-zinc-200);
771
+ }
772
+
773
+ .wn-light .wn-editor-empty-shortcut kbd {
774
+ background-color: var(--wn-zinc-100);
775
+ border-color: var(--wn-zinc-200);
776
+ color: var(--wn-zinc-600);
777
+ }
778
+
779
+ /* MDXEditor Light Mode */
780
+ .wn-light .mdxeditor {
781
+ --baseBg: #ffffff;
782
+ --baseBgSubtle: var(--wn-zinc-50);
783
+ --baseBgHover: var(--wn-overlay-light-5);
784
+ --baseBgActive: var(--wn-overlay-light-10);
785
+ --basePageBg: var(--wn-zinc-100);
786
+ --baseBorder: var(--wn-zinc-200);
787
+ --baseBorderSubtle: var(--wn-zinc-300);
788
+ --baseText: var(--wn-zinc-500);
789
+ --baseTextContrast: var(--wn-zinc-800);
790
+ --baseTextMuted: var(--wn-zinc-400);
791
+ --baseTextSubtle: var(--wn-zinc-300);
792
+ --accentColor: var(--wn-brand-600);
793
+ --accentColorHover: var(--wn-brand-alpha-10);
794
+ --selectionBg: var(--wn-selection-light);
795
+ }
796
+
797
+ .wn-light .mdxeditor .prose {
798
+ color: var(--wn-zinc-700) !important;
799
+ }
800
+
801
+ .wn-light .mdxeditor .prose h1,
802
+ .wn-light .mdxeditor .prose h2,
803
+ .wn-light .mdxeditor .prose h3,
804
+ .wn-light .mdxeditor .prose h4,
805
+ .wn-light .mdxeditor .prose h5 {
806
+ color: var(--wn-zinc-900) !important;
807
+ }
808
+
809
+ .wn-light .mdxeditor .prose h6 {
810
+ color: var(
811
+ --wn-zinc-600
812
+ ) !important; /* slightly muted for visual hierarchy in light mode */
813
+ }
814
+
815
+ .wn-light .mdxeditor .prose p,
816
+ .wn-light .mdxeditor .prose li,
817
+ .wn-light .mdxeditor .prose em {
818
+ color: var(--wn-zinc-700) !important;
819
+ }
820
+
821
+ .wn-light .mdxeditor .prose strong {
822
+ color: var(--wn-zinc-900) !important;
823
+ }
824
+
825
+ .wn-light .mdxeditor .prose ul > li::marker {
826
+ color: var(--wn-zinc-400) !important;
827
+ }
828
+
829
+ .wn-light .mdxeditor .prose ol > li::marker {
830
+ color: var(--wn-zinc-500) !important;
831
+ }
832
+
833
+ .wn-light .mdxeditor blockquote {
834
+ background-color: var(--wn-zinc-100) !important;
835
+ color: var(--wn-zinc-600) !important;
836
+ }
837
+
838
+ .wn-light .mdxeditor code:not(pre code) {
839
+ background-color: var(--wn-zinc-100) !important;
840
+ border-color: var(--wn-zinc-200) !important;
841
+ color: var(--wn-zinc-900) !important;
842
+ }
843
+
844
+ /* Light mode dropdowns */
845
+ .wn-light [class*="_selectContainer_"],
846
+ .wn-light [class*="_toolbarNodeKindSelectContainer_"],
847
+ .wn-light [class*="_toolbarButtonDropdownContainer_"] {
848
+ background-color: #fff !important;
849
+ border-color: var(--wn-zinc-200) !important;
850
+ color: var(--wn-zinc-800) !important;
851
+ box-shadow: 0 4px 6px -1px var(--wn-overlay-light-10) !important;
852
+ }
853
+
854
+ .wn-light [class*="_selectItem_"] {
855
+ color: var(--wn-zinc-800) !important;
856
+ }
857
+
858
+ .wn-light [class*="_selectItem_"]:hover,
859
+ .wn-light [class*="_selectItem_"][data-highlighted],
860
+ .wn-light [class*="_selectItem_"][data-state="checked"] {
861
+ background-color: var(--wn-zinc-100) !important;
862
+ }
863
+
864
+ .wn-light [class*="_diffSourceToggle_"],
865
+ .wn-light [class*="_toolbarModeSwitch_"] {
866
+ background-color: var(--wn-zinc-50) !important;
867
+ border-color: var(--wn-zinc-200) !important;
868
+ }
869
+
870
+ .wn-light [class*="_diffSourceToggle_"] button,
871
+ .wn-light [class*="_toolbarModeSwitch_"] button {
872
+ color: var(--wn-zinc-500) !important;
873
+ }
874
+
875
+ .wn-light [class*="_diffSourceToggle_"] button:hover,
876
+ .wn-light [class*="_toolbarModeSwitch_"] button:hover {
877
+ background-color: var(--wn-zinc-200) !important;
878
+ color: var(--wn-zinc-800) !important;
879
+ }
880
+
881
+ .wn-light [class*="_diffSourceToggle_"] button[data-state="on"],
882
+ .wn-light [class*="_toolbarModeSwitch_"] button[data-state="on"] {
883
+ background-color: var(--wn-zinc-200) !important;
884
+ color: var(--wn-zinc-800) !important;
885
+ }