@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.
@@ -0,0 +1,247 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: `data-${string}`]: any;
5
+ alt?: string | undefined | null;
6
+ crossorigin?: "anonymous" | "use-credentials" | "" | undefined | null;
7
+ decoding?: "async" | "auto" | "sync" | undefined | null;
8
+ fetchpriority?: "auto" | "high" | "low" | undefined | null;
9
+ height?: number | string | undefined | null;
10
+ ismap?: boolean | undefined | null;
11
+ loading?: "eager" | "lazy" | undefined | null;
12
+ referrerpolicy?: ReferrerPolicy | undefined | null;
13
+ sizes?: string | undefined | null;
14
+ src?: string | undefined | null;
15
+ srcset?: string | undefined | null;
16
+ usemap?: string | undefined | null;
17
+ width?: number | string | undefined | null;
18
+ readonly 'bind:naturalWidth'?: number | undefined | null;
19
+ readonly 'bind:naturalHeight'?: number | undefined | null;
20
+ accesskey?: string | undefined | null;
21
+ autofocus?: boolean | undefined | null;
22
+ class?: string | undefined | null;
23
+ contenteditable?: import("svelte/elements").Booleanish | "inherit" | "plaintext-only" | undefined | null;
24
+ contextmenu?: string | undefined | null;
25
+ dir?: string | undefined | null;
26
+ draggable?: import("svelte/elements").Booleanish | undefined | null;
27
+ enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | null;
28
+ hidden?: boolean | undefined | null;
29
+ id?: string | undefined | null;
30
+ lang?: string | undefined | null;
31
+ part?: string | undefined | null;
32
+ placeholder?: string | undefined | null;
33
+ slot?: string | undefined | null;
34
+ spellcheck?: import("svelte/elements").Booleanish | undefined | null;
35
+ style?: string | undefined | null;
36
+ tabindex?: number | undefined | null;
37
+ title?: string | undefined | null;
38
+ translate?: "yes" | "no" | "" | undefined | null;
39
+ inert?: boolean | undefined | null;
40
+ popover?: "auto" | "manual" | "" | undefined | null;
41
+ radiogroup?: string | undefined | null;
42
+ role?: import("svelte/elements").AriaRole | undefined | null;
43
+ about?: string | undefined | null;
44
+ datatype?: string | undefined | null;
45
+ inlist?: any;
46
+ prefix?: string | undefined | null;
47
+ property?: string | undefined | null;
48
+ resource?: string | undefined | null;
49
+ typeof?: string | undefined | null;
50
+ vocab?: string | undefined | null;
51
+ autocapitalize?: string | undefined | null;
52
+ autocorrect?: string | undefined | null;
53
+ autosave?: string | undefined | null;
54
+ color?: string | undefined | null;
55
+ itemprop?: string | undefined | null;
56
+ itemscope?: boolean | undefined | null;
57
+ itemtype?: string | undefined | null;
58
+ itemid?: string | undefined | null;
59
+ itemref?: string | undefined | null;
60
+ results?: number | undefined | null;
61
+ security?: string | undefined | null;
62
+ unselectable?: "on" | "off" | undefined | null;
63
+ inputmode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | null;
64
+ is?: string | undefined | null;
65
+ 'bind:innerHTML'?: string | undefined | null;
66
+ 'bind:textContent'?: string | undefined | null;
67
+ 'bind:innerText'?: string | undefined | null;
68
+ readonly 'bind:contentRect'?: DOMRectReadOnly | undefined | null;
69
+ readonly 'bind:contentBoxSize'?: ResizeObserverSize[] | undefined | null;
70
+ readonly 'bind:borderBoxSize'?: ResizeObserverSize[] | undefined | null;
71
+ readonly 'bind:devicePixelContentBoxSize'?: ResizeObserverSize[] | undefined | null;
72
+ 'data-sveltekit-keepfocus'?: true | "" | "off" | undefined | null;
73
+ 'data-sveltekit-noscroll'?: true | "" | "off" | undefined | null;
74
+ 'data-sveltekit-preload-code'?: true | "" | "eager" | "viewport" | "hover" | "tap" | "off" | undefined | null;
75
+ 'data-sveltekit-preload-data'?: true | "" | "hover" | "tap" | "off" | undefined | null;
76
+ 'data-sveltekit-reload'?: true | "" | "off" | undefined | null;
77
+ 'data-sveltekit-replacestate'?: true | "" | "off" | undefined | null;
78
+ 'aria-activedescendant'?: string | undefined | null;
79
+ 'aria-atomic'?: import("svelte/elements").Booleanish | undefined | null;
80
+ 'aria-autocomplete'?: "none" | "inline" | "list" | "both" | undefined | null;
81
+ 'aria-busy'?: import("svelte/elements").Booleanish | undefined | null;
82
+ 'aria-checked'?: boolean | "false" | "mixed" | "true" | undefined | null;
83
+ 'aria-colcount'?: number | undefined | null;
84
+ 'aria-colindex'?: number | undefined | null;
85
+ 'aria-colspan'?: number | undefined | null;
86
+ 'aria-controls'?: string | undefined | null;
87
+ 'aria-current'?: import("svelte/elements").Booleanish | "page" | "step" | "location" | "date" | "time" | undefined | null;
88
+ 'aria-describedby'?: string | undefined | null;
89
+ 'aria-details'?: string | undefined | null;
90
+ 'aria-disabled'?: import("svelte/elements").Booleanish | undefined | null;
91
+ 'aria-dropeffect'?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | null;
92
+ 'aria-errormessage'?: string | undefined | null;
93
+ 'aria-expanded'?: import("svelte/elements").Booleanish | undefined | null;
94
+ 'aria-flowto'?: string | undefined | null;
95
+ 'aria-grabbed'?: import("svelte/elements").Booleanish | undefined | null;
96
+ 'aria-haspopup'?: import("svelte/elements").Booleanish | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | null;
97
+ 'aria-hidden'?: import("svelte/elements").Booleanish | undefined | null;
98
+ 'aria-invalid'?: import("svelte/elements").Booleanish | "grammar" | "spelling" | undefined | null;
99
+ 'aria-keyshortcuts'?: string | undefined | null;
100
+ 'aria-label'?: string | undefined | null;
101
+ 'aria-labelledby'?: string | undefined | null;
102
+ 'aria-level'?: number | undefined | null;
103
+ 'aria-live'?: "off" | "assertive" | "polite" | undefined | null;
104
+ 'aria-modal'?: import("svelte/elements").Booleanish | undefined | null;
105
+ 'aria-multiline'?: import("svelte/elements").Booleanish | undefined | null;
106
+ 'aria-multiselectable'?: import("svelte/elements").Booleanish | undefined | null;
107
+ 'aria-orientation'?: "horizontal" | "vertical" | undefined | null;
108
+ 'aria-owns'?: string | undefined | null;
109
+ 'aria-placeholder'?: string | undefined | null;
110
+ 'aria-posinset'?: number | undefined | null;
111
+ 'aria-pressed'?: boolean | "false" | "mixed" | "true" | undefined | null;
112
+ 'aria-readonly'?: import("svelte/elements").Booleanish | undefined | null;
113
+ 'aria-relevant'?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | null;
114
+ 'aria-required'?: import("svelte/elements").Booleanish | undefined | null;
115
+ 'aria-roledescription'?: string | undefined | null;
116
+ 'aria-rowcount'?: number | undefined | null;
117
+ 'aria-rowindex'?: number | undefined | null;
118
+ 'aria-rowspan'?: number | undefined | null;
119
+ 'aria-selected'?: import("svelte/elements").Booleanish | undefined | null;
120
+ 'aria-setsize'?: number | undefined | null;
121
+ 'aria-sort'?: "none" | "ascending" | "descending" | "other" | undefined | null;
122
+ 'aria-valuemax'?: number | undefined | null;
123
+ 'aria-valuemin'?: number | undefined | null;
124
+ 'aria-valuenow'?: number | undefined | null;
125
+ 'aria-valuetext'?: string | undefined | null;
126
+ 'on:copy'?: import("svelte/elements").ClipboardEventHandler<HTMLImageElement> | null | undefined;
127
+ 'on:cut'?: import("svelte/elements").ClipboardEventHandler<HTMLImageElement> | null | undefined;
128
+ 'on:paste'?: import("svelte/elements").ClipboardEventHandler<HTMLImageElement> | null | undefined;
129
+ 'on:compositionend'?: import("svelte/elements").CompositionEventHandler<HTMLImageElement> | null | undefined;
130
+ 'on:compositionstart'?: import("svelte/elements").CompositionEventHandler<HTMLImageElement> | null | undefined;
131
+ 'on:compositionupdate'?: import("svelte/elements").CompositionEventHandler<HTMLImageElement> | null | undefined;
132
+ 'on:focus'?: import("svelte/elements").FocusEventHandler<HTMLImageElement> | null | undefined;
133
+ 'on:focusin'?: import("svelte/elements").FocusEventHandler<HTMLImageElement> | null | undefined;
134
+ 'on:focusout'?: import("svelte/elements").FocusEventHandler<HTMLImageElement> | null | undefined;
135
+ 'on:blur'?: import("svelte/elements").FocusEventHandler<HTMLImageElement> | null | undefined;
136
+ 'on:change'?: import("svelte/elements").FormEventHandler<HTMLImageElement> | null | undefined;
137
+ 'on:beforeinput'?: import("svelte/elements").EventHandler<InputEvent, HTMLImageElement> | null | undefined;
138
+ 'on:input'?: import("svelte/elements").FormEventHandler<HTMLImageElement> | null | undefined;
139
+ 'on:reset'?: import("svelte/elements").FormEventHandler<HTMLImageElement> | null | undefined;
140
+ 'on:submit'?: import("svelte/elements").EventHandler<SubmitEvent, HTMLImageElement> | null | undefined;
141
+ 'on:invalid'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
142
+ 'on:formdata'?: import("svelte/elements").EventHandler<FormDataEvent, HTMLImageElement> | null | undefined;
143
+ 'on:load'?: import("svelte/elements").EventHandler | undefined | null;
144
+ 'on:error'?: import("svelte/elements").EventHandler | undefined | null;
145
+ 'on:beforetoggle'?: import("svelte/elements").ToggleEventHandler<HTMLImageElement> | null | undefined;
146
+ 'on:toggle'?: import("svelte/elements").ToggleEventHandler<HTMLImageElement> | null | undefined;
147
+ 'on:keydown'?: import("svelte/elements").KeyboardEventHandler<HTMLImageElement> | null | undefined;
148
+ 'on:keypress'?: import("svelte/elements").KeyboardEventHandler<HTMLImageElement> | null | undefined;
149
+ 'on:keyup'?: import("svelte/elements").KeyboardEventHandler<HTMLImageElement> | null | undefined;
150
+ 'on:abort'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
151
+ 'on:canplay'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
152
+ 'on:canplaythrough'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
153
+ 'on:cuechange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
154
+ 'on:durationchange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
155
+ 'on:emptied'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
156
+ 'on:encrypted'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
157
+ 'on:ended'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
158
+ 'on:loadeddata'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
159
+ 'on:loadedmetadata'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
160
+ 'on:loadstart'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
161
+ 'on:pause'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
162
+ 'on:play'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
163
+ 'on:playing'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
164
+ 'on:progress'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
165
+ 'on:ratechange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
166
+ 'on:seeked'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
167
+ 'on:seeking'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
168
+ 'on:stalled'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
169
+ 'on:suspend'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
170
+ 'on:timeupdate'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
171
+ 'on:volumechange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
172
+ 'on:waiting'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
173
+ 'on:auxclick'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
174
+ 'on:click'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
175
+ 'on:contextmenu'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
176
+ 'on:dblclick'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
177
+ 'on:drag'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
178
+ 'on:dragend'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
179
+ 'on:dragenter'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
180
+ 'on:dragexit'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
181
+ 'on:dragleave'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
182
+ 'on:dragover'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
183
+ 'on:dragstart'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
184
+ 'on:drop'?: import("svelte/elements").DragEventHandler<HTMLImageElement> | null | undefined;
185
+ 'on:mousedown'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
186
+ 'on:mouseenter'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
187
+ 'on:mouseleave'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
188
+ 'on:mousemove'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
189
+ 'on:mouseout'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
190
+ 'on:mouseover'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
191
+ 'on:mouseup'?: import("svelte/elements").MouseEventHandler<HTMLImageElement> | null | undefined;
192
+ 'on:select'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
193
+ 'on:selectionchange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
194
+ 'on:selectstart'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
195
+ 'on:touchcancel'?: import("svelte/elements").TouchEventHandler<HTMLImageElement> | null | undefined;
196
+ 'on:touchend'?: import("svelte/elements").TouchEventHandler<HTMLImageElement> | null | undefined;
197
+ 'on:touchmove'?: import("svelte/elements").TouchEventHandler<HTMLImageElement> | null | undefined;
198
+ 'on:touchstart'?: import("svelte/elements").TouchEventHandler<HTMLImageElement> | null | undefined;
199
+ 'on:gotpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
200
+ 'on:pointercancel'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
201
+ 'on:pointerdown'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
202
+ 'on:pointerenter'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
203
+ 'on:pointerleave'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
204
+ 'on:pointermove'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
205
+ 'on:pointerout'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
206
+ 'on:pointerover'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
207
+ 'on:pointerup'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
208
+ 'on:lostpointercapture'?: import("svelte/elements").PointerEventHandler<HTMLImageElement> | null | undefined;
209
+ 'on:gamepadconnected'?: import("svelte/elements").GamepadEventHandler<HTMLImageElement> | null | undefined;
210
+ 'on:gamepaddisconnected'?: import("svelte/elements").GamepadEventHandler<HTMLImageElement> | null | undefined;
211
+ 'on:scroll'?: import("svelte/elements").UIEventHandler<HTMLImageElement> | null | undefined;
212
+ 'on:scrollend'?: import("svelte/elements").UIEventHandler<HTMLImageElement> | null | undefined;
213
+ 'on:resize'?: import("svelte/elements").UIEventHandler<HTMLImageElement> | null | undefined;
214
+ 'on:wheel'?: import("svelte/elements").WheelEventHandler<HTMLImageElement> | null | undefined;
215
+ 'on:animationstart'?: import("svelte/elements").AnimationEventHandler<HTMLImageElement> | null | undefined;
216
+ 'on:animationend'?: import("svelte/elements").AnimationEventHandler<HTMLImageElement> | null | undefined;
217
+ 'on:animationiteration'?: import("svelte/elements").AnimationEventHandler<HTMLImageElement> | null | undefined;
218
+ 'on:transitionstart'?: import("svelte/elements").TransitionEventHandler<HTMLImageElement> | null | undefined;
219
+ 'on:transitionrun'?: import("svelte/elements").TransitionEventHandler<HTMLImageElement> | null | undefined;
220
+ 'on:transitionend'?: import("svelte/elements").TransitionEventHandler<HTMLImageElement> | null | undefined;
221
+ 'on:transitioncancel'?: import("svelte/elements").TransitionEventHandler<HTMLImageElement> | null | undefined;
222
+ 'on:outrostart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLImageElement> | null | undefined;
223
+ 'on:outroend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLImageElement> | null | undefined;
224
+ 'on:introstart'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLImageElement> | null | undefined;
225
+ 'on:introend'?: import("svelte/elements").EventHandler<CustomEvent<null>, HTMLImageElement> | null | undefined;
226
+ 'on:message'?: import("svelte/elements").MessageEventHandler<HTMLImageElement> | null | undefined;
227
+ 'on:messageerror'?: import("svelte/elements").MessageEventHandler<HTMLImageElement> | null | undefined;
228
+ 'on:visibilitychange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
229
+ 'on:cancel'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
230
+ 'on:close'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
231
+ 'on:fullscreenchange'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
232
+ 'on:fullscreenerror'?: import("svelte/elements").EventHandler<Event, HTMLImageElement> | null | undefined;
233
+ "data-testid"?: string | undefined;
234
+ };
235
+ events: {
236
+ load?: CustomEvent<void | undefined> | undefined;
237
+ } & {
238
+ [evt: string]: CustomEvent<any>;
239
+ };
240
+ slots: {};
241
+ };
242
+ export type ImageProps = typeof __propDef.props;
243
+ export type ImageEvents = typeof __propDef.events;
244
+ export type ImageSlots = typeof __propDef.slots;
245
+ export default class Image extends SvelteComponent<ImageProps, ImageEvents, ImageSlots> {
246
+ }
247
+ export {};
@@ -0,0 +1,155 @@
1
+ <script>import { createEventDispatcher, onMount } from "svelte";
2
+ import { uploadToHuggingFace } from "@gradio/utils";
3
+ import { BlockLabel, Empty, IconButton, ShareButton } from "@gradio/atoms";
4
+ import { Download } from "@gradio/icons";
5
+ import { get_coordinates_of_clicked_image } from "./utils";
6
+ import Image from "./Image.svelte";
7
+ import { DownloadLink } from "@gradio/wasm/svelte";
8
+ import { Maximize, Minimize } from "@gradio/icons";
9
+ import { Image as ImageIcon } from "@gradio/icons";
10
+ import {} from "@gradio/client";
11
+ export let value;
12
+ export let label = void 0;
13
+ export let show_label;
14
+ export let show_download_button = true;
15
+ export let selectable = false;
16
+ export let show_share_button = false;
17
+ export let i18n;
18
+ export let show_fullscreen_button = true;
19
+ const dispatch = createEventDispatcher();
20
+ const handle_click = (evt) => {
21
+ let coordinates = get_coordinates_of_clicked_image(evt);
22
+ if (coordinates) {
23
+ dispatch("select", { index: coordinates, value: null });
24
+ }
25
+ };
26
+ let is_full_screen = false;
27
+ let image_container;
28
+ onMount(() => {
29
+ document.addEventListener("fullscreenchange", () => {
30
+ is_full_screen = !!document.fullscreenElement;
31
+ });
32
+ });
33
+ const toggle_full_screen = async () => {
34
+ if (!is_full_screen) {
35
+ await image_container.requestFullscreen();
36
+ } else {
37
+ await document.exitFullscreen();
38
+ is_full_screen = !is_full_screen;
39
+ }
40
+ };
41
+ </script>
42
+
43
+ <BlockLabel
44
+ {show_label}
45
+ Icon={ImageIcon}
46
+ label={!show_label ? "" : label || i18n("image.image")}
47
+ />
48
+ {#if value === null || !value.url}
49
+ <Empty unpadded_box={true} size="large"><ImageIcon /></Empty>
50
+ {:else}
51
+ <div class="image-container" bind:this={image_container}>
52
+ <div class="icon-buttons">
53
+ {#if !is_full_screen && show_fullscreen_button}
54
+ <IconButton
55
+ Icon={Maximize}
56
+ label={is_full_screen ? "Exit full screen" : "View in full screen"}
57
+ on:click={toggle_full_screen}
58
+ />
59
+ {/if}
60
+
61
+ {#if is_full_screen && show_fullscreen_button}
62
+ <IconButton
63
+ Icon={Minimize}
64
+ label={is_full_screen ? "Exit full screen" : "View in full screen"}
65
+ on:click={toggle_full_screen}
66
+ />
67
+ {/if}
68
+
69
+ {#if show_download_button}
70
+ <DownloadLink href={value.url} download={value.orig_name || "image"}>
71
+ <IconButton Icon={Download} label={i18n("common.download")} />
72
+ </DownloadLink>
73
+ {/if}
74
+ {#if show_share_button}
75
+ <ShareButton
76
+ {i18n}
77
+ on:share
78
+ on:error
79
+ formatter={async (value) => {
80
+ if (!value) return "";
81
+ let url = await uploadToHuggingFace(value, "url");
82
+ return `<img src="${url}" />`;
83
+ }}
84
+ {value}
85
+ />
86
+ {/if}
87
+ </div>
88
+ <button on:click={handle_click}>
89
+ <div class:selectable class="image-frame">
90
+ <Image src={value.url} alt="" loading="lazy" on:load />
91
+ </div>
92
+ </button>
93
+ </div>
94
+ {/if}
95
+
96
+ <style>
97
+ .image-container {
98
+ height: 100%;
99
+ position: relative;
100
+ }
101
+
102
+ .image-container button {
103
+ width: var(--size-full);
104
+ height: var(--size-full);
105
+ border-radius: var(--radius-lg);
106
+
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ }
111
+
112
+ .image-frame {
113
+ width: auto;
114
+ height: 100%;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ }
119
+ .image-frame :global(img) {
120
+ width: var(--size-full);
121
+ height: var(--size-full);
122
+ object-fit: scale-down;
123
+ }
124
+
125
+ .selectable {
126
+ cursor: crosshair;
127
+ }
128
+
129
+ .icon-buttons {
130
+ display: flex;
131
+ position: absolute;
132
+ top: 6px;
133
+ right: 6px;
134
+ gap: var(--size-1);
135
+ z-index: 1;
136
+ }
137
+
138
+ :global(.fullscreen-controls svg) {
139
+ position: relative;
140
+ top: 0px;
141
+ }
142
+
143
+ :global(.image-container:fullscreen) {
144
+ background-color: black;
145
+ display: flex;
146
+ justify-content: center;
147
+ align-items: center;
148
+ }
149
+
150
+ :global(.image-container:fullscreen img) {
151
+ max-width: 90vw;
152
+ max-height: 90vh;
153
+ object-fit: scale-down;
154
+ }
155
+ </style>
@@ -0,0 +1,32 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { SelectData } from "@gradio/utils";
3
+ import { type FileData } from "@gradio/client";
4
+ import type { I18nFormatter } from "@gradio/utils";
5
+ declare const __propDef: {
6
+ props: {
7
+ value: null | FileData;
8
+ label?: string | undefined;
9
+ show_label: boolean;
10
+ show_download_button?: boolean | undefined;
11
+ selectable?: boolean | undefined;
12
+ show_share_button?: boolean | undefined;
13
+ i18n: I18nFormatter;
14
+ show_fullscreen_button?: boolean | undefined;
15
+ };
16
+ events: {
17
+ share: CustomEvent<import("@gradio/utils").ShareData>;
18
+ error: CustomEvent<string>;
19
+ load: CustomEvent<void | undefined> | undefined;
20
+ change: CustomEvent<string>;
21
+ select: CustomEvent<SelectData>;
22
+ } & {
23
+ [evt: string]: CustomEvent<any>;
24
+ };
25
+ slots: {};
26
+ };
27
+ export type ImagePreviewProps = typeof __propDef.props;
28
+ export type ImagePreviewEvents = typeof __propDef.events;
29
+ export type ImagePreviewSlots = typeof __propDef.slots;
30
+ export default class ImagePreview extends SvelteComponent<ImagePreviewProps, ImagePreviewEvents, ImagePreviewSlots> {
31
+ }
32
+ export {};
@@ -0,0 +1,198 @@
1
+ <script>import { createEventDispatcher, tick } from "svelte";
2
+ import { BlockLabel } from "@gradio/atoms";
3
+ import { Image as ImageIcon } from "@gradio/icons";
4
+ import {
5
+ } from "@gradio/utils";
6
+ import { get_coordinates_of_clicked_image } from "./utils";
7
+ import Webcam from "./Webcam.svelte";
8
+ import { Upload } from "@gradio/upload";
9
+ import { FileData } from "@gradio/client";
10
+ import ClearImage from "./ClearImage.svelte";
11
+ import { SelectSource } from "@gradio/atoms";
12
+ import Image from "./Image.svelte";
13
+ export let value;
14
+ export let label = void 0;
15
+ export let show_label;
16
+ export let sources = ["upload", "clipboard", "webcam"];
17
+ export let streaming = false;
18
+ export let pending = false;
19
+ export let mirror_webcam;
20
+ export let selectable = false;
21
+ export let root;
22
+ export let i18n;
23
+ export let max_file_size = null;
24
+ export let upload;
25
+ export let stream_handler;
26
+ export let stream_every;
27
+ export let modify_stream;
28
+ export let set_time_limit;
29
+ let upload_input;
30
+ let uploading = false;
31
+ export let active_source = null;
32
+ function handle_upload({ detail }) {
33
+ if (!streaming) {
34
+ value = detail;
35
+ dispatch("upload");
36
+ }
37
+ }
38
+ function handle_clear() {
39
+ value = null;
40
+ dispatch("clear");
41
+ dispatch("change", null);
42
+ }
43
+ async function handle_save(img_blob, event) {
44
+ pending = true;
45
+ const f = await upload_input.load_files([
46
+ new File([img_blob], `image/${streaming ? "jpeg" : "png"}`)
47
+ ]);
48
+ if (event === "change" || event === "upload") {
49
+ value = f?.[0] || null;
50
+ await tick();
51
+ dispatch("change");
52
+ } else {
53
+ dispatch("stream", { value: f?.[0] || null, is_value_data: true });
54
+ }
55
+ pending = false;
56
+ }
57
+ $:
58
+ active_streaming = streaming && active_source === "webcam";
59
+ $:
60
+ if (uploading && !active_streaming)
61
+ value = null;
62
+ const dispatch = createEventDispatcher();
63
+ export let dragging = false;
64
+ $:
65
+ dispatch("drag", dragging);
66
+ function handle_click(evt) {
67
+ let coordinates = get_coordinates_of_clicked_image(evt);
68
+ if (coordinates) {
69
+ dispatch("select", { index: coordinates, value: null });
70
+ }
71
+ }
72
+ $:
73
+ if (!active_source && sources) {
74
+ active_source = sources[0];
75
+ }
76
+ async function handle_select_source(source) {
77
+ switch (source) {
78
+ case "clipboard":
79
+ upload_input.paste_clipboard();
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ </script>
86
+
87
+ <BlockLabel {show_label} Icon={ImageIcon} label={label || "Image"} />
88
+
89
+ <div data-testid="image" class="image-container">
90
+ {#if value?.url && !active_streaming}
91
+ <ClearImage
92
+ on:remove_image={() => {
93
+ value = null;
94
+ dispatch("clear");
95
+ }}
96
+ />
97
+ {/if}
98
+ <div
99
+ class="upload-container"
100
+ class:reduced-height={sources.length > 1}
101
+ style:width={value ? "auto" : "100%"}
102
+ >
103
+ <Upload
104
+ hidden={value !== null || active_source === "webcam"}
105
+ bind:this={upload_input}
106
+ bind:uploading
107
+ bind:dragging
108
+ filetype={active_source === "clipboard" ? "clipboard" : "image/*"}
109
+ on:load={handle_upload}
110
+ on:error
111
+ {root}
112
+ {max_file_size}
113
+ disable_click={!sources.includes("upload") || value !== null}
114
+ {upload}
115
+ {stream_handler}
116
+ >
117
+ {#if value === null}
118
+ <slot />
119
+ {/if}
120
+ </Upload>
121
+ {#if active_source === "webcam" && (streaming || (!streaming && !value))}
122
+ <Webcam
123
+ {root}
124
+ {value}
125
+ on:capture={(e) => handle_save(e.detail, "change")}
126
+ on:stream={(e) => handle_save(e.detail, "stream")}
127
+ on:error
128
+ on:drag
129
+ on:upload={(e) => handle_save(e.detail, "upload")}
130
+ on:close_stream
131
+ {mirror_webcam}
132
+ {stream_every}
133
+ {streaming}
134
+ mode="image"
135
+ include_audio={false}
136
+ {i18n}
137
+ {upload}
138
+ bind:modify_stream
139
+ bind:set_time_limit
140
+ />
141
+ {:else if value !== null && !streaming}
142
+ <!-- svelte-ignore a11y-click-events-have-key-events-->
143
+ <!-- svelte-ignore a11y-no-static-element-interactions-->
144
+ <div class:selectable class="image-frame" on:click={handle_click}>
145
+ <Image src={value.url} alt={value.alt_text} />
146
+ </div>
147
+ {/if}
148
+ </div>
149
+ {#if sources.length > 1 || sources.includes("clipboard")}
150
+ <SelectSource
151
+ {sources}
152
+ bind:active_source
153
+ {handle_clear}
154
+ handle_select={handle_select_source}
155
+ />
156
+ {/if}
157
+ </div>
158
+
159
+ <style>
160
+ .image-frame :global(img) {
161
+ width: var(--size-full);
162
+ height: var(--size-full);
163
+ object-fit: scale-down;
164
+ }
165
+
166
+ .image-frame {
167
+ object-fit: cover;
168
+ width: 100%;
169
+ height: 100%;
170
+ }
171
+
172
+ .upload-container {
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+
177
+ height: 100%;
178
+ flex-shrink: 1;
179
+ max-height: 100%;
180
+ }
181
+
182
+ .reduced-height {
183
+ height: calc(100% - var(--size-10));
184
+ }
185
+
186
+ .image-container {
187
+ display: flex;
188
+ height: 100%;
189
+ flex-direction: column;
190
+ justify-content: center;
191
+ align-items: center;
192
+ max-height: 100%;
193
+ }
194
+
195
+ .selectable {
196
+ cursor: crosshair;
197
+ }
198
+ </style>