@gradio/image 0.15.0 → 0.16.0-beta.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,39 @@
1
1
  # @gradio/image
2
2
 
3
+ ## 0.16.0-beta.1
4
+
5
+ ### Dependency updates
6
+
7
+ - @gradio/atoms@0.8.1-beta.1
8
+ - @gradio/icons@0.8.0-beta.1
9
+ - @gradio/statustracker@0.8.0-beta.1
10
+ - @gradio/utils@0.7.0-beta.1
11
+ - @gradio/client@1.6.0-beta.1
12
+ - @gradio/upload@0.12.4-beta.1
13
+ - @gradio/wasm@0.13.1-beta.1
14
+
15
+ ## 0.16.0-beta.0
16
+
17
+ ### Features
18
+
19
+ - [#9149](https://github.com/gradio-app/gradio/pull/9149) [`3d7a9b8`](https://github.com/gradio-app/gradio/commit/3d7a9b81f6fef06187eca832471dc1692eb493a0) - Open audio/image input stream only when queue is ready. Thanks @freddyaboulton!
20
+ - [#9173](https://github.com/gradio-app/gradio/pull/9173) [`66349fe`](https://github.com/gradio-app/gradio/commit/66349fe26827e3a3c15b738a1177e95fec7f5554) - Streaming Guides. Thanks @freddyaboulton!
21
+ - [#8941](https://github.com/gradio-app/gradio/pull/8941) [`97a7bf6`](https://github.com/gradio-app/gradio/commit/97a7bf66a79179d1b91a3199d68e5c11216ca500) - Streaming inputs for 5.0. Thanks @freddyaboulton!
22
+
23
+ ### Fixes
24
+
25
+ - [#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!
26
+
27
+ ### Dependency updates
28
+
29
+ - @gradio/utils@0.7.0-beta.0
30
+ - @gradio/statustracker@0.8.0-beta.0
31
+ - @gradio/atoms@0.8.1-beta.0
32
+ - @gradio/client@1.6.0-beta.0
33
+ - @gradio/icons@0.8.0-beta.0
34
+ - @gradio/upload@0.12.4-beta.0
35
+ - @gradio/wasm@0.13.1-beta.0
36
+
3
37
  ## 0.15.0
4
38
 
5
39
  ### Features
package/Image.test.ts CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  beforeAll,
8
8
  beforeEach
9
9
  } from "vitest";
10
- import { cleanup, render } from "@gradio/tootils";
10
+ import { cleanup, render } from "@self/tootils";
11
11
  import { setupi18n } from "../core/src/i18n";
12
12
 
13
13
  import Image from "./Index.svelte";
package/Index.svelte CHANGED
@@ -9,7 +9,7 @@
9
9
  </script>
10
10
 
11
11
  <script lang="ts">
12
- import type { Gradio, SelectData } from "@gradio/utils";
12
+ import type { Gradio, SelectData, ValueData } from "@gradio/utils";
13
13
  import StaticImage from "./shared/ImagePreview.svelte";
14
14
  import ImageUploader from "./shared/ImageUploader.svelte";
15
15
  import { afterUpdate } from "svelte";
@@ -22,6 +22,16 @@
22
22
 
23
23
  type sources = "upload" | "webcam" | "clipboard" | null;
24
24
 
25
+ let stream_state = "closed";
26
+ let _modify_stream: (state: "open" | "closed" | "waiting") => void;
27
+ export function modify_stream_state(
28
+ state: "open" | "closed" | "waiting"
29
+ ): void {
30
+ stream_state = state;
31
+ _modify_stream(state);
32
+ }
33
+ export const get_stream_state: () => void = () => stream_state;
34
+ export let set_time_limit: (arg0: number) => void;
25
35
  export let value_is_output = false;
26
36
  export let elem_id = "";
27
37
  export let elem_classes: string[] = [];
@@ -35,6 +45,7 @@
35
45
 
36
46
  export let height: number | undefined;
37
47
  export let width: number | undefined;
48
+ export let stream_every: number;
38
49
 
39
50
  export let _selectable = false;
40
51
  export let container = true;
@@ -59,13 +70,14 @@
59
70
  change: never;
60
71
  error: string;
61
72
  edit: never;
62
- stream: never;
73
+ stream: ValueData;
63
74
  drag: never;
64
75
  upload: never;
65
76
  clear: never;
66
77
  select: SelectData;
67
78
  share: ShareData;
68
79
  clear_status: LoadingStatus;
80
+ close_stream: string;
69
81
  }>;
70
82
 
71
83
  $: {
@@ -77,6 +89,7 @@
77
89
  }
78
90
  }
79
91
  }
92
+
80
93
  afterUpdate(() => {
81
94
  value_is_output = false;
82
95
  });
@@ -181,7 +194,7 @@
181
194
  on:clear={() => {
182
195
  gradio.dispatch("clear");
183
196
  }}
184
- on:stream={() => gradio.dispatch("stream")}
197
+ on:stream={({ detail }) => gradio.dispatch("stream", detail)}
185
198
  on:drag={({ detail }) => (dragging = detail)}
186
199
  on:upload={() => gradio.dispatch("upload")}
187
200
  on:select={({ detail }) => gradio.dispatch("select", detail)}
@@ -191,11 +204,17 @@
191
204
  loading_status.status = "error";
192
205
  gradio.dispatch("error", detail);
193
206
  }}
207
+ on:close_stream={() => {
208
+ gradio.dispatch("close_stream", "stream");
209
+ }}
194
210
  {label}
195
211
  {show_label}
196
212
  {pending}
197
213
  {streaming}
198
214
  {mirror_webcam}
215
+ {stream_every}
216
+ bind:modify_stream={_modify_stream}
217
+ bind:set_time_limit
199
218
  max_file_size={gradio.max_file_size}
200
219
  i18n={gradio.i18n}
201
220
  upload={gradio.client.upload}
@@ -0,0 +1,46 @@
1
+ <script>import Image from "./shared/Image.svelte";
2
+ export let value;
3
+ export let type;
4
+ export let selected = false;
5
+ </script>
6
+
7
+ <div
8
+ class="container"
9
+ class:table={type === "table"}
10
+ class:gallery={type === "gallery"}
11
+ class:selected
12
+ class:border={value}
13
+ >
14
+ {#if value}
15
+ <Image src={value.url} alt="" />
16
+ {/if}
17
+ </div>
18
+
19
+ <style>
20
+ .container :global(img) {
21
+ width: 100%;
22
+ height: 100%;
23
+ }
24
+
25
+ .container.selected {
26
+ border-color: var(--border-color-accent);
27
+ }
28
+ .border.table {
29
+ border: 2px solid var(--border-color-primary);
30
+ }
31
+
32
+ .container.table {
33
+ margin: 0 auto;
34
+ border-radius: var(--radius-lg);
35
+ overflow: hidden;
36
+ width: var(--size-20);
37
+ height: var(--size-20);
38
+ object-fit: cover;
39
+ }
40
+
41
+ .container.gallery {
42
+ width: var(--size-20);
43
+ max-width: var(--size-20);
44
+ object-fit: cover;
45
+ }
46
+ </style>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { FileData } from "@gradio/client";
3
+ declare const __propDef: {
4
+ props: {
5
+ value: null | FileData;
6
+ type: "gallery" | "table";
7
+ selected?: boolean | undefined;
8
+ };
9
+ events: {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type ExampleProps = typeof __propDef.props;
15
+ export type ExampleEvents = typeof __propDef.events;
16
+ export type ExampleSlots = typeof __propDef.slots;
17
+ export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,200 @@
1
+ <svelte:options accessors={true} />
2
+
3
+ <script context="module">export { default as Webcam } from "./shared/Webcam.svelte";
4
+ export { default as BaseImageUploader } from "./shared/ImageUploader.svelte";
5
+ export { default as BaseStaticImage } from "./shared/ImagePreview.svelte";
6
+ export { default as BaseExample } from "./Example.svelte";
7
+ export { default as BaseImage } from "./shared/Image.svelte";
8
+ </script>
9
+
10
+ <script>import StaticImage from "./shared/ImagePreview.svelte";
11
+ import ImageUploader from "./shared/ImageUploader.svelte";
12
+ import { afterUpdate } from "svelte";
13
+ import { Block, Empty, UploadText } from "@gradio/atoms";
14
+ import { Image } from "@gradio/icons";
15
+ import { StatusTracker } from "@gradio/statustracker";
16
+ let stream_state = "closed";
17
+ let _modify_stream;
18
+ export function modify_stream_state(state) {
19
+ stream_state = state;
20
+ _modify_stream(state);
21
+ }
22
+ export const get_stream_state = () => stream_state;
23
+ export let set_time_limit;
24
+ export let value_is_output = false;
25
+ export let elem_id = "";
26
+ export let elem_classes = [];
27
+ export let visible = true;
28
+ export let value = null;
29
+ let old_value = null;
30
+ export let label;
31
+ export let show_label;
32
+ export let show_download_button;
33
+ export let root;
34
+ export let height;
35
+ export let width;
36
+ export let stream_every;
37
+ export let _selectable = false;
38
+ export let container = true;
39
+ export let scale = null;
40
+ export let min_width = void 0;
41
+ export let loading_status;
42
+ export let show_share_button = false;
43
+ export let sources = [
44
+ "upload",
45
+ "clipboard",
46
+ "webcam"
47
+ ];
48
+ export let interactive;
49
+ export let streaming;
50
+ export let pending;
51
+ export let mirror_webcam;
52
+ export let placeholder = void 0;
53
+ export let show_fullscreen_button;
54
+ export let gradio;
55
+ $: {
56
+ if (JSON.stringify(value) !== JSON.stringify(old_value)) {
57
+ old_value = value;
58
+ gradio.dispatch("change");
59
+ if (!value_is_output) {
60
+ gradio.dispatch("input");
61
+ }
62
+ }
63
+ }
64
+ afterUpdate(() => {
65
+ value_is_output = false;
66
+ });
67
+ let dragging;
68
+ let active_source = null;
69
+ let upload_component;
70
+ const handle_drag_event = (event) => {
71
+ const drag_event = event;
72
+ drag_event.preventDefault();
73
+ drag_event.stopPropagation();
74
+ if (drag_event.type === "dragenter" || drag_event.type === "dragover") {
75
+ dragging = true;
76
+ } else if (drag_event.type === "dragleave") {
77
+ dragging = false;
78
+ }
79
+ };
80
+ const handle_drop = (event) => {
81
+ if (interactive) {
82
+ const drop_event = event;
83
+ drop_event.preventDefault();
84
+ drop_event.stopPropagation();
85
+ dragging = false;
86
+ if (upload_component) {
87
+ upload_component.loadFilesFromDrop(drop_event);
88
+ }
89
+ }
90
+ };
91
+ </script>
92
+
93
+ {#if !interactive}
94
+ <Block
95
+ {visible}
96
+ variant={"solid"}
97
+ border_mode={dragging ? "focus" : "base"}
98
+ padding={false}
99
+ {elem_id}
100
+ {elem_classes}
101
+ height={height || undefined}
102
+ {width}
103
+ allow_overflow={false}
104
+ {container}
105
+ {scale}
106
+ {min_width}
107
+ >
108
+ <StatusTracker
109
+ autoscroll={gradio.autoscroll}
110
+ i18n={gradio.i18n}
111
+ {...loading_status}
112
+ />
113
+ <StaticImage
114
+ on:select={({ detail }) => gradio.dispatch("select", detail)}
115
+ on:share={({ detail }) => gradio.dispatch("share", detail)}
116
+ on:error={({ detail }) => gradio.dispatch("error", detail)}
117
+ {value}
118
+ {label}
119
+ {show_label}
120
+ {show_download_button}
121
+ selectable={_selectable}
122
+ {show_share_button}
123
+ i18n={gradio.i18n}
124
+ {show_fullscreen_button}
125
+ />
126
+ </Block>
127
+ {:else}
128
+ <Block
129
+ {visible}
130
+ variant={value === null ? "dashed" : "solid"}
131
+ border_mode={dragging ? "focus" : "base"}
132
+ padding={false}
133
+ {elem_id}
134
+ {elem_classes}
135
+ height={height || undefined}
136
+ {width}
137
+ allow_overflow={false}
138
+ {container}
139
+ {scale}
140
+ {min_width}
141
+ on:dragenter={handle_drag_event}
142
+ on:dragleave={handle_drag_event}
143
+ on:dragover={handle_drag_event}
144
+ on:drop={handle_drop}
145
+ >
146
+ <StatusTracker
147
+ autoscroll={gradio.autoscroll}
148
+ i18n={gradio.i18n}
149
+ {...loading_status}
150
+ on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
151
+ />
152
+
153
+ <ImageUploader
154
+ bind:this={upload_component}
155
+ bind:active_source
156
+ bind:value
157
+ bind:dragging
158
+ selectable={_selectable}
159
+ {root}
160
+ {sources}
161
+ on:edit={() => gradio.dispatch("edit")}
162
+ on:clear={() => {
163
+ gradio.dispatch("clear");
164
+ }}
165
+ on:stream={({ detail }) => gradio.dispatch("stream", detail)}
166
+ on:drag={({ detail }) => (dragging = detail)}
167
+ on:upload={() => gradio.dispatch("upload")}
168
+ on:select={({ detail }) => gradio.dispatch("select", detail)}
169
+ on:share={({ detail }) => gradio.dispatch("share", detail)}
170
+ on:error={({ detail }) => {
171
+ loading_status = loading_status || {};
172
+ loading_status.status = "error";
173
+ gradio.dispatch("error", detail);
174
+ }}
175
+ on:close_stream={() => {
176
+ gradio.dispatch("close_stream", "stream");
177
+ }}
178
+ {label}
179
+ {show_label}
180
+ {pending}
181
+ {streaming}
182
+ {mirror_webcam}
183
+ {stream_every}
184
+ bind:modify_stream={_modify_stream}
185
+ bind:set_time_limit
186
+ max_file_size={gradio.max_file_size}
187
+ i18n={gradio.i18n}
188
+ upload={gradio.client.upload}
189
+ stream_handler={gradio.client.stream}
190
+ >
191
+ {#if active_source === "upload" || !active_source}
192
+ <UploadText i18n={gradio.i18n} type="image" {placeholder} />
193
+ {:else if active_source === "clipboard"}
194
+ <UploadText i18n={gradio.i18n} type="clipboard" mode="short" />
195
+ {:else}
196
+ <Empty unpadded_box={true} size="large"><Image /></Empty>
197
+ {/if}
198
+ </ImageUploader>
199
+ </Block>
200
+ {/if}
@@ -0,0 +1,176 @@
1
+ import { SvelteComponent } from "svelte";
2
+ export { default as Webcam } from "./shared/Webcam.svelte";
3
+ export { default as BaseImageUploader } from "./shared/ImageUploader.svelte";
4
+ export { default as BaseStaticImage } from "./shared/ImagePreview.svelte";
5
+ export { default as BaseExample } from "./Example.svelte";
6
+ export { default as BaseImage } from "./shared/Image.svelte";
7
+ import type { Gradio, SelectData, ValueData } from "@gradio/utils";
8
+ import type { FileData } from "@gradio/client";
9
+ import type { LoadingStatus } from "@gradio/statustracker";
10
+ declare const __propDef: {
11
+ props: {
12
+ modify_stream_state?: ((state: "open" | "closed" | "waiting") => void) | undefined;
13
+ get_stream_state?: (() => void) | undefined;
14
+ set_time_limit: (arg0: number) => void;
15
+ value_is_output?: boolean | undefined;
16
+ elem_id?: string | undefined;
17
+ elem_classes?: string[] | undefined;
18
+ visible?: boolean | undefined;
19
+ value?: (null | FileData) | undefined;
20
+ label: string;
21
+ show_label: boolean;
22
+ show_download_button: boolean;
23
+ root: string;
24
+ height: number | undefined;
25
+ width: number | undefined;
26
+ stream_every: number;
27
+ _selectable?: boolean | undefined;
28
+ container?: boolean | undefined;
29
+ scale?: (number | null) | undefined;
30
+ min_width?: number | undefined;
31
+ loading_status: LoadingStatus;
32
+ show_share_button?: boolean | undefined;
33
+ sources?: ("clipboard" | "webcam" | "upload")[] | undefined;
34
+ interactive: boolean;
35
+ streaming: boolean;
36
+ pending: boolean;
37
+ mirror_webcam: boolean;
38
+ placeholder?: string | undefined;
39
+ show_fullscreen_button: boolean;
40
+ gradio: Gradio<{
41
+ input: never;
42
+ change: never;
43
+ error: string;
44
+ edit: never;
45
+ stream: ValueData;
46
+ drag: never;
47
+ upload: never;
48
+ clear: never;
49
+ select: SelectData;
50
+ share: ShareData;
51
+ clear_status: LoadingStatus;
52
+ close_stream: string;
53
+ }>;
54
+ };
55
+ events: {
56
+ [evt: string]: CustomEvent<any>;
57
+ };
58
+ slots: {};
59
+ };
60
+ export type IndexProps = typeof __propDef.props;
61
+ export type IndexEvents = typeof __propDef.events;
62
+ export type IndexSlots = typeof __propDef.slots;
63
+ export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
64
+ get modify_stream_state(): (state: "open" | "closed" | "waiting") => void;
65
+ get get_stream_state(): () => void;
66
+ get undefined(): any;
67
+ /**accessor*/
68
+ set undefined(_: any);
69
+ get set_time_limit(): (arg0: number) => void;
70
+ /**accessor*/
71
+ set set_time_limit(_: (arg0: number) => void);
72
+ get value_is_output(): boolean | undefined;
73
+ /**accessor*/
74
+ set value_is_output(_: boolean | undefined);
75
+ get elem_id(): string | undefined;
76
+ /**accessor*/
77
+ set elem_id(_: string | undefined);
78
+ get elem_classes(): string[] | undefined;
79
+ /**accessor*/
80
+ set elem_classes(_: string[] | undefined);
81
+ get visible(): boolean | undefined;
82
+ /**accessor*/
83
+ set visible(_: boolean | undefined);
84
+ get value(): FileData | null | undefined;
85
+ /**accessor*/
86
+ set value(_: FileData | null | undefined);
87
+ get label(): string;
88
+ /**accessor*/
89
+ set label(_: string);
90
+ get show_label(): boolean;
91
+ /**accessor*/
92
+ set show_label(_: boolean);
93
+ get show_download_button(): boolean;
94
+ /**accessor*/
95
+ set show_download_button(_: boolean);
96
+ get root(): string;
97
+ /**accessor*/
98
+ set root(_: string);
99
+ get height(): number | undefined;
100
+ /**accessor*/
101
+ set height(_: number | undefined);
102
+ get width(): number | undefined;
103
+ /**accessor*/
104
+ set width(_: number | undefined);
105
+ get stream_every(): number;
106
+ /**accessor*/
107
+ set stream_every(_: number);
108
+ get _selectable(): boolean | undefined;
109
+ /**accessor*/
110
+ set _selectable(_: boolean | undefined);
111
+ get container(): boolean | undefined;
112
+ /**accessor*/
113
+ set container(_: boolean | undefined);
114
+ get scale(): number | null | undefined;
115
+ /**accessor*/
116
+ set scale(_: number | null | undefined);
117
+ get min_width(): number | undefined;
118
+ /**accessor*/
119
+ set min_width(_: number | undefined);
120
+ get loading_status(): LoadingStatus;
121
+ /**accessor*/
122
+ set loading_status(_: LoadingStatus);
123
+ get show_share_button(): boolean | undefined;
124
+ /**accessor*/
125
+ set show_share_button(_: boolean | undefined);
126
+ get sources(): ("upload" | "clipboard" | "webcam")[] | undefined;
127
+ /**accessor*/
128
+ set sources(_: ("upload" | "clipboard" | "webcam")[] | undefined);
129
+ get interactive(): boolean;
130
+ /**accessor*/
131
+ set interactive(_: boolean);
132
+ get streaming(): boolean;
133
+ /**accessor*/
134
+ set streaming(_: boolean);
135
+ get pending(): boolean;
136
+ /**accessor*/
137
+ set pending(_: boolean);
138
+ get mirror_webcam(): boolean;
139
+ /**accessor*/
140
+ set mirror_webcam(_: boolean);
141
+ get placeholder(): string | undefined;
142
+ /**accessor*/
143
+ set placeholder(_: string | undefined);
144
+ get show_fullscreen_button(): boolean;
145
+ /**accessor*/
146
+ set show_fullscreen_button(_: boolean);
147
+ get gradio(): Gradio<{
148
+ input: never;
149
+ change: never;
150
+ error: string;
151
+ edit: never;
152
+ stream: ValueData;
153
+ drag: never;
154
+ upload: never;
155
+ clear: never;
156
+ select: SelectData;
157
+ share: ShareData;
158
+ clear_status: LoadingStatus;
159
+ close_stream: string;
160
+ }>;
161
+ /**accessor*/
162
+ set gradio(_: Gradio<{
163
+ input: never;
164
+ change: never;
165
+ error: string;
166
+ edit: never;
167
+ stream: ValueData;
168
+ drag: never;
169
+ upload: never;
170
+ clear: never;
171
+ select: SelectData;
172
+ share: ShareData;
173
+ clear_status: LoadingStatus;
174
+ close_stream: string;
175
+ }>);
176
+ }
@@ -0,0 +1,28 @@
1
+ <script>import { createEventDispatcher } from "svelte";
2
+ import { IconButton } from "@gradio/atoms";
3
+ import { Clear } from "@gradio/icons";
4
+ const dispatch = createEventDispatcher();
5
+ </script>
6
+
7
+ <div>
8
+ <IconButton
9
+ Icon={Clear}
10
+ label="Remove Image"
11
+ on:click={(event) => {
12
+ dispatch("remove_image");
13
+ event.stopPropagation();
14
+ }}
15
+ />
16
+ </div>
17
+
18
+ <style>
19
+ div {
20
+ display: flex;
21
+ position: absolute;
22
+ top: var(--size-2);
23
+ right: var(--size-2);
24
+ justify-content: flex-end;
25
+ gap: var(--spacing-sm);
26
+ z-index: var(--layer-5);
27
+ }
28
+ </style>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: never;
5
+ };
6
+ events: {
7
+ remove_image: CustomEvent<any>;
8
+ } & {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export type ClearImageProps = typeof __propDef.props;
14
+ export type ClearImageEvents = typeof __propDef.events;
15
+ export type ClearImageSlots = typeof __propDef.slots;
16
+ export default class ClearImage extends SvelteComponent<ClearImageProps, ClearImageEvents, ClearImageSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,26 @@
1
+ <script>import { createEventDispatcher } from "svelte";
2
+ const dispatch = createEventDispatcher();
3
+ import { resolve_wasm_src } from "@gradio/wasm/svelte";
4
+ export let src = void 0;
5
+ let resolved_src;
6
+ let latest_src;
7
+ $: {
8
+ resolved_src = src;
9
+ latest_src = src;
10
+ const resolving_src = src;
11
+ resolve_wasm_src(resolving_src).then((s) => {
12
+ if (latest_src === resolving_src) {
13
+ resolved_src = s;
14
+ }
15
+ });
16
+ }
17
+ </script>
18
+
19
+ <!-- svelte-ignore a11y-missing-attribute -->
20
+ <img src={resolved_src} {...$$restProps} on:load={() => dispatch("load")} />
21
+
22
+ <style>
23
+ img {
24
+ object-fit: cover;
25
+ }
26
+ </style>