@lobehub/editor 4.13.0 → 4.15.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.
@@ -0,0 +1,923 @@
1
+ import { n as createDebugLogger, s as init_debug } from "./debug-CIvbNHJu.js";
2
+ import { ActionIcon, Flexbox, InputNumber, MaterialFileTypeIcon, Popover, Select, Text } from "@lobehub/ui";
3
+ import { Check, ChevronDown, ChevronRight, CopyIcon, MoreHorizontalIcon } from "lucide-react";
4
+ import { useCallback, useMemo, useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { createStaticStyles, cssVar, cx } from "antd-style";
7
+ import { Switch } from "antd";
8
+ //#region src/codemirror/components/CopyButton.tsx
9
+ const CopyButton = ({ onCopy, labels, className }) => {
10
+ const [copied, setCopied] = useState(false);
11
+ return /* @__PURE__ */ jsx(ActionIcon, {
12
+ active: copied,
13
+ className: className ?? "cm-hidden-actions",
14
+ icon: copied ? Check : CopyIcon,
15
+ onClick: () => {
16
+ setCopied(true);
17
+ onCopy();
18
+ setTimeout(() => setCopied(false), 1e3);
19
+ },
20
+ size: "small",
21
+ title: labels?.copy ?? "Copy"
22
+ });
23
+ };
24
+ CopyButton.displayName = "CopyButton";
25
+ //#endregion
26
+ //#region src/codemirror/constants.ts
27
+ const LANGUAGES = [
28
+ {
29
+ ext: ["agda"],
30
+ name: "Agda",
31
+ syntax: "text/x-agda",
32
+ value: "agda"
33
+ },
34
+ {
35
+ ext: ["ets", "arkts"],
36
+ name: "ArkTS",
37
+ syntax: "text/x-arkts",
38
+ value: "arkts"
39
+ },
40
+ {
41
+ ext: ["bash"],
42
+ name: "Bash",
43
+ syntax: "shell",
44
+ value: "bash"
45
+ },
46
+ {
47
+ ext: ["vbs"],
48
+ name: "Basic",
49
+ syntax: "vbscript",
50
+ value: "basic"
51
+ },
52
+ {
53
+ ext: [
54
+ "c",
55
+ "h",
56
+ "ino"
57
+ ],
58
+ name: "C",
59
+ syntax: "text/x-csrc",
60
+ value: "c"
61
+ },
62
+ {
63
+ ext: [
64
+ "cpp",
65
+ "c++",
66
+ "cc",
67
+ "cxx",
68
+ "hpp",
69
+ "h++",
70
+ "hh",
71
+ "hxx"
72
+ ],
73
+ name: "C++",
74
+ syntax: "text/x-c++src",
75
+ value: "cpp"
76
+ },
77
+ {
78
+ ext: ["cs"],
79
+ name: "C#",
80
+ syntax: "text/x-csharp",
81
+ value: "csharp"
82
+ },
83
+ {
84
+ ext: ["css"],
85
+ name: "CSS",
86
+ syntax: "css",
87
+ value: "css"
88
+ },
89
+ {
90
+ ext: ["dart"],
91
+ name: "Dart",
92
+ syntax: "dart",
93
+ value: "dart"
94
+ },
95
+ {
96
+ ext: ["diff", "patch"],
97
+ name: "Diff",
98
+ syntax: "diff",
99
+ value: "diff"
100
+ },
101
+ {
102
+ name: "Dockerfile",
103
+ syntax: "dockerfile",
104
+ value: "dockerfile"
105
+ },
106
+ {
107
+ ext: ["erl"],
108
+ name: "Erlang",
109
+ syntax: "erlang",
110
+ value: "erlang"
111
+ },
112
+ {
113
+ ext: ["glsl"],
114
+ name: "Glsl",
115
+ syntax: "x-shader/x-vertex",
116
+ value: "glsl"
117
+ },
118
+ {
119
+ name: "Git",
120
+ syntax: "shell",
121
+ value: "git"
122
+ },
123
+ {
124
+ ext: ["go"],
125
+ name: "Go",
126
+ syntax: "go",
127
+ value: "go"
128
+ },
129
+ {
130
+ name: "GraphQL",
131
+ syntax: "graphql",
132
+ value: "graphql"
133
+ },
134
+ {
135
+ ext: ["groovy", "gradle"],
136
+ name: "Groovy",
137
+ syntax: "groovy",
138
+ value: "groovy"
139
+ },
140
+ {
141
+ ext: [
142
+ "html",
143
+ "htm",
144
+ "handlebars",
145
+ "hbs"
146
+ ],
147
+ name: "HTML",
148
+ syntax: "htmlmixed",
149
+ value: "html"
150
+ },
151
+ {
152
+ name: "HTTP",
153
+ syntax: "http",
154
+ value: "http"
155
+ },
156
+ {
157
+ ext: ["java"],
158
+ name: "Java",
159
+ syntax: "text/x-java",
160
+ value: "java"
161
+ },
162
+ {
163
+ ext: ["js"],
164
+ name: "JavaScript",
165
+ syntax: "text/javascript",
166
+ value: "javascript"
167
+ },
168
+ {
169
+ ext: ["json", "map"],
170
+ name: "JSON",
171
+ syntax: "application/json",
172
+ value: "json"
173
+ },
174
+ {
175
+ ext: ["jsx"],
176
+ name: "JSX",
177
+ syntax: "jsx",
178
+ value: "jsx"
179
+ },
180
+ {
181
+ name: "KaTeX",
182
+ syntax: "simplemode",
183
+ value: "katex"
184
+ },
185
+ {
186
+ ext: ["kt"],
187
+ name: "Kotlin",
188
+ syntax: "text/x-kotlin",
189
+ value: "kotlin"
190
+ },
191
+ {
192
+ ext: ["less"],
193
+ name: "Less",
194
+ syntax: "css",
195
+ value: "less"
196
+ },
197
+ {
198
+ name: "Makefile",
199
+ syntax: "cmake",
200
+ value: "makefile"
201
+ },
202
+ {
203
+ ext: [
204
+ "markdown",
205
+ "md",
206
+ "mkd"
207
+ ],
208
+ name: "Markdown",
209
+ syntax: "markdown",
210
+ value: "markdown"
211
+ },
212
+ {
213
+ name: "MATLAB",
214
+ syntax: "octave",
215
+ value: "matlab"
216
+ },
217
+ {
218
+ ext: ["conf"],
219
+ name: "Nginx",
220
+ syntax: "nginx",
221
+ value: "nginx"
222
+ },
223
+ {
224
+ ext: ["m"],
225
+ name: "Objective-C",
226
+ syntax: "text/x-objectivec",
227
+ value: "objectivec"
228
+ },
229
+ {
230
+ ext: ["p", "pas"],
231
+ name: "Pascal",
232
+ syntax: "pascal",
233
+ value: "pascal"
234
+ },
235
+ {
236
+ ext: ["pl", "pm"],
237
+ name: "Perl",
238
+ syntax: "perl",
239
+ value: "perl"
240
+ },
241
+ {
242
+ ext: [
243
+ "php",
244
+ "php3",
245
+ "php4",
246
+ "php5",
247
+ "php7",
248
+ "phtml"
249
+ ],
250
+ name: "PHP",
251
+ syntax: "text/x-php",
252
+ value: "php"
253
+ },
254
+ {
255
+ ext: [
256
+ "ps1",
257
+ "psd1",
258
+ "psm1"
259
+ ],
260
+ name: "PowerShell",
261
+ syntax: "powershell",
262
+ value: "powershell"
263
+ },
264
+ {
265
+ ext: ["proto"],
266
+ name: "Protobuf",
267
+ syntax: "protobuf",
268
+ value: "protobuf"
269
+ },
270
+ {
271
+ ext: [
272
+ "build",
273
+ "bzl",
274
+ "py",
275
+ "pyw"
276
+ ],
277
+ name: "Python",
278
+ syntax: "python",
279
+ value: "python"
280
+ },
281
+ {
282
+ ext: ["r", "R"],
283
+ name: "R",
284
+ syntax: "r",
285
+ value: "r"
286
+ },
287
+ {
288
+ ext: ["rb"],
289
+ name: "Ruby",
290
+ syntax: "ruby",
291
+ value: "ruby"
292
+ },
293
+ {
294
+ ext: ["rs"],
295
+ name: "Rust",
296
+ syntax: "rust",
297
+ value: "rust"
298
+ },
299
+ {
300
+ ext: ["scala"],
301
+ name: "Scala",
302
+ syntax: "text/x-scala",
303
+ value: "scala"
304
+ },
305
+ {
306
+ ext: ["sh", "ksh"],
307
+ name: "Shell",
308
+ syntax: "shell",
309
+ value: "shell"
310
+ },
311
+ {
312
+ ext: ["sql"],
313
+ name: "SQL",
314
+ syntax: "text/x-sql",
315
+ value: "sql"
316
+ },
317
+ {
318
+ name: "PL/SQL",
319
+ syntax: "text/x-plsql",
320
+ value: "plsql"
321
+ },
322
+ {
323
+ ext: ["swift"],
324
+ name: "Swift",
325
+ syntax: "swift",
326
+ value: "swift"
327
+ },
328
+ {
329
+ ext: ["ts"],
330
+ name: "TypeScript",
331
+ syntax: "text/typescript",
332
+ value: "typescript"
333
+ },
334
+ {
335
+ ext: ["vb"],
336
+ name: "VB.net",
337
+ syntax: "vb",
338
+ value: "vbnet"
339
+ },
340
+ {
341
+ ext: ["vtl"],
342
+ name: "Velocity",
343
+ syntax: "velocity",
344
+ value: "velocity"
345
+ },
346
+ {
347
+ ext: [
348
+ "xml",
349
+ "xsl",
350
+ "xsd",
351
+ "svg"
352
+ ],
353
+ name: "XML",
354
+ syntax: "xml",
355
+ value: "xml"
356
+ },
357
+ {
358
+ ext: ["yaml", "yml"],
359
+ name: "YAML",
360
+ syntax: "yaml",
361
+ value: "yaml"
362
+ },
363
+ {
364
+ name: "sTeX",
365
+ syntax: "text/x-stex",
366
+ value: "stex"
367
+ },
368
+ {
369
+ ext: [
370
+ "text",
371
+ "ltx",
372
+ "tex"
373
+ ],
374
+ name: "LaTeX",
375
+ syntax: "text/x-latex",
376
+ value: "latex"
377
+ },
378
+ {
379
+ ext: ["sv", "svh"],
380
+ name: "SystemVerilog",
381
+ syntax: "text/x-systemverilog",
382
+ value: "systemverilog"
383
+ },
384
+ {
385
+ ext: ["sass", "scss"],
386
+ name: "Sass",
387
+ syntax: "text/x-sass",
388
+ value: "sass"
389
+ },
390
+ {
391
+ ext: ["tcl"],
392
+ name: "Tcl",
393
+ syntax: "text/x-tcl",
394
+ value: "tcl"
395
+ },
396
+ {
397
+ ext: ["v"],
398
+ name: "Verilog",
399
+ syntax: "text/x-verilog",
400
+ value: "verilog"
401
+ },
402
+ {
403
+ name: "Vue",
404
+ syntax: "text/x-vue",
405
+ value: "vue"
406
+ },
407
+ {
408
+ ext: ["lua"],
409
+ name: "Lua",
410
+ syntax: "text/x-lua",
411
+ value: "lua"
412
+ },
413
+ {
414
+ ext: ["hs"],
415
+ name: "Haskell",
416
+ syntax: "haskell",
417
+ value: "haskell"
418
+ },
419
+ {
420
+ ext: [
421
+ "properties",
422
+ "ini",
423
+ "in"
424
+ ],
425
+ name: "Properties",
426
+ syntax: "properties",
427
+ value: "properties"
428
+ },
429
+ {
430
+ ext: ["toml"],
431
+ name: "TOML",
432
+ syntax: "toml",
433
+ value: "toml"
434
+ },
435
+ {
436
+ ext: ["cyp", "cypher"],
437
+ name: "Cypher",
438
+ syntax: "cypher",
439
+ value: "cypher"
440
+ },
441
+ {
442
+ ext: ["tsx"],
443
+ name: "TSX",
444
+ syntax: "jsx",
445
+ value: "tsx"
446
+ },
447
+ {
448
+ ext: ["fs"],
449
+ name: "F#",
450
+ syntax: "mllike",
451
+ value: "f#"
452
+ },
453
+ {
454
+ ext: [
455
+ "ml",
456
+ "mli",
457
+ "mll",
458
+ "mly"
459
+ ],
460
+ name: "OCaml",
461
+ syntax: "mllike",
462
+ value: "ocaml"
463
+ },
464
+ {
465
+ ext: [
466
+ "clj",
467
+ "cljc",
468
+ "cljx"
469
+ ],
470
+ name: "Clojure",
471
+ syntax: "clojure",
472
+ value: "clojure"
473
+ },
474
+ {
475
+ name: "ABAP",
476
+ syntax: "abap",
477
+ value: "abap"
478
+ },
479
+ {
480
+ ext: ["jl"],
481
+ name: "Julia",
482
+ syntax: "julia",
483
+ value: "julia"
484
+ },
485
+ {
486
+ ext: ["cmake"],
487
+ name: "CMake",
488
+ syntax: "cmake",
489
+ value: "cmake"
490
+ },
491
+ {
492
+ ext: ["scm", "ss"],
493
+ name: "Scheme",
494
+ syntax: "scheme",
495
+ value: "scheme"
496
+ },
497
+ {
498
+ ext: [
499
+ "cl",
500
+ "lisp",
501
+ "el"
502
+ ],
503
+ name: "Lisp",
504
+ syntax: "commonlisp",
505
+ value: "commonlisp"
506
+ },
507
+ {
508
+ ext: [
509
+ "f90",
510
+ "f95",
511
+ "f03"
512
+ ],
513
+ name: "Fortran",
514
+ syntax: "fortran",
515
+ value: "fortran"
516
+ },
517
+ {
518
+ ext: ["sol"],
519
+ name: "Solidity",
520
+ syntax: "solidity",
521
+ value: "solidity"
522
+ }
523
+ ];
524
+ LANGUAGES.sort((modeA, modeB) => {
525
+ const nameA = modeA.name.toLowerCase();
526
+ const nameB = modeB.name.toLowerCase();
527
+ if (nameA === nameB) return 0;
528
+ if (nameA < nameB) return -1;
529
+ return 1;
530
+ });
531
+ LANGUAGES.unshift({
532
+ name: "Plain Text",
533
+ syntax: "simplemode",
534
+ value: "plain"
535
+ });
536
+ //#endregion
537
+ //#region src/codemirror/components/style.ts
538
+ const styles$1 = createStaticStyles(({ css }) => ({ container: css`
539
+ min-width: 160px;
540
+ ` }));
541
+ //#endregion
542
+ //#region src/codemirror/components/LanguageSelect.tsx
543
+ const LanguageSelect = ({ selectedLang, onLanguageChange, options, labels, className }) => {
544
+ const modes = options ?? LANGUAGES;
545
+ const languageOptions = useMemo(() => modes.map((mode) => ({
546
+ aliases: mode.ext || [],
547
+ label: /* @__PURE__ */ jsxs(Flexbox, {
548
+ align: "center",
549
+ gap: 4,
550
+ horizontal: true,
551
+ children: [/* @__PURE__ */ jsx(MaterialFileTypeIcon, {
552
+ fallbackUnknownType: false,
553
+ filename: mode.ext?.[0] ? `*.${mode.ext[0]}` : `*.${mode.value}`,
554
+ size: 18,
555
+ type: "file",
556
+ variant: "raw"
557
+ }), /* @__PURE__ */ jsx(Text, {
558
+ ellipsis: true,
559
+ fontSize: 13,
560
+ children: mode.name
561
+ })]
562
+ }),
563
+ title: mode.ext?.length ? mode.ext.map((ext) => `*.${ext}`).join(",") : `*.${mode.value}`,
564
+ value: mode.value
565
+ })), [modes]);
566
+ return /* @__PURE__ */ jsx(Flexbox, {
567
+ align: "center",
568
+ className: cx("cm-language-select", className),
569
+ gap: 4,
570
+ horizontal: true,
571
+ onClick: (e) => e.stopPropagation(),
572
+ children: /* @__PURE__ */ jsx(Select, {
573
+ className: cx(styles$1.container),
574
+ filterOption: (input, option) => {
575
+ const lang = input.toLowerCase();
576
+ if ((option?.value)?.toLowerCase().startsWith(lang)) return true;
577
+ if (String(option?.label).toLowerCase().includes(lang)) return true;
578
+ if (option?.aliases?.some((ext) => ext.toLowerCase().startsWith(lang))) return true;
579
+ return false;
580
+ },
581
+ onChange: onLanguageChange,
582
+ options: languageOptions,
583
+ placeholder: labels?.selectLanguage ?? "Select language",
584
+ showSearch: true,
585
+ size: "small",
586
+ value: selectedLang,
587
+ variant: "borderless"
588
+ })
589
+ });
590
+ };
591
+ LanguageSelect.displayName = "LanguageSelect";
592
+ //#endregion
593
+ //#region src/codemirror/components/MoreOptions.tsx
594
+ const MoreOptions = ({ tabSize, onTabSizeChange, useTabs, onUseTabsChange, showLineNumbers, onShowLineNumbersChange, labels }) => {
595
+ const handleTabSizeChange = useCallback((value = 2) => {
596
+ onTabSizeChange(value === null ? 2 : value);
597
+ }, [onTabSizeChange]);
598
+ return /* @__PURE__ */ jsx(Popover, {
599
+ arrow: false,
600
+ content: /* @__PURE__ */ jsxs(Flexbox, {
601
+ gap: 8,
602
+ style: { minWidth: 240 },
603
+ children: [
604
+ /* @__PURE__ */ jsxs(Flexbox, {
605
+ align: "center",
606
+ gap: 8,
607
+ horizontal: true,
608
+ justify: "space-between",
609
+ children: [/* @__PURE__ */ jsx(Text, { children: labels?.tabSize ?? "Tab size" }), /* @__PURE__ */ jsx(InputNumber, {
610
+ max: 8,
611
+ min: 1,
612
+ onChange: handleTabSizeChange,
613
+ size: "small",
614
+ value: tabSize
615
+ })]
616
+ }),
617
+ /* @__PURE__ */ jsxs(Flexbox, {
618
+ align: "center",
619
+ gap: 8,
620
+ horizontal: true,
621
+ justify: "space-between",
622
+ children: [/* @__PURE__ */ jsx(Text, { children: labels?.useTabs ?? "Use tabs" }), /* @__PURE__ */ jsx(Switch, {
623
+ checked: useTabs,
624
+ onChange: onUseTabsChange,
625
+ size: "small"
626
+ })]
627
+ }),
628
+ /* @__PURE__ */ jsxs(Flexbox, {
629
+ align: "center",
630
+ gap: 8,
631
+ horizontal: true,
632
+ justify: "space-between",
633
+ children: [/* @__PURE__ */ jsx(Text, { children: labels?.showLineNumbers ?? "Show line numbers" }), /* @__PURE__ */ jsx(Switch, {
634
+ checked: showLineNumbers,
635
+ onChange: onShowLineNumbersChange,
636
+ size: "small"
637
+ })]
638
+ })
639
+ ]
640
+ }),
641
+ placement: "bottomRight",
642
+ trigger: "click",
643
+ children: /* @__PURE__ */ jsx(ActionIcon, {
644
+ className: "cm-hidden-actions",
645
+ icon: MoreHorizontalIcon,
646
+ size: "small"
647
+ })
648
+ });
649
+ };
650
+ MoreOptions.displayName = "MoreOptions";
651
+ //#endregion
652
+ //#region src/codemirror/components/Toolbar.tsx
653
+ const Toolbar = ({ selectedLang, onLanguageChange, onCopy, tabSize, onTabSizeChange, useTabs, onUseTabsChange, showLineNumbers, onShowLineNumbersChange, onClick, expand, toggleExpand, labels, languageOptions }) => {
654
+ return /* @__PURE__ */ jsxs(Flexbox, {
655
+ align: "center",
656
+ className: "cm-header-toolbar",
657
+ horizontal: true,
658
+ justify: "space-between",
659
+ onClick,
660
+ padding: 4,
661
+ children: [/* @__PURE__ */ jsx(LanguageSelect, {
662
+ labels,
663
+ onLanguageChange,
664
+ options: languageOptions,
665
+ selectedLang
666
+ }), /* @__PURE__ */ jsxs(Flexbox, {
667
+ gap: 4,
668
+ horizontal: true,
669
+ onClick: (e) => e.stopPropagation(),
670
+ children: [
671
+ /* @__PURE__ */ jsx(MoreOptions, {
672
+ labels,
673
+ onShowLineNumbersChange,
674
+ onTabSizeChange,
675
+ onUseTabsChange,
676
+ showLineNumbers,
677
+ tabSize,
678
+ useTabs
679
+ }),
680
+ /* @__PURE__ */ jsx(CopyButton, {
681
+ labels,
682
+ onCopy
683
+ }),
684
+ /* @__PURE__ */ jsx(ActionIcon, {
685
+ icon: expand ? ChevronDown : ChevronRight,
686
+ onClick: toggleExpand,
687
+ size: "small"
688
+ })
689
+ ]
690
+ })]
691
+ });
692
+ };
693
+ Toolbar.displayName = "Toolbar";
694
+ //#endregion
695
+ //#region src/codemirror/loader.ts
696
+ init_debug();
697
+ const logger = createDebugLogger("plugin", "codemirror-loader");
698
+ const DEFAULT_CDN_URL = "https://registry.npmmirror.com/@lobehub/codemirror/1.0.0/files/es/index.js";
699
+ const LOAD_TIMEOUT = 1e4;
700
+ const POLL_INTERVAL = 50;
701
+ let codeMirrorPromise = null;
702
+ function loadScript(src) {
703
+ return new Promise((resolve, reject) => {
704
+ if (document.querySelector(`script[src="${src}"]`)) {
705
+ logger.debug("Script already loaded:", src);
706
+ resolve();
707
+ return;
708
+ }
709
+ logger.debug("Loading script:", src);
710
+ const script = document.createElement("script");
711
+ script.src = src;
712
+ script.type = "module";
713
+ script.async = true;
714
+ script.addEventListener("load", () => {
715
+ logger.debug("Script loaded successfully:", src);
716
+ resolve();
717
+ });
718
+ script.addEventListener("error", (error) => {
719
+ logger.error("Failed to load script:", src, error);
720
+ reject(/* @__PURE__ */ new Error(`Failed to load script: ${src}`));
721
+ });
722
+ document.head.append(script);
723
+ });
724
+ }
725
+ function waitForCodeMirror(timeout = LOAD_TIMEOUT) {
726
+ return new Promise((resolve, reject) => {
727
+ const startTime = Date.now();
728
+ const checkCodeMirror = () => {
729
+ if (window.CodeMirror) {
730
+ logger.debug("CodeMirror is ready");
731
+ resolve();
732
+ return;
733
+ }
734
+ if (Date.now() - startTime > timeout) {
735
+ logger.error("Timeout waiting for CodeMirror");
736
+ reject(/* @__PURE__ */ new Error("Timeout: CodeMirror failed to load from CDN"));
737
+ return;
738
+ }
739
+ setTimeout(checkCodeMirror, POLL_INTERVAL);
740
+ };
741
+ checkCodeMirror();
742
+ });
743
+ }
744
+ async function loadCodeMirror(cdnUrl = DEFAULT_CDN_URL) {
745
+ if (window.CodeMirror?.default) {
746
+ logger.debug("CodeMirror already available");
747
+ return window.CodeMirror.default;
748
+ }
749
+ if (codeMirrorPromise) {
750
+ logger.debug("CodeMirror loading in progress, reusing promise");
751
+ return codeMirrorPromise;
752
+ }
753
+ codeMirrorPromise = (async () => {
754
+ try {
755
+ logger.debug("Starting CodeMirror load from:", cdnUrl);
756
+ await loadScript(cdnUrl);
757
+ await waitForCodeMirror();
758
+ if (!window.CodeMirror?.default) throw new Error("CodeMirror loaded but not properly initialized");
759
+ logger.debug("CodeMirror loaded successfully");
760
+ return window.CodeMirror.default;
761
+ } catch (error) {
762
+ codeMirrorPromise = null;
763
+ logger.error("Failed to load CodeMirror:", error);
764
+ throw error;
765
+ }
766
+ })();
767
+ return codeMirrorPromise;
768
+ }
769
+ //#endregion
770
+ //#region src/codemirror/style.ts
771
+ const styles = createStaticStyles(({ css, cssVar }) => css`
772
+ cursor: pointer;
773
+
774
+ position: relative;
775
+
776
+ overflow: hidden;
777
+ display: flex;
778
+ flex-direction: column;
779
+ align-items: center;
780
+
781
+ width: 100%;
782
+ margin-block: calc(var(--lobe-markdown-margin-multiple) * 0.5em);
783
+ border-radius: var(--lobe-markdown-border-radius);
784
+
785
+ background: ${cssVar.colorFillQuaternary};
786
+
787
+ .cm-hidden-actions {
788
+ opacity: 0;
789
+ transition: opacity 0.2s ease-in-out;
790
+ }
791
+
792
+ .cm-language-select {
793
+ opacity: 0.5;
794
+ filter: grayscale(100%);
795
+ transition:
796
+ opacity,
797
+ grayscale 0.2s ease-in-out;
798
+ }
799
+
800
+ &.selected {
801
+ user-select: none;
802
+ }
803
+
804
+ &.selected::after {
805
+ pointer-events: none;
806
+ content: '';
807
+
808
+ position: absolute;
809
+ z-index: 10;
810
+ inset: 0;
811
+
812
+ width: 100%;
813
+ height: 100%;
814
+
815
+ opacity: 0.2;
816
+ background: ${cssVar.yellow};
817
+
818
+ transition: all 0.3s;
819
+ }
820
+
821
+ .cm-container {
822
+ position: relative;
823
+ width: 100%;
824
+ border-block-start: 1px solid ${cssVar.colorFillQuaternary};
825
+ }
826
+
827
+ .cm-container-collapsed {
828
+ overflow: hidden;
829
+ height: 0;
830
+ border-block-start: none;
831
+ }
832
+
833
+ .cm-textarea {
834
+ height: 44px;
835
+ opacity: 0;
836
+ }
837
+
838
+ &:hover {
839
+ .cm-hidden-actions {
840
+ opacity: 1;
841
+ }
842
+
843
+ .cm-language-select {
844
+ opacity: 1;
845
+ filter: grayscale(0);
846
+ }
847
+ }
848
+ `);
849
+ //#endregion
850
+ //#region src/codemirror/theme.ts
851
+ const lobeTheme = {
852
+ "&": {
853
+ "& .cm-cursor": { "border-left-color": cssVar.colorPrimary },
854
+ "& .cm-cursor.cm-cursor-primary": { "border-inline-start": `2px solid ${cssVar.colorPrimary} !important` },
855
+ "& .cm-gutters": {
856
+ "background-color": cssVar.colorBgContainer,
857
+ "border": "none",
858
+ "color": cssVar.colorTextQuaternary,
859
+ "cursor": "default"
860
+ },
861
+ "& .cm-line": {
862
+ "& .cm-atom": { color: cssVar.purple10 },
863
+ "& .cm-attribute": { color: cssVar.purple10 },
864
+ "& .cm-builtin": {
865
+ color: cssVar.volcano10,
866
+ fontStyle: "italic"
867
+ },
868
+ "& .cm-comment": {
869
+ color: cssVar.colorTextQuaternary,
870
+ fontStyle: "italic"
871
+ },
872
+ "& .cm-foldPlaceholder": {
873
+ "background": `url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Crect fill='%23E8E8E8' width='16' height='16' rx='2'/%3E%3Cpath d='M2.75 7.984a.875.875 0 1 0 1.75 0 .875.875 0 0 0-1.75 0Zm4.375 0a.875.875 0 1 0 1.75 0 .875.875 0 0 0-1.75 0Zm4.375 0a.875.875 0 1 0 1.75 0 .875.875 0 0 0-1.75 0Z' fill='%232A3238'/%3E%3C/g%3E%3C/svg%3E") no-repeat`,
874
+ "border": "none",
875
+ "color": "transparent",
876
+ "display": "inline-block",
877
+ "height": "16px",
878
+ "padding": 0,
879
+ "vertical-align": "middle",
880
+ "width": "16px"
881
+ },
882
+ "& .cm-function": { color: cssVar.geekblue10 },
883
+ "& .cm-header": { color: cssVar.colorInfo },
884
+ "& .cm-keyword": { color: cssVar.colorInfo },
885
+ "& .cm-meta": { color: cssVar.colorText },
886
+ "& .cm-modifier": { color: cssVar.colorInfo },
887
+ "& .cm-number": { color: cssVar.volcano10 },
888
+ "& .cm-operator": { color: cssVar.colorInfo },
889
+ "& .cm-property": { color: cssVar.volcano10 },
890
+ "& .cm-punctuation": { color: cssVar.colorInfo },
891
+ "& .cm-qualifier": { color: cssVar.colorWarning },
892
+ "& .cm-string": { color: cssVar.colorSuccess },
893
+ "& .cm-string-2": { color: cssVar.colorSuccess },
894
+ "& .cm-tag": { color: cssVar.volcano10 },
895
+ "& .cm-tag.cm-bracket": { color: cssVar.colorInfo },
896
+ "& .cm-type": { color: cssVar.colorWarning },
897
+ "& .cm-variable": { color: cssVar.colorText },
898
+ "& .cm-variable-2": { color: cssVar.geekblue10 },
899
+ "& .cm-variable-3": { color: cssVar.colorWarning },
900
+ "& .cm-variable.cm-callee": { color: cssVar.geekblue10 },
901
+ "& .cm-variable.cm-def": { color: cssVar.colorText },
902
+ "color": cssVar.colorText,
903
+ "padding-inline": "12px"
904
+ }
905
+ },
906
+ "& .cm-selectionBackground": { background: "transparent" },
907
+ "& .cm-selectionMatch": { background: `${cssVar.colorFillSecondary} !important` },
908
+ "&.cm-editor": {
909
+ "background": "transparent",
910
+ "cursor": "text",
911
+ "padding-block": "12px",
912
+ "width": "100%"
913
+ },
914
+ "&.cm-editor span": {
915
+ "font-family": cssVar.fontFamilyCode,
916
+ "font-size": "calc(var(--lobe-markdown-font-size) * 0.8)"
917
+ },
918
+ "&.cm-editor.cm-focused .cm-selectionBackground": { background: cssVar.colorPrimaryBg },
919
+ "&.cm-editor.cm-focused .cm-selectionLineGutter": { color: cssVar.colorText },
920
+ "&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground": { background: cssVar.yellow }
921
+ };
922
+ //#endregion
923
+ export { MoreOptions as a, CopyButton as c, Toolbar as i, styles as n, LanguageSelect as o, loadCodeMirror as r, LANGUAGES as s, lobeTheme as t };