@gradio/imageeditor 0.18.12 → 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 CHANGED
@@ -1,5 +1,26 @@
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
+
3
24
  ## 0.18.12
4
25
 
5
26
  ### Fixes
@@ -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.includes("apply")}
197
- realtime={gradio.shared.attached_events.includes("change") ||
198
- gradio.shared.attached_events.includes("input")}
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: boolean;
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.includes("apply")}
197
- realtime={gradio.shared.attached_events.includes("change") ||
198
- gradio.shared.attached_events.includes("input")}
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: boolean;
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: LayerOptions;
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: boolean;
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: WebcamOptions;
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 ComponentType } from "svelte";
2
+ import { type Component } from "svelte";
3
3
  import type { ColorInput } from "tinycolor2";
4
- export let Icon: ComponentType;
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 ComponentType } from "svelte";
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: ComponentType;
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;
@@ -517,10 +517,12 @@
517
517
  }
518
518
 
519
519
  function update_brush_options(): void {
520
+ if (!brush_options) return;
521
+ const options = brush_options;
520
522
  const default_color =
521
- brush_options.default_color === "auto"
522
- ? brush_options.colors[0]
523
- : brush_options.default_color;
523
+ options.default_color === "auto"
524
+ ? options.colors[0]
525
+ : options.default_color;
524
526
 
525
527
  // color is already a tuple [color, opacity]
526
528
  if (Array.isArray(default_color)) {
@@ -539,14 +541,14 @@
539
541
  }
540
542
 
541
543
  selected_size =
542
- typeof brush_options.default_size === "number"
543
- ? brush_options.default_size
544
- : 25;
544
+ typeof options.default_size === "number" ? options.default_size : 25;
545
545
  }
546
546
 
547
547
  function update_eraser_options(): void {
548
+ if (!eraser_options) return;
549
+ const options = eraser_options;
548
550
  selected_eraser_size =
549
- eraser_options.default_size === "auto" ? 25 : eraser_options.default_size;
551
+ options.default_size === "auto" ? 25 : options.default_size;
550
552
  }
551
553
 
552
554
  let brush_size_visible = false;
@@ -557,12 +559,14 @@
557
559
  (() => {
558
560
  let color_value;
559
561
  if (selected_color === "auto") {
562
+ if (!brush_options) return "black";
563
+ const options = brush_options;
560
564
  const default_color =
561
- brush_options.colors.find((color) =>
565
+ options.colors.find((color) =>
562
566
  Array.isArray(color)
563
- ? color[0] === brush_options.default_color
564
- : color === brush_options.default_color
565
- ) || brush_options.colors[0];
567
+ ? color[0] === options.default_color
568
+ : color === options.default_color
569
+ ) || options.colors[0];
566
570
 
567
571
  color_value = Array.isArray(default_color)
568
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.18.12",
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.24.0",
15
- "@gradio/client": "^2.2.1",
14
+ "@gradio/atoms": "^0.25.0",
16
15
  "@gradio/icons": "^0.15.1",
17
- "@gradio/image": "^0.26.3",
18
- "@gradio/statustracker": "^0.14.1",
19
- "@gradio/utils": "^0.12.2",
20
- "@gradio/upload": "^0.17.10"
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"
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
- import { type ComponentType } from "svelte";
2
+ import { type Component } from "svelte";
3
3
  import type { ColorInput } from "tinycolor2";
4
- export let Icon: ComponentType;
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;
@@ -517,10 +517,12 @@
517
517
  }
518
518
 
519
519
  function update_brush_options(): void {
520
+ if (!brush_options) return;
521
+ const options = brush_options;
520
522
  const default_color =
521
- brush_options.default_color === "auto"
522
- ? brush_options.colors[0]
523
- : brush_options.default_color;
523
+ options.default_color === "auto"
524
+ ? options.colors[0]
525
+ : options.default_color;
524
526
 
525
527
  // color is already a tuple [color, opacity]
526
528
  if (Array.isArray(default_color)) {
@@ -539,14 +541,14 @@
539
541
  }
540
542
 
541
543
  selected_size =
542
- typeof brush_options.default_size === "number"
543
- ? brush_options.default_size
544
- : 25;
544
+ typeof options.default_size === "number" ? options.default_size : 25;
545
545
  }
546
546
 
547
547
  function update_eraser_options(): void {
548
+ if (!eraser_options) return;
549
+ const options = eraser_options;
548
550
  selected_eraser_size =
549
- eraser_options.default_size === "auto" ? 25 : eraser_options.default_size;
551
+ options.default_size === "auto" ? 25 : options.default_size;
550
552
  }
551
553
 
552
554
  let brush_size_visible = false;
@@ -557,12 +559,14 @@
557
559
  (() => {
558
560
  let color_value;
559
561
  if (selected_color === "auto") {
562
+ if (!brush_options) return "black";
563
+ const options = brush_options;
560
564
  const default_color =
561
- brush_options.colors.find((color) =>
565
+ options.colors.find((color) =>
562
566
  Array.isArray(color)
563
- ? color[0] === brush_options.default_color
564
- : color === brush_options.default_color
565
- ) || brush_options.colors[0];
567
+ ? color[0] === options.default_color
568
+ : color === options.default_color
569
+ ) || options.colors[0];
566
570
 
567
571
  color_value = Array.isArray(default_color)
568
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
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,