@widgetic/editor 4.0.1 → 4.0.3
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/dist/components/MockWidget.svelte +1 -1
- package/dist/components/WidgetPreview.svelte +36 -52
- package/dist/components/editors/EmbedEditor.svelte +1 -1
- package/dist/components/editors/PropsEditor.svelte +309 -227
- package/dist/components/ic/BrowserInputController.svelte +26 -19
- package/dist/components/ic/CheckboxInputController.svelte +1 -1
- package/dist/components/ic/ColorPickerInputController.svelte +37 -37
- package/dist/components/ic/DatePickerInputController.svelte +6 -6
- package/dist/components/ic/DropdownInputController.svelte +1 -1
- package/dist/components/ic/FontInputController.svelte +225 -116
- package/dist/components/ic/FontInputController.svelte.d.ts +4 -2
- package/dist/components/ic/NumberInputController.svelte +37 -37
- package/dist/components/ic/RadioGroupInputController.svelte +1 -1
- package/dist/components/ic/SliderRangeInputController.svelte +1 -1
- package/dist/components/ic/SwitchInputController.svelte +1 -1
- package/dist/components/ic/TextAreaInputController.svelte +213 -85
- package/dist/components/ic/TextAreaInputController.svelte.d.ts +1 -0
- package/dist/components/ic/TextAreaPreviewInputController.svelte +81 -79
- package/dist/components/ic/VectorInputController.svelte +34 -34
- package/dist/components/ic/shared/CategoryTabs.svelte +1 -0
- package/dist/components/ic/shared/RecentItemsSection.svelte +21 -6
- package/dist/components/ic/shared/RecentItemsSection.svelte.d.ts +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/stores/userSession.d.ts +1 -1
- package/dist/stores/userSession.js +17 -2
- package/dist/utils/FontManager.d.ts +3 -1
- package/dist/utils/FontManager.js +95 -103
- package/dist/utils/VectorManager.d.ts +3 -1
- package/dist/utils/VectorManager.js +30 -70
- package/dist/utils/colorTransparency.js +3 -3
- package/dist/utils/fontUtils.js +1 -1
- package/dist/utils/passiveEvents.d.ts +5 -0
- package/dist/utils/passiveEvents.js +9 -18
- package/dist/utils/recentColors.js +15 -15
- package/dist/utils/vectorUtils.js +1 -1
- package/package.json +1 -1
|
@@ -205,7 +205,7 @@
|
|
|
205
205
|
const artifactPath = jsPath.match(/\/widgets\/[^/]+\/v\d+\/.+$/i);
|
|
206
206
|
if (artifactPath) {
|
|
207
207
|
const proxyUrl = `${apiBaseUrl}${artifactPath[0]}`;
|
|
208
|
-
console.log('[WidgetPreview] Using API proxy URL (R2):', proxyUrl);
|
|
208
|
+
// console.log('[WidgetPreview] Using API proxy URL (R2):', proxyUrl);
|
|
209
209
|
return proxyUrl;
|
|
210
210
|
}
|
|
211
211
|
}
|
|
@@ -215,11 +215,11 @@
|
|
|
215
215
|
|
|
216
216
|
if (widgetBuilderUrl && w.id) {
|
|
217
217
|
const previewUrl = `${widgetBuilderUrl.replace(/\/+$/, '')}/preview/${w.id}`;
|
|
218
|
-
console.log('[WidgetPreview] Using Worker preview URL (unpublished):', previewUrl);
|
|
218
|
+
// console.log('[WidgetPreview] Using Worker preview URL (unpublished):', previewUrl);
|
|
219
219
|
return previewUrl;
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
-
console.log('[WidgetPreview] Widget not published and no Worker URL:', w.name, w.id);
|
|
222
|
+
// console.log('[WidgetPreview] Widget not published and no Worker URL:', w.name, w.id);
|
|
223
223
|
return null;
|
|
224
224
|
}
|
|
225
225
|
|
|
@@ -228,32 +228,6 @@
|
|
|
228
228
|
return `${widgetBuilderUrl.replace(/\/+$/, '')}/preview/${w.id}`;
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
async function resolveWidgetPreviewUrl(w: any, primaryUrl: string): Promise<string> {
|
|
232
|
-
try {
|
|
233
|
-
const res = await fetch(primaryUrl, { method: 'GET', mode: 'cors' });
|
|
234
|
-
const contentType = res.headers.get('content-type') || '';
|
|
235
|
-
const looksLikeErrorPayload =
|
|
236
|
-
!res.ok || (contentType.includes('application/json') && !contentType.includes('html'));
|
|
237
|
-
if (looksLikeErrorPayload) {
|
|
238
|
-
const fallbackUrl = tryFallbackUrl(w);
|
|
239
|
-
if (fallbackUrl && !triedFallback) {
|
|
240
|
-
triedFallback = true;
|
|
241
|
-
console.log('[WidgetPreview] Primary URL failed, trying Worker fallback:', fallbackUrl);
|
|
242
|
-
return fallbackUrl;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
} catch (err) {
|
|
246
|
-
const fallbackUrl = tryFallbackUrl(w);
|
|
247
|
-
if (fallbackUrl && !triedFallback) {
|
|
248
|
-
triedFallback = true;
|
|
249
|
-
console.log('[WidgetPreview] Primary URL unreachable, trying Worker fallback:', fallbackUrl);
|
|
250
|
-
return fallbackUrl;
|
|
251
|
-
}
|
|
252
|
-
console.warn('[WidgetPreview] URL probe failed:', primaryUrl, err);
|
|
253
|
-
}
|
|
254
|
-
return primaryUrl;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
231
|
function beginWidgetLoad(w: any, url: string | null) {
|
|
258
232
|
pendingWidget = w;
|
|
259
233
|
triedFallback = false;
|
|
@@ -262,20 +236,16 @@
|
|
|
262
236
|
widgetReady = false;
|
|
263
237
|
errorMessage = '';
|
|
264
238
|
pendingMessages = [];
|
|
239
|
+
isResolvingUrl = false;
|
|
265
240
|
|
|
266
241
|
if (!url) {
|
|
267
242
|
internalIframeSrc = null;
|
|
268
|
-
isResolvingUrl = false;
|
|
269
243
|
return;
|
|
270
244
|
}
|
|
271
245
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
void
|
|
275
|
-
if (pendingWidget !== w) return;
|
|
276
|
-
isResolvingUrl = false;
|
|
277
|
-
internalIframeSrc = resolvedUrl;
|
|
278
|
-
await tick();
|
|
246
|
+
// console.log('[WidgetPreview] Setting widget URL:', url);
|
|
247
|
+
internalIframeSrc = url;
|
|
248
|
+
void tick().then(() => {
|
|
279
249
|
requestAnimationFrame(() => {
|
|
280
250
|
ensureIframeLoadDetected();
|
|
281
251
|
});
|
|
@@ -299,7 +269,7 @@
|
|
|
299
269
|
|
|
300
270
|
window.setTimeout(() => {
|
|
301
271
|
if (mode === 'standalone' && !iframeLoaded && !iframeError && iframeEl && effectiveSrc) {
|
|
302
|
-
console.log('[WidgetPreview] Fallback: marking iframe loaded after ping timeout');
|
|
272
|
+
// console.log('[WidgetPreview] Fallback: marking iframe loaded after ping timeout');
|
|
303
273
|
void handleIframeLoad();
|
|
304
274
|
}
|
|
305
275
|
}, 400);
|
|
@@ -353,12 +323,12 @@
|
|
|
353
323
|
contentItems
|
|
354
324
|
};
|
|
355
325
|
iframeEl.contentWindow.postMessage(message, '*');
|
|
356
|
-
console.log('[WidgetPreview] Sent property update to widget iframe', {
|
|
357
|
-
designKeys: design ? Object.keys(design) : [],
|
|
358
|
-
genericContentKeys: Object.keys(genericContent),
|
|
359
|
-
contentItemsCount: contentItems?.length,
|
|
360
|
-
iframeSrc: effectiveSrc?.substring(0, 80)
|
|
361
|
-
});
|
|
326
|
+
// console.log('[WidgetPreview] Sent property update to widget iframe', {
|
|
327
|
+
// designKeys: design ? Object.keys(design) : [],
|
|
328
|
+
// genericContentKeys: Object.keys(genericContent),
|
|
329
|
+
// contentItemsCount: contentItems?.length,
|
|
330
|
+
// iframeSrc: effectiveSrc?.substring(0, 80)
|
|
331
|
+
// });
|
|
362
332
|
} catch (err) {
|
|
363
333
|
console.warn('[WidgetPreview] Failed to send postMessage:', err);
|
|
364
334
|
}
|
|
@@ -406,7 +376,7 @@
|
|
|
406
376
|
iframeLoaded = true;
|
|
407
377
|
iframeError = false;
|
|
408
378
|
widgetReady = true;
|
|
409
|
-
console.log('[WidgetPreview] iframe onload:', effectiveSrc);
|
|
379
|
+
// console.log('[WidgetPreview] iframe onload:', effectiveSrc);
|
|
410
380
|
|
|
411
381
|
if (iframeEl?.contentWindow) {
|
|
412
382
|
iframeEl.contentWindow.postMessage({ type: 'widgetic:ping' }, '*');
|
|
@@ -426,6 +396,15 @@
|
|
|
426
396
|
dispatch('iframeError', event || new Event('error'));
|
|
427
397
|
return;
|
|
428
398
|
}
|
|
399
|
+
if (!triedFallback && pendingWidget) {
|
|
400
|
+
const fallbackUrl = tryFallbackUrl(pendingWidget);
|
|
401
|
+
if (fallbackUrl && fallbackUrl !== internalIframeSrc) {
|
|
402
|
+
triedFallback = true;
|
|
403
|
+
// console.log('[WidgetPreview] Primary iframe load failed, trying Worker fallback:', fallbackUrl);
|
|
404
|
+
internalIframeSrc = fallbackUrl;
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
429
408
|
iframeError = true;
|
|
430
409
|
iframeLoaded = false;
|
|
431
410
|
widgetReady = false;
|
|
@@ -441,7 +420,7 @@
|
|
|
441
420
|
iframeLoaded = true;
|
|
442
421
|
iframeError = false;
|
|
443
422
|
widgetReady = true;
|
|
444
|
-
console.log('[WidgetPreview] Widget confirmed ready via postMessage');
|
|
423
|
+
// console.log('[WidgetPreview] Widget confirmed ready via postMessage');
|
|
445
424
|
sendPropertiesToWidget(designValues, contentValues);
|
|
446
425
|
flushPendingMessages();
|
|
447
426
|
}
|
|
@@ -734,9 +713,14 @@
|
|
|
734
713
|
{#if mode === 'controlled' && previewHasRuntimeError && !isGeneratingCode}
|
|
735
714
|
<div class="compilation-error-overlay absolute inset-0 z-20 flex flex-col items-center justify-center bg-red-50 text-red-700 p-6">
|
|
736
715
|
<div class="text-5xl mb-4">⚠️</div>
|
|
737
|
-
<div class="font-semibold text-xl mb-2">
|
|
738
|
-
|
|
739
|
-
|
|
716
|
+
<div class="font-semibold text-xl mb-2">
|
|
717
|
+
{previewError && /TypeError|Uncaught|is not a function|is not defined/i.test(previewError)
|
|
718
|
+
? 'Widget runtime error'
|
|
719
|
+
: 'Code Has Compilation Errors'}
|
|
720
|
+
</div>
|
|
721
|
+
<div class="text-sm text-center text-red-600 mb-4 max-w-md whitespace-pre-line">
|
|
722
|
+
{previewError
|
|
723
|
+
|| `The generated code has syntax or compilation errors (HTTP ${previewRuntimeErrorStatus}).`}
|
|
740
724
|
</div>
|
|
741
725
|
<div class="flex gap-3 flex-wrap justify-center">
|
|
742
726
|
<button type="button" onclick={() => dispatch('fixErrors')} class="px-4 py-2 text-xs rounded bg-red-600 hover:bg-red-700 text-white cursor-pointer border-0">🔧 Fix Errors</button>
|
|
@@ -755,7 +739,7 @@
|
|
|
755
739
|
src={mountedPreviewSrc}
|
|
756
740
|
class="widget-preview-iframe h-full w-full border-0"
|
|
757
741
|
tabindex="-1"
|
|
758
|
-
sandbox={mode === 'controlled' ? undefined : 'allow-scripts allow-popups allow-forms'}
|
|
742
|
+
sandbox={mode === 'controlled' ? undefined : 'allow-scripts allow-popups allow-forms allow-same-origin'}
|
|
759
743
|
loading="eager"
|
|
760
744
|
allow="clipboard-read; clipboard-write"
|
|
761
745
|
onload={handleIframeLoad}
|
|
@@ -769,7 +753,7 @@
|
|
|
769
753
|
{/if}
|
|
770
754
|
|
|
771
755
|
{#if mode === 'controlled' && isGeneratingCode}
|
|
772
|
-
<GenerateLoader overlay title="Generating code…" size="lg" />
|
|
756
|
+
<GenerateLoader overlay title="Generating code…" subtitle="" size="lg" />
|
|
773
757
|
{/if}
|
|
774
758
|
</div>
|
|
775
759
|
</div>
|
|
@@ -783,7 +767,7 @@
|
|
|
783
767
|
{:else}
|
|
784
768
|
<div class="flex h-full flex-col items-center justify-center p-6 text-center text-sm text-gray-600">
|
|
785
769
|
{#if isGeneratingCode}
|
|
786
|
-
<GenerateLoader title="Generating code…" size="lg" />
|
|
770
|
+
<GenerateLoader title="Generating code…" subtitle="" size="lg" />
|
|
787
771
|
{:else if previewError === 'NO_CODE_YET'}
|
|
788
772
|
<div class="font-semibold text-lg text-gray-700 mb-2">No Code Generated Yet</div>
|
|
789
773
|
{:else if previewError}
|