@syntrologie/adapt-faq 2.17.0 → 2.18.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/executors.ts", "../../../design-system/dist/tokens/colors.js", "../../../design-system/dist/tokens/panel-shell.js", "../src/FAQWidgetLit.ts", "../src/faq-styles.ts", "../src/runtime.ts"],
4
- "sourcesContent": ["/**\n * Adaptive FAQ - Action Executors\n *\n * Three executors that operate on the FAQStore:\n * - executeScrollToFaq: scroll to a FAQ item and optionally expand it\n * - executeToggleFaqItem: open / close / toggle a FAQ item\n * - executeUpdateFaq: add, remove, reorder, or replace FAQ items\n */\n\nimport type { FAQStore } from './state';\nimport type {\n ExecutorContext,\n ExecutorResult,\n FAQQuestionAction,\n ScrollToFaqAction,\n ToggleFaqItemAction,\n UpdateFaqAction,\n} from './types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Resolve a FAQ item by direct ID or by fuzzy question text match.\n * Throws if neither yields a result.\n */\nfunction resolveItem(store: FAQStore, itemId?: string, itemQuestion?: string): FAQQuestionAction {\n if (itemId) {\n const found = store.getState().items.find((i) => i.config.id === itemId);\n if (found) return found;\n }\n\n if (itemQuestion) {\n const found = store.findByQuestion(itemQuestion);\n if (found) return found;\n }\n\n throw new Error('FAQ item not found');\n}\n\n// ============================================================================\n// executeScrollToFaq\n// ============================================================================\n\n/**\n * Scroll to a FAQ item in the DOM and optionally expand it.\n *\n * Looks up the item by `itemId` or `itemQuestion`, scrolls the matching\n * `[data-faq-item-id]` element into view, and expands it unless\n * `expand` is explicitly set to `false`.\n */\nexport async function executeScrollToFaq(\n action: ScrollToFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n\n // Expand the item unless explicitly told not to\n if (action.expand !== false) {\n store.expand(id);\n }\n\n // Scroll the DOM element into view (may be absent in test environments)\n const el = document.querySelector(`[data-faq-item-id=\"${id}\"]`);\n if (el) {\n el.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n });\n }\n\n // Publish analytics event\n context.publishEvent('faq:scroll_to', { itemId: id });\n\n return {\n cleanup: () => {\n // Optionally collapse on revert\n },\n };\n}\n\n// ============================================================================\n// executeToggleFaqItem\n// ============================================================================\n\n/**\n * Open, close, or toggle a FAQ item's expanded state.\n */\nexport async function executeToggleFaqItem(\n action: ToggleFaqItemAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n const desiredState = action.state ?? 'toggle';\n\n let newState: 'open' | 'closed';\n\n switch (desiredState) {\n case 'open':\n store.expand(id);\n newState = 'open';\n break;\n case 'closed':\n store.collapse(id);\n newState = 'closed';\n break;\n default: {\n const wasExpanded = store.getState().expandedItems.has(id);\n store.toggle(id);\n newState = wasExpanded ? 'closed' : 'open';\n break;\n }\n }\n\n context.publishEvent('faq:toggle', { itemId: id, newState });\n\n return {\n cleanup: () => {\n // Revert toggle on cleanup\n },\n };\n}\n\n// ============================================================================\n// executeUpdateFaq\n// ============================================================================\n\n/**\n * Add, remove, reorder, or replace FAQ items in the store.\n */\nexport async function executeUpdateFaq(\n action: UpdateFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n switch (action.operation) {\n case 'add': {\n const items = action.items ?? [];\n const position = action.position === 'prepend' ? 'prepend' : 'append';\n store.addItems(items, position);\n break;\n }\n\n case 'remove': {\n if (!action.itemId) {\n throw new Error('FAQ item not found');\n }\n // Verify the item exists before removing\n const exists = store.getState().items.some((i) => i.config.id === action.itemId);\n if (!exists) {\n throw new Error('FAQ item not found');\n }\n store.removeItem(action.itemId);\n break;\n }\n\n case 'reorder': {\n const order = action.order ?? [];\n store.reorderItems(order);\n break;\n }\n\n case 'replace': {\n const items = action.items ?? [];\n store.replaceItems(items);\n break;\n }\n }\n\n context.publishEvent('faq:update', { operation: action.operation });\n\n return {\n cleanup: () => {\n // Could snapshot previous state for undo\n },\n };\n}\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by adaptive-faq.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executorDefinitions = [\n { kind: 'faq:scroll_to', executor: executeScrollToFaq },\n { kind: 'faq:toggle_item', executor: executeToggleFaqItem },\n { kind: 'faq:update', executor: executeUpdateFaq },\n] as const;\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n// ============================================================================\n// BASE COLORS\n// ============================================================================\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n};\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n};\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n};\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n};\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n};\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n};\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n};\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n};\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n};\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n};\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n};\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n};\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n};\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n};\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n};\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n};\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n};\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n};\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: slateGrey[3],\n};\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n};\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n};\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n};\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n};\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n};\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n};\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n};\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n};\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n};\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n};\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n};\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n};\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\nexport const scroll = slateGrey[9];\n// ============================================================================\n// EXPORTS\n// ============================================================================\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n};\nexport default colors;\n", "/**\n * Syntro Design System \u2014 Editor Panel Shell Tokens\n *\n * Single source of truth for the floating editor panel's visuals and behavior.\n * Consumed by:\n * - packages/shared-editor-ui/src/components/EditorPanelShell.tsx (React)\n * - packages/shared-editor-ui/src/controllers/PanelShellController.ts (Lit)\n *\n * Any change here updates both React and Lit panels in one step \u2014 no drift.\n */\nimport { base, brand } from './colors';\n// ============================================================================\n// Panel background & shadows\n// ============================================================================\n/** Dark gradient rendered behind the panel contents (backdrop-blur layered on). */\nexport const panelBackground = 'linear-gradient(160deg, rgba(7,8,10,0.84) 0%, rgba(14,17,20,0.88) 45%, rgba(15,19,24,0.84) 100%)';\n/** Outer shadows for the panel, indexed by dock state. */\nexport const panelShadows = {\n /** Free-floating panel \u2014 shadow all sides. */\n floating: '0 8px 60px rgba(0,0,0,0.5)',\n /** Docked to left \u2014 shadow cast rightward into page. */\n dockedLeft: '20px 0 60px rgba(0,0,0,0.5)',\n /** Docked to right \u2014 shadow cast leftward into page. */\n dockedRight: '-20px 0 60px rgba(0,0,0,0.5)',\n};\n/** Backdrop-filter blur radius applied to the panel surface. */\nexport const panelBackdropBlur = '12px';\n// ============================================================================\n// FAB (floating action button) visuals\n// ============================================================================\nexport const fab = {\n /** Diameter in pixels. */\n size: 56,\n /** Inset from the panel's top-left corner in pixels. */\n inset: 12,\n /** Background color (always the brand black). */\n background: base.black,\n /** Icon / logo color. */\n color: base.white,\n /** Border \u2014 2px brand red ring. */\n border: `2px solid ${brand[3]}`,\n /** Shadow when the panel is open (inner ring for \"active\" state). */\n shadowOpen: '0 4px 24px rgba(0,0,0,0.6), 0 0 0 2px rgba(255,255,255,0.08)',\n /** Shadow when the panel is closed. */\n shadowClosed: '0 4px 24px rgba(0,0,0,0.6)',\n};\n// ============================================================================\n// Behavior: resize, drag, snap\n// ============================================================================\nexport const panelBehavior = {\n /** Minimum panel width when resizing or undocked. */\n minWidth: 480,\n /** Minimum panel height when resizing or undocked. */\n minHeight: 400,\n /** Edge thickness of resize handles in pixels. */\n handleSize: 8,\n /** Pixels the FAB must move before a press becomes a drag (vs a click). */\n dragThreshold: 5,\n /** Distance from a viewport edge that triggers edge-dock snapping. */\n snapThreshold: 20,\n};\n// ============================================================================\n// Aggregate export\n// ============================================================================\nexport const panelShell = {\n background: panelBackground,\n shadows: panelShadows,\n backdropBlur: panelBackdropBlur,\n fab,\n behavior: panelBehavior,\n};\nexport default panelShell;\n", "/**\n * Adaptive FAQ - FAQWidgetLit\n *\n * Lit web component equivalent of FAQWidget.tsx.\n * Renders a collapsible Q&A accordion with search, category grouping,\n * feedback, and markdown rendering \u2014 all as a custom element with no\n * Shadow DOM (light DOM via createRenderRoot).\n *\n * Tag name: <syntro-faq-accordion>\n *\n * Decorator-free: uses `static override properties` (tsconfig has no\n * experimentalDecorators).\n */\n\nimport { purple, slateGrey } from '@syntro/design-system/tokens';\nimport { html, LitElement, nothing } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { Marked } from 'marked';\nimport { baseStyles, themeStyles } from './faq-styles';\nimport type { FAQWidgetRuntime } from './faq-types';\nimport type {\n FAQAnswer,\n FAQConfig,\n FAQQuestionAction,\n FeedbackConfig,\n FeedbackValue,\n} from './types';\n\n// ============================================================================\n// Utility \u2014 styleMap accepts Record<string, string | number | undefined>\n// but its TypeScript signature is overly narrow in some Lit versions.\n// Cast through unknown to avoid false positives when style values include\n// numeric CSS properties (fontWeight, lineHeight, etc.).\n// ============================================================================\n\nfunction sm(styles: Record<string, unknown>): Record<string, string> {\n return styles as unknown as Record<string, string>;\n}\n\nconst marked = new Marked({ async: false, gfm: true, breaks: true });\n\n// ============================================================================\n// Helpers (mirrored from FAQWidget.tsx)\n// ============================================================================\n\nfunction getAnswerText(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return answer.html;\n return answer.content;\n}\n\nfunction renderAnswerHtml(answer: FAQAnswer): string {\n if (typeof answer === 'string') {\n return marked.parse(answer) as string;\n }\n if (answer.type === 'rich') {\n return answer.html;\n }\n return marked.parse(answer.content) as string;\n}\n\nfunction resolveFeedbackConfig(\n feedback: boolean | FeedbackConfig | undefined\n): FeedbackConfig | null {\n if (!feedback) return null;\n if (feedback === true) return { style: 'thumbs' };\n return feedback;\n}\n\nfunction getFeedbackPrompt(feedbackConfig: FeedbackConfig): string {\n return feedbackConfig.prompt ?? 'Was this helpful?';\n}\n\nfunction resolveTheme(theme: FAQConfig['theme'] | undefined): 'light' | 'dark' {\n if (theme && theme !== 'auto') return theme;\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n}\n\n// ============================================================================\n// FAQAccordionElement \u2014 Lit element\n// ============================================================================\n\n/**\n * <syntro-faq-accordion> \u2014 light-DOM Lit web component.\n *\n * Set properties imperatively (no attribute serialisation for objects):\n * el.faqConfig = { expandBehavior: 'single', ... };\n * el.runtime = runtimeInstance;\n * el.instanceId = 'my-faq';\n */\nexport class FAQAccordionElement extends LitElement {\n // -----------------------------------------------------------------------\n // Reactive properties (no decorators \u2014 tsconfig forbids experimentalDecorators)\n // -----------------------------------------------------------------------\n\n static override properties = {\n // Public API \u2014 set from the outside\n faqConfig: { attribute: false },\n runtime: { attribute: false },\n instanceId: { type: String },\n\n // Internal reactive state (prefixed with _ to signal \"private\")\n _expandedIds: { state: true },\n _highlightId: { state: true },\n _searchQuery: { state: true },\n _feedbackState: { state: true },\n _hoveredId: { state: true },\n };\n\n // -----------------------------------------------------------------------\n // Property declarations\n // -----------------------------------------------------------------------\n\n faqConfig: FAQConfig = {\n expandBehavior: 'single',\n searchable: false,\n theme: 'auto',\n actions: [],\n };\n\n runtime: FAQWidgetRuntime | null = null;\n\n instanceId: string = 'faq-widget';\n\n // Internal state\n _expandedIds: Set<string> = new Set();\n _highlightId: string | null = null;\n _searchQuery: string = '';\n _feedbackState: Map<string, FeedbackValue> = new Map();\n _hoveredId: string | null = null;\n\n // Subscription cleanup handles\n private _unsubContext: (() => void) | null = null;\n private _unsubAccumulator: (() => void) | null = null;\n private _unsubCta: (() => void) | null = null;\n private _unsubDeepLink: (() => void) | null = null;\n private _unsubSessionMetrics: (() => void) | null = null;\n private _highlightTimer: ReturnType<typeof setTimeout> | null = null;\n\n // -----------------------------------------------------------------------\n // Light DOM \u2014 no Shadow DOM so CSS variables from the host page apply\n // -----------------------------------------------------------------------\n\n override createRenderRoot() {\n return this;\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n override connectedCallback() {\n super.connectedCallback();\n this._subscribeAll();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._unsubscribeAll();\n if (this._highlightTimer !== null) {\n clearTimeout(this._highlightTimer);\n this._highlightTimer = null;\n }\n }\n\n // Re-subscribe when runtime changes (property may be set after connectedCallback)\n override updated(changedProps: Map<string, unknown>) {\n if (changedProps.has('runtime')) {\n this._unsubscribeAll();\n this._subscribeAll();\n }\n }\n\n // -----------------------------------------------------------------------\n // Subscription management\n // -----------------------------------------------------------------------\n\n private _subscribeAll() {\n if (!this.runtime) return;\n\n // Context changes \u2192 force re-render\n this._unsubContext = this.runtime.context.subscribe(() => {\n this.requestUpdate();\n });\n\n // Accumulator changes \u2192 force re-render (for event_count triggerWhen)\n if (this.runtime.accumulator?.subscribe) {\n this._unsubAccumulator = this.runtime.accumulator.subscribe(() => {\n this.requestUpdate();\n });\n }\n\n // Session metric changes \u2192 force re-render (for session_metric triggerWhen)\n if (this.runtime.sessionMetrics?.subscribe) {\n this._unsubSessionMetrics = this.runtime.sessionMetrics.subscribe(() => {\n this.requestUpdate();\n });\n }\n\n // faq:open:* events from overlay CTA clicks\n if (this.runtime.events.subscribe) {\n // Check EventBus history for pending faq:open events\n if (this.runtime.events.getRecent) {\n const recentEvents = this.runtime.events.getRecent(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n 10\n );\n const pendingEvent = recentEvents\n .filter((e) => {\n const actionId = e.props?.actionId;\n return typeof actionId === 'string' && actionId.startsWith('faq:open:');\n })\n .pop();\n\n if (pendingEvent && Date.now() - pendingEvent.ts < 10000) {\n const questionId = (pendingEvent.props!.actionId as string).replace('faq:open:', '');\n this._expandedIds = new Set([questionId]);\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n }\n }\n\n this._unsubCta = this.runtime.events.subscribe(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n (event) => {\n const actionId = event.props?.actionId;\n if (typeof actionId !== 'string' || !actionId.startsWith('faq:open:')) return;\n const questionId = actionId.replace('faq:open:', '');\n this._expandedIds = new Set([questionId]);\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n this.runtime?.events.publish('canvas.requestOpen');\n }\n );\n }\n\n // notification.deep_link events\n if (this.runtime.events.subscribe) {\n const handleDeepLink = (event: { name: string; props?: Record<string, unknown> }) => {\n const tileId = event.props?.tileId as string | undefined;\n const itemId = event.props?.itemId as string | undefined;\n if (tileId !== this.instanceId) return;\n if (!itemId) return;\n\n this._expandedIds = new Set([itemId]);\n this._highlightId = itemId;\n\n if (this._highlightTimer !== null) clearTimeout(this._highlightTimer);\n this._highlightTimer = setTimeout(() => {\n this._highlightId = null;\n this._highlightTimer = null;\n }, 1500);\n\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${itemId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n };\n\n // Check recent events (may have fired before widget mounted)\n if (this.runtime.events.getRecent) {\n const recent = this.runtime.events.getRecent({ names: ['notification.deep_link'] }, 5);\n const pending = recent\n .filter((e) => (e.props?.tileId as string) === this.instanceId && e.props?.itemId)\n .pop();\n if (pending && Date.now() - pending.ts < 10000) {\n handleDeepLink(pending);\n }\n }\n\n this._unsubDeepLink = this.runtime.events.subscribe(\n { names: ['notification.deep_link'] },\n handleDeepLink\n );\n }\n }\n\n private _unsubscribeAll() {\n this._unsubContext?.();\n this._unsubAccumulator?.();\n this._unsubSessionMetrics?.();\n this._unsubCta?.();\n this._unsubDeepLink?.();\n this._unsubContext = null;\n this._unsubAccumulator = null;\n this._unsubSessionMetrics = null;\n this._unsubCta = null;\n this._unsubDeepLink = null;\n }\n\n // -----------------------------------------------------------------------\n // Handlers\n // -----------------------------------------------------------------------\n\n private _handleToggle(id: string) {\n const prev = this._expandedIds;\n let next: Set<string>;\n\n if (this.faqConfig.expandBehavior === 'single') {\n next = prev.has(id) ? new Set() : new Set([id]);\n } else {\n next = new Set(prev);\n if (prev.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n }\n\n const willBeExpanded = !prev.has(id);\n this._expandedIds = next;\n\n this.runtime?.events.publish('faq:toggled', {\n instanceId: this.instanceId,\n questionId: id,\n expanded: willBeExpanded,\n timestamp: Date.now(),\n });\n }\n\n private _handleFeedback(itemId: string, question: string, value: FeedbackValue) {\n const next = new Map(this._feedbackState);\n next.set(itemId, value);\n this._feedbackState = next;\n\n this.runtime?.events.publish('faq:feedback', { itemId, question, value });\n }\n\n // -----------------------------------------------------------------------\n // Computed helpers\n // -----------------------------------------------------------------------\n\n private _visibleQuestions(): FAQQuestionAction[] {\n return (this.faqConfig.actions ?? []).filter((q) => {\n if (!q.triggerWhen) return true;\n if (!this.runtime) return true;\n const result = this.runtime.evaluateSync<boolean>(q.triggerWhen);\n return result.value;\n });\n }\n\n private _orderedQuestions(visible: FAQQuestionAction[]): FAQQuestionAction[] {\n if (this.faqConfig.ordering === 'priority') {\n return [...visible].sort((a, b) => (b.config.priority ?? 0) - (a.config.priority ?? 0));\n }\n return visible;\n }\n\n private _filteredQuestions(ordered: FAQQuestionAction[]): FAQQuestionAction[] {\n const q = this._searchQuery.trim().toLowerCase();\n if (!this.faqConfig.searchable || !q) return ordered;\n return ordered.filter(\n (item) =>\n item.config.question.toLowerCase().includes(q) ||\n getAnswerText(item.config.answer).toLowerCase().includes(q) ||\n item.config.category?.toLowerCase().includes(q)\n );\n }\n\n private _categoryGroups(\n filtered: FAQQuestionAction[]\n ): Map<string | undefined, FAQQuestionAction[]> {\n const groups = new Map<string | undefined, FAQQuestionAction[]>();\n for (const item of filtered) {\n const cat = item.config.category;\n if (!groups.has(cat)) groups.set(cat, []);\n groups.get(cat)!.push(item);\n }\n return groups;\n }\n\n // -----------------------------------------------------------------------\n // Render helpers\n // -----------------------------------------------------------------------\n\n private _renderAnswer(answer: FAQAnswer) {\n const html_str = renderAnswerHtml(answer);\n return html`<div style=\"margin:0\" data-faq-markdown=\"\">${unsafeHTML(html_str)}</div>`;\n }\n\n private _renderFeedback(\n item: FAQQuestionAction,\n feedbackConfig: FeedbackConfig,\n feedbackValue: FeedbackValue | undefined,\n theme: 'light' | 'dark'\n ) {\n const colors = themeStyles[theme];\n const feedbackStyle = { ...baseStyles.feedback, ...colors.feedbackPrompt };\n\n return html`\n <div style=${styleMap(sm(feedbackStyle))}>\n <span>${getFeedbackPrompt(feedbackConfig)}</span>\n <button\n type=\"button\"\n style=${styleMap(\n sm({\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'up' ? baseStyles.feedbackButtonSelected : {}),\n })\n )}\n aria-label=\"Thumbs up\"\n @click=${() => this._handleFeedback(item.config.id, item.config.question, 'up')}\n >\\uD83D\\uDC4D</button>\n <button\n type=\"button\"\n style=${styleMap(\n sm({\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'down' ? baseStyles.feedbackButtonSelected : {}),\n })\n )}\n aria-label=\"Thumbs down\"\n @click=${() => this._handleFeedback(item.config.id, item.config.question, 'down')}\n >\\uD83D\\uDC4E</button>\n </div>\n `;\n }\n\n private _renderItem(\n item: FAQQuestionAction,\n isLast: boolean,\n theme: 'light' | 'dark',\n feedbackConfig: FeedbackConfig | null\n ) {\n const colors = themeStyles[theme];\n const isExpanded = this._expandedIds.has(item.config.id);\n const isHighlighted = this._highlightId === item.config.id;\n const isHovered = this._hoveredId === item.config.id;\n\n const itemStyle = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n ...(isHighlighted\n ? {\n boxShadow: `0 0 0 2px ${purple[4]}, 0 0 12px rgba(106, 89, 206, 0.4)`,\n transition: 'box-shadow 0.3s ease',\n }\n : {}),\n ...(!isLast ? { borderBottom: 'var(--sc-content-item-divider, none)' } : {}),\n };\n\n const questionStyle = {\n ...baseStyles.question,\n ...colors.question,\n ...(isHovered ? colors.questionHover : {}),\n };\n\n const chevronStyle = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n };\n\n const answerStyle = {\n ...baseStyles.answer,\n ...colors.answer,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n\n return html`\n <div\n style=${styleMap(sm(itemStyle))}\n data-faq-item-id=${item.config.id}\n >\n <button\n type=\"button\"\n style=${styleMap(sm(questionStyle))}\n aria-expanded=${isExpanded}\n @click=${() => this._handleToggle(item.config.id)}\n @mouseenter=${() => {\n this._hoveredId = item.config.id;\n }}\n @mouseleave=${() => {\n this._hoveredId = null;\n }}\n >\n <span>${item.config.question}</span>\n <span style=${styleMap(sm(chevronStyle))}>\\u203A</span>\n </button>\n\n <div\n style=${styleMap(sm(answerStyle))}\n aria-hidden=${!isExpanded}\n >\n ${this._renderAnswer(item.config.answer)}\n ${\n isExpanded && feedbackConfig\n ? this._renderFeedback(\n item,\n feedbackConfig,\n this._feedbackState.get(item.config.id),\n theme\n )\n : nothing\n }\n </div>\n </div>\n `;\n }\n\n private _renderItems(\n items: FAQQuestionAction[],\n theme: 'light' | 'dark',\n feedbackConfig: FeedbackConfig | null\n ) {\n return items.map((item, index) =>\n this._renderItem(item, index === items.length - 1, theme, feedbackConfig)\n );\n }\n\n // -----------------------------------------------------------------------\n // Render\n // -----------------------------------------------------------------------\n\n override render() {\n const theme = resolveTheme(this.faqConfig.theme);\n const colors = themeStyles[theme];\n const feedbackConfig = resolveFeedbackConfig(this.faqConfig.feedback);\n\n const visible = this._visibleQuestions();\n const ordered = this._orderedQuestions(visible);\n const filtered = this._filteredQuestions(ordered);\n const hasCategories = filtered.some((q) => q.config.category);\n const groups = hasCategories ? this._categoryGroups(filtered) : null;\n\n const containerStyle = {\n ...baseStyles.container,\n ...colors.container,\n };\n\n const emptyStateStyle = {\n ...baseStyles.emptyState,\n ...colors.emptyState,\n };\n\n const categoryHeaderStyle = {\n ...baseStyles.categoryHeader,\n ...colors.categoryHeader,\n };\n\n const searchInputStyle = {\n ...baseStyles.searchInput,\n ...colors.searchInput,\n };\n\n // Empty state \u2014 no visible questions at all\n if (visible.length === 0) {\n return html`\n <div\n style=${styleMap(sm(containerStyle))}\n data-adaptive-id=${this.instanceId}\n data-adaptive-type=\"adaptive-faq\"\n >\n <div style=${styleMap(sm(emptyStateStyle))}>\n You're all set for now! We'll surface answers here when they're relevant to what\n you're doing.\n </div>\n </div>\n `;\n }\n\n return html`\n <div\n style=${styleMap(sm(containerStyle))}\n data-adaptive-id=${this.instanceId}\n data-adaptive-type=\"adaptive-faq\"\n >\n ${\n this.faqConfig.searchable\n ? html`\n <div style=${styleMap(sm(baseStyles.searchWrapper))}>\n <style>\n [data-adaptive-id=\"${this.instanceId}\"] input::placeholder {\n color: var(--sc-content-search-color, inherit);\n opacity: 0.7;\n }\n </style>\n <input\n type=\"text\"\n placeholder=\"Search questions...\"\n .value=${this._searchQuery}\n style=${styleMap(sm(searchInputStyle))}\n @input=${(e: InputEvent) => {\n this._searchQuery = (e.target as HTMLInputElement).value;\n }}\n />\n </div>\n `\n : nothing\n }\n\n <div style=${styleMap(sm(baseStyles.accordion))}>\n ${\n groups\n ? Array.from(groups.entries()).map(\n ([category, items]) => html`\n ${\n category\n ? html`\n <div\n style=${styleMap(sm(categoryHeaderStyle))}\n data-category-header=${category}\n >\n ${category}\n </div>\n `\n : nothing\n }\n ${this._renderItems(items, theme, feedbackConfig)}\n `\n )\n : this._renderItems(filtered, theme, feedbackConfig)\n }\n </div>\n\n ${\n this.faqConfig.searchable && filtered.length === 0 && this._searchQuery\n ? html`\n <div\n style=${styleMap(sm({ ...baseStyles.noResults, ...colors.emptyState }))}\n >\n No questions found matching &quot;${this._searchQuery}&quot;\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\n// ============================================================================\n// Custom element registration\n// ============================================================================\n\nif (!customElements.get('syntro-faq-accordion')) {\n customElements.define('syntro-faq-accordion', FAQAccordionElement);\n}\n\nexport default FAQAccordionElement;\n", "/**\n * Adaptive FAQ - Styles\n *\n * BaseStyles object (font, layout, colors, animations) and theme integration\n * for the FAQWidget component.\n */\n\nimport { purple, slateGrey } from '@syntro/design-system/tokens';\n\n// ============================================================================\n// Base Styles\n// ============================================================================\n\nexport const baseStyles = {\n container: {\n fontFamily: 'var(--sc-font-family, system-ui, -apple-system, sans-serif)',\n maxWidth: '800px',\n margin: '0 auto',\n },\n searchWrapper: {\n marginBottom: '8px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n outline: 'none',\n transition: 'border-color 0.15s ease',\n backgroundColor: 'var(--sc-content-search-background)',\n color: 'var(--sc-content-search-color)',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: 'var(--sc-content-item-gap, 6px)',\n },\n item: {\n borderRadius: 'var(--sc-content-border-radius, 8px)',\n overflow: 'hidden',\n transition: 'box-shadow 0.15s ease',\n },\n question: {\n width: '100%',\n padding: 'var(--sc-content-item-padding, 12px 16px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n border: 'none',\n cursor: 'pointer',\n fontSize: 'var(--sc-content-item-font-size, 15px)',\n fontWeight: 500,\n textAlign: 'left' as const,\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '20px',\n transition: 'transform 0.2s ease',\n color: 'var(--sc-content-chevron-color, currentColor)',\n },\n answer: {\n padding: 'var(--sc-content-body-padding, 0 16px 12px 16px)',\n fontSize: 'var(--sc-content-body-font-size, 14px)',\n lineHeight: 1.6,\n overflow: 'hidden',\n transition: 'max-height 0.2s ease, padding 0.2s ease',\n },\n category: {\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: '4px 8px',\n borderRadius: '4px',\n marginBottom: '8px',\n },\n categoryHeader: {\n fontSize: 'var(--sc-content-category-font-size, 12px)',\n fontWeight: 700,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: 'var(--sc-content-category-padding, 8px 4px 4px 4px)',\n marginTop: 'var(--sc-content-category-gap, 4px)',\n },\n feedback: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginTop: '12px',\n paddingTop: '10px',\n borderTop: '1px solid rgba(0, 0, 0, 0.08)',\n fontSize: '13px',\n },\n feedbackButton: {\n background: 'none',\n border: '1px solid transparent',\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px 8px',\n borderRadius: '4px',\n transition: 'background-color 0.15s ease, border-color 0.15s ease',\n },\n feedbackButtonSelected: {\n borderColor: 'rgba(0, 0, 0, 0.2)',\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '48px 24px',\n fontSize: '14px',\n },\n noResults: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n fontSize: '14px',\n },\n} as const;\n\n// ============================================================================\n// Theme Styles\n// ============================================================================\n\nexport const themeStyles = {\n light: {\n container: {\n backgroundColor: 'transparent',\n color: 'inherit',\n },\n searchInput: {\n border: `1px solid ${slateGrey[11]}`,\n },\n item: {\n backgroundColor: 'var(--sc-content-background)',\n borderTop: 'var(--sc-content-border)',\n borderRight: 'var(--sc-content-border)',\n borderBottom: 'var(--sc-content-border)',\n borderLeft: 'var(--sc-content-border)',\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n question: {\n backgroundColor: 'transparent',\n color: 'var(--sc-content-text-color)',\n },\n questionHover: {\n backgroundColor: 'var(--sc-content-background-hover)',\n },\n answer: {\n color: 'var(--sc-content-text-secondary-color)',\n },\n category: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n feedbackPrompt: {\n color: slateGrey[7],\n },\n },\n dark: {\n container: {\n backgroundColor: 'transparent',\n color: 'inherit',\n },\n searchInput: {\n border: `1px solid ${slateGrey[5]}`,\n },\n item: {\n backgroundColor: 'var(--sc-content-background)',\n borderTop: 'var(--sc-content-border)',\n borderRight: 'var(--sc-content-border)',\n borderBottom: 'var(--sc-content-border)',\n borderLeft: 'var(--sc-content-border)',\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n },\n question: {\n backgroundColor: 'transparent',\n color: 'var(--sc-content-text-color)',\n },\n questionHover: {\n backgroundColor: 'var(--sc-content-background-hover)',\n },\n answer: {\n color: 'var(--sc-content-text-secondary-color)',\n },\n category: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n feedbackPrompt: {\n color: slateGrey[8],\n },\n },\n};\n", "/**\n * Adaptive FAQ - Runtime Module\n *\n * Runtime manifest for the FAQ accordion adaptive.\n * Mounts the Lit web component <syntro-faq-accordion>.\n * Provides action executors and widget registration.\n */\n\nimport { executorDefinitions } from './executors';\nimport './FAQWidgetLit'; // registers <syntro-faq-accordion> custom element\nimport type { FAQWidgetRuntime } from './faq-types';\nimport type { FAQConfig, FAQQuestionAction } from './types';\n\n// ============================================================================\n// Lit Mountable Widget\n// ============================================================================\n\n/**\n * Mountable widget interface for <syntro-faq-accordion> (Lit web component).\n */\nexport const FAQWidgetLitMountable = {\n mount(\n container: HTMLElement,\n config?: FAQConfig & { runtime?: FAQWidgetRuntime; instanceId?: string }\n ) {\n const {\n runtime,\n instanceId = 'faq-widget',\n ...faqConfig\n } = config ?? {\n expandBehavior: 'single' as const,\n searchable: false,\n theme: 'auto' as const,\n actions: [],\n };\n\n const el = document.createElement('syntro-faq-accordion') as HTMLElement & {\n faqConfig: FAQConfig;\n runtime: FAQWidgetRuntime | null;\n instanceId: string;\n };\n\n Object.assign(el, {\n faqConfig: faqConfig as FAQConfig,\n runtime: runtime ?? null,\n instanceId,\n });\n\n container.appendChild(el);\n return () => el.remove();\n },\n};\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\n/**\n * Runtime manifest for adaptive-faq.\n *\n * Provides:\n * - FAQ action executors (scroll_to, toggle_item, update)\n * - Widget-based accordion using the Lit web component\n */\nexport const runtime = {\n id: 'adaptive-faq',\n version: '2.0.0',\n name: 'FAQ Accordion',\n description:\n 'Collapsible Q&A accordion with actions, rich content, feedback, and personalization',\n\n /**\n * Action executors for programmatic FAQ interaction.\n */\n executors: executorDefinitions,\n\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-faq:accordion',\n component: FAQWidgetLitMountable,\n metadata: {\n name: 'FAQ Accordion',\n description: 'Collapsible Q&A accordion with search, categories, and feedback',\n icon: '\u2753',\n subtitle: 'Curated just for you.',\n },\n },\n ],\n\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes faq:question_revealed when triggerWhen transitions false \u2192 true.\n */\n notifyWatchers(props: Record<string, unknown>) {\n const actions = (props.actions ?? []) as FAQQuestionAction[];\n return actions\n .filter((a) => a.notify && a.triggerWhen)\n .map((a) => ({\n id: `faq:${a.config.id}`,\n strategy: a.triggerWhen!,\n eventName: 'faq:question_revealed',\n eventProps: {\n questionId: a.config.id,\n question: a.config.question,\n title: a.notify!.title,\n body: a.notify!.body,\n icon: a.notify!.icon,\n },\n }));\n },\n};\n\nexport default runtime;\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/executors.ts", "../src/FAQWidgetLit.ts", "../src/faq-styles.ts", "../src/runtime.ts"],
4
+ "sourcesContent": ["/**\n * Adaptive FAQ - Action Executors\n *\n * Three executors that operate on the FAQStore:\n * - executeScrollToFaq: scroll to a FAQ item and optionally expand it\n * - executeToggleFaqItem: open / close / toggle a FAQ item\n * - executeUpdateFaq: add, remove, reorder, or replace FAQ items\n */\n\nimport type { FAQStore } from './state';\nimport type {\n ExecutorContext,\n ExecutorResult,\n FAQQuestionAction,\n ScrollToFaqAction,\n ToggleFaqItemAction,\n UpdateFaqAction,\n} from './types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Resolve a FAQ item by direct ID or by fuzzy question text match.\n * Throws if neither yields a result.\n */\nfunction resolveItem(store: FAQStore, itemId?: string, itemQuestion?: string): FAQQuestionAction {\n if (itemId) {\n const found = store.getState().items.find((i) => i.config.id === itemId);\n if (found) return found;\n }\n\n if (itemQuestion) {\n const found = store.findByQuestion(itemQuestion);\n if (found) return found;\n }\n\n throw new Error('FAQ item not found');\n}\n\n// ============================================================================\n// executeScrollToFaq\n// ============================================================================\n\n/**\n * Scroll to a FAQ item in the DOM and optionally expand it.\n *\n * Looks up the item by `itemId` or `itemQuestion`, scrolls the matching\n * `[data-faq-item-id]` element into view, and expands it unless\n * `expand` is explicitly set to `false`.\n */\nexport async function executeScrollToFaq(\n action: ScrollToFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n\n // Expand the item unless explicitly told not to\n if (action.expand !== false) {\n store.expand(id);\n }\n\n // Scroll the DOM element into view (may be absent in test environments)\n const el = document.querySelector(`[data-faq-item-id=\"${id}\"]`);\n if (el) {\n el.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n });\n }\n\n // Publish analytics event\n context.publishEvent('faq:scroll_to', { itemId: id });\n\n return {\n cleanup: () => {\n // Optionally collapse on revert\n },\n };\n}\n\n// ============================================================================\n// executeToggleFaqItem\n// ============================================================================\n\n/**\n * Open, close, or toggle a FAQ item's expanded state.\n */\nexport async function executeToggleFaqItem(\n action: ToggleFaqItemAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n const desiredState = action.state ?? 'toggle';\n\n let newState: 'open' | 'closed';\n\n switch (desiredState) {\n case 'open':\n store.expand(id);\n newState = 'open';\n break;\n case 'closed':\n store.collapse(id);\n newState = 'closed';\n break;\n default: {\n const wasExpanded = store.getState().expandedItems.has(id);\n store.toggle(id);\n newState = wasExpanded ? 'closed' : 'open';\n break;\n }\n }\n\n context.publishEvent('faq:toggle', { itemId: id, newState });\n\n return {\n cleanup: () => {\n // Revert toggle on cleanup\n },\n };\n}\n\n// ============================================================================\n// executeUpdateFaq\n// ============================================================================\n\n/**\n * Add, remove, reorder, or replace FAQ items in the store.\n */\nexport async function executeUpdateFaq(\n action: UpdateFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n switch (action.operation) {\n case 'add': {\n const items = action.items ?? [];\n const position = action.position === 'prepend' ? 'prepend' : 'append';\n store.addItems(items, position);\n break;\n }\n\n case 'remove': {\n if (!action.itemId) {\n throw new Error('FAQ item not found');\n }\n // Verify the item exists before removing\n const exists = store.getState().items.some((i) => i.config.id === action.itemId);\n if (!exists) {\n throw new Error('FAQ item not found');\n }\n store.removeItem(action.itemId);\n break;\n }\n\n case 'reorder': {\n const order = action.order ?? [];\n store.reorderItems(order);\n break;\n }\n\n case 'replace': {\n const items = action.items ?? [];\n store.replaceItems(items);\n break;\n }\n }\n\n context.publishEvent('faq:update', { operation: action.operation });\n\n return {\n cleanup: () => {\n // Could snapshot previous state for undo\n },\n };\n}\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by adaptive-faq.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executorDefinitions = [\n { kind: 'faq:scroll_to', executor: executeScrollToFaq },\n { kind: 'faq:toggle_item', executor: executeToggleFaqItem },\n { kind: 'faq:update', executor: executeUpdateFaq },\n] as const;\n", "/**\n * Adaptive FAQ - FAQWidgetLit\n *\n * Lit web component equivalent of FAQWidget.tsx.\n * Renders a collapsible Q&A accordion with search, category grouping,\n * feedback, and markdown rendering \u2014 all as a custom element with no\n * Shadow DOM (light DOM via createRenderRoot).\n *\n * Tag name: <syntro-faq-accordion>\n *\n * Decorator-free: uses `static override properties` (tsconfig has no\n * experimentalDecorators).\n */\n\nimport { purple, slateGrey } from '@syntro/design-system/tokens';\nimport { html, LitElement, nothing } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { Marked } from 'marked';\nimport { baseStyles, themeStyles } from './faq-styles';\nimport type { FAQWidgetRuntime } from './faq-types';\nimport type {\n FAQAnswer,\n FAQConfig,\n FAQQuestionAction,\n FeedbackConfig,\n FeedbackValue,\n} from './types';\n\n// ============================================================================\n// Utility \u2014 styleMap accepts Record<string, string | number | undefined>\n// but its TypeScript signature is overly narrow in some Lit versions.\n// Cast through unknown to avoid false positives when style values include\n// numeric CSS properties (fontWeight, lineHeight, etc.).\n// ============================================================================\n\nfunction sm(styles: Record<string, unknown>): Record<string, string> {\n return styles as unknown as Record<string, string>;\n}\n\nconst marked = new Marked({ async: false, gfm: true, breaks: true });\n\n// ============================================================================\n// Helpers (mirrored from FAQWidget.tsx)\n// ============================================================================\n\nfunction getAnswerText(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return answer.html;\n return answer.content;\n}\n\nfunction renderAnswerHtml(answer: FAQAnswer): string {\n if (typeof answer === 'string') {\n return marked.parse(answer) as string;\n }\n if (answer.type === 'rich') {\n return answer.html;\n }\n return marked.parse(answer.content) as string;\n}\n\nfunction resolveFeedbackConfig(\n feedback: boolean | FeedbackConfig | undefined\n): FeedbackConfig | null {\n if (!feedback) return null;\n if (feedback === true) return { style: 'thumbs' };\n return feedback;\n}\n\nfunction getFeedbackPrompt(feedbackConfig: FeedbackConfig): string {\n return feedbackConfig.prompt ?? 'Was this helpful?';\n}\n\nfunction resolveTheme(theme: FAQConfig['theme'] | undefined): 'light' | 'dark' {\n if (theme && theme !== 'auto') return theme;\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n}\n\n// ============================================================================\n// FAQAccordionElement \u2014 Lit element\n// ============================================================================\n\n/**\n * <syntro-faq-accordion> \u2014 light-DOM Lit web component.\n *\n * Set properties imperatively (no attribute serialisation for objects):\n * el.faqConfig = { expandBehavior: 'single', ... };\n * el.runtime = runtimeInstance;\n * el.instanceId = 'my-faq';\n */\nexport class FAQAccordionElement extends LitElement {\n // -----------------------------------------------------------------------\n // Reactive properties (no decorators \u2014 tsconfig forbids experimentalDecorators)\n // -----------------------------------------------------------------------\n\n static override properties = {\n // Public API \u2014 set from the outside\n faqConfig: { attribute: false },\n runtime: { attribute: false },\n instanceId: { type: String },\n\n // Internal reactive state (prefixed with _ to signal \"private\")\n _expandedIds: { state: true },\n _highlightId: { state: true },\n _searchQuery: { state: true },\n _feedbackState: { state: true },\n _hoveredId: { state: true },\n };\n\n // -----------------------------------------------------------------------\n // Property declarations\n // -----------------------------------------------------------------------\n\n faqConfig: FAQConfig = {\n expandBehavior: 'single',\n searchable: false,\n theme: 'auto',\n actions: [],\n };\n\n runtime: FAQWidgetRuntime | null = null;\n\n instanceId: string = 'faq-widget';\n\n // Internal state\n _expandedIds: Set<string> = new Set();\n _highlightId: string | null = null;\n _searchQuery: string = '';\n _feedbackState: Map<string, FeedbackValue> = new Map();\n _hoveredId: string | null = null;\n\n // Subscription cleanup handles\n private _unsubContext: (() => void) | null = null;\n private _unsubAccumulator: (() => void) | null = null;\n private _unsubCta: (() => void) | null = null;\n private _unsubDeepLink: (() => void) | null = null;\n private _unsubSessionMetrics: (() => void) | null = null;\n private _highlightTimer: ReturnType<typeof setTimeout> | null = null;\n\n // -----------------------------------------------------------------------\n // Light DOM \u2014 no Shadow DOM so CSS variables from the host page apply\n // -----------------------------------------------------------------------\n\n override createRenderRoot() {\n return this;\n }\n\n // -----------------------------------------------------------------------\n // Lifecycle\n // -----------------------------------------------------------------------\n\n override connectedCallback() {\n super.connectedCallback();\n this._subscribeAll();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._unsubscribeAll();\n if (this._highlightTimer !== null) {\n clearTimeout(this._highlightTimer);\n this._highlightTimer = null;\n }\n }\n\n // Re-subscribe when runtime changes (property may be set after connectedCallback)\n override updated(changedProps: Map<string, unknown>) {\n if (changedProps.has('runtime')) {\n this._unsubscribeAll();\n this._subscribeAll();\n }\n }\n\n // -----------------------------------------------------------------------\n // Subscription management\n // -----------------------------------------------------------------------\n\n private _subscribeAll() {\n if (!this.runtime) return;\n\n // Context changes \u2192 force re-render\n this._unsubContext = this.runtime.context.subscribe(() => {\n this.requestUpdate();\n });\n\n // Accumulator changes \u2192 force re-render (for event_count triggerWhen)\n if (this.runtime.accumulator?.subscribe) {\n this._unsubAccumulator = this.runtime.accumulator.subscribe(() => {\n this.requestUpdate();\n });\n }\n\n // Session metric changes \u2192 force re-render (for session_metric triggerWhen)\n if (this.runtime.sessionMetrics?.subscribe) {\n this._unsubSessionMetrics = this.runtime.sessionMetrics.subscribe(() => {\n this.requestUpdate();\n });\n }\n\n // faq:open:* events from overlay CTA clicks\n if (this.runtime.events.subscribe) {\n // Check EventBus history for pending faq:open events\n if (this.runtime.events.getRecent) {\n const recentEvents = this.runtime.events.getRecent(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n 10\n );\n const pendingEvent = recentEvents\n .filter((e) => {\n const actionId = e.props?.actionId;\n return typeof actionId === 'string' && actionId.startsWith('faq:open:');\n })\n .pop();\n\n if (pendingEvent && Date.now() - pendingEvent.ts < 10000) {\n const questionId = (pendingEvent.props!.actionId as string).replace('faq:open:', '');\n this._expandedIds = new Set([questionId]);\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n }\n }\n\n this._unsubCta = this.runtime.events.subscribe(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n (event) => {\n const actionId = event.props?.actionId;\n if (typeof actionId !== 'string' || !actionId.startsWith('faq:open:')) return;\n const questionId = actionId.replace('faq:open:', '');\n this._expandedIds = new Set([questionId]);\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n this.runtime?.events.publish('canvas.requestOpen');\n }\n );\n }\n\n // notification.deep_link events\n if (this.runtime.events.subscribe) {\n const handleDeepLink = (event: { name: string; props?: Record<string, unknown> }) => {\n const tileId = event.props?.tileId as string | undefined;\n const itemId = event.props?.itemId as string | undefined;\n if (tileId !== this.instanceId) return;\n if (!itemId) return;\n\n this._expandedIds = new Set([itemId]);\n this._highlightId = itemId;\n\n if (this._highlightTimer !== null) clearTimeout(this._highlightTimer);\n this._highlightTimer = setTimeout(() => {\n this._highlightId = null;\n this._highlightTimer = null;\n }, 1500);\n\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${itemId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n };\n\n // Check recent events (may have fired before widget mounted)\n if (this.runtime.events.getRecent) {\n const recent = this.runtime.events.getRecent({ names: ['notification.deep_link'] }, 5);\n const pending = recent\n .filter((e) => (e.props?.tileId as string) === this.instanceId && e.props?.itemId)\n .pop();\n if (pending && Date.now() - pending.ts < 10000) {\n handleDeepLink(pending);\n }\n }\n\n this._unsubDeepLink = this.runtime.events.subscribe(\n { names: ['notification.deep_link'] },\n handleDeepLink\n );\n }\n }\n\n private _unsubscribeAll() {\n this._unsubContext?.();\n this._unsubAccumulator?.();\n this._unsubSessionMetrics?.();\n this._unsubCta?.();\n this._unsubDeepLink?.();\n this._unsubContext = null;\n this._unsubAccumulator = null;\n this._unsubSessionMetrics = null;\n this._unsubCta = null;\n this._unsubDeepLink = null;\n }\n\n // -----------------------------------------------------------------------\n // Handlers\n // -----------------------------------------------------------------------\n\n private _handleToggle(id: string) {\n const prev = this._expandedIds;\n let next: Set<string>;\n\n if (this.faqConfig.expandBehavior === 'single') {\n next = prev.has(id) ? new Set() : new Set([id]);\n } else {\n next = new Set(prev);\n if (prev.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n }\n\n const willBeExpanded = !prev.has(id);\n this._expandedIds = next;\n\n this.runtime?.events.publish('faq:toggled', {\n instanceId: this.instanceId,\n questionId: id,\n expanded: willBeExpanded,\n timestamp: Date.now(),\n });\n }\n\n private _handleFeedback(itemId: string, question: string, value: FeedbackValue) {\n const next = new Map(this._feedbackState);\n next.set(itemId, value);\n this._feedbackState = next;\n\n this.runtime?.events.publish('faq:feedback', { itemId, question, value });\n }\n\n // -----------------------------------------------------------------------\n // Computed helpers\n // -----------------------------------------------------------------------\n\n private _visibleQuestions(): FAQQuestionAction[] {\n return (this.faqConfig.actions ?? []).filter((q) => {\n if (!q.triggerWhen) return true;\n if (!this.runtime) return true;\n const result = this.runtime.evaluateSync<boolean>(q.triggerWhen);\n return result.value;\n });\n }\n\n private _orderedQuestions(visible: FAQQuestionAction[]): FAQQuestionAction[] {\n if (this.faqConfig.ordering === 'priority') {\n return [...visible].sort((a, b) => (b.config.priority ?? 0) - (a.config.priority ?? 0));\n }\n return visible;\n }\n\n private _filteredQuestions(ordered: FAQQuestionAction[]): FAQQuestionAction[] {\n const q = this._searchQuery.trim().toLowerCase();\n if (!this.faqConfig.searchable || !q) return ordered;\n return ordered.filter(\n (item) =>\n item.config.question.toLowerCase().includes(q) ||\n getAnswerText(item.config.answer).toLowerCase().includes(q) ||\n item.config.category?.toLowerCase().includes(q)\n );\n }\n\n private _categoryGroups(\n filtered: FAQQuestionAction[]\n ): Map<string | undefined, FAQQuestionAction[]> {\n const groups = new Map<string | undefined, FAQQuestionAction[]>();\n for (const item of filtered) {\n const cat = item.config.category;\n if (!groups.has(cat)) groups.set(cat, []);\n groups.get(cat)!.push(item);\n }\n return groups;\n }\n\n // -----------------------------------------------------------------------\n // Render helpers\n // -----------------------------------------------------------------------\n\n private _renderAnswer(answer: FAQAnswer) {\n const html_str = renderAnswerHtml(answer);\n return html`<div style=\"margin:0\" data-faq-markdown=\"\">${unsafeHTML(html_str)}</div>`;\n }\n\n private _renderFeedback(\n item: FAQQuestionAction,\n feedbackConfig: FeedbackConfig,\n feedbackValue: FeedbackValue | undefined,\n theme: 'light' | 'dark'\n ) {\n const colors = themeStyles[theme];\n const feedbackStyle = { ...baseStyles.feedback, ...colors.feedbackPrompt };\n\n return html`\n <div style=${styleMap(sm(feedbackStyle))}>\n <span>${getFeedbackPrompt(feedbackConfig)}</span>\n <button\n type=\"button\"\n style=${styleMap(\n sm({\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'up' ? baseStyles.feedbackButtonSelected : {}),\n })\n )}\n aria-label=\"Thumbs up\"\n @click=${() => this._handleFeedback(item.config.id, item.config.question, 'up')}\n >\\uD83D\\uDC4D</button>\n <button\n type=\"button\"\n style=${styleMap(\n sm({\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'down' ? baseStyles.feedbackButtonSelected : {}),\n })\n )}\n aria-label=\"Thumbs down\"\n @click=${() => this._handleFeedback(item.config.id, item.config.question, 'down')}\n >\\uD83D\\uDC4E</button>\n </div>\n `;\n }\n\n private _renderItem(\n item: FAQQuestionAction,\n isLast: boolean,\n theme: 'light' | 'dark',\n feedbackConfig: FeedbackConfig | null\n ) {\n const colors = themeStyles[theme];\n const isExpanded = this._expandedIds.has(item.config.id);\n const isHighlighted = this._highlightId === item.config.id;\n const isHovered = this._hoveredId === item.config.id;\n\n const itemStyle = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n ...(isHighlighted\n ? {\n boxShadow: `0 0 0 2px ${purple[4]}, 0 0 12px rgba(106, 89, 206, 0.4)`,\n transition: 'box-shadow 0.3s ease',\n }\n : {}),\n ...(!isLast ? { borderBottom: 'var(--sc-content-item-divider, none)' } : {}),\n };\n\n const questionStyle = {\n ...baseStyles.question,\n ...colors.question,\n ...(isHovered ? colors.questionHover : {}),\n };\n\n const chevronStyle = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n };\n\n const answerStyle = {\n ...baseStyles.answer,\n ...colors.answer,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n\n return html`\n <div\n style=${styleMap(sm(itemStyle))}\n data-faq-item-id=${item.config.id}\n >\n <button\n type=\"button\"\n style=${styleMap(sm(questionStyle))}\n aria-expanded=${isExpanded}\n @click=${() => this._handleToggle(item.config.id)}\n @mouseenter=${() => {\n this._hoveredId = item.config.id;\n }}\n @mouseleave=${() => {\n this._hoveredId = null;\n }}\n >\n <span>${item.config.question}</span>\n <span style=${styleMap(sm(chevronStyle))}>\\u203A</span>\n </button>\n\n <div\n style=${styleMap(sm(answerStyle))}\n aria-hidden=${!isExpanded}\n >\n ${this._renderAnswer(item.config.answer)}\n ${\n isExpanded && feedbackConfig\n ? this._renderFeedback(\n item,\n feedbackConfig,\n this._feedbackState.get(item.config.id),\n theme\n )\n : nothing\n }\n </div>\n </div>\n `;\n }\n\n private _renderItems(\n items: FAQQuestionAction[],\n theme: 'light' | 'dark',\n feedbackConfig: FeedbackConfig | null\n ) {\n return items.map((item, index) =>\n this._renderItem(item, index === items.length - 1, theme, feedbackConfig)\n );\n }\n\n // -----------------------------------------------------------------------\n // Render\n // -----------------------------------------------------------------------\n\n override render() {\n const theme = resolveTheme(this.faqConfig.theme);\n const colors = themeStyles[theme];\n const feedbackConfig = resolveFeedbackConfig(this.faqConfig.feedback);\n\n const visible = this._visibleQuestions();\n const ordered = this._orderedQuestions(visible);\n const filtered = this._filteredQuestions(ordered);\n const hasCategories = filtered.some((q) => q.config.category);\n const groups = hasCategories ? this._categoryGroups(filtered) : null;\n\n const containerStyle = {\n ...baseStyles.container,\n ...colors.container,\n };\n\n const emptyStateStyle = {\n ...baseStyles.emptyState,\n ...colors.emptyState,\n };\n\n const categoryHeaderStyle = {\n ...baseStyles.categoryHeader,\n ...colors.categoryHeader,\n };\n\n const searchInputStyle = {\n ...baseStyles.searchInput,\n ...colors.searchInput,\n };\n\n // Empty state \u2014 no visible questions at all\n if (visible.length === 0) {\n return html`\n <div\n style=${styleMap(sm(containerStyle))}\n data-adaptive-id=${this.instanceId}\n data-adaptive-type=\"adaptive-faq\"\n >\n <div style=${styleMap(sm(emptyStateStyle))}>\n You're all set for now! We'll surface answers here when they're relevant to what\n you're doing.\n </div>\n </div>\n `;\n }\n\n return html`\n <div\n style=${styleMap(sm(containerStyle))}\n data-adaptive-id=${this.instanceId}\n data-adaptive-type=\"adaptive-faq\"\n >\n ${\n this.faqConfig.searchable\n ? html`\n <div style=${styleMap(sm(baseStyles.searchWrapper))}>\n <style>\n [data-adaptive-id=\"${this.instanceId}\"] input::placeholder {\n color: var(--sc-content-search-color, inherit);\n opacity: 0.7;\n }\n </style>\n <input\n type=\"text\"\n placeholder=\"Search questions...\"\n .value=${this._searchQuery}\n style=${styleMap(sm(searchInputStyle))}\n @input=${(e: InputEvent) => {\n this._searchQuery = (e.target as HTMLInputElement).value;\n }}\n />\n </div>\n `\n : nothing\n }\n\n <div style=${styleMap(sm(baseStyles.accordion))}>\n ${\n groups\n ? Array.from(groups.entries()).map(\n ([category, items]) => html`\n ${\n category\n ? html`\n <div\n style=${styleMap(sm(categoryHeaderStyle))}\n data-category-header=${category}\n >\n ${category}\n </div>\n `\n : nothing\n }\n ${this._renderItems(items, theme, feedbackConfig)}\n `\n )\n : this._renderItems(filtered, theme, feedbackConfig)\n }\n </div>\n\n ${\n this.faqConfig.searchable && filtered.length === 0 && this._searchQuery\n ? html`\n <div\n style=${styleMap(sm({ ...baseStyles.noResults, ...colors.emptyState }))}\n >\n No questions found matching &quot;${this._searchQuery}&quot;\n </div>\n `\n : nothing\n }\n </div>\n `;\n }\n}\n\n// ============================================================================\n// Custom element registration\n// ============================================================================\n\nif (!customElements.get('syntro-faq-accordion')) {\n customElements.define('syntro-faq-accordion', FAQAccordionElement);\n}\n\nexport default FAQAccordionElement;\n", "/**\n * Adaptive FAQ - Styles\n *\n * BaseStyles object (font, layout, colors, animations) and theme integration\n * for the FAQWidget component.\n */\n\nimport { purple, slateGrey } from '@syntro/design-system/tokens';\n\n// ============================================================================\n// Base Styles\n// ============================================================================\n\nexport const baseStyles = {\n container: {\n fontFamily: 'var(--sc-font-family, system-ui, -apple-system, sans-serif)',\n maxWidth: '800px',\n margin: '0 auto',\n },\n searchWrapper: {\n marginBottom: '8px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n outline: 'none',\n transition: 'border-color 0.15s ease',\n backgroundColor: 'var(--sc-content-search-background)',\n color: 'var(--sc-content-search-color)',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: 'var(--sc-content-item-gap, 6px)',\n },\n item: {\n borderRadius: 'var(--sc-content-border-radius, 8px)',\n overflow: 'hidden',\n transition: 'box-shadow 0.15s ease',\n },\n question: {\n width: '100%',\n padding: 'var(--sc-content-item-padding, 12px 16px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n border: 'none',\n cursor: 'pointer',\n fontSize: 'var(--sc-content-item-font-size, 15px)',\n fontWeight: 500,\n textAlign: 'left' as const,\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '20px',\n transition: 'transform 0.2s ease',\n color: 'var(--sc-content-chevron-color, currentColor)',\n },\n answer: {\n padding: 'var(--sc-content-body-padding, 0 16px 12px 16px)',\n fontSize: 'var(--sc-content-body-font-size, 14px)',\n lineHeight: 1.6,\n overflow: 'hidden',\n transition: 'max-height 0.2s ease, padding 0.2s ease',\n },\n category: {\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: '4px 8px',\n borderRadius: '4px',\n marginBottom: '8px',\n },\n categoryHeader: {\n fontSize: 'var(--sc-content-category-font-size, 12px)',\n fontWeight: 700,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: 'var(--sc-content-category-padding, 8px 4px 4px 4px)',\n marginTop: 'var(--sc-content-category-gap, 4px)',\n },\n feedback: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginTop: '12px',\n paddingTop: '10px',\n borderTop: '1px solid rgba(0, 0, 0, 0.08)',\n fontSize: '13px',\n },\n feedbackButton: {\n background: 'none',\n border: '1px solid transparent',\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px 8px',\n borderRadius: '4px',\n transition: 'background-color 0.15s ease, border-color 0.15s ease',\n },\n feedbackButtonSelected: {\n borderColor: 'rgba(0, 0, 0, 0.2)',\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '48px 24px',\n fontSize: '14px',\n },\n noResults: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n fontSize: '14px',\n },\n} as const;\n\n// ============================================================================\n// Theme Styles\n// ============================================================================\n\nexport const themeStyles = {\n light: {\n container: {\n backgroundColor: 'transparent',\n color: 'inherit',\n },\n searchInput: {\n border: `1px solid ${slateGrey[11]}`,\n },\n item: {\n backgroundColor: 'var(--sc-content-background)',\n borderTop: 'var(--sc-content-border)',\n borderRight: 'var(--sc-content-border)',\n borderBottom: 'var(--sc-content-border)',\n borderLeft: 'var(--sc-content-border)',\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n question: {\n backgroundColor: 'transparent',\n color: 'var(--sc-content-text-color)',\n },\n questionHover: {\n backgroundColor: 'var(--sc-content-background-hover)',\n },\n answer: {\n color: 'var(--sc-content-text-secondary-color)',\n },\n category: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n feedbackPrompt: {\n color: slateGrey[7],\n },\n },\n dark: {\n container: {\n backgroundColor: 'transparent',\n color: 'inherit',\n },\n searchInput: {\n border: `1px solid ${slateGrey[5]}`,\n },\n item: {\n backgroundColor: 'var(--sc-content-background)',\n borderTop: 'var(--sc-content-border)',\n borderRight: 'var(--sc-content-border)',\n borderBottom: 'var(--sc-content-border)',\n borderLeft: 'var(--sc-content-border)',\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n },\n question: {\n backgroundColor: 'transparent',\n color: 'var(--sc-content-text-color)',\n },\n questionHover: {\n backgroundColor: 'var(--sc-content-background-hover)',\n },\n answer: {\n color: 'var(--sc-content-text-secondary-color)',\n },\n category: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n feedbackPrompt: {\n color: slateGrey[8],\n },\n },\n};\n", "/**\n * Adaptive FAQ - Runtime Module\n *\n * Runtime manifest for the FAQ accordion adaptive.\n * Mounts the Lit web component <syntro-faq-accordion>.\n * Provides action executors and widget registration.\n */\n\nimport { executorDefinitions } from './executors';\nimport './FAQWidgetLit'; // registers <syntro-faq-accordion> custom element\nimport type { FAQWidgetRuntime } from './faq-types';\nimport type { FAQConfig, FAQQuestionAction } from './types';\n\n// ============================================================================\n// Lit Mountable Widget\n// ============================================================================\n\n/**\n * Mountable widget interface for <syntro-faq-accordion> (Lit web component).\n */\nexport const FAQWidgetLitMountable = {\n mount(\n container: HTMLElement,\n config?: FAQConfig & { runtime?: FAQWidgetRuntime; instanceId?: string }\n ) {\n const {\n runtime,\n instanceId = 'faq-widget',\n ...faqConfig\n } = config ?? {\n expandBehavior: 'single' as const,\n searchable: false,\n theme: 'auto' as const,\n actions: [],\n };\n\n const el = document.createElement('syntro-faq-accordion') as HTMLElement & {\n faqConfig: FAQConfig;\n runtime: FAQWidgetRuntime | null;\n instanceId: string;\n };\n\n Object.assign(el, {\n faqConfig: faqConfig as FAQConfig,\n runtime: runtime ?? null,\n instanceId,\n });\n\n container.appendChild(el);\n return () => el.remove();\n },\n};\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\n/**\n * Runtime manifest for adaptive-faq.\n *\n * Provides:\n * - FAQ action executors (scroll_to, toggle_item, update)\n * - Widget-based accordion using the Lit web component\n */\nexport const runtime = {\n id: 'adaptive-faq',\n version: '2.0.0',\n name: 'FAQ Accordion',\n description:\n 'Collapsible Q&A accordion with actions, rich content, feedback, and personalization',\n\n /**\n * Action executors for programmatic FAQ interaction.\n */\n executors: executorDefinitions,\n\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-faq:accordion',\n component: FAQWidgetLitMountable,\n metadata: {\n name: 'FAQ Accordion',\n description: 'Collapsible Q&A accordion with search, categories, and feedback',\n icon: '\u2753',\n subtitle: 'Curated just for you.',\n },\n },\n ],\n\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes faq:question_revealed when triggerWhen transitions false \u2192 true.\n */\n notifyWatchers(props: Record<string, unknown>) {\n const actions = (props.actions ?? []) as FAQQuestionAction[];\n return actions\n .filter((a) => a.notify && a.triggerWhen)\n .map((a) => ({\n id: `faq:${a.config.id}`,\n strategy: a.triggerWhen!,\n eventName: 'faq:question_revealed',\n eventProps: {\n questionId: a.config.id,\n question: a.config.question,\n title: a.notify!.title,\n body: a.notify!.body,\n icon: a.notify!.icon,\n },\n }));\n },\n};\n\nexport default runtime;\n"],
5
+ "mappings": ";;;;;;;AA2BA,SAAS,YAAY,OAAiB,QAAiB,cAA0C;AAC/F,MAAI,QAAQ;AACV,UAAM,QAAQ,MAAM,SAAS,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,MAAM;AACvE,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,MAAI,cAAc;AAChB,UAAM,QAAQ,MAAM,eAAe,YAAY;AAC/C,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,QAAM,IAAI,MAAM,oBAAoB;AACtC;AAaA,eAAsB,mBACpB,QACA,SACA,OACyB;AACzB,QAAM,OAAO,YAAY,OAAO,OAAO,QAAQ,OAAO,YAAY;AAClE,QAAM,EAAE,GAAG,IAAI,KAAK;AAGpB,MAAI,OAAO,WAAW,OAAO;AAC3B,UAAM,OAAO,EAAE;AAAA,EACjB;AAGA,QAAM,KAAK,SAAS,cAAc,sBAAsB,EAAE,IAAI;AAC9D,MAAI,IAAI;AACN,OAAG,eAAe;AAAA,MAChB,UAAU,OAAO,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH;AAGA,UAAQ,aAAa,iBAAiB,EAAE,QAAQ,GAAG,CAAC;AAEpD,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAEf;AAAA,EACF;AACF;AASA,eAAsB,qBACpB,QACA,SACA,OACyB;AACzB,QAAM,OAAO,YAAY,OAAO,OAAO,QAAQ,OAAO,YAAY;AAClE,QAAM,EAAE,GAAG,IAAI,KAAK;AACpB,QAAM,eAAe,OAAO,SAAS;AAErC,MAAI;AAEJ,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,YAAM,OAAO,EAAE;AACf,iBAAW;AACX;AAAA,IACF,KAAK;AACH,YAAM,SAAS,EAAE;AACjB,iBAAW;AACX;AAAA,IACF,SAAS;AACP,YAAM,cAAc,MAAM,SAAS,EAAE,cAAc,IAAI,EAAE;AACzD,YAAM,OAAO,EAAE;AACf,iBAAW,cAAc,WAAW;AACpC;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,aAAa,cAAc,EAAE,QAAQ,IAAI,SAAS,CAAC;AAE3D,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAEf;AAAA,EACF;AACF;AASA,eAAsB,iBACpB,QACA,SACA,OACyB;AACzB,UAAQ,OAAO,WAAW;AAAA,IACxB,KAAK,OAAO;AACV,YAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,YAAM,WAAW,OAAO,aAAa,YAAY,YAAY;AAC7D,YAAM,SAAS,OAAO,QAAQ;AAC9B;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,UAAI,CAAC,OAAO,QAAQ;AAClB,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,YAAM,SAAS,MAAM,SAAS,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,OAAO,MAAM;AAC/E,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AACA,YAAM,WAAW,OAAO,MAAM;AAC9B;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,YAAM,aAAa,KAAK;AACxB;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,QAAQ,OAAO,SAAS,CAAC;AAC/B,YAAM,aAAa,KAAK;AACxB;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,aAAa,cAAc,EAAE,WAAW,OAAO,UAAU,CAAC;AAElE,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IAEf;AAAA,EACF;AACF;AAUO,IAAM,sBAAsB;AAAA,EACjC,EAAE,MAAM,iBAAiB,UAAU,mBAAmB;AAAA,EACtD,EAAE,MAAM,mBAAmB,UAAU,qBAAqB;AAAA,EAC1D,EAAE,MAAM,cAAc,UAAU,iBAAiB;AACnD;;;ACnLA,SAAS,MAAM,YAAY,eAAe;AAC1C,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,cAAc;;;ACLhB,IAAM,aAAa;AAAA,EACxB,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,cAAc;AAAA,EAChB;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,WAAW;AAAA,IACT,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,EACP;AAAA,EACA,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,SAAS;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,wBAAwB;AAAA,IACtB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAMO,IAAM,cAAc;AAAA,EACzB,OAAO;AAAA,IACL,WAAW;AAAA,MACT,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,aAAa;AAAA,MACX,QAAQ,aAAa,UAAU,EAAE,CAAC;AAAA,IACpC;AAAA,IACA,MAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,iBAAiB;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB,OAAO,CAAC;AAAA,MACzB,OAAO,OAAO,CAAC;AAAA,IACjB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,YAAY;AAAA,MACV,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,aAAa;AAAA,MACX,QAAQ,aAAa,UAAU,CAAC,CAAC;AAAA,IACnC;AAAA,IACA,MAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,iBAAiB;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB,OAAO,CAAC;AAAA,MACzB,OAAO,OAAO,CAAC;AAAA,IACjB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,YAAY;AAAA,MACV,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,UAAU,CAAC;AAAA,IACpB;AAAA,EACF;AACF;;;AD5KA,SAAS,GAAG,QAAyD;AACnE,SAAO;AACT;AAEA,IAAM,SAAS,IAAI,OAAO,EAAE,OAAO,OAAO,KAAK,MAAM,QAAQ,KAAK,CAAC;AAMnE,SAAS,cAAc,QAA2B;AAChD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,SAAS,OAAQ,QAAO,OAAO;AAC1C,SAAO,OAAO;AAChB;AAEA,SAAS,iBAAiB,QAA2B;AACnD,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AACA,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,MAAM,OAAO,OAAO;AACpC;AAEA,SAAS,sBACP,UACuB;AACvB,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,aAAa,KAAM,QAAO,EAAE,OAAO,SAAS;AAChD,SAAO;AACT;AAEA,SAAS,kBAAkB,gBAAwC;AACjE,SAAO,eAAe,UAAU;AAClC;AAEA,SAAS,aAAa,OAAyD;AAC7E,MAAI,SAAS,UAAU,OAAQ,QAAO;AACtC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,OAAO,aAAa,8BAA8B,EAAE,UAAU,SAAS;AAAA,EAChF;AACA,SAAO;AACT;AAcO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAA7C;AAAA;AAuBL;AAAA;AAAA;AAAA,qBAAuB;AAAA,MACrB,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,IACZ;AAEA,mBAAmC;AAEnC,sBAAqB;AAGrB;AAAA,wBAA4B,oBAAI,IAAI;AACpC,wBAA8B;AAC9B,wBAAuB;AACvB,0BAA6C,oBAAI,IAAI;AACrD,sBAA4B;AAG5B;AAAA,SAAQ,gBAAqC;AAC7C,SAAQ,oBAAyC;AACjD,SAAQ,YAAiC;AACzC,SAAQ,iBAAsC;AAC9C,SAAQ,uBAA4C;AACpD,SAAQ,kBAAwD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvD,mBAAmB;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMS,oBAAoB;AAC3B,UAAM,kBAAkB;AACxB,SAAK,cAAc;AAAA,EACrB;AAAA,EAES,uBAAuB;AAC9B,UAAM,qBAAqB;AAC3B,SAAK,gBAAgB;AACrB,QAAI,KAAK,oBAAoB,MAAM;AACjC,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAGS,QAAQ,cAAoC;AACnD,QAAI,aAAa,IAAI,SAAS,GAAG;AAC/B,WAAK,gBAAgB;AACrB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,QAAS;AAGnB,SAAK,gBAAgB,KAAK,QAAQ,QAAQ,UAAU,MAAM;AACxD,WAAK,cAAc;AAAA,IACrB,CAAC;AAGD,QAAI,KAAK,QAAQ,aAAa,WAAW;AACvC,WAAK,oBAAoB,KAAK,QAAQ,YAAY,UAAU,MAAM;AAChE,aAAK,cAAc;AAAA,MACrB,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,gBAAgB,WAAW;AAC1C,WAAK,uBAAuB,KAAK,QAAQ,eAAe,UAAU,MAAM;AACtE,aAAK,cAAc;AAAA,MACrB,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ,OAAO,WAAW;AAEjC,UAAI,KAAK,QAAQ,OAAO,WAAW;AACjC,cAAM,eAAe,KAAK,QAAQ,OAAO;AAAA,UACvC,EAAE,UAAU,CAAC,kCAAkC,8BAA8B,EAAE;AAAA,UAC/E;AAAA,QACF;AACA,cAAM,eAAe,aAClB,OAAO,CAAC,MAAM;AACb,gBAAM,WAAW,EAAE,OAAO;AAC1B,iBAAO,OAAO,aAAa,YAAY,SAAS,WAAW,WAAW;AAAA,QACxE,CAAC,EACA,IAAI;AAEP,YAAI,gBAAgB,KAAK,IAAI,IAAI,aAAa,KAAK,KAAO;AACxD,gBAAM,aAAc,aAAa,MAAO,SAAoB,QAAQ,aAAa,EAAE;AACnF,eAAK,eAAe,oBAAI,IAAI,CAAC,UAAU,CAAC;AACxC,gCAAsB,MAAM;AAC1B,kBAAM,KAAK,SAAS,cAAc,sBAAsB,UAAU,IAAI;AACtE,gBAAI,GAAI,IAAG,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,UACnE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,WAAK,YAAY,KAAK,QAAQ,OAAO;AAAA,QACnC,EAAE,UAAU,CAAC,kCAAkC,8BAA8B,EAAE;AAAA,QAC/E,CAAC,UAAU;AACT,gBAAM,WAAW,MAAM,OAAO;AAC9B,cAAI,OAAO,aAAa,YAAY,CAAC,SAAS,WAAW,WAAW,EAAG;AACvE,gBAAM,aAAa,SAAS,QAAQ,aAAa,EAAE;AACnD,eAAK,eAAe,oBAAI,IAAI,CAAC,UAAU,CAAC;AACxC,gCAAsB,MAAM;AAC1B,kBAAM,KAAK,SAAS,cAAc,sBAAsB,UAAU,IAAI;AACtE,gBAAI,GAAI,IAAG,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,UACnE,CAAC;AACD,eAAK,SAAS,OAAO,QAAQ,oBAAoB;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ,OAAO,WAAW;AACjC,YAAM,iBAAiB,CAAC,UAA6D;AACnF,cAAM,SAAS,MAAM,OAAO;AAC5B,cAAM,SAAS,MAAM,OAAO;AAC5B,YAAI,WAAW,KAAK,WAAY;AAChC,YAAI,CAAC,OAAQ;AAEb,aAAK,eAAe,oBAAI,IAAI,CAAC,MAAM,CAAC;AACpC,aAAK,eAAe;AAEpB,YAAI,KAAK,oBAAoB,KAAM,cAAa,KAAK,eAAe;AACpE,aAAK,kBAAkB,WAAW,MAAM;AACtC,eAAK,eAAe;AACpB,eAAK,kBAAkB;AAAA,QACzB,GAAG,IAAI;AAEP,8BAAsB,MAAM;AAC1B,gBAAM,KAAK,SAAS,cAAc,sBAAsB,MAAM,IAAI;AAClE,cAAI,GAAI,IAAG,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,QACnE,CAAC;AAAA,MACH;AAGA,UAAI,KAAK,QAAQ,OAAO,WAAW;AACjC,cAAM,SAAS,KAAK,QAAQ,OAAO,UAAU,EAAE,OAAO,CAAC,wBAAwB,EAAE,GAAG,CAAC;AACrF,cAAM,UAAU,OACb,OAAO,CAAC,MAAO,EAAE,OAAO,WAAsB,KAAK,cAAc,EAAE,OAAO,MAAM,EAChF,IAAI;AACP,YAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAO;AAC9C,yBAAe,OAAO;AAAA,QACxB;AAAA,MACF;AAEA,WAAK,iBAAiB,KAAK,QAAQ,OAAO;AAAA,QACxC,EAAE,OAAO,CAAC,wBAAwB,EAAE;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACxB,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAC5B,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAC5B,SAAK,YAAY;AACjB,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,IAAY;AAChC,UAAM,OAAO,KAAK;AAClB,QAAI;AAEJ,QAAI,KAAK,UAAU,mBAAmB,UAAU;AAC9C,aAAO,KAAK,IAAI,EAAE,IAAI,oBAAI,IAAI,IAAI,oBAAI,IAAI,CAAC,EAAE,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,IAAI,IAAI,IAAI;AACnB,UAAI,KAAK,IAAI,EAAE,GAAG;AAChB,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,aAAK,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAEA,UAAM,iBAAiB,CAAC,KAAK,IAAI,EAAE;AACnC,SAAK,eAAe;AAEpB,SAAK,SAAS,OAAO,QAAQ,eAAe;AAAA,MAC1C,YAAY,KAAK;AAAA,MACjB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB,QAAgB,UAAkB,OAAsB;AAC9E,UAAM,OAAO,IAAI,IAAI,KAAK,cAAc;AACxC,SAAK,IAAI,QAAQ,KAAK;AACtB,SAAK,iBAAiB;AAEtB,SAAK,SAAS,OAAO,QAAQ,gBAAgB,EAAE,QAAQ,UAAU,MAAM,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAyC;AAC/C,YAAQ,KAAK,UAAU,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM;AAClD,UAAI,CAAC,EAAE,YAAa,QAAO;AAC3B,UAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,YAAM,SAAS,KAAK,QAAQ,aAAsB,EAAE,WAAW;AAC/D,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,SAAmD;AAC3E,QAAI,KAAK,UAAU,aAAa,YAAY;AAC1C,aAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,OAAO,YAAY,MAAM,EAAE,OAAO,YAAY,EAAE;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,SAAmD;AAC5E,UAAM,IAAI,KAAK,aAAa,KAAK,EAAE,YAAY;AAC/C,QAAI,CAAC,KAAK,UAAU,cAAc,CAAC,EAAG,QAAO;AAC7C,WAAO,QAAQ;AAAA,MACb,CAAC,SACC,KAAK,OAAO,SAAS,YAAY,EAAE,SAAS,CAAC,KAC7C,cAAc,KAAK,OAAO,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,KAC1D,KAAK,OAAO,UAAU,YAAY,EAAE,SAAS,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEQ,gBACN,UAC8C;AAC9C,UAAM,SAAS,oBAAI,IAA6C;AAChE,eAAW,QAAQ,UAAU;AAC3B,YAAM,MAAM,KAAK,OAAO;AACxB,UAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,CAAC,CAAC;AACxC,aAAO,IAAI,GAAG,EAAG,KAAK,IAAI;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAc,QAAmB;AACvC,UAAM,WAAW,iBAAiB,MAAM;AACxC,WAAO,kDAAkD,WAAW,QAAQ,CAAC;AAAA,EAC/E;AAAA,EAEQ,gBACN,MACA,gBACA,eACA,OACA;AACA,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,gBAAgB,EAAE,GAAG,WAAW,UAAU,GAAG,OAAO,eAAe;AAEzE,WAAO;AAAA,mBACQ,SAAS,GAAG,aAAa,CAAC,CAAC;AAAA,gBAC9B,kBAAkB,cAAc,CAAC;AAAA;AAAA;AAAA,kBAG/B;AAAA,MACN,GAAG;AAAA,QACD,GAAG,WAAW;AAAA,QACd,GAAI,kBAAkB,OAAO,WAAW,yBAAyB,CAAC;AAAA,MACpE,CAAC;AAAA,IACH,CAAC;AAAA;AAAA,mBAEQ,MAAM,KAAK,gBAAgB,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,kBAIvE;AAAA,MACN,GAAG;AAAA,QACD,GAAG,WAAW;AAAA,QACd,GAAI,kBAAkB,SAAS,WAAW,yBAAyB,CAAC;AAAA,MACtE,CAAC;AAAA,IACH,CAAC;AAAA;AAAA,mBAEQ,MAAM,KAAK,gBAAgB,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,EAIzF;AAAA,EAEQ,YACN,MACA,QACA,OACA,gBACA;AACA,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,aAAa,KAAK,aAAa,IAAI,KAAK,OAAO,EAAE;AACvD,UAAM,gBAAgB,KAAK,iBAAiB,KAAK,OAAO;AACxD,UAAM,YAAY,KAAK,eAAe,KAAK,OAAO;AAElD,UAAM,YAAY;AAAA,MAChB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,MACV,GAAI,aAAa,OAAO,eAAe,CAAC;AAAA,MACxC,GAAI,gBACA;AAAA,QACE,WAAW,aAAa,OAAO,CAAC,CAAC;AAAA,QACjC,YAAY;AAAA,MACd,IACA,CAAC;AAAA,MACL,GAAI,CAAC,SAAS,EAAE,cAAc,uCAAuC,IAAI,CAAC;AAAA,IAC5E;AAEA,UAAM,gBAAgB;AAAA,MACpB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,MACV,GAAI,YAAY,OAAO,gBAAgB,CAAC;AAAA,IAC1C;AAEA,UAAM,eAAe;AAAA,MACnB,GAAG,WAAW;AAAA,MACd,WAAW,aAAa,kBAAkB;AAAA,IAC5C;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,MACV,WAAW,aAAa,UAAU;AAAA,MAClC,eAAe,aAAa,SAAS;AAAA,IACvC;AAEA,WAAO;AAAA;AAAA,gBAEK,SAAS,GAAG,SAAS,CAAC,CAAC;AAAA,2BACZ,KAAK,OAAO,EAAE;AAAA;AAAA;AAAA;AAAA,kBAIvB,SAAS,GAAG,aAAa,CAAC,CAAC;AAAA,0BACnB,UAAU;AAAA,mBACjB,MAAM,KAAK,cAAc,KAAK,OAAO,EAAE,CAAC;AAAA,wBACnC,MAAM;AAClB,WAAK,aAAa,KAAK,OAAO;AAAA,IAChC,CAAC;AAAA,wBACa,MAAM;AAClB,WAAK,aAAa;AAAA,IACpB,CAAC;AAAA;AAAA,kBAEO,KAAK,OAAO,QAAQ;AAAA,wBACd,SAAS,GAAG,YAAY,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,kBAIhC,SAAS,GAAG,WAAW,CAAC,CAAC;AAAA,wBACnB,CAAC,UAAU;AAAA;AAAA,YAEvB,KAAK,cAAc,KAAK,OAAO,MAAM,CAAC;AAAA,YAEtC,cAAc,iBACV,KAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA,KAAK,eAAe,IAAI,KAAK,OAAO,EAAE;AAAA,MACtC;AAAA,IACF,IACA,OACN;AAAA;AAAA;AAAA;AAAA,EAIR;AAAA,EAEQ,aACN,OACA,OACA,gBACA;AACA,WAAO,MAAM;AAAA,MAAI,CAAC,MAAM,UACtB,KAAK,YAAY,MAAM,UAAU,MAAM,SAAS,GAAG,OAAO,cAAc;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMS,SAAS;AAChB,UAAM,QAAQ,aAAa,KAAK,UAAU,KAAK;AAC/C,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,iBAAiB,sBAAsB,KAAK,UAAU,QAAQ;AAEpE,UAAM,UAAU,KAAK,kBAAkB;AACvC,UAAM,UAAU,KAAK,kBAAkB,OAAO;AAC9C,UAAM,WAAW,KAAK,mBAAmB,OAAO;AAChD,UAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC5D,UAAM,SAAS,gBAAgB,KAAK,gBAAgB,QAAQ,IAAI;AAEhE,UAAM,iBAAiB;AAAA,MACrB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,IACZ;AAEA,UAAM,kBAAkB;AAAA,MACtB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,IACZ;AAEA,UAAM,sBAAsB;AAAA,MAC1B,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,IACZ;AAEA,UAAM,mBAAmB;AAAA,MACvB,GAAG,WAAW;AAAA,MACd,GAAG,OAAO;AAAA,IACZ;AAGA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA;AAAA,kBAEK,SAAS,GAAG,cAAc,CAAC,CAAC;AAAA,6BACjB,KAAK,UAAU;AAAA;AAAA;AAAA,uBAGrB,SAAS,GAAG,eAAe,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMhD;AAEA,WAAO;AAAA;AAAA,gBAEK,SAAS,GAAG,cAAc,CAAC,CAAC;AAAA,2BACjB,KAAK,UAAU;AAAA;AAAA;AAAA,UAIhC,KAAK,UAAU,aACX;AAAA,2BACa,SAAS,GAAG,WAAW,aAAa,CAAC,CAAC;AAAA;AAAA,uCAE1B,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAQ3B,KAAK,YAAY;AAAA,0BAClB,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAAA,2BAC7B,CAAC,MAAkB;AAC1B,WAAK,eAAgB,EAAE,OAA4B;AAAA,IACrD,CAAC;AAAA;AAAA;AAAA,gBAIL,OACN;AAAA;AAAA,qBAEa,SAAS,GAAG,WAAW,SAAS,CAAC,CAAC;AAAA,YAE3C,SACI,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE;AAAA,MAC3B,CAAC,CAAC,UAAU,KAAK,MAAM;AAAA,oBAErB,WACI;AAAA;AAAA,kCAEU,SAAS,GAAG,mBAAmB,CAAC,CAAC;AAAA,iDAClB,QAAQ;AAAA;AAAA,4BAE7B,QAAQ;AAAA;AAAA,0BAGZ,OACN;AAAA,oBACE,KAAK,aAAa,OAAO,OAAO,cAAc,CAAC;AAAA;AAAA,IAEnD,IACA,KAAK,aAAa,UAAU,OAAO,cAAc,CACvD;AAAA;AAAA;AAAA,UAIA,KAAK,UAAU,cAAc,SAAS,WAAW,KAAK,KAAK,eACvD;AAAA;AAAA,wBAEU,SAAS,GAAG,EAAE,GAAG,WAAW,WAAW,GAAG,OAAO,WAAW,CAAC,CAAC,CAAC;AAAA;AAAA,oDAEnC,KAAK,YAAY;AAAA;AAAA,gBAGvD,OACN;AAAA;AAAA;AAAA,EAGN;AACF;AAAA;AAAA;AAAA;AAhiBa,oBAKK,aAAa;AAAA;AAAA,EAE3B,WAAW,EAAE,WAAW,MAAM;AAAA,EAC9B,SAAS,EAAE,WAAW,MAAM;AAAA,EAC5B,YAAY,EAAE,MAAM,OAAO;AAAA;AAAA,EAG3B,cAAc,EAAE,OAAO,KAAK;AAAA,EAC5B,cAAc,EAAE,OAAO,KAAK;AAAA,EAC5B,cAAc,EAAE,OAAO,KAAK;AAAA,EAC5B,gBAAgB,EAAE,OAAO,KAAK;AAAA,EAC9B,YAAY,EAAE,OAAO,KAAK;AAC5B;AAqhBF,IAAI,CAAC,eAAe,IAAI,sBAAsB,GAAG;AAC/C,iBAAe,OAAO,wBAAwB,mBAAmB;AACnE;;;AElnBO,IAAM,wBAAwB;AAAA,EACnC,MACE,WACA,QACA;AACA,UAAM;AAAA,MACJ,SAAAA;AAAA,MACA,aAAa;AAAA,MACb,GAAG;AAAA,IACL,IAAI,UAAU;AAAA,MACZ,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,IACZ;AAEA,UAAM,KAAK,SAAS,cAAc,sBAAsB;AAMxD,WAAO,OAAO,IAAI;AAAA,MAChB;AAAA,MACA,SAASA,YAAW;AAAA,MACpB;AAAA,IACF,CAAC;AAED,cAAU,YAAY,EAAE;AACxB,WAAO,MAAM,GAAG,OAAO;AAAA,EACzB;AACF;AAaO,IAAM,UAAU;AAAA,EACrB,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aACE;AAAA;AAAA;AAAA;AAAA,EAKF,WAAW;AAAA;AAAA;AAAA;AAAA,EAKX,SAAS;AAAA,IACP;AAAA,MACE,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,OAAgC;AAC7C,UAAM,UAAW,MAAM,WAAW,CAAC;AACnC,WAAO,QACJ,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EACvC,IAAI,CAAC,OAAO;AAAA,MACX,IAAI,OAAO,EAAE,OAAO,EAAE;AAAA,MACtB,UAAU,EAAE;AAAA,MACZ,WAAW;AAAA,MACX,YAAY;AAAA,QACV,YAAY,EAAE,OAAO;AAAA,QACrB,UAAU,EAAE,OAAO;AAAA,QACnB,OAAO,EAAE,OAAQ;AAAA,QACjB,MAAM,EAAE,OAAQ;AAAA,QAChB,MAAM,EAAE,OAAQ;AAAA,MAClB;AAAA,IACF,EAAE;AAAA,EACN;AACF;AAEA,IAAO,kBAAQ;",
6
6
  "names": ["runtime"]
7
7
  }