@syntrologie/adapt-product 2.8.0-canary.245
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bind/controller.d.ts +12 -0
- package/dist/bind/controller.d.ts.map +1 -0
- package/dist/bind/dom-selector.d.ts +11 -0
- package/dist/bind/dom-selector.d.ts.map +1 -0
- package/dist/bind/index.d.ts +6 -0
- package/dist/bind/index.d.ts.map +1 -0
- package/dist/bind/jsonld.d.ts +11 -0
- package/dist/bind/jsonld.d.ts.map +1 -0
- package/dist/bind/opengraph.d.ts +7 -0
- package/dist/bind/opengraph.d.ts.map +1 -0
- package/dist/bind/shopify-ajax.d.ts +11 -0
- package/dist/bind/shopify-ajax.d.ts.map +1 -0
- package/dist/bind/types.d.ts +7 -0
- package/dist/bind/types.d.ts.map +1 -0
- package/dist/bind/woocommerce-store-api.d.ts +7 -0
- package/dist/bind/woocommerce-store-api.d.ts.map +1 -0
- package/dist/cdn.d.ts +30 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/cdn.js +34 -0
- package/dist/cdn.js.map +7 -0
- package/dist/chunk-E2IVTQMX.js +1100 -0
- package/dist/chunk-E2IVTQMX.js.map +7 -0
- package/dist/chunk-SM35E4R3.js +126 -0
- package/dist/chunk-SM35E4R3.js.map +7 -0
- package/dist/runtime.d.ts +567 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +18 -0
- package/dist/runtime.js.map +7 -0
- package/dist/sanitizer.d.ts +8 -0
- package/dist/sanitizer.d.ts.map +1 -0
- package/dist/schema-primitives.d.ts +414 -0
- package/dist/schema-primitives.d.ts.map +1 -0
- package/dist/schema.d.ts +3645 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +17 -0
- package/dist/schema.js.map +7 -0
- package/dist/theme.d.ts +9 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/widgets/ProductCardLit.d.ts +32 -0
- package/dist/widgets/ProductCardLit.d.ts.map +1 -0
- package/dist/widgets/ProductComparisonLit.d.ts +33 -0
- package/dist/widgets/ProductComparisonLit.d.ts.map +1 -0
- package/dist/widgets/ProductGridLit.d.ts +27 -0
- package/dist/widgets/ProductGridLit.d.ts.map +1 -0
- package/dist/widgets/ProductHeroLit.d.ts +27 -0
- package/dist/widgets/ProductHeroLit.d.ts.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,7 @@
|
|
|
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 title / description / validation\n//\n// These live on every action *during authoring* (LLM produces them; dashboard\n// displays them; reviewers QA-verify with them) but are stripped before the\n// runtime SDK receives the config. Stripping happens server-side in\n// `to_runtime_config` (platform/backend/app/domains/experiments/helpers.py).\n// They appear in the JSON Schema (and therefore in the tactician's prompt)\n// because the LLM needs to know they are valid action properties \u2014 otherwise\n// schema validation would reject what the prompt commands.\n//\n// Each action variant should `.extend(AuthoringFieldsZ)` alongside any\n// triggerWhen/condition extensions. Validation is an ordered list of\n// human-readable step strings \u2014 reviewers scan it as a checklist.\n// =============================================================================\nexport const AuthoringFieldsZ = {\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. */\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 // Navigation\n 'nav.page_view',\n 'nav.page_leave',\n // Derived behavioral signals\n 'behavior.rage_click',\n 'behavior.hesitation',\n 'behavior.confusion',\n];\nexport const CountableEventZ = z\n .enum(COUNTABLE_EVENTS)\n .describe('Event name to count. ui.* = user interactions and behavioral detectors, nav.* = page navigation, behavior.* = derived behavioral signals.');\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 { BindController } from '../bind/controller';\nimport { sanitizeHtml } from '../sanitizer';\nimport { type CardProps, cardSchema } 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 );\n }\n}\n\nexport function renderProductCard(\n product: Product,\n density: 'compact' | 'standard',\n resolved: { image?: string; price?: string } | undefined\n): TemplateResult {\n const imgSrc = resolved?.image ?? product.image.src;\n const priceText = resolved?.price ?? product.price?.amount;\n const showFraming = density === 'standard' && product.framing;\n return html`\n <article class=\"sc-product-card\" data-density=${density}>\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 />\n <header class=\"sc-product-card__header\">\n <h3 class=\"sc-product-card__name\" data-product-name>${product.name}</h3>\n ${\n product.tagline\n ? html`<p class=\"sc-product-card__tagline\" data-product-tagline>${product.tagline}</p>`\n : nothing\n }\n </header>\n ${\n product.price\n ? html`<div class=\"sc-product-card__price\" data-product-price>\n <span class=\"sc-product-card__amount\">${priceText}</span>\n ${\n product.price.cadence\n ? html`<span class=\"sc-product-card__cadence\">${product.price.cadence}</span>`\n : nothing\n }\n </div>`\n : nothing\n }\n ${\n product.badge\n ? 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 : nothing\n }\n ${\n product.attributes.length > 0\n ? html`<ul class=\"sc-product-card__attrs\">\n ${product.attributes.map(\n (a) => html`<li data-attribute-emphasis=${a.emphasis ? 'true' : 'false'}>\n <span class=\"sc-product-card__attr-label\">${a.label}</span>\n <span class=\"sc-product-card__attr-value\">${a.value}</span>\n </li>`\n )}\n </ul>`\n : nothing\n }\n ${\n showFraming\n ? html`<p\n class=\"sc-product-card__framing\"\n .innerHTML=${sanitizeHtml(product.framing ?? '')}\n ></p>`\n : nothing\n }\n <div class=\"sc-product-card__ctas\">\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 </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 />\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.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 return html`\n <section class=\"sc-product-hero\" data-hero-layout=${layout}>\n <img\n class=\"sc-product-hero__image\"\n src=${imgSrc}\n alt=${product.image.alt}\n loading=\"lazy\"\n />\n <div class=\"sc-product-hero__content\">\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": ";;;;;;;;;;;;AAgBO,IAAM,sBAAsB,CAAC,cAAc,WAAW,QAAQ;AAC9D,SAAS,mBAAmB,QAAQ;AACvC,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACvC,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,MAAM,EAAE,GAAG,OAAO;AACxB,aAAW,OAAO,qBAAqB;AACnC,WAAO,IAAI,GAAG;AAAA,EAClB;AACA,SAAO;AACX;;;ACpBA,SAAS,SAAS;AAIX,IAAM,YAAY,EACpB,OAAO;AAAA,EACR,UAAU,EAAE,OAAO;AAAA,EACnB,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC,EACI,OAAO;AAgBL,IAAM,mBAAmB;AAAA,EAC5B,OAAO,EACF,OAAO,EACP,IAAI,GAAG,EACP,SAAS,EACT,SAAS,6GAA6G;AAAA,EAC3H,aAAa,EACR,OAAO,EACP,IAAI,GAAI,EACR,SAAS,EACT,SAAS,wHAAwH;AAAA,EACtI,YAAY,EACP,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,EACzB,IAAI,EAAE,EACN,SAAS,EACT,SAAS,+KAA+K;AACjM;AAMO,IAAM,mBAAmB;AAAA;AAAA,EAE5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AACO,IAAM,kBAAkB,EAC1B,KAAK,gBAAgB,EACrB,SAAS,2IAA2I;AAElJ,IAAM,sBAAsB,CAAC,gBAAgB,cAAc,cAAc;AACzE,IAAM,oBAAoB,EAC5B,KAAK,mBAAmB,EACxB,SAAS,uIAAuI;AAS9I,IAAM,oBAAoB,EAC5B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC1B,KAAK,EAAE,OAAO,EAAE,SAAS,mDAAmD;AAChF,CAAC,EACI,SAAS,0HACwC;AAC/C,IAAM,kBAAkB,EAC1B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,SAAS,EAAE,OAAO,EAAE,SAAS,sCAAsC;AACvE,CAAC,EACI,SAAS,wDAAwD;AAC/D,IAAM,0BAA0B,EAClC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,gBAAgB;AAAA,EAChC,UAAU,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,EAClE,OAAO,EACF,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC,EACrC,SAAS,oEAAoE;AACtF,CAAC,EACI,SAAS,qIAC0E;AACjF,IAAM,0BAA0B,EAClC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,gBAAgB;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,EAC1E,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAC/F,CAAC,EACI,SAAS,8IACsE;AAC7E,IAAM,wBAAwB,EAChC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,cAAc;AAAA,EAC9B,KAAK,EACA,OAAO,EACP,SAAS,gIAAgI;AAAA,EAC9I,OAAO,EAAE,QAAQ,EAAE,SAAS,iCAAiC;AACjE,CAAC,EACI,SAAS,8TAE+F;AACtG,IAAM,qBAAqB,EAC7B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC1B,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EAC3E,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EAC3E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7E,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AACjF,CAAC,EACI,SAAS,uJACoE;AAC3E,IAAM,0BAA0B,EAClC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,gBAAgB;AAAA,EAChC,KAAK;AAAA,EACL,UAAU,EAAE,KAAK,CAAC,OAAO,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,EACjD,WAAW,EAAE,OAAO,EAAE,SAAS,sCAAsC;AACzE,CAAC,EACI,SAAS,qOAEsF;AAC7F,IAAM,sBAAsB,EAC9B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,WAAW;AAAA,EAC3B,KAAK,EAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,EACtE,UAAU,EACL,QAAQ,EACR,SAAS,EACT,SAAS,sDAAsD;AACxE,CAAC,EACI,SAAS,0GAA0G;AACjH,IAAM,2BAA2B,EACnC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,iBAAiB;AAAA,EACjC,KAAK,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,EACvC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAC1F,CAAC,EACI,SAAS,8GAA8G;AACrH,IAAM,2BAA2B,EACnC,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,iBAAiB;AAAA,EACjC,KAAK,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,EAChD,OAAO,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,EAClD,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uCAAuC;AACrF,CAAC,EACI,SAAS,sGAAsG;AAC7G,IAAM,WAAW,EACnB,OAAO;AAAA,EACR,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,EAChE,UAAU,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC,EACI,SAAS,0FAA0F;AACjG,IAAM,cAAc,EACtB,OAAO;AAAA,EACR,QAAQ,EACH,MAAM,eAAe,EACrB,IAAI,CAAC,EACL,SAAS,kEAAkE;AAAA,EAChF,OAAO,EACF,OAAO,EAAE,OAAO,GAAG,QAAQ,EAC3B,SAAS,EACT,SAAS,8HACgD;AAClE,CAAC,EACI,SAAS,2FAA2F;AAClG,IAAM,uBAAuB,EAC/B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,aAAa;AAAA,EAC7B,KAAK,EAAE,OAAO,EAAE,SAAS,iEAAiE;AAAA,EAC1F,UAAU,EAAE,KAAK,CAAC,OAAO,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,wBAAwB;AAAA,EAChE,UAAU,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,wDAAwD;AAAA,EACtE,SAAS,YAAY,SAAS,EAAE,SAAS,0DAA0D;AACvG,CAAC,EACI,SAAS,yQAEkF;AACzF,IAAM,aAAa,EAAE,mBAAmB,QAAQ;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAIM,IAAM,QAAQ,EAChB,OAAO;AAAA,EACR,YAAY,EACP,MAAM,UAAU,EAChB,SAAS,8EAAyE;AAAA,EACvF,OAAO,EACF,QAAQ,EACR,SAAS,oFAAoF;AACtG,CAAC,EACI,SAAS,gLACyE;AAChF,IAAM,gBAAgB,EACxB,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,OAAO,EACF,MAAM,KAAK,EACX,SAAS,yEAAoE;AAAA,EAClF,SAAS,EACJ,QAAQ,EACR,SAAS,uFAAuF;AACzG,CAAC,EACI,SAAS,qNAEyD;AAChE,IAAM,iBAAiB,EACzB,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO;AAAA,EACpB,OAAO,EAAE,QAAQ;AAAA,EACjB,OAAO,EAAE,QAAQ;AACrB,CAAC,EACI,SAAS,mEAAmE;AAC1E,IAAM,iBAAiB,EACzB,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,OAAO;AAAA,EACvB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EAC/C,SAAS,EAAE,QAAQ;AACvB,CAAC,EACI,SAAS,8DAA8D;AACrE,IAAM,oBAAoB,EAC5B,OAAO;AAAA,EACR,MAAM,EAAE,QAAQ,UAAU;AAAA,EAC1B,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA,EACzC,SAAS,EAAE,QAAQ;AAAA,EACnB,WAAW,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC,EACI,SAAS,kEAAkE;AACzE,IAAM,oBAAoB,EAAE,mBAAmB,QAAQ;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AAEM,IAAM,eAAe,kBAAkB,SAAS,EAAE,SAAS;AA2F3D,IAAM,cAAc,EAAE,OAAO;AAAA,EAChC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS;AAC7E,CAAC;AAKM,IAAM,UAAU,EAClB,OAAO;AAAA,EACR,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC,EACI,SAAS,EACT,SAAS;;;ACxYd,SAAS,MAAM,YAAY,eAAoC;;;ACK/D,eAAsB,wBACpB,OACA,SACwB;AACxB,QAAM,KAAK,SAAS,cAAc,MAAM,QAAQ;AAChD,QAAM,OAAO,IAAI,aAAa,KAAK;AACnC,SAAO,QAAQ,KAAK,SAAS,IAAI,OAAO;AAC1C;AAEA,eAAsB,wBACpB,OACA,SACwB;AACxB,QAAM,KAAK,SAAS,cAAc,MAAM,QAAQ;AAChD,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,cAAc,iBAAkB,QAAO,GAAG,cAAc,GAAG,OAAO;AACtE,QAAM,MAAM,GAAG,aAAa,KAAK;AACjC,SAAO,OAAO,IAAI,SAAS,IAAI,MAAM;AACvC;;;ACRA,SAAS,UAAU,MAAoC;AACrD,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,IAAK,KAA+B,OAAO;AACjD,MAAI,OAAO,MAAM,SAAU,QAAO,MAAM;AACxC,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,SAAS,SAAS;AACjD,SAAO;AACT;AAEA,SAAS,aAAa,SAAuC;AAC3D,aAAW,QAAQ,SAAS;AAC1B,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN;AAAA,IACF;AACA,UAAM,QAAmB,CAAC,MAAM;AAChC,WAAO,MAAM,QAAQ;AACnB,YAAM,MAAM,MAAM,IAAI;AACtB,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,mBAAW,KAAK,IAAK,OAAM,KAAK,CAAC;AACjC;AAAA,MACF;AACA,UAAI,UAAU,GAAG,EAAG,QAAO;AAC3B,UAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,cAAM,QAAS,IAA+B,QAAQ;AACtD,YAAI,MAAM,QAAQ,KAAK,EAAG,YAAW,KAAK,MAAO,OAAM,KAAK,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAiC;AACxC,QAAM,MAAM,SAAS,iBAAiB,oCAAoC;AAC1E,SAAO,MAAM,KAAK,KAAK,CAAC,OAAO,GAAG,eAAe,EAAE;AACrD;AAEA,eAAe,sBAAsB,KAAa,QAAwC;AACxF,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AACvC,MAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AAC7D,SAAO,MAAM;AAAA,IACX,IAAI,iBAAiB,oCAAoC;AAAA,IACzD,CAAC,OAAO,GAAG,eAAe;AAAA,EAC5B;AACF;AAEA,SAAS,UAAU,MAAgE;AACjF,QAAM,QAA2B,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK;AACpF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,MAAM,MAAM;AAClB,QAAM,MACJ,OAAO,QAAQ,WAAW,MAAM,OAAO,QAAQ,WAAW,OAAO,WAAW,GAAG,IAAI,OAAO;AAC5F,MAAI,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO;AAClC,SAAO,EAAE,QAAQ,KAAK,UAAU,MAAM,iBAAiB,MAAM;AAC/D;AAEA,SAAS,YAAY,QAAgB,UAAiC;AACpE,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,SAAS,CAAC,EAAE,OAAO,MAAM;AAAA,EACxF,SAAS,KAAK;AACZ,YAAQ,KAAK,4DAA4D,EAAE,SAAS,GAAG,GAAG;AAC1F,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,mBACpB,OACA,QACwB;AACxB,QAAM,UAAU,MAAM,MAClB,MAAM,sBAAsB,MAAM,KAAK,MAAM,IAC7C,qBAAqB;AACzB,QAAM,UAAU,aAAa,OAAO;AACpC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO,SAAS,YAAY,OAAO,QAAQ,OAAO,QAAQ,IAAI;AAChE;AAEA,eAAsB,mBACpB,OACA,QACwB;AACxB,QAAM,UAAU,MAAM,MAClB,MAAM,sBAAsB,MAAM,KAAK,MAAM,IAC7C,qBAAqB;AACzB,QAAM,UAAU,aAAa,OAAO;AACpC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,MAAM,CAAC,IAAI,QAAQ;AACtE,SAAO,OAAO,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM;AAC3D;;;ACvGA,eAAsB,sBACpB,OACA,QACwB;AACxB,QAAM,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AAC7C,MAAI,CAAC,IAAI,GAAI,QAAO;AACpB,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,MAAM,IAAI,UAAU,EAAE,gBAAgB,MAAM,WAAW;AAC7D,QAAM,OAAO,IAAI,cAAc,2BAA2B;AAC1D,QAAM,MAAM,MAAM,aAAa,SAAS;AACxC,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,SAAS;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACTA,SAAS,UAAU,MAAkC;AACnD,MAAI,KAAM,QAAO,KAAK,QAAQ,OAAO,EAAE;AACvC,SAAO,OAAO,aAAa,cAAc,SAAS,SAAS;AAC7D;AAEA,eAAe,aACb,QACA,MACA,QACuC;AACvC,QAAM,MAAM,GAAG,UAAU,IAAI,CAAC,aAAa,mBAAmB,MAAM,CAAC;AACrE,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AACvC,MAAI,CAAC,IAAI,GAAI,QAAO;AACpB,MAAI;AACF,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,aAAc,OAAM;AAC7D,YAAQ,KAAK,2DAA2D,GAAG;AAC3E,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,wBACpB,OACA,QACwB;AACxB,QAAM,UAAU,MAAM,aAAa,MAAM,QAAQ,MAAM,MAAM,MAAM;AACnE,MAAI,CAAC,WAAW,OAAO,QAAQ,UAAU,SAAU,QAAO;AAC1D,QAAM,WAAW,QAAQ,YAAY;AACrC,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,SAAS,CAAC,EAAE;AAAA,MACvE,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA,EAAE,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,wBACpB,OACA,QACwB;AACxB,QAAM,UAAU,MAAM,aAAa,MAAM,QAAQ,MAAM,MAAM,MAAM;AACnE,QAAM,QAAQ,SAAS,SAAS,CAAC;AACjC,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;;;AC/CA,SAASA,WAAU,MAAkC;AACnD,MAAI,KAAM,QAAO,KAAK,QAAQ,OAAO,EAAE;AACvC,SAAO,OAAO,aAAa,cAAc,SAAS,SAAS;AAC7D;AAEA,eAAsB,wBACpB,OACA,QACwB;AACxB,QAAM,MAAM,GAAGA,WAAU,MAAM,IAAI,CAAC,mCAAmC,mBAAmB,MAAM,IAAI,CAAC;AACrG,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AACvC,MAAI,CAAC,IAAI,GAAI,QAAO;AACpB,MAAI;AACJ,MAAI;AACF,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,aAAc,OAAM;AAC7D,YAAQ,KAAK,oEAAoE,GAAG;AACpF,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,IAAI;AAChF,QAAM,SAAS,SAAS;AACxB,MAAI,CAAC,UAAU,OAAO,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,QAAQ,OAAO,uBAAuB;AAC5C,QAAM,MAAM,OAAO,SAAS,OAAO,OAAO,EAAE;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO;AAClC,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,WAAW,OAAO,iBAAiB;AACzC,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,SAAS,CAAC,EAAE,OAAO,MAAM;AAAA,EACxF,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA,EAAE,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC5CA,eAAsB,iBAAiB,OAAkB,QAA0C;AACjG,MAAI;AACF,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,MAAM,wBAAwB,OAAO,MAAM;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,wBAAwB,OAAO,MAAM;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,wBAAwB,OAAO,MAAM;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,mBAAmB,OAAO,MAAM;AAAA,MAC/C;AACE,eAAO;AAAA,IACX;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,EAAE,eAAe,SAAS,IAAI,SAAS,eAAe;AACxD,cAAQ,KAAK,iCAAiC,MAAM,IAAI,KAAK,GAAG;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,iBAAiB,OAAkB,QAA0C;AACjG,MAAI;AACF,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO,MAAM,wBAAwB,OAAO,MAAM;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,wBAAwB,OAAO,MAAM;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,sBAAsB,OAAO,MAAM;AAAA,MAClD,KAAK;AACH,eAAO,MAAM,mBAAmB,OAAO,MAAM;AAAA,MAC/C;AACE,eAAO;AAAA,IACX;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,EAAE,eAAe,SAAS,IAAI,SAAS,eAAe;AACxD,cAAQ,KAAK,iCAAiC,MAAM,IAAI,KAAK,GAAG;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACF;;;AClDA;AASO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YACmB,UACA,UACjB;AAFiB;AACA;AAPd;AACL,+BAAS,IAAI,gBAAgB;AAC7B,iCAA4B,CAAC;AAC7B,mCAAa;AAAA,EAKV;AAAA,EAEH,QAAc;AACZ,eAAW,WAAW,KAAK,UAAU;AACnC,UAAI,QAAQ,MAAM,MAAM;AACtB,2BAAK,UAAS,KAAK,sBAAK,4CAAL,WAAmB,QAAQ,IAAI,QAAQ,MAAM,KAAK;AAAA,MACvE;AACA,UAAI,QAAQ,OAAO,MAAM;AACvB,2BAAK,UAAS,KAAK,sBAAK,4CAAL,WAAmB,QAAQ,IAAI,QAAQ,MAAM,KAAK;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,QAAQ,WAAW,mBAAK,SAAQ;AAAA,EACxC;AAAA,EAEA,UAAgB;AACd,QAAI,mBAAK,YAAY;AACrB,uBAAK,YAAa;AAClB,uBAAK,QAAO,MAAM;AAAA,EACpB;AAmBF;AA/CE;AACA;AACA;AAHK;AA+BC,kBAAa,eACjB,WACA,MACe;AACf,QAAM,QAAQ,MAAM,iBAAiB,MAAM,mBAAK,QAAO,MAAM;AAC7D,MAAI,mBAAK,YAAY;AACrB,OAAK,SAAS,WAAW,SAAS,KAAK;AACzC;AAEM,kBAAa,eACjB,WACA,MACe;AACf,QAAM,QAAQ,MAAM,iBAAiB,MAAM,mBAAK,QAAO,MAAM;AAC7D,MAAI,mBAAK,YAAY;AACrB,OAAK,SAAS,WAAW,SAAS,KAAK;AACzC;;;ACjDF,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,aAAaC,OAAsB;AAEjD,QAAM,YAAY,OAAQ,OAAe,cAAc;AACvD,MAAI,WAAW;AACb,QAAI;AACF,YAAM,IAAI,IAAK,OAAe,UAAU,CAAC,CAAC;AAC1C,YAAM,OAAO,EAAE,mBAAmBA,KAAI;AACtC,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,OAAO,IAAI;AACf,aAAO,IAAI;AAAA,IACb,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,MAAM,SAAS,cAAc,UAAU;AAC7C,MAAI,YAAYA;AAChB,QAAM,OAAO,IAAI;AACjB,QAAM,SAAS,SAAS,iBAAiB,MAAM,WAAW,cAAc,IAAI;AAC5E,QAAM,WAAsB,CAAC;AAE7B,SAAO,OAAO,SAAS,GAAG;AACxB,UAAM,KAAK,OAAO;AAClB,UAAM,MAAM,GAAG,QAAQ,YAAY;AAEnC,QAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,eAAS,KAAK,EAAE;AAChB;AAAA,IACF;AAGA,eAAW,QAAQ,MAAM,KAAK,GAAG,UAAU,GAAG;AAC5C,YAAM,OAAO,KAAK,KAAK,YAAY;AACnC,YAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,YAAY;AAC5C,YAAM,UAAU,KAAK,WAAW,IAAI;AACpC,YAAM,WAAW,SAAS,UAAU,SAAS,UAAU,MAAM,WAAW,aAAa;AAErF,UAAI,WAAW,SAAS;AACtB,WAAG,gBAAgB,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,aAAW,MAAM,UAAU;AACzB,WAAO,GAAG,YAAY;AACpB,SAAG,YAAY,aAAa,GAAG,YAAY,EAAE;AAAA,IAC/C;AACA,OAAG,OAAO;AAAA,EACZ;AAEA,SAAO,IAAI;AACb;;;AR3FA;AAMO,IAAM,iBAAN,cAA6B,WAAW;AAAA,EAAxC;AAAA;AAAA;AAOL,iBAA+B;AAC/B,oBAA+D,CAAC;AAChE,2BAAkB;AAElB;AAAA;AAAA,EAES,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA,EAES,WAAW,SAAqC;AACvD,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,4BAAK,yCAAL;AAAA,IACF;AAAA,EACF;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAqB;AAC3B,uBAAK,cAAa,QAAQ;AAAA,EAC5B;AAAA,EA2BS,SAA0C;AACjD,QAAI,KAAK,mBAAmB,CAAC,KAAK,MAAO,QAAO;AAChD,UAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,QAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,KAAK,SAAS,OAAO,KAAK,QAAQ,EAAE;AAAA,IACtC;AAAA,EACF;AACF;AApDE;AAXK;AA4BL,eAAU,WAAS;AACjB,qBAAK,cAAa,QAAQ;AAC1B,OAAK,WAAW,CAAC;AACjB,MAAI,CAAC,KAAK,OAAO;AACf,SAAK,kBAAkB;AACvB;AAAA,EACF;AACA,QAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,MAAI,CAAC,OAAO,SAAS;AACnB,SAAK,kBAAkB;AACvB,YAAQ,KAAK,0CAA0C,OAAO,MAAM,MAAM;AAC1E;AAAA,EACF;AACA,OAAK,kBAAkB;AACvB,QAAM,SAAS,OAAO;AACtB,qBAAK,aAAc,IAAI,eAAe,CAAC,OAAO,OAAO,GAAG,CAAC,WAAW,MAAM,UAAU;AAClF,QAAI,SAAS,KAAM;AACnB,SAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,qBAAK,aAAY,MAAM;AACzB;AAnDW,eACK,aAAa;AAAA,EAC3B,OAAO,EAAE,WAAW,MAAM;AAAA,EAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,EACxB,iBAAiB,EAAE,OAAO,KAAK;AACjC;AA4DK,SAAS,kBACd,SACA,SACA,UACgB;AAChB,QAAM,SAAS,UAAU,SAAS,QAAQ,MAAM;AAChD,QAAM,YAAY,UAAU,SAAS,QAAQ,OAAO;AACpD,QAAM,cAAc,YAAY,cAAc,QAAQ;AACtD,SAAO;AAAA,oDAC2C,OAAO;AAAA;AAAA;AAAA;AAAA,cAI7C,MAAM;AAAA,cACN,QAAQ,MAAM,GAAG;AAAA;AAAA,iBAEd,YAAY;AAAA;AAAA;AAAA,8DAGiC,QAAQ,IAAI;AAAA,UAEhE,QAAQ,UACJ,gEAAgE,QAAQ,OAAO,SAC/E,OACN;AAAA;AAAA,QAGA,QAAQ,QACJ;AAAA,oDACwC,SAAS;AAAA,cAE/C,QAAQ,MAAM,UACV,8CAA8C,QAAQ,MAAM,OAAO,YACnE,OACN;AAAA,oBAEA,OACN;AAAA,QAEE,QAAQ,QACJ;AAAA;AAAA;AAAA,wBAGY,QAAQ,MAAM,IAAI;AAAA,eAC3B,QAAQ,MAAM,KAAK;AAAA,eAEtB,OACN;AAAA,QAEE,QAAQ,WAAW,SAAS,IACxB;AAAA,cACE,QAAQ,WAAW;AAAA,IACnB,CAAC,MAAM,mCAAmC,EAAE,WAAW,SAAS,OAAO;AAAA,4DACzB,EAAE,KAAK;AAAA,4DACP,EAAE,KAAK;AAAA;AAAA,EAEvD,CAAC;AAAA,mBAED,OACN;AAAA,QAEE,cACI;AAAA;AAAA,yBAEa,aAAa,QAAQ,WAAW,EAAE,CAAC;AAAA,mBAEhD,OACN;AAAA;AAAA,UAEI,QAAQ,KAAK;AAAA,IACb,CAAC,GAAG,MAAM;AAAA;AAAA,+BAEW,MAAM,IAAI,YAAY,WAAW;AAAA,2BACrC,EAAE,OAAO;AAAA,mBACjB,EAAE,QAAQ,GAAG;AAAA,qBACX,EAAE,MAAM;AAAA,kBACX,EAAE,WAAW,WAAW,wBAAwB,EAAE;AAAA,6BACvC,EAAE,YAAY,EAAE;AAAA,eAC9B,EAAE,KAAK;AAAA;AAAA,EAEd,CAAC;AAAA;AAAA;AAAA;AAIT;AAEA,SAAS,aAAa,GAAgB;AACpC,QAAM,MAAM,EAAE;AACd,MAAI,QAAQ,aAAa;AACzB,MAAI,gBAAgB,KAAK;AAC3B;;;ASjKA,SAAS,QAAAC,OAAM,cAAAC,aAAY,WAAAC,gBAAoC;AAA/D,IAAAC,cAAA,0CAAAC,eAAA;AASO,IAAM,uBAAN,cAAmCC,YAAW;AAAA,EAA9C;AAAA;AAAA;AAQL,iBAAqC;AACrC,gBAAO,oBAAI,IAAW;AACtB,oBAAwB,CAAC;AACzB,2BAAkB;AAElB,uBAAAF;AACA;AAAA;AAAA,EAES,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA,EAES,WAAW,SAAqC;AACvD,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,4BAAK,iCAAAC,eAAL;AAAA,IACF;AAAA,EACF;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAqB;AAC3B,uBAAKD,eAAa,QAAQ;AAAA,EAC5B;AAAA,EAuDS,SAA0C;AACjD,QAAI,KAAK,mBAAmB,CAAC,mBAAK,SAAS,QAAOG;AAClD,UAAM,SAAS,mBAAK;AACpB,WAAOA;AAAA;AAAA,UAGD,OAAO,UACHA;AAAA;AAAA;AAAA,iBAGG,OAAO,OAAO,UACjBC,QACN;AAAA;AAAA,YAEI,OAAO,SAAS,IAAI,CAAC,MAAM,sBAAK,+CAAL,WAAgB,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,EAIxD;AAgGF;AAzLEJ,eAAA;AACA;AAdK;AA+BLC,gBAAU,WAAS;AACjB,qBAAKD,eAAa,QAAQ;AAC1B,OAAK,WAAW,CAAC;AACjB,MAAI,CAAC,KAAK,OAAO;AACf,SAAK,kBAAkB;AACvB,uBAAK,SAAU;AACf;AAAA,EACF;AACA,QAAM,SAAS,iBAAiB,UAAU,KAAK,KAAK;AACpD,MAAI,CAAC,OAAO,SAAS;AACnB,SAAK,kBAAkB;AACvB,uBAAK,SAAU;AACf,YAAQ,KAAK,gDAAgD,OAAO,MAAM,MAAM;AAChF;AAAA,EACF;AACA,OAAK,kBAAkB;AACvB,qBAAK,SAAU,OAAO;AACtB,OAAK,OAAO,IAAI;AAAA,IACd,OAAO,OAAO,KAAK,yBAAyB,WACvC,CAAC,OAAO,KAAK,SAAS,OAAO,KAAK,oBAAoB,GAAG,EAAE,EAAE,OAAO,OAAO,IAC5E,CAAC;AAAA,EACP;AACA,qBAAKA,cAAc,IAAI,eAAe,OAAO,KAAK,UAAU,CAAC,WAAW,MAAM,UAAU;AACtF,QAAI,SAAS,KAAM;AACnB,SAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,qBAAKA,cAAY,MAAM;AACzB;AAEA,YAAO,SAAC,IAAiB;AACvB,MAAI,CAAC,mBAAK,SAAS;AACnB,QAAM,OAAO,IAAI,IAAI,KAAK,IAAI;AAC9B,MAAI,KAAK,IAAI,EAAE,GAAG;AAChB,SAAK,OAAO,EAAE;AAAA,EAChB,OAAO;AACL,QAAI,mBAAK,SAAQ,mBAAmB,YAAa,MAAK,MAAM;AAC5D,SAAK,IAAI,EAAE;AAAA,EACb;AACA,OAAK,OAAO;AACd;AAEA,iBAAY,SAAC,IAAW,GAAwB;AAC9C,MAAI,EAAE,QAAQ,YAAY,KAAK,KAAK,IAAI,EAAE,GAAG;AAC3C,UAAM,OAAO,IAAI,IAAI,KAAK,IAAI;AAC9B,SAAK,OAAO,EAAE;AACd,SAAK,OAAO;AACZ,MAAE,eAAe;AAAA,EACnB;AACF;AAsBA,eAAU,SAAC,SAAkC;AAC3C,QAAM,WAAW,KAAK,KAAK,IAAI,QAAQ,EAAE;AACzC,QAAM,WAAW,UAAU,QAAQ,EAAE;AACrC,QAAM,WAAW,KAAK,SAAS,QAAQ,EAAE;AACzC,QAAM,SAAS,UAAU,SAAS,QAAQ,MAAM;AAChD,QAAM,YAAY,UAAU,SAAS,QAAQ,OAAO;AACpD,QAAM,UAAU,QAAQ,KAAK,CAAC;AAC9B,SAAOG;AAAA;AAAA;AAAA;AAAA,0BAIe,QAAQ,EAAE;AAAA,wBACZ,WAAW,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOvB,WAAW,SAAS,OAAO;AAAA,4BAC3B,QAAQ;AAAA,qBACf,MAAM,sBAAK,4CAAL,WAAa,QAAQ,GAAG;AAAA,uBAC5B,CAAC,MAAqB,sBAAK,iDAAL,WAAkB,QAAQ,IAAI,EAAE;AAAA;AAAA;AAAA;AAAA,oBAIzD,MAAM;AAAA,oBACN,QAAQ,MAAM,GAAG;AAAA;AAAA;AAAA,wDAGmB,QAAQ,IAAI;AAAA,cAEtD,QAAQ,QACJA;AAAA,qBACG,SAAS,GACV,QAAQ,MAAM,UAAUA,gBAAe,QAAQ,MAAM,OAAO,aAAaC,QAC3E;AAAA,qBAEAA,QACN;AAAA,cAEE,QAAQ,UACJD;AAAA;AAAA,+BAEa,aAAa,QAAQ,OAAO,CAAC;AAAA,4BAE1CC,QACN;AAAA;AAAA;AAAA;AAAA,qBAIS,QAAQ,QAAQ,GAAG;AAAA,uBACjB,QAAQ,MAAM;AAAA,oBACjB,QAAQ,WAAW,WAAW,wBAAwB,EAAE;AAAA,+BAC7C,QAAQ,YAAY,EAAE;AAAA,6BACxB,QAAQ,OAAO;AAAA,iBAC3B,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,UAKpB,WACID,qDAAoD,QAAQ;AAAA,gBAE1D,QAAQ,WAAW,SAAS,IACxBA;AAAA,sBACE,QAAQ,WAAW;AAAA,IACnB,CAAC,MAAMA,oCAAmC,EAAE,WAAW,SAAS,OAAO;AAAA,gCAC7D,EAAE,KAAK,gBAAgB,EAAE,KAAK;AAAA;AAAA,EAE1C,CAAC;AAAA,2BAEDC,QACN;AAAA,gBAEE,QAAQ,KAAK,CAAC,IACVD;AAAA;AAAA;AAAA,2BAGO,QAAQ,KAAK,CAAC,EAAE,QAAQ,GAAG;AAAA,6BACzB,QAAQ,KAAK,CAAC,EAAE,MAAM;AAAA,0BACzB,QAAQ,KAAK,CAAC,EAAE,WAAW,WAAW,wBAAwB,EAAE;AAAA,qCACrD,QAAQ,KAAK,CAAC,EAAE,YAAY,EAAE;AAAA,mCAChC,QAAQ,KAAK,CAAC,EAAE,OAAO;AAAA,uBACnC,QAAQ,KAAK,CAAC,EAAE,KAAK;AAAA,uBAExBC,QACN;AAAA,sBAEAA,QACN;AAAA;AAAA;AAGN;AArMW,qBACK,aAAa;AAAA,EAC3B,OAAO,EAAE,WAAW,MAAM;AAAA,EAC1B,MAAM,EAAE,OAAO,KAAK;AAAA,EACpB,UAAU,EAAE,OAAO,KAAK;AAAA,EACxB,iBAAiB,EAAE,OAAO,KAAK;AACjC;;;ACfF,SAAS,QAAAC,OAAM,cAAAC,aAAY,WAAAC,gBAAoC;AAA/D,IAAAC,cAAA,2BAAAC;AAKO,IAAM,iBAAN,cAA6BC,YAAW;AAAA,EAAxC;AAAA;AAAA;AAOL,iBAA+B;AAC/B,oBAA+D,CAAC;AAChE,2BAAkB;AAElB,uBAAAF;AAAA;AAAA,EAES,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA,EAES,WAAW,SAAqC;AACvD,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,4BAAK,2BAAAC,eAAL;AAAA,IACF;AAAA,EACF;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAqB;AAC3B,uBAAKD,eAAa,QAAQ;AAAA,EAC5B;AAAA,EA0BS,SAA0C;AACjD,QAAI,KAAK,mBAAmB,CAAC,KAAK,MAAO,QAAOG;AAChD,UAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,QAAI,CAAC,OAAO,QAAS,QAAOA;AAC5B,UAAM,EAAE,UAAU,gBAAgB,QAAQ,IAAI,OAAO;AACrD,WAAOA;AAAA;AAAA,UAGD,UACIA,+DAA8D,OAAO,UACrEC,QACN;AAAA;AAAA;AAAA;AAAA,kBAIU,0BAA0B,cAAc,EAAE;AAAA;AAAA,YAEhD,SAAS;AAAA,MACT,CAAC,MAAMD;AAAA,gBACH,kBAAkB,GAAG,YAAY,KAAK,SAAS,EAAE,EAAE,CAAC,CAAC;AAAA;AAAA,IAE3D,CAAC;AAAA;AAAA;AAAA;AAAA,EAIT;AACF;AAnEEH,eAAA;AAXK;AA4BLC,gBAAU,WAAS;AACjB,qBAAKD,eAAa,QAAQ;AAC1B,OAAK,WAAW,CAAC;AACjB,MAAI,CAAC,KAAK,OAAO;AACf,SAAK,kBAAkB;AACvB;AAAA,EACF;AACA,QAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,MAAI,CAAC,OAAO,SAAS;AACnB,SAAK,kBAAkB;AACvB,YAAQ,KAAK,0CAA0C,OAAO,MAAM,MAAM;AAC1E;AAAA,EACF;AACA,OAAK,kBAAkB;AACvB,qBAAKA,cAAc,IAAI,eAAe,OAAO,KAAK,UAAU,CAAC,WAAW,MAAM,UAAU;AACtF,QAAI,SAAS,KAAM;AACnB,SAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,qBAAKA,cAAY,MAAM;AACzB;AAlDW,eACK,aAAa;AAAA,EAC3B,OAAO,EAAE,WAAW,MAAM;AAAA,EAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,EACxB,iBAAiB,EAAE,OAAO,KAAK;AACjC;;;ACVF,SAAS,QAAAK,OAAM,cAAAC,aAAY,WAAAC,gBAAoC;AAA/D,IAAAC,cAAA,2BAAAC;AAKO,IAAM,iBAAN,cAA6BC,YAAW;AAAA,EAAxC;AAAA;AAAA;AAOL,iBAA+B;AAC/B,oBAA+D,CAAC;AAChE,2BAAkB;AAElB,uBAAAF;AAAA;AAAA,EAES,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA,EAES,WAAW,SAAqC;AACvD,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,4BAAK,2BAAAC,eAAL;AAAA,IACF;AAAA,EACF;AAAA,EAES,uBAA6B;AACpC,UAAM,qBAAqB;AAC3B,uBAAKD,eAAa,QAAQ;AAAA,EAC5B;AAAA,EA0BS,SAA0C;AACjD,QAAI,KAAK,mBAAmB,CAAC,KAAK,MAAO,QAAOG;AAChD,UAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,QAAI,CAAC,OAAO,QAAS,QAAOA;AAC5B,UAAM,EAAE,SAAS,QAAQ,SAAS,IAAI,OAAO;AAC7C,UAAM,WAAW,KAAK,SAAS,QAAQ,EAAE;AACzC,UAAM,SAAS,UAAU,SAAS,QAAQ,MAAM;AAChD,UAAM,YAAY,UAAU,SAAS,QAAQ,OAAO;AACpD,WAAOA;AAAA,0DAC+C,MAAM;AAAA;AAAA;AAAA,gBAGhD,MAAM;AAAA,gBACN,QAAQ,MAAM,GAAG;AAAA;AAAA;AAAA;AAAA,8CAIa,QAAQ,IAAI;AAAA,YAE9C,QAAQ,UACJA,4CAA2C,QAAQ,OAAO,SAC1DC,QACN;AAAA,YAEE,QAAQ,QACJD;AAAA,kBACE,SAAS,GACT,QAAQ,MAAM,UAAUA,gBAAe,QAAQ,MAAM,OAAO,aAAaC,QAC3E;AAAA,sBAEAA,QACN;AAAA,YAEE,WACID;AAAA;AAAA;AAAA,6BAGa,aAAa,QAAQ,CAAC;AAAA,yBAEnCC,QACN;AAAA;AAAA,cAEI,QAAQ,KAAK;AAAA,MACb,CAAC,GAAG,MAAMD;AAAA;AAAA,mCAEW,MAAM,IAAI,YAAY,WAAW;AAAA,+BACrC,EAAE,OAAO;AAAA,uBACjB,EAAE,QAAQ,GAAG;AAAA,yBACX,EAAE,MAAM;AAAA,sBACX,EAAE,WAAW,WAAW,wBAAwB,EAAE;AAAA,mBACrD,EAAE,KAAK;AAAA;AAAA,IAEd,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKX;AACF;AAnGEH,eAAA;AAXK;AA4BLC,gBAAU,WAAS;AACjB,qBAAKD,eAAa,QAAQ;AAC1B,OAAK,WAAW,CAAC;AACjB,MAAI,CAAC,KAAK,OAAO;AACf,SAAK,kBAAkB;AACvB;AAAA,EACF;AACA,QAAM,SAAS,WAAW,UAAU,KAAK,KAAK;AAC9C,MAAI,CAAC,OAAO,SAAS;AACnB,SAAK,kBAAkB;AACvB,YAAQ,KAAK,0CAA0C,OAAO,MAAM,MAAM;AAC1E;AAAA,EACF;AACA,OAAK,kBAAkB;AACvB,qBAAKA,cAAc,IAAI,eAAe,CAAC,OAAO,KAAK,OAAO,GAAG,CAAC,WAAW,MAAM,UAAU;AACvF,QAAI,SAAS,KAAM;AACnB,SAAK,WAAW;AAAA,MACd,GAAG,KAAK;AAAA,MACR,CAAC,SAAS,GAAG,EAAE,GAAG,KAAK,SAAS,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,qBAAKA,cAAY,MAAM;AACzB;AAlDW,eACK,aAAa;AAAA,EAC3B,OAAO,EAAE,WAAW,MAAM;AAAA,EAC1B,UAAU,EAAE,OAAO,KAAK;AAAA,EACxB,iBAAiB,EAAE,OAAO,KAAK;AACjC;;;ACMF,IAAM,OAAO;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAI,OAAO,mBAAmB,aAAa;AACzC,MAAI,CAAC,eAAe,IAAI,KAAK,IAAI,EAAG,gBAAe,OAAO,KAAK,MAAM,cAAc;AACnF,MAAI,CAAC,eAAe,IAAI,KAAK,UAAU;AACrC,mBAAe,OAAO,KAAK,YAAY,oBAAoB;AAC7D,MAAI,CAAC,eAAe,IAAI,KAAK,IAAI,EAAG,gBAAe,OAAO,KAAK,MAAM,cAAc;AACnF,MAAI,CAAC,eAAe,IAAI,KAAK,IAAI,EAAG,gBAAe,OAAO,KAAK,MAAM,cAAc;AACrF;AAEA,SAAS,cAAgC,KAAa;AACpD,SAAO;AAAA,IACL,MAAM,WAAwB,QAAiD;AAC7E,YAAM,cAAc,mBAAsB,UAAU,IAAI;AACxD,YAAM,KAAK,SAAS,cAAc,GAAG;AACrC,SAAG,QAAQ;AACX,gBAAU,YAAY,EAAE;AACxB,aAAO,MAAM,GAAG,OAAO;AAAA,IACzB;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB,cAAyB,KAAK,IAAI;AAC/D,IAAM,6BAA6B,cAA+B,KAAK,UAAU;AACjF,IAAM,uBAAuB,cAAyB,KAAK,IAAI;AAC/D,IAAM,uBAAuB,cAAyB,KAAK,IAAI;AAE/D,IAAM,UAAU;AAAA,EACrB,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aACE;AAAA,EACF,WAAW,CAAC;AAAA,EACZ,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,kBAAQ;",
|
|
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
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
+
|
|
10
|
+
// src/schema.ts
|
|
11
|
+
import { z as z2 } from "zod";
|
|
12
|
+
|
|
13
|
+
// src/schema-primitives.ts
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
var SAFE_HREF_PATTERN = /^(?:[/.#?]|[hH][tT][tT][pP][sS]?:\/\/|[mM][aA][iI][lL][tT][oO]:|[tT][eE][lL]:)/;
|
|
16
|
+
var HrefZ = z.string().min(1).regex(SAFE_HREF_PATTERN, {
|
|
17
|
+
message: "href must start with /, ./, ../, #, ?, http(s)://, mailto:, or tel: \u2014 javascript:, data:, and vbscript: are not allowed"
|
|
18
|
+
}).refine(
|
|
19
|
+
(s) => {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = new URL(s, "https://syntro.local/");
|
|
22
|
+
return ["http:", "https:", "mailto:", "tel:"].includes(parsed.protocol);
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{ message: "href resolves to an unsupported protocol" }
|
|
28
|
+
);
|
|
29
|
+
var PriceBindZ = z.discriminatedUnion("type", [
|
|
30
|
+
z.object({ type: z.literal("dom-selector"), selector: z.string().min(1) }).strict(),
|
|
31
|
+
z.object({ type: z.literal("shopify-ajax"), handle: z.string().min(1), base: HrefZ.optional() }).strict(),
|
|
32
|
+
z.object({
|
|
33
|
+
type: z.literal("woocommerce-store-api"),
|
|
34
|
+
slug: z.string().min(1),
|
|
35
|
+
base: HrefZ.optional()
|
|
36
|
+
}).strict(),
|
|
37
|
+
z.object({ type: z.literal("jsonld"), url: HrefZ.optional() }).strict()
|
|
38
|
+
]);
|
|
39
|
+
var ImageBindZ = z.discriminatedUnion("type", [
|
|
40
|
+
z.object({ type: z.literal("dom-selector"), selector: z.string().min(1) }).strict(),
|
|
41
|
+
z.object({ type: z.literal("shopify-ajax"), handle: z.string().min(1), base: HrefZ.optional() }).strict(),
|
|
42
|
+
z.object({ type: z.literal("opengraph"), url: HrefZ }).strict(),
|
|
43
|
+
z.object({ type: z.literal("jsonld"), url: HrefZ.optional() }).strict()
|
|
44
|
+
]);
|
|
45
|
+
var productSchema = z.object({
|
|
46
|
+
id: z.string().min(1).describe("Stable identifier for analytics and dedup"),
|
|
47
|
+
name: z.string().min(1),
|
|
48
|
+
tagline: z.string().optional(),
|
|
49
|
+
image: z.object({
|
|
50
|
+
src: HrefZ,
|
|
51
|
+
alt: z.string(),
|
|
52
|
+
bind: ImageBindZ.optional()
|
|
53
|
+
}).strict(),
|
|
54
|
+
price: z.object({
|
|
55
|
+
amount: z.string(),
|
|
56
|
+
cadence: z.string().optional(),
|
|
57
|
+
bind: PriceBindZ.optional()
|
|
58
|
+
}).strict().optional(),
|
|
59
|
+
badge: z.object({
|
|
60
|
+
label: z.string(),
|
|
61
|
+
tone: z.enum(["neutral", "primary", "success", "warning"]).default("neutral")
|
|
62
|
+
}).strict().optional(),
|
|
63
|
+
attributes: z.array(
|
|
64
|
+
z.object({
|
|
65
|
+
label: z.string(),
|
|
66
|
+
value: z.string(),
|
|
67
|
+
emphasis: z.boolean().default(false)
|
|
68
|
+
}).strict()
|
|
69
|
+
).max(8),
|
|
70
|
+
framing: z.string().max(280).optional(),
|
|
71
|
+
ctas: z.array(
|
|
72
|
+
z.object({
|
|
73
|
+
label: z.string().min(1),
|
|
74
|
+
href: HrefZ.optional(),
|
|
75
|
+
target: z.enum(["_self", "_blank"]).default("_self"),
|
|
76
|
+
variant: z.enum(["primary", "secondary", "ghost"]).default("primary"),
|
|
77
|
+
actionId: z.string().optional()
|
|
78
|
+
}).strict()
|
|
79
|
+
).min(1).max(2)
|
|
80
|
+
}).strict();
|
|
81
|
+
|
|
82
|
+
// src/schema.ts
|
|
83
|
+
var cardSchema = z2.object({
|
|
84
|
+
product: productSchema,
|
|
85
|
+
density: z2.enum(["compact", "standard"]).default("standard")
|
|
86
|
+
}).strict();
|
|
87
|
+
var comparisonSchema = z2.object({
|
|
88
|
+
products: z2.array(productSchema).min(2).max(4),
|
|
89
|
+
defaultExpandedIndex: z2.number().int().min(0).optional(),
|
|
90
|
+
expandBehavior: z2.enum(["multi", "accordion"]).default("multi"),
|
|
91
|
+
heading: z2.string().optional()
|
|
92
|
+
}).strict();
|
|
93
|
+
var heroSchema = z2.object({
|
|
94
|
+
product: productSchema,
|
|
95
|
+
layout: z2.enum(["image-left", "image-right", "image-top"]).default("image-left"),
|
|
96
|
+
longCopy: z2.string().max(800).optional()
|
|
97
|
+
}).strict();
|
|
98
|
+
var gridSchema = z2.object({
|
|
99
|
+
products: z2.array(productSchema).min(2).max(12),
|
|
100
|
+
desktopColumns: z2.union([z2.literal(2), z2.literal(3)]).default(3),
|
|
101
|
+
heading: z2.string().optional()
|
|
102
|
+
}).strict();
|
|
103
|
+
var tileWidgets = [
|
|
104
|
+
{ widget: "adaptive-product:card", defName: "productCardProps", propsSchema: cardSchema },
|
|
105
|
+
{
|
|
106
|
+
widget: "adaptive-product:comparison",
|
|
107
|
+
defName: "productComparisonProps",
|
|
108
|
+
propsSchema: comparisonSchema
|
|
109
|
+
},
|
|
110
|
+
{ widget: "adaptive-product:hero", defName: "productHeroProps", propsSchema: heroSchema },
|
|
111
|
+
{ widget: "adaptive-product:grid", defName: "productGridProps", propsSchema: gridSchema }
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
export {
|
|
115
|
+
__privateGet,
|
|
116
|
+
__privateAdd,
|
|
117
|
+
__privateSet,
|
|
118
|
+
__privateMethod,
|
|
119
|
+
productSchema,
|
|
120
|
+
cardSchema,
|
|
121
|
+
comparisonSchema,
|
|
122
|
+
heroSchema,
|
|
123
|
+
gridSchema,
|
|
124
|
+
tileWidgets
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=chunk-SM35E4R3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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\nexport const cardSchema = z\n .object({\n product: productSchema,\n density: z.enum(['compact', 'standard']).default('standard'),\n })\n .strict();\n\nexport const comparisonSchema = z\n .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 .strict();\n\nexport const heroSchema = z\n .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 .strict();\n\nexport const gridSchema = z\n .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 .strict();\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\nexport const productSchema = z\n .object({\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 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 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 .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
|
+
}
|