vuedit-image-editor 0.2.0 → 0.2.1

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 (57) hide show
  1. package/README.md +222 -0
  2. package/dist/style.css +1 -0
  3. package/dist/types/components/VueditImageEditor.vue.d.ts +91 -0
  4. package/dist/types/components/VueditImageEditorModal.vue.d.ts +71 -0
  5. package/dist/types/components/canvas/FabricCanvas.vue.d.ts +5 -0
  6. package/dist/types/components/panels/CropPanel.vue.d.ts +32 -0
  7. package/dist/types/components/panels/DrawPanel.vue.d.ts +24 -0
  8. package/dist/types/components/panels/FilterPanel.vue.d.ts +28 -0
  9. package/dist/types/components/panels/ResizePanel.vue.d.ts +35 -0
  10. package/dist/types/components/panels/RotateFlipPanel.vue.d.ts +31 -0
  11. package/dist/types/components/panels/ShapePanel.vue.d.ts +26 -0
  12. package/dist/types/components/panels/TextPanel.vue.d.ts +26 -0
  13. package/dist/types/components/shared/ColorPicker.vue.d.ts +21 -0
  14. package/dist/types/components/shared/ConfirmBar.vue.d.ts +23 -0
  15. package/dist/types/components/shared/RangeSlider.vue.d.ts +27 -0
  16. package/dist/types/components/toolbar/EditorToolbar.vue.d.ts +26 -0
  17. package/dist/types/components/toolbar/ToolButton.vue.d.ts +30 -0
  18. package/dist/types/composables/useCrop.d.ts +18 -0
  19. package/dist/types/composables/useDraw.d.ts +12 -0
  20. package/dist/types/composables/useEditorState.d.ts +7 -0
  21. package/dist/types/composables/useFabricCanvas.d.ts +16 -0
  22. package/dist/types/composables/useFilters.d.ts +18 -0
  23. package/dist/types/composables/useHistory.d.ts +11 -0
  24. package/dist/types/composables/useResize.d.ts +16 -0
  25. package/dist/types/composables/useRotateFlip.d.ts +12 -0
  26. package/dist/types/composables/useShapes.d.ts +12 -0
  27. package/dist/types/composables/useText.d.ts +16 -0
  28. package/dist/types/composables/useZoom.d.ts +11 -0
  29. package/dist/types/i18n/ar.d.ts +54 -0
  30. package/dist/types/i18n/en.d.ts +55 -0
  31. package/dist/types/i18n/index.d.ts +7 -0
  32. package/dist/types/icons/CropIcon.vue.d.ts +2 -0
  33. package/dist/types/icons/DrawIcon.vue.d.ts +2 -0
  34. package/dist/types/icons/FilterIcon.vue.d.ts +2 -0
  35. package/dist/types/icons/FlipHIcon.vue.d.ts +2 -0
  36. package/dist/types/icons/FlipVIcon.vue.d.ts +2 -0
  37. package/dist/types/icons/RedoIcon.vue.d.ts +2 -0
  38. package/dist/types/icons/ResizeIcon.vue.d.ts +2 -0
  39. package/dist/types/icons/RotateIcon.vue.d.ts +2 -0
  40. package/dist/types/icons/RotateLeftIcon.vue.d.ts +2 -0
  41. package/dist/types/icons/RotateRightIcon.vue.d.ts +2 -0
  42. package/dist/types/icons/ShapeIcon.vue.d.ts +2 -0
  43. package/dist/types/icons/TextIcon.vue.d.ts +2 -0
  44. package/dist/types/icons/UndoIcon.vue.d.ts +2 -0
  45. package/dist/types/icons/ZoomInIcon.vue.d.ts +2 -0
  46. package/dist/types/icons/ZoomOutIcon.vue.d.ts +2 -0
  47. package/dist/types/icons/index.d.ts +15 -0
  48. package/dist/types/index.d.ts +9 -0
  49. package/dist/types/types/index.d.ts +43 -0
  50. package/dist/vuedit-image-editor.es.js +8909 -3338
  51. package/dist/vuedit-image-editor.es.js.map +1 -1
  52. package/dist/vuedit-image-editor.umd.js +504 -35
  53. package/dist/vuedit-image-editor.umd.js.map +1 -1
  54. package/package.json +50 -31
  55. package/LICENSE +0 -21
  56. package/dist/index.d.ts +0 -665
  57. package/dist/vuedit-image-editor.css +0 -1
package/README.md ADDED
@@ -0,0 +1,222 @@
1
+ # vuedit-image-editor
2
+
3
+ [![npm version](https://img.shields.io/npm/v/vuedit-image-editor.svg)](https://www.npmjs.com/package/vuedit-image-editor)
4
+ [![license](https://img.shields.io/npm/l/vuedit-image-editor.svg)](https://github.com/Abdelrahman-Mahmoud-Dev/vuedit-image-editor/blob/main/LICENSE)
5
+ [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)
6
+
7
+ A feature-rich, Pintura-like image editor component for Vue 3, powered by Fabric.js.
8
+
9
+ ## Features
10
+
11
+ - **Crop** - Free crop and predefined aspect ratios (1:1, 4:3, 16:9, 3:2)
12
+ - **Rotate & Flip** - 90° rotations, horizontal/vertical flip, custom angle rotation
13
+ - **Filters** - Brightness, contrast, saturation, exposure, blur, grayscale, sepia, invert
14
+ - **Text** - Add text with font family, size, color, bold/italic, alignment options
15
+ - **Draw** - Freehand drawing with configurable brush size, color, and opacity
16
+ - **Shapes** - Rectangle, circle, arrow, and line with stroke/fill customization
17
+ - **Resize** - Change dimensions with optional aspect ratio lock
18
+ - **Zoom** - Zoom in/out with mouse wheel support
19
+ - **Undo/Redo** - Full history with keyboard shortcuts
20
+ - **i18n** - Built-in English and Arabic, extensible to any language
21
+ - **RTL Support** - Automatic RTL layout for Arabic and similar locales
22
+ - **Two modes** - Inline editor and modal editor components
23
+
24
+ ## Install
25
+
26
+ ```bash
27
+ npm install vuedit-image-editor
28
+ ```
29
+
30
+ **Peer dependency:** Vue 3.2+
31
+
32
+ ## Quick Start
33
+
34
+ ### Inline Editor
35
+
36
+ ```vue
37
+ <script setup>
38
+ import { ref } from 'vue'
39
+ import { VueditImageEditor } from 'vuedit-image-editor'
40
+ import 'vuedit-image-editor/dist/style.css'
41
+
42
+ const imageUrl = ref('https://example.com/photo.jpg')
43
+
44
+ function onSave(result) {
45
+ // result is a File by default
46
+ console.log('Saved:', result.name, result.size)
47
+ }
48
+ </script>
49
+
50
+ <template>
51
+ <div style="height: 600px;">
52
+ <VueditImageEditor
53
+ :src="imageUrl"
54
+ output-format="file"
55
+ @save="onSave"
56
+ @cancel="() => console.log('Cancelled')"
57
+ @error="(e) => console.error(e)"
58
+ />
59
+ </div>
60
+ </template>
61
+ ```
62
+
63
+ ### Modal Editor
64
+
65
+ ```vue
66
+ <script setup>
67
+ import { ref } from 'vue'
68
+ import { VueditImageEditorModal } from 'vuedit-image-editor'
69
+ import 'vuedit-image-editor/dist/style.css'
70
+
71
+ const modalOpen = ref(false)
72
+
73
+ function onSave(result) {
74
+ console.log('Saved:', result)
75
+ modalOpen.value = false
76
+ }
77
+ </script>
78
+
79
+ <template>
80
+ <button @click="modalOpen = true">Edit Image</button>
81
+
82
+ <VueditImageEditorModal
83
+ :open="modalOpen"
84
+ src="https://example.com/photo.jpg"
85
+ output-format="file"
86
+ @save="onSave"
87
+ @close="modalOpen = false"
88
+ />
89
+ </template>
90
+ ```
91
+
92
+ ## Props
93
+
94
+ ### VueditImageEditor
95
+
96
+ | Prop | Type | Default | Description |
97
+ |------|------|---------|-------------|
98
+ | `src` | `string \| File \| Blob` | **required** | Image source |
99
+ | `outputFormat` | `'file' \| 'blob' \| 'dataurl' \| 'canvas'` | `'file'` | Export format |
100
+ | `outputMimeType` | `string` | `'image/png'` | Output MIME type |
101
+ | `outputQuality` | `number` | `0.92` | JPEG/WebP quality (0-1) |
102
+ | `outputFileName` | `string` | `'edited-image'` | Output file name |
103
+ | `tools` | `ToolType[]` | All tools | Which tools to show |
104
+ | `cropAspectRatios` | `CropAspectRatio[]` | Free, 1:1, 4:3, 16:9, 3:2 | Crop ratio options |
105
+ | `locale` | `string \| VueditTranslations` | `'en'` | Language or custom translations |
106
+ | `dir` | `'ltr' \| 'rtl' \| 'auto'` | `'auto'` | Text direction |
107
+
108
+ ### VueditImageEditorModal
109
+
110
+ Same props as above, plus:
111
+
112
+ | Prop | Type | Default | Description |
113
+ |------|------|---------|-------------|
114
+ | `open` | `boolean` | **required** | Controls modal visibility |
115
+
116
+ ## Events
117
+
118
+ ### VueditImageEditor
119
+
120
+ | Event | Payload | Description |
121
+ |-------|---------|-------------|
122
+ | `save` | `File \| Blob \| string \| HTMLCanvasElement` | Emitted when user clicks Save |
123
+ | `cancel` | — | Emitted when user clicks Cancel |
124
+ | `change` | `boolean` | Emitted when dirty state changes |
125
+ | `error` | `Error` | Emitted on errors (e.g. image load failure) |
126
+
127
+ ### VueditImageEditorModal
128
+
129
+ | Event | Payload | Description |
130
+ |-------|---------|-------------|
131
+ | `save` | `File \| Blob \| string \| HTMLCanvasElement` | Emitted when user clicks Save |
132
+ | `close` | — | Emitted when modal is closed |
133
+
134
+ ## Available Tools
135
+
136
+ Use the `tools` prop to control which tools appear:
137
+
138
+ ```vue
139
+ <VueditImageEditor
140
+ :src="imageUrl"
141
+ :tools="['crop', 'rotate', 'filter']"
142
+ />
143
+ ```
144
+
145
+ | Tool | Description |
146
+ |------|-------------|
147
+ | `crop` | Crop with aspect ratio presets |
148
+ | `rotate` | Rotate and flip |
149
+ | `filter` | Image filters and effects |
150
+ | `text` | Add and edit text |
151
+ | `draw` | Freehand drawing |
152
+ | `shape` | Add shapes (rect, circle, arrow, line) |
153
+ | `resize` | Resize image dimensions |
154
+
155
+ ## i18n
156
+
157
+ Built-in locales: `en` (English), `ar` (Arabic).
158
+
159
+ ```vue
160
+ <!-- Use Arabic with automatic RTL -->
161
+ <VueditImageEditor :src="imageUrl" locale="ar" />
162
+ ```
163
+
164
+ ### Custom Translations
165
+
166
+ ```js
167
+ import { mergeTranslations } from 'vuedit-image-editor'
168
+
169
+ const frenchLocale = mergeTranslations({}, {
170
+ crop: 'Recadrer',
171
+ rotate: 'Pivoter',
172
+ filter: 'Filtre',
173
+ save: 'Enregistrer',
174
+ cancel: 'Annuler',
175
+ // ...
176
+ })
177
+ ```
178
+
179
+ ```vue
180
+ <VueditImageEditor :src="imageUrl" :locale="frenchLocale" />
181
+ ```
182
+
183
+ ## Keyboard Shortcuts
184
+
185
+ | Shortcut | Action |
186
+ |----------|--------|
187
+ | `Ctrl+Z` / `Cmd+Z` | Undo |
188
+ | `Ctrl+Y` / `Cmd+Y` / `Ctrl+Shift+Z` | Redo |
189
+ | `Delete` / `Backspace` | Delete selected object |
190
+ | `Escape` | Deselect / clear active tool |
191
+
192
+ ## Exports
193
+
194
+ ```js
195
+ // Components
196
+ import { VueditImageEditor, VueditImageEditorModal } from 'vuedit-image-editor'
197
+
198
+ // Composables
199
+ import { useFabricCanvas, useHistory } from 'vuedit-image-editor'
200
+
201
+ // Types
202
+ import type {
203
+ ImageSource,
204
+ OutputFormat,
205
+ ToolType,
206
+ CropAspectRatio,
207
+ ExportOptions,
208
+ FilterState,
209
+ BrushConfig,
210
+ ShapeConfig,
211
+ TextConfig,
212
+ VueditTranslations,
213
+ TranslationKeys,
214
+ } from 'vuedit-image-editor'
215
+
216
+ // i18n utilities
217
+ import { defaultTranslations, mergeTranslations, resolveTranslations } from 'vuedit-image-editor'
218
+ ```
219
+
220
+ ## License
221
+
222
+ [MIT](./LICENSE)
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ :root{--vuedit-color-primary: #1B4965;--vuedit-color-primary-hover: #153d55;--vuedit-color-secondary: #415A77;--vuedit-color-bg: #1e1e2e;--vuedit-color-bg-panel: #2a2a3c;--vuedit-color-bg-toolbar: #252536;--vuedit-color-surface: #333346;--vuedit-color-text: #ffffff;--vuedit-color-text-muted: #a0a0b0;--vuedit-color-border: #3a3a4e;--vuedit-color-accent: #4da6ff;--vuedit-color-danger: #ff4d6a;--vuedit-toolbar-height: 56px;--vuedit-panel-width: 280px;--vuedit-header-height: 48px;--vuedit-border-radius: 8px;--vuedit-font-family: inherit;--vuedit-font-size-sm: 12px;--vuedit-font-size-base: 14px;--vuedit-font-size-lg: 16px;--vuedit-transition-speed: .2s}.vuedit-editor{display:flex;flex-direction:column;width:100%;height:100%;min-height:400px;font-family:var(--vuedit-font-family);font-size:var(--vuedit-font-size-base);color:var(--vuedit-color-text);background:var(--vuedit-color-bg);border-radius:var(--vuedit-border-radius);overflow:hidden;-webkit-user-select:none;user-select:none}.vuedit-editor[dir=rtl]{direction:rtl}.vuedit-header{display:flex;justify-content:space-between;align-items:center;height:var(--vuedit-header-height);padding:0 12px;background:var(--vuedit-color-bg-toolbar);border-bottom:1px solid var(--vuedit-color-border);flex-shrink:0}.vuedit-header__history{display:flex;gap:4px}.vuedit-header__actions{display:flex;gap:8px}.vuedit-body{display:flex;flex:1;overflow:hidden;position:relative}.vuedit-panel{width:var(--vuedit-panel-width);background:var(--vuedit-color-bg-panel);border-inline-end:1px solid var(--vuedit-color-border);overflow-y:auto;padding:16px;flex-shrink:0}.vuedit-panel__title{font-size:var(--vuedit-font-size-lg);font-weight:600;margin-bottom:16px}.vuedit-panel__section{margin-bottom:16px}.vuedit-panel__label{display:block;font-size:var(--vuedit-font-size-sm);color:var(--vuedit-color-text-muted);margin-bottom:6px}.vuedit-canvas-area{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;background:var(--vuedit-color-bg)}.vuedit-toolbar{display:flex;align-items:center;justify-content:center;height:var(--vuedit-toolbar-height);background:var(--vuedit-color-bg-toolbar);border-top:1px solid var(--vuedit-color-border);gap:2px;padding:0 8px;flex-shrink:0;overflow-x:auto}.vuedit-tool-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:6px 12px;border:none;border-radius:6px;background:transparent;color:var(--vuedit-color-text-muted);cursor:pointer;transition:all var(--vuedit-transition-speed) ease;white-space:nowrap;min-width:56px}.vuedit-tool-btn:hover{background:var(--vuedit-color-surface);color:var(--vuedit-color-text)}.vuedit-tool-btn--active{background:var(--vuedit-color-primary);color:#fff}.vuedit-tool-btn--active:hover{background:var(--vuedit-color-primary-hover)}.vuedit-tool-btn__icon{width:20px;height:20px}.vuedit-tool-btn__label{font-size:10px;line-height:1}.vuedit-btn{padding:6px 16px;border-radius:6px;font-size:var(--vuedit-font-size-base);font-weight:500;cursor:pointer;transition:all var(--vuedit-transition-speed) ease;border:none;font-family:var(--vuedit-font-family)}.vuedit-btn:disabled{opacity:.4;cursor:not-allowed}.vuedit-btn--primary{background:var(--vuedit-color-primary);color:#fff}.vuedit-btn--primary:hover:not(:disabled){background:var(--vuedit-color-primary-hover)}.vuedit-btn--secondary{background:transparent;color:var(--vuedit-color-text-muted);border:1px solid var(--vuedit-color-border)}.vuedit-btn--secondary:hover:not(:disabled){background:var(--vuedit-color-surface);color:var(--vuedit-color-text)}.vuedit-btn--icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border-radius:6px;background:transparent;color:var(--vuedit-color-text-muted);border:none;cursor:pointer;transition:all var(--vuedit-transition-speed) ease}.vuedit-btn--icon:hover:not(:disabled){background:var(--vuedit-color-surface);color:var(--vuedit-color-text)}.vuedit-btn--icon:disabled{opacity:.3;cursor:not-allowed}.vuedit-range{display:flex;flex-direction:column;gap:4px}.vuedit-range__header{display:flex;justify-content:space-between;align-items:center}.vuedit-range__label{font-size:var(--vuedit-font-size-sm);color:var(--vuedit-color-text-muted)}.vuedit-range__value{font-size:var(--vuedit-font-size-sm);color:var(--vuedit-color-text);min-width:36px;text-align:right}.vuedit-range input[type=range]{width:100%;height:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--vuedit-color-border);border-radius:2px;outline:none;cursor:pointer}.vuedit-range input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--vuedit-color-accent);cursor:pointer;border:2px solid var(--vuedit-color-bg-panel)}.vuedit-colors{display:flex;flex-wrap:wrap;gap:6px}.vuedit-color-swatch{width:24px;height:24px;border-radius:4px;border:2px solid transparent;cursor:pointer;transition:border-color var(--vuedit-transition-speed) ease}.vuedit-color-swatch:hover{border-color:var(--vuedit-color-text-muted)}.vuedit-color-swatch--active{border-color:var(--vuedit-color-accent)}.vuedit-confirm-bar{display:flex;gap:8px;padding-top:12px;border-top:1px solid var(--vuedit-color-border);margin-top:12px}.vuedit-confirm-bar .vuedit-btn{flex:1}.vuedit-aspect-ratios{display:flex;flex-wrap:wrap;gap:6px}.vuedit-aspect-chip{padding:4px 10px;border-radius:14px;font-size:var(--vuedit-font-size-sm);border:1px solid var(--vuedit-color-border);background:transparent;color:var(--vuedit-color-text-muted);cursor:pointer;transition:all var(--vuedit-transition-speed) ease}.vuedit-aspect-chip:hover{border-color:var(--vuedit-color-text-muted);color:var(--vuedit-color-text)}.vuedit-aspect-chip--active{background:var(--vuedit-color-primary);border-color:var(--vuedit-color-primary);color:#fff}.vuedit-toggle-group{display:flex;gap:4px}.vuedit-toggle{padding:6px 10px;border:1px solid var(--vuedit-color-border);border-radius:6px;background:transparent;color:var(--vuedit-color-text-muted);cursor:pointer;font-size:var(--vuedit-font-size-sm);transition:all var(--vuedit-transition-speed) ease}.vuedit-toggle:hover{border-color:var(--vuedit-color-text-muted)}.vuedit-toggle--active{background:var(--vuedit-color-primary);border-color:var(--vuedit-color-primary);color:#fff}.vuedit-input{width:100%;padding:6px 10px;border:1px solid var(--vuedit-color-border);border-radius:6px;background:var(--vuedit-color-surface);color:var(--vuedit-color-text);font-size:var(--vuedit-font-size-base);font-family:var(--vuedit-font-family);outline:none;transition:border-color var(--vuedit-transition-speed) ease}.vuedit-input:focus{border-color:var(--vuedit-color-accent)}.vuedit-select{width:100%;padding:6px 10px;border:1px solid var(--vuedit-color-border);border-radius:6px;background:var(--vuedit-color-surface);color:var(--vuedit-color-text);font-size:var(--vuedit-font-size-base);font-family:var(--vuedit-font-family);outline:none;cursor:pointer}.vuedit-modal{border:none;padding:0;width:95vw;max-width:1200px;height:90vh;border-radius:var(--vuedit-border-radius);overflow:hidden;background:transparent}.vuedit-modal::backdrop{background:#0009}@media (max-width: 768px){.vuedit-panel{position:absolute;bottom:0;left:0;right:0;width:100%;height:auto;max-height:40vh;border-inline-end:none;border-top:1px solid var(--vuedit-color-border);z-index:10}.vuedit-tool-btn{padding:6px 8px;min-width:48px}.vuedit-tool-btn__label{font-size:9px}.vuedit-modal{width:100vw;height:100vh;max-width:none;border-radius:0}}
@@ -0,0 +1,91 @@
1
+ import { ToolType, CropAspectRatio, ImageSource } from '../types';
2
+ import { VueditTranslations } from '../i18n';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
5
+ src: ImageSource;
6
+ outputFormat?: "file" | "blob" | "dataurl" | "canvas";
7
+ outputMimeType?: string;
8
+ outputQuality?: number;
9
+ outputFileName?: string;
10
+ tools?: ToolType[];
11
+ cropAspectRatios?: CropAspectRatio[];
12
+ locale?: string | VueditTranslations;
13
+ dir?: "ltr" | "rtl" | "auto";
14
+ }>, {
15
+ outputFormat: string;
16
+ outputMimeType: string;
17
+ outputQuality: number;
18
+ outputFileName: string;
19
+ tools: () => string[];
20
+ cropAspectRatios: () => ({
21
+ label: string;
22
+ value: null;
23
+ } | {
24
+ label: string;
25
+ value: number;
26
+ })[];
27
+ locale: string;
28
+ dir: string;
29
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
30
+ save: (result: string | File | Blob | HTMLCanvasElement) => void;
31
+ cancel: () => void;
32
+ change: (dirty: boolean) => void;
33
+ error: (error: Error) => void;
34
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
35
+ src: ImageSource;
36
+ outputFormat?: "file" | "blob" | "dataurl" | "canvas";
37
+ outputMimeType?: string;
38
+ outputQuality?: number;
39
+ outputFileName?: string;
40
+ tools?: ToolType[];
41
+ cropAspectRatios?: CropAspectRatio[];
42
+ locale?: string | VueditTranslations;
43
+ dir?: "ltr" | "rtl" | "auto";
44
+ }>, {
45
+ outputFormat: string;
46
+ outputMimeType: string;
47
+ outputQuality: number;
48
+ outputFileName: string;
49
+ tools: () => string[];
50
+ cropAspectRatios: () => ({
51
+ label: string;
52
+ value: null;
53
+ } | {
54
+ label: string;
55
+ value: number;
56
+ })[];
57
+ locale: string;
58
+ dir: string;
59
+ }>>> & Readonly<{
60
+ onSave?: ((result: string | File | Blob | HTMLCanvasElement) => any) | undefined;
61
+ onCancel?: (() => any) | undefined;
62
+ onChange?: ((dirty: boolean) => any) | undefined;
63
+ onError?: ((error: Error) => any) | undefined;
64
+ }>, {
65
+ tools: ToolType[];
66
+ outputFormat: "file" | "blob" | "dataurl" | "canvas";
67
+ outputMimeType: string;
68
+ outputQuality: number;
69
+ outputFileName: string;
70
+ cropAspectRatios: CropAspectRatio[];
71
+ locale: string | VueditTranslations;
72
+ dir: "ltr" | "rtl" | "auto";
73
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
74
+ export default _default;
75
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
76
+ type __VLS_TypePropsToRuntimeProps<T> = {
77
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
78
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
79
+ } : {
80
+ type: import('vue').PropType<T[K]>;
81
+ required: true;
82
+ };
83
+ };
84
+ type __VLS_WithDefaults<P, D> = {
85
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
86
+ default: D[K];
87
+ }> : P[K];
88
+ };
89
+ type __VLS_Prettify<T> = {
90
+ [K in keyof T]: T[K];
91
+ } & {};
@@ -0,0 +1,71 @@
1
+ import { ToolType, CropAspectRatio, ImageSource } from '../types';
2
+ import { VueditTranslations } from '../i18n';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
5
+ open: boolean;
6
+ src: ImageSource;
7
+ outputFormat?: "file" | "blob" | "dataurl" | "canvas";
8
+ outputMimeType?: string;
9
+ outputQuality?: number;
10
+ outputFileName?: string;
11
+ tools?: ToolType[];
12
+ cropAspectRatios?: CropAspectRatio[];
13
+ locale?: string | VueditTranslations;
14
+ dir?: "ltr" | "rtl" | "auto";
15
+ }>, {
16
+ outputFormat: string;
17
+ outputMimeType: string;
18
+ outputQuality: number;
19
+ outputFileName: string;
20
+ locale: string;
21
+ dir: string;
22
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
23
+ save: (result: string | File | Blob | HTMLCanvasElement) => void;
24
+ close: () => void;
25
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
26
+ open: boolean;
27
+ src: ImageSource;
28
+ outputFormat?: "file" | "blob" | "dataurl" | "canvas";
29
+ outputMimeType?: string;
30
+ outputQuality?: number;
31
+ outputFileName?: string;
32
+ tools?: ToolType[];
33
+ cropAspectRatios?: CropAspectRatio[];
34
+ locale?: string | VueditTranslations;
35
+ dir?: "ltr" | "rtl" | "auto";
36
+ }>, {
37
+ outputFormat: string;
38
+ outputMimeType: string;
39
+ outputQuality: number;
40
+ outputFileName: string;
41
+ locale: string;
42
+ dir: string;
43
+ }>>> & Readonly<{
44
+ onSave?: ((result: string | File | Blob | HTMLCanvasElement) => any) | undefined;
45
+ onClose?: (() => any) | undefined;
46
+ }>, {
47
+ outputFormat: "file" | "blob" | "dataurl" | "canvas";
48
+ outputMimeType: string;
49
+ outputQuality: number;
50
+ outputFileName: string;
51
+ locale: string | VueditTranslations;
52
+ dir: "ltr" | "rtl" | "auto";
53
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
54
+ export default _default;
55
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
56
+ type __VLS_TypePropsToRuntimeProps<T> = {
57
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
58
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
59
+ } : {
60
+ type: import('vue').PropType<T[K]>;
61
+ required: true;
62
+ };
63
+ };
64
+ type __VLS_WithDefaults<P, D> = {
65
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
66
+ default: D[K];
67
+ }> : P[K];
68
+ };
69
+ type __VLS_Prettify<T> = {
70
+ [K in keyof T]: T[K];
71
+ } & {};
@@ -0,0 +1,5 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {
2
+ canvasEl: import('vue').Ref<HTMLCanvasElement | null, HTMLCanvasElement | null>;
3
+ containerEl: import('vue').Ref<HTMLDivElement | null, HTMLDivElement | null>;
4
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
5
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import { CropAspectRatio } from '../../types';
2
+ import { TranslationKeys } from '../../i18n/en';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
5
+ aspectRatios: CropAspectRatio[];
6
+ selectedRatio: CropAspectRatio | null;
7
+ isCropping: boolean;
8
+ t: (key: TranslationKeys) => string;
9
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
10
+ selectRatio: (ratio: CropAspectRatio) => void;
11
+ apply: () => void;
12
+ cancel: () => void;
13
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
14
+ aspectRatios: CropAspectRatio[];
15
+ selectedRatio: CropAspectRatio | null;
16
+ isCropping: boolean;
17
+ t: (key: TranslationKeys) => string;
18
+ }>>> & Readonly<{
19
+ onCancel?: (() => any) | undefined;
20
+ onApply?: (() => any) | undefined;
21
+ onSelectRatio?: ((ratio: CropAspectRatio) => any) | undefined;
22
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
23
+ export default _default;
24
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
25
+ type __VLS_TypePropsToRuntimeProps<T> = {
26
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
27
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
28
+ } : {
29
+ type: import('vue').PropType<T[K]>;
30
+ required: true;
31
+ };
32
+ };
@@ -0,0 +1,24 @@
1
+ import { BrushConfig } from '../../types';
2
+ import { TranslationKeys } from '../../i18n/en';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
5
+ config: BrushConfig;
6
+ t: (key: TranslationKeys) => string;
7
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ update: (key: keyof BrushConfig, value: string | number) => void;
9
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
10
+ config: BrushConfig;
11
+ t: (key: TranslationKeys) => string;
12
+ }>>> & Readonly<{
13
+ onUpdate?: ((key: keyof BrushConfig, value: string | number) => any) | undefined;
14
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
15
+ export default _default;
16
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
17
+ type __VLS_TypePropsToRuntimeProps<T> = {
18
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
19
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
20
+ } : {
21
+ type: import('vue').PropType<T[K]>;
22
+ required: true;
23
+ };
24
+ };
@@ -0,0 +1,28 @@
1
+ import { FilterState } from '../../types';
2
+ import { TranslationKeys } from '../../i18n/en';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
5
+ state: FilterState;
6
+ t: (key: TranslationKeys) => string;
7
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ update: (key: keyof FilterState, value: number | boolean) => void;
9
+ reset: () => void;
10
+ commit: () => void;
11
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
12
+ state: FilterState;
13
+ t: (key: TranslationKeys) => string;
14
+ }>>> & Readonly<{
15
+ onReset?: (() => any) | undefined;
16
+ onUpdate?: ((key: keyof FilterState, value: number | boolean) => any) | undefined;
17
+ onCommit?: (() => any) | undefined;
18
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
19
+ export default _default;
20
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
21
+ type __VLS_TypePropsToRuntimeProps<T> = {
22
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
23
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
24
+ } : {
25
+ type: import('vue').PropType<T[K]>;
26
+ required: true;
27
+ };
28
+ };
@@ -0,0 +1,35 @@
1
+ import { TranslationKeys } from '../../i18n/en';
2
+
3
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
4
+ width: number;
5
+ height: number;
6
+ lockRatio: boolean;
7
+ t: (key: TranslationKeys) => string;
8
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
9
+ setWidth: (v: number) => void;
10
+ setHeight: (v: number) => void;
11
+ toggleLock: () => void;
12
+ apply: () => void;
13
+ cancel: () => void;
14
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
15
+ width: number;
16
+ height: number;
17
+ lockRatio: boolean;
18
+ t: (key: TranslationKeys) => string;
19
+ }>>> & Readonly<{
20
+ onCancel?: (() => any) | undefined;
21
+ onApply?: (() => any) | undefined;
22
+ onSetWidth?: ((v: number) => any) | undefined;
23
+ onSetHeight?: ((v: number) => any) | undefined;
24
+ onToggleLock?: (() => any) | undefined;
25
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
26
+ export default _default;
27
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
28
+ type __VLS_TypePropsToRuntimeProps<T> = {
29
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
30
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
31
+ } : {
32
+ type: import('vue').PropType<T[K]>;
33
+ required: true;
34
+ };
35
+ };
@@ -0,0 +1,31 @@
1
+ import { TranslationKeys } from '../../i18n/en';
2
+
3
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
4
+ rotation: number;
5
+ t: (key: TranslationKeys) => string;
6
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
+ rotateLeft: () => void;
8
+ rotateRight: () => void;
9
+ flipH: () => void;
10
+ flipV: () => void;
11
+ setRotation: (deg: number) => void;
12
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
13
+ rotation: number;
14
+ t: (key: TranslationKeys) => string;
15
+ }>>> & Readonly<{
16
+ onRotateLeft?: (() => any) | undefined;
17
+ onRotateRight?: (() => any) | undefined;
18
+ onFlipH?: (() => any) | undefined;
19
+ onFlipV?: (() => any) | undefined;
20
+ onSetRotation?: ((deg: number) => any) | undefined;
21
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
22
+ export default _default;
23
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
24
+ type __VLS_TypePropsToRuntimeProps<T> = {
25
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
26
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
27
+ } : {
28
+ type: import('vue').PropType<T[K]>;
29
+ required: true;
30
+ };
31
+ };
@@ -0,0 +1,26 @@
1
+ import { ShapeConfig } from '../../types';
2
+ import { TranslationKeys } from '../../i18n/en';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
5
+ config: ShapeConfig;
6
+ t: (key: TranslationKeys) => string;
7
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ update: (key: keyof ShapeConfig, value: string | number) => void;
9
+ addShape: () => void;
10
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
11
+ config: ShapeConfig;
12
+ t: (key: TranslationKeys) => string;
13
+ }>>> & Readonly<{
14
+ onUpdate?: ((key: keyof ShapeConfig, value: string | number) => any) | undefined;
15
+ onAddShape?: (() => any) | undefined;
16
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
17
+ export default _default;
18
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
19
+ type __VLS_TypePropsToRuntimeProps<T> = {
20
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
21
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
22
+ } : {
23
+ type: import('vue').PropType<T[K]>;
24
+ required: true;
25
+ };
26
+ };
@@ -0,0 +1,26 @@
1
+ import { TextConfig } from '../../types';
2
+ import { TranslationKeys } from '../../i18n/en';
3
+
4
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
5
+ config: TextConfig;
6
+ t: (key: TranslationKeys) => string;
7
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ update: (key: keyof TextConfig, value: string | number) => void;
9
+ addText: () => void;
10
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
11
+ config: TextConfig;
12
+ t: (key: TranslationKeys) => string;
13
+ }>>> & Readonly<{
14
+ onAddText?: (() => any) | undefined;
15
+ onUpdate?: ((key: keyof TextConfig, value: string | number) => any) | undefined;
16
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
17
+ export default _default;
18
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
19
+ type __VLS_TypePropsToRuntimeProps<T> = {
20
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
21
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
22
+ } : {
23
+ type: import('vue').PropType<T[K]>;
24
+ required: true;
25
+ };
26
+ };
@@ -0,0 +1,21 @@
1
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
2
+ modelValue: string;
3
+ label?: string;
4
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
5
+ "update:modelValue": (value: string) => void;
6
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
7
+ modelValue: string;
8
+ label?: string;
9
+ }>>> & Readonly<{
10
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
11
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
12
+ export default _default;
13
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
14
+ type __VLS_TypePropsToRuntimeProps<T> = {
15
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
16
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
17
+ } : {
18
+ type: import('vue').PropType<T[K]>;
19
+ required: true;
20
+ };
21
+ };
@@ -0,0 +1,23 @@
1
+ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
2
+ applyLabel?: string;
3
+ cancelLabel?: string;
4
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
5
+ apply: () => void;
6
+ cancel: () => void;
7
+ }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
8
+ applyLabel?: string;
9
+ cancelLabel?: string;
10
+ }>>> & Readonly<{
11
+ onCancel?: (() => any) | undefined;
12
+ onApply?: (() => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
14
+ export default _default;
15
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
16
+ type __VLS_TypePropsToRuntimeProps<T> = {
17
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
18
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
19
+ } : {
20
+ type: import('vue').PropType<T[K]>;
21
+ required: true;
22
+ };
23
+ };