@gradio/imageslider 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1115 -0
- package/Example.svelte +69 -0
- package/Index.svelte +206 -0
- package/LICENSE +201 -0
- package/README.md +67 -0
- package/dist/Example.svelte +68 -0
- package/dist/Example.svelte.d.ts +19 -0
- package/dist/Index.svelte +178 -0
- package/dist/Index.svelte.d.ts +153 -0
- package/dist/img_01.png +0 -0
- package/dist/img_02.png +0 -0
- package/dist/img_03.png +0 -0
- package/dist/shared/ClearImage.svelte +28 -0
- package/dist/shared/ClearImage.svelte.d.ts +18 -0
- package/dist/shared/Image.svelte +208 -0
- package/dist/shared/Image.svelte.d.ts +41 -0
- package/dist/shared/ImageEl.svelte +119 -0
- package/dist/shared/ImageEl.svelte.d.ts +258 -0
- package/dist/shared/Slider.svelte +183 -0
- package/dist/shared/Slider.svelte.d.ts +28 -0
- package/dist/shared/SliderPreview.svelte +201 -0
- package/dist/shared/SliderPreview.svelte.d.ts +32 -0
- package/dist/shared/SliderUpload.svelte +41 -0
- package/dist/shared/SliderUpload.svelte.d.ts +71 -0
- package/dist/shared/zoom.d.ts +69 -0
- package/dist/shared/zoom.js +349 -0
- package/img_01.png +0 -0
- package/img_02.png +0 -0
- package/img_03.png +0 -0
- package/package.json +47 -0
- package/shared/ClearImage.svelte +30 -0
- package/shared/Image.svelte +235 -0
- package/shared/ImageEl.svelte +165 -0
- package/shared/Slider.svelte +200 -0
- package/shared/SliderPreview.svelte +229 -0
- package/shared/SliderUpload.svelte +46 -0
- package/shared/zoom.ts +487 -0
@@ -0,0 +1,178 @@
|
|
1
|
+
<svelte:options accessors={true} />
|
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 show_download_button;
|
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
|
+
export let show_fullscreen_button;
|
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
|
+
$:
|
36
|
+
normalised_slider_position = Math.max(0, Math.min(100, slider_position)) / 100;
|
37
|
+
$:
|
38
|
+
input_ready = !uploading;
|
39
|
+
export let gradio;
|
40
|
+
$: {
|
41
|
+
if (JSON.stringify(value) !== JSON.stringify(old_value)) {
|
42
|
+
old_value = value;
|
43
|
+
gradio.dispatch("change");
|
44
|
+
if (!value_is_output) {
|
45
|
+
gradio.dispatch("input");
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
afterUpdate(() => {
|
50
|
+
value_is_output = false;
|
51
|
+
});
|
52
|
+
let dragging;
|
53
|
+
let active_source = null;
|
54
|
+
let upload_component;
|
55
|
+
const handle_drag_event = (event) => {
|
56
|
+
const drag_event = event;
|
57
|
+
drag_event.preventDefault();
|
58
|
+
drag_event.stopPropagation();
|
59
|
+
if (drag_event.type === "dragenter" || drag_event.type === "dragover") {
|
60
|
+
dragging = true;
|
61
|
+
} else if (drag_event.type === "dragleave") {
|
62
|
+
dragging = false;
|
63
|
+
}
|
64
|
+
};
|
65
|
+
const handle_drop = (event) => {
|
66
|
+
if (interactive) {
|
67
|
+
const drop_event = event;
|
68
|
+
drop_event.preventDefault();
|
69
|
+
drop_event.stopPropagation();
|
70
|
+
dragging = false;
|
71
|
+
if (upload_component) {
|
72
|
+
upload_component.loadFilesFromDrop(drop_event);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
};
|
76
|
+
</script>
|
77
|
+
|
78
|
+
{#if !interactive || (value?.[1] && value?.[0])}
|
79
|
+
<Block
|
80
|
+
{visible}
|
81
|
+
variant={"solid"}
|
82
|
+
border_mode={dragging ? "focus" : "base"}
|
83
|
+
padding={false}
|
84
|
+
{elem_id}
|
85
|
+
{elem_classes}
|
86
|
+
height={height || undefined}
|
87
|
+
{width}
|
88
|
+
allow_overflow={false}
|
89
|
+
{container}
|
90
|
+
{scale}
|
91
|
+
{min_width}
|
92
|
+
>
|
93
|
+
<StatusTracker
|
94
|
+
autoscroll={gradio.autoscroll}
|
95
|
+
i18n={gradio.i18n}
|
96
|
+
{...loading_status}
|
97
|
+
/>
|
98
|
+
<StaticImage
|
99
|
+
on:select={({ detail }) => gradio.dispatch("select", detail)}
|
100
|
+
on:share={({ detail }) => gradio.dispatch("share", detail)}
|
101
|
+
on:error={({ detail }) => gradio.dispatch("error", detail)}
|
102
|
+
on:clear={() => gradio.dispatch("clear")}
|
103
|
+
{interactive}
|
104
|
+
bind:value
|
105
|
+
{label}
|
106
|
+
{show_label}
|
107
|
+
{show_download_button}
|
108
|
+
i18n={gradio.i18n}
|
109
|
+
{show_fullscreen_button}
|
110
|
+
position={normalised_slider_position}
|
111
|
+
{slider_color}
|
112
|
+
{max_height}
|
113
|
+
/>
|
114
|
+
</Block>
|
115
|
+
{:else}
|
116
|
+
<Block
|
117
|
+
{visible}
|
118
|
+
variant={value === null ? "dashed" : "solid"}
|
119
|
+
border_mode={dragging ? "focus" : "base"}
|
120
|
+
padding={false}
|
121
|
+
{elem_id}
|
122
|
+
{elem_classes}
|
123
|
+
height={height || undefined}
|
124
|
+
{width}
|
125
|
+
allow_overflow={false}
|
126
|
+
{container}
|
127
|
+
{scale}
|
128
|
+
{min_width}
|
129
|
+
on:dragenter={handle_drag_event}
|
130
|
+
on:dragleave={handle_drag_event}
|
131
|
+
on:dragover={handle_drag_event}
|
132
|
+
on:drop={handle_drop}
|
133
|
+
>
|
134
|
+
<StatusTracker
|
135
|
+
autoscroll={gradio.autoscroll}
|
136
|
+
i18n={gradio.i18n}
|
137
|
+
{...loading_status}
|
138
|
+
on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
|
139
|
+
/>
|
140
|
+
|
141
|
+
<ImageUploader
|
142
|
+
bind:this={upload_component}
|
143
|
+
bind:value
|
144
|
+
bind:dragging
|
145
|
+
{root}
|
146
|
+
on:edit={() => gradio.dispatch("edit")}
|
147
|
+
on:clear={() => {
|
148
|
+
gradio.dispatch("clear");
|
149
|
+
}}
|
150
|
+
on:drag={({ detail }) => (dragging = detail)}
|
151
|
+
on:upload={() => gradio.dispatch("upload")}
|
152
|
+
on:error={({ detail }) => {
|
153
|
+
loading_status = loading_status || {};
|
154
|
+
loading_status.status = "error";
|
155
|
+
gradio.dispatch("error", detail);
|
156
|
+
}}
|
157
|
+
on:close_stream={() => {
|
158
|
+
gradio.dispatch("close_stream", "stream");
|
159
|
+
}}
|
160
|
+
{label}
|
161
|
+
{show_label}
|
162
|
+
{upload_count}
|
163
|
+
max_file_size={gradio.max_file_size}
|
164
|
+
i18n={gradio.i18n}
|
165
|
+
upload={(...args) => gradio.client.upload(...args)}
|
166
|
+
stream_handler={gradio.client?.stream}
|
167
|
+
{max_height}
|
168
|
+
>
|
169
|
+
{#if active_source === "upload" || !active_source}
|
170
|
+
<UploadText i18n={gradio.i18n} type="image" {placeholder} />
|
171
|
+
{:else if active_source === "clipboard"}
|
172
|
+
<UploadText i18n={gradio.i18n} type="clipboard" mode="short" />
|
173
|
+
{:else}
|
174
|
+
<Empty unpadded_box={true} size="large"><Image /></Empty>
|
175
|
+
{/if}
|
176
|
+
</ImageUploader>
|
177
|
+
</Block>
|
178
|
+
{/if}
|
@@ -0,0 +1,153 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import type { Gradio, SelectData, ValueData } from "@gradio/utils";
|
3
|
+
import { type FileData } from "@gradio/client";
|
4
|
+
import type { LoadingStatus } from "@gradio/statustracker";
|
5
|
+
declare const __propDef: {
|
6
|
+
props: {
|
7
|
+
value_is_output?: boolean | undefined;
|
8
|
+
elem_id?: string | undefined;
|
9
|
+
elem_classes?: string[] | undefined;
|
10
|
+
visible?: boolean | undefined;
|
11
|
+
value?: [FileData | null, FileData | null] | undefined;
|
12
|
+
label: string;
|
13
|
+
show_label: boolean;
|
14
|
+
show_download_button: boolean;
|
15
|
+
root: string;
|
16
|
+
height: number | undefined;
|
17
|
+
width: number | undefined;
|
18
|
+
container?: boolean | undefined;
|
19
|
+
scale?: (number | null) | undefined;
|
20
|
+
min_width?: number | undefined;
|
21
|
+
loading_status: LoadingStatus;
|
22
|
+
interactive: boolean;
|
23
|
+
placeholder?: string | undefined;
|
24
|
+
show_fullscreen_button: boolean;
|
25
|
+
input_ready: boolean;
|
26
|
+
slider_position: number;
|
27
|
+
upload_count?: number | undefined;
|
28
|
+
slider_color?: string | undefined;
|
29
|
+
max_height: number;
|
30
|
+
gradio: Gradio<{
|
31
|
+
input: never;
|
32
|
+
change: never;
|
33
|
+
error: string;
|
34
|
+
edit: never;
|
35
|
+
stream: ValueData;
|
36
|
+
drag: never;
|
37
|
+
upload: never;
|
38
|
+
clear: never;
|
39
|
+
select: SelectData;
|
40
|
+
share: ShareData;
|
41
|
+
clear_status: LoadingStatus;
|
42
|
+
close_stream: string;
|
43
|
+
}>;
|
44
|
+
};
|
45
|
+
events: {
|
46
|
+
[evt: string]: CustomEvent<any>;
|
47
|
+
};
|
48
|
+
slots: {};
|
49
|
+
};
|
50
|
+
export type IndexProps = typeof __propDef.props;
|
51
|
+
export type IndexEvents = typeof __propDef.events;
|
52
|
+
export type IndexSlots = typeof __propDef.slots;
|
53
|
+
export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
|
54
|
+
get value_is_output(): boolean | undefined;
|
55
|
+
/**accessor*/
|
56
|
+
set value_is_output(_: boolean | undefined);
|
57
|
+
get elem_id(): string | undefined;
|
58
|
+
/**accessor*/
|
59
|
+
set elem_id(_: string | undefined);
|
60
|
+
get elem_classes(): string[] | undefined;
|
61
|
+
/**accessor*/
|
62
|
+
set elem_classes(_: string[] | undefined);
|
63
|
+
get visible(): boolean | undefined;
|
64
|
+
/**accessor*/
|
65
|
+
set visible(_: boolean | undefined);
|
66
|
+
get value(): [any, any] | undefined;
|
67
|
+
/**accessor*/
|
68
|
+
set value(_: [any, any] | undefined);
|
69
|
+
get label(): string;
|
70
|
+
/**accessor*/
|
71
|
+
set label(_: string);
|
72
|
+
get show_label(): boolean;
|
73
|
+
/**accessor*/
|
74
|
+
set show_label(_: boolean);
|
75
|
+
get show_download_button(): boolean;
|
76
|
+
/**accessor*/
|
77
|
+
set show_download_button(_: boolean);
|
78
|
+
get root(): string;
|
79
|
+
/**accessor*/
|
80
|
+
set root(_: string);
|
81
|
+
get height(): number | undefined;
|
82
|
+
/**accessor*/
|
83
|
+
set height(_: number | undefined);
|
84
|
+
get width(): number | undefined;
|
85
|
+
/**accessor*/
|
86
|
+
set width(_: number | undefined);
|
87
|
+
get container(): boolean | undefined;
|
88
|
+
/**accessor*/
|
89
|
+
set container(_: boolean | undefined);
|
90
|
+
get scale(): number | null | undefined;
|
91
|
+
/**accessor*/
|
92
|
+
set scale(_: number | null | undefined);
|
93
|
+
get min_width(): number | undefined;
|
94
|
+
/**accessor*/
|
95
|
+
set min_width(_: number | undefined);
|
96
|
+
get loading_status(): LoadingStatus;
|
97
|
+
/**accessor*/
|
98
|
+
set loading_status(_: LoadingStatus);
|
99
|
+
get interactive(): boolean;
|
100
|
+
/**accessor*/
|
101
|
+
set interactive(_: boolean);
|
102
|
+
get placeholder(): string | undefined;
|
103
|
+
/**accessor*/
|
104
|
+
set placeholder(_: string | undefined);
|
105
|
+
get show_fullscreen_button(): boolean;
|
106
|
+
/**accessor*/
|
107
|
+
set show_fullscreen_button(_: boolean);
|
108
|
+
get input_ready(): boolean;
|
109
|
+
/**accessor*/
|
110
|
+
set input_ready(_: boolean);
|
111
|
+
get slider_position(): number;
|
112
|
+
/**accessor*/
|
113
|
+
set slider_position(_: number);
|
114
|
+
get upload_count(): number | undefined;
|
115
|
+
/**accessor*/
|
116
|
+
set upload_count(_: number | undefined);
|
117
|
+
get slider_color(): string | undefined;
|
118
|
+
/**accessor*/
|
119
|
+
set slider_color(_: string | undefined);
|
120
|
+
get max_height(): number;
|
121
|
+
/**accessor*/
|
122
|
+
set max_height(_: number);
|
123
|
+
get gradio(): Gradio<{
|
124
|
+
input: never;
|
125
|
+
change: never;
|
126
|
+
error: string;
|
127
|
+
edit: never;
|
128
|
+
stream: ValueData;
|
129
|
+
drag: never;
|
130
|
+
upload: never;
|
131
|
+
clear: never;
|
132
|
+
select: SelectData;
|
133
|
+
share: ShareData;
|
134
|
+
clear_status: LoadingStatus;
|
135
|
+
close_stream: string;
|
136
|
+
}>;
|
137
|
+
/**accessor*/
|
138
|
+
set gradio(_: Gradio<{
|
139
|
+
input: never;
|
140
|
+
change: never;
|
141
|
+
error: string;
|
142
|
+
edit: never;
|
143
|
+
stream: ValueData;
|
144
|
+
drag: never;
|
145
|
+
upload: never;
|
146
|
+
clear: never;
|
147
|
+
select: SelectData;
|
148
|
+
share: ShareData;
|
149
|
+
clear_status: LoadingStatus;
|
150
|
+
close_stream: string;
|
151
|
+
}>);
|
152
|
+
}
|
153
|
+
export {};
|
package/dist/img_01.png
ADDED
Binary file
|
package/dist/img_02.png
ADDED
Binary file
|
package/dist/img_03.png
ADDED
Binary file
|
@@ -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,208 @@
|
|
1
|
+
<script>import Slider from "./Slider.svelte";
|
2
|
+
import { createEventDispatcher, tick } from "svelte";
|
3
|
+
import { BlockLabel, Empty, IconButton } from "@gradio/atoms";
|
4
|
+
import { Download } from "@gradio/icons";
|
5
|
+
import { Image } from "@gradio/icons";
|
6
|
+
import {} from "@gradio/utils";
|
7
|
+
import ClearImage from "./ClearImage.svelte";
|
8
|
+
import ImageEl from "./ImageEl.svelte";
|
9
|
+
import { Upload } from "@gradio/upload";
|
10
|
+
import { DownloadLink } from "@gradio/wasm/svelte";
|
11
|
+
import {} from "@gradio/client";
|
12
|
+
export let value;
|
13
|
+
export let label = void 0;
|
14
|
+
export let show_label;
|
15
|
+
export let root;
|
16
|
+
export let position;
|
17
|
+
export let upload_count = 2;
|
18
|
+
export let show_download_button = true;
|
19
|
+
export let slider_color;
|
20
|
+
export let upload;
|
21
|
+
export let stream_handler;
|
22
|
+
export let max_file_size = null;
|
23
|
+
export let i18n;
|
24
|
+
export let max_height;
|
25
|
+
let value_ = value || [null, null];
|
26
|
+
let img;
|
27
|
+
let el_width;
|
28
|
+
let el_height;
|
29
|
+
async function handle_upload({ detail }, n) {
|
30
|
+
const new_value = [value[0], value[1]];
|
31
|
+
if (detail.length > 1) {
|
32
|
+
new_value[n] = detail[0];
|
33
|
+
} else {
|
34
|
+
new_value[n] = detail[n];
|
35
|
+
}
|
36
|
+
value = new_value;
|
37
|
+
await tick();
|
38
|
+
dispatch("upload", new_value);
|
39
|
+
}
|
40
|
+
let old_value = "";
|
41
|
+
$:
|
42
|
+
if (JSON.stringify(value) !== old_value) {
|
43
|
+
old_value = JSON.stringify(value);
|
44
|
+
value_ = value;
|
45
|
+
}
|
46
|
+
const dispatch = createEventDispatcher();
|
47
|
+
export let dragging = false;
|
48
|
+
$:
|
49
|
+
dispatch("drag", dragging);
|
50
|
+
</script>
|
51
|
+
|
52
|
+
<BlockLabel {show_label} Icon={Image} label={label || i18n("image.image")} />
|
53
|
+
|
54
|
+
<div
|
55
|
+
data-testid="image"
|
56
|
+
class="image-container"
|
57
|
+
bind:clientWidth={el_width}
|
58
|
+
bind:clientHeight={el_height}
|
59
|
+
>
|
60
|
+
{#if value?.[0]?.url || value?.[1]?.url}
|
61
|
+
<ClearImage
|
62
|
+
on:remove_image={() => {
|
63
|
+
position = 0.5;
|
64
|
+
value = [null, null];
|
65
|
+
dispatch("clear");
|
66
|
+
}}
|
67
|
+
/>
|
68
|
+
{/if}
|
69
|
+
{#if value?.[1]?.url}
|
70
|
+
<div class="icon-buttons">
|
71
|
+
{#if show_download_button}
|
72
|
+
<DownloadLink
|
73
|
+
href={value[1].url}
|
74
|
+
download={value[1].orig_name || "image"}
|
75
|
+
>
|
76
|
+
<IconButton Icon={Download} />
|
77
|
+
</DownloadLink>
|
78
|
+
{/if}
|
79
|
+
</div>
|
80
|
+
{/if}
|
81
|
+
<Slider
|
82
|
+
bind:position
|
83
|
+
disabled={upload_count == 2 || !value?.[0]}
|
84
|
+
{slider_color}
|
85
|
+
>
|
86
|
+
<div
|
87
|
+
class="upload-wrap"
|
88
|
+
style:display={upload_count === 2 ? "flex" : "block"}
|
89
|
+
class:side-by-side={upload_count === 2}
|
90
|
+
>
|
91
|
+
{#if !value_?.[0]}
|
92
|
+
<div class="wrap" class:half-wrap={upload_count === 1}>
|
93
|
+
<Upload
|
94
|
+
bind:dragging
|
95
|
+
filetype="image/*"
|
96
|
+
on:load={(e) => handle_upload(e, 0)}
|
97
|
+
disable_click={!!value?.[0]}
|
98
|
+
{root}
|
99
|
+
file_count="multiple"
|
100
|
+
{upload}
|
101
|
+
{stream_handler}
|
102
|
+
{max_file_size}
|
103
|
+
>
|
104
|
+
<slot />
|
105
|
+
</Upload>
|
106
|
+
</div>
|
107
|
+
{:else}
|
108
|
+
<ImageEl
|
109
|
+
variant="upload"
|
110
|
+
src={value_[0]?.url}
|
111
|
+
alt=""
|
112
|
+
bind:img_el={img}
|
113
|
+
{max_height}
|
114
|
+
/>
|
115
|
+
{/if}
|
116
|
+
|
117
|
+
{#if !value_?.[1] && upload_count === 2}
|
118
|
+
<Upload
|
119
|
+
bind:dragging
|
120
|
+
filetype="image/*"
|
121
|
+
on:load={(e) => handle_upload(e, 1)}
|
122
|
+
disable_click={!!value?.[1]}
|
123
|
+
{root}
|
124
|
+
file_count="multiple"
|
125
|
+
{upload}
|
126
|
+
{stream_handler}
|
127
|
+
{max_file_size}
|
128
|
+
>
|
129
|
+
<slot />
|
130
|
+
</Upload>
|
131
|
+
{:else if !value_?.[1] && upload_count === 1}
|
132
|
+
<div
|
133
|
+
class="empty-wrap fixed"
|
134
|
+
style:width="{el_width * (1 - position)}px"
|
135
|
+
style:transform="translateX({el_width * position}px)"
|
136
|
+
class:white-icon={!value?.[0]?.url}
|
137
|
+
>
|
138
|
+
<Empty unpadded_box={true} size="large"><Image /></Empty>
|
139
|
+
</div>
|
140
|
+
{:else if value_?.[1]}
|
141
|
+
<ImageEl
|
142
|
+
variant="upload"
|
143
|
+
src={value_[1].url}
|
144
|
+
alt=""
|
145
|
+
fixed={upload_count === 1}
|
146
|
+
transform="translate(0px, 0px) scale(1)"
|
147
|
+
{max_height}
|
148
|
+
/>
|
149
|
+
{/if}
|
150
|
+
</div>
|
151
|
+
</Slider>
|
152
|
+
</div>
|
153
|
+
|
154
|
+
<style>
|
155
|
+
.upload-wrap {
|
156
|
+
display: flex;
|
157
|
+
justify-content: center;
|
158
|
+
align-items: center;
|
159
|
+
height: 100%;
|
160
|
+
width: 100%;
|
161
|
+
}
|
162
|
+
|
163
|
+
.wrap {
|
164
|
+
width: 100%;
|
165
|
+
}
|
166
|
+
|
167
|
+
.half-wrap {
|
168
|
+
width: 50%;
|
169
|
+
}
|
170
|
+
.image-container,
|
171
|
+
.empty-wrap {
|
172
|
+
width: var(--size-full);
|
173
|
+
height: var(--size-full);
|
174
|
+
}
|
175
|
+
|
176
|
+
.fixed {
|
177
|
+
--anim-block-background-fill: 255, 255, 255;
|
178
|
+
position: absolute;
|
179
|
+
top: 0;
|
180
|
+
left: 0;
|
181
|
+
background-color: rgba(var(--anim-block-background-fill), 0.8);
|
182
|
+
z-index: 0;
|
183
|
+
}
|
184
|
+
|
185
|
+
@media (prefers-color-scheme: dark) {
|
186
|
+
.fixed {
|
187
|
+
--anim-block-background-fill: 31, 41, 55;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
.side-by-side :global(img) {
|
192
|
+
/* width: 100%; */
|
193
|
+
width: 50%;
|
194
|
+
object-fit: contain;
|
195
|
+
}
|
196
|
+
|
197
|
+
.empty-wrap {
|
198
|
+
pointer-events: none;
|
199
|
+
}
|
200
|
+
|
201
|
+
.icon-buttons {
|
202
|
+
display: flex;
|
203
|
+
position: absolute;
|
204
|
+
right: 8px;
|
205
|
+
z-index: var(--layer-top);
|
206
|
+
top: 8px;
|
207
|
+
}
|
208
|
+
</style>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
2
|
+
import { type SelectData, type I18nFormatter } from "@gradio/utils";
|
3
|
+
import { type FileData, type Client } from "@gradio/client";
|
4
|
+
declare const __propDef: {
|
5
|
+
props: {
|
6
|
+
value: [FileData | null, FileData | null];
|
7
|
+
label?: string | undefined;
|
8
|
+
show_label: boolean;
|
9
|
+
root: string;
|
10
|
+
position: number;
|
11
|
+
upload_count?: number | undefined;
|
12
|
+
show_download_button?: boolean | undefined;
|
13
|
+
slider_color: string;
|
14
|
+
upload: Client["upload"];
|
15
|
+
stream_handler: Client["stream"];
|
16
|
+
max_file_size?: (number | null) | undefined;
|
17
|
+
i18n: I18nFormatter;
|
18
|
+
max_height: number;
|
19
|
+
dragging?: boolean | undefined;
|
20
|
+
};
|
21
|
+
events: {
|
22
|
+
change: CustomEvent<string | null>;
|
23
|
+
stream: CustomEvent<string | null>;
|
24
|
+
edit: CustomEvent<undefined>;
|
25
|
+
clear: CustomEvent<undefined>;
|
26
|
+
drag: CustomEvent<boolean>;
|
27
|
+
upload: CustomEvent<[any, any]>;
|
28
|
+
select: CustomEvent<SelectData>;
|
29
|
+
} & {
|
30
|
+
[evt: string]: CustomEvent<any>;
|
31
|
+
};
|
32
|
+
slots: {
|
33
|
+
default: {};
|
34
|
+
};
|
35
|
+
};
|
36
|
+
export type ImageProps = typeof __propDef.props;
|
37
|
+
export type ImageEvents = typeof __propDef.events;
|
38
|
+
export type ImageSlots = typeof __propDef.slots;
|
39
|
+
export default class Image extends SvelteComponent<ImageProps, ImageEvents, ImageSlots> {
|
40
|
+
}
|
41
|
+
export {};
|