@syntrologie/adapt-product 2.28.0 → 2.29.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.
Files changed (113) hide show
  1. package/dist/__fixtures__/variant-payloads.d.ts +33 -0
  2. package/dist/__fixtures__/variant-payloads.d.ts.map +1 -0
  3. package/dist/cdn.d.ts +1 -0
  4. package/dist/cdn.d.ts.map +1 -1
  5. package/dist/cdn.js +9 -3
  6. package/dist/cdn.js.map +2 -2
  7. package/dist/{chunk-SGJGJRCP.js → chunk-7Z4Y44WC.js} +139 -6
  8. package/dist/chunk-7Z4Y44WC.js.map +7 -0
  9. package/dist/chunk-VY23O32Z.js +10963 -0
  10. package/dist/chunk-VY23O32Z.js.map +7 -0
  11. package/dist/decision/card-effects.d.ts +20 -0
  12. package/dist/decision/card-effects.d.ts.map +1 -0
  13. package/dist/decision/card.d.ts +150 -0
  14. package/dist/decision/card.d.ts.map +1 -0
  15. package/dist/decision/pdp-compose.d.ts +69 -0
  16. package/dist/decision/pdp-compose.d.ts.map +1 -0
  17. package/dist/decision/pdp-effects.d.ts +17 -0
  18. package/dist/decision/pdp-effects.d.ts.map +1 -0
  19. package/dist/decision/pdp.d.ts +214 -0
  20. package/dist/decision/pdp.d.ts.map +1 -0
  21. package/dist/native/nativeSlotSwap.d.ts +40 -0
  22. package/dist/native/nativeSlotSwap.d.ts.map +1 -0
  23. package/dist/native/nativeSlotWatcher.d.ts +135 -0
  24. package/dist/native/nativeSlotWatcher.d.ts.map +1 -0
  25. package/dist/platformAdapter.d.ts +82 -0
  26. package/dist/platformAdapter.d.ts.map +1 -0
  27. package/dist/runtime.d.ts +318 -36
  28. package/dist/runtime.d.ts.map +1 -1
  29. package/dist/runtime.js +10 -2
  30. package/dist/sanitizer.d.ts.map +1 -1
  31. package/dist/schema-primitives.d.ts +197 -12
  32. package/dist/schema-primitives.d.ts.map +1 -1
  33. package/dist/schema.d.ts +2098 -164
  34. package/dist/schema.d.ts.map +1 -1
  35. package/dist/schema.js +11 -1
  36. package/dist/scoring/pool-selection.d.ts +35 -0
  37. package/dist/scoring/pool-selection.d.ts.map +1 -0
  38. package/dist/scoring/scored-template.d.ts +106 -0
  39. package/dist/scoring/scored-template.d.ts.map +1 -0
  40. package/dist/variantCache.d.ts +5 -0
  41. package/dist/variantCache.d.ts.map +1 -0
  42. package/dist/widgets/OtherProductTileLit.d.ts +46 -0
  43. package/dist/widgets/OtherProductTileLit.d.ts.map +1 -0
  44. package/dist/widgets/PdpChartBarStackedLit.d.ts +33 -0
  45. package/dist/widgets/PdpChartBarStackedLit.d.ts.map +1 -0
  46. package/dist/widgets/PdpChartLit.d.ts +56 -0
  47. package/dist/widgets/PdpChartLit.d.ts.map +1 -0
  48. package/dist/widgets/PdpChartMetricPullLit.d.ts +33 -0
  49. package/dist/widgets/PdpChartMetricPullLit.d.ts.map +1 -0
  50. package/dist/widgets/PdpOtherProductsCarouselLit.d.ts +33 -0
  51. package/dist/widgets/PdpOtherProductsCarouselLit.d.ts.map +1 -0
  52. package/dist/widgets/PdpOtherProductsGridLit.d.ts +20 -0
  53. package/dist/widgets/PdpOtherProductsGridLit.d.ts.map +1 -0
  54. package/dist/widgets/PdpOtherProductsLit.d.ts +35 -0
  55. package/dist/widgets/PdpOtherProductsLit.d.ts.map +1 -0
  56. package/dist/widgets/PdpPeerFeedCarouselLit.d.ts +30 -0
  57. package/dist/widgets/PdpPeerFeedCarouselLit.d.ts.map +1 -0
  58. package/dist/widgets/PdpPeerFeedLit.d.ts +51 -0
  59. package/dist/widgets/PdpPeerFeedLit.d.ts.map +1 -0
  60. package/dist/widgets/PdpPeerFeedMasonryLit.d.ts +30 -0
  61. package/dist/widgets/PdpPeerFeedMasonryLit.d.ts.map +1 -0
  62. package/dist/widgets/PdpQaAccordionLit.d.ts +27 -0
  63. package/dist/widgets/PdpQaAccordionLit.d.ts.map +1 -0
  64. package/dist/widgets/PdpQaLit.d.ts +48 -0
  65. package/dist/widgets/PdpQaLit.d.ts.map +1 -0
  66. package/dist/widgets/PdpQaSideBySideLit.d.ts +27 -0
  67. package/dist/widgets/PdpQaSideBySideLit.d.ts.map +1 -0
  68. package/dist/widgets/PdpRegionalFullBleedLit.d.ts +27 -0
  69. package/dist/widgets/PdpRegionalFullBleedLit.d.ts.map +1 -0
  70. package/dist/widgets/PdpRegionalInlineNoteLit.d.ts +27 -0
  71. package/dist/widgets/PdpRegionalInlineNoteLit.d.ts.map +1 -0
  72. package/dist/widgets/PdpRegionalLit.d.ts +48 -0
  73. package/dist/widgets/PdpRegionalLit.d.ts.map +1 -0
  74. package/dist/widgets/PdpRibbonLit.d.ts +31 -0
  75. package/dist/widgets/PdpRibbonLit.d.ts.map +1 -0
  76. package/dist/widgets/PdpSectionHeaderLit.d.ts +30 -0
  77. package/dist/widgets/PdpSectionHeaderLit.d.ts.map +1 -0
  78. package/dist/widgets/PdpSlotLit.d.ts +30 -0
  79. package/dist/widgets/PdpSlotLit.d.ts.map +1 -0
  80. package/dist/widgets/PdpSlotPlaceholderLit.d.ts +22 -0
  81. package/dist/widgets/PdpSlotPlaceholderLit.d.ts.map +1 -0
  82. package/dist/widgets/PdpTrendingNewsHeroLit.d.ts +32 -0
  83. package/dist/widgets/PdpTrendingNewsHeroLit.d.ts.map +1 -0
  84. package/dist/widgets/PdpTrendingNewsLit.d.ts +42 -0
  85. package/dist/widgets/PdpTrendingNewsLit.d.ts.map +1 -0
  86. package/dist/widgets/PdpTrendingNewsMagazineLit.d.ts +32 -0
  87. package/dist/widgets/PdpTrendingNewsMagazineLit.d.ts.map +1 -0
  88. package/dist/widgets/ProductCardLit.d.ts +78 -0
  89. package/dist/widgets/ProductCardLit.d.ts.map +1 -1
  90. package/dist/widgets/ProductComparisonLit.d.ts +9 -4
  91. package/dist/widgets/ProductComparisonLit.d.ts.map +1 -1
  92. package/dist/widgets/ProductGridLit.d.ts +1 -0
  93. package/dist/widgets/ProductGridLit.d.ts.map +1 -1
  94. package/dist/widgets/ProductHeroLit.d.ts +1 -0
  95. package/dist/widgets/ProductHeroLit.d.ts.map +1 -1
  96. package/dist/widgets/ProductRecoCarouselLit.d.ts +24 -0
  97. package/dist/widgets/ProductRecoCarouselLit.d.ts.map +1 -0
  98. package/dist/widgets/SyntroPdpLit.d.ts +366 -0
  99. package/dist/widgets/SyntroPdpLit.d.ts.map +1 -0
  100. package/dist/widgets/VariantPanelLit.d.ts +98 -0
  101. package/dist/widgets/VariantPanelLit.d.ts.map +1 -0
  102. package/dist/widgets/ensureStylesInRoot.d.ts +22 -0
  103. package/dist/widgets/ensureStylesInRoot.d.ts.map +1 -0
  104. package/dist/widgets/entrance.d.ts +35 -0
  105. package/dist/widgets/entrance.d.ts.map +1 -0
  106. package/dist/widgets/renderHealth.d.ts +57 -0
  107. package/dist/widgets/renderHealth.d.ts.map +1 -0
  108. package/dist/widgets/renderHealthReporter.d.ts +66 -0
  109. package/dist/widgets/renderHealthReporter.d.ts.map +1 -0
  110. package/package.json +4 -1
  111. package/dist/chunk-QZZVFYL6.js +0 -1352
  112. package/dist/chunk-QZZVFYL6.js.map +0 -7
  113. package/dist/chunk-SGJGJRCP.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../sdk-contracts/dist/mount-plumbing.js", "../../../sdk-contracts/dist/schemas.js", "../src/widgets/ProductCardLit.ts", "../src/bind/dom-selector.ts", "../src/bind/jsonld.ts", "../src/bind/opengraph.ts", "../src/bind/shopify-ajax.ts", "../src/bind/woocommerce-store-api.ts", "../src/bind/index.ts", "../src/bind/controller.ts", "../src/sanitizer.ts", "../src/widgets/ProductComparisonLit.ts", "../src/widgets/ProductGridLit.ts", "../src/widgets/ProductHeroLit.ts", "../src/runtime.ts"],
4
- "sourcesContent": ["/**\n * Mount contract types and helper for adaptive widget mountables.\n *\n * The `WidgetRegistry` in `@syntrologie/runtime-sdk` delivers props to each\n * mountable as `{ ...tile.props, instanceId, runtime, tileId? }` spread flat\n * (see `MountableContract.test.ts` in runtime-sdk for the end-to-end lockdown).\n *\n * Adaptives that strip plumbing manually maintain private blacklists that\n * silently drift when the contract grows (PR #2234 and #2238 documented this).\n * `stripMountPlumbing` centralizes the list so adding a new plumbing key in\n * the future is a one-line change here that every adaptive picks up automatically.\n *\n * Adaptives whose widget schemas use Zod `.strict()` MUST call this before\n * validating, or strict-mode will reject the runtime-injected keys and the\n * widget will silently render its empty/error state.\n */\nexport const MOUNT_PLUMBING_KEYS = ['instanceId', 'runtime', 'tileId'];\nexport function stripMountPlumbing(config) {\n if (!config || typeof config !== 'object') {\n return {};\n }\n const out = { ...config };\n for (const key of MOUNT_PLUMBING_KEYS) {\n delete out[key];\n }\n return out;\n}\n", "/**\n * Shared Zod schemas for decision strategies, conditions, and event scoping.\n *\n * These are the canonical definitions \u2014 runtime-sdk and all adaptive packages\n * should import from here instead of duplicating.\n */\nimport { z } from 'zod';\n// =============================================================================\n// ANCHOR ID SCHEMA\n// =============================================================================\nexport const AnchorIdZ = z\n .object({\n selector: z.string(),\n route: z.union([z.string(), z.array(z.string())]),\n})\n .strict();\n// =============================================================================\n// AUTHORING FIELDS \u2014 id / title / description / validation\n//\n// Shared fields every action carries. `id` is the action identifier the\n// runtime uses to dispatch, dedupe, and drop/replace actions \u2014 it is NOT\n// stripped before serving. `title` / `description` / `validation` are\n// authoring-only metadata stripped server-side in `to_runtime_config`\n// (platform/backend/app/domains/experiments/helpers.py).\n//\n// They all appear in the JSON Schema (and therefore in the tactician's\n// prompt) because the LLM needs to know they are valid action properties \u2014\n// otherwise schema validation would reject what the prompt commands.\n//\n// Each action variant should `.extend(AuthoringFieldsZ)` alongside any\n// triggerWhen/condition extensions.\n// =============================================================================\nexport const AuthoringFieldsZ = {\n id: z.string().optional().describe('Stable action identifier (e.g. \"act_3db6a14d2ab0\").'),\n title: z\n .string()\n .max(200)\n .optional()\n .describe('Authoring-only: short label shown on the action plan dashboard. Stripped before serving to the runtime SDK.'),\n description: z\n .string()\n .max(1000)\n .optional()\n .describe('Authoring-only: one-sentence explanation of what this action does and why. Stripped before serving to the runtime SDK.'),\n validation: z\n .array(z.string().max(500))\n .max(10)\n .optional()\n .describe('Authoring-only: ordered steps a reviewer can follow to trigger this action and visually confirm it works. Each entry is one step. Stripped before serving to the runtime SDK.'),\n};\n// =============================================================================\n// TRIGGER VOCABULARY \u2014 canonical lists of valid event names, metric keys, etc.\n// These flow through to the JSON schema as enums and are used by the LLM prompt.\n// =============================================================================\n/** Events that can be counted in event_count conditions.\n *\n * Every value here must be an event the runtime actually emits \u2014 either a\n * PostHog-autocapture normalization (ui.click/scroll/input/change/submit) or\n * an event-processor detector (ui.hover/idle/scroll_thrash/focus_bounce/\n * hesitate/rage_click). Do not add aspirational names; a trigger counting an\n * event nothing emits never fires.\n */\nexport const COUNTABLE_EVENTS = [\n // User interactions (from PostHog autocapture normalization)\n 'ui.click',\n 'ui.scroll',\n 'ui.input',\n 'ui.change',\n 'ui.submit',\n // Behavioral detectors (from event-processor)\n 'ui.hover',\n 'ui.idle',\n 'ui.scroll_thrash',\n 'ui.focus_bounce',\n 'ui.hesitate',\n 'ui.rage_click',\n // Navigation\n 'nav.page_view',\n 'nav.page_leave',\n];\nexport const CountableEventZ = z\n .enum(COUNTABLE_EVENTS)\n .describe('Event name to count. ui.* = user interactions and behavioral detectors (hesitate, rage_click, scroll_thrash, focus_bounce, idle, hover); nav.* = page navigation.');\n/** Valid session metric keys. */\nexport const SESSION_METRIC_KEYS = ['time_on_page', 'page_views', 'scroll_depth'];\nexport const SessionMetricKeyZ = z\n .enum(SESSION_METRIC_KEYS)\n .describe('Session metric key. time_on_page = seconds on current page, page_views = pages visited this session, scroll_depth = 0-100 percentage.');\n/** Element chain match field prefixes for counter filters. */\nexport const ELEMENT_MATCH_FIELDS = ['tag_name', '$el_text'];\n// Note: attr__* is a dynamic prefix (attr__data-id, attr__class, attr__href, etc.)\n// and cannot be enumerated. The match key is either one of ELEMENT_MATCH_FIELDS\n// or starts with \"attr__\".\n// =============================================================================\n// CONDITION SCHEMAS\n// =============================================================================\nexport const PageUrlConditionZ = z\n .object({\n type: z.literal('page_url'),\n url: z.string().describe('URL path to match (e.g. \"/pricing\", \"/dashboard\")'),\n})\n .describe('Fires when the current page URL matches. Use for page-specific actions. ' +\n 'Example: {\"type\": \"page_url\", \"url\": \"/pricing\"}');\nexport const RouteConditionZ = z\n .object({\n type: z.literal('route'),\n routeId: z.string().describe('Named route ID from the route filter'),\n})\n .describe('Fires when the current route matches a named route ID.');\nexport const AnchorVisibleConditionZ = z\n .object({\n type: z.literal('anchor_visible'),\n anchorId: z.string().describe('CSS selector of the anchor element'),\n state: z\n .enum(['visible', 'present', 'absent'])\n .describe('\"visible\" = in viewport, \"present\" = in DOM, \"absent\" = not in DOM'),\n})\n .describe(\"Fires based on a DOM element's visibility state. \" +\n 'Example: {\"type\": \"anchor_visible\", \"anchorId\": \"#cta-button\", \"state\": \"visible\"}');\nexport const EventOccurredConditionZ = z\n .object({\n type: z.literal('event_occurred'),\n eventName: z.string().describe('Event name (e.g. \"ui.click\", \"$pageview\")'),\n withinMs: z.number().optional().describe('Time window in ms. Omit = any time this session.'),\n})\n .describe('Fires when a specific event has occurred during this session. ' +\n 'Example: {\"type\": \"event_occurred\", \"eventName\": \"ui.click\", \"withinMs\": 5000}');\nexport const StateEqualsConditionZ = z\n .object({\n type: z.literal('state_equals'),\n key: z\n .string()\n .describe('Key in the SDK persistent state store (localStorage). Only valid for keys the host app explicitly sets via syntro.state.set().'),\n value: z.unknown().describe('Expected value to match against'),\n})\n .describe('Checks the SDK persistent state store (localStorage). ONLY for host-app state set via syntro.state.set() \u2014 ' +\n 'NOT for user attributes like region, device, or UTM params (those are handled by segment targeting). ' +\n 'Do NOT use this for targeting. If you do not know the valid state keys, do not use this condition type.');\nexport const ViewportConditionZ = z\n .object({\n type: z.literal('viewport'),\n minWidth: z.number().optional().describe('Minimum viewport width in pixels'),\n maxWidth: z.number().optional().describe('Maximum viewport width in pixels'),\n minHeight: z.number().optional().describe('Minimum viewport height in pixels'),\n maxHeight: z.number().optional().describe('Maximum viewport height in pixels'),\n})\n .describe('Fires based on viewport (screen) size. Use for responsive behavior. ' +\n 'Example: {\"type\": \"viewport\", \"minWidth\": 768} \u2014 fires on tablet and larger.');\nexport const SessionMetricConditionZ = z\n .object({\n type: z.literal('session_metric'),\n key: SessionMetricKeyZ,\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n threshold: z.number().describe('Numeric threshold to compare against'),\n})\n .describe('Fires when a session metric crosses a threshold. Valid keys: \"time_on_page\" (seconds), ' +\n '\"page_views\" (count), \"scroll_depth\" (0-100). ' +\n 'Example: {\"type\": \"session_metric\", \"key\": \"time_on_page\", \"operator\": \"gte\", \"threshold\": 30}');\nexport const DismissedConditionZ = z\n .object({\n type: z.literal('dismissed'),\n key: z.string().describe('Dismissal key (usually a tile or action ID)'),\n inverted: z\n .boolean()\n .optional()\n .describe('When true, fires if NOT dismissed (default behavior)'),\n})\n .describe('Checks if an item has been dismissed by the user. Use with inverted: true to show only if not dismissed.');\nexport const CooldownActiveConditionZ = z\n .object({\n type: z.literal('cooldown_active'),\n key: z.string().describe('Cooldown key'),\n inverted: z.boolean().optional().describe('When true, fires if cooldown is NOT active'),\n})\n .describe('Checks if a cooldown timer is currently active. Use to prevent showing the same intervention too frequently.');\nexport const FrequencyLimitConditionZ = z\n .object({\n type: z.literal('frequency_limit'),\n key: z.string().describe('Frequency counter key'),\n limit: z.number().describe('Maximum allowed count'),\n inverted: z.boolean().optional().describe('When true, fires if limit NOT reached'),\n})\n .describe('Checks if a frequency limit has been reached. Use to cap how many times an action fires per session.');\nexport const MatchOpZ = z\n .object({\n equals: z.union([z.string(), z.number(), z.boolean()]).optional(),\n contains: z.string().optional(),\n})\n .describe('Match operator for counter filters. Exactly one of equals or contains must be specified.');\nexport const CounterDefZ = z\n .object({\n events: z\n .array(CountableEventZ)\n .min(1)\n .describe('Event names to count. Use values from the countable events enum.'),\n match: z\n .record(z.string(), MatchOpZ)\n .optional()\n .describe('Property filters. Keys are event prop names or element-chain fields ' +\n '(tag_name, $el_text, attr__*). All entries AND together.'),\n})\n .describe('Defines what events to count. Registered as an accumulator predicate at config-load time.');\nexport const EventCountConditionZ = z\n .object({\n type: z.literal('event_count'),\n key: z.string().describe('Unique key for this counter (used for accumulator registration)'),\n operator: z.enum(['gte', 'lte', 'eq', 'gt', 'lt']),\n count: z.number().int().min(0).describe('Target count threshold'),\n withinMs: z\n .number()\n .positive()\n .optional()\n .describe('Time window in ms. Omit = count across entire session.'),\n counter: CounterDefZ.optional().describe('Inline counter definition. Defines what events to count.'),\n})\n .describe('Fires when accumulated event count crosses a threshold. Most powerful trigger type. ' +\n 'Example: {\"type\": \"event_count\", \"key\": \"pricing-clicks\", \"operator\": \"gte\", \"count\": 3, ' +\n '\"counter\": {\"events\": [\"ui.click\"], \"match\": {\"attr__data-cta\": {\"contains\": \"pricing\"}}}}');\nexport const ConditionZ = z.discriminatedUnion('type', [\n PageUrlConditionZ,\n RouteConditionZ,\n AnchorVisibleConditionZ,\n EventOccurredConditionZ,\n StateEqualsConditionZ,\n ViewportConditionZ,\n SessionMetricConditionZ,\n DismissedConditionZ,\n CooldownActiveConditionZ,\n FrequencyLimitConditionZ,\n EventCountConditionZ,\n]);\n// =============================================================================\n// STRATEGY SCHEMAS\n// =============================================================================\nexport const RuleZ = z\n .object({\n conditions: z\n .array(ConditionZ)\n .describe('Array of conditions \u2014 ALL must match (AND logic) for this rule to fire.'),\n value: z\n .unknown()\n .describe('Value returned when all conditions match. For triggerWhen: true = fire the action.'),\n})\n .describe('A single rule. ALL conditions must match (AND logic). Rules in a strategy are evaluated ' +\n 'top-to-bottom \u2014 first rule where all conditions match wins and returns its value.');\nexport const RuleStrategyZ = z\n .object({\n type: z.literal('rules'),\n rules: z\n .array(RuleZ)\n .describe('Ordered list of rules. Evaluated top-to-bottom \u2014 first match wins.'),\n default: z\n .unknown()\n .describe('Fallback value when no rule matches. For triggerWhen: false = do not fire by default.'),\n})\n .describe('Rule-based strategy. Evaluates rules top-to-bottom. First rule where ALL conditions match ' +\n 'returns its value. If no rule matches, returns default. ' +\n 'For triggerWhen: set value=true on matching rules, default=false.');\nexport const ScoreStrategyZ = z\n .object({\n type: z.literal('score'),\n field: z.string(),\n threshold: z.number(),\n above: z.unknown(),\n below: z.unknown(),\n})\n .describe('Score-based strategy. Compares a field value against a threshold.');\nexport const ModelStrategyZ = z\n .object({\n type: z.literal('model'),\n modelId: z.string(),\n inputs: z.array(z.string()),\n outputMapping: z.record(z.string(), z.unknown()),\n default: z.unknown(),\n})\n .describe('ML model strategy. Sends inputs to a model and maps outputs.');\nexport const ExternalStrategyZ = z\n .object({\n type: z.literal('external'),\n endpoint: z.string(),\n method: z.enum(['GET', 'POST']).optional(),\n default: z.unknown(),\n timeoutMs: z.number().optional(),\n})\n .describe('External API strategy. Calls an endpoint to determine the value.');\nexport const DecisionStrategyZ = z.discriminatedUnion('type', [\n RuleStrategyZ,\n ScoreStrategyZ,\n ModelStrategyZ,\n ExternalStrategyZ,\n]);\n/** Canonical Zod schema for the optional triggerWhen field on actions and adaptive items. */\nexport const TriggerWhenZ = DecisionStrategyZ.nullable().optional();\n// =============================================================================\n// TRIGGER DOCUMENTATION \u2014 examples and match field docs\n// Exported as constants so the schema generator can inject them into the\n// JSON schema. The Python prompt builder reads them from the schema.\n// =============================================================================\n/** Complete triggerWhen examples showing the full rules wrapper structure. */\nexport const TRIGGER_EXAMPLES = [\n {\n name: 'Click count on a specific element',\n description: 'Fire when user clicks an element with data-id=\"hero-cta\" 2+ times',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'event_count',\n key: 'cta-clicks',\n operator: 'gte',\n count: 2,\n counter: {\n events: ['ui.click'],\n match: { 'attr__data-id': { equals: 'hero-cta' } },\n },\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'Time on page threshold',\n description: 'Fire after user spends 30+ seconds on the page',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'session_metric',\n key: 'time_on_page',\n operator: 'gte',\n threshold: 30,\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'Element visible in viewport',\n description: 'Fire when a DOM element becomes visible',\n triggerWhen: {\n type: 'rules',\n rules: [\n {\n conditions: [\n {\n type: 'anchor_visible',\n anchorId: '#pricing-section',\n state: 'visible',\n },\n ],\n value: true,\n },\n ],\n default: false,\n },\n },\n {\n name: 'No trigger (fire immediately)',\n description: 'Action fires as soon as the segment matches \u2014 no in-session condition needed',\n triggerWhen: null,\n },\n];\n/** Documentation for counter.match field keys. */\nexport const MATCH_FIELD_DOCS = {\n tag_name: 'HTML tag name (e.g. \"button\", \"a\", \"input\")',\n $el_text: 'Visible text content of the element',\n 'attr__*': 'HTML attribute prefixed with attr__. Example: attr__data-id matches the data-id attribute, ' +\n 'attr__class matches the class attribute, attr__href matches the href attribute.',\n};\n// =============================================================================\n// EVENT SCOPE SCHEMA\n// =============================================================================\n/** Scopes a widget to specific events/URLs. */\nexport const EventScopeZ = z.object({\n events: z.array(z.string()),\n urlContains: z.string().optional(),\n props: z.record(z.union([z.string(), z.number(), z.boolean()])).optional(),\n});\n// =============================================================================\n// NOTIFY SCHEMA\n// =============================================================================\n/** Toast notification config for triggerWhen transitions. */\nexport const NotifyZ = z\n .object({\n title: z.string().optional(),\n body: z.string().optional(),\n icon: z.string().optional(),\n})\n .nullable()\n .optional();\n", "import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { BindController } from '../bind/controller';\nimport { sanitizeHtml } from '../sanitizer';\nimport { type CardProps, cardSchema, VISIBLE_FACT_KEYS, type VisibleFactKey } from '../schema';\nimport type { Product } from '../schema-primitives';\n\nexport class ProductCardLit extends LitElement {\n static override properties = {\n props: { attribute: false },\n resolved: { state: true },\n validationError: { state: true },\n };\n\n props: CardProps | undefined = undefined;\n resolved: Record<string, { image?: string; price?: string }> = {};\n validationError = false;\n\n #controller: BindController | undefined;\n\n override createRenderRoot() {\n return this;\n }\n\n override willUpdate(changed: Map<string, unknown>): void {\n if (changed.has('props')) {\n this.#startBind();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#controller?.destroy();\n }\n\n #startBind(): void {\n this.#controller?.destroy();\n this.resolved = {};\n if (!this.props) {\n this.validationError = false;\n return;\n }\n const result = cardSchema.safeParse(this.props);\n if (!result.success) {\n this.validationError = true;\n console.warn('[adaptive-product] invalid card props:', result.error.issues);\n return;\n }\n this.validationError = false;\n const parsed = result.data;\n this.#controller = new BindController([parsed.product], (productId, kind, value) => {\n if (value == null) return;\n this.resolved = {\n ...this.resolved,\n [productId]: { ...this.resolved[productId], [kind]: value },\n };\n });\n this.#controller.start();\n }\n\n override render(): TemplateResult | typeof nothing {\n if (this.validationError || !this.props) return html``;\n const parsed = cardSchema.safeParse(this.props);\n if (!parsed.success) return html``;\n return renderProductCard(\n parsed.data.product,\n parsed.data.density,\n this.resolved[parsed.data.product.id],\n parsed.data.visibleFacts\n );\n }\n}\n\nconst AVAILABILITY_LABELS: Record<NonNullable<Product['availability']>, string> = {\n in_stock: 'In stock',\n preorder: 'Preorder',\n backorder: 'Backorder',\n out_of_stock: 'Out of stock',\n};\n\ninterface SpecGroup {\n section: string;\n rows: Array<{ name: string; value: string; unit?: string; emphasis: boolean }>;\n}\n\n// Merge v2 specs[] with legacy v1 attributes[] (shimmed as \"About\" section).\n// Order: specs sections in author order, then \"About\" appended for any\n// legacy attributes present. New configs author specs[] directly; old\n// configs keep working until migrated.\nfunction buildSpecGroups(product: Product): SpecGroup[] {\n const groups = new Map<string, SpecGroup>();\n for (const spec of product.specs ?? []) {\n let group = groups.get(spec.section);\n if (!group) {\n group = { section: spec.section, rows: [] };\n groups.set(spec.section, group);\n }\n group.rows.push({\n name: spec.name,\n value: spec.value,\n unit: spec.unit,\n emphasis: spec.emphasis ?? false,\n });\n }\n if (product.attributes && product.attributes.length > 0) {\n const about: SpecGroup = groups.get('About') ?? { section: 'About', rows: [] };\n for (const attr of product.attributes) {\n about.rows.push({\n name: attr.label,\n value: attr.value,\n emphasis: attr.emphasis ?? false,\n });\n }\n if (!groups.has('About')) groups.set('About', about);\n }\n return Array.from(groups.values());\n}\n\nexport function renderProductCard(\n product: Product,\n density: 'compact' | 'standard',\n resolved: { image?: string; price?: string } | undefined,\n visibleFacts?: readonly VisibleFactKey[]\n): TemplateResult {\n const imgSrc = resolved?.image ?? product.image.src;\n const showFraming = density === 'standard' && product.framing;\n const specGroups = buildSpecGroups(product);\n // When visibleFacts is omitted, every populated block renders in the\n // default author order (back-compat). When set, only listed keys\n // render and the list's order is the render order.\n const isVisible = (key: VisibleFactKey): boolean =>\n visibleFacts === undefined ? true : visibleFacts.includes(key);\n const factOrder: readonly VisibleFactKey[] = visibleFacts ?? VISIBLE_FACT_KEYS;\n\n // When salePrice is set, it becomes the active amount and `price` strikes through.\n // Bind-resolved price always wins for the active amount (live discount feeds).\n const hasSalePrice = product.salePrice !== undefined;\n const activePriceText = resolved?.price ?? product.salePrice?.amount ?? product.price?.amount;\n const activeCadence = hasSalePrice ? product.salePrice?.cadence : product.price?.cadence;\n\n // Float-left thumbnail. Content (name, tagline, rating, price, specs\u2026)\n // wraps to the right of the image, then continues full-width once it\n // passes the image bottom. No rigid \"header row\" \u2014 when the identity\n // block is taller than the image, the overflow flows around naturally.\n // `display: flow-root` on the article contains the float so the article\n // height matches its content (no margin collapse onto the next tile).\n const thumbPx = density === 'compact' ? 64 : 96;\n const articleStyles = {\n display: 'flow-root',\n };\n const imageStyles = {\n float: 'left',\n width: `${thumbPx}px`,\n height: `${thumbPx}px`,\n objectFit: 'cover',\n borderRadius: '6px',\n marginRight: density === 'compact' ? '0.5rem' : '0.75rem',\n marginBottom: density === 'compact' ? '0.25rem' : '0.5rem',\n };\n // Inline-styled price block \u2014 strikethrough on original, larger sale amount,\n // small cadence suffix. Keeps the card readable without host CSS.\n const priceBlockStyles = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'baseline',\n flexWrap: 'wrap' as const,\n gap: '0.5rem',\n };\n const priceOriginalStyles = {\n textDecoration: 'line-through',\n opacity: '0.6',\n fontSize: '0.9em',\n };\n const priceSaleStyles = {\n fontWeight: '600',\n fontSize: '1.1em',\n };\n const priceCadenceStyles = {\n fontSize: '0.85em',\n opacity: '0.7',\n };\n // Spec list \u2014 kill default ul indent/bullets, lay rows out as\n // name (flex) | value (right) | unit (small).\n const specGroupStyles = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.25rem',\n };\n const specHeadingStyles = {\n fontSize: '0.75rem',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n opacity: '0.7',\n margin: '0',\n fontWeight: '600',\n };\n const specRowsStyles = {\n listStyle: 'none',\n margin: '0',\n padding: '0',\n display: 'flex',\n flexDirection: 'column',\n gap: '0.125rem',\n };\n const specRowStyles = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'baseline',\n gap: '0.5rem',\n fontSize: '0.875rem',\n };\n const specNameStyles = {\n flex: '1',\n minWidth: '0',\n };\n const specValueStyles = {\n fontVariantNumeric: 'tabular-nums' as const,\n textAlign: 'right' as const,\n };\n const specUnitStyles = {\n fontSize: '0.85em',\n opacity: '0.7',\n minWidth: '2.5rem',\n };\n const specsContainerStyles = {\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n };\n const availabilityStyles = {\n display: 'inline-block',\n fontSize: '0.8rem',\n opacity: '0.85',\n };\n const ctasStyles = {\n display: 'flex',\n flexDirection: 'row',\n gap: '0.5rem',\n marginTop: '0.25rem',\n };\n\n return html`\n <article\n class=\"sc-product-card\"\n data-density=${density}\n data-labels=${product.labels ? JSON.stringify(product.labels) : nothing}\n style=${styleMap(articleStyles)}\n >\n <img\n class=\"sc-product-card__image\"\n data-product-image\n src=${imgSrc}\n alt=${product.image.alt}\n loading=\"lazy\"\n @error=${onImageError}\n style=${styleMap(imageStyles)}\n />\n <header\n class=\"sc-product-card__header\"\n style=${styleMap({ margin: '0', display: 'block' })}\n >\n <h3\n class=\"sc-product-card__name\"\n data-product-name\n style=${styleMap({ margin: '0 0 0.125rem', fontSize: '1.05rem', fontWeight: '600', lineHeight: '1.2' })}\n >${product.name}</h3>\n ${\n product.tagline && isVisible('tagline')\n ? html`<p\n class=\"sc-product-card__tagline\"\n data-product-tagline\n style=${styleMap({ margin: '0 0 0.125rem', fontSize: '0.875rem', opacity: '0.75', lineHeight: '1.3' })}\n >${product.tagline}</p>`\n : nothing\n }\n ${\n product.rating && isVisible('rating')\n ? html`<div\n class=\"sc-product-card__rating\"\n data-product-rating\n data-rating-value=${product.rating.value}\n data-rating-max=${product.rating.max ?? 5}\n aria-label=${`${product.rating.value} out of ${product.rating.max ?? 5}, ${product.rating.count} reviews`}\n style=${styleMap({ fontSize: '0.85rem' })}\n >\n <span class=\"sc-product-card__rating-stars\">\u2605 ${product.rating.value}</span>\n <span class=\"sc-product-card__rating-count\" style=${styleMap({ opacity: '0.7', marginLeft: '0.25rem' })}>(${product.rating.count.toLocaleString()})</span>\n </div>`\n : nothing\n }\n </header>\n <div\n class=\"sc-product-card__body\"\n data-product-body\n style=${styleMap({ display: 'block', marginTop: '0.5rem' })}\n >\n ${factOrder.map((key) => {\n if (key === 'price') {\n if (!isVisible('price') || (!product.price && !product.salePrice)) return nothing;\n return html`<div\n class=\"sc-product-card__price\"\n data-product-price\n style=${styleMap(priceBlockStyles)}\n >\n ${\n hasSalePrice && product.price\n ? html`<span\n class=\"sc-product-card__amount-original\"\n data-product-price-original\n style=${styleMap(priceOriginalStyles)}\n >${product.price.amount}</span\n >`\n : nothing\n }\n <span\n class=\"sc-product-card__amount\"\n data-product-price-sale=${hasSalePrice ? 'true' : nothing}\n style=${styleMap(priceSaleStyles)}\n >${activePriceText}</span\n >\n ${\n activeCadence\n ? html`<span\n class=\"sc-product-card__cadence\"\n style=${styleMap(priceCadenceStyles)}\n >${activeCadence}</span\n >`\n : nothing\n }\n </div>`;\n }\n if (key === 'availability') {\n if (!isVisible('availability') || !product.availability) return nothing;\n return html`<span\n class=\"sc-product-card__availability\"\n data-product-availability\n data-availability=${product.availability}\n style=${styleMap(availabilityStyles)}\n >${AVAILABILITY_LABELS[product.availability]}</span\n >`;\n }\n if (key === 'badge') {\n if (!isVisible('badge') || !product.badge) return nothing;\n return html`<span\n class=\"sc-product-card__badge\"\n data-product-badge\n data-tone=${product.badge.tone}\n >${product.badge.label}</span\n >`;\n }\n if (key === 'specs') {\n if (!isVisible('specs') || specGroups.length === 0) return nothing;\n return html`<div class=\"sc-product-card__specs\" style=${styleMap(specsContainerStyles)}>\n ${specGroups.map(\n (g) => html`<section\n class=\"sc-product-card__spec-section\"\n data-spec-section=${g.section}\n style=${styleMap(specGroupStyles)}\n >\n <h4\n class=\"sc-product-card__spec-heading\"\n style=${styleMap(specHeadingStyles)}\n >${g.section}</h4>\n <ul\n class=\"sc-product-card__spec-rows\"\n style=${styleMap(specRowsStyles)}\n >\n ${g.rows.map(\n (r) => html`<li\n data-spec-row\n data-attribute-emphasis=${r.emphasis ? 'true' : 'false'}\n style=${styleMap(specRowStyles)}\n >\n <span\n class=\"sc-product-card__spec-name\"\n data-spec-name\n style=${styleMap(specNameStyles)}\n >${r.name}</span\n >\n <span\n class=\"sc-product-card__spec-value\"\n data-spec-value\n style=${styleMap(specValueStyles)}\n >${r.value}</span\n >\n ${\n r.unit\n ? html`<span\n class=\"sc-product-card__spec-unit\"\n data-spec-unit\n style=${styleMap(specUnitStyles)}\n >${r.unit}</span\n >`\n : nothing\n }\n </li>`\n )}\n </ul>\n </section>`\n )}\n </div>`;\n }\n if (key === 'framing') {\n if (!isVisible('framing') || !showFraming) return nothing;\n return html`<p\n class=\"sc-product-card__framing\"\n .innerHTML=${sanitizeHtml(product.framing ?? '')}\n ></p>`;\n }\n // tagline + rating render in the header; nothing to emit here.\n return nothing;\n })}\n <div class=\"sc-product-card__ctas\" style=${styleMap(ctasStyles)}>\n ${product.ctas.map(\n (c, i) => html`<a\n class=\"sc-product-card__cta\"\n data-product-cta=${i === 0 ? 'primary' : 'secondary'}\n data-variant=${c.variant}\n href=${c.href ?? '#'}\n target=${c.target}\n rel=${c.target === '_blank' ? 'noopener noreferrer' : ''}\n data-action-id=${c.actionId ?? ''}\n >${c.label}</a\n >`\n )}\n </div>\n </div>\n </article>\n `;\n}\n\nfunction onImageError(e: Event): void {\n const img = e.currentTarget as HTMLImageElement;\n img.dataset.imageError = 'true';\n img.removeAttribute('src');\n}\n", "import type { ImageBind, PriceBind } from '../schema-primitives';\n\ntype DomSelectorPrice = Extract<PriceBind, { type: 'dom-selector' }>;\ntype DomSelectorImage = Extract<ImageBind, { type: 'dom-selector' }>;\n\nexport async function resolveDomSelectorPrice(\n input: DomSelectorPrice,\n _signal: AbortSignal\n): Promise<string | null> {\n const el = document.querySelector(input.selector);\n const text = el?.textContent?.trim();\n return text && text.length > 0 ? text : null;\n}\n\nexport async function resolveDomSelectorImage(\n input: DomSelectorImage,\n _signal: AbortSignal\n): Promise<string | null> {\n const el = document.querySelector(input.selector);\n if (!el) return null;\n if (el instanceof HTMLImageElement) return el.currentSrc || el.src || null;\n const src = el.getAttribute('src');\n return src && src.length > 0 ? src : null;\n}\n", "import type { ImageBind, PriceBind } from '../schema-primitives';\n\ntype JsonLdPriceBind = Extract<PriceBind, { type: 'jsonld' }>;\ntype JsonLdImageBind = Extract<ImageBind, { type: 'jsonld' }>;\n\ninterface Offer {\n price?: string | number;\n priceCurrency?: string;\n}\ninterface ProductNode {\n '@type'?: string | string[];\n image?: string | string[];\n offers?: Offer | Offer[];\n}\n\nfunction isProduct(node: unknown): node is ProductNode {\n if (typeof node !== 'object' || node === null) return false;\n const t = (node as { '@type'?: unknown })['@type'];\n if (typeof t === 'string') return t === 'Product';\n if (Array.isArray(t)) return t.includes('Product');\n return false;\n}\n\nfunction parseScripts(scripts: string[]): ProductNode | null {\n for (const text of scripts) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n continue;\n }\n const stack: unknown[] = [parsed];\n while (stack.length) {\n const cur = stack.pop();\n if (Array.isArray(cur)) {\n for (const c of cur) stack.push(c);\n continue;\n }\n if (isProduct(cur)) return cur;\n if (typeof cur === 'object' && cur !== null) {\n const graph = (cur as { '@graph'?: unknown })['@graph'];\n if (Array.isArray(graph)) for (const g of graph) stack.push(g);\n }\n }\n }\n return null;\n}\n\nfunction collectInlineScripts(): string[] {\n const els = document.querySelectorAll('script[type=\"application/ld+json\"]');\n return Array.from(els, (el) => el.textContent ?? '');\n}\n\nasync function collectScriptsFromUrl(url: string, signal: AbortSignal): Promise<string[]> {\n const res = await fetch(url, { signal });\n if (!res.ok) return [];\n const text = await res.text();\n const doc = new DOMParser().parseFromString(text, 'text/html');\n return Array.from(\n doc.querySelectorAll('script[type=\"application/ld+json\"]'),\n (el) => el.textContent ?? ''\n );\n}\n\nfunction pickPrice(node: ProductNode): { amount: number; currency: string } | null {\n const offer: Offer | undefined = Array.isArray(node.offers) ? node.offers[0] : node.offers;\n if (!offer) return null;\n const raw = offer.price;\n const num =\n typeof raw === 'number' ? raw : typeof raw === 'string' ? Number.parseFloat(raw) : Number.NaN;\n if (!Number.isFinite(num)) return null;\n return { amount: num, currency: offer.priceCurrency || 'USD' };\n}\n\nfunction formatPrice(amount: number, currency: string): string | null {\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount);\n } catch (err) {\n console.warn('[adaptive-product.bind] jsonld: Intl.NumberFormat failed', { currency }, err);\n return null;\n }\n}\n\nexport async function resolveJsonLdPrice(\n input: JsonLdPriceBind,\n signal: AbortSignal\n): Promise<string | null> {\n const scripts = input.url\n ? await collectScriptsFromUrl(input.url, signal)\n : collectInlineScripts();\n const product = parseScripts(scripts);\n if (!product) return null;\n const picked = pickPrice(product);\n return picked ? formatPrice(picked.amount, picked.currency) : null;\n}\n\nexport async function resolveJsonLdImage(\n input: JsonLdImageBind,\n signal: AbortSignal\n): Promise<string | null> {\n const scripts = input.url\n ? await collectScriptsFromUrl(input.url, signal)\n : collectInlineScripts();\n const product = parseScripts(scripts);\n if (!product) return null;\n const img = Array.isArray(product.image) ? product.image[0] : product.image;\n return typeof img === 'string' && img.length > 0 ? img : null;\n}\n", "import type { ImageBind } from '../schema-primitives';\n\ntype OgBind = Extract<ImageBind, { type: 'opengraph' }>;\n\nexport async function resolveOpenGraphImage(\n input: OgBind,\n signal: AbortSignal\n): Promise<string | null> {\n const res = await fetch(input.url, { signal });\n if (!res.ok) return null;\n const text = await res.text();\n const doc = new DOMParser().parseFromString(text, 'text/html');\n const meta = doc.querySelector('meta[property=\"og:image\"]') as HTMLMetaElement | null;\n const raw = meta?.getAttribute('content');\n if (!raw) return null;\n try {\n return new URL(raw, input.url).toString();\n } catch {\n return null;\n }\n}\n", "import type { ImageBind, PriceBind } from '../schema-primitives';\n\ntype ShopifyAjaxPriceBind = Extract<PriceBind, { type: 'shopify-ajax' }>;\ntype ShopifyAjaxImageBind = Extract<ImageBind, { type: 'shopify-ajax' }>;\n\ninterface ShopifyProductPayload {\n price?: number; // cents (Shopify minor units)\n currency?: string; // ISO code; \"USD\" by default in Shopify's AJAX API\n images?: string[];\n}\n\nfunction originFor(base: string | undefined): string {\n if (base) return base.replace(/\\/$/, '');\n return typeof location !== 'undefined' ? location.origin : '';\n}\n\nasync function fetchProduct(\n handle: string,\n base: string | undefined,\n signal: AbortSignal\n): Promise<ShopifyProductPayload | null> {\n const url = `${originFor(base)}/products/${encodeURIComponent(handle)}.js`;\n const res = await fetch(url, { signal });\n if (!res.ok) return null;\n try {\n return (await res.json()) as ShopifyProductPayload;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') throw err;\n console.warn('[adaptive-product.bind] shopify-ajax: json parse failed', err);\n return null;\n }\n}\n\nexport async function resolveShopifyAjaxPrice(\n input: ShopifyAjaxPriceBind,\n signal: AbortSignal\n): Promise<string | null> {\n const payload = await fetchProduct(input.handle, input.base, signal);\n if (!payload || typeof payload.price !== 'number') return null;\n const currency = payload.currency || 'USD';\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(\n payload.price / 100\n );\n } catch (err) {\n console.warn(\n '[adaptive-product.bind] shopify-ajax/price: Intl.NumberFormat failed',\n { currency },\n err\n );\n return null;\n }\n}\n\nexport async function resolveShopifyAjaxImage(\n input: ShopifyAjaxImageBind,\n signal: AbortSignal\n): Promise<string | null> {\n const payload = await fetchProduct(input.handle, input.base, signal);\n const first = payload?.images?.[0];\n return typeof first === 'string' && first.length > 0 ? first : null;\n}\n", "import type { PriceBind } from '../schema-primitives';\n\ntype WooPriceBind = Extract<PriceBind, { type: 'woocommerce-store-api' }>;\n\ninterface WooStoreProduct {\n id: number;\n slug: string;\n prices?: {\n price?: string;\n currency_code?: string;\n currency_minor_unit?: number;\n };\n}\n\nfunction originFor(base: string | undefined): string {\n if (base) return base.replace(/\\/$/, '');\n return typeof location !== 'undefined' ? location.origin : '';\n}\n\nexport async function resolveWooStoreApiPrice(\n input: WooPriceBind,\n signal: AbortSignal\n): Promise<string | null> {\n const url = `${originFor(input.base)}/wp-json/wc/store/products?slug=${encodeURIComponent(input.slug)}`;\n const res = await fetch(url, { signal });\n if (!res.ok) return null;\n let body: WooStoreProduct[];\n try {\n body = (await res.json()) as WooStoreProduct[];\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') throw err;\n console.warn('[adaptive-product.bind] woocommerce-store-api: json parse failed', err);\n return null;\n }\n const product = Array.isArray(body) ? body.find((p) => p.slug === input.slug) : undefined;\n const prices = product?.prices;\n if (!prices || typeof prices.price !== 'string') return null;\n const minor = prices.currency_minor_unit ?? 2;\n const raw = Number.parseInt(prices.price, 10);\n if (!Number.isFinite(raw)) return null;\n const amount = raw / 10 ** minor;\n const currency = prices.currency_code || 'USD';\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount);\n } catch (err) {\n console.warn(\n '[adaptive-product.bind] woocommerce-store-api: Intl.NumberFormat failed',\n { currency },\n err\n );\n return null;\n }\n}\n", "import type { ImageBind, PriceBind } from '../schema-primitives';\nimport { resolveDomSelectorImage, resolveDomSelectorPrice } from './dom-selector';\nimport { resolveJsonLdImage, resolveJsonLdPrice } from './jsonld';\nimport { resolveOpenGraphImage } from './opengraph';\nimport { resolveShopifyAjaxImage, resolveShopifyAjaxPrice } from './shopify-ajax';\nimport type { BindResult } from './types';\nimport { resolveWooStoreApiPrice } from './woocommerce-store-api';\n\nexport async function resolvePriceBind(input: PriceBind, signal: AbortSignal): Promise<BindResult> {\n try {\n switch (input.type) {\n case 'dom-selector':\n return await resolveDomSelectorPrice(input, signal);\n case 'shopify-ajax':\n return await resolveShopifyAjaxPrice(input, signal);\n case 'woocommerce-store-api':\n return await resolveWooStoreApiPrice(input, signal);\n case 'jsonld':\n return await resolveJsonLdPrice(input, signal);\n default:\n return null;\n }\n } catch (err) {\n if (!(err instanceof Error && err.name === 'AbortError')) {\n console.warn(`[adaptive-product.bind] price/${input.type}:`, err);\n }\n return null;\n }\n}\n\nexport async function resolveImageBind(input: ImageBind, signal: AbortSignal): Promise<BindResult> {\n try {\n switch (input.type) {\n case 'dom-selector':\n return await resolveDomSelectorImage(input, signal);\n case 'shopify-ajax':\n return await resolveShopifyAjaxImage(input, signal);\n case 'opengraph':\n return await resolveOpenGraphImage(input, signal);\n case 'jsonld':\n return await resolveJsonLdImage(input, signal);\n default:\n return null;\n }\n } catch (err) {\n if (!(err instanceof Error && err.name === 'AbortError')) {\n console.warn(`[adaptive-product.bind] image/${input.type}:`, err);\n }\n return null;\n }\n}\n\nexport type { BindResult, ImageResolver, PriceResolver } from './types';\n", "import type { Product } from '../schema-primitives';\nimport { resolveImageBind, resolvePriceBind } from './index';\n\nexport type BindCallback = (\n productId: string,\n kind: 'image' | 'price',\n value: string | null\n) => void;\n\nexport class BindController {\n #abort = new AbortController();\n #pending: Promise<void>[] = [];\n #destroyed = false;\n\n constructor(\n private readonly products: readonly Product[],\n private readonly callback: BindCallback\n ) {}\n\n start(): void {\n for (const product of this.products) {\n if (product.image.bind) {\n this.#pending.push(this.#resolveImage(product.id, product.image.bind));\n }\n if (product.price?.bind) {\n this.#pending.push(this.#resolvePrice(product.id, product.price.bind));\n }\n }\n }\n\n async allSettled(): Promise<void> {\n await Promise.allSettled(this.#pending);\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n this.#abort.abort();\n }\n\n async #resolveImage(\n productId: string,\n bind: NonNullable<Product['image']['bind']>\n ): Promise<void> {\n const value = await resolveImageBind(bind, this.#abort.signal);\n if (this.#destroyed) return;\n this.callback(productId, 'image', value);\n }\n\n async #resolvePrice(\n productId: string,\n bind: NonNullable<NonNullable<Product['price']>['bind']>\n ): Promise<void> {\n const value = await resolvePriceBind(bind, this.#abort.signal);\n if (this.#destroyed) return;\n this.callback(productId, 'price', value);\n }\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\n\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n // SVG elements (for inline Lucide icons in config HTML)\n 'svg',\n 'path',\n 'circle',\n 'line',\n 'polyline',\n 'polygon',\n 'rect',\n 'g',\n]);\n\nexport function sanitizeHtml(html: string): string {\n // Try native Sanitizer API first\n const hasNative = typeof (window as any).Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new (window as any).Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n } catch {\n // Fall through to manual sanitizer\n }\n }\n\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tag = el.tagName.toLowerCase();\n\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n\n return tpl.innerHTML;\n}\n", "import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { BindController } from '../bind/controller';\nimport { sanitizeHtml } from '../sanitizer';\nimport { type ComparisonProps, comparisonSchema } from '../schema';\nimport type { Product } from '../schema-primitives';\n\ntype RowId = string;\ntype ResolvedMap = Record<string, { image?: string; price?: string }>;\n\nexport class ProductComparisonLit extends LitElement {\n static override properties = {\n props: { attribute: false },\n open: { state: true },\n resolved: { state: true },\n validationError: { state: true },\n };\n\n props: ComparisonProps | undefined = undefined;\n open = new Set<RowId>();\n resolved: ResolvedMap = {};\n validationError = false;\n\n #controller: BindController | undefined;\n #parsed: ComparisonProps | undefined;\n\n override createRenderRoot() {\n return this;\n }\n\n override willUpdate(changed: Map<string, unknown>): void {\n if (changed.has('props')) {\n this.#startBind();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#controller?.destroy();\n }\n\n #startBind(): void {\n this.#controller?.destroy();\n this.resolved = {};\n if (!this.props) {\n this.validationError = false;\n this.#parsed = undefined;\n return;\n }\n const result = comparisonSchema.safeParse(this.props);\n if (!result.success) {\n this.validationError = true;\n this.#parsed = undefined;\n console.warn('[adaptive-product] invalid comparison props:', result.error.issues);\n return;\n }\n this.validationError = false;\n this.#parsed = result.data;\n this.open = new Set(\n typeof result.data.defaultExpandedIndex === 'number'\n ? ([result.data.products[result.data.defaultExpandedIndex]?.id].filter(Boolean) as string[])\n : []\n );\n this.#controller = new BindController(result.data.products, (productId, kind, value) => {\n if (value == null) return;\n this.resolved = {\n ...this.resolved,\n [productId]: { ...this.resolved[productId], [kind]: value },\n };\n });\n this.#controller.start();\n }\n\n #toggle(id: RowId): void {\n if (!this.#parsed) return;\n const next = new Set(this.open);\n if (next.has(id)) {\n next.delete(id);\n } else {\n if (this.#parsed.expandBehavior === 'accordion') next.clear();\n next.add(id);\n }\n this.open = next;\n }\n\n #onHeaderKey(id: RowId, e: KeyboardEvent): void {\n if (e.key === 'Escape' && this.open.has(id)) {\n const next = new Set(this.open);\n next.delete(id);\n this.open = next;\n e.preventDefault();\n }\n }\n\n override render(): TemplateResult | typeof nothing {\n if (this.validationError || !this.#parsed) return html``;\n const parsed = this.#parsed;\n return html`\n <section class=\"sc-product-comparison\">\n ${\n parsed.heading\n ? html`<h2\n class=\"sc-product-comparison__heading\"\n data-comparison-heading\n >${parsed.heading}</h2>`\n : nothing\n }\n <ul class=\"sc-product-comparison__rows\">\n ${parsed.products.map((p) => this.#renderRow(p))}\n </ul>\n </section>\n `;\n }\n\n #renderRow(product: Product): TemplateResult {\n const expanded = this.open.has(product.id);\n const regionId = `sc-cmp-${product.id}-panel`;\n const resolved = this.resolved[product.id];\n const imgSrc = resolved?.image ?? product.image.src;\n const priceText = resolved?.price ?? product.price?.amount;\n const primary = product.ctas[0];\n return html`\n <li\n class=\"sc-product-comparison__row\"\n data-comparison-row\n data-product-id=${product.id}\n data-expanded=${expanded ? 'true' : 'false'}\n >\n <div class=\"sc-product-comparison__row-inner\">\n <button\n class=\"sc-product-comparison__header\"\n data-comparison-header\n type=\"button\"\n aria-expanded=${expanded ? 'true' : 'false'}\n aria-controls=${regionId}\n @click=${() => this.#toggle(product.id)}\n @keydown=${(e: KeyboardEvent) => this.#onHeaderKey(product.id, e)}\n >\n <img\n class=\"sc-product-comparison__thumb\"\n src=${imgSrc}\n alt=${product.image.alt}\n loading=\"lazy\"\n style=\"width:48px;height:48px;object-fit:cover;border-radius:6px;flex-shrink:0;\"\n />\n <span class=\"sc-product-comparison__name\">${product.name}</span>\n ${\n product.price\n ? html`<span class=\"sc-product-comparison__price\"\n >${priceText}${\n product.price.cadence ? html` <small>${product.price.cadence}</small>` : nothing\n }</span\n >`\n : nothing\n }\n ${\n product.framing\n ? html`<span\n class=\"sc-product-comparison__framing\"\n .innerHTML=${sanitizeHtml(product.framing)}\n ></span>`\n : nothing\n }\n </button>\n <span class=\"sc-product-comparison__primary-cta\" data-product-cta=\"primary\">\n <a\n href=${primary.href ?? '#'}\n target=${primary.target}\n rel=${primary.target === '_blank' ? 'noopener noreferrer' : ''}\n data-action-id=${primary.actionId ?? ''}\n data-variant=${primary.variant}\n >${primary.label}</a\n >\n </span>\n </div>\n ${\n expanded\n ? html`<div class=\"sc-product-comparison__panel\" id=${regionId} role=\"region\">\n ${\n product.attributes && product.attributes.length > 0\n ? html`<ul class=\"sc-product-comparison__attrs\">\n ${product.attributes.map(\n (a) => html`<li data-attribute-emphasis=${a.emphasis ? 'true' : 'false'}>\n <span>${a.label}</span><span>${a.value}</span>\n </li>`\n )}\n </ul>`\n : nothing\n }\n ${\n product.ctas[1]\n ? html`<a\n class=\"sc-product-comparison__secondary-cta\"\n data-product-cta=\"secondary\"\n href=${product.ctas[1].href ?? '#'}\n target=${product.ctas[1].target}\n rel=${product.ctas[1].target === '_blank' ? 'noopener noreferrer' : ''}\n data-action-id=${product.ctas[1].actionId ?? ''}\n data-variant=${product.ctas[1].variant}\n >${product.ctas[1].label}</a\n >`\n : nothing\n }\n </div>`\n : nothing\n }\n </li>\n `;\n }\n}\n", "import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { BindController } from '../bind/controller';\nimport { type GridProps, gridSchema } from '../schema';\nimport { renderProductCard } from './ProductCardLit';\n\nexport class ProductGridLit extends LitElement {\n static override properties = {\n props: { attribute: false },\n resolved: { state: true },\n validationError: { state: true },\n };\n\n props: GridProps | undefined = undefined;\n resolved: Record<string, { image?: string; price?: string }> = {};\n validationError = false;\n\n #controller: BindController | undefined;\n\n override createRenderRoot() {\n return this;\n }\n\n override willUpdate(changed: Map<string, unknown>): void {\n if (changed.has('props')) {\n this.#startBind();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#controller?.destroy();\n }\n\n #startBind(): void {\n this.#controller?.destroy();\n this.resolved = {};\n if (!this.props) {\n this.validationError = false;\n return;\n }\n const result = gridSchema.safeParse(this.props);\n if (!result.success) {\n this.validationError = true;\n console.warn('[adaptive-product] invalid grid props:', result.error.issues);\n return;\n }\n this.validationError = false;\n this.#controller = new BindController(result.data.products, (productId, kind, value) => {\n if (value == null) return;\n this.resolved = {\n ...this.resolved,\n [productId]: { ...this.resolved[productId], [kind]: value },\n };\n });\n this.#controller.start();\n }\n\n override render(): TemplateResult | typeof nothing {\n if (this.validationError || !this.props) return html``;\n const parsed = gridSchema.safeParse(this.props);\n if (!parsed.success) return html``;\n const { products, desktopColumns, heading } = parsed.data;\n return html`\n <section class=\"sc-product-grid\">\n ${\n heading\n ? html`<h2 data-grid-heading class=\"sc-product-grid__heading\">${heading}</h2>`\n : nothing\n }\n <div\n data-grid-root\n class=\"sc-product-grid__cells\"\n style=${`--sc-product-grid-cols:${desktopColumns}`}\n >\n ${products.map(\n (p) => html`<div data-grid-cell class=\"sc-product-grid__cell\">\n ${renderProductCard(p, 'standard', this.resolved[p.id])}\n </div>`\n )}\n </div>\n </section>\n `;\n }\n}\n", "import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { BindController } from '../bind/controller';\nimport { sanitizeHtml } from '../sanitizer';\nimport { type HeroProps, heroSchema } from '../schema';\n\nexport class ProductHeroLit extends LitElement {\n static override properties = {\n props: { attribute: false },\n resolved: { state: true },\n validationError: { state: true },\n };\n\n props: HeroProps | undefined = undefined;\n resolved: Record<string, { image?: string; price?: string }> = {};\n validationError = false;\n\n #controller: BindController | undefined;\n\n override createRenderRoot() {\n return this;\n }\n\n override willUpdate(changed: Map<string, unknown>): void {\n if (changed.has('props')) {\n this.#startBind();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#controller?.destroy();\n }\n\n #startBind(): void {\n this.#controller?.destroy();\n this.resolved = {};\n if (!this.props) {\n this.validationError = false;\n return;\n }\n const result = heroSchema.safeParse(this.props);\n if (!result.success) {\n this.validationError = true;\n console.warn('[adaptive-product] invalid hero props:', result.error.issues);\n return;\n }\n this.validationError = false;\n this.#controller = new BindController([result.data.product], (productId, kind, value) => {\n if (value == null) return;\n this.resolved = {\n ...this.resolved,\n [productId]: { ...this.resolved[productId], [kind]: value },\n };\n });\n this.#controller.start();\n }\n\n override render(): TemplateResult | typeof nothing {\n if (this.validationError || !this.props) return html``;\n const parsed = heroSchema.safeParse(this.props);\n if (!parsed.success) return html``;\n const { product, layout, longCopy } = parsed.data;\n const resolved = this.resolved[product.id];\n const imgSrc = resolved?.image ?? product.image.src;\n const priceText = resolved?.price ?? product.price?.amount;\n // Constrain image to thumbnail size \u2014 hero is \"marketing-scale\" by\n // longCopy + framing weight, not by image size. Default thumb sits\n // beside the content (image-left / image-right) or as a slim banner\n // strip on top (image-top).\n const isTopLayout = layout === 'image-top';\n const sectionStyles = isTopLayout\n ? 'display:block;'\n : `display:flex;flex-direction:${layout === 'image-right' ? 'row-reverse' : 'row'};gap:1rem;align-items:flex-start;`;\n const imageStyles = isTopLayout\n ? 'width:100%;max-height:160px;object-fit:cover;border-radius:8px;display:block;margin-bottom:0.75rem;'\n : 'width:128px;height:128px;object-fit:cover;border-radius:8px;flex-shrink:0;';\n const contentStyles = isTopLayout ? '' : 'flex:1;min-width:0;';\n return html`\n <section class=\"sc-product-hero\" data-hero-layout=${layout} style=${sectionStyles}>\n <img\n class=\"sc-product-hero__image\"\n src=${imgSrc}\n alt=${product.image.alt}\n loading=\"lazy\"\n style=${imageStyles}\n />\n <div class=\"sc-product-hero__content\" style=${contentStyles}>\n <h2 class=\"sc-product-hero__name\">${product.name}</h2>\n ${\n product.tagline\n ? html`<p class=\"sc-product-hero__tagline\">${product.tagline}</p>`\n : nothing\n }\n ${\n product.price\n ? html`<p class=\"sc-product-hero__price\">\n ${priceText}${\n product.price.cadence ? html` <small>${product.price.cadence}</small>` : nothing\n }\n </p>`\n : nothing\n }\n ${\n longCopy\n ? html`<div\n data-hero-longcopy\n class=\"sc-product-hero__longcopy\"\n .innerHTML=${sanitizeHtml(longCopy)}\n ></div>`\n : nothing\n }\n <div class=\"sc-product-hero__ctas\">\n ${product.ctas.map(\n (c, i) => html`<a\n class=\"sc-product-hero__cta\"\n data-product-cta=${i === 0 ? 'primary' : 'secondary'}\n data-variant=${c.variant}\n href=${c.href ?? '#'}\n target=${c.target}\n rel=${c.target === '_blank' ? 'noopener noreferrer' : ''}\n >${c.label}</a\n >`\n )}\n </div>\n </div>\n </section>\n `;\n }\n}\n", "/**\n * adaptive-product \u2014 Runtime manifest\n *\n * Exports the runtime descriptor consumed by the SDK's AppLoader.\n * Registers the four <syntro-product-*> custom elements as a side effect\n * of importing this module, and exposes widget mountables used by\n * SmartCanvasRuntime's WidgetRegistry.\n */\n\nimport { type MountPlumbing, stripMountPlumbing } from '@syntrologie/sdk-contracts';\nimport type { CardProps, ComparisonProps, GridProps, HeroProps } from './schema';\nimport { ProductCardLit } from './widgets/ProductCardLit';\nimport { ProductComparisonLit } from './widgets/ProductComparisonLit';\nimport { ProductGridLit } from './widgets/ProductGridLit';\nimport { ProductHeroLit } from './widgets/ProductHeroLit';\n\nconst TAGS = {\n card: 'syntro-product-card',\n comparison: 'syntro-product-comparison',\n hero: 'syntro-product-hero',\n grid: 'syntro-product-grid',\n} as const;\n\nif (typeof customElements !== 'undefined') {\n if (!customElements.get(TAGS.card)) customElements.define(TAGS.card, ProductCardLit);\n if (!customElements.get(TAGS.comparison))\n customElements.define(TAGS.comparison, ProductComparisonLit);\n if (!customElements.get(TAGS.hero)) customElements.define(TAGS.hero, ProductHeroLit);\n if (!customElements.get(TAGS.grid)) customElements.define(TAGS.grid, ProductGridLit);\n}\n\nfunction makeMountable<P extends object>(tag: string) {\n return {\n mount(container: HTMLElement, config?: (P & MountPlumbing) | null | undefined) {\n const widgetProps = stripMountPlumbing<P>(config ?? null);\n const el = document.createElement(tag) as HTMLElement & { props?: unknown };\n el.props = widgetProps;\n container.appendChild(el);\n return () => el.remove();\n },\n };\n}\n\nexport const ProductCardMountable = makeMountable<CardProps>(TAGS.card);\nexport const ProductComparisonMountable = makeMountable<ComparisonProps>(TAGS.comparison);\nexport const ProductHeroMountable = makeMountable<HeroProps>(TAGS.hero);\nexport const ProductGridMountable = makeMountable<GridProps>(TAGS.grid);\n\nexport const runtime = {\n id: 'adaptive-product',\n version: '1.0.0',\n name: 'Product',\n description:\n 'Product surfaces: cards, side-by-side comparisons, featured hero, and grid lists. Optional bind for price/image to host-page sources (DOM, Shopify, WooCommerce, JSON-LD, OpenGraph).',\n executors: [],\n widgets: [\n {\n id: 'adaptive-product:card',\n component: ProductCardMountable,\n metadata: {\n name: 'Product Card',\n description: 'Single product card',\n icon: '\uD83D\uDECD\uFE0F',\n },\n },\n {\n id: 'adaptive-product:comparison',\n component: ProductComparisonMountable,\n metadata: {\n name: 'Product Comparison',\n description: '2\u20134 products, expandable rows',\n icon: '\u2696\uFE0F',\n },\n },\n {\n id: 'adaptive-product:hero',\n component: ProductHeroMountable,\n metadata: {\n name: 'Product Hero',\n description: 'Featured product with long copy',\n icon: '\u2B50',\n },\n },\n {\n id: 'adaptive-product:grid',\n component: ProductGridMountable,\n metadata: {\n name: 'Product Grid',\n description: '2\u201312 products in a grid',\n icon: '\uD83D\uDDC2\uFE0F',\n },\n },\n ],\n};\n\nexport default runtime;\n"],
5
- "mappings": "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",
6
- "names": ["originFor", "html", "html", "LitElement", "nothing", "_controller", "startBind_fn", "LitElement", "html", "nothing", "html", "LitElement", "nothing", "_controller", "startBind_fn", "LitElement", "html", "nothing", "html", "LitElement", "nothing", "_controller", "startBind_fn", "LitElement", "html", "nothing"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/schema.ts", "../src/schema-primitives.ts"],
4
- "sourcesContent": ["import { z } from 'zod';\nimport { productSchema } from './schema-primitives';\n\n// Top-level schemas use Zod's default `.strip()` mode so the runtime-injected\n// fields ``chromeless`` and ``instanceId`` that SyntroTileCard adds to every\n// widget mount don't fail validation. The inner ``productSchema`` remains\n// strict \u2014 that's the actual product contract, and unknown fields there\n// would signal author error rather than runtime envelope leakage.\n// Keys the LLM may include in `visibleFacts` to curate which baked facts\n// render on a card. `name` / `image` / `ctas` are identity + PDP CTA and\n// always show \u2014 they're not toggleable. Omitting `visibleFacts` renders\n// every populated block (back-compat for configs that never opted in).\nexport const VISIBLE_FACT_KEYS = [\n 'tagline',\n 'price',\n 'rating',\n 'availability',\n 'badge',\n 'specs',\n 'framing',\n] as const;\n\nexport type VisibleFactKey = (typeof VISIBLE_FACT_KEYS)[number];\n\nexport const cardSchema = z.object({\n product: productSchema,\n density: z.enum(['compact', 'standard']).default('standard'),\n /**\n * LLM-curated subset of facts to render, in author order. When omitted,\n * the card renders every populated block. When set, only listed keys\n * render (plus the always-shown identity + CTAs). List order = render\n * order \u2014 `[\"rating\", \"price\"]` and `[\"price\", \"rating\"]` produce\n * different layouts.\n */\n visibleFacts: z.array(z.enum(VISIBLE_FACT_KEYS)).max(VISIBLE_FACT_KEYS.length).optional(),\n});\n\nexport const comparisonSchema = z.object({\n products: z.array(productSchema).min(2).max(4),\n defaultExpandedIndex: z.number().int().min(0).optional(),\n expandBehavior: z.enum(['multi', 'accordion']).default('multi'),\n heading: z.string().optional(),\n});\n\nexport const heroSchema = z.object({\n product: productSchema,\n layout: z.enum(['image-left', 'image-right', 'image-top']).default('image-left'),\n longCopy: z.string().max(800).optional(),\n});\n\nexport const gridSchema = z.object({\n products: z.array(productSchema).min(2).max(12),\n desktopColumns: z.union([z.literal(2), z.literal(3)]).default(3),\n heading: z.string().optional(),\n});\n\nexport type CardProps = z.infer<typeof cardSchema>;\nexport type ComparisonProps = z.infer<typeof comparisonSchema>;\nexport type HeroProps = z.infer<typeof heroSchema>;\nexport type GridProps = z.infer<typeof gridSchema>;\n\nexport const tileWidgets = [\n { widget: 'adaptive-product:card', defName: 'productCardProps', propsSchema: cardSchema },\n {\n widget: 'adaptive-product:comparison',\n defName: 'productComparisonProps',\n propsSchema: comparisonSchema,\n },\n { widget: 'adaptive-product:hero', defName: 'productHeroProps', propsSchema: heroSchema },\n { widget: 'adaptive-product:grid', defName: 'productGridProps', propsSchema: gridSchema },\n] as const;\n\nexport type { ImageBind, PriceBind, Product } from './schema-primitives';\nexport { productSchema } from './schema-primitives';\n", "// src/schema-primitives.ts\nimport { z } from 'zod';\n\nconst SAFE_HREF_PATTERN =\n /^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\\/\\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)/;\n\nexport const HrefZ = z\n .string()\n .min(1)\n .regex(SAFE_HREF_PATTERN, {\n message:\n 'href must start with /, ./, ../, #, ?, http(s)://, mailto:, or tel: \u2014 javascript:, data:, and vbscript: are not allowed',\n })\n .refine(\n (s) => {\n try {\n const parsed = new URL(s, 'https://syntro.local/');\n return ['http:', 'https:', 'mailto:', 'tel:'].includes(parsed.protocol);\n } catch {\n return false;\n }\n },\n { message: 'href resolves to an unsupported protocol' }\n );\n\nexport const PriceBindZ = z.discriminatedUnion('type', [\n z.object({ type: z.literal('dom-selector'), selector: z.string().min(1) }).strict(),\n z\n .object({ type: z.literal('shopify-ajax'), handle: z.string().min(1), base: HrefZ.optional() })\n .strict(),\n z\n .object({\n type: z.literal('woocommerce-store-api'),\n slug: z.string().min(1),\n base: HrefZ.optional(),\n })\n .strict(),\n z.object({ type: z.literal('jsonld'), url: HrefZ.optional() }).strict(),\n]);\n\nexport const ImageBindZ = z.discriminatedUnion('type', [\n z.object({ type: z.literal('dom-selector'), selector: z.string().min(1) }).strict(),\n z\n .object({ type: z.literal('shopify-ajax'), handle: z.string().min(1), base: HrefZ.optional() })\n .strict(),\n z.object({ type: z.literal('opengraph'), url: HrefZ }).strict(),\n z.object({ type: z.literal('jsonld'), url: HrefZ.optional() }).strict(),\n]);\n\n// ---------------------------------------------------------------------------\n// productSchema v2 \u2014 Google Merchant Center / schema.org/Product alignment\n//\n// Layered model:\n// 1. Strict typed core (id, name, image, price, ctas) \u2014 rendering depends on\n// these; unchanged from v1.\n// 2. Common typed optional (brand, availability, salePrice, rating) \u2014 widely\n// reused across product types; renderers know what to do with them.\n// 3. `specs[]` \u2014 open spec table modelled on Google's `product_detail[]` /\n// schema.org's `additionalProperty`. Arbitrary `{section, name, value}`\n// triples for category-specific facts. Cards group by section.\n// 4. `labels{}` \u2014 Google `custom_label_0..4` style: free-form targeting\n// data the renderer ignores and the targeting layer reads.\n//\n// `attributes[]` from v1 is preserved as an optional, deprecated field so\n// existing configs keep working. Renderers should treat it as a synthetic\n// \"About\" spec section. New configs should use `specs[]`.\n// ---------------------------------------------------------------------------\n\nconst specRowSchema = z\n .object({\n section: z.string().min(1).describe('Section header \u2014 \"Supplement Facts\", \"Shipping\", etc.'),\n name: z.string().min(1).describe('Attribute name \u2014 \"Vitamin D3\", \"Lead time\"'),\n value: z.string().describe('Attribute value as a string \u2014 \"5000\", \"2\"'),\n unit: z\n .string()\n .optional()\n .describe('Unit suffix shown small next to value \u2014 \"IU\", \"mg\", \"days\"'),\n emphasis: z.boolean().default(false),\n priority: z\n .number()\n .optional()\n .describe('Higher = more important. Compact cards show top N by priority.'),\n })\n .strict();\n\nexport const productSchema = z\n .object({\n // \u2500\u2500 Tier 1: strict typed core \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n id: z.string().min(1).describe('Stable identifier for analytics and dedup'),\n name: z.string().min(1),\n tagline: z.string().optional(),\n image: z\n .object({\n src: HrefZ,\n alt: z.string(),\n bind: ImageBindZ.optional(),\n })\n .strict(),\n price: z\n .object({\n amount: z.string(),\n cadence: z.string().optional(),\n bind: PriceBindZ.optional(),\n })\n .strict()\n .optional(),\n badge: z\n .object({\n label: z.string(),\n tone: z.enum(['neutral', 'primary', 'success', 'warning']).default('neutral'),\n })\n .strict()\n .optional(),\n framing: z.string().max(280).optional(),\n ctas: z\n .array(\n z\n .object({\n label: z.string().min(1),\n href: HrefZ.optional(),\n target: z.enum(['_self', '_blank']).default('_self'),\n variant: z.enum(['primary', 'secondary', 'ghost']).default('primary'),\n actionId: z.string().optional(),\n })\n .strict()\n )\n .min(1)\n .max(2),\n\n // \u2500\u2500 Tier 2: common typed optional (mirrors GMC / schema.org Offer) \u2500\n /** Cross-platform product identifiers. SKU/GTIN/MPN per GMC; platform handles for bind auto-resolution. */\n identifiers: z\n .object({\n sku: z.string().optional(),\n gtin: z.string().optional(),\n mpn: z.string().optional(),\n shopifyHandle: z.string().optional(),\n wooSlug: z.string().optional(),\n })\n .strict()\n .optional(),\n brand: z.string().optional(),\n /** GMC availability enum \u2014 drives default badge if no explicit badge set. */\n availability: z.enum(['in_stock', 'preorder', 'backorder', 'out_of_stock']).optional(),\n /** Strikethrough source price. `price` becomes the \"was\" value when this is set. */\n salePrice: z\n .object({\n amount: z.string(),\n cadence: z.string().optional(),\n validUntil: z.string().datetime().optional(),\n bind: PriceBindZ.optional(),\n })\n .strict()\n .optional(),\n /** AggregateRating \u2014 value, count, optional max (defaults to 5). */\n rating: z\n .object({\n value: z.number().min(0),\n count: z.number().int().min(0),\n max: z.number().default(5),\n })\n .strict()\n .optional(),\n\n // \u2500\u2500 Tier 3: open spec table (Google product_detail / schema.org additionalProperty) \u2500\u2500\n /** Category-specific spec rows grouped by section. Renderers show as grouped tables. */\n specs: z.array(specRowSchema).max(32).optional(),\n\n // \u2500\u2500 Tier 4: passthrough targeting labels (Google custom_label_*) \u2500\u2500\u2500\n /** Flat record of targeting/segmentation labels. Renderer ignores; targeting layer reads. */\n labels: z.record(z.union([z.string(), z.number(), z.boolean()])).optional(),\n\n // \u2500\u2500 Deprecated: v1 flat attributes (renderers shim into a synthetic \"About\" spec section) \u2500\u2500\n /** @deprecated Use `specs[]` with `section: \"About\"`. Retained for backward compatibility. */\n attributes: z\n .array(\n z\n .object({\n label: z.string(),\n value: z.string(),\n emphasis: z.boolean().default(false),\n })\n .strict()\n )\n .max(8)\n .optional(),\n })\n .strict();\n\nexport type Product = z.infer<typeof productSchema>;\nexport type PriceBind = z.infer<typeof PriceBindZ>;\nexport type ImageBind = z.infer<typeof ImageBindZ>;\n"],
5
- "mappings": "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",
6
- "names": ["z", "z"]
7
- }