@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
@@ -0,0 +1,282 @@
1
+ <script lang="ts">
2
+ import { click_outside } from "./utils/events";
3
+ import {
4
+ Layers,
5
+ Clear,
6
+ ArrowUp,
7
+ ArrowDown,
8
+ Plus,
9
+ Visibility,
10
+ VisibilityOff
11
+ } from "@gradio/icons";
12
+ import { IconButton } from "@gradio/atoms";
13
+ import { createEventDispatcher } from "svelte";
14
+ import type { Writable } from "svelte/store";
15
+
16
+ const dispatch = createEventDispatcher<{
17
+ new_layer: void;
18
+ change_layer: string;
19
+ move_layer: { id: string; direction: "up" | "down" };
20
+ delete_layer: string;
21
+ toggle_layer_visibility: string;
22
+ }>();
23
+
24
+ export let layers: Writable<{
25
+ active_layer: string;
26
+ layers: {
27
+ name: string;
28
+ id: string;
29
+ user_created: boolean;
30
+ visible: boolean;
31
+ }[];
32
+ }>;
33
+ export let enable_additional_layers = true;
34
+ export let enable_layers = true;
35
+ export let show_layers = false;
36
+
37
+ function new_layer(): void {
38
+ dispatch("new_layer");
39
+ }
40
+
41
+ function change_layer(id: string): void {
42
+ dispatch("change_layer", id);
43
+ show_layers = false;
44
+ }
45
+
46
+ function move_layer(id: string, direction: "up" | "down"): void {
47
+ dispatch("move_layer", { id, direction });
48
+ }
49
+
50
+ function delete_layer(id: string): void {
51
+ dispatch("delete_layer", id);
52
+ }
53
+ </script>
54
+
55
+ {#if enable_layers}
56
+ <div
57
+ class="layer-wrap"
58
+ class:closed={!show_layers}
59
+ use:click_outside={() => (show_layers = false)}
60
+ >
61
+ <button
62
+ class="layer-title-button"
63
+ aria-label="Show Layers"
64
+ on:click|stopPropagation={() => (show_layers = !show_layers)}
65
+ >
66
+ {show_layers
67
+ ? "Layers"
68
+ : $layers.layers.find((l) => l.id === $layers.active_layer)?.name}
69
+ <span class="icon"><Layers /></span>
70
+ </button>
71
+ {#if show_layers}
72
+ <ul>
73
+ {#each $layers.layers as { id, name, user_created, visible }, i (i)}
74
+ <li>
75
+ {#if !visible}
76
+ <IconButton
77
+ Icon={VisibilityOff}
78
+ size="small"
79
+ on:click={(e) => {
80
+ e.stopPropagation();
81
+ dispatch("toggle_layer_visibility", id);
82
+ }}
83
+ />
84
+ {:else}
85
+ <IconButton
86
+ Icon={Visibility}
87
+ size="small"
88
+ on:click={(e) => {
89
+ e.stopPropagation();
90
+ dispatch("toggle_layer_visibility", id);
91
+ }}
92
+ />
93
+ {/if}
94
+ <button
95
+ class:selected_layer={$layers.active_layer === id}
96
+ aria-label={`layer-${i + 1}`}
97
+ on:click|stopPropagation={() => change_layer(id)}>{name}</button
98
+ >
99
+ {#if $layers.layers.length > 1}
100
+ <div>
101
+ {#if i > 0}
102
+ <IconButton
103
+ on:click={(e) => {
104
+ e.stopPropagation();
105
+ move_layer(id, "up");
106
+ }}
107
+ Icon={ArrowUp}
108
+ size="x-small"
109
+ />
110
+ {/if}
111
+ {#if i < $layers.layers.length - 1}
112
+ <IconButton
113
+ on:click={(e) => {
114
+ e.stopPropagation();
115
+ move_layer(id, "down");
116
+ }}
117
+ Icon={ArrowDown}
118
+ size="x-small"
119
+ />
120
+ {/if}
121
+ {#if $layers.layers.length > 1 && user_created}
122
+ <IconButton
123
+ on:click={(e) => {
124
+ e.stopPropagation();
125
+ delete_layer(id);
126
+ }}
127
+ Icon={Clear}
128
+ size="x-small"
129
+ />
130
+ {/if}
131
+ </div>
132
+ {/if}
133
+ </li>
134
+ {/each}
135
+ {#if enable_additional_layers}
136
+ <li class="add-layer">
137
+ <IconButton
138
+ Icon={Plus}
139
+ label="Add Layer"
140
+ on:click={(e) => {
141
+ e.stopPropagation();
142
+ new_layer();
143
+ }}
144
+ size="x-small"
145
+ />
146
+ </li>
147
+ {/if}
148
+ </ul>
149
+ {/if}
150
+ </div>
151
+ {/if}
152
+
153
+ <style>
154
+ .add-layer {
155
+ display: flex;
156
+ justify-content: center;
157
+ align-items: center;
158
+ margin: var(--spacing-sm) 0 0 0;
159
+ }
160
+
161
+ .add-layer :global(button) {
162
+ width: 100%;
163
+ }
164
+ .icon {
165
+ width: 14px;
166
+ color: var(--body-text-color);
167
+ transition: color 0.15s ease;
168
+ }
169
+
170
+ .layer-wrap {
171
+ /* position: absolute; */
172
+ display: flex;
173
+ justify-content: center;
174
+ align-items: center;
175
+ /* border: 1px solid var(--border-color-primary); */
176
+ /* z-index: var(--layer-1); */
177
+ /* border-radius: var(--radius-sm); */
178
+ /* background-color: var(--block-background-fill); */
179
+ width: 100%;
180
+ flex-direction: column;
181
+ /* bottom: 5px; */
182
+ /* right: 5px; */
183
+ /* border-bottom: 0;
184
+ border-right: 0; */
185
+ /* box-shadow: var(--shadow-drop); */
186
+ }
187
+
188
+ .layer-wrap button {
189
+ justify-content: space-between;
190
+ align-items: center;
191
+ width: 100%;
192
+ display: flex;
193
+ font-size: var(--text-sm);
194
+ line-height: var(--line-sm);
195
+ transition: all 0.15s ease;
196
+ padding: var(--spacing-md) var(--spacing-lg);
197
+ /* padding-right: var(--spacing-lg); */
198
+ border-radius: var(--radius-sm);
199
+ /* padding-left: 30px; */
200
+ }
201
+
202
+ button.layer-title-button {
203
+ width: 100%;
204
+ /* padding-left: 30px; */
205
+ }
206
+
207
+ .layer-wrap button:hover .icon {
208
+ color: var(--color-accent);
209
+ }
210
+
211
+ .selected_layer {
212
+ color: var(--color-accent);
213
+ font-weight: var(--weight-semibold);
214
+ }
215
+
216
+ ul {
217
+ /* position: absolute; */
218
+ bottom: 0;
219
+ right: 0;
220
+ /* background: var(--block-background-fill); */
221
+ width: 100%;
222
+ /* min-width: 100%; */
223
+ list-style: none;
224
+ z-index: var(--layer-top);
225
+ /* border: 1px solid var(--border-color-primary); */
226
+ /* border-radius: var(--radius-sm); */
227
+ /* box-shadow: var(--shadow-drop-lg); */
228
+ padding: var(--spacing-sm);
229
+ /* transform: translate(-1px, 1px); */
230
+ border-top: 1px solid var(--border-color-primary);
231
+ }
232
+
233
+ /* .sep {
234
+ height: 12px;
235
+ background-color: var(--block-border-color);
236
+ width: 1px;
237
+ display: block;
238
+ margin-left: var(--spacing-xl);
239
+ } */
240
+
241
+ li {
242
+ display: flex;
243
+ justify-content: space-between;
244
+ align-items: center;
245
+ /* border-radius: var(--radius-sm); */
246
+ transition: background-color 0.15s ease;
247
+ border-bottom: 1px solid var(--border-color-primary);
248
+ }
249
+
250
+ .layer-wrap ul > li > button {
251
+ padding-left: calc(var(--spacing-md));
252
+ }
253
+
254
+ li:hover {
255
+ background-color: var(--background-fill-secondary);
256
+ }
257
+
258
+ li:last-child {
259
+ border-bottom: none;
260
+ }
261
+ li:last-child:hover {
262
+ background-color: unset;
263
+ }
264
+
265
+ li div {
266
+ display: flex;
267
+ gap: var(--spacing-sm);
268
+ padding: var(--spacing-sm);
269
+ }
270
+ li > button {
271
+ padding: var(--spacing-sm) var(--spacing-md);
272
+ }
273
+
274
+ /* li > div > button {
275
+ opacity: 0.7;
276
+ transition: opacity 0.15s ease;
277
+ }
278
+
279
+ li > div > button:hover {
280
+ opacity: 1;
281
+ } */
282
+ </style>
@@ -0,0 +1,239 @@
1
+ <script lang="ts" context="module">
2
+ export type Position =
3
+ | "top-left"
4
+ | "top"
5
+ | "top-right"
6
+ | "left"
7
+ | "center"
8
+ | "right"
9
+ | "bottom-left"
10
+ | "bottom"
11
+ | "bottom-right";
12
+ </script>
13
+
14
+ <script lang="ts">
15
+ import { createEventDispatcher } from "svelte";
16
+ import type { Spring } from "svelte/motion";
17
+ import Anchor from "./Anchor.svelte";
18
+
19
+ export let dimensions: Spring<{ width: number; height: number }>;
20
+
21
+ const dispatch = createEventDispatcher<{
22
+ change: { anchor: Position; scale: boolean; width: number; height: number };
23
+ }>();
24
+
25
+ let selected_anchor: Position = "center";
26
+ let scale = false;
27
+
28
+ let new_width = $dimensions?.width;
29
+ let new_height = $dimensions?.height;
30
+
31
+ function handle_click(): void {
32
+ dispatch("change", {
33
+ anchor: selected_anchor,
34
+ scale,
35
+ width: new_width,
36
+ height: new_height
37
+ });
38
+ }
39
+
40
+ function set_anchor(position: Position): void {
41
+ selected_anchor = position;
42
+ }
43
+ </script>
44
+
45
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
46
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
47
+ <div class="wrap" on:click|stopPropagation>
48
+ <div class="size-wrap">
49
+ <div class="size-input">
50
+ <label for="width">Width</label><input
51
+ type="number"
52
+ id="width"
53
+ bind:value={new_width}
54
+ />
55
+ </div>
56
+ <div class="size-input">
57
+ <label for="height">Height </label><input
58
+ type="number"
59
+ id="height"
60
+ bind:value={new_height}
61
+ />
62
+ </div>
63
+ </div>
64
+
65
+ <div class="scale-wrap">
66
+ <h2 class="image-will-label">Image will:</h2>
67
+ <div class="toggle-container">
68
+ <label class="radio-label">
69
+ <input
70
+ type="radio"
71
+ name="resize_mode"
72
+ value={true}
73
+ bind:group={scale}
74
+ />
75
+ <span class="radio-button">rescale</span>
76
+ </label>
77
+ <label class="radio-label">
78
+ <input
79
+ type="radio"
80
+ name="resize_mode"
81
+ value={false}
82
+ bind:group={scale}
83
+ />
84
+ <span class="radio-button">anchor</span>
85
+ </label>
86
+ </div>
87
+ </div>
88
+ <div class="anchor-wrap">
89
+ <Anchor on:position={(e) => set_anchor(e.detail)} />
90
+ </div>
91
+ <button class="apply-button" on:click={() => handle_click()}
92
+ >Resize Canvas</button
93
+ >
94
+ </div>
95
+
96
+ <!-- </div> -->
97
+
98
+ <style>
99
+ .wrap {
100
+ padding: var(--spacing-xl) var(--spacing-lg);
101
+ color: var(--block-label-text-color);
102
+ }
103
+
104
+ .size-wrap {
105
+ display: flex;
106
+ flex-direction: row;
107
+ gap: 10px;
108
+ }
109
+
110
+ .size-input {
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: var(--spacing-xxs);
114
+ }
115
+
116
+ label,
117
+ h2 {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 15px;
121
+
122
+ cursor: pointer;
123
+ color: var(--checkbox-label-text-color);
124
+ font-weight: var(--checkbox-label-text-weight);
125
+ font-size: var(--text-sm);
126
+ line-height: var(--line-md);
127
+ }
128
+
129
+ .scale-wrap {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: var(--spacing-sm);
133
+ margin-top: var(--spacing-md);
134
+ }
135
+
136
+ input[type="number"] {
137
+ border: 1px solid var(--border-color-primary);
138
+ width: 60px;
139
+ border-radius: var(--radius-sm);
140
+ background-color: var(--checkbox-background-color-focus);
141
+ color: var(--body-text-color);
142
+ font-size: var(--text-sm);
143
+ transition: border-color 0.15s ease;
144
+ padding: var(--spacing-xs);
145
+ line-height: 1rem;
146
+ }
147
+
148
+ input[type="number"]:hover {
149
+ border-color: var(--color-accent-soft);
150
+ }
151
+
152
+ input[type="number"]:focus {
153
+ border-color: var(--color-accent);
154
+ outline: none;
155
+ box-shadow: 0 0 0 1px var(--color-accent-soft);
156
+ }
157
+
158
+ .image-will-label {
159
+ grid-column: 1;
160
+ }
161
+
162
+ .toggle-container {
163
+ display: flex;
164
+ grid-column: 2;
165
+ border-radius: var(--radius-sm);
166
+ border: 1px solid var(--border-color-primary);
167
+ overflow: hidden;
168
+ }
169
+
170
+ .toggle-container {
171
+ display: flex;
172
+ grid-column: 2;
173
+ border-radius: var(--radius-sm);
174
+ border: 1px solid var(--border-color-primary);
175
+ overflow: hidden;
176
+ }
177
+
178
+ .radio-label {
179
+ flex: 1;
180
+ margin: 0;
181
+ padding: 0;
182
+ position: relative;
183
+ cursor: pointer;
184
+ }
185
+
186
+ .radio-button {
187
+ display: flex;
188
+ justify-content: center;
189
+ align-items: center;
190
+ padding: var(--spacing-sm);
191
+ background: var(--checkbox-background-color);
192
+ color: var(--body-text-color);
193
+ font-size: var(--text-sm);
194
+ transition: background-color 0.15s ease;
195
+ width: 100%;
196
+ height: 100%;
197
+ }
198
+
199
+ input[type="radio"] {
200
+ position: absolute;
201
+ opacity: 0;
202
+ width: 0;
203
+ height: 0;
204
+ }
205
+
206
+ input[type="radio"]:not(:checked) + .radio-button:hover {
207
+ background: var(--checkbox-background-color-hover);
208
+ }
209
+
210
+ input[type="radio"]:checked + .radio-button {
211
+ background: var(--color-accent);
212
+ color: white;
213
+ }
214
+
215
+ .apply-button {
216
+ width: 100%;
217
+ margin-top: var(--spacing-md);
218
+ padding: var(--spacing-sm) var(--spacing-md);
219
+ background: var(--color-accent);
220
+ color: white;
221
+ border: none;
222
+ border-radius: var(--radius-sm);
223
+ font-size: var(--text-sm);
224
+ font-weight: var(--weight-semibold);
225
+ transition: all 0.15s ease;
226
+ }
227
+
228
+ .apply-button:hover {
229
+ background: var(--button-primary-background-fill-hover);
230
+ }
231
+
232
+ .anchor-wrap {
233
+ display: flex;
234
+ justify-content: center;
235
+ align-items: center;
236
+ flex-direction: column;
237
+ gap: 10px;
238
+ }
239
+ </style>
@@ -0,0 +1,67 @@
1
+ <script lang="ts">
2
+ import Layers from "./Layers.svelte";
3
+ import type { Writable } from "svelte/store";
4
+
5
+ export let layers: Writable<{
6
+ active_layer: string;
7
+ layers: {
8
+ name: string;
9
+ id: string;
10
+ user_created: boolean;
11
+ visible: boolean;
12
+ }[];
13
+ }>;
14
+
15
+ export let enable_additional_layers = true;
16
+ export let enable_layers = true;
17
+ export let show_layers = false;
18
+ </script>
19
+
20
+ <div class="toolbar-wrap-wrap">
21
+ <div class="toolbar-wrap">
22
+ {#if enable_layers}
23
+ <Layers
24
+ {layers}
25
+ {enable_additional_layers}
26
+ {enable_layers}
27
+ {show_layers}
28
+ on:new_layer
29
+ on:change_layer
30
+ on:move_layer
31
+ on:delete_layer
32
+ on:toggle_layer_visibility
33
+ />
34
+ {/if}
35
+ </div>
36
+ </div>
37
+
38
+ <style>
39
+ .toolbar-wrap-wrap {
40
+ position: absolute;
41
+ right: 0;
42
+ bottom: 0;
43
+ width: fit-content;
44
+ max-height: 100%;
45
+ overflow-y: auto;
46
+ display: flex;
47
+ flex-direction: column-reverse;
48
+ }
49
+
50
+ .toolbar-wrap {
51
+ min-width: 110px;
52
+ display: flex;
53
+ flex-direction: column;
54
+ justify-content: center;
55
+ align-items: center;
56
+ position: relative;
57
+ right: 0;
58
+ bottom: 0;
59
+ border: 1px solid var(--block-border-color);
60
+ border-radius: 0;
61
+ border-top-left-radius: var(--radius-md);
62
+ border-right: none;
63
+ border-bottom: none;
64
+ z-index: 1000;
65
+ background-color: var(--block-background-fill);
66
+ }
67
+ </style>