@liwe3/webcomponents-svelte 1.1.0 → 1.1.11
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 +46 -0
- package/dist/AIMarkdownEditor.svelte +179 -0
- package/dist/AIMarkdownEditor.svelte.d.ts +30 -0
- package/dist/AIMarkdownEditor.svelte.d.ts.map +1 -0
- package/dist/AITextEditor.svelte +28 -27
- package/dist/AITextEditor.svelte.d.ts +1 -0
- package/dist/AITextEditor.svelte.d.ts.map +1 -1
- package/dist/ButtonToolbar.svelte +55 -0
- package/dist/ButtonToolbar.svelte.d.ts +15 -0
- package/dist/ButtonToolbar.svelte.d.ts.map +1 -0
- package/dist/CheckList.svelte +87 -0
- package/dist/CheckList.svelte.d.ts +11 -0
- package/dist/CheckList.svelte.d.ts.map +1 -0
- package/dist/ChunkUploader.svelte +208 -146
- package/dist/ChunkUploader.svelte.d.ts +18 -5
- package/dist/ChunkUploader.svelte.d.ts.map +1 -1
- package/dist/Dialogs.svelte +82 -0
- package/dist/Dialogs.svelte.d.ts +65 -0
- package/dist/Dialogs.svelte.d.ts.map +1 -0
- package/dist/MarkdownPreview.svelte +50 -0
- package/dist/MarkdownPreview.svelte.d.ts +9 -0
- package/dist/MarkdownPreview.svelte.d.ts.map +1 -0
- package/dist/ResizableCropper.svelte +168 -0
- package/dist/ResizableCropper.svelte.d.ts +24 -0
- package/dist/ResizableCropper.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/package.json +1 -1
|
@@ -1,149 +1,211 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export type ChunkFileEvent = {
|
|
3
|
+
id : string;
|
|
4
|
+
status : string;
|
|
5
|
+
progress : number;
|
|
6
|
+
uploadId : string;
|
|
7
|
+
key : string;
|
|
8
|
+
originalFileName : string;
|
|
9
|
+
size : number;
|
|
10
|
+
};
|
|
11
|
+
</script>
|
|
1
12
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
13
|
+
import { onMount } from 'svelte';
|
|
14
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
15
|
+
import type {
|
|
16
|
+
ChunkUploaderElement as ChunkUploaderElementType,
|
|
17
|
+
UploadedFile,
|
|
18
|
+
} from '@liwe3/webcomponents';
|
|
19
|
+
|
|
20
|
+
interface Props extends HTMLAttributes<ChunkUploaderElementType> {
|
|
21
|
+
serverURL? : string;
|
|
22
|
+
chunkSize? : number;
|
|
23
|
+
authToken? : string;
|
|
24
|
+
validFiletypes? : string[];
|
|
25
|
+
maxFileSize? : number;
|
|
26
|
+
labelDropFiles? : string;
|
|
27
|
+
labelBrowse? : string;
|
|
28
|
+
folder? : string;
|
|
29
|
+
onfilecomplete? : ( event : ChunkFileEvent ) => void;
|
|
30
|
+
onuploadcomplete? : ( events : ChunkFileEvent[] ) => void;
|
|
31
|
+
onuploadaborted? : ( events : ChunkFileEvent[] ) => void;
|
|
32
|
+
parseResponse? : ( response : any, endpoint : 'initiate' | 'part' | 'complete' ) => any;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let {
|
|
36
|
+
serverURL = '',
|
|
37
|
+
chunkSize = 5,
|
|
38
|
+
authToken,
|
|
39
|
+
validFiletypes,
|
|
40
|
+
maxFileSize = 5120,
|
|
41
|
+
labelDropFiles,
|
|
42
|
+
labelBrowse,
|
|
43
|
+
folder,
|
|
44
|
+
onfilecomplete,
|
|
45
|
+
onuploadcomplete,
|
|
46
|
+
onuploadaborted,
|
|
47
|
+
parseResponse,
|
|
48
|
+
...restProps
|
|
49
|
+
} : Props = $props();
|
|
50
|
+
|
|
51
|
+
let uploaderElement : ChunkUploaderElementType;
|
|
52
|
+
let isReady = $state( false );
|
|
53
|
+
let removeListeners : (() => void) | null = null;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Syncs the latest prop values down to the underlying web component.
|
|
57
|
+
*/
|
|
58
|
+
const syncProps = () => {
|
|
59
|
+
if ( !isReady || !uploaderElement ) return;
|
|
60
|
+
|
|
61
|
+
uploaderElement.serverURL = serverURL ?? '';
|
|
62
|
+
uploaderElement.chunkSize = chunkSize;
|
|
63
|
+
uploaderElement.authToken = authToken;
|
|
64
|
+
uploaderElement.validFiletypes = validFiletypes?.length
|
|
65
|
+
? [ ...validFiletypes ]
|
|
66
|
+
: undefined;
|
|
67
|
+
uploaderElement.maxFileSize = maxFileSize;
|
|
68
|
+
uploaderElement.labelDropFiles = labelDropFiles;
|
|
69
|
+
uploaderElement.labelBrowse = labelBrowse;
|
|
70
|
+
uploaderElement.folder = folder;
|
|
71
|
+
uploaderElement.parseResponse = parseResponse;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const _mapEvent = ( dets : any ) : ChunkFileEvent => {
|
|
75
|
+
return {
|
|
76
|
+
id: dets.id,
|
|
77
|
+
originalFileName: dets.file.name,
|
|
78
|
+
status: dets.status,
|
|
79
|
+
progress: dets.progress,
|
|
80
|
+
size: dets.uploadedBytes,
|
|
81
|
+
uploadId: dets.uploadId,
|
|
82
|
+
key: dets.key,
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Forwards custom events emitted by the web component to Svelte callbacks.
|
|
88
|
+
*/
|
|
89
|
+
const bindEvents = () => {
|
|
90
|
+
if ( !uploaderElement ) return;
|
|
91
|
+
|
|
92
|
+
const handleFileComplete = ( event : Event ) => {
|
|
93
|
+
const data : ChunkFileEvent = _mapEvent( event.detail );
|
|
94
|
+
onfilecomplete?.( data );
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const handleUploadComplete = ( event : Event ) => {
|
|
98
|
+
const res : ChunkFileEvent[] = ( event as any ).detail.map( ( det ) => _mapEvent( det ) );
|
|
99
|
+
onuploadcomplete?.( res );
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const handleUploadAborted = ( event : Event ) => {
|
|
103
|
+
const res : ChunkFileEvent[] = ( event as any ).detail.map( ( det ) => _mapEvent( det ) );
|
|
104
|
+
onuploadaborted?.( res );
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
uploaderElement.addEventListener(
|
|
108
|
+
'filecomplete',
|
|
109
|
+
handleFileComplete as EventListener,
|
|
110
|
+
);
|
|
111
|
+
uploaderElement.addEventListener(
|
|
112
|
+
'uploadcomplete',
|
|
113
|
+
handleUploadComplete as EventListener,
|
|
114
|
+
);
|
|
115
|
+
uploaderElement.addEventListener(
|
|
116
|
+
'uploadaborted',
|
|
117
|
+
handleUploadAborted as EventListener,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
removeListeners = () => {
|
|
121
|
+
uploaderElement.removeEventListener(
|
|
122
|
+
'filecomplete',
|
|
123
|
+
handleFileComplete as EventListener,
|
|
124
|
+
);
|
|
125
|
+
uploaderElement.removeEventListener(
|
|
126
|
+
'uploadcomplete',
|
|
127
|
+
handleUploadComplete as EventListener,
|
|
128
|
+
);
|
|
129
|
+
uploaderElement.removeEventListener(
|
|
130
|
+
'uploadaborted',
|
|
131
|
+
handleUploadAborted as EventListener,
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
onMount( () => {
|
|
137
|
+
let isMounted = true;
|
|
138
|
+
|
|
139
|
+
const setup = async () => {
|
|
140
|
+
await import( '@liwe3/webcomponents/chunk-uploader' );
|
|
141
|
+
await customElements.whenDefined( 'liwe3-chunk-uploader' );
|
|
142
|
+
|
|
143
|
+
if ( !isMounted ) return;
|
|
144
|
+
isReady = true;
|
|
145
|
+
syncProps();
|
|
146
|
+
bindEvents();
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
void setup();
|
|
150
|
+
|
|
151
|
+
return () => {
|
|
152
|
+
isMounted = false;
|
|
153
|
+
removeListeners?.();
|
|
154
|
+
removeListeners = null;
|
|
155
|
+
};
|
|
156
|
+
} );
|
|
157
|
+
|
|
158
|
+
$effect( () => {
|
|
159
|
+
if ( !isReady || !uploaderElement ) return;
|
|
160
|
+
uploaderElement.serverURL = serverURL ?? '';
|
|
161
|
+
} );
|
|
162
|
+
|
|
163
|
+
$effect( () => {
|
|
164
|
+
if ( !isReady || !uploaderElement ) return;
|
|
165
|
+
uploaderElement.chunkSize = chunkSize;
|
|
166
|
+
} );
|
|
167
|
+
|
|
168
|
+
$effect( () => {
|
|
169
|
+
if ( !isReady || !uploaderElement ) return;
|
|
170
|
+
uploaderElement.authToken = authToken;
|
|
171
|
+
} );
|
|
172
|
+
|
|
173
|
+
$effect( () => {
|
|
174
|
+
if ( !isReady || !uploaderElement ) return;
|
|
175
|
+
uploaderElement.validFiletypes = validFiletypes?.length
|
|
176
|
+
? [ ...validFiletypes ]
|
|
177
|
+
: undefined;
|
|
178
|
+
} );
|
|
179
|
+
|
|
180
|
+
$effect( () => {
|
|
181
|
+
if ( !isReady || !uploaderElement ) return;
|
|
182
|
+
uploaderElement.maxFileSize = maxFileSize;
|
|
183
|
+
} );
|
|
184
|
+
|
|
185
|
+
$effect( () => {
|
|
186
|
+
if ( !isReady || !uploaderElement ) return;
|
|
187
|
+
uploaderElement.labelDropFiles = labelDropFiles;
|
|
188
|
+
} );
|
|
189
|
+
|
|
190
|
+
$effect( () => {
|
|
191
|
+
if ( !isReady || !uploaderElement ) return;
|
|
192
|
+
uploaderElement.labelBrowse = labelBrowse;
|
|
193
|
+
} );
|
|
194
|
+
|
|
195
|
+
$effect( () => {
|
|
196
|
+
if ( !isReady || !uploaderElement ) return;
|
|
197
|
+
uploaderElement.folder = folder;
|
|
198
|
+
} );
|
|
199
|
+
|
|
200
|
+
$effect( () => {
|
|
201
|
+
if ( !isReady || !uploaderElement ) return;
|
|
202
|
+
uploaderElement.parseResponse = parseResponse;
|
|
203
|
+
} );
|
|
204
|
+
|
|
205
|
+
$effect( () => {
|
|
206
|
+
if ( !uploaderElement ) return;
|
|
207
|
+
uploaderElement.setAttribute( 'folder', folder! );
|
|
208
|
+
} );
|
|
146
209
|
</script>
|
|
147
210
|
|
|
148
|
-
<liwe3-chunk-uploader bind:this={uploaderElement} {...restProps}
|
|
149
|
-
></liwe3-chunk-uploader>
|
|
211
|
+
<liwe3-chunk-uploader bind:this={uploaderElement} {...restProps}></liwe3-chunk-uploader>
|
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export type ChunkFileEvent = {
|
|
2
|
+
id: string;
|
|
3
|
+
status: string;
|
|
4
|
+
progress: number;
|
|
5
|
+
uploadId: string;
|
|
6
|
+
key: string;
|
|
7
|
+
originalFileName: string;
|
|
8
|
+
size: number;
|
|
9
|
+
};
|
|
10
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
11
|
+
import type { ChunkUploaderElement as ChunkUploaderElementType } from '@liwe3/webcomponents';
|
|
3
12
|
interface Props extends HTMLAttributes<ChunkUploaderElementType> {
|
|
4
13
|
serverURL?: string;
|
|
5
14
|
chunkSize?: number;
|
|
6
15
|
authToken?: string;
|
|
7
16
|
validFiletypes?: string[];
|
|
8
17
|
maxFileSize?: number;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
labelDropFiles?: string;
|
|
19
|
+
labelBrowse?: string;
|
|
20
|
+
folder?: string;
|
|
21
|
+
onfilecomplete?: (event: ChunkFileEvent) => void;
|
|
22
|
+
onuploadcomplete?: (events: ChunkFileEvent[]) => void;
|
|
23
|
+
onuploadaborted?: (events: ChunkFileEvent[]) => void;
|
|
24
|
+
parseResponse?: (response: any, endpoint: 'initiate' | 'part' | 'complete') => any;
|
|
12
25
|
}
|
|
13
26
|
declare const ChunkUploader: import("svelte").Component<Props, {}, "">;
|
|
14
27
|
type ChunkUploader = ReturnType<typeof ChunkUploader>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChunkUploader.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ChunkUploader.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChunkUploader.svelte.d.ts","sourceRoot":"","sources":["../src/lib/ChunkUploader.svelte.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAC5B,EAAE,EAAG,MAAM,CAAC;IACZ,MAAM,EAAG,MAAM,CAAC;IAChB,QAAQ,EAAG,MAAM,CAAC;IAClB,QAAQ,EAAG,MAAM,CAAC;IAClB,GAAG,EAAG,MAAM,CAAC;IACb,gBAAgB,EAAG,MAAM,CAAC;IAC1B,IAAI,EAAG,MAAM,CAAC;CACd,CAAC;AAIF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACX,oBAAoB,IAAI,wBAAwB,EAEhD,MAAM,sBAAsB,CAAC;AAG9B,UAAU,KAAM,SAAQ,cAAc,CAAC,wBAAwB,CAAC;IAC/D,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,SAAS,CAAC,EAAG,MAAM,CAAC;IACpB,cAAc,CAAC,EAAG,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,cAAc,CAAC,EAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAG,MAAM,CAAC;IACjB,cAAc,CAAC,EAAG,CAAE,KAAK,EAAG,cAAc,KAAM,IAAI,CAAC;IACrD,gBAAgB,CAAC,EAAG,CAAE,MAAM,EAAG,cAAc,EAAE,KAAM,IAAI,CAAC;IAC1D,eAAe,CAAC,EAAG,CAAE,MAAM,EAAG,cAAc,EAAE,KAAM,IAAI,CAAC;IACzD,aAAa,CAAC,EAAG,CAAE,QAAQ,EAAG,GAAG,EAAE,QAAQ,EAAG,UAAU,GAAG,MAAM,GAAG,UAAU,KAAM,GAAG,CAAC;CACxF;AA4LD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import type { DialogConfig, DialogElement } from '@liwe3/webcomponents';
|
|
3
|
+
|
|
4
|
+
// Re-export types for convenience
|
|
5
|
+
export type { DialogConfig, DialogElement };
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Shows a dialog with the given configuration.
|
|
9
|
+
*
|
|
10
|
+
* IMPORTANT: Make sure to add the <Dialogs /> component to your layout first!
|
|
11
|
+
* The <Dialogs /> component initializes the dialog web component system.
|
|
12
|
+
*
|
|
13
|
+
* @param config - The dialog configuration
|
|
14
|
+
* @returns The dialog element instance (or undefined if called during SSR)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // In your +layout.svelte
|
|
19
|
+
* import { Dialogs } from '@liwe3/webcomponents-svelte';
|
|
20
|
+
* <Dialogs />
|
|
21
|
+
*
|
|
22
|
+
* // In any component
|
|
23
|
+
* import { dialogAdd } from '@liwe3/webcomponents-svelte';
|
|
24
|
+
*
|
|
25
|
+
* const dialog = dialogAdd({
|
|
26
|
+
* title: 'Delete File',
|
|
27
|
+
* body: '<p>Are you sure you want to delete this file?</p>',
|
|
28
|
+
* buttons: [
|
|
29
|
+
* {
|
|
30
|
+
* label: 'Delete',
|
|
31
|
+
* backgroundColor: '#dc3545',
|
|
32
|
+
* onclick: () => {
|
|
33
|
+
* console.log('File deleted');
|
|
34
|
+
* dialog?.close();
|
|
35
|
+
* }
|
|
36
|
+
* },
|
|
37
|
+
* {
|
|
38
|
+
* label: 'Cancel',
|
|
39
|
+
* onclick: () => {
|
|
40
|
+
* dialog?.close();
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ],
|
|
44
|
+
* modal: true,
|
|
45
|
+
* escToClose: true,
|
|
46
|
+
* clickToClose: true
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export const dialogAdd = ( config : DialogConfig ) : DialogElement | undefined => {
|
|
51
|
+
// Only run on client side
|
|
52
|
+
if ( typeof window === 'undefined' ) return undefined;
|
|
53
|
+
|
|
54
|
+
// Get the dialogAdd function from window (set by the web component)
|
|
55
|
+
// The <Dialogs /> component should have already loaded the web component
|
|
56
|
+
const globalDialogAdd = ( window as any ).__liwe3_dialogAdd;
|
|
57
|
+
|
|
58
|
+
if ( !globalDialogAdd ) {
|
|
59
|
+
console.error(
|
|
60
|
+
'dialogAdd: Dialog web component not initialized. Did you forget to add <Dialogs /> to your layout?',
|
|
61
|
+
);
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return globalDialogAdd( config );
|
|
66
|
+
};
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<script lang="ts">
|
|
70
|
+
import { onMount } from 'svelte';
|
|
71
|
+
|
|
72
|
+
onMount( async () => {
|
|
73
|
+
// Only run on the client side (onMount only runs in browser)
|
|
74
|
+
// Import and initialize the Dialog web component
|
|
75
|
+
const { dialogAdd: coreDialogAdd } = await import( '@liwe3/webcomponents/dialog' );
|
|
76
|
+
|
|
77
|
+
// Expose dialogAdd on window so the wrapper can access it
|
|
78
|
+
( window as any ).__liwe3_dialogAdd = coreDialogAdd;
|
|
79
|
+
} );
|
|
80
|
+
</script>
|
|
81
|
+
|
|
82
|
+
<!-- This component doesn't render anything, it just loads the web component -->
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { DialogConfig, DialogElement } from '@liwe3/webcomponents';
|
|
2
|
+
export type { DialogConfig, DialogElement };
|
|
3
|
+
/**
|
|
4
|
+
* Shows a dialog with the given configuration.
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT: Make sure to add the <Dialogs /> component to your layout first!
|
|
7
|
+
* The <Dialogs /> component initializes the dialog web component system.
|
|
8
|
+
*
|
|
9
|
+
* @param config - The dialog configuration
|
|
10
|
+
* @returns The dialog element instance (or undefined if called during SSR)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // In your +layout.svelte
|
|
15
|
+
* import { Dialogs } from '@liwe3/webcomponents-svelte';
|
|
16
|
+
* <Dialogs />
|
|
17
|
+
*
|
|
18
|
+
* // In any component
|
|
19
|
+
* import { dialogAdd } from '@liwe3/webcomponents-svelte';
|
|
20
|
+
*
|
|
21
|
+
* const dialog = dialogAdd({
|
|
22
|
+
* title: 'Delete File',
|
|
23
|
+
* body: '<p>Are you sure you want to delete this file?</p>',
|
|
24
|
+
* buttons: [
|
|
25
|
+
* {
|
|
26
|
+
* label: 'Delete',
|
|
27
|
+
* backgroundColor: '#dc3545',
|
|
28
|
+
* onclick: () => {
|
|
29
|
+
* console.log('File deleted');
|
|
30
|
+
* dialog?.close();
|
|
31
|
+
* }
|
|
32
|
+
* },
|
|
33
|
+
* {
|
|
34
|
+
* label: 'Cancel',
|
|
35
|
+
* onclick: () => {
|
|
36
|
+
* dialog?.close();
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ],
|
|
40
|
+
* modal: true,
|
|
41
|
+
* escToClose: true,
|
|
42
|
+
* clickToClose: true
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const dialogAdd: (config: DialogConfig) => DialogElement | undefined;
|
|
47
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
48
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
49
|
+
$$bindings?: Bindings;
|
|
50
|
+
} & Exports;
|
|
51
|
+
(internal: unknown, props: {
|
|
52
|
+
$$events?: Events;
|
|
53
|
+
$$slots?: Slots;
|
|
54
|
+
}): Exports & {
|
|
55
|
+
$set?: any;
|
|
56
|
+
$on?: any;
|
|
57
|
+
};
|
|
58
|
+
z_$$bindings?: Bindings;
|
|
59
|
+
}
|
|
60
|
+
declare const Dialogs: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
61
|
+
[evt: string]: CustomEvent<any>;
|
|
62
|
+
}, {}, {}, string>;
|
|
63
|
+
type Dialogs = InstanceType<typeof Dialogs>;
|
|
64
|
+
export default Dialogs;
|
|
65
|
+
//# sourceMappingURL=Dialogs.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialogs.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Dialogs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGxE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,SAAS,GAAK,QAAS,YAAY,KAAK,aAAa,GAAG,SAgBpE,CAAC;AAwBF,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,OAAO;;kBAA+E,CAAC;AAC3E,KAAK,OAAO,GAAG,YAAY,CAAC,OAAO,OAAO,CAAC,CAAC;AAC9C,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
value?: string;
|
|
6
|
+
libUrl?: string;
|
|
7
|
+
onlibraryloaded?: () => void;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
value = "",
|
|
12
|
+
libUrl = "https://cdn.jsdelivr.net/npm/marked@4.3.0/marked.min.js",
|
|
13
|
+
onlibraryloaded,
|
|
14
|
+
}: Props = $props();
|
|
15
|
+
|
|
16
|
+
let elementRef: HTMLElement;
|
|
17
|
+
let webComponent = $state<any>(null);
|
|
18
|
+
|
|
19
|
+
$effect(() => {
|
|
20
|
+
if (webComponent) {
|
|
21
|
+
if (webComponent.libUrl !== libUrl) {
|
|
22
|
+
webComponent.libUrl = libUrl;
|
|
23
|
+
}
|
|
24
|
+
if (webComponent.value !== value) {
|
|
25
|
+
webComponent.value = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
onMount(async (): Promise<any> => {
|
|
31
|
+
// Dynamically import the web component
|
|
32
|
+
await import("@liwe3/webcomponents/markdown-preview");
|
|
33
|
+
|
|
34
|
+
// Get reference to the web component
|
|
35
|
+
webComponent = elementRef;
|
|
36
|
+
|
|
37
|
+
const handleLibraryLoaded = () => {
|
|
38
|
+
onlibraryloaded?.();
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
webComponent.addEventListener("library-loaded", handleLibraryLoaded);
|
|
42
|
+
|
|
43
|
+
// Cleanup
|
|
44
|
+
return () => {
|
|
45
|
+
webComponent?.removeEventListener("library-loaded", handleLibraryLoaded);
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<liwe3-markdown-preview bind:this={elementRef}></liwe3-markdown-preview>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
value?: string;
|
|
3
|
+
libUrl?: string;
|
|
4
|
+
onlibraryloaded?: () => void;
|
|
5
|
+
}
|
|
6
|
+
declare const MarkdownPreview: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type MarkdownPreview = ReturnType<typeof MarkdownPreview>;
|
|
8
|
+
export default MarkdownPreview;
|
|
9
|
+
//# sourceMappingURL=MarkdownPreview.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownPreview.svelte.d.ts","sourceRoot":"","sources":["../src/lib/MarkdownPreview.svelte.ts"],"names":[],"mappings":"AAME,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAiDH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|