@syntrologie/runtime-sdk 2.4.0-canary.21 → 2.4.0-canary.23

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.
@@ -31,8 +31,8 @@ import {
31
31
  WaitZ,
32
32
  WidgetConfigZ,
33
33
  coreActionStepSchemas
34
- } from "../chunk-HF3D7YFQ.js";
35
- import "../chunk-2UYZ5DWI.js";
34
+ } from "../chunk-MCX3AKSH.js";
35
+ import "../chunk-5SKKLUOS.js";
36
36
  import "../chunk-P5G4KT2U.js";
37
37
  export {
38
38
  AddClassZ,
@@ -20,6 +20,8 @@ var TileNotificationRuleZ = z.object({
20
20
  var TileZ = z.object({
21
21
  id: z.string(),
22
22
  title: z.string().optional(),
23
+ subtitle: z.string().optional(),
24
+ icon: z.string().optional(),
23
25
  priority: z.number().optional(),
24
26
  widget: z.string(),
25
27
  props: z.record(z.unknown()).optional(),
@@ -28,6 +30,7 @@ var TileZ = z.object({
28
30
  }).strict();
29
31
  var CanvasElementConfigZ = z.object({
30
32
  position: z.enum(["left", "right"]).optional(),
33
+ layout: z.enum(["overlay", "push"]).optional(),
31
34
  background: z.string().optional(),
32
35
  blur: z.string().optional(),
33
36
  border: z.string().optional(),
@@ -38,7 +41,8 @@ var LauncherElementConfigZ = z.object({
38
41
  backgroundHover: z.string().optional(),
39
42
  color: z.string().optional(),
40
43
  size: z.string().optional(),
41
- shadow: z.string().optional()
44
+ shadow: z.string().optional(),
45
+ borderRadius: z.string().optional()
42
46
  });
43
47
  var TileElementConfigZ = z.object({
44
48
  background: z.string().optional(),
@@ -49,11 +53,17 @@ var TileElementConfigZ = z.object({
49
53
  titleColor: z.string().optional(),
50
54
  textColor: z.string().optional(),
51
55
  iconBackground: z.string().optional(),
52
- iconShadow: z.string().optional()
56
+ iconShadow: z.string().optional(),
57
+ headerPadding: z.string().optional(),
58
+ bodyPadding: z.string().optional(),
59
+ gap: z.string().optional()
53
60
  });
54
61
  var OverlayElementConfigZ = z.object({
55
62
  background: z.string().optional(),
56
63
  textColor: z.string().optional(),
64
+ titleColor: z.string().optional(),
65
+ arrowColor: z.string().optional(),
66
+ arrowSize: z.string().optional(),
57
67
  border: z.string().optional(),
58
68
  borderRadius: z.string().optional(),
59
69
  scrimOpacity: z.string().optional(),
@@ -71,6 +81,31 @@ var NotificationElementConfigZ = z.object({
71
81
  iconBackground: z.string().optional(),
72
82
  progressGradient: z.string().optional()
73
83
  });
84
+ var ContentElementConfigZ = z.object({
85
+ background: z.string().optional(),
86
+ backgroundHover: z.string().optional(),
87
+ border: z.string().optional(),
88
+ borderRadius: z.string().optional(),
89
+ textColor: z.string().optional(),
90
+ textSecondaryColor: z.string().optional(),
91
+ // Accordion layout
92
+ itemDivider: z.string().optional(),
93
+ itemGap: z.string().optional(),
94
+ itemPadding: z.string().optional(),
95
+ itemFontSize: z.string().optional(),
96
+ // Expanded content
97
+ bodyPadding: z.string().optional(),
98
+ bodyFontSize: z.string().optional(),
99
+ // Category headers
100
+ categoryPadding: z.string().optional(),
101
+ categoryGap: z.string().optional(),
102
+ categoryFontSize: z.string().optional(),
103
+ // Search
104
+ searchBackground: z.string().optional(),
105
+ searchColor: z.string().optional(),
106
+ // Chevron
107
+ chevronColor: z.string().optional()
108
+ });
74
109
  var CanvasThemeConfigZ = z.object({
75
110
  mode: z.enum(["dark", "light"]).optional(),
76
111
  fontFamily: z.string().optional(),
@@ -81,11 +116,13 @@ var CanvasThemeConfigZ = z.object({
81
116
  launcher: LauncherElementConfigZ.optional(),
82
117
  tile: TileElementConfigZ.optional(),
83
118
  overlay: OverlayElementConfigZ.optional(),
84
- notification: NotificationElementConfigZ.optional()
119
+ notification: NotificationElementConfigZ.optional(),
120
+ content: ContentElementConfigZ.optional()
85
121
  }).strict();
86
122
  var LauncherConfigZ = z.object({
87
123
  enabled: z.boolean().optional(),
88
124
  label: z.string().optional(),
125
+ icon: z.string().optional(),
89
126
  position: z.string().optional(),
90
127
  animate: z.boolean().optional(),
91
128
  animationStyle: z.enum(["pulse", "bounce", "glow"]).optional(),
@@ -118,9 +155,10 @@ export {
118
155
  TileElementConfigZ,
119
156
  OverlayElementConfigZ,
120
157
  NotificationElementConfigZ,
158
+ ContentElementConfigZ,
121
159
  CanvasThemeConfigZ,
122
160
  LauncherConfigZ,
123
161
  CanvasConfigResponseZ,
124
162
  configSchemas
125
163
  };
126
- //# sourceMappingURL=chunk-2UYZ5DWI.js.map
164
+ //# sourceMappingURL=chunk-5SKKLUOS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config/schema.ts"],
4
+ "sourcesContent": ["/**\n * Zod schemas for canvas configuration types.\n *\n * Single source of truth for tile, theme, launcher, and top-level\n * CanvasConfigResponse shapes. These schemas are converted to JSON Schema\n * during build and merged into the unified canvas-config.schema.json.\n *\n * Design decisions:\n * - `.strict()` on top-level objects \u2192 `additionalProperties: false` in JSON Schema\n * - Element sub-schemas (canvas, tile, etc.) are NOT strict to allow future expansion\n */\n\nimport { z } from 'zod';\nimport { ActivationConfigZ } from '../decisions/schema';\n\n// ============================================================================\n// Tile Notification Sub-Types\n// ============================================================================\n\nconst NotificationDeepLinkZ = z\n .object({\n tileId: z.string(),\n itemId: z.string().optional(),\n })\n .strict();\n\nconst TileNotificationRuleZ = z\n .object({\n on: z.string(),\n title: z.string(),\n body: z.string().optional(),\n icon: z.string().optional(),\n ttl: z.number().optional(),\n cooldown: z.number().optional(),\n deepLink: NotificationDeepLinkZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Tile\n// ============================================================================\n\nexport const TileZ = z\n .object({\n id: z.string(),\n title: z.string().optional(),\n subtitle: z.string().optional(),\n icon: z.string().optional(),\n priority: z.number().optional(),\n widget: z.string(),\n props: z.record(z.unknown()).optional(),\n activation: ActivationConfigZ.optional(),\n notifications: z.array(TileNotificationRuleZ).optional(),\n })\n .strict();\n\n// ============================================================================\n// Theme Config \u2014 Element Sub-Schemas\n// ============================================================================\n\nexport const CanvasElementConfigZ = z.object({\n position: z.enum(['left', 'right']).optional(),\n layout: z.enum(['overlay', 'push']).optional(),\n background: z.string().optional(),\n blur: z.string().optional(),\n border: z.string().optional(),\n width: z.string().optional(),\n});\n\nexport const LauncherElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n color: z.string().optional(),\n size: z.string().optional(),\n shadow: z.string().optional(),\n borderRadius: z.string().optional(),\n});\n\nexport const TileElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n shadow: z.string().optional(),\n titleColor: z.string().optional(),\n textColor: z.string().optional(),\n iconBackground: z.string().optional(),\n iconShadow: z.string().optional(),\n headerPadding: z.string().optional(),\n bodyPadding: z.string().optional(),\n gap: z.string().optional(),\n});\n\nexport const OverlayElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n titleColor: z.string().optional(),\n arrowColor: z.string().optional(),\n arrowSize: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n scrimOpacity: z.string().optional(),\n highlightRing: z.string().optional(),\n});\n\nexport const NotificationElementConfigZ = z.object({\n background: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n successColor: z.string().optional(),\n warningColor: z.string().optional(),\n errorColor: z.string().optional(),\n iconBackground: z.string().optional(),\n progressGradient: z.string().optional(),\n});\n\nexport const ContentElementConfigZ = z.object({\n background: z.string().optional(),\n backgroundHover: z.string().optional(),\n border: z.string().optional(),\n borderRadius: z.string().optional(),\n textColor: z.string().optional(),\n textSecondaryColor: z.string().optional(),\n // Accordion layout\n itemDivider: z.string().optional(),\n itemGap: z.string().optional(),\n itemPadding: z.string().optional(),\n itemFontSize: z.string().optional(),\n // Expanded content\n bodyPadding: z.string().optional(),\n bodyFontSize: z.string().optional(),\n // Category headers\n categoryPadding: z.string().optional(),\n categoryGap: z.string().optional(),\n categoryFontSize: z.string().optional(),\n // Search\n searchBackground: z.string().optional(),\n searchColor: z.string().optional(),\n // Chevron\n chevronColor: z.string().optional(),\n});\n\n// ============================================================================\n// Theme Config \u2014 Top-Level\n// ============================================================================\n\nexport const CanvasThemeConfigZ = z\n .object({\n mode: z.enum(['dark', 'light']).optional(),\n fontFamily: z.string().optional(),\n colorPrimary: z.string().optional(),\n colorPrimaryHover: z.string().optional(),\n borderRadius: z.string().optional(),\n canvas: CanvasElementConfigZ.optional(),\n launcher: LauncherElementConfigZ.optional(),\n tile: TileElementConfigZ.optional(),\n overlay: OverlayElementConfigZ.optional(),\n notification: NotificationElementConfigZ.optional(),\n content: ContentElementConfigZ.optional(),\n })\n .strict();\n\n// ============================================================================\n// Launcher Config\n// ============================================================================\n\nexport const LauncherConfigZ = z\n .object({\n enabled: z.boolean().optional(),\n label: z.string().optional(),\n icon: z.string().optional(),\n position: z.string().optional(),\n animate: z.boolean().optional(),\n animationStyle: z.enum(['pulse', 'bounce', 'glow']).optional(),\n notificationCount: z.number().optional(),\n })\n .strict();\n\n// ============================================================================\n// Canvas Config Response (top-level)\n// ============================================================================\n\nexport const CanvasConfigResponseZ = z\n .object({\n schemaVersion: z.string().optional(),\n fetchedAt: z.string().datetime(),\n configVersion: z.string().optional(),\n canvasTitle: z.string().optional(),\n tiles: z.array(TileZ),\n actions: z.array(z.any()),\n theme: CanvasThemeConfigZ.optional(),\n launcher: LauncherConfigZ.optional(),\n verificationSteps: z.array(z.string()).optional(),\n })\n .strict();\n\n// ============================================================================\n// Export: Array for unified schema generation\n// ============================================================================\n\n/**\n * Config schemas for unified JSON Schema generation.\n * The generator imports this array and converts each to a JSON Schema $def.\n */\nexport const configSchemas = [\n { defName: 'tile', schema: TileZ },\n { defName: 'themeConfig', schema: CanvasThemeConfigZ },\n { defName: 'launcherConfig', schema: LauncherConfigZ },\n { defName: 'canvasConfigResponse', schema: CanvasConfigResponseZ },\n];\n\n// ============================================================================\n// Named Exports\n// ============================================================================\n\nexport { NotificationDeepLinkZ, TileNotificationRuleZ };\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -2413,7 +2413,7 @@ var executeHighlight = async (action, context) => {
2413
2413
  };
2414
2414
  };
2415
2415
  var executePulse = async (action, context) => {
2416
- var _a2;
2416
+ var _a2, _b, _c;
2417
2417
  let anchorEl = context.resolveAnchor(action.anchorId);
2418
2418
  if (!anchorEl && context.waitForAnchor) {
2419
2419
  anchorEl = await context.waitForAnchor(action.anchorId, 3e3);
@@ -2423,24 +2423,67 @@ var executePulse = async (action, context) => {
2423
2423
  return { cleanup: () => {
2424
2424
  } };
2425
2425
  }
2426
- const duration = (_a2 = action.duration) != null ? _a2 : 2e3;
2427
- if (!document.querySelector("[data-syntro-pulse-styles]")) {
2428
- const style = document.createElement("style");
2429
- style.setAttribute("data-syntro-pulse-styles", "");
2426
+ const duration = (_a2 = action.duration) != null ? _a2 : 4e3;
2427
+ await new Promise((resolve) => requestAnimationFrame(resolve));
2428
+ const parseHex = (hex) => ({
2429
+ r: parseInt(hex.slice(1, 3), 16),
2430
+ g: parseInt(hex.slice(3, 5), 16),
2431
+ b: parseInt(hex.slice(5, 7), 16)
2432
+ });
2433
+ const fallback = { r: 79, g: 70, b: 229 };
2434
+ let primary = fallback;
2435
+ let secondary = null;
2436
+ try {
2437
+ const styles = getComputedStyle(context.overlayRoot);
2438
+ const pHex = (_b = styles.getPropertyValue("--sc-color-primary")) == null ? void 0 : _b.trim();
2439
+ const sHex = (_c = styles.getPropertyValue("--sc-color-primary-hover")) == null ? void 0 : _c.trim();
2440
+ if ((pHex == null ? void 0 : pHex.startsWith("#")) && pHex.length >= 7) {
2441
+ primary = parseHex(pHex);
2442
+ }
2443
+ if ((sHex == null ? void 0 : sHex.startsWith("#")) && sHex.length >= 7) {
2444
+ secondary = parseHex(sHex);
2445
+ }
2446
+ } catch {
2447
+ }
2448
+ const existing = document.querySelector("[data-syntro-pulse-styles]");
2449
+ if (existing)
2450
+ existing.remove();
2451
+ const style = document.createElement("style");
2452
+ style.setAttribute("data-syntro-pulse-styles", "");
2453
+ const { r: pr, g: pg, b: pb } = primary;
2454
+ if (secondary) {
2455
+ const { r: sr, g: sg, b: sb } = secondary;
2430
2456
  style.textContent = `
2431
2457
  @keyframes syntro-pulse-anim {
2432
2458
  0%, 100% {
2433
- box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.4);
2459
+ box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);
2460
+ }
2461
+ 25% {
2462
+ box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);
2434
2463
  }
2435
2464
  50% {
2436
- box-shadow: 0 0 0 8px rgba(79, 70, 229, 0);
2465
+ box-shadow: 0 0 0 0 rgba(${sr}, ${sg}, ${sb}, 0.35);
2466
+ }
2467
+ 75% {
2468
+ box-shadow: 0 0 0 12px rgba(${sr}, ${sg}, ${sb}, 0);
2469
+ }
2470
+ }
2471
+ `;
2472
+ } else {
2473
+ style.textContent = `
2474
+ @keyframes syntro-pulse-anim {
2475
+ 0%, 100% {
2476
+ box-shadow: 0 0 0 0 rgba(${pr}, ${pg}, ${pb}, 0.35);
2477
+ }
2478
+ 50% {
2479
+ box-shadow: 0 0 0 12px rgba(${pr}, ${pg}, ${pb}, 0);
2437
2480
  }
2438
2481
  }
2439
2482
  `;
2440
- document.head.appendChild(style);
2441
2483
  }
2484
+ document.head.appendChild(style);
2442
2485
  const originalAnimation = anchorEl.style.animation;
2443
- anchorEl.style.animation = "syntro-pulse-anim 1s cubic-bezier(0.4, 0, 0.6, 1) infinite";
2486
+ anchorEl.style.animation = "syntro-pulse-anim 2.5s cubic-bezier(0.4, 0, 0.6, 1) infinite";
2444
2487
  anchorEl.setAttribute("data-syntro-pulse", "true");
2445
2488
  const timeoutId = setTimeout(() => {
2446
2489
  anchorEl.style.animation = originalAnimation;
@@ -2461,7 +2504,7 @@ var executePulse = async (action, context) => {
2461
2504
  };
2462
2505
  };
2463
2506
  var executeBadge = async (action, context) => {
2464
- var _a2;
2507
+ var _a2, _b;
2465
2508
  let anchorEl = context.resolveAnchor(action.anchorId);
2466
2509
  if (!anchorEl && context.waitForAnchor) {
2467
2510
  anchorEl = await context.waitForAnchor(action.anchorId, 3e3);
@@ -2471,6 +2514,14 @@ var executeBadge = async (action, context) => {
2471
2514
  return { cleanup: () => {
2472
2515
  } };
2473
2516
  }
2517
+ let badgeColor = "#4f46e5";
2518
+ try {
2519
+ const primary = (_a2 = getComputedStyle(context.overlayRoot).getPropertyValue("--sc-color-primary")) == null ? void 0 : _a2.trim();
2520
+ if ((primary == null ? void 0 : primary.startsWith("#")) && primary.length >= 7) {
2521
+ badgeColor = primary;
2522
+ }
2523
+ } catch {
2524
+ }
2474
2525
  const badge2 = document.createElement("div");
2475
2526
  badge2.textContent = action.content;
2476
2527
  badge2.setAttribute("data-syntro-badge", action.anchorId.selector);
@@ -2481,13 +2532,13 @@ var executeBadge = async (action, context) => {
2481
2532
  fontWeight: "600",
2482
2533
  lineHeight: "1",
2483
2534
  color: "white",
2484
- background: "var(--syntro-accent, #4f46e5)",
2535
+ background: badgeColor,
2485
2536
  borderRadius: "9999px",
2486
2537
  pointerEvents: "none",
2487
2538
  zIndex: "2147483646",
2488
2539
  whiteSpace: "nowrap"
2489
2540
  });
2490
- const position = (_a2 = action.position) != null ? _a2 : "top-right";
2541
+ const position = (_b = action.position) != null ? _b : "top-right";
2491
2542
  const originalPosition = anchorEl.style.position;
2492
2543
  if (getComputedStyle(anchorEl).position === "static") {
2493
2544
  anchorEl.style.position = "relative";
@@ -3240,7 +3291,7 @@ function getAntiFlickerSnippet(config = {}) {
3240
3291
  }
3241
3292
 
3242
3293
  // src/version.ts
3243
- var SDK_VERSION = "2.4.0-canary.21";
3294
+ var SDK_VERSION = "2.4.0-canary.23";
3244
3295
 
3245
3296
  // src/types.ts
3246
3297
  var SDK_SCHEMA_VERSION = "2.0";
@@ -3899,7 +3950,7 @@ function NotificationToastStack({
3899
3950
  ]
3900
3951
  }
3901
3952
  ),
3902
- /* @__PURE__ */ jsx2("div", { style: { height: "2px", background: "rgba(255, 255, 255, 0.06)" }, children: /* @__PURE__ */ jsx2(
3953
+ /* @__PURE__ */ jsx2("div", { style: { height: "2px", background: "rgba(0, 0, 0, 0.08)" }, children: /* @__PURE__ */ jsx2(
3903
3954
  "div",
3904
3955
  {
3905
3956
  className: "syntro-toast-progress",
@@ -4508,17 +4559,19 @@ var darkDefaults = {
4508
4559
  borderRadius: "12px",
4509
4560
  canvas: {
4510
4561
  position: "right",
4562
+ layout: "overlay",
4511
4563
  background: withAlpha(slateGrey[1], 0.6),
4512
4564
  blur: "blur(24px)",
4513
4565
  border: "none",
4514
- width: "clamp(320px, 16.666vw, 420px)"
4566
+ width: "clamp(380px, 25vw, 520px)"
4515
4567
  },
4516
4568
  launcher: {
4517
4569
  background: button.primary.backgroundDefault,
4518
4570
  backgroundHover: button.primary.backgroundHover,
4519
4571
  color: button.primary.icon,
4520
4572
  size: "56px",
4521
- shadow: `0 8px 32px ${withAlpha(slateGrey[0], 0.6)}`
4573
+ shadow: `0 8px 32px ${withAlpha(slateGrey[0], 0.6)}`,
4574
+ borderRadius: "9999px"
4522
4575
  },
4523
4576
  tile: {
4524
4577
  background: withAlpha(slateGrey[1], 0.6),
@@ -4529,11 +4582,17 @@ var darkDefaults = {
4529
4582
  titleColor: text.primary,
4530
4583
  textColor: text.secondary,
4531
4584
  iconBackground: `linear-gradient(135deg, ${brand[3]} 0%, ${brand[3]}cc 100%)`,
4532
- iconShadow: `0 2px 8px ${brand[3]}40`
4585
+ iconShadow: `0 2px 8px ${brand[3]}40`,
4586
+ headerPadding: "0.375rem 0.75rem",
4587
+ bodyPadding: "0 0.75rem 0.5rem",
4588
+ gap: "0.25rem"
4533
4589
  },
4534
4590
  overlay: {
4535
4591
  background: withAlpha(slateGrey[1], 0.6),
4536
4592
  textColor: text.primary,
4593
+ titleColor: text.primary,
4594
+ arrowColor: withAlpha(slateGrey[1], 0.6),
4595
+ arrowSize: "8px",
4537
4596
  border: "none",
4538
4597
  borderRadius: "0",
4539
4598
  scrimOpacity: "0",
@@ -4550,6 +4609,26 @@ var darkDefaults = {
4550
4609
  errorColor: red[4],
4551
4610
  iconBackground: withAlpha(brand[3], 0.15),
4552
4611
  progressGradient: `linear-gradient(90deg, ${brand[3]}, ${brand[4]})`
4612
+ },
4613
+ content: {
4614
+ background: withAlpha(slateGrey[3], 0.8),
4615
+ backgroundHover: withAlpha(slateGrey[5], 0.6),
4616
+ border: `1px solid ${withAlpha(slateGrey[5], 0.5)}`,
4617
+ borderRadius: "8px",
4618
+ textColor: text.primary,
4619
+ textSecondaryColor: text.secondary,
4620
+ itemDivider: "none",
4621
+ itemGap: "6px",
4622
+ itemPadding: "12px 16px",
4623
+ itemFontSize: "15px",
4624
+ bodyPadding: "0 16px 12px 16px",
4625
+ bodyFontSize: "14px",
4626
+ categoryPadding: "8px 4px 4px 4px",
4627
+ categoryGap: "4px",
4628
+ categoryFontSize: "12px",
4629
+ searchBackground: withAlpha(slateGrey[3], 0.8),
4630
+ searchColor: text.primary,
4631
+ chevronColor: "currentColor"
4553
4632
  }
4554
4633
  };
4555
4634
  var lightDefaults = {
@@ -4560,17 +4639,19 @@ var lightDefaults = {
4560
4639
  borderRadius: "12px",
4561
4640
  canvas: {
4562
4641
  position: "right",
4642
+ layout: "overlay",
4563
4643
  background: withAlpha(slateGrey[12], 0.7),
4564
4644
  blur: "blur(24px)",
4565
4645
  border: "none",
4566
- width: "clamp(320px, 16.666vw, 420px)"
4646
+ width: "clamp(380px, 25vw, 520px)"
4567
4647
  },
4568
4648
  launcher: {
4569
4649
  background: brand[3],
4570
4650
  backgroundHover: brand[2],
4571
4651
  color: "#ffffff",
4572
4652
  size: "56px",
4573
- shadow: "0 8px 32px rgba(0, 0, 0, 0.15)"
4653
+ shadow: "0 8px 32px rgba(0, 0, 0, 0.15)",
4654
+ borderRadius: "9999px"
4574
4655
  },
4575
4656
  tile: {
4576
4657
  background: withAlpha(slateGrey[12], 0.7),
@@ -4581,11 +4662,17 @@ var lightDefaults = {
4581
4662
  titleColor: slateGrey[1],
4582
4663
  textColor: slateGrey[6],
4583
4664
  iconBackground: `linear-gradient(135deg, ${brand[3]} 0%, ${brand[3]}cc 100%)`,
4584
- iconShadow: `0 2px 8px ${brand[3]}40`
4665
+ iconShadow: `0 2px 8px ${brand[3]}40`,
4666
+ headerPadding: "0.375rem 0.75rem",
4667
+ bodyPadding: "0 0.75rem 0.5rem",
4668
+ gap: "0.25rem"
4585
4669
  },
4586
4670
  overlay: {
4587
4671
  background: withAlpha(slateGrey[12], 0.7),
4588
4672
  textColor: slateGrey[1],
4673
+ titleColor: slateGrey[1],
4674
+ arrowColor: withAlpha(slateGrey[12], 0.7),
4675
+ arrowSize: "8px",
4589
4676
  border: "none",
4590
4677
  borderRadius: "0",
4591
4678
  scrimOpacity: "0",
@@ -4602,6 +4689,26 @@ var lightDefaults = {
4602
4689
  errorColor: red[4],
4603
4690
  iconBackground: withAlpha(brand[3], 0.1),
4604
4691
  progressGradient: `linear-gradient(90deg, ${brand[3]}, ${brand[2]})`
4692
+ },
4693
+ content: {
4694
+ background: withAlpha(slateGrey[12], 0.8),
4695
+ backgroundHover: withAlpha(slateGrey[11], 0.6),
4696
+ border: `1px solid ${slateGrey[11]}`,
4697
+ borderRadius: "8px",
4698
+ textColor: slateGrey[1],
4699
+ textSecondaryColor: slateGrey[6],
4700
+ itemDivider: "none",
4701
+ itemGap: "6px",
4702
+ itemPadding: "12px 16px",
4703
+ itemFontSize: "15px",
4704
+ bodyPadding: "0 16px 12px 16px",
4705
+ bodyFontSize: "14px",
4706
+ categoryPadding: "8px 4px 4px 4px",
4707
+ categoryGap: "4px",
4708
+ categoryFontSize: "12px",
4709
+ searchBackground: slateGrey[12],
4710
+ searchColor: slateGrey[1],
4711
+ chevronColor: "currentColor"
4605
4712
  }
4606
4713
  };
4607
4714
  function mergeThemeConfig(customer) {
@@ -4617,7 +4724,8 @@ function mergeThemeConfig(customer) {
4617
4724
  launcher: { ...base2.launcher, ...customer.launcher },
4618
4725
  tile: { ...base2.tile, ...customer.tile },
4619
4726
  overlay: { ...base2.overlay, ...customer.overlay },
4620
- notification: { ...base2.notification, ...customer.notification }
4727
+ notification: { ...base2.notification, ...customer.notification },
4728
+ content: { ...base2.content, ...customer.content }
4621
4729
  };
4622
4730
  }
4623
4731
  function mergeThemeWithWorkspace(workspaceTheme, configTheme) {
@@ -4638,10 +4746,18 @@ function mergeThemeWithWorkspace(workspaceTheme, configTheme) {
4638
4746
  ...base2.notification,
4639
4747
  ...workspaceTheme.notification,
4640
4748
  ...configTheme.notification
4641
- }
4749
+ },
4750
+ content: { ...base2.content, ...workspaceTheme.content, ...configTheme.content }
4642
4751
  };
4643
4752
  }
4644
- var ELEMENT_SECTIONS = ["canvas", "launcher", "tile", "overlay", "notification"];
4753
+ var ELEMENT_SECTIONS = [
4754
+ "canvas",
4755
+ "launcher",
4756
+ "tile",
4757
+ "overlay",
4758
+ "notification",
4759
+ "content"
4760
+ ];
4645
4761
  function flattenThemeConfig(config) {
4646
4762
  const vars = {};
4647
4763
  if (config.fontFamily) vars["--sc-font-family"] = config.fontFamily;
@@ -4718,6 +4834,7 @@ function ShadowCanvasOverlay({
4718
4834
  onToggle,
4719
4835
  telemetry,
4720
4836
  launcherLabel: _launcherLabel = "Adaptives",
4837
+ launcherIcon,
4721
4838
  launcherAnimate = false,
4722
4839
  launcherAnimationStyle: _launcherAnimationStyle = "pulse",
4723
4840
  notificationCount: _notificationCount,
@@ -4861,7 +4978,38 @@ function ShadowCanvasOverlay({
4861
4978
  );
4862
4979
  const isFocused = displayMode === "focused";
4863
4980
  const isRight = config.canvas.position === "right";
4981
+ const isPush = config.canvas.layout === "push";
4982
+ const containerRef = useRef5(null);
4864
4983
  const zIndex = 2147483600;
4984
+ useEffect7(() => {
4985
+ var _a3, _b2;
4986
+ if (!isPush) return;
4987
+ const root = document.documentElement;
4988
+ const prop = isRight ? "marginRight" : "marginLeft";
4989
+ const prevTransition = root.style.transition;
4990
+ root.style.transition = `${prop} 340ms cubic-bezier(0.16, 1, 0.3, 1)`;
4991
+ if (isOpen) {
4992
+ const width = (_b2 = (_a3 = containerRef.current) == null ? void 0 : _a3.offsetWidth) != null ? _b2 : 380;
4993
+ root.style[prop] = `${width}px`;
4994
+ } else {
4995
+ root.style[prop] = "0px";
4996
+ }
4997
+ return () => {
4998
+ root.style[prop] = "";
4999
+ root.style.transition = prevTransition;
5000
+ };
5001
+ }, [isPush, isOpen, isRight]);
5002
+ useEffect7(() => {
5003
+ if (!isPush || !isOpen) return;
5004
+ const container = containerRef.current;
5005
+ if (!container) return;
5006
+ const prop = isRight ? "marginRight" : "marginLeft";
5007
+ const observer = new ResizeObserver(([entry]) => {
5008
+ document.documentElement.style[prop] = `${entry.contentRect.width}px`;
5009
+ });
5010
+ observer.observe(container);
5011
+ return () => observer.disconnect();
5012
+ }, [isPush, isOpen, isRight]);
4865
5013
  const containerStyle = {
4866
5014
  display: "flex",
4867
5015
  flexDirection: "column",
@@ -4909,7 +5057,7 @@ function ShadowCanvasOverlay({
4909
5057
  zIndex
4910
5058
  },
4911
5059
  children: /* @__PURE__ */ jsxs3("div", { style: wrapperStyle, children: [
4912
- /* @__PURE__ */ jsxs3("div", { "data-shadow-canvas-id": "overlay-container", style: containerStyle, children: [
5060
+ /* @__PURE__ */ jsxs3("div", { ref: containerRef, "data-shadow-canvas-id": "overlay-container", style: containerStyle, children: [
4913
5061
  isFocused && canvasTitle && /* @__PURE__ */ jsx6("header", { style: { color: "white", padding: "1.5rem 1.5rem 0" }, children: /* @__PURE__ */ jsx6(
4914
5062
  "p",
4915
5063
  {
@@ -5034,7 +5182,7 @@ function ShadowCanvasOverlay({
5034
5182
  justifyContent: "center",
5035
5183
  width: "var(--sc-launcher-size, 56px)",
5036
5184
  height: "var(--sc-launcher-size, 56px)",
5037
- borderRadius: "9999px",
5185
+ borderRadius: "var(--sc-launcher-border-radius, 9999px)",
5038
5186
  color: "var(--sc-launcher-color)",
5039
5187
  boxShadow: "var(--sc-launcher-shadow)",
5040
5188
  transition: dragRef.current ? "none" : "transform 0.2s ease, opacity 0.3s ease, background-color 0.2s ease",
@@ -5061,7 +5209,7 @@ function ShadowCanvasOverlay({
5061
5209
  }
5062
5210
  },
5063
5211
  children: [
5064
- /* @__PURE__ */ jsx6(
5212
+ isOpen ? /* @__PURE__ */ jsxs3(
5065
5213
  "svg",
5066
5214
  {
5067
5215
  width: "24",
@@ -5075,16 +5223,45 @@ function ShadowCanvasOverlay({
5075
5223
  "aria-hidden": "true",
5076
5224
  focusable: "false",
5077
5225
  style: { transition: "transform 200ms ease" },
5078
- children: isOpen ? /* @__PURE__ */ jsxs3(Fragment, { children: [
5226
+ children: [
5079
5227
  /* @__PURE__ */ jsx6("path", { d: "M18 6L6 18" }),
5080
5228
  /* @__PURE__ */ jsx6("path", { d: "M6 6l12 12" })
5081
- ] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
5229
+ ]
5230
+ }
5231
+ ) : launcherIcon ? /* @__PURE__ */ jsx6(
5232
+ "img",
5233
+ {
5234
+ src: launcherIcon,
5235
+ alt: "",
5236
+ "aria-hidden": "true",
5237
+ style: {
5238
+ width: "60%",
5239
+ height: "60%",
5240
+ objectFit: "contain",
5241
+ pointerEvents: "none"
5242
+ }
5243
+ }
5244
+ ) : /* @__PURE__ */ jsxs3(
5245
+ "svg",
5246
+ {
5247
+ width: "24",
5248
+ height: "24",
5249
+ viewBox: "0 0 24 24",
5250
+ fill: "none",
5251
+ stroke: "currentColor",
5252
+ strokeWidth: "2",
5253
+ strokeLinecap: "round",
5254
+ strokeLinejoin: "round",
5255
+ "aria-hidden": "true",
5256
+ focusable: "false",
5257
+ style: { transition: "transform 200ms ease" },
5258
+ children: [
5082
5259
  /* @__PURE__ */ jsx6("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" }),
5083
5260
  /* @__PURE__ */ jsx6("path", { d: "M5 3v4" }),
5084
5261
  /* @__PURE__ */ jsx6("path", { d: "M3 5h4" }),
5085
5262
  /* @__PURE__ */ jsx6("path", { d: "M19 17v4" }),
5086
5263
  /* @__PURE__ */ jsx6("path", { d: "M17 19h4" })
5087
- ] })
5264
+ ]
5088
5265
  }
5089
5266
  ),
5090
5267
  !isOpen && notifications.length > 0 && /* @__PURE__ */ jsxs3("div", { style: { position: "absolute", top: -2, right: -2, pointerEvents: "none" }, children: [
@@ -5154,7 +5331,8 @@ function useShadowCanvasConfig({
5154
5331
  fetcher,
5155
5332
  experiments,
5156
5333
  runtime: runtime3,
5157
- pageUrl
5334
+ pageUrl,
5335
+ pollIntervalMs
5158
5336
  }) {
5159
5337
  const [state, setState] = useState6({
5160
5338
  tiles: [],
@@ -5209,6 +5387,13 @@ function useShadowCanvasConfig({
5209
5387
  return experiments.onFeaturesChanged(() => load());
5210
5388
  }
5211
5389
  }, [load, experiments, pageUrl]);
5390
+ useEffect8(() => {
5391
+ if (!pollIntervalMs) return;
5392
+ const id = setInterval(() => {
5393
+ load();
5394
+ }, pollIntervalMs);
5395
+ return () => clearInterval(id);
5396
+ }, [load, pollIntervalMs]);
5212
5397
  return useMemo5(() => state, [state]);
5213
5398
  }
5214
5399
 
@@ -8374,7 +8559,7 @@ function evaluateCondition(condition, evalContext) {
8374
8559
  case "page_url": {
8375
8560
  const { url } = condition;
8376
8561
  const currentUrl = context.page.url;
8377
- const pattern = url.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*");
8562
+ const pattern = url.replace(/\*\*/g, "\0GLOBSTAR\0").replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]*").replace(/\0GLOBSTAR\0/g, ".*");
8378
8563
  const regex = new RegExp(`^${pattern}$`);
8379
8564
  return regex.test(currentUrl);
8380
8565
  }
@@ -10933,4 +11118,4 @@ export {
10933
11118
  encodeToken,
10934
11119
  Syntro
10935
11120
  };
10936
- //# sourceMappingURL=chunk-IPU3WVPY.js.map
11121
+ //# sourceMappingURL=chunk-FFIHKDHW.js.map