@syntrologie/runtime-sdk 2.2.0-canary.8 → 2.2.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.
- package/README.md +2 -1
- package/dist/actions/types.d.ts +7 -0
- package/dist/antiFlicker.d.ts +2 -0
- package/dist/apps/builtinRuntimeModules.generated.d.ts +20 -0
- package/dist/{chunk-MEBUEMEZ.js → chunk-V4MDQX67.js} +2868 -1417
- package/dist/chunk-V4MDQX67.js.map +7 -0
- package/dist/configFetcher.d.ts +3 -1
- package/dist/context/ContextManager.d.ts +4 -0
- package/dist/diagnostics/service-worker-check.d.ts +23 -0
- package/dist/editorLoader.d.ts +8 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1563 -12
- package/dist/index.js.map +4 -4
- package/dist/integrations/gtm-bridge.d.ts +36 -0
- package/dist/navigation/NavigationMonitor.d.ts +45 -0
- package/dist/overlays/runtime/utils/AnchorWatcher.d.ts +22 -0
- package/dist/overlays/types.d.ts +2 -0
- package/dist/react.js +1 -1
- package/dist/runtime.d.ts +3 -0
- package/dist/smart-canvas.esm.js +62 -36
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +15828 -23049
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +62 -36
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/telemetry/adapters/posthog.d.ts +19 -0
- package/dist/telemetry/consent.d.ts +62 -0
- package/dist/version.d.ts +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +10 -0
- package/package.json +13 -4
- package/schema/canvas-config.schema.json +124 -22
- package/scripts/syntroReactPlugin.mjs +113 -0
- package/dist/adaptives/adaptive-chatbot/index.js +0 -9
- package/dist/adaptives/adaptive-chatbot/index.js.map +0 -7
- package/dist/adaptives/adaptive-content/index.js +0 -22
- package/dist/adaptives/adaptive-content/index.js.map +0 -7
- package/dist/adaptives/adaptive-faq/index.js +0 -28
- package/dist/adaptives/adaptive-faq/index.js.map +0 -7
- package/dist/adaptives/adaptive-gamification/index.js +0 -2
- package/dist/adaptives/adaptive-gamification/index.js.map +0 -7
- package/dist/adaptives/adaptive-nav/index.js +0 -27
- package/dist/adaptives/adaptive-nav/index.js.map +0 -7
- package/dist/adaptives/adaptive-overlays/index.js +0 -94
- package/dist/adaptives/adaptive-overlays/index.js.map +0 -7
- package/dist/chunk-MEBUEMEZ.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../shared-editor-ui/dist/cn.js", "syntro-react:react/jsx-runtime", "syntro-react:react", "syntro-react:react-dom", "../../../../../node_modules/css-selector-generator/src/types.ts", "../../../../../node_modules/css-selector-generator/src/utilities-messages.ts", "../../../../../node_modules/css-selector-generator/src/utilities-options.ts", "../../../../../node_modules/css-selector-generator/src/utilities-data.ts", "../../../../../node_modules/css-selector-generator/src/constants.ts", "../../../../../node_modules/css-selector-generator/src/selector-attribute.ts", "../../../../../node_modules/css-selector-generator/src/utilities-selectors.ts", "../../../../../node_modules/shared/src/utils.ts", "../../../../../node_modules/lucide-react/src/defaultAttributes.ts", "../../../../../node_modules/lucide-react/src/Icon.ts", "../../../../../node_modules/lucide-react/src/createLucideIcon.ts", "../../../../../node_modules/lucide-react/src/icons/message-square.ts", "../../../../../node_modules/lucide-react/src/icons/route.ts", "../../../../../node_modules/lucide-react/src/icons/sparkles.ts", "../../../../../node_modules/lucide-react/src/icons/square.ts", "../../../../../node_modules/lucide-react/src/icons/tag.ts", "../../../../../node_modules/lucide-react/src/icons/zap.ts", "../../../../shared-editor-ui/dist/components/DetectionBadge.js", "../../../../shared-editor-ui/dist/components/DismissedSection.js", "../../../../shared-editor-ui/dist/components/EditorBody.js", "../../../../shared-editor-ui/dist/components/EditorCard.js", "../../../../shared-editor-ui/dist/components/EditorFooter.js", "../../../../shared-editor-ui/dist/components/EditorHeader.js", "../../../../shared-editor-ui/dist/components/EditorInput.js", "../../../../shared-editor-ui/dist/components/EditorLayout.js", "../../../../shared-editor-ui/dist/components/EditorTextarea.js", "../../../../shared-editor-ui/dist/components/EmptyState.js", "../../../../shared-editor-ui/dist/components/GroupHeader.js", "../../../../adaptives/adaptive-overlays/src/summarize.ts", "../../../../adaptives/adaptive-overlays/src/editor.tsx", "../../../../design-system/dist/tokens/colors.js", "../../../../adaptives/adaptive-overlays/src/highlight.ts", "../../../../adaptives/adaptive-overlays/src/sanitizer.ts", "../../../../adaptives/adaptive-overlays/src/modal.ts", "../../../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs", "../../../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs", "../../../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs", "../../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs", "../../../../adaptives/adaptive-overlays/src/tooltip.ts", "../../../../adaptives/adaptive-overlays/src/runtime.ts", "../../../../adaptives/adaptive-overlays/src/cdn.ts"],
|
|
4
|
-
"sourcesContent": ["export function cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\n", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n function _jsx(type, props, key) {\n var R = _R();\n var p = props || {};\n var c = p.children;\n delete p.children;\n if (key !== undefined) p.key = key;\n return Array.isArray(c)\n ? R.createElement.apply(null, [type, p].concat(c))\n : c !== undefined\n ? R.createElement(type, p, c)\n : R.createElement(type, p);\n }\n export var jsx = _jsx;\n export var jsxs = _jsx;\n export var Fragment = _R().Fragment;\n ", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n\n // Default export \u2014 lazy proxy for React.* access\n export default new Proxy({}, { get: function(_, k) { return _R()[k]; } });\n\n // Hooks \u2014 lazy function wrappers (resolve at call time)\n export function useState() { return _R().useState.apply(null, arguments); }\n export function useEffect() { return _R().useEffect.apply(null, arguments); }\n export function useMemo() { return _R().useMemo.apply(null, arguments); }\n export function useCallback() { return _R().useCallback.apply(null, arguments); }\n export function useRef() { return _R().useRef.apply(null, arguments); }\n export function useContext() { return _R().useContext.apply(null, arguments); }\n export function useReducer() { return _R().useReducer.apply(null, arguments); }\n export function useLayoutEffect() { return _R().useLayoutEffect.apply(null, arguments); }\n export function useId() { return _R().useId.apply(null, arguments); }\n\n // Creation APIs \u2014 lazy function wrappers\n export function createElement() { return _R().createElement.apply(null, arguments); }\n export function createContext() { return _R().createContext.apply(null, arguments); }\n export function forwardRef() { return _R().forwardRef.apply(null, arguments); }\n export function memo() { return _R().memo.apply(null, arguments); }\n export function lazy() { return _R().lazy.apply(null, arguments); }\n export function isValidElement() { return _R().isValidElement.apply(null, arguments); }\n export function cloneElement() { return _R().cloneElement.apply(null, arguments); }\n\n // Component types \u2014 resolved at module eval (runtime loads first)\n var _r = _R();\n export var Fragment = _r.Fragment;\n export var Suspense = _r.Suspense;\n export var Children = _r.Children;\n export var Component = _r.Component;\n export var PureComponent = _r.PureComponent;\n ", "\n function _RD() {\n return (typeof SynOS !== 'undefined' && SynOS.ReactDOM) || {};\n }\n export default new Proxy({}, { get: function(_, k) { return _RD()[k]; } });\n export function createRoot() { return _RD().createRoot.apply(null, arguments); }\n export function hydrateRoot() { return _RD().hydrateRoot.apply(null, arguments); }\n export function createPortal() { return _RD().createPortal.apply(null, arguments); }\n export function flushSync() { return _RD().flushSync.apply(null, arguments); }\n ", "declare const opaqueId: unique symbol;\n\ndeclare interface Tagged<Token> {\n readonly [opaqueId]: Token;\n}\n\nexport type Opaque<Type, Token = unknown> = Type & Tagged<Token>;\n\nexport type ObjectValues<T> = T[keyof T];\n\n// TODO rename to \"CssSelector\"\nexport type CssSelectorGenerated = Opaque<string, \"CssSelector\">;\n\nexport const OPERATOR = {\n NONE: \"\",\n DESCENDANT: \" \",\n CHILD: \" > \",\n} as const;\n\nexport type OperatorValue = ObjectValues<typeof OPERATOR>;\n\nexport interface ElementSelectorData {\n value: CssSelectorGenerated;\n include: boolean;\n}\n\nexport interface ElementData {\n element: Element;\n operator: OperatorValue;\n selectors: Partial<Record<CssSelectorType, ElementSelectorData[]>>;\n}\n\nexport type CssSelector = string;\nexport type CssSelectors = CssSelector[];\n\ntype CssSelectorMatchFn = (input: string) => boolean;\nexport type CssSelectorMatch = RegExp | string | CssSelectorMatchFn;\n\nexport const CSS_SELECTOR_TYPE = {\n id: \"id\",\n class: \"class\",\n tag: \"tag\",\n attribute: \"attribute\",\n nthchild: \"nthchild\",\n nthoftype: \"nthoftype\",\n} as const;\n\nexport type CssSelectorType = ObjectValues<typeof CSS_SELECTOR_TYPE>;\nexport type CssSelectorTypes = CssSelectorType[];\n\nexport type CssSelectorsByType = Partial<Record<CssSelectorType, CssSelectors>>;\n\nexport type CssSelectorData = Partial<\n Record<CssSelectorType, string[] | string[][]>\n>;\n\nexport type CssSelectorGeneratorOptionsInput = Partial<{\n // List of selector types to use. They will be prioritised by their order.\n selectors: CssSelectorTypes;\n // List of selectors that should be prioritised.\n whitelist: CssSelectorMatch[];\n // List of selectors that should be ignored.\n blacklist: CssSelectorMatch[];\n // Root element inside which the selector will be generated. If not set, the document root will be used.\n root: ParentNode | null;\n // If set to `true`, the generator will test combinations of selectors of single type (e.g. multiple class selectors).\n combineWithinSelector: boolean;\n // If set to `true`, the generator will try to test combinations of selectors of different types (e.g. tag + class name).\n combineBetweenSelectors: boolean;\n // If set to `true`, all generated selectors will include the TAG part. Even if tag selector type is not included in `selectors` option.\n includeTag: boolean;\n // Maximum number of combinations of a selector type. This is handy for performance reasons, e.g. when elements have too many classnames.\n maxCombinations: number;\n // Maximum number of selector candidates to be tested for each element. This is handy for performance reasons, e.g. when elements can produce large number of combinations of various types of selectors.\n maxCandidates: number;\n // Experimental. If set to `true` and the \"root\" option is set, the fallback selectors will use \":scope\" pseudo-class to make the selectors shorter and simpler.\n useScope: boolean;\n // Limits the number of results (selectors) to be generated.\n maxResults: number;\n}>;\n\nexport type CssSelectorGeneratorOptions = Required<\n Omit<CssSelectorGeneratorOptionsInput, \"selectors\"> & {\n selectors: CssSelectorTypes;\n }\n>;\n\nexport interface IdentifiableParent {\n foundElements: Element[];\n selector: CssSelector;\n}\n\nexport type PatternMatcher = (input: string) => boolean;\n", "const libraryName = \"CssSelectorGenerator\";\n\n/**\n * Convenient wrapper for `console.warn` using consistent formatting.\n */\nexport function showWarning(id = \"unknown problem\", ...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn(`${libraryName}: ${id}`, ...args);\n}\n", "import {\n CSS_SELECTOR_TYPE,\n CssSelectorGeneratorOptions,\n CssSelectorMatch,\n CssSelectorTypes,\n} from \"./types.js\";\nimport { getRootNode } from \"./utilities-dom.js\";\nimport { isEnumValue } from \"./utilities-typescript.js\";\nimport { showWarning } from \"./utilities-messages.js\";\n\nexport const DEFAULT_OPTIONS = {\n selectors: [\n CSS_SELECTOR_TYPE.id,\n CSS_SELECTOR_TYPE.class,\n CSS_SELECTOR_TYPE.tag,\n CSS_SELECTOR_TYPE.attribute,\n ] as CssSelectorTypes,\n // if set to true, always include tag name\n includeTag: false,\n whitelist: [] as CssSelectorMatch[],\n blacklist: [] as CssSelectorMatch[],\n combineWithinSelector: true,\n combineBetweenSelectors: true,\n root: null,\n maxCombinations: Number.POSITIVE_INFINITY,\n maxCandidates: Number.POSITIVE_INFINITY,\n useScope: false,\n} as CssSelectorGeneratorOptions;\n\n/**\n * Makes sure returned value is a list containing only valid selector types.\n * @param input\n */\nexport function sanitizeSelectorTypes(input: unknown): CssSelectorTypes {\n if (!Array.isArray(input)) {\n return [];\n }\n return input.filter((item) => isEnumValue(CSS_SELECTOR_TYPE, item));\n}\n\n/**\n * Checks whether provided value is of type RegExp.\n */\nexport function isRegExp(input: unknown): input is RegExp {\n return input instanceof RegExp;\n}\n\n/**\n * Checks whether provided value is usable in whitelist or blacklist.\n * @param input\n */\nexport function isCssSelectorMatch(input: unknown): input is CssSelectorMatch {\n return [\"string\", \"function\"].includes(typeof input) || isRegExp(input);\n}\n\n/**\n * Converts input to a list of valid values for whitelist or blacklist.\n */\nexport function sanitizeCssSelectorMatchList(\n input: unknown,\n): CssSelectorMatch[] {\n if (!Array.isArray(input)) {\n return [];\n }\n return input.filter(isCssSelectorMatch);\n}\n\n/**\n * Checks whether provided value is valid Node.\n */\nexport function isNode(input: unknown): input is Node {\n return input instanceof Node;\n}\n\n/**\n * Checks whether provided value is valid ParentNode.\n */\nexport function isParentNode(input: unknown): input is ParentNode {\n const validParentNodeTypes: number[] = [\n Node.DOCUMENT_NODE,\n Node.DOCUMENT_FRAGMENT_NODE, // this includes Shadow DOM root\n Node.ELEMENT_NODE,\n ];\n\n return isNode(input) && validParentNodeTypes.includes(input.nodeType);\n}\n\n/**\n * Makes sure that the root node in options is valid.\n */\nexport function sanitizeRoot(input: unknown, element: Element): ParentNode {\n if (isParentNode(input)) {\n if (!input.contains(element)) {\n showWarning(\n \"element root mismatch\",\n \"Provided root does not contain the element. This will most likely result in producing a fallback selector using element's real root node. If you plan to use the selector using provided root (e.g. `root.querySelector`), it will not work as intended.\",\n );\n }\n return input;\n }\n\n const rootNode = element.getRootNode({ composed: false });\n if (isParentNode(rootNode)) {\n if (rootNode !== document) {\n showWarning(\n \"shadow root inferred\",\n \"You did not provide a root and the element is a child of Shadow DOM. This will produce a selector using ShadowRoot as a root. If you plan to use the selector using document as a root (e.g. `document.querySelector`), it will not work as intended.\",\n );\n }\n return rootNode;\n }\n\n return getRootNode(element);\n}\n\n/**\n * Makes sure that the output is a number, usable as `maxResults` option in\n * powerset generator.\n */\nexport function sanitizeMaxNumber(input?: unknown): number {\n return typeof input === \"number\" ? input : Number.POSITIVE_INFINITY;\n}\n\n/**\n * Makes sure the options object contains all required keys.\n */\nexport function sanitizeOptions(\n element: Element,\n custom_options = {},\n): CssSelectorGeneratorOptions {\n const options = {\n ...DEFAULT_OPTIONS,\n ...custom_options,\n };\n\n return {\n selectors: sanitizeSelectorTypes(options.selectors),\n whitelist: sanitizeCssSelectorMatchList(options.whitelist),\n blacklist: sanitizeCssSelectorMatchList(options.blacklist),\n root: sanitizeRoot(options.root, element),\n combineWithinSelector: !!options.combineWithinSelector,\n combineBetweenSelectors: !!options.combineBetweenSelectors,\n includeTag: !!options.includeTag,\n maxCombinations: sanitizeMaxNumber(options.maxCombinations),\n maxCandidates: sanitizeMaxNumber(options.maxCandidates),\n useScope: !!options.useScope,\n maxResults: sanitizeMaxNumber(options.maxResults),\n };\n}\n", "import { CssSelectorMatch, PatternMatcher } from \"./types.js\";\nimport { isRegExp } from \"./utilities-options.js\";\nimport { showWarning } from \"./utilities-messages.js\";\n\n/**\n * Creates array containing only items included in all input arrays.\n */\nexport function getIntersection<T>(items: T[][] = []): T[] {\n const [firstItem = [], ...otherItems] = items;\n if (otherItems.length === 0) {\n return firstItem;\n }\n return otherItems.reduce((accumulator, currentValue) => {\n return accumulator.filter((item) => currentValue.includes(item));\n }, firstItem);\n}\n\n/**\n * Converts array of arrays into a flat array.\n */\nexport function flattenArray<T>(input: T[][]): T[] {\n return ([] as T[]).concat(...input);\n}\n\n/**\n * Convert string that can contain wildcards (asterisks) to RegExp source.\n */\nexport function wildcardToRegExp(input: string): string {\n return (\n input\n // convert all special characters used by RegExp, except an asterisk\n .replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\")\n // convert asterisk to pattern that matches anything\n .replace(/\\*/g, \".+\")\n );\n}\n\n/**\n * Creates function that will test list of provided matchers against input.\n * Used for white/blacklist functionality.\n */\nexport function createPatternMatcher(list: CssSelectorMatch[]): PatternMatcher {\n const matchFunctions = list.map((item) => {\n if (isRegExp(item)) {\n return (input: string) => item.test(input);\n }\n\n if (typeof item === \"function\") {\n return (input: string) => {\n const result = item(input);\n if (typeof result !== \"boolean\") {\n showWarning(\n \"pattern matcher function invalid\",\n \"Provided pattern matching function does not return boolean. It's result will be ignored.\",\n item,\n );\n return false;\n }\n return result;\n };\n }\n\n if (typeof item === \"string\") {\n const re = new RegExp(\"^\" + wildcardToRegExp(item) + \"$\");\n return (input: string) => re.test(input);\n }\n\n showWarning(\n \"pattern matcher invalid\",\n \"Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.\",\n item,\n );\n return () => false;\n });\n\n return (input: string) =>\n matchFunctions.some((matchFunction) => matchFunction(input));\n}\n", "import { CSS_SELECTOR_TYPE } from \"./types.js\";\n\nexport const SELECTOR_SEPARATOR = \", \";\n\n// RegExp that will match invalid patterns that can be used in ID attribute.\nexport const INVALID_ID_RE = new RegExp(\n [\n \"^$\", // empty or not set\n \"\\\\s\", // contains whitespace\n ].join(\"|\"),\n);\n\n// RegExp that will match invalid patterns that can be used in class attribute.\nexport const INVALID_CLASS_RE = new RegExp(\n [\n \"^$\", // empty or not set\n ].join(\"|\"),\n);\n\n// Order in which a combined selector is constructed.\nexport const SELECTOR_PATTERN = [\n CSS_SELECTOR_TYPE.nthoftype,\n CSS_SELECTOR_TYPE.tag,\n CSS_SELECTOR_TYPE.id,\n CSS_SELECTOR_TYPE.class,\n CSS_SELECTOR_TYPE.attribute,\n CSS_SELECTOR_TYPE.nthchild,\n];\n", "import { sanitizeSelectorItem } from \"./utilities-selectors.js\";\nimport { createPatternMatcher, getIntersection } from \"./utilities-data.js\";\nimport { CssSelectorGenerated } from \"./types.js\";\n\ninterface AttributeData {\n name: string;\n value: string;\n}\n\n// List of attributes to be ignored. These are handled by different selector types.\nexport const attributeBlacklistMatch = createPatternMatcher([\n \"class\",\n \"id\",\n // Angular attributes\n \"ng-*\",\n]);\n\n/**\n * Get simplified attribute selector for an element.\n */\nexport function attributeNodeToSimplifiedSelector({\n name,\n}: AttributeData): CssSelectorGenerated {\n return `[${name}]` as CssSelectorGenerated;\n}\n\n/**\n * Get attribute selector for an element.\n */\nexport function attributeNodeToSelector({\n name,\n value,\n}: AttributeData): CssSelectorGenerated {\n return `[${name}='${value}']` as CssSelectorGenerated;\n}\n\n/**\n * Checks whether an attribute should be used as a selector.\n */\nexport function isValidAttributeNode(\n { nodeName, nodeValue }: Node,\n element: Element,\n): boolean {\n // form input value should not be used as a selector\n const tagName = element.tagName.toLowerCase();\n if ([\"input\", \"option\"].includes(tagName) && nodeName === \"value\") {\n return false;\n }\n\n // ignore Base64-encoded strings as 'src' attribute values (e.g. in tags like img, audio, video, iframe, object, embed).\n if (nodeName === \"src\" && nodeValue?.startsWith(\"data:\")) {\n return false;\n }\n\n return !attributeBlacklistMatch(nodeName);\n}\n\n/**\n * Sanitize all attribute data. We want to do it once, before we start to generate simplified/full selectors from the same data.\n */\nfunction sanitizeAttributeData({ nodeName, nodeValue }: Node): AttributeData {\n return {\n name: sanitizeSelectorItem(nodeName),\n value: sanitizeSelectorItem(nodeValue ?? undefined),\n };\n}\n\n/**\n * Get attribute selectors for an element.\n */\nexport function getElementAttributeSelectors(\n element: Element,\n): CssSelectorGenerated[] {\n const validAttributes = Array.from(element.attributes)\n .filter((attributeNode) => isValidAttributeNode(attributeNode, element))\n .map(sanitizeAttributeData);\n return [\n ...validAttributes.map(attributeNodeToSimplifiedSelector),\n ...validAttributes.map(attributeNodeToSelector),\n ];\n}\n\n/**\n * Get attribute selectors matching all elements.\n */\nexport function getAttributeSelectors(\n elements: Element[],\n): CssSelectorGenerated[] {\n const elementSelectors = elements.map(getElementAttributeSelectors);\n return getIntersection(elementSelectors);\n}\n", "import { SELECTOR_PATTERN } from \"./constants.js\";\nimport {\n getAttributeSelectors,\n getElementAttributeSelectors,\n} from \"./selector-attribute.js\";\nimport {\n getClassSelectors,\n getElementClassSelectors,\n} from \"./selector-class.js\";\nimport { getElementIdSelectors, getIdSelector } from \"./selector-id.js\";\nimport {\n getElementNthChildSelector,\n getNthChildSelector,\n} from \"./selector-nth-child.js\";\nimport {\n getElementNthOfTypeSelector,\n getNthOfTypeSelector,\n} from \"./selector-nth-of-type.js\";\nimport { getElementTagSelectors, getTagSelector } from \"./selector-tag.js\";\nimport { createPatternMatcher } from \"./utilities-data.js\";\nimport { getParents, testSelector } from \"./utilities-dom.js\";\nimport {\n CSS_SELECTOR_TYPE,\n CssSelector,\n CssSelectorData,\n CssSelectorGenerated,\n CssSelectorGeneratorOptions,\n CssSelectorType,\n CssSelectorTypes,\n IdentifiableParent,\n OPERATOR,\n PatternMatcher,\n} from \"./types.js\";\nimport { isElement } from \"./utilities-iselement.js\";\nimport { getPowerSet, powerSetGenerator } from \"./utilities-powerset.js\";\nimport { cartesianProductGenerator } from \"./utilities-cartesian.js\";\n\nexport const ESCAPED_COLON = \":\".charCodeAt(0).toString(16).toUpperCase();\n\n// Square brackets need to be escaped, but eslint has a problem with that.\n/* eslint-disable-next-line no-useless-escape */\nexport const SPECIAL_CHARACTERS_RE = /[ !\"#$%&'()\\[\\]{|}<>*+,./;=?@^`~\\\\]/;\n\n/**\n * Escapes special characters used by CSS selector items.\n */\nexport function sanitizeSelectorItem(input = \"\"): string {\n // This should not be necessary, but just to be sure, let's keep the legacy sanitizer in place, for backwards compatibility.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return CSS ? CSS.escape(input) : legacySanitizeSelectorItem(input);\n}\n\n/**\n * Legacy version of escaping utility, originally used for IE11-. Should\n * probably be replaced by a polyfill:\n * https://github.com/mathiasbynens/CSS.escape\n */\nexport function legacySanitizeSelectorItem(input = \"\"): string {\n return input\n .split(\"\")\n .map((character) => {\n if (character === \":\") {\n return `\\\\${ESCAPED_COLON} `;\n }\n if (SPECIAL_CHARACTERS_RE.test(character)) {\n return `\\\\${character}`;\n }\n\n // needed for backwards compatibility\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return escape(character).replace(/%/g, \"\\\\\");\n })\n .join(\"\");\n}\n\nexport const SELECTOR_TYPE_GETTERS: Record<\n CssSelectorType,\n (elements: Element[]) => CssSelector[]\n> = {\n tag: getTagSelector,\n id: getIdSelector,\n class: getClassSelectors,\n attribute: getAttributeSelectors,\n nthchild: getNthChildSelector,\n nthoftype: getNthOfTypeSelector,\n} as const;\n\nexport const ELEMENT_SELECTOR_TYPE_GETTERS: Record<\n CssSelectorType,\n (element: Element) => CssSelectorGenerated[]\n> = {\n tag: getElementTagSelectors,\n id: getElementIdSelectors,\n class: getElementClassSelectors,\n attribute: getElementAttributeSelectors,\n nthchild: getElementNthChildSelector,\n nthoftype: getElementNthOfTypeSelector,\n} as const;\n\n/**\n * Creates selector of given type for single element.\n */\nexport function getElementSelectorsByType(\n element: Element,\n selectorType: CssSelectorType,\n): CssSelectorGenerated[] {\n return ELEMENT_SELECTOR_TYPE_GETTERS[selectorType](element);\n}\n\n/**\n * Returns list of selectors of given type for the element.\n */\nexport function getSelectorsByType(\n elements: Element[],\n selector_type: CssSelectorType,\n): CssSelector[] {\n const getter = SELECTOR_TYPE_GETTERS[selector_type];\n return getter(elements);\n}\n\n/**\n * Remove blacklisted selectors from list.\n */\nexport function filterSelectors(\n list: CssSelector[] = [],\n matchBlacklist: PatternMatcher,\n matchWhitelist: PatternMatcher,\n): CssSelector[] {\n return list.filter((item) => matchWhitelist(item) || !matchBlacklist(item));\n}\n\n/**\n * Prioritise whitelisted selectors in list.\n */\nexport function orderSelectors(\n list: CssSelector[] = [],\n matchWhitelist: PatternMatcher,\n): CssSelector[] {\n return list.sort((a, b) => {\n const a_is_whitelisted = matchWhitelist(a);\n const b_is_whitelisted = matchWhitelist(b);\n if (a_is_whitelisted && !b_is_whitelisted) {\n return -1;\n }\n if (!a_is_whitelisted && b_is_whitelisted) {\n return 1;\n }\n return 0;\n });\n}\n\n/**\n * Yields list of unique selectors applicable to given element.\n */\nexport function* allSelectorsGenerator(\n elements: Element[],\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector> {\n const yieldedSelectors = new Set<string>();\n const selectors_list = getSelectorsList(elements, options);\n for (const selector of selectorTypeCombinationsGenerator(\n selectors_list,\n options,\n )) {\n if (!yieldedSelectors.has(selector)) {\n yieldedSelectors.add(selector);\n yield selector;\n }\n }\n}\n\n/**\n * Creates object containing all selector types and their potential values.\n */\nexport function getSelectorsList(\n elements: Element[],\n options: CssSelectorGeneratorOptions,\n): CssSelectorData {\n const { blacklist, whitelist, combineWithinSelector, maxCombinations } =\n options;\n\n const matchBlacklist = createPatternMatcher(blacklist);\n const matchWhitelist = createPatternMatcher(whitelist);\n\n const reducer = (data: CssSelectorData, selector_type: CssSelectorType) => {\n const selectors_by_type = getSelectorsByType(elements, selector_type);\n const filtered_selectors = filterSelectors(\n selectors_by_type,\n matchBlacklist,\n matchWhitelist,\n );\n const found_selectors = orderSelectors(filtered_selectors, matchWhitelist);\n\n // Use Array.from with a length limit to avoid materializing huge power sets\n // This provides lazy evaluation while respecting maxCombinations\n data[selector_type] = combineWithinSelector\n ? Array.from(\n powerSetGenerator(found_selectors, { maxResults: maxCombinations }),\n )\n : found_selectors.map((item) => [item]);\n\n return data;\n };\n\n return getSelectorsToGet(options).reduce(reducer, {});\n}\n\n/**\n * Creates list of selector types that we will need to generate the selector.\n */\nexport function getSelectorsToGet(\n options: CssSelectorGeneratorOptions,\n): CssSelectorTypes {\n const { selectors, includeTag } = options;\n\n const selectors_to_get = [...selectors];\n if (includeTag && !selectors_to_get.includes(\"tag\")) {\n selectors_to_get.push(\"tag\");\n }\n return selectors_to_get;\n}\n\n/**\n * Adds \"tag\" to a list, if it does not contain it. Used to modify selectors\n * list when includeTag option is enabled to make sure all results contain the\n * TAG part.\n */\nfunction addTagTypeIfNeeded(list: CssSelectorTypes): CssSelectorTypes {\n return list.includes(CSS_SELECTOR_TYPE.tag) ||\n list.includes(CSS_SELECTOR_TYPE.nthoftype)\n ? [...list]\n : [...list, CSS_SELECTOR_TYPE.tag];\n}\n\n/**\n * Generates list of possible selector type combinations.\n */\nexport function combineSelectorTypes(\n options: CssSelectorGeneratorOptions,\n): CssSelectorTypes[] {\n const { selectors, combineBetweenSelectors, includeTag, maxCandidates } =\n options;\n\n const combinations = combineBetweenSelectors\n ? getPowerSet(selectors, { maxResults: maxCandidates })\n : selectors.map((item) => [item]);\n\n return includeTag ? combinations.map(addTagTypeIfNeeded) : combinations;\n}\n\n/**\n * Generates list of combined CSS selectors.\n */\nexport function* selectorTypeCombinationsGenerator(\n selectors_list: CssSelectorData,\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector> {\n for (const item of combineSelectorTypes(options)) {\n yield* constructedSelectorsGenerator(item, selectors_list);\n }\n}\n\n/**\n * Generates all variations of possible selectors from provided data.\n */\nexport function* constructedSelectorsGenerator(\n selector_types: CssSelectorTypes,\n selectors_by_type: CssSelectorData,\n): IterableIterator<CssSelector> {\n const data: CssSelectorData = {};\n\n for (const selector_type of selector_types) {\n const selector_variants = selectors_by_type[selector_type];\n if (selector_variants && selector_variants.length > 0) {\n data[selector_type] = selector_variants;\n }\n }\n\n for (const combination of cartesianProductGenerator<string | string[]>(\n data,\n )) {\n yield constructSelector(combination);\n }\n}\n\n/**\n * Creates selector for given selector type. Combines several parts if needed.\n */\nexport function constructSelectorType(\n selector_type: CssSelectorType,\n selectors_data: CssSelectorData,\n): CssSelector {\n return selectors_data[selector_type]\n ? selectors_data[selector_type].join(\"\")\n : \"\";\n}\n\n/**\n * Converts selector data object to a selector.\n */\nexport function constructSelector(\n selectorData: CssSelectorData = {},\n): CssSelector {\n const pattern = [...SELECTOR_PATTERN];\n // selector \"nthoftype\" already contains \"tag\"\n if (\n selectorData[CSS_SELECTOR_TYPE.tag] &&\n selectorData[CSS_SELECTOR_TYPE.nthoftype]\n ) {\n pattern.splice(pattern.indexOf(CSS_SELECTOR_TYPE.tag), 1);\n }\n\n return pattern\n .map((type) => constructSelectorType(type, selectorData))\n .join(\"\");\n}\n\n/**\n * Generates combinations of child and descendant selectors within root\n * selector.\n */\nfunction generateCandidateCombinations(\n selectors: CssSelector[],\n rootSelector: CssSelector,\n): CssSelector[] {\n return [\n ...selectors.map(\n (selector) => rootSelector + OPERATOR.DESCENDANT + selector,\n ),\n ...selectors.map((selector) => rootSelector + OPERATOR.CHILD + selector),\n ];\n}\n\n/**\n * Generates a list of selector candidates that can potentially match target\n * element.\n */\nfunction* candidatesGenerator(\n selectors: IterableIterator<CssSelector>,\n rootSelector: CssSelector,\n): IterableIterator<CssSelector> {\n if (rootSelector === \"\") {\n yield* selectors;\n } else {\n for (const selector of selectors) {\n yield* generateCandidateCombinations([selector], rootSelector);\n }\n }\n}\n\n/**\n * Tries to find unique CSS selectors for element within given parent.\n */\nexport function* selectorWithinRootGenerator(\n elements: Element[],\n root: ParentNode,\n rootSelector: CssSelector = \"\",\n options: CssSelectorGeneratorOptions,\n): IterableIterator<CssSelector, undefined> {\n const elementSelectorsIterator = allSelectorsGenerator(elements, options);\n for (const candidateSelector of candidatesGenerator(\n elementSelectorsIterator,\n rootSelector,\n )) {\n if (testSelector(elements, candidateSelector, root)) {\n yield candidateSelector;\n }\n }\n // TODO remove the `undefined` return value when the main function is rewritten to use the generator directly\n return;\n}\n/**\n * Climbs through parents of the element and finds the ones that are identifiable by unique CSS selector.\n */\nexport function* closestIdentifiableParentGenerator(\n elements: Element[],\n root: ParentNode,\n rootSelector: CssSelector = \"\",\n options: CssSelectorGeneratorOptions,\n): IterableIterator<IdentifiableParent> {\n if (elements.length === 0) {\n return null;\n }\n\n const candidatesList = [\n elements.length > 1 ? elements : [],\n ...getParents(elements, root).map((element) => [element]),\n ];\n\n for (const currentElements of candidatesList) {\n for (const selectorWithinRoot of selectorWithinRootGenerator(\n currentElements,\n root,\n rootSelector,\n options,\n )) {\n yield {\n foundElements: currentElements,\n selector: selectorWithinRoot,\n };\n }\n }\n}\n\ninterface SelectorGeneratorProps {\n elements: Element[];\n root: ParentNode;\n rootSelector: CssSelector;\n options: CssSelectorGeneratorOptions;\n}\n\n/**\n * Recursively travels through parents, finds the ones that are identifiable and then tries to find a unique selector within that context.\n */\nexport function* selectorGenerator({\n elements,\n root,\n rootSelector = \"\",\n options,\n}: SelectorGeneratorProps): IterableIterator<CssSelector> {\n let currentRoot = root;\n let partialSelector = rootSelector;\n let shouldContinue = true;\n\n while (shouldContinue) {\n let foundAny = false;\n\n for (const item of closestIdentifiableParentGenerator(\n elements,\n currentRoot,\n partialSelector,\n options,\n )) {\n const { foundElements, selector } = item;\n foundAny = true;\n\n if (testSelector(elements, selector, root)) {\n yield selector;\n } else {\n // First non-matching selector - use its parent for next iteration\n currentRoot = foundElements[0];\n partialSelector = selector;\n break; // Try from this parent in next iteration\n }\n }\n\n if (!foundAny) {\n shouldContinue = false;\n }\n }\n}\n\n/**\n * Converts input into list of elements, removing duplicates and non-elements.\n */\nexport function sanitizeSelectorNeedle(needle: unknown): Element[] {\n if (needle instanceof NodeList || needle instanceof HTMLCollection) {\n needle = Array.from(needle);\n }\n const elements = (Array.isArray(needle) ? needle : [needle]).filter(\n isElement,\n );\n return [...new Set(elements)];\n}\n", "import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n\n/**\n * Is empty string\n *\n * @param {unknown} value\n * @returns {boolean} Whether the value is an empty string\n */\nexport const isEmptyString = (value: unknown): boolean => value === '';\n\n/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n};\n", "export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n", "import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n", "import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n key: '18887p',\n },\n ],\n];\n\n/**\n * @component @name MessageSquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst MessageSquare = createLucideIcon('message-square', __iconNode);\n\nexport default MessageSquare;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '6', cy: '19', r: '3', key: '1kj8tv' }],\n ['path', { d: 'M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15', key: '1d8sl' }],\n ['circle', { cx: '18', cy: '5', r: '3', key: 'gq8acd' }],\n];\n\n/**\n * @component @name Route\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/route\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Route = createLucideIcon('route', __iconNode);\n\nexport default Route;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z',\n key: '1s2grr',\n },\n ],\n ['path', { d: 'M20 2v4', key: '1rf3ol' }],\n ['path', { d: 'M22 4h-4', key: 'gwowj6' }],\n ['circle', { cx: '4', cy: '20', r: '2', key: '6kqj1y' }],\n];\n\n/**\n * @component @name Sparkles\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/sparkles\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Sparkles = createLucideIcon('sparkles', __iconNode);\n\nexport default Sparkles;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n];\n\n/**\n * @component @name Square\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Square = createLucideIcon('square', __iconNode);\n\nexport default Square;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z',\n key: 'vktsd0',\n },\n ],\n ['circle', { cx: '7.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'kqv944' }],\n];\n\n/**\n * @component @name Tag\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/tag\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Tag = createLucideIcon('tag', __iconNode);\n\nexport default Tag;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z',\n key: '1xq2db',\n },\n ],\n];\n\n/**\n * @component @name Zap\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/zap\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Zap = createLucideIcon('zap', __iconNode);\n\nexport default Zap;\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function DetectionBadge({ found }) {\n return (_jsx(\"span\", { className: cn('se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block', found ? 'se-bg-green-4' : 'se-bg-text-tertiary'), title: found ? 'Found on this page' : 'Not found on this page' }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nexport function DismissedSection({ count, children }) {\n const [isOpen, setIsOpen] = useState(false);\n return (_jsxs(\"div\", { className: \"se-mt-4 se-cursor-pointer se-select-none\", children: [_jsxs(\"div\", { role: \"button\", tabIndex: 0, className: \"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer\", onClick: () => setIsOpen(!isOpen), onKeyDown: (e) => {\n if (e.key === 'Enter' || e.key === ' ')\n setIsOpen(!isOpen);\n }, children: [_jsx(\"span\", { children: isOpen ? '\\u25be' : '\\u25b8' }), _jsxs(\"span\", { children: [\"Dismissed (\", count, \")\"] })] }), isOpen && _jsx(\"div\", { className: \"se-mt-1.5\", children: children })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorBody({ children }) {\n return _jsx(\"div\", { className: \"se-flex-1 se-overflow-auto se-p-6\", children: children });\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorCard({ children, itemKey, onClick, onMouseEnter, onMouseLeave, className, validated, }) {\n return (_jsx(\"div\", { \"data-item-key\": itemKey, onClick: onClick, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, className: cn('se-py-2 se-px-2.5 se-rounded-lg se-border se-bg-card-bg se-shadow-sm se-mb-1 se-text-sm se-text-text-primary', validated ? 'se-border-green-4/40 se-shadow-glow-green' : 'se-border-border-primary', onClick &&\n 'se-cursor-pointer hover:se-border-border-primary/80 hover:se-bg-sidebar-hover se-transition-colors', className), children: children }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorFooter({ onSave, onPublish }) {\n return (_jsxs(\"div\", { className: \"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2\", children: [_jsx(\"button\", { onClick: onSave, className: \"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-bg-btn-neutral se-text-btn-neutral-text se-border se-border-btn-neutral-border hover:se-text-btn-neutral-text-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none\", children: \"Save Draft\" }), _jsx(\"button\", { onClick: onPublish, className: \"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-border-none se-bg-btn-primary se-text-btn-primary-text hover:se-bg-btn-primary-hover se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center focus-visible:se-shadow-focus-primary focus-visible:se-outline-none\", children: \"Publish\" })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorHeader({ title, subtitle }) {\n return (_jsxs(\"div\", { className: \"se-px-4 se-pt-3 se-pb-2\", children: [_jsx(\"h2\", { className: \"se-m-0 se-text-base se-font-semibold se-text-text-primary\", children: title }), subtitle && (_jsx(\"p\", { className: \"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary\", children: subtitle }))] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorInput({ label, className, ...props }) {\n return (_jsxs(\"div\", { children: [label && (_jsx(\"label\", { className: \"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block\", children: label })), _jsx(\"input\", { ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-slate-grey-3 se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-shadow-focus-primary', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorLayout({ children }) {\n return _jsx(\"div\", { className: \"se-flex se-flex-col se-h-full se-font-sans\", children: children });\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useEffect, useRef } from 'react';\nimport { cn } from '../cn';\nexport function EditorTextarea({ label, className, value, ...props }) {\n const ref = useRef(null);\n // Auto-resize to fit content\n useEffect(() => {\n const el = ref.current;\n if (!el)\n return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n }, [value]);\n return (_jsxs(\"div\", { children: [label && (_jsx(\"label\", { className: \"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block\", children: label })), _jsx(\"textarea\", { ref: ref, value: value, ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-slate-grey-3 se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-resize-y se-min-h-[60px] se-max-h-[50vh] se-overflow-y-auto se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-shadow-focus-primary', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EmptyState({ message }) {\n return (_jsx(\"div\", { className: \"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm\", children: message }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function GroupHeader({ label, count, className }) {\n return (_jsxs(\"div\", { className: cn('se-text-xs se-font-bold se-text-text-primary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between', className), children: [_jsx(\"span\", { children: label }), _jsx(\"span\", { className: \"se-text-xs se-text-text-secondary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg\", children: count })] }));\n}\n", "/**\n * Human-readable summary generation for overlay config items.\n *\n * Pure functions \u2014 no DOM access, just string formatting from config data.\n */\n\nimport type { OverlaysConfig } from './schema';\n\nconst MAX_TEXT_LEN = 40;\n\n/**\n * Convert a CSS selector into a human-friendly element description.\n */\nexport function describeSelector(selector: string): string {\n if (!selector) return '(no target)';\n\n // ID selector: strip #\n if (selector.startsWith('#')) {\n return truncate(selector.slice(1), 50);\n }\n\n // data-testid selector\n const testIdMatch = selector.match(/\\[data-testid=\"([^\"]+)\"\\]/);\n if (testIdMatch) {\n return `${testIdMatch[1]} element`;\n }\n\n return truncate(selector, 50);\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max)}...`;\n}\n\nfunction truncateQuoted(text: string, max: number): string {\n if (text.length <= max) return `\"${text}\"`;\n return `\"${text.slice(0, max)}...\"`;\n}\n\n/**\n * Generate a human-readable one-liner for an overlay config item.\n */\nexport function summarizeOverlayItem(\n type: keyof OverlaysConfig,\n item: Record<string, unknown>\n): string {\n switch (type) {\n case 'tooltips': {\n const anchorId = (item.anchorId as string) || '';\n const desc = describeSelector(anchorId);\n const content = item.content as { title?: string; body: string } | undefined;\n const body = content?.body || '';\n return `Tooltip on ${desc}: ${truncateQuoted(body, MAX_TEXT_LEN)}`;\n }\n case 'highlights': {\n const anchorId = (item.anchorId as string) || '';\n const desc = describeSelector(anchorId);\n return `Highlight ${desc}`;\n }\n case 'badges': {\n const anchorId = (item.anchorId as string) || '';\n const desc = describeSelector(anchorId);\n const content = (item.content as string) || '';\n return `Badge \"${content}\" on ${desc}`;\n }\n case 'pulses': {\n const anchorId = (item.anchorId as string) || '';\n const desc = describeSelector(anchorId);\n return `Pulse on ${desc}`;\n }\n case 'modals': {\n const content = item.content as { title?: string; body: string } | undefined;\n const label = content?.title || content?.body || '';\n return `Modal: ${truncateQuoted(label, MAX_TEXT_LEN)}`;\n }\n case 'tours': {\n const tourId = (item.tourId as string) || 'unknown';\n const steps = (item.steps as unknown[]) || [];\n const count = steps.length;\n return `Tour: ${tourId} (${count} ${count === 1 ? 'step' : 'steps'})`;\n }\n default:\n return `Unknown overlay`;\n }\n}\n", "/**\n * Adaptive Overlays - Editor Component\n *\n * Review & tweak editor for AI-generated overlay configurations.\n * Displays a scannable list of one-liner summaries grouped by type.\n * Tours show a drill-in step list. Clicking an item highlights it on page.\n */\n\nimport {\n DetectionBadge,\n DismissedSection,\n EditorBody,\n EditorCard,\n EditorFooter,\n EditorHeader,\n EditorInput,\n EditorLayout,\n EditorTextarea,\n EmptyState,\n GroupHeader,\n} from '@syntrologie/shared-editor-ui';\nimport { MessageSquare, Route, Sparkles, Square, Tag, Zap } from 'lucide-react';\nimport type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { OverlaysConfig } from './schema';\nimport { summarizeOverlayItem } from './summarize';\nimport type { EditorPanelProps, TourStep } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype OverlaySection = 'tooltips' | 'highlights' | 'badges' | 'pulses' | 'modals';\ntype SectionKey = OverlaySection | 'tours';\n\nfunction itemKey(section: SectionKey, index: number): string {\n return `${section}:${index}`;\n}\n\n// ============================================================================\n// Section Config\n// ============================================================================\n\nconst OVERLAY_SECTIONS: OverlaySection[] = ['tooltips', 'highlights', 'badges', 'pulses', 'modals'];\n\nconst SECTION_ICON_MAP: Record<\n SectionKey,\n React.ComponentType<{ size?: number; className?: string }>\n> = {\n tooltips: MessageSquare,\n highlights: Sparkles,\n badges: Tag,\n pulses: Zap,\n modals: Square,\n tours: Route,\n};\n\n/** Renders the appropriate Lucide icon for a section type */\nfunction SectionIcon({ section, className }: { section: SectionKey; className?: string }) {\n const IconComponent = SECTION_ICON_MAP[section];\n return <IconComponent size={16} className={className} />;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\ninterface FlatItem {\n key: string;\n section: SectionKey;\n index: number;\n summary: string;\n anchorId: string;\n isTour: boolean;\n}\n\nfunction flattenItems(config: OverlaysConfig): FlatItem[] {\n const items: FlatItem[] = [];\n\n for (const section of OVERLAY_SECTIONS) {\n const arr = (config[section] as unknown[] | undefined) || [];\n arr.forEach((item, i) => {\n const rec = item as Record<string, unknown>;\n items.push({\n key: itemKey(section, i),\n section,\n index: i,\n summary: summarizeOverlayItem(section, rec),\n anchorId: (rec.anchorId as string) || '',\n isTour: false,\n });\n });\n }\n\n // Tours\n const tours = config.tours || [];\n tours.forEach((tour, i) => {\n items.push({\n key: itemKey('tours', i),\n section: 'tours',\n index: i,\n summary: summarizeOverlayItem('tours', tour as unknown as Record<string, unknown>),\n anchorId: '',\n isTour: true,\n });\n });\n\n return items;\n}\n\nfunction filterConfig(config: OverlaysConfig, dismissedKeys: Set<string>): OverlaysConfig {\n const result = { ...config };\n const allSections: SectionKey[] = [...OVERLAY_SECTIONS, 'tours'];\n for (const section of allSections) {\n const arr = (config[section] as unknown[] | undefined) || [];\n const filtered = arr.filter((_, i) => !dismissedKeys.has(itemKey(section, i)));\n if (filtered.length > 0 || config[section] !== undefined) {\n (result as Record<string, unknown>)[section] = filtered;\n }\n }\n return result;\n}\n\nfunction getStepIcon(step: TourStep): string {\n const action = step.action as Record<string, unknown>;\n const kind = (action.kind as string) || '';\n if (kind.includes('tooltip')) return '\\u{1f4ac}';\n if (kind.includes('highlight')) return '\\u{2728}';\n if (kind.includes('modal')) return '\\u{1f4e6}';\n if (kind.includes('badge')) return '\\u{1f3f7}\\u{fe0f}';\n if (kind.includes('pulse')) return '\\u{1f4ab}';\n return '\\u{25cf}';\n}\n\nfunction getStepLabel(step: TourStep): string {\n const action = step.action as Record<string, unknown>;\n const anchor = action.anchorId as string;\n if (anchor) return anchor;\n const content = action.content as Record<string, unknown> | undefined;\n if (content?.title) return content.title as string;\n if (content?.body) return (content.body as string).slice(0, 30);\n return step.id;\n}\n\n// ============================================================================\n// Detection\n// ============================================================================\n\ninterface DetectionEntry {\n found: boolean;\n element: HTMLElement | null;\n}\n\nfunction useAnchorDetection(\n items: FlatItem[],\n config: OverlaysConfig\n): Map<string, DetectionEntry> {\n const [detectionMap, setDetectionMap] = useState<Map<string, DetectionEntry>>(new Map());\n const itemsRef = useRef(items);\n const configRef = useRef(config);\n itemsRef.current = items;\n configRef.current = config;\n\n useEffect(() => {\n const runDetection = () => {\n const map = new Map<string, DetectionEntry>();\n for (const item of itemsRef.current) {\n let selectorToCheck = item.anchorId;\n\n // For tours, detect the first step's anchor\n if (item.isTour && !selectorToCheck) {\n const tours = configRef.current.tours || [];\n const tour = tours[item.index];\n if (tour && tour.steps.length > 0) {\n const firstStep = tour.steps[0];\n const action = firstStep.action as Record<string, unknown> | undefined;\n selectorToCheck = (action?.anchorId as string) || '';\n }\n }\n\n if (!selectorToCheck) {\n map.set(item.key, { found: false, element: null });\n continue;\n }\n\n try {\n const el = document.querySelector(selectorToCheck) as HTMLElement | null;\n map.set(item.key, { found: el !== null, element: el });\n } catch {\n map.set(item.key, { found: false, element: null });\n }\n }\n setDetectionMap(map);\n };\n\n runDetection();\n const interval = setInterval(runDetection, 2000);\n return () => clearInterval(interval);\n }, []);\n\n return detectionMap;\n}\n\n// ============================================================================\n// OverlaysEditor Component\n// ============================================================================\n\nfunction parseOverlayItemKey(key: string): { section: OverlaySection; index: number } {\n const [section, indexStr] = key.split(':');\n return { section: section as OverlaySection, index: Number(indexStr) };\n}\n\nexport function OverlaysEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as OverlaysConfig;\n const [dismissedKeys, setDismissedKeys] = useState<Set<string>>(\n () => editor.getDismissedKeys?.() ?? new Set()\n );\n const [expandedTour, setExpandedTour] = useState<string | null>(null);\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [_previewMode, setPreviewMode] = useState<'before' | 'after'>('after');\n\n // Sync dismissed keys back to navigation context on every change\n useEffect(() => {\n editor.setDismissedKeys?.(dismissedKeys);\n }, [dismissedKeys, editor]);\n\n // React to global before/after toggle from the panel\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentionally omitted \u2014 adding config/typedConfig/previewConfig would cause infinite re-renders since previewConfig triggers state updates\n useEffect(() => {\n const mode = editor.previewMode;\n if (!mode) return;\n\n if (mode === 'before') {\n // Remove all overlay changes \u2014 push a config with every item filtered out\n const allKeys = new Set(flattenItems(typedConfig).map((item) => item.key));\n const empty = filterConfig(typedConfig, allKeys);\n editor.previewConfig(empty as unknown as Record<string, unknown>);\n } else {\n // Restore the full config\n editor.previewConfig(config);\n }\n }, [editor.previewMode]);\n\n // Consume initialEditKey from accordion navigation on mount\n const initialConsumed = useRef(false);\n useEffect(() => {\n if (editor.initialEditKey != null && !initialConsumed.current) {\n initialConsumed.current = true;\n const allFlat = flattenItems(typedConfig);\n const targetIdx = Number(editor.initialEditKey);\n if (targetIdx >= 0 && targetIdx < allFlat.length) {\n const target = allFlat[targetIdx];\n if (target.isTour) {\n setExpandedTour(target.key);\n } else {\n setEditingKey(target.key);\n if (target.anchorId) {\n editor.highlightElement(target.anchorId);\n }\n }\n }\n editor.clearInitialState?.();\n } else if (editor.initialCreate && !initialConsumed.current) {\n initialConsumed.current = true;\n editor.clearInitialState?.();\n }\n }, [editor, typedConfig]);\n\n const allItems = flattenItems(typedConfig);\n const activeItems = allItems.filter((item) => !dismissedKeys.has(item.key));\n const dismissedItems = allItems.filter((item) => dismissedKeys.has(item.key));\n\n const overlayItems = activeItems.filter((item) => !item.isTour);\n const tourItems = activeItems.filter((item) => item.isTour);\n const totalItems = activeItems.length;\n const [_hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n const detectionMap = useAnchorDetection(allItems, typedConfig);\n const foundCount = activeItems.filter((item) => detectionMap.get(item.key)?.found).length;\n\n const handleDismiss = useCallback(\n (key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n if (expandedTour === key) setExpandedTour(null);\n if (editingKey === key) setEditingKey(null);\n },\n [expandedTour, editingKey]\n );\n\n const handleRestore = useCallback((key: string) => {\n setDismissedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }, []);\n\n const handleCardClick = useCallback(\n (item: FlatItem) => {\n if (item.isTour) {\n setExpandedTour((prev) => (prev === item.key ? null : item.key));\n } else {\n if (item.anchorId) {\n editor.highlightElement(item.anchorId);\n }\n setEditingKey(item.key);\n }\n },\n [editor]\n );\n\n const handleBackToList = useCallback(() => {\n setEditingKey(null);\n setPreviewMode('after');\n editor.previewConfig(config);\n editor.clearHighlight();\n }, [editor, config]);\n\n // Register back handler in panel header when editing\n useEffect(() => {\n editor.setBackHandler?.(editingKey !== null ? handleBackToList : null);\n return () => editor.setBackHandler?.(null);\n }, [editingKey, handleBackToList, editor]);\n\n const _handleBeforeAfter = useCallback(\n (mode: 'before' | 'after') => {\n setPreviewMode(mode);\n if (mode === 'before') {\n const filtered = filterConfig(typedConfig, new Set([editingKey!]));\n editor.previewConfig(filtered as unknown as Record<string, unknown>);\n } else {\n editor.previewConfig(config);\n }\n },\n [typedConfig, editingKey, editor, config]\n );\n\n const handleFieldChange = useCallback(\n (\n section: OverlaySection,\n index: number,\n updater: (item: Record<string, unknown>) => Record<string, unknown>\n ) => {\n const arr = ((typedConfig[section] as unknown[]) || []).slice();\n const item = { ...(arr[index] as Record<string, unknown>) };\n arr[index] = updater(item);\n const updated = { ...typedConfig, [section]: arr };\n onChange(updated as unknown as Record<string, unknown>);\n editor.setDirty(true);\n },\n [typedConfig, onChange, editor]\n );\n\n const handlePublish = useCallback(() => {\n if (dismissedKeys.size > 0) {\n const filtered = filterConfig(typedConfig, dismissedKeys);\n onChange(filtered as unknown as Record<string, unknown>);\n }\n editor.publish();\n }, [dismissedKeys, typedConfig, onChange, editor]);\n\n const handleCardHover = useCallback(\n (item: FlatItem) => {\n setHoveredKey(item.key);\n if (item.anchorId) {\n editor.highlightElement(item.anchorId);\n }\n },\n [editor]\n );\n\n const handleCardLeave = useCallback(() => {\n setHoveredKey(null);\n editor.clearHighlight();\n }, [editor]);\n\n // ---- Edit form renderers per overlay type ----\n\n const renderEditFields = (section: OverlaySection, index: number) => {\n const arr = (typedConfig[section] as unknown[] | undefined) || [];\n const item = arr[index] as Record<string, unknown> | undefined;\n if (!item) return null;\n\n const anchorId = (item.anchorId as string) || '';\n\n switch (section) {\n case 'tooltips': {\n const content = (item.content as Record<string, unknown>) || {};\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Title\"\n value={(content.title as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n content: { ...(it.content as Record<string, unknown>), title: e.target.value },\n }))\n }\n />\n <EditorTextarea\n label=\"Body\"\n value={(content.body as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n content: { ...(it.content as Record<string, unknown>), body: e.target.value },\n }))\n }\n />\n </div>\n );\n }\n\n case 'highlights':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Color\"\n value={((item.style as Record<string, unknown>)?.color as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n style: {\n ...((it.style as Record<string, unknown>) || {}),\n color: e.target.value,\n },\n }))\n }\n />\n </div>\n );\n\n case 'badges':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Content\"\n value={(item.content as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n content: e.target.value,\n }))\n }\n />\n </div>\n );\n\n case 'pulses':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Duration (ms)\"\n type=\"number\"\n value={(item.duration as number) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n duration: Number(e.target.value) || undefined,\n }))\n }\n />\n </div>\n );\n\n case 'modals': {\n const content = (item.content as Record<string, unknown>) || {};\n return (\n <div className=\"se-py-1\">\n <EditorInput\n label=\"Title\"\n value={(content.title as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n content: { ...(it.content as Record<string, unknown>), title: e.target.value },\n }))\n }\n />\n <EditorTextarea\n label=\"Body\"\n value={(content.body as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n handleFieldChange(section, index, (it) => ({\n ...it,\n content: { ...(it.content as Record<string, unknown>), body: e.target.value },\n }))\n }\n />\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n const renderTourDrillIn = (tourIdx: number) => {\n const tours = typedConfig.tours || [];\n const tour = tours[tourIdx];\n if (!tour) return null;\n\n return (\n <div className=\"se-p-3 se-rounded-lg se-border se-border-white/[0.08] se-bg-white/[0.02] se-mt-1 se-mb-2\">\n <div className=\"se-text-[13px] se-font-semibold se-text-slate-grey-10 se-mb-2\">\n {'\\u{1f3af}'} Tour: {tour.tourId}\n </div>\n <label className=\"se-flex se-items-center se-gap-2 se-text-xs se-text-[#d1d5db] se-mb-2\">\n <input type=\"checkbox\" checked={tour.autoStart || false} readOnly />\n Auto-start tour\n </label>\n {tour.steps.map((step, stepIdx) => (\n <div\n key={step.id || stepIdx}\n className=\"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2 se-rounded se-border se-border-white/[0.04] se-mb-1 se-text-xs se-text-[#d1d5db]\"\n >\n <span className=\"se-text-[11px] se-font-bold se-text-slate-grey-7 se-min-w-[18px]\">\n {stepIdx + 1}.\n </span>\n <span>{getStepIcon(step)}</span>\n <div className=\"se-flex-1 se-overflow-hidden\">\n <div>{getStepLabel(step)}</div>\n {step.route && (\n <div className=\"se-text-[10px] se-text-slate-grey-7 se-font-mono\">{step.route}</div>\n )}\n </div>\n </div>\n ))}\n {tour.steps.length === 0 && (\n <div className=\"se-text-xs se-text-slate-grey-7 se-py-2\">No steps in this tour.</div>\n )}\n <button\n type=\"button\"\n className=\"se-py-1 se-px-2.5 se-rounded se-border se-border-white/10 se-bg-transparent se-text-slate-grey-8 se-text-[11px] se-cursor-pointer se-mt-2\"\n onClick={() => setExpandedTour(null)}\n >\n ← Back to list\n </button>\n </div>\n );\n };\n\n const renderCard = (item: FlatItem) => {\n const detection = detectionMap.get(item.key);\n return (\n <div key={item.key}>\n <EditorCard\n itemKey={item.key}\n onClick={() => handleCardClick(item)}\n className=\"se-flex se-items-center se-gap-2\"\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n <DetectionBadge found={detection?.found ?? false} />\n {/* biome-ignore lint/a11y/noStaticElementInteractions: icon span within interactive card, keyboard handled by parent */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: icon span within interactive card, keyboard handled by parent */}\n <span\n className=\"se-shrink-0 se-flex se-items-center -se-ml-1\"\n onClick={(e) => {\n e.stopPropagation();\n handleCardClick(item);\n }}\n >\n <SectionIcon section={item.section} />\n </span>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: summary span within interactive card, keyboard handled by parent */}\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: summary span within interactive card, keyboard handled by parent */}\n <span\n className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\"\n onClick={() => handleCardClick(item)}\n >\n {item.summary}\n </span>\n <button\n type=\"button\"\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-sm se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss(item.key);\n }}\n title=\"Dismiss\"\n >\n ×\n </button>\n </EditorCard>\n {item.isTour && expandedTour === item.key && renderTourDrillIn(item.index)}\n </div>\n );\n };\n\n return (\n <EditorLayout>\n <EditorHeader\n title=\"Review Changes\"\n subtitle={`${totalItems} item${totalItems !== 1 ? 's' : ''}${totalItems > 0 ? ` (${foundCount} found on this page)` : ''}`}\n onBack={() => editor.navigateHome()}\n />\n\n <EditorBody>\n {editingKey !== null ? (\n (() => {\n const ref = parseOverlayItemKey(editingKey);\n const editItem = allItems.find((it) => it.key === editingKey);\n return (\n <>\n <div className=\"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10\">\n <span>{editItem && <SectionIcon section={editItem.section} />}</span>\n <span>{editItem?.summary}</span>\n </div>\n {renderEditFields(ref.section, ref.index)}\n </>\n );\n })()\n ) : (\n <>\n {allItems.length === 0 && <EmptyState message=\"No overlays configured.\" />}\n\n {overlayItems.length > 0 && (\n <>\n <GroupHeader label=\"OVERLAYS\" count={overlayItems.length} />\n {overlayItems.map(renderCard)}\n </>\n )}\n\n {tourItems.length > 0 && (\n <>\n <GroupHeader\n label=\"TOURS\"\n count={tourItems.length}\n className={overlayItems.length > 0 ? 'se-mt-4' : ''}\n />\n {tourItems.map(renderCard)}\n </>\n )}\n\n {dismissedItems.length > 0 && (\n <DismissedSection count={dismissedItems.length}>\n {dismissedItems.map((item) => (\n <div\n key={item.key}\n className=\"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60\"\n >\n <span className=\"se-shrink-0 se-flex se-items-center -se-ml-1\">\n <SectionIcon section={item.section} />\n </span>\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through\">\n {item.summary}\n </span>\n <button\n type=\"button\"\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-blue-5 se-text-[11px] se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(item.key);\n }}\n >\n Restore\n </button>\n </div>\n ))}\n </DismissedSection>\n )}\n </>\n )}\n </EditorBody>\n\n <EditorFooter onSave={() => editor.save()} onPublish={handlePublish} />\n </EditorLayout>\n );\n}\n\n/**\n * Editor module configuration.\n */\nexport const editor = {\n panel: {\n title: 'Overlays',\n icon: '\\u{1f4ac}',\n description: 'Tooltips, highlights, and visual overlays',\n },\n component: OverlaysEditor,\n};\n\nexport const editorPanel = editor.panel;\n\nexport default OverlaysEditor;\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: '#1c2124',\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 * Highlight Overlay\n *\n * Creates a spotlight effect around an element with a scrim backdrop.\n */\n\nimport { blue } from '@syntro/design-system/tokens';\n\nconst supportsPathClip =\n typeof CSS !== 'undefined' && CSS.supports?.('clip-path', \"path('M0 0 H1 V1 Z')\");\n\nexport type HighlightHandle = { destroy(): void };\n\nexport interface HighlightOptions {\n paddingPx?: number;\n radiusPx?: number;\n scrimOpacity?: number;\n ringColor?: string;\n blocking?: boolean;\n onClickOutside?: boolean;\n onEsc?: boolean;\n}\n\nexport function showHighlight(\n anchorEl: HTMLElement,\n overlayRoot: HTMLElement,\n opts?: HighlightOptions\n): HighlightHandle {\n const padding = opts?.paddingPx ?? 12;\n const radius = opts?.radiusPx ?? 12;\n const opacity = Math.min(Math.max(opts?.scrimOpacity ?? 0.55, 0), 1);\n const ringColor = opts?.ringColor ?? `var(--syntro-ring, ${blue[5]})`;\n const blocking = opts?.blocking ?? false;\n const onClickOutside = opts?.onClickOutside ?? true;\n const onEsc = opts?.onEsc ?? true;\n\n const rootStyles = getComputedStyle(document.documentElement);\n const tokenScrim = rootStyles.getPropertyValue('--syntro-spotlight-backdrop').trim();\n const tokenRing = rootStyles.getPropertyValue('--syntro-ring').trim();\n\n const scrim = document.createElement('div');\n scrim.className = 'syntro-spotlight-scrim';\n const needsPointerEvents = blocking || onClickOutside;\n Object.assign(scrim.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483646',\n pointerEvents: needsPointerEvents ? 'auto' : 'none',\n background: tokenScrim || `rgba(2, 6, 23, ${opacity})`,\n transition: 'opacity 220ms ease',\n opacity: '0',\n });\n overlayRoot.appendChild(scrim);\n requestAnimationFrame(() => (scrim.style.opacity = '1'));\n\n const ring = document.createElement('div');\n ring.className = 'syntro-spotlight-ring';\n Object.assign(ring.style, {\n position: 'fixed',\n pointerEvents: 'none',\n borderRadius: `${radius}px`,\n border: `2px solid ${ringColor || tokenRing || blue[5]}`,\n boxShadow: `0 0 0 4px rgba(255,255,255,0.35)`,\n zIndex: '2147483647',\n transition: 'all 220ms cubic-bezier(0.16,1,0.3,1)',\n });\n overlayRoot.appendChild(ring);\n\n const fallbackSlices: HTMLDivElement[] = [];\n if (!supportsPathClip) {\n for (let i = 0; i < 4; i++) {\n const slice = document.createElement('div');\n slice.style.position = 'fixed';\n slice.style.background = 'inherit';\n fallbackSlices.push(slice);\n scrim.appendChild(slice);\n }\n }\n\n const setClipPath = (path: string) => {\n scrim.style.clipPath = path;\n (scrim.style as any).webkitClipPath = path;\n };\n\n const update = () => {\n const rect = anchorEl.getBoundingClientRect();\n const x = Math.max(0, rect.left - padding);\n const y = Math.max(0, rect.top - padding);\n const w = Math.min(window.innerWidth, rect.width + padding * 2);\n const h = Math.min(window.innerHeight, rect.height + padding * 2);\n\n Object.assign(ring.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n });\n\n if (supportsPathClip) {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const r = Math.min(radius, w / 2, h / 2);\n\n const outer = `M 0 0 L ${vw} 0 L ${vw} ${vh} L 0 ${vh} Z`;\n const inner =\n `M ${x + r} ${y} ` +\n `A ${r} ${r} 0 0 0 ${x} ${y + r} ` +\n `L ${x} ${y + h - r} ` +\n `A ${r} ${r} 0 0 0 ${x + r} ${y + h} ` +\n `L ${x + w - r} ${y + h} ` +\n `A ${r} ${r} 0 0 0 ${x + w} ${y + h - r} ` +\n `L ${x + w} ${y + r} ` +\n `A ${r} ${r} 0 0 0 ${x + w - r} ${y} ` +\n `L ${x + r} ${y} ` +\n `Z`;\n\n setClipPath(`path('${outer} ${inner}')`);\n } else {\n const [top, right, bottom, left] = fallbackSlices;\n Object.assign(top.style, {\n left: '0px',\n top: '0px',\n width: '100vw',\n height: `${y}px`,\n });\n Object.assign(bottom.style, {\n left: '0px',\n top: `${y + h}px`,\n width: '100vw',\n height: `${Math.max(0, window.innerHeight - (y + h))}px`,\n });\n Object.assign(left.style, {\n left: '0px',\n top: `${y}px`,\n width: `${x}px`,\n height: `${h}px`,\n });\n Object.assign(right.style, {\n left: `${x + w}px`,\n top: `${y}px`,\n width: `${Math.max(0, window.innerWidth - (x + w))}px`,\n height: `${h}px`,\n });\n }\n };\n\n const ro = new ResizeObserver(() => requestAnimationFrame(update));\n ro.observe(anchorEl);\n const onScroll = () => requestAnimationFrame(update);\n const onResize = () => requestAnimationFrame(update);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && onEsc) handle.destroy();\n };\n if (onEsc) {\n window.addEventListener('keydown', onKey);\n }\n\n const onClick = (event: MouseEvent) => {\n if (blocking) {\n event.preventDefault();\n event.stopPropagation();\n } else if (onClickOutside) {\n handle.destroy();\n }\n };\n scrim.addEventListener('click', onClick);\n\n const handle: HighlightHandle = {\n destroy() {\n ro.disconnect();\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n if (onEsc) {\n window.removeEventListener('keydown', onKey);\n }\n scrim.removeEventListener('click', onClick);\n scrim.style.pointerEvents = 'none';\n scrim.style.opacity = '0';\n setTimeout(() => {\n scrim.remove();\n ring.remove();\n }, 220);\n },\n };\n\n update();\n return handle;\n}\n", "/**\n * HTML Sanitizer\n *\n * Sanitizes HTML to prevent XSS attacks.\n * Uses native Sanitizer API when available, falls back to whitelist approach.\n */\n\nconst ALLOWED_TAGS = new Set([\n 'b',\n 'strong',\n 'i',\n 'em',\n 'u',\n 'span',\n 'div',\n 'p',\n 'br',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'small',\n 'sup',\n 'sub',\n 'a',\n 'button',\n]);\n\nexport function sanitizeHtml(html: string): string {\n // Try native Sanitizer API first\n const hasNative = typeof (window as any).Sanitizer === 'function';\n if (hasNative) {\n try {\n const s = new (window as any).Sanitizer({});\n const frag = s.sanitizeToFragment(html);\n const div = document.createElement('div');\n div.append(frag);\n return div.innerHTML;\n } catch {\n // Fall through to manual sanitizer\n }\n }\n\n // Conservative fallback sanitizer\n const tpl = document.createElement('template');\n tpl.innerHTML = html;\n const root = tpl.content;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\n const toRemove: Element[] = [];\n\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n const tag = el.tagName.toLowerCase();\n\n if (!ALLOWED_TAGS.has(tag)) {\n toRemove.push(el);\n continue;\n }\n\n // Remove dangerous attributes\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n const value = attr.value.trim().toLowerCase();\n const isEvent = name.startsWith('on');\n const isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n\n return tpl.innerHTML;\n}\n", "/**\n * Modal Executor\n *\n * Displays a centered modal dialog with optional CTA buttons.\n */\n\nimport { base } from '@syntro/design-system/tokens';\n\nimport { sanitizeHtml } from './sanitizer';\nimport type { ActionExecutor, ExecutorResult, ModalAction } from './types';\n\n/**\n * Execute a modal action\n */\nexport const executeModal: ActionExecutor<ModalAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const { content, size = 'md', blocking = false, scrim, dismiss, ctaButtons } = action;\n\n // Create scrim backdrop\n const scrimEl = document.createElement('div');\n scrimEl.className = 'syntro-modal-scrim';\n scrimEl.style.cssText = `\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, ${scrim?.opacity ?? 0.6});\n z-index: 2147483645;\n opacity: 0;\n transition: opacity 200ms ease-out;\n `;\n context.overlayRoot.appendChild(scrimEl);\n\n // Create modal container\n const modal = document.createElement('div');\n modal.className = `syntro-modal syntro-modal-${size}`;\n modal.setAttribute('role', 'dialog');\n modal.setAttribute('aria-modal', 'true');\n\n // Size-based max-widths\n const sizeMap = { sm: '360px', md: '480px', lg: '640px' };\n modal.style.cssText = `\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n max-width: ${sizeMap[size]};\n width: 90%;\n background: ${base.white};\n border-radius: 12px;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n z-index: 2147483646;\n opacity: 0;\n transition: opacity 200ms ease-out, transform 200ms ease-out;\n padding: 24px;\n `;\n\n // Build modal HTML content\n let html = '';\n if (content.title) {\n html += `<h2 class=\"syntro-modal-title\" style=\"margin: 0 0 12px 0; font-size: 18px; font-weight: 600; color: #111827;\">${sanitizeHtml(content.title)}</h2>`;\n }\n html += `<div class=\"syntro-modal-body\" style=\"color: #4b5563; line-height: 1.5;\">${sanitizeHtml(content.body)}</div>`;\n\n // Add close button if enabled\n if (dismiss?.closeButton !== false) {\n html += `\n <button class=\"syntro-modal-close\" data-syntro-action=\"dismiss\" style=\"\n position: absolute;\n top: 16px;\n right: 16px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: #6b7280;\n \" aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\"/>\n </svg>\n </button>\n `;\n }\n\n // Add CTA buttons\n if (ctaButtons && ctaButtons.length > 0) {\n html += `<div class=\"syntro-modal-actions\" style=\"display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end;\">`;\n for (const btn of ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-modal-btn ${isPrimary ? 'syntro-modal-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n style=\"\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease;\n ${\n isPrimary\n ? 'background: #4f46e5; color: white; border: none;'\n : 'background: white; color: #374151; border: 1px solid #d1d5db;'\n }\n \"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n }\n\n modal.innerHTML = html;\n context.overlayRoot.appendChild(modal);\n\n // Track state for waitFor\n let actionClicked: string | null = null;\n\n // Handle action button clicks\n const actionBtns = modal.querySelectorAll<HTMLElement>('[data-syntro-action]');\n const actionHandler = (e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId) {\n actionClicked = actionId;\n context.publishEvent('action.modal_cta_clicked', {\n actionId,\n });\n handle.destroy();\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n\n // Handle escape key\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && dismiss?.onEsc !== false) {\n handle.destroy();\n }\n };\n window.addEventListener('keydown', onKey);\n\n // Handle click outside (on scrim)\n const onScrimClick = () => {\n if (!blocking) {\n handle.destroy();\n }\n };\n scrimEl.addEventListener('click', onScrimClick);\n\n // Blocking mode - make siblings inert (except editor panel)\n const originalInert: Element[] = [];\n if (blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (\n el !== context.overlayRoot &&\n el.getAttribute('inert') === null &&\n !el.querySelector('[data-syntro-editor-panel]') &&\n !el.hasAttribute('data-syntro-editor-panel')\n ) {\n el.setAttribute('inert', '');\n originalInert.push(el);\n }\n });\n }\n\n // Set up timeout if specified\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (dismiss?.timeoutMs) {\n timeoutId = setTimeout(() => {\n handle.destroy();\n }, dismiss.timeoutMs);\n }\n\n // Focus first focusable element\n const focusableEls = modal.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusableEls.length > 0) {\n requestAnimationFrame(() => focusableEls[0].focus());\n }\n\n // Fade in\n requestAnimationFrame(() => {\n scrimEl.style.opacity = '1';\n modal.style.opacity = '1';\n modal.style.transform = 'translate(-50%, -50%) scale(1)';\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:modal',\n size,\n blocking,\n });\n\n const handle = {\n destroy() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n window.removeEventListener('keydown', onKey);\n scrimEl.removeEventListener('click', onScrimClick);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n\n // Restore inert state\n originalInert.forEach((el) => el.removeAttribute('inert'));\n\n // Fade out then remove\n modal.style.pointerEvents = 'none';\n scrimEl.style.pointerEvents = 'none';\n modal.style.opacity = '0';\n modal.style.transform = 'translate(-50%, -50%) scale(0.95)';\n scrimEl.style.opacity = '0';\n setTimeout(() => {\n modal.remove();\n scrimEl.remove();\n }, 200);\n\n context.publishEvent('action.modal_dismissed', {\n actionClicked,\n });\n },\n };\n\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n", "/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n", "import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n var _platform$detectOverf;\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: {\n ...platform,\n detectOverflow: (_platform$detectOverf = platform.detectOverflow) != null ? _platform$detectOverf : detectOverflow\n },\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n", "function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n", "import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the <html> but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the <body> scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element \u2014\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n", "/**\n * Tooltip Overlay\n *\n * Creates a positioned tooltip near an element using Floating UI.\n */\n\nimport {\n arrow as arrowMiddleware,\n autoUpdate,\n computePosition,\n flip,\n hide,\n type Middleware,\n offset,\n type Placement,\n shift,\n type VirtualElement,\n} from '@floating-ui/dom';\n\nimport { sanitizeHtml } from './sanitizer';\n\nexport type TooltipHandle = { destroy(): void; el: HTMLElement };\n\nexport interface TooltipOptions {\n html: string;\n placement?: Placement | 'auto';\n offsetPx?: number;\n blocking?: boolean;\n trigger?: 'immediate' | 'hover' | 'click';\n onAction?: (actionId: string) => void;\n}\n\n/**\n * For large elements (larger than viewport), create a virtual anchor\n * at the center of the visible portion.\n */\nfunction getAnchorReference(anchorEl: HTMLElement): HTMLElement | VirtualElement {\n const rect = anchorEl.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const isLargeElement = rect.width > viewportWidth * 0.8 || rect.height > viewportHeight * 0.8;\n\n if (!isLargeElement) {\n return anchorEl;\n }\n\n const visibleLeft = Math.max(rect.left, 0);\n const visibleTop = Math.max(rect.top, 0);\n const visibleRight = Math.min(rect.right, viewportWidth);\n const visibleBottom = Math.min(rect.bottom, viewportHeight);\n\n const centerX = (visibleLeft + visibleRight) / 2;\n const centerY = (visibleTop + visibleBottom) / 2;\n\n return {\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: centerX,\n y: centerY,\n top: centerY,\n left: centerX,\n right: centerX,\n bottom: centerY,\n };\n },\n };\n}\n\nexport function showTooltip(\n anchorEl: HTMLElement,\n overlayRoot: HTMLElement,\n opts: TooltipOptions\n): TooltipHandle {\n // Scroll anchor into view for non-large elements\n const rect = anchorEl.getBoundingClientRect();\n const isLargeElement =\n rect.width > window.innerWidth * 0.8 || rect.height > window.innerHeight * 0.8;\n if (!isLargeElement) {\n anchorEl.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });\n }\n\n const div = document.createElement('div');\n div.className = 'syntro-tooltip';\n div.setAttribute('role', 'tooltip');\n div.innerHTML = sanitizeHtml(opts.html);\n\n // Add close button for immediate tooltips so users can dismiss them\n if (!opts.trigger || opts.trigger === 'immediate') {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'syntro-tooltip-close';\n closeBtn.setAttribute('aria-label', 'Close');\n closeBtn.textContent = '\\u00d7';\n Object.assign(closeBtn.style, {\n position: 'absolute',\n top: '4px',\n right: '4px',\n background: 'none',\n border: 'none',\n color: 'inherit',\n fontSize: '16px',\n lineHeight: '1',\n cursor: 'pointer',\n opacity: '0.6',\n padding: '2px 4px',\n });\n closeBtn.addEventListener('mouseenter', () => {\n closeBtn.style.opacity = '1';\n });\n closeBtn.addEventListener('mouseleave', () => {\n closeBtn.style.opacity = '0.6';\n });\n closeBtn.addEventListener('click', () => handle.destroy());\n div.style.position = 'relative';\n div.appendChild(closeBtn);\n }\n\n // Handle action button clicks\n const actionBtns = div.querySelectorAll<HTMLElement>('[data-syntro-action]');\n const actionHandler = (e: Event) => {\n const btn = e.currentTarget as HTMLElement;\n const actionId = btn.getAttribute('data-syntro-action');\n if (actionId && opts.onAction) {\n opts.onAction(actionId);\n }\n };\n actionBtns.forEach((btn) => btn.addEventListener('click', actionHandler));\n\n // Create arrow element\n const arrowEl = document.createElement('div');\n arrowEl.className = 'syntro-tooltip-arrow';\n div.appendChild(arrowEl);\n\n overlayRoot.appendChild(div);\n\n const middleware: Middleware[] = [\n offset(opts.offsetPx ?? 8),\n flip(),\n shift({ padding: 8 }),\n hide(),\n arrowMiddleware({ element: arrowEl }),\n ];\n\n const placement: Placement = opts.placement && opts.placement !== 'auto' ? opts.placement : 'top';\n\n const cleanup = autoUpdate(anchorEl, div, async () => {\n const currentAnchorRef = getAnchorReference(anchorEl);\n const result = await computePosition(currentAnchorRef, div, {\n placement,\n middleware,\n });\n\n const { x, y, strategy, middlewareData, placement: finalPlacement } = result;\n\n Object.assign(div.style, {\n left: `${x}px`,\n top: `${y}px`,\n position: strategy,\n });\n\n // Position arrow\n if (middlewareData.arrow) {\n const { x: arrowX, y: arrowY } = middlewareData.arrow;\n const side = finalPlacement.split('-')[0];\n\n const staticSide: Record<string, string> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n\n Object.assign(arrowEl.style, {\n left: arrowX != null ? `${arrowX}px` : '',\n top: arrowY != null ? `${arrowY}px` : '',\n right: '',\n bottom: '',\n [staticSide[side]]: '-4px',\n });\n\n const rotation: Record<string, string> = {\n top: '0deg',\n right: '90deg',\n bottom: '180deg',\n left: '270deg',\n };\n arrowEl.style.transform = `rotate(${rotation[side] || '0deg'})`;\n }\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handle.destroy();\n };\n window.addEventListener('keydown', onKey);\n\n // Handle blocking mode\n const originalInert: string[] = [];\n\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot && el.getAttribute('inert') === null) {\n el.setAttribute('inert', '');\n originalInert.push(el.id || el.tagName);\n }\n });\n\n const focusableEls = Array.from(\n div.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n );\n\n if (focusableEls.length > 0) {\n const firstFocusable = focusableEls[0];\n const lastFocusable = focusableEls[focusableEls.length - 1];\n\n const trapFocus = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n lastFocusable.focus();\n e.preventDefault();\n }\n } else if (document.activeElement === lastFocusable) {\n firstFocusable.focus();\n e.preventDefault();\n }\n };\n\n div.addEventListener('keydown', trapFocus);\n requestAnimationFrame(() => firstFocusable.focus());\n }\n }\n\n const attachTrigger = () => {\n if (opts.trigger === 'hover') {\n const enter = () => {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n };\n const leave = () => {\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n\n anchorEl.addEventListener('mouseenter', enter);\n anchorEl.addEventListener('mouseleave', leave);\n anchorEl.addEventListener('focus', enter);\n anchorEl.addEventListener('blur', leave);\n return () => {\n anchorEl.removeEventListener('mouseenter', enter);\n anchorEl.removeEventListener('mouseleave', leave);\n anchorEl.removeEventListener('focus', enter);\n anchorEl.removeEventListener('blur', leave);\n };\n }\n\n if (opts.trigger === 'click') {\n const toggle = () => {\n const isVisible = div.style.visibility === 'visible';\n if (isVisible) {\n handle.destroy();\n } else {\n div.style.visibility = 'visible';\n div.style.opacity = '1';\n }\n };\n div.style.visibility = 'hidden';\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease, visibility 200ms';\n anchorEl.addEventListener('click', toggle);\n return () => anchorEl.removeEventListener('click', toggle);\n }\n\n // Immediate - fade in on mount\n div.style.opacity = '0';\n div.style.transition = 'opacity 200ms ease';\n requestAnimationFrame(() => {\n div.style.opacity = '1';\n });\n return () => {};\n };\n\n const removeTrigger = attachTrigger();\n\n const handle: TooltipHandle = {\n el: div,\n destroy() {\n cleanup();\n removeTrigger();\n window.removeEventListener('keydown', onKey);\n actionBtns.forEach((btn) => btn.removeEventListener('click', actionHandler));\n\n if (opts.blocking) {\n Array.from(document.body.children).forEach((el) => {\n if (el !== overlayRoot) {\n el.removeAttribute('inert');\n }\n });\n }\n\n div.style.pointerEvents = 'none';\n div.style.opacity = '0';\n setTimeout(() => div.remove(), 200);\n },\n };\n\n return handle;\n}\n", "/**\n * Adaptive Overlays - Runtime Module\n *\n * Visual overlay actions: highlight, pulse, badge, tooltip.\n */\n\nimport { showHighlight } from './highlight';\nimport { executeModal } from './modal';\nimport { sanitizeHtml } from './sanitizer';\nimport { showTooltip } from './tooltip';\nimport type {\n ActionExecutor,\n BadgeAction,\n ExecutorResult,\n HighlightAction,\n PulseAction,\n TooltipAction,\n} from './types';\n\n// Re-export executeModal for use by other packages\nexport { executeModal };\n\n// ============================================================================\n// Executors\n// ============================================================================\n\n/**\n * Execute a highlight action\n */\nexport const executeHighlight: ActionExecutor<HighlightAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n\n const handle = showHighlight(anchorEl, context.overlayRoot, {\n paddingPx: action.style?.paddingPx ?? 12,\n radiusPx: action.style?.radiusPx ?? 12,\n scrimOpacity: action.style?.scrimOpacity ?? 0.55,\n ringColor: action.style?.color,\n blocking: action.blocking ?? false,\n onClickOutside: action.onClickOutside ?? true,\n onEsc: action.onEsc ?? true,\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:highlight',\n anchorId: action.anchorId,\n });\n\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n\n/**\n * Execute a pulse action\n */\nexport const executePulse: ActionExecutor<PulseAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n\n const duration = action.duration ?? 2000;\n\n // Inject scoped pulse animation (no global styles)\n if (!document.querySelector('[data-syntro-pulse-styles]')) {\n const style = document.createElement('style');\n style.setAttribute('data-syntro-pulse-styles', '');\n style.textContent = `\n @keyframes syntro-pulse-anim {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(79, 70, 229, 0);\n }\n }\n `;\n document.head.appendChild(style);\n }\n\n // Apply pulse animation via inline style (scoped to this element)\n const originalAnimation = anchorEl.style.animation;\n anchorEl.style.animation = 'syntro-pulse-anim 1s cubic-bezier(0.4, 0, 0.6, 1) infinite';\n anchorEl.setAttribute('data-syntro-pulse', 'true');\n\n // Set up auto-remove timeout\n const timeoutId = setTimeout(() => {\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n }, duration);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:pulse',\n anchorId: action.anchorId,\n duration,\n });\n\n return {\n cleanup: () => {\n clearTimeout(timeoutId);\n anchorEl.style.animation = originalAnimation;\n anchorEl.removeAttribute('data-syntro-pulse');\n },\n };\n};\n\n/**\n * Execute a badge action\n */\nexport const executeBadge: ActionExecutor<BadgeAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n\n // Create badge element with inline styles (no global style injection)\n const badge = document.createElement('div');\n badge.textContent = action.content;\n badge.setAttribute('data-syntro-badge', action.anchorId);\n\n // Apply styles directly to element\n Object.assign(badge.style, {\n position: 'absolute',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: '1',\n color: 'white',\n background: 'var(--syntro-accent, #4f46e5)',\n borderRadius: '9999px',\n pointerEvents: 'none',\n zIndex: '2147483646',\n whiteSpace: 'nowrap',\n });\n\n // Position badge relative to anchor\n const position = action.position ?? 'top-right';\n\n // Ensure anchor has relative positioning for badge\n const originalPosition = anchorEl.style.position;\n if (getComputedStyle(anchorEl).position === 'static') {\n anchorEl.style.position = 'relative';\n }\n\n // Append to anchor for relative positioning\n anchorEl.appendChild(badge);\n\n // Position based on config\n switch (position) {\n case 'top-left':\n Object.assign(badge.style, { top: '-8px', left: '-8px' });\n break;\n case 'top-right':\n Object.assign(badge.style, { top: '-8px', right: '-8px' });\n break;\n case 'bottom-left':\n Object.assign(badge.style, { bottom: '-8px', left: '-8px' });\n break;\n case 'bottom-right':\n Object.assign(badge.style, { bottom: '-8px', right: '-8px' });\n break;\n }\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:badge',\n anchorId: action.anchorId,\n content: action.content,\n position,\n });\n\n return {\n cleanup: () => {\n badge.remove();\n if (originalPosition !== undefined) {\n anchorEl.style.position = originalPosition;\n }\n },\n updateFn: (changes) => {\n if ('content' in changes && typeof changes.content === 'string') {\n badge.textContent = changes.content;\n }\n },\n };\n};\n\n/**\n * Execute a tooltip action\n */\nexport const executeTooltip: ActionExecutor<TooltipAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const anchorEl = context.resolveAnchor(action.anchorId);\n if (!anchorEl) {\n throw new Error(`Anchor not found: ${action.anchorId}`);\n }\n\n // Build tooltip HTML\n const { content } = action;\n let html = '';\n if (content.title) {\n html += `<div class=\"syntro-tt-title\">${sanitizeHtml(content.title)}</div>`;\n }\n html += `<div class=\"syntro-tt-body\">${sanitizeHtml(content.body)}</div>`;\n\n // Add CTA buttons if provided (new multi-button support)\n if (content.ctaButtons && content.ctaButtons.length > 0) {\n html += `<div class=\"syntro-tt-actions\">`;\n for (const btn of content.ctaButtons) {\n const isPrimary = btn.primary ?? false;\n html += `\n <button\n class=\"syntro-tt-btn ${isPrimary ? 'syntro-tt-btn-primary' : ''}\"\n data-syntro-action=\"${sanitizeHtml(btn.actionId)}\"\n >\n ${sanitizeHtml(btn.label)}\n </button>\n `;\n }\n html += `</div>`;\n } else if (content.cta) {\n // Legacy single CTA support\n html += `<div class=\"syntro-tt-actions\">\n <button class=\"syntro-tt-btn syntro-tt-btn-primary\" data-syntro-action=\"cta\">\n ${sanitizeHtml(content.cta.label)}\n </button>\n </div>`;\n }\n\n const handle = showTooltip(anchorEl, context.overlayRoot, {\n html,\n placement: action.placement ?? 'top',\n trigger: action.trigger ?? 'immediate',\n onAction: (actionId) => {\n // Handle dismiss CTA \u2014 destroy the tooltip\n if (actionId === 'dismiss') {\n handle.destroy();\n return;\n }\n\n if (actionId === 'cta' && content.cta) {\n context.publishEvent('action.cta_clicked', {\n anchorId: action.anchorId,\n ctaLabel: content.cta.label,\n });\n } else if (content.ctaButtons) {\n const clickedBtn = content.ctaButtons.find((b) => b.actionId === actionId);\n if (clickedBtn) {\n context.publishEvent('action.tooltip_cta_clicked', {\n anchorId: action.anchorId,\n actionId,\n label: clickedBtn.label,\n });\n }\n }\n\n handle.destroy();\n },\n });\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'overlays:tooltip',\n anchorId: action.anchorId,\n trigger: action.trigger ?? 'immediate',\n });\n\n return {\n cleanup: () => {\n handle.destroy();\n },\n };\n};\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by this app.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executors = [\n { kind: 'overlays:highlight', executor: executeHighlight },\n { kind: 'overlays:pulse', executor: executePulse },\n { kind: 'overlays:badge', executor: executeBadge },\n { kind: 'overlays:tooltip', executor: executeTooltip },\n { kind: 'overlays:modal', executor: executeModal },\n] as const;\n\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-overlays',\n version: '1.0.0',\n name: 'Overlays',\n description: 'Tooltips, highlights, badges, modals, and visual overlays',\n executors,\n};\n", "/**\n * CDN Entry Point for Adaptive Overlays\n *\n * This module is bundled for CDN delivery and self-registers with the global\n * SynOS app registry when loaded dynamically via the AppLoader.\n */\n\nimport { editor } from './editor';\nimport { executors, runtime } from './runtime';\n\n/**\n * App manifest for registry registration.\n * Follows the AppManifest interface expected by AppLoader/AppRegistry.\n */\nexport const manifest = {\n id: runtime.id,\n version: runtime.version,\n name: runtime.name,\n description: runtime.description,\n runtime: {\n actions: executors.map(({ kind, executor }) => ({\n kind,\n executor,\n })),\n },\n editor,\n metadata: {\n isBuiltIn: true,\n },\n};\n\n/**\n * Self-register with global registry if available.\n * This happens when loaded via script tag (UMD).\n */\nif (typeof window !== 'undefined') {\n const registry = (window as any).SynOS?.appRegistry;\n if (registry && typeof registry.register === 'function') {\n registry.register(manifest);\n }\n}\n\nexport default manifest;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["cn", "classes", "_R", "_jsx", "type", "props", "key", "R", "p", "c", "jsx", "jsxs", "Fragment", "_R", "react_default", "_", "k", "useState", "useEffect", "useCallback", "_R", "useRef", "createElement", "_R", "forwardRef", "_R", "_r", "_R", "Fragment", "Suspense", "Children", "Component", "PureComponent", "_RD", "react_dom_default", "_", "k", "CSS_SELECTOR_TYPE", "libraryName", "showWarning", "id", "args", "DEFAULT_OPTIONS", "CSS_SELECTOR_TYPE", "isRegExp", "input", "wildcardToRegExp", "input", "createPatternMatcher", "list", "matchFunctions", "item", "isRegExp", "result", "showWarning", "re", "matchFunction", "INVALID_ID_RE", "INVALID_CLASS_RE", "SELECTOR_PATTERN", "CSS_SELECTOR_TYPE", "attributeBlacklistMatch", "createPatternMatcher", "ESCAPED_COLON", "toKebabCase", "string", "toCamelCase", "match", "p1", "p2", "toPascalCase", "camelCase", "mergeClasses", "classes", "className", "index", "array", "hasA11yProp", "props", "prop", "defaultAttributes", "Icon", "forwardRef", "color", "size", "strokeWidth", "absoluteStrokeWidth", "className", "children", "iconNode", "rest", "ref", "createElement", "defaultAttributes", "mergeClasses", "hasA11yProp", "tag", "attrs", "createLucideIcon", "iconName", "iconNode", "Component", "forwardRef", "className", "props", "ref", "createElement", "Icon", "mergeClasses", "toKebabCase", "toPascalCase", "__iconNode", "MessageSquare", "createLucideIcon", "__iconNode", "Route", "createLucideIcon", "__iconNode", "Sparkles", "createLucideIcon", "__iconNode", "Square", "createLucideIcon", "__iconNode", "Tag", "createLucideIcon", "__iconNode", "Zap", "createLucideIcon", "DetectionBadge", "found", "jsx", "cn", "DismissedSection", "count", "children", "isOpen", "setIsOpen", "useState", "jsxs", "e", "jsx", "EditorBody", "children", "jsx", "EditorCard", "children", "itemKey", "onClick", "onMouseEnter", "onMouseLeave", "className", "validated", "jsx", "cn", "EditorFooter", "onSave", "onPublish", "jsxs", "jsx", "EditorHeader", "title", "subtitle", "jsxs", "jsx", "EditorInput", "label", "className", "props", "jsxs", "jsx", "cn", "EditorLayout", "children", "jsx", "EditorTextarea", "label", "className", "value", "props", "ref", "useRef", "useEffect", "el", "jsxs", "jsx", "cn", "EmptyState", "message", "jsx", "GroupHeader", "label", "count", "className", "jsxs", "cn", "jsx", "describeSelector", "selector", "truncate", "testIdMatch", "text", "max", "truncateQuoted", "summarizeOverlayItem", "type", "item", "anchorId", "desc", "body", "content", "label", "tourId", "count", "itemKey", "section", "index", "OVERLAY_SECTIONS", "SECTION_ICON_MAP", "MessageSquare", "Sparkles", "Tag", "Zap", "Square", "Route", "SectionIcon", "className", "IconComponent", "jsx", "flattenItems", "config", "items", "item", "i", "rec", "summarizeOverlayItem", "tour", "filterConfig", "dismissedKeys", "result", "allSections", "filtered", "_", "getStepIcon", "step", "kind", "getStepLabel", "action", "anchor", "content", "useAnchorDetection", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "configRef", "useEffect", "runDetection", "map", "selectorToCheck", "el", "interval", "parseOverlayItemKey", "key", "indexStr", "OverlaysEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "expandedTour", "setExpandedTour", "editingKey", "setEditingKey", "_previewMode", "setPreviewMode", "mode", "allKeys", "empty", "initialConsumed", "allFlat", "targetIdx", "target", "allItems", "activeItems", "dismissedItems", "overlayItems", "tourItems", "totalItems", "_hoveredKey", "setHoveredKey", "foundCount", "handleDismiss", "useCallback", "prev", "next", "handleRestore", "handleCardClick", "handleBackToList", "_handleBeforeAfter", "handleFieldChange", "updater", "arr", "updated", "handlePublish", "handleCardHover", "handleCardLeave", "renderEditFields", "anchorId", "jsxs", "EditorInput", "e", "it", "EditorTextarea", "renderTourDrillIn", "tourIdx", "stepIdx", "renderCard", "detection", "EditorCard", "DetectionBadge", "EditorLayout", "EditorHeader", "EditorBody", "ref", "editItem", "Fragment", "EmptyState", "GroupHeader", "DismissedSection", "EditorFooter", "editorPanel", "base", "brand", "slateGrey", "green", "yellow", "red", "blue", "orange", "purple", "pink", "text", "slateGrey", "background", "border", "button", "base", "brand", "red", "green", "badge", "yellow", "purple", "blue", "orange", "pink", "badgeBanner", "alert", "tag", "menu", "inputDropdown", "inputField", "toggle", "checkbox", "avatar", "progressBarSlider", "card", "sidebar", "modal", "tab", "table", "breadcrumbs", "loadingIndicator", "datePicker", "scroll", "supportsPathClip", "showHighlight", "anchorEl", "overlayRoot", "opts", "padding", "radius", "opacity", "ringColor", "blue", "blocking", "onClickOutside", "onEsc", "rootStyles", "tokenScrim", "tokenRing", "scrim", "needsPointerEvents", "ring", "fallbackSlices", "i", "slice", "setClipPath", "path", "update", "rect", "x", "y", "w", "h", "vw", "vh", "r", "outer", "inner", "top", "right", "bottom", "left", "ro", "onScroll", "onResize", "onKey", "e", "handle", "onClick", "event", "ALLOWED_TAGS", "sanitizeHtml", "html", "frag", "div", "tpl", "root", "walker", "toRemove", "el", "tag", "attr", "name", "value", "isEvent", "isJsUrl", "executeModal", "action", "context", "content", "size", "blocking", "scrim", "dismiss", "ctaButtons", "scrimEl", "modal", "sizeMap", "base", "html", "sanitizeHtml", "btn", "isPrimary", "actionClicked", "actionBtns", "actionHandler", "e", "actionId", "handle", "onKey", "onScrimClick", "originalInert", "el", "timeoutId", "focusableEls", "sides", "min", "max", "round", "floor", "createCoords", "v", "oppositeSideMap", "oppositeAlignmentMap", "clamp", "start", "value", "end", "evaluate", "param", "getSide", "placement", "getAlignment", "getOppositeAxis", "axis", "getAxisLength", "yAxisSides", "getSideAxis", "getAlignmentAxis", "getAlignmentSides", "rects", "rtl", "alignment", "alignmentAxis", "length", "mainAlignmentSide", "getOppositePlacement", "getExpandedPlacements", "oppositePlacement", "getOppositeAlignmentPlacement", "lrPlacement", "rlPlacement", "tbPlacement", "btPlacement", "getSideList", "side", "isStart", "getOppositeAxisPlacements", "flipAlignment", "direction", "list", "expandPaddingObject", "padding", "getPaddingObject", "rectToClientRect", "rect", "x", "y", "width", "height", "computeCoordsFromPlacement", "_ref", "placement", "rtl", "reference", "floating", "sideAxis", "getSideAxis", "alignmentAxis", "getAlignmentAxis", "alignLength", "getAxisLength", "side", "getSide", "isVertical", "commonX", "commonY", "commonAlign", "coords", "getAlignment", "detectOverflow", "state", "options", "_await$platform$isEle", "x", "y", "platform", "rects", "elements", "strategy", "boundary", "rootBoundary", "elementContext", "altBoundary", "padding", "evaluate", "paddingObject", "getPaddingObject", "element", "clippingClientRect", "rectToClientRect", "rect", "offsetParent", "offsetScale", "elementClientRect", "computePosition", "config", "middleware", "validMiddleware", "statefulPlacement", "middlewareData", "resetCount", "i", "_platform$detectOverf", "name", "fn", "nextX", "nextY", "data", "reset", "arrow", "axis", "length", "arrowDimensions", "isYAxis", "minProp", "maxProp", "clientProp", "endDiff", "startDiff", "arrowOffsetParent", "clientSize", "centerToReference", "largestPossiblePadding", "minPadding", "min", "maxPadding", "min$1", "max", "center", "offset", "clamp", "shouldAddOffset", "alignmentOffset", "flip", "options", "state", "_middlewareData$arrow", "_middlewareData$flip", "placement", "middlewareData", "rects", "initialPlacement", "platform", "elements", "checkMainAxis", "checkCrossAxis", "specifiedFallbackPlacements", "fallbackStrategy", "fallbackAxisSideDirection", "flipAlignment", "detectOverflowOptions", "evaluate", "side", "getSide", "initialSideAxis", "getSideAxis", "isBasePlacement", "rtl", "fallbackPlacements", "getOppositePlacement", "getExpandedPlacements", "hasFallbackAxisSideDirection", "getOppositeAxisPlacements", "placements", "overflow", "overflows", "overflowsData", "sides", "getAlignmentSides", "_middlewareData$flip2", "_overflowsData$filter", "nextIndex", "nextPlacement", "d", "resetPlacement", "a", "b", "_overflowsData$filter2", "currentSideAxis", "acc", "getSideOffsets", "rect", "isAnySideFullyClipped", "hide", "strategy", "offsets", "originSides", "convertValueToCoords", "state", "options", "placement", "platform", "elements", "rtl", "side", "getSide", "alignment", "getAlignment", "isVertical", "getSideAxis", "mainAxisMulti", "crossAxisMulti", "rawValue", "evaluate", "mainAxis", "crossAxis", "alignmentAxis", "offset", "_middlewareData$offse", "_middlewareData$arrow", "x", "y", "middlewareData", "diffCoords", "shift", "checkMainAxis", "checkCrossAxis", "limiter", "_ref", "detectOverflowOptions", "coords", "overflow", "getOppositeAxis", "mainAxisCoord", "crossAxisCoord", "minSide", "maxSide", "min", "max", "clamp", "limitedCoords", "hasWindow", "getNodeName", "node", "isNode", "getWindow", "_node$ownerDocument", "getDocumentElement", "_ref", "value", "isElement", "isHTMLElement", "isShadowRoot", "invalidOverflowDisplayValues", "isOverflowElement", "element", "overflow", "overflowX", "overflowY", "display", "getComputedStyle", "tableElements", "isTableElement", "topLayerSelectors", "isTopLayer", "selector", "transformProperties", "willChangeValues", "containValues", "isContainingBlock", "elementOrCss", "webkit", "isWebKit", "css", "getContainingBlock", "currentNode", "getParentNode", "isLastTraversableNode", "lastTraversableNodeNames", "getNodeScroll", "result", "getNearestOverflowAncestor", "parentNode", "getOverflowAncestors", "list", "traverseIframes", "_node$ownerDocument2", "scrollableAncestor", "isBody", "win", "frameElement", "getFrameElement", "getCssDimensions", "element", "css", "getComputedStyle", "width", "height", "hasOffset", "isHTMLElement", "offsetWidth", "offsetHeight", "shouldFallback", "round", "unwrapElement", "isElement", "getScale", "domElement", "createCoords", "rect", "$", "x", "y", "noOffsets", "getVisualOffsets", "win", "getWindow", "isWebKit", "shouldAddVisualOffsets", "isFixed", "floatingOffsetParent", "getBoundingClientRect", "includeScale", "isFixedStrategy", "offsetParent", "clientRect", "scale", "visualOffsets", "offsetWin", "currentWin", "currentIFrame", "getFrameElement", "iframeScale", "iframeRect", "left", "top", "rectToClientRect", "getWindowScrollBarX", "leftScroll", "getNodeScroll", "getDocumentElement", "getHTMLOffset", "documentElement", "scroll", "htmlRect", "convertOffsetParentRelativeRectToViewportRelativeRect", "_ref", "elements", "strategy", "topLayer", "isTopLayer", "offsets", "isOffsetParentAnElement", "getNodeName", "isOverflowElement", "offsetRect", "htmlOffset", "getClientRects", "getDocumentRect", "html", "body", "max", "SCROLLBAR_MAX", "getViewportRect", "visualViewport", "visualViewportBased", "windowScrollbarX", "doc", "bodyStyles", "bodyMarginInline", "clippingStableScrollbarWidth", "absoluteOrFixed", "getInnerBoundingClientRect", "getClientRectFromClippingAncestor", "clippingAncestor", "hasFixedPositionAncestor", "stopNode", "parentNode", "getParentNode", "isLastTraversableNode", "getClippingElementAncestors", "cache", "cachedResult", "result", "getOverflowAncestors", "el", "currentContainingBlockComputedStyle", "elementIsFixed", "currentNode", "computedStyle", "currentNodeIsContaining", "isContainingBlock", "ancestor", "getClippingRect", "boundary", "rootBoundary", "clippingAncestors", "firstClippingAncestor", "clippingRect", "accRect", "min", "getDimensions", "getRectRelativeToOffsetParent", "setLeftRTLScrollbarOffset", "isStaticPositioned", "getTrueOffsetParent", "polyfill", "rawOffsetParent", "getOffsetParent", "svgOffsetParent", "isTableElement", "getContainingBlock", "getElementRects", "data", "getOffsetParentFn", "getDimensionsFn", "floatingDimensions", "isRTL", "platform", "rectsAreEqual", "a", "b", "observeMove", "onMove", "io", "timeoutId", "root", "cleanup", "_io", "refresh", "skip", "threshold", "elementRectForRootMargin", "insetTop", "floor", "insetRight", "insetBottom", "insetLeft", "options", "isFirstUpdate", "handleObserve", "entries", "ratio", "autoUpdate", "reference", "floating", "update", "ancestorScroll", "ancestorResize", "elementResize", "layoutShift", "animationFrame", "referenceEl", "ancestors", "cleanupIo", "reobserveFrame", "resizeObserver", "firstEntry", "_resizeObserver", "frameId", "prevRefRect", "frameLoop", "nextRefRect", "_resizeObserver2", "offset", "shift", "flip", "hide", "arrow", "computePosition", "reference", "floating", "options", "cache", "mergedOptions", "platform", "platformWithCache", "getAnchorReference", "anchorEl", "rect", "viewportWidth", "viewportHeight", "visibleLeft", "visibleTop", "visibleRight", "visibleBottom", "centerX", "centerY", "showTooltip", "overlayRoot", "opts", "div", "sanitizeHtml", "closeBtn", "handle", "actionBtns", "actionHandler", "e", "actionId", "btn", "arrowEl", "middleware", "offset", "flip", "shift", "hide", "arrow", "placement", "cleanup", "autoUpdate", "currentAnchorRef", "result", "computePosition", "x", "y", "strategy", "middlewareData", "finalPlacement", "arrowX", "arrowY", "side", "staticSide", "rotation", "onKey", "originalInert", "el", "focusableEls", "firstFocusable", "lastFocusable", "trapFocus", "removeTrigger", "enter", "leave", "toggle", "executeHighlight", "action", "context", "anchorEl", "handle", "showHighlight", "executePulse", "duration", "style", "originalAnimation", "timeoutId", "executeBadge", "badge", "position", "originalPosition", "changes", "executeTooltip", "content", "html", "sanitizeHtml", "btn", "isPrimary", "showTooltip", "actionId", "clickedBtn", "b", "executors", "executeModal", "runtime", "manifest", "runtime", "executors", "kind", "executor", "editor", "registry", "cdn_default"]
|
|
7
|
-
}
|