@syntrologie/runtime-sdk 2.1.0-canary.8 → 2.1.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 (159) hide show
  1. package/CAPABILITIES.md +415 -115
  2. package/dist/SmartCanvasApp.d.ts +1 -3
  3. package/dist/SmartCanvasApp.js +16 -10
  4. package/dist/SmartCanvasApp.js.map +1 -1
  5. package/dist/SmartCanvasElement.d.ts +0 -2
  6. package/dist/SmartCanvasElement.js +3 -8
  7. package/dist/SmartCanvasElement.js.map +1 -1
  8. package/dist/actions/executors/index.js +4 -1
  9. package/dist/actions/executors/index.js.map +1 -1
  10. package/dist/actions/executors/tour.js +2 -2
  11. package/dist/actions/executors/tour.js.map +1 -1
  12. package/dist/actions/validation.js +5 -30
  13. package/dist/actions/validation.js.map +1 -1
  14. package/dist/adaptives/adaptive-chatbot/index.js +7 -5
  15. package/dist/adaptives/adaptive-chatbot/index.js.map +4 -4
  16. package/dist/adaptives/adaptive-content/index.js +22 -0
  17. package/dist/adaptives/adaptive-content/index.js.map +7 -0
  18. package/dist/adaptives/adaptive-faq/index.js +11 -0
  19. package/dist/adaptives/adaptive-faq/index.js.map +7 -0
  20. package/dist/adaptives/adaptive-gamification/index.js +2 -0
  21. package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
  22. package/dist/adaptives/adaptive-nav/index.js +12 -0
  23. package/dist/adaptives/adaptive-nav/index.js.map +7 -0
  24. package/dist/adaptives/adaptive-overlays/index.js +94 -0
  25. package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
  26. package/dist/api.d.ts +1 -9
  27. package/dist/api.js +5 -5
  28. package/dist/api.js.map +1 -1
  29. package/dist/apps/AppLoader.d.ts +5 -0
  30. package/dist/apps/AppLoader.js +28 -3
  31. package/dist/apps/AppLoader.js.map +1 -1
  32. package/dist/apps/index.d.ts +1 -1
  33. package/dist/apps/types.d.ts +26 -0
  34. package/dist/blocks/data/ComparisonBlock.js +12 -9
  35. package/dist/blocks/data/ComparisonBlock.js.map +1 -1
  36. package/dist/blocks/data/StatsBlock.js +11 -10
  37. package/dist/blocks/data/StatsBlock.js.map +1 -1
  38. package/dist/blocks/index.d.ts +9 -5
  39. package/dist/blocks/index.js +2 -2
  40. package/dist/blocks/index.js.map +1 -1
  41. package/dist/blocks/interactive/ChecklistBlock.js +13 -12
  42. package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
  43. package/dist/blocks/interactive/RatingBlock.js +18 -12
  44. package/dist/blocks/interactive/RatingBlock.js.map +1 -1
  45. package/dist/blocks/notification/NotificationBlock.js +24 -23
  46. package/dist/blocks/notification/NotificationBlock.js.map +1 -1
  47. package/dist/blocks/theme-tokens.d.ts +23 -0
  48. package/dist/blocks/theme-tokens.js +25 -0
  49. package/dist/blocks/theme-tokens.js.map +1 -0
  50. package/dist/bootstrap.js +21 -24
  51. package/dist/bootstrap.js.map +1 -1
  52. package/dist/components/ShadowCanvasOverlay.d.ts +6 -3
  53. package/dist/components/ShadowCanvasOverlay.js +191 -115
  54. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  55. package/dist/components/TileCard.d.ts +1 -5
  56. package/dist/components/TileCard.js +62 -286
  57. package/dist/components/TileCard.js.map +1 -1
  58. package/dist/components/TileWheel.js +24 -4
  59. package/dist/components/TileWheel.js.map +1 -1
  60. package/dist/configFetcher.d.ts +5 -1
  61. package/dist/configFetcher.js +33 -2
  62. package/dist/configFetcher.js.map +1 -1
  63. package/dist/context/ContextManager.js +3 -2
  64. package/dist/context/ContextManager.js.map +1 -1
  65. package/dist/decisions/engine.d.ts +4 -0
  66. package/dist/decisions/engine.js +6 -1
  67. package/dist/decisions/engine.js.map +1 -1
  68. package/dist/decisions/schema.d.ts +241 -0
  69. package/dist/decisions/schema.js +8 -0
  70. package/dist/decisions/schema.js.map +1 -1
  71. package/dist/decisions/strategies/rules.js +14 -0
  72. package/dist/decisions/strategies/rules.js.map +1 -1
  73. package/dist/decisions/types.d.ts +21 -1
  74. package/dist/editorLoader.d.ts +19 -9
  75. package/dist/editorLoader.js +112 -94
  76. package/dist/editorLoader.js.map +1 -1
  77. package/dist/events/EventAccumulator.d.ts +29 -0
  78. package/dist/events/EventAccumulator.js +101 -0
  79. package/dist/events/EventAccumulator.js.map +1 -0
  80. package/dist/events/index.d.ts +2 -0
  81. package/dist/events/index.js +1 -0
  82. package/dist/events/index.js.map +1 -1
  83. package/dist/events/normalizers/posthog.js +12 -4
  84. package/dist/events/normalizers/posthog.js.map +1 -1
  85. package/dist/events/types.d.ts +4 -0
  86. package/dist/events/types.js +5 -0
  87. package/dist/events/types.js.map +1 -1
  88. package/dist/experiments/adapters/growthbook.d.ts +2 -1
  89. package/dist/experiments/adapters/growthbook.js +11 -23
  90. package/dist/experiments/adapters/growthbook.js.map +1 -1
  91. package/dist/experiments/types.d.ts +5 -0
  92. package/dist/fetchers/experimentsFetcher.d.ts +23 -1
  93. package/dist/fetchers/experimentsFetcher.js +48 -1
  94. package/dist/fetchers/experimentsFetcher.js.map +1 -1
  95. package/dist/fetchers/mergeConfigs.d.ts +29 -0
  96. package/dist/fetchers/mergeConfigs.js +38 -0
  97. package/dist/fetchers/mergeConfigs.js.map +1 -0
  98. package/dist/hooks/useShadowCanvasConfig.js +1 -1
  99. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  100. package/dist/index.d.ts +1 -0
  101. package/dist/index.js +28 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/notifications/NotificationToastStack.d.ts +8 -0
  104. package/dist/notifications/NotificationToastStack.js +118 -0
  105. package/dist/notifications/NotificationToastStack.js.map +1 -0
  106. package/dist/notifications/index.d.ts +9 -0
  107. package/dist/notifications/index.js +6 -0
  108. package/dist/notifications/index.js.map +1 -0
  109. package/dist/notifications/matcher.d.ts +25 -0
  110. package/dist/notifications/matcher.js +66 -0
  111. package/dist/notifications/matcher.js.map +1 -0
  112. package/dist/notifications/types.d.ts +64 -0
  113. package/dist/notifications/types.js +13 -0
  114. package/dist/notifications/types.js.map +1 -0
  115. package/dist/notifications/useNotifications.d.ts +19 -0
  116. package/dist/notifications/useNotifications.js +104 -0
  117. package/dist/notifications/useNotifications.js.map +1 -0
  118. package/dist/notifications/useNotifyWatcher.d.ts +15 -0
  119. package/dist/notifications/useNotifyWatcher.js +62 -0
  120. package/dist/notifications/useNotifyWatcher.js.map +1 -0
  121. package/dist/overlays/runtime/overlay/runner.js +2 -2
  122. package/dist/overlays/runtime/overlay/runner.js.map +1 -1
  123. package/dist/render/RenderContext.js +5 -3
  124. package/dist/render/RenderContext.js.map +1 -1
  125. package/dist/render/types.d.ts +2 -3
  126. package/dist/runtime.d.ts +3 -0
  127. package/dist/runtime.js +28 -12
  128. package/dist/runtime.js.map +1 -1
  129. package/dist/smart-canvas.esm.js +131 -102
  130. package/dist/smart-canvas.esm.js.map +4 -4
  131. package/dist/smart-canvas.js +40870 -43700
  132. package/dist/smart-canvas.js.map +4 -4
  133. package/dist/smart-canvas.min.js +131 -102
  134. package/dist/smart-canvas.min.js.map +4 -4
  135. package/dist/theme/defaultTheme.d.ts +7 -3
  136. package/dist/theme/defaultTheme.js +78 -51
  137. package/dist/theme/defaultTheme.js.map +1 -1
  138. package/dist/theme/index.d.ts +1 -1
  139. package/dist/theme/index.js +1 -1
  140. package/dist/theme/index.js.map +1 -1
  141. package/dist/theme/types.d.ts +7 -0
  142. package/dist/types.d.ts +13 -100
  143. package/dist/types.js.map +1 -1
  144. package/dist/version.d.ts +1 -1
  145. package/dist/version.js +1 -1
  146. package/dist/version.js.map +1 -1
  147. package/dist/widgets/WidgetRegistry.d.ts +6 -1
  148. package/dist/widgets/WidgetRegistry.js +12 -4
  149. package/dist/widgets/WidgetRegistry.js.map +1 -1
  150. package/package.json +18 -12
  151. package/schema/canvas-config.schema.json +34 -69
  152. package/schema/event-catalog.schema.json +157 -0
  153. package/scripts/validate-config.mjs +20 -13
  154. package/dist/adaptives/faq/index.js +0 -11
  155. package/dist/adaptives/faq/index.js.map +0 -7
  156. package/dist/adaptives/gamification/index.js +0 -2
  157. package/dist/adaptives/gamification/index.js.map +0 -7
  158. package/dist/adaptives/nav/index.js +0 -11
  159. package/dist/adaptives/nav/index.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../adaptives/shared-editor-ui/dist/cn.js", "syntro-react:react/jsx-runtime", "../../../../adaptives/shared-editor-ui/dist/components/EditorLayout.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorHeader.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorBody.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorFooter.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorCard.js", "../../../../adaptives/shared-editor-ui/dist/components/DetectionBadge.js", "syntro-react:react", "../../../../adaptives/shared-editor-ui/dist/components/DismissedSection.js", "../../../../adaptives/shared-editor-ui/dist/components/GroupHeader.js", "../../../../adaptives/shared-editor-ui/dist/components/BeforeAfterToggle.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorInput.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorTextarea.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorSelect.js", "../../../../adaptives/shared-editor-ui/dist/components/EditBackButton.js", "../../../../adaptives/shared-editor-ui/dist/components/EmptyState.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", "syntro-react:react-dom", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-iselement.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/types.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-typescript.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-messages.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-options.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-data.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-dom.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/constants.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-attribute.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-class.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-id.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-nth-child.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-tag.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-nth-of-type.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-powerset.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-cartesian.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-selectors.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/utilities-element-data.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/selector-fallback.ts", "../../../../adaptives/adaptive-content/node_modules/css-selector-generator/src/index.ts", "../../../../adaptives/adaptive-content/src/utils/selectorGenerator.ts", "../../../../adaptives/adaptive-content/src/components/AnchorPicker.tsx", "../../../../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 ", "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\";\nexport function EditorHeader({ title, subtitle, onBack }) {\n return (_jsxs(\"div\", { className: \"se-p-4 se-border-b se-border-border-primary se-flex se-items-center se-gap-3\", children: [_jsx(\"button\", { onClick: onBack, className: \"se-px-3 se-py-1.5 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer hover:se-text-btn-neutral-text-hover\", children: \"\\u2190 Back\" }), _jsxs(\"div\", { 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 } 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, 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-py-2.5 se-rounded-lg se-border-none se-bg-blue-5/15 se-text-blue-5 se-text-base se-font-semibold se-cursor-pointer\", children: \"Save Draft\" }), _jsx(\"button\", { onClick: onPublish, className: \"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-green-4 se-text-white se-text-base se-font-semibold se-cursor-pointer\", children: \"Publish\" })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorCard({ children, itemKey, onMouseEnter, onMouseLeave, className, validated, }) {\n return (_jsx(\"div\", { \"data-item-key\": itemKey, 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', className), children: children }));\n}\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", "\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 ", "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\", { 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), 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, 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-secondary 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-tertiary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg\", children: count })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function BeforeAfterToggle({ mode, onToggle }) {\n return (_jsxs(\"div\", { className: \"se-flex se-mb-3 se-rounded-lg se-overflow-hidden se-border se-border-border-primary\", children: [_jsx(\"button\", { onClick: () => onToggle('before'), className: cn('se-flex-1 se-py-1.5 se-px-3 se-border-none se-text-sm se-font-semibold se-cursor-pointer', mode === 'before'\n ? 'se-bg-blue-5/20 se-text-blue-5'\n : 'se-bg-transparent se-text-text-secondary'), children: \"Before\" }), _jsx(\"button\", { onClick: () => onToggle('after'), className: cn('se-flex-1 se-py-1.5 se-px-3 se-border-none se-border-l se-border-border-primary se-text-sm se-font-semibold se-cursor-pointer', mode === 'after'\n ? 'se-bg-blue-5/20 se-text-blue-5'\n : 'se-bg-transparent se-text-text-secondary'), children: \"After\" })] }));\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-input-field-bg 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-ring-1 focus:se-ring-input-field-border-selected', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorTextarea({ 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(\"textarea\", { ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-resize-y se-min-h-[60px] se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\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-input-field-bg se-text-text-primary se-text-sm se-mb-2', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected', '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 } from \"react/jsx-runtime\";\nexport function EditBackButton({ onClick, label = '\\u2190 List' }) {\n return (_jsx(\"button\", { onClick: onClick, className: \"se-py-1.5 se-px-3 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer se-mt-2 hover:se-text-btn-neutral-text-hover\", children: label }));\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 { 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", "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 } 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 return 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 ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n", "import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase } 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(`lucide-${toKebabCase(iconName)}`, className),\n ...props,\n }),\n );\n\n Component.displayName = `${iconName}`;\n\n return Component;\n};\n\nexport default createLucideIcon;\n", "import createLucideIcon from '../createLucideIcon';\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('FileCode', [\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\nexport default FileCode;\n", "import createLucideIcon from '../createLucideIcon';\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', [['path', { d: 'M5 12h14', key: '1ays0h' }]]);\n\nexport default Minus;\n", "import createLucideIcon from '../createLucideIcon';\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,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMy41IiBjeT0iNi41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxjaXJjbGUgY3g9IjE3LjUiIGN5PSIxMC41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxjaXJjbGUgY3g9IjguNSIgY3k9IjcuNSIgcj0iLjUiIGZpbGw9ImN1cnJlbnRDb2xvciIgLz4KICA8Y2lyY2xlIGN4PSI2LjUiIGN5PSIxMi41IiByPSIuNSIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwYy45MjYgMCAxLjY0OC0uNzQ2IDEuNjQ4LTEuNjg4IDAtLjQzNy0uMTgtLjgzNS0uNDM3LTEuMTI1LS4yOS0uMjg5LS40MzgtLjY1Mi0uNDM4LTEuMTI1YTEuNjQgMS42NCAwIDAgMSAxLjY2OC0xLjY2OGgxLjk5NmMzLjA1MSAwIDUuNTU1LTIuNTAzIDUuNTU1LTUuNTU0QzIxLjk2NSA2LjAxMiAxNy40NjEgMiAxMiAyeiIgLz4KPC9zdmc+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', [\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: '8.5', cy: '7.5', r: '.5', fill: 'currentColor', key: 'fotxhn' }],\n ['circle', { cx: '6.5', cy: '12.5', r: '.5', fill: 'currentColor', key: 'qy21gx' }],\n [\n 'path',\n {\n d: 'M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z',\n key: '12rzf8',\n },\n ],\n]);\n\nexport default Palette;\n", "import createLucideIcon from '../createLucideIcon';\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', [\n ['path', { d: 'M5 12h14', key: '1ays0h' }],\n ['path', { d: 'M12 5v14', key: 's699le' }],\n]);\n\nexport default Plus;\n", "import createLucideIcon from '../createLucideIcon';\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', [\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\nexport default Tag;\n", "import createLucideIcon from '../createLucideIcon';\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,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cG9seWxpbmUgcG9pbnRzPSI0IDcgNCA0IDIwIDQgMjAgNyIgLz4KICA8bGluZSB4MT0iOSIgeDI9IjE1IiB5MT0iMjAiIHkyPSIyMCIgLz4KICA8bGluZSB4MT0iMTIiIHgyPSIxMiIgeTE9IjQiIHkyPSIyMCIgLz4KPC9zdmc+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', [\n ['polyline', { points: '4 7 4 4 20 4 20 7', key: '1nosan' }],\n ['line', { x1: '9', x2: '15', y1: '20', y2: '20', key: 'swin9y' }],\n ['line', { x1: '12', x2: '12', y1: '4', y2: '20', key: '1tx1rr' }],\n]);\n\nexport default Type;\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", "/**\n * CSS Selector Generator\n *\n * Generates stable, readable CSS selectors for picked DOM elements.\n * Ported from editor-sdk for use in adaptive-content's element picker.\n */\n\nimport { getCssSelector } from 'css-selector-generator';\n\nexport interface SelectorOptions {\n includeTag?: boolean;\n preferTestIds?: boolean;\n maxCombinations?: number;\n}\n\nconst DEFAULT_OPTIONS: SelectorOptions = {\n includeTag: true,\n preferTestIds: true,\n maxCombinations: 100,\n};\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: Element, options: SelectorOptions = {}): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const selectors: Array<'id' | 'class' | 'tag' | 'attribute' | 'nthchild' | 'nthoftype'> = [];\n\n selectors.push('id');\n\n if (opts.preferTestIds) {\n selectors.push('attribute');\n }\n\n selectors.push('class');\n selectors.push('tag');\n selectors.push('nthchild');\n selectors.push('nthoftype');\n\n try {\n const selector = getCssSelector(element, {\n selectors,\n includeTag: opts.includeTag,\n maxCombinations: opts.maxCombinations,\n blacklist: [\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 /^(is-|has-|js-)/,\n /^(active|selected|focused|disabled|hidden|visible)$/,\n /^(fade|slide|animate)/,\n /-(enter|leave|active)(-active|-done)?$/,\n ],\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\n return selector;\n } catch (error) {\n console.warn('[SelectorGenerator] Failed to generate selector:', error);\n return generateFallbackSelector(element);\n }\n}\n\nfunction generateFallbackSelector(element: Element): string {\n const path: string[] = [];\n let current: Element | null = element;\n\n while (current && current !== document.body && current !== document.documentElement) {\n let selector = current.tagName.toLowerCase();\n\n if (current.id) {\n selector = `#${CSS.escape(current.id)}`;\n path.unshift(selector);\n break;\n }\n\n const parent: Element | null = 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\n path.unshift(selector);\n current = parent;\n }\n\n return path.join(' > ');\n}\n\nexport function validateSelector(selector: string, expectedElement: Element): boolean {\n try {\n const matched = document.querySelector(selector);\n return matched === expectedElement;\n } catch {\n return false;\n }\n}\n\nexport function getElementDescription(element: Element): string {\n const tag = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : '';\n const classes =\n 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\n const text = element.textContent?.trim().slice(0, 30) || '';\n const textPreview = text ? ` \"${text}${text.length >= 30 ? '...' : ''}\"` : '';\n\n return `${tag}${id}${classes}${textPreview}`.trim();\n}\n\nfunction isDynamicClass(className: string): boolean {\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", "/**\n * AnchorPicker \u2014 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 * Ported from editor-sdk for use in adaptive-content's create flow.\n */\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n generateSelector,\n getElementDescription,\n validateSelector,\n} from '../utils/selectorGenerator';\n\nexport interface PickedElement {\n element: Element;\n selector: string;\n description: string;\n}\n\ninterface AnchorPickerProps {\n isActive: boolean;\n onPick: (picked: PickedElement) => void;\n onCancel: () => void;\n excludeSelector?: string;\n}\n\nconst HIGHLIGHT_COLOR = '#3b82f6';\nconst HIGHLIGHT_BG = 'rgba(59, 130, 246, 0.1)';\n\nexport function AnchorPicker({\n isActive,\n onPick,\n onCancel,\n excludeSelector = '[data-syntro-editor-panel], [data-shadow-canvas-id], .syntro-tooltip, .syntro-modal, .syntro-highlight, [data-syntro-anchor-picker]',\n}: AnchorPickerProps) {\n const [hoveredElement, setHoveredElement] = useState<Element | null>(null);\n const [hoveredSelector, setHoveredSelector] = useState<string>('');\n const overlayRef = useRef<HTMLDivElement>(null);\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n const overlay = overlayRef.current;\n if (overlay) {\n overlay.style.pointerEvents = 'none';\n }\n\n const elementAtPoint = document.elementFromPoint(e.clientX, e.clientY);\n\n if (overlay) {\n overlay.style.pointerEvents = 'auto';\n }\n\n if (!elementAtPoint) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n\n if (excludeSelector && elementAtPoint.closest(excludeSelector)) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n\n if (['HTML', 'BODY', 'HEAD'].includes(elementAtPoint.tagName)) {\n setHoveredElement(null);\n setHoveredSelector('');\n return;\n }\n\n setHoveredElement(elementAtPoint);\n const selector = generateSelector(elementAtPoint);\n setHoveredSelector(selector);\n },\n [excludeSelector]\n );\n\n const handleClick = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (hoveredElement && hoveredSelector) {\n if (validateSelector(hoveredSelector, hoveredElement)) {\n onPick({\n element: hoveredElement,\n selector: hoveredSelector,\n description: getElementDescription(hoveredElement),\n });\n } else {\n const newSelector = generateSelector(hoveredElement);\n onPick({\n element: hoveredElement,\n selector: newSelector,\n description: getElementDescription(hoveredElement),\n });\n }\n }\n },\n [hoveredElement, hoveredSelector, onPick]\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n },\n [onCancel]\n );\n\n useEffect(() => {\n if (!isActive) return;\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n\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\n if (!isActive) return null;\n\n const rect = hoveredElement?.getBoundingClientRect();\n\n return createPortal(\n <div\n ref={overlayRef}\n data-syntro-anchor-picker\n style={{\n position: 'fixed',\n inset: 0,\n cursor: 'crosshair',\n zIndex: 2147483647,\n }}\n >\n {/* Semi-transparent overlay */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(0, 0, 0, 0.05)',\n pointerEvents: 'none',\n }}\n />\n\n {/* Element highlight */}\n {hoveredElement && rect && (\n <div\n 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 }}\n />\n )}\n\n {/* Element info tooltip */}\n {hoveredElement && rect && (\n <div\n 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 }}\n >\n <div\n style={{\n fontSize: '11px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: '4px',\n color: '#94a3b8',\n }}\n >\n Click to select\n </div>\n <div\n style={{\n color: '#38bdf8',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {hoveredSelector}\n </div>\n <div\n style={{\n marginTop: '4px',\n color: '#cbd5e1',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {getElementDescription(hoveredElement)}\n </div>\n </div>\n )}\n\n {/* Instructions bar at bottom */}\n <div\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n backgroundColor: '#1e293b',\n color: '#e2e8f0',\n padding: '12px 20px',\n boxShadow: '0 -4px 12px rgba(0, 0, 0, 0.2)',\n fontSize: '14px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <span\n style={{\n padding: '4px 12px',\n borderRadius: '4px',\n fontWeight: 600,\n color: '#fff',\n backgroundColor: HIGHLIGHT_COLOR,\n }}\n >\n Element Picker\n </span>\n <span style={{ color: '#cbd5e1' }}>\n Hover over an element and click to select it\n </span>\n </div>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onCancel();\n }}\n style={{\n background: 'transparent',\n border: '1px solid #475569',\n color: '#e2e8f0',\n padding: '8px 16px',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'inherit',\n }}\n >\n <kbd\n style={{\n padding: '2px 6px',\n borderRadius: '3px',\n backgroundColor: '#334155',\n fontSize: '12px',\n }}\n >\n ESC\n </kbd>\n Cancel\n </button>\n </div>\n </div>,\n document.body\n );\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 EditorLayout,\n EditorHeader,\n EditorBody,\n EditorFooter,\n EditorCard,\n DetectionBadge,\n DismissedSection,\n GroupHeader,\n BeforeAfterToggle,\n EditorInput,\n EditorTextarea,\n EditorSelect,\n EditBackButton,\n EmptyState,\n} from '@syntrologie/shared-editor-ui';\nimport { Type, Tag, Palette, FileCode, Plus, Minus } from 'lucide-react';\nimport React, { useState, useCallback, useEffect, useRef } 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 // 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('picking');\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 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('picking');\n }, [editor]);\n\n const handleElementPicked = useCallback((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 }, [editor]);\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-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <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-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"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-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <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 se-border se-border-white/10 se-bg-white/[0.04] se-text-slate-grey-10 se-text-xs 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 se-border se-border-white/10 se-bg-white/[0.04] se-text-slate-grey-10 se-text-xs 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-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <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-[11px] se-font-mono se-text-slate-grey-8 se-py-1 se-px-2 se-bg-white/[0.04] se-rounded se-mb-3\">\n {anchorId}\n </div>\n <EditorInput\n label=\"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 = createMode === 'form' ? 'Add Text Change' : 'Content';\n const headerSubtitle = 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) {\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\n title={headerTitle}\n subtitle={headerSubtitle}\n onBack={handleHeaderBack}\n />\n\n {/* Body */}\n <EditorBody>\n {createMode === 'form' ? (\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 <label className=\"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-uppercase se-tracking-wide\">\n Target Element\n </label>\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 se-border se-border-white/10 se-bg-white/[0.04] se-text-slate-grey-10 se-text-xs se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\">\n {createAnchorId}\n </code>\n <button\n onClick={() => setCreateMode('picking')}\n className=\"se-py-1.5 se-px-3 se-rounded se-border se-border-white/10 se-bg-transparent se-text-slate-grey-9 se-text-xs se-cursor-pointer se-shrink-0\"\n >\n Re-pick\n </button>\n </div>\n {createDescription && (\n <span className=\"se-text-[11px] se-text-slate-grey-6\">{createDescription}</span>\n )}\n </div>\n\n {/* Text content */}\n <div className=\"se-flex se-flex-col se-gap-1.5\">\n <label className=\"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-uppercase se-tracking-wide\">\n Text Content\n </label>\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 onClick={handleCancelCreate}\n className=\"se-flex-1 se-py-2 se-rounded se-border se-border-white/10 se-bg-transparent se-text-slate-grey-9 se-text-sm se-cursor-pointer\"\n >\n Cancel\n </button>\n <button\n onClick={handleSaveCreate}\n disabled={!createAnchorId}\n className=\"se-flex-1 se-py-2 se-rounded se-border-none se-bg-blue-5 se-text-white se-text-sm se-font-semibold se-cursor-pointer disabled:se-opacity-40 disabled:se-cursor-not-allowed\"\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-[13px] se-font-semibold se-text-slate-grey-10\">\n <span>{editItem && <SectionIcon section={editItem.section} />}</span>\n <span>{editItem?.summary}</span>\n </div>\n <BeforeAfterToggle mode={previewMode} onToggle={handleBeforeAfter} />\n {renderEditFields(ref.section, ref.index)}\n <EditBackButton onClick={handleBackToList} />\n </>\n );\n })()\n ) : (\n /* ---- List mode ---- */\n <>\n {/* Create button */}\n <button\n onClick={handleStartCreate}\n className=\"se-w-full se-py-2.5 se-rounded-md se-border se-border-dashed se-border-blue-5/30 se-bg-blue-5/5 se-text-blue-5 se-text-xs se-font-semibold se-cursor-pointer se-flex se-items-center se-justify-center se-gap-1.5 se-mb-3\"\n >\n + Add Text Change\n </button>\n\n {allItems.length === 0 && <EmptyState message=\"No content changes configured. Click above to add one.\" />}\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 className=\"se-flex se-items-center se-gap-2 se-cursor-pointer\"\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n <DetectionBadge found={detection?.found ?? false} />\n <span\n className=\"se-shrink-0 se-flex se-items-center -se-ml-1\"\n onClick={(e) => {\n e.stopPropagation();\n handleCardClick(item);\n }}\n >\n <SectionIcon section={item.section} />\n </span>\n <span\n className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\"\n onClick={() => handleCardClick(item)}\n >\n {item.summary}\n </span>\n <button\n 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-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60\"\n >\n <span className=\"se-shrink-0 se-flex se-items-center -se-ml-1\">\n <SectionIcon section={item.section} />\n </span>\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through\">\n {item.summary}\n </span>\n <button\n 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={handleCancelCreate}\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 InsertHtmlAction,\n SetTextAction,\n SetAttrAction,\n AddClassAction,\n RemoveClassAction,\n SetStyleAction,\n ExecutorResult,\n ActionExecutor,\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", "EditorLayout", "children", "jsx", "EditorHeader", "title", "subtitle", "onBack", "jsxs", "jsx", "EditorBody", "children", "jsx", "EditorFooter", "onSave", "onPublish", "jsxs", "jsx", "EditorCard", "children", "itemKey", "onMouseEnter", "onMouseLeave", "className", "validated", "jsx", "cn", "DetectionBadge", "found", "jsx", "cn", "_R", "react_default", "_", "k", "useState", "useEffect", "useCallback", "_R", "useRef", "createElement", "_R", "forwardRef", "_R", "_r", "_R", "Fragment", "Suspense", "Children", "Component", "PureComponent", "DismissedSection", "count", "children", "isOpen", "setIsOpen", "useState", "jsxs", "jsx", "GroupHeader", "label", "count", "className", "jsxs", "cn", "jsx", "BeforeAfterToggle", "mode", "onToggle", "jsxs", "jsx", "cn", "EditorInput", "label", "className", "props", "jsxs", "jsx", "cn", "EditorTextarea", "label", "className", "props", "jsxs", "jsx", "cn", "EditorSelect", "label", "className", "children", "props", "jsxs", "jsx", "cn", "EditBackButton", "onClick", "label", "jsx", "EmptyState", "message", "jsx", "toKebabCase", "string", "mergeClasses", "classes", "className", "index", "array", "defaultAttributes", "Icon", "forwardRef", "color", "size", "strokeWidth", "absoluteStrokeWidth", "className", "children", "iconNode", "rest", "ref", "createElement", "defaultAttributes", "mergeClasses", "tag", "attrs", "createLucideIcon", "iconName", "iconNode", "Component", "forwardRef", "className", "props", "ref", "createElement", "Icon", "mergeClasses", "toKebabCase", "FileCode", "createLucideIcon", "Minus", "createLucideIcon", "Palette", "createLucideIcon", "Plus", "createLucideIcon", "Tag", "createLucideIcon", "Type", "createLucideIcon", "_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", "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", "initialConsumed", "allFlat", "targetIdx", "target", "allItems", "activeItems", "dismissedItems", "totalChanges", "_hoveredKey", "setHoveredKey", "foundCount", "handleDismiss", "useCallback", "prev", "next", "handleRestore", "handleCardClick", "handleBackToList", "handleBeforeAfter", "mode", "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", "BeforeAfterToggle", "EditBackButton", "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
+ }
@@ -0,0 +1,11 @@
1
+ function A(...e){return e.filter(Boolean).join(" ")}function Re(){return typeof SynOS<"u"&&SynOS.React||{}}function Qe(e,r,t){var a=Re(),o=r||{},c=o.children;return delete o.children,t!==void 0&&(o.key=t),Array.isArray(c)?a.createElement.apply(null,[e,o].concat(c)):c!==void 0?a.createElement(e,o,c):a.createElement(e,o)}var s=Qe,l=Qe,K=Re().Fragment;function ue({children:e}){return s("div",{className:"se-flex se-flex-col se-h-full se-font-sans",children:e})}function pe({title:e,subtitle:r,onBack:t}){return l("div",{className:"se-p-4 se-border-b se-border-border-primary se-flex se-items-center se-gap-3",children:[s("button",{onClick:t,className:"se-px-3 se-py-1.5 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer hover:se-text-btn-neutral-text-hover",children:"\u2190 Back"}),l("div",{children:[s("h2",{className:"se-m-0 se-text-base se-font-semibold se-text-text-primary",children:e}),r&&s("p",{className:"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary",children:r})]})]})}function fe({children:e}){return s("div",{className:"se-flex-1 se-overflow-auto se-p-6",children:e})}function ge({onSave:e,onPublish:r}){return l("div",{className:"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2",children:[s("button",{onClick:e,className:"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-blue-5/15 se-text-blue-5 se-text-base se-font-semibold se-cursor-pointer",children:"Save Draft"}),s("button",{onClick:r,className:"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-green-4 se-text-white se-text-base se-font-semibold se-cursor-pointer",children:"Publish"})]})}function me({children:e,itemKey:r,onMouseEnter:t,onMouseLeave:a,className:o,validated:c}){return s("div",{"data-item-key":r,onMouseEnter:t,onMouseLeave:a,className:A("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",c?"se-border-green-4/40 se-shadow-glow-green":"se-border-border-primary",o),children:e})}function be({found:e}){return s("span",{className:A("se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block",e?"se-bg-green-4":"se-bg-text-tertiary"),title:e?"Found on this page":"Not found on this page"})}function B(){return typeof SynOS<"u"&&SynOS.React||{}}var Y=new Proxy({},{get:function(e,r){return B()[r]}});function C(){return B().useState.apply(null,arguments)}function _(){return B().useEffect.apply(null,arguments)}function W(){return B().useMemo.apply(null,arguments)}function F(){return B().useCallback.apply(null,arguments)}function Z(){return B().useRef.apply(null,arguments)}function Ie(){return B().useReducer.apply(null,arguments)}var ee=B(),Tt=ee.Fragment,_t=ee.Suspense,Pt=ee.Children,Nt=ee.Component,Dt=ee.PureComponent;function xe({count:e,children:r}){let[t,a]=C(!1);return l("div",{className:"se-mt-4 se-cursor-pointer se-select-none",children:[l("div",{className:"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer",onClick:()=>a(!t),children:[s("span",{children:t?"\u25BE":"\u25B8"}),l("span",{children:["Dismissed (",e,")"]})]}),t&&s("div",{className:"se-mt-1.5",children:r})]})}function ye({label:e,count:r,className:t}){return l("div",{className:A("se-text-xs se-font-bold se-text-text-secondary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between",t),children:[s("span",{children:e}),s("span",{className:"se-text-xs se-text-text-tertiary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg",children:r})]})}function he({mode:e,onToggle:r}){return l("div",{className:"se-flex se-mb-3 se-rounded-lg se-overflow-hidden se-border se-border-border-primary",children:[s("button",{onClick:()=>r("before"),className:A("se-flex-1 se-py-1.5 se-px-3 se-border-none se-text-sm se-font-semibold se-cursor-pointer",e==="before"?"se-bg-blue-5/20 se-text-blue-5":"se-bg-transparent se-text-text-secondary"),children:"Before"}),s("button",{onClick:()=>r("after"),className:A("se-flex-1 se-py-1.5 se-px-3 se-border-none se-border-l se-border-border-primary se-text-sm se-font-semibold se-cursor-pointer",e==="after"?"se-bg-blue-5/20 se-text-blue-5":"se-bg-transparent se-text-text-secondary"),children:"After"})]})}function se({label:e,className:r,...t}){return l("div",{children:[e&&s("label",{className:"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block",children:e}),s("input",{...t,className:A("se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg 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-ring-1 focus:se-ring-input-field-border-selected","disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50",r)})]})}function ke({label:e,className:r,...t}){return l("div",{children:[e&&s("label",{className:"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block",children:e}),s("textarea",{...t,className:A("se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-resize-y se-min-h-[60px] se-box-border","placeholder:se-text-input-field-text-placeholder","focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected","disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50",r)})]})}function ve({onClick:e,label:r="\u2190 List"}){return s("button",{onClick:e,className:"se-py-1.5 se-px-3 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer se-mt-2 hover:se-text-btn-neutral-text-hover",children:r})}function we({message:e}){return s("div",{className:"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm",children:e})}function Ge(e){return!e||Object.keys(e).length===0?"":` (${Object.entries(e).map(([t,a])=>`${t}: ${a}`).join(", ")})`}function V(e){switch(e){case"gte":return"\u2265";case"lte":return"\u2264";case"gt":return">";case"lt":return"<";case"eq":return"=";default:return e}}function Se(e,r){switch(e.type){case"event_count":{let t=e.event,a=e.match,o=e.operator,c=e.count,d=r??0;return{label:`${t}${Ge(a)} ${V(o)} ${c}`,progress:{current:d,target:c,operator:o}}}case"page_url":return{label:`${e.url}`};case"anchor_visible":return{label:`${e.anchorId} (${e.state})`};case"event_occurred":return{label:`${e.eventName}`};case"state_equals":return{label:`${e.key} = ${JSON.stringify(e.value)}`};case"viewport":{let t=[];return e.minWidth!==void 0&&t.push(`w ${V("gte")} ${e.minWidth}px`),e.maxWidth!==void 0&&t.push(`w ${V("lte")} ${e.maxWidth}px`),e.minHeight!==void 0&&t.push(`h ${V("gte")} ${e.minHeight}px`),e.maxHeight!==void 0&&t.push(`h ${V("lte")} ${e.maxHeight}px`),{label:t.join(", ")||"any viewport"}}case"session_metric":return{label:`${e.key} ${V(e.operator)} ${e.threshold}`};case"dismissed":return{label:e.inverted?"not dismissed":"dismissed"};case"cooldown_active":return{label:e.inverted?"cooldown inactive":"cooldown active"};case"frequency_limit":return{label:`shown ${V(e.inverted?"lt":"gte")} ${e.limit} times`};default:return{label:`${e.type}`}}}function qe({current:e,target:r}){let t=Math.min(100,Math.round(e/Math.max(r,1)*100));return s("span",{className:"se-inline-block se-w-12 se-h-1.5 se-rounded-full se-bg-white/10 se-align-middle se-ml-1",title:`${e}/${r} (${t}%)`,children:s("span",{className:A("se-block se-h-full se-rounded-full se-transition-all",t>=100?"se-bg-green-4":"se-bg-blue-4"),style:{width:`${t}%`}})})}function Ue({cs:e}){return l("div",{className:"se-flex se-items-center se-gap-1 se-pl-3 se-text-[10px] se-text-slate-grey-8",children:[s("span",{className:e.passed?"se-text-green-4":"se-text-red-4",children:e.passed?"\u2713":"\u2717"}),l("span",{children:[e.type,":"]}),s("span",{className:"se-text-slate-grey-7",children:e.formatted.label}),e.formatted.progress&&l(K,{children:[s(qe,{current:e.formatted.progress.current,target:e.formatted.progress.target}),l("span",{className:"se-text-slate-grey-7 se-ml-0.5",children:[e.formatted.progress.current,"/",e.formatted.progress.target]})]})]})}function Ae({status:e}){let[r,t]=C(!1);if(!e)return null;let{visible:a,conditions:o}=e,c=o.filter(m=>m.passed).length,d=o.length,u=a?"\u2713":"\u23F3",f=a?"se-text-green-4":"se-text-yellow-5";if(d===1){let m=o[0];return l("div",{className:"se-text-[10px] se-text-slate-grey-8 se-mt-0.5 se-flex se-items-center se-gap-1",children:[s("span",{className:f,children:u}),l("span",{children:[m.type,":"]}),s("span",{className:"se-text-slate-grey-7",children:m.formatted.label}),m.formatted.progress&&l(K,{children:[s(qe,{current:m.formatted.progress.current,target:m.formatted.progress.target}),l("span",{className:"se-text-slate-grey-7 se-ml-0.5",children:[m.formatted.progress.current,"/",m.formatted.progress.target]})]})]})}return l("div",{className:"se-mt-0.5",children:[l("button",{type:"button",className:"se-flex se-items-center se-gap-1 se-text-[10px] se-text-slate-grey-8 se-bg-transparent se-border-none se-cursor-pointer se-p-0 hover:se-text-slate-grey-6",onClick:m=>{m.stopPropagation(),t(!r)},children:[s("span",{className:f,children:u}),l("span",{children:[c," of ",d," conditions met"]}),s("span",{className:"se-text-[8px] se-ml-0.5",children:r?"\u25B2":"\u25BC"})]}),r&&s("div",{className:"se-mt-0.5 se-space-y-0.5",children:o.map((m,k)=>s(Ue,{cs:m},k))})]})}function Te(){return window.SynOS?.handle?.runtime??null}function Xe(e,r){let t=r.context.get(),a=e.type,o=!1,c;switch(a){case"event_count":{if(!r.accumulator)break;let u=e.event,f=e.match,x=e.withinMs,m=r.accumulator.getCount(u,f,x);c=m;let k=e.count;switch(e.operator){case"gte":o=m>=k;break;case"lte":o=m<=k;break;case"eq":o=m===k;break;case"gt":o=m>k;break;case"lt":o=m<k;break}break}case"page_url":{let f=e.url.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,".*").replace(/\*/g,"[^/]*");o=new RegExp(`^${f}$`).test(t.page.url);break}case"route":o=t.page.routeId===e.routeId;break;case"anchor_visible":{let f=t.anchors?.find(x=>x.anchorId===e.anchorId);switch(e.state){case"visible":o=f?.visible===!0;break;case"present":o=f?.present===!0;break;case"absent":o=!f?.present;break}break}case"event_occurred":o=r.events?.hasRecentEvent(e.eventName,e.withinMs??6e4)??!1;break;case"viewport":{let{width:u,height:f}=t.viewport;o=!0,e.minWidth!==void 0&&u<e.minWidth&&(o=!1),e.maxWidth!==void 0&&u>e.maxWidth&&(o=!1),e.minHeight!==void 0&&f<e.minHeight&&(o=!1),e.maxHeight!==void 0&&f>e.maxHeight&&(o=!1);break}case"session_metric":{let u=r.state?.getSessionMetric(e.key)??0,f=e.threshold;switch(e.operator){case"gte":o=u>=f;break;case"lte":o=u<=f;break;case"eq":o=u===f;break;case"gt":o=u>f;break;case"lt":o=u<f;break}break}case"dismissed":o=e.inverted?!(r.state?.isDismissed(e.key)??!1):r.state?.isDismissed(e.key)??!1;break;case"cooldown_active":o=e.inverted?!(r.state?.isCooldownActive(e.key)??!1):r.state?.isCooldownActive(e.key)??!1;break;case"frequency_limit":{let f=(r.state?.getFrequencyCount(e.key)??0)>=e.limit;o=e.inverted?!f:f;break}}let d=Se(e,c);return{passed:o,cs:{type:a,passed:o,formatted:d}}}function Je(e,r){if(e.type!=="rules"||!e.rules?.length)return{visible:!!e.default,isFallback:!0,conditions:[]};let t=[];for(let a of e.rules){let o=!0;for(let c of a.conditions){let{passed:d,cs:u}=Xe(c,r);t.push(u),d||(o=!1)}if(o)return{visible:a.value,isFallback:!1,conditions:t}}return{visible:e.default??!1,isFallback:!0,conditions:t}}function Ce(e){let[r,t]=C(new Map),a=Z(e);a.current=e;let o=F(()=>{let c=Te();if(!c)return;let d=new Map;for(let u of a.current)u.showWhen?d.set(u.id,Je(u.showWhen,c)):d.set(u.id,null);t(d)},[]);return _(()=>{o();let c=Te(),d=[];c?.accumulator&&d.push(c.accumulator.subscribe(o));let u=setInterval(o,2e3);return()=>{d.forEach(f=>f()),clearInterval(u)}},[o]),r}function _e(e,r){return e.length<=r?e:`${e.slice(0,r).trimEnd()}...`}function Ye(e){return e.replace(/<[^>]*>/g,"").trim()}function Ze(e){return typeof e=="string"?e:e.type==="rich"?Ye(e.html):e.content.replace(/[*_#`]/g,"").trim()}function et(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function Pe(e){if(!e||!et(e))return"All pages";let r=[],t=[];for(let o of e.rules)for(let c of o.conditions)c.type==="page_url"&&typeof c.url=="string"&&r.push(c.url),c.type==="anchor_visible"&&typeof c.anchorId=="string"&&t.push(c.anchorId);let a=[];return r.length>0&&a.push(r[0]),t.length>0&&a.push(t[0]),a.length>0?a.join(" \xB7 "):"All pages"}function Ne(e){let r=_e(e.config.question,50),t=_e(Ze(e.config.answer),40);return`Q: "${r}" \u2014 ${t}`}function G(e){return e.kind.startsWith("faq:")}function tt(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function Ee(e){if(!e||!tt(e))return{pagePatterns:[],anchorSelectors:[],hasTargeting:!1};let r=new Set,t=new Set;for(let o of e.rules)for(let c of o.conditions){let d=c;d.type==="page_url"&&typeof d.url=="string"?r.add(d.url):d.type==="anchor_visible"&&typeof d.anchorId=="string"&&t.add(d.anchorId)}let a=r.size>0||t.size>0;return{pagePatterns:[...r],anchorSelectors:[...t],hasTargeting:a}}function rt(e){return Ee(e).pagePatterns[0]||null}function nt(e){return Ee(e).anchorSelectors[0]||null}function ot(e){return typeof e=="string"?e:e.type==="rich"?e.html:e.content}function st(e){return(e.actions||[]).filter(G).map((t,a)=>({key:String(a),index:a,summary:Ne(t),trigger:Pe(t.showWhen),rationale:t.rationale,firstAnchor:nt(t.showWhen),question:t}))}function De(e,r){let t=(e.actions||[]).filter(G);return{...e,actions:t.filter((a,o)=>!r.has(String(o)))}}function at(e,r){let[t,a]=C(new Map),o=Z(e);return o.current=e,_(()=>{let c=()=>{let u=new Map,f=r();for(let x of o.current){let m=Ee(x.question.showWhen),k=!0;m.pagePatterns.length>0&&(k=m.pagePatterns.some(E=>new RegExp(`^${E.replace(/\*\*/g,".*").replace(/(?<!\.)(\*)/g,"[^/]*")}$`).test(f)));let I=!1,v=null;if(x.firstAnchor)try{v=document.querySelector(x.firstAnchor),I=v!==null}catch{}else I=k;u.set(x.key,{found:k&&I,element:v})}a(u)};c();let d=setInterval(c,2e3);return window.addEventListener("popstate",c),()=>{clearInterval(d),window.removeEventListener("popstate",c)}},[r]),t}function it({config:e,onChange:r,editor:t}){let a=e,[o,c]=C(()=>t.getDismissedKeys?.()??new Set),[d,u]=C(null),[f,x]=C("after"),[m,k]=C(null);_(()=>{t.setDismissedKeys?.(o)},[o,t]);let I=Z(!1);_(()=>{I.current||(I.current=!0,t.initialEditKey!=null&&u(String(t.initialEditKey)),t.clearInitialState?.())},[t]);let v=st(a),E=v.filter(i=>!o.has(i.key)),$=v.filter(i=>o.has(i.key)),O=E.length,H=at(v,t.getCurrentRoute),ae=E.filter(i=>H.get(i.key)?.found).length,ie=Y.useMemo(()=>v.map(i=>({id:i.key,showWhen:i.question.showWhen})),[v]),oe=Ce(ie),ce=F(i=>{c(S=>{let y=new Set(S);return y.add(i),y}),d===i&&u(null)},[d]),le=F(i=>{c(S=>{let y=new Set(S);return y.delete(i),y})},[]),de=F(i=>{u(i.key)},[]),J=F(i=>{let S=rt(i.question.showWhen);S&&t.navigateTo(S),i.firstAnchor&&t.highlightElement(i.firstAnchor)},[t]),p=F(()=>{u(null),x("after"),t.previewConfig(e),t.clearHighlight()},[t,e]),g=F(i=>{if(x(i),i==="before"){let S=De(a,new Set([d]));t.previewConfig(S)}else t.previewConfig(e)},[a,d,t,e]),b=F((i,S,y)=>{let j=(a.actions||[]).filter(G).slice(),P={...j[i],config:{...j[i].config}};P.config[S]=y,j[i]=P;let ze=(a.actions||[]).filter(Ve=>!G(Ve)),Ke={...a,actions:[...ze,...j]};r(Ke),t.setDirty(!0)},[a,r,t]),q=F(()=>{if(o.size>0){let i=De(a,o);r(i)}t.publish()},[o,a,r,t]),w=F(i=>{k(i.key),i.firstAnchor&&t.highlightElement(i.firstAnchor)},[t]),z=F(()=>{k(null),t.clearHighlight()},[t]),L=i=>{let y=(a.actions||[]).filter(G)[i];if(!y)return null;let j=v.find(P=>P.key===String(i));return l("div",{className:"se-py-1",children:[j&&j.trigger!=="All pages"&&l("div",{"data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1",onClick:()=>J(j),children:[s("span",{children:"\u{1F4CD}"}),s("span",{children:j.trigger})]}),s(se,{label:"Question",value:y.config.question,onChange:P=>b(i,"question",P.target.value)}),s(ke,{label:"Answer",value:ot(y.config.answer),onChange:P=>b(i,"answer",P.target.value)}),s(se,{label:"Category",value:y.config.category||"",onChange:P=>b(i,"category",P.target.value||void 0),placeholder:"e.g., Billing, Account"}),l("div",{children:[s("label",{className:"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block",children:"AI Rationale"}),s("div",{className:"se-p-2 se-rounded se-border se-border-dashed se-border-white/15 se-bg-white/[0.02] se-text-slate-grey-8 se-text-xs se-mb-2",children:y.rationale?y.rationale.why:"N/A"})]})]})};return l(ue,{children:[s(pe,{title:"Review Questions",subtitle:`${O} question${O!==1?"s":""}${O>0?` (${ae} found on this page)`:""}`,onBack:()=>t.navigateHome()}),s(fe,{children:d!==null?(()=>{let i=Number(d),S=v.find(y=>y.key===d);return l(K,{children:[l("div",{className:"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10",children:[s("span",{children:"\u2753"}),s("span",{children:S?.summary})]}),s(he,{mode:f,onToggle:g}),L(i),s(ve,{onClick:p})]})})():l(K,{children:[v.length===0&&s(we,{message:"No FAQ questions configured."}),E.length>0&&l(K,{children:[s(ye,{label:"FAQ",count:E.length}),E.map(i=>{let S=H.get(i.key);return l(me,{itemKey:i.key,onMouseEnter:()=>w(i),onMouseLeave:z,children:[i.trigger!=="All pages"&&l("div",{"data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1",onClick:y=>{y.stopPropagation(),J(i)},children:[s("span",{children:"\u{1F4CD}"}),s("span",{children:i.trigger})]}),l("div",{"data-card-body":!0,className:"se-flex se-items-center se-gap-2 se-cursor-pointer",onClick:()=>de(i),children:[s(be,{found:S?.found??!1}),s("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap",children:i.summary}),s("button",{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",onClick:y=>{y.stopPropagation(),ce(i.key)},title:"Dismiss this question",children:"\xD7"})]}),l("div",{className:"se-text-[10px] se-text-slate-grey-7 se-mt-1",children:["WHY: ",i.rationale?i.rationale.why:"N/A"]}),s(Ae,{status:oe.get(i.key)??null})]},i.key)})]}),$.length>0&&s(xe,{count:$.length,children:$.map(i=>l("div",{className:"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60",children:[s("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through",children:i.summary}),s("button",{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",onClick:S=>{S.stopPropagation(),le(i.key)},children:"Restore"})]},i.key))})]})}),s(ge,{onSave:()=>t.save(),onPublish:q})]})}var Me={title:"FAQ",icon:"\u2753",description:"FAQ accordion with per-item visibility"};var He=it;function je(e,r,t){if(r){let a=e.getState().items.find(o=>o.config.id===r);if(a)return a}if(t){let a=e.findByQuestion(t);if(a)return a}throw new Error("FAQ item not found")}async function ct(e,r,t){let a=je(t,e.itemId,e.itemQuestion),{id:o}=a.config;e.expand!==!1&&t.expand(o);let c=document.querySelector(`[data-faq-item-id="${o}"]`);return c&&c.scrollIntoView({behavior:e.behavior??"smooth"}),r.publishEvent("faq:scroll_to",{itemId:o}),{cleanup:()=>{}}}async function lt(e,r,t){let a=je(t,e.itemId,e.itemQuestion),{id:o}=a.config,c=e.state??"toggle",d;switch(c){case"open":t.expand(o),d="open";break;case"closed":t.collapse(o),d="closed";break;default:{let u=t.getState().expandedItems.has(o);t.toggle(o),d=u?"closed":"open";break}}return r.publishEvent("faq:toggle",{itemId:o,newState:d}),{cleanup:()=>{}}}async function dt(e,r,t){switch(e.operation){case"add":{let a=e.items??[],o=e.position==="prepend"?"prepend":"append";t.addItems(a,o);break}case"remove":{if(!e.itemId)throw new Error("FAQ item not found");if(!t.getState().items.some(o=>o.config.id===e.itemId))throw new Error("FAQ item not found");t.removeItem(e.itemId);break}case"reorder":{let a=e.order??[];t.reorderItems(a);break}case"replace":{let a=e.items??[];t.replaceItems(a);break}}return r.publishEvent("faq:update",{operation:e.operation}),{cleanup:()=>{}}}var $e=[{kind:"faq:scroll_to",executor:ct},{kind:"faq:toggle_item",executor:lt},{kind:"faq:update",executor:dt}];var N={white:"#ffffff",black:"#000000"},T={0:"#2c0b0a",1:"#5b1715",2:"#89221f",3:"#b72e2a",4:"#d44844",5:"#dd6d69",6:"#e5918f",7:"#eeb6b4",8:"#f6dada",9:"#faebea"},n={0:"#07080a",1:"#0f1318",2:"#0e1114",3:"#1c222a",4:"#2b333f",5:"#394454",6:"#475569",7:"#677384",8:"#87919f",9:"#a8afba",10:"#cbd0d7",11:"#e8eaee",12:"#f6f7f9"},h={0:"#07230a",1:"#0e4514",2:"#16681e",3:"#1d8a28",4:"#24ad32",5:"#4fbd5a",6:"#7acd82",7:"#a5deab",8:"#d0eed3",9:"#e5f6e7"},D={0:"#301f09",1:"#5f3e12",2:"#8f5e1b",3:"#be7d24",4:"#ee9c2d",5:"#f1b057",6:"#f5c481",7:"#f8d7ab",8:"#fcebd5",9:"#fdf5ea"},Q={0:"#330707",1:"#660f0e",2:"#991616",3:"#cc1e1d",4:"#ff2524",5:"#ff5150",6:"#ff7c7c",7:"#ffa8a7",8:"#ffd3d3",9:"#ffe9e9"},te={0:"#051533",1:"#0a2a66",2:"#0f3f98",3:"#1454cb",4:"#1969fe",5:"#4787fe",6:"#75a5fe",7:"#a3c3ff",8:"#d1e1ff",9:"#e8f0ff"},re={0:"#662500",1:"#993d00",2:"#cc5800",3:"#ff7700",4:"#fea85d",5:"#fec58f",6:"#ffd6ae",7:"#fee6cd",8:"#fff1e1",9:"#fff8f0"},M={0:"#151229",1:"#2a2452",2:"#40357c",3:"#5547a5",4:"#6a59ce",5:"#887ad8",6:"#a69be2",7:"#c3bdeb",8:"#e1def5",9:"#f0eefa"},ne={0:"#37091f",1:"#69123c",2:"#9b1c58",3:"#cd2575",4:"#ff2e92",5:"#ff58a8",6:"#ff82be",7:"#ffabd3",8:"#ffd5e9",9:"#ffeaf4"};var Wr={primary:n[10],secondary:n[9],tertiary:n[8]},Or={primary:n[2],secondary:n[0]},zr={primary:n[4],secondary:n[3]},Kr={primary:{text:N.white,icon:N.white,border:T[3],backgroundDefault:T[3],backgroundHover:T[2]},neutral:{text:n[10],textHover:N.white,icon:n[10],iconHover:N.white,border:n[4],background:n[2]},link:{text:N.white,icon:N.white,hover:T[5]},error:{text:Q[5],hover:Q[6]},success:{text:h[5],hover:h[6]}},Vr={slateGrey:{content:n[10],pillOutline:n[10],borderPrimary:n[5],borderSecondary:n[5],background:n[3]},brand:{content:T[9],pillOutline:T[9],borderPrimary:T[6],borderSecondary:T[6],background:T[0]},red:{content:Q[8],pillOutline:Q[4],borderPrimary:Q[2],borderSecondary:Q[2],background:Q[0]},yellow:{content:D[8],pillOutline:D[4],borderPrimary:D[2],borderSecondary:D[2],background:D[0]},green:{content:h[8],pillOutline:h[4],borderPrimary:h[2],borderSecondary:h[2],background:h[0]},purple:{content:M[8],pillOutline:M[4],borderPrimary:M[2],borderSecondary:M[2],background:M[0]},blue:{content:te[8],pillOutline:te[4],borderPrimary:te[2],borderSecondary:te[2],background:te[0]},orange:{content:re[8],pillOutline:re[4],borderPrimary:re[2],borderSecondary:re[2],background:re[0]},pink:{content:ne[8],pillOutline:ne[4],borderPrimary:ne[2],borderSecondary:ne[2],background:ne[0]}},Gr={green:{content:h[8],border:h[2],background:h[0]},yellow:{content:D[8],border:D[2],background:D[0]},red:{content:Q[8],border:Q[2],background:Q[0]}},Ur={green:{content:h[1],background:h[9]},yellow:{content:D[1],background:D[9]},red:{content:Q[1],background:Q[9]}},Xr={content:n[10],border:n[4],background:"#1c2124"},Jr={backgroundDefault:n[2],backgroundHover:n[1],selected:n[3]},Yr={background:n[2],icon:n[10],borderDefault:n[4],borderSelected:T[3],textLabel:n[9],textPlaceholder:n[8],textHint:n[8]},Zr={backgroundDefault:n[2],backgroundDisabled:n[0],textLabel:n[9],textPlaceholder:n[8],textHint:n[8],textError:Q[5],iconDefault:n[9],iconPlaceholder:n[10],iconError:Q[5],borderDefault:n[4],borderSelected:T[3],borderError:Q[5]},en={handleDefault:N.white,handleDisabled:n[10],off:{backgroundDefault:n[4],backgroundHover:n[5],backgroundDisabled:n[4]},on:{backgroundDefault:h[3],backgroundHover:h[2],backgroundDisabled:n[4]}},tn={off:{backgroundDefault:"#00000000",backgroundHover:n[5],backgroundDisabled:n[2],border:n[6]},on:{backgroundDefault:h[0],backgroundHover:h[1],backgroundDisabled:n[2],border:h[3]}},rn={content:n[10],background:n[4]},nn={background:n[4],active:h[3]},on={background:n[1],content:n[9],border:n[4]},sn={backgroundDefault:n[1],backgroundHover:n[3],backgroundActive:n[4],border:n[4],contentPrimary:n[10],contentSecondary:n[9],contentTertiary:n[8]},an={background:n[1],content:n[9],border:n[4]},cn={activeBackground:n[3],activeContent:T[5],inactiveContent:n[9],border:n[4]},ln={header:{textDefault:n[9],textHover:n[8],backgroundDefault:n[1]},border:n[4],cell:{textPrimary:n[10],textSecondary:n[9],backgroundDefault:n[2],backgroundHover:n[1]}},dn={textPrimaryDefault:n[10],textPrimaryHover:n[10],textSecondaryDefault:n[8],textSecondaryHover:n[9],iconPrimary:n[10],iconSecondary:n[8]},un={background:h[1],active:h[5]},pn={textDefault:n[10],textSelected:N.white,textDisabled:n[7],backgroundDefault:n[2],backgroundMiddle:n[3],backgroundSelected:T[3],border:n[4]},fn=n[9];function Le(){return typeof SynOS<"u"&&SynOS.ReactDOM||{}}var hn=new Proxy({},{get:function(e,r){return Le()[r]}});function Fe(){return Le().createRoot.apply(null,arguments)}function Be(e){return typeof e=="string"?e:e.type==="rich"?e.html:e.content}function ut(e){return typeof e=="string"?s("p",{style:{margin:0},children:e}):e.type==="rich"?s("div",{style:{margin:0},dangerouslySetInnerHTML:{__html:e.html}}):s("p",{style:{margin:0},children:e.content})}function pt(e){return e?e===!0?{style:"thumbs"}:e:null}function ft(e){return e.prompt||"Was this helpful?"}var R={container:{fontFamily:"system-ui, -apple-system, sans-serif",maxWidth:"800px",margin:"0 auto"},searchWrapper:{marginBottom:"16px"},searchInput:{width:"100%",padding:"12px 16px",borderRadius:"8px",fontSize:"14px",outline:"none",transition:"border-color 0.15s ease"},accordion:{display:"flex",flexDirection:"column",gap:"8px"},item:{borderRadius:"8px",overflow:"hidden",transition:"box-shadow 0.15s ease"},question:{width:"100%",padding:"16px 20px",display:"flex",alignItems:"center",justifyContent:"space-between",border:"none",cursor:"pointer",fontSize:"15px",fontWeight:500,textAlign:"left",transition:"background-color 0.15s ease"},chevron:{fontSize:"18px",transition:"transform 0.2s ease"},answer:{padding:"0 20px 16px 20px",fontSize:"14px",lineHeight:1.6,overflow:"hidden",transition:"max-height 0.2s ease, padding 0.2s ease"},category:{display:"inline-block",fontSize:"11px",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.05em",padding:"4px 8px",borderRadius:"4px",marginBottom:"8px"},categoryHeader:{fontSize:"13px",fontWeight:700,textTransform:"uppercase",letterSpacing:"0.05em",padding:"12px 4px 6px 4px",marginTop:"8px"},feedback:{display:"flex",alignItems:"center",gap:"8px",marginTop:"12px",paddingTop:"10px",borderTop:"1px solid rgba(0, 0, 0, 0.08)",fontSize:"13px"},feedbackButton:{background:"none",border:"1px solid transparent",cursor:"pointer",fontSize:"16px",padding:"4px 8px",borderRadius:"4px",transition:"background-color 0.15s ease, border-color 0.15s ease"},feedbackButtonSelected:{borderColor:"rgba(0, 0, 0, 0.2)",backgroundColor:"rgba(0, 0, 0, 0.04)"},emptyState:{textAlign:"center",padding:"48px 24px",fontSize:"14px"},noResults:{textAlign:"center",padding:"32px 16px",fontSize:"14px"}},U={light:{container:{backgroundColor:N.white,color:n[1]},searchInput:{backgroundColor:n[12],border:`1px solid ${n[11]}`,color:n[1]},item:{backgroundColor:n[12],border:`1px solid ${n[11]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.08)"},question:{backgroundColor:"transparent",color:n[1]},questionHover:{backgroundColor:n[12]},answer:{color:n[6]},category:{backgroundColor:M[8],color:M[2]},categoryHeader:{color:n[7]},emptyState:{color:n[8]},feedbackPrompt:{color:n[7]}},dark:{container:{backgroundColor:n[1],color:n[12]},searchInput:{backgroundColor:n[3],border:`1px solid ${n[5]}`,color:n[12]},item:{backgroundColor:n[3],border:`1px solid ${n[5]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.3)"},question:{backgroundColor:"transparent",color:n[12]},questionHover:{backgroundColor:n[5]},answer:{color:n[8]},category:{backgroundColor:M[0],color:M[6]},categoryHeader:{color:n[8]},emptyState:{color:n[7]},feedbackPrompt:{color:n[8]}}};function gt({item:e,isExpanded:r,onToggle:t,theme:a,feedbackConfig:o,feedbackValue:c,onFeedback:d}){let[u,f]=C(!1),x=U[a],{question:m,answer:k}=e.config,I={...R.item,...x.item,...r?x.itemExpanded:{}},v={...R.question,...x.question,...u?x.questionHover:{}},E={...R.chevron,transform:r?"rotate(180deg)":"rotate(0deg)"},$={...R.answer,...x.answer,maxHeight:r?"500px":"0",paddingBottom:r?"16px":"0"},O={...R.feedback,...x.feedbackPrompt};return l("div",{style:I,"data-faq-item-id":e.config.id,children:[l("button",{style:v,onClick:t,onMouseEnter:()=>f(!0),onMouseLeave:()=>f(!1),"aria-expanded":r,children:[s("span",{children:m}),s("span",{style:E,children:"\u25BC"})]}),l("div",{style:$,"aria-hidden":!r,children:[ut(k),r&&o&&l("div",{style:O,children:[s("span",{children:ft(o)}),s("button",{style:{...R.feedbackButton,...c==="up"?R.feedbackButtonSelected:{}},"aria-label":"Thumbs up",onClick:()=>d(e.config.id,m,"up"),children:"\u{1F44D}"}),s("button",{style:{...R.feedbackButton,...c==="down"?R.feedbackButtonSelected:{}},"aria-label":"Thumbs down",onClick:()=>d(e.config.id,m,"down"),children:"\u{1F44E}"})]})]})]})}function mt({config:e,runtime:r,instanceId:t}){let[a,o]=Ie(p=>p+1,0),[c,d]=C(new Set),[u,f]=C(""),[x,m]=C(new Map),k=W(()=>pt(e.feedback),[e.feedback]);_(()=>r.context.subscribe(()=>{o()}),[r.context]),_(()=>{if(r.accumulator?.subscribe)return r.accumulator.subscribe(()=>{o()})},[r.accumulator]),_(()=>{if(!e.scope||!r.accumulator?.register)return;let{events:p,urlContains:g,props:b}=e.scope,q=new Set;for(let w of e.actions)if(w.showWhen?.type==="rules")for(let z of w.showWhen.rules)for(let L of z.conditions)L.type==="event_count"&&L.key&&q.add(L.key);for(let w of q)r.accumulator.register(w,z=>{if(!p.includes(z.name)||g&&!String(z.props?.pathname??"").includes(g))return!1;if(b){for(let[L,i]of Object.entries(b))if(z.props?.[L]!==i)return!1}return!0})},[e.scope,e.actions,r.accumulator]),_(()=>{if(!r.events.subscribe)return;if(r.events.getRecent){let b=r.events.getRecent({patterns:["^action\\.tooltip_cta_clicked$","^action\\.modal_cta_clicked$"]},10).filter(q=>{let w=q.props?.actionId;return typeof w=="string"&&w.startsWith("faq:open:")}).pop();if(b&&Date.now()-b.ts<1e4){let q=b.props.actionId.replace("faq:open:","");d(new Set([q])),requestAnimationFrame(()=>{let w=document.querySelector(`[data-faq-item-id="${q}"]`);w&&w.scrollIntoView({behavior:"smooth",block:"center"})})}}return r.events.subscribe({patterns:["^action\\.tooltip_cta_clicked$","^action\\.modal_cta_clicked$"]},g=>{let b=g.props?.actionId;if(typeof b!="string"||!b.startsWith("faq:open:"))return;let q=b.replace("faq:open:","");d(new Set([q])),requestAnimationFrame(()=>{let w=document.querySelector(`[data-faq-item-id="${q}"]`);w&&w.scrollIntoView({behavior:"smooth",block:"center"})}),r.events.publish("canvas.requestOpen")})},[r]);let I=W(()=>e.actions.filter(p=>p.showWhen?r.evaluateSync(p.showWhen).value:!0),[e.actions,r,a]),v=W(()=>e.ordering==="priority"?[...I].sort((p,g)=>(g.config.priority??0)-(p.config.priority??0)):I,[I,e.ordering]),E=W(()=>{if(!e.searchable||!u.trim())return v;let p=u.toLowerCase();return v.filter(g=>g.config.question.toLowerCase().includes(p)||Be(g.config.answer).toLowerCase().includes(p)||g.config.category?.toLowerCase().includes(p))},[v,u,e.searchable]),$=W(()=>{let p=new Map;for(let g of E){let b=g.config.category;p.has(b)||p.set(b,[]),p.get(b).push(g)}return p},[E]),O=W(()=>E.some(p=>p.config.category),[E]),H=W(()=>e.theme!=="auto"?e.theme:typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",[e.theme]),ae=F(p=>{d(g=>{let b=new Set(g);return e.expandBehavior==="single"?g.has(p)?new Set:new Set([p]):(g.has(p)?b.delete(p):b.add(p),b)}),r.events.publish("faq:toggled",{instanceId:t,questionId:p,expanded:!c.has(p),timestamp:Date.now()})},[e.expandBehavior,r.events,t,c]),ie=F((p,g,b)=>{m(q=>{let w=new Map(q);return w.set(p,b),w}),r.events.publish("faq:feedback",{itemId:p,question:g,value:b})},[r.events]),oe={...R.container,...U[H].container},ce={...R.searchInput,...U[H].searchInput},le={...R.emptyState,...U[H].emptyState},de={...R.categoryHeader,...U[H].categoryHeader},J=p=>p.map(g=>s(gt,{item:g,isExpanded:c.has(g.config.id),onToggle:()=>ae(g.config.id),theme:H,feedbackConfig:k,feedbackValue:x.get(g.config.id),onFeedback:ie},g.config.id));return I.length===0?s("div",{style:oe,"data-adaptive-id":t,"data-adaptive-type":"adaptive-faq",children:s("div",{style:le,children:"No FAQ questions available."})}):l("div",{style:oe,"data-adaptive-id":t,"data-adaptive-type":"adaptive-faq",children:[e.searchable&&s("div",{style:R.searchWrapper,children:s("input",{type:"text",placeholder:"Search questions...",value:u,onChange:p=>f(p.target.value),style:ce})}),s("div",{style:R.accordion,children:O?Array.from($.entries()).map(([p,g])=>l(Y.Fragment,{children:[p&&s("div",{style:de,"data-category-header":p,children:p}),J(g)]},p??"__ungrouped")):J(E)}),e.searchable&&E.length===0&&u&&l("div",{style:{...R.noResults,...U[H].emptyState},children:['No questions found matching "',u,'"']})]})}var We={mount(e,r){let{runtime:t,instanceId:a="faq-widget",...o}=r||{expandBehavior:"single",searchable:!1,theme:"auto",actions:[]};if(t&&typeof Fe=="function"){let d=Fe(e);return d.render(Y.createElement(mt,{config:o,runtime:t,instanceId:a})),()=>{d.unmount()}}let c=o.actions||[];return e.innerHTML=`
2
+ <div style="font-family: system-ui; max-width: 800px;">
3
+ ${c.map(d=>`
4
+ <div style="margin-bottom: 8px; padding: 16px; background: ${n[12]}; border-radius: 8px;">
5
+ <strong>${d.config.question}</strong>
6
+ <p style="margin-top: 8px; color: ${n[6]};">${Be(d.config.answer)}</p>
7
+ </div>
8
+ `).join("")}
9
+ </div>
10
+ `,()=>{e.innerHTML=""}}};var X={id:"adaptive-faq",version:"2.0.0",name:"FAQ Accordion",description:"Collapsible Q&A accordion with actions, rich content, feedback, and personalization",executors:$e,widgets:[{id:"adaptive-faq:accordion",component:We,metadata:{name:"FAQ Accordion",description:"Collapsible Q&A accordion with search, categories, and feedback",icon:"\u2753"}}]};var Oe={id:"adaptive-faq",version:X.version,name:X.name,description:X.description,runtime:{actions:X.executors,widgets:X.widgets,notifyWatchers(e){return(e.actions??[]).filter(t=>t.notify&&t.showWhen).map(t=>({id:`faq:${t.config.id}`,strategy:t.showWhen,eventName:"faq:question_revealed",eventProps:{questionId:t.config.id,question:t.config.question,title:t.notify.title,body:t.notify.body,icon:t.notify.icon}}))}},editor:{component:He,panel:Me,getActionLabel(e){return(e.config||{}).question||e.kind||"faq:update"}},metadata:{isBuiltIn:!1}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(Oe)}var Tn=Oe;export{Tn as default,Oe as manifest};
11
+ //# sourceMappingURL=index.js.map