@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 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.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;
@@ -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
- brush_options.default_color === "auto"
518
- ? brush_options.colors[0]
519
- : brush_options.default_color;
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 brush_options.default_size === "number"
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
- eraser_options.default_size === "auto" ? 25 : eraser_options.default_size;
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
- brush_options.colors.find((color) =>
565
+ options.colors.find((color) =>
558
566
  Array.isArray(color)
559
- ? color[0] === brush_options.default_color
560
- : color === brush_options.default_color
561
- ) || brush_options.colors[0];
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.18.11",
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.0",
16
- "@gradio/image": "^0.26.3",
14
+ "@gradio/atoms": "^0.25.0",
17
15
  "@gradio/icons": "^0.15.1",
18
- "@gradio/statustracker": "^0.14.1",
19
- "@gradio/upload": "^0.17.9",
20
- "@gradio/utils": "^0.12.2"
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;
@@ -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
- brush_options.default_color === "auto"
518
- ? brush_options.colors[0]
519
- : brush_options.default_color;
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 brush_options.default_size === "number"
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
- eraser_options.default_size === "auto" ? 25 : eraser_options.default_size;
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
- brush_options.colors.find((color) =>
565
+ options.colors.find((color) =>
558
566
  Array.isArray(color)
559
- ? color[0] === brush_options.default_color
560
- : color === brush_options.default_color
561
- ) || brush_options.colors[0];
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
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,