@gradio/imageeditor 0.18.1 → 0.18.2-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.
Files changed (42) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/Index.svelte +123 -162
  3. package/InteractiveImageEditor.svelte +1 -0
  4. package/dist/Example.svelte +7 -4
  5. package/dist/Example.svelte.d.ts +20 -18
  6. package/dist/Index.svelte +153 -139
  7. package/dist/Index.svelte.d.ts +18 -210
  8. package/dist/InteractiveImageEditor.svelte +205 -148
  9. package/dist/InteractiveImageEditor.svelte.d.ts +55 -51
  10. package/dist/shared/Anchor.svelte +210 -136
  11. package/dist/shared/Anchor.svelte.d.ts +18 -16
  12. package/dist/shared/Controls.svelte +55 -36
  13. package/dist/shared/Controls.svelte.d.ts +35 -33
  14. package/dist/shared/IconButton.svelte +19 -17
  15. package/dist/shared/IconButton.svelte.d.ts +34 -32
  16. package/dist/shared/ImageEditor.svelte +673 -466
  17. package/dist/shared/ImageEditor.svelte.d.ts +4 -79
  18. package/dist/shared/Layers.svelte +52 -30
  19. package/dist/shared/Layers.svelte.d.ts +39 -36
  20. package/dist/shared/Resize.svelte +42 -21
  21. package/dist/shared/Resize.svelte.d.ts +29 -27
  22. package/dist/shared/SecondaryToolbar.svelte +17 -5
  23. package/dist/shared/SecondaryToolbar.svelte.d.ts +38 -36
  24. package/dist/shared/Toolbar.svelte +123 -69
  25. package/dist/shared/Toolbar.svelte.d.ts +40 -38
  26. package/dist/shared/brush/BrushOptions.svelte +119 -84
  27. package/dist/shared/brush/BrushOptions.svelte.d.ts +29 -27
  28. package/dist/shared/brush/BrushSize.svelte +12 -7
  29. package/dist/shared/brush/BrushSize.svelte.d.ts +23 -20
  30. package/dist/shared/brush/ColorField.svelte +49 -33
  31. package/dist/shared/brush/ColorField.svelte.d.ts +23 -21
  32. package/dist/shared/brush/ColorPicker.svelte +152 -108
  33. package/dist/shared/brush/ColorPicker.svelte.d.ts +19 -17
  34. package/dist/shared/brush/ColorSwatch.svelte +78 -46
  35. package/dist/shared/brush/ColorSwatch.svelte.d.ts +34 -32
  36. package/dist/types.d.ts +40 -0
  37. package/dist/types.js +25 -0
  38. package/package.json +12 -12
  39. package/shared/ImageEditor.svelte +1 -3
  40. package/shared/brush/BrushOptions.svelte +1 -1
  41. package/shared/brush/ColorPicker.svelte +2 -1
  42. package/types.ts +74 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # @gradio/imageeditor
2
2
 
3
+ ## 0.18.2-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
+ - @gradio/image@0.24.0-dev.2
12
+
13
+ ## 0.18.2-dev.1
14
+
15
+ ### Dependency updates
16
+
17
+ - @gradio/atoms@0.18.2-dev.0
18
+ - @gradio/upload@0.17.2-dev.1
19
+ - @gradio/utils@0.10.3-dev.0
20
+ - @gradio/image@0.23.2-dev.1
21
+ - @gradio/statustracker@0.12.0-dev.0
22
+ - @gradio/icons@0.15.0-dev.0
23
+
24
+ ## 0.18.2-dev.0
25
+
26
+ ### Dependency updates
27
+
28
+ - @gradio/client@2.0.0-dev.1
29
+
30
+ ## 0.18.2-dev.0
31
+
32
+ ### Dependency updates
33
+
34
+ - @gradio/upload@0.17.2-dev.0
35
+ - @gradio/client@2.0.0-dev.0
36
+ - @gradio/image@0.23.2-dev.0
37
+
3
38
  ## 0.18.1
4
39
 
5
40
  ### Fixes
package/Index.svelte CHANGED
@@ -1,85 +1,41 @@
1
1
  <svelte:options accessors={true} immutable={true} />
2
2
 
3
3
  <script lang="ts">
4
- import type { Brush, Eraser } from "./shared/brush/types";
5
- import type { EditorData, ImageBlobs } from "./InteractiveImageEditor.svelte";
4
+ import type { ImageBlobs } from "./InteractiveImageEditor.svelte";
6
5
 
7
6
  import { FileData } from "@gradio/client";
8
7
 
9
- import type { Gradio, SelectData } from "@gradio/utils";
10
8
  import { BaseStaticImage as StaticImage } from "@gradio/image";
11
9
  import InteractiveImageEditor from "./InteractiveImageEditor.svelte";
12
10
  import { Block } from "@gradio/atoms";
13
11
  import { StatusTracker } from "@gradio/statustracker";
14
- import type { LoadingStatus } from "@gradio/statustracker";
15
- import { tick } from "svelte";
16
- import type {
17
- LayerOptions,
18
- Transform,
19
- Source,
20
- WebcamOptions
21
- } from "./shared/types";
22
- import type { CommandNode } from "./shared/core/commands";
23
-
24
- export let elem_id = "";
25
- export let elem_classes: string[] = [];
26
- export let visible: boolean | "hidden" = true;
27
- export let value: EditorData | null = {
28
- background: null,
29
- layers: [],
30
- composite: null
31
- };
32
- export let label: string;
33
- export let show_label: boolean;
34
- export let show_download_button: boolean;
35
- export let root: string;
36
- export let value_is_output = false;
37
-
38
- export let height = 350;
39
- export let width: number | undefined;
40
-
41
- export let _selectable = false;
42
- export let container = true;
43
- export let scale: number | null = null;
44
- export let min_width: number | undefined = undefined;
45
- export let loading_status: LoadingStatus;
46
- export let show_share_button = false;
47
- export let sources: Source[] = [];
48
- export let interactive: boolean;
49
- export let placeholder: string | undefined;
50
- export let brush: Brush;
51
- export let eraser: Eraser;
52
- export let transforms: Transform[] = [];
53
- export let layers: LayerOptions;
54
- export let attached_events: string[] = [];
55
- export let server: {
56
- accept_blobs: (a: any) => void;
57
- };
58
- export let canvas_size: [number, number];
59
- export let fixed_canvas = false;
60
- export let show_fullscreen_button = true;
61
- export let full_history: CommandNode | null = null;
62
- export let gradio: Gradio<{
63
- change: never;
64
- error: string;
65
- input: never;
66
- edit: never;
67
- drag: never;
68
- apply: never;
69
- upload: never;
70
- clear: never;
71
- select: SelectData;
72
- share: ShareData;
73
- clear_status: LoadingStatus;
74
- }>;
75
- export let border_region = 0;
76
- export let webcam_options: WebcamOptions;
77
- export let theme_mode: "dark" | "light";
12
+
13
+ import { Gradio } from "@gradio/utils";
14
+ import type { ImageEditorEvents, ImageEditorProps } from "./types";
15
+
16
+ let props = $props();
17
+
18
+ class ImageEditorGradio extends Gradio<ImageEditorEvents, ImageEditorProps> {
19
+ async get_data() {
20
+ const data = await super.get_data();
21
+ const value = await _get_value();
22
+ return { ...data, value: value };
23
+ }
24
+ }
25
+ const gradio = new ImageEditorGradio(props, {
26
+ server: { accept_blobs: () => {} },
27
+ buttons: [],
28
+ height: 350,
29
+ border_region: 0
30
+ });
78
31
 
79
32
  let editor_instance: InteractiveImageEditor;
80
- let image_id: null | string = null;
33
+ let image_id: null | string = $state(null);
81
34
 
82
- export async function get_value(): Promise<ImageBlobs | { id: string }> {
35
+ let has_run_change = false;
36
+ let has_run_input = false;
37
+
38
+ async function _get_value(): Promise<ImageBlobs | { id: string }> {
83
39
  if (image_id) {
84
40
  const val = { id: image_id };
85
41
  image_id = null;
@@ -92,127 +48,124 @@
92
48
  }
93
49
 
94
50
  let is_dragging: boolean;
95
- $: value && handle_change();
51
+
96
52
  const is_browser = typeof window !== "undefined";
97
- const raf = is_browser
98
- ? window.requestAnimationFrame
99
- : (cb: (...args: any[]) => void) => cb();
100
-
101
- function wait_for_next_frame(): Promise<void> {
102
- return new Promise((resolve) => {
103
- raf(() => raf(() => resolve()));
104
- });
105
- }
106
53
 
107
- async function handle_change(): Promise<void> {
108
- await wait_for_next_frame();
109
-
110
- if (
111
- value &&
112
- (value.background || value.layers?.length || value.composite)
113
- ) {
114
- gradio.dispatch("change");
115
- }
116
- }
54
+ // function handle_change(): void {
55
+ // if (gradio.props.value) gradio.dispatch("change");
56
+ // }
117
57
 
118
58
  function handle_save(): void {
119
59
  gradio.dispatch("apply");
120
60
  }
121
61
 
122
- function handle_history_change(): void {
123
- gradio.dispatch("change");
124
- if (!value_is_output) {
125
- gradio.dispatch("input");
126
- tick().then((_) => (value_is_output = false));
127
- }
128
- }
129
-
130
- $: has_value = value?.background || value?.layers?.length || value?.composite;
131
-
132
- $: normalised_background = value?.background
133
- ? new FileData(value.background)
134
- : null;
135
- $: normalised_composite = value?.composite
136
- ? new FileData(value.composite)
137
- : null;
138
- $: normalised_layers =
139
- value?.layers?.map((layer) => new FileData(layer)) || [];
62
+ // function handle_history_change(): void {
63
+ // gradio.dispatch("change");
64
+
65
+ // gradio.dispatch("input");
66
+ // }
67
+
68
+ let has_value = $derived(
69
+ gradio.props.value?.background ||
70
+ gradio.props.value?.layers?.length ||
71
+ gradio.props.value?.composite
72
+ );
73
+
74
+ let normalised_background = $derived(
75
+ gradio.props.value?.background
76
+ ? new FileData(gradio.props.value.background)
77
+ : null
78
+ );
79
+ let normalised_composite = $derived(
80
+ gradio.props.value?.composite
81
+ ? new FileData(gradio.props.value.composite)
82
+ : null
83
+ );
84
+ let normalised_layers = $derived(
85
+ gradio.props.value?.layers?.map((layer) => new FileData(layer)) || []
86
+ );
140
87
  </script>
141
88
 
142
- {#if !interactive}
89
+ {#if !gradio.shared.interactive}
143
90
  <Block
144
- {visible}
91
+ visible={gradio.shared.visible}
145
92
  variant={"solid"}
146
93
  border_mode={is_dragging ? "focus" : "base"}
147
94
  padding={false}
148
- {elem_id}
149
- {elem_classes}
150
- {height}
151
- {width}
95
+ elem_id={gradio.shared.elem_id}
96
+ elem_classes={gradio.shared.elem_classes}
97
+ height={gradio.props.height}
98
+ width={gradio.props.width}
152
99
  allow_overflow={true}
153
100
  overflow_behavior="visible"
154
- {container}
155
- {scale}
156
- {min_width}
101
+ container={gradio.shared.container}
102
+ scale={gradio.shared.scale}
103
+ min_width={gradio.shared.min_width}
157
104
  >
158
105
  <StatusTracker
159
- autoscroll={gradio.autoscroll}
106
+ autoscroll={gradio.shared.autoscroll}
160
107
  i18n={gradio.i18n}
161
- {...loading_status}
162
- on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
108
+ {...gradio.shared.loading_status}
109
+ on:clear_status={() =>
110
+ gradio.dispatch("clear_status", gradio.shared.loading_status)}
163
111
  />
164
112
  <StaticImage
165
113
  on:select={({ detail }) => gradio.dispatch("select", detail)}
166
114
  on:share={({ detail }) => gradio.dispatch("share", detail)}
167
115
  on:error={({ detail }) => gradio.dispatch("error", detail)}
168
- value={value?.composite || null}
169
- {label}
170
- {show_label}
171
- {show_download_button}
172
- selectable={_selectable}
173
- {show_share_button}
116
+ value={gradio.props.value?.composite || null}
117
+ label={gradio.shared.label}
118
+ show_label={gradio.shared.show_label}
119
+ buttons={gradio.props.buttons}
120
+ selectable={gradio.props._selectable}
174
121
  i18n={gradio.i18n}
175
- {show_fullscreen_button}
176
122
  />
177
123
  </Block>
178
124
  {:else}
179
125
  <Block
180
- {visible}
126
+ visible={gradio.shared.visible}
181
127
  variant={has_value ? "solid" : "dashed"}
182
128
  border_mode={is_dragging ? "focus" : "base"}
183
129
  padding={false}
184
- {elem_id}
185
- {elem_classes}
186
- {height}
187
- {width}
130
+ elem_id={gradio.shared.elem_id}
131
+ elem_classes={gradio.shared.elem_classes}
132
+ height={gradio.props.height}
133
+ width={gradio.props.width}
188
134
  allow_overflow={true}
189
135
  overflow_behavior="visible"
190
- {container}
191
- {scale}
192
- {min_width}
136
+ container={gradio.shared.container}
137
+ scale={gradio.shared.scale}
138
+ min_width={gradio.shared.min_width}
193
139
  >
194
140
  <StatusTracker
195
- autoscroll={gradio.autoscroll}
141
+ autoscroll={gradio.shared.autoscroll}
196
142
  i18n={gradio.i18n}
197
- {...loading_status}
198
- 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)}
199
146
  />
200
147
 
201
148
  <InteractiveImageEditor
202
- {border_region}
149
+ border_region={gradio.props.border_region}
203
150
  bind:is_dragging
204
- {canvas_size}
205
- on:change={() => handle_history_change()}
151
+ canvas_size={gradio.props.canvas_size}
206
152
  bind:image_id
207
153
  layers={normalised_layers}
208
154
  composite={normalised_composite}
209
155
  background={normalised_background}
210
156
  bind:this={editor_instance}
211
- {root}
212
- {sources}
213
- {label}
214
- {show_label}
215
- {fixed_canvas}
157
+ root={gradio.shared.root}
158
+ sources={gradio.props.sources}
159
+ label={gradio.shared.label}
160
+ show_label={gradio.shared.show_label}
161
+ fixed_canvas={gradio.props.fixed_canvas}
162
+ on:input={() => {
163
+ if (!has_run_input) {
164
+ has_run_input = true;
165
+ } else {
166
+ gradio.dispatch("input");
167
+ }
168
+ }}
216
169
  on:save={(e) => handle_save()}
217
170
  on:edit={() => gradio.dispatch("edit")}
218
171
  on:clear={() => gradio.dispatch("clear")}
@@ -220,32 +173,40 @@
220
173
  on:upload={() => gradio.dispatch("upload")}
221
174
  on:share={({ detail }) => gradio.dispatch("share", detail)}
222
175
  on:error={({ detail }) => {
223
- loading_status = loading_status || {};
224
- loading_status.status = "error";
176
+ gradio.shared.loading_status = gradio.shared.loading_status || {};
177
+ gradio.shared.loading_status.status = "error";
225
178
  gradio.dispatch("error", detail);
226
179
  }}
227
180
  on:receive_null={() =>
228
- (value = {
181
+ (gradio.props.value = {
229
182
  background: null,
230
183
  layers: [],
231
184
  composite: null
232
185
  })}
186
+ on:change={() => {
187
+ if (!has_run_change) {
188
+ has_run_change = true;
189
+ } else {
190
+ gradio.dispatch("change");
191
+ }
192
+ }}
233
193
  on:error
234
- {brush}
235
- {eraser}
236
- changeable={attached_events.includes("apply")}
237
- realtime={attached_events.includes("change") ||
238
- attached_events.includes("input")}
194
+ brush={gradio.props.brush}
195
+ eraser={gradio.props.eraser}
196
+ changeable={gradio.shared.attached_events.includes("apply")}
197
+ realtime={gradio.shared.attached_events.includes("change") ||
198
+ gradio.shared.attached_events.includes("input")}
239
199
  i18n={gradio.i18n}
240
- {transforms}
241
- accept_blobs={server.accept_blobs}
242
- layer_options={layers}
243
- upload={(...args) => gradio.client.upload(...args)}
244
- {placeholder}
245
- bind:full_history
246
- {webcam_options}
247
- {show_download_button}
248
- {theme_mode}
200
+ transforms={gradio.props.transforms}
201
+ accept_blobs={gradio.shared.server.accept_blobs}
202
+ layer_options={gradio.props.layers}
203
+ upload={(...args) => gradio.shared.client.upload(...args)}
204
+ placeholder={gradio.props.placeholder}
205
+ webcam_options={gradio.props.webcam_options}
206
+ show_download_button={gradio.props.buttons === null
207
+ ? true
208
+ : gradio.props.buttons.includes("download")}
209
+ theme_mode={gradio.shared.theme_mode}
249
210
  on:download_error={(e) => gradio.dispatch("error", e.detail)}
250
211
  ></InteractiveImageEditor>
251
212
  </Block>
@@ -219,6 +219,7 @@
219
219
  bind:this={editor}
220
220
  {changeable}
221
221
  on:save
222
+ on:input
222
223
  on:change={handle_change}
223
224
  on:clear={() => dispatch("clear")}
224
225
  on:download_error
@@ -1,7 +1,10 @@
1
- <script>import { BaseImage as Image } from "@gradio/image";
2
- export let value;
3
- export let type;
4
- export let selected = false;
1
+ <script lang="ts">
2
+ import { BaseImage as Image } from "@gradio/image";
3
+ import type { EditorData } from "./InteractiveImageEditor.svelte";
4
+
5
+ export let value: EditorData;
6
+ export let type: "gallery" | "table";
7
+ export let selected = false;
5
8
  </script>
6
9
 
7
10
  <div
@@ -1,21 +1,23 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type { EditorData } from "./InteractiveImageEditor.svelte";
3
- declare const __propDef: {
4
- props: {
5
- value: EditorData;
6
- type: "gallery" | "table";
7
- selected?: boolean;
2
+ 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> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
8
12
  };
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> {
13
+ z_$$bindings?: Bindings;
20
14
  }
21
- export {};
15
+ declare const Example: $$__sveltets_2_IsomorphicComponent<{
16
+ value: EditorData;
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;