@xcan-cloud/markdown 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,438 @@
1
+ /* ============================================================
2
+ Markdown Editor 样式
3
+ ============================================================ */
4
+
5
+ .markdown-editor {
6
+ border: 1px solid var(--md-border, #d0d7de);
7
+ border-radius: 6px;
8
+ overflow: hidden;
9
+ display: flex;
10
+ flex-direction: column;
11
+ }
12
+
13
+ /* 工具栏 */
14
+ .markdown-toolbar {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ gap: 2px;
19
+ padding: 4px 8px;
20
+ background: var(--md-code-bg, #f6f8fa);
21
+ border-bottom: 1px solid var(--md-border, #d0d7de);
22
+ }
23
+
24
+ .toolbar-left {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 1px;
28
+ }
29
+
30
+ .toolbar-left .toolbar-btn.active {
31
+ background: var(--md-bg, #ffffff);
32
+ color: var(--md-link, #0969da);
33
+ border-color: var(--md-border, #d0d7de);
34
+ }
35
+
36
+ .toolbar-right {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 2px;
40
+ flex-wrap: wrap;
41
+ }
42
+
43
+ .toolbar-btn {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ width: 32px;
48
+ height: 32px;
49
+ padding: 0;
50
+ border: 1px solid transparent;
51
+ border-radius: 4px;
52
+ background: transparent;
53
+ color: var(--md-text-secondary, #656d76);
54
+ cursor: pointer;
55
+ font-size: 14px;
56
+ transition: all 0.15s;
57
+ }
58
+
59
+ .toolbar-btn:hover {
60
+ background: var(--md-bg, #ffffff);
61
+ border-color: var(--md-border, #d0d7de);
62
+ color: var(--md-text, #1f2328);
63
+ }
64
+
65
+ .toolbar-btn:active {
66
+ transform: scale(0.95);
67
+ }
68
+
69
+ .toolbar-separator {
70
+ width: 1px;
71
+ height: 20px;
72
+ background: var(--md-border, #d0d7de);
73
+ margin: 0 4px;
74
+ }
75
+
76
+ .toolbar-icon {
77
+ font-size: 14px;
78
+ line-height: 1;
79
+ }
80
+
81
+ .toolbar-icon-svg {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ }
86
+
87
+ .toolbar-icon-svg svg {
88
+ display: block;
89
+ }
90
+
91
+ /* 编辑面板 */
92
+ .markdown-editor-panels {
93
+ display: flex;
94
+ flex: 1;
95
+ min-height: 0;
96
+ }
97
+
98
+ .markdown-editor-panel {
99
+ flex: 1;
100
+ overflow: auto;
101
+ min-height: 200px;
102
+ }
103
+
104
+ .markdown-editor-panel .cm-editor {
105
+ height: 100%;
106
+ }
107
+
108
+ .markdown-editor-panel .cm-editor .cm-content {
109
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas,
110
+ monospace;
111
+ font-size: 14px;
112
+ }
113
+
114
+ .markdown-preview-panel {
115
+ flex: 1;
116
+ overflow: auto;
117
+ padding: 16px;
118
+ border-left: 1px solid var(--md-border, #d0d7de);
119
+ }
120
+
121
+ /* 布局模式 */
122
+ .layout-split .markdown-editor-panels {
123
+ display: flex;
124
+ }
125
+
126
+ .layout-split .markdown-editor-panel,
127
+ .layout-split .markdown-preview-panel {
128
+ width: 50%;
129
+ }
130
+
131
+ .layout-tabs .markdown-editor-panels {
132
+ display: flex;
133
+ }
134
+
135
+ .layout-tabs .markdown-editor-panel,
136
+ .layout-tabs .markdown-preview-panel {
137
+ width: 100%;
138
+ }
139
+
140
+ .layout-editor-only .markdown-preview-panel {
141
+ display: none;
142
+ }
143
+
144
+ .layout-preview-only .markdown-editor-panel {
145
+ display: none;
146
+ }
147
+
148
+ .layout-preview-only .markdown-preview-panel {
149
+ border-left: none;
150
+ }
151
+
152
+ /* ============================================================
153
+ Theme Switcher & Locale Switcher
154
+ ============================================================ */
155
+ .angus-theme-switcher,
156
+ .angus-locale-switcher {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ gap: 4px;
160
+ border: 1px solid var(--md-border, #d0d7de);
161
+ border-radius: 6px;
162
+ padding: 2px;
163
+ background: var(--md-code-bg, #f6f8fa);
164
+ }
165
+
166
+ .theme-switcher-btn,
167
+ .locale-switcher-btn {
168
+ display: inline-flex;
169
+ align-items: center;
170
+ gap: 4px;
171
+ padding: 4px 10px;
172
+ border: none;
173
+ border-radius: 4px;
174
+ background: transparent;
175
+ color: var(--md-text-secondary, #656d76);
176
+ cursor: pointer;
177
+ font-size: 13px;
178
+ transition: all 0.15s;
179
+ white-space: nowrap;
180
+ }
181
+
182
+ .theme-switcher-btn:hover,
183
+ .locale-switcher-btn:hover {
184
+ background: var(--md-bg, #ffffff);
185
+ color: var(--md-text, #1f2328);
186
+ }
187
+
188
+ .theme-switcher-btn.active,
189
+ .locale-switcher-btn.active {
190
+ background: var(--md-bg, #ffffff);
191
+ color: var(--md-link, #0969da);
192
+ font-weight: 600;
193
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
194
+ }
195
+
196
+ .theme-switcher-label {
197
+ font-size: 12px;
198
+ }
199
+
200
+ /* Fullscreen mode */
201
+ .markdown-editor-fullscreen {
202
+ position: fixed;
203
+ top: 0;
204
+ left: 0;
205
+ right: 0;
206
+ bottom: 0;
207
+ z-index: 9999;
208
+ border-radius: 0;
209
+ background: var(--md-bg, #ffffff);
210
+ }
211
+
212
+ .markdown-editor-fullscreen .markdown-editor-panels {
213
+ height: calc(100vh - 45px);
214
+ }
215
+
216
+ /* ============================================================
217
+ Heading dropdown
218
+ ============================================================ */
219
+ .toolbar-heading-group {
220
+ position: relative;
221
+ display: inline-flex;
222
+ }
223
+
224
+ .toolbar-heading-group .toolbar-btn {
225
+ display: inline-flex;
226
+ align-items: center;
227
+ gap: 2px;
228
+ }
229
+
230
+ .toolbar-caret {
231
+ font-size: 10px;
232
+ opacity: 0.6;
233
+ }
234
+
235
+ .toolbar-dropdown {
236
+ position: absolute;
237
+ top: 100%;
238
+ left: 0;
239
+ z-index: 1000;
240
+ min-width: 140px;
241
+ padding: 4px;
242
+ background: var(--md-bg, #ffffff);
243
+ border: 1px solid var(--md-border, #d0d7de);
244
+ border-radius: 6px;
245
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
246
+ }
247
+
248
+ .toolbar-dropdown-item {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: 8px;
252
+ width: 100%;
253
+ padding: 6px 10px;
254
+ border: none;
255
+ border-radius: 4px;
256
+ background: transparent;
257
+ color: var(--md-text, #1f2328);
258
+ cursor: pointer;
259
+ font-size: 13px;
260
+ transition: background 0.12s;
261
+ }
262
+
263
+ .toolbar-dropdown-item:hover {
264
+ background: var(--md-code-bg, #f6f8fa);
265
+ }
266
+
267
+ .toolbar-btn.active {
268
+ background: var(--md-code-bg, #f6f8fa);
269
+ border-color: var(--md-border, #d0d7de);
270
+ }
271
+
272
+ /* ============================================================
273
+ Mobile responsive
274
+ ============================================================ */
275
+ @media (max-width: 768px) {
276
+ .markdown-editor-panels {
277
+ flex-direction: column;
278
+ }
279
+
280
+ .layout-split .markdown-editor-panel,
281
+ .layout-split .markdown-preview-panel {
282
+ width: 100%;
283
+ }
284
+
285
+ .markdown-preview-panel {
286
+ border-left: none;
287
+ border-top: 1px solid var(--md-border, #d0d7de);
288
+ }
289
+
290
+ .markdown-toolbar {
291
+ overflow-x: auto;
292
+ flex-wrap: nowrap;
293
+ -webkit-overflow-scrolling: touch;
294
+ }
295
+
296
+ .markdown-toolbar::-webkit-scrollbar {
297
+ height: 0;
298
+ }
299
+ }
300
+
301
+ /* ============================================================
302
+ Dark theme for editor
303
+ ============================================================ */
304
+ .markdown-editor.markdown-theme-dark {
305
+ border-color: var(--md-border);
306
+ background: var(--md-bg);
307
+ }
308
+
309
+ .markdown-editor.markdown-theme-dark .markdown-toolbar {
310
+ background: var(--md-bg);
311
+ border-bottom-color: var(--md-border);
312
+ }
313
+
314
+ .markdown-editor.markdown-theme-dark .toolbar-btn {
315
+ color: var(--md-text-secondary);
316
+ }
317
+
318
+ .markdown-editor.markdown-theme-dark .toolbar-btn:hover {
319
+ background: var(--md-bg);
320
+ border-color: var(--md-border);
321
+ color: var(--md-text);
322
+ }
323
+
324
+ .markdown-editor.markdown-theme-dark .toolbar-separator {
325
+ background: var(--md-border);
326
+ }
327
+
328
+ .markdown-editor.markdown-theme-dark .toolbar-dropdown {
329
+ background: var(--md-bg);
330
+ border-color: var(--md-border);
331
+ }
332
+
333
+ .markdown-editor.markdown-theme-dark .toolbar-dropdown-item {
334
+ color: var(--md-text);
335
+ }
336
+
337
+ .markdown-editor.markdown-theme-dark .toolbar-dropdown-item:hover {
338
+ background: rgba(255, 255, 255, 0.1);
339
+ }
340
+
341
+ .markdown-editor.markdown-theme-dark .markdown-preview-panel {
342
+ border-left-color: var(--md-border);
343
+ }
344
+
345
+ /* CodeMirror dark overrides */
346
+ .markdown-editor.markdown-theme-dark .cm-editor {
347
+ background-color: var(--md-bg);
348
+ }
349
+
350
+ /* Character counter */
351
+ .markdown-editor-counter {
352
+ padding: 4px 12px;
353
+ font-size: 12px;
354
+ color: var(--md-text-secondary, #656d76);
355
+ text-align: right;
356
+ border-top: 1px solid var(--md-border, #d0d7de);
357
+ background: var(--md-code-bg, #f6f8fa);
358
+ }
359
+
360
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-gutters {
361
+ background-color: var(--md-bg);
362
+ border-right-color: var(--md-border);
363
+ color: var(--md-text-secondary);
364
+ }
365
+
366
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-content {
367
+ color: var(--md-text);
368
+ caret-color: var(--md-text);
369
+ }
370
+
371
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-cursor {
372
+ border-left-color: var(--md-text);
373
+ }
374
+
375
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-activeLine {
376
+ background-color: rgba(255, 255, 255, 0.05);
377
+ }
378
+
379
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-selectionBackground,
380
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-content ::selection {
381
+ background-color: rgba(88, 166, 255, 0.2);
382
+ }
383
+
384
+ .markdown-editor.markdown-theme-dark .cm-editor .cm-activeLineGutter {
385
+ background-color: rgba(255, 255, 255, 0.05);
386
+ }
387
+
388
+ /* Also support github-dark theme class */
389
+ .markdown-editor.markdown-theme-github-dark {
390
+ border-color: var(--md-border);
391
+ background: var(--md-bg);
392
+ }
393
+
394
+ .markdown-editor.markdown-theme-github-dark .markdown-toolbar {
395
+ background: var(--md-bg);
396
+ border-bottom-color: var(--md-border);
397
+ }
398
+
399
+ .markdown-editor.markdown-theme-github-dark .cm-editor {
400
+ background-color: var(--md-bg);
401
+ }
402
+
403
+ .markdown-editor.markdown-theme-github-dark .cm-editor .cm-content {
404
+ color: var(--md-text);
405
+ caret-color: var(--md-text);
406
+ }
407
+
408
+ .markdown-editor.markdown-theme-github-dark .cm-editor .cm-cursor {
409
+ border-left-color: var(--md-text);
410
+ }
411
+
412
+ .markdown-editor.markdown-theme-github-dark .cm-editor .cm-activeLine {
413
+ background-color: rgba(255, 255, 255, 0.05);
414
+ }
415
+
416
+ /* ThemeSwitcher / LocaleSwitcher dark overrides */
417
+ .markdown-theme-dark .angus-theme-switcher,
418
+ .markdown-theme-dark .angus-locale-switcher {
419
+ border-color: var(--md-border);
420
+ background: var(--md-code-bg);
421
+ }
422
+
423
+ .markdown-theme-dark .theme-switcher-btn,
424
+ .markdown-theme-dark .locale-switcher-btn {
425
+ color: var(--md-text-secondary);
426
+ }
427
+
428
+ .markdown-theme-dark .theme-switcher-btn:hover,
429
+ .markdown-theme-dark .locale-switcher-btn:hover {
430
+ background: var(--md-bg);
431
+ color: var(--md-text);
432
+ }
433
+
434
+ .markdown-theme-dark .theme-switcher-btn.active,
435
+ .markdown-theme-dark .locale-switcher-btn.active {
436
+ background: var(--md-bg);
437
+ color: var(--md-link);
438
+ }
@@ -0,0 +1,592 @@
1
+ /* ============================================================
2
+ CSS Custom Properties — 主题变量
3
+ ============================================================ */
4
+ .markdown-renderer {
5
+ /* 间距 */
6
+ --md-spacing-xs: 4px;
7
+ --md-spacing-sm: 8px;
8
+ --md-spacing-md: 16px;
9
+ --md-spacing-lg: 24px;
10
+ --md-spacing-xl: 32px;
11
+
12
+ /* 字体 */
13
+ --md-font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica,
14
+ Arial, sans-serif;
15
+ --md-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas,
16
+ monospace;
17
+ --md-font-size-base: 16px;
18
+ --md-line-height: 1.7;
19
+
20
+ /* 圆角 */
21
+ --md-radius: 6px;
22
+ }
23
+
24
+ /* Light 主题 */
25
+ .markdown-theme-light,
26
+ .markdown-theme-auto {
27
+ --md-bg: #ffffff;
28
+ --md-text: #1f2328;
29
+ --md-text-secondary: #656d76;
30
+ --md-border: #d0d7de;
31
+ --md-link: #0969da;
32
+ --md-code-bg: #f6f8fa;
33
+ --md-blockquote-border: #d0d7de;
34
+ --md-blockquote-text: #656d76;
35
+ --md-table-border: #d0d7de;
36
+ --md-table-row-alt: #f6f8fa;
37
+ --md-mark-bg: #fff8c5;
38
+ }
39
+
40
+ /* Dark 主题 */
41
+ .markdown-theme-dark {
42
+ --md-bg: #0d1117;
43
+ --md-text: #e6edf3;
44
+ --md-text-secondary: #8b949e;
45
+ --md-border: #30363d;
46
+ --md-link: #58a6ff;
47
+ --md-code-bg: #f0f0f0;
48
+ --md-blockquote-border: #30363d;
49
+ --md-blockquote-text: #8b949e;
50
+ --md-table-border: #30363d;
51
+ --md-table-row-alt: #161b22;
52
+ --md-mark-bg: rgba(187, 128, 9, 0.15);
53
+ }
54
+
55
+ @media (prefers-color-scheme: dark) {
56
+ .markdown-theme-auto {
57
+ --md-bg: #0d1117;
58
+ --md-text: #e6edf3;
59
+ --md-text-secondary: #8b949e;
60
+ --md-border: #30363d;
61
+ --md-link: #58a6ff;
62
+ --md-code-bg: #f0f0f0;
63
+ --md-blockquote-border: #30363d;
64
+ --md-blockquote-text: #8b949e;
65
+ --md-table-border: #30363d;
66
+ --md-table-row-alt: #161b22;
67
+ --md-mark-bg: rgba(187, 128, 9, 0.15);
68
+ }
69
+ }
70
+
71
+ /* ============================================================
72
+ Markdown Body
73
+ ============================================================ */
74
+ .markdown-body {
75
+ flex: 1;
76
+ min-width: 0;
77
+ font-family: var(--md-font-body);
78
+ font-size: var(--md-font-size-base);
79
+ line-height: var(--md-line-height);
80
+ color: var(--md-text);
81
+ background: var(--md-bg);
82
+ word-wrap: break-word;
83
+ overflow-wrap: break-word;
84
+ }
85
+
86
+ /* Headings */
87
+ .markdown-body h1,
88
+ .markdown-body h2,
89
+ .markdown-body h3,
90
+ .markdown-body h4,
91
+ .markdown-body h5,
92
+ .markdown-body h6 {
93
+ margin-top: var(--md-spacing-lg);
94
+ margin-bottom: var(--md-spacing-md);
95
+ font-weight: 600;
96
+ line-height: 1.25;
97
+ }
98
+
99
+ .markdown-body h1 {
100
+ font-size: 2em;
101
+ border-bottom: 1px solid var(--md-border);
102
+ padding-bottom: 0.3em;
103
+ }
104
+ .markdown-body h2 {
105
+ font-size: 1.5em;
106
+ border-bottom: 1px solid var(--md-border);
107
+ padding-bottom: 0.3em;
108
+ }
109
+ .markdown-body h3 {
110
+ font-size: 1.25em;
111
+ }
112
+ .markdown-body h4 {
113
+ font-size: 1em;
114
+ }
115
+ .markdown-body h5 {
116
+ font-size: 0.875em;
117
+ }
118
+ .markdown-body h6 {
119
+ font-size: 0.85em;
120
+ color: var(--md-text-secondary);
121
+ }
122
+
123
+ /* Paragraphs */
124
+ .markdown-body p {
125
+ margin-top: 0;
126
+ margin-bottom: var(--md-spacing-md);
127
+ }
128
+
129
+ /* Links */
130
+ .markdown-body a {
131
+ color: var(--md-link);
132
+ text-decoration: none;
133
+ }
134
+ .markdown-body a:hover {
135
+ text-decoration: underline;
136
+ }
137
+
138
+ /* Inline Code */
139
+ .markdown-body code:not(pre code) {
140
+ padding: 0.2em 0.4em;
141
+ margin: 0;
142
+ font-size: 85%;
143
+ background-color: var(--md-code-bg);
144
+ border-radius: var(--md-radius);
145
+ font-family: var(--md-font-mono);
146
+ }
147
+
148
+ /* Code Block */
149
+ .markdown-body .code-block {
150
+ position: relative;
151
+ margin: var(--md-spacing-md) 0;
152
+ border-radius: var(--md-radius);
153
+ overflow: hidden;
154
+ border: 1px solid rgba(208, 215, 222, 0.4);
155
+ background-color: var(--md-code-bg);
156
+ }
157
+
158
+ .markdown-body .code-block pre {
159
+ margin: 0;
160
+ padding: var(--md-spacing-md);
161
+ overflow-x: auto;
162
+ background-color: var(--md-code-bg) !important;
163
+ }
164
+
165
+ /* Copy button styles now handled by .code-block-actions */
166
+
167
+ /* Pre (fallback for non-highlighted code) */
168
+ .markdown-body pre {
169
+ padding: var(--md-spacing-md);
170
+ overflow-x: auto;
171
+ font-size: 85%;
172
+ line-height: 1.45;
173
+ background-color: var(--md-code-bg);
174
+ border: 1px solid rgba(208, 215, 222, 0.4);
175
+ border-radius: var(--md-radius);
176
+ font-family: var(--md-font-mono);
177
+ }
178
+
179
+ /* Blockquote */
180
+ .markdown-body blockquote {
181
+ margin: var(--md-spacing-md) 0;
182
+ padding: 0 1em;
183
+ color: var(--md-blockquote-text);
184
+ border-left: 0.25em solid var(--md-blockquote-border);
185
+ }
186
+
187
+ /* Lists */
188
+ .markdown-body ul,
189
+ .markdown-body ol {
190
+ padding-left: 2em;
191
+ margin-top: 0;
192
+ margin-bottom: var(--md-spacing-md);
193
+ }
194
+
195
+ .markdown-body li + li {
196
+ margin-top: 0.25em;
197
+ }
198
+
199
+ /* Tables */
200
+ .markdown-body table {
201
+ border-spacing: 0;
202
+ border-collapse: collapse;
203
+ width: max-content;
204
+ max-width: 100%;
205
+ overflow: auto;
206
+ margin: var(--md-spacing-md) 0;
207
+ display: block;
208
+ }
209
+
210
+ .markdown-body th,
211
+ .markdown-body td {
212
+ padding: 6px 13px;
213
+ border: 1px solid var(--md-table-border);
214
+ }
215
+
216
+ .markdown-body tr:nth-child(2n) {
217
+ background-color: var(--md-table-row-alt);
218
+ }
219
+
220
+ .markdown-body th {
221
+ font-weight: 600;
222
+ }
223
+
224
+ /* Task Lists */
225
+ .markdown-body .task-list-item {
226
+ list-style-type: none;
227
+ }
228
+
229
+ .markdown-body .task-list-item input[type='checkbox'] {
230
+ margin-right: 0.5em;
231
+ }
232
+
233
+ /* Images */
234
+ .markdown-body img {
235
+ max-width: 100%;
236
+ height: auto;
237
+ border-radius: var(--md-radius);
238
+ }
239
+
240
+ /* Horizontal Rule */
241
+ .markdown-body hr {
242
+ border: 0;
243
+ border-top: 1px solid var(--md-border);
244
+ margin: var(--md-spacing-lg) 0;
245
+ }
246
+
247
+ /* Mark / Highlight */
248
+ .markdown-body mark {
249
+ background-color: var(--md-mark-bg);
250
+ padding: 0.1em 0.2em;
251
+ border-radius: 2px;
252
+ }
253
+
254
+ /* Strikethrough */
255
+ .markdown-body del {
256
+ text-decoration: line-through;
257
+ }
258
+
259
+ /* GFM Alerts */
260
+ .markdown-body .markdown-alert {
261
+ padding: var(--md-spacing-md);
262
+ margin: var(--md-spacing-md) 0;
263
+ border-radius: var(--md-radius);
264
+ border-left: 4px solid;
265
+ }
266
+
267
+ .markdown-body .markdown-alert-note {
268
+ border-color: #0969da;
269
+ background: rgba(9, 105, 218, 0.08);
270
+ }
271
+ .markdown-body .markdown-alert-tip {
272
+ border-color: #1a7f37;
273
+ background: rgba(26, 127, 55, 0.08);
274
+ }
275
+ .markdown-body .markdown-alert-warning {
276
+ border-color: #bf8700;
277
+ background: rgba(191, 135, 0, 0.08);
278
+ }
279
+ .markdown-body .markdown-alert-caution {
280
+ border-color: #cf222e;
281
+ background: rgba(207, 34, 46, 0.08);
282
+ }
283
+ .markdown-body .markdown-alert-important {
284
+ border-color: #8250df;
285
+ background: rgba(130, 80, 223, 0.08);
286
+ }
287
+
288
+ /* Custom Containers */
289
+ .markdown-body .markdown-container {
290
+ padding: var(--md-spacing-md);
291
+ margin: var(--md-spacing-md) 0;
292
+ border-radius: var(--md-radius);
293
+ border-left: 4px solid var(--md-border);
294
+ background: var(--md-code-bg);
295
+ }
296
+
297
+ .markdown-body .markdown-container-warning {
298
+ border-color: #bf8700;
299
+ background: rgba(191, 135, 0, 0.08);
300
+ }
301
+
302
+ .markdown-body .markdown-container-danger {
303
+ border-color: #cf222e;
304
+ background: rgba(207, 34, 46, 0.08);
305
+ }
306
+
307
+ .markdown-body .markdown-container-tip {
308
+ border-color: #1a7f37;
309
+ background: rgba(26, 127, 55, 0.08);
310
+ }
311
+
312
+ .markdown-body .markdown-container-note {
313
+ border-color: #0969da;
314
+ background: rgba(9, 105, 218, 0.08);
315
+ }
316
+
317
+ /* Mermaid */
318
+ .markdown-body .mermaid-container {
319
+ display: flex;
320
+ justify-content: center;
321
+ margin: var(--md-spacing-md) 0;
322
+ overflow-x: auto;
323
+ }
324
+
325
+ .markdown-body .mermaid-error {
326
+ padding: var(--md-spacing-md);
327
+ background: rgba(207, 34, 46, 0.08);
328
+ border: 1px solid rgba(207, 34, 46, 0.3);
329
+ border-radius: var(--md-radius);
330
+ color: #cf222e;
331
+ }
332
+
333
+ /* TOC */
334
+ .markdown-body .markdown-toc {
335
+ padding-left: 1.5em;
336
+ list-style: none;
337
+ }
338
+
339
+ .markdown-body .markdown-toc-level-0 {
340
+ padding-left: 0;
341
+ }
342
+
343
+ .markdown-body .markdown-toc-link {
344
+ color: var(--md-link);
345
+ text-decoration: none;
346
+ }
347
+
348
+ .markdown-body .markdown-toc-link:hover {
349
+ text-decoration: underline;
350
+ }
351
+
352
+ /* Footnotes */
353
+ .markdown-body .footnotes {
354
+ font-size: 0.875em;
355
+ border-top: 1px solid var(--md-border);
356
+ margin-top: var(--md-spacing-lg);
357
+ padding-top: var(--md-spacing-md);
358
+ }
359
+
360
+ /* KaTeX overrides */
361
+ .markdown-body .katex-display {
362
+ overflow-x: auto;
363
+ overflow-y: hidden;
364
+ padding: var(--md-spacing-sm) 0;
365
+ }
366
+
367
+ /* Error state */
368
+ .markdown-error .markdown-error-banner {
369
+ padding: var(--md-spacing-md);
370
+ background: rgba(207, 34, 46, 0.08);
371
+ border: 1px solid rgba(207, 34, 46, 0.3);
372
+ border-radius: var(--md-radius);
373
+ color: #cf222e;
374
+ }
375
+
376
+ /* Loading state */
377
+ .markdown-renderer[data-loading] {
378
+ opacity: 0.7;
379
+ transition: opacity 0.2s;
380
+ }
381
+
382
+ /* TOC Sidebar */
383
+ .markdown-renderer {
384
+ display: flex;
385
+ gap: var(--md-spacing-lg);
386
+ }
387
+
388
+ /* TOC right (default): TOC after body */
389
+ .markdown-renderer.toc-right .markdown-toc-sidebar {
390
+ order: 1;
391
+ }
392
+
393
+ .markdown-renderer.toc-right .markdown-body {
394
+ order: 0;
395
+ }
396
+
397
+ /* TOC left: TOC before body (natural DOM order) */
398
+ .markdown-renderer.toc-left .markdown-toc-sidebar {
399
+ order: 0;
400
+ }
401
+
402
+ .markdown-renderer.toc-left .markdown-body {
403
+ order: 1;
404
+ }
405
+
406
+ .markdown-toc-sidebar {
407
+ flex: 0 0 200px;
408
+ position: sticky;
409
+ top: 0;
410
+ overflow-x: hidden;
411
+ padding: var(--md-spacing-sm) var(--md-spacing-md);
412
+ font-size: 0.8125em;
413
+ }
414
+
415
+ .markdown-toc-sidebar .toc-nav {
416
+ border-left: 2px solid var(--md-border);
417
+ }
418
+
419
+ .markdown-toc-sidebar .toc-list {
420
+ list-style: none;
421
+ padding-left: var(--md-spacing-md);
422
+ margin: 0;
423
+ }
424
+
425
+ .markdown-toc-sidebar .toc-item a {
426
+ display: block;
427
+ padding: 2px 0;
428
+ color: var(--md-text-secondary);
429
+ text-decoration: none;
430
+ transition: color 0.15s;
431
+ }
432
+
433
+ .markdown-toc-sidebar .toc-item a:hover {
434
+ color: var(--md-link);
435
+ }
436
+
437
+ .markdown-toc-sidebar .toc-active > a {
438
+ color: var(--md-link);
439
+ font-weight: 600;
440
+ }
441
+
442
+ /* Scrollbar styling for code blocks */
443
+ .markdown-body pre::-webkit-scrollbar,
444
+ .markdown-body .code-block::-webkit-scrollbar {
445
+ height: 6px;
446
+ }
447
+
448
+ .markdown-body pre::-webkit-scrollbar-thumb,
449
+ .markdown-body .code-block::-webkit-scrollbar-thumb {
450
+ background: var(--md-border);
451
+ border-radius: 3px;
452
+ }
453
+
454
+ /* Dark theme code block overrides */
455
+ .markdown-theme-dark .markdown-body .code-block,
456
+ .markdown-theme-github-dark .markdown-body .code-block {
457
+ border-color: rgba(48, 54, 61, 0.6);
458
+ }
459
+
460
+ .markdown-theme-dark .markdown-body pre,
461
+ .markdown-theme-github-dark .markdown-body pre {
462
+ border-color: rgba(48, 54, 61, 0.6);
463
+ }
464
+
465
+ /* Override Shiki inline background-color */
466
+ .markdown-body .code-block .shiki,
467
+ .markdown-body .code-block .shiki pre {
468
+ background-color: var(--md-code-bg) !important;
469
+ }
470
+
471
+ /* Streaming cursor animation */
472
+ .markdown-body.streaming::after {
473
+ content: '▎';
474
+ display: inline;
475
+ animation: cursor-blink 1s step-end infinite;
476
+ color: var(--md-link, #0969da);
477
+ font-weight: bold;
478
+ }
479
+
480
+ @keyframes cursor-blink {
481
+ 0%, 100% { opacity: 1; }
482
+ 50% { opacity: 0; }
483
+ }
484
+
485
+ /* Code block actions container */
486
+ .markdown-body .code-block .code-block-actions {
487
+ position: absolute;
488
+ top: 8px;
489
+ right: 8px;
490
+ display: flex;
491
+ gap: 4px;
492
+ opacity: 0;
493
+ transition: opacity 0.2s;
494
+ }
495
+
496
+ .markdown-body .code-block:hover .code-block-actions {
497
+ opacity: 1;
498
+ }
499
+
500
+ .markdown-body .code-block .code-block-actions button {
501
+ padding: 4px 12px;
502
+ font-size: 12px;
503
+ border: 1px solid var(--md-border);
504
+ border-radius: var(--md-radius);
505
+ background: var(--md-bg);
506
+ color: var(--md-text-secondary);
507
+ cursor: pointer;
508
+ transition: color 0.15s, border-color 0.15s;
509
+ }
510
+
511
+ .markdown-body .code-block .code-block-actions button:hover {
512
+ color: var(--md-text);
513
+ border-color: var(--md-text-secondary);
514
+ }
515
+
516
+ /* HTML preview modal */
517
+ .code-preview-modal {
518
+ position: fixed;
519
+ top: 0;
520
+ left: 0;
521
+ right: 0;
522
+ bottom: 0;
523
+ z-index: 10000;
524
+ display: flex;
525
+ align-items: center;
526
+ justify-content: center;
527
+ background: rgba(0, 0, 0, 0.5);
528
+ }
529
+
530
+ .code-preview-close {
531
+ position: absolute;
532
+ top: 16px;
533
+ right: 16px;
534
+ z-index: 1;
535
+ padding: 6px 16px;
536
+ font-size: 14px;
537
+ border: 1px solid rgba(255, 255, 255, 0.3);
538
+ border-radius: var(--md-radius, 6px);
539
+ background: rgba(0, 0, 0, 0.6);
540
+ color: #fff;
541
+ cursor: pointer;
542
+ }
543
+
544
+ .code-preview-close:hover {
545
+ background: rgba(0, 0, 0, 0.8);
546
+ }
547
+
548
+ .code-preview-iframe {
549
+ width: 80vw;
550
+ height: 80vh;
551
+ border: none;
552
+ border-radius: var(--md-radius, 6px);
553
+ background: #fff;
554
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.24);
555
+ }
556
+
557
+ /* ============================================================
558
+ Mobile responsive
559
+ ============================================================ */
560
+ @media (max-width: 768px) {
561
+ .markdown-renderer {
562
+ flex-direction: column;
563
+ }
564
+
565
+ .markdown-toc-sidebar {
566
+ flex: none;
567
+ position: static;
568
+ max-height: none;
569
+ border-bottom: 1px solid var(--md-border);
570
+ padding-bottom: var(--md-spacing-md);
571
+ }
572
+
573
+ .markdown-body {
574
+ font-size: 15px;
575
+ }
576
+
577
+ .markdown-body h1 {
578
+ font-size: 1.6em;
579
+ }
580
+
581
+ .markdown-body h2 {
582
+ font-size: 1.3em;
583
+ }
584
+
585
+ .markdown-body table {
586
+ font-size: 14px;
587
+ }
588
+
589
+ .markdown-body pre {
590
+ font-size: 13px;
591
+ }
592
+ }
@@ -0,0 +1,28 @@
1
+ /* GitHub 风格主题 */
2
+ .markdown-theme-github {
3
+ --md-bg: #ffffff;
4
+ --md-text: #1f2328;
5
+ --md-text-secondary: #656d76;
6
+ --md-border: #d0d7de;
7
+ --md-link: #0969da;
8
+ --md-code-bg: #f6f8fa;
9
+ --md-blockquote-border: #d0d7de;
10
+ --md-blockquote-text: #656d76;
11
+ --md-table-border: #d0d7de;
12
+ --md-table-row-alt: #f6f8fa;
13
+ --md-mark-bg: #fff8c5;
14
+ }
15
+
16
+ .markdown-theme-github-dark {
17
+ --md-bg: #0d1117;
18
+ --md-text: #e6edf3;
19
+ --md-text-secondary: #8b949e;
20
+ --md-border: #30363d;
21
+ --md-link: #58a6ff;
22
+ --md-code-bg: #f0f0f0;
23
+ --md-blockquote-border: #30363d;
24
+ --md-blockquote-text: #8b949e;
25
+ --md-table-border: #30363d;
26
+ --md-table-row-alt: #161b22;
27
+ --md-mark-bg: rgba(187, 128, 9, 0.15);
28
+ }
@@ -0,0 +1,17 @@
1
+ /* Notion 风格主题 */
2
+ .markdown-theme-notion {
3
+ --md-bg: #ffffff;
4
+ --md-text: #37352f;
5
+ --md-text-secondary: #9b9a97;
6
+ --md-border: #e9e9e7;
7
+ --md-link: #2eaadc;
8
+ --md-code-bg: #f7f6f3;
9
+ --md-blockquote-border: #e9e9e7;
10
+ --md-blockquote-text: #9b9a97;
11
+ --md-table-border: #e9e9e7;
12
+ --md-table-row-alt: #f7f6f3;
13
+ --md-mark-bg: #fdecc8;
14
+ --md-font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica,
15
+ 'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji';
16
+ --md-line-height: 1.5;
17
+ }
@@ -0,0 +1,17 @@
1
+ /* Typora 风格主题 */
2
+ .markdown-theme-typora {
3
+ --md-bg: #ffffff;
4
+ --md-text: #333333;
5
+ --md-text-secondary: #999999;
6
+ --md-border: #e7e7e7;
7
+ --md-link: #4183c4;
8
+ --md-code-bg: #f8f8f8;
9
+ --md-blockquote-border: #dfe2e5;
10
+ --md-blockquote-text: #6a737d;
11
+ --md-table-border: #dfe2e5;
12
+ --md-table-row-alt: #f6f8fa;
13
+ --md-mark-bg: #fff3cd;
14
+ --md-font-body: 'Open Sans', 'Clear Sans', 'Helvetica Neue', Helvetica,
15
+ Arial, sans-serif;
16
+ --md-line-height: 1.6;
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xcan-cloud/markdown",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Production-grade, extensible, high-performance Markdown rendering and editing component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -13,7 +13,7 @@
13
13
  "type": "module",
14
14
  "scripts": {
15
15
  "dev": "vite",
16
- "build": "tsc && vite build",
16
+ "build": "tsc && vite build && cp -r src/styles dist/",
17
17
  "test": "vitest run",
18
18
  "test:watch": "vitest",
19
19
  "lint": "tsc --noEmit",