@gradio/imageeditor 0.18.11 → 0.19.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 +32 -0
- package/ImageEditor.stories.svelte +0 -74
- package/Index.svelte +12 -12
- package/InteractiveImageEditor.svelte +9 -5
- package/dist/Index.svelte +12 -12
- package/dist/InteractiveImageEditor.svelte +9 -5
- package/dist/InteractiveImageEditor.svelte.d.ts +5 -5
- package/dist/shared/IconButton.svelte +2 -2
- package/dist/shared/IconButton.svelte.d.ts +2 -2
- package/dist/shared/ImageEditor.svelte +22 -14
- package/dist/shared/Toolbar.svelte +1 -1
- package/dist/shared/Toolbar.svelte.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +7 -7
- package/shared/IconButton.svelte +2 -2
- package/shared/ImageEditor.svelte +22 -14
- package/shared/Toolbar.svelte +1 -1
- package/types.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @gradio/imageeditor
|
|
2
2
|
|
|
3
|
+
## 0.19.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- [#13526](https://github.com/gradio-app/gradio/pull/13526) [`53cb4ca`](https://github.com/gradio-app/gradio/commit/53cb4cae1ec3521e9170d12867253516413ba37a) - Run `pnpm lint` and `pnpm ts:check` on CI. Thanks @abidlabs!
|
|
8
|
+
|
|
9
|
+
### Dependency updates
|
|
10
|
+
|
|
11
|
+
- @gradio/atoms@0.25.0
|
|
12
|
+
- @gradio/statustracker@0.15.0
|
|
13
|
+
- @gradio/utils@0.13.0
|
|
14
|
+
- @gradio/client@2.3.0
|
|
15
|
+
- @gradio/upload@0.18.0
|
|
16
|
+
- @gradio/image@0.27.0
|
|
17
|
+
|
|
18
|
+
## 0.18.12
|
|
19
|
+
|
|
20
|
+
### Dependency updates
|
|
21
|
+
|
|
22
|
+
- @gradio/client@2.2.2
|
|
23
|
+
|
|
24
|
+
## 0.18.12
|
|
25
|
+
|
|
26
|
+
### Fixes
|
|
27
|
+
|
|
28
|
+
- [#13379](https://github.com/gradio-app/gradio/pull/13379) [`b8e8745`](https://github.com/gradio-app/gradio/commit/b8e8745d2f4fb156dd12d57a3f4eb2e165f20216) - fix default tool logic in gr.ImageEditor. Thanks @hannahblair!
|
|
29
|
+
|
|
30
|
+
### Dependency updates
|
|
31
|
+
|
|
32
|
+
- @gradio/client@2.2.1
|
|
33
|
+
- @gradio/upload@0.17.10
|
|
34
|
+
|
|
3
35
|
## 0.18.11
|
|
4
36
|
|
|
5
37
|
### Dependency updates
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script module>
|
|
2
2
|
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
import { userEvent, within } from "storybook/test";
|
|
4
3
|
import ImageEditor from "./Index.svelte";
|
|
5
4
|
import { allModes } from "../storybook/modes";
|
|
6
5
|
import { wrapProps } from "../storybook/wrapProps";
|
|
@@ -59,79 +58,6 @@
|
|
|
59
58
|
{/snippet}
|
|
60
59
|
</Story>
|
|
61
60
|
|
|
62
|
-
<Story
|
|
63
|
-
name="Image Editor Undo/Redo Interactions"
|
|
64
|
-
args={{
|
|
65
|
-
value: {
|
|
66
|
-
background: {
|
|
67
|
-
path: cheetah,
|
|
68
|
-
url: cheetah,
|
|
69
|
-
orig_name: "cheetah.jpg"
|
|
70
|
-
},
|
|
71
|
-
layers: [],
|
|
72
|
-
composite: null
|
|
73
|
-
},
|
|
74
|
-
type: "pil",
|
|
75
|
-
placeholder: "Upload an image of a cat",
|
|
76
|
-
sources: ["upload", "webcam"],
|
|
77
|
-
canvas_size: [800, 800],
|
|
78
|
-
interactive: true,
|
|
79
|
-
transforms: ["crop"],
|
|
80
|
-
layers: { allow_additional_layers: true, layers: [] },
|
|
81
|
-
brush: {
|
|
82
|
-
default_size: "auto",
|
|
83
|
-
colors: ["#ff0000", "#00ff00", "#0000ff"],
|
|
84
|
-
default_color: "#ff0000",
|
|
85
|
-
color_mode: "defaults"
|
|
86
|
-
},
|
|
87
|
-
eraser: {
|
|
88
|
-
default_size: "auto"
|
|
89
|
-
},
|
|
90
|
-
webcam_options: {
|
|
91
|
-
mirror: true,
|
|
92
|
-
constraints: null
|
|
93
|
-
}
|
|
94
|
-
}}
|
|
95
|
-
parameters={{ chromatic: { disableSnapshot: true } }}
|
|
96
|
-
play={async ({ canvasElement }) => {
|
|
97
|
-
const canvas = within(canvasElement);
|
|
98
|
-
|
|
99
|
-
const drawButton = canvas.getAllByLabelText("Brush")[0];
|
|
100
|
-
await userEvent.click(drawButton);
|
|
101
|
-
|
|
102
|
-
const drawCanvas = document.getElementsByTagName("canvas")[0];
|
|
103
|
-
if (!drawCanvas) {
|
|
104
|
-
throw new Error("Could not find canvas");
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
108
|
-
|
|
109
|
-
await userEvent.pointer({
|
|
110
|
-
keys: "[MouseLeft][MouseRight]",
|
|
111
|
-
target: drawCanvas,
|
|
112
|
-
coords: { clientX: 300, clientY: 100 }
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
await userEvent.pointer({
|
|
116
|
-
keys: "[MouseLeft][MouseRight]",
|
|
117
|
-
target: drawCanvas,
|
|
118
|
-
coords: { clientX: 400, clientY: 200 }
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
await userEvent.click(canvas.getByLabelText("Undo"));
|
|
122
|
-
await userEvent.click(canvas.getByLabelText("Redo"));
|
|
123
|
-
}}
|
|
124
|
-
>
|
|
125
|
-
{#snippet template(args)}
|
|
126
|
-
<div
|
|
127
|
-
class="image-container"
|
|
128
|
-
style="width: 500px; position: relative;border-radius: var(--radius-lg);overflow: hidden;"
|
|
129
|
-
>
|
|
130
|
-
<ImageEditor {...wrapProps(args)} />
|
|
131
|
-
</div>
|
|
132
|
-
{/snippet}
|
|
133
|
-
</Story>
|
|
134
|
-
|
|
135
61
|
<Story
|
|
136
62
|
name="Static Image Display"
|
|
137
63
|
args={{
|
package/Index.svelte
CHANGED
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
value={gradio.props.value?.composite || null}
|
|
117
117
|
label={gradio.shared.label}
|
|
118
118
|
show_label={gradio.shared.show_label}
|
|
119
|
-
buttons={gradio.props.buttons}
|
|
119
|
+
buttons={gradio.props.buttons ?? []}
|
|
120
120
|
selectable={gradio.props._selectable}
|
|
121
121
|
i18n={gradio.i18n}
|
|
122
122
|
/>
|
|
@@ -146,16 +146,16 @@
|
|
|
146
146
|
/>
|
|
147
147
|
|
|
148
148
|
<InteractiveImageEditor
|
|
149
|
-
border_region={gradio.props.border_region}
|
|
149
|
+
border_region={gradio.props.border_region ?? 0}
|
|
150
150
|
bind:is_dragging
|
|
151
|
-
canvas_size={gradio.props.canvas_size}
|
|
151
|
+
canvas_size={gradio.props.canvas_size ?? [800, 800]}
|
|
152
152
|
bind:image_id
|
|
153
153
|
layers={normalised_layers}
|
|
154
154
|
composite={normalised_composite}
|
|
155
155
|
background={normalised_background}
|
|
156
156
|
bind:this={editor_instance}
|
|
157
157
|
root={gradio.shared.root}
|
|
158
|
-
sources={gradio.props.sources}
|
|
158
|
+
sources={gradio.props.sources ?? ["upload", "webcam", "clipboard"]}
|
|
159
159
|
label={gradio.shared.label}
|
|
160
160
|
show_label={gradio.shared.show_label}
|
|
161
161
|
fixed_canvas={gradio.props.fixed_canvas}
|
|
@@ -191,13 +191,13 @@
|
|
|
191
191
|
}
|
|
192
192
|
}}
|
|
193
193
|
on:error
|
|
194
|
-
brush={gradio.props.brush}
|
|
195
|
-
eraser={gradio.props.eraser}
|
|
196
|
-
changeable={gradio.shared.attached_events
|
|
197
|
-
realtime={gradio.shared.attached_events
|
|
198
|
-
gradio.shared.attached_events
|
|
194
|
+
brush={gradio.props.brush ?? false}
|
|
195
|
+
eraser={gradio.props.eraser ?? false}
|
|
196
|
+
changeable={gradio.shared.attached_events?.includes("apply") ?? false}
|
|
197
|
+
realtime={gradio.shared.attached_events?.includes("change") ||
|
|
198
|
+
gradio.shared.attached_events?.includes("input")}
|
|
199
199
|
i18n={gradio.i18n}
|
|
200
|
-
transforms={gradio.props.transforms}
|
|
200
|
+
transforms={gradio.props.transforms ?? []}
|
|
201
201
|
accept_blobs={gradio.shared.server.accept_blobs}
|
|
202
202
|
layer_options={gradio.props.layers}
|
|
203
203
|
upload={(...args) => gradio.shared.client.upload(...args)}
|
|
@@ -205,8 +205,8 @@
|
|
|
205
205
|
webcam_options={gradio.props.webcam_options}
|
|
206
206
|
show_download_button={gradio.props.buttons === null
|
|
207
207
|
? true
|
|
208
|
-
: gradio.props.buttons.includes("download")}
|
|
209
|
-
theme_mode={gradio.shared.theme_mode}
|
|
208
|
+
: (gradio.props.buttons ?? []).includes("download")}
|
|
209
|
+
theme_mode={gradio.shared.theme_mode === "dark" ? "dark" : "light"}
|
|
210
210
|
on:download_error={(e) => gradio.dispatch("error", e.detail)}
|
|
211
211
|
></InteractiveImageEditor>
|
|
212
212
|
</Block>
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
type WebcamOptions
|
|
32
32
|
} from "./shared/types";
|
|
33
33
|
|
|
34
|
-
export let brush: IBrush;
|
|
35
|
-
export let eraser: Eraser;
|
|
34
|
+
export let brush: IBrush | false;
|
|
35
|
+
export let eraser: Eraser | false;
|
|
36
36
|
export let sources: Source[];
|
|
37
37
|
export let i18n: I18nFormatter;
|
|
38
38
|
export let root: string;
|
|
@@ -45,19 +45,23 @@
|
|
|
45
45
|
export let composite: FileData | null;
|
|
46
46
|
export let background: FileData | null;
|
|
47
47
|
|
|
48
|
-
export let layer_options: LayerOptions
|
|
48
|
+
export let layer_options: LayerOptions = {
|
|
49
|
+
allow_additional_layers: true,
|
|
50
|
+
layers: [],
|
|
51
|
+
disabled: false
|
|
52
|
+
};
|
|
49
53
|
export let transforms: Transform[];
|
|
50
54
|
export let accept_blobs: (a: any) => void;
|
|
51
55
|
|
|
52
56
|
export let canvas_size: [number, number];
|
|
53
57
|
export let fixed_canvas = false;
|
|
54
|
-
export let realtime
|
|
58
|
+
export let realtime = false;
|
|
55
59
|
export let upload: Client["upload"];
|
|
56
60
|
export let is_dragging: boolean;
|
|
57
61
|
export let placeholder: string | undefined = undefined;
|
|
58
62
|
export let border_region: number;
|
|
59
63
|
export let full_history: CommandNode | null = null;
|
|
60
|
-
export let webcam_options: WebcamOptions;
|
|
64
|
+
export let webcam_options: WebcamOptions = { mirror: true, constraints: {} };
|
|
61
65
|
export let show_download_button = false;
|
|
62
66
|
|
|
63
67
|
const dispatch = createEventDispatcher<{
|
package/dist/Index.svelte
CHANGED
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
value={gradio.props.value?.composite || null}
|
|
117
117
|
label={gradio.shared.label}
|
|
118
118
|
show_label={gradio.shared.show_label}
|
|
119
|
-
buttons={gradio.props.buttons}
|
|
119
|
+
buttons={gradio.props.buttons ?? []}
|
|
120
120
|
selectable={gradio.props._selectable}
|
|
121
121
|
i18n={gradio.i18n}
|
|
122
122
|
/>
|
|
@@ -146,16 +146,16 @@
|
|
|
146
146
|
/>
|
|
147
147
|
|
|
148
148
|
<InteractiveImageEditor
|
|
149
|
-
border_region={gradio.props.border_region}
|
|
149
|
+
border_region={gradio.props.border_region ?? 0}
|
|
150
150
|
bind:is_dragging
|
|
151
|
-
canvas_size={gradio.props.canvas_size}
|
|
151
|
+
canvas_size={gradio.props.canvas_size ?? [800, 800]}
|
|
152
152
|
bind:image_id
|
|
153
153
|
layers={normalised_layers}
|
|
154
154
|
composite={normalised_composite}
|
|
155
155
|
background={normalised_background}
|
|
156
156
|
bind:this={editor_instance}
|
|
157
157
|
root={gradio.shared.root}
|
|
158
|
-
sources={gradio.props.sources}
|
|
158
|
+
sources={gradio.props.sources ?? ["upload", "webcam", "clipboard"]}
|
|
159
159
|
label={gradio.shared.label}
|
|
160
160
|
show_label={gradio.shared.show_label}
|
|
161
161
|
fixed_canvas={gradio.props.fixed_canvas}
|
|
@@ -191,13 +191,13 @@
|
|
|
191
191
|
}
|
|
192
192
|
}}
|
|
193
193
|
on:error
|
|
194
|
-
brush={gradio.props.brush}
|
|
195
|
-
eraser={gradio.props.eraser}
|
|
196
|
-
changeable={gradio.shared.attached_events
|
|
197
|
-
realtime={gradio.shared.attached_events
|
|
198
|
-
gradio.shared.attached_events
|
|
194
|
+
brush={gradio.props.brush ?? false}
|
|
195
|
+
eraser={gradio.props.eraser ?? false}
|
|
196
|
+
changeable={gradio.shared.attached_events?.includes("apply") ?? false}
|
|
197
|
+
realtime={gradio.shared.attached_events?.includes("change") ||
|
|
198
|
+
gradio.shared.attached_events?.includes("input")}
|
|
199
199
|
i18n={gradio.i18n}
|
|
200
|
-
transforms={gradio.props.transforms}
|
|
200
|
+
transforms={gradio.props.transforms ?? []}
|
|
201
201
|
accept_blobs={gradio.shared.server.accept_blobs}
|
|
202
202
|
layer_options={gradio.props.layers}
|
|
203
203
|
upload={(...args) => gradio.shared.client.upload(...args)}
|
|
@@ -205,8 +205,8 @@
|
|
|
205
205
|
webcam_options={gradio.props.webcam_options}
|
|
206
206
|
show_download_button={gradio.props.buttons === null
|
|
207
207
|
? true
|
|
208
|
-
: gradio.props.buttons.includes("download")}
|
|
209
|
-
theme_mode={gradio.shared.theme_mode}
|
|
208
|
+
: (gradio.props.buttons ?? []).includes("download")}
|
|
209
|
+
theme_mode={gradio.shared.theme_mode === "dark" ? "dark" : "light"}
|
|
210
210
|
on:download_error={(e) => gradio.dispatch("error", e.detail)}
|
|
211
211
|
></InteractiveImageEditor>
|
|
212
212
|
</Block>
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
type WebcamOptions
|
|
32
32
|
} from "./shared/types";
|
|
33
33
|
|
|
34
|
-
export let brush: IBrush;
|
|
35
|
-
export let eraser: Eraser;
|
|
34
|
+
export let brush: IBrush | false;
|
|
35
|
+
export let eraser: Eraser | false;
|
|
36
36
|
export let sources: Source[];
|
|
37
37
|
export let i18n: I18nFormatter;
|
|
38
38
|
export let root: string;
|
|
@@ -45,19 +45,23 @@
|
|
|
45
45
|
export let composite: FileData | null;
|
|
46
46
|
export let background: FileData | null;
|
|
47
47
|
|
|
48
|
-
export let layer_options: LayerOptions
|
|
48
|
+
export let layer_options: LayerOptions = {
|
|
49
|
+
allow_additional_layers: true,
|
|
50
|
+
layers: [],
|
|
51
|
+
disabled: false
|
|
52
|
+
};
|
|
49
53
|
export let transforms: Transform[];
|
|
50
54
|
export let accept_blobs: (a: any) => void;
|
|
51
55
|
|
|
52
56
|
export let canvas_size: [number, number];
|
|
53
57
|
export let fixed_canvas = false;
|
|
54
|
-
export let realtime
|
|
58
|
+
export let realtime = false;
|
|
55
59
|
export let upload: Client["upload"];
|
|
56
60
|
export let is_dragging: boolean;
|
|
57
61
|
export let placeholder: string | undefined = undefined;
|
|
58
62
|
export let border_region: number;
|
|
59
63
|
export let full_history: CommandNode | null = null;
|
|
60
|
-
export let webcam_options: WebcamOptions;
|
|
64
|
+
export let webcam_options: WebcamOptions = { mirror: true, constraints: {} };
|
|
61
65
|
export let show_download_button = false;
|
|
62
66
|
|
|
63
67
|
const dispatch = createEventDispatcher<{
|
|
@@ -27,8 +27,8 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
|
|
|
27
27
|
z_$$bindings?: Bindings;
|
|
28
28
|
}
|
|
29
29
|
declare const InteractiveImageEditor: $$__sveltets_2_IsomorphicComponent<{
|
|
30
|
-
brush: IBrush;
|
|
31
|
-
eraser: Eraser;
|
|
30
|
+
brush: IBrush | false;
|
|
31
|
+
eraser: Eraser | false;
|
|
32
32
|
sources: Source[];
|
|
33
33
|
i18n: I18nFormatter;
|
|
34
34
|
root: string;
|
|
@@ -39,18 +39,18 @@ declare const InteractiveImageEditor: $$__sveltets_2_IsomorphicComponent<{
|
|
|
39
39
|
layers: FileData[];
|
|
40
40
|
composite: FileData | null;
|
|
41
41
|
background: FileData | null;
|
|
42
|
-
layer_options
|
|
42
|
+
layer_options?: LayerOptions;
|
|
43
43
|
transforms: Transform[];
|
|
44
44
|
accept_blobs: (a: any) => void;
|
|
45
45
|
canvas_size: [number, number];
|
|
46
46
|
fixed_canvas?: boolean;
|
|
47
|
-
realtime
|
|
47
|
+
realtime?: boolean;
|
|
48
48
|
upload: Client["upload"];
|
|
49
49
|
is_dragging: boolean;
|
|
50
50
|
placeholder?: string | undefined;
|
|
51
51
|
border_region: number;
|
|
52
52
|
full_history?: CommandNode | null;
|
|
53
|
-
webcam_options
|
|
53
|
+
webcam_options?: WebcamOptions;
|
|
54
54
|
show_download_button?: boolean;
|
|
55
55
|
get_data?: () => Promise<ImageBlobs>;
|
|
56
56
|
image_id?: null | string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { type
|
|
2
|
+
import { type Component } from "svelte";
|
|
3
3
|
import type { ColorInput } from "tinycolor2";
|
|
4
|
-
export let Icon:
|
|
4
|
+
export let Icon: Component<any>;
|
|
5
5
|
export let label = "";
|
|
6
6
|
export let show_label = false;
|
|
7
7
|
export let pending = false;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Component } from "svelte";
|
|
2
2
|
import type { ColorInput } from "tinycolor2";
|
|
3
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
4
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -14,7 +14,7 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
|
|
|
14
14
|
z_$$bindings?: Bindings;
|
|
15
15
|
}
|
|
16
16
|
declare const IconButton: $$__sveltets_2_IsomorphicComponent<{
|
|
17
|
-
Icon:
|
|
17
|
+
Icon: Component<any>;
|
|
18
18
|
label?: string;
|
|
19
19
|
show_label?: boolean;
|
|
20
20
|
pending?: boolean;
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
export let canvas_size: [number, number];
|
|
48
48
|
export let is_dragging = false;
|
|
49
49
|
export let background_image = false;
|
|
50
|
-
export let brush_options: Brush;
|
|
51
|
-
export let eraser_options: Eraser;
|
|
50
|
+
export let brush_options: Brush | false;
|
|
51
|
+
export let eraser_options: Eraser | false;
|
|
52
52
|
export let fixed_canvas = false;
|
|
53
53
|
export let root: string;
|
|
54
54
|
export let i18n: I18nFormatter;
|
|
@@ -371,8 +371,12 @@
|
|
|
371
371
|
ready = true;
|
|
372
372
|
if (sources.length > 0) {
|
|
373
373
|
handle_tool_change({ tool: "image" });
|
|
374
|
-
} else {
|
|
374
|
+
} else if (brush_options) {
|
|
375
375
|
handle_tool_change({ tool: "draw" });
|
|
376
|
+
} else if (eraser_options) {
|
|
377
|
+
handle_tool_change({ tool: "erase" });
|
|
378
|
+
} else {
|
|
379
|
+
handle_tool_change({ tool: "image" });
|
|
376
380
|
}
|
|
377
381
|
crop.set_subtool("crop");
|
|
378
382
|
});
|
|
@@ -513,10 +517,12 @@
|
|
|
513
517
|
}
|
|
514
518
|
|
|
515
519
|
function update_brush_options(): void {
|
|
520
|
+
if (!brush_options) return;
|
|
521
|
+
const options = brush_options;
|
|
516
522
|
const default_color =
|
|
517
|
-
|
|
518
|
-
?
|
|
519
|
-
:
|
|
523
|
+
options.default_color === "auto"
|
|
524
|
+
? options.colors[0]
|
|
525
|
+
: options.default_color;
|
|
520
526
|
|
|
521
527
|
// color is already a tuple [color, opacity]
|
|
522
528
|
if (Array.isArray(default_color)) {
|
|
@@ -535,14 +541,14 @@
|
|
|
535
541
|
}
|
|
536
542
|
|
|
537
543
|
selected_size =
|
|
538
|
-
typeof
|
|
539
|
-
? brush_options.default_size
|
|
540
|
-
: 25;
|
|
544
|
+
typeof options.default_size === "number" ? options.default_size : 25;
|
|
541
545
|
}
|
|
542
546
|
|
|
543
547
|
function update_eraser_options(): void {
|
|
548
|
+
if (!eraser_options) return;
|
|
549
|
+
const options = eraser_options;
|
|
544
550
|
selected_eraser_size =
|
|
545
|
-
|
|
551
|
+
options.default_size === "auto" ? 25 : options.default_size;
|
|
546
552
|
}
|
|
547
553
|
|
|
548
554
|
let brush_size_visible = false;
|
|
@@ -553,12 +559,14 @@
|
|
|
553
559
|
(() => {
|
|
554
560
|
let color_value;
|
|
555
561
|
if (selected_color === "auto") {
|
|
562
|
+
if (!brush_options) return "black";
|
|
563
|
+
const options = brush_options;
|
|
556
564
|
const default_color =
|
|
557
|
-
|
|
565
|
+
options.colors.find((color) =>
|
|
558
566
|
Array.isArray(color)
|
|
559
|
-
? color[0] ===
|
|
560
|
-
: color ===
|
|
561
|
-
) ||
|
|
567
|
+
? color[0] === options.default_color
|
|
568
|
+
: color === options.default_color
|
|
569
|
+
) || options.colors[0];
|
|
562
570
|
|
|
563
571
|
color_value = Array.isArray(default_color)
|
|
564
572
|
? default_color[0]
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
brush_options && typeof brush_options.default_size === "number"
|
|
44
44
|
? brush_options.default_size
|
|
45
45
|
: 25;
|
|
46
|
-
export let eraser_options: EraserType;
|
|
46
|
+
export let eraser_options: EraserType | false;
|
|
47
47
|
export let selected_eraser_size =
|
|
48
48
|
eraser_options && typeof eraser_options.default_size === "number"
|
|
49
49
|
? eraser_options.default_size
|
|
@@ -21,7 +21,7 @@ declare const Toolbar: $$__sveltets_2_IsomorphicComponent<{
|
|
|
21
21
|
background?: boolean;
|
|
22
22
|
brush_options: BrushType | false;
|
|
23
23
|
selected_size?: number;
|
|
24
|
-
eraser_options: EraserType;
|
|
24
|
+
eraser_options: EraserType | false;
|
|
25
25
|
selected_eraser_size?: number;
|
|
26
26
|
selected_color?: any;
|
|
27
27
|
selected_opacity?: any;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SelectData, ShareData } from "@gradio/utils";
|
|
2
|
-
import type { LoadingStatus } from "@gradio/statustracker";
|
|
2
|
+
import type { ILoadingStatus as LoadingStatus } from "@gradio/statustracker";
|
|
3
3
|
import type { CommandNode } from "./shared/core/commands";
|
|
4
4
|
import type { LayerOptions, Source, Transform, WebcamOptions } from "./shared/types";
|
|
5
5
|
import type { Brush, Eraser } from "./shared/brush/types";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gradio/imageeditor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Gradio UI packages",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "",
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"pixi-filters": "^6.1.4",
|
|
12
12
|
"pixi.js": "^8.14.0",
|
|
13
13
|
"tinycolor2": "^1.6.0",
|
|
14
|
-
"@gradio/atoms": "^0.
|
|
15
|
-
"@gradio/client": "^2.2.0",
|
|
16
|
-
"@gradio/image": "^0.26.3",
|
|
14
|
+
"@gradio/atoms": "^0.25.0",
|
|
17
15
|
"@gradio/icons": "^0.15.1",
|
|
18
|
-
"@gradio/
|
|
19
|
-
"@gradio/
|
|
20
|
-
"@gradio/
|
|
16
|
+
"@gradio/image": "^0.27.0",
|
|
17
|
+
"@gradio/statustracker": "^0.15.0",
|
|
18
|
+
"@gradio/upload": "^0.18.0",
|
|
19
|
+
"@gradio/utils": "^0.13.0",
|
|
20
|
+
"@gradio/client": "^2.3.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@gradio/preview": "^0.16.2"
|
package/shared/IconButton.svelte
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { type
|
|
2
|
+
import { type Component } from "svelte";
|
|
3
3
|
import type { ColorInput } from "tinycolor2";
|
|
4
|
-
export let Icon:
|
|
4
|
+
export let Icon: Component<any>;
|
|
5
5
|
export let label = "";
|
|
6
6
|
export let show_label = false;
|
|
7
7
|
export let pending = false;
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
export let canvas_size: [number, number];
|
|
48
48
|
export let is_dragging = false;
|
|
49
49
|
export let background_image = false;
|
|
50
|
-
export let brush_options: Brush;
|
|
51
|
-
export let eraser_options: Eraser;
|
|
50
|
+
export let brush_options: Brush | false;
|
|
51
|
+
export let eraser_options: Eraser | false;
|
|
52
52
|
export let fixed_canvas = false;
|
|
53
53
|
export let root: string;
|
|
54
54
|
export let i18n: I18nFormatter;
|
|
@@ -371,8 +371,12 @@
|
|
|
371
371
|
ready = true;
|
|
372
372
|
if (sources.length > 0) {
|
|
373
373
|
handle_tool_change({ tool: "image" });
|
|
374
|
-
} else {
|
|
374
|
+
} else if (brush_options) {
|
|
375
375
|
handle_tool_change({ tool: "draw" });
|
|
376
|
+
} else if (eraser_options) {
|
|
377
|
+
handle_tool_change({ tool: "erase" });
|
|
378
|
+
} else {
|
|
379
|
+
handle_tool_change({ tool: "image" });
|
|
376
380
|
}
|
|
377
381
|
crop.set_subtool("crop");
|
|
378
382
|
});
|
|
@@ -513,10 +517,12 @@
|
|
|
513
517
|
}
|
|
514
518
|
|
|
515
519
|
function update_brush_options(): void {
|
|
520
|
+
if (!brush_options) return;
|
|
521
|
+
const options = brush_options;
|
|
516
522
|
const default_color =
|
|
517
|
-
|
|
518
|
-
?
|
|
519
|
-
:
|
|
523
|
+
options.default_color === "auto"
|
|
524
|
+
? options.colors[0]
|
|
525
|
+
: options.default_color;
|
|
520
526
|
|
|
521
527
|
// color is already a tuple [color, opacity]
|
|
522
528
|
if (Array.isArray(default_color)) {
|
|
@@ -535,14 +541,14 @@
|
|
|
535
541
|
}
|
|
536
542
|
|
|
537
543
|
selected_size =
|
|
538
|
-
typeof
|
|
539
|
-
? brush_options.default_size
|
|
540
|
-
: 25;
|
|
544
|
+
typeof options.default_size === "number" ? options.default_size : 25;
|
|
541
545
|
}
|
|
542
546
|
|
|
543
547
|
function update_eraser_options(): void {
|
|
548
|
+
if (!eraser_options) return;
|
|
549
|
+
const options = eraser_options;
|
|
544
550
|
selected_eraser_size =
|
|
545
|
-
|
|
551
|
+
options.default_size === "auto" ? 25 : options.default_size;
|
|
546
552
|
}
|
|
547
553
|
|
|
548
554
|
let brush_size_visible = false;
|
|
@@ -553,12 +559,14 @@
|
|
|
553
559
|
(() => {
|
|
554
560
|
let color_value;
|
|
555
561
|
if (selected_color === "auto") {
|
|
562
|
+
if (!brush_options) return "black";
|
|
563
|
+
const options = brush_options;
|
|
556
564
|
const default_color =
|
|
557
|
-
|
|
565
|
+
options.colors.find((color) =>
|
|
558
566
|
Array.isArray(color)
|
|
559
|
-
? color[0] ===
|
|
560
|
-
: color ===
|
|
561
|
-
) ||
|
|
567
|
+
? color[0] === options.default_color
|
|
568
|
+
: color === options.default_color
|
|
569
|
+
) || options.colors[0];
|
|
562
570
|
|
|
563
571
|
color_value = Array.isArray(default_color)
|
|
564
572
|
? default_color[0]
|
package/shared/Toolbar.svelte
CHANGED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
brush_options && typeof brush_options.default_size === "number"
|
|
44
44
|
? brush_options.default_size
|
|
45
45
|
: 25;
|
|
46
|
-
export let eraser_options: EraserType;
|
|
46
|
+
export let eraser_options: EraserType | false;
|
|
47
47
|
export let selected_eraser_size =
|
|
48
48
|
eraser_options && typeof eraser_options.default_size === "number"
|
|
49
49
|
? eraser_options.default_size
|
package/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SelectData, ShareData } from "@gradio/utils";
|
|
2
|
-
import type { LoadingStatus } from "@gradio/statustracker";
|
|
2
|
+
import type { ILoadingStatus as LoadingStatus } from "@gradio/statustracker";
|
|
3
3
|
import type { CommandNode } from "./shared/core/commands";
|
|
4
4
|
import type {
|
|
5
5
|
LayerOptions,
|