@gradio/imageslider 0.3.1-dev.0 → 0.3.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.
@@ -1,61 +1,83 @@
1
- <script>import { onMount } from "svelte";
2
- import { drag } from "d3-drag";
3
- import { select } from "d3-selection";
4
- function clamp(value, min, max) {
5
- return Math.min(Math.max(value, min), max);
6
- }
7
- export let position = 0.5;
8
- export let disabled = false;
9
- export let slider_color = "var(--border-color-primary)";
10
- export let image_size = { top: 0, left: 0, width: 0, height: 0 };
11
- export let el = void 0;
12
- export let parent_el = void 0;
13
- let inner;
14
- let px = 0;
15
- let active = false;
16
- let container_width = 0;
17
- function set_position(width) {
18
- container_width = parent_el?.getBoundingClientRect().width || 0;
19
- if (width === 0) {
20
- image_size.width = el?.getBoundingClientRect().width || 0;
21
- }
22
- px = clamp(
23
- image_size.width * position + image_size.left,
24
- 0,
25
- container_width
26
- );
27
- }
28
- function round(n, points) {
29
- const mod = Math.pow(10, points);
30
- return Math.round((n + Number.EPSILON) * mod) / mod;
31
- }
32
- function update_position(x) {
33
- px = clamp(x, 0, container_width);
34
- position = round((x - image_size.left) / image_size.width, 5);
35
- }
36
- function drag_start(event) {
37
- if (disabled) return;
38
- active = true;
39
- update_position(event.x);
40
- }
41
- function drag_move(event) {
42
- if (disabled) return;
43
- update_position(event.x);
44
- }
45
- function drag_end() {
46
- if (disabled) return;
47
- active = false;
48
- }
49
- function update_position_from_pc(pc) {
50
- px = clamp(image_size.width * pc + image_size.left, 0, container_width);
51
- }
52
- $: set_position(image_size.width);
53
- $: update_position_from_pc(position);
54
- onMount(() => {
55
- set_position(image_size.width);
56
- const drag_handler = drag().on("start", drag_start).on("drag", drag_move).on("end", drag_end);
57
- select(inner).call(drag_handler);
58
- });
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+ import { drag } from "d3-drag";
4
+ import { select } from "d3-selection";
5
+
6
+ function clamp(value: number, min: number, max: number): number {
7
+ return Math.min(Math.max(value, min), max);
8
+ }
9
+
10
+ export let position = 0.5;
11
+ export let disabled = false;
12
+
13
+ export let slider_color = "var(--border-color-primary)";
14
+ export let image_size: {
15
+ top: number;
16
+ left: number;
17
+ width: number;
18
+ height: number;
19
+ } = { top: 0, left: 0, width: 0, height: 0 };
20
+ export let el: HTMLDivElement | undefined = undefined;
21
+ export let parent_el: HTMLDivElement | undefined = undefined;
22
+ let inner: Element;
23
+ let px = 0;
24
+ let active = false;
25
+ let container_width = 0;
26
+
27
+ function set_position(width: number): void {
28
+ container_width = parent_el?.getBoundingClientRect().width || 0;
29
+ if (width === 0) {
30
+ image_size.width = el?.getBoundingClientRect().width || 0;
31
+ }
32
+
33
+ px = clamp(
34
+ image_size.width * position + image_size.left,
35
+ 0,
36
+ container_width
37
+ );
38
+ }
39
+
40
+ function round(n: number, points: number): number {
41
+ const mod = Math.pow(10, points);
42
+ return Math.round((n + Number.EPSILON) * mod) / mod;
43
+ }
44
+
45
+ function update_position(x: number): void {
46
+ px = clamp(x, 0, container_width);
47
+ position = round((x - image_size.left) / image_size.width, 5);
48
+ }
49
+
50
+ function drag_start(event: any): void {
51
+ if (disabled) return;
52
+ active = true;
53
+ update_position(event.x);
54
+ }
55
+
56
+ function drag_move(event: any): void {
57
+ if (disabled) return;
58
+ update_position(event.x);
59
+ }
60
+
61
+ function drag_end(): void {
62
+ if (disabled) return;
63
+ active = false;
64
+ }
65
+
66
+ function update_position_from_pc(pc: number): void {
67
+ px = clamp(image_size.width * pc + image_size.left, 0, container_width);
68
+ }
69
+
70
+ $: set_position(image_size.width);
71
+ $: update_position_from_pc(position);
72
+
73
+ onMount(() => {
74
+ set_position(image_size.width);
75
+ const drag_handler = drag()
76
+ .on("start", drag_start)
77
+ .on("drag", drag_move)
78
+ .on("end", drag_end);
79
+ select(inner).call(drag_handler);
80
+ });
59
81
  </script>
60
82
 
61
83
  <svelte:window on:resize={() => set_position(image_size.width)} />
@@ -1,30 +1,39 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- position?: number;
5
- disabled?: boolean;
6
- slider_color?: string;
7
- image_size?: {
8
- top: number;
9
- left: number;
10
- width: number;
11
- height: number;
12
- };
13
- el?: HTMLDivElement | undefined;
14
- parent_el?: HTMLDivElement | undefined;
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;
15
11
  };
16
- events: {
17
- [evt: string]: CustomEvent<any>;
18
- };
19
- slots: {
20
- default: {};
21
- };
22
- exports?: {} | undefined;
23
- bindings?: string | undefined;
24
- };
25
- export type SliderProps = typeof __propDef.props;
26
- export type SliderEvents = typeof __propDef.events;
27
- export type SliderSlots = typeof __propDef.slots;
28
- export default class Slider extends SvelteComponent<SliderProps, SliderEvents, SliderSlots> {
12
+ z_$$bindings?: Bindings;
29
13
  }
30
- export {};
14
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
15
+ default: any;
16
+ } ? Props extends Record<string, never> ? any : {
17
+ children?: any;
18
+ } : {});
19
+ declare const Slider: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
20
+ position?: number;
21
+ disabled?: boolean;
22
+ slider_color?: string;
23
+ image_size?: {
24
+ top: number;
25
+ left: number;
26
+ width: number;
27
+ height: number;
28
+ };
29
+ el?: HTMLDivElement | undefined;
30
+ parent_el?: HTMLDivElement | undefined;
31
+ }, {
32
+ default: {};
33
+ }>, {
34
+ [evt: string]: CustomEvent<any>;
35
+ }, {
36
+ default: {};
37
+ }, {}, string>;
38
+ type Slider = InstanceType<typeof Slider>;
39
+ export default Slider;
@@ -1,99 +1,131 @@
1
- <script>import Slider from "./Slider.svelte";
2
- import ImageEl from "./ImageEl.svelte";
3
- import {
4
- BlockLabel,
5
- Empty,
6
- IconButton,
7
- IconButtonWrapper,
8
- FullscreenButton,
9
- DownloadLink
10
- } from "@gradio/atoms";
11
- import { Image, Download, Undo, Clear } from "@gradio/icons";
12
- import {} from "@gradio/client";
13
- import { ZoomableImage } from "./zoom";
14
- import { onMount } from "svelte";
15
- import { tweened } from "svelte/motion";
16
- import { createEventDispatcher } from "svelte";
17
- export let value = [null, null];
18
- export let label = void 0;
19
- export let show_download_button = true;
20
- export let show_label;
21
- export let i18n;
22
- export let position;
23
- export let layer_images = true;
24
- export let show_single = false;
25
- export let slider_color;
26
- export let show_fullscreen_button = true;
27
- export let fullscreen = false;
28
- export let el_width = 0;
29
- export let max_height;
30
- export let interactive = true;
31
- const dispatch = createEventDispatcher();
32
- let img;
33
- let slider_wrap;
34
- let image_container;
35
- let transform = tweened(
36
- { x: 0, y: 0, z: 1 },
37
- {
38
- duration: 75
39
- }
40
- );
41
- let parent_el;
42
- $: coords_at_viewport = get_coords_at_viewport(
43
- position,
44
- viewport_width,
45
- image_size.width,
46
- image_size.left,
47
- $transform.x,
48
- $transform.z
49
- );
50
- $: style = layer_images ? `clip-path: inset(0 0 0 ${coords_at_viewport * 100}%)` : "";
51
- function get_coords_at_viewport(viewport_percent_x, viewportWidth, image_width, img_offset_x, tx, scale) {
52
- const px_relative_to_image = viewport_percent_x * image_width;
53
- const pixel_position = px_relative_to_image + img_offset_x;
54
- const normalised_position = (pixel_position - tx) / scale;
55
- const percent_position = normalised_position / viewportWidth;
56
- return percent_position;
57
- }
58
- let img_width = 0;
59
- let viewport_width = 0;
60
- let zoomable_image = null;
61
- let observer = null;
62
- function init_image(img2, slider_wrap2) {
63
- if (!img2 || !slider_wrap2) return;
64
- zoomable_image?.destroy();
65
- observer?.disconnect();
66
- img_width = img2?.getBoundingClientRect().width || 0;
67
- viewport_width = slider_wrap2?.getBoundingClientRect().width || 0;
68
- zoomable_image = new ZoomableImage(slider_wrap2, img2);
69
- zoomable_image.subscribe(({ x, y, scale }) => {
70
- transform.set({ x, y, z: scale });
71
- });
72
- observer = new ResizeObserver((entries) => {
73
- for (const entry of entries) {
74
- if (entry.target === slider_wrap2) {
75
- viewport_width = entry.contentRect.width;
76
- }
77
- if (entry.target === img2) {
78
- img_width = entry.contentRect.width;
79
- }
80
- }
81
- });
82
- observer.observe(slider_wrap2);
83
- observer.observe(img2);
84
- }
85
- $: init_image(img, slider_wrap);
86
- onMount(() => {
87
- return () => {
88
- zoomable_image?.destroy();
89
- observer?.disconnect();
90
- };
91
- });
92
- let slider_wrap_parent;
93
- let image_size = { top: 0, left: 0, width: 0, height: 0 };
94
- function handle_image_load(event) {
95
- image_size = event.detail;
96
- }
1
+ <script lang="ts">
2
+ import Slider from "./Slider.svelte";
3
+ import ImageEl from "./ImageEl.svelte";
4
+ import {
5
+ BlockLabel,
6
+ Empty,
7
+ IconButton,
8
+ IconButtonWrapper,
9
+ FullscreenButton,
10
+ DownloadLink
11
+ } from "@gradio/atoms";
12
+ import { Image, Download, Undo, Clear } from "@gradio/icons";
13
+ import { type FileData } from "@gradio/client";
14
+ import type { I18nFormatter } from "@gradio/utils";
15
+ import { ZoomableImage } from "./zoom";
16
+ import { onMount } from "svelte";
17
+ import { tweened, type Tweened } from "svelte/motion";
18
+ import { createEventDispatcher } from "svelte";
19
+
20
+ export let value: [null | FileData, null | FileData] = [null, null];
21
+ export let label: string | undefined = undefined;
22
+ export let show_download_button = true;
23
+ export let show_label: boolean;
24
+ export let i18n: I18nFormatter;
25
+ export let position: number;
26
+ export let layer_images = true;
27
+ export let show_single = false;
28
+ export let slider_color: string;
29
+ export let show_fullscreen_button = true;
30
+ export let fullscreen = false;
31
+ export let el_width = 0;
32
+ export let max_height: number;
33
+ export let interactive = true;
34
+ const dispatch = createEventDispatcher<{ clear: void }>();
35
+
36
+ let img: HTMLImageElement;
37
+ let slider_wrap: HTMLDivElement;
38
+ let image_container: HTMLDivElement;
39
+
40
+ let transform: Tweened<{ x: number; y: number; z: number }> = tweened(
41
+ { x: 0, y: 0, z: 1 },
42
+ {
43
+ duration: 75
44
+ }
45
+ );
46
+ let parent_el: HTMLDivElement;
47
+
48
+ $: coords_at_viewport = get_coords_at_viewport(
49
+ position,
50
+ viewport_width,
51
+ image_size.width,
52
+ image_size.left,
53
+ $transform.x,
54
+ $transform.z
55
+ );
56
+ $: style = layer_images
57
+ ? `clip-path: inset(0 0 0 ${coords_at_viewport * 100}%)`
58
+ : "";
59
+
60
+ function get_coords_at_viewport(
61
+ viewport_percent_x: number, // 0-1
62
+ viewportWidth: number,
63
+ image_width: number,
64
+ img_offset_x: number,
65
+ tx: number, // image translation x (in pixels)
66
+ scale: number // image scale (uniform)
67
+ ): number {
68
+ const px_relative_to_image = viewport_percent_x * image_width;
69
+ const pixel_position = px_relative_to_image + img_offset_x;
70
+
71
+ const normalised_position = (pixel_position - tx) / scale;
72
+ const percent_position = normalised_position / viewportWidth;
73
+
74
+ return percent_position;
75
+ }
76
+
77
+ let img_width = 0;
78
+ let viewport_width = 0;
79
+
80
+ let zoomable_image: ZoomableImage | null = null;
81
+ let observer: ResizeObserver | null = null;
82
+
83
+ function init_image(
84
+ img: HTMLImageElement,
85
+ slider_wrap: HTMLDivElement
86
+ ): void {
87
+ if (!img || !slider_wrap) return;
88
+ zoomable_image?.destroy();
89
+ observer?.disconnect();
90
+ img_width = img?.getBoundingClientRect().width || 0;
91
+ viewport_width = slider_wrap?.getBoundingClientRect().width || 0;
92
+ zoomable_image = new ZoomableImage(slider_wrap, img);
93
+ zoomable_image.subscribe(({ x, y, scale }) => {
94
+ transform.set({ x, y, z: scale });
95
+ });
96
+
97
+ observer = new ResizeObserver((entries) => {
98
+ for (const entry of entries) {
99
+ if (entry.target === slider_wrap) {
100
+ viewport_width = entry.contentRect.width;
101
+ }
102
+
103
+ if (entry.target === img) {
104
+ img_width = entry.contentRect.width;
105
+ }
106
+ }
107
+ });
108
+ observer.observe(slider_wrap);
109
+ observer.observe(img);
110
+ }
111
+
112
+ $: init_image(img, slider_wrap);
113
+
114
+ onMount(() => {
115
+ return () => {
116
+ zoomable_image?.destroy();
117
+ observer?.disconnect();
118
+ };
119
+ });
120
+
121
+ let slider_wrap_parent: HTMLDivElement;
122
+
123
+ let image_size: { top: number; left: number; width: number; height: number } =
124
+ { top: 0, left: 0, width: 0, height: 0 };
125
+
126
+ function handle_image_load(event: CustomEvent): void {
127
+ image_size = event.detail;
128
+ }
97
129
  </script>
98
130
 
99
131
  <BlockLabel {show_label} Icon={Image} label={label || i18n("image.image")} />
@@ -1,36 +1,38 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import { type FileData } from "@gradio/client";
3
2
  import type { I18nFormatter } from "@gradio/utils";
4
- declare const __propDef: {
5
- props: {
6
- value?: [null | FileData, null | FileData];
7
- label?: string | undefined;
8
- show_download_button?: boolean;
9
- show_label: boolean;
10
- i18n: I18nFormatter;
11
- position: number;
12
- layer_images?: boolean;
13
- show_single?: boolean;
14
- slider_color: string;
15
- show_fullscreen_button?: boolean;
16
- fullscreen?: boolean;
17
- el_width?: number;
18
- max_height: number;
19
- interactive?: boolean;
3
+ 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> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
20
13
  };
21
- events: {
22
- fullscreen: CustomEvent<boolean>;
23
- clear: CustomEvent<void>;
24
- } & {
25
- [evt: string]: CustomEvent<any>;
26
- };
27
- slots: {};
28
- exports?: {} | undefined;
29
- bindings?: string | undefined;
30
- };
31
- export type SliderPreviewProps = typeof __propDef.props;
32
- export type SliderPreviewEvents = typeof __propDef.events;
33
- export type SliderPreviewSlots = typeof __propDef.slots;
34
- export default class SliderPreview extends SvelteComponent<SliderPreviewProps, SliderPreviewEvents, SliderPreviewSlots> {
14
+ z_$$bindings?: Bindings;
35
15
  }
36
- export {};
16
+ declare const SliderPreview: $$__sveltets_2_IsomorphicComponent<{
17
+ value?: [null | FileData, null | FileData];
18
+ label?: string | undefined;
19
+ show_download_button?: boolean;
20
+ show_label: boolean;
21
+ i18n: I18nFormatter;
22
+ position: number;
23
+ layer_images?: boolean;
24
+ show_single?: boolean;
25
+ slider_color: string;
26
+ show_fullscreen_button?: boolean;
27
+ fullscreen?: boolean;
28
+ el_width?: number;
29
+ max_height: number;
30
+ interactive?: boolean;
31
+ }, {
32
+ fullscreen: CustomEvent<boolean>;
33
+ clear: CustomEvent<void>;
34
+ } & {
35
+ [evt: string]: CustomEvent<any>;
36
+ }, {}, {}, string>;
37
+ type SliderPreview = InstanceType<typeof SliderPreview>;
38
+ export default SliderPreview;
@@ -1,21 +1,28 @@
1
1
  <svelte:options accessors={true} />
2
2
 
3
- <script>import Image from "./Image.svelte";
4
- import {} from "@gradio/client";
5
- export let value = [null, null];
6
- export let upload;
7
- export let stream_handler;
8
- export let label;
9
- export let show_label;
10
- export let i18n;
11
- export let root;
12
- export let upload_count = 1;
13
- export let dragging;
14
- export let max_height;
15
- export let max_file_size = null;
3
+ <script lang="ts">
4
+ import type { I18nFormatter } from "@gradio/utils";
5
+ import Image from "./Image.svelte";
6
+ import { type Client } from "@gradio/client";
7
+
8
+ import type { FileData } from "@gradio/client";
9
+
10
+ export let value: [FileData | null, FileData | null] = [null, null];
11
+ export let upload: Client["upload"];
12
+ export let stream_handler: Client["stream"];
13
+ export let label: string;
14
+ export let show_label: boolean;
15
+ export let i18n: I18nFormatter;
16
+ export let root: string;
17
+ export let upload_count = 1;
18
+ export let dragging: boolean;
19
+ export let max_height: number;
20
+ export let max_file_size: number | null = null;
21
+ export let upload_promise: Promise<any> | null = null;
16
22
  </script>
17
23
 
18
24
  <Image
25
+ bind:upload_promise
19
26
  slider_color="var(--border-color-primary)"
20
27
  position={0.5}
21
28
  bind:value