@syntrologie/runtime-sdk 0.2.21 → 1.0.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 (324) hide show
  1. package/CAPABILITIES.md +944 -440
  2. package/README.md +395 -66
  3. package/dist/RuntimeProvider.d.ts +51 -0
  4. package/dist/RuntimeProvider.js +113 -0
  5. package/dist/RuntimeProvider.js.map +1 -0
  6. package/dist/SmartCanvasApp.d.ts +16 -10
  7. package/dist/SmartCanvasApp.js +47 -51
  8. package/dist/SmartCanvasApp.js.map +1 -1
  9. package/dist/SmartCanvasElement.d.ts +5 -5
  10. package/dist/SmartCanvasElement.js +24 -14
  11. package/dist/SmartCanvasElement.js.map +1 -1
  12. package/dist/SmartCanvasPortal.d.ts +2 -2
  13. package/dist/SmartCanvasPortal.js +2 -2
  14. package/dist/SmartCanvasPortal.js.map +1 -1
  15. package/dist/actions/ActionEngine.d.ts +11 -0
  16. package/dist/actions/ActionEngine.js +272 -0
  17. package/dist/actions/ActionEngine.js.map +1 -0
  18. package/dist/actions/executors/index.d.ts +116 -0
  19. package/dist/actions/executors/index.js +240 -0
  20. package/dist/actions/executors/index.js.map +1 -0
  21. package/dist/actions/executors/tour.d.ts +18 -0
  22. package/dist/actions/executors/tour.js +332 -0
  23. package/dist/actions/executors/tour.js.map +1 -0
  24. package/dist/actions/index.d.ts +10 -0
  25. package/dist/actions/index.js +12 -0
  26. package/dist/actions/index.js.map +1 -0
  27. package/dist/actions/types.d.ts +399 -0
  28. package/dist/actions/types.js +8 -0
  29. package/dist/actions/types.js.map +1 -0
  30. package/dist/actions/validation.d.ts +14 -0
  31. package/dist/actions/validation.js +577 -0
  32. package/dist/actions/validation.js.map +1 -0
  33. package/dist/adaptives/adaptive-chatbot/index.js +9 -0
  34. package/dist/adaptives/adaptive-chatbot/index.js.map +7 -0
  35. package/dist/adaptives/adaptive-content/index.js +2 -0
  36. package/dist/adaptives/adaptive-content/index.js.map +7 -0
  37. package/dist/adaptives/adaptive-faq/index.js +11 -0
  38. package/dist/adaptives/adaptive-faq/index.js.map +7 -0
  39. package/dist/adaptives/adaptive-gamification/index.js +2 -0
  40. package/dist/adaptives/adaptive-gamification/index.js.map +7 -0
  41. package/dist/adaptives/adaptive-nav/index.js +11 -0
  42. package/dist/adaptives/adaptive-nav/index.js.map +7 -0
  43. package/dist/adaptives/adaptive-overlays/index.js +91 -0
  44. package/dist/adaptives/adaptive-overlays/index.js.map +7 -0
  45. package/dist/antiFlicker.js +1 -1
  46. package/dist/api.d.ts +40 -26
  47. package/dist/api.js +87 -60
  48. package/dist/api.js.map +1 -1
  49. package/dist/apps/AppContext.d.ts +31 -0
  50. package/dist/apps/AppContext.js +91 -0
  51. package/dist/apps/AppContext.js.map +1 -0
  52. package/dist/apps/AppLoader.d.ts +85 -0
  53. package/dist/apps/AppLoader.js +282 -0
  54. package/dist/apps/AppLoader.js.map +1 -0
  55. package/dist/apps/AppRegistry.d.ts +102 -0
  56. package/dist/apps/AppRegistry.js +317 -0
  57. package/dist/apps/AppRegistry.js.map +1 -0
  58. package/dist/apps/examples/gamification-app.example.d.ts +305 -0
  59. package/dist/apps/examples/gamification-app.example.js +329 -0
  60. package/dist/apps/examples/gamification-app.example.js.map +1 -0
  61. package/dist/apps/index.d.ts +14 -0
  62. package/dist/apps/index.js +16 -0
  63. package/dist/apps/index.js.map +1 -0
  64. package/dist/apps/types.d.ts +231 -0
  65. package/dist/apps/types.js +8 -0
  66. package/dist/apps/types.js.map +1 -0
  67. package/dist/blocks/data/ComparisonBlock.d.ts +1 -1
  68. package/dist/blocks/data/ComparisonBlock.js +40 -40
  69. package/dist/blocks/data/ComparisonBlock.js.map +1 -1
  70. package/dist/blocks/data/StatsBlock.d.ts +1 -1
  71. package/dist/blocks/data/StatsBlock.js +42 -44
  72. package/dist/blocks/data/StatsBlock.js.map +1 -1
  73. package/dist/blocks/data/index.d.ts +2 -2
  74. package/dist/blocks/data/index.js +2 -2
  75. package/dist/blocks/index.d.ts +5 -5
  76. package/dist/blocks/index.js +29 -30
  77. package/dist/blocks/index.js.map +1 -1
  78. package/dist/blocks/interactive/ChecklistBlock.d.ts +1 -1
  79. package/dist/blocks/interactive/ChecklistBlock.js +60 -60
  80. package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
  81. package/dist/blocks/interactive/RatingBlock.d.ts +1 -1
  82. package/dist/blocks/interactive/RatingBlock.js +73 -65
  83. package/dist/blocks/interactive/RatingBlock.js.map +1 -1
  84. package/dist/blocks/interactive/index.d.ts +2 -2
  85. package/dist/blocks/interactive/index.js +2 -2
  86. package/dist/blocks/notification/NotificationBlock.d.ts +2 -2
  87. package/dist/blocks/notification/NotificationBlock.js +68 -64
  88. package/dist/blocks/notification/NotificationBlock.js.map +1 -1
  89. package/dist/blocks/notification/index.d.ts +1 -1
  90. package/dist/blocks/notification/index.js +1 -1
  91. package/dist/bootstrap.d.ts +32 -8
  92. package/dist/bootstrap.js +218 -102
  93. package/dist/bootstrap.js.map +1 -1
  94. package/dist/components/ShadowCanvasOverlay.d.ts +6 -6
  95. package/dist/components/ShadowCanvasOverlay.js +156 -118
  96. package/dist/components/ShadowCanvasOverlay.js.map +1 -1
  97. package/dist/components/TileCard.d.ts +5 -5
  98. package/dist/components/TileCard.js +205 -154
  99. package/dist/components/TileCard.js.map +1 -1
  100. package/dist/components/TileWheel.d.ts +3 -3
  101. package/dist/components/TileWheel.js +29 -7
  102. package/dist/components/TileWheel.js.map +1 -1
  103. package/dist/config-validator.d.ts +49 -0
  104. package/dist/config-validator.js +173 -0
  105. package/dist/config-validator.js.map +1 -0
  106. package/dist/configFetcher.d.ts +7 -3
  107. package/dist/configFetcher.js +70 -29
  108. package/dist/configFetcher.js.map +1 -1
  109. package/dist/context/ContextManager.d.ts +3 -3
  110. package/dist/context/ContextManager.js +19 -18
  111. package/dist/context/ContextManager.js.map +1 -1
  112. package/dist/context/index.d.ts +4 -4
  113. package/dist/context/index.js +3 -3
  114. package/dist/context/schema.d.ts +9 -9
  115. package/dist/context/schema.js +2 -2
  116. package/dist/context/schema.js.map +1 -1
  117. package/dist/decisions/engine.d.ts +5 -5
  118. package/dist/decisions/engine.js +13 -13
  119. package/dist/decisions/engine.js.map +1 -1
  120. package/dist/decisions/index.d.ts +6 -6
  121. package/dist/decisions/index.js +5 -5
  122. package/dist/decisions/schema.d.ts +131 -131
  123. package/dist/decisions/schema.js +21 -21
  124. package/dist/decisions/schema.js.map +1 -1
  125. package/dist/decisions/strategies/rules.d.ts +1 -1
  126. package/dist/decisions/strategies/rules.js +24 -24
  127. package/dist/decisions/strategies/rules.js.map +1 -1
  128. package/dist/decisions/strategies/score.d.ts +1 -1
  129. package/dist/decisions/strategies/score.js +3 -3
  130. package/dist/decisions/types.d.ts +19 -19
  131. package/dist/earlyPatcher.d.ts +8 -20
  132. package/dist/earlyPatcher.js +13 -62
  133. package/dist/earlyPatcher.js.map +1 -1
  134. package/dist/editorLoader.d.ts +19 -7
  135. package/dist/editorLoader.js +154 -97
  136. package/dist/editorLoader.js.map +1 -1
  137. package/dist/events/EventBus.d.ts +3 -3
  138. package/dist/events/EventBus.js +5 -7
  139. package/dist/events/EventBus.js.map +1 -1
  140. package/dist/events/index.d.ts +6 -6
  141. package/dist/events/index.js +5 -5
  142. package/dist/events/normalizers/canvas.d.ts +2 -2
  143. package/dist/events/normalizers/canvas.js +3 -3
  144. package/dist/events/normalizers/canvas.js.map +1 -1
  145. package/dist/events/normalizers/posthog.d.ts +25 -1
  146. package/dist/events/normalizers/posthog.js +35 -27
  147. package/dist/events/normalizers/posthog.js.map +1 -1
  148. package/dist/events/schema.d.ts +13 -13
  149. package/dist/events/schema.js +3 -3
  150. package/dist/events/schema.js.map +1 -1
  151. package/dist/events/types.d.ts +7 -1
  152. package/dist/events/types.js +29 -21
  153. package/dist/events/types.js.map +1 -1
  154. package/dist/experiments/adapters/growthbook.d.ts +5 -4
  155. package/dist/experiments/adapters/growthbook.js +14 -6
  156. package/dist/experiments/adapters/growthbook.js.map +1 -1
  157. package/dist/experiments/index.d.ts +3 -3
  158. package/dist/experiments/index.js +1 -1
  159. package/dist/experiments/registry.d.ts +2 -2
  160. package/dist/experiments/registry.js +2 -2
  161. package/dist/experiments/types.d.ts +10 -1
  162. package/dist/fetchers/cdnFetcher.d.ts +1 -1
  163. package/dist/fetchers/cdnFetcher.js +4 -8
  164. package/dist/fetchers/cdnFetcher.js.map +1 -1
  165. package/dist/fetchers/experimentsFetcher.d.ts +25 -3
  166. package/dist/fetchers/experimentsFetcher.js +55 -8
  167. package/dist/fetchers/experimentsFetcher.js.map +1 -1
  168. package/dist/fetchers/index.d.ts +3 -3
  169. package/dist/fetchers/index.js +2 -2
  170. package/dist/fetchers/index.js.map +1 -1
  171. package/dist/fetchers/mergeConfigs.d.ts +29 -0
  172. package/dist/fetchers/mergeConfigs.js +38 -0
  173. package/dist/fetchers/mergeConfigs.js.map +1 -0
  174. package/dist/fetchers/registry.d.ts +1 -1
  175. package/dist/fetchers/registry.js +4 -4
  176. package/dist/fetchers/types.d.ts +1 -1
  177. package/dist/hooks/useCanvasOverlays.d.ts +8 -5
  178. package/dist/hooks/useCanvasOverlays.js +66 -17
  179. package/dist/hooks/useCanvasOverlays.js.map +1 -1
  180. package/dist/hooks/useHostPatches.d.ts +2 -2
  181. package/dist/hooks/useHostPatches.js +8 -8
  182. package/dist/hooks/useHostPatches.js.map +1 -1
  183. package/dist/hooks/useShadowCanvasConfig.d.ts +5 -9
  184. package/dist/hooks/useShadowCanvasConfig.js +7 -5
  185. package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
  186. package/dist/hostPatcher/core/patcher.d.ts +1 -1
  187. package/dist/hostPatcher/core/patcher.js +18 -9
  188. package/dist/hostPatcher/core/patcher.js.map +1 -1
  189. package/dist/hostPatcher/core/sanitizer.js +24 -3
  190. package/dist/hostPatcher/core/sanitizer.js.map +1 -1
  191. package/dist/hostPatcher/policy/defaultPolicy.js +15 -5
  192. package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
  193. package/dist/hostPatcher/utils/anchors.js +4 -6
  194. package/dist/hostPatcher/utils/anchors.js.map +1 -1
  195. package/dist/index.d.ts +34 -27
  196. package/dist/index.js +51 -24
  197. package/dist/index.js.map +1 -1
  198. package/dist/logger.d.ts +29 -0
  199. package/dist/logger.js +81 -0
  200. package/dist/logger.js.map +1 -0
  201. package/dist/metrics/index.d.ts +1 -1
  202. package/dist/metrics/index.js +1 -1
  203. package/dist/metrics/sessionMetrics.d.ts +1 -1
  204. package/dist/metrics/sessionMetrics.js +6 -6
  205. package/dist/overlays/fetcher.d.ts +2 -2
  206. package/dist/overlays/fetcher.js +13 -15
  207. package/dist/overlays/fetcher.js.map +1 -1
  208. package/dist/overlays/recipeRegistry.js +2 -2
  209. package/dist/overlays/recipeRegistry.js.map +1 -1
  210. package/dist/overlays/runtime/anchor/resolve.js +1 -1
  211. package/dist/overlays/runtime/anchor/resolve.js.map +1 -1
  212. package/dist/overlays/runtime/index.d.ts +7 -7
  213. package/dist/overlays/runtime/index.js +7 -7
  214. package/dist/overlays/runtime/overlay/highlight.js +39 -39
  215. package/dist/overlays/runtime/overlay/highlight.js.map +1 -1
  216. package/dist/overlays/runtime/overlay/modal.js +5 -5
  217. package/dist/overlays/runtime/overlay/modal.js.map +1 -1
  218. package/dist/overlays/runtime/overlay/root.js +1 -1
  219. package/dist/overlays/runtime/overlay/runner.js +88 -28
  220. package/dist/overlays/runtime/overlay/runner.js.map +1 -1
  221. package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
  222. package/dist/overlays/runtime/overlay/tooltip.js +13 -15
  223. package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
  224. package/dist/overlays/runtime/utils/dom.js +4 -1
  225. package/dist/overlays/runtime/utils/dom.js.map +1 -1
  226. package/dist/overlays/schema.d.ts +146 -146
  227. package/dist/overlays/schema.js +12 -8
  228. package/dist/overlays/schema.js.map +1 -1
  229. package/dist/react.d.ts +7 -7
  230. package/dist/react.js +4 -4
  231. package/dist/react.js.map +1 -1
  232. package/dist/render/RenderContext.d.ts +2 -2
  233. package/dist/render/RenderContext.js +5 -5
  234. package/dist/render/RenderContext.js.map +1 -1
  235. package/dist/render/index.d.ts +3 -3
  236. package/dist/render/index.js +1 -1
  237. package/dist/render/types.d.ts +4 -4
  238. package/dist/runtime.d.ts +32 -8
  239. package/dist/runtime.js +109 -13
  240. package/dist/runtime.js.map +1 -1
  241. package/dist/smart-canvas.esm.js +144 -55
  242. package/dist/smart-canvas.esm.js.map +4 -4
  243. package/dist/smart-canvas.js +14688 -11455
  244. package/dist/smart-canvas.js.map +4 -4
  245. package/dist/smart-canvas.min.js +145 -55
  246. package/dist/smart-canvas.min.js.map +4 -4
  247. package/dist/state/StateStore.d.ts +1 -7
  248. package/dist/state/StateStore.js +15 -9
  249. package/dist/state/StateStore.js.map +1 -1
  250. package/dist/state/helpers/cooldowns.d.ts +1 -1
  251. package/dist/state/helpers/cooldowns.js +1 -1
  252. package/dist/state/helpers/dismissals.d.ts +1 -1
  253. package/dist/state/helpers/dismissals.js +1 -1
  254. package/dist/state/helpers/frequency.d.ts +1 -1
  255. package/dist/state/helpers/frequency.js +1 -1
  256. package/dist/state/index.d.ts +4 -4
  257. package/dist/state/index.js +3 -3
  258. package/dist/state/schema.d.ts +1 -1
  259. package/dist/state/schema.js +1 -1
  260. package/dist/store/example.d.ts +1 -0
  261. package/dist/store/example.js +43 -0
  262. package/dist/store/example.js.map +1 -0
  263. package/dist/store/mini-effector.d.ts +46 -0
  264. package/dist/store/mini-effector.js +88 -0
  265. package/dist/store/mini-effector.js.map +1 -0
  266. package/dist/surfaces/Surfaces.d.ts +11 -0
  267. package/dist/surfaces/Surfaces.js +361 -0
  268. package/dist/surfaces/Surfaces.js.map +1 -0
  269. package/dist/surfaces/index.d.ts +9 -0
  270. package/dist/surfaces/index.js +12 -0
  271. package/dist/surfaces/index.js.map +1 -0
  272. package/dist/surfaces/positioning.d.ts +50 -0
  273. package/dist/surfaces/positioning.js +228 -0
  274. package/dist/surfaces/positioning.js.map +1 -0
  275. package/dist/surfaces/types.d.ts +167 -0
  276. package/dist/surfaces/types.js +23 -0
  277. package/dist/surfaces/types.js.map +1 -0
  278. package/dist/telemetry/adapters/noop.d.ts +12 -0
  279. package/dist/telemetry/adapters/noop.js +42 -0
  280. package/dist/telemetry/adapters/noop.js.map +1 -0
  281. package/dist/telemetry/adapters/posthog.d.ts +8 -2
  282. package/dist/telemetry/adapters/posthog.js +36 -14
  283. package/dist/telemetry/adapters/posthog.js.map +1 -1
  284. package/dist/telemetry/index.d.ts +4 -3
  285. package/dist/telemetry/index.js +3 -2
  286. package/dist/telemetry/index.js.map +1 -1
  287. package/dist/telemetry/registry.d.ts +2 -9
  288. package/dist/telemetry/registry.js +4 -2
  289. package/dist/telemetry/registry.js.map +1 -1
  290. package/dist/telemetry/types.d.ts +1 -1
  291. package/dist/theme/ThemeProvider.d.ts +2 -2
  292. package/dist/theme/ThemeProvider.js +21 -21
  293. package/dist/theme/ThemeProvider.js.map +1 -1
  294. package/dist/theme/defaultTheme.d.ts +4 -5
  295. package/dist/theme/defaultTheme.js +127 -118
  296. package/dist/theme/defaultTheme.js.map +1 -1
  297. package/dist/theme/extractHostTheme.d.ts +1 -1
  298. package/dist/theme/extractHostTheme.js +43 -45
  299. package/dist/theme/extractHostTheme.js.map +1 -1
  300. package/dist/theme/index.d.ts +5 -5
  301. package/dist/theme/index.js +3 -3
  302. package/dist/theme/index.js.map +1 -1
  303. package/dist/theme/types.d.ts +2 -2
  304. package/dist/token.d.ts +2 -0
  305. package/dist/token.js +3 -6
  306. package/dist/token.js.map +1 -1
  307. package/dist/types-only.d.ts +32 -0
  308. package/dist/types-only.js +11 -0
  309. package/dist/types-only.js.map +1 -0
  310. package/dist/types.d.ts +89 -56
  311. package/dist/types.js +14 -2
  312. package/dist/types.js.map +1 -1
  313. package/dist/version.d.ts +13 -0
  314. package/dist/version.js +14 -0
  315. package/dist/version.js.map +1 -0
  316. package/dist/widgets/WidgetRegistry.d.ts +145 -0
  317. package/dist/widgets/WidgetRegistry.js +191 -0
  318. package/dist/widgets/WidgetRegistry.js.map +1 -0
  319. package/dist/widgets/index.d.ts +7 -0
  320. package/dist/widgets/index.js +7 -0
  321. package/dist/widgets/index.js.map +1 -0
  322. package/package.json +35 -15
  323. package/schema/canvas-config.schema.json +488 -254
  324. package/schema/runtime-context.schema.json +1 -5
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["shared-react:react", "shared-react:react/jsx-runtime", "../../../../adaptives/adaptive-chatbot/src/editor.tsx", "shared-react:react-dom/client", "../../../../adaptives/adaptive-chatbot/src/actionParser.ts", "../../../../adaptives/adaptive-chatbot/src/apiClient.ts", "../../../../adaptives/adaptive-chatbot/src/useChat.ts", "../../../../adaptives/adaptive-chatbot/src/ChatAssistant.tsx", "../../../../adaptives/adaptive-chatbot/src/runtime.ts", "../../../../adaptives/adaptive-chatbot/src/cdn.ts"],
4
+ "sourcesContent": ["\n var R = globalThis.__SYNTRO_REACT__ || {};\n export default R;\n export var useState = R.useState;\n export var useEffect = R.useEffect;\n export var useMemo = R.useMemo;\n export var useCallback = R.useCallback;\n export var useRef = R.useRef;\n export var useContext = R.useContext;\n export var useReducer = R.useReducer;\n export var createElement = R.createElement;\n export var createContext = R.createContext;\n export var Fragment = R.Fragment;\n export var forwardRef = R.forwardRef;\n export var memo = R.memo;\n export var lazy = R.lazy;\n export var Suspense = R.Suspense;\n export var Children = R.Children;\n export var isValidElement = R.isValidElement;\n export var cloneElement = R.cloneElement;\n export var Component = R.Component;\n export var PureComponent = R.PureComponent;\n export var useLayoutEffect = R.useLayoutEffect;\n export var useId = R.useId;\n ", "\n function _getR() { return globalThis.__SYNTRO_REACT__; }\n function _jsx(type, props, key) {\n var R = _getR();\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 = (_getR() || {}).Fragment;\n ", "/**\n * Adaptive Chatbot - Editor Component\n *\n * Visual editor panel for configuring chatbot tile props.\n */\n\nimport React, { useEffect, useRef } from 'react';\n\nimport type { EditorPanelProps, ChatbotConfig } from './types';\n\n// ============================================================================\n// Editor Styles\n// ============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100%',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n header: {\n padding: '16px',\n borderBottom: '1px solid #334155',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n },\n backButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'rgba(255,255,255,0.05)',\n color: '#94a3b8',\n fontSize: '13px',\n cursor: 'pointer',\n },\n title: {\n margin: 0,\n fontSize: '15px',\n fontWeight: 600,\n color: '#f8fafc',\n },\n subtitle: {\n margin: '2px 0 0 0',\n fontSize: '11px',\n color: '#64748b',\n },\n content: {\n flex: 1,\n overflow: 'auto',\n padding: '16px',\n },\n section: {\n marginBottom: '24px',\n },\n sectionTitle: {\n fontSize: '12px',\n fontWeight: 600,\n color: '#94a3b8',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n marginBottom: '12px',\n },\n inputGroup: {\n marginBottom: '12px',\n },\n inputLabel: {\n display: 'block',\n fontSize: '11px',\n color: '#94a3b8',\n marginBottom: '4px',\n },\n input: {\n width: '100%',\n padding: '10px 12px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.1)',\n backgroundColor: 'rgba(255,255,255,0.05)',\n color: '#f8fafc',\n fontSize: '13px',\n },\n textarea: {\n width: '100%',\n padding: '10px 12px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.1)',\n backgroundColor: 'rgba(255,255,255,0.05)',\n color: '#f8fafc',\n fontSize: '13px',\n minHeight: '60px',\n resize: 'vertical' as const,\n fontFamily: 'inherit',\n },\n footer: {\n padding: '12px 16px',\n borderTop: '1px solid #334155',\n display: 'flex',\n gap: '8px',\n },\n saveButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: 'rgba(59, 130, 246, 0.15)',\n color: '#3b82f6',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n publishButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: '#22c55e',\n color: 'white',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n};\n\n// ============================================================================\n// ChatbotEditor Component\n// ============================================================================\n\nexport function ChatbotEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as Partial<ChatbotConfig>;\n\n // Consume initial navigation payload on mount (chatbot is form-based, no sub-items)\n const initialConsumed = useRef(false);\n useEffect(() => {\n if (!initialConsumed.current && (editor.initialEditKey != null || editor.initialCreate)) {\n initialConsumed.current = true;\n editor.clearInitialState?.();\n }\n }, [editor]);\n\n const handleChange = (field: string, value: string | number) => {\n onChange({ ...config, [field]: value });\n editor.setDirty(true);\n };\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <button onClick={() => editor.navigateHome()} style={styles.backButton}>\n &larr; Back\n </button>\n <div>\n <h2 style={styles.title}>Chat Assistant</h2>\n <p style={styles.subtitle}>Configure AI chat assistant</p>\n </div>\n </div>\n\n {/* Content */}\n <div style={styles.content}>\n {/* API Configuration */}\n <div style={styles.section}>\n <div style={styles.sectionTitle}>API Configuration</div>\n\n <div style={styles.inputGroup}>\n <label style={styles.inputLabel}>Backend URL</label>\n <input\n type=\"text\"\n value={typedConfig.backendUrl || ''}\n onChange={(e) => handleChange('backendUrl', e.target.value)}\n style={styles.input}\n placeholder=\"/api/chat/message\"\n />\n </div>\n\n <div style={styles.inputGroup}>\n <label style={styles.inputLabel}>MLflow Run ID (optional)</label>\n <input\n type=\"text\"\n value={typedConfig.mlflowRunId || ''}\n onChange={(e) => handleChange('mlflowRunId', e.target.value)}\n style={styles.input}\n placeholder=\"e.g., abc123\"\n />\n </div>\n </div>\n\n {/* Chat Settings */}\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Chat Settings</div>\n\n <div style={styles.inputGroup}>\n <label style={styles.inputLabel}>Greeting Message</label>\n <textarea\n value={typedConfig.greeting || ''}\n onChange={(e) => handleChange('greeting', e.target.value)}\n style={styles.textarea}\n placeholder=\"Hi! How can I help?\"\n />\n </div>\n\n <div style={styles.inputGroup}>\n <label style={styles.inputLabel}>Max History (messages sent to backend)</label>\n <input\n type=\"number\"\n value={typedConfig.maxHistory || 20}\n onChange={(e) => handleChange('maxHistory', parseInt(e.target.value, 10))}\n style={styles.input}\n min={1}\n max={100}\n />\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button onClick={() => editor.save()} style={styles.saveButton}>\n Save Draft\n </button>\n <button onClick={() => editor.publish()} style={styles.publishButton}>\n Publish\n </button>\n </div>\n </div>\n );\n}\n\n/**\n * Editor panel configuration for the app registry.\n */\nexport const editorPanel = {\n title: 'Chat Assistant',\n icon: '\uD83D\uDCAC',\n description: 'AI chat assistant with action execution',\n};\n\nexport default ChatbotEditor;\n", "\n var RD = globalThis.__SYNTRO_REACT_DOM__;\n export default RD;\n export var createRoot = RD?.createRoot;\n export var createPortal = RD?.createPortal;\n ", "/**\n * Adaptive Chatbot - Action Parser\n *\n * Extracts JSON action blocks from LLM markdown responses.\n * Actions are identified by having a `kind` field in a ```json code fence.\n */\n\nimport type { ActionBlock, ParsedResponse } from './types';\n\nconst JSON_FENCE_RE = /```json\\s*\\n([\\s\\S]*?)```/g;\n\n/**\n * Parse an LLM response, extracting action blocks from JSON code fences.\n *\n * - Blocks with a `kind` field are treated as actions and removed from display text.\n * - Blocks without `kind` or with invalid JSON are left in the display text.\n */\nexport function parseActions(input: string): ParsedResponse {\n const actions: ActionBlock[] = [];\n let displayText = input;\n\n // Collect matches in reverse order so we can splice display text without index shifting\n const matches: Array<{ fullMatch: string; json: string; index: number }> = [];\n let match: RegExpExecArray | null;\n\n // Reset regex state\n JSON_FENCE_RE.lastIndex = 0;\n while ((match = JSON_FENCE_RE.exec(input)) !== null) {\n matches.push({\n fullMatch: match[0],\n json: match[1],\n index: match.index,\n });\n }\n\n // Process in reverse to preserve indices when removing from displayText\n for (let i = matches.length - 1; i >= 0; i--) {\n const { fullMatch, json } = matches[i];\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n // Malformed JSON \u2014 leave in display text\n continue;\n }\n\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'kind' in parsed &&\n typeof (parsed as Record<string, unknown>).kind === 'string'\n ) {\n actions.unshift(parsed as ActionBlock);\n // Remove the action block from display text\n displayText = displayText.replace(fullMatch, '');\n }\n }\n\n // Clean up extra blank lines left from removed blocks\n displayText = displayText.replace(/\\n{3,}/g, '\\n\\n').trim();\n\n return { displayText, actions };\n}\n", "/**\n * Adaptive Chatbot - API Client\n *\n * Auth-aware fetch client that reads Stytch JWT from cookies\n * and workspace ID from localStorage.\n */\n\nimport type { ChatApiRequest, ChatApiResponse } from './types';\n\nexport class AuthError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'AuthError';\n }\n}\n\n/**\n * Read auth credentials from browser cookie and localStorage.\n * Throws AuthError if credentials are missing.\n */\nexport function getAuthHeaders(): { Authorization: string; 'X-Workspace-Id': string } {\n const cookieMatch = document.cookie.match(/stytch_session_jwt=([^;]*)/);\n if (!cookieMatch || !cookieMatch[1]) {\n throw new AuthError('No authentication token found');\n }\n\n const workspaceId = localStorage.getItem('syntrologie_workspace_id');\n if (!workspaceId) {\n throw new AuthError('No workspace ID found');\n }\n\n return {\n Authorization: `Bearer ${cookieMatch[1]}`,\n 'X-Workspace-Id': workspaceId,\n };\n}\n\n/**\n * Send a chat message to the backend.\n */\nexport async function sendMessage(url: string, request: ChatApiRequest): Promise<ChatApiResponse> {\n const authHeaders = getAuthHeaders();\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new AuthError('Session expired or unauthorized');\n }\n throw new Error(`Chat request failed: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n", "/**\n * Adaptive Chatbot - useChat Hook\n *\n * React hook managing chat message state, API communication,\n * history management, and action execution via the runtime ActionEngine.\n */\n\nimport { useState, useCallback, useRef } from 'react';\n\nimport { parseActions } from './actionParser';\nimport { sendMessage } from './apiClient';\nimport type { ChatMessage, ChatbotWidgetRuntime, BatchActionHandle } from './types';\n\nexport interface UseChatOptions {\n backendUrl: string;\n tileId: string;\n runtime: ChatbotWidgetRuntime;\n greeting?: string;\n maxHistory?: number;\n mlflowRunId?: string;\n config?: Record<string, unknown>;\n}\n\nexport interface UseChatReturn {\n messages: ChatMessage[];\n isLoading: boolean;\n error: string | null;\n sendMessage: (text: string) => Promise<void>;\n clearMessages: () => void;\n}\n\nlet nextId = 0;\nfunction generateId(): string {\n return `msg-${Date.now()}-${++nextId}`;\n}\n\nexport function useChat(options: UseChatOptions): UseChatReturn {\n const { backendUrl, tileId, runtime, greeting, maxHistory = 20, mlflowRunId, config } = options;\n\n const [messages, setMessages] = useState<ChatMessage[]>(() => {\n if (greeting) {\n return [\n {\n id: generateId(),\n role: 'assistant' as const,\n text: greeting,\n timestamp: Date.now(),\n },\n ];\n }\n return [];\n });\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const batchHandleRef = useRef<BatchActionHandle | null>(null);\n\n const send = useCallback(\n async (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n\n setError(null);\n\n const userMessage: ChatMessage = {\n id: generateId(),\n role: 'user',\n text: trimmed,\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n\n try {\n // Build history from current messages + new user message\n const currentMessages = [...messages, userMessage];\n const historySlice = currentMessages.slice(-maxHistory).map((m) => ({\n role: m.role,\n content: m.text,\n }));\n\n const response = await sendMessage(backendUrl, {\n message: trimmed,\n history: historySlice,\n mlflow_run_id: mlflowRunId,\n current_config: config,\n });\n\n // Parse actions from the LLM response\n const { displayText, actions } = parseActions(response.response);\n\n const assistantMessage: ChatMessage = {\n id: generateId(),\n role: 'assistant',\n text: displayText,\n timestamp: Date.now(),\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n\n // Execute actions if present\n if (actions.length > 0) {\n // Revert previous batch\n if (batchHandleRef.current?.isApplied()) {\n await batchHandleRef.current.revertAll();\n }\n\n batchHandleRef.current = await runtime.actions.applyBatch(actions);\n\n runtime.events.publish('chatbot.actions_applied', {\n count: actions.length,\n kinds: actions.map((a) => a.kind),\n tileId,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'An unexpected error occurred';\n setError(message);\n } finally {\n setIsLoading(false);\n }\n },\n [backendUrl, messages, maxHistory, mlflowRunId, config, runtime, tileId]\n );\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setError(null);\n // Revert any active actions\n if (batchHandleRef.current?.isApplied()) {\n batchHandleRef.current.revertAll();\n batchHandleRef.current = null;\n }\n sessionStorage.removeItem(`syntro:chatbot:history:${tileId}`);\n }, [tileId]);\n\n return {\n messages,\n isLoading,\n error,\n sendMessage: send,\n clearMessages,\n };\n}\n", "/**\n * Adaptive Chatbot - ChatAssistant Component\n *\n * Main React component for the AI chat assistant widget.\n * Renders a message list with auto-scroll, loading indicator, and input form.\n */\n\nimport React, { useRef, useEffect } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport type { ChatMessage, ChatbotWidgetRuntime, ChatbotConfig } from './types';\nimport { useChat } from './useChat';\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100%',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n fontSize: '14px',\n },\n messageList: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: '12px',\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '8px',\n },\n messageBubble: {\n maxWidth: '85%',\n padding: '8px 12px',\n borderRadius: '12px',\n lineHeight: 1.5,\n wordBreak: 'break-word' as const,\n },\n userMessage: {\n alignSelf: 'flex-end' as const,\n backgroundColor: '#6366f1',\n color: '#ffffff',\n borderBottomRightRadius: '4px',\n },\n assistantMessage: {\n alignSelf: 'flex-start' as const,\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n color: '#e2e8f0',\n borderBottomLeftRadius: '4px',\n },\n loadingDots: {\n alignSelf: 'flex-start' as const,\n padding: '8px 16px',\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n borderRadius: '12px',\n color: '#94a3b8',\n fontSize: '13px',\n },\n errorBanner: {\n padding: '8px 12px',\n backgroundColor: 'rgba(239, 68, 68, 0.1)',\n color: '#ef4444',\n fontSize: '13px',\n borderRadius: '8px',\n margin: '0 12px',\n },\n inputForm: {\n display: 'flex',\n gap: '8px',\n padding: '12px',\n borderTop: '1px solid rgba(255, 255, 255, 0.06)',\n },\n input: {\n flex: 1,\n padding: '8px 12px',\n borderRadius: '8px',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n color: '#f1f5f9',\n fontSize: '14px',\n outline: 'none',\n fontFamily: 'inherit',\n },\n sendButton: {\n padding: '8px 16px',\n borderRadius: '8px',\n border: 'none',\n backgroundColor: '#6366f1',\n color: '#ffffff',\n fontWeight: 600,\n fontSize: '13px',\n cursor: 'pointer',\n whiteSpace: 'nowrap' as const,\n },\n sendButtonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed' as const,\n },\n};\n\n// ============================================================================\n// MessageBubble Component\n// ============================================================================\n\nfunction MessageBubble({ message }: { message: ChatMessage }) {\n const isUser = message.role === 'user';\n const bubbleStyle = {\n ...styles.messageBubble,\n ...(isUser ? styles.userMessage : styles.assistantMessage),\n };\n\n return <div style={bubbleStyle}>{message.text}</div>;\n}\n\n// ============================================================================\n// ChatAssistant Component\n// ============================================================================\n\nexport interface ChatAssistantProps {\n config: ChatbotConfig;\n runtime: ChatbotWidgetRuntime;\n tileId: string;\n}\n\nexport function ChatAssistant({ config, runtime, tileId }: ChatAssistantProps) {\n const {\n messages,\n isLoading,\n error,\n sendMessage,\n clearMessages: _clearMessages,\n } = useChat({\n backendUrl: config.backendUrl,\n tileId,\n runtime,\n greeting: config.greeting,\n maxHistory: config.maxHistory,\n mlflowRunId: config.mlflowRunId,\n });\n\n const messageListRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Auto-scroll to bottom on new messages\n useEffect(() => {\n if (messageListRef.current) {\n messageListRef.current.scrollTop = messageListRef.current.scrollHeight;\n }\n }, [messages, isLoading]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n const input = inputRef.current;\n if (!input || !input.value.trim() || isLoading) return;\n\n const text = input.value;\n input.value = '';\n sendMessage(text);\n };\n\n return (\n <div style={styles.container} data-testid=\"chat-assistant\">\n {/* Message list */}\n <div ref={messageListRef} style={styles.messageList}>\n {messages.map((msg) => (\n <MessageBubble key={msg.id} message={msg} />\n ))}\n {isLoading && <div style={styles.loadingDots}>Thinking...</div>}\n </div>\n\n {/* Error banner */}\n {error && <div style={styles.errorBanner}>{error}</div>}\n\n {/* Input form */}\n <form onSubmit={handleSubmit} style={styles.inputForm}>\n <input\n ref={inputRef}\n style={styles.input}\n placeholder=\"Ask anything...\"\n disabled={isLoading}\n data-testid=\"chat-input\"\n />\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n ...styles.sendButton,\n ...(isLoading ? styles.sendButtonDisabled : {}),\n }}\n data-testid=\"chat-send\"\n >\n Send\n </button>\n </form>\n </div>\n );\n}\n\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n\nexport const ChatAssistantMountableWidget = {\n mount(container: HTMLElement, mountConfig?: Record<string, unknown>) {\n const {\n config,\n runtime,\n tileId = 'chatbot-widget',\n } = (mountConfig || {}) as {\n config?: ChatbotConfig;\n runtime?: ChatbotWidgetRuntime;\n tileId?: string;\n };\n\n // React rendering when config + runtime + ReactDOM are available\n if (config && runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(\n React.createElement(ChatAssistant, {\n config,\n runtime,\n tileId,\n })\n );\n return () => { root.unmount(); };\n }\n\n if (!config || !runtime) {\n container.innerHTML =\n '<div style=\"padding: 16px; color: #94a3b8;\">Chat widget requires config and runtime.</div>';\n return () => {\n container.innerHTML = '';\n };\n }\n\n // HTML fallback\n container.innerHTML = `\n <div style=\"padding: 16px; font-family: system-ui; color: #e2e8f0;\">\n <p style=\"margin: 0 0 8px; color: #94a3b8;\">${config.greeting || 'Hi! How can I help?'}</p>\n <p style=\"margin: 0; font-size: 12px; color: #64748b;\">Chat widget mounted. Awaiting React renderer.</p>\n </div>\n `;\n\n return () => {\n container.innerHTML = '';\n };\n },\n};\n\nexport default ChatAssistant;\n", "/**\n * Adaptive Chatbot - Runtime Module\n *\n * Runtime manifest for the AI chat assistant adaptive.\n * This is a widget-based adaptive with no action executors.\n */\n\nimport { ChatAssistantMountableWidget } from './ChatAssistant';\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\nexport const runtime = {\n id: 'adaptive-chatbot',\n version: '1.0.0',\n name: 'Chat Assistant',\n description: 'AI chat assistant with action execution capabilities',\n\n /** No action executors \u2014 chatbot uses existing action kinds via applyBatch */\n executors: [],\n\n /** Widget definitions for the runtime's WidgetRegistry */\n widgets: [\n {\n id: 'adaptive-chatbot:assistant',\n component: ChatAssistantMountableWidget,\n metadata: {\n name: 'Chat Assistant',\n description: 'AI-powered chat assistant that can execute DOM actions',\n icon: '\uD83D\uDCAC',\n },\n },\n ],\n};\n\nexport default runtime;\n", "/**\n * CDN Entry Point for Adaptive Chatbot\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 ChatbotEditor, { editorPanel } from './editor';\nimport { 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: 'adaptive-chatbot',\n version: runtime.version,\n name: runtime.name,\n description: runtime.description,\n runtime: {\n actions: [],\n widgets: runtime.widgets,\n },\n editor: { component: ChatbotEditor, panel: editorPanel },\n metadata: {\n isBuiltIn: false,\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": ["R", "react_default", "useState", "useEffect", "useMemo", "useCallback", "useRef", "useContext", "useReducer", "createElement", "createContext", "Fragment", "forwardRef", "memo", "lazy", "Suspense", "Children", "isValidElement", "cloneElement", "Component", "PureComponent", "useLayoutEffect", "useId", "_getR", "_jsx", "type", "props", "key", "R", "p", "c", "jsx", "jsxs", "Fragment", "styles", "ChatbotEditor", "config", "onChange", "editor", "typedConfig", "initialConsumed", "useRef", "useEffect", "handleChange", "field", "value", "jsxs", "jsx", "e", "editorPanel", "editor_default", "RD", "createRoot", "RD", "createPortal", "JSON_FENCE_RE", "parseActions", "input", "actions", "displayText", "matches", "match", "fullMatch", "json", "parsed", "AuthError", "message", "getAuthHeaders", "cookieMatch", "workspaceId", "sendMessage", "url", "request", "authHeaders", "response", "nextId", "generateId", "useChat", "options", "backendUrl", "tileId", "runtime", "greeting", "maxHistory", "mlflowRunId", "config", "messages", "setMessages", "useState", "isLoading", "setIsLoading", "error", "setError", "batchHandleRef", "useRef", "send", "useCallback", "text", "trimmed", "userMessage", "prev", "historySlice", "m", "response", "sendMessage", "displayText", "actions", "parseActions", "assistantMessage", "a", "err", "message", "clearMessages", "styles", "MessageBubble", "message", "isUser", "bubbleStyle", "jsx", "ChatAssistant", "config", "runtime", "tileId", "messages", "isLoading", "error", "sendMessage", "_clearMessages", "useChat", "messageListRef", "useRef", "inputRef", "useEffect", "handleSubmit", "e", "input", "text", "jsxs", "msg", "ChatAssistantMountableWidget", "container", "mountConfig", "createRoot", "root", "react_default", "runtime", "ChatAssistantMountableWidget", "manifest", "runtime", "editor_default", "editorPanel", "registry", "cdn_default"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var p=globalThis.__SYNTRO_REACT__||{};var k=p.useState,z=p.useEffect,ke=p.useMemo,h=p.useCallback,M=p.useRef,Ee=p.useContext,Se=p.useReducer,Ie=p.createElement,we=p.createContext,Ae=p.Fragment,Re=p.forwardRef,Te=p.memo,Le=p.lazy,Ne=p.Suspense,He=p.Children,ze=p.isValidElement,Me=p.cloneElement,Be=p.Component,$e=p.PureComponent,Pe=p.useLayoutEffect,Fe=p.useId;function ce(e){if(!e)return"(no target)";if(e.startsWith("#")){let t=e.slice(1),s=["hero-","main-","page-","app-","section-"];for(let r of s)if(t.startsWith(r)){t=t.slice(r.length);break}return W(t,50)}let n=e.match(/\[data-testid="([^"]+)"\]/);return n?`${n[1]} element`:W(e,50)}function W(e,n){return e.length<=n?e:`${e.slice(0,n)}...`}function j(e,n){return e.length<=n?`"${e}"`:`"${e.slice(0,n)}..."`}function V(e,n){let t=ce(n.anchorId||"");switch(e){case"textReplacements":{let s=n.text||"";return`Change ${t} to ${j(s,40)}`}case"attributeChanges":{let s=n.attr||"",r=n.value||"";return`Set ${t} ${s} to ${j(r,40)}`}case"styleChanges":{let s=n.styles||{},r=Object.keys(s).length;return`Restyle ${t} (${r} ${r===1?"property":"properties"})`}case"htmlInsertions":return`Insert HTML ${n.position||"append"} ${t}`;case"classAdditions":return`Add class "${n.className||""}" to ${t}`;case"classRemovals":return`Remove class "${n.className||""}" from ${t}`;default:return`Unknown change on ${t}`}}function X(){return globalThis.__SYNTRO_REACT__}function U(e,n,t){var s=X(),r=n||{},c=r.children;return delete r.children,t!==void 0&&(r.key=t),Array.isArray(c)?s.createElement.apply(null,[e,r].concat(c)):c!==void 0?s.createElement(e,r,c):s.createElement(e,r)}var i=U,u=U,L=(X()||{}).Fragment;function G(e,n){return`${e}:${n}`}function de(e){let[n,t]=e.split(":");return{section:n,index:Number(t)}}var B={textReplacements:"\u{1F4DD}",attributeChanges:"\u{1F3F7}\uFE0F",styleChanges:"\u{1F3A8}",htmlInsertions:"\u{1F4C4}",classAdditions:"\u2795",classRemovals:"\u2796"},a={container:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif"},header:{padding:"16px",borderBottom:"1px solid #334155",display:"flex",alignItems:"center",gap:"12px"},backButton:{padding:"6px 12px",borderRadius:"6px",border:"none",backgroundColor:"rgba(255,255,255,0.05)",color:"#94a3b8",fontSize:"13px",cursor:"pointer"},title:{margin:0,fontSize:"15px",fontWeight:600,color:"#f8fafc"},subtitle:{margin:"2px 0 0 0",fontSize:"11px",color:"#64748b"},body:{flex:1,overflow:"auto",padding:"16px"},groupHeader:{fontSize:"11px",fontWeight:700,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.06em",padding:"4px 0 8px 0",display:"flex",alignItems:"center",justifyContent:"space-between"},groupCount:{fontSize:"10px",color:"#475569",backgroundColor:"rgba(255,255,255,0.06)",padding:"2px 6px",borderRadius:"8px"},card:{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.06)",background:"rgba(255,255,255,0.02)",marginBottom:"4px",cursor:"pointer",fontSize:"13px",color:"#e2e8f0"},cardIcon:{fontSize:"13px",flexShrink:0},cardText:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},dismissButton:{padding:"2px 6px",borderRadius:"4px",border:"none",background:"transparent",color:"#64748b",fontSize:"14px",cursor:"pointer",flexShrink:0,lineHeight:1},dismissedSection:{marginTop:"16px",cursor:"pointer",userSelect:"none"},dismissedHeader:{fontSize:"11px",fontWeight:600,color:"#475569",display:"flex",alignItems:"center",gap:"6px"},dismissedCard:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.03)",background:"transparent",marginBottom:"3px",cursor:"pointer",fontSize:"12px",color:"#475569",opacity:.6},emptyState:{textAlign:"center",padding:"32px 16px",color:"#64748b",fontSize:"13px"},footer:{padding:"12px 16px",borderTop:"1px solid #334155",display:"flex",gap:"8px"},saveButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"rgba(59, 130, 246, 0.15)",color:"#3b82f6",fontSize:"13px",fontWeight:600,cursor:"pointer"},publishButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"#22c55e",color:"white",fontSize:"13px",fontWeight:600,cursor:"pointer"},editForm:{padding:"4px 0"},editHeader:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"12px",fontSize:"13px",fontWeight:600,color:"#e2e8f0"},editTarget:{fontSize:"11px",fontFamily:"monospace",color:"#94a3b8",padding:"4px 8px",background:"rgba(255,255,255,0.04)",borderRadius:"4px",marginBottom:"12px"},editLabel:{fontSize:"11px",fontWeight:600,color:"#64748b",marginBottom:"4px",display:"block"},editInput:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",boxSizing:"border-box"},editTextarea:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",resize:"vertical",minHeight:"60px",boxSizing:"border-box"},editSelect:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",marginBottom:"8px"}};function Y(e){let n=[],t=Object.keys(B);for(let s of t)(e[s]||[]).forEach((c,l)=>{let g=c;n.push({key:G(s,l),section:s,index:l,icon:B[s],summary:V(s,g),anchorId:g.anchorId||""})});return n}function q(e,n){let t={...e},s=Object.keys(B);for(let r of s){let l=(e[r]||[]).filter((g,f)=>!n.has(G(r,f)));(l.length>0||e[r]!==void 0)&&(t[r]=l)}return t}function ue(e){let[n,t]=k(new Map),s=M(e);return s.current=e,z(()=>{let r=()=>{let l=new Map;for(let g of s.current){if(!g.anchorId){l.set(g.key,{found:!1,element:null});continue}try{let f=document.querySelector(g.anchorId);l.set(g.key,{found:f!==null,element:f})}catch{l.set(g.key,{found:!1,element:null})}}t(l)};r();let c=setInterval(r,2e3);return()=>clearInterval(c)},[]),n}function pe({found:e}){return i("span",{style:{width:"8px",height:"8px",borderRadius:"50%",backgroundColor:e?"#22c55e":"#475569",flexShrink:0,display:"inline-block"},title:e?"Found on this page":"Not found on this page"})}function fe({config:e,onChange:n,editor:t}){let s=e,[r,c]=k(new Set),[l,g]=k(!1),[f,v]=k(null),[E,T]=k("after"),S=M(!1);z(()=>{if(t.initialEditKey!=null&&!S.current){S.current=!0;let o=Y(s),d=Number(t.initialEditKey);if(d>=0&&d<o.length){let m=o[d];v(m.key),m.anchorId&&t.highlightElement(m.anchorId)}t.clearInitialState?.()}else t.initialCreate&&!S.current&&(S.current=!0,t.clearInitialState?.())},[t,s]);let I=Y(s),w=I.filter(o=>!r.has(o.key)),N=I.filter(o=>r.has(o.key)),H=w.length,[Ce,_]=k(null),O=ue(I),Q=w.filter(o=>O.get(o.key)?.found).length,Z=h(o=>{c(d=>{let m=new Set(d);return m.add(o),m}),f===o&&v(null)},[f]),ee=h(o=>{c(d=>{let m=new Set(d);return m.delete(o),m})},[]),K=h(o=>{o.anchorId&&t.highlightElement(o.anchorId),v(o.key)},[t]),te=h(()=>{v(null),T("after"),t.previewConfig(e),t.clearHighlight()},[t,e]),D=h(o=>{if(T(o),o==="before"){let d=q(s,new Set([f]));t.previewConfig(d)}else t.previewConfig(e)},[s,f,t,e]),C=h((o,d,m,y)=>{let b=(s[o]||[]).slice(),x={...b[d]};x[m]=y,b[d]=x;let A={...s,[o]:b};n(A),t.setDirty(!0)},[s,n,t]),ne=h(()=>{if(r.size>0){let o=q(s,r);n(o)}t.publish()},[r,s,n,t]),re=h(o=>{_(o.key),o.anchorId&&t.highlightElement(o.anchorId)},[t]),oe=h(()=>{_(null),t.clearHighlight()},[t]),se=(o,d)=>{let y=(s[o]||[])[d];if(!y)return null;let b=y.anchorId||"";switch(o){case"textReplacements":return u("div",{style:a.editForm,children:[i("div",{style:a.editTarget,children:b}),i("label",{style:a.editLabel,children:"Text"}),i("textarea",{style:a.editTextarea,value:y.text||"",onChange:x=>C(o,d,"text",x.target.value)})]});case"attributeChanges":return u("div",{style:a.editForm,children:[i("div",{style:a.editTarget,children:b}),i("label",{style:a.editLabel,children:"Attribute"}),i("input",{style:a.editInput,value:y.attr||"",onChange:x=>C(o,d,"attr",x.target.value)}),i("label",{style:a.editLabel,children:"Value"}),i("input",{style:a.editInput,value:y.value||"",onChange:x=>C(o,d,"value",x.target.value)})]});case"styleChanges":{let x=y.styles||{};return u("div",{style:a.editForm,children:[i("div",{style:a.editTarget,children:b}),i("label",{style:a.editLabel,children:"Styles"}),Object.entries(x).map(([A,ae])=>u("div",{style:{display:"flex",gap:"4px",marginBottom:"4px"},children:[i("input",{style:{...a.editInput,flex:1,marginBottom:0},value:A,readOnly:!0}),i("input",{style:{...a.editInput,flex:1,marginBottom:0},value:ae,onChange:ie=>{let le={...x,[A]:ie.target.value};C(o,d,"styles",le)}})]},A))]})}case"htmlInsertions":return u("div",{style:a.editForm,children:[i("div",{style:a.editTarget,children:b}),i("label",{style:a.editLabel,children:"Position"}),u("select",{style:a.editSelect,value:y.position||"after",onChange:x=>C(o,d,"position",x.target.value),children:[i("option",{value:"before",children:"Before"}),i("option",{value:"after",children:"After"}),i("option",{value:"prepend",children:"Prepend"}),i("option",{value:"append",children:"Append"}),i("option",{value:"replace",children:"Replace"})]}),i("label",{style:a.editLabel,children:"HTML"}),i("textarea",{style:{...a.editTextarea,fontFamily:"monospace"},value:y.html||"",onChange:x=>C(o,d,"html",x.target.value)})]});case"classAdditions":case"classRemovals":return u("div",{style:a.editForm,children:[i("div",{style:a.editTarget,children:b}),i("label",{style:a.editLabel,children:"Class Name"}),i("input",{style:a.editInput,value:y.className||"",onChange:x=>C(o,d,"className",x.target.value)})]});default:return null}};return u("div",{style:a.container,children:[u("div",{style:a.header,children:[i("button",{onClick:()=>f!==null?te():t.navigateHome(),style:a.backButton,children:"\u2190 Back"}),u("div",{children:[i("h2",{style:a.title,children:"Review Changes"}),u("p",{style:a.subtitle,children:[H," change",H!==1?"s":"",H>0&&` (${Q} found on this page)`]})]})]}),i("div",{style:a.body,children:f!==null?(()=>{let o=de(f),d=I.find(m=>m.key===f);return u(L,{children:[u("div",{style:a.editHeader,children:[i("span",{children:d?.icon}),i("span",{children:d?.summary})]}),u("div",{style:{display:"flex",gap:"0",marginBottom:"12px",borderRadius:"6px",overflow:"hidden",border:"1px solid rgba(255,255,255,0.1)"},children:[i("button",{onClick:()=>D("before"),style:{flex:1,padding:"6px 12px",border:"none",fontSize:"12px",fontWeight:600,cursor:"pointer",background:E==="before"?"rgba(59,130,246,0.2)":"transparent",color:E==="before"?"#3b82f6":"#64748b"},children:"Before"}),i("button",{onClick:()=>D("after"),style:{flex:1,padding:"6px 12px",border:"none",borderLeft:"1px solid rgba(255,255,255,0.1)",fontSize:"12px",fontWeight:600,cursor:"pointer",background:E==="after"?"rgba(59,130,246,0.2)":"transparent",color:E==="after"?"#3b82f6":"#64748b"},children:"After"})]}),se(o.section,o.index)]})})():u(L,{children:[I.length===0&&i("div",{style:a.emptyState,children:"No content changes configured."}),w.length>0&&u(L,{children:[u("div",{style:a.groupHeader,children:[i("span",{children:"CONTENT"}),i("span",{style:a.groupCount,children:w.length})]}),w.map(o=>{let d=O.get(o.key);return u("div",{style:a.card,"data-item-key":o.key,onMouseEnter:()=>re(o),onMouseLeave:oe,children:[i(pe,{found:d?.found??!1}),i("span",{style:a.cardIcon,onClick:m=>{m.stopPropagation(),K(o)},children:o.icon}),i("span",{style:a.cardText,onClick:()=>K(o),children:o.summary}),i("button",{style:a.dismissButton,onClick:m=>{m.stopPropagation(),Z(o.key)},title:"Dismiss this change",children:"\xD7"})]},o.key)})]}),N.length>0&&u("div",{style:a.dismissedSection,children:[u("div",{style:{...a.dismissedHeader,cursor:"pointer"},onClick:()=>g(!l),children:[i("span",{children:l?"\u25BE":"\u25B8"}),u("span",{children:["Dismissed (",N.length,")"]})]}),l&&i("div",{style:{marginTop:"6px"},children:N.map(o=>u("div",{style:a.dismissedCard,children:[i("span",{style:a.cardIcon,children:o.icon}),i("span",{style:{...a.cardText,textDecoration:"line-through"},children:o.summary}),i("button",{style:{...a.dismissButton,color:"#3b82f6",fontSize:"11px"},onClick:d=>{d.stopPropagation(),ee(o.key)},children:"Restore"})]},o.key))})]})]})}),u("div",{style:a.footer,children:[i("button",{onClick:()=>t.save(),style:a.saveButton,children:"Save Draft"}),i("button",{onClick:ne,style:a.publishButton,children:"Publish"})]})]})}var $={panel:{title:"Content",icon:"\u{1F4DD}",description:"Text and attribute modifications"},component:fe},Ve=$.panel;var ge=new Set(["b","strong","i","em","u","span","div","p","br","ul","ol","li","code","pre","small","sup","sub","a","button"]);function P(e){if(typeof window.Sanitizer=="function")try{let g=new window.Sanitizer({}).sanitizeToFragment(e),f=document.createElement("div");return f.append(g),f.innerHTML}catch{}let t=document.createElement("template");t.innerHTML=e;let s=t.content,r=document.createTreeWalker(s,NodeFilter.SHOW_ELEMENT,null),c=[];for(;r.nextNode();){let l=r.currentNode,g=l.tagName.toLowerCase();if(!ge.has(g)){c.push(l);continue}for(let f of Array.from(l.attributes)){let v=f.name.toLowerCase(),E=f.value.trim().toLowerCase(),T=v.startsWith("on"),S=(v==="href"||v==="src")&&E.startsWith("javascript:");(T||S)&&l.removeAttribute(f.name)}}for(let l of c){for(;l.firstChild;)l.parentNode?.insertBefore(l.firstChild,l);l.remove()}return t.innerHTML}var me=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);let s=P(e.html),r=document.createElement("div");r.setAttribute("data-syntro-action-id",n.generateId()),r.innerHTML=s;let c=null;switch(e.position){case"before":t.insertAdjacentElement("beforebegin",r);break;case"after":t.insertAdjacentElement("afterend",r);break;case"prepend":t.insertBefore(r,t.firstChild);break;case"append":t.appendChild(r);break;case"replace":c=t.innerHTML,t.replaceWith(r);break}return n.publishEvent("action.applied",{id:n.generateId(),kind:"content:insertHtml",anchorId:e.anchorId,position:e.position}),{cleanup:()=>{if(e.position==="replace"&&c!==null){let l=document.createElement(t.tagName);l.innerHTML=c,Array.from(t.attributes).forEach(g=>{l.setAttribute(g.name,g.value)}),r.replaceWith(l)}else r.remove()},updateFn:l=>{"html"in l&&typeof l.html=="string"&&(r.innerHTML=P(l.html))}}},xe=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);let s=t.textContent??"";return t.textContent=e.text,n.publishEvent("action.applied",{id:n.generateId(),kind:"content:setText",anchorId:e.anchorId}),{cleanup:()=>{t.textContent=s},updateFn:r=>{"text"in r&&typeof r.text=="string"&&(t.textContent=r.text)}}},ye=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);if(["onclick","onerror","onload","onmouseover","onfocus","onblur"].includes(e.attr.toLowerCase())||e.attr.startsWith("on"))throw new Error(`Dangerous attribute not allowed: ${e.attr}`);let r=t.getAttribute(e.attr),c=t.hasAttribute(e.attr);return t.setAttribute(e.attr,e.value),n.publishEvent("action.applied",{id:n.generateId(),kind:"content:setAttr",anchorId:e.anchorId,attr:e.attr}),{cleanup:()=>{c&&r!==null?t.setAttribute(e.attr,r):t.removeAttribute(e.attr)},updateFn:l=>{"value"in l&&typeof l.value=="string"&&t.setAttribute(e.attr,l.value)}}},he=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);let s=t.classList.contains(e.className);return t.classList.add(e.className),n.publishEvent("action.applied",{id:n.generateId(),kind:"content:addClass",anchorId:e.anchorId,className:e.className}),{cleanup:()=>{s||t.classList.remove(e.className)}}},be=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);let s=t.classList.contains(e.className);return t.classList.remove(e.className),n.publishEvent("action.applied",{id:n.generateId(),kind:"content:removeClass",anchorId:e.anchorId,className:e.className}),{cleanup:()=>{s&&t.classList.add(e.className)}}},ve=async(e,n)=>{let t=n.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);let s=new Map;for(let r of Object.keys(e.styles)){let c=t.style.getPropertyValue(r);s.set(r,c)}for(let[r,c]of Object.entries(e.styles))t.style.setProperty(r,c);return n.publishEvent("action.applied",{id:n.generateId(),kind:"content:setStyle",anchorId:e.anchorId,styles:Object.keys(e.styles)}),{cleanup:()=>{for(let[r,c]of s)c?t.style.setProperty(r,c):t.style.removeProperty(r)},updateFn:r=>{if("styles"in r&&typeof r.styles=="object"&&r.styles)for(let[c,l]of Object.entries(r.styles))t.style.setProperty(c,l)}}},F=[{kind:"content:insertHtml",executor:me},{kind:"content:setText",executor:xe},{kind:"content:setAttr",executor:ye},{kind:"content:addClass",executor:he},{kind:"content:removeClass",executor:be},{kind:"content:setStyle",executor:ve}],R={id:"adaptive-content",version:"1.0.0",name:"Content",description:"DOM manipulation for text, attributes, and styles",executors:F};var J={id:R.id,version:R.version,name:R.name,description:R.description,runtime:{actions:F.map(({kind:e,executor:n})=>({kind:e,executor:n}))},editor:$,metadata:{isBuiltIn:!0}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(J)}var Ze=J;export{Ze as default,J as manifest};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["shared-react:react", "../../../../adaptives/adaptive-content/src/summarize.ts", "shared-react:react/jsx-runtime", "../../../../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": ["\n var R = globalThis.__SYNTRO_REACT__ || {};\n export default R;\n export var useState = R.useState;\n export var useEffect = R.useEffect;\n export var useMemo = R.useMemo;\n export var useCallback = R.useCallback;\n export var useRef = R.useRef;\n export var useContext = R.useContext;\n export var useReducer = R.useReducer;\n export var createElement = R.createElement;\n export var createContext = R.createContext;\n export var Fragment = R.Fragment;\n export var forwardRef = R.forwardRef;\n export var memo = R.memo;\n export var lazy = R.lazy;\n export var Suspense = R.Suspense;\n export var Children = R.Children;\n export var isValidElement = R.isValidElement;\n export var cloneElement = R.cloneElement;\n export var Component = R.Component;\n export var PureComponent = R.PureComponent;\n export var useLayoutEffect = R.useLayoutEffect;\n export var useId = R.useId;\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 function _getR() { return globalThis.__SYNTRO_REACT__; }\n function _jsx(type, props, key) {\n var R = _getR();\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 = (_getR() || {}).Fragment;\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 React, { useState, useCallback, useEffect, useRef } from 'react';\n\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_ICONS: Record<SectionKey, string> = {\n textReplacements: '\\u{1f4dd}',\n attributeChanges: '\\u{1f3f7}\\u{fe0f}',\n styleChanges: '\\u{1f3a8}',\n htmlInsertions: '\\u{1f4c4}',\n classAdditions: '\\u{2795}',\n classRemovals: '\\u{2796}',\n};\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100%',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n header: {\n padding: '16px',\n borderBottom: '1px solid #334155',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n },\n backButton: {\n padding: '6px 12px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'rgba(255,255,255,0.05)',\n color: '#94a3b8',\n fontSize: '13px',\n cursor: 'pointer',\n },\n title: {\n margin: 0,\n fontSize: '15px',\n fontWeight: 600,\n color: '#f8fafc',\n },\n subtitle: {\n margin: '2px 0 0 0',\n fontSize: '11px',\n color: '#64748b',\n },\n body: {\n flex: 1,\n overflow: 'auto',\n padding: '16px',\n },\n groupHeader: {\n fontSize: '11px',\n fontWeight: 700,\n color: '#64748b',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.06em',\n padding: '4px 0 8px 0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n },\n groupCount: {\n fontSize: '10px',\n color: '#475569',\n backgroundColor: 'rgba(255,255,255,0.06)',\n padding: '2px 6px',\n borderRadius: '8px',\n },\n card: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 10px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.06)',\n background: 'rgba(255,255,255,0.02)',\n marginBottom: '4px',\n cursor: 'pointer',\n fontSize: '13px',\n color: '#e2e8f0',\n },\n cardIcon: {\n fontSize: '13px',\n flexShrink: 0,\n },\n cardText: {\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n },\n dismissButton: {\n padding: '2px 6px',\n borderRadius: '4px',\n border: 'none',\n background: 'transparent',\n color: '#64748b',\n fontSize: '14px',\n cursor: 'pointer',\n flexShrink: 0,\n lineHeight: 1,\n },\n dismissedSection: {\n marginTop: '16px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n },\n dismissedHeader: {\n fontSize: '11px',\n fontWeight: 600,\n color: '#475569',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n },\n dismissedCard: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 10px',\n borderRadius: '6px',\n border: '1px solid rgba(255,255,255,0.03)',\n background: 'transparent',\n marginBottom: '3px',\n cursor: 'pointer',\n fontSize: '12px',\n color: '#475569',\n opacity: 0.6,\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n color: '#64748b',\n fontSize: '13px',\n },\n footer: {\n padding: '12px 16px',\n borderTop: '1px solid #334155',\n display: 'flex',\n gap: '8px',\n },\n saveButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: 'rgba(59, 130, 246, 0.15)',\n color: '#3b82f6',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n publishButton: {\n flex: 1,\n padding: '10px',\n borderRadius: '8px',\n border: 'none',\n background: '#22c55e',\n color: 'white',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer',\n },\n // Edit form styles\n editForm: {\n padding: '4px 0',\n },\n editHeader: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '12px',\n fontSize: '13px',\n fontWeight: 600,\n color: '#e2e8f0',\n },\n editTarget: {\n fontSize: '11px',\n fontFamily: 'monospace',\n color: '#94a3b8',\n padding: '4px 8px',\n background: 'rgba(255,255,255,0.04)',\n borderRadius: '4px',\n marginBottom: '12px',\n },\n editLabel: {\n fontSize: '11px',\n fontWeight: 600,\n color: '#64748b',\n marginBottom: '4px',\n display: 'block',\n },\n editInput: {\n width: '100%',\n padding: '6px 8px',\n borderRadius: '4px',\n border: '1px solid rgba(255,255,255,0.1)',\n background: 'rgba(255,255,255,0.04)',\n color: '#e2e8f0',\n fontSize: '12px',\n fontFamily: 'inherit',\n marginBottom: '8px',\n boxSizing: 'border-box' as const,\n },\n editTextarea: {\n width: '100%',\n padding: '6px 8px',\n borderRadius: '4px',\n border: '1px solid rgba(255,255,255,0.1)',\n background: 'rgba(255,255,255,0.04)',\n color: '#e2e8f0',\n fontSize: '12px',\n fontFamily: 'inherit',\n marginBottom: '8px',\n resize: 'vertical' as const,\n minHeight: '60px',\n boxSizing: 'border-box' as const,\n },\n editSelect: {\n width: '100%',\n padding: '6px 8px',\n borderRadius: '4px',\n border: '1px solid rgba(255,255,255,0.1)',\n background: 'rgba(255,255,255,0.04)',\n color: '#e2e8f0',\n fontSize: '12px',\n marginBottom: '8px',\n },\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 icon: string;\n summary: string;\n anchorId: string;\n}> {\n const items: Array<{\n key: string;\n section: SectionKey;\n index: number;\n icon: string;\n summary: string;\n anchorId: string;\n }> = [];\n const sections = Object.keys(SECTION_ICONS) 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 icon: SECTION_ICONS[section],\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_ICONS) 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\nfunction DetectionBadge({ found }: { found: boolean }) {\n return (\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: found ? '#22c55e' : '#475569',\n flexShrink: 0,\n display: 'inline-block',\n }}\n title={found ? 'Found on this page' : 'Not found on this page'}\n />\n );\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>>(new Set());\n const [dismissedOpen, setDismissedOpen] = useState(false);\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [previewMode, setPreviewMode] = useState<'before' | 'after'>('after');\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 // Map flat action index to internal section:index key.\n // The flat index refers to the position within this app's actions only\n // (after actionsToAppConfig transformation), so we walk sections in order.\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 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 // ---- 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 style={styles.editForm}>\n <div style={styles.editTarget}>{anchorId}</div>\n <label style={styles.editLabel}>Text</label>\n <textarea\n style={styles.editTextarea}\n value={(item.text as string) || ''}\n onChange={(e) => handleFieldChange(section, index, 'text', e.target.value)}\n />\n </div>\n );\n\n case 'attributeChanges':\n return (\n <div style={styles.editForm}>\n <div style={styles.editTarget}>{anchorId}</div>\n <label style={styles.editLabel}>Attribute</label>\n <input\n style={styles.editInput}\n value={(item.attr as string) || ''}\n onChange={(e) => handleFieldChange(section, index, 'attr', e.target.value)}\n />\n <label style={styles.editLabel}>Value</label>\n <input\n style={styles.editInput}\n value={(item.value as string) || ''}\n onChange={(e) => handleFieldChange(section, index, 'value', e.target.value)}\n />\n </div>\n );\n\n case 'styleChanges': {\n const styleObj = (item.styles as Record<string, string>) || {};\n return (\n <div style={styles.editForm}>\n <div style={styles.editTarget}>{anchorId}</div>\n <label style={styles.editLabel}>Styles</label>\n {Object.entries(styleObj).map(([prop, val]) => (\n <div key={prop} style={{ display: 'flex', gap: '4px', marginBottom: '4px' }}>\n <input\n style={{ ...styles.editInput, flex: 1, marginBottom: 0 }}\n value={prop}\n readOnly\n />\n <input\n style={{ ...styles.editInput, flex: 1, marginBottom: 0 }}\n value={val}\n onChange={(e) => {\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 style={styles.editForm}>\n <div style={styles.editTarget}>{anchorId}</div>\n <label style={styles.editLabel}>Position</label>\n <select\n style={styles.editSelect}\n value={(item.position as string) || 'after'}\n onChange={(e) => handleFieldChange(section, index, 'position', e.target.value)}\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 </select>\n <label style={styles.editLabel}>HTML</label>\n <textarea\n style={{ ...styles.editTextarea, fontFamily: 'monospace' }}\n value={(item.html as string) || ''}\n onChange={(e) => handleFieldChange(section, index, 'html', e.target.value)}\n />\n </div>\n );\n\n case 'classAdditions':\n case 'classRemovals':\n return (\n <div style={styles.editForm}>\n <div style={styles.editTarget}>{anchorId}</div>\n <label style={styles.editLabel}>Class Name</label>\n <input\n style={styles.editInput}\n value={(item.className as string) || ''}\n onChange={(e) => handleFieldChange(section, index, 'className', e.target.value)}\n />\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <button\n onClick={() => (editingKey !== null ? handleBackToList() : editor.navigateHome())}\n style={styles.backButton}\n >\n &larr; Back\n </button>\n <div>\n <h2 style={styles.title}>Review Changes</h2>\n <p style={styles.subtitle}>\n {totalChanges} change{totalChanges !== 1 ? 's' : ''}\n {totalChanges > 0 && ` (${foundCount} found on this page)`}\n </p>\n </div>\n </div>\n\n {/* Body */}\n <div style={styles.body}>\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 style={styles.editHeader}>\n <span>{editItem?.icon}</span>\n <span>{editItem?.summary}</span>\n </div>\n <div\n style={{\n display: 'flex',\n gap: '0',\n marginBottom: '12px',\n borderRadius: '6px',\n overflow: 'hidden',\n border: '1px solid rgba(255,255,255,0.1)',\n }}\n >\n <button\n onClick={() => handleBeforeAfter('before')}\n style={{\n flex: 1,\n padding: '6px 12px',\n border: 'none',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n background: previewMode === 'before' ? 'rgba(59,130,246,0.2)' : 'transparent',\n color: previewMode === 'before' ? '#3b82f6' : '#64748b',\n }}\n >\n Before\n </button>\n <button\n onClick={() => handleBeforeAfter('after')}\n style={{\n flex: 1,\n padding: '6px 12px',\n border: 'none',\n borderLeft: '1px solid rgba(255,255,255,0.1)',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n background: previewMode === 'after' ? 'rgba(59,130,246,0.2)' : 'transparent',\n color: previewMode === 'after' ? '#3b82f6' : '#64748b',\n }}\n >\n After\n </button>\n </div>\n {renderEditFields(ref.section, ref.index)}\n </>\n );\n })()\n ) : (\n /* ---- List mode ---- */\n <>\n {allItems.length === 0 && (\n <div style={styles.emptyState}>No content changes configured.</div>\n )}\n\n {activeItems.length > 0 && (\n <>\n <div style={styles.groupHeader}>\n <span>CONTENT</span>\n <span style={styles.groupCount}>{activeItems.length}</span>\n </div>\n {activeItems.map((item) => {\n const detection = detectionMap.get(item.key);\n return (\n <div\n key={item.key}\n style={styles.card}\n data-item-key={item.key}\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n <DetectionBadge found={detection?.found ?? false} />\n <span\n style={styles.cardIcon}\n onClick={(e) => {\n e.stopPropagation();\n handleCardClick(item);\n }}\n >\n {item.icon}\n </span>\n <span style={styles.cardText} onClick={() => handleCardClick(item)}>\n {item.summary}\n </span>\n <button\n style={styles.dismissButton}\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss(item.key);\n }}\n title=\"Dismiss this change\"\n >\n &times;\n </button>\n </div>\n );\n })}\n </>\n )}\n\n {/* Dismissed section */}\n {dismissedItems.length > 0 && (\n <div style={styles.dismissedSection}>\n <div\n style={{ ...styles.dismissedHeader, cursor: 'pointer' }}\n onClick={() => setDismissedOpen(!dismissedOpen)}\n >\n <span>{dismissedOpen ? '\\u25be' : '\\u25b8'}</span>\n <span>Dismissed ({dismissedItems.length})</span>\n </div>\n {dismissedOpen && (\n <div style={{ marginTop: '6px' }}>\n {dismissedItems.map((item) => (\n <div key={item.key} style={styles.dismissedCard}>\n <span style={styles.cardIcon}>{item.icon}</span>\n <span style={{ ...styles.cardText, textDecoration: 'line-through' }}>\n {item.summary}\n </span>\n <button\n style={{\n ...styles.dismissButton,\n color: '#3b82f6',\n fontSize: '11px',\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(item.key);\n }}\n >\n Restore\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Footer */}\n <div style={styles.footer}>\n <button onClick={() => editor.save()} style={styles.saveButton}>\n Save Draft\n </button>\n <button onClick={handlePublish} style={styles.publishButton}>\n Publish\n </button>\n </div>\n </div>\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 isJsUrl = (name === 'href' || name === 'src') && value.startsWith('javascript:');\n\n if (isEvent || isJsUrl) {\n el.removeAttribute(attr.name);\n }\n }\n }\n\n // Remove disallowed elements but keep their children\n for (const el of toRemove) {\n while (el.firstChild) {\n el.parentNode?.insertBefore(el.firstChild, el);\n }\n el.remove();\n }\n\n return tpl.innerHTML;\n}\n", "/**\n * 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\n const dangerousAttrs = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur'];\n if (dangerousAttrs.includes(action.attr.toLowerCase()) || action.attr.startsWith('on')) {\n throw new Error(`Dangerous attribute not allowed: ${action.attr}`);\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": ["R", "useState", "R", "useEffect", "useMemo", "useCallback", "useRef", "useContext", "useReducer", "createElement", "createContext", "Fragment", "forwardRef", "memo", "lazy", "Suspense", "Children", "isValidElement", "cloneElement", "Component", "PureComponent", "useLayoutEffect", "useId", "describeSelector", "selector", "name", "prefixes", "prefix", "truncate", "testIdMatch", "text", "max", "truncateQuoted", "summarizeContentChange", "type", "item", "desc", "attr", "value", "styles", "count", "_getR", "_jsx", "type", "props", "key", "R", "p", "jsx", "jsxs", "Fragment", "itemKey", "section", "index", "parseItemKey", "key", "indexStr", "SECTION_ICONS", "styles", "flattenItems", "config", "items", "sections", "item", "i", "rec", "summarizeContentChange", "filterConfig", "dismissedKeys", "result", "filtered", "_", "useAnchorDetection", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "useEffect", "runDetection", "map", "el", "interval", "DetectionBadge", "found", "jsx", "ContentEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "dismissedOpen", "setDismissedOpen", "editingKey", "setEditingKey", "previewMode", "setPreviewMode", "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", "renderEditFields", "anchorId", "jsxs", "e", "styleObj", "prop", "val", "newStyles", "ref", "editItem", "it", "Fragment", "detection", "editorPanel", "ALLOWED_TAGS", "sanitizeHtml", "html", "frag", "div", "tpl", "root", "walker", "toRemove", "el", "tag", "attr", "name", "value", "isEvent", "isJsUrl", "executeInsertHtml", "action", "context", "anchorEl", "sanitizedHtml", "sanitizeHtml", "container", "originalContent", "restoredEl", "attr", "changes", "executeSetText", "originalText", "executeSetAttr", "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
+ var g=globalThis.__SYNTRO_REACT__||{},K=g,C=g.useState,D=g.useEffect,q=g.useMemo,k=g.useCallback,U=g.useRef,_e=g.useContext,G=g.useReducer,He=g.createElement,Le=g.createContext,De=g.Fragment,We=g.forwardRef,Ne=g.memo,Oe=g.lazy,Ve=g.Suspense,$e=g.Children,je=g.isValidElement,Ke=g.cloneElement,Ue=g.Component,Xe=g.PureComponent,Ye=g.useLayoutEffect,Ge=g.useId;function J(e,n){return e.length<=n?e:`${e.slice(0,n).trimEnd()}...`}function ye(e){return e.replace(/<[^>]*>/g,"").trim()}function he(e){return typeof e=="string"?e:e.type==="rich"?ye(e.html):e.content.replace(/[*_#`]/g,"").trim()}function ve(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function Z(e){if(!e||!ve(e))return"All pages";let n=[],t=[];for(let a of e.rules)for(let l of a.conditions)l.type==="page_url"&&typeof l.url=="string"&&n.push(l.url),l.type==="anchor_visible"&&typeof l.anchorId=="string"&&t.push(l.anchorId);let r=[];return n.length>0&&r.push(n[0]),t.length>0&&r.push(t[0]),r.length>0?r.join(" \xB7 "):"All pages"}function ee(e){let n=J(e.config.question,50),t=J(he(e.config.answer),40);return`Q: "${n}" \u2014 ${t}`}function P(e){return e.kind.startsWith("faq:")}function te(){return globalThis.__SYNTRO_REACT__}function ne(e,n,t){var r=te(),a=n||{},l=a.children;return delete a.children,t!==void 0&&(a.key=t),Array.isArray(l)?r.createElement.apply(null,[e,a].concat(l)):l!==void 0?r.createElement(e,a,l):r.createElement(e,a)}var i=ne,p=ne,O=(te()||{}).Fragment;function ke(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function X(e){if(!e||!ke(e))return{pagePatterns:[],anchorSelectors:[],hasTargeting:!1};let n=new Set,t=new Set;for(let a of e.rules)for(let l of a.conditions){let d=l;d.type==="page_url"&&typeof d.url=="string"?n.add(d.url):d.type==="anchor_visible"&&typeof d.anchorId=="string"&&t.add(d.anchorId)}let r=n.size>0||t.size>0;return{pagePatterns:[...n],anchorSelectors:[...t],hasTargeting:r}}function Se(e){return X(e).pagePatterns[0]||null}function Ae(e){return X(e).anchorSelectors[0]||null}function we(e){return typeof e=="string"?e:e.type==="rich"?e.html:e.content}function Ce(e){return(e.actions||[]).filter(P).map((t,r)=>({key:String(r),index:r,summary:ee(t),trigger:Z(t.showWhen),rationale:t.rationale,firstAnchor:Ae(t.showWhen),question:t}))}function oe(e,n){let t=(e.actions||[]).filter(P);return{...e,actions:t.filter((r,a)=>!n.has(String(a)))}}function Fe(e,n){let[t,r]=C(new Map),a=U(e);return a.current=e,D(()=>{let l=()=>{let R=new Map,h=n();for(let x of a.current){let S=X(x.question.showWhen),A=!0;S.pagePatterns.length>0&&(A=S.pagePatterns.some(I=>new RegExp(`^${I.replace(/\*\*/g,".*").replace(/(?<!\.)(\*)/g,"[^/]*")}$`).test(h)));let Q=!1,y=null;if(x.firstAnchor)try{y=document.querySelector(x.firstAnchor),Q=y!==null}catch{}else Q=A;R.set(x.key,{found:A&&Q,element:y})}r(R)};l();let d=setInterval(l,2e3);return window.addEventListener("popstate",l),()=>{clearInterval(d),window.removeEventListener("popstate",l)}},[n]),t}function Re({found:e}){return i("span",{style:{width:"8px",height:"8px",borderRadius:"50%",backgroundColor:e?"#22c55e":"#475569",flexShrink:0,display:"inline-block"},title:e?"Found on this page":"Not found on this page"})}var c={container:{display:"flex",flexDirection:"column",height:"100%",fontFamily:"system-ui, -apple-system, sans-serif"},header:{padding:"16px",borderBottom:"1px solid #334155",display:"flex",alignItems:"center",gap:"12px"},backButton:{padding:"6px 12px",borderRadius:"6px",border:"none",backgroundColor:"rgba(255,255,255,0.05)",color:"#94a3b8",fontSize:"13px",cursor:"pointer"},title:{margin:0,fontSize:"15px",fontWeight:600,color:"#f8fafc"},subtitle:{margin:"2px 0 0 0",fontSize:"11px",color:"#64748b"},body:{flex:1,overflow:"auto",padding:"16px"},groupHeader:{fontSize:"11px",fontWeight:700,color:"#64748b",textTransform:"uppercase",letterSpacing:"0.06em",padding:"4px 0 8px 0",display:"flex",alignItems:"center",justifyContent:"space-between"},groupCount:{fontSize:"10px",color:"#475569",backgroundColor:"rgba(255,255,255,0.06)",padding:"2px 6px",borderRadius:"8px"},card:{padding:"8px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.06)",background:"rgba(255,255,255,0.02)",marginBottom:"4px",fontSize:"13px",color:"#e2e8f0"},triggerLine:{display:"flex",alignItems:"center",gap:"4px",fontSize:"11px",color:"#94a3b8",cursor:"pointer",marginBottom:"4px"},cardBody:{display:"flex",alignItems:"center",gap:"8px",cursor:"pointer"},cardText:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},rationaleLine:{fontSize:"10px",color:"#64748b",marginTop:"4px"},dismissButton:{padding:"2px 6px",borderRadius:"4px",border:"none",background:"transparent",color:"#64748b",fontSize:"14px",cursor:"pointer",flexShrink:0,lineHeight:1},dismissedSection:{marginTop:"16px",cursor:"pointer",userSelect:"none"},dismissedHeader:{fontSize:"11px",fontWeight:600,color:"#475569",display:"flex",alignItems:"center",gap:"6px"},dismissedCard:{display:"flex",alignItems:"center",gap:"8px",padding:"6px 10px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.03)",background:"transparent",marginBottom:"3px",cursor:"pointer",fontSize:"12px",color:"#475569",opacity:.6},emptyState:{textAlign:"center",padding:"32px 16px",color:"#64748b",fontSize:"13px"},footer:{padding:"12px 16px",borderTop:"1px solid #334155",display:"flex",gap:"8px"},saveButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"rgba(59, 130, 246, 0.15)",color:"#3b82f6",fontSize:"13px",fontWeight:600,cursor:"pointer"},publishButton:{flex:1,padding:"10px",borderRadius:"8px",border:"none",background:"#22c55e",color:"white",fontSize:"13px",fontWeight:600,cursor:"pointer"},editForm:{padding:"4px 0"},editHeader:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"12px",fontSize:"13px",fontWeight:600,color:"#e2e8f0"},editLabel:{fontSize:"11px",fontWeight:600,color:"#64748b",marginBottom:"4px",display:"block"},editInput:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",boxSizing:"border-box"},editTextarea:{width:"100%",padding:"6px 8px",borderRadius:"4px",border:"1px solid rgba(255,255,255,0.1)",background:"rgba(255,255,255,0.04)",color:"#e2e8f0",fontSize:"12px",fontFamily:"inherit",marginBottom:"8px",resize:"vertical",minHeight:"60px",boxSizing:"border-box"},editRationale:{padding:"8px",borderRadius:"4px",border:"1px dashed rgba(255,255,255,0.15)",background:"rgba(255,255,255,0.02)",color:"#94a3b8",fontSize:"12px",marginBottom:"8px"},editBackButton:{padding:"6px 12px",borderRadius:"6px",border:"1px solid rgba(255,255,255,0.1)",background:"transparent",color:"#94a3b8",fontSize:"12px",cursor:"pointer",marginTop:"8px"}};function Qe({config:e,onChange:n,editor:t}){let r=e,[a,l]=C(new Set),[d,R]=C(!1),[h,x]=C(null),[S,A]=C("after"),[Q,y]=C(null),I=U(!1);D(()=>{!I.current&&(t.initialEditKey!=null||t.initialCreate)&&(I.current=!0,t.clearInitialState?.())},[t]);let F=Ce(r),v=F.filter(o=>!a.has(o.key)),z=F.filter(o=>a.has(o.key)),_=v.length,H=Fe(F,t.getCurrentRoute),V=v.filter(o=>H.get(o.key)?.found).length,$=k(o=>{l(m=>{let f=new Set(m);return f.add(o),f}),h===o&&x(null)},[h]),j=k(o=>{l(m=>{let f=new Set(m);return f.delete(o),f})},[]),W=k(o=>{x(o.key)},[]),s=k(o=>{let m=Se(o.question.showWhen);m&&t.navigateTo(m),o.firstAnchor&&t.highlightElement(o.firstAnchor)},[t]),u=k(()=>{x(null),A("after"),t.previewConfig(e),t.clearHighlight()},[t,e]),w=k(o=>{if(A(o),o==="before"){let m=oe(r,new Set([h]));t.previewConfig(m)}else t.previewConfig(e)},[r,h,t,e]),L=k((o,m,f)=>{let E=(r.actions||[]).filter(P).slice(),T={...E[o],config:{...E[o].config}};T.config[m]=f,E[o]=T;let xe=(r.actions||[]).filter(be=>!P(be)),me={...r,actions:[...xe,...E]};n(me),t.setDirty(!0)},[r,n,t]),N=k(()=>{if(a.size>0){let o=oe(r,a);n(o)}t.publish()},[a,r,n,t]),ue=k(o=>{y(o.key),o.firstAnchor&&t.highlightElement(o.firstAnchor)},[t]),ge=k(()=>{y(null),t.clearHighlight()},[t]),fe=o=>{let f=(r.actions||[]).filter(P)[o];if(!f)return null;let E=F.find(T=>T.key===String(o));return p("div",{style:c.editForm,children:[E&&E.trigger!=="All pages"&&p("div",{"data-trigger":!0,style:c.triggerLine,onClick:()=>s(E),children:[i("span",{children:"\u{1F4CD}"}),i("span",{children:E.trigger})]}),i("label",{style:c.editLabel,children:"Question"}),i("input",{style:c.editInput,value:f.config.question,onChange:T=>L(o,"question",T.target.value)}),i("label",{style:c.editLabel,children:"Answer"}),i("textarea",{style:c.editTextarea,value:we(f.config.answer),onChange:T=>L(o,"answer",T.target.value)}),i("label",{style:c.editLabel,children:"Category"}),i("input",{style:c.editInput,value:f.config.category||"",onChange:T=>L(o,"category",T.target.value||void 0),placeholder:"e.g., Billing, Account"}),i("label",{style:c.editLabel,children:"AI Rationale"}),i("div",{style:c.editRationale,children:f.rationale?f.rationale.why:"N/A"})]})};return p("div",{style:c.container,children:[p("div",{style:c.header,children:[i("button",{onClick:()=>t.navigateHome(),style:c.backButton,children:"\u2190 Back"}),p("div",{children:[i("h2",{style:c.title,children:"Review Questions"}),p("p",{style:c.subtitle,children:[_," question",_!==1?"s":"",_>0&&` (${V} found on this page)`]})]})]}),i("div",{style:c.body,children:h!==null?(()=>{let o=Number(h),m=F.find(f=>f.key===h);return p(O,{children:[p("div",{style:c.editHeader,children:[i("span",{children:"\u2753"}),i("span",{children:m?.summary})]}),p("div",{style:{display:"flex",gap:"0",marginBottom:"12px",borderRadius:"6px",overflow:"hidden",border:"1px solid rgba(255,255,255,0.1)"},children:[i("button",{onClick:()=>w("before"),style:{flex:1,padding:"6px 12px",border:"none",fontSize:"12px",fontWeight:600,cursor:"pointer",background:S==="before"?"rgba(59,130,246,0.2)":"transparent",color:S==="before"?"#3b82f6":"#64748b"},children:"Before"}),i("button",{onClick:()=>w("after"),style:{flex:1,padding:"6px 12px",border:"none",borderLeft:"1px solid rgba(255,255,255,0.1)",fontSize:"12px",fontWeight:600,cursor:"pointer",background:S==="after"?"rgba(59,130,246,0.2)":"transparent",color:S==="after"?"#3b82f6":"#64748b"},children:"After"})]}),fe(o),i("button",{style:c.editBackButton,onClick:u,children:"\u2190 List"})]})})():p(O,{children:[F.length===0&&i("div",{style:c.emptyState,children:"No FAQ questions configured."}),v.length>0&&p(O,{children:[p("div",{style:c.groupHeader,children:[i("span",{children:"FAQ"}),i("span",{style:c.groupCount,children:v.length})]}),v.map(o=>{let m=H.get(o.key);return p("div",{style:c.card,"data-item-key":o.key,onMouseEnter:()=>ue(o),onMouseLeave:ge,children:[o.trigger!=="All pages"&&p("div",{"data-trigger":!0,style:c.triggerLine,onClick:f=>{f.stopPropagation(),s(o)},children:[i("span",{children:"\u{1F4CD}"}),i("span",{children:o.trigger})]}),p("div",{"data-card-body":!0,style:c.cardBody,onClick:()=>W(o),children:[i(Re,{found:m?.found??!1}),i("span",{style:c.cardText,children:o.summary}),i("button",{style:c.dismissButton,onClick:f=>{f.stopPropagation(),$(o.key)},title:"Dismiss this question",children:"\xD7"})]}),p("div",{style:c.rationaleLine,children:["WHY: ",o.rationale?o.rationale.why:"N/A"]})]},o.key)})]}),z.length>0&&p("div",{style:c.dismissedSection,children:[p("div",{style:{...c.dismissedHeader,cursor:"pointer"},onClick:()=>R(!d),children:[i("span",{children:d?"\u25BE":"\u25B8"}),p("span",{children:["Dismissed (",z.length,")"]})]}),d&&i("div",{style:{marginTop:"6px"},children:z.map(o=>p("div",{style:c.dismissedCard,children:[i("span",{style:{...c.cardText,textDecoration:"line-through"},children:o.summary}),i("button",{style:{...c.dismissButton,color:"#3b82f6",fontSize:"11px"},onClick:m=>{m.stopPropagation(),j(o.key)},children:"Restore"})]},o.key))})]})]})}),p("div",{style:c.footer,children:[i("button",{onClick:()=>t.save(),style:c.saveButton,children:"Save Draft"}),i("button",{onClick:N,style:c.publishButton,children:"Publish"})]})]})}var re={title:"FAQ",icon:"\u2753",description:"FAQ accordion with per-item visibility"};var ie=Qe;function ae(e,n,t){if(n){let r=e.getState().items.find(a=>a.config.id===n);if(r)return r}if(t){let r=e.findByQuestion(t);if(r)return r}throw new Error("FAQ item not found")}async function Te(e,n,t){let r=ae(t,e.itemId,e.itemQuestion),{id:a}=r.config;e.expand!==!1&&t.expand(a);let l=document.querySelector(`[data-faq-item-id="${a}"]`);return l&&l.scrollIntoView({behavior:e.behavior??"smooth"}),n.publishEvent("faq:scroll_to",{itemId:a}),{cleanup:()=>{}}}async function Ee(e,n,t){let r=ae(t,e.itemId,e.itemQuestion),{id:a}=r.config,l=e.state??"toggle",d;switch(l){case"open":t.expand(a),d="open";break;case"closed":t.collapse(a),d="closed";break;default:{let R=t.getState().expandedItems.has(a);t.toggle(a),d=R?"closed":"open";break}}return n.publishEvent("faq:toggle",{itemId:a,newState:d}),{cleanup:()=>{}}}async function Ie(e,n,t){switch(e.operation){case"add":{let r=e.items??[],a=e.position==="prepend"?"prepend":"append";t.addItems(r,a);break}case"remove":{if(!e.itemId)throw new Error("FAQ item not found");if(!t.getState().items.some(a=>a.config.id===e.itemId))throw new Error("FAQ item not found");t.removeItem(e.itemId);break}case"reorder":{let r=e.order??[];t.reorderItems(r);break}case"replace":{let r=e.items??[];t.replaceItems(r);break}}return n.publishEvent("faq:update",{operation:e.operation}),{cleanup:()=>{}}}var se=[{kind:"faq:scroll_to",executor:Te},{kind:"faq:toggle_item",executor:Ee},{kind:"faq:update",executor:Ie}];var ce=globalThis.__SYNTRO_REACT_DOM__;var Y=ce?.createRoot,lt=ce?.createPortal;function le(e){return typeof e=="string"?e:e.type==="rich"?e.html:e.content}function qe(e){return typeof e=="string"?i("p",{style:{margin:0},children:e}):e.type==="rich"?i("div",{style:{margin:0},dangerouslySetInnerHTML:{__html:e.html}}):i("p",{style:{margin:0},children:e.content})}function Pe(e){return e?e===!0?{style:"thumbs"}:e:null}function Be(e){return e.prompt||"Was this helpful?"}var b={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"}},B={light:{container:{backgroundColor:"#ffffff",color:"#111827"},searchInput:{backgroundColor:"#f9fafb",border:"1px solid #e5e7eb",color:"#111827"},item:{backgroundColor:"#f9fafb",border:"1px solid #e5e7eb"},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.08)"},question:{backgroundColor:"transparent",color:"#111827"},questionHover:{backgroundColor:"#f3f4f6"},answer:{color:"#4b5563"},category:{backgroundColor:"#e0e7ff",color:"#4338ca"},categoryHeader:{color:"#6b7280"},emptyState:{color:"#9ca3af"},feedbackPrompt:{color:"#6b7280"}},dark:{container:{backgroundColor:"#111827",color:"#f9fafb"},searchInput:{backgroundColor:"#1f2937",border:"1px solid #374151",color:"#f9fafb"},item:{backgroundColor:"#1f2937",border:"1px solid #374151"},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.3)"},question:{backgroundColor:"transparent",color:"#f9fafb"},questionHover:{backgroundColor:"#374151"},answer:{color:"#9ca3af"},category:{backgroundColor:"#312e81",color:"#a5b4fc"},categoryHeader:{color:"#9ca3af"},emptyState:{color:"#6b7280"},feedbackPrompt:{color:"#9ca3af"}}};function Me({item:e,isExpanded:n,onToggle:t,theme:r,feedbackConfig:a,feedbackValue:l,onFeedback:d}){let[R,h]=C(!1),x=B[r],{question:S,answer:A}=e.config,Q={...b.item,...x.item,...n?x.itemExpanded:{}},y={...b.question,...x.question,...R?x.questionHover:{}},I={...b.chevron,transform:n?"rotate(180deg)":"rotate(0deg)"},F={...b.answer,...x.answer,maxHeight:n?"500px":"0",paddingBottom:n?"16px":"0"},v={...b.feedback,...x.feedbackPrompt};return p("div",{style:Q,"data-faq-item-id":e.config.id,children:[p("button",{style:y,onClick:t,onMouseEnter:()=>h(!0),onMouseLeave:()=>h(!1),"aria-expanded":n,children:[i("span",{children:S}),i("span",{style:I,children:"\u25BC"})]}),p("div",{style:F,"aria-hidden":!n,children:[qe(A),n&&a&&p("div",{style:v,children:[i("span",{children:Be(a)}),i("button",{style:{...b.feedbackButton,...l==="up"?b.feedbackButtonSelected:{}},"aria-label":"Thumbs up",onClick:()=>d(e.config.id,S,"up"),children:"\u{1F44D}"}),i("button",{style:{...b.feedbackButton,...l==="down"?b.feedbackButtonSelected:{}},"aria-label":"Thumbs down",onClick:()=>d(e.config.id,S,"down"),children:"\u{1F44E}"})]})]})]})}function ze({config:e,runtime:n,instanceId:t}){let[,r]=G(s=>s+1,0),[a,l]=C(new Set),[d,R]=C(""),[h,x]=C(new Map),S=q(()=>Pe(e.feedback),[e.feedback]);D(()=>n.context.subscribe(()=>{r()}),[n.context]);let A=q(()=>e.actions.filter(s=>s.showWhen?n.evaluateSync(s.showWhen).value:!0),[e.actions,n]),Q=q(()=>e.ordering==="priority"?[...A].sort((s,u)=>(u.config.priority??0)-(s.config.priority??0)):A,[A,e.ordering]),y=q(()=>{if(!e.searchable||!d.trim())return Q;let s=d.toLowerCase();return Q.filter(u=>u.config.question.toLowerCase().includes(s)||le(u.config.answer).toLowerCase().includes(s)||u.config.category?.toLowerCase().includes(s))},[Q,d,e.searchable]),I=q(()=>{let s=new Map;for(let u of y){let w=u.config.category;s.has(w)||s.set(w,[]),s.get(w).push(u)}return s},[y]),F=q(()=>y.some(s=>s.config.category),[y]),v=q(()=>e.theme!=="auto"?e.theme:typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",[e.theme]),z=k(s=>{l(u=>{let w=new Set(u);return e.expandBehavior==="single"?u.has(s)?new Set:new Set([s]):(u.has(s)?w.delete(s):w.add(s),w)}),n.events.publish("faq:toggled",{instanceId:t,questionId:s,expanded:!a.has(s),timestamp:Date.now()})},[e.expandBehavior,n.events,t,a]),_=k((s,u,w)=>{x(L=>{let N=new Map(L);return N.set(s,w),N}),n.events.publish("faq:feedback",{itemId:s,question:u,value:w})},[n.events]),H={...b.container,...B[v].container},V={...b.searchInput,...B[v].searchInput},$={...b.emptyState,...B[v].emptyState},j={...b.categoryHeader,...B[v].categoryHeader},W=s=>s.map(u=>i(Me,{item:u,isExpanded:a.has(u.config.id),onToggle:()=>z(u.config.id),theme:v,feedbackConfig:S,feedbackValue:h.get(u.config.id),onFeedback:_},u.config.id));return A.length===0?i("div",{style:H,"data-adaptive-id":t,"data-adaptive-type":"adaptive-faq",children:i("div",{style:$,children:"No FAQ questions available."})}):p("div",{style:H,"data-adaptive-id":t,"data-adaptive-type":"adaptive-faq",children:[e.searchable&&i("div",{style:b.searchWrapper,children:i("input",{type:"text",placeholder:"Search questions...",value:d,onChange:s=>R(s.target.value),style:V})}),i("div",{style:b.accordion,children:F?Array.from(I.entries()).map(([s,u])=>p(K.Fragment,{children:[s&&i("div",{style:j,"data-category-header":s,children:s}),W(u)]},s??"__ungrouped")):W(y)}),e.searchable&&y.length===0&&d&&p("div",{style:{...b.noResults,...B[v].emptyState},children:['No questions found matching "',d,'"']})]})}var de={mount(e,n){let{runtime:t,instanceId:r="faq-widget",...a}=n||{expandBehavior:"single",searchable:!1,theme:"auto",actions:[]};if(t&&typeof Y=="function"){let d=Y(e);return d.render(K.createElement(ze,{config:a,runtime:t,instanceId:r})),()=>{d.unmount()}}let l=a.actions||[];return e.innerHTML=`
2
+ <div style="font-family: system-ui; max-width: 800px;">
3
+ ${l.map(d=>`
4
+ <div style="margin-bottom: 8px; padding: 16px; background: #f9fafb; border-radius: 8px;">
5
+ <strong>${d.config.question}</strong>
6
+ <p style="margin-top: 8px; color: #4b5563;">${le(d.config.answer)}</p>
7
+ </div>
8
+ `).join("")}
9
+ </div>
10
+ `,()=>{e.innerHTML=""}}};var M={id:"adaptive-faq",version:"2.0.0",name:"FAQ Accordion",description:"Collapsible Q&A accordion with actions, rich content, feedback, and personalization",executors:se,widgets:[{id:"adaptive-faq:accordion",component:de,metadata:{name:"FAQ Accordion",description:"Collapsible Q&A accordion with search, categories, and feedback",icon:"\u2753"}}]};var pe={id:"adaptive-faq",version:M.version,name:M.name,description:M.description,runtime:{actions:M.executors,widgets:M.widgets},editor:{component:ie,panel:re},metadata:{isBuiltIn:!1}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(pe)}var vt=pe;export{vt as default,pe as manifest};
11
+ //# sourceMappingURL=index.js.map