@finema/core 3.23.2 → 3.24.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/README.md +22 -2
- package/dist/module.json +1 -1
- package/dist/module.mjs +3 -14
- package/dist/runtime/components/DevToolsWindow/index.vue +24 -26
- package/dist/runtime/components/Dialog/index.vue +11 -10
- package/dist/runtime/components/Empty.d.vue.ts +1 -1
- package/dist/runtime/components/Empty.vue +16 -12
- package/dist/runtime/components/Empty.vue.d.ts +1 -1
- package/dist/runtime/components/FlexDeck/index.vue +85 -92
- package/dist/runtime/components/Form/FieldWrapper.vue +13 -13
- package/dist/runtime/components/Form/Fields.d.vue.ts +1 -1
- package/dist/runtime/components/Form/Fields.vue +17 -11
- package/dist/runtime/components/Form/Fields.vue.d.ts +1 -1
- package/dist/runtime/components/Form/InputCheckbox/index.vue +19 -23
- package/dist/runtime/components/Form/InputCheckboxGroup/index.vue +1 -5
- package/dist/runtime/components/Form/InputCurrency/index.vue +56 -57
- package/dist/runtime/components/Form/InputDateTime/date_time_field.types.d.ts +2 -0
- package/dist/runtime/components/Form/InputDateTime/index.vue +70 -80
- package/dist/runtime/components/Form/InputDateTimeRange/index.vue +78 -75
- package/dist/runtime/components/Form/InputMonth/index.vue +7 -10
- package/dist/runtime/components/Form/InputNumber/index.vue +21 -25
- package/dist/runtime/components/Form/InputRadio/index.d.vue.ts +1 -1
- package/dist/runtime/components/Form/InputRadio/index.vue +1 -5
- package/dist/runtime/components/Form/InputRadio/index.vue.d.ts +1 -1
- package/dist/runtime/components/Form/InputRating/index.vue +1 -5
- package/dist/runtime/components/Form/InputSearch/index.vue +2 -8
- package/dist/runtime/components/Form/InputSelect/index.vue +112 -122
- package/dist/runtime/components/Form/InputSelectMultiple/index.vue +121 -133
- package/dist/runtime/components/Form/InputTags/index.vue +55 -59
- package/dist/runtime/components/Form/InputText/index.vue +122 -133
- package/dist/runtime/components/Form/InputTextarea/index.vue +19 -23
- package/dist/runtime/components/Form/InputTime/index.vue +63 -63
- package/dist/runtime/components/Form/InputToggle/index.vue +18 -21
- package/dist/runtime/components/Form/InputUploadDropzone/index.vue +46 -49
- package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +57 -63
- package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +57 -64
- package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +57 -63
- package/dist/runtime/components/Form/InputWYSIWYG/EditorImagePasteExtension.js +7 -6
- package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadExtension.js +13 -12
- package/dist/runtime/components/Form/InputWYSIWYG/EditorImageUploadNode.vue +21 -19
- package/dist/runtime/components/Form/InputWYSIWYG/EditorLinkPopover.vue +85 -87
- package/dist/runtime/components/Form/InputWYSIWYG/README.md +96 -96
- package/dist/runtime/components/Form/InputWYSIWYG/index.vue +178 -157
- package/dist/runtime/components/Form/fileState/EmptyState.vue +21 -21
- package/dist/runtime/components/Form/fileState/FailedState.vue +34 -36
- package/dist/runtime/components/Form/fileState/LoadingState.vue +24 -24
- package/dist/runtime/components/Form/fileState/MultipleFilesState.vue +74 -78
- package/dist/runtime/components/Form/fileState/PreviewModal.vue +23 -23
- package/dist/runtime/components/Form/fileState/SuccessState.vue +3 -12
- package/dist/runtime/components/Form/fileState/useFileState.js +2 -10
- package/dist/runtime/components/Form/fileState/useUploadImageState.js +1 -3
- package/dist/runtime/components/Form/fileState/useUploadState.js +8 -19
- package/dist/runtime/components/Form/fileState/useUploadStateMultiple.js +25 -30
- package/dist/runtime/components/Form/index.vue +5 -5
- package/dist/runtime/components/Image.vue +22 -28
- package/dist/runtime/components/Loader.d.vue.ts +1 -1
- package/dist/runtime/components/Loader.vue +10 -7
- package/dist/runtime/components/Loader.vue.d.ts +1 -1
- package/dist/runtime/components/Log/LogItem.vue +1 -3
- package/dist/runtime/components/Log/index.vue +1 -3
- package/dist/runtime/components/Table/Base.vue +117 -137
- package/dist/runtime/components/Table/ColumnDate.vue +1 -1
- package/dist/runtime/components/Table/ColumnDateTime.vue +1 -1
- package/dist/runtime/components/Table/ColumnImage.vue +4 -4
- package/dist/runtime/components/Table/ColumnText.vue +10 -10
- package/dist/runtime/components/Table/Pagination.vue +71 -77
- package/dist/runtime/components/Table/Simple.vue +19 -19
- package/dist/runtime/components/Table/index.vue +36 -42
- package/dist/runtime/composables/loaderList.js +1 -3
- package/dist/runtime/composables/loaderPage.js +156 -133
- package/dist/runtime/composables/useConfig.js +1 -1
- package/dist/runtime/composables/useDialog.js +1 -3
- package/dist/runtime/composables/useForm.d.ts +1 -1
- package/dist/runtime/composables/useForm.js +1 -3
- package/dist/runtime/composables/useTable.js +2 -14
- package/dist/runtime/helpers/apiBaseHelper.js +6 -24
- package/dist/runtime/helpers/apiListHelper.js +2 -5
- package/dist/runtime/helpers/apiObjectHelper.js +2 -5
- package/dist/runtime/helpers/apiPageHelper.js +19 -38
- package/dist/runtime/helpers/componentHelper.js +2 -6
- package/dist/runtime/helpers/uploadCore.js +1 -4
- package/dist/runtime/locale/index.js +1 -4
- package/dist/runtime/server/tsconfig.json +3 -3
- package/dist/runtime/styles/main.css +1 -1
- package/package.json +39 -26
|
@@ -9,27 +9,27 @@ const url = ref("");
|
|
|
9
9
|
const active = computed(() => props.editor.isActive("link"));
|
|
10
10
|
const disabled = computed(() => {
|
|
11
11
|
if (!props.editor.isEditable) return true;
|
|
12
|
-
const {
|
|
13
|
-
selection
|
|
14
|
-
} = props.editor.state;
|
|
12
|
+
const { selection } = props.editor.state;
|
|
15
13
|
return selection.empty && !props.editor.isActive("link");
|
|
16
14
|
});
|
|
17
|
-
watch(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
|
|
15
|
+
watch(
|
|
16
|
+
() => props.editor,
|
|
17
|
+
(editor, _, onCleanup) => {
|
|
18
|
+
if (!editor) return;
|
|
19
|
+
const updateUrl = () => {
|
|
20
|
+
const { href } = editor.getAttributes("link");
|
|
21
|
+
url.value = href || "";
|
|
22
|
+
};
|
|
23
|
+
updateUrl();
|
|
24
|
+
editor.on("selectionUpdate", updateUrl);
|
|
25
|
+
onCleanup(() => {
|
|
26
|
+
editor.off("selectionUpdate", updateUrl);
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
immediate: true
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
33
|
watch(active, (isActive) => {
|
|
34
34
|
if (isActive && props.autoOpen) {
|
|
35
35
|
open.value = true;
|
|
@@ -37,9 +37,7 @@ watch(active, (isActive) => {
|
|
|
37
37
|
});
|
|
38
38
|
const setLink = () => {
|
|
39
39
|
if (!url.value) return;
|
|
40
|
-
const {
|
|
41
|
-
selection
|
|
42
|
-
} = props.editor.state;
|
|
40
|
+
const { selection } = props.editor.state;
|
|
43
41
|
const isEmpty = selection.empty;
|
|
44
42
|
const hasCode = props.editor.isActive("code");
|
|
45
43
|
let chain = props.editor.chain().focus();
|
|
@@ -79,69 +77,69 @@ const handleKeyDown = (event) => {
|
|
|
79
77
|
</script>
|
|
80
78
|
|
|
81
79
|
<template>
|
|
82
|
-
<Popover
|
|
83
|
-
v-model:open="open"
|
|
84
|
-
:ui="{ content: 'p-0.5' }"
|
|
85
|
-
>
|
|
86
|
-
<Tooltip text="Link">
|
|
87
|
-
<Button
|
|
88
|
-
icon="i-lucide-link"
|
|
89
|
-
color="neutral"
|
|
90
|
-
active-color="primary"
|
|
91
|
-
variant="ghost"
|
|
92
|
-
active-variant="soft"
|
|
93
|
-
size="sm"
|
|
94
|
-
:active="active"
|
|
95
|
-
:disabled="disabled"
|
|
96
|
-
/>
|
|
97
|
-
</Tooltip>
|
|
98
|
-
|
|
99
|
-
<template #content>
|
|
100
|
-
<Input
|
|
101
|
-
v-model="url"
|
|
102
|
-
autofocus
|
|
103
|
-
name="url"
|
|
104
|
-
type="url"
|
|
105
|
-
variant="none"
|
|
106
|
-
placeholder="Paste a link..."
|
|
107
|
-
@keydown="handleKeyDown"
|
|
108
|
-
>
|
|
109
|
-
<div class="mr-0.5 flex items-center">
|
|
110
|
-
<Button
|
|
111
|
-
icon="i-lucide-corner-down-left"
|
|
112
|
-
variant="ghost"
|
|
113
|
-
size="sm"
|
|
114
|
-
:disabled="!url && !active"
|
|
115
|
-
title="Apply link"
|
|
116
|
-
@click="setLink"
|
|
117
|
-
/>
|
|
118
|
-
|
|
119
|
-
<Separator
|
|
120
|
-
orientation="vertical"
|
|
121
|
-
class="mx-1 h-6"
|
|
122
|
-
/>
|
|
123
|
-
|
|
124
|
-
<Button
|
|
125
|
-
icon="i-lucide-external-link"
|
|
126
|
-
color="neutral"
|
|
127
|
-
variant="ghost"
|
|
128
|
-
size="sm"
|
|
129
|
-
:disabled="!url && !active"
|
|
130
|
-
title="Open in new window"
|
|
131
|
-
@click="openLink"
|
|
132
|
-
/>
|
|
133
|
-
|
|
134
|
-
<Button
|
|
135
|
-
icon="i-lucide-trash"
|
|
136
|
-
color="neutral"
|
|
137
|
-
variant="ghost"
|
|
138
|
-
size="sm"
|
|
139
|
-
:disabled="!url && !active"
|
|
140
|
-
title="Remove link"
|
|
141
|
-
@click="removeLink"
|
|
142
|
-
/>
|
|
143
|
-
</div>
|
|
144
|
-
</Input>
|
|
145
|
-
</template>
|
|
146
|
-
</Popover>
|
|
80
|
+
<Popover
|
|
81
|
+
v-model:open="open"
|
|
82
|
+
:ui="{ content: 'p-0.5' }"
|
|
83
|
+
>
|
|
84
|
+
<Tooltip text="Link">
|
|
85
|
+
<Button
|
|
86
|
+
icon="i-lucide-link"
|
|
87
|
+
color="neutral"
|
|
88
|
+
active-color="primary"
|
|
89
|
+
variant="ghost"
|
|
90
|
+
active-variant="soft"
|
|
91
|
+
size="sm"
|
|
92
|
+
:active="active"
|
|
93
|
+
:disabled="disabled"
|
|
94
|
+
/>
|
|
95
|
+
</Tooltip>
|
|
96
|
+
|
|
97
|
+
<template #content>
|
|
98
|
+
<Input
|
|
99
|
+
v-model="url"
|
|
100
|
+
autofocus
|
|
101
|
+
name="url"
|
|
102
|
+
type="url"
|
|
103
|
+
variant="none"
|
|
104
|
+
placeholder="Paste a link..."
|
|
105
|
+
@keydown="handleKeyDown"
|
|
106
|
+
>
|
|
107
|
+
<div class="mr-0.5 flex items-center">
|
|
108
|
+
<Button
|
|
109
|
+
icon="i-lucide-corner-down-left"
|
|
110
|
+
variant="ghost"
|
|
111
|
+
size="sm"
|
|
112
|
+
:disabled="!url && !active"
|
|
113
|
+
title="Apply link"
|
|
114
|
+
@click="setLink"
|
|
115
|
+
/>
|
|
116
|
+
|
|
117
|
+
<Separator
|
|
118
|
+
orientation="vertical"
|
|
119
|
+
class="mx-1 h-6"
|
|
120
|
+
/>
|
|
121
|
+
|
|
122
|
+
<Button
|
|
123
|
+
icon="i-lucide-external-link"
|
|
124
|
+
color="neutral"
|
|
125
|
+
variant="ghost"
|
|
126
|
+
size="sm"
|
|
127
|
+
:disabled="!url && !active"
|
|
128
|
+
title="Open in new window"
|
|
129
|
+
@click="openLink"
|
|
130
|
+
/>
|
|
131
|
+
|
|
132
|
+
<Button
|
|
133
|
+
icon="i-lucide-trash"
|
|
134
|
+
color="neutral"
|
|
135
|
+
variant="ghost"
|
|
136
|
+
size="sm"
|
|
137
|
+
:disabled="!url && !active"
|
|
138
|
+
title="Remove link"
|
|
139
|
+
@click="removeLink"
|
|
140
|
+
/>
|
|
141
|
+
</div>
|
|
142
|
+
</Input>
|
|
143
|
+
</template>
|
|
144
|
+
</Popover>
|
|
147
145
|
</template>
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
# InputWYSIWYG - TipTap WYSIWYG Editor
|
|
2
|
-
|
|
3
|
-
A rich text editor component built with TipTap that supports text formatting, images, and more.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- **Text Formatting**: Bold, italic, underline, strikethrough, code
|
|
8
|
-
- **Headings**: H1, H2, H3, H4
|
|
9
|
-
- **Lists**: Bullet lists and ordered lists
|
|
10
|
-
- **Text Alignment**: Left, center, right, justify
|
|
11
|
-
- **Blockquotes and Code Blocks**
|
|
12
|
-
- **Links**: Add and edit links with a popover interface
|
|
13
|
-
- **Image Upload**: Upload images via button click
|
|
14
|
-
- **Image Paste**: ✨ **NEW** - Copy and paste images directly from your computer
|
|
15
|
-
- **Horizontal Rules**
|
|
16
|
-
- **Undo/Redo**
|
|
17
|
-
|
|
18
|
-
## Image Paste Feature
|
|
19
|
-
|
|
20
|
-
The editor now supports pasting images directly from your clipboard! This works in two ways:
|
|
21
|
-
|
|
22
|
-
### 1. Copy from File System
|
|
23
|
-
- Copy an image file from your file explorer/finder
|
|
24
|
-
- Click into the editor
|
|
25
|
-
- Press `Cmd+V` (Mac) or `Ctrl+V` (Windows/Linux)
|
|
26
|
-
- The image will automatically upload and insert into the editor
|
|
27
|
-
|
|
28
|
-
### 2. Copy from Screenshot
|
|
29
|
-
- Take a screenshot (or copy an image from any application)
|
|
30
|
-
- Click into the editor
|
|
31
|
-
- Press `Cmd+V` (Mac) or `Ctrl+V` (Windows/Linux)
|
|
32
|
-
- The image will automatically upload and insert into the editor
|
|
33
|
-
|
|
34
|
-
### How It Works
|
|
35
|
-
|
|
36
|
-
The `ImagePaste` extension intercepts paste events and:
|
|
37
|
-
1. Detects if the clipboard contains image data
|
|
38
|
-
2. Validates the image size (if `maxSize` is configured)
|
|
39
|
-
3. Inserts a placeholder/loading node
|
|
40
|
-
4. Uploads the image to your configured endpoint
|
|
41
|
-
5. Replaces the placeholder with the actual image once uploaded
|
|
42
|
-
|
|
43
|
-
## Usage
|
|
44
|
-
|
|
45
|
-
```vue
|
|
46
|
-
<template>
|
|
47
|
-
<InputWYSIWYG
|
|
48
|
-
name="content"
|
|
49
|
-
label="Content"
|
|
50
|
-
:image="{
|
|
51
|
-
requestOptions: useRequestOptions().getFile(),
|
|
52
|
-
uploadPathURL: '/uploads',
|
|
53
|
-
maxSize: 5120, // 5MB in KB
|
|
54
|
-
bodyKey: 'file',
|
|
55
|
-
responseURL: 'url',
|
|
56
|
-
responsePath: 'path',
|
|
57
|
-
responseName: 'name',
|
|
58
|
-
responseSize: 'size',
|
|
59
|
-
responseID: 'id',
|
|
60
|
-
}"
|
|
61
|
-
/>
|
|
62
|
-
</template>
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Configuration
|
|
66
|
-
|
|
67
|
-
### Image Upload Options
|
|
68
|
-
|
|
69
|
-
| Option | Type | Default | Description |
|
|
70
|
-
|--------|------|---------|-------------|
|
|
71
|
-
| `requestOptions` | `AxiosRequestConfig` | - | Axios configuration for upload requests |
|
|
72
|
-
| `uploadPathURL` | `string` | - | API endpoint path for uploads |
|
|
73
|
-
| `bodyKey` | `string` | `'file'` | Form data key for the file |
|
|
74
|
-
| `responseURL` | `string` | `'url'` | Path to URL in upload response |
|
|
75
|
-
| `responsePath` | `string` | `'path'` | Path to file path in response |
|
|
76
|
-
| `responseName` | `string` | `'name'` | Path to file name in response |
|
|
77
|
-
| `responseSize` | `string` | `'size'` | Path to file size in response |
|
|
78
|
-
| `responseID` | `string` | `'id'` | Path to file ID in response |
|
|
79
|
-
| `maxSize` | `number` | - | Maximum file size in KB |
|
|
80
|
-
|
|
81
|
-
## Extensions
|
|
82
|
-
|
|
83
|
-
The component uses the following TipTap extensions:
|
|
84
|
-
|
|
85
|
-
- **TextAlign**: For text alignment options
|
|
86
|
-
- **ImageUpload**: Custom extension for manual image uploads via button
|
|
87
|
-
- **ImagePaste**: Custom extension for pasting images from clipboard
|
|
88
|
-
|
|
89
|
-
## Files
|
|
90
|
-
|
|
91
|
-
- `index.vue` - Main component
|
|
92
|
-
- `EditorImageUploadExtension.ts` - Extension for manual image upload
|
|
93
|
-
- `EditorImageUploadNode.vue` - Vue component for image upload UI
|
|
94
|
-
- `EditorImagePasteExtension.ts` - Extension for paste image functionality
|
|
95
|
-
- `EditorLinkPopover.vue` - Link editing popover
|
|
96
|
-
- `types.ts` - TypeScript type definitions
|
|
1
|
+
# InputWYSIWYG - TipTap WYSIWYG Editor
|
|
2
|
+
|
|
3
|
+
A rich text editor component built with TipTap that supports text formatting, images, and more.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Text Formatting**: Bold, italic, underline, strikethrough, code
|
|
8
|
+
- **Headings**: H1, H2, H3, H4
|
|
9
|
+
- **Lists**: Bullet lists and ordered lists
|
|
10
|
+
- **Text Alignment**: Left, center, right, justify
|
|
11
|
+
- **Blockquotes and Code Blocks**
|
|
12
|
+
- **Links**: Add and edit links with a popover interface
|
|
13
|
+
- **Image Upload**: Upload images via button click
|
|
14
|
+
- **Image Paste**: ✨ **NEW** - Copy and paste images directly from your computer
|
|
15
|
+
- **Horizontal Rules**
|
|
16
|
+
- **Undo/Redo**
|
|
17
|
+
|
|
18
|
+
## Image Paste Feature
|
|
19
|
+
|
|
20
|
+
The editor now supports pasting images directly from your clipboard! This works in two ways:
|
|
21
|
+
|
|
22
|
+
### 1. Copy from File System
|
|
23
|
+
- Copy an image file from your file explorer/finder
|
|
24
|
+
- Click into the editor
|
|
25
|
+
- Press `Cmd+V` (Mac) or `Ctrl+V` (Windows/Linux)
|
|
26
|
+
- The image will automatically upload and insert into the editor
|
|
27
|
+
|
|
28
|
+
### 2. Copy from Screenshot
|
|
29
|
+
- Take a screenshot (or copy an image from any application)
|
|
30
|
+
- Click into the editor
|
|
31
|
+
- Press `Cmd+V` (Mac) or `Ctrl+V` (Windows/Linux)
|
|
32
|
+
- The image will automatically upload and insert into the editor
|
|
33
|
+
|
|
34
|
+
### How It Works
|
|
35
|
+
|
|
36
|
+
The `ImagePaste` extension intercepts paste events and:
|
|
37
|
+
1. Detects if the clipboard contains image data
|
|
38
|
+
2. Validates the image size (if `maxSize` is configured)
|
|
39
|
+
3. Inserts a placeholder/loading node
|
|
40
|
+
4. Uploads the image to your configured endpoint
|
|
41
|
+
5. Replaces the placeholder with the actual image once uploaded
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
```vue
|
|
46
|
+
<template>
|
|
47
|
+
<InputWYSIWYG
|
|
48
|
+
name="content"
|
|
49
|
+
label="Content"
|
|
50
|
+
:image="{
|
|
51
|
+
requestOptions: useRequestOptions().getFile(),
|
|
52
|
+
uploadPathURL: '/uploads',
|
|
53
|
+
maxSize: 5120, // 5MB in KB
|
|
54
|
+
bodyKey: 'file',
|
|
55
|
+
responseURL: 'url',
|
|
56
|
+
responsePath: 'path',
|
|
57
|
+
responseName: 'name',
|
|
58
|
+
responseSize: 'size',
|
|
59
|
+
responseID: 'id',
|
|
60
|
+
}"
|
|
61
|
+
/>
|
|
62
|
+
</template>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
### Image Upload Options
|
|
68
|
+
|
|
69
|
+
| Option | Type | Default | Description |
|
|
70
|
+
|--------|------|---------|-------------|
|
|
71
|
+
| `requestOptions` | `AxiosRequestConfig` | - | Axios configuration for upload requests |
|
|
72
|
+
| `uploadPathURL` | `string` | - | API endpoint path for uploads |
|
|
73
|
+
| `bodyKey` | `string` | `'file'` | Form data key for the file |
|
|
74
|
+
| `responseURL` | `string` | `'url'` | Path to URL in upload response |
|
|
75
|
+
| `responsePath` | `string` | `'path'` | Path to file path in response |
|
|
76
|
+
| `responseName` | `string` | `'name'` | Path to file name in response |
|
|
77
|
+
| `responseSize` | `string` | `'size'` | Path to file size in response |
|
|
78
|
+
| `responseID` | `string` | `'id'` | Path to file ID in response |
|
|
79
|
+
| `maxSize` | `number` | - | Maximum file size in KB |
|
|
80
|
+
|
|
81
|
+
## Extensions
|
|
82
|
+
|
|
83
|
+
The component uses the following TipTap extensions:
|
|
84
|
+
|
|
85
|
+
- **TextAlign**: For text alignment options
|
|
86
|
+
- **ImageUpload**: Custom extension for manual image uploads via button
|
|
87
|
+
- **ImagePaste**: Custom extension for pasting images from clipboard
|
|
88
|
+
|
|
89
|
+
## Files
|
|
90
|
+
|
|
91
|
+
- `index.vue` - Main component
|
|
92
|
+
- `EditorImageUploadExtension.ts` - Extension for manual image upload
|
|
93
|
+
- `EditorImageUploadNode.vue` - Vue component for image upload UI
|
|
94
|
+
- `EditorImagePasteExtension.ts` - Extension for paste image functionality
|
|
95
|
+
- `EditorLinkPopover.vue` - Link editing popover
|
|
96
|
+
- `types.ts` - TypeScript type definitions
|