@syntrologie/runtime-sdk 2.8.0-canary.9 → 2.9.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.
@@ -12983,6 +12983,11 @@ var SyntrologieSDK = (() => {
12983
12983
  debounceTimer = setTimeout(() => {
12984
12984
  if (disconnected)
12985
12985
  return;
12986
+ if (!anchor.isConnected) {
12987
+ observer2.disconnect();
12988
+ disconnected = true;
12989
+ return;
12990
+ }
12986
12991
  retries++;
12987
12992
  try {
12988
12993
  reinsertFn();
@@ -13024,7 +13029,16 @@ var SyntrologieSDK = (() => {
13024
13029
  "sup",
13025
13030
  "sub",
13026
13031
  "a",
13027
- "button"
13032
+ "button",
13033
+ // SVG elements (for inline Lucide icons in config HTML)
13034
+ "svg",
13035
+ "path",
13036
+ "circle",
13037
+ "line",
13038
+ "polyline",
13039
+ "polygon",
13040
+ "rect",
13041
+ "g"
13028
13042
  ]);
13029
13043
  function sanitizeHtml(html3) {
13030
13044
  const hasNative = typeof window.Sanitizer === "function";
@@ -13159,15 +13173,20 @@ var SyntrologieSDK = (() => {
13159
13173
  container.removeEventListener("click", deepLinkHandler);
13160
13174
  }
13161
13175
  guardCleanup();
13162
- if (action.position === "replace" && originalContent !== null) {
13163
- const restoredEl = document.createElement(anchorEl.tagName);
13164
- restoredEl.innerHTML = originalContent;
13165
- Array.from(anchorEl.attributes).forEach((attr) => {
13166
- restoredEl.setAttribute(attr.name, attr.value);
13167
- });
13168
- container.replaceWith(restoredEl);
13169
- } else {
13170
- container.remove();
13176
+ if (!container.isConnected)
13177
+ return;
13178
+ try {
13179
+ if (action.position === "replace" && originalContent !== null) {
13180
+ const restoredEl = document.createElement(anchorEl.tagName);
13181
+ restoredEl.innerHTML = originalContent;
13182
+ Array.from(anchorEl.attributes).forEach((attr) => {
13183
+ restoredEl.setAttribute(attr.name, attr.value);
13184
+ });
13185
+ container.replaceWith(restoredEl);
13186
+ } else {
13187
+ container.remove();
13188
+ }
13189
+ } catch {
13171
13190
  }
13172
13191
  },
13173
13192
  updateFn: (changes) => {
@@ -13196,6 +13215,8 @@ var SyntrologieSDK = (() => {
13196
13215
  });
13197
13216
  return {
13198
13217
  cleanup: () => {
13218
+ if (!anchorEl.isConnected)
13219
+ return;
13199
13220
  anchorEl.textContent = originalText;
13200
13221
  },
13201
13222
  updateFn: (changes) => {
@@ -13237,6 +13258,8 @@ var SyntrologieSDK = (() => {
13237
13258
  });
13238
13259
  return {
13239
13260
  cleanup: () => {
13261
+ if (!anchorEl.isConnected)
13262
+ return;
13240
13263
  if (hadAttribute && originalValue !== null) {
13241
13264
  anchorEl.setAttribute(action.attr, originalValue);
13242
13265
  } else {
@@ -13270,6 +13293,8 @@ var SyntrologieSDK = (() => {
13270
13293
  });
13271
13294
  return {
13272
13295
  cleanup: () => {
13296
+ if (!anchorEl.isConnected)
13297
+ return;
13273
13298
  if (!hadClass) {
13274
13299
  anchorEl.classList.remove(action.className);
13275
13300
  }
@@ -13296,6 +13321,8 @@ var SyntrologieSDK = (() => {
13296
13321
  });
13297
13322
  return {
13298
13323
  cleanup: () => {
13324
+ if (!anchorEl.isConnected)
13325
+ return;
13299
13326
  if (hadClass) {
13300
13327
  anchorEl.classList.add(action.className);
13301
13328
  }
@@ -13328,6 +13355,8 @@ var SyntrologieSDK = (() => {
13328
13355
  });
13329
13356
  return {
13330
13357
  cleanup: () => {
13358
+ if (!anchorEl.isConnected)
13359
+ return;
13331
13360
  for (const [prop, originalValue] of originalStyles) {
13332
13361
  if (originalValue) {
13333
13362
  anchorEl.style.setProperty(prop, originalValue);
@@ -14578,8 +14607,14 @@ var SyntrologieSDK = (() => {
14578
14607
  scrim.style.pointerEvents = "none";
14579
14608
  scrim.style.opacity = "0";
14580
14609
  setTimeout(() => {
14581
- scrim.remove();
14582
- ring.remove();
14610
+ try {
14611
+ scrim.remove();
14612
+ } catch {
14613
+ }
14614
+ try {
14615
+ ring.remove();
14616
+ } catch {
14617
+ }
14583
14618
  }, 220);
14584
14619
  }
14585
14620
  };
@@ -14607,7 +14642,16 @@ var SyntrologieSDK = (() => {
14607
14642
  "sup",
14608
14643
  "sub",
14609
14644
  "a",
14610
- "button"
14645
+ "button",
14646
+ // SVG elements (for inline Lucide icons in config HTML)
14647
+ "svg",
14648
+ "path",
14649
+ "circle",
14650
+ "line",
14651
+ "polyline",
14652
+ "polygon",
14653
+ "rect",
14654
+ "g"
14611
14655
  ]);
14612
14656
  function sanitizeHtml2(html3) {
14613
14657
  const hasNative = typeof window.Sanitizer === "function";
@@ -14814,8 +14858,14 @@ var SyntrologieSDK = (() => {
14814
14858
  modal2.style.transform = "translate(-50%, -50%) scale(0.95)";
14815
14859
  scrimEl.style.opacity = "0";
14816
14860
  setTimeout(() => {
14817
- modal2.remove();
14818
- scrimEl.remove();
14861
+ try {
14862
+ modal2.remove();
14863
+ } catch {
14864
+ }
14865
+ try {
14866
+ scrimEl.remove();
14867
+ } catch {
14868
+ }
14819
14869
  }, 200);
14820
14870
  context.publishEvent("action.modal_dismissed", {
14821
14871
  actionClicked
@@ -16327,10 +16377,12 @@ var SyntrologieSDK = (() => {
16327
16377
  };
16328
16378
  }
16329
16379
  function showTooltip(anchorEl, overlayRoot, opts) {
16330
- const rect = anchorEl.getBoundingClientRect();
16331
- const isLargeElement = rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;
16332
- if (!isLargeElement) {
16333
- anchorEl.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
16380
+ if (!opts.trigger || opts.trigger === "immediate") {
16381
+ const rect = anchorEl.getBoundingClientRect();
16382
+ const isLargeElement = rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;
16383
+ if (!isLargeElement) {
16384
+ anchorEl.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
16385
+ }
16334
16386
  }
16335
16387
  const div = document.createElement("div");
16336
16388
  div.className = "syntro-tooltip";
@@ -16540,7 +16592,12 @@ var SyntrologieSDK = (() => {
16540
16592
  }
16541
16593
  div.style.pointerEvents = "none";
16542
16594
  div.style.opacity = "0";
16543
- setTimeout(() => div.remove(), 200);
16595
+ setTimeout(() => {
16596
+ try {
16597
+ div.remove();
16598
+ } catch {
16599
+ }
16600
+ }, 200);
16544
16601
  }
16545
16602
  };
16546
16603
  return handle;
@@ -16573,7 +16630,7 @@ var SyntrologieSDK = (() => {
16573
16630
  }
16574
16631
 
16575
16632
  // ../adaptives/adaptive-overlays/dist/WorkflowWidget.js
16576
- function showWorkflowToast(container, notification) {
16633
+ function showWorkflowToast(notification) {
16577
16634
  const toast = document.createElement("div");
16578
16635
  toast.setAttribute("data-testid", "workflow-toast");
16579
16636
  toast.className = "se-fixed se-bottom-4 se-right-4 se-z-50";
@@ -16607,7 +16664,7 @@ var SyntrologieSDK = (() => {
16607
16664
  bodyEl.textContent = notification.body;
16608
16665
  toast.appendChild(bodyEl);
16609
16666
  }
16610
- container.appendChild(toast);
16667
+ document.body.appendChild(toast);
16611
16668
  let removeTimer;
16612
16669
  const fadeTimer = setTimeout(() => {
16613
16670
  toast.style.opacity = "0";
@@ -16696,10 +16753,10 @@ var SyntrologieSDK = (() => {
16696
16753
  return newEntries.length > 0 ? [...prev, ...newEntries] : prev;
16697
16754
  });
16698
16755
  for (const [tourId, { meta }] of tourWorkflows) {
16699
- if (!notifiedRef.current.has(tourId) && meta.notification && containerRef.current && !dismissed.includes(tourId) && !completed[tourId]) {
16756
+ if (!notifiedRef.current.has(tourId) && meta.notification && !dismissed.includes(tourId) && !completed[tourId]) {
16700
16757
  notifiedRef.current.add(tourId);
16701
16758
  stateNs?.set?.("notified", [...notifiedRef.current]);
16702
- const cleanup = showWorkflowToast(containerRef.current, meta.notification);
16759
+ const cleanup = showWorkflowToast(meta.notification);
16703
16760
  toastCleanupsRef.current.push(cleanup);
16704
16761
  }
16705
16762
  }
@@ -16729,8 +16786,8 @@ var SyntrologieSDK = (() => {
16729
16786
  notifiedRef.current.add(tourId);
16730
16787
  stateNs?.set?.("notified", [...notifiedRef.current]);
16731
16788
  const workflow = currentWorkflows.get(tourId);
16732
- if (workflow?.meta.notification && containerRef.current) {
16733
- const cleanup = showWorkflowToast(containerRef.current, workflow.meta.notification);
16789
+ if (workflow?.meta.notification) {
16790
+ const cleanup = showWorkflowToast(workflow.meta.notification);
16734
16791
  toastCleanupsRef.current.push(cleanup);
16735
16792
  }
16736
16793
  }
@@ -16871,6 +16928,7 @@ var SyntrologieSDK = (() => {
16871
16928
  cleanup: () => {
16872
16929
  handle.destroy();
16873
16930
  anchorEl.removeAttribute("data-syntro-highlight");
16931
+ anchorEl.removeAttribute("data-syntro-highlight-dismissed");
16874
16932
  }
16875
16933
  };
16876
16934
  };
@@ -16959,6 +17017,8 @@ var SyntrologieSDK = (() => {
16959
17017
  return {
16960
17018
  cleanup: () => {
16961
17019
  clearTimeout(timeoutId);
17020
+ if (!anchorEl.isConnected)
17021
+ return;
16962
17022
  anchorEl.style.animation = originalAnimation;
16963
17023
  anchorEl.removeAttribute("data-syntro-pulse");
16964
17024
  }
@@ -17027,7 +17087,12 @@ var SyntrologieSDK = (() => {
17027
17087
  });
17028
17088
  return {
17029
17089
  cleanup: () => {
17030
- badge2.remove();
17090
+ try {
17091
+ badge2.remove();
17092
+ } catch {
17093
+ }
17094
+ if (!anchorEl.isConnected)
17095
+ return;
17031
17096
  if (originalPosition !== void 0) {
17032
17097
  anchorEl.style.position = originalPosition;
17033
17098
  }
@@ -20426,7 +20491,10 @@ ${text2}</tr>
20426
20491
  },
20427
20492
  item: {
20428
20493
  backgroundColor: "var(--sc-content-background)",
20429
- border: "var(--sc-content-border)"
20494
+ borderTop: "var(--sc-content-border)",
20495
+ borderRight: "var(--sc-content-border)",
20496
+ borderBottom: "var(--sc-content-border)",
20497
+ borderLeft: "var(--sc-content-border)"
20430
20498
  },
20431
20499
  itemExpanded: {
20432
20500
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.08)"
@@ -20465,7 +20533,10 @@ ${text2}</tr>
20465
20533
  },
20466
20534
  item: {
20467
20535
  backgroundColor: "var(--sc-content-background)",
20468
- border: "var(--sc-content-border)"
20536
+ borderTop: "var(--sc-content-border)",
20537
+ borderRight: "var(--sc-content-border)",
20538
+ borderBottom: "var(--sc-content-border)",
20539
+ borderLeft: "var(--sc-content-border)"
20469
20540
  },
20470
20541
  itemExpanded: {
20471
20542
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.15)"
@@ -20846,6 +20917,20 @@ ${text2}</tr>
20846
20917
  var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
20847
20918
  var import_react5 = __toESM(require_react(), 1);
20848
20919
  var import_client4 = __toESM(require_client(), 1);
20920
+ var EMOJI_SVG_MAP = {
20921
+ "\u{1F4B5}": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="12" x="2" y="6" rx="2"/><circle cx="12" cy="12" r="2"/><path d="M6 12h.01M18 12h.01"/></svg>',
20922
+ "\u{1F3DB}\uFE0F": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" x2="21" y1="22" y2="22"/><line x1="6" x2="6" y1="18" y2="11"/><line x1="10" x2="10" y1="18" y2="11"/><line x1="14" x2="14" y1="18" y2="11"/><line x1="18" x2="18" y1="18" y2="11"/><polygon points="12 2 20 7 4 7"/></svg>',
20923
+ "\u23ED\uFE0F": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 4 15 12 5 20 5 4"/><line x1="19" x2="19" y1="5" y2="19"/></svg>',
20924
+ "\u27A1\uFE0F": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>',
20925
+ "\u{1F4A1}": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/></svg>',
20926
+ "\u{1F4B0}": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="12" x="2" y="6" rx="2"/><circle cx="12" cy="12" r="2"/><path d="M6 12h.01M18 12h.01"/></svg>',
20927
+ "\u{1F4CB}": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"/><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><path d="M12 11h4"/><path d="M12 16h4"/><path d="M8 11h.01"/><path d="M8 16h.01"/></svg>',
20928
+ "\u2705": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><path d="m9 11 3 3L22 4"/></svg>',
20929
+ "\u26A0\uFE0F": '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg>'
20930
+ };
20931
+ function renderIcon(emoji) {
20932
+ return EMOJI_SVG_MAP[emoji] ?? escapeHtml(emoji);
20933
+ }
20849
20934
  function escapeHtml(str) {
20850
20935
  return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
20851
20936
  }
@@ -20995,10 +21080,29 @@ ${text2}</tr>
20995
21080
  }
20996
21081
  }
20997
21082
  };
20998
- function NavTipItem({ item, isExpanded, isLast, onToggle, onNavigate, theme }) {
21083
+ function routeMatchesCurrent(routes) {
21084
+ if (typeof window === "undefined")
21085
+ return false;
21086
+ const current = window.location.pathname;
21087
+ return routes.some((route) => {
21088
+ const routePath = route.split("?")[0].split("#")[0];
21089
+ if (routePath.endsWith("/**")) {
21090
+ return current.startsWith(routePath.slice(0, -3));
21091
+ }
21092
+ return current === routePath;
21093
+ });
21094
+ }
21095
+ function pulseElement(el) {
21096
+ const keyframes = [
21097
+ { boxShadow: "0 0 0 0 rgba(13, 148, 136, 0.5)" },
21098
+ { boxShadow: "0 0 0 8px rgba(13, 148, 136, 0)" }
21099
+ ];
21100
+ el.animate(keyframes, { duration: 600, iterations: 3, easing: "ease-out" });
21101
+ }
21102
+ function NavTipItem({ item, isExpanded, isLast, onToggle, onNavigate, onFocusAnchor, theme }) {
20999
21103
  const [isHovered, setIsHovered] = (0, import_react5.useState)(false);
21000
21104
  const colors = themeStyles2[theme];
21001
- const { title, description, href, icon, external } = item.config;
21105
+ const { title, description, href, icon, external, anchor } = item.config;
21002
21106
  const itemStyle = {
21003
21107
  ...baseStyles2.item,
21004
21108
  ...colors.item,
@@ -21020,14 +21124,22 @@ ${text2}</tr>
21020
21124
  maxHeight: isExpanded ? "500px" : "0",
21021
21125
  paddingBottom: isExpanded ? "16px" : "0"
21022
21126
  };
21127
+ const effectiveHref = anchor ? Array.isArray(anchor.route) ? anchor.route[0] : anchor.route : href;
21128
+ const isSamePage = anchor ? routeMatchesCurrent(Array.isArray(anchor.route) ? anchor.route : [anchor.route]) : effectiveHref ? routeMatchesCurrent([effectiveHref]) : false;
21129
+ const hasSelector = anchor?.selector && anchor.selector !== "*";
21130
+ const isFocusAction = isSamePage && hasSelector;
21131
+ const hasAction = !!effectiveHref || isFocusAction;
21023
21132
  const handleLinkClick = (e2) => {
21024
21133
  e2.preventDefault();
21025
21134
  e2.stopPropagation();
21026
- if (href) {
21027
- onNavigate(href, external ?? false);
21135
+ if (isFocusAction && anchor) {
21136
+ onFocusAnchor(anchor);
21137
+ } else if (effectiveHref) {
21138
+ onNavigate(effectiveHref, external ?? false);
21028
21139
  }
21029
21140
  };
21030
- return (0, import_jsx_runtime5.jsxs)("div", { style: itemStyle, "data-nav-tip-id": item.config.id, children: [(0, import_jsx_runtime5.jsxs)("button", { type: "button", style: headerStyle, onClick: onToggle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), "aria-expanded": isExpanded, children: [icon && (0, import_jsx_runtime5.jsx)("span", { style: baseStyles2.icon, children: icon }), (0, import_jsx_runtime5.jsx)("span", { children: title }), (0, import_jsx_runtime5.jsx)("span", { style: chevronStyle, children: "\u203A" })] }), (0, import_jsx_runtime5.jsxs)("div", { style: bodyStyle, "aria-hidden": !isExpanded, children: [(0, import_jsx_runtime5.jsx)("p", { style: baseStyles2.description, children: description }), href && (0, import_jsx_runtime5.jsxs)("a", { href, onClick: handleLinkClick, style: { ...baseStyles2.linkButton, ...colors.linkButton }, target: external ? "_blank" : void 0, rel: external ? "noopener noreferrer" : void 0, children: ["Go ", external ? "\u2197" : "\u2192"] })] })] });
21141
+ const ctaLabel = isFocusAction ? `Focus \u2192` : external ? `Go \u2197` : `Go \u2192`;
21142
+ return (0, import_jsx_runtime5.jsxs)("div", { style: itemStyle, "data-nav-tip-id": item.config.id, children: [(0, import_jsx_runtime5.jsxs)("button", { type: "button", style: headerStyle, onClick: onToggle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), "aria-expanded": isExpanded, children: [icon && (0, import_jsx_runtime5.jsx)("span", { style: baseStyles2.icon, dangerouslySetInnerHTML: { __html: renderIcon(icon) } }), (0, import_jsx_runtime5.jsx)("span", { children: title }), (0, import_jsx_runtime5.jsx)("span", { style: chevronStyle, children: "\u203A" })] }), (0, import_jsx_runtime5.jsxs)("div", { style: bodyStyle, "aria-hidden": !isExpanded, children: [(0, import_jsx_runtime5.jsx)("p", { style: baseStyles2.description, children: description }), hasAction && (0, import_jsx_runtime5.jsx)("a", { href: effectiveHref || "#", onClick: handleLinkClick, style: { ...baseStyles2.linkButton, ...colors.linkButton }, target: external ? "_blank" : void 0, rel: external ? "noopener noreferrer" : void 0, children: ctaLabel })] })] });
21031
21143
  }
21032
21144
  function NavWidget({ config, runtime: runtime7, instanceId }) {
21033
21145
  const [renderTick, forceUpdate] = (0, import_react5.useReducer)((x2) => x2 + 1, 0);
@@ -21124,9 +21236,24 @@ ${text2}</tr>
21124
21236
  } else {
21125
21237
  const url = new URL(href, window.location.origin);
21126
21238
  url.search = window.location.search;
21127
- window.location.href = url.toString();
21239
+ window.history.pushState(null, "", url.toString());
21240
+ window.dispatchEvent(new PopStateEvent("popstate"));
21128
21241
  }
21129
21242
  }, [runtime7.events, instanceId]);
21243
+ const handleFocusAnchor = (0, import_react5.useCallback)((anchor) => {
21244
+ const el = document.querySelector(anchor.selector);
21245
+ if (!(el instanceof HTMLElement))
21246
+ return;
21247
+ runtime7.events.publish("nav:tip_focused", {
21248
+ instanceId,
21249
+ selector: anchor.selector,
21250
+ route: anchor.route,
21251
+ timestamp: Date.now()
21252
+ });
21253
+ el.scrollIntoView({ behavior: "smooth", block: "center" });
21254
+ pulseElement(el);
21255
+ setTimeout(() => el.focus(), 400);
21256
+ }, [runtime7.events, instanceId]);
21130
21257
  const containerStyle = {
21131
21258
  ...baseStyles2.container,
21132
21259
  ...themeStyles2[resolvedTheme].container
@@ -21139,7 +21266,7 @@ ${text2}</tr>
21139
21266
  ...baseStyles2.emptyState,
21140
21267
  ...themeStyles2[resolvedTheme].emptyState
21141
21268
  };
21142
- const renderItems = (items) => items.map((tip, index2) => (0, import_jsx_runtime5.jsx)(NavTipItem, { item: tip, isExpanded: expandedIds.has(tip.config.id), isLast: index2 === items.length - 1, onToggle: () => handleToggle(tip.config.id), onNavigate: handleNavigate, theme: resolvedTheme }, tip.config.id));
21269
+ const renderItems = (items) => items.map((tip, index2) => (0, import_jsx_runtime5.jsx)(NavTipItem, { item: tip, isExpanded: expandedIds.has(tip.config.id), isLast: index2 === items.length - 1, onToggle: () => handleToggle(tip.config.id), onNavigate: handleNavigate, onFocusAnchor: handleFocusAnchor, theme: resolvedTheme }, tip.config.id));
21143
21270
  if (visibleTips.length === 0) {
21144
21271
  return (0, import_jsx_runtime5.jsx)("div", { style: containerStyle, "data-adaptive-id": instanceId, "data-adaptive-type": "adaptive-nav", children: (0, import_jsx_runtime5.jsx)("div", { style: emptyStateStyle, children: "You're all set for now! We'll share helpful tips here when they're relevant to what you're doing." }) });
21145
21272
  }
@@ -21168,7 +21295,7 @@ ${text2}</tr>
21168
21295
  <div style="font-family: system-ui; max-width: 100%;">
21169
21296
  ${tips.map((tip) => `
21170
21297
  <div style="margin-bottom: 4px; padding: 12px 16px; background: ${slateGrey[12]}; border-radius: 8px;">
21171
- ${tip.config.icon ? `<span>${escapeHtml(tip.config.icon)}</span> ` : ""}<strong>${escapeHtml(tip.config.title)}</strong>
21298
+ ${tip.config.icon ? `<span>${renderIcon(tip.config.icon)}</span> ` : ""}<strong>${escapeHtml(tip.config.title)}</strong>
21172
21299
  <p style="margin-top: 8px; color: ${slateGrey[6]}; font-size: 13px;">${escapeHtml(tip.config.description)}</p>
21173
21300
  ${tip.config.href ? `<a href="${escapeHtml(tip.config.href)}" style="color: ${purple[2]}; font-size: 13px;">Go &rarr;</a>` : ""}
21174
21301
  </div>
@@ -21438,7 +21565,7 @@ ${text2}</tr>
21438
21565
  }
21439
21566
 
21440
21567
  // src/version.ts
21441
- var SDK_VERSION = "2.8.0-canary.9";
21568
+ var SDK_VERSION = "2.9.0";
21442
21569
 
21443
21570
  // src/types.ts
21444
21571
  var SDK_SCHEMA_VERSION = "2.0";
@@ -21836,7 +21963,8 @@ ${text2}</tr>
21836
21963
  if (cond.type === "event_count" && cond.key) {
21837
21964
  const counter = cond.counter;
21838
21965
  const predicate = counter ? buildPredicate(counter) : () => true;
21839
- accumulator.register(cond.key, predicate);
21966
+ const needsTimestamps = typeof cond.withinMs === "number";
21967
+ accumulator.register(cond.key, predicate, needsTimestamps);
21840
21968
  }
21841
21969
  }
21842
21970
  }
@@ -22356,8 +22484,390 @@ ${text2}</tr>
22356
22484
  custom: customCanvasEvent
22357
22485
  };
22358
22486
 
22359
- // src/notifications/NotificationToastStack.tsx
22487
+ // ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
22488
+ var import_react8 = __toESM(require_react());
22489
+
22490
+ // ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
22491
+ var mergeClasses = (...classes2) => classes2.filter((className, index2, array) => {
22492
+ return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index2;
22493
+ }).join(" ").trim();
22494
+
22495
+ // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js
22496
+ var toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
22497
+
22498
+ // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js
22499
+ var toCamelCase = (string) => string.replace(
22500
+ /^([A-Z])|[\s-_]+(\w)/g,
22501
+ (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()
22502
+ );
22503
+
22504
+ // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js
22505
+ var toPascalCase = (string) => {
22506
+ const camelCase = toCamelCase(string);
22507
+ return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
22508
+ };
22509
+
22510
+ // ../../node_modules/lucide-react/dist/esm/Icon.js
22511
+ var import_react7 = __toESM(require_react());
22512
+
22513
+ // ../../node_modules/lucide-react/dist/esm/defaultAttributes.js
22514
+ var defaultAttributes = {
22515
+ xmlns: "http://www.w3.org/2000/svg",
22516
+ width: 24,
22517
+ height: 24,
22518
+ viewBox: "0 0 24 24",
22519
+ fill: "none",
22520
+ stroke: "currentColor",
22521
+ strokeWidth: 2,
22522
+ strokeLinecap: "round",
22523
+ strokeLinejoin: "round"
22524
+ };
22525
+
22526
+ // ../../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js
22527
+ var hasA11yProp = (props) => {
22528
+ for (const prop in props) {
22529
+ if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
22530
+ return true;
22531
+ }
22532
+ }
22533
+ return false;
22534
+ };
22535
+
22536
+ // ../../node_modules/lucide-react/dist/esm/Icon.js
22537
+ var Icon = (0, import_react7.forwardRef)(
22538
+ ({
22539
+ color = "currentColor",
22540
+ size: size2 = 24,
22541
+ strokeWidth = 2,
22542
+ absoluteStrokeWidth,
22543
+ className = "",
22544
+ children,
22545
+ iconNode,
22546
+ ...rest
22547
+ }, ref) => (0, import_react7.createElement)(
22548
+ "svg",
22549
+ {
22550
+ ref,
22551
+ ...defaultAttributes,
22552
+ width: size2,
22553
+ height: size2,
22554
+ stroke: color,
22555
+ strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size2) : strokeWidth,
22556
+ className: mergeClasses("lucide", className),
22557
+ ...!children && !hasA11yProp(rest) && { "aria-hidden": "true" },
22558
+ ...rest
22559
+ },
22560
+ [
22561
+ ...iconNode.map(([tag3, attrs]) => (0, import_react7.createElement)(tag3, attrs)),
22562
+ ...Array.isArray(children) ? children : [children]
22563
+ ]
22564
+ )
22565
+ );
22566
+
22567
+ // ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
22568
+ var createLucideIcon = (iconName, iconNode) => {
22569
+ const Component = (0, import_react8.forwardRef)(
22570
+ ({ className, ...props }, ref) => (0, import_react8.createElement)(Icon, {
22571
+ ref,
22572
+ iconNode,
22573
+ className: mergeClasses(
22574
+ `lucide-${toKebabCase(toPascalCase(iconName))}`,
22575
+ `lucide-${iconName}`,
22576
+ className
22577
+ ),
22578
+ ...props
22579
+ })
22580
+ );
22581
+ Component.displayName = toPascalCase(iconName);
22582
+ return Component;
22583
+ };
22584
+
22585
+ // ../../node_modules/lucide-react/dist/esm/icons/arrow-right.js
22586
+ var __iconNode = [
22587
+ ["path", { d: "M5 12h14", key: "1ays0h" }],
22588
+ ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
22589
+ ];
22590
+ var ArrowRight = createLucideIcon("arrow-right", __iconNode);
22591
+
22592
+ // ../../node_modules/lucide-react/dist/esm/icons/banknote.js
22593
+ var __iconNode2 = [
22594
+ ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }],
22595
+ ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }],
22596
+ ["path", { d: "M6 12h.01M18 12h.01", key: "113zkx" }]
22597
+ ];
22598
+ var Banknote = createLucideIcon("banknote", __iconNode2);
22599
+
22600
+ // ../../node_modules/lucide-react/dist/esm/icons/bell.js
22601
+ var __iconNode3 = [
22602
+ ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
22603
+ [
22604
+ "path",
22605
+ {
22606
+ d: "M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",
22607
+ key: "11g9vi"
22608
+ }
22609
+ ]
22610
+ ];
22611
+ var Bell = createLucideIcon("bell", __iconNode3);
22612
+
22613
+ // ../../node_modules/lucide-react/dist/esm/icons/book-open.js
22614
+ var __iconNode4 = [
22615
+ ["path", { d: "M12 7v14", key: "1akyts" }],
22616
+ [
22617
+ "path",
22618
+ {
22619
+ d: "M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",
22620
+ key: "ruj8y"
22621
+ }
22622
+ ]
22623
+ ];
22624
+ var BookOpen = createLucideIcon("book-open", __iconNode4);
22625
+
22626
+ // ../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js
22627
+ var __iconNode5 = [
22628
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
22629
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
22630
+ ];
22631
+ var CircleCheckBig = createLucideIcon("circle-check-big", __iconNode5);
22632
+
22633
+ // ../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js
22634
+ var __iconNode6 = [
22635
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
22636
+ ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
22637
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
22638
+ ];
22639
+ var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode6);
22640
+
22641
+ // ../../node_modules/lucide-react/dist/esm/icons/clipboard-list.js
22642
+ var __iconNode7 = [
22643
+ ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
22644
+ [
22645
+ "path",
22646
+ {
22647
+ d: "M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",
22648
+ key: "116196"
22649
+ }
22650
+ ],
22651
+ ["path", { d: "M12 11h4", key: "1jrz19" }],
22652
+ ["path", { d: "M12 16h4", key: "n85exb" }],
22653
+ ["path", { d: "M8 11h.01", key: "1dfujw" }],
22654
+ ["path", { d: "M8 16h.01", key: "18s6g9" }]
22655
+ ];
22656
+ var ClipboardList = createLucideIcon("clipboard-list", __iconNode7);
22657
+
22658
+ // ../../node_modules/lucide-react/dist/esm/icons/compass.js
22659
+ var __iconNode8 = [
22660
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
22661
+ [
22662
+ "path",
22663
+ {
22664
+ d: "m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",
22665
+ key: "9ktpf1"
22666
+ }
22667
+ ]
22668
+ ];
22669
+ var Compass = createLucideIcon("compass", __iconNode8);
22670
+
22671
+ // ../../node_modules/lucide-react/dist/esm/icons/file-text.js
22672
+ var __iconNode9 = [
22673
+ [
22674
+ "path",
22675
+ {
22676
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
22677
+ key: "1oefj6"
22678
+ }
22679
+ ],
22680
+ ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }],
22681
+ ["path", { d: "M10 9H8", key: "b1mrlr" }],
22682
+ ["path", { d: "M16 13H8", key: "t4e002" }],
22683
+ ["path", { d: "M16 17H8", key: "z1uh3a" }]
22684
+ ];
22685
+ var FileText = createLucideIcon("file-text", __iconNode9);
22686
+
22687
+ // ../../node_modules/lucide-react/dist/esm/icons/gamepad-2.js
22688
+ var __iconNode10 = [
22689
+ ["line", { x1: "6", x2: "10", y1: "11", y2: "11", key: "1gktln" }],
22690
+ ["line", { x1: "8", x2: "8", y1: "9", y2: "13", key: "qnk9ow" }],
22691
+ ["line", { x1: "15", x2: "15.01", y1: "12", y2: "12", key: "krot7o" }],
22692
+ ["line", { x1: "18", x2: "18.01", y1: "10", y2: "10", key: "1lcuu1" }],
22693
+ [
22694
+ "path",
22695
+ {
22696
+ d: "M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",
22697
+ key: "mfqc10"
22698
+ }
22699
+ ]
22700
+ ];
22701
+ var Gamepad2 = createLucideIcon("gamepad-2", __iconNode10);
22702
+
22703
+ // ../../node_modules/lucide-react/dist/esm/icons/landmark.js
22704
+ var __iconNode11 = [
22705
+ ["path", { d: "M10 18v-7", key: "wt116b" }],
22706
+ [
22707
+ "path",
22708
+ {
22709
+ d: "M11.12 2.198a2 2 0 0 1 1.76.006l7.866 3.847c.476.233.31.949-.22.949H3.474c-.53 0-.695-.716-.22-.949z",
22710
+ key: "1m329m"
22711
+ }
22712
+ ],
22713
+ ["path", { d: "M14 18v-7", key: "vav6t3" }],
22714
+ ["path", { d: "M18 18v-7", key: "aexdmj" }],
22715
+ ["path", { d: "M3 22h18", key: "8prr45" }],
22716
+ ["path", { d: "M6 18v-7", key: "1ivflk" }]
22717
+ ];
22718
+ var Landmark = createLucideIcon("landmark", __iconNode11);
22719
+
22720
+ // ../../node_modules/lucide-react/dist/esm/icons/layers.js
22721
+ var __iconNode12 = [
22722
+ [
22723
+ "path",
22724
+ {
22725
+ d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",
22726
+ key: "zw3jo"
22727
+ }
22728
+ ],
22729
+ [
22730
+ "path",
22731
+ {
22732
+ d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",
22733
+ key: "1wduqc"
22734
+ }
22735
+ ],
22736
+ [
22737
+ "path",
22738
+ {
22739
+ d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",
22740
+ key: "kqbvx6"
22741
+ }
22742
+ ]
22743
+ ];
22744
+ var Layers = createLucideIcon("layers", __iconNode12);
22745
+
22746
+ // ../../node_modules/lucide-react/dist/esm/icons/lightbulb.js
22747
+ var __iconNode13 = [
22748
+ [
22749
+ "path",
22750
+ {
22751
+ d: "M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",
22752
+ key: "1gvzjb"
22753
+ }
22754
+ ],
22755
+ ["path", { d: "M9 18h6", key: "x1upvd" }],
22756
+ ["path", { d: "M10 22h4", key: "ceow96" }]
22757
+ ];
22758
+ var Lightbulb = createLucideIcon("lightbulb", __iconNode13);
22759
+
22760
+ // ../../node_modules/lucide-react/dist/esm/icons/message-circle.js
22761
+ var __iconNode14 = [
22762
+ [
22763
+ "path",
22764
+ {
22765
+ d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",
22766
+ key: "1sd12s"
22767
+ }
22768
+ ]
22769
+ ];
22770
+ var MessageCircle = createLucideIcon("message-circle", __iconNode14);
22771
+
22772
+ // ../../node_modules/lucide-react/dist/esm/icons/skip-forward.js
22773
+ var __iconNode15 = [
22774
+ ["path", { d: "M21 4v16", key: "7j8fe9" }],
22775
+ [
22776
+ "path",
22777
+ {
22778
+ d: "M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z",
22779
+ key: "zs4d6"
22780
+ }
22781
+ ]
22782
+ ];
22783
+ var SkipForward = createLucideIcon("skip-forward", __iconNode15);
22784
+
22785
+ // ../../node_modules/lucide-react/dist/esm/icons/sparkles.js
22786
+ var __iconNode16 = [
22787
+ [
22788
+ "path",
22789
+ {
22790
+ d: "M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",
22791
+ key: "1s2grr"
22792
+ }
22793
+ ],
22794
+ ["path", { d: "M20 2v4", key: "1rf3ol" }],
22795
+ ["path", { d: "M22 4h-4", key: "gwowj6" }],
22796
+ ["circle", { cx: "4", cy: "20", r: "2", key: "6kqj1y" }]
22797
+ ];
22798
+ var Sparkles = createLucideIcon("sparkles", __iconNode16);
22799
+
22800
+ // ../../node_modules/lucide-react/dist/esm/icons/timer.js
22801
+ var __iconNode17 = [
22802
+ ["line", { x1: "10", x2: "14", y1: "2", y2: "2", key: "14vaq8" }],
22803
+ ["line", { x1: "12", x2: "15", y1: "14", y2: "11", key: "17fdiu" }],
22804
+ ["circle", { cx: "12", cy: "14", r: "8", key: "1e1u0o" }]
22805
+ ];
22806
+ var Timer = createLucideIcon("timer", __iconNode17);
22807
+
22808
+ // ../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js
22809
+ var __iconNode18 = [
22810
+ [
22811
+ "path",
22812
+ {
22813
+ d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",
22814
+ key: "wmoenq"
22815
+ }
22816
+ ],
22817
+ ["path", { d: "M12 9v4", key: "juzpu7" }],
22818
+ ["path", { d: "M12 17h.01", key: "p32p05" }]
22819
+ ];
22820
+ var TriangleAlert = createLucideIcon("triangle-alert", __iconNode18);
22821
+
22822
+ // ../../node_modules/lucide-react/dist/esm/icons/trophy.js
22823
+ var __iconNode19 = [
22824
+ ["path", { d: "M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978", key: "1n3hpd" }],
22825
+ ["path", { d: "M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978", key: "rfe1zi" }],
22826
+ ["path", { d: "M18 9h1.5a1 1 0 0 0 0-5H18", key: "7xy6bh" }],
22827
+ ["path", { d: "M4 22h16", key: "57wxv0" }],
22828
+ ["path", { d: "M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z", key: "1mhfuq" }],
22829
+ ["path", { d: "M6 9H4.5a1 1 0 0 1 0-5H6", key: "tex48p" }]
22830
+ ];
22831
+ var Trophy = createLucideIcon("trophy", __iconNode19);
22832
+
22833
+ // src/components/emojiToIcon.tsx
22360
22834
  var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
22835
+ var EMOJI_ICON_MAP = {
22836
+ "\u2753": CircleQuestionMark,
22837
+ "\u{1F9ED}": Compass,
22838
+ "\u{1F4DD}": FileText,
22839
+ "\u{1F3AF}": Layers,
22840
+ "\u{1F3C6}": Trophy,
22841
+ "\u2728": Sparkles,
22842
+ "\u{1F4AC}": MessageCircle,
22843
+ "\u{1F3AE}": Gamepad2,
22844
+ "\u{1F4A1}": Lightbulb,
22845
+ "\u{1F4B0}": Banknote,
22846
+ "\u{1F4CB}": ClipboardList,
22847
+ "\u2705": CircleCheckBig,
22848
+ "\u26A0\uFE0F": TriangleAlert,
22849
+ "\u{1F4B5}": Banknote,
22850
+ "\u{1F3DB}\uFE0F": Landmark,
22851
+ "\u23ED\uFE0F": SkipForward,
22852
+ "\u27A1\uFE0F": ArrowRight,
22853
+ "\u23F1\uFE0F": Timer,
22854
+ "\u{1F4D6}": BookOpen,
22855
+ "\u{1F514}": Bell
22856
+ };
22857
+ function EmojiIcon({
22858
+ emoji,
22859
+ size: size2 = 14,
22860
+ color = "currentColor"
22861
+ }) {
22862
+ const Icon2 = EMOJI_ICON_MAP[emoji];
22863
+ if (!Icon2) {
22864
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { children: emoji });
22865
+ }
22866
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon2, { size: size2, color });
22867
+ }
22868
+
22869
+ // src/notifications/NotificationToastStack.tsx
22870
+ var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
22361
22871
  var TOAST_STYLES_ID = "syntro-toast-styles";
22362
22872
  var TOAST_CSS = `
22363
22873
  @keyframes syntro-toast-slide-in {
@@ -22394,7 +22904,7 @@ ${text2}</tr>
22394
22904
  const { shadowRoot } = useShadowRoot();
22395
22905
  ensureToastStyles(shadowRoot);
22396
22906
  if (notifications.length === 0) return null;
22397
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
22907
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22398
22908
  "div",
22399
22909
  {
22400
22910
  "data-testid": "notification-toast-stack",
@@ -22411,7 +22921,7 @@ ${text2}</tr>
22411
22921
  },
22412
22922
  children: notifications.map((notif) => (
22413
22923
  // biome-ignore lint/a11y/noStaticElementInteractions: Hover effects for pause-on-hover UX; not interactive in the a11y sense
22414
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
22924
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
22415
22925
  "div",
22416
22926
  {
22417
22927
  className: "syntro-toast-enter",
@@ -22436,7 +22946,7 @@ ${text2}</tr>
22436
22946
  if (bar) bar.classList.remove("paused");
22437
22947
  },
22438
22948
  children: [
22439
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
22949
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
22440
22950
  "div",
22441
22951
  {
22442
22952
  onClick: () => onClickNotification(notif),
@@ -22447,7 +22957,7 @@ ${text2}</tr>
22447
22957
  padding: "10px 12px"
22448
22958
  },
22449
22959
  children: [
22450
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
22960
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22451
22961
  "div",
22452
22962
  {
22453
22963
  style: {
@@ -22461,11 +22971,11 @@ ${text2}</tr>
22461
22971
  flexShrink: 0,
22462
22972
  fontSize: "14px"
22463
22973
  },
22464
- children: notif.icon ?? "\u{1F514}"
22974
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EmojiIcon, { emoji: notif.icon ?? "\u{1F514}", size: 14 })
22465
22975
  }
22466
22976
  ),
22467
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
22468
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
22977
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
22978
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22469
22979
  "div",
22470
22980
  {
22471
22981
  style: {
@@ -22480,7 +22990,7 @@ ${text2}</tr>
22480
22990
  children: notif.title
22481
22991
  }
22482
22992
  ),
22483
- notif.body && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
22993
+ notif.body && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22484
22994
  "div",
22485
22995
  {
22486
22996
  style: {
@@ -22496,7 +23006,7 @@ ${text2}</tr>
22496
23006
  }
22497
23007
  )
22498
23008
  ] }),
22499
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
23009
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22500
23010
  "button",
22501
23011
  {
22502
23012
  type: "button",
@@ -22521,7 +23031,7 @@ ${text2}</tr>
22521
23031
  ]
22522
23032
  }
22523
23033
  ),
22524
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: { height: "2px", background: "rgba(0, 0, 0, 0.08)" }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
23034
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: { height: "2px", background: "rgba(0, 0, 0, 0.08)" }, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
22525
23035
  "div",
22526
23036
  {
22527
23037
  className: "syntro-toast-progress",
@@ -22542,7 +23052,7 @@ ${text2}</tr>
22542
23052
  }
22543
23053
 
22544
23054
  // src/notifications/useNotifications.ts
22545
- var import_react7 = __toESM(require_react(), 1);
23055
+ var import_react9 = __toESM(require_react(), 1);
22546
23056
 
22547
23057
  // src/notifications/types.ts
22548
23058
  var MAX_VISIBLE_TOASTS = 3;
@@ -22594,10 +23104,10 @@ ${text2}</tr>
22594
23104
 
22595
23105
  // src/notifications/useNotifications.ts
22596
23106
  function useNotifications(eventBus, tiles) {
22597
- const [notifications, setNotifications] = (0, import_react7.useState)([]);
22598
- const cooldownMap = (0, import_react7.useRef)(/* @__PURE__ */ new Map());
22599
- const timerIds = (0, import_react7.useRef)(/* @__PURE__ */ new Map());
22600
- const publishDismissed = (0, import_react7.useCallback)(
23107
+ const [notifications, setNotifications] = (0, import_react9.useState)([]);
23108
+ const cooldownMap = (0, import_react9.useRef)(/* @__PURE__ */ new Map());
23109
+ const timerIds = (0, import_react9.useRef)(/* @__PURE__ */ new Map());
23110
+ const publishDismissed = (0, import_react9.useCallback)(
22601
23111
  (notif) => {
22602
23112
  eventBus?.publish(StandardEvents.NOTIFICATION_DISMISSED, {
22603
23113
  notificationId: notif.id,
@@ -22607,7 +23117,7 @@ ${text2}</tr>
22607
23117
  },
22608
23118
  [eventBus]
22609
23119
  );
22610
- const scheduleDismiss = (0, import_react7.useCallback)(
23120
+ const scheduleDismiss = (0, import_react9.useCallback)(
22611
23121
  (notif) => {
22612
23122
  const timerId = setTimeout(() => {
22613
23123
  setNotifications((prev) => prev.filter((n2) => n2.id !== notif.id));
@@ -22618,7 +23128,7 @@ ${text2}</tr>
22618
23128
  },
22619
23129
  [publishDismissed]
22620
23130
  );
22621
- const dismiss = (0, import_react7.useCallback)(
23131
+ const dismiss = (0, import_react9.useCallback)(
22622
23132
  (id) => {
22623
23133
  setNotifications((prev) => {
22624
23134
  const notif = prev.find((n2) => n2.id === id);
@@ -22633,7 +23143,7 @@ ${text2}</tr>
22633
23143
  },
22634
23144
  [publishDismissed]
22635
23145
  );
22636
- (0, import_react7.useEffect)(() => {
23146
+ (0, import_react9.useEffect)(() => {
22637
23147
  if (!eventBus) return;
22638
23148
  const unsubscribe2 = eventBus.subscribe((event) => {
22639
23149
  const match = matchEvent(event, tiles);
@@ -22683,7 +23193,7 @@ ${text2}</tr>
22683
23193
  }
22684
23194
 
22685
23195
  // src/notifications/useNotifyWatcher.ts
22686
- var import_react8 = __toESM(require_react(), 1);
23196
+ var import_react10 = __toESM(require_react(), 1);
22687
23197
  function collectEntries(tiles, appRegistry2) {
22688
23198
  const entries = [];
22689
23199
  for (const tile of tiles) {
@@ -22697,8 +23207,8 @@ ${text2}</tr>
22697
23207
  return entries;
22698
23208
  }
22699
23209
  function useNotifyWatcher(runtime7, tiles, appRegistry2) {
22700
- const prevStateRef = (0, import_react8.useRef)(/* @__PURE__ */ new Map());
22701
- (0, import_react8.useEffect)(() => {
23210
+ const prevStateRef = (0, import_react10.useRef)(/* @__PURE__ */ new Map());
23211
+ (0, import_react10.useEffect)(() => {
22702
23212
  if (!runtime7?.events || !appRegistry2) return;
22703
23213
  const entries = collectEntries(tiles, appRegistry2);
22704
23214
  if (entries.length === 0) return;
@@ -22731,17 +23241,17 @@ ${text2}</tr>
22731
23241
  }
22732
23242
 
22733
23243
  // src/RuntimeProvider.tsx
22734
- var import_react9 = __toESM(require_react(), 1);
22735
- var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
22736
- var RuntimeReactContext = (0, import_react9.createContext)({
23244
+ var import_react11 = __toESM(require_react(), 1);
23245
+ var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
23246
+ var RuntimeReactContext = (0, import_react11.createContext)({
22737
23247
  runtime: null,
22738
23248
  context: null
22739
23249
  });
22740
23250
  function RuntimeProvider({ runtime: runtime7, children }) {
22741
- const [context, setContext] = (0, import_react9.useState)(
23251
+ const [context, setContext] = (0, import_react11.useState)(
22742
23252
  runtime7 ? runtime7.context.get() : null
22743
23253
  );
22744
- (0, import_react9.useEffect)(() => {
23254
+ (0, import_react11.useEffect)(() => {
22745
23255
  if (!runtime7) return;
22746
23256
  setContext(runtime7.context.get());
22747
23257
  const unsubscribe2 = runtime7.context.subscribe((ctx) => {
@@ -22749,15 +23259,15 @@ ${text2}</tr>
22749
23259
  });
22750
23260
  return unsubscribe2;
22751
23261
  }, [runtime7]);
22752
- const value = (0, import_react9.useMemo)(() => ({ runtime: runtime7, context }), [runtime7, context]);
22753
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(RuntimeReactContext.Provider, { value, children });
23262
+ const value = (0, import_react11.useMemo)(() => ({ runtime: runtime7, context }), [runtime7, context]);
23263
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(RuntimeReactContext.Provider, { value, children });
22754
23264
  }
22755
23265
  function useRuntime() {
22756
- const { runtime: runtime7 } = (0, import_react9.useContext)(RuntimeReactContext);
23266
+ const { runtime: runtime7 } = (0, import_react11.useContext)(RuntimeReactContext);
22757
23267
  return runtime7;
22758
23268
  }
22759
23269
  function useRuntimeContext() {
22760
- const { context } = (0, import_react9.useContext)(RuntimeReactContext);
23270
+ const { context } = (0, import_react11.useContext)(RuntimeReactContext);
22761
23271
  return context;
22762
23272
  }
22763
23273
  function usePageContext() {
@@ -22774,7 +23284,7 @@ ${text2}</tr>
22774
23284
  }
22775
23285
  function useRuntimeEvents(filter, callback, deps = []) {
22776
23286
  const runtime7 = useRuntime();
22777
- (0, import_react9.useEffect)(() => {
23287
+ (0, import_react11.useEffect)(() => {
22778
23288
  if (!runtime7) return;
22779
23289
  const unsubscribe2 = filter ? runtime7.events.subscribe(filter, callback) : runtime7.events.subscribe(callback);
22780
23290
  return unsubscribe2;
@@ -22786,12 +23296,12 @@ ${text2}</tr>
22786
23296
  }
22787
23297
  function useDecision(strategy, defaultValue) {
22788
23298
  const runtime7 = useRuntime();
22789
- const [result, setResult] = (0, import_react9.useState)({
23299
+ const [result, setResult] = (0, import_react11.useState)({
22790
23300
  value: defaultValue,
22791
23301
  isFallback: true,
22792
23302
  isLoading: true
22793
23303
  });
22794
- (0, import_react9.useEffect)(() => {
23304
+ (0, import_react11.useEffect)(() => {
22795
23305
  if (!runtime7 || !strategy) {
22796
23306
  setResult({ value: defaultValue, isFallback: true, isLoading: false });
22797
23307
  return;
@@ -23202,21 +23712,21 @@ ${text2}</tr>
23202
23712
  }
23203
23713
 
23204
23714
  // src/theme/ThemeProvider.tsx
23205
- var import_react10 = __toESM(require_react(), 1);
23206
- var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
23207
- var ThemeContext = (0, import_react10.createContext)(null);
23715
+ var import_react12 = __toESM(require_react(), 1);
23716
+ var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
23717
+ var ThemeContext = (0, import_react12.createContext)(null);
23208
23718
  function ThemeProvider({
23209
23719
  children,
23210
23720
  themeConfig,
23211
23721
  workspaceTheme,
23212
23722
  shadowRoot
23213
23723
  }) {
23214
- const merged = (0, import_react10.useMemo)(
23724
+ const merged = (0, import_react12.useMemo)(
23215
23725
  () => workspaceTheme ? mergeThemeWithWorkspace(workspaceTheme, themeConfig ?? {}) : mergeThemeConfig(themeConfig ?? {}),
23216
23726
  [themeConfig, workspaceTheme]
23217
23727
  );
23218
- const cssVariables = (0, import_react10.useMemo)(() => flattenThemeConfig(merged), [merged]);
23219
- (0, import_react10.useEffect)(() => {
23728
+ const cssVariables = (0, import_react12.useMemo)(() => flattenThemeConfig(merged), [merged]);
23729
+ (0, import_react12.useEffect)(() => {
23220
23730
  if (!shadowRoot) return;
23221
23731
  let styleEl = shadowRoot.querySelector("#sc-theme-vars");
23222
23732
  if (!styleEl) {
@@ -23234,10 +23744,10 @@ ${cssRules}
23234
23744
  mode: merged.mode,
23235
23745
  cssVariables
23236
23746
  };
23237
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ThemeContext.Provider, { value, children });
23747
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ThemeContext.Provider, { value, children });
23238
23748
  }
23239
23749
  function useTheme() {
23240
- const context = (0, import_react10.useContext)(ThemeContext);
23750
+ const context = (0, import_react12.useContext)(ThemeContext);
23241
23751
  if (!context) {
23242
23752
  throw new Error("useTheme must be used within a ThemeProvider");
23243
23753
  }
@@ -23247,247 +23757,18 @@ ${cssRules}
23247
23757
  // src/components/TileCard.tsx
23248
23758
  var import_react13 = __toESM(require_react(), 1);
23249
23759
 
23250
- // ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
23251
- var import_react12 = __toESM(require_react());
23252
-
23253
- // ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
23254
- var mergeClasses = (...classes2) => classes2.filter((className, index2, array) => {
23255
- return Boolean(className) && className.trim() !== "" && array.indexOf(className) === index2;
23256
- }).join(" ").trim();
23257
-
23258
- // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js
23259
- var toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
23260
-
23261
- // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js
23262
- var toCamelCase = (string) => string.replace(
23263
- /^([A-Z])|[\s-_]+(\w)/g,
23264
- (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()
23265
- );
23266
-
23267
- // ../../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js
23268
- var toPascalCase = (string) => {
23269
- const camelCase = toCamelCase(string);
23270
- return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
23271
- };
23272
-
23273
- // ../../node_modules/lucide-react/dist/esm/Icon.js
23274
- var import_react11 = __toESM(require_react());
23275
-
23276
- // ../../node_modules/lucide-react/dist/esm/defaultAttributes.js
23277
- var defaultAttributes = {
23278
- xmlns: "http://www.w3.org/2000/svg",
23279
- width: 24,
23280
- height: 24,
23281
- viewBox: "0 0 24 24",
23282
- fill: "none",
23283
- stroke: "currentColor",
23284
- strokeWidth: 2,
23285
- strokeLinecap: "round",
23286
- strokeLinejoin: "round"
23287
- };
23288
-
23289
- // ../../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js
23290
- var hasA11yProp = (props) => {
23291
- for (const prop in props) {
23292
- if (prop.startsWith("aria-") || prop === "role" || prop === "title") {
23293
- return true;
23294
- }
23295
- }
23296
- return false;
23297
- };
23298
-
23299
- // ../../node_modules/lucide-react/dist/esm/Icon.js
23300
- var Icon = (0, import_react11.forwardRef)(
23301
- ({
23302
- color = "currentColor",
23303
- size: size2 = 24,
23304
- strokeWidth = 2,
23305
- absoluteStrokeWidth,
23306
- className = "",
23307
- children,
23308
- iconNode,
23309
- ...rest
23310
- }, ref) => (0, import_react11.createElement)(
23311
- "svg",
23312
- {
23313
- ref,
23314
- ...defaultAttributes,
23315
- width: size2,
23316
- height: size2,
23317
- stroke: color,
23318
- strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size2) : strokeWidth,
23319
- className: mergeClasses("lucide", className),
23320
- ...!children && !hasA11yProp(rest) && { "aria-hidden": "true" },
23321
- ...rest
23322
- },
23323
- [
23324
- ...iconNode.map(([tag3, attrs]) => (0, import_react11.createElement)(tag3, attrs)),
23325
- ...Array.isArray(children) ? children : [children]
23326
- ]
23327
- )
23328
- );
23329
-
23330
- // ../../node_modules/lucide-react/dist/esm/createLucideIcon.js
23331
- var createLucideIcon = (iconName, iconNode) => {
23332
- const Component = (0, import_react12.forwardRef)(
23333
- ({ className, ...props }, ref) => (0, import_react12.createElement)(Icon, {
23334
- ref,
23335
- iconNode,
23336
- className: mergeClasses(
23337
- `lucide-${toKebabCase(toPascalCase(iconName))}`,
23338
- `lucide-${iconName}`,
23339
- className
23340
- ),
23341
- ...props
23342
- })
23343
- );
23344
- Component.displayName = toPascalCase(iconName);
23345
- return Component;
23346
- };
23347
-
23348
- // ../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js
23349
- var __iconNode = [
23350
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
23351
- ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
23352
- ["path", { d: "M12 17h.01", key: "p32p05" }]
23353
- ];
23354
- var CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode);
23355
-
23356
- // ../../node_modules/lucide-react/dist/esm/icons/compass.js
23357
- var __iconNode2 = [
23358
- ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
23359
- [
23360
- "path",
23361
- {
23362
- d: "m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",
23363
- key: "9ktpf1"
23364
- }
23365
- ]
23366
- ];
23367
- var Compass = createLucideIcon("compass", __iconNode2);
23368
-
23369
- // ../../node_modules/lucide-react/dist/esm/icons/file-text.js
23370
- var __iconNode3 = [
23371
- [
23372
- "path",
23373
- {
23374
- d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
23375
- key: "1oefj6"
23376
- }
23377
- ],
23378
- ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }],
23379
- ["path", { d: "M10 9H8", key: "b1mrlr" }],
23380
- ["path", { d: "M16 13H8", key: "t4e002" }],
23381
- ["path", { d: "M16 17H8", key: "z1uh3a" }]
23382
- ];
23383
- var FileText = createLucideIcon("file-text", __iconNode3);
23384
-
23385
- // ../../node_modules/lucide-react/dist/esm/icons/gamepad-2.js
23386
- var __iconNode4 = [
23387
- ["line", { x1: "6", x2: "10", y1: "11", y2: "11", key: "1gktln" }],
23388
- ["line", { x1: "8", x2: "8", y1: "9", y2: "13", key: "qnk9ow" }],
23389
- ["line", { x1: "15", x2: "15.01", y1: "12", y2: "12", key: "krot7o" }],
23390
- ["line", { x1: "18", x2: "18.01", y1: "10", y2: "10", key: "1lcuu1" }],
23391
- [
23392
- "path",
23393
- {
23394
- d: "M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",
23395
- key: "mfqc10"
23396
- }
23397
- ]
23398
- ];
23399
- var Gamepad2 = createLucideIcon("gamepad-2", __iconNode4);
23400
-
23401
- // ../../node_modules/lucide-react/dist/esm/icons/layers.js
23402
- var __iconNode5 = [
23403
- [
23404
- "path",
23405
- {
23406
- d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",
23407
- key: "zw3jo"
23408
- }
23409
- ],
23410
- [
23411
- "path",
23412
- {
23413
- d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",
23414
- key: "1wduqc"
23415
- }
23416
- ],
23417
- [
23418
- "path",
23419
- {
23420
- d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",
23421
- key: "kqbvx6"
23422
- }
23423
- ]
23424
- ];
23425
- var Layers = createLucideIcon("layers", __iconNode5);
23426
-
23427
- // ../../node_modules/lucide-react/dist/esm/icons/message-circle.js
23428
- var __iconNode6 = [
23429
- [
23430
- "path",
23431
- {
23432
- d: "M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719",
23433
- key: "1sd12s"
23434
- }
23435
- ]
23436
- ];
23437
- var MessageCircle = createLucideIcon("message-circle", __iconNode6);
23438
-
23439
- // ../../node_modules/lucide-react/dist/esm/icons/sparkles.js
23440
- var __iconNode7 = [
23441
- [
23442
- "path",
23443
- {
23444
- d: "M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",
23445
- key: "1s2grr"
23446
- }
23447
- ],
23448
- ["path", { d: "M20 2v4", key: "1rf3ol" }],
23449
- ["path", { d: "M22 4h-4", key: "gwowj6" }],
23450
- ["circle", { cx: "4", cy: "20", r: "2", key: "6kqj1y" }]
23451
- ];
23452
- var Sparkles = createLucideIcon("sparkles", __iconNode7);
23453
-
23454
- // ../../node_modules/lucide-react/dist/esm/icons/trophy.js
23455
- var __iconNode8 = [
23456
- ["path", { d: "M10 14.66v1.626a2 2 0 0 1-.976 1.696A5 5 0 0 0 7 21.978", key: "1n3hpd" }],
23457
- ["path", { d: "M14 14.66v1.626a2 2 0 0 0 .976 1.696A5 5 0 0 1 17 21.978", key: "rfe1zi" }],
23458
- ["path", { d: "M18 9h1.5a1 1 0 0 0 0-5H18", key: "7xy6bh" }],
23459
- ["path", { d: "M4 22h16", key: "57wxv0" }],
23460
- ["path", { d: "M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z", key: "1mhfuq" }],
23461
- ["path", { d: "M6 9H4.5a1 1 0 0 1 0-5H6", key: "tex48p" }]
23462
- ];
23463
- var Trophy = createLucideIcon("trophy", __iconNode8);
23464
-
23465
23760
  // src/components/TileIcon.tsx
23466
- var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
23467
- var ICON_MAP = {
23468
- "\u2753": CircleQuestionMark,
23469
- "\u{1F9ED}": Compass,
23470
- "\u{1F4DD}": FileText,
23471
- "\u{1F3AF}": Layers,
23472
- "\u{1F3C6}": Trophy,
23473
- "\u2728": Sparkles,
23474
- "\u{1F4AC}": MessageCircle,
23475
- "\u{1F3AE}": Gamepad2
23476
- };
23761
+ var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
23477
23762
  function TileIcon({
23478
23763
  emoji,
23479
23764
  size: size2 = 18,
23480
23765
  color = "currentColor"
23481
23766
  }) {
23482
- const Icon2 = ICON_MAP[emoji];
23483
- if (!Icon2) {
23484
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: emoji });
23485
- }
23486
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon2, { size: size2, color });
23767
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(EmojiIcon, { emoji, size: size2, color });
23487
23768
  }
23488
23769
 
23489
23770
  // src/components/TileCard.tsx
23490
- var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
23771
+ var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
23491
23772
  function WidgetMount({ widgetId, props }) {
23492
23773
  const runtime7 = useRuntime();
23493
23774
  const parentRef = (0, import_react13.useRef)(null);
@@ -23516,7 +23797,6 @@ ${cssRules}
23516
23797
  return () => {
23517
23798
  handle.unmount();
23518
23799
  handleRef.current = null;
23519
- container.remove();
23520
23800
  };
23521
23801
  }, [registry, widgetId, widgetAvailable]);
23522
23802
  const propsJson = JSON.stringify(props);
@@ -23527,7 +23807,7 @@ ${cssRules}
23527
23807
  handleRef.current?.update(propsRef.current);
23528
23808
  }, [propsJson]);
23529
23809
  if (!registry || !registry.has(widgetId)) {
23530
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
23810
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
23531
23811
  "div",
23532
23812
  {
23533
23813
  style: {
@@ -23543,7 +23823,7 @@ ${cssRules}
23543
23823
  }
23544
23824
  );
23545
23825
  }
23546
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { ref: parentRef });
23826
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { ref: parentRef });
23547
23827
  }
23548
23828
  function TileCard({
23549
23829
  config,
@@ -23602,7 +23882,7 @@ ${cssRules}
23602
23882
  justifyContent: "center",
23603
23883
  flexShrink: 0
23604
23884
  };
23605
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
23885
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
23606
23886
  "article",
23607
23887
  {
23608
23888
  "data-shadow-canvas-id": `tile-${config.id}`,
@@ -23610,10 +23890,10 @@ ${cssRules}
23610
23890
  onMouseEnter,
23611
23891
  onMouseLeave,
23612
23892
  children: [
23613
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: headerStyle, children: [
23614
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: iconStyle, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(TileIcon, { emoji: resolvedIcon, size: resolvedSubtitle ? 36 : 24 }) }),
23615
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
23616
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
23893
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: headerStyle, children: [
23894
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: iconStyle, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(TileIcon, { emoji: resolvedIcon, size: resolvedSubtitle ? 36 : 24 }) }),
23895
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
23896
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
23617
23897
  "h3",
23618
23898
  {
23619
23899
  style: {
@@ -23628,7 +23908,7 @@ ${cssRules}
23628
23908
  children: title ?? widget
23629
23909
  }
23630
23910
  ),
23631
- resolvedSubtitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
23911
+ resolvedSubtitle && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
23632
23912
  "p",
23633
23913
  {
23634
23914
  style: {
@@ -23645,14 +23925,14 @@ ${cssRules}
23645
23925
  )
23646
23926
  ] })
23647
23927
  ] }),
23648
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
23928
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
23649
23929
  "div",
23650
23930
  {
23651
23931
  style: {
23652
23932
  padding: "var(--sc-tile-body-padding, 0 0.75rem 0.5rem)",
23653
23933
  borderTop: "1px solid rgba(255, 255, 255, 0.06)"
23654
23934
  },
23655
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: { paddingTop: "var(--sc-tile-gap, 0.25rem)" }, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(WidgetMount, { widgetId: widget, props: { ...props, instanceId: config.id } }) })
23935
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { paddingTop: "var(--sc-tile-gap, 0.25rem)" }, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(WidgetMount, { widgetId: widget, props: { ...props, instanceId: config.id } }) })
23656
23936
  }
23657
23937
  )
23658
23938
  ]
@@ -23661,7 +23941,7 @@ ${cssRules}
23661
23941
  }
23662
23942
 
23663
23943
  // src/components/ShadowCanvasOverlay.tsx
23664
- var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
23944
+ var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
23665
23945
  var LAUNCHER_STYLES_ID = "syntro-launcher-styles";
23666
23946
  function ensureLauncherStyles(target, css) {
23667
23947
  if (target.querySelector(`#${LAUNCHER_STYLES_ID}`)) return;
@@ -23897,7 +24177,7 @@ ${cssRules}
23897
24177
  pointerEvents: "none",
23898
24178
  padding: "0"
23899
24179
  };
23900
- const content = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24180
+ const content = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23901
24181
  "div",
23902
24182
  {
23903
24183
  "data-shadow-canvas-id": "overlay-root",
@@ -23907,9 +24187,9 @@ ${cssRules}
23907
24187
  pointerEvents: isOpen ? "auto" : "none",
23908
24188
  zIndex
23909
24189
  },
23910
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: wrapperStyle, children: [
23911
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { ref: containerRef, "data-shadow-canvas-id": "overlay-container", style: containerStyle, children: [
23912
- isFocused && canvasTitle && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("header", { style: { color: "white", padding: "1.5rem 1.5rem 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24190
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: wrapperStyle, children: [
24191
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { ref: containerRef, "data-shadow-canvas-id": "overlay-container", style: containerStyle, children: [
24192
+ isFocused && canvasTitle && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("header", { style: { color: "white", padding: "1.5rem 1.5rem 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23913
24193
  "p",
23914
24194
  {
23915
24195
  style: {
@@ -23922,13 +24202,13 @@ ${cssRules}
23922
24202
  children: canvasTitle
23923
24203
  }
23924
24204
  ) }),
23925
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { flex: 1, overflowY: "auto", padding: isFocused ? "0" : "1rem" }, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24205
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { flex: 1, overflowY: "auto", padding: isFocused ? "0" : "1rem" }, children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23926
24206
  "div",
23927
24207
  {
23928
24208
  style: { color: "var(--sc-overlay-text-color)", padding: isFocused ? "1rem" : "0" },
23929
24209
  children: "Loading..."
23930
24210
  }
23931
- ) : error2 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
24211
+ ) : error2 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
23932
24212
  "div",
23933
24213
  {
23934
24214
  style: {
@@ -23942,7 +24222,7 @@ ${cssRules}
23942
24222
  }
23943
24223
  ) : isFocused ? (
23944
24224
  /* Focused Mode: Render first tile full size */
23945
- tiles.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24225
+ tiles.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23946
24226
  TileCard,
23947
24227
  {
23948
24228
  config: tiles[0],
@@ -23953,7 +24233,7 @@ ${cssRules}
23953
24233
  ) : null
23954
24234
  ) : (
23955
24235
  /* Standard Mode: Stacked cards — widgets always visible */
23956
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24236
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23957
24237
  "div",
23958
24238
  {
23959
24239
  style: {
@@ -23962,7 +24242,7 @@ ${cssRules}
23962
24242
  gap: "0.75rem",
23963
24243
  width: "100%"
23964
24244
  },
23965
- children: tiles.map((tile) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24245
+ children: tiles.map((tile) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23966
24246
  TileCard,
23967
24247
  {
23968
24248
  config: tile,
@@ -23977,7 +24257,7 @@ ${cssRules}
23977
24257
  ) }),
23978
24258
  footerSlot
23979
24259
  ] }),
23980
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24260
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
23981
24261
  "div",
23982
24262
  {
23983
24263
  onClick: toggle2,
@@ -23992,9 +24272,9 @@ ${cssRules}
23992
24272
  }
23993
24273
  );
23994
24274
  if (!mounted) return null;
23995
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
24275
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
23996
24276
  (0, import_react_dom.createPortal)(
23997
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
24277
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
23998
24278
  "div",
23999
24279
  {
24000
24280
  "data-shadow-canvas-id": "overlay-launcher",
@@ -24005,7 +24285,7 @@ ${cssRules}
24005
24285
  zIndex: zIndex + 47
24006
24286
  },
24007
24287
  children: [
24008
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24288
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24009
24289
  NotificationToastStack,
24010
24290
  {
24011
24291
  notifications,
@@ -24014,7 +24294,7 @@ ${cssRules}
24014
24294
  position: config.canvas.position ?? "right"
24015
24295
  }
24016
24296
  ),
24017
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
24297
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
24018
24298
  "button",
24019
24299
  {
24020
24300
  type: "button",
@@ -24058,7 +24338,7 @@ ${cssRules}
24058
24338
  }
24059
24339
  },
24060
24340
  children: [
24061
- isOpen ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
24341
+ isOpen ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
24062
24342
  "svg",
24063
24343
  {
24064
24344
  width: "24",
@@ -24073,11 +24353,11 @@ ${cssRules}
24073
24353
  focusable: "false",
24074
24354
  style: { transition: "transform 200ms ease" },
24075
24355
  children: [
24076
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M18 6L6 18" }),
24077
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M6 6l12 12" })
24356
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M18 6L6 18" }),
24357
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M6 6l12 12" })
24078
24358
  ]
24079
24359
  }
24080
- ) : launcherIcon ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24360
+ ) : launcherIcon ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24081
24361
  "img",
24082
24362
  {
24083
24363
  src: launcherIcon,
@@ -24090,7 +24370,7 @@ ${cssRules}
24090
24370
  pointerEvents: "none"
24091
24371
  }
24092
24372
  }
24093
- ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
24373
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
24094
24374
  "svg",
24095
24375
  {
24096
24376
  width: "24",
@@ -24105,16 +24385,16 @@ ${cssRules}
24105
24385
  focusable: "false",
24106
24386
  style: { transition: "transform 200ms ease" },
24107
24387
  children: [
24108
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 0-1.275-1.275L3 12l5.813-1.912a2 2 0 0 0 1.275-1.275L12 3Z" }),
24109
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M5 3v4" }),
24110
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M3 5h4" }),
24111
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M19 17v4" }),
24112
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { d: "M17 19h4" })
24388
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 0-1.275-1.275L3 12l5.813-1.912a2 2 0 0 0 1.275-1.275L12 3Z" }),
24389
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M5 3v4" }),
24390
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M3 5h4" }),
24391
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M19 17v4" }),
24392
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { d: "M17 19h4" })
24113
24393
  ]
24114
24394
  }
24115
24395
  ),
24116
- !isOpen && notifications.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { position: "absolute", top: -2, right: -2, pointerEvents: "none" }, children: [
24117
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24396
+ !isOpen && notifications.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { position: "absolute", top: -2, right: -2, pointerEvents: "none" }, children: [
24397
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24118
24398
  "span",
24119
24399
  {
24120
24400
  className: "syntro-badge-ping",
@@ -24126,7 +24406,7 @@ ${cssRules}
24126
24406
  }
24127
24407
  }
24128
24408
  ),
24129
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24409
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24130
24410
  "span",
24131
24411
  {
24132
24412
  className: "syntro-badge-glow",
@@ -24137,7 +24417,7 @@ ${cssRules}
24137
24417
  }
24138
24418
  }
24139
24419
  ),
24140
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
24420
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24141
24421
  "span",
24142
24422
  {
24143
24423
  className: "syntro-badge-bounce",
@@ -24268,7 +24548,7 @@ ${cssRules}
24268
24548
  }
24269
24549
 
24270
24550
  // src/SmartCanvasApp.tsx
24271
- var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
24551
+ var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
24272
24552
  function SmartCanvasApp({
24273
24553
  controller,
24274
24554
  fetcher,
@@ -24291,7 +24571,7 @@ ${cssRules}
24291
24571
  workspaceTheme
24292
24572
  }) {
24293
24573
  if (runtime7) {
24294
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(RuntimeProvider, { runtime: runtime7, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24574
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(RuntimeProvider, { runtime: runtime7, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
24295
24575
  SmartCanvasAppInner,
24296
24576
  {
24297
24577
  controller,
@@ -24316,7 +24596,7 @@ ${cssRules}
24316
24596
  }
24317
24597
  ) });
24318
24598
  }
24319
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24599
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
24320
24600
  SmartCanvasAppInner,
24321
24601
  {
24322
24602
  controller,
@@ -24470,13 +24750,13 @@ ${cssRules}
24470
24750
  }, [runtime7, controller]);
24471
24751
  const { shadowRoot } = useShadowRoot();
24472
24752
  const themeConfig = configState.theme;
24473
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24753
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
24474
24754
  ThemeProvider,
24475
24755
  {
24476
24756
  themeConfig,
24477
24757
  workspaceTheme,
24478
24758
  shadowRoot,
24479
- children: !configState.isLoading && !hasContent ? null : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
24759
+ children: !configState.isLoading && !hasContent ? null : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
24480
24760
  ShadowCanvasOverlay,
24481
24761
  {
24482
24762
  tiles: configState.tiles,
@@ -24500,7 +24780,7 @@ ${cssRules}
24500
24780
  }
24501
24781
 
24502
24782
  // src/SmartCanvasElement.tsx
24503
- var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
24783
+ var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
24504
24784
  var TAG_NAME = "smart-canvas";
24505
24785
  var BASE_CSS = `
24506
24786
  :host {
@@ -24600,13 +24880,13 @@ ${cssRules}
24600
24880
  __privateSet(this, _root, (0, import_client5.createRoot)(__privateGet(this, _mount)));
24601
24881
  }
24602
24882
  __privateGet(this, _root).render(
24603
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
24883
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
24604
24884
  ShadowRootProvider,
24605
24885
  {
24606
24886
  shadowRoot: __privateGet(this, _shadow),
24607
24887
  portalRoot: __privateGet(this, _portalRoot),
24608
24888
  overlayContainer: __privateGet(this, _overlayContainer),
24609
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SmartCanvasApp, { ...__privateGet(this, _lastAppProps), controller: __privateGet(this, _controller), canvasHost: this })
24889
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SmartCanvasApp, { ...__privateGet(this, _lastAppProps), controller: __privateGet(this, _controller), canvasHost: this })
24610
24890
  }
24611
24891
  )
24612
24892
  );
@@ -24833,7 +25113,7 @@ ${cssRules}
24833
25113
 
24834
25114
  // src/components/TileWheel.tsx
24835
25115
  var import_react17 = __toESM(require_react(), 1);
24836
- var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
25116
+ var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
24837
25117
  function TileWheel({ tiles, intervalMs = 7e3, telemetry }) {
24838
25118
  const [index2, setIndex] = (0, import_react17.useState)(0);
24839
25119
  const ordered = (0, import_react17.useMemo)(
@@ -24857,7 +25137,7 @@ ${cssRules}
24857
25137
  }
24858
25138
  }, [index2, ordered, telemetry]);
24859
25139
  if (!ordered.length) return null;
24860
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25140
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
24861
25141
  "div",
24862
25142
  {
24863
25143
  style: {
@@ -24871,7 +25151,7 @@ ${cssRules}
24871
25151
  },
24872
25152
  "data-shadow-canvas-id": "wheel",
24873
25153
  children: [
24874
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25154
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
24875
25155
  "div",
24876
25156
  {
24877
25157
  style: {
@@ -24880,10 +25160,10 @@ ${cssRules}
24880
25160
  transform: `translateX(-${index2 * 100}%)`,
24881
25161
  width: `${ordered.length * 100}%`
24882
25162
  },
24883
- children: ordered.map((tile) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { width: "100%", flexShrink: 0, padding: "0 1rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(TileCard, { config: tile, surface: "wheel", telemetry }) }, tile.id))
25163
+ children: ordered.map((tile) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { width: "100%", flexShrink: 0, padding: "0 1rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TileCard, { config: tile, surface: "wheel", telemetry }) }, tile.id))
24884
25164
  }
24885
25165
  ),
24886
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { style: { marginTop: "1rem", display: "flex", justifyContent: "center", gap: "0.5rem" }, children: ordered.map((tile, idx) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25166
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { marginTop: "1rem", display: "flex", justifyContent: "center", gap: "0.5rem" }, children: ordered.map((tile, idx) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
24887
25167
  "button",
24888
25168
  {
24889
25169
  type: "button",
@@ -37938,13 +38218,9 @@ ${cssRules}
37938
38218
  entry2.state = "reverted";
37939
38219
  publishEvent("action.reverted", { id, kind: action.kind });
37940
38220
  } catch (error2) {
37941
- entry2.state = "failed";
37942
- publishEvent("action.failed", {
37943
- id,
37944
- kind: action.kind,
37945
- error: String(error2)
37946
- });
37947
- throw error2;
38221
+ console.warn(`[ActionEngine] Cleanup error for ${action.kind} (${id}), ignoring:`, error2);
38222
+ entry2.state = "reverted";
38223
+ publishEvent("action.reverted", { id, kind: action.kind });
37948
38224
  } finally {
37949
38225
  activeActions.delete(id);
37950
38226
  }
@@ -38614,6 +38890,7 @@ ${cssRules}
38614
38890
  function resolve(selector) {
38615
38891
  if (!root) return null;
38616
38892
  try {
38893
+ if (root.matches(selector)) return root;
38617
38894
  return root.querySelector(selector);
38618
38895
  } catch {
38619
38896
  return null;
@@ -39504,15 +39781,23 @@ ${cssRules}
39504
39781
  }
39505
39782
  return eventName.replace("$", "posthog.");
39506
39783
  }
39784
+ var INTERACTIVE_TAGS = /* @__PURE__ */ new Set(["a", "button", "input", "select", "textarea"]);
39785
+ function resolveInteractiveTag(elements2, directTag) {
39786
+ if (directTag && INTERACTIVE_TAGS.has(directTag)) return directTag;
39787
+ if (!elements2) return directTag;
39788
+ for (const el of elements2) {
39789
+ const tag3 = el.tag_name;
39790
+ if (tag3 && INTERACTIVE_TAGS.has(tag3)) return tag3;
39791
+ }
39792
+ return directTag;
39793
+ }
39507
39794
  function extractProps(phEvent) {
39508
39795
  const props = {};
39509
39796
  const phProps = phEvent.properties || {};
39510
39797
  const elements2 = phProps.$elements;
39511
- if (phProps.$tag_name) {
39512
- props.tagName = phProps.$tag_name;
39513
- } else if (elements2?.[0]?.tag_name) {
39514
- props.tagName = elements2[0].tag_name;
39515
- }
39798
+ const directTag = phProps.$tag_name ?? elements2?.[0]?.tag_name;
39799
+ const isClickEvent = phEvent.event === "$autocapture" || phEvent.event === "$click";
39800
+ props.tagName = isClickEvent ? resolveInteractiveTag(elements2, directTag) : directTag;
39516
39801
  if (phProps.$el_text) props.elementText = phProps.$el_text;
39517
39802
  if (elements2) props.elements = elements2;
39518
39803
  if (phProps.$current_url) props.url = phProps.$current_url;
@@ -40395,9 +40680,18 @@ ${cssRules}
40395
40680
  return handle;
40396
40681
  }
40397
40682
  async function unmountEntry(entry) {
40398
- await playExitAnimation(entry.container, entry.options.animation);
40399
- entry.cleanup?.();
40400
- entry.container.remove();
40683
+ if (entry.container.isConnected) {
40684
+ await playExitAnimation(entry.container, entry.options.animation);
40685
+ }
40686
+ try {
40687
+ entry.cleanup?.();
40688
+ } catch (error2) {
40689
+ console.warn("[Surfaces] Cleanup error during unmount, ignoring:", error2);
40690
+ }
40691
+ try {
40692
+ entry.container.remove();
40693
+ } catch {
40694
+ }
40401
40695
  mounts.delete(entry.slot);
40402
40696
  publishEvent("surface.unmounted", {
40403
40697
  slot: entry.slot,
@@ -40576,7 +40870,9 @@ ${cssRules}
40576
40870
  unmount: () => {
40577
40871
  const mounted = this.mountedWidgets.get(mountId);
40578
40872
  if (mounted) {
40579
- mounted.cleanup?.();
40873
+ if (container.isConnected) {
40874
+ mounted.cleanup?.();
40875
+ }
40580
40876
  this.mountedWidgets.delete(mountId);
40581
40877
  container.removeAttribute("data-widget-mount-id");
40582
40878
  container.removeAttribute("data-widget-id");
@@ -41496,7 +41792,7 @@ ${cssRules}
41496
41792
  }
41497
41793
 
41498
41794
  // src/index.ts
41499
- var RUNTIME_SDK_BUILD = true ? `${"2026-03-11T22:47:04.977Z"} (${"7d29d30f3e"})` : "dev";
41795
+ var RUNTIME_SDK_BUILD = true ? `${"2026-03-14T01:00:51.997Z"} (${"d9cb07c81d"})` : "dev";
41500
41796
  if (typeof window !== "undefined") {
41501
41797
  console.log(`[Syntro Runtime] Build: ${RUNTIME_SDK_BUILD}`);
41502
41798
  const existing = window.SynOS;
@@ -41577,13 +41873,24 @@ lucide-react/dist/esm/defaultAttributes.js:
41577
41873
  lucide-react/dist/esm/shared/src/utils/hasA11yProp.js:
41578
41874
  lucide-react/dist/esm/Icon.js:
41579
41875
  lucide-react/dist/esm/createLucideIcon.js:
41876
+ lucide-react/dist/esm/icons/arrow-right.js:
41877
+ lucide-react/dist/esm/icons/banknote.js:
41878
+ lucide-react/dist/esm/icons/bell.js:
41879
+ lucide-react/dist/esm/icons/book-open.js:
41880
+ lucide-react/dist/esm/icons/circle-check-big.js:
41580
41881
  lucide-react/dist/esm/icons/circle-question-mark.js:
41882
+ lucide-react/dist/esm/icons/clipboard-list.js:
41581
41883
  lucide-react/dist/esm/icons/compass.js:
41582
41884
  lucide-react/dist/esm/icons/file-text.js:
41583
41885
  lucide-react/dist/esm/icons/gamepad-2.js:
41886
+ lucide-react/dist/esm/icons/landmark.js:
41584
41887
  lucide-react/dist/esm/icons/layers.js:
41888
+ lucide-react/dist/esm/icons/lightbulb.js:
41585
41889
  lucide-react/dist/esm/icons/message-circle.js:
41890
+ lucide-react/dist/esm/icons/skip-forward.js:
41586
41891
  lucide-react/dist/esm/icons/sparkles.js:
41892
+ lucide-react/dist/esm/icons/timer.js:
41893
+ lucide-react/dist/esm/icons/triangle-alert.js:
41587
41894
  lucide-react/dist/esm/icons/trophy.js:
41588
41895
  lucide-react/dist/esm/lucide-react.js:
41589
41896
  (**