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