@gradio/imageslider 0.3.1-dev.0 → 0.3.1-dev.2

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,30 @@
1
1
  # @gradio/imageslider
2
2
 
3
+ ## 0.3.1-dev.2
4
+
5
+ ### Dependency updates
6
+
7
+ - @gradio/atoms@0.19.0-dev.1
8
+ - @gradio/client@2.0.0-dev.2
9
+ - @gradio/statustracker@0.12.0-dev.1
10
+ - @gradio/upload@0.17.2-dev.2
11
+
12
+ ## 0.3.1-dev.1
13
+
14
+ ### Dependency updates
15
+
16
+ - @gradio/atoms@0.18.2-dev.0
17
+ - @gradio/upload@0.17.2-dev.1
18
+ - @gradio/utils@0.10.3-dev.0
19
+ - @gradio/statustracker@0.12.0-dev.0
20
+ - @gradio/icons@0.15.0-dev.0
21
+
22
+ ## 0.3.1-dev.0
23
+
24
+ ### Dependency updates
25
+
26
+ - @gradio/client@2.0.0-dev.1
27
+
3
28
  ## 0.3.1-dev.0
4
29
 
5
30
  ### Dependency updates
package/Index.svelte CHANGED
@@ -1,83 +1,56 @@
1
1
  <svelte:options accessors={true} />
2
2
 
3
3
  <script lang="ts">
4
- import type { Gradio, SelectData, ValueData } from "@gradio/utils";
4
+ import { tick } from "svelte";
5
+ import type { ImageSliderProps, ImageSliderEvents } from "./types";
6
+ import { Gradio } from "@gradio/utils";
5
7
  import StaticImage from "./shared/SliderPreview.svelte";
6
8
  import ImageUploader from "./shared/SliderUpload.svelte";
7
- import { afterUpdate } from "svelte";
8
9
 
9
10
  import { Block, Empty, UploadText } from "@gradio/atoms";
10
11
  import { Image } from "@gradio/icons";
11
12
  import { StatusTracker } from "@gradio/statustracker";
12
- import { type FileData } from "@gradio/client";
13
- import type { LoadingStatus } from "@gradio/statustracker";
14
13
 
15
14
  type sources = "upload" | "webcam" | "clipboard" | null;
16
15
 
17
- export let value_is_output = false;
18
- export let elem_id = "";
19
- export let elem_classes: string[] = [];
20
- export let visible: boolean | "hidden" = true;
21
- export let value: [FileData | null, FileData | null] = [null, null];
22
- let old_value: [FileData | null, FileData | null] = [null, null];
23
- export let label: string;
24
- export let show_label: boolean;
25
- export let buttons: string[] | null = null;
26
- export let root: string;
27
- export let height: number | undefined;
28
- export let width: number | undefined;
29
- export let container = true;
30
- export let scale: number | null = null;
31
- export let min_width: number | undefined = undefined;
32
- export let loading_status: LoadingStatus;
33
- export let interactive: boolean;
34
- export let placeholder: string | undefined = undefined;
35
- let fullscreen = false;
36
- export let input_ready: boolean;
37
- export let slider_position: number;
38
- export let upload_count = 1;
39
- export let slider_color = "var(--border-color-primary)";
40
- export let max_height: number;
41
- let uploading = false;
16
+ let upload_promise = $state<Promise<any>>();
42
17
 
43
- $: normalised_slider_position =
44
- Math.max(0, Math.min(100, slider_position)) / 100;
18
+ class ImageSliderGradio extends Gradio<ImageSliderEvents, ImageSliderProps> {
19
+ async get_data() {
20
+ if (upload_promise) {
21
+ await upload_promise;
22
+ await tick();
23
+ }
24
+
25
+ const data = await super.get_data();
26
+ return data;
27
+ }
28
+ }
29
+
30
+ const props = $props();
31
+ const gradio = new ImageSliderGradio(props);
45
32
 
46
- $: input_ready = !uploading;
33
+ let value_is_output = $state(false);
34
+ let old_value = $state(gradio.props.value);
35
+ let fullscreen = $state(false);
36
+ let dragging = $state(false);
37
+ let active_source: sources = $state(null);
38
+ let upload_component: ImageUploader;
47
39
 
48
- export let gradio: Gradio<{
49
- input: never;
50
- change: never;
51
- error: string;
52
- edit: never;
53
- stream: ValueData;
54
- drag: never;
55
- upload: never;
56
- clear: never;
57
- select: SelectData;
58
- share: ShareData;
59
- clear_status: LoadingStatus;
60
- close_stream: string;
61
- }>;
40
+ let normalised_slider_position = $derived(
41
+ Math.max(0, Math.min(100, gradio.props.slider_position)) / 100
42
+ );
62
43
 
63
- $: {
64
- if (JSON.stringify(value) !== JSON.stringify(old_value)) {
65
- old_value = value;
44
+ $effect(() => {
45
+ if (old_value != gradio.props.value) {
46
+ old_value = gradio.props.value;
66
47
  gradio.dispatch("change");
67
48
  if (!value_is_output) {
68
49
  gradio.dispatch("input");
69
50
  }
70
51
  }
71
- }
72
-
73
- afterUpdate(() => {
74
- value_is_output = false;
75
52
  });
76
53
 
77
- let dragging: boolean;
78
- let active_source: sources = null;
79
- let upload_component: ImageUploader;
80
-
81
54
  const handle_drag_event = (event: Event): void => {
82
55
  const drag_event = event as DragEvent;
83
56
  drag_event.preventDefault();
@@ -90,7 +63,7 @@
90
63
  };
91
64
 
92
65
  const handle_drop = (event: Event): void => {
93
- if (interactive) {
66
+ if (gradio.shared.interactive) {
94
67
  const drop_event = event as DragEvent;
95
68
  drop_event.preventDefault();
96
69
  drop_event.stopPropagation();
@@ -103,26 +76,26 @@
103
76
  };
104
77
  </script>
105
78
 
106
- {#if !interactive || (value?.[1] && value?.[0])}
79
+ {#if !gradio.shared.interactive || (gradio.props.value?.[1] && gradio.props.value?.[0])}
107
80
  <Block
108
- {visible}
81
+ visible={gradio.shared.visible}
109
82
  variant={"solid"}
110
83
  border_mode={dragging ? "focus" : "base"}
111
84
  padding={false}
112
- {elem_id}
113
- {elem_classes}
114
- height={height || undefined}
115
- {width}
85
+ elem_id={gradio.shared.elem_id}
86
+ elem_classes={gradio.shared.elem_classes}
87
+ height={gradio.props.height || undefined}
88
+ width={gradio.props.width}
116
89
  allow_overflow={false}
117
- {container}
118
- {scale}
119
- {min_width}
90
+ container={gradio.shared.container}
91
+ scale={gradio.shared.scale}
92
+ min_width={gradio.shared.min_width}
120
93
  bind:fullscreen
121
94
  >
122
95
  <StatusTracker
123
- autoscroll={gradio.autoscroll}
96
+ autoscroll={gradio.shared.autoscroll}
124
97
  i18n={gradio.i18n}
125
- {...loading_status}
98
+ {...gradio.shared.loading_status}
126
99
  />
127
100
  <StaticImage
128
101
  on:select={({ detail }) => gradio.dispatch("select", detail)}
@@ -133,49 +106,51 @@
133
106
  fullscreen = detail;
134
107
  }}
135
108
  {fullscreen}
136
- {interactive}
137
- bind:value
138
- {label}
139
- {show_label}
140
- show_download_button={buttons?.includes("download") ?? true}
109
+ interactive={gradio.shared.interactive}
110
+ bind:value={gradio.props.value}
111
+ label={gradio.shared.label}
112
+ show_label={gradio.shared.show_label}
113
+ show_download_button={gradio.props.buttons.includes("download")}
141
114
  i18n={gradio.i18n}
142
- show_fullscreen_button={buttons?.includes("fullscreen") ?? true}
115
+ show_fullscreen_button={gradio.props.buttons.includes("fullscreen")}
143
116
  position={normalised_slider_position}
144
- {slider_color}
145
- {max_height}
117
+ slider_color={gradio.props.slider_color}
118
+ max_height={gradio.props.max_height}
146
119
  />
147
120
  </Block>
148
121
  {:else}
149
122
  <Block
150
- {visible}
151
- variant={value === null ? "dashed" : "solid"}
123
+ visible={gradio.shared.visible}
124
+ variant={gradio.props.value === null ? "dashed" : "solid"}
152
125
  border_mode={dragging ? "focus" : "base"}
153
126
  padding={false}
154
- {elem_id}
155
- {elem_classes}
156
- height={height || undefined}
157
- {width}
127
+ elem_id={gradio.shared.elem_id}
128
+ elem_classes={gradio.shared.elem_classes}
129
+ height={gradio.props.height || undefined}
130
+ width={gradio.props.width}
158
131
  allow_overflow={false}
159
- {container}
160
- {scale}
161
- {min_width}
132
+ container={gradio.shared.container}
133
+ scale={gradio.shared.scale}
134
+ min_width={gradio.shared.min_width}
162
135
  on:dragenter={handle_drag_event}
163
136
  on:dragleave={handle_drag_event}
164
137
  on:dragover={handle_drag_event}
165
138
  on:drop={handle_drop}
166
139
  >
167
140
  <StatusTracker
168
- autoscroll={gradio.autoscroll}
141
+ autoscroll={gradio.shared.autoscroll}
169
142
  i18n={gradio.i18n}
170
- {...loading_status}
171
- on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
143
+ {...gradio.shared.loading_status}
144
+ on:clear_status={() =>
145
+ gradio.dispatch("clear_status", gradio.shared.loading_status)}
172
146
  />
173
147
 
174
148
  <ImageUploader
149
+ bind:upload_promise
175
150
  bind:this={upload_component}
176
- bind:value
151
+ bind:value={gradio.props.value}
177
152
  bind:dragging
178
- {root}
153
+ root={gradio.shared.root}
179
154
  on:edit={() => gradio.dispatch("edit")}
180
155
  on:clear={() => {
181
156
  gradio.dispatch("clear");
@@ -183,24 +158,28 @@
183
158
  on:drag={({ detail }) => (dragging = detail)}
184
159
  on:upload={() => gradio.dispatch("upload")}
185
160
  on:error={({ detail }) => {
186
- loading_status = loading_status || {};
187
- loading_status.status = "error";
161
+ if (gradio.shared.loading_status)
162
+ gradio.shared.loading_status.status = "error";
188
163
  gradio.dispatch("error", detail);
189
164
  }}
190
165
  on:close_stream={() => {
191
166
  gradio.dispatch("close_stream", "stream");
192
167
  }}
193
- {label}
194
- {show_label}
195
- {upload_count}
196
- max_file_size={gradio.max_file_size}
168
+ label={gradio.shared.label}
169
+ show_label={gradio.shared.show_label}
170
+ upload_count={gradio.props.upload_count}
171
+ max_file_size={gradio.shared.max_file_size}
197
172
  i18n={gradio.i18n}
198
- upload={(...args) => gradio.client.upload(...args)}
199
- stream_handler={gradio.client?.stream}
200
- {max_height}
173
+ upload={(...args) => gradio.shared.client.upload(...args)}
174
+ stream_handler={gradio.shared.client?.stream}
175
+ max_height={gradio.props.max_height}
201
176
  >
202
177
  {#if active_source === "upload" || !active_source}
203
- <UploadText i18n={gradio.i18n} type="image" {placeholder} />
178
+ <UploadText
179
+ i18n={gradio.i18n}
180
+ type="image"
181
+ placeholder={gradio.props.placeholder}
182
+ />
204
183
  {:else if active_source === "clipboard"}
205
184
  <UploadText i18n={gradio.i18n} type="clipboard" mode="short" />
206
185
  {:else}
@@ -1,7 +1,8 @@
1
- <script>export let value;
2
- export let samples_dir;
3
- export let type;
4
- export let selected = false;
1
+ <script lang="ts">
2
+ export let value: [string, string];
3
+ export let samples_dir: string;
4
+ export let type: "gallery" | "table";
5
+ export let selected = false;
5
6
  </script>
6
7
 
7
8
  <!-- TODO: fix -->
@@ -1,21 +1,23 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- value: [string, string];
5
- samples_dir: string;
6
- type: "gallery" | "table";
7
- selected?: boolean;
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: Props & {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
8
11
  };
9
- events: {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots: {};
13
- exports?: {} | undefined;
14
- bindings?: string | undefined;
15
- };
16
- export type ExampleProps = typeof __propDef.props;
17
- export type ExampleEvents = typeof __propDef.events;
18
- export type ExampleSlots = typeof __propDef.slots;
19
- export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
12
+ z_$$bindings?: Bindings;
20
13
  }
21
- export {};
14
+ declare const Example: $$__sveltets_2_IsomorphicComponent<{
15
+ value: [string, string];
16
+ samples_dir: string;
17
+ type: "gallery" | "table";
18
+ selected?: boolean;
19
+ }, {
20
+ [evt: string]: CustomEvent<any>;
21
+ }, {}, {}, string>;
22
+ type Example = InstanceType<typeof Example>;
23
+ export default Example;
package/dist/Index.svelte CHANGED
@@ -1,98 +1,101 @@
1
1
  <svelte:options accessors={true} />
2
2
 
3
- <script>import StaticImage from "./shared/SliderPreview.svelte";
4
- import ImageUploader from "./shared/SliderUpload.svelte";
5
- import { afterUpdate } from "svelte";
6
- import { Block, Empty, UploadText } from "@gradio/atoms";
7
- import { Image } from "@gradio/icons";
8
- import { StatusTracker } from "@gradio/statustracker";
9
- import {} from "@gradio/client";
10
- export let value_is_output = false;
11
- export let elem_id = "";
12
- export let elem_classes = [];
13
- export let visible = true;
14
- export let value = [null, null];
15
- let old_value = [null, null];
16
- export let label;
17
- export let show_label;
18
- export let buttons = null;
19
- export let root;
20
- export let height;
21
- export let width;
22
- export let container = true;
23
- export let scale = null;
24
- export let min_width = void 0;
25
- export let loading_status;
26
- export let interactive;
27
- export let placeholder = void 0;
28
- let fullscreen = false;
29
- export let input_ready;
30
- export let slider_position;
31
- export let upload_count = 1;
32
- export let slider_color = "var(--border-color-primary)";
33
- export let max_height;
34
- let uploading = false;
35
- $: normalised_slider_position = Math.max(0, Math.min(100, slider_position)) / 100;
36
- $: input_ready = !uploading;
37
- export let gradio;
38
- $: {
39
- if (JSON.stringify(value) !== JSON.stringify(old_value)) {
40
- old_value = value;
41
- gradio.dispatch("change");
42
- if (!value_is_output) {
43
- gradio.dispatch("input");
44
- }
45
- }
46
- }
47
- afterUpdate(() => {
48
- value_is_output = false;
49
- });
50
- let dragging;
51
- let active_source = null;
52
- let upload_component;
53
- const handle_drag_event = (event) => {
54
- const drag_event = event;
55
- drag_event.preventDefault();
56
- drag_event.stopPropagation();
57
- if (drag_event.type === "dragenter" || drag_event.type === "dragover") {
58
- dragging = true;
59
- } else if (drag_event.type === "dragleave") {
60
- dragging = false;
61
- }
62
- };
63
- const handle_drop = (event) => {
64
- if (interactive) {
65
- const drop_event = event;
66
- drop_event.preventDefault();
67
- drop_event.stopPropagation();
68
- dragging = false;
69
- if (upload_component) {
70
- upload_component.loadFilesFromDrop(drop_event);
71
- }
72
- }
73
- };
3
+ <script lang="ts">
4
+ import { tick } from "svelte";
5
+ import type { ImageSliderProps, ImageSliderEvents } from "./types";
6
+ import { Gradio } from "@gradio/utils";
7
+ import StaticImage from "./shared/SliderPreview.svelte";
8
+ import ImageUploader from "./shared/SliderUpload.svelte";
9
+
10
+ import { Block, Empty, UploadText } from "@gradio/atoms";
11
+ import { Image } from "@gradio/icons";
12
+ import { StatusTracker } from "@gradio/statustracker";
13
+
14
+ type sources = "upload" | "webcam" | "clipboard" | null;
15
+
16
+ let upload_promise = $state<Promise<any>>();
17
+
18
+ class ImageSliderGradio extends Gradio<ImageSliderEvents, ImageSliderProps> {
19
+ async get_data() {
20
+ if (upload_promise) {
21
+ await upload_promise;
22
+ await tick();
23
+ }
24
+
25
+ const data = await super.get_data();
26
+ return data;
27
+ }
28
+ }
29
+
30
+ const props = $props();
31
+ const gradio = new ImageSliderGradio(props);
32
+
33
+ let value_is_output = $state(false);
34
+ let old_value = $state(gradio.props.value);
35
+ let fullscreen = $state(false);
36
+ let dragging = $state(false);
37
+ let active_source: sources = $state(null);
38
+ let upload_component: ImageUploader;
39
+
40
+ let normalised_slider_position = $derived(
41
+ Math.max(0, Math.min(100, gradio.props.slider_position)) / 100
42
+ );
43
+
44
+ $effect(() => {
45
+ if (old_value != gradio.props.value) {
46
+ old_value = gradio.props.value;
47
+ gradio.dispatch("change");
48
+ if (!value_is_output) {
49
+ gradio.dispatch("input");
50
+ }
51
+ }
52
+ });
53
+
54
+ const handle_drag_event = (event: Event): void => {
55
+ const drag_event = event as DragEvent;
56
+ drag_event.preventDefault();
57
+ drag_event.stopPropagation();
58
+ if (drag_event.type === "dragenter" || drag_event.type === "dragover") {
59
+ dragging = true;
60
+ } else if (drag_event.type === "dragleave") {
61
+ dragging = false;
62
+ }
63
+ };
64
+
65
+ const handle_drop = (event: Event): void => {
66
+ if (gradio.shared.interactive) {
67
+ const drop_event = event as DragEvent;
68
+ drop_event.preventDefault();
69
+ drop_event.stopPropagation();
70
+ dragging = false;
71
+
72
+ if (upload_component) {
73
+ upload_component.loadFilesFromDrop(drop_event);
74
+ }
75
+ }
76
+ };
74
77
  </script>
75
78
 
76
- {#if !interactive || (value?.[1] && value?.[0])}
79
+ {#if !gradio.shared.interactive || (gradio.props.value?.[1] && gradio.props.value?.[0])}
77
80
  <Block
78
- {visible}
81
+ visible={gradio.shared.visible}
79
82
  variant={"solid"}
80
83
  border_mode={dragging ? "focus" : "base"}
81
84
  padding={false}
82
- {elem_id}
83
- {elem_classes}
84
- height={height || undefined}
85
- {width}
85
+ elem_id={gradio.shared.elem_id}
86
+ elem_classes={gradio.shared.elem_classes}
87
+ height={gradio.props.height || undefined}
88
+ width={gradio.props.width}
86
89
  allow_overflow={false}
87
- {container}
88
- {scale}
89
- {min_width}
90
+ container={gradio.shared.container}
91
+ scale={gradio.shared.scale}
92
+ min_width={gradio.shared.min_width}
90
93
  bind:fullscreen
91
94
  >
92
95
  <StatusTracker
93
- autoscroll={gradio.autoscroll}
96
+ autoscroll={gradio.shared.autoscroll}
94
97
  i18n={gradio.i18n}
95
- {...loading_status}
98
+ {...gradio.shared.loading_status}
96
99
  />
97
100
  <StaticImage
98
101
  on:select={({ detail }) => gradio.dispatch("select", detail)}
@@ -103,49 +106,51 @@ const handle_drop = (event) => {
103
106
  fullscreen = detail;
104
107
  }}
105
108
  {fullscreen}
106
- {interactive}
107
- bind:value
108
- {label}
109
- {show_label}
110
- show_download_button={buttons?.includes("download") ?? true}
109
+ interactive={gradio.shared.interactive}
110
+ bind:value={gradio.props.value}
111
+ label={gradio.shared.label}
112
+ show_label={gradio.shared.show_label}
113
+ show_download_button={gradio.props.buttons.includes("download")}
111
114
  i18n={gradio.i18n}
112
- show_fullscreen_button={buttons?.includes("fullscreen") ?? true}
115
+ show_fullscreen_button={gradio.props.buttons.includes("fullscreen")}
113
116
  position={normalised_slider_position}
114
- {slider_color}
115
- {max_height}
117
+ slider_color={gradio.props.slider_color}
118
+ max_height={gradio.props.max_height}
116
119
  />
117
120
  </Block>
118
121
  {:else}
119
122
  <Block
120
- {visible}
121
- variant={value === null ? "dashed" : "solid"}
123
+ visible={gradio.shared.visible}
124
+ variant={gradio.props.value === null ? "dashed" : "solid"}
122
125
  border_mode={dragging ? "focus" : "base"}
123
126
  padding={false}
124
- {elem_id}
125
- {elem_classes}
126
- height={height || undefined}
127
- {width}
127
+ elem_id={gradio.shared.elem_id}
128
+ elem_classes={gradio.shared.elem_classes}
129
+ height={gradio.props.height || undefined}
130
+ width={gradio.props.width}
128
131
  allow_overflow={false}
129
- {container}
130
- {scale}
131
- {min_width}
132
+ container={gradio.shared.container}
133
+ scale={gradio.shared.scale}
134
+ min_width={gradio.shared.min_width}
132
135
  on:dragenter={handle_drag_event}
133
136
  on:dragleave={handle_drag_event}
134
137
  on:dragover={handle_drag_event}
135
138
  on:drop={handle_drop}
136
139
  >
137
140
  <StatusTracker
138
- autoscroll={gradio.autoscroll}
141
+ autoscroll={gradio.shared.autoscroll}
139
142
  i18n={gradio.i18n}
140
- {...loading_status}
141
- on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
143
+ {...gradio.shared.loading_status}
144
+ on:clear_status={() =>
145
+ gradio.dispatch("clear_status", gradio.shared.loading_status)}
142
146
  />
143
147
 
144
148
  <ImageUploader
149
+ bind:upload_promise
145
150
  bind:this={upload_component}
146
- bind:value
151
+ bind:value={gradio.props.value}
147
152
  bind:dragging
148
- {root}
153
+ root={gradio.shared.root}
149
154
  on:edit={() => gradio.dispatch("edit")}
150
155
  on:clear={() => {
151
156
  gradio.dispatch("clear");
@@ -153,24 +158,28 @@ const handle_drop = (event) => {
153
158
  on:drag={({ detail }) => (dragging = detail)}
154
159
  on:upload={() => gradio.dispatch("upload")}
155
160
  on:error={({ detail }) => {
156
- loading_status = loading_status || {};
157
- loading_status.status = "error";
161
+ if (gradio.shared.loading_status)
162
+ gradio.shared.loading_status.status = "error";
158
163
  gradio.dispatch("error", detail);
159
164
  }}
160
165
  on:close_stream={() => {
161
166
  gradio.dispatch("close_stream", "stream");
162
167
  }}
163
- {label}
164
- {show_label}
165
- {upload_count}
166
- max_file_size={gradio.max_file_size}
168
+ label={gradio.shared.label}
169
+ show_label={gradio.shared.show_label}
170
+ upload_count={gradio.props.upload_count}
171
+ max_file_size={gradio.shared.max_file_size}
167
172
  i18n={gradio.i18n}
168
- upload={(...args) => gradio.client.upload(...args)}
169
- stream_handler={gradio.client?.stream}
170
- {max_height}
173
+ upload={(...args) => gradio.shared.client.upload(...args)}
174
+ stream_handler={gradio.shared.client?.stream}
175
+ max_height={gradio.props.max_height}
171
176
  >
172
177
  {#if active_source === "upload" || !active_source}
173
- <UploadText i18n={gradio.i18n} type="image" {placeholder} />
178
+ <UploadText
179
+ i18n={gradio.i18n}
180
+ type="image"
181
+ placeholder={gradio.props.placeholder}
182
+ />
174
183
  {:else if active_source === "clipboard"}
175
184
  <UploadText i18n={gradio.i18n} type="clipboard" mode="short" />
176
185
  {:else}