@gradio/imageeditor 0.12.14 → 0.14.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.
Files changed (131) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/Example.svelte +1 -1
  3. package/IMAGE_EDITOR_OVERVIEW.md +224 -0
  4. package/ImageEditor.stories.svelte +13 -5
  5. package/Index.svelte +46 -45
  6. package/{shared/InteractiveImageEditor.svelte → InteractiveImageEditor.svelte} +65 -103
  7. package/README.md +2 -0
  8. package/dist/Example.svelte.d.ts +1 -1
  9. package/dist/Index.svelte +35 -33
  10. package/dist/Index.svelte.d.ts +25 -16
  11. package/dist/{shared/InteractiveImageEditor.svelte → InteractiveImageEditor.svelte} +54 -88
  12. package/dist/{shared/InteractiveImageEditor.svelte.d.ts → InteractiveImageEditor.svelte.d.ts} +17 -15
  13. package/dist/shared/Anchor.svelte +311 -0
  14. package/dist/shared/Anchor.svelte.d.ts +18 -0
  15. package/dist/shared/Controls.svelte +169 -18
  16. package/dist/shared/Controls.svelte.d.ts +9 -2
  17. package/dist/shared/{tools/IconButton.svelte → IconButton.svelte} +19 -3
  18. package/dist/shared/{tools/IconButton.svelte.d.ts → IconButton.svelte.d.ts} +4 -1
  19. package/dist/shared/ImageEditor.svelte +572 -289
  20. package/dist/shared/ImageEditor.svelte.d.ts +54 -56
  21. package/dist/shared/Layers.svelte +260 -0
  22. package/dist/shared/Layers.svelte.d.ts +37 -0
  23. package/dist/shared/Resize.svelte +218 -0
  24. package/dist/shared/Resize.svelte.d.ts +29 -0
  25. package/dist/shared/SecondaryToolbar.svelte +55 -0
  26. package/dist/shared/SecondaryToolbar.svelte.d.ts +37 -0
  27. package/dist/shared/Toolbar.svelte +337 -0
  28. package/dist/shared/Toolbar.svelte.d.ts +42 -0
  29. package/dist/shared/{tools → brush}/BrushOptions.svelte +68 -64
  30. package/dist/shared/{tools → brush}/BrushOptions.svelte.d.ts +9 -9
  31. package/dist/shared/{tools → brush}/BrushSize.svelte +2 -27
  32. package/dist/shared/{tools → brush}/ColorField.svelte +2 -1
  33. package/dist/shared/{tools → brush}/ColorField.svelte.d.ts +1 -0
  34. package/dist/shared/{tools → brush}/ColorPicker.svelte +81 -9
  35. package/dist/shared/{tools → brush}/ColorPicker.svelte.d.ts +1 -0
  36. package/dist/shared/{tools → brush}/ColorSwatch.svelte +78 -38
  37. package/dist/shared/{tools → brush}/ColorSwatch.svelte.d.ts +6 -2
  38. package/dist/shared/brush/brush-cursor.d.ts +101 -0
  39. package/dist/shared/brush/brush-cursor.js +327 -0
  40. package/dist/shared/brush/brush-textures.d.ts +65 -0
  41. package/dist/shared/brush/brush-textures.js +385 -0
  42. package/dist/shared/brush/brush-utils.d.ts +32 -0
  43. package/dist/shared/brush/brush-utils.js +59 -0
  44. package/dist/shared/brush/brush.d.ts +152 -0
  45. package/dist/shared/brush/brush.js +397 -0
  46. package/dist/shared/brush/types.d.ts +37 -0
  47. package/dist/shared/brush/types.js +1 -0
  48. package/dist/shared/core/editor.d.ts +261 -0
  49. package/dist/shared/core/editor.js +1264 -0
  50. package/dist/shared/crop/crop.d.ts +201 -0
  51. package/dist/shared/crop/crop.js +727 -0
  52. package/dist/shared/image/image.d.ts +89 -0
  53. package/dist/shared/image/image.js +183 -0
  54. package/dist/shared/resize/resize.d.ts +270 -0
  55. package/dist/shared/resize/resize.js +1413 -0
  56. package/dist/shared/types.d.ts +16 -0
  57. package/dist/shared/utils/pixi.d.ts +16 -57
  58. package/dist/shared/utils/pixi.js +15 -113
  59. package/dist/shared/zoom/zoom.d.ts +136 -0
  60. package/dist/shared/zoom/zoom.js +548 -0
  61. package/package.json +8 -7
  62. package/shared/Anchor.svelte +384 -0
  63. package/shared/Controls.svelte +178 -37
  64. package/shared/{tools/IconButton.svelte → IconButton.svelte} +21 -4
  65. package/shared/ImageEditor.svelte +712 -350
  66. package/shared/Layers.svelte +282 -0
  67. package/shared/Resize.svelte +239 -0
  68. package/shared/SecondaryToolbar.svelte +67 -0
  69. package/shared/Toolbar.svelte +386 -0
  70. package/shared/brush/BRUSH_TOOL.md +134 -0
  71. package/shared/brush/BrushOptions.svelte +200 -0
  72. package/shared/{tools → brush}/BrushSize.svelte +2 -30
  73. package/shared/{tools → brush}/ColorField.svelte +3 -1
  74. package/shared/{tools → brush}/ColorPicker.svelte +86 -9
  75. package/shared/{tools → brush}/ColorSwatch.svelte +95 -42
  76. package/shared/brush/brush-cursor.ts +408 -0
  77. package/shared/brush/brush-textures.ts +485 -0
  78. package/shared/brush/brush-utils.ts +76 -0
  79. package/shared/brush/brush.ts +510 -0
  80. package/shared/brush/types.ts +41 -0
  81. package/shared/core/EDITOR.md +182 -0
  82. package/shared/core/editor.ts +1788 -0
  83. package/shared/crop/CROP.md +139 -0
  84. package/shared/crop/crop.ts +1027 -0
  85. package/shared/image/IMAGE.md +135 -0
  86. package/shared/image/image.ts +298 -0
  87. package/shared/resize/resize.ts +1894 -0
  88. package/shared/types.ts +19 -0
  89. package/shared/utils/pixi.ts +19 -246
  90. package/shared/zoom/zoom.ts +729 -0
  91. package/dist/shared/layers/Layers.svelte +0 -231
  92. package/dist/shared/layers/Layers.svelte.d.ts +0 -18
  93. package/dist/shared/layers/utils.d.ts +0 -73
  94. package/dist/shared/layers/utils.js +0 -156
  95. package/dist/shared/tools/Brush.svelte +0 -215
  96. package/dist/shared/tools/Brush.svelte.d.ts +0 -29
  97. package/dist/shared/tools/Crop.svelte +0 -155
  98. package/dist/shared/tools/Crop.svelte.d.ts +0 -16
  99. package/dist/shared/tools/Cropper.svelte +0 -271
  100. package/dist/shared/tools/Cropper.svelte.d.ts +0 -41
  101. package/dist/shared/tools/Handle.svelte +0 -260
  102. package/dist/shared/tools/Handle.svelte.d.ts +0 -29
  103. package/dist/shared/tools/Sources.svelte +0 -257
  104. package/dist/shared/tools/Sources.svelte.d.ts +0 -34
  105. package/dist/shared/tools/Tools.svelte +0 -102
  106. package/dist/shared/tools/Tools.svelte.d.ts +0 -48
  107. package/dist/shared/tools/brush.d.ts +0 -62
  108. package/dist/shared/tools/brush.js +0 -133
  109. package/dist/shared/tools/crop.d.ts +0 -15
  110. package/dist/shared/tools/crop.js +0 -154
  111. package/dist/shared/tools/index.d.ts +0 -5
  112. package/dist/shared/tools/index.js +0 -5
  113. package/dist/shared/tools/sources.d.ts +0 -46
  114. package/dist/shared/tools/sources.js +0 -121
  115. package/dist/shared/tools/types.d.ts +0 -1
  116. package/shared/layers/Layers.svelte +0 -250
  117. package/shared/layers/utils.ts +0 -294
  118. package/shared/tools/Brush.svelte +0 -280
  119. package/shared/tools/BrushOptions.svelte +0 -180
  120. package/shared/tools/Crop.svelte +0 -189
  121. package/shared/tools/Cropper.svelte +0 -346
  122. package/shared/tools/Handle.svelte +0 -289
  123. package/shared/tools/Sources.svelte +0 -283
  124. package/shared/tools/Tools.svelte +0 -162
  125. package/shared/tools/brush.ts +0 -247
  126. package/shared/tools/crop.ts +0 -213
  127. package/shared/tools/index.ts +0 -5
  128. package/shared/tools/sources.ts +0 -195
  129. package/shared/tools/types.ts +0 -1
  130. /package/dist/shared/{tools → brush}/BrushSize.svelte.d.ts +0 -0
  131. /package/dist/shared/{tools/types.js → types.js} +0 -0
@@ -1,45 +1,115 @@
1
1
  <script>import { createEventDispatcher } from "svelte";
2
2
  import { IconButton, IconButtonWrapper } from "@gradio/atoms";
3
- import { Undo, Redo, Check, Trash } from "@gradio/icons";
4
- export let can_undo = false;
5
- export let can_redo = false;
3
+ import { Check, Trash, ZoomIn, ZoomOut, Pan, Download } from "@gradio/icons";
6
4
  export let can_save = false;
7
5
  export let changeable = false;
6
+ export let current_zoom = 1;
7
+ export let tool;
8
+ export let min_zoom = true;
9
+ export let enable_download = false;
8
10
  const dispatch = createEventDispatcher();
11
+ let show_zoom_popup = false;
12
+ function handle_zoom_click(e) {
13
+ e.stopPropagation();
14
+ show_zoom_popup = !show_zoom_popup;
15
+ }
16
+ function handle_zoom_change(zoom) {
17
+ dispatch("set_zoom", zoom);
18
+ show_zoom_popup = false;
19
+ }
20
+ function handle_zoom_keydown(e) {
21
+ if (e.key === "Enter") {
22
+ handle_zoom_change(current_zoom);
23
+ }
24
+ }
25
+ $:
26
+ formatted_zoom = Math.round(current_zoom * 100);
9
27
  </script>
10
28
 
11
29
  <IconButtonWrapper>
12
- {#if changeable}
30
+ {#if enable_download}
13
31
  <IconButton
14
- disabled={!can_save}
15
- Icon={Check}
16
- label="Save changes"
32
+ Icon={Download}
33
+ label="Download"
17
34
  on:click={(event) => {
18
- dispatch("save");
35
+ dispatch("download");
19
36
  event.stopPropagation();
20
37
  }}
21
- background={"var(--color-green-500)"}
22
- color={"#fff"}
23
38
  />
24
39
  {/if}
40
+
41
+ <IconButton
42
+ Icon={Pan}
43
+ label="Pan"
44
+ on:click={(e) => {
45
+ e.stopPropagation();
46
+ dispatch("pan");
47
+ }}
48
+ highlight={tool === "pan"}
49
+ size="small"
50
+ padded={false}
51
+ transparent={true}
52
+ disabled={min_zoom}
53
+ />
54
+
25
55
  <IconButton
26
- disabled={!can_undo}
27
- Icon={Undo}
28
- label="Undo"
56
+ Icon={ZoomOut}
57
+ label="Zoom out"
29
58
  on:click={(event) => {
30
- dispatch("undo");
59
+ dispatch("zoom_out");
31
60
  event.stopPropagation();
32
61
  }}
33
62
  />
34
63
  <IconButton
35
- disabled={!can_redo}
36
- Icon={Redo}
37
- label="Redo"
64
+ Icon={ZoomIn}
65
+ label="Zoom in"
38
66
  on:click={(event) => {
39
- dispatch("redo");
67
+ dispatch("zoom_in");
40
68
  event.stopPropagation();
41
69
  }}
42
70
  />
71
+
72
+ <div class="zoom-number">
73
+ <span
74
+ role="button"
75
+ tabindex="0"
76
+ on:click={handle_zoom_click}
77
+ on:keydown={handle_zoom_keydown}>{formatted_zoom}%</span
78
+ >
79
+ {#if show_zoom_popup}
80
+ <div class="zoom-controls">
81
+ <ul>
82
+ <li>
83
+ <button on:click|stopPropagation={() => handle_zoom_change("fit")}>
84
+ Fit to screen
85
+ </button>
86
+ </li>
87
+ {#each [0.25, 0.5, 1, 2, 4] as zoom}
88
+ <li>
89
+ <button on:click|stopPropagation={() => handle_zoom_change(zoom)}>
90
+ {zoom * 100}%
91
+ </button>
92
+ </li>
93
+ {/each}
94
+ </ul>
95
+ </div>
96
+ {/if}
97
+ </div>
98
+ <div class="separator"></div>
99
+
100
+ {#if changeable}
101
+ <IconButton
102
+ disabled={!can_save}
103
+ Icon={Check}
104
+ label="Save changes"
105
+ on:click={(event) => {
106
+ dispatch("save");
107
+ event.stopPropagation();
108
+ }}
109
+ color="var(--color-accent)"
110
+ />
111
+ {/if}
112
+
43
113
  <IconButton
44
114
  Icon={Trash}
45
115
  label="Clear canvas"
@@ -49,3 +119,84 @@ const dispatch = createEventDispatcher();
49
119
  }}
50
120
  />
51
121
  </IconButtonWrapper>
122
+
123
+ <style>
124
+ .separator {
125
+ width: 1px;
126
+ height: 10px;
127
+ background-color: var(--border-color-primary);
128
+ }
129
+
130
+ .zoom-number {
131
+ position: relative;
132
+ width: 30px;
133
+ padding-left: 4px;
134
+ display: flex;
135
+ align-items: center;
136
+ justify-content: center;
137
+ }
138
+
139
+ .zoom-number span {
140
+ cursor: pointer;
141
+ font-size: var(--text-sm);
142
+ transition: color 0.15s ease;
143
+ }
144
+
145
+ .zoom-number span:hover {
146
+ color: var(--color-accent);
147
+ }
148
+
149
+ .zoom-controls {
150
+ position: absolute;
151
+ top: calc(100% + var(--spacing-xxs) + 3px);
152
+ left: -2px;
153
+ background: var(--block-background-fill);
154
+ border: 1px solid var(--color-gray-200);
155
+ border-radius: var(--radius-sm);
156
+ padding: var(--spacing-xxs);
157
+ box-shadow: var(--shadow-drop);
158
+ font-size: 12px;
159
+ z-index: var(--layer-2);
160
+ width: max-content;
161
+ color: var(--block-label-text-color);
162
+ border: 1px solid var(--block-border-color);
163
+ border-top-left-radius: 0;
164
+ border-top-right-radius: 0;
165
+ }
166
+
167
+ .zoom-controls ul {
168
+ list-style: none;
169
+ margin: 0;
170
+ padding: 0;
171
+ }
172
+
173
+ .zoom-controls li {
174
+ display: flex;
175
+ justify-content: space-between;
176
+ align-items: center;
177
+ transition: background-color 0.15s ease;
178
+ border-bottom: 1px solid var(--border-color-primary);
179
+ }
180
+
181
+ .zoom-controls li:last-child {
182
+ border-bottom: none;
183
+ }
184
+
185
+ .zoom-controls li:hover {
186
+ background-color: var(--background-fill-secondary);
187
+ }
188
+
189
+ .zoom-controls button {
190
+ width: 100%;
191
+ text-align: left;
192
+ padding: var(--spacing-sm) var(--spacing-md);
193
+ font-size: var(--text-sm);
194
+ line-height: var(--line-sm);
195
+ transition: all 0.15s ease;
196
+ border-radius: var(--radius-sm);
197
+ }
198
+
199
+ .zoom-controls button:hover {
200
+ color: var(--color-accent);
201
+ }
202
+ </style>
@@ -1,16 +1,23 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- can_undo?: boolean | undefined;
5
- can_redo?: boolean | undefined;
6
4
  can_save?: boolean | undefined;
7
5
  changeable?: boolean | undefined;
6
+ current_zoom?: number | undefined;
7
+ tool: string;
8
+ min_zoom?: boolean | undefined;
9
+ enable_download?: boolean | undefined;
8
10
  };
9
11
  events: {
10
12
  remove_image: CustomEvent<void>;
11
13
  undo: CustomEvent<void>;
12
14
  redo: CustomEvent<void>;
13
15
  save: CustomEvent<void>;
16
+ zoom_in: CustomEvent<void>;
17
+ zoom_out: CustomEvent<void>;
18
+ set_zoom: CustomEvent<number | "fit">;
19
+ pan: CustomEvent<void>;
20
+ download: CustomEvent<void>;
14
21
  } & {
15
22
  [evt: string]: CustomEvent<any>;
16
23
  };
@@ -12,8 +12,10 @@ export let color = "var(--block-label-text-color)";
12
12
  export let transparent = false;
13
13
  export let background = "var(--background-fill-primary)";
14
14
  export let offset = 0;
15
+ export let label_position = "left";
16
+ export let roundedness = "quite";
15
17
  $:
16
- _color = highlight ? "var(--color-accent)" : color;
18
+ _color = highlight ? "var(--color-accent)" : color.toString();
17
19
  </script>
18
20
 
19
21
  <button
@@ -29,8 +31,11 @@ $:
29
31
  style:color={!disabled && _color ? _color : "var(--block-label-text-color)"}
30
32
  style:--bg-color={!disabled ? background : "auto"}
31
33
  style:margin-left={offset + "px"}
34
+ class="{roundedness}-round"
32
35
  >
33
- {#if show_label}<span>{label}</span>{/if}
36
+ {#if show_label && label_position === "left"}
37
+ <span style="margin-left: 4px;">{label}</span>
38
+ {/if}
34
39
  <div
35
40
  class:small={size === "small"}
36
41
  class:large={size === "large"}
@@ -38,6 +43,9 @@ $:
38
43
  >
39
44
  <Icon />
40
45
  </div>
46
+ {#if show_label && label_position === "right"}
47
+ <span style="margin-right: 4px;">{label}</span>
48
+ {/if}
41
49
  </button>
42
50
 
43
51
  <style>
@@ -48,11 +56,19 @@ $:
48
56
  gap: 1px;
49
57
  z-index: var(--layer-2);
50
58
  /* background: var(--background-fill-primary); */
51
- border-radius: var(--radius-sm);
59
+ /* border-radius: var(--radius-sm); */
52
60
  color: var(--block-label-text-color);
53
61
  border: 1px solid transparent;
54
62
  }
55
63
 
64
+ .quite-round {
65
+ border-radius: var(--radius-sm);
66
+ }
67
+
68
+ .very-round {
69
+ border-radius: var(--radius-md);
70
+ }
71
+
56
72
  button[disabled] {
57
73
  opacity: 0.5;
58
74
  box-shadow: none;
@@ -1,5 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import { type ComponentType } from "svelte";
3
+ import type { ColorInput } from "tinycolor2";
3
4
  declare const __propDef: {
4
5
  props: {
5
6
  Icon: ComponentType;
@@ -11,10 +12,12 @@ declare const __propDef: {
11
12
  highlight?: boolean | undefined;
12
13
  disabled?: boolean | undefined;
13
14
  hasPopup?: boolean | undefined;
14
- color?: string | undefined;
15
+ color?: (string | ColorInput) | undefined;
15
16
  transparent?: boolean | undefined;
16
17
  background?: string | undefined;
17
18
  offset?: number | undefined;
19
+ label_position?: ("left" | "right") | undefined;
20
+ roundedness?: ("quite" | "very") | undefined;
18
21
  };
19
22
  events: {
20
23
  click: MouseEvent;