@gradio/imageeditor 0.18.2-dev.0 → 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 +27 -0
  2. package/Index.svelte +122 -159
  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 +152 -136
  7. package/dist/Index.svelte.d.ts +18 -202
  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,32 @@
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
+
3
30
  ## 0.18.2-dev.0
4
31
 
5
32
  ### Dependency updates
package/Index.svelte CHANGED
@@ -1,83 +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 buttons: string[] | null = null;
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 sources: Source[] = [];
47
- export let interactive: boolean;
48
- export let placeholder: string | undefined;
49
- export let brush: Brush;
50
- export let eraser: Eraser;
51
- export let transforms: Transform[] = [];
52
- export let layers: LayerOptions;
53
- export let attached_events: string[] = [];
54
- export let server: {
55
- accept_blobs: (a: any) => void;
56
- };
57
- export let canvas_size: [number, number];
58
- export let fixed_canvas = false;
59
- export let full_history: CommandNode | null = null;
60
- export let gradio: Gradio<{
61
- change: never;
62
- error: string;
63
- input: never;
64
- edit: never;
65
- drag: never;
66
- apply: never;
67
- upload: never;
68
- clear: never;
69
- select: SelectData;
70
- share: ShareData;
71
- clear_status: LoadingStatus;
72
- }>;
73
- export let border_region = 0;
74
- export let webcam_options: WebcamOptions;
75
- 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
+ });
76
31
 
77
32
  let editor_instance: InteractiveImageEditor;
78
- let image_id: null | string = null;
33
+ let image_id: null | string = $state(null);
79
34
 
80
- 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 }> {
81
39
  if (image_id) {
82
40
  const val = { id: image_id };
83
41
  image_id = null;
@@ -90,125 +48,124 @@
90
48
  }
91
49
 
92
50
  let is_dragging: boolean;
93
- $: value && handle_change();
51
+
94
52
  const is_browser = typeof window !== "undefined";
95
- const raf = is_browser
96
- ? window.requestAnimationFrame
97
- : (cb: (...args: any[]) => void) => cb();
98
-
99
- function wait_for_next_frame(): Promise<void> {
100
- return new Promise((resolve) => {
101
- raf(() => raf(() => resolve()));
102
- });
103
- }
104
53
 
105
- async function handle_change(): Promise<void> {
106
- await wait_for_next_frame();
107
-
108
- if (
109
- value &&
110
- (value.background || value.layers?.length || value.composite)
111
- ) {
112
- gradio.dispatch("change");
113
- }
114
- }
54
+ // function handle_change(): void {
55
+ // if (gradio.props.value) gradio.dispatch("change");
56
+ // }
115
57
 
116
58
  function handle_save(): void {
117
59
  gradio.dispatch("apply");
118
60
  }
119
61
 
120
- function handle_history_change(): void {
121
- gradio.dispatch("change");
122
- if (!value_is_output) {
123
- gradio.dispatch("input");
124
- tick().then((_) => (value_is_output = false));
125
- }
126
- }
127
-
128
- $: has_value = value?.background || value?.layers?.length || value?.composite;
129
-
130
- $: normalised_background = value?.background
131
- ? new FileData(value.background)
132
- : null;
133
- $: normalised_composite = value?.composite
134
- ? new FileData(value.composite)
135
- : null;
136
- $: normalised_layers =
137
- 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
+ );
138
87
  </script>
139
88
 
140
- {#if !interactive}
89
+ {#if !gradio.shared.interactive}
141
90
  <Block
142
- {visible}
91
+ visible={gradio.shared.visible}
143
92
  variant={"solid"}
144
93
  border_mode={is_dragging ? "focus" : "base"}
145
94
  padding={false}
146
- {elem_id}
147
- {elem_classes}
148
- {height}
149
- {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}
150
99
  allow_overflow={true}
151
100
  overflow_behavior="visible"
152
- {container}
153
- {scale}
154
- {min_width}
101
+ container={gradio.shared.container}
102
+ scale={gradio.shared.scale}
103
+ min_width={gradio.shared.min_width}
155
104
  >
156
105
  <StatusTracker
157
- autoscroll={gradio.autoscroll}
106
+ autoscroll={gradio.shared.autoscroll}
158
107
  i18n={gradio.i18n}
159
- {...loading_status}
160
- 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)}
161
111
  />
162
112
  <StaticImage
163
113
  on:select={({ detail }) => gradio.dispatch("select", detail)}
164
114
  on:share={({ detail }) => gradio.dispatch("share", detail)}
165
115
  on:error={({ detail }) => gradio.dispatch("error", detail)}
166
- value={value?.composite || null}
167
- {label}
168
- {show_label}
169
- {buttons}
170
- selectable={_selectable}
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}
171
121
  i18n={gradio.i18n}
172
122
  />
173
123
  </Block>
174
124
  {:else}
175
125
  <Block
176
- {visible}
126
+ visible={gradio.shared.visible}
177
127
  variant={has_value ? "solid" : "dashed"}
178
128
  border_mode={is_dragging ? "focus" : "base"}
179
129
  padding={false}
180
- {elem_id}
181
- {elem_classes}
182
- {height}
183
- {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}
184
134
  allow_overflow={true}
185
135
  overflow_behavior="visible"
186
- {container}
187
- {scale}
188
- {min_width}
136
+ container={gradio.shared.container}
137
+ scale={gradio.shared.scale}
138
+ min_width={gradio.shared.min_width}
189
139
  >
190
140
  <StatusTracker
191
- autoscroll={gradio.autoscroll}
141
+ autoscroll={gradio.shared.autoscroll}
192
142
  i18n={gradio.i18n}
193
- {...loading_status}
194
- 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)}
195
146
  />
196
147
 
197
148
  <InteractiveImageEditor
198
- {border_region}
149
+ border_region={gradio.props.border_region}
199
150
  bind:is_dragging
200
- {canvas_size}
201
- on:change={() => handle_history_change()}
151
+ canvas_size={gradio.props.canvas_size}
202
152
  bind:image_id
203
153
  layers={normalised_layers}
204
154
  composite={normalised_composite}
205
155
  background={normalised_background}
206
156
  bind:this={editor_instance}
207
- {root}
208
- {sources}
209
- {label}
210
- {show_label}
211
- {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
+ }}
212
169
  on:save={(e) => handle_save()}
213
170
  on:edit={() => gradio.dispatch("edit")}
214
171
  on:clear={() => gradio.dispatch("clear")}
@@ -216,34 +173,40 @@
216
173
  on:upload={() => gradio.dispatch("upload")}
217
174
  on:share={({ detail }) => gradio.dispatch("share", detail)}
218
175
  on:error={({ detail }) => {
219
- loading_status = loading_status || {};
220
- loading_status.status = "error";
176
+ gradio.shared.loading_status = gradio.shared.loading_status || {};
177
+ gradio.shared.loading_status.status = "error";
221
178
  gradio.dispatch("error", detail);
222
179
  }}
223
180
  on:receive_null={() =>
224
- (value = {
181
+ (gradio.props.value = {
225
182
  background: null,
226
183
  layers: [],
227
184
  composite: null
228
185
  })}
186
+ on:change={() => {
187
+ if (!has_run_change) {
188
+ has_run_change = true;
189
+ } else {
190
+ gradio.dispatch("change");
191
+ }
192
+ }}
229
193
  on:error
230
- {brush}
231
- {eraser}
232
- changeable={attached_events.includes("apply")}
233
- realtime={attached_events.includes("change") ||
234
- 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")}
235
199
  i18n={gradio.i18n}
236
- {transforms}
237
- accept_blobs={server.accept_blobs}
238
- layer_options={layers}
239
- upload={(...args) => gradio.client.upload(...args)}
240
- {placeholder}
241
- bind:full_history
242
- {webcam_options}
243
- show_download_button={buttons === null
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
244
207
  ? true
245
- : buttons.includes("download")}
246
- {theme_mode}
208
+ : gradio.props.buttons.includes("download")}
209
+ theme_mode={gradio.shared.theme_mode}
247
210
  on:download_error={(e) => gradio.dispatch("error", e.detail)}
248
211
  ></InteractiveImageEditor>
249
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;