@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.
@@ -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
- import { onMount } from "svelte";
3
- import type { HTMLAttributes } from "svelte/elements";
4
- import type {
5
- ChunkUploaderElement as ChunkUploaderElementType,
6
- UploadedFile,
7
- } from "@liwe3/webcomponents";
8
-
9
- interface Props extends HTMLAttributes<ChunkUploaderElementType> {
10
- serverURL?: string;
11
- chunkSize?: number;
12
- authToken?: string;
13
- validFiletypes?: string[];
14
- maxFileSize?: number;
15
- onfilecomplete?: (event: CustomEvent<UploadedFile>) => void;
16
- onuploadcomplete?: (event: CustomEvent<UploadedFile[]>) => void;
17
- onuploadaborted?: (event: CustomEvent<UploadedFile[]>) => void;
18
- }
19
-
20
- let {
21
- serverURL = "",
22
- chunkSize = 5,
23
- authToken,
24
- validFiletypes,
25
- maxFileSize = 5120,
26
- onfilecomplete,
27
- onuploadcomplete,
28
- onuploadaborted,
29
- ...restProps
30
- }: Props = $props();
31
-
32
- let uploaderElement: ChunkUploaderElementType;
33
- let isReady = false;
34
- let removeListeners: (() => void) | null = null;
35
-
36
- /**
37
- * Syncs the latest prop values down to the underlying web component.
38
- */
39
- const syncProps = () => {
40
- if (!isReady || !uploaderElement) return;
41
-
42
- uploaderElement.serverURL = serverURL ?? "";
43
- uploaderElement.chunkSize = chunkSize;
44
- uploaderElement.authToken = authToken;
45
- uploaderElement.validFiletypes = validFiletypes?.length
46
- ? [...validFiletypes]
47
- : undefined;
48
- uploaderElement.maxFileSize = maxFileSize;
49
- };
50
-
51
- /**
52
- * Forwards custom events emitted by the web component to Svelte callbacks.
53
- */
54
- const bindEvents = () => {
55
- if (!uploaderElement) return;
56
-
57
- const handleFileComplete = (event: Event) => {
58
- onfilecomplete?.(event as CustomEvent<UploadedFile>);
59
- };
60
-
61
- const handleUploadComplete = (event: Event) => {
62
- onuploadcomplete?.(event as CustomEvent<UploadedFile[]>);
63
- };
64
-
65
- const handleUploadAborted = (event: Event) => {
66
- onuploadaborted?.(event as CustomEvent<UploadedFile[]>);
67
- };
68
-
69
- uploaderElement.addEventListener(
70
- "filecomplete",
71
- handleFileComplete as EventListener
72
- );
73
- uploaderElement.addEventListener(
74
- "uploadcomplete",
75
- handleUploadComplete as EventListener
76
- );
77
- uploaderElement.addEventListener(
78
- "uploadaborted",
79
- handleUploadAborted as EventListener
80
- );
81
-
82
- removeListeners = () => {
83
- uploaderElement.removeEventListener(
84
- "filecomplete",
85
- handleFileComplete as EventListener
86
- );
87
- uploaderElement.removeEventListener(
88
- "uploadcomplete",
89
- handleUploadComplete as EventListener
90
- );
91
- uploaderElement.removeEventListener(
92
- "uploadaborted",
93
- handleUploadAborted as EventListener
94
- );
95
- };
96
- };
97
-
98
- onMount(() => {
99
- let isMounted = true;
100
-
101
- const setup = async () => {
102
- await import("@liwe3/webcomponents/chunk-uploader");
103
- await customElements.whenDefined("liwe3-chunk-uploader");
104
-
105
- if (!isMounted) return;
106
- isReady = true;
107
- syncProps();
108
- bindEvents();
109
- };
110
-
111
- void setup();
112
-
113
- return () => {
114
- isMounted = false;
115
- removeListeners?.();
116
- removeListeners = null;
117
- };
118
- });
119
-
120
- $effect(() => {
121
- if (!isReady || !uploaderElement) return;
122
- uploaderElement.serverURL = serverURL ?? "";
123
- });
124
-
125
- $effect(() => {
126
- if (!isReady || !uploaderElement) return;
127
- uploaderElement.chunkSize = chunkSize;
128
- });
129
-
130
- $effect(() => {
131
- if (!isReady || !uploaderElement) return;
132
- uploaderElement.authToken = authToken;
133
- });
134
-
135
- $effect(() => {
136
- if (!isReady || !uploaderElement) return;
137
- uploaderElement.validFiletypes = validFiletypes?.length
138
- ? [...validFiletypes]
139
- : undefined;
140
- });
141
-
142
- $effect(() => {
143
- if (!isReady || !uploaderElement) return;
144
- uploaderElement.maxFileSize = maxFileSize;
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
- import type { HTMLAttributes } from "svelte/elements";
2
- import type { ChunkUploaderElement as ChunkUploaderElementType, UploadedFile } from "@liwe3/webcomponents";
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
- onfilecomplete?: (event: CustomEvent<UploadedFile>) => void;
10
- onuploadcomplete?: (event: CustomEvent<UploadedFile[]>) => void;
11
- onuploadaborted?: (event: CustomEvent<UploadedFile[]>) => void;
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":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACR,oBAAoB,IAAI,wBAAwB,EAChD,YAAY,EACb,MAAM,sBAAsB,CAAC;AAG9B,UAAU,KAAM,SAAQ,cAAc,CAAC,wBAAwB,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC5D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,IAAI,CAAC;IAChE,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,KAAK,IAAI,CAAC;CAChE;AA2IH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
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"}