@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.
Files changed (45) hide show
  1. package/README.md +2 -1
  2. package/dist/actions/types.d.ts +7 -0
  3. package/dist/antiFlicker.d.ts +2 -0
  4. package/dist/apps/builtinRuntimeModules.generated.d.ts +20 -0
  5. package/dist/{chunk-MEBUEMEZ.js → chunk-V4MDQX67.js} +2868 -1417
  6. package/dist/chunk-V4MDQX67.js.map +7 -0
  7. package/dist/configFetcher.d.ts +3 -1
  8. package/dist/context/ContextManager.d.ts +4 -0
  9. package/dist/diagnostics/service-worker-check.d.ts +23 -0
  10. package/dist/editorLoader.d.ts +8 -2
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.js +1563 -12
  13. package/dist/index.js.map +4 -4
  14. package/dist/integrations/gtm-bridge.d.ts +36 -0
  15. package/dist/navigation/NavigationMonitor.d.ts +45 -0
  16. package/dist/overlays/runtime/utils/AnchorWatcher.d.ts +22 -0
  17. package/dist/overlays/types.d.ts +2 -0
  18. package/dist/react.js +1 -1
  19. package/dist/runtime.d.ts +3 -0
  20. package/dist/smart-canvas.esm.js +62 -36
  21. package/dist/smart-canvas.esm.js.map +4 -4
  22. package/dist/smart-canvas.js +15828 -23049
  23. package/dist/smart-canvas.js.map +4 -4
  24. package/dist/smart-canvas.min.js +62 -36
  25. package/dist/smart-canvas.min.js.map +4 -4
  26. package/dist/telemetry/adapters/posthog.d.ts +19 -0
  27. package/dist/telemetry/consent.d.ts +62 -0
  28. package/dist/version.d.ts +1 -1
  29. package/dist/widgets/WidgetRegistry.d.ts +10 -0
  30. package/package.json +13 -4
  31. package/schema/canvas-config.schema.json +124 -22
  32. package/scripts/syntroReactPlugin.mjs +113 -0
  33. package/dist/adaptives/adaptive-chatbot/index.js +0 -9
  34. package/dist/adaptives/adaptive-chatbot/index.js.map +0 -7
  35. package/dist/adaptives/adaptive-content/index.js +0 -22
  36. package/dist/adaptives/adaptive-content/index.js.map +0 -7
  37. package/dist/adaptives/adaptive-faq/index.js +0 -28
  38. package/dist/adaptives/adaptive-faq/index.js.map +0 -7
  39. package/dist/adaptives/adaptive-gamification/index.js +0 -2
  40. package/dist/adaptives/adaptive-gamification/index.js.map +0 -7
  41. package/dist/adaptives/adaptive-nav/index.js +0 -27
  42. package/dist/adaptives/adaptive-nav/index.js.map +0 -7
  43. package/dist/adaptives/adaptive-overlays/index.js +0 -94
  44. package/dist/adaptives/adaptive-overlays/index.js.map +0 -7
  45. 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/utilities-iselement.ts", "../../../../../node_modules/css-selector-generator/src/types.ts", "../../../../../node_modules/css-selector-generator/src/utilities-typescript.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/utilities-dom.ts", "../../../../../node_modules/css-selector-generator/src/constants.ts", "../../../../../node_modules/css-selector-generator/src/selector-attribute.ts", "../../../../../node_modules/css-selector-generator/src/selector-class.ts", "../../../../../node_modules/css-selector-generator/src/selector-id.ts", "../../../../../node_modules/css-selector-generator/src/selector-nth-child.ts", "../../../../../node_modules/css-selector-generator/src/selector-tag.ts", "../../../../../node_modules/css-selector-generator/src/selector-nth-of-type.ts", "../../../../../node_modules/css-selector-generator/src/utilities-powerset.ts", "../../../../../node_modules/css-selector-generator/src/utilities-cartesian.ts", "../../../../../node_modules/css-selector-generator/src/utilities-selectors.ts", "../../../../../node_modules/css-selector-generator/src/utilities-element-data.ts", "../../../../../node_modules/css-selector-generator/src/selector-fallback.ts", "../../../../../node_modules/css-selector-generator/src/index.ts", "../../../../shared-editor-ui/dist/utils/selectorGenerator.js", "../../../../shared-editor-ui/dist/components/AnchorPicker.js", "../../../../../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/file-code.ts", "../../../../../node_modules/lucide-react/src/icons/minus.ts", "../../../../../node_modules/lucide-react/src/icons/palette.ts", "../../../../../node_modules/lucide-react/src/icons/plus.ts", "../../../../../node_modules/lucide-react/src/icons/tag.ts", "../../../../../node_modules/lucide-react/src/icons/type.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/EditorSelect.js", "../../../../shared-editor-ui/dist/components/EditorTextarea.js", "../../../../shared-editor-ui/dist/components/EmptyState.js", "../../../../shared-editor-ui/dist/components/GroupHeader.js", "../../../../adaptives/adaptive-content/src/summarize.ts", "../../../../adaptives/adaptive-content/src/editor.tsx", "../../../../adaptives/adaptive-content/src/sanitizer.ts", "../../../../adaptives/adaptive-content/src/runtime.ts", "../../../../adaptives/adaptive-content/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 ", "/**\n * Guard function that checks if provided `input` is an Element.\n */\nexport function isElement(input: unknown): input is Element {\n return (\n typeof input === \"object\" &&\n input !== null &&\n (input as Element).nodeType === Node.ELEMENT_NODE\n );\n}\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", "/**\n * Checks whether value is one of the enum's values.\n */\nexport function isEnumValue<T extends Record<string, unknown>>(\n haystack: T,\n needle: unknown,\n): needle is T[keyof T] {\n return Object.values(haystack).includes(needle);\n}\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 { isElement } from \"./utilities-iselement.js\";\nimport { CssSelector } from \"./types.js\";\nimport { getIntersection } from \"./utilities-data.js\";\nimport { sanitizeRoot } from \"./utilities-options.js\";\n\n/**\n * Check whether element is matched uniquely by selector.\n */\nexport function testSelector(\n elements: Element[],\n selector: CssSelector,\n root?: Node,\n): boolean {\n const result = Array.from(\n sanitizeRoot(root, elements[0]).querySelectorAll(selector),\n );\n return (\n result.length === elements.length &&\n elements.every((element) => result.includes(element))\n );\n}\n\n/**\n * Test whether selector targets element. It does not have to be a unique match.\n */\nexport function testMultiSelector(\n element: Element,\n selector: CssSelector,\n root: ParentNode,\n): boolean {\n const result = Array.from(\n sanitizeRoot(root, element).querySelectorAll(selector),\n );\n return result.includes(element);\n}\n\n/**\n * Find all parents of a single element.\n */\nexport function getElementParents(\n element: Element,\n root?: ParentNode,\n): Element[] {\n root = root ?? getRootNode(element);\n const result = [];\n let parent: Element | null = element;\n while (isElement(parent) && parent !== root) {\n result.push(parent);\n parent = parent.parentElement;\n }\n return result;\n}\n\n/**\n * Find all common parents of elements.\n */\nexport function getParents(elements: Element[], root?: ParentNode): Element[] {\n return getIntersection(\n elements.map((element) => getElementParents(element, root)),\n );\n}\n\n/**\n * Returns root node for given element. This needs to be used because of document-less environments, e.g. jsdom.\n */\nexport function getRootNode(element: Element): ParentNode {\n // The `:root` selector always returns a parent node. The `null` return value is not applicable here.\n return element.ownerDocument.querySelector(\":root\") as ParentNode;\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 { sanitizeSelectorItem } from \"./utilities-selectors.js\";\nimport { INVALID_CLASS_RE } from \"./constants.js\";\nimport { CssSelectorGenerated } from \"./types.js\";\nimport { getIntersection } from \"./utilities-data.js\";\n\n/**\n * Get class selectors for an element.\n */\nexport function getElementClassSelectors(\n element: Element,\n): CssSelectorGenerated[] {\n return (element.getAttribute(\"class\") ?? \"\")\n .trim()\n .split(/\\s+/)\n .filter((item) => !INVALID_CLASS_RE.test(item))\n .map((item) => `.${sanitizeSelectorItem(item)}` as CssSelectorGenerated);\n}\n\n/**\n * Get class selectors matching all elements.\n */\nexport function getClassSelectors(elements: Element[]): CssSelectorGenerated[] {\n const elementSelectors = elements.map(getElementClassSelectors);\n return getIntersection(elementSelectors);\n}\n", "import { sanitizeSelectorItem } from \"./utilities-selectors.js\";\nimport { INVALID_ID_RE } from \"./constants.js\";\nimport { testSelector } from \"./utilities-dom.js\";\nimport { CssSelectorGenerated } from \"./types.js\";\n\n/**\n * Get ID selector for an element.\n * */\nexport function getElementIdSelectors(\n element: Element,\n): CssSelectorGenerated[] {\n const id = element.getAttribute(\"id\") ?? \"\";\n const selector = `#${sanitizeSelectorItem(id)}` as CssSelectorGenerated;\n const rootNode = element.getRootNode({ composed: false });\n return !INVALID_ID_RE.test(id) && testSelector([element], selector, rootNode)\n ? [selector]\n : [];\n}\n\n/**\n * Get ID selector for an element.\n */\nexport function getIdSelector(elements: Element[]): CssSelectorGenerated[] {\n return elements.length === 0 || elements.length > 1\n ? []\n : getElementIdSelectors(elements[0]);\n}\n", "import { CssSelectorGenerated } from \"./types.js\";\nimport { getIntersection } from \"./utilities-data.js\";\n\n/**\n * Get nth-child selector for an element.\n */\nexport function getElementNthChildSelector(\n element: Element,\n): CssSelectorGenerated[] {\n const siblings = element.parentElement?.children;\n if (siblings) {\n for (let i = 0; i < siblings.length; i++) {\n if (siblings[i] === element) {\n return [`:nth-child(${String(i + 1)})` as CssSelectorGenerated];\n }\n }\n }\n\n return [];\n}\n\n/**\n * Get nth-child selector matching all elements.\n */\nexport function getNthChildSelector(\n elements: Element[],\n): CssSelectorGenerated[] {\n return getIntersection(elements.map(getElementNthChildSelector));\n}\n", "import { sanitizeSelectorItem } from \"./utilities-selectors.js\";\nimport { CssSelector, CssSelectorGenerated } from \"./types.js\";\nimport { flattenArray } from \"./utilities-data.js\";\n\n/**\n * Get tag selector for an element.\n */\nexport function getElementTagSelectors(\n element: Element,\n): CssSelectorGenerated[] {\n return [\n sanitizeSelectorItem(element.tagName.toLowerCase()) as CssSelectorGenerated,\n ];\n}\n\n/**\n * Get tag selector for list of elements.\n */\nexport function getTagSelector(elements: Element[]): CssSelector[] {\n const selectors = [\n ...new Set(flattenArray(elements.map(getElementTagSelectors))),\n ];\n return selectors.length === 0 || selectors.length > 1 ? [] : [selectors[0]];\n}\n", "import { getTagSelector } from \"./selector-tag.js\";\nimport { CssSelectorGenerated } from \"./types.js\";\nimport { getIntersection } from \"./utilities-data.js\";\n\n/**\n * Get nth-of-type selector for an element.\n */\nexport function getElementNthOfTypeSelector(\n element: Element,\n): CssSelectorGenerated[] {\n const tag = getTagSelector([element])[0];\n const parentElement = element.parentElement;\n\n if (parentElement) {\n const siblings = Array.from(parentElement.children).filter(\n (element) => element.tagName.toLowerCase() === tag,\n );\n const elementIndex = siblings.indexOf(element);\n if (elementIndex > -1) {\n return [\n `${tag}:nth-of-type(${String(elementIndex + 1)})` as CssSelectorGenerated,\n ];\n }\n }\n\n return [];\n}\n\n/**\n * Get Nth-of-type selector matching all elements.\n */\nexport function getNthOfTypeSelector(\n elements: Element[],\n): CssSelectorGenerated[] {\n return getIntersection(elements.map(getElementNthOfTypeSelector));\n}\n", "interface powerSetGeneratorOptions {\n maxResults?: number;\n}\n\nexport function* powerSetGenerator<T>(\n input: T[] = [],\n { maxResults = Number.POSITIVE_INFINITY }: powerSetGeneratorOptions = {},\n): IterableIterator<T[]> {\n let resultCounter = 0;\n let offsets = generateOffsets(1);\n\n while (offsets.length <= input.length && resultCounter < maxResults) {\n resultCounter += 1;\n const result = offsets.map((offset) => input[offset]);\n yield result;\n offsets = bumpOffsets(offsets, input.length - 1);\n }\n}\n\n/**\n * Generates power set of input items.\n */\nexport function getPowerSet<T>(\n input: T[] = [],\n { maxResults = Number.POSITIVE_INFINITY }: powerSetGeneratorOptions = {},\n): T[][] {\n return Array.from(powerSetGenerator(input, { maxResults }));\n}\n\n/**\n * Helper function used by `getPowerSet`. Updates internal pointers.\n */\nfunction bumpOffsets(offsets: number[] = [], maxValue = 0): number[] {\n const size = offsets.length;\n if (size === 0) {\n return [];\n }\n const result = [...offsets];\n result[size - 1] += 1;\n for (let index = size - 1; index >= 0; index--) {\n if (result[index] > maxValue) {\n if (index === 0) {\n return generateOffsets(size + 1);\n } else {\n result[index - 1]++;\n result[index] = result[index - 1] + 1;\n }\n }\n }\n\n if (result[size - 1] > maxValue) {\n return generateOffsets(size + 1);\n }\n\n return result;\n}\n\n/**\n * Generates array of size N, filled with numbers sequence starting from 0.\n */\nfunction generateOffsets(size = 1): number[] {\n return Array.from(Array(size).keys());\n}\n", "/**\n * Generates cartesian product out of input object.\n */\nexport function* cartesianProductGenerator<T>(\n input: Record<string, T[]> = {},\n): Generator<Record<string, T>> {\n const entries = Object.entries(input);\n if (entries.length === 0) return;\n\n // Use iterative stack-based approach to yield results one at a time\n // This avoids recursion overhead while maintaining lazy evaluation\n const stack: { index: number; partial: Record<string, T> }[] = [\n { index: entries.length - 1, partial: {} },\n ];\n\n while (stack.length > 0) {\n const item = stack.pop();\n if (!item) break;\n const { index, partial } = item;\n\n if (index < 0) {\n yield partial;\n continue;\n }\n\n const [key, values] = entries[index];\n // Push in reverse order so we process in correct order\n for (let i = values.length - 1; i >= 0; i--) {\n stack.push({\n index: index - 1,\n partial: { ...partial, [key]: values[i] },\n });\n }\n }\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 {\n CSS_SELECTOR_TYPE,\n CssSelectorGenerated,\n CssSelectorTypes,\n ElementData,\n ElementSelectorData,\n OPERATOR,\n OperatorValue,\n} from \"./types.js\";\nimport { SELECTOR_PATTERN } from \"./constants.js\";\nimport { getElementSelectorsByType } from \"./utilities-selectors.js\";\n\n/**\n * Creates data describing a specific selector.\n */\nexport function createElementSelectorData(\n selector: CssSelectorGenerated,\n): ElementSelectorData {\n return {\n value: selector,\n include: false,\n };\n}\n\n/**\n * Creates data describing an element within CssSelector chain.\n */\nexport function createElementData(\n element: Element,\n selectorTypes: CssSelectorTypes,\n operator: OperatorValue = OPERATOR.NONE,\n): ElementData {\n const selectors = {};\n selectorTypes.forEach((selectorType) => {\n Reflect.set(\n selectors,\n selectorType,\n getElementSelectorsByType(element, selectorType).map(\n createElementSelectorData,\n ),\n );\n });\n return {\n element,\n operator,\n selectors,\n };\n}\n\n/**\n * Constructs selector from element data.\n */\nexport function constructElementSelector({\n selectors,\n operator,\n}: ElementData): CssSelectorGenerated {\n let pattern = [...SELECTOR_PATTERN];\n // `nthoftype` already contains tag\n if (\n selectors[CSS_SELECTOR_TYPE.tag] &&\n selectors[CSS_SELECTOR_TYPE.nthoftype]\n ) {\n pattern = pattern.filter((item) => item !== CSS_SELECTOR_TYPE.tag);\n }\n\n let selector = \"\";\n pattern.forEach((selectorType) => {\n const selectorsOfType = selectors[selectorType] ?? [];\n selectorsOfType.forEach(({ value, include }) => {\n if (include) {\n selector += value;\n }\n });\n });\n\n return (operator + selector) as CssSelectorGenerated;\n}\n", "import { getElementParents } from \"./utilities-dom.js\";\nimport { SELECTOR_SEPARATOR } from \"./constants.js\";\nimport { CSS_SELECTOR_TYPE, CssSelector, OPERATOR } from \"./types.js\";\nimport {\n constructElementSelector,\n createElementData,\n} from \"./utilities-element-data.js\";\n\n/**\n * Creates fallback selector for single element.\n */\nexport function getElementFallbackSelector(\n element: Element,\n root?: ParentNode,\n): CssSelector {\n const parentElements = getElementParents(element, root).reverse();\n const elementsData = parentElements.map((element) => {\n const elementData = createElementData(\n element,\n [CSS_SELECTOR_TYPE.nthchild],\n OPERATOR.CHILD,\n );\n (elementData.selectors.nthchild ?? []).forEach((selectorData) => {\n selectorData.include = true;\n });\n return elementData;\n });\n\n return [\n root ? \":scope\" : \":root\",\n ...elementsData.map(constructElementSelector),\n ].join(\"\");\n}\n\n/**\n * Creates chain of :nth-child selectors from root to the elements.\n */\nexport function getFallbackSelector(\n elements: Element[],\n root?: ParentNode,\n): CssSelector {\n return elements\n .map((element) => getElementFallbackSelector(element, root))\n .join(SELECTOR_SEPARATOR);\n}\n", "import { getFallbackSelector } from \"./selector-fallback.js\";\nimport { sanitizeOptions } from \"./utilities-options.js\";\nimport {\n sanitizeSelectorNeedle,\n selectorGenerator,\n} from \"./utilities-selectors.js\";\nimport { CssSelector, CssSelectorGeneratorOptionsInput } from \"./types.js\";\nimport { getRootNode } from \"./utilities-dom.js\";\nimport { SELECTOR_SEPARATOR } from \"./constants.js\";\n\n/**\n * Generates unique CSS selector for an element.\n */\nexport function getCssSelector(\n needle: Element | Element[],\n custom_options: Omit<CssSelectorGeneratorOptionsInput, \"maxResults\"> = {},\n): CssSelector {\n const options = { ...custom_options, maxResults: 1 };\n const generator = cssSelectorGenerator(needle, options);\n const firstResult = generator.next();\n return firstResult.value as CssSelector;\n}\n\n/**\n * Generates unique CSS selector for an element.\n */\nexport function* cssSelectorGenerator(\n needle: Element | Element[],\n custom_options: CssSelectorGeneratorOptionsInput = {},\n): IterableIterator<CssSelector> {\n const elements = sanitizeSelectorNeedle(needle as unknown);\n const options = sanitizeOptions(elements[0], custom_options);\n const root = options.root ?? getRootNode(elements[0]);\n let foundResults = 0;\n\n for (const selector of selectorGenerator({\n elements,\n options,\n root,\n rootSelector: \"\",\n })) {\n yield selector;\n foundResults++;\n if (foundResults >= options.maxResults) {\n return;\n }\n }\n\n // if failed to find single selector matching all elements, try to find\n // selector for each standalone element and join them together\n if (elements.length > 1) {\n yield elements\n .map((element) => getCssSelector(element, options))\n .join(SELECTOR_SEPARATOR);\n foundResults++;\n if (foundResults >= options.maxResults) {\n return;\n }\n }\n\n yield getFallbackSelector(elements, options.useScope ? root : undefined);\n}\n\nexport default getCssSelector;\n", "import { getCssSelector } from 'css-selector-generator';\nconst DEFAULT_OPTIONS = {\n includeTag: true,\n preferTestIds: true,\n maxCombinations: 100,\n};\n/**\n * Generates a CSS selector for a given DOM element.\n * Uses css-selector-generator with settings optimized for:\n * - Stability (prefers IDs, data-testid, stable classes)\n * - Readability (includes tag names)\n * - Uniqueness (generates unique selectors)\n */\nexport function generateSelector(element, options = {}) {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n // Build selector types in priority order\n const selectors = [];\n // Always prioritize ID if available\n selectors.push('id');\n // Include data-testid and other stable attributes\n if (opts.preferTestIds) {\n selectors.push('attribute');\n }\n // Then class names (filtered to exclude dynamic ones)\n selectors.push('class');\n // Tag names for context\n selectors.push('tag');\n // Fallbacks for uniqueness\n selectors.push('nthchild');\n selectors.push('nthoftype');\n try {\n const selector = getCssSelector(element, {\n selectors,\n includeTag: opts.includeTag,\n maxCombinations: opts.maxCombinations,\n // Blacklist common dynamic class patterns\n blacklist: [\n // Dynamic class patterns\n /^[a-z]+-[a-f0-9]{5,}$/i, // hash-based classes like \"css-1abc23\"\n /^_[a-zA-Z0-9]+$/, // CSS module classes like \"_1abc23\"\n /^svelte-[a-z0-9]+$/i, // Svelte scoped classes\n /^vue-[a-z0-9]+$/i, // Vue scoped classes\n /^emotion-[0-9]+$/, // Emotion CSS-in-JS\n /^sc-[a-zA-Z]+$/, // styled-components\n // State classes that may change\n /^(is-|has-|js-)/,\n /^(active|selected|focused|disabled|hidden|visible)$/,\n // Animation/transition classes\n /^(fade|slide|animate)/,\n /-(enter|leave|active)(-active|-done)?$/,\n ],\n // Whitelist stable attribute selectors\n whitelist: [\n /^data-testid$/,\n /^data-cy$/,\n /^data-test$/,\n /^data-qa$/,\n /^aria-label$/,\n /^role$/,\n /^name$/,\n /^type$/,\n /^href$/,\n ],\n });\n return selector;\n }\n catch (error) {\n console.warn('[SelectorGenerator] Failed to generate selector:', error);\n // Fallback: try simpler approach\n return generateFallbackSelector(element);\n }\n}\n/**\n * Fallback selector generation when the library fails.\n * Creates a path-based selector from the element to the body.\n */\nfunction generateFallbackSelector(element) {\n const path = [];\n let current = element;\n while (current && current !== document.body && current !== document.documentElement) {\n let selector = current.tagName.toLowerCase();\n // Add ID if present\n if (current.id) {\n selector = `#${CSS.escape(current.id)}`;\n path.unshift(selector);\n break; // ID is unique enough\n }\n // Add nth-child for specificity\n const parent = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children);\n const index = siblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n path.unshift(selector);\n current = parent;\n }\n return path.join(' > ');\n}\n/**\n * Validates that a selector correctly targets the expected element.\n */\nexport function validateSelector(selector, expectedElement) {\n try {\n const matched = document.querySelector(selector);\n return matched === expectedElement;\n }\n catch {\n return false;\n }\n}\n/**\n * Gets a human-readable description of an element for UI display.\n */\nexport function getElementDescription(element) {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes = element.className && typeof element.className === 'string'\n ? `.${element.className\n .split(' ')\n .filter((c) => c && !isDynamicClass(c))\n .slice(0, 2)\n .join('.')}`\n : '';\n // Get text content preview\n const text = element.textContent?.trim().slice(0, 30) || '';\n const textPreview = text ? ` \"${text}${text.length >= 30 ? '...' : ''}\"` : '';\n return `${tag}${id}${classes}${textPreview}`.trim();\n}\n/**\n * Checks if a class name appears to be dynamically generated.\n */\nfunction isDynamicClass(className) {\n const dynamicPatterns = [\n /^[a-z]+-[a-f0-9]{5,}$/i,\n /^_[a-zA-Z0-9]+$/,\n /^svelte-[a-z0-9]+$/i,\n /^vue-[a-z0-9]+$/i,\n /^emotion-[0-9]+$/,\n /^sc-[a-zA-Z]+$/,\n ];\n return dynamicPatterns.some((pattern) => pattern.test(className));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\n/**\n * AnchorPicker \u2014 Shared Element Picker Overlay\n *\n * Full-page overlay that lets the user hover and click to select a DOM element.\n * Returns the element, its CSS selector, and a human-readable description.\n *\n * Renders via createPortal to document.body. Uses inline styles (not Tailwind)\n * because it lives outside the editor's style scope.\n *\n * EXCEPTION: This component MUST stay on document.body (not in shadow root).\n * It uses document.elementFromPoint() to detect host page elements under the\n * cursor. If placed inside a shadow root, the overlay would block detection\n * of underlying host elements.\n *\n * Instructions / cancel UI should be rendered by the consumer in their own\n * panel \u2014 this component only provides the page overlay.\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { generateSelector, getElementDescription, validateSelector, } from '../utils/selectorGenerator';\nconst HIGHLIGHT_COLOR = '#3b82f6';\nconst HIGHLIGHT_BG = 'rgba(59, 130, 246, 0.1)';\nexport function AnchorPicker({ isActive, onPick, onCancel, excludeSelector = '[data-syntro-editor-panel], [data-shadow-canvas-id], .syntro-tooltip, .syntro-modal, .syntro-highlight, [data-syntro-anchor-picker]', }) {\n const [hoveredElement, setHoveredElement] = useState(null);\n const [hoveredSelector, setHoveredSelector] = useState('');\n const overlayRef = useRef(null);\n const handleMouseMove = useCallback((e) => {\n const overlay = overlayRef.current;\n if (overlay) {\n overlay.style.pointerEvents = 'none';\n }\n const elementAtPoint = document.elementFromPoint(e.clientX, e.clientY);\n if (overlay) {\n overlay.style.pointerEvents = 'auto';\n }\n if (!elementAtPoint) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n if (excludeSelector && elementAtPoint.closest(excludeSelector)) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n if (['HTML', 'BODY', 'HEAD'].includes(elementAtPoint.tagName)) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n setHoveredElement(elementAtPoint);\n const selector = generateSelector(elementAtPoint);\n setHoveredSelector(selector);\n }, [excludeSelector]);\n const handleClick = useCallback((e) => {\n e.preventDefault();\n e.stopPropagation();\n if (hoveredElement && hoveredSelector) {\n if (validateSelector(hoveredSelector, hoveredElement)) {\n onPick({\n element: hoveredElement,\n selector: hoveredSelector,\n description: getElementDescription(hoveredElement),\n });\n }\n else {\n const newSelector = generateSelector(hoveredElement);\n onPick({\n element: hoveredElement,\n selector: newSelector,\n description: getElementDescription(hoveredElement),\n });\n }\n }\n }, [hoveredElement, hoveredSelector, onPick]);\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }, [onCancel]);\n useEffect(() => {\n if (!isActive)\n return;\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n }, [isActive, handleMouseMove, handleClick, handleKeyDown]);\n if (!isActive)\n return null;\n const rect = hoveredElement?.getBoundingClientRect();\n return createPortal(_jsxs(\"div\", { ref: overlayRef, \"data-syntro-anchor-picker\": true, style: {\n position: 'fixed',\n inset: 0,\n cursor: 'crosshair',\n zIndex: 2147483647,\n }, children: [_jsx(\"div\", { style: {\n position: 'absolute',\n inset: 0,\n background: 'rgba(0, 0, 0, 0.05)',\n pointerEvents: 'none',\n } }), hoveredElement && rect && (_jsx(\"div\", { style: {\n position: 'fixed',\n left: rect.left - 2,\n top: rect.top - 2,\n width: rect.width + 4,\n height: rect.height + 4,\n border: `2px solid ${HIGHLIGHT_COLOR}`,\n backgroundColor: HIGHLIGHT_BG,\n borderRadius: '4px',\n boxShadow: '0 0 0 9999px rgba(0, 0, 0, 0.15)',\n pointerEvents: 'none',\n transition: 'all 0.1s ease-out',\n } })), hoveredElement && rect && (_jsxs(\"div\", { style: {\n position: 'fixed',\n left: Math.max(8, Math.min(rect.left, window.innerWidth - 320)),\n top: Math.max(8, rect.top - 68),\n backgroundColor: '#1e293b',\n color: '#e2e8f0',\n padding: '8px 12px',\n borderRadius: '6px',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n zIndex: 1,\n fontFamily: 'monospace',\n fontSize: '12px',\n maxWidth: '300px',\n pointerEvents: 'none',\n }, children: [_jsx(\"div\", { style: {\n fontSize: '11px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: '4px',\n color: '#94a3b8',\n }, children: \"Click to select\" }), _jsx(\"div\", { style: {\n color: '#38bdf8',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }, children: hoveredSelector }), _jsx(\"div\", { style: {\n marginTop: '4px',\n color: '#cbd5e1',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }, children: getElementDescription(hoveredElement) })] }))] }), document.body);\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 ['path', { d: 'M10 12.5 8 15l2 2.5', key: '1tg20x' }],\n ['path', { d: 'm14 12.5 2 2.5-2 2.5', key: 'yinavb' }],\n ['path', { d: 'M14 2v4a2 2 0 0 0 2 2h4', key: 'tnqrlb' }],\n ['path', { d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z', key: '1mlx9k' }],\n];\n\n/**\n * @component @name FileCode\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTIuNSA4IDE1bDIgMi41IiAvPgogIDxwYXRoIGQ9Im0xNCAxMi41IDIgMi41LTIgMi41IiAvPgogIDxwYXRoIGQ9Ik0xNCAydjRhMiAyIDAgMCAwIDIgMmg0IiAvPgogIDxwYXRoIGQ9Ik0xNSAySDZhMiAyIDAgMCAwLTIgMnYxNmEyIDIgMCAwIDAgMiAyaDEyYTIgMiAwIDAgMCAyLTJWN3oiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-code\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 FileCode = createLucideIcon('file-code', __iconNode);\n\nexport default FileCode;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M5 12h14', key: '1ays0h' }]];\n\n/**\n * @component @name Minus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/minus\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 Minus = createLucideIcon('minus', __iconNode);\n\nexport default Minus;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z',\n key: 'e79jfc',\n },\n ],\n ['circle', { cx: '13.5', cy: '6.5', r: '.5', fill: 'currentColor', key: '1okk4w' }],\n ['circle', { cx: '17.5', cy: '10.5', r: '.5', fill: 'currentColor', key: 'f64h9f' }],\n ['circle', { cx: '6.5', cy: '12.5', r: '.5', fill: 'currentColor', key: 'qy21gx' }],\n ['circle', { cx: '8.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'fotxhn' }],\n];\n\n/**\n * @component @name Palette\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMjJhMSAxIDAgMCAxIDAtMjAgMTAgOSAwIDAgMSAxMCA5IDUgNSAwIDAgMS01IDVoLTIuMjVhMS43NSAxLjc1IDAgMCAwLTEuNCAyLjhsLjMuNGExLjc1IDEuNzUgMCAwIDEtMS40IDIuOHoiIC8+CiAgPGNpcmNsZSBjeD0iMTMuNSIgY3k9IjYuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSIxNy41IiBjeT0iMTAuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSI2LjUiIGN5PSIxMi41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxjaXJjbGUgY3g9IjguNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/palette\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 Palette = createLucideIcon('palette', __iconNode);\n\nexport default Palette;\n", "import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n];\n\n/**\n * @component @name Plus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\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 Plus = createLucideIcon('plus', __iconNode);\n\nexport default Plus;\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 ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIuNTg2IDIuNTg2QTIgMiAwIDAgMCAxMS4xNzIgMkg0YTIgMiAwIDAgMC0yIDJ2Ny4xNzJhMiAyIDAgMCAwIC41ODYgMS40MTRsOC43MDQgOC43MDRhMi40MjYgMi40MjYgMCAwIDAgMy40MiAwbDYuNTgtNi41OGEyLjQyNiAyLjQyNiAwIDAgMCAwLTMuNDJ6IiAvPgogIDxjaXJjbGUgY3g9IjcuNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KPC9zdmc+Cg==) - 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 ['path', { d: 'M12 4v16', key: '1654pz' }],\n ['path', { d: 'M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2', key: 'e0r10z' }],\n ['path', { d: 'M9 20h6', key: 's66wpe' }],\n];\n\n/**\n * @component @name Type\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNHYxNiIgLz4KICA8cGF0aCBkPSJNNCA3VjVhMSAxIDAgMCAxIDEtMWgxNGExIDEgMCAwIDEgMSAxdjIiIC8+CiAgPHBhdGggZD0iTTkgMjBoNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/type\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 Type = createLucideIcon('type', __iconNode);\n\nexport default Type;\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 { cn } from '../cn';\nexport function EditorSelect({ label, className, children, ...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(\"select\", { ...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-mb-2', '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), 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 content config changes.\n *\n * Pure functions \u2014 no DOM access, just string formatting from config data.\n */\n\nimport type { ContentConfig } 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 # and common prefixes\n if (selector.startsWith('#')) {\n let name = selector.slice(1);\n const prefixes = ['hero-', 'main-', 'page-', 'app-', 'section-'];\n for (const prefix of prefixes) {\n if (name.startsWith(prefix)) {\n name = name.slice(prefix.length);\n break;\n }\n }\n return truncate(name, 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 // Class selector or complex selector: keep as-is\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 a content config change.\n */\nexport function summarizeContentChange(\n type: keyof ContentConfig,\n item: Record<string, unknown>\n): string {\n const desc = describeSelector((item.anchorId as string) || '');\n\n switch (type) {\n case 'textReplacements': {\n const text = (item.text as string) || '';\n return `Change ${desc} to ${truncateQuoted(text, MAX_TEXT_LEN)}`;\n }\n case 'attributeChanges': {\n const attr = (item.attr as string) || '';\n const value = (item.value as string) || '';\n return `Set ${desc} ${attr} to ${truncateQuoted(value, MAX_TEXT_LEN)}`;\n }\n case 'styleChanges': {\n const styles = (item.styles as Record<string, string>) || {};\n const count = Object.keys(styles).length;\n return `Restyle ${desc} (${count} ${count === 1 ? 'property' : 'properties'})`;\n }\n case 'htmlInsertions': {\n const position = (item.position as string) || 'append';\n return `Insert HTML ${position} ${desc}`;\n }\n case 'classAdditions': {\n const className = (item.className as string) || '';\n return `Add class \"${className}\" to ${desc}`;\n }\n case 'classRemovals': {\n const className = (item.className as string) || '';\n return `Remove class \"${className}\" from ${desc}`;\n }\n default:\n return `Unknown change on ${desc}`;\n }\n}\n", "/**\n * Adaptive Content - Editor Component\n *\n * Review & tweak editor for AI-generated content modifications.\n * Displays a scannable list of one-liner change summaries.\n * Clicking a card navigates to the element and shows a floating edit panel.\n */\n\nimport {\n DetectionBadge,\n DismissedSection,\n EditorBody,\n EditorCard,\n EditorFooter,\n EditorHeader,\n EditorInput,\n EditorLayout,\n EditorSelect,\n EditorTextarea,\n EmptyState,\n GroupHeader,\n} from '@syntrologie/shared-editor-ui';\nimport { FileCode, Minus, Palette, Plus, Tag, Type } from 'lucide-react';\nimport type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { AnchorPicker, type PickedElement } from './components/AnchorPicker';\nimport type { ContentConfig } from './schema';\nimport { summarizeContentChange } from './summarize';\nimport type { EditorPanelProps } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype SectionKey = keyof ContentConfig;\n\ninterface ItemRef {\n section: SectionKey;\n index: number;\n}\n\nfunction itemKey(section: SectionKey, index: number): string {\n return `${section}:${index}`;\n}\n\nfunction parseItemKey(key: string): ItemRef {\n const [section, indexStr] = key.split(':');\n return { section: section as SectionKey, index: Number(indexStr) };\n}\n\n// ============================================================================\n// Section Config\n// ============================================================================\n\nconst SECTION_ICON_MAP: Record<\n SectionKey,\n React.ComponentType<{ size?: number; className?: string }>\n> = {\n textReplacements: Type,\n attributeChanges: Tag,\n styleChanges: Palette,\n htmlInsertions: FileCode,\n classAdditions: Plus,\n classRemovals: Minus,\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\n/** Build a flat list of all items across all section types. */\nfunction flattenItems(config: ContentConfig): Array<{\n key: string;\n section: SectionKey;\n index: number;\n summary: string;\n anchorId: string;\n}> {\n const items: Array<{\n key: string;\n section: SectionKey;\n index: number;\n summary: string;\n anchorId: string;\n }> = [];\n const sections = Object.keys(SECTION_ICON_MAP) as SectionKey[];\n for (const section of 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: summarizeContentChange(section, rec),\n anchorId: (rec.anchorId as string) || '',\n });\n });\n }\n return items;\n}\n\n/** Remove items by key set from a config, returning a new config. */\nfunction filterConfig(config: ContentConfig, dismissedKeys: Set<string>): ContentConfig {\n const result = { ...config };\n const sections = Object.keys(SECTION_ICON_MAP) as SectionKey[];\n for (const section of sections) {\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\n// ============================================================================\n// Detection\n// ============================================================================\n\ninterface DetectionEntry {\n found: boolean;\n element: HTMLElement | null;\n}\n\nfunction useAnchorDetection(\n items: Array<{ key: string; anchorId: string }>\n): Map<string, DetectionEntry> {\n const [detectionMap, setDetectionMap] = useState<Map<string, DetectionEntry>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n useEffect(() => {\n const runDetection = () => {\n const map = new Map<string, DetectionEntry>();\n for (const item of itemsRef.current) {\n if (!item.anchorId) {\n map.set(item.key, { found: false, element: null });\n continue;\n }\n try {\n const el = document.querySelector(item.anchorId) 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// ContentEditor Component\n// ============================================================================\n\nexport function ContentEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as ContentConfig;\n const [dismissedKeys, setDismissedKeys] = useState<Set<string>>(\n () => editor.getDismissedKeys?.() ?? new Set()\n );\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 // Create mode state\n const [createMode, setCreateMode] = useState<null | 'picking' | 'form'>(null);\n const [createAnchorId, setCreateAnchorId] = useState('');\n const [createText, setCreateText] = useState('');\n const [createDescription, setCreateDescription] = useState('');\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 content 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 setEditingKey(target.key);\n if (target.anchorId) {\n editor.highlightElement(target.anchorId);\n }\n }\n editor.clearInitialState?.();\n } else if (editor.initialCreate && !initialConsumed.current) {\n initialConsumed.current = true;\n setCreateMode('form');\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 const totalChanges = activeItems.length;\n const [_hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n const detectionMap = useAnchorDetection(allItems);\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 (editingKey === key) setEditingKey(null);\n },\n [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: { key: string; anchorId: string }) => {\n if (item.anchorId) {\n editor.highlightElement(item.anchorId);\n }\n setEditingKey(item.key);\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 (section: SectionKey, index: number, field: string, value: unknown) => {\n const arr = ((typedConfig[section] as unknown[]) || []).slice();\n const item = { ...(arr[index] as Record<string, unknown>) };\n item[field] = value;\n arr[index] = 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 // Filter dismissed items before publishing\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: { key: string; anchorId: string }) => {\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 // ---- Create flow handlers ----\n\n const handleStartCreate = useCallback(() => {\n setEditingKey(null);\n editor.clearHighlight();\n setCreateAnchorId('');\n setCreateText('');\n setCreateDescription('');\n setCreateMode('form');\n }, [editor]);\n\n const handleElementPicked = useCallback(\n (picked: PickedElement) => {\n setCreateAnchorId(picked.selector);\n setCreateDescription(picked.description);\n // Pre-fill with the element's current text content\n const text = picked.element.textContent?.trim() || '';\n setCreateText(text);\n setCreateMode('form');\n editor.highlightElement(picked.selector);\n },\n [editor]\n );\n\n const handleCancelCreate = useCallback(() => {\n setCreateMode(null);\n setCreateAnchorId('');\n setCreateText('');\n setCreateDescription('');\n editor.clearHighlight();\n }, [editor]);\n\n const handleSaveCreate = useCallback(() => {\n if (!createAnchorId) return;\n\n // Add a new textReplacement to the config\n const existing = (typedConfig.textReplacements as unknown[] | undefined) || [];\n const newItem = {\n anchorId: createAnchorId,\n text: createText,\n summary: `Set text on ${createAnchorId}`,\n };\n const updated = {\n ...typedConfig,\n textReplacements: [...existing, newItem],\n };\n onChange(updated as unknown as Record<string, unknown>);\n editor.setDirty(true);\n\n // Return to list\n setCreateMode(null);\n setCreateAnchorId('');\n setCreateText('');\n setCreateDescription('');\n editor.clearHighlight();\n }, [createAnchorId, createText, typedConfig, onChange, editor]);\n\n // ---- Edit form renderers per section type ----\n\n const renderEditFields = (section: SectionKey, 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 'textReplacements':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-sm se-font-mono se-text-text-secondary se-py-1 se-px-2 se-bg-slate-grey-3 se-rounded-lg se-mb-3\">\n {anchorId}\n </div>\n <EditorTextarea\n label=\"Text\"\n value={(item.text as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n handleFieldChange(section, index, 'text', e.target.value)\n }\n />\n </div>\n );\n\n case 'attributeChanges':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-sm se-font-mono se-text-text-secondary se-py-1 se-px-2 se-bg-slate-grey-3 se-rounded-lg se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Attribute\"\n value={(item.attr as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, 'attr', e.target.value)\n }\n />\n <EditorInput\n label=\"Value\"\n value={(item.value as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, 'value', e.target.value)\n }\n />\n </div>\n );\n\n case 'styleChanges': {\n const styleObj = (item.styles as Record<string, string>) || {};\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-sm se-font-mono se-text-text-secondary se-py-1 se-px-2 se-bg-slate-grey-3 se-rounded-lg se-mb-3\">\n {anchorId}\n </div>\n {/* biome-ignore lint/a11y/noLabelWithoutControl: Style section header label, not associated with single input */}\n <label className=\"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block\">\n Styles\n </label>\n {Object.entries(styleObj).map(([prop, val]) => (\n <div key={prop} className=\"se-flex se-gap-1 se-mb-1\">\n <input\n className=\"se-flex-1 se-py-1.5 se-px-2 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-box-border\"\n value={prop}\n readOnly\n />\n <input\n className=\"se-flex-1 se-py-1.5 se-px-2 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-box-border\"\n value={val}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n const newStyles = { ...styleObj, [prop]: e.target.value };\n handleFieldChange(section, index, 'styles', newStyles);\n }}\n />\n </div>\n ))}\n </div>\n );\n }\n\n case 'htmlInsertions':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-sm se-font-mono se-text-text-secondary se-py-1 se-px-2 se-bg-slate-grey-3 se-rounded-lg se-mb-3\">\n {anchorId}\n </div>\n <EditorSelect\n label=\"Position\"\n value={(item.position as string) || 'after'}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>\n handleFieldChange(section, index, 'position', e.target.value)\n }\n >\n <option value=\"before\">Before</option>\n <option value=\"after\">After</option>\n <option value=\"prepend\">Prepend</option>\n <option value=\"append\">Append</option>\n <option value=\"replace\">Replace</option>\n </EditorSelect>\n <EditorTextarea\n label=\"HTML\"\n value={(item.html as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n handleFieldChange(section, index, 'html', e.target.value)\n }\n className=\"se-font-mono\"\n />\n </div>\n );\n\n case 'classAdditions':\n case 'classRemovals':\n return (\n <div className=\"se-py-1\">\n <div className=\"se-text-sm se-font-mono se-text-text-secondary se-py-1 se-px-2 se-bg-slate-grey-3 se-rounded-lg se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"Class Name\"\n value={(item.className as string) || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(section, index, 'className', e.target.value)\n }\n />\n </div>\n );\n\n default:\n return null;\n }\n };\n\n const headerTitle =\n createMode === 'form' || createMode === 'picking' ? 'Add Text Change' : 'Content';\n const headerSubtitle =\n createMode === 'picking'\n ? 'Click an element on the page to select it. Press ESC to go back.'\n : createMode === 'form'\n ? 'Pick an element and set its new text'\n : `${totalChanges} change${totalChanges !== 1 ? 's' : ''}${totalChanges > 0 ? ` (${foundCount} found on this page)` : ''}`;\n\n const handleHeaderBack = () => {\n if (createMode === 'picking') {\n setCreateMode('form');\n } else if (createMode === 'form') {\n handleCancelCreate();\n } else if (editingKey !== null) {\n handleBackToList();\n } else {\n editor.navigateHome();\n }\n };\n\n return (\n <EditorLayout>\n {/* Header */}\n <EditorHeader title={headerTitle} subtitle={headerSubtitle} onBack={handleHeaderBack} />\n\n {/* Body */}\n <EditorBody>\n {createMode === 'form' || createMode === 'picking' ? (\n /* ---- Create form mode ---- */\n <div className=\"se-flex se-flex-col se-gap-4\">\n {/* Target element display */}\n <div className=\"se-flex se-flex-col se-gap-1.5\">\n <span className=\"se-text-sm se-font-semibold se-text-text-primary se-uppercase se-tracking-wide\">\n Target Element\n </span>\n {createAnchorId ? (\n <div className=\"se-flex se-gap-2 se-items-center\">\n <code className=\"se-flex-1 se-py-1.5 se-px-2 se-rounded-lg se-border se-border-input-field-border se-bg-slate-grey-3 se-text-text-primary se-text-sm se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\">\n {createAnchorId}\n </code>\n <button\n type=\"button\"\n onClick={() => setCreateMode('picking')}\n className=\"se-py-1.5 se-px-3 se-rounded-lg se-border se-border-btn-neutral-border se-bg-btn-neutral se-text-btn-neutral-text se-text-sm se-cursor-pointer se-shrink-0 hover:se-text-btn-neutral-text-hover\"\n >\n Re-pick\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setCreateMode('picking')}\n className=\"se-w-full se-h-12 se-px-4 se-py-2 se-rounded-lg se-border-2 se-border-dashed se-border-btn-primary/30 se-bg-btn-primary/5 se-text-btn-primary se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center se-gap-2 hover:se-bg-btn-primary/10 hover:se-border-btn-primary/50\"\n >\n + Pick Target Element\n </button>\n )}\n {createDescription && (\n <span className=\"se-text-sm se-text-text-secondary\">{createDescription}</span>\n )}\n </div>\n\n {/* Text content */}\n <div className=\"se-flex se-flex-col se-gap-1.5\">\n <span className=\"se-text-sm se-font-semibold se-text-text-primary se-uppercase se-tracking-wide\">\n Text Content\n </span>\n <EditorTextarea\n value={createText}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setCreateText(e.target.value)\n }\n />\n </div>\n\n {/* Action buttons */}\n <div className=\"se-flex se-gap-2 se-mt-2\">\n <button\n type=\"button\"\n onClick={handleCancelCreate}\n className=\"se-flex-1 se-h-10 se-px-4 se-py-2 se-rounded-md se-border se-border-btn-neutral-border se-bg-btn-neutral se-text-btn-neutral-text se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center hover:se-text-btn-neutral-text-hover\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSaveCreate}\n disabled={!createAnchorId}\n 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 se-text-sm se-font-medium se-cursor-pointer se-inline-flex se-items-center se-justify-center hover:se-bg-btn-primary-hover disabled:se-opacity-50 disabled:se-pointer-events-none\"\n >\n Add Change\n </button>\n </div>\n </div>\n ) : editingKey !== null ? (\n /* ---- Edit mode ---- */\n (() => {\n const ref = parseItemKey(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-lg se-font-semibold se-text-text-primary\">\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 /* ---- List mode ---- */\n <>\n {/* Create button */}\n <button\n type=\"button\"\n onClick={handleStartCreate}\n className=\"se-w-full se-h-10 se-px-4 se-py-2 se-rounded-md se-border se-border-dashed se-border-btn-primary/30 se-bg-btn-primary/5 se-text-btn-primary se-text-sm se-font-medium se-cursor-pointer se-flex se-items-center se-justify-center se-gap-2 se-mb-3\"\n >\n + Add Text Change\n </button>\n\n {allItems.length === 0 && (\n <EmptyState message=\"No content changes configured. Click above to add one.\" />\n )}\n\n {activeItems.length > 0 && (\n <>\n <GroupHeader label=\"CONTENT\" count={activeItems.length} />\n {activeItems.map((item) => {\n const detection = detectionMap.get(item.key);\n return (\n <EditorCard\n key={item.key}\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 <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\">\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 this change\"\n >\n &times;\n </button>\n </EditorCard>\n );\n })}\n </>\n )}\n\n {/* Dismissed section */}\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-lg se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-sm se-text-text-tertiary 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 {/* Footer */}\n <EditorFooter onSave={() => editor.save()} onPublish={handlePublish} />\n\n {/* AnchorPicker overlay (portalled to document.body) */}\n <AnchorPicker\n isActive={createMode === 'picking'}\n onPick={handleElementPicked}\n onCancel={() => setCreateMode('form')}\n />\n </EditorLayout>\n );\n}\n\n/**\n * Editor module configuration.\n */\nexport const editor = {\n panel: {\n title: 'Content',\n icon: '\\u{1f4dd}',\n description: 'Text and attribute modifications',\n },\n component: ContentEditor,\n};\n\nexport const editorPanel = editor.panel;\n\nexport default ContentEditor;\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 isUrlAttr = name === 'href' || name === 'src' || name === 'formaction';\n const isDangerousUrl =\n isUrlAttr &&\n (value.startsWith('javascript:') ||\n value.startsWith('vbscript:') ||\n value.startsWith('data:text/html'));\n\n if (isEvent || isDangerousUrl) {\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 * Adaptive Content - Runtime Module\n *\n * DOM manipulation actions: insertHtml, setText, setAttr, addClass, removeClass, setStyle.\n * These follow the hostPatcher snapshot pattern for safe reversibility.\n */\n\nimport { sanitizeHtml } from './sanitizer';\nimport type {\n ActionExecutor,\n AddClassAction,\n ExecutorResult,\n InsertHtmlAction,\n RemoveClassAction,\n SetAttrAction,\n SetStyleAction,\n SetTextAction,\n} from './types';\n\n// ============================================================================\n// Executors\n// ============================================================================\n\n/**\n * Execute an insertHtml action\n */\nexport const executeInsertHtml: ActionExecutor<InsertHtmlAction> = 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 // Sanitize HTML content using context utility\n const sanitizedHtml = sanitizeHtml(action.html);\n\n // Create container for inserted content\n const container = document.createElement('div');\n container.setAttribute('data-syntro-action-id', context.generateId());\n container.innerHTML = sanitizedHtml;\n\n // Keep track of original state for replace position\n let originalContent: string | null = null;\n\n switch (action.position) {\n case 'before':\n anchorEl.insertAdjacentElement('beforebegin', container);\n break;\n case 'after':\n anchorEl.insertAdjacentElement('afterend', container);\n break;\n case 'prepend':\n anchorEl.insertBefore(container, anchorEl.firstChild);\n break;\n case 'append':\n anchorEl.appendChild(container);\n break;\n case 'replace':\n originalContent = anchorEl.innerHTML;\n anchorEl.replaceWith(container);\n break;\n }\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:insertHtml',\n anchorId: action.anchorId,\n position: action.position,\n });\n\n return {\n cleanup: () => {\n if (action.position === 'replace' && originalContent !== null) {\n // Restore original element\n const restoredEl = document.createElement(anchorEl.tagName);\n restoredEl.innerHTML = originalContent;\n // Copy attributes\n Array.from(anchorEl.attributes).forEach((attr) => {\n restoredEl.setAttribute(attr.name, attr.value);\n });\n container.replaceWith(restoredEl);\n } else {\n container.remove();\n }\n },\n updateFn: (changes) => {\n if ('html' in changes && typeof changes.html === 'string') {\n container.innerHTML = sanitizeHtml(changes.html);\n }\n },\n };\n};\n\n/**\n * Execute a setText action\n */\nexport const executeSetText: ActionExecutor<SetTextAction> = 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 // Snapshot original text\n const originalText = anchorEl.textContent ?? '';\n\n // Set new text\n anchorEl.textContent = action.text;\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setText',\n anchorId: action.anchorId,\n });\n\n return {\n cleanup: () => {\n anchorEl.textContent = originalText;\n },\n updateFn: (changes) => {\n if ('text' in changes && typeof changes.text === 'string') {\n anchorEl.textContent = changes.text;\n }\n },\n };\n};\n\n/**\n * Execute a setAttr action\n */\nexport const executeSetAttr: ActionExecutor<SetAttrAction> = 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 // Block dangerous attributes (case-insensitive)\n const lowerAttr = action.attr.toLowerCase();\n if (lowerAttr.startsWith('on')) {\n throw new Error(`Dangerous attribute not allowed: ${action.attr}`);\n }\n\n // Block dangerous URIs in URL-bearing attributes\n const isUrlAttr = lowerAttr === 'href' || lowerAttr === 'src' || lowerAttr === 'formaction';\n if (isUrlAttr) {\n const lowerValue = action.value.trim().toLowerCase();\n if (\n lowerValue.startsWith('javascript:') ||\n lowerValue.startsWith('vbscript:') ||\n lowerValue.startsWith('data:text/html')\n ) {\n throw new Error(`Dangerous URL not allowed in ${action.attr}: ${action.value}`);\n }\n }\n\n // Snapshot original attribute value\n const originalValue = anchorEl.getAttribute(action.attr);\n const hadAttribute = anchorEl.hasAttribute(action.attr);\n\n // Set new attribute\n anchorEl.setAttribute(action.attr, action.value);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setAttr',\n anchorId: action.anchorId,\n attr: action.attr,\n });\n\n return {\n cleanup: () => {\n if (hadAttribute && originalValue !== null) {\n anchorEl.setAttribute(action.attr, originalValue);\n } else {\n anchorEl.removeAttribute(action.attr);\n }\n },\n updateFn: (changes) => {\n if ('value' in changes && typeof changes.value === 'string') {\n anchorEl.setAttribute(action.attr, changes.value);\n }\n },\n };\n};\n\n/**\n * Execute an addClass action\n */\nexport const executeAddClass: ActionExecutor<AddClassAction> = 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 // Check if class was already present\n const hadClass = anchorEl.classList.contains(action.className);\n\n // Add class\n anchorEl.classList.add(action.className);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:addClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n\n return {\n cleanup: () => {\n // Only remove if we added it\n if (!hadClass) {\n anchorEl.classList.remove(action.className);\n }\n },\n };\n};\n\n/**\n * Execute a removeClass action\n */\nexport const executeRemoveClass: ActionExecutor<RemoveClassAction> = 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 // Check if class was present\n const hadClass = anchorEl.classList.contains(action.className);\n\n // Remove class\n anchorEl.classList.remove(action.className);\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:removeClass',\n anchorId: action.anchorId,\n className: action.className,\n });\n\n return {\n cleanup: () => {\n // Only re-add if we removed it\n if (hadClass) {\n anchorEl.classList.add(action.className);\n }\n },\n };\n};\n\n/**\n * Execute a setStyle action\n */\nexport const executeSetStyle: ActionExecutor<SetStyleAction> = 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 // Snapshot original styles\n const originalStyles = new Map<string, string>();\n for (const prop of Object.keys(action.styles)) {\n const current = (anchorEl as HTMLElement).style.getPropertyValue(prop);\n originalStyles.set(prop, current);\n }\n\n // Apply new styles\n for (const [prop, value] of Object.entries(action.styles)) {\n (anchorEl as HTMLElement).style.setProperty(prop, value);\n }\n\n context.publishEvent('action.applied', {\n id: context.generateId(),\n kind: 'content:setStyle',\n anchorId: action.anchorId,\n styles: Object.keys(action.styles),\n });\n\n return {\n cleanup: () => {\n // Restore original styles\n for (const [prop, originalValue] of originalStyles) {\n if (originalValue) {\n (anchorEl as HTMLElement).style.setProperty(prop, originalValue);\n } else {\n (anchorEl as HTMLElement).style.removeProperty(prop);\n }\n }\n },\n updateFn: (changes) => {\n if ('styles' in changes && typeof changes.styles === 'object' && changes.styles) {\n for (const [prop, value] of Object.entries(changes.styles as Record<string, string>)) {\n (anchorEl as HTMLElement).style.setProperty(prop, value);\n }\n }\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: 'content:insertHtml', executor: executeInsertHtml },\n { kind: 'content:setText', executor: executeSetText },\n { kind: 'content:setAttr', executor: executeSetAttr },\n { kind: 'content:addClass', executor: executeAddClass },\n { kind: 'content:removeClass', executor: executeRemoveClass },\n { kind: 'content:setStyle', executor: executeSetStyle },\n] as const;\n\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-content',\n version: '1.0.0',\n name: 'Content',\n description: 'DOM manipulation for text, attributes, and styles',\n executors,\n};\n", "/**\n * CDN Entry Point for Adaptive Content\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", "createPortal", "_RD", "isElement", "input", "OPERATOR", "CSS_SELECTOR_TYPE", "isEnumValue", "haystack", "needle", "libraryName", "showWarning", "id", "args", "DEFAULT_OPTIONS", "CSS_SELECTOR_TYPE", "sanitizeSelectorTypes", "input", "item", "isEnumValue", "isRegExp", "isCssSelectorMatch", "sanitizeCssSelectorMatchList", "isNode", "isParentNode", "validParentNodeTypes", "sanitizeRoot", "element", "showWarning", "rootNode", "getRootNode", "sanitizeMaxNumber", "sanitizeOptions", "custom_options", "options", "getIntersection", "items", "firstItem", "otherItems", "accumulator", "currentValue", "item", "flattenArray", "input", "wildcardToRegExp", "createPatternMatcher", "list", "matchFunctions", "isRegExp", "result", "showWarning", "re", "matchFunction", "testSelector", "elements", "selector", "root", "result", "sanitizeRoot", "element", "getElementParents", "element", "root", "getRootNode", "result", "parent", "isElement", "getParents", "elements", "getIntersection", "SELECTOR_SEPARATOR", "INVALID_ID_RE", "INVALID_CLASS_RE", "SELECTOR_PATTERN", "CSS_SELECTOR_TYPE", "attributeBlacklistMatch", "createPatternMatcher", "attributeNodeToSimplifiedSelector", "name", "attributeNodeToSelector", "value", "isValidAttributeNode", "nodeName", "nodeValue", "element", "tagName", "sanitizeAttributeData", "sanitizeSelectorItem", "getElementAttributeSelectors", "validAttributes", "attributeNode", "getAttributeSelectors", "elements", "elementSelectors", "getIntersection", "getElementClassSelectors", "element", "_a", "item", "INVALID_CLASS_RE", "sanitizeSelectorItem", "getClassSelectors", "elements", "elementSelectors", "getIntersection", "getElementIdSelectors", "element", "id", "_a", "selector", "sanitizeSelectorItem", "rootNode", "INVALID_ID_RE", "testSelector", "getIdSelector", "elements", "getElementNthChildSelector", "element", "siblings", "_a", "i", "getNthChildSelector", "elements", "getIntersection", "getElementTagSelectors", "element", "sanitizeSelectorItem", "getTagSelector", "elements", "selectors", "flattenArray", "getElementNthOfTypeSelector", "element", "tag", "getTagSelector", "parentElement", "elementIndex", "getNthOfTypeSelector", "elements", "getIntersection", "powerSetGenerator", "input", "maxResults", "resultCounter", "offsets", "generateOffsets", "offset", "bumpOffsets", "getPowerSet", "maxValue", "size", "result", "index", "cartesianProductGenerator", "input", "entries", "stack", "item", "index", "partial", "key", "values", "i", "ESCAPED_COLON", "SPECIAL_CHARACTERS_RE", "sanitizeSelectorItem", "input", "legacySanitizeSelectorItem", "character", "SELECTOR_TYPE_GETTERS", "getTagSelector", "getIdSelector", "getClassSelectors", "getAttributeSelectors", "getNthChildSelector", "getNthOfTypeSelector", "ELEMENT_SELECTOR_TYPE_GETTERS", "getElementTagSelectors", "getElementIdSelectors", "getElementClassSelectors", "getElementAttributeSelectors", "getElementNthChildSelector", "getElementNthOfTypeSelector", "getElementSelectorsByType", "element", "selectorType", "getSelectorsByType", "elements", "selector_type", "getter", "filterSelectors", "list", "matchBlacklist", "matchWhitelist", "item", "orderSelectors", "b", "a_is_whitelisted", "b_is_whitelisted", "allSelectorsGenerator", "options", "yieldedSelectors", "selectors_list", "getSelectorsList", "selector", "selectorTypeCombinationsGenerator", "blacklist", "whitelist", "combineWithinSelector", "maxCombinations", "createPatternMatcher", "reducer", "data", "selectors_by_type", "filtered_selectors", "found_selectors", "powerSetGenerator", "getSelectorsToGet", "selectors", "includeTag", "selectors_to_get", "addTagTypeIfNeeded", "CSS_SELECTOR_TYPE", "combineSelectorTypes", "combineBetweenSelectors", "maxCandidates", "combinations", "getPowerSet", "constructedSelectorsGenerator", "selector_types", "selector_variants", "combination", "cartesianProductGenerator", "constructSelector", "constructSelectorType", "selectors_data", "selectorData", "pattern", "SELECTOR_PATTERN", "type", "generateCandidateCombinations", "rootSelector", "OPERATOR", "candidatesGenerator", "selectorWithinRootGenerator", "root", "elementSelectorsIterator", "candidateSelector", "testSelector", "closestIdentifiableParentGenerator", "candidatesList", "getParents", "currentElements", "selectorWithinRoot", "selectorGenerator", "currentRoot", "partialSelector", "shouldContinue", "foundAny", "foundElements", "sanitizeSelectorNeedle", "needle", "isElement", "createElementSelectorData", "selector", "createElementData", "element", "selectorTypes", "operator", "OPERATOR", "selectors", "selectorType", "getElementSelectorsByType", "constructElementSelector", "pattern", "SELECTOR_PATTERN", "CSS_SELECTOR_TYPE", "item", "_a", "value", "include", "getElementFallbackSelector", "element", "root", "elementsData", "getElementParents", "elementData", "createElementData", "CSS_SELECTOR_TYPE", "OPERATOR", "_a", "selectorData", "constructElementSelector", "getFallbackSelector", "elements", "SELECTOR_SEPARATOR", "getCssSelector", "needle", "custom_options", "options", "cssSelectorGenerator", "elements", "sanitizeSelectorNeedle", "sanitizeOptions", "root", "_a", "getRootNode", "foundResults", "selector", "selectorGenerator", "element", "SELECTOR_SEPARATOR", "getFallbackSelector", "DEFAULT_OPTIONS", "generateSelector", "element", "options", "opts", "selectors", "getCssSelector", "error", "generateFallbackSelector", "path", "current", "selector", "parent", "index", "validateSelector", "expectedElement", "getElementDescription", "tag", "id", "classes", "c", "isDynamicClass", "text", "textPreview", "className", "pattern", "HIGHLIGHT_COLOR", "HIGHLIGHT_BG", "AnchorPicker", "isActive", "onPick", "onCancel", "excludeSelector", "hoveredElement", "setHoveredElement", "useState", "hoveredSelector", "setHoveredSelector", "overlayRef", "useRef", "handleMouseMove", "useCallback", "e", "overlay", "elementAtPoint", "selector", "generateSelector", "handleClick", "validateSelector", "getElementDescription", "newSelector", "handleKeyDown", "useEffect", "rect", "createPortal", "jsxs", "jsx", "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", "FileCode", "createLucideIcon", "__iconNode", "Minus", "createLucideIcon", "__iconNode", "Palette", "createLucideIcon", "__iconNode", "Plus", "createLucideIcon", "__iconNode", "Tag", "createLucideIcon", "__iconNode", "Type", "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", "EditorSelect", "label", "className", "children", "props", "jsxs", "jsx", "cn", "EditorTextarea", "label", "className", "value", "props", "ref", "useRef", "useEffect", "el", "jsxs", "jsx", "cn", "EmptyState", "message", "jsx", "GroupHeader", "label", "count", "className", "jsxs", "cn", "jsx", "describeSelector", "selector", "name", "prefixes", "prefix", "truncate", "testIdMatch", "text", "max", "truncateQuoted", "summarizeContentChange", "type", "item", "desc", "attr", "value", "styles", "count", "itemKey", "section", "index", "parseItemKey", "key", "indexStr", "SECTION_ICON_MAP", "Type", "Tag", "Palette", "FileCode", "Plus", "Minus", "SectionIcon", "className", "IconComponent", "jsx", "flattenItems", "config", "items", "sections", "item", "i", "rec", "summarizeContentChange", "filterConfig", "dismissedKeys", "result", "filtered", "_", "useAnchorDetection", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "useEffect", "runDetection", "map", "el", "interval", "ContentEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "editingKey", "setEditingKey", "_previewMode", "setPreviewMode", "createMode", "setCreateMode", "createAnchorId", "setCreateAnchorId", "createText", "setCreateText", "createDescription", "setCreateDescription", "mode", "allKeys", "empty", "initialConsumed", "allFlat", "targetIdx", "target", "allItems", "activeItems", "dismissedItems", "totalChanges", "_hoveredKey", "setHoveredKey", "foundCount", "handleDismiss", "useCallback", "prev", "next", "handleRestore", "handleCardClick", "handleBackToList", "_handleBeforeAfter", "handleFieldChange", "field", "value", "arr", "updated", "handlePublish", "handleCardHover", "handleCardLeave", "handleStartCreate", "handleElementPicked", "picked", "text", "handleCancelCreate", "handleSaveCreate", "existing", "newItem", "renderEditFields", "anchorId", "jsxs", "EditorTextarea", "e", "EditorInput", "styleObj", "prop", "val", "newStyles", "EditorSelect", "headerTitle", "headerSubtitle", "EditorLayout", "EditorHeader", "EditorBody", "ref", "editItem", "it", "Fragment", "EmptyState", "GroupHeader", "detection", "EditorCard", "DetectionBadge", "DismissedSection", "EditorFooter", "AnchorPicker", "editorPanel", "ALLOWED_TAGS", "sanitizeHtml", "html", "frag", "div", "tpl", "root", "walker", "toRemove", "el", "tag", "attr", "name", "value", "isEvent", "isDangerousUrl", "executeInsertHtml", "action", "context", "anchorEl", "sanitizedHtml", "sanitizeHtml", "container", "originalContent", "restoredEl", "attr", "changes", "executeSetText", "originalText", "executeSetAttr", "lowerAttr", "lowerValue", "originalValue", "hadAttribute", "executeAddClass", "hadClass", "executeRemoveClass", "executeSetStyle", "originalStyles", "prop", "current", "value", "executors", "runtime", "manifest", "runtime", "executors", "kind", "executor", "editor", "registry", "cdn_default"]
7
- }