@gradio/code 0.9.0 → 0.9.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @gradio/code
2
2
 
3
+ ## 0.9.1
4
+
5
+ ### Features
6
+
7
+ - [#9187](https://github.com/gradio-app/gradio/pull/9187) [`5bf00b7`](https://github.com/gradio-app/gradio/commit/5bf00b7524ebf399b48719120a49d15bb21bd65c) - make all component SSR compatible. Thanks @pngwn!
8
+
9
+ ### Fixes
10
+
11
+ - [#9163](https://github.com/gradio-app/gradio/pull/9163) [`2b6cbf2`](https://github.com/gradio-app/gradio/commit/2b6cbf25908e42cf027324e54ef2cc0baad11a91) - fix exports and generate types. Thanks @pngwn!
12
+
13
+ ### Dependency updates
14
+
15
+ - @gradio/utils@0.6.1
16
+ - @gradio/statustracker@0.7.6
17
+ - @gradio/atoms@0.8.1
18
+ - @gradio/icons@0.7.2
19
+ - @gradio/wasm@0.13.1
20
+ - @gradio/upload@0.12.4
21
+
3
22
  ## 0.9.0
4
23
 
5
24
  ### Features
package/Index.svelte CHANGED
@@ -29,7 +29,6 @@
29
29
  export let value_is_output = false;
30
30
  export let language = "";
31
31
  export let lines = 5;
32
- export let target: HTMLElement;
33
32
  export let elem_id = "";
34
33
  export let elem_classes: string[] = [];
35
34
  export let visible = true;
@@ -40,7 +39,7 @@
40
39
 
41
40
  export let interactive: boolean;
42
41
 
43
- let dark_mode = target.classList.contains("dark");
42
+ let dark_mode = gradio.theme === "dark";
44
43
 
45
44
  function handle_change(): void {
46
45
  gradio.dispatch("change", value);
@@ -52,9 +51,13 @@
52
51
  value_is_output = false;
53
52
  });
54
53
  $: value, handle_change();
54
+
55
+ const is_browser = typeof window !== "undefined";
56
+ const default_lines = interactive ? lines : 10.35;
55
57
  </script>
56
58
 
57
59
  <Block
60
+ height={is_browser ? undefined : default_lines * 25 + 4}
58
61
  variant={"solid"}
59
62
  padding={false}
60
63
  {elem_id}
@@ -0,0 +1,18 @@
1
+ <script>export let value;
2
+ export let type;
3
+ export let selected = false;
4
+ </script>
5
+
6
+ <pre
7
+ class:table={type === "table"}
8
+ class:gallery={type === "gallery"}
9
+ class:selected>{value ? value : ""}</pre>
10
+
11
+ <style>
12
+ pre {
13
+ text-align: left;
14
+ }
15
+ .gallery {
16
+ padding: var(--size-1) var(--size-2);
17
+ }
18
+ </style>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ value: string | null;
5
+ type: "gallery" | "table";
6
+ selected?: boolean | undefined;
7
+ };
8
+ events: {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export type ExampleProps = typeof __propDef.props;
14
+ export type ExampleEvents = typeof __propDef.events;
15
+ export type ExampleSlots = typeof __propDef.slots;
16
+ export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,78 @@
1
+ <script context="module">export { default as BaseCode } from "./shared/Code.svelte";
2
+ export { default as BaseCopy } from "./shared/Copy.svelte";
3
+ export { default as BaseDownload } from "./shared/Download.svelte";
4
+ export { default as BaseWidget } from "./shared/Widgets.svelte";
5
+ export { default as BaseExample } from "./Example.svelte";
6
+ </script>
7
+
8
+ <script>import { afterUpdate } from "svelte";
9
+ import Code from "./shared/Code.svelte";
10
+ import Widget from "./shared/Widgets.svelte";
11
+ import { StatusTracker } from "@gradio/statustracker";
12
+ import { Block, BlockLabel, Empty } from "@gradio/atoms";
13
+ import { Code as CodeIcon } from "@gradio/icons";
14
+ export let gradio;
15
+ export let value = "";
16
+ export let value_is_output = false;
17
+ export let language = "";
18
+ export let lines = 5;
19
+ export let elem_id = "";
20
+ export let elem_classes = [];
21
+ export let visible = true;
22
+ export let label = gradio.i18n("code.code");
23
+ export let show_label = true;
24
+ export let loading_status;
25
+ export let scale = null;
26
+ export let interactive;
27
+ let dark_mode = gradio.theme === "dark";
28
+ function handle_change() {
29
+ gradio.dispatch("change", value);
30
+ if (!value_is_output) {
31
+ gradio.dispatch("input");
32
+ }
33
+ }
34
+ afterUpdate(() => {
35
+ value_is_output = false;
36
+ });
37
+ $:
38
+ value, handle_change();
39
+ const is_browser = typeof window !== "undefined";
40
+ const default_lines = interactive ? lines : 10.35;
41
+ </script>
42
+
43
+ <Block
44
+ height={is_browser ? undefined : default_lines * 25 + 4}
45
+ variant={"solid"}
46
+ padding={false}
47
+ {elem_id}
48
+ {elem_classes}
49
+ {visible}
50
+ {scale}
51
+ >
52
+ <StatusTracker
53
+ autoscroll={gradio.autoscroll}
54
+ i18n={gradio.i18n}
55
+ {...loading_status}
56
+ on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
57
+ />
58
+
59
+ <BlockLabel Icon={CodeIcon} {show_label} {label} float={false} />
60
+
61
+ {#if !value && !interactive}
62
+ <Empty unpadded_box={true} size="large">
63
+ <CodeIcon />
64
+ </Empty>
65
+ {:else}
66
+ <Widget {language} {value} />
67
+
68
+ <Code
69
+ bind:value
70
+ {language}
71
+ {lines}
72
+ {dark_mode}
73
+ readonly={!interactive}
74
+ on:blur={() => gradio.dispatch("blur")}
75
+ on:focus={() => gradio.dispatch("focus")}
76
+ />
77
+ {/if}
78
+ </Block>
@@ -0,0 +1,40 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export { default as BaseCode } from "./shared/Code.svelte";
3
+ export { default as BaseCopy } from "./shared/Copy.svelte";
4
+ export { default as BaseDownload } from "./shared/Download.svelte";
5
+ export { default as BaseWidget } from "./shared/Widgets.svelte";
6
+ export { default as BaseExample } from "./Example.svelte";
7
+ import type { Gradio } from "@gradio/utils";
8
+ import type { LoadingStatus } from "@gradio/statustracker";
9
+ declare const __propDef: {
10
+ props: {
11
+ gradio: Gradio<{
12
+ change: string;
13
+ input: never;
14
+ blur: never;
15
+ focus: never;
16
+ clear_status: LoadingStatus;
17
+ }>;
18
+ value?: string | undefined;
19
+ value_is_output?: boolean | undefined;
20
+ language?: string | undefined;
21
+ lines?: number | undefined;
22
+ elem_id?: string | undefined;
23
+ elem_classes?: string[] | undefined;
24
+ visible?: boolean | undefined;
25
+ label?: any;
26
+ show_label?: boolean | undefined;
27
+ loading_status: LoadingStatus;
28
+ scale?: (number | null) | undefined;
29
+ interactive: boolean;
30
+ };
31
+ events: {
32
+ [evt: string]: CustomEvent<any>;
33
+ };
34
+ slots: {};
35
+ };
36
+ export type IndexProps = typeof __propDef.props;
37
+ export type IndexEvents = typeof __propDef.events;
38
+ export type IndexSlots = typeof __propDef.slots;
39
+ export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
40
+ }
@@ -0,0 +1,227 @@
1
+ <script>import { createEventDispatcher, onMount } from "svelte";
2
+ import {
3
+ EditorView,
4
+ ViewUpdate,
5
+ keymap,
6
+ placeholder as placeholderExt
7
+ } from "@codemirror/view";
8
+ import { StateEffect, EditorState } from "@codemirror/state";
9
+ import { indentWithTab } from "@codemirror/commands";
10
+ import { basicDark } from "cm6-theme-basic-dark";
11
+ import { basicLight } from "cm6-theme-basic-light";
12
+ import { basicSetup } from "./extensions";
13
+ import { getLanguageExtension } from "./language";
14
+ export let class_names = "";
15
+ export let value = "";
16
+ export let dark_mode;
17
+ export let basic = true;
18
+ export let language;
19
+ export let lines = 5;
20
+ export let extensions = [];
21
+ export let use_tab = true;
22
+ export let readonly = false;
23
+ export let placeholder = void 0;
24
+ const dispatch = createEventDispatcher();
25
+ let lang_extension;
26
+ let element;
27
+ let view;
28
+ $:
29
+ get_lang(language);
30
+ async function get_lang(val) {
31
+ const ext = await getLanguageExtension(val);
32
+ lang_extension = ext;
33
+ }
34
+ $:
35
+ reconfigure(), lang_extension, readonly;
36
+ $:
37
+ set_doc(value);
38
+ $:
39
+ update_lines();
40
+ function set_doc(new_doc) {
41
+ if (view && new_doc !== view.state.doc.toString()) {
42
+ view.dispatch({
43
+ changes: {
44
+ from: 0,
45
+ to: view.state.doc.length,
46
+ insert: new_doc
47
+ }
48
+ });
49
+ }
50
+ }
51
+ function update_lines() {
52
+ if (view) {
53
+ view.requestMeasure({ read: update_gutters });
54
+ }
55
+ }
56
+ function create_editor_view() {
57
+ const editorView = new EditorView({
58
+ parent: element,
59
+ state: create_editor_state(value)
60
+ });
61
+ editorView.dom.addEventListener("focus", handle_focus, true);
62
+ editorView.dom.addEventListener("blur", handle_blur, true);
63
+ return editorView;
64
+ }
65
+ function handle_focus() {
66
+ dispatch("focus");
67
+ }
68
+ function handle_blur() {
69
+ dispatch("blur");
70
+ }
71
+ function getGutterLineHeight(_view) {
72
+ let elements = _view.dom.querySelectorAll(".cm-gutterElement");
73
+ if (elements.length === 0) {
74
+ return null;
75
+ }
76
+ for (var i = 0; i < elements.length; i++) {
77
+ let node = elements[i];
78
+ let height = getComputedStyle(node)?.height ?? "0px";
79
+ if (height != "0px") {
80
+ return height;
81
+ }
82
+ }
83
+ return null;
84
+ }
85
+ function update_gutters(_view) {
86
+ let gutters = _view.dom.querySelectorAll(".cm-gutter");
87
+ let _lines = lines + 1;
88
+ let lineHeight = getGutterLineHeight(_view);
89
+ if (!lineHeight) {
90
+ return null;
91
+ }
92
+ for (var i = 0; i < gutters.length; i++) {
93
+ let node = gutters[i];
94
+ node.style.minHeight = `calc(${lineHeight} * ${_lines})`;
95
+ }
96
+ return null;
97
+ }
98
+ function handle_change(vu) {
99
+ if (vu.docChanged) {
100
+ const doc = vu.state.doc;
101
+ const text = doc.toString();
102
+ value = text;
103
+ dispatch("change", text);
104
+ }
105
+ view.requestMeasure({ read: update_gutters });
106
+ }
107
+ function get_extensions() {
108
+ const stateExtensions = [
109
+ ...get_base_extensions(
110
+ basic,
111
+ use_tab,
112
+ placeholder,
113
+ readonly,
114
+ lang_extension
115
+ ),
116
+ FontTheme,
117
+ ...get_theme(),
118
+ ...extensions
119
+ ];
120
+ return stateExtensions;
121
+ }
122
+ const FontTheme = EditorView.theme({
123
+ "&": {
124
+ fontSize: "var(--text-sm)",
125
+ backgroundColor: "var(--border-color-secondary)"
126
+ },
127
+ ".cm-content": {
128
+ paddingTop: "5px",
129
+ paddingBottom: "5px",
130
+ color: "var(--body-text-color)",
131
+ fontFamily: "var(--font-mono)",
132
+ minHeight: "100%"
133
+ },
134
+ ".cm-gutters": {
135
+ marginRight: "1px",
136
+ borderRight: "1px solid var(--border-color-primary)",
137
+ backgroundColor: "var(--block-background-fill);",
138
+ color: "var(--body-text-color-subdued)"
139
+ },
140
+ ".cm-focused": {
141
+ outline: "none"
142
+ },
143
+ ".cm-scroller": {
144
+ height: "auto"
145
+ },
146
+ ".cm-cursor": {
147
+ borderLeftColor: "var(--body-text-color)"
148
+ }
149
+ });
150
+ function create_editor_state(_value) {
151
+ return EditorState.create({
152
+ doc: _value ?? void 0,
153
+ extensions: get_extensions()
154
+ });
155
+ }
156
+ function get_base_extensions(basic2, use_tab2, placeholder2, readonly2, lang) {
157
+ const extensions2 = [
158
+ EditorView.editable.of(!readonly2),
159
+ EditorState.readOnly.of(readonly2),
160
+ EditorView.contentAttributes.of({ "aria-label": "Code input container" })
161
+ ];
162
+ if (basic2) {
163
+ extensions2.push(basicSetup);
164
+ }
165
+ if (use_tab2) {
166
+ extensions2.push(keymap.of([indentWithTab]));
167
+ }
168
+ if (placeholder2) {
169
+ extensions2.push(placeholderExt(placeholder2));
170
+ }
171
+ if (lang) {
172
+ extensions2.push(lang);
173
+ }
174
+ extensions2.push(EditorView.updateListener.of(handle_change));
175
+ return extensions2;
176
+ }
177
+ function get_theme() {
178
+ const extensions2 = [];
179
+ if (dark_mode) {
180
+ extensions2.push(basicDark);
181
+ } else {
182
+ extensions2.push(basicLight);
183
+ }
184
+ return extensions2;
185
+ }
186
+ function reconfigure() {
187
+ view?.dispatch({
188
+ effects: StateEffect.reconfigure.of(get_extensions())
189
+ });
190
+ }
191
+ onMount(() => {
192
+ view = create_editor_view();
193
+ return () => view?.destroy();
194
+ });
195
+ </script>
196
+
197
+ <div class="wrap">
198
+ <div class="codemirror-wrapper {class_names}" bind:this={element} />
199
+ </div>
200
+
201
+ <style>
202
+ .wrap {
203
+ display: flex;
204
+ flex-direction: column;
205
+ flex-flow: column;
206
+ margin: 0;
207
+ padding: 0;
208
+ height: 100%;
209
+ }
210
+ .codemirror-wrapper {
211
+ height: 100%;
212
+ overflow: auto;
213
+ }
214
+
215
+ :global(.cm-editor) {
216
+ height: 100%;
217
+ }
218
+
219
+ /* Dunno why this doesn't work through the theme API -- don't remove*/
220
+ :global(.cm-selectionBackground) {
221
+ background-color: #b9d2ff30 !important;
222
+ }
223
+
224
+ :global(.cm-focused) {
225
+ outline: none !important;
226
+ }
227
+ </style>
@@ -0,0 +1,30 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type Extension } from "@codemirror/state";
3
+ declare const __propDef: {
4
+ props: {
5
+ class_names?: string | undefined;
6
+ value?: string | undefined;
7
+ dark_mode: boolean;
8
+ basic?: boolean | undefined;
9
+ language: string;
10
+ lines?: number | undefined;
11
+ extensions?: Extension[] | undefined;
12
+ use_tab?: boolean | undefined;
13
+ readonly?: boolean | undefined;
14
+ placeholder?: string | HTMLElement | null | undefined;
15
+ };
16
+ events: {
17
+ change: CustomEvent<string>;
18
+ blur: CustomEvent<undefined>;
19
+ focus: CustomEvent<undefined>;
20
+ } & {
21
+ [evt: string]: CustomEvent<any>;
22
+ };
23
+ slots: {};
24
+ };
25
+ export type CodeProps = typeof __propDef.props;
26
+ export type CodeEvents = typeof __propDef.events;
27
+ export type CodeSlots = typeof __propDef.slots;
28
+ export default class Code extends SvelteComponent<CodeProps, CodeEvents, CodeSlots> {
29
+ }
30
+ export {};
@@ -0,0 +1,59 @@
1
+ <script>import { onDestroy } from "svelte";
2
+ import { fade } from "svelte/transition";
3
+ import { Copy, Check } from "@gradio/icons";
4
+ let copied = false;
5
+ export let value;
6
+ let timer;
7
+ function copy_feedback() {
8
+ copied = true;
9
+ if (timer)
10
+ clearTimeout(timer);
11
+ timer = setTimeout(() => {
12
+ copied = false;
13
+ }, 2e3);
14
+ }
15
+ async function handle_copy() {
16
+ if ("clipboard" in navigator) {
17
+ await navigator.clipboard.writeText(value);
18
+ copy_feedback();
19
+ }
20
+ }
21
+ onDestroy(() => {
22
+ if (timer)
23
+ clearTimeout(timer);
24
+ });
25
+ </script>
26
+
27
+ <button
28
+ on:click={handle_copy}
29
+ title="Copy message"
30
+ class:copied
31
+ aria-label={copied ? "Message copied" : "Copy Message"}
32
+ >
33
+ {#if !copied}
34
+ <Copy />
35
+ {:else}
36
+ <span class="check">
37
+ <Check />
38
+ </span>
39
+ {/if}
40
+ </button>
41
+
42
+ <style>
43
+ button {
44
+ position: relative;
45
+ cursor: pointer;
46
+ padding: 5px;
47
+ width: 22px;
48
+ height: 22px;
49
+ }
50
+
51
+ .check {
52
+ top: 0;
53
+ right: 0;
54
+ z-index: var(--layer-top);
55
+ background: var(--block-label-background-fill);
56
+ width: 100%;
57
+ height: 100%;
58
+ }
59
+ </style>
@@ -0,0 +1,16 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ value: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export type CopyProps = typeof __propDef.props;
12
+ export type CopyEvents = typeof __propDef.events;
13
+ export type CopySlots = typeof __propDef.slots;
14
+ export default class Copy extends SvelteComponent<CopyProps, CopyEvents, CopySlots> {
15
+ }
16
+ export {};
@@ -0,0 +1,85 @@
1
+ <script>import { onDestroy } from "svelte";
2
+ import { fade } from "svelte/transition";
3
+ import { Download, Check } from "@gradio/icons";
4
+ import { DownloadLink } from "@gradio/wasm/svelte";
5
+ export let value;
6
+ export let language;
7
+ $:
8
+ ext = get_ext_for_type(language);
9
+ function get_ext_for_type(type) {
10
+ const exts = {
11
+ py: "py",
12
+ python: "py",
13
+ md: "md",
14
+ markdown: "md",
15
+ json: "json",
16
+ html: "html",
17
+ css: "css",
18
+ js: "js",
19
+ javascript: "js",
20
+ ts: "ts",
21
+ typescript: "ts",
22
+ yaml: "yaml",
23
+ yml: "yml",
24
+ dockerfile: "dockerfile",
25
+ sh: "sh",
26
+ shell: "sh",
27
+ r: "r",
28
+ c: "c",
29
+ cpp: "cpp"
30
+ };
31
+ return exts[type] || "txt";
32
+ }
33
+ let copied = false;
34
+ let timer;
35
+ function copy_feedback() {
36
+ copied = true;
37
+ if (timer)
38
+ clearTimeout(timer);
39
+ timer = setTimeout(() => {
40
+ copied = false;
41
+ }, 2e3);
42
+ }
43
+ $:
44
+ download_value = URL.createObjectURL(new Blob([value]));
45
+ onDestroy(() => {
46
+ if (timer)
47
+ clearTimeout(timer);
48
+ });
49
+ </script>
50
+
51
+ <div class="container">
52
+ <DownloadLink
53
+ download="file.{ext}"
54
+ href={download_value}
55
+ on:click={copy_feedback}
56
+ >
57
+ <Download />
58
+ {#if copied}
59
+ <span class="check" transition:fade><Check /></span>
60
+ {/if}
61
+ </DownloadLink>
62
+ </div>
63
+
64
+ <style>
65
+ .container {
66
+ position: relative;
67
+ cursor: pointer;
68
+ padding: 5px;
69
+
70
+ width: 22px;
71
+ height: 22px;
72
+ }
73
+
74
+ .check {
75
+ position: absolute;
76
+ top: 0;
77
+ right: 0;
78
+ z-index: var(--layer-top);
79
+ background: var(--background-fill-primary);
80
+ padding: var(--size-1);
81
+ width: 100%;
82
+ height: 100%;
83
+ color: var(--body-text-color);
84
+ }
85
+ </style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ value: string;
5
+ language: string;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export type DownloadProps = typeof __propDef.props;
13
+ export type DownloadEvents = typeof __propDef.events;
14
+ export type DownloadSlots = typeof __propDef.slots;
15
+ export default class Download extends SvelteComponent<DownloadProps, DownloadEvents, DownloadSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,33 @@
1
+ <script>import Copy from "./Copy.svelte";
2
+ import Download from "./Download.svelte";
3
+ export let value;
4
+ export let language;
5
+ </script>
6
+
7
+ <div>
8
+ <Download {value} {language} />
9
+ <Copy {value} />
10
+ </div>
11
+
12
+ <style>
13
+ div {
14
+ display: flex;
15
+ position: absolute;
16
+ top: var(--block-label-margin);
17
+ right: var(--block-label-margin);
18
+ align-items: center;
19
+
20
+ z-index: var(--layer-2);
21
+ transition: 150ms;
22
+ box-shadow: var(--shadow-drop);
23
+ border: 1px solid var(--border-color-primary);
24
+ border-top: none;
25
+ border-right: none;
26
+ border-radius: var(--block-label-right-radius);
27
+ background: var(--block-label-background-fill);
28
+ overflow: hidden;
29
+ color: var(--block-label-text-color);
30
+ font: var(--font);
31
+ font-size: var(--button-small-text-size);
32
+ }
33
+ </style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ value: string;
5
+ language: string;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export type WidgetsProps = typeof __propDef.props;
13
+ export type WidgetsEvents = typeof __propDef.events;
14
+ export type WidgetsSlots = typeof __propDef.slots;
15
+ export default class Widgets extends SvelteComponent<WidgetsProps, WidgetsEvents, WidgetsSlots> {
16
+ }
17
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { Extension } from "@codemirror/state";
2
+ export { EditorView } from "@codemirror/view";
3
+ export declare const basicSetup: Extension;
@@ -0,0 +1,28 @@
1
+ import { lineNumbers, highlightSpecialChars, drawSelection, rectangularSelection, crosshairCursor, keymap } from "@codemirror/view";
2
+ export { EditorView } from "@codemirror/view";
3
+ import { EditorState } from "@codemirror/state";
4
+ import { foldGutter, indentOnInput, syntaxHighlighting, defaultHighlightStyle, foldKeymap } from "@codemirror/language";
5
+ import { history, defaultKeymap, historyKeymap } from "@codemirror/commands";
6
+ import { closeBrackets, closeBracketsKeymap, completionKeymap } from "@codemirror/autocomplete";
7
+ import { lintKeymap } from "@codemirror/lint";
8
+ export const basicSetup = /*@__PURE__*/ (() => [
9
+ lineNumbers(),
10
+ highlightSpecialChars(),
11
+ history(),
12
+ foldGutter(),
13
+ drawSelection(),
14
+ EditorState.allowMultipleSelections.of(true),
15
+ indentOnInput(),
16
+ syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
17
+ closeBrackets(),
18
+ rectangularSelection(),
19
+ crosshairCursor(),
20
+ keymap.of([
21
+ ...closeBracketsKeymap,
22
+ ...defaultKeymap,
23
+ ...historyKeymap,
24
+ ...foldKeymap,
25
+ ...completionKeymap,
26
+ ...lintKeymap
27
+ ])
28
+ ])();
@@ -0,0 +1,2 @@
1
+ import type { MarkdownExtension } from "@lezer/markdown";
2
+ export declare const frontmatter: MarkdownExtension;
@@ -0,0 +1,53 @@
1
+ import { parseMixed } from "@lezer/common";
2
+ import { yaml } from "@codemirror/legacy-modes/mode/yaml";
3
+ import { foldInside, foldNodeProp, StreamLanguage } from "@codemirror/language";
4
+ import { styleTags, tags } from "@lezer/highlight";
5
+ const frontMatterFence = /^---\s*$/m;
6
+ export const frontmatter = {
7
+ defineNodes: [{ name: "Frontmatter", block: true }, "FrontmatterMark"],
8
+ props: [
9
+ styleTags({
10
+ Frontmatter: [tags.documentMeta, tags.monospace],
11
+ FrontmatterMark: tags.processingInstruction
12
+ }),
13
+ foldNodeProp.add({
14
+ Frontmatter: foldInside,
15
+ FrontmatterMark: () => null
16
+ })
17
+ ],
18
+ wrap: parseMixed((node) => {
19
+ const { parser } = StreamLanguage.define(yaml);
20
+ if (node.type.name === "Frontmatter") {
21
+ return {
22
+ parser,
23
+ overlay: [{ from: node.from + 4, to: node.to - 4 }]
24
+ };
25
+ }
26
+ return null;
27
+ }),
28
+ parseBlock: [
29
+ {
30
+ name: "Frontmatter",
31
+ before: "HorizontalRule",
32
+ parse: (cx, line) => {
33
+ let end = undefined;
34
+ const children = new Array();
35
+ if (cx.lineStart === 0 && frontMatterFence.test(line.text)) {
36
+ children.push(cx.elt("FrontmatterMark", 0, 4));
37
+ while (cx.nextLine()) {
38
+ if (frontMatterFence.test(line.text)) {
39
+ end = cx.lineStart + 4;
40
+ break;
41
+ }
42
+ }
43
+ if (end !== undefined) {
44
+ children.push(cx.elt("FrontmatterMark", end - 4, end));
45
+ cx.addElement(cx.elt("Frontmatter", 0, end, children));
46
+ }
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ }
52
+ ]
53
+ };
@@ -0,0 +1,2 @@
1
+ import type { Extension } from "@codemirror/state";
2
+ export declare function getLanguageExtension(lang: string): Promise<Extension | undefined>;
@@ -0,0 +1,74 @@
1
+ import { StreamLanguage } from "@codemirror/language";
2
+ import { sql } from "@codemirror/legacy-modes/mode/sql";
3
+ import { _ } from "svelte-i18n";
4
+ const possible_langs = [
5
+ "python",
6
+ "c",
7
+ "cpp",
8
+ "markdown",
9
+ "json",
10
+ "html",
11
+ "css",
12
+ "javascript",
13
+ "typescript",
14
+ "yaml",
15
+ "dockerfile",
16
+ "shell",
17
+ "r",
18
+ "sql"
19
+ ];
20
+ const sql_dialects = [
21
+ "standardSQL",
22
+ "msSQL",
23
+ "mySQL",
24
+ "mariaDB",
25
+ "sqlite",
26
+ "cassandra",
27
+ "plSQL",
28
+ "hive",
29
+ "pgSQL",
30
+ "gql",
31
+ "gpSQL",
32
+ "sparkSQL",
33
+ "esper"
34
+ ];
35
+ const lang_map = {
36
+ python: () => import("@codemirror/lang-python").then((m) => m.python()),
37
+ c: () => import("@codemirror/legacy-modes/mode/clike").then((m) => StreamLanguage.define(m.c)),
38
+ cpp: () => import("@codemirror/legacy-modes/mode/clike").then((m) => StreamLanguage.define(m.cpp)),
39
+ markdown: async () => {
40
+ const [md, frontmatter] = await Promise.all([
41
+ import("@codemirror/lang-markdown"),
42
+ import("./frontmatter")
43
+ ]);
44
+ return md.markdown({ extensions: [frontmatter.frontmatter] });
45
+ },
46
+ json: () => import("@codemirror/lang-json").then((m) => m.json()),
47
+ html: () => import("@codemirror/lang-html").then((m) => m.html()),
48
+ css: () => import("@codemirror/lang-css").then((m) => m.css()),
49
+ javascript: () => import("@codemirror/lang-javascript").then((m) => m.javascript()),
50
+ typescript: () => import("@codemirror/lang-javascript").then((m) => m.javascript({ typescript: true })),
51
+ yaml: () => import("@codemirror/legacy-modes/mode/yaml").then((m) => StreamLanguage.define(m.yaml)),
52
+ dockerfile: () => import("@codemirror/legacy-modes/mode/dockerfile").then((m) => StreamLanguage.define(m.dockerFile)),
53
+ shell: () => import("@codemirror/legacy-modes/mode/shell").then((m) => StreamLanguage.define(m.shell)),
54
+ r: () => import("@codemirror/legacy-modes/mode/r").then((m) => StreamLanguage.define(m.r)),
55
+ sql: () => import("@codemirror/legacy-modes/mode/sql").then((m) => StreamLanguage.define(m.standardSQL)),
56
+ ...Object.fromEntries(sql_dialects.map((dialect) => [
57
+ "sql-" + dialect,
58
+ () => import("@codemirror/legacy-modes/mode/sql").then((m) => StreamLanguage.define(m[dialect]))
59
+ ]))
60
+ };
61
+ const alias_map = {
62
+ py: "python",
63
+ md: "markdown",
64
+ js: "javascript",
65
+ ts: "typescript",
66
+ sh: "shell"
67
+ };
68
+ export async function getLanguageExtension(lang) {
69
+ const _lang = lang_map[lang] || lang_map[alias_map[lang]] || undefined;
70
+ if (_lang) {
71
+ return _lang();
72
+ }
73
+ return undefined;
74
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradio/code",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Gradio UI packages",
5
5
  "type": "module",
6
6
  "author": "",
@@ -27,22 +27,33 @@
27
27
  "cm6-theme-basic-dark": "^0.2.0",
28
28
  "cm6-theme-basic-light": "^0.2.0",
29
29
  "codemirror": "^6.0.1",
30
- "@gradio/atoms": "^0.8.0",
31
- "@gradio/icons": "^0.7.1",
32
- "@gradio/statustracker": "^0.7.5",
33
- "@gradio/upload": "^0.12.3",
34
- "@gradio/wasm": "^0.13.0",
35
- "@gradio/utils": "^0.6.0"
30
+ "@gradio/atoms": "^0.8.1",
31
+ "@gradio/icons": "^0.7.2",
32
+ "@gradio/statustracker": "^0.7.6",
33
+ "@gradio/upload": "^0.12.4",
34
+ "@gradio/utils": "^0.6.1",
35
+ "@gradio/wasm": "^0.13.1"
36
36
  },
37
37
  "main_changeset": true,
38
38
  "main": "./Index.svelte",
39
39
  "exports": {
40
- ".": "./Index.svelte",
41
- "./example": "./Example.svelte",
40
+ ".": {
41
+ "gradio": "./Index.svelte",
42
+ "svelte": "./dist/Index.svelte",
43
+ "types": "./dist/Index.svelte.d.ts"
44
+ },
45
+ "./example": {
46
+ "gradio": "./Example.svelte",
47
+ "svelte": "./dist/Example.svelte",
48
+ "types": "./dist/Example.svelte.d.ts"
49
+ },
42
50
  "./package.json": "./package.json"
43
51
  },
44
52
  "devDependencies": {
45
- "@gradio/preview": "^0.11.0"
53
+ "@gradio/preview": "^0.11.1"
54
+ },
55
+ "peerDependencies": {
56
+ "svelte": "^4.0.0"
46
57
  },
47
58
  "repository": {
48
59
  "type": "git",