@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.
Files changed (39) hide show
  1. package/dist/components/MockWidget.svelte +1 -1
  2. package/dist/components/WidgetPreview.svelte +36 -52
  3. package/dist/components/editors/EmbedEditor.svelte +1 -1
  4. package/dist/components/editors/PropsEditor.svelte +309 -227
  5. package/dist/components/ic/BrowserInputController.svelte +26 -19
  6. package/dist/components/ic/CheckboxInputController.svelte +1 -1
  7. package/dist/components/ic/ColorPickerInputController.svelte +37 -37
  8. package/dist/components/ic/DatePickerInputController.svelte +6 -6
  9. package/dist/components/ic/DropdownInputController.svelte +1 -1
  10. package/dist/components/ic/FontInputController.svelte +225 -116
  11. package/dist/components/ic/FontInputController.svelte.d.ts +4 -2
  12. package/dist/components/ic/NumberInputController.svelte +37 -37
  13. package/dist/components/ic/RadioGroupInputController.svelte +1 -1
  14. package/dist/components/ic/SliderRangeInputController.svelte +1 -1
  15. package/dist/components/ic/SwitchInputController.svelte +1 -1
  16. package/dist/components/ic/TextAreaInputController.svelte +213 -85
  17. package/dist/components/ic/TextAreaInputController.svelte.d.ts +1 -0
  18. package/dist/components/ic/TextAreaPreviewInputController.svelte +81 -79
  19. package/dist/components/ic/VectorInputController.svelte +34 -34
  20. package/dist/components/ic/shared/CategoryTabs.svelte +1 -0
  21. package/dist/components/ic/shared/RecentItemsSection.svelte +21 -6
  22. package/dist/components/ic/shared/RecentItemsSection.svelte.d.ts +1 -0
  23. package/dist/config.d.ts +6 -0
  24. package/dist/config.js +19 -7
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.js +1 -0
  27. package/dist/stores/userSession.d.ts +1 -1
  28. package/dist/stores/userSession.js +17 -2
  29. package/dist/utils/FontManager.d.ts +3 -1
  30. package/dist/utils/FontManager.js +95 -103
  31. package/dist/utils/VectorManager.d.ts +3 -1
  32. package/dist/utils/VectorManager.js +30 -70
  33. package/dist/utils/colorTransparency.js +3 -3
  34. package/dist/utils/fontUtils.js +1 -1
  35. package/dist/utils/passiveEvents.d.ts +5 -0
  36. package/dist/utils/passiveEvents.js +9 -18
  37. package/dist/utils/recentColors.js +15 -15
  38. package/dist/utils/vectorUtils.js +1 -1
  39. package/package.json +1 -1
@@ -30,7 +30,7 @@
30
30
  };
31
31
 
32
32
  function handleVote(index: number) {
33
- console.log("Vote cast for:", pollData.options[index].label);
33
+ // console.log("Vote cast for:", pollData.options[index].label);
34
34
  // In a real implementation, this would call an API
35
35
  }
36
36
  </script>
@@ -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
- isResolvingUrl = true;
273
- console.log('[WidgetPreview] Resolving widget URL:', url);
274
- void resolveWidgetPreviewUrl(w, url).then(async (resolvedUrl) => {
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">Code Has Compilation Errors</div>
738
- <div class="text-sm text-center text-red-600 mb-4 max-w-md">
739
- The generated code has syntax or compilation errors (HTTP {previewRuntimeErrorStatus}).
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}
@@ -83,7 +83,7 @@ let embedEditorElement: HTMLElement | null = null;
83
83
  * ON MOUNT
84
84
  */
85
85
  onMount(() => {
86
- console.log('EMBED EDITOR Mounted!');
86
+ // console.log('EMBED EDITOR Mounted!');
87
87
 
88
88
  // show loader while fetching schemas
89
89
  // loading = true;