@syntrologie/runtime-sdk 2.1.0 → 2.2.0-canary.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CAPABILITIES.md +50 -43
- package/README.md +7 -7
- package/dist/RuntimeProvider.d.ts +1 -1
- package/dist/ShadowRootContext.d.ts +19 -0
- package/dist/SmartCanvasApp.d.ts +7 -4
- package/dist/SmartCanvasElement.d.ts +7 -2
- package/dist/SmartCanvasPortal.d.ts +1 -1
- package/dist/actions/executors/core-flow.d.ts +19 -0
- package/dist/actions/executors/index.d.ts +4 -3
- package/dist/actions/executors/tour.d.ts +1 -1
- package/dist/actions/index.d.ts +4 -3
- package/dist/actions/schema.d.ts +1229 -0
- package/dist/actions/schema.js +67 -0
- package/dist/actions/schema.js.map +7 -0
- package/dist/api.d.ts +4 -2
- package/dist/apps/builtinRuntimeModules.generated.d.ts +20 -0
- package/dist/apps/examples/gamification-app.example.d.ts +4 -4
- package/dist/apps/index.d.ts +7 -7
- package/dist/blocks/data/index.d.ts +1 -1
- package/dist/blocks/index.d.ts +2 -2
- package/dist/blocks/interactive/index.d.ts +1 -1
- package/dist/blocks/notification/NotificationBlock.d.ts +1 -1
- package/dist/blocks/notification/index.d.ts +1 -1
- package/dist/bootstrap.d.ts +4 -4
- package/dist/chunk-AYTRRBR5.js +251 -0
- package/dist/chunk-AYTRRBR5.js.map +7 -0
- package/dist/chunk-VLWWR22N.js +9266 -0
- package/dist/chunk-VLWWR22N.js.map +7 -0
- package/dist/components/ShadowCanvasOverlay.d.ts +2 -2
- package/dist/components/TileCard.d.ts +1 -1
- package/dist/context/ContextManager.d.ts +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/decisions/engine.d.ts +1 -1
- package/dist/decisions/index.d.ts +3 -3
- package/dist/decisions/schema.d.ts +24 -24
- package/dist/decisions/strategies/rules.d.ts +1 -1
- package/dist/decisions/strategies/score.d.ts +1 -1
- package/dist/editorLoader.d.ts +4 -4
- package/dist/events/EventAccumulator.d.ts +1 -1
- package/dist/events/EventBus.d.ts +1 -1
- package/dist/events/index.d.ts +7 -6
- package/dist/events/registerConfigPredicates.d.ts +19 -0
- package/dist/experiments/adapters/growthbook.d.ts +1 -1
- package/dist/experiments/index.d.ts +2 -2
- package/dist/experiments/registry.d.ts +1 -1
- package/dist/fetchers/index.d.ts +2 -2
- package/dist/hooks/useShadowCanvasConfig.d.ts +1 -1
- package/dist/hostPatcher/index.d.ts +2 -2
- package/dist/index.d.ts +24 -21
- package/dist/index.js +2349 -75
- package/dist/index.js.map +7 -1
- package/dist/metrics/index.d.ts +1 -1
- package/dist/notifications/index.d.ts +6 -6
- package/dist/overlays/runtime/index.d.ts +3 -3
- package/dist/overlays/runtime/overlay/root.d.ts +17 -1
- package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
- package/dist/react.js +90 -134
- package/dist/react.js.map +7 -1
- package/dist/render/RenderContext.d.ts +2 -2
- package/dist/render/index.d.ts +2 -2
- package/dist/render/types.d.ts +2 -2
- package/dist/runtime.d.ts +8 -8
- package/dist/smart-canvas.esm.js +158 -126
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +18872 -16744
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +158 -126
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +1 -1
- package/dist/state/helpers/cooldowns.d.ts +1 -1
- package/dist/state/helpers/dismissals.d.ts +1 -1
- package/dist/state/helpers/frequency.d.ts +1 -1
- package/dist/state/index.d.ts +3 -3
- package/dist/surfaces/index.d.ts +3 -3
- package/dist/surfaces/positioning.d.ts +1 -1
- package/dist/telemetry/adapters/posthog.d.ts +2 -2
- package/dist/telemetry/index.d.ts +3 -3
- package/dist/telemetry/registry.d.ts +1 -1
- package/dist/telemetry/types.d.ts +5 -0
- package/dist/theme/ThemeProvider.d.ts +1 -1
- package/dist/theme/extractHostTheme.d.ts +1 -1
- package/dist/theme/index.d.ts +4 -4
- package/dist/types-only.d.ts +1 -1
- package/dist/types-only.js +1 -11
- package/dist/types-only.js.map +7 -1
- package/dist/types.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/widgets/index.d.ts +1 -1
- package/package.json +29 -17
- package/schema/canvas-config.base.schema.json +351 -0
- package/schema/canvas-config.schema.json +3308 -444
- package/scripts/validate-config.mjs +54 -58
- package/dist/RuntimeProvider.js +0 -113
- package/dist/RuntimeProvider.js.map +0 -1
- package/dist/SmartCanvasApp.js +0 -143
- package/dist/SmartCanvasApp.js.map +0 -1
- package/dist/SmartCanvasElement.js +0 -138
- package/dist/SmartCanvasElement.js.map +0 -1
- package/dist/SmartCanvasPortal.js +0 -17
- package/dist/SmartCanvasPortal.js.map +0 -1
- package/dist/actions/ActionEngine.js +0 -272
- package/dist/actions/ActionEngine.js.map +0 -1
- package/dist/actions/executors/index.js +0 -240
- package/dist/actions/executors/index.js.map +0 -1
- package/dist/actions/executors/tour.js +0 -332
- package/dist/actions/executors/tour.js.map +0 -1
- package/dist/actions/index.js +0 -12
- package/dist/actions/index.js.map +0 -1
- package/dist/actions/types.js +0 -8
- package/dist/actions/types.js.map +0 -1
- package/dist/actions/validation.js +0 -577
- package/dist/actions/validation.js.map +0 -1
- package/dist/adaptives/adaptive-chatbot/index.js +0 -9
- package/dist/adaptives/adaptive-chatbot/index.js.map +0 -7
- package/dist/adaptives/adaptive-content/index.js +0 -22
- package/dist/adaptives/adaptive-content/index.js.map +0 -7
- package/dist/adaptives/adaptive-faq/index.js +0 -11
- package/dist/adaptives/adaptive-faq/index.js.map +0 -7
- package/dist/adaptives/adaptive-gamification/index.js +0 -2
- package/dist/adaptives/adaptive-gamification/index.js.map +0 -7
- package/dist/adaptives/adaptive-nav/index.js +0 -12
- package/dist/adaptives/adaptive-nav/index.js.map +0 -7
- package/dist/adaptives/adaptive-overlays/index.js +0 -94
- package/dist/adaptives/adaptive-overlays/index.js.map +0 -7
- package/dist/antiFlicker.js +0 -39
- package/dist/antiFlicker.js.map +0 -1
- package/dist/api.js +0 -205
- package/dist/api.js.map +0 -1
- package/dist/apps/AppContext.js +0 -91
- package/dist/apps/AppContext.js.map +0 -1
- package/dist/apps/AppLoader.js +0 -293
- package/dist/apps/AppLoader.js.map +0 -1
- package/dist/apps/AppRegistry.js +0 -317
- package/dist/apps/AppRegistry.js.map +0 -1
- package/dist/apps/examples/gamification-app.example.js +0 -329
- package/dist/apps/examples/gamification-app.example.js.map +0 -1
- package/dist/apps/index.js +0 -16
- package/dist/apps/index.js.map +0 -1
- package/dist/apps/types.js +0 -8
- package/dist/apps/types.js.map +0 -1
- package/dist/blocks/data/ComparisonBlock.js +0 -95
- package/dist/blocks/data/ComparisonBlock.js.map +0 -1
- package/dist/blocks/data/StatsBlock.js +0 -102
- package/dist/blocks/data/StatsBlock.js.map +0 -1
- package/dist/blocks/data/index.js +0 -3
- package/dist/blocks/data/index.js.map +0 -1
- package/dist/blocks/index.js +0 -93
- package/dist/blocks/index.js.map +0 -1
- package/dist/blocks/interactive/ChecklistBlock.js +0 -111
- package/dist/blocks/interactive/ChecklistBlock.js.map +0 -1
- package/dist/blocks/interactive/RatingBlock.js +0 -147
- package/dist/blocks/interactive/RatingBlock.js.map +0 -1
- package/dist/blocks/interactive/index.js +0 -3
- package/dist/blocks/interactive/index.js.map +0 -1
- package/dist/blocks/notification/NotificationBlock.js +0 -171
- package/dist/blocks/notification/NotificationBlock.js.map +0 -1
- package/dist/blocks/notification/index.js +0 -2
- package/dist/blocks/notification/index.js.map +0 -1
- package/dist/blocks/theme-tokens.js +0 -25
- package/dist/blocks/theme-tokens.js.map +0 -1
- package/dist/bootstrap.js +0 -448
- package/dist/bootstrap.js.map +0 -1
- package/dist/bundle-entry.js +0 -9
- package/dist/bundle-entry.js.map +0 -1
- package/dist/components/ShadowCanvasOverlay.js +0 -327
- package/dist/components/ShadowCanvasOverlay.js.map +0 -1
- package/dist/components/TileCard.js +0 -103
- package/dist/components/TileCard.js.map +0 -1
- package/dist/components/TileWheel.js +0 -50
- package/dist/components/TileWheel.js.map +0 -1
- package/dist/config-validator.js +0 -173
- package/dist/config-validator.js.map +0 -1
- package/dist/configFetcher.js +0 -131
- package/dist/configFetcher.js.map +0 -1
- package/dist/context/ContextManager.js +0 -269
- package/dist/context/ContextManager.js.map +0 -1
- package/dist/context/index.js +0 -7
- package/dist/context/index.js.map +0 -1
- package/dist/context/schema.js +0 -50
- package/dist/context/schema.js.map +0 -1
- package/dist/context/types.js +0 -8
- package/dist/context/types.js.map +0 -1
- package/dist/controller.js +0 -34
- package/dist/controller.js.map +0 -1
- package/dist/decisions/engine.js +0 -117
- package/dist/decisions/engine.js.map +0 -1
- package/dist/decisions/index.js +0 -10
- package/dist/decisions/index.js.map +0 -1
- package/dist/decisions/schema.js +0 -151
- package/dist/decisions/schema.js.map +0 -1
- package/dist/decisions/strategies/rules.js +0 -166
- package/dist/decisions/strategies/rules.js.map +0 -1
- package/dist/decisions/strategies/score.js +0 -29
- package/dist/decisions/strategies/score.js.map +0 -1
- package/dist/decisions/types.js +0 -2
- package/dist/decisions/types.js.map +0 -1
- package/dist/earlyPatcher.js +0 -20
- package/dist/earlyPatcher.js.map +0 -1
- package/dist/editorLoader.js +0 -254
- package/dist/editorLoader.js.map +0 -1
- package/dist/events/EventAccumulator.js +0 -101
- package/dist/events/EventAccumulator.js.map +0 -1
- package/dist/events/EventBus.js +0 -152
- package/dist/events/EventBus.js.map +0 -1
- package/dist/events/index.js +0 -11
- package/dist/events/index.js.map +0 -1
- package/dist/events/normalizers/canvas.js +0 -116
- package/dist/events/normalizers/canvas.js.map +0 -1
- package/dist/events/normalizers/posthog.js +0 -171
- package/dist/events/normalizers/posthog.js.map +0 -1
- package/dist/events/schema.js +0 -30
- package/dist/events/schema.js.map +0 -1
- package/dist/events/types.js +0 -54
- package/dist/events/types.js.map +0 -1
- package/dist/experiments/adapters/growthbook.js +0 -81
- package/dist/experiments/adapters/growthbook.js.map +0 -1
- package/dist/experiments/index.js +0 -4
- package/dist/experiments/index.js.map +0 -1
- package/dist/experiments/registry.js +0 -30
- package/dist/experiments/registry.js.map +0 -1
- package/dist/experiments/types.js +0 -2
- package/dist/experiments/types.js.map +0 -1
- package/dist/fetchers/cdnFetcher.js +0 -96
- package/dist/fetchers/cdnFetcher.js.map +0 -1
- package/dist/fetchers/experimentsFetcher.js +0 -109
- package/dist/fetchers/experimentsFetcher.js.map +0 -1
- package/dist/fetchers/index.js +0 -5
- package/dist/fetchers/index.js.map +0 -1
- package/dist/fetchers/mergeConfigs.js +0 -38
- package/dist/fetchers/mergeConfigs.js.map +0 -1
- package/dist/fetchers/registry.js +0 -58
- package/dist/fetchers/registry.js.map +0 -1
- package/dist/fetchers/types.js +0 -2
- package/dist/fetchers/types.js.map +0 -1
- package/dist/hooks/useCanvasOverlays.js +0 -128
- package/dist/hooks/useCanvasOverlays.js.map +0 -1
- package/dist/hooks/useHostPatches.js +0 -40
- package/dist/hooks/useHostPatches.js.map +0 -1
- package/dist/hooks/useShadowCanvasConfig.js +0 -63
- package/dist/hooks/useShadowCanvasConfig.js.map +0 -1
- package/dist/hostPatcher/core/patcher.js +0 -181
- package/dist/hostPatcher/core/patcher.js.map +0 -1
- package/dist/hostPatcher/core/sanitizer.js +0 -66
- package/dist/hostPatcher/core/sanitizer.js.map +0 -1
- package/dist/hostPatcher/core/types.js +0 -2
- package/dist/hostPatcher/core/types.js.map +0 -1
- package/dist/hostPatcher/index.js +0 -7
- package/dist/hostPatcher/index.js.map +0 -1
- package/dist/hostPatcher/policy/defaultPolicy.js +0 -23
- package/dist/hostPatcher/policy/defaultPolicy.js.map +0 -1
- package/dist/hostPatcher/utils/anchors.js +0 -105
- package/dist/hostPatcher/utils/anchors.js.map +0 -1
- package/dist/hostPatcher/utils/observer.js +0 -11
- package/dist/hostPatcher/utils/observer.js.map +0 -1
- package/dist/logger.js +0 -81
- package/dist/logger.js.map +0 -1
- package/dist/metrics/index.js +0 -5
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/sessionMetrics.js +0 -178
- package/dist/metrics/sessionMetrics.js.map +0 -1
- package/dist/notifications/NotificationToastStack.js +0 -118
- package/dist/notifications/NotificationToastStack.js.map +0 -1
- package/dist/notifications/index.js +0 -6
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/matcher.js +0 -66
- package/dist/notifications/matcher.js.map +0 -1
- package/dist/notifications/types.js +0 -13
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/useNotifications.js +0 -104
- package/dist/notifications/useNotifications.js.map +0 -1
- package/dist/notifications/useNotifyWatcher.js +0 -62
- package/dist/notifications/useNotifyWatcher.js.map +0 -1
- package/dist/overlays/fetcher.js +0 -15
- package/dist/overlays/fetcher.js.map +0 -1
- package/dist/overlays/recipeRegistry.js +0 -32
- package/dist/overlays/recipeRegistry.js.map +0 -1
- package/dist/overlays/runtime/anchor/resolve.js +0 -87
- package/dist/overlays/runtime/anchor/resolve.js.map +0 -1
- package/dist/overlays/runtime/index.js +0 -8
- package/dist/overlays/runtime/index.js.map +0 -1
- package/dist/overlays/runtime/overlay/highlight.js +0 -160
- package/dist/overlays/runtime/overlay/highlight.js.map +0 -1
- package/dist/overlays/runtime/overlay/modal.js +0 -78
- package/dist/overlays/runtime/overlay/modal.js.map +0 -1
- package/dist/overlays/runtime/overlay/root.js +0 -297
- package/dist/overlays/runtime/overlay/root.js.map +0 -1
- package/dist/overlays/runtime/overlay/runner.js +0 -602
- package/dist/overlays/runtime/overlay/runner.js.map +0 -1
- package/dist/overlays/runtime/overlay/tooltip.js +0 -232
- package/dist/overlays/runtime/overlay/tooltip.js.map +0 -1
- package/dist/overlays/runtime/utils/dom.js +0 -12
- package/dist/overlays/runtime/utils/dom.js.map +0 -1
- package/dist/overlays/schema.js +0 -52
- package/dist/overlays/schema.js.map +0 -1
- package/dist/overlays/types.js +0 -2
- package/dist/overlays/types.js.map +0 -1
- package/dist/render/RenderContext.js +0 -69
- package/dist/render/RenderContext.js.map +0 -1
- package/dist/render/index.js +0 -3
- package/dist/render/index.js.map +0 -1
- package/dist/render/types.js +0 -2
- package/dist/render/types.js.map +0 -1
- package/dist/runtime.js +0 -237
- package/dist/runtime.js.map +0 -1
- package/dist/state/StateStore.js +0 -176
- package/dist/state/StateStore.js.map +0 -1
- package/dist/state/helpers/cooldowns.js +0 -31
- package/dist/state/helpers/cooldowns.js.map +0 -1
- package/dist/state/helpers/dismissals.js +0 -34
- package/dist/state/helpers/dismissals.js.map +0 -1
- package/dist/state/helpers/frequency.js +0 -43
- package/dist/state/helpers/frequency.js.map +0 -1
- package/dist/state/index.js +0 -7
- package/dist/state/index.js.map +0 -1
- package/dist/state/schema.js +0 -25
- package/dist/state/schema.js.map +0 -1
- package/dist/state/types.js +0 -9
- package/dist/state/types.js.map +0 -1
- package/dist/store/example.js +0 -43
- package/dist/store/example.js.map +0 -1
- package/dist/store/mini-effector.js +0 -88
- package/dist/store/mini-effector.js.map +0 -1
- package/dist/surfaces/Surfaces.js +0 -361
- package/dist/surfaces/Surfaces.js.map +0 -1
- package/dist/surfaces/index.js +0 -12
- package/dist/surfaces/index.js.map +0 -1
- package/dist/surfaces/positioning.js +0 -228
- package/dist/surfaces/positioning.js.map +0 -1
- package/dist/surfaces/types.js +0 -23
- package/dist/surfaces/types.js.map +0 -1
- package/dist/telemetry/adapters/noop.js +0 -42
- package/dist/telemetry/adapters/noop.js.map +0 -1
- package/dist/telemetry/adapters/posthog.js +0 -180
- package/dist/telemetry/adapters/posthog.js.map +0 -1
- package/dist/telemetry/index.js +0 -4
- package/dist/telemetry/index.js.map +0 -1
- package/dist/telemetry/registry.js +0 -29
- package/dist/telemetry/registry.js.map +0 -1
- package/dist/telemetry/types.js +0 -2
- package/dist/telemetry/types.js.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -109
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/defaultTheme.js +0 -190
- package/dist/theme/defaultTheme.js.map +0 -1
- package/dist/theme/extractHostTheme.js +0 -259
- package/dist/theme/extractHostTheme.js.map +0 -1
- package/dist/theme/index.js +0 -7
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/types.js +0 -6
- package/dist/theme/types.js.map +0 -1
- package/dist/token.js +0 -44
- package/dist/token.js.map +0 -1
- package/dist/types.js +0 -17
- package/dist/types.js.map +0 -1
- package/dist/version.js +0 -14
- package/dist/version.js.map +0 -1
- package/dist/widgets/WidgetRegistry.js +0 -190
- package/dist/widgets/WidgetRegistry.js.map +0 -1
- package/dist/widgets/index.js +0 -7
- package/dist/widgets/index.js.map +0 -1
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../adaptives/shared-editor-ui/dist/cn.js", "syntro-react:react/jsx-runtime", "../../../../adaptives/shared-editor-ui/dist/components/EditorLayout.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorHeader.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorBody.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorFooter.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorCard.js", "../../../../adaptives/shared-editor-ui/dist/components/DetectionBadge.js", "syntro-react:react", "../../../../adaptives/shared-editor-ui/dist/components/DismissedSection.js", "../../../../adaptives/shared-editor-ui/dist/components/GroupHeader.js", "../../../../adaptives/shared-editor-ui/dist/components/BeforeAfterToggle.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorInput.js", "../../../../adaptives/shared-editor-ui/dist/components/EditorTextarea.js", "../../../../adaptives/shared-editor-ui/dist/components/EditBackButton.js", "../../../../adaptives/shared-editor-ui/dist/components/EmptyState.js", "../../../../adaptives/shared-editor-ui/dist/formatConditionLabel.js", "../../../../adaptives/shared-editor-ui/dist/components/ConditionStatusLine.js", "../../../../adaptives/shared-editor-ui/dist/hooks/useShowWhenStatus.js", "../../../../adaptives/adaptive-faq/src/summarize.ts", "../../../../adaptives/adaptive-faq/src/types.ts", "../../../../adaptives/adaptive-faq/src/editor.tsx", "../../../../adaptives/adaptive-faq/src/executors.ts", "../../../../../design-system/dist/tokens/colors.js", "syntro-react:react-dom/client", "../../../../adaptives/adaptive-faq/src/FAQWidget.tsx", "../../../../adaptives/adaptive-faq/src/runtime.ts", "../../../../adaptives/adaptive-faq/src/cdn.ts"],
|
|
4
|
-
"sourcesContent": ["export function cn(...classes) {\n return classes.filter(Boolean).join(' ');\n}\n", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n function _jsx(type, props, key) {\n var R = _R();\n var p = props || {};\n var c = p.children;\n delete p.children;\n if (key !== undefined) p.key = key;\n return Array.isArray(c)\n ? R.createElement.apply(null, [type, p].concat(c))\n : c !== undefined\n ? R.createElement(type, p, c)\n : R.createElement(type, p);\n }\n export var jsx = _jsx;\n export var jsxs = _jsx;\n export var Fragment = _R().Fragment;\n ", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorLayout({ children }) {\n return _jsx(\"div\", { className: \"se-flex se-flex-col se-h-full se-font-sans\", children: children });\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorHeader({ title, subtitle, onBack }) {\n return (_jsxs(\"div\", { className: \"se-p-4 se-border-b se-border-border-primary se-flex se-items-center se-gap-3\", children: [_jsx(\"button\", { onClick: onBack, className: \"se-px-3 se-py-1.5 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer hover:se-text-btn-neutral-text-hover\", children: \"\\u2190 Back\" }), _jsxs(\"div\", { children: [_jsx(\"h2\", { className: \"se-m-0 se-text-base se-font-semibold se-text-text-primary\", children: title }), subtitle && (_jsx(\"p\", { className: \"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary\", children: subtitle }))] })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditorBody({ children }) {\n return _jsx(\"div\", { className: \"se-flex-1 se-overflow-auto se-p-6\", children: children });\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function EditorFooter({ onSave, onPublish }) {\n return (_jsxs(\"div\", { className: \"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2\", children: [_jsx(\"button\", { onClick: onSave, className: \"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-blue-5/15 se-text-blue-5 se-text-base se-font-semibold se-cursor-pointer\", children: \"Save Draft\" }), _jsx(\"button\", { onClick: onPublish, className: \"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-green-4 se-text-white se-text-base se-font-semibold se-cursor-pointer\", children: \"Publish\" })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorCard({ children, itemKey, onMouseEnter, onMouseLeave, className, validated, }) {\n return (_jsx(\"div\", { \"data-item-key\": itemKey, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, className: cn('se-py-2 se-px-2.5 se-rounded-lg se-border se-bg-card-bg se-shadow-sm se-mb-1 se-text-sm se-text-text-primary', validated ? 'se-border-green-4/40 se-shadow-glow-green' : 'se-border-border-primary', className), children: children }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function DetectionBadge({ found }) {\n return (_jsx(\"span\", { className: cn('se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block', found ? 'se-bg-green-4' : 'se-bg-text-tertiary'), title: found ? 'Found on this page' : 'Not found on this page' }));\n}\n", "\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n\n // Default export \u2014 lazy proxy for React.* access\n export default new Proxy({}, { get: function(_, k) { return _R()[k]; } });\n\n // Hooks \u2014 lazy function wrappers (resolve at call time)\n export function useState() { return _R().useState.apply(null, arguments); }\n export function useEffect() { return _R().useEffect.apply(null, arguments); }\n export function useMemo() { return _R().useMemo.apply(null, arguments); }\n export function useCallback() { return _R().useCallback.apply(null, arguments); }\n export function useRef() { return _R().useRef.apply(null, arguments); }\n export function useContext() { return _R().useContext.apply(null, arguments); }\n export function useReducer() { return _R().useReducer.apply(null, arguments); }\n export function useLayoutEffect() { return _R().useLayoutEffect.apply(null, arguments); }\n export function useId() { return _R().useId.apply(null, arguments); }\n\n // Creation APIs \u2014 lazy function wrappers\n export function createElement() { return _R().createElement.apply(null, arguments); }\n export function createContext() { return _R().createContext.apply(null, arguments); }\n export function forwardRef() { return _R().forwardRef.apply(null, arguments); }\n export function memo() { return _R().memo.apply(null, arguments); }\n export function lazy() { return _R().lazy.apply(null, arguments); }\n export function isValidElement() { return _R().isValidElement.apply(null, arguments); }\n export function cloneElement() { return _R().cloneElement.apply(null, arguments); }\n\n // Component types \u2014 resolved at module eval (runtime loads first)\n var _r = _R();\n export var Fragment = _r.Fragment;\n export var Suspense = _r.Suspense;\n export var Children = _r.Children;\n export var Component = _r.Component;\n export var PureComponent = _r.PureComponent;\n ", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useState } from 'react';\nexport function DismissedSection({ count, children }) {\n const [isOpen, setIsOpen] = useState(false);\n return (_jsxs(\"div\", { className: \"se-mt-4 se-cursor-pointer se-select-none\", children: [_jsxs(\"div\", { className: \"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer\", onClick: () => setIsOpen(!isOpen), children: [_jsx(\"span\", { children: isOpen ? '\\u25be' : '\\u25b8' }), _jsxs(\"span\", { children: [\"Dismissed (\", count, \")\"] })] }), isOpen && _jsx(\"div\", { className: \"se-mt-1.5\", children: children })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function GroupHeader({ label, count, className }) {\n return (_jsxs(\"div\", { className: cn('se-text-xs se-font-bold se-text-text-secondary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between', className), children: [_jsx(\"span\", { children: label }), _jsx(\"span\", { className: \"se-text-xs se-text-text-tertiary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg\", children: count })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function BeforeAfterToggle({ mode, onToggle }) {\n return (_jsxs(\"div\", { className: \"se-flex se-mb-3 se-rounded-lg se-overflow-hidden se-border se-border-border-primary\", children: [_jsx(\"button\", { onClick: () => onToggle('before'), className: cn('se-flex-1 se-py-1.5 se-px-3 se-border-none se-text-sm se-font-semibold se-cursor-pointer', mode === 'before'\n ? 'se-bg-blue-5/20 se-text-blue-5'\n : 'se-bg-transparent se-text-text-secondary'), children: \"Before\" }), _jsx(\"button\", { onClick: () => onToggle('after'), className: cn('se-flex-1 se-py-1.5 se-px-3 se-border-none se-border-l se-border-border-primary se-text-sm se-font-semibold se-cursor-pointer', mode === 'after'\n ? 'se-bg-blue-5/20 se-text-blue-5'\n : 'se-bg-transparent se-text-text-secondary'), children: \"After\" })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorInput({ label, className, ...props }) {\n return (_jsxs(\"div\", { children: [label && (_jsx(\"label\", { className: \"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block\", children: label })), _jsx(\"input\", { ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { cn } from '../cn';\nexport function EditorTextarea({ label, className, ...props }) {\n return (_jsxs(\"div\", { children: [label && (_jsx(\"label\", { className: \"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block\", children: label })), _jsx(\"textarea\", { ...props, className: cn('se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-resize-y se-min-h-[60px] se-box-border', 'placeholder:se-text-input-field-text-placeholder', 'focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected', 'disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50', className) })] }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EditBackButton({ onClick, label = '\\u2190 List' }) {\n return (_jsx(\"button\", { onClick: onClick, className: \"se-py-1.5 se-px-3 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer se-mt-2 hover:se-text-btn-neutral-text-hover\", children: label }));\n}\n", "import { jsx as _jsx } from \"react/jsx-runtime\";\nexport function EmptyState({ message }) {\n return (_jsx(\"div\", { className: \"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm\", children: message }));\n}\n", "/**\n * Format a showWhen condition into a human-readable label.\n * Pure function \u2014 no runtime dependency.\n */\n/**\n * Format match criteria as a parenthetical string.\n * { tagName: 'a' } \u2192 '(tagName: a)'\n */\nfunction formatMatch(match) {\n if (!match || Object.keys(match).length === 0)\n return '';\n const parts = Object.entries(match).map(([k, v]) => `${k}: ${v}`);\n return ` (${parts.join(', ')})`;\n}\n/**\n * Format an operator for display.\n */\nfunction formatOperator(op) {\n switch (op) {\n case 'gte': return '\\u2265'; // \u2265\n case 'lte': return '\\u2264'; // \u2264\n case 'gt': return '>';\n case 'lt': return '<';\n case 'eq': return '=';\n default: return op;\n }\n}\n/**\n * Convert a Condition object into a human-readable label.\n * For event_count conditions, also returns progress data.\n */\nexport function formatConditionLabel(condition, accumulatorCount) {\n switch (condition.type) {\n case 'event_count': {\n const event = condition.event;\n const match = condition.match;\n const op = condition.operator;\n const target = condition.count;\n const current = accumulatorCount ?? 0;\n return {\n label: `${event}${formatMatch(match)} ${formatOperator(op)} ${target}`,\n progress: { current, target, operator: op },\n };\n }\n case 'page_url':\n return { label: `${condition.url}` };\n case 'anchor_visible':\n return { label: `${condition.anchorId} (${condition.state})` };\n case 'event_occurred':\n return { label: `${condition.eventName}` };\n case 'state_equals':\n return { label: `${condition.key} = ${JSON.stringify(condition.value)}` };\n case 'viewport': {\n const parts = [];\n if (condition.minWidth !== undefined)\n parts.push(`w ${formatOperator('gte')} ${condition.minWidth}px`);\n if (condition.maxWidth !== undefined)\n parts.push(`w ${formatOperator('lte')} ${condition.maxWidth}px`);\n if (condition.minHeight !== undefined)\n parts.push(`h ${formatOperator('gte')} ${condition.minHeight}px`);\n if (condition.maxHeight !== undefined)\n parts.push(`h ${formatOperator('lte')} ${condition.maxHeight}px`);\n return { label: parts.join(', ') || 'any viewport' };\n }\n case 'session_metric':\n return { label: `${condition.key} ${formatOperator(condition.operator)} ${condition.threshold}` };\n case 'dismissed':\n return { label: condition.inverted ? 'not dismissed' : 'dismissed' };\n case 'cooldown_active':\n return { label: condition.inverted ? 'cooldown inactive' : 'cooldown active' };\n case 'frequency_limit':\n return { label: `shown ${formatOperator(condition.inverted ? 'lt' : 'gte')} ${condition.limit} times` };\n default:\n return { label: `${condition.type}` };\n }\n}\n", "import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from \"react/jsx-runtime\";\n/**\n * ConditionStatusLine \u2014 inline showWhen diagnostic on EditorCard.\n *\n * Shows a compact one-line status for items with showWhen conditions.\n * Click to expand per-condition detail.\n */\nimport { useState } from 'react';\nimport { cn } from '../cn';\nfunction ProgressBar({ current, target }) {\n const pct = Math.min(100, Math.round((current / Math.max(target, 1)) * 100));\n return (_jsx(\"span\", { className: \"se-inline-block se-w-12 se-h-1.5 se-rounded-full se-bg-white/10 se-align-middle se-ml-1\", title: `${current}/${target} (${pct}%)`, children: _jsx(\"span\", { className: cn('se-block se-h-full se-rounded-full se-transition-all', pct >= 100 ? 'se-bg-green-4' : 'se-bg-blue-4'), style: { width: `${pct}%` } }) }));\n}\nfunction ConditionRow({ cs }) {\n return (_jsxs(\"div\", { className: \"se-flex se-items-center se-gap-1 se-pl-3 se-text-[10px] se-text-slate-grey-8\", children: [_jsx(\"span\", { className: cs.passed ? 'se-text-green-4' : 'se-text-red-4', children: cs.passed ? '\\u2713' : '\\u2717' }), _jsxs(\"span\", { children: [cs.type, \":\"] }), _jsx(\"span\", { className: \"se-text-slate-grey-7\", children: cs.formatted.label }), cs.formatted.progress && (_jsxs(_Fragment, { children: [_jsx(ProgressBar, { current: cs.formatted.progress.current, target: cs.formatted.progress.target }), _jsxs(\"span\", { className: \"se-text-slate-grey-7 se-ml-0.5\", children: [cs.formatted.progress.current, \"/\", cs.formatted.progress.target] })] }))] }));\n}\nexport function ConditionStatusLine({ status }) {\n const [expanded, setExpanded] = useState(false);\n if (!status)\n return null;\n const { visible, conditions } = status;\n const passedCount = conditions.filter((c) => c.passed).length;\n const totalCount = conditions.length;\n // Icon: visible = green check, hidden = hourglass, fallback = dash\n const icon = visible ? '\\u2713' : '\\u23f3';\n const iconColor = visible ? 'se-text-green-4' : 'se-text-yellow-5';\n // Single condition: show inline detail\n // Multi condition: show summary, click to expand\n const isSingle = totalCount === 1;\n if (isSingle) {\n const cs = conditions[0];\n return (_jsxs(\"div\", { className: \"se-text-[10px] se-text-slate-grey-8 se-mt-0.5 se-flex se-items-center se-gap-1\", children: [_jsx(\"span\", { className: iconColor, children: icon }), _jsxs(\"span\", { children: [cs.type, \":\"] }), _jsx(\"span\", { className: \"se-text-slate-grey-7\", children: cs.formatted.label }), cs.formatted.progress && (_jsxs(_Fragment, { children: [_jsx(ProgressBar, { current: cs.formatted.progress.current, target: cs.formatted.progress.target }), _jsxs(\"span\", { className: \"se-text-slate-grey-7 se-ml-0.5\", children: [cs.formatted.progress.current, \"/\", cs.formatted.progress.target] })] }))] }));\n }\n // Multi-condition: summary line + expandable detail\n return (_jsxs(\"div\", { className: \"se-mt-0.5\", children: [_jsxs(\"button\", { type: \"button\", className: \"se-flex se-items-center se-gap-1 se-text-[10px] se-text-slate-grey-8 se-bg-transparent se-border-none se-cursor-pointer se-p-0 hover:se-text-slate-grey-6\", onClick: (e) => {\n e.stopPropagation();\n setExpanded(!expanded);\n }, children: [_jsx(\"span\", { className: iconColor, children: icon }), _jsxs(\"span\", { children: [passedCount, \" of \", totalCount, \" conditions met\"] }), _jsx(\"span\", { className: \"se-text-[8px] se-ml-0.5\", children: expanded ? '\\u25b2' : '\\u25bc' })] }), expanded && (_jsx(\"div\", { className: \"se-mt-0.5 se-space-y-0.5\", children: conditions.map((cs, i) => (_jsx(ConditionRow, { cs: cs }, i))) }))] }));\n}\n", "/**\n * useShowWhenStatus \u2014 live showWhen evaluation for editor diagnostics.\n *\n * Subscribes to the runtime's EventAccumulator for reactive updates.\n * Evaluates each item's showWhen strategy locally to get\n * per-condition breakdowns.\n *\n * NOTE: This hook accesses `window.SynOS.handle.runtime` directly\n * because EditorPanelProps doesn't expose runtime. This is safe \u2014\n * the editor only runs after runtime bootstrap.\n */\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { formatConditionLabel } from '../formatConditionLabel';\nfunction getRuntime() {\n return window.SynOS?.handle?.runtime ?? null;\n}\n/**\n * Evaluate a single condition against the runtime context.\n */\nfunction evaluateConditionLocally(condition, runtime) {\n const ctx = runtime.context.get();\n const type = condition.type;\n let passed = false;\n let accCount;\n switch (type) {\n case 'event_count': {\n if (!runtime.accumulator)\n break;\n const event = condition.event;\n const match = condition.match;\n const withinMs = condition.withinMs;\n const count = runtime.accumulator.getCount(event, match, withinMs);\n accCount = count;\n const target = condition.count;\n const op = condition.operator;\n switch (op) {\n case 'gte':\n passed = count >= target;\n break;\n case 'lte':\n passed = count <= target;\n break;\n case 'eq':\n passed = count === target;\n break;\n case 'gt':\n passed = count > target;\n break;\n case 'lt':\n passed = count < target;\n break;\n }\n break;\n }\n case 'page_url': {\n const url = condition.url;\n const pattern = url\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '.*')\n .replace(/\\*/g, '[^/]*');\n passed = new RegExp(`^${pattern}$`).test(ctx.page.url);\n break;\n }\n case 'route':\n passed = ctx.page.routeId === condition.routeId;\n break;\n case 'anchor_visible': {\n const anchors = ctx.anchors;\n const anchor = anchors?.find((a) => a.anchorId === condition.anchorId);\n switch (condition.state) {\n case 'visible':\n passed = anchor?.visible === true;\n break;\n case 'present':\n passed = anchor?.present === true;\n break;\n case 'absent':\n passed = !anchor?.present;\n break;\n }\n break;\n }\n case 'event_occurred':\n passed = runtime.events?.hasRecentEvent(condition.eventName, condition.withinMs ?? 60000) ?? false;\n break;\n case 'viewport': {\n const { width, height } = ctx.viewport;\n passed = true;\n if (condition.minWidth !== undefined && width < condition.minWidth)\n passed = false;\n if (condition.maxWidth !== undefined && width > condition.maxWidth)\n passed = false;\n if (condition.minHeight !== undefined && height < condition.minHeight)\n passed = false;\n if (condition.maxHeight !== undefined && height > condition.maxHeight)\n passed = false;\n break;\n }\n case 'session_metric': {\n const val = runtime.state?.getSessionMetric(condition.key) ?? 0;\n const threshold = condition.threshold;\n const op = condition.operator;\n switch (op) {\n case 'gte':\n passed = val >= threshold;\n break;\n case 'lte':\n passed = val <= threshold;\n break;\n case 'eq':\n passed = val === threshold;\n break;\n case 'gt':\n passed = val > threshold;\n break;\n case 'lt':\n passed = val < threshold;\n break;\n }\n break;\n }\n case 'dismissed':\n passed = condition.inverted\n ? !(runtime.state?.isDismissed(condition.key) ?? false)\n : (runtime.state?.isDismissed(condition.key) ?? false);\n break;\n case 'cooldown_active':\n passed = condition.inverted\n ? !(runtime.state?.isCooldownActive(condition.key) ?? false)\n : (runtime.state?.isCooldownActive(condition.key) ?? false);\n break;\n case 'frequency_limit': {\n const count = runtime.state?.getFrequencyCount(condition.key) ?? 0;\n const limitReached = count >= condition.limit;\n passed = condition.inverted ? !limitReached : limitReached;\n break;\n }\n }\n const formatted = formatConditionLabel(condition, accCount);\n return {\n passed,\n cs: { type, passed, formatted },\n };\n}\n/**\n * Evaluate all conditions in a showWhen RuleStrategy.\n */\nfunction evaluateShowWhen(showWhen, runtime) {\n if (showWhen.type !== 'rules' || !showWhen.rules?.length) {\n return { visible: !!showWhen.default, isFallback: true, conditions: [] };\n }\n // Evaluate ALL rules' conditions for diagnostic display\n const allConditions = [];\n for (const rule of showWhen.rules) {\n let ruleMatched = true;\n for (const condition of rule.conditions) {\n const { passed, cs } = evaluateConditionLocally(condition, runtime);\n allConditions.push(cs);\n if (!passed)\n ruleMatched = false;\n }\n if (ruleMatched) {\n return { visible: rule.value, isFallback: false, conditions: allConditions };\n }\n }\n // No rules matched \u2014 use default\n return {\n visible: showWhen.default ?? false,\n isFallback: true,\n conditions: allConditions,\n };\n}\n/**\n * Hook: live showWhen evaluation for a list of action items.\n *\n * @param items Array of items with id + optional showWhen\n * @returns Map from item id \u2192 ShowWhenStatus (null for items without showWhen)\n */\nexport function useShowWhenStatus(items) {\n const [statuses, setStatuses] = useState(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n const evaluate = useCallback(() => {\n const runtime = getRuntime();\n if (!runtime)\n return;\n const map = new Map();\n for (const item of itemsRef.current) {\n if (!item.showWhen) {\n map.set(item.id, null);\n }\n else {\n map.set(item.id, evaluateShowWhen(item.showWhen, runtime));\n }\n }\n setStatuses(map);\n }, []);\n useEffect(() => {\n // Initial evaluation\n evaluate();\n // Subscribe to accumulator changes for reactive event_count updates\n const runtime = getRuntime();\n const unsubs = [];\n if (runtime?.accumulator) {\n unsubs.push(runtime.accumulator.subscribe(evaluate));\n }\n // Poll every 2s for non-accumulator conditions (page_url, viewport, etc.)\n const interval = setInterval(evaluate, 2000);\n return () => {\n unsubs.forEach((u) => u());\n clearInterval(interval);\n };\n }, [evaluate]);\n return statuses;\n}\n", "/**\n * Human-readable summary generation for FAQ items.\n * Pure functions \u2014 no DOM access, just string formatting.\n */\n\nimport type { FAQQuestionAction, FAQAnswer, DecisionStrategy, RuleStrategy } from './types';\n\nconst MAX_Q_LEN = 50;\nconst MAX_A_LEN = 40;\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text;\n return `${text.slice(0, max).trimEnd()}...`;\n}\n\nfunction stripHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '').trim();\n}\n\nfunction getAnswerPreview(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return stripHtml(answer.html);\n return answer.content.replace(/[*_#`]/g, '').trim();\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\n/**\n * Parse a showWhen strategy into a human-readable trigger description.\n */\nexport function describeTrigger(showWhen?: DecisionStrategy<boolean> | null): string {\n if (!showWhen) return 'All pages';\n if (!isRuleStrategy(showWhen)) return 'All pages';\n\n const pages: string[] = [];\n const anchors: string[] = [];\n\n for (const rule of showWhen.rules) {\n for (const condition of rule.conditions) {\n if (condition.type === 'page_url' && typeof (condition as any).url === 'string') {\n pages.push((condition as any).url);\n }\n if (condition.type === 'anchor_visible' && typeof (condition as any).anchorId === 'string') {\n anchors.push((condition as any).anchorId);\n }\n }\n }\n\n const parts: string[] = [];\n if (pages.length > 0) parts.push(pages[0]);\n if (anchors.length > 0) parts.push(anchors[0]);\n\n return parts.length > 0 ? parts.join(' \\u00b7 ') : 'All pages';\n}\n\n/**\n * Generate a one-liner summary for an FAQ item.\n */\nexport function summarizeFAQItem(item: FAQQuestionAction): string {\n const q = truncate(item.config.question, MAX_Q_LEN);\n const a = truncate(getAnswerPreview(item.config.answer), MAX_A_LEN);\n return `Q: \"${q}\" \\u2014 ${a}`;\n}\n", "/**\n * Adaptive FAQ - Types\n *\n * Type definitions for the FAQ accordion adaptive.\n * Demonstrates compositional action pattern with per-item showWhen.\n */\n\n// ============================================================================\n// Decision Strategy Types (from runtime-sdk)\n// ============================================================================\n\n/**\n * Simplified DecisionStrategy type for this package.\n * Full definition is in @syntrologie/runtime-sdk.\n */\nexport type DecisionStrategy<T = unknown> =\n | RuleStrategy<T>\n | ScoreStrategy<T>\n | ModelStrategy<T>\n | ExternalStrategy<T>;\n\nexport interface RuleStrategy<T = unknown> {\n type: 'rules';\n rules: Array<{\n conditions: Array<Record<string, unknown>>;\n value: T;\n }>;\n default: T;\n}\n\nexport interface ScoreStrategy<T = unknown> {\n type: 'score';\n field: string;\n threshold: number;\n above: T;\n below: T;\n}\n\nexport interface ModelStrategy<T = unknown> {\n type: 'model';\n modelId: string;\n inputs: string[];\n outputMapping: Record<string, T>;\n default: T;\n}\n\nexport interface ExternalStrategy<T = unknown> {\n type: 'external';\n endpoint: string;\n method?: 'GET' | 'POST';\n default: T;\n timeoutMs?: number;\n}\n\n// ============================================================================\n// Event Scope Types\n// ============================================================================\n\n/**\n * Scoped event filtering for event_count conditions.\n * The adaptive registers a predicate built from this scope.\n */\nexport interface EventScope {\n /** Event names to count */\n events: string[];\n /** URL path substring filter */\n urlContains?: string;\n /** Exact prop matching (e.g. { tagName: \"a\" }) */\n props?: Record<string, string | number | boolean>;\n}\n\n// ============================================================================\n// Rich Answer Content Types\n// ============================================================================\n\nexport interface Asset {\n id: string;\n type: 'image' | 'video';\n src: string;\n alt?: string;\n width?: number;\n height?: number;\n}\n\nexport interface RichHTMLAnswer {\n type: 'rich';\n html: string;\n}\n\nexport interface EnhancedMarkdownAnswer {\n type: 'markdown';\n content: string;\n assets?: Asset[];\n}\n\nexport type FAQAnswer = string | RichHTMLAnswer | EnhancedMarkdownAnswer;\n\n// ============================================================================\n// AI Answer Types\n// ============================================================================\n\nexport interface AnswerStrategy {\n endpoint: string;\n context?: string[];\n cache?: 'session' | 'none';\n fallback?: string;\n}\n\n// ============================================================================\n// Feedback Types\n// ============================================================================\n\nexport interface FeedbackConfig {\n style: 'thumbs' | 'rating';\n prompt?: string;\n}\n\nexport type FeedbackValue = 'up' | 'down' | number;\n\n// ============================================================================\n// Ordering Types\n// ============================================================================\n\nexport interface SegmentOrdering {\n type: 'segment';\n segmentWeights: Record<string, string[]>;\n}\n\nexport type OrderingStrategy = 'static' | 'priority' | SegmentOrdering;\n\n// ============================================================================\n// Injection Types\n// ============================================================================\n\nexport interface InjectionRule {\n trigger: DecisionStrategy<boolean>;\n items: FAQQuestionAction[];\n position?: 'prepend' | 'append';\n once?: boolean;\n}\n\n// ============================================================================\n// FAQ Question Action Types\n// ============================================================================\n\nexport interface FAQQuestionAction {\n kind: 'faq:question';\n config: {\n id: string;\n question: string;\n answer: FAQAnswer;\n category?: string;\n priority?: number;\n answerStrategy?: AnswerStrategy;\n };\n showWhen?: DecisionStrategy<boolean> | null;\n /** Toast config \u2014 only fires when showWhen transitions false \u2192 true */\n notify?: {\n title?: string;\n body?: string;\n icon?: string;\n };\n rationale?: {\n why: string;\n confidence?: number;\n };\n}\n\n// ============================================================================\n// FAQ Widget Configuration\n// ============================================================================\n\nexport type ExpandBehavior = 'single' | 'multiple';\n\nexport type FAQTheme = 'light' | 'dark' | 'auto';\n\nexport interface FAQConfig {\n expandBehavior: ExpandBehavior;\n searchable: boolean;\n theme: FAQTheme;\n actions: FAQQuestionAction[];\n feedback?: boolean | FeedbackConfig;\n ordering?: OrderingStrategy;\n injections?: InjectionRule[];\n /** Event scope for registering accumulator predicates */\n scope?: EventScope;\n}\n\n// ============================================================================\n// FAQ Action Types (for executor pattern)\n// ============================================================================\n\nexport interface ScrollToFaqAction {\n kind: 'faq:scroll_to';\n itemId?: string;\n itemQuestion?: string;\n expand?: boolean;\n behavior?: 'smooth' | 'instant' | 'auto';\n}\n\nexport interface ToggleFaqItemAction {\n kind: 'faq:toggle_item';\n itemId?: string;\n itemQuestion?: string;\n state?: 'open' | 'closed' | 'toggle';\n}\n\nexport interface UpdateFaqAction {\n kind: 'faq:update';\n operation: 'add' | 'remove' | 'reorder' | 'replace';\n items?: FAQQuestionAction[];\n itemId?: string;\n order?: string[];\n position?: 'prepend' | 'append' | 'before' | 'after';\n anchorId?: string;\n}\n\n// ============================================================================\n// Widget State Types\n// ============================================================================\n\nexport interface FAQWidgetState {\n expandedItems: Set<string>;\n items: FAQQuestionAction[];\n searchQuery: string;\n collapsedCategories: Set<string>;\n feedbackState: Map<string, FeedbackValue>;\n}\n\n// ============================================================================\n// Executor Infrastructure Types\n// ============================================================================\n\nexport type ExecutorCleanup = () => void;\n\nexport type ExecutorUpdate = (action: unknown) => Promise<void>;\n\nexport interface ExecutorResult {\n cleanup: ExecutorCleanup;\n updateFn?: ExecutorUpdate;\n}\n\nexport interface ExecutorContext {\n overlayRoot: HTMLElement;\n resolveAnchor: (anchorId: string) => HTMLElement | null;\n generateId: () => string;\n publishEvent: (name: string, props?: Record<string, unknown>) => void;\n adaptiveId?: string;\n}\n\nexport type ActionExecutor<T> = (action: T, context: ExecutorContext) => Promise<ExecutorResult>;\n\n// ============================================================================\n// Action Namespace\n// ============================================================================\n\nexport const ACTION_NAMESPACE = 'faq';\n\n/**\n * Returns true if the action belongs to this adaptive package.\n * Uses prefix matching so new kinds (e.g. faq:category) are automatically included.\n */\nexport function isOwnAction(action: { kind: string }): boolean {\n return action.kind.startsWith(`${ACTION_NAMESPACE}:`);\n}\n\n// ============================================================================\n// Editor Types\n// ============================================================================\n\nexport interface EditorPanelProps {\n config: Record<string, unknown>;\n onChange: (config: Record<string, unknown>) => void;\n editor: {\n setDirty: (dirty: boolean) => void;\n navigateHome: () => Promise<boolean>;\n save: () => Promise<void>;\n publish: (captureScreenshot?: boolean) => Promise<void>;\n navigateTo: (route: string) => Promise<void>;\n highlightElement: (selector: string) => void;\n clearHighlight: () => void;\n getCurrentRoute: () => string;\n previewConfig: (config: Record<string, unknown>) => void;\n /** Flat action index to open in edit mode (from accordion navigation). */\n initialEditKey?: string;\n /** Open the editor in create mode. */\n initialCreate?: boolean;\n /** Clear the initial navigation state (call after consuming). */\n clearInitialState?: () => void;\n /** Get dismissed keys persisted in navigation context. */\n getDismissedKeys?: () => Set<string>;\n /** Sync dismissed keys back to navigation context. */\n setDismissedKeys?: (keys: Set<string>) => void;\n };\n platformClient?: unknown;\n}\n", "/**\n * Adaptive FAQ - Editor Component\n *\n * Review & tweak editor for AI-generated FAQ question decisions.\n * Displays a scannable list of Q&A cards with trigger, rationale,\n * and inline editing. Includes detection badges and hover-to-highlight.\n */\n\nimport {\n EditorLayout,\n EditorHeader,\n EditorBody,\n EditorFooter,\n EditorCard,\n DetectionBadge,\n DismissedSection,\n GroupHeader,\n BeforeAfterToggle,\n EditorInput,\n EditorTextarea,\n EditBackButton,\n EmptyState,\n ConditionStatusLine,\n useShowWhenStatus,\n} from '@syntrologie/shared-editor-ui';\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\n\nimport { summarizeFAQItem, describeTrigger } from './summarize';\nimport {\n isOwnAction,\n type FAQConfig,\n type FAQQuestionAction,\n type FAQAnswer,\n type EditorPanelProps,\n type RuleStrategy,\n} from './types';\n\n// ============================================================================\n// Targeting Extraction (inlined \u2014 CDN builds can't import from editor-sdk)\n// ============================================================================\n\ninterface TargetingInfo {\n pagePatterns: string[];\n anchorSelectors: string[];\n hasTargeting: boolean;\n}\n\nfunction isRuleStrategy(s: unknown): s is RuleStrategy<boolean> {\n return (\n typeof s === 'object' &&\n s !== null &&\n (s as Record<string, unknown>).type === 'rules' &&\n Array.isArray((s as Record<string, unknown>).rules)\n );\n}\n\nfunction extractTargetingInfo(showWhen?: unknown | null): TargetingInfo {\n if (!showWhen || !isRuleStrategy(showWhen)) {\n return { pagePatterns: [], anchorSelectors: [], hasTargeting: false };\n }\n\n const pagePatterns = new Set<string>();\n const anchorSelectors = new Set<string>();\n\n for (const rule of showWhen.rules) {\n for (const cond of rule.conditions) {\n const c = cond as Record<string, unknown>;\n if (c.type === 'page_url' && typeof c.url === 'string') {\n pagePatterns.add(c.url);\n } else if (c.type === 'anchor_visible' && typeof c.anchorId === 'string') {\n anchorSelectors.add(c.anchorId);\n }\n }\n }\n\n const hasTargeting = pagePatterns.size > 0 || anchorSelectors.size > 0;\n return {\n pagePatterns: [...pagePatterns],\n anchorSelectors: [...anchorSelectors],\n hasTargeting,\n };\n}\n\nfunction extractFirstPage(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.pagePatterns[0] || null;\n}\n\nfunction extractFirstAnchor(showWhen?: unknown | null): string | null {\n const info = extractTargetingInfo(showWhen);\n return info.anchorSelectors[0] || null;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getAnswerText(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return answer.html;\n return answer.content;\n}\n\ninterface FlatItem {\n key: string;\n index: number;\n summary: string;\n trigger: string;\n rationale?: { why: string; confidence?: number };\n firstAnchor: string | null;\n question: FAQQuestionAction;\n}\n\nfunction flattenItems(config: FAQConfig): FlatItem[] {\n const actions = (config.actions || []).filter(isOwnAction);\n return actions.map((q, i) => ({\n key: String(i),\n index: i,\n summary: summarizeFAQItem(q),\n trigger: describeTrigger(q.showWhen),\n rationale: q.rationale,\n firstAnchor: extractFirstAnchor(q.showWhen),\n question: q,\n }));\n}\n\nfunction filterConfig(config: FAQConfig, dismissedKeys: Set<string>): FAQConfig {\n const ownActions = (config.actions || []).filter(isOwnAction);\n return {\n ...config,\n actions: ownActions.filter((_, i) => !dismissedKeys.has(String(i))),\n };\n}\n\n// ============================================================================\n// Detection Hook\n// ============================================================================\n\ninterface DetectionEntry {\n found: boolean;\n element: HTMLElement | null;\n}\n\nfunction useDetection(\n items: FlatItem[],\n getCurrentRoute: () => 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 const currentPath = getCurrentRoute();\n\n for (const item of itemsRef.current) {\n const targeting = extractTargetingInfo(item.question.showWhen);\n\n // Check page match\n let pageMatch = true;\n if (targeting.pagePatterns.length > 0) {\n pageMatch = targeting.pagePatterns.some((pattern) => {\n const regex = new RegExp(\n `^${pattern.replace(/\\*\\*/g, '.*').replace(/(?<!\\.)(\\*)/g, '[^/]*')}$`\n );\n return regex.test(currentPath);\n });\n }\n\n // Check anchor presence\n let anchorFound = false;\n let element: HTMLElement | null = null;\n if (item.firstAnchor) {\n try {\n element = document.querySelector(item.firstAnchor) as HTMLElement | null;\n anchorFound = element !== null;\n } catch {\n // Invalid selector\n }\n } else {\n // No anchor to check \u2014 if page matches, consider found\n anchorFound = pageMatch;\n }\n\n map.set(item.key, {\n found: pageMatch && anchorFound,\n element,\n });\n }\n\n setDetectionMap(map);\n };\n\n runDetection();\n\n const interval = setInterval(runDetection, 2000);\n window.addEventListener('popstate', runDetection);\n\n return () => {\n clearInterval(interval);\n window.removeEventListener('popstate', runDetection);\n };\n }, [getCurrentRoute]);\n\n return detectionMap;\n}\n\n// ============================================================================\n// FAQEditor Component\n// ============================================================================\n\nexport function FAQEditor({ config, onChange, editor }: EditorPanelProps) {\n const typedConfig = config as unknown as FAQConfig;\n const [dismissedKeys, setDismissedKeys] = useState<Set<string>>(\n () => editor.getDismissedKeys?.() ?? new Set()\n );\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [previewMode, setPreviewMode] = useState<'before' | 'after'>('after');\n const [_hoveredKey, setHoveredKey] = useState<string | null>(null);\n\n // Sync dismissed keys back to navigation context on every change\n useEffect(() => {\n editor.setDismissedKeys?.(dismissedKeys);\n }, [dismissedKeys, editor]);\n\n // If navigated here with an editKey, jump directly to that item's edit view\n const initialConsumed = useRef(false);\n useEffect(() => {\n if (!initialConsumed.current) {\n initialConsumed.current = true;\n if (editor.initialEditKey != null) {\n setEditingKey(String(editor.initialEditKey));\n }\n editor.clearInitialState?.();\n }\n }, [editor]);\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 totalQuestions = activeItems.length;\n\n const detectionMap = useDetection(allItems, editor.getCurrentRoute);\n const foundCount = activeItems.filter((item) => detectionMap.get(item.key)?.found).length;\n\n // Live showWhen status for condition diagnostics\n const showWhenItems = React.useMemo(\n () => allItems.map((item) => ({\n id: item.key,\n showWhen: item.question.showWhen,\n })),\n [allItems]\n );\n const showWhenStatuses = useShowWhenStatus(showWhenItems);\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 handleCardBodyClick = useCallback((item: FlatItem) => {\n setEditingKey(item.key);\n }, []);\n\n const handleTriggerClick = useCallback(\n (item: FlatItem) => {\n const pageUrl = extractFirstPage(item.question.showWhen);\n if (pageUrl) {\n editor.navigateTo(pageUrl);\n }\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleBackToList = useCallback(() => {\n setEditingKey(null);\n setPreviewMode('after');\n editor.previewConfig(config);\n editor.clearHighlight();\n }, [editor, config]);\n\n 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 (index: number, field: string, value: unknown) => {\n const ownActions = (typedConfig.actions || []).filter(isOwnAction).slice();\n const q = { ...ownActions[index], config: { ...ownActions[index].config } };\n (q.config as Record<string, unknown>)[field] = value;\n ownActions[index] = q;\n const otherActions = (typedConfig.actions || []).filter((a) => !isOwnAction(a));\n const updated = { ...typedConfig, actions: [...otherActions, ...ownActions] };\n onChange(updated as unknown as Record<string, unknown>);\n editor.setDirty(true);\n },\n [typedConfig, onChange, editor]\n );\n\n const handlePublish = useCallback(() => {\n if (dismissedKeys.size > 0) {\n const filtered = filterConfig(typedConfig, dismissedKeys);\n onChange(filtered as unknown as Record<string, unknown>);\n }\n editor.publish();\n }, [dismissedKeys, typedConfig, onChange, editor]);\n\n const handleCardHover = useCallback(\n (item: FlatItem) => {\n setHoveredKey(item.key);\n if (item.firstAnchor) {\n editor.highlightElement(item.firstAnchor);\n }\n },\n [editor]\n );\n\n const handleCardLeave = useCallback(() => {\n setHoveredKey(null);\n editor.clearHighlight();\n }, [editor]);\n\n // ---- Edit form renderer ----\n\n const renderEditFields = (index: number) => {\n const actions = (typedConfig.actions || []).filter(isOwnAction);\n const q = actions[index];\n if (!q) return null;\n\n const item = allItems.find((it) => it.key === String(index));\n\n return (\n <div className=\"se-py-1\">\n {/* Trigger line in edit mode */}\n {item && item.trigger !== 'All pages' && (\n <div\n data-trigger\n className=\"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1\"\n onClick={() => handleTriggerClick(item)}\n >\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </div>\n )}\n\n <EditorInput\n label=\"Question\"\n value={q.config.question}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'question', e.target.value)\n }\n />\n\n <EditorTextarea\n label=\"Answer\"\n value={getAnswerText(q.config.answer)}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n handleFieldChange(index, 'answer', e.target.value)\n }\n />\n\n <EditorInput\n label=\"Category\"\n value={q.config.category || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleFieldChange(index, 'category', e.target.value || undefined)\n }\n placeholder=\"e.g., Billing, Account\"\n />\n\n <div>\n <label className=\"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block\">\n AI Rationale\n </label>\n <div className=\"se-p-2 se-rounded se-border se-border-dashed se-border-white/15 se-bg-white/[0.02] se-text-slate-grey-8 se-text-xs se-mb-2\">\n {q.rationale ? q.rationale.why : 'N/A'}\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <EditorLayout>\n {/* Header */}\n <EditorHeader\n title=\"Review Questions\"\n subtitle={`${totalQuestions} question${totalQuestions !== 1 ? 's' : ''}${totalQuestions > 0 ? ` (${foundCount} found on this page)` : ''}`}\n onBack={() => editor.navigateHome()}\n />\n\n {/* Body */}\n <EditorBody>\n {editingKey !== null ? (\n /* ---- Edit mode ---- */\n (() => {\n const editIndex = Number(editingKey);\n const editItem = allItems.find((it) => it.key === editingKey);\n return (\n <>\n <div className=\"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10\">\n <span>{'\\u2753'}</span>\n <span>{editItem?.summary}</span>\n </div>\n <BeforeAfterToggle mode={previewMode} onToggle={handleBeforeAfter} />\n {renderEditFields(editIndex)}\n <EditBackButton onClick={handleBackToList} />\n </>\n );\n })()\n ) : (\n /* ---- List mode ---- */\n <>\n {allItems.length === 0 && <EmptyState message=\"No FAQ questions configured.\" />}\n\n {activeItems.length > 0 && (\n <>\n <GroupHeader label=\"FAQ\" count={activeItems.length} />\n {activeItems.map((item) => {\n const detection = detectionMap.get(item.key);\n return (\n <EditorCard\n key={item.key}\n itemKey={item.key}\n onMouseEnter={() => handleCardHover(item)}\n onMouseLeave={handleCardLeave}\n >\n {/* Trigger line */}\n {item.trigger !== 'All pages' && (\n <div\n data-trigger\n className=\"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1\"\n onClick={(e) => {\n e.stopPropagation();\n handleTriggerClick(item);\n }}\n >\n <span>{'\\u{1f4cd}'}</span>\n <span>{item.trigger}</span>\n </div>\n )}\n {/* Card body: badge + summary + dismiss */}\n <div\n data-card-body\n className=\"se-flex se-items-center se-gap-2 se-cursor-pointer\"\n onClick={() => handleCardBodyClick(item)}\n >\n <DetectionBadge found={detection?.found ?? false} />\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap\">\n {item.summary}\n </span>\n <button\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-sm se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss(item.key);\n }}\n title=\"Dismiss this question\"\n >\n ×\n </button>\n </div>\n {/* Rationale line */}\n <div className=\"se-text-[10px] se-text-slate-grey-7 se-mt-1\">\n WHY: {item.rationale ? item.rationale.why : 'N/A'}\n </div>\n {/* Condition status line */}\n <ConditionStatusLine status={showWhenStatuses.get(item.key) ?? null} />\n </EditorCard>\n );\n })}\n </>\n )}\n\n {/* Dismissed section */}\n {dismissedItems.length > 0 && (\n <DismissedSection count={dismissedItems.length}>\n {dismissedItems.map((item) => (\n <div\n key={item.key}\n className=\"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60\"\n >\n <span className=\"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through\">\n {item.summary}\n </span>\n <button\n className=\"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-blue-5 se-text-[11px] se-cursor-pointer se-shrink-0 se-leading-none\"\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(item.key);\n }}\n >\n Restore\n </button>\n </div>\n ))}\n </DismissedSection>\n )}\n </>\n )}\n </EditorBody>\n\n {/* Footer */}\n <EditorFooter onSave={() => editor.save()} onPublish={handlePublish} />\n </EditorLayout>\n );\n}\n\n/**\n * Editor panel configuration for the app registry.\n */\nexport const editorPanel = {\n title: 'FAQ',\n icon: '\\u2753',\n description: 'FAQ accordion with per-item visibility',\n};\n\nexport const editor = {\n panel: editorPanel,\n component: FAQEditor,\n};\n\nexport default FAQEditor;\n", "/**\n * Adaptive FAQ - Action Executors\n *\n * Three executors that operate on the FAQStore:\n * - executeScrollToFaq: scroll to a FAQ item and optionally expand it\n * - executeToggleFaqItem: open / close / toggle a FAQ item\n * - executeUpdateFaq: add, remove, reorder, or replace FAQ items\n */\n\nimport type { FAQStore } from './state';\nimport type {\n ScrollToFaqAction,\n ToggleFaqItemAction,\n UpdateFaqAction,\n ExecutorResult,\n ExecutorContext,\n FAQQuestionAction,\n} from './types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Resolve a FAQ item by direct ID or by fuzzy question text match.\n * Throws if neither yields a result.\n */\nfunction resolveItem(store: FAQStore, itemId?: string, itemQuestion?: string): FAQQuestionAction {\n if (itemId) {\n const found = store.getState().items.find((i) => i.config.id === itemId);\n if (found) return found;\n }\n\n if (itemQuestion) {\n const found = store.findByQuestion(itemQuestion);\n if (found) return found;\n }\n\n throw new Error('FAQ item not found');\n}\n\n// ============================================================================\n// executeScrollToFaq\n// ============================================================================\n\n/**\n * Scroll to a FAQ item in the DOM and optionally expand it.\n *\n * Looks up the item by `itemId` or `itemQuestion`, scrolls the matching\n * `[data-faq-item-id]` element into view, and expands it unless\n * `expand` is explicitly set to `false`.\n */\nexport async function executeScrollToFaq(\n action: ScrollToFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n\n // Expand the item unless explicitly told not to\n if (action.expand !== false) {\n store.expand(id);\n }\n\n // Scroll the DOM element into view (may be absent in test environments)\n const el = document.querySelector(`[data-faq-item-id=\"${id}\"]`);\n if (el) {\n el.scrollIntoView({\n behavior: action.behavior ?? 'smooth',\n });\n }\n\n // Publish analytics event\n context.publishEvent('faq:scroll_to', { itemId: id });\n\n return {\n cleanup: () => {\n // Optionally collapse on revert\n },\n };\n}\n\n// ============================================================================\n// executeToggleFaqItem\n// ============================================================================\n\n/**\n * Open, close, or toggle a FAQ item's expanded state.\n */\nexport async function executeToggleFaqItem(\n action: ToggleFaqItemAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n const item = resolveItem(store, action.itemId, action.itemQuestion);\n const { id } = item.config;\n const desiredState = action.state ?? 'toggle';\n\n let newState: 'open' | 'closed';\n\n switch (desiredState) {\n case 'open':\n store.expand(id);\n newState = 'open';\n break;\n case 'closed':\n store.collapse(id);\n newState = 'closed';\n break;\n case 'toggle':\n default: {\n const wasExpanded = store.getState().expandedItems.has(id);\n store.toggle(id);\n newState = wasExpanded ? 'closed' : 'open';\n break;\n }\n }\n\n context.publishEvent('faq:toggle', { itemId: id, newState });\n\n return {\n cleanup: () => {\n // Revert toggle on cleanup\n },\n };\n}\n\n// ============================================================================\n// executeUpdateFaq\n// ============================================================================\n\n/**\n * Add, remove, reorder, or replace FAQ items in the store.\n */\nexport async function executeUpdateFaq(\n action: UpdateFaqAction,\n context: ExecutorContext,\n store: FAQStore\n): Promise<ExecutorResult> {\n switch (action.operation) {\n case 'add': {\n const items = action.items ?? [];\n const position = action.position === 'prepend' ? 'prepend' : 'append';\n store.addItems(items, position);\n break;\n }\n\n case 'remove': {\n if (!action.itemId) {\n throw new Error('FAQ item not found');\n }\n // Verify the item exists before removing\n const exists = store.getState().items.some((i) => i.config.id === action.itemId);\n if (!exists) {\n throw new Error('FAQ item not found');\n }\n store.removeItem(action.itemId);\n break;\n }\n\n case 'reorder': {\n const order = action.order ?? [];\n store.reorderItems(order);\n break;\n }\n\n case 'replace': {\n const items = action.items ?? [];\n store.replaceItems(items);\n break;\n }\n }\n\n context.publishEvent('faq:update', { operation: action.operation });\n\n return {\n cleanup: () => {\n // Could snapshot previous state for undo\n },\n };\n}\n\n// ============================================================================\n// Executor Definitions for Registration\n// ============================================================================\n\n/**\n * All executors provided by adaptive-faq.\n * These are registered with the runtime's ExecutorRegistry.\n */\nexport const executorDefinitions = [\n { kind: 'faq:scroll_to', executor: executeScrollToFaq },\n { kind: 'faq:toggle_item', executor: executeToggleFaqItem },\n { kind: 'faq:update', executor: executeUpdateFaq },\n] as const;\n", "/**\n * Syntro Design System - Color Tokens\n *\n * This file contains all color tokens from the Figma design system.\n * Colors are organized by scale and semantic meaning.\n *\n * @see https://www.figma.com/design/U0Ol5vM7FQvgPfIgCAgxgb/Design-System\n */\n// ============================================================================\n// BASE COLORS\n// ============================================================================\nexport const base = {\n white: '#ffffff',\n black: '#000000',\n};\n// ============================================================================\n// BRAND COLORS\n// ============================================================================\nexport const brand = {\n 0: '#2c0b0a',\n 1: '#5b1715',\n 2: '#89221f',\n 3: '#b72e2a',\n 4: '#d44844',\n 5: '#dd6d69',\n 6: '#e5918f',\n 7: '#eeb6b4',\n 8: '#f6dada',\n 9: '#faebea',\n};\n// ============================================================================\n// NEUTRAL COLORS\n// ============================================================================\nexport const slateGrey = {\n 0: '#07080a',\n 1: '#0f1318',\n 2: '#0e1114',\n 3: '#1c222a',\n 4: '#2b333f',\n 5: '#394454',\n 6: '#475569',\n 7: '#677384',\n 8: '#87919f',\n 9: '#a8afba',\n 10: '#cbd0d7',\n 11: '#e8eaee',\n 12: '#f6f7f9',\n};\n// ============================================================================\n// SEMANTIC COLOR SCALES\n// ============================================================================\nexport const green = {\n 0: '#07230a',\n 1: '#0e4514',\n 2: '#16681e',\n 3: '#1d8a28',\n 4: '#24ad32',\n 5: '#4fbd5a',\n 6: '#7acd82',\n 7: '#a5deab',\n 8: '#d0eed3',\n 9: '#e5f6e7',\n};\nexport const yellow = {\n 0: '#301f09',\n 1: '#5f3e12',\n 2: '#8f5e1b',\n 3: '#be7d24',\n 4: '#ee9c2d',\n 5: '#f1b057',\n 6: '#f5c481',\n 7: '#f8d7ab',\n 8: '#fcebd5',\n 9: '#fdf5ea',\n};\nexport const red = {\n 0: '#330707',\n 1: '#660f0e',\n 2: '#991616',\n 3: '#cc1e1d',\n 4: '#ff2524',\n 5: '#ff5150',\n 6: '#ff7c7c',\n 7: '#ffa8a7',\n 8: '#ffd3d3',\n 9: '#ffe9e9',\n};\nexport const blue = {\n 0: '#051533',\n 1: '#0a2a66',\n 2: '#0f3f98',\n 3: '#1454cb',\n 4: '#1969fe',\n 5: '#4787fe',\n 6: '#75a5fe',\n 7: '#a3c3ff',\n 8: '#d1e1ff',\n 9: '#e8f0ff',\n};\nexport const orange = {\n 0: '#662500',\n 1: '#993d00',\n 2: '#cc5800',\n 3: '#ff7700',\n 4: '#fea85d',\n 5: '#fec58f',\n 6: '#ffd6ae',\n 7: '#fee6cd',\n 8: '#fff1e1',\n 9: '#fff8f0',\n};\nexport const purple = {\n 0: '#151229',\n 1: '#2a2452',\n 2: '#40357c',\n 3: '#5547a5',\n 4: '#6a59ce',\n 5: '#887ad8',\n 6: '#a69be2',\n 7: '#c3bdeb',\n 8: '#e1def5',\n 9: '#f0eefa',\n};\nexport const pink = {\n 0: '#37091f',\n 1: '#69123c',\n 2: '#9b1c58',\n 3: '#cd2575',\n 4: '#ff2e92',\n 5: '#ff58a8',\n 6: '#ff82be',\n 7: '#ffabd3',\n 8: '#ffd5e9',\n 9: '#ffeaf4',\n};\n// ============================================================================\n// LEGACY COLORS (Being phased out)\n// ============================================================================\nexport const legacy = {\n aqua: {\n 0: '#0c5f8d',\n 1: '#146b99',\n 2: '#1d78a6',\n 3: '#2e89b6',\n 4: '#4a9fc4',\n 5: '#6bb4d1',\n 6: '#93cce0',\n 7: '#bddff0',\n 8: '#dceef8',\n 9: '#f2f8fc',\n },\n violet: {\n 0: '#6927da',\n 1: '#7839ee',\n 2: '#875bf7',\n 3: '#a48afb',\n 4: '#c3b4fd',\n 5: '#ddd6fe',\n 6: '#ece9fe',\n 7: '#f5f3ff',\n 8: '#fbfaff',\n },\n fuchsia: {\n 0: '#9f1ab1',\n 1: '#ba24d5',\n 2: '#d444f1',\n 3: '#e478fa',\n 4: '#eeaafd',\n 5: '#f6d0fe',\n 6: '#fbe8ff',\n 7: '#fdf4ff',\n 8: '#fefaff',\n },\n pink: {\n 0: '#a10f5f',\n 1: '#dd2590',\n 2: '#ee46bc',\n 3: '#f670c7',\n 4: '#faa7e0',\n 5: '#fcceee',\n 6: '#fce7f6',\n 7: '#fdf2fa',\n 8: '#fef6fb',\n },\n};\n// ============================================================================\n// TEXT TOKENS\n// ============================================================================\nexport const text = {\n primary: slateGrey[10],\n secondary: slateGrey[9],\n tertiary: slateGrey[8],\n};\n// ============================================================================\n// BACKGROUND TOKENS\n// ============================================================================\nexport const background = {\n primary: slateGrey[2],\n secondary: slateGrey[0],\n};\n// ============================================================================\n// BORDER TOKENS\n// ============================================================================\nexport const border = {\n primary: slateGrey[4],\n secondary: slateGrey[3],\n};\n// ============================================================================\n// BUTTON TOKENS\n// ============================================================================\nexport const button = {\n primary: {\n text: base.white,\n icon: base.white,\n border: brand[3],\n backgroundDefault: brand[3],\n backgroundHover: brand[2],\n },\n neutral: {\n text: slateGrey[10],\n textHover: base.white,\n icon: slateGrey[10],\n iconHover: base.white,\n border: slateGrey[4],\n background: slateGrey[2],\n },\n link: {\n text: base.white,\n icon: base.white,\n hover: brand[5],\n },\n error: {\n text: red[5],\n hover: red[6],\n },\n success: {\n text: green[5],\n hover: green[6],\n },\n};\n// ============================================================================\n// BADGE TOKENS\n// ============================================================================\nexport const badge = {\n slateGrey: {\n content: slateGrey[10],\n pillOutline: slateGrey[10],\n borderPrimary: slateGrey[5],\n borderSecondary: slateGrey[5],\n background: slateGrey[3],\n },\n brand: {\n content: brand[9],\n pillOutline: brand[9],\n borderPrimary: brand[6],\n borderSecondary: brand[6],\n background: brand[0],\n },\n red: {\n content: red[8],\n pillOutline: red[4],\n borderPrimary: red[2],\n borderSecondary: red[2],\n background: red[0],\n },\n yellow: {\n content: yellow[8],\n pillOutline: yellow[4],\n borderPrimary: yellow[2],\n borderSecondary: yellow[2],\n background: yellow[0],\n },\n green: {\n content: green[8],\n pillOutline: green[4],\n borderPrimary: green[2],\n borderSecondary: green[2],\n background: green[0],\n },\n purple: {\n content: purple[8],\n pillOutline: purple[4],\n borderPrimary: purple[2],\n borderSecondary: purple[2],\n background: purple[0],\n },\n blue: {\n content: blue[8],\n pillOutline: blue[4],\n borderPrimary: blue[2],\n borderSecondary: blue[2],\n background: blue[0],\n },\n orange: {\n content: orange[8],\n pillOutline: orange[4],\n borderPrimary: orange[2],\n borderSecondary: orange[2],\n background: orange[0],\n },\n pink: {\n content: pink[8],\n pillOutline: pink[4],\n borderPrimary: pink[2],\n borderSecondary: pink[2],\n background: pink[0],\n },\n};\n// ============================================================================\n// BADGE BANNER TOKENS\n// ============================================================================\nexport const badgeBanner = {\n green: {\n content: green[8],\n border: green[2],\n background: green[0],\n },\n yellow: {\n content: yellow[8],\n border: yellow[2],\n background: yellow[0],\n },\n red: {\n content: red[8],\n border: red[2],\n background: red[0],\n },\n};\n// ============================================================================\n// ALERT TOKENS\n// ============================================================================\nexport const alert = {\n green: {\n content: green[1],\n background: green[9],\n },\n yellow: {\n content: yellow[1],\n background: yellow[9],\n },\n red: {\n content: red[1],\n background: red[9],\n },\n};\n// ============================================================================\n// TAG TOKENS\n// ============================================================================\nexport const tag = {\n content: slateGrey[10],\n border: slateGrey[4],\n background: '#1c2124',\n};\n// ============================================================================\n// MENU TOKENS\n// ============================================================================\nexport const menu = {\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n selected: slateGrey[3],\n};\n// ============================================================================\n// INPUT/DROPDOWN TOKENS\n// ============================================================================\nexport const inputDropdown = {\n background: slateGrey[2],\n icon: slateGrey[10],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n};\nexport const inputField = {\n backgroundDefault: slateGrey[2],\n backgroundDisabled: slateGrey[0],\n textLabel: slateGrey[9],\n textPlaceholder: slateGrey[8],\n textHint: slateGrey[8],\n textError: red[5],\n iconDefault: slateGrey[9],\n iconPlaceholder: slateGrey[10],\n iconError: red[5],\n borderDefault: slateGrey[4],\n borderSelected: brand[3],\n borderError: red[5],\n};\n// ============================================================================\n// TOGGLE TOKENS\n// ============================================================================\nexport const toggle = {\n handleDefault: base.white,\n handleDisabled: slateGrey[10],\n off: {\n backgroundDefault: slateGrey[4],\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[4],\n },\n on: {\n backgroundDefault: green[3],\n backgroundHover: green[2],\n backgroundDisabled: slateGrey[4],\n },\n};\n// ============================================================================\n// CHECKBOX TOKENS\n// ============================================================================\nexport const checkbox = {\n off: {\n backgroundDefault: '#00000000',\n backgroundHover: slateGrey[5],\n backgroundDisabled: slateGrey[2],\n border: slateGrey[6],\n },\n on: {\n backgroundDefault: green[0],\n backgroundHover: green[1],\n backgroundDisabled: slateGrey[2],\n border: green[3],\n },\n};\n// ============================================================================\n// AVATAR TOKENS\n// ============================================================================\nexport const avatar = {\n content: slateGrey[10],\n background: slateGrey[4],\n};\n// ============================================================================\n// PROGRESS BAR & SLIDER TOKENS\n// ============================================================================\nexport const progressBarSlider = {\n background: slateGrey[4],\n active: green[3],\n};\n// ============================================================================\n// CARD TOKENS\n// ============================================================================\nexport const card = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// SIDEBAR TOKENS\n// ============================================================================\nexport const sidebar = {\n backgroundDefault: slateGrey[1],\n backgroundHover: slateGrey[3],\n backgroundActive: slateGrey[4],\n border: slateGrey[4],\n contentPrimary: slateGrey[10],\n contentSecondary: slateGrey[9],\n contentTertiary: slateGrey[8],\n};\n// ============================================================================\n// MODAL TOKENS\n// ============================================================================\nexport const modal = {\n background: slateGrey[1],\n content: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TAB TOKENS\n// ============================================================================\nexport const tab = {\n activeBackground: slateGrey[3],\n activeContent: brand[5],\n inactiveContent: slateGrey[9],\n border: slateGrey[4],\n};\n// ============================================================================\n// TABLE TOKENS\n// ============================================================================\nexport const table = {\n header: {\n textDefault: slateGrey[9],\n textHover: slateGrey[8],\n backgroundDefault: slateGrey[1],\n },\n border: slateGrey[4],\n cell: {\n textPrimary: slateGrey[10],\n textSecondary: slateGrey[9],\n backgroundDefault: slateGrey[2],\n backgroundHover: slateGrey[1],\n },\n};\n// ============================================================================\n// BREADCRUMBS TOKENS\n// ============================================================================\nexport const breadcrumbs = {\n textPrimaryDefault: slateGrey[10],\n textPrimaryHover: slateGrey[10],\n textSecondaryDefault: slateGrey[8],\n textSecondaryHover: slateGrey[9],\n iconPrimary: slateGrey[10],\n iconSecondary: slateGrey[8],\n};\n// ============================================================================\n// LOADING INDICATOR TOKENS\n// ============================================================================\nexport const loadingIndicator = {\n background: green[1],\n active: green[5],\n};\n// ============================================================================\n// DATE PICKER TOKENS\n// ============================================================================\nexport const datePicker = {\n textDefault: slateGrey[10],\n textSelected: base.white,\n textDisabled: slateGrey[7],\n backgroundDefault: slateGrey[2],\n backgroundMiddle: slateGrey[3],\n backgroundSelected: brand[3],\n border: slateGrey[4],\n};\n// ============================================================================\n// MISC TOKENS\n// ============================================================================\nexport const scroll = slateGrey[9];\n// ============================================================================\n// EXPORTS\n// ============================================================================\nexport const colors = {\n base,\n brand,\n slateGrey,\n green,\n yellow,\n red,\n blue,\n orange,\n purple,\n pink,\n legacy,\n text,\n background,\n border,\n button,\n badge,\n badgeBanner,\n alert,\n tag,\n menu,\n inputDropdown,\n inputField,\n toggle,\n checkbox,\n avatar,\n progressBarSlider,\n card,\n sidebar,\n modal,\n tab,\n table,\n breadcrumbs,\n loadingIndicator,\n datePicker,\n scroll,\n};\nexport default colors;\n", "\n function _RD() {\n return (typeof SynOS !== 'undefined' && SynOS.ReactDOM) || {};\n }\n export default new Proxy({}, { get: function(_, k) { return _RD()[k]; } });\n export function createRoot() { return _RD().createRoot.apply(null, arguments); }\n export function hydrateRoot() { return _RD().hydrateRoot.apply(null, arguments); }\n export function createPortal() { return _RD().createPortal.apply(null, arguments); }\n export function flushSync() { return _RD().flushSync.apply(null, arguments); }\n ", "/**\n * Adaptive FAQ - FAQWidget Component\n *\n * React component that renders a collapsible Q&A accordion with per-item\n * conditional visibility based on showWhen decision strategies.\n *\n * Demonstrates the compositional action pattern where child actions\n * (faq:question) serve as configuration data for the parent widget.\n */\n\nimport { base, slateGrey, purple } from '@syntro/design-system/tokens';\nimport React, { useEffect, useReducer, useMemo, useCallback, useState, useRef } from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport type {\n FAQQuestionAction,\n FAQConfig,\n FAQAnswer,\n FeedbackConfig,\n FeedbackValue,\n DecisionStrategy,\n} from './types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Extract plain text from an FAQAnswer for search matching */\nfunction getAnswerText(answer: FAQAnswer): string {\n if (typeof answer === 'string') return answer;\n if (answer.type === 'rich') return answer.html;\n return answer.content;\n}\n\n/** Render an FAQAnswer based on its type */\nfunction renderAnswer(answer: FAQAnswer): React.ReactNode {\n if (typeof answer === 'string') {\n return <p style={{ margin: 0 }}>{answer}</p>;\n }\n if (answer.type === 'rich') {\n return <div style={{ margin: 0 }} dangerouslySetInnerHTML={{ __html: answer.html }} />;\n }\n // markdown \u2014 render content as text (full markdown rendering is a future enhancement)\n return <p style={{ margin: 0 }}>{answer.content}</p>;\n}\n\n/** Resolve feedback config into a normalized FeedbackConfig or null */\nfunction resolveFeedbackConfig(\n feedback: boolean | FeedbackConfig | undefined\n): FeedbackConfig | null {\n if (!feedback) return null;\n if (feedback === true) {\n return { style: 'thumbs' };\n }\n return feedback;\n}\n\n/** Get the feedback prompt text */\nfunction getFeedbackPrompt(feedbackConfig: FeedbackConfig): string {\n return feedbackConfig.prompt || 'Was this helpful?';\n}\n\n// Widget runtime and props types defined inline (not part of the types.ts spec)\nexport interface FAQWidgetRuntime {\n evaluateSync: <T>(strategy: DecisionStrategy<T>) => { value: T; isFallback: boolean };\n context: { subscribe: (callback: () => void) => () => void };\n events: {\n publish: (name: string, props?: Record<string, unknown>) => void;\n subscribe?: (\n filterOrCallback:\n | { names?: string[]; patterns?: string[]; sources?: string[] }\n | ((event: { name: string; props?: Record<string, unknown>; ts: number }) => void),\n maybeCallback?: (event: { name: string; props?: Record<string, unknown>; ts: number }) => void\n ) => () => void;\n getRecent?: (\n filter?: { names?: string[]; patterns?: string[] },\n limit?: number\n ) => Array<{ name: string; props?: Record<string, unknown>; ts: number }>;\n };\n state?: { get: (key: string) => unknown; set: (key: string, value: unknown) => void };\n /** Event accumulator for reactive showWhen re-evaluation */\n accumulator?: {\n subscribe: (callback: () => void) => () => void;\n register: (key: string, predicate: (event: any) => boolean) => void;\n };\n}\n\ninterface FAQWidgetProps {\n config: FAQConfig;\n runtime: FAQWidgetRuntime;\n instanceId: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst baseStyles = {\n container: {\n fontFamily: 'system-ui, -apple-system, sans-serif',\n maxWidth: '800px',\n margin: '0 auto',\n },\n searchWrapper: {\n marginBottom: '16px',\n },\n searchInput: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n outline: 'none',\n transition: 'border-color 0.15s ease',\n },\n accordion: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '8px',\n },\n item: {\n borderRadius: '8px',\n overflow: 'hidden',\n transition: 'box-shadow 0.15s ease',\n },\n question: {\n width: '100%',\n padding: '16px 20px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n border: 'none',\n cursor: 'pointer',\n fontSize: '15px',\n fontWeight: 500,\n textAlign: 'left' as const,\n transition: 'background-color 0.15s ease',\n },\n chevron: {\n fontSize: '18px',\n transition: 'transform 0.2s ease',\n },\n answer: {\n padding: '0 20px 16px 20px',\n fontSize: '14px',\n lineHeight: 1.6,\n overflow: 'hidden',\n transition: 'max-height 0.2s ease, padding 0.2s ease',\n },\n category: {\n display: 'inline-block',\n fontSize: '11px',\n fontWeight: 600,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: '4px 8px',\n borderRadius: '4px',\n marginBottom: '8px',\n },\n categoryHeader: {\n fontSize: '13px',\n fontWeight: 700,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n padding: '12px 4px 6px 4px',\n marginTop: '8px',\n },\n feedback: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginTop: '12px',\n paddingTop: '10px',\n borderTop: '1px solid rgba(0, 0, 0, 0.08)',\n fontSize: '13px',\n },\n feedbackButton: {\n background: 'none',\n border: '1px solid transparent',\n cursor: 'pointer',\n fontSize: '16px',\n padding: '4px 8px',\n borderRadius: '4px',\n transition: 'background-color 0.15s ease, border-color 0.15s ease',\n },\n feedbackButtonSelected: {\n borderColor: 'rgba(0, 0, 0, 0.2)',\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n emptyState: {\n textAlign: 'center' as const,\n padding: '48px 24px',\n fontSize: '14px',\n },\n noResults: {\n textAlign: 'center' as const,\n padding: '32px 16px',\n fontSize: '14px',\n },\n} as const;\n\nconst themeStyles = {\n light: {\n container: {\n backgroundColor: base.white,\n color: slateGrey[1],\n },\n searchInput: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n color: slateGrey[1],\n },\n item: {\n backgroundColor: slateGrey[12],\n border: `1px solid ${slateGrey[11]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n },\n question: {\n backgroundColor: 'transparent',\n color: slateGrey[1],\n },\n questionHover: {\n backgroundColor: slateGrey[12],\n },\n answer: {\n color: slateGrey[6],\n },\n category: {\n backgroundColor: purple[8],\n color: purple[2],\n },\n categoryHeader: {\n color: slateGrey[7],\n },\n emptyState: {\n color: slateGrey[8],\n },\n feedbackPrompt: {\n color: slateGrey[7],\n },\n },\n dark: {\n container: {\n backgroundColor: slateGrey[1],\n color: slateGrey[12],\n },\n searchInput: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n color: slateGrey[12],\n },\n item: {\n backgroundColor: slateGrey[3],\n border: `1px solid ${slateGrey[5]}`,\n },\n itemExpanded: {\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',\n },\n question: {\n backgroundColor: 'transparent',\n color: slateGrey[12],\n },\n questionHover: {\n backgroundColor: slateGrey[5],\n },\n answer: {\n color: slateGrey[8],\n },\n category: {\n backgroundColor: purple[0],\n color: purple[6],\n },\n categoryHeader: {\n color: slateGrey[8],\n },\n emptyState: {\n color: slateGrey[7],\n },\n feedbackPrompt: {\n color: slateGrey[8],\n },\n },\n};\n\n// ============================================================================\n// FAQItem Component\n// ============================================================================\n\ninterface FAQItemProps {\n item: FAQQuestionAction;\n isExpanded: boolean;\n onToggle: () => void;\n theme: 'light' | 'dark';\n feedbackConfig: FeedbackConfig | null;\n feedbackValue: FeedbackValue | undefined;\n onFeedback: (itemId: string, question: string, value: FeedbackValue) => void;\n}\n\nfunction FAQItem({\n item,\n isExpanded,\n onToggle,\n theme,\n feedbackConfig,\n feedbackValue,\n onFeedback,\n}: FAQItemProps) {\n const [isHovered, setIsHovered] = useState(false);\n const colors = themeStyles[theme];\n const { question, answer } = item.config;\n\n const itemStyle: React.CSSProperties = {\n ...baseStyles.item,\n ...colors.item,\n ...(isExpanded ? colors.itemExpanded : {}),\n };\n\n const questionStyle: React.CSSProperties = {\n ...baseStyles.question,\n ...colors.question,\n ...(isHovered ? colors.questionHover : {}),\n };\n\n const chevronStyle: React.CSSProperties = {\n ...baseStyles.chevron,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n };\n\n const answerStyle: React.CSSProperties = {\n ...baseStyles.answer,\n ...colors.answer,\n maxHeight: isExpanded ? '500px' : '0',\n paddingBottom: isExpanded ? '16px' : '0',\n };\n\n const feedbackStyle: React.CSSProperties = {\n ...baseStyles.feedback,\n ...colors.feedbackPrompt,\n };\n\n return (\n <div style={itemStyle} data-faq-item-id={item.config.id}>\n <button\n style={questionStyle}\n onClick={onToggle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n aria-expanded={isExpanded}\n >\n <span>{question}</span>\n <span style={chevronStyle}>{'\\u25BC'}</span>\n </button>\n <div style={answerStyle} aria-hidden={!isExpanded}>\n {renderAnswer(answer)}\n\n {/* Feedback UI \u2014 only when expanded and feedback is enabled */}\n {isExpanded && feedbackConfig && (\n <div style={feedbackStyle}>\n <span>{getFeedbackPrompt(feedbackConfig)}</span>\n <button\n style={{\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'up' ? baseStyles.feedbackButtonSelected : {}),\n }}\n aria-label=\"Thumbs up\"\n onClick={() => onFeedback(item.config.id, question, 'up')}\n >\n {'\\uD83D\\uDC4D'}\n </button>\n <button\n style={{\n ...baseStyles.feedbackButton,\n ...(feedbackValue === 'down' ? baseStyles.feedbackButtonSelected : {}),\n }}\n aria-label=\"Thumbs down\"\n onClick={() => onFeedback(item.config.id, question, 'down')}\n >\n {'\\uD83D\\uDC4E'}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// FAQWidget Component\n// ============================================================================\n\n/**\n * FAQWidget - Renders a collapsible Q&A accordion with per-item activation.\n *\n * This component demonstrates the compositional action pattern:\n * - Parent (FAQWidget) receives `config.actions` array\n * - Each action has optional `showWhen` for per-item visibility\n * - Parent evaluates showWhen and filters visible questions\n * - Parent manages expand state and re-rendering on context changes\n */\nexport function FAQWidget({ config, runtime, instanceId }: FAQWidgetProps) {\n // Force re-render when context/accumulator changes.\n // renderTick is used as a useMemo dependency to invalidate cached showWhen evaluations.\n const [renderTick, forceUpdate] = useReducer((x: number) => x + 1, 0);\n\n // Track expanded question IDs\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n\n // Search query state\n const [searchQuery, setSearchQuery] = useState('');\n\n // Track feedback state per item\n const [feedbackState, setFeedbackState] = useState<Map<string, FeedbackValue>>(new Map());\n\n // Resolve feedback config\n const feedbackConfig = useMemo(() => resolveFeedbackConfig(config.feedback), [config.feedback]);\n\n // Subscribe to context changes for reactive updates\n useEffect(() => {\n const unsubscribe = runtime.context.subscribe(() => {\n forceUpdate();\n });\n return unsubscribe;\n }, [runtime.context]);\n\n // Subscribe to accumulator changes for event_count-based showWhen\n useEffect(() => {\n if (!runtime.accumulator?.subscribe) return;\n return runtime.accumulator.subscribe(() => {\n forceUpdate();\n });\n }, [runtime.accumulator]);\n\n // Register accumulator predicates from scope config\n useEffect(() => {\n if (!config.scope || !runtime.accumulator?.register) return;\n const { events: eventNames, urlContains, props: propFilters } = config.scope;\n\n // Scan showWhen conditions for event_count keys\n const keys = new Set<string>();\n for (const action of config.actions) {\n if (action.showWhen?.type === 'rules') {\n for (const rule of action.showWhen.rules) {\n for (const cond of rule.conditions) {\n if ((cond as any).type === 'event_count' && (cond as any).key) {\n keys.add((cond as any).key);\n }\n }\n }\n }\n }\n\n for (const key of keys) {\n runtime.accumulator.register(key, (event: any) => {\n if (!eventNames.includes(event.name)) return false;\n if (urlContains) {\n const pathname = String(event.props?.pathname ?? '');\n if (!pathname.includes(urlContains)) return false;\n }\n if (propFilters) {\n for (const [k, v] of Object.entries(propFilters)) {\n if (event.props?.[k] !== v) return false;\n }\n }\n return true;\n });\n }\n }, [config.scope, config.actions, runtime.accumulator]);\n\n // Subscribe to faq:open:* events from overlay CTA clicks\n useEffect(() => {\n if (!runtime.events.subscribe) return;\n\n // Check EventBus history for pending faq:open events\n // (may have fired before this widget mounted, e.g. when canvas was closed)\n if (runtime.events.getRecent) {\n const recentEvents = runtime.events.getRecent(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n 10\n );\n const pendingEvent = recentEvents\n .filter((e) => {\n const actionId = e.props?.actionId;\n return typeof actionId === 'string' && actionId.startsWith('faq:open:');\n })\n .pop(); // Most recent\n\n if (pendingEvent && Date.now() - pendingEvent.ts < 10000) {\n const questionId = (pendingEvent.props!.actionId as string).replace('faq:open:', '');\n setExpandedIds(new Set([questionId]));\n // Scroll into view after render\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n }\n }\n\n // Subscribe to future CTA events\n const unsubscribe = runtime.events.subscribe(\n { patterns: ['^action\\\\.tooltip_cta_clicked$', '^action\\\\.modal_cta_clicked$'] },\n (event: { name: string; props?: Record<string, unknown>; ts: number }) => {\n const actionId = event.props?.actionId;\n if (typeof actionId !== 'string' || !actionId.startsWith('faq:open:')) return;\n\n const questionId = actionId.replace('faq:open:', '');\n setExpandedIds(new Set([questionId]));\n\n // Scroll the question into view\n requestAnimationFrame(() => {\n const el = document.querySelector(`[data-faq-item-id=\"${questionId}\"]`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n });\n\n // Request canvas open (for future tile-based FAQ rendering)\n runtime.events.publish('canvas.requestOpen');\n }\n );\n\n return unsubscribe;\n }, [runtime]);\n\n // Filter visible questions based on per-item showWhen\n const visibleQuestions = useMemo(\n () =>\n config.actions.filter((q) => {\n // No showWhen = always visible\n if (!q.showWhen) return true;\n\n // Evaluate the decision strategy\n const result = runtime.evaluateSync<boolean>(q.showWhen);\n return result.value;\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.actions, runtime, renderTick]\n );\n\n // NOTE: faq:question_revealed is now published by useNotifyWatcher in\n // ShadowCanvasOverlay (always mounted), so it fires even with drawer closed.\n\n // Apply priority ordering\n const orderedQuestions = useMemo(() => {\n if (config.ordering === 'priority') {\n return [...visibleQuestions].sort(\n (a, b) => (b.config.priority ?? 0) - (a.config.priority ?? 0)\n );\n }\n // 'static' or undefined \u2014 preserve config order\n return visibleQuestions;\n }, [visibleQuestions, config.ordering]);\n\n // Apply search filter\n const filteredQuestions = useMemo(() => {\n if (!config.searchable || !searchQuery.trim()) {\n return orderedQuestions;\n }\n\n const query = searchQuery.toLowerCase();\n return orderedQuestions.filter(\n (q) =>\n q.config.question.toLowerCase().includes(query) ||\n getAnswerText(q.config.answer).toLowerCase().includes(query) ||\n q.config.category?.toLowerCase().includes(query)\n );\n }, [orderedQuestions, searchQuery, config.searchable]);\n\n // Group by category\n const categoryGroups = useMemo(() => {\n const groups = new Map<string | undefined, FAQQuestionAction[]>();\n for (const q of filteredQuestions) {\n const cat = q.config.category;\n if (!groups.has(cat)) {\n groups.set(cat, []);\n }\n groups.get(cat)!.push(q);\n }\n return groups;\n }, [filteredQuestions]);\n\n // Check if any items have categories\n const hasCategories = useMemo(\n () => filteredQuestions.some((q) => q.config.category),\n [filteredQuestions]\n );\n\n // Resolve theme (auto -> detect system preference)\n const resolvedTheme = useMemo(() => {\n if (config.theme !== 'auto') return config.theme;\n\n // Check system preference (SSR-safe)\n if (typeof window !== 'undefined') {\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }, [config.theme]);\n\n // Handle question toggle\n const handleToggle = useCallback(\n (id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n\n if (config.expandBehavior === 'single') {\n // Single mode: collapse all others\n if (prev.has(id)) {\n return new Set();\n }\n return new Set([id]);\n }\n // Multiple mode: toggle this one\n if (prev.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n\n // Publish toggle event for analytics\n runtime.events.publish('faq:toggled', {\n instanceId,\n questionId: id,\n expanded: !expandedIds.has(id),\n timestamp: Date.now(),\n });\n },\n [config.expandBehavior, runtime.events, instanceId, expandedIds]\n );\n\n // Handle feedback\n const handleFeedback = useCallback(\n (itemId: string, question: string, value: FeedbackValue) => {\n setFeedbackState((prev) => {\n const next = new Map(prev);\n next.set(itemId, value);\n return next;\n });\n\n runtime.events.publish('faq:feedback', {\n itemId,\n question,\n value,\n });\n },\n [runtime.events]\n );\n\n // Compute styles\n const containerStyle: React.CSSProperties = {\n ...baseStyles.container,\n ...themeStyles[resolvedTheme].container,\n };\n\n const searchInputStyle: React.CSSProperties = {\n ...baseStyles.searchInput,\n ...themeStyles[resolvedTheme].searchInput,\n };\n\n const emptyStateStyle: React.CSSProperties = {\n ...baseStyles.emptyState,\n ...themeStyles[resolvedTheme].emptyState,\n };\n\n const categoryHeaderStyle: React.CSSProperties = {\n ...baseStyles.categoryHeader,\n ...themeStyles[resolvedTheme].categoryHeader,\n };\n\n // Render a list of FAQ items\n const renderItems = (items: FAQQuestionAction[]) =>\n items.map((q) => (\n <FAQItem\n key={q.config.id}\n item={q}\n isExpanded={expandedIds.has(q.config.id)}\n onToggle={() => handleToggle(q.config.id)}\n theme={resolvedTheme}\n feedbackConfig={feedbackConfig}\n feedbackValue={feedbackState.get(q.config.id)}\n onFeedback={handleFeedback}\n />\n ));\n\n // Empty state (no visible questions at all)\n if (visibleQuestions.length === 0) {\n return (\n <div style={containerStyle} data-adaptive-id={instanceId} data-adaptive-type=\"adaptive-faq\">\n <div style={emptyStateStyle}>No FAQ questions available.</div>\n </div>\n );\n }\n\n return (\n <div style={containerStyle} data-adaptive-id={instanceId} data-adaptive-type=\"adaptive-faq\">\n {/* Search input */}\n {config.searchable && (\n <div style={baseStyles.searchWrapper}>\n <input\n type=\"text\"\n placeholder=\"Search questions...\"\n value={searchQuery}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchQuery(e.target.value)}\n style={searchInputStyle}\n />\n </div>\n )}\n\n {/* Accordion \u2014 grouped by category if categories are present */}\n <div style={baseStyles.accordion}>\n {hasCategories\n ? Array.from(categoryGroups.entries()).map(([category, items]) => (\n <React.Fragment key={category ?? '__ungrouped'}>\n {category && (\n <div style={categoryHeaderStyle} data-category-header={category}>\n {category}\n </div>\n )}\n {renderItems(items)}\n </React.Fragment>\n ))\n : renderItems(filteredQuestions)}\n </div>\n\n {/* No search results */}\n {config.searchable && filteredQuestions.length === 0 && searchQuery && (\n <div style={{ ...baseStyles.noResults, ...themeStyles[resolvedTheme].emptyState }}>\n No questions found matching "{searchQuery}"\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Mountable Widget Interface\n// ============================================================================\n\n/**\n * Mountable widget interface for the runtime's WidgetRegistry.\n */\nexport const FAQMountableWidget = {\n mount(\n container: HTMLElement,\n config?: FAQConfig & { runtime?: FAQWidgetRuntime; instanceId?: string }\n ) {\n const {\n runtime,\n instanceId = 'faq-widget',\n ...faqConfig\n } = config || {\n expandBehavior: 'single' as const,\n searchable: false,\n theme: 'auto' as const,\n actions: [],\n };\n\n // React rendering when runtime + ReactDOM are available\n if (runtime && typeof createRoot === 'function') {\n const root = createRoot(container);\n root.render(\n React.createElement(FAQWidget, {\n config: faqConfig as FAQConfig,\n runtime: runtime as FAQWidgetRuntime,\n instanceId,\n })\n );\n return () => {\n root.unmount();\n };\n }\n\n // HTML fallback when React is not available\n const questions = (faqConfig as FAQConfig).actions || [];\n container.innerHTML = `\n <div style=\"font-family: system-ui; max-width: 800px;\">\n ${questions\n .map(\n (q) => `\n <div style=\"margin-bottom: 8px; padding: 16px; background: ${slateGrey[12]}; border-radius: 8px;\">\n <strong>${q.config.question}</strong>\n <p style=\"margin-top: 8px; color: ${slateGrey[6]};\">${getAnswerText(q.config.answer)}</p>\n </div>\n `\n )\n .join('')}\n </div>\n `;\n\n return () => {\n container.innerHTML = '';\n };\n },\n};\n\nexport default FAQWidget;\n", "/**\n * Adaptive FAQ - Runtime Module\n *\n * Runtime manifest for the FAQ accordion adaptive.\n * Provides action executors and widget registration.\n */\n\nimport { executorDefinitions } from './executors';\nimport { FAQMountableWidget } from './FAQWidget';\n\n// ============================================================================\n// App Runtime Manifest\n// ============================================================================\n\n/**\n * Runtime manifest for adaptive-faq.\n *\n * Provides:\n * - FAQ action executors (scroll_to, toggle_item, update)\n * - Widget-based accordion (compositional faq:question actions)\n */\nexport const runtime = {\n id: 'adaptive-faq',\n version: '2.0.0',\n name: 'FAQ Accordion',\n description:\n 'Collapsible Q&A accordion with actions, rich content, feedback, and personalization',\n\n /**\n * Action executors for programmatic FAQ interaction.\n */\n executors: executorDefinitions,\n\n /**\n * Widget definitions for the runtime's WidgetRegistry.\n */\n widgets: [\n {\n id: 'adaptive-faq:accordion',\n component: FAQMountableWidget,\n metadata: {\n name: 'FAQ Accordion',\n description: 'Collapsible Q&A accordion with search, categories, and feedback',\n icon: '\u2753',\n },\n },\n ],\n};\n\nexport default runtime;\n", "/**\n * CDN Entry Point for Adaptive FAQ\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 FAQEditor, { editorPanel } from './editor';\nimport { runtime } from './runtime';\nimport type { FAQQuestionAction } from './types';\n\n/**\n * App manifest for registry registration.\n * Follows the AppManifest interface expected by AppLoader/AppRegistry.\n */\nexport const manifest = {\n id: 'adaptive-faq',\n version: runtime.version,\n name: runtime.name,\n description: runtime.description,\n runtime: {\n actions: runtime.executors,\n widgets: runtime.widgets,\n /**\n * Extract notify watcher entries from tile config props.\n * The runtime evaluates these continuously (even with drawer closed)\n * and publishes faq:question_revealed when showWhen transitions false \u2192 true.\n */\n notifyWatchers(props: Record<string, unknown>) {\n const actions = (props.actions ?? []) as FAQQuestionAction[];\n return actions\n .filter((a) => a.notify && a.showWhen)\n .map((a) => ({\n id: `faq:${a.config.id}`,\n strategy: a.showWhen!,\n eventName: 'faq:question_revealed',\n eventProps: {\n questionId: a.config.id,\n question: a.config.question,\n title: a.notify!.title,\n body: a.notify!.body,\n icon: a.notify!.icon,\n },\n }));\n },\n },\n editor: {\n component: FAQEditor,\n panel: editorPanel,\n getActionLabel(action: Record<string, unknown>) {\n const config = (action.config as Record<string, unknown>) || {};\n return (config.question as string) || (action.kind as string) || 'faq:update';\n },\n },\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": ["cn", "classes", "_R", "_jsx", "type", "props", "key", "R", "p", "jsx", "jsxs", "Fragment", "EditorLayout", "children", "jsx", "EditorHeader", "title", "subtitle", "onBack", "jsxs", "jsx", "EditorBody", "children", "jsx", "EditorFooter", "onSave", "onPublish", "jsxs", "jsx", "EditorCard", "children", "itemKey", "onMouseEnter", "onMouseLeave", "className", "validated", "jsx", "cn", "DetectionBadge", "found", "jsx", "cn", "_R", "react_default", "_", "k", "useState", "useEffect", "useMemo", "useCallback", "useRef", "useReducer", "_R", "_r", "_R", "Fragment", "Suspense", "Children", "Component", "PureComponent", "DismissedSection", "count", "children", "isOpen", "setIsOpen", "useState", "jsxs", "jsx", "GroupHeader", "label", "count", "className", "jsxs", "cn", "jsx", "BeforeAfterToggle", "mode", "onToggle", "jsxs", "jsx", "cn", "EditorInput", "label", "className", "props", "jsxs", "jsx", "cn", "EditorTextarea", "label", "className", "props", "jsxs", "jsx", "cn", "EditBackButton", "onClick", "label", "jsx", "EmptyState", "message", "jsx", "formatMatch", "match", "k", "v", "formatOperator", "op", "formatConditionLabel", "condition", "accumulatorCount", "event", "target", "current", "parts", "ProgressBar", "current", "target", "pct", "jsx", "cn", "ConditionRow", "cs", "jsxs", "Fragment", "ConditionStatusLine", "status", "expanded", "setExpanded", "useState", "visible", "conditions", "passedCount", "c", "totalCount", "icon", "iconColor", "e", "i", "getRuntime", "evaluateConditionLocally", "condition", "runtime", "ctx", "type", "passed", "accCount", "event", "match", "withinMs", "count", "target", "pattern", "anchor", "a", "width", "height", "val", "threshold", "limitReached", "formatted", "formatConditionLabel", "evaluateShowWhen", "showWhen", "allConditions", "rule", "ruleMatched", "cs", "useShowWhenStatus", "items", "statuses", "setStatuses", "useState", "itemsRef", "useRef", "evaluate", "useCallback", "map", "item", "useEffect", "unsubs", "interval", "u", "truncate", "text", "max", "stripHtml", "html", "getAnswerPreview", "answer", "isRuleStrategy", "s", "describeTrigger", "showWhen", "pages", "anchors", "rule", "condition", "parts", "summarizeFAQItem", "item", "q", "a", "isOwnAction", "action", "isRuleStrategy", "s", "extractTargetingInfo", "showWhen", "pagePatterns", "anchorSelectors", "rule", "cond", "c", "hasTargeting", "extractFirstPage", "extractFirstAnchor", "getAnswerText", "answer", "flattenItems", "config", "isOwnAction", "q", "i", "summarizeFAQItem", "describeTrigger", "filterConfig", "dismissedKeys", "ownActions", "_", "useDetection", "items", "getCurrentRoute", "detectionMap", "setDetectionMap", "useState", "itemsRef", "useRef", "useEffect", "runDetection", "map", "currentPath", "item", "targeting", "pageMatch", "pattern", "anchorFound", "element", "interval", "FAQEditor", "onChange", "editor", "typedConfig", "setDismissedKeys", "editingKey", "setEditingKey", "previewMode", "setPreviewMode", "_hoveredKey", "setHoveredKey", "initialConsumed", "allItems", "activeItems", "dismissedItems", "totalQuestions", "foundCount", "showWhenItems", "react_default", "showWhenStatuses", "useShowWhenStatus", "handleDismiss", "useCallback", "key", "prev", "next", "handleRestore", "handleCardBodyClick", "handleTriggerClick", "pageUrl", "handleBackToList", "handleBeforeAfter", "mode", "filtered", "handleFieldChange", "index", "field", "value", "otherActions", "a", "updated", "handlePublish", "handleCardHover", "handleCardLeave", "renderEditFields", "it", "jsxs", "jsx", "EditorInput", "e", "EditorTextarea", "EditorLayout", "EditorHeader", "EditorBody", "editIndex", "editItem", "Fragment", "BeforeAfterToggle", "EditBackButton", "EmptyState", "GroupHeader", "detection", "EditorCard", "DetectionBadge", "ConditionStatusLine", "DismissedSection", "EditorFooter", "editorPanel", "editor_default", "FAQEditor", "resolveItem", "store", "itemId", "itemQuestion", "found", "i", "executeScrollToFaq", "action", "context", "item", "id", "el", "executeToggleFaqItem", "desiredState", "newState", "wasExpanded", "executeUpdateFaq", "items", "position", "order", "executorDefinitions", "base", "brand", "slateGrey", "green", "yellow", "red", "blue", "orange", "purple", "pink", "text", "slateGrey", "background", "border", "button", "base", "brand", "red", "green", "badge", "yellow", "purple", "blue", "orange", "pink", "badgeBanner", "alert", "tag", "menu", "inputDropdown", "inputField", "toggle", "checkbox", "avatar", "progressBarSlider", "card", "sidebar", "modal", "tab", "table", "breadcrumbs", "loadingIndicator", "datePicker", "scroll", "_RD", "client_default", "_", "k", "createRoot", "getAnswerText", "answer", "renderAnswer", "jsx", "resolveFeedbackConfig", "feedback", "getFeedbackPrompt", "feedbackConfig", "baseStyles", "themeStyles", "base", "slateGrey", "purple", "FAQItem", "item", "isExpanded", "onToggle", "theme", "feedbackValue", "onFeedback", "isHovered", "setIsHovered", "useState", "colors", "question", "itemStyle", "questionStyle", "chevronStyle", "answerStyle", "feedbackStyle", "jsxs", "FAQWidget", "config", "runtime", "instanceId", "renderTick", "forceUpdate", "useReducer", "x", "expandedIds", "setExpandedIds", "searchQuery", "setSearchQuery", "feedbackState", "setFeedbackState", "useMemo", "useEffect", "eventNames", "urlContains", "propFilters", "keys", "action", "rule", "cond", "key", "event", "k", "v", "pendingEvent", "e", "actionId", "questionId", "el", "visibleQuestions", "q", "orderedQuestions", "a", "b", "filteredQuestions", "query", "categoryGroups", "groups", "cat", "hasCategories", "resolvedTheme", "handleToggle", "useCallback", "id", "prev", "next", "handleFeedback", "itemId", "value", "containerStyle", "searchInputStyle", "emptyStateStyle", "categoryHeaderStyle", "renderItems", "items", "category", "react_default", "FAQMountableWidget", "container", "faqConfig", "createRoot", "root", "questions", "runtime", "executorDefinitions", "FAQMountableWidget", "manifest", "runtime", "props", "a", "editor_default", "editorPanel", "action", "registry", "cdn_default"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function p(){return typeof SynOS<"u"&&SynOS.React||{}}function g(e,n,t){var o=p(),i=n||{},a=i.children;return delete i.children,t!==void 0&&(i.key=t),Array.isArray(a)?o.createElement.apply(null,[e,i].concat(a)):a!==void 0?o.createElement(e,i,a):o.createElement(e,i)}var d=g,m=g,y=p().Fragment;function l({config:e,onChange:n,editor:t}){return m("div",{className:"syntro-gamification-editor",children:[d("p",{children:"Gamification editor coming soon..."}),d("p",{children:"Configure badges, points, rewards, and leaderboards."})]})}var u={panel:{title:"Gamification",icon:"\u{1F3AE}",description:"Badges, rewards, and engagement"},component:l};var x=async(e,n)=>{let{badgeId:t}=e;return n.publishEvent("gamification.badge_awarded",{badgeId:t,awardedAt:Date.now()}),{cleanup:()=>{}}},v=async(e,n)=>{let{points:t,reason:o}=e;return n.publishEvent("gamification.points_added",{points:t,reason:o,timestamp:Date.now()}),{cleanup:()=>{}}},w={names:["page_view","button_click"],handler:(e,n)=>{console.log("[Gamification] Event received for badge trigger check")}},c=[{kind:"gamification:awardBadge",executor:x},{kind:"gamification:addPoints",executor:v}],s=[w],r={id:"adaptive-gamification",version:"1.0.0",name:"Gamification",description:"Badges, rewards, points, and engagement mechanics",executors:c,eventHandlers:s};var f={id:"adaptive-gamification",version:r.version,name:r.name,description:r.description,runtime:{actions:c.map(({kind:e,executor:n})=>({kind:e,executor:n})),events:s},editor:u,metadata:{isBuiltIn:!1}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(f)}var k=f;export{k as default,f as manifest};
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["syntro-react:react/jsx-runtime", "../../../../adaptives/adaptive-gamification/src/editor.tsx", "../../../../adaptives/adaptive-gamification/src/runtime.ts", "../../../../adaptives/adaptive-gamification/src/cdn.ts"],
|
|
4
|
-
"sourcesContent": ["\n function _R() {\n return (typeof SynOS !== 'undefined' && SynOS.React) || {};\n }\n function _jsx(type, props, key) {\n var R = _R();\n var p = props || {};\n var c = p.children;\n delete p.children;\n if (key !== undefined) p.key = key;\n return Array.isArray(c)\n ? R.createElement.apply(null, [type, p].concat(c))\n : c !== undefined\n ? R.createElement(type, p, c)\n : R.createElement(type, p);\n }\n export var jsx = _jsx;\n export var jsxs = _jsx;\n export var Fragment = _R().Fragment;\n ", "/**\n * Adaptive Gamification - Editor Module\n *\n * Editor panel for configuring gamification features.\n */\n\nimport type { EditorPanelProps } from './types';\n\n/**\n * Gamification editor panel component.\n */\nexport function GamificationEditor({\n config: _config,\n onChange: _onChange,\n editor: _editor,\n}: EditorPanelProps) {\n return (\n <div className=\"syntro-gamification-editor\">\n <p>Gamification editor coming soon...</p>\n <p>Configure badges, points, rewards, and leaderboards.</p>\n </div>\n );\n}\n\n/**\n * Editor module configuration.\n */\nexport const editor = {\n panel: {\n title: 'Gamification',\n icon: '\uD83C\uDFAE',\n description: 'Badges, rewards, and engagement',\n },\n component: GamificationEditor,\n};\n", "/**\n * Adaptive Gamification - Runtime Module\n *\n * Gamification actions: awardBadge, addPoints.\n * Provides gamification features like badges, points, and rewards.\n */\n\nimport type { ExecutorResult, ActionExecutor } from './types';\n\n// ============================================================================\n// Action Types\n// ============================================================================\n\n/**\n * Award badge action\n */\nexport interface AwardBadgeAction {\n kind: 'gamification:awardBadge';\n badgeId: string;\n anchorId?: string;\n label?: string;\n}\n\n/**\n * Add points action\n */\nexport interface AddPointsAction {\n kind: 'gamification:addPoints';\n points: number;\n reason?: string;\n label?: string;\n}\n\n// ============================================================================\n// Executors\n// ============================================================================\n\n/**\n * Execute an awardBadge action\n *\n * Note: This executor uses publishEvent to track badge awards.\n * State management is handled at the app level via AppContext,\n * not at the action executor level.\n */\nexport const executeAwardBadge: ActionExecutor<AwardBadgeAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const { badgeId } = action;\n\n // Emit telemetry event (state management handled at app level)\n context.publishEvent('gamification.badge_awarded', {\n badgeId,\n awardedAt: Date.now(),\n });\n\n return {\n cleanup: () => {\n // Badge awards are permanent, no cleanup needed\n },\n };\n};\n\n/**\n * Execute an addPoints action\n *\n * Note: This executor uses publishEvent to track points.\n * State management is handled at the app level via AppContext,\n * not at the action executor level.\n */\nexport const executeAddPoints: ActionExecutor<AddPointsAction> = async (\n action,\n context\n): Promise<ExecutorResult> => {\n const { points, reason } = action;\n\n // Emit telemetry event (state management handled at app level)\n context.publishEvent('gamification.points_added', {\n points,\n reason,\n timestamp: Date.now(),\n });\n\n return {\n cleanup: () => {\n // Points are permanent, no cleanup needed\n },\n };\n};\n\n// ============================================================================\n// Event Handlers\n// ============================================================================\n\n/**\n * Event handler for auto-awarding badges based on triggers.\n */\nexport const badgeTriggerHandler = {\n names: ['page_view', 'button_click'],\n handler: (_event: unknown, _ctx: unknown) => {\n // Auto-award badges based on event triggers\n // This would check badge trigger conditions in the config\n console.log('[Gamification] Event received for badge trigger check');\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: 'gamification:awardBadge', executor: executeAwardBadge },\n { kind: 'gamification:addPoints', executor: executeAddPoints },\n] as const;\n\n/**\n * Event handlers provided by this app.\n */\nexport const eventHandlers = [badgeTriggerHandler];\n\n/**\n * App runtime manifest.\n */\nexport const runtime = {\n id: 'adaptive-gamification',\n version: '1.0.0',\n name: 'Gamification',\n description: 'Badges, rewards, points, and engagement mechanics',\n executors,\n eventHandlers,\n};\n", "/**\n * CDN Entry Point for Adaptive Gamification\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, eventHandlers, 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-gamification',\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 events: eventHandlers,\n },\n editor,\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": "AACY,SAASA,GAAK,CACZ,OAAQ,OAAO,MAAU,KAAe,MAAM,OAAU,CAAC,CAC3D,CACA,SAASC,EAAKC,EAAMC,EAAOC,EAAK,CAC9B,IAAIC,EAAIL,EAAG,EACPM,EAAIH,GAAS,CAAC,EACdI,EAAID,EAAE,SACV,cAAOA,EAAE,SACLF,IAAQ,SAAWE,EAAE,IAAMF,GACxB,MAAM,QAAQG,CAAC,EAClBF,EAAE,cAAc,MAAM,KAAM,CAACH,EAAMI,CAAC,EAAE,OAAOC,CAAC,CAAC,EAC/CA,IAAM,OACJF,EAAE,cAAcH,EAAMI,EAAGC,CAAC,EAC1BF,EAAE,cAAcH,EAAMI,CAAC,CAC/B,CACO,IAAIE,EAAMP,EACNQ,EAAOR,EACPS,EAAWV,EAAG,EAAE,SCPhC,SAASW,EAAmB,CACjC,OAAQC,EACR,SAAUC,EACV,OAAQC,CACV,EAAqB,CACnB,OACEC,EAAC,OAAI,UAAU,6BACb,UAAAC,EAAC,KAAE,8CAAkC,EACrCA,EAAC,KAAE,gEAAoD,GACzD,CAEJ,CAKO,IAAMC,EAAS,CACpB,MAAO,CACL,MAAO,eACP,KAAM,YACN,YAAa,iCACf,EACA,UAAWN,CACb,ECUO,IAAMO,EAAsD,MACjEC,EACAC,IAC4B,CAC5B,GAAM,CAAE,QAAAC,CAAQ,EAAIF,EAGpB,OAAAC,EAAQ,aAAa,6BAA8B,CACjD,QAAAC,EACA,UAAW,KAAK,IAAI,CACtB,CAAC,EAEM,CACL,QAAS,IAAM,CAEf,CACF,CACF,EASaC,EAAoD,MAC/DH,EACAC,IAC4B,CAC5B,GAAM,CAAE,OAAAG,EAAQ,OAAAC,CAAO,EAAIL,EAG3B,OAAAC,EAAQ,aAAa,4BAA6B,CAChD,OAAAG,EACA,OAAAC,EACA,UAAW,KAAK,IAAI,CACtB,CAAC,EAEM,CACL,QAAS,IAAM,CAEf,CACF,CACF,EASaC,EAAsB,CACjC,MAAO,CAAC,YAAa,cAAc,EACnC,QAAS,CAACC,EAAiBC,IAAkB,CAG3C,QAAQ,IAAI,uDAAuD,CACrE,CACF,EAUaC,EAAY,CACvB,CAAE,KAAM,0BAA2B,SAAUV,CAAkB,EAC/D,CAAE,KAAM,yBAA0B,SAAUI,CAAiB,CAC/D,EAKaO,EAAgB,CAACJ,CAAmB,EAKpCK,EAAU,CACrB,GAAI,wBACJ,QAAS,QACT,KAAM,eACN,YAAa,oDACb,UAAAF,EACA,cAAAC,CACF,ECxHO,IAAME,EAAW,CACtB,GAAI,wBACJ,QAASC,EAAQ,QACjB,KAAMA,EAAQ,KACd,YAAaA,EAAQ,YACrB,QAAS,CACP,QAASC,EAAU,IAAI,CAAC,CAAE,KAAAC,EAAM,SAAAC,CAAS,KAAO,CAC9C,KAAAD,EACA,SAAAC,CACF,EAAE,EACF,OAAQC,CACV,EACA,OAAAC,EACA,SAAU,CACR,UAAW,EACb,CACF,EAMA,GAAI,OAAO,OAAW,IAAa,CACjC,IAAMC,EAAY,OAAe,OAAO,YACpCA,GAAY,OAAOA,EAAS,UAAa,YAC3CA,EAAS,SAASP,CAAQ,CAE9B,CAEA,IAAOQ,EAAQR",
|
|
6
|
-
"names": ["_R", "_jsx", "type", "props", "key", "R", "p", "c", "jsx", "jsxs", "Fragment", "GamificationEditor", "_config", "_onChange", "_editor", "jsxs", "jsx", "editor", "executeAwardBadge", "action", "context", "badgeId", "executeAddPoints", "points", "reason", "badgeTriggerHandler", "_event", "_ctx", "executors", "eventHandlers", "runtime", "manifest", "runtime", "executors", "kind", "executor", "eventHandlers", "editor", "registry", "cdn_default"]
|
|
7
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
function E(...e){return e.filter(Boolean).join(" ")}function Se(){return typeof SynOS<"u"&&SynOS.React||{}}function Ee(e,r,t){var i=Se(),s=r||{},u=s.children;return delete s.children,t!==void 0&&(s.key=t),Array.isArray(u)?i.createElement.apply(null,[e,s].concat(u)):u!==void 0?i.createElement(e,s,u):i.createElement(e,s)}var o=Ee,c=Ee,K=Se().Fragment;function ae({children:e}){return o("div",{className:"se-flex se-flex-col se-h-full se-font-sans",children:e})}function ie({title:e,subtitle:r,onBack:t}){return c("div",{className:"se-p-4 se-border-b se-border-border-primary se-flex se-items-center se-gap-3",children:[o("button",{onClick:t,className:"se-px-3 se-py-1.5 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer hover:se-text-btn-neutral-text-hover",children:"\u2190 Back"}),c("div",{children:[o("h2",{className:"se-m-0 se-text-base se-font-semibold se-text-text-primary",children:e}),r&&o("p",{className:"se-mt-0.5 se-mb-0 se-text-xs se-text-text-secondary",children:r})]})]})}function ce({children:e}){return o("div",{className:"se-flex-1 se-overflow-auto se-p-6",children:e})}function le({onSave:e,onPublish:r}){return c("div",{className:"se-py-3 se-px-4 se-border-t se-border-border-primary se-flex se-gap-2",children:[o("button",{onClick:e,className:"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-blue-5/15 se-text-blue-5 se-text-base se-font-semibold se-cursor-pointer",children:"Save Draft"}),o("button",{onClick:r,className:"se-flex-1 se-py-2.5 se-rounded-lg se-border-none se-bg-green-4 se-text-white se-text-base se-font-semibold se-cursor-pointer",children:"Publish"})]})}function de({children:e,itemKey:r,onMouseEnter:t,onMouseLeave:i,className:s,validated:u}){return o("div",{"data-item-key":r,onMouseEnter:t,onMouseLeave:i,className:E("se-py-2 se-px-2.5 se-rounded-lg se-border se-bg-card-bg se-shadow-sm se-mb-1 se-text-sm se-text-text-primary",u?"se-border-green-4/40 se-shadow-glow-green":"se-border-border-primary",s),children:e})}function ue({found:e}){return o("span",{className:E("se-w-2 se-h-2 se-rounded-full se-shrink-0 se-inline-block",e?"se-bg-green-4":"se-bg-text-tertiary"),title:e?"Found on this page":"Not found on this page"})}function O(){return typeof SynOS<"u"&&SynOS.React||{}}var X=new Proxy({},{get:function(e,r){return O()[r]}});function C(){return O().useState.apply(null,arguments)}function H(){return O().useEffect.apply(null,arguments)}function J(){return O().useMemo.apply(null,arguments)}function N(){return O().useCallback.apply(null,arguments)}function Y(){return O().useRef.apply(null,arguments)}function Ne(){return O().useReducer.apply(null,arguments)}var Q=O(),Nt=Q.Fragment,Ct=Q.Suspense,Tt=Q.Children,Rt=Q.Component,At=Q.PureComponent;function pe({count:e,children:r}){let[t,i]=C(!1);return c("div",{className:"se-mt-4 se-cursor-pointer se-select-none",children:[c("div",{className:"se-text-xs se-font-semibold se-text-text-tertiary se-flex se-items-center se-gap-1.5 se-cursor-pointer",onClick:()=>i(!t),children:[o("span",{children:t?"\u25BE":"\u25B8"}),c("span",{children:["Dismissed (",e,")"]})]}),t&&o("div",{className:"se-mt-1.5",children:r})]})}function fe({label:e,count:r,className:t}){return c("div",{className:E("se-text-xs se-font-bold se-text-text-secondary se-uppercase se-tracking-wide se-py-1 se-pb-2 se-flex se-items-center se-justify-between",t),children:[o("span",{children:e}),o("span",{className:"se-text-xs se-text-text-tertiary se-bg-badge-slate-bg se-px-1.5 se-py-0.5 se-rounded-lg",children:r})]})}function ge({mode:e,onToggle:r}){return c("div",{className:"se-flex se-mb-3 se-rounded-lg se-overflow-hidden se-border se-border-border-primary",children:[o("button",{onClick:()=>r("before"),className:E("se-flex-1 se-py-1.5 se-px-3 se-border-none se-text-sm se-font-semibold se-cursor-pointer",e==="before"?"se-bg-blue-5/20 se-text-blue-5":"se-bg-transparent se-text-text-secondary"),children:"Before"}),o("button",{onClick:()=>r("after"),className:E("se-flex-1 se-py-1.5 se-px-3 se-border-none se-border-l se-border-border-primary se-text-sm se-font-semibold se-cursor-pointer",e==="after"?"se-bg-blue-5/20 se-text-blue-5":"se-bg-transparent se-text-text-secondary"),children:"After"})]})}function q({label:e,className:r,...t}){return c("div",{children:[e&&o("label",{className:"se-text-sm se-font-medium se-text-input-field-text-label se-mb-1 se-block",children:e}),o("input",{...t,className:E("se-w-full se-py-2 se-px-3 se-rounded-lg se-border se-border-input-field-border se-bg-input-field-bg se-text-text-primary se-text-sm se-font-[inherit] se-mb-2 se-box-border","placeholder:se-text-input-field-text-placeholder","focus:se-border-input-field-border-selected focus:se-outline-none focus:se-ring-1 focus:se-ring-input-field-border-selected","disabled:se-bg-input-field-bg-disabled disabled:se-cursor-not-allowed disabled:se-opacity-50",r)})]})}function me({onClick:e,label:r="\u2190 List"}){return o("button",{onClick:e,className:"se-py-1.5 se-px-3 se-rounded-md se-border se-border-btn-neutral-border se-bg-transparent se-text-btn-neutral-text se-text-sm se-cursor-pointer se-mt-2 hover:se-text-btn-neutral-text-hover",children:r})}function be({message:e}){return o("div",{className:"se-text-center se-py-8 se-px-4 se-text-text-secondary se-text-sm",children:e})}function Ge(e){return!e||Object.keys(e).length===0?"":` (${Object.entries(e).map(([t,i])=>`${t}: ${i}`).join(", ")})`}function G(e){switch(e){case"gte":return"\u2265";case"lte":return"\u2264";case"gt":return">";case"lt":return"<";case"eq":return"=";default:return e}}function xe(e,r){switch(e.type){case"event_count":{let t=e.event,i=e.match,s=e.operator,u=e.count,l=r??0;return{label:`${t}${Ge(i)} ${G(s)} ${u}`,progress:{current:l,target:u,operator:s}}}case"page_url":return{label:`${e.url}`};case"anchor_visible":return{label:`${e.anchorId} (${e.state})`};case"event_occurred":return{label:`${e.eventName}`};case"state_equals":return{label:`${e.key} = ${JSON.stringify(e.value)}`};case"viewport":{let t=[];return e.minWidth!==void 0&&t.push(`w ${G("gte")} ${e.minWidth}px`),e.maxWidth!==void 0&&t.push(`w ${G("lte")} ${e.maxWidth}px`),e.minHeight!==void 0&&t.push(`h ${G("gte")} ${e.minHeight}px`),e.maxHeight!==void 0&&t.push(`h ${G("lte")} ${e.maxHeight}px`),{label:t.join(", ")||"any viewport"}}case"session_metric":return{label:`${e.key} ${G(e.operator)} ${e.threshold}`};case"dismissed":return{label:e.inverted?"not dismissed":"dismissed"};case"cooldown_active":return{label:e.inverted?"cooldown inactive":"cooldown active"};case"frequency_limit":return{label:`shown ${G(e.inverted?"lt":"gte")} ${e.limit} times`};default:return{label:`${e.type}`}}}function Ce({current:e,target:r}){let t=Math.min(100,Math.round(e/Math.max(r,1)*100));return o("span",{className:"se-inline-block se-w-12 se-h-1.5 se-rounded-full se-bg-white/10 se-align-middle se-ml-1",title:`${e}/${r} (${t}%)`,children:o("span",{className:E("se-block se-h-full se-rounded-full se-transition-all",t>=100?"se-bg-green-4":"se-bg-blue-4"),style:{width:`${t}%`}})})}function Ue({cs:e}){return c("div",{className:"se-flex se-items-center se-gap-1 se-pl-3 se-text-[10px] se-text-slate-grey-8",children:[o("span",{className:e.passed?"se-text-green-4":"se-text-red-4",children:e.passed?"\u2713":"\u2717"}),c("span",{children:[e.type,":"]}),o("span",{className:"se-text-slate-grey-7",children:e.formatted.label}),e.formatted.progress&&c(K,{children:[o(Ce,{current:e.formatted.progress.current,target:e.formatted.progress.target}),c("span",{className:"se-text-slate-grey-7 se-ml-0.5",children:[e.formatted.progress.current,"/",e.formatted.progress.target]})]})]})}function he({status:e}){let[r,t]=C(!1);if(!e)return null;let{visible:i,conditions:s}=e,u=s.filter(f=>f.passed).length,l=s.length,d=i?"\u2713":"\u23F3",g=i?"se-text-green-4":"se-text-yellow-5";if(l===1){let f=s[0];return c("div",{className:"se-text-[10px] se-text-slate-grey-8 se-mt-0.5 se-flex se-items-center se-gap-1",children:[o("span",{className:g,children:d}),c("span",{children:[f.type,":"]}),o("span",{className:"se-text-slate-grey-7",children:f.formatted.label}),f.formatted.progress&&c(K,{children:[o(Ce,{current:f.formatted.progress.current,target:f.formatted.progress.target}),c("span",{className:"se-text-slate-grey-7 se-ml-0.5",children:[f.formatted.progress.current,"/",f.formatted.progress.target]})]})]})}return c("div",{className:"se-mt-0.5",children:[c("button",{type:"button",className:"se-flex se-items-center se-gap-1 se-text-[10px] se-text-slate-grey-8 se-bg-transparent se-border-none se-cursor-pointer se-p-0 hover:se-text-slate-grey-6",onClick:f=>{f.stopPropagation(),t(!r)},children:[o("span",{className:g,children:d}),c("span",{children:[u," of ",l," conditions met"]}),o("span",{className:"se-text-[8px] se-ml-0.5",children:r?"\u25B2":"\u25BC"})]}),r&&o("div",{className:"se-mt-0.5 se-space-y-0.5",children:s.map((f,h)=>o(Ue,{cs:f},h))})]})}function Te(){return window.SynOS?.handle?.runtime??null}function Ve(e,r){let t=r.context.get(),i=e.type,s=!1,u;switch(i){case"event_count":{if(!r.accumulator)break;let d=e.event,g=e.match,y=e.withinMs,f=r.accumulator.getCount(d,g,y);u=f;let h=e.count;switch(e.operator){case"gte":s=f>=h;break;case"lte":s=f<=h;break;case"eq":s=f===h;break;case"gt":s=f>h;break;case"lt":s=f<h;break}break}case"page_url":{let g=e.url.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,".*").replace(/\*/g,"[^/]*");s=new RegExp(`^${g}$`).test(t.page.url);break}case"route":s=t.page.routeId===e.routeId;break;case"anchor_visible":{let g=t.anchors?.find(y=>y.anchorId===e.anchorId);switch(e.state){case"visible":s=g?.visible===!0;break;case"present":s=g?.present===!0;break;case"absent":s=!g?.present;break}break}case"event_occurred":s=r.events?.hasRecentEvent(e.eventName,e.withinMs??6e4)??!1;break;case"viewport":{let{width:d,height:g}=t.viewport;s=!0,e.minWidth!==void 0&&d<e.minWidth&&(s=!1),e.maxWidth!==void 0&&d>e.maxWidth&&(s=!1),e.minHeight!==void 0&&g<e.minHeight&&(s=!1),e.maxHeight!==void 0&&g>e.maxHeight&&(s=!1);break}case"session_metric":{let d=r.state?.getSessionMetric(e.key)??0,g=e.threshold;switch(e.operator){case"gte":s=d>=g;break;case"lte":s=d<=g;break;case"eq":s=d===g;break;case"gt":s=d>g;break;case"lt":s=d<g;break}break}case"dismissed":s=e.inverted?!(r.state?.isDismissed(e.key)??!1):r.state?.isDismissed(e.key)??!1;break;case"cooldown_active":s=e.inverted?!(r.state?.isCooldownActive(e.key)??!1):r.state?.isCooldownActive(e.key)??!1;break;case"frequency_limit":{let g=(r.state?.getFrequencyCount(e.key)??0)>=e.limit;s=e.inverted?!g:g;break}}let l=xe(e,u);return{passed:s,cs:{type:i,passed:s,formatted:l}}}function Xe(e,r){if(e.type!=="rules"||!e.rules?.length)return{visible:!!e.default,isFallback:!0,conditions:[]};let t=[];for(let i of e.rules){let s=!0;for(let u of i.conditions){let{passed:l,cs:d}=Ve(u,r);t.push(d),l||(s=!1)}if(s)return{visible:i.value,isFallback:!1,conditions:t}}return{visible:e.default??!1,isFallback:!0,conditions:t}}function ye(e){let[r,t]=C(new Map),i=Y(e);i.current=e;let s=N(()=>{let u=Te();if(!u)return;let l=new Map;for(let d of i.current)d.showWhen?l.set(d.id,Xe(d.showWhen,u)):l.set(d.id,null);t(l)},[]);return H(()=>{s();let u=Te(),l=[];u?.accumulator&&l.push(u.accumulator.subscribe(s));let d=setInterval(s,2e3);return()=>{l.forEach(g=>g()),clearInterval(d)}},[s]),r}function Je(e,r){return e.length<=r?e:`${e.slice(0,r).trimEnd()}...`}function Ye(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function Re(e){if(!e||!Ye(e))return"All pages";let r=[],t=[];for(let s of e.rules)for(let u of s.conditions)u.type==="page_url"&&typeof u.url=="string"&&r.push(u.url),u.type==="anchor_visible"&&typeof u.anchorId=="string"&&t.push(u.anchorId);let i=[];return r.length>0&&i.push(r[0]),t.length>0&&i.push(t[0]),i.length>0?i.join(" \xB7 "):"All pages"}function Ae(e){let r=e.config.icon||"\u{1F9ED}",t=Je(e.config.title,30);return`${r} ${t}`}var Qe=["nav","navigation"];function V(e){return Qe.some(r=>e.kind.startsWith(`${r}:`))}function Ze(e){return typeof e=="object"&&e!==null&&e.type==="rules"&&Array.isArray(e.rules)}function ve(e){if(!e||!Ze(e))return{pagePatterns:[],anchorSelectors:[],hasTargeting:!1};let r=new Set,t=new Set;for(let s of e.rules)for(let u of s.conditions){let l=u;l.type==="page_url"&&typeof l.url=="string"?r.add(l.url):l.type==="anchor_visible"&&typeof l.anchorId=="string"&&t.add(l.anchorId)}let i=r.size>0||t.size>0;return{pagePatterns:[...r],anchorSelectors:[...t],hasTargeting:i}}function et(e){return ve(e).pagePatterns[0]||null}function tt(e){return ve(e).anchorSelectors[0]||null}function rt(e){return(e.actions||[]).filter(V).map((t,i)=>({key:String(i),index:i,summary:Ae(t),trigger:Re(t.showWhen),rationale:t.rationale,firstAnchor:tt(t.showWhen),tip:t}))}function Pe(e,r){let t=(e.actions||[]).filter(V);return{...e,actions:t.filter((i,s)=>!r.has(String(s)))}}function nt(e,r){let[t,i]=C(new Map),s=Y(e);return s.current=e,H(()=>{let u=()=>{let d=new Map,g=r();for(let y of s.current){let f=ve(y.tip.showWhen),h=!0;f.pagePatterns.length>0&&(h=f.pagePatterns.some(P=>new RegExp(`^${P.replace(/\*\*/g,".*").replace(/(?<!\.)(\*)/g,"[^/]*")}$`).test(g)));let R=!1,v=null;if(y.firstAnchor)try{v=document.querySelector(y.firstAnchor),R=v!==null}catch{}else R=h;d.set(y.key,{found:h&&R,element:v})}i(d)};u();let l=setInterval(u,2e3);return window.addEventListener("popstate",u),()=>{clearInterval(l),window.removeEventListener("popstate",u)}},[r]),t}function ot({config:e,onChange:r,editor:t}){let i=e,[s,u]=C(()=>t.getDismissedKeys?.()??new Set),[l,d]=C(null),[g,y]=C("after"),[f,h]=C(null);H(()=>{t.setDismissedKeys?.(s)},[s,t]);let R=Y(!1);H(()=>{R.current||(R.current=!0,t.initialEditKey!=null&&d(String(t.initialEditKey)),t.clearInitialState?.())},[t]);let v=rt(i),P=v.filter(a=>!s.has(a.key)),B=v.filter(a=>s.has(a.key)),W=P.length,p=X.useMemo(()=>v.map(a=>({id:a.key,showWhen:a.tip.showWhen})),[v]),m=ye(p),w=nt(v,t.getCurrentRoute),_=P.filter(a=>w.get(a.key)?.found).length,$=N(a=>{u(k=>{let b=new Set(k);return b.add(a),b}),l===a&&d(null)},[l]),z=N(a=>{u(k=>{let b=new Set(k);return b.delete(a),b})},[]),F=N(a=>{d(a.key)},[]),ne=N(a=>{let k=et(a.tip.showWhen);k&&t.navigateTo(k),a.firstAnchor&&t.highlightElement(a.firstAnchor)},[t]),Me=N(()=>{d(null),y("after"),t.previewConfig(e),t.clearHighlight()},[t,e]),$e=N(a=>{if(y(a),a==="before"){let k=Pe(i,new Set([l]));t.previewConfig(k)}else t.previewConfig(e)},[i,l,t,e]),U=N((a,k,b)=>{let L=(i.actions||[]).filter(V).slice(),S={...L[a],config:{...L[a].config}};S.config[k]=b,L[a]=S;let ze=(i.actions||[]).filter(qe=>!V(qe)),Ke={...i,actions:[...ze,...L]};r(Ke),t.setDirty(!0)},[i,r,t]),Le=N(()=>{if(s.size>0){let a=Pe(i,s);r(a)}t.publish()},[s,i,r,t]),Be=N(a=>{h(a.key),a.firstAnchor&&t.highlightElement(a.firstAnchor)},[t]),We=N(()=>{h(null),t.clearHighlight()},[t]),Fe=a=>{let b=(i.actions||[]).filter(V)[a];if(!b)return null;let L=v.find(S=>S.key===String(a));return c("div",{className:"se-py-1",children:[L&&L.trigger!=="All pages"&&c("div",{"data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1",onClick:()=>ne(L),children:[o("span",{children:"\u{1F4CD}"}),o("span",{children:L.trigger})]}),o(q,{label:"Title",value:b.config.title,onChange:S=>U(a,"title",S.target.value)}),o(q,{label:"Description",value:b.config.description,onChange:S=>U(a,"description",S.target.value)}),o(q,{label:"Link URL",value:b.config.href||"",onChange:S=>U(a,"href",S.target.value),placeholder:"Optional"}),o(q,{label:"Icon",value:b.config.icon||"",onChange:S=>U(a,"icon",S.target.value),placeholder:"e.g., \\u{1f9ed}"}),o(q,{label:"Category",value:b.config.category||"",onChange:S=>U(a,"category",S.target.value),placeholder:"Optional"}),c("label",{className:"se-flex se-items-center se-gap-2 se-text-xs se-text-slate-grey-8 se-mb-2",children:[o("input",{type:"checkbox",checked:b.config.external||!1,onChange:S=>U(a,"external",S.target.checked)}),"Open in new tab"]}),o("label",{className:"se-text-[11px] se-font-semibold se-text-slate-grey-7 se-mb-1 se-block",children:"AI Rationale"}),o("div",{className:"se-p-2 se-rounded se-border se-border-dashed se-border-white/15 se-bg-white/[0.02] se-text-slate-grey-8 se-text-xs se-mb-2",children:b.rationale?b.rationale.why:"N/A"})]})},Oe=`${W} tip${W!==1?"s":""}${W>0?` (${_} found on this page)`:""}`;return c(ae,{children:[o(ie,{title:"Navigation Tips",subtitle:Oe,onBack:()=>t.navigateHome()}),o(ce,{children:l!==null?(()=>{let a=Number(l),k=v.find(b=>b.key===l);return c(K,{children:[c("div",{className:"se-flex se-items-center se-gap-2 se-mb-3 se-text-[13px] se-font-semibold se-text-slate-grey-10",children:[o("span",{children:"\u{1F9ED}"}),o("span",{children:k?.summary})]}),o(ge,{mode:g,onToggle:$e}),Fe(a),o(me,{onClick:Me})]})})():c(K,{children:[v.length===0&&o(be,{message:"No tips configured."}),P.length>0&&c(K,{children:[o(fe,{label:"TIPS",count:P.length}),P.map(a=>{let k=w.get(a.key);return c(de,{itemKey:a.key,onMouseEnter:()=>Be(a),onMouseLeave:We,children:[a.trigger!=="All pages"&&c("div",{"data-trigger":!0,className:"se-flex se-items-center se-gap-1 se-text-[11px] se-text-slate-grey-8 se-cursor-pointer se-mb-1",onClick:b=>{b.stopPropagation(),ne(a)},children:[o("span",{children:"\u{1F4CD}"}),o("span",{children:a.trigger})]}),c("div",{"data-card-body":!0,className:"se-flex se-items-center se-gap-2 se-cursor-pointer",onClick:()=>F(a),children:[o(ue,{found:k?.found??!1}),o("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap",children:a.summary}),o("button",{className:"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-slate-grey-7 se-text-sm se-cursor-pointer se-shrink-0 se-leading-none",onClick:b=>{b.stopPropagation(),$(a.key)},title:"Dismiss this tip",children:"\xD7"})]}),c("div",{className:"se-text-[10px] se-text-slate-grey-7 se-mt-1",children:["WHY: ",a.rationale?a.rationale.why:"N/A"]}),o(he,{status:m.get(a.key)??null})]},a.key)})]}),B.length>0&&o(pe,{count:B.length,children:B.map(a=>c("div",{className:"se-flex se-items-center se-gap-2 se-py-1.5 se-px-2.5 se-rounded-md se-border se-border-white/[0.03] se-bg-transparent se-mb-0.5 se-cursor-pointer se-text-xs se-text-slate-grey-6 se-opacity-60",children:[o("span",{className:"se-flex-1 se-overflow-hidden se-text-ellipsis se-whitespace-nowrap se-line-through",children:a.summary}),o("button",{className:"se-py-0.5 se-px-1.5 se-rounded se-border-none se-bg-transparent se-text-blue-5 se-text-[11px] se-cursor-pointer se-shrink-0 se-leading-none",onClick:k=>{k.stopPropagation(),z(a.key)},children:"Restore"})]},a.key))})]})}),o(le,{onSave:()=>t.save(),onPublish:Le})]})}var Ie={title:"Navigation Tips",icon:"\u{1F9ED}",description:"Navigation tips accordion with per-item visibility"};var De=ot;var j={white:"#ffffff",black:"#000000"},A={0:"#2c0b0a",1:"#5b1715",2:"#89221f",3:"#b72e2a",4:"#d44844",5:"#dd6d69",6:"#e5918f",7:"#eeb6b4",8:"#f6dada",9:"#faebea"},n={0:"#07080a",1:"#0f1318",2:"#0e1114",3:"#1c222a",4:"#2b333f",5:"#394454",6:"#475569",7:"#677384",8:"#87919f",9:"#a8afba",10:"#cbd0d7",11:"#e8eaee",12:"#f6f7f9"},x={0:"#07230a",1:"#0e4514",2:"#16681e",3:"#1d8a28",4:"#24ad32",5:"#4fbd5a",6:"#7acd82",7:"#a5deab",8:"#d0eed3",9:"#e5f6e7"},M={0:"#301f09",1:"#5f3e12",2:"#8f5e1b",3:"#be7d24",4:"#ee9c2d",5:"#f1b057",6:"#f5c481",7:"#f8d7ab",8:"#fcebd5",9:"#fdf5ea"},T={0:"#330707",1:"#660f0e",2:"#991616",3:"#cc1e1d",4:"#ff2524",5:"#ff5150",6:"#ff7c7c",7:"#ffa8a7",8:"#ffd3d3",9:"#ffe9e9"},Z={0:"#051533",1:"#0a2a66",2:"#0f3f98",3:"#1454cb",4:"#1969fe",5:"#4787fe",6:"#75a5fe",7:"#a3c3ff",8:"#d1e1ff",9:"#e8f0ff"},ee={0:"#662500",1:"#993d00",2:"#cc5800",3:"#ff7700",4:"#fea85d",5:"#fec58f",6:"#ffd6ae",7:"#fee6cd",8:"#fff1e1",9:"#fff8f0"},I={0:"#151229",1:"#2a2452",2:"#40357c",3:"#5547a5",4:"#6a59ce",5:"#887ad8",6:"#a69be2",7:"#c3bdeb",8:"#e1def5",9:"#f0eefa"},te={0:"#37091f",1:"#69123c",2:"#9b1c58",3:"#cd2575",4:"#ff2e92",5:"#ff58a8",6:"#ff82be",7:"#ffabd3",8:"#ffd5e9",9:"#ffeaf4"};var Mr={primary:n[10],secondary:n[9],tertiary:n[8]},$r={primary:n[2],secondary:n[0]},Lr={primary:n[4],secondary:n[3]},Br={primary:{text:j.white,icon:j.white,border:A[3],backgroundDefault:A[3],backgroundHover:A[2]},neutral:{text:n[10],textHover:j.white,icon:n[10],iconHover:j.white,border:n[4],background:n[2]},link:{text:j.white,icon:j.white,hover:A[5]},error:{text:T[5],hover:T[6]},success:{text:x[5],hover:x[6]}},Wr={slateGrey:{content:n[10],pillOutline:n[10],borderPrimary:n[5],borderSecondary:n[5],background:n[3]},brand:{content:A[9],pillOutline:A[9],borderPrimary:A[6],borderSecondary:A[6],background:A[0]},red:{content:T[8],pillOutline:T[4],borderPrimary:T[2],borderSecondary:T[2],background:T[0]},yellow:{content:M[8],pillOutline:M[4],borderPrimary:M[2],borderSecondary:M[2],background:M[0]},green:{content:x[8],pillOutline:x[4],borderPrimary:x[2],borderSecondary:x[2],background:x[0]},purple:{content:I[8],pillOutline:I[4],borderPrimary:I[2],borderSecondary:I[2],background:I[0]},blue:{content:Z[8],pillOutline:Z[4],borderPrimary:Z[2],borderSecondary:Z[2],background:Z[0]},orange:{content:ee[8],pillOutline:ee[4],borderPrimary:ee[2],borderSecondary:ee[2],background:ee[0]},pink:{content:te[8],pillOutline:te[4],borderPrimary:te[2],borderSecondary:te[2],background:te[0]}},Fr={green:{content:x[8],border:x[2],background:x[0]},yellow:{content:M[8],border:M[2],background:M[0]},red:{content:T[8],border:T[2],background:T[0]}},Or={green:{content:x[1],background:x[9]},yellow:{content:M[1],background:M[9]},red:{content:T[1],background:T[9]}},zr={content:n[10],border:n[4],background:"#1c2124"},Kr={backgroundDefault:n[2],backgroundHover:n[1],selected:n[3]},qr={background:n[2],icon:n[10],borderDefault:n[4],borderSelected:A[3],textLabel:n[9],textPlaceholder:n[8],textHint:n[8]},Gr={backgroundDefault:n[2],backgroundDisabled:n[0],textLabel:n[9],textPlaceholder:n[8],textHint:n[8],textError:T[5],iconDefault:n[9],iconPlaceholder:n[10],iconError:T[5],borderDefault:n[4],borderSelected:A[3],borderError:T[5]},Ur={handleDefault:j.white,handleDisabled:n[10],off:{backgroundDefault:n[4],backgroundHover:n[5],backgroundDisabled:n[4]},on:{backgroundDefault:x[3],backgroundHover:x[2],backgroundDisabled:n[4]}},Vr={off:{backgroundDefault:"#00000000",backgroundHover:n[5],backgroundDisabled:n[2],border:n[6]},on:{backgroundDefault:x[0],backgroundHover:x[1],backgroundDisabled:n[2],border:x[3]}},Xr={content:n[10],background:n[4]},Jr={background:n[4],active:x[3]},Yr={background:n[1],content:n[9],border:n[4]},Qr={backgroundDefault:n[1],backgroundHover:n[3],backgroundActive:n[4],border:n[4],contentPrimary:n[10],contentSecondary:n[9],contentTertiary:n[8]},Zr={background:n[1],content:n[9],border:n[4]},en={activeBackground:n[3],activeContent:A[5],inactiveContent:n[9],border:n[4]},tn={header:{textDefault:n[9],textHover:n[8],backgroundDefault:n[1]},border:n[4],cell:{textPrimary:n[10],textSecondary:n[9],backgroundDefault:n[2],backgroundHover:n[1]}},rn={textPrimaryDefault:n[10],textPrimaryHover:n[10],textSecondaryDefault:n[8],textSecondaryHover:n[9],iconPrimary:n[10],iconSecondary:n[8]},nn={background:x[1],active:x[5]},on={textDefault:n[10],textSelected:j.white,textDisabled:n[7],backgroundDefault:n[2],backgroundMiddle:n[3],backgroundSelected:A[3],border:n[4]},sn=n[9];function _e(){return typeof SynOS<"u"&&SynOS.ReactDOM||{}}var pn=new Proxy({},{get:function(e,r){return _e()[r]}});function ke(){return _e().createRoot.apply(null,arguments)}function oe(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}var D={container:{fontFamily:"system-ui, -apple-system, sans-serif",padding:"8px",maxWidth:"100%",overflow:"hidden"},accordion:{display:"flex",flexDirection:"column",gap:"4px"},item:{borderRadius:"8px",overflow:"hidden",transition:"box-shadow 0.2s ease"},header:{display:"flex",alignItems:"center",gap:"8px",width:"100%",padding:"12px 16px",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:500,fontFamily:"inherit",textAlign:"left",transition:"background-color 0.15s ease"},chevron:{fontSize:"10px",transition:"transform 0.2s ease",marginLeft:"auto",flexShrink:0},icon:{fontSize:"16px",flexShrink:0},body:{overflow:"hidden",transition:"max-height 0.25s ease, padding-bottom 0.25s ease",padding:"0 16px"},description:{fontSize:"13px",lineHeight:"1.5",margin:0},linkButton:{display:"inline-flex",alignItems:"center",gap:"4px",marginTop:"10px",padding:"6px 12px",borderRadius:"6px",textDecoration:"none",fontSize:"13px",fontWeight:500,cursor:"pointer",border:"none",transition:"background-color 0.15s ease"},categoryHeader:{fontSize:"11px",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.05em",padding:"12px 4px 4px"},emptyState:{fontSize:"13px",padding:"16px",textAlign:"center"}},se={light:{container:{backgroundColor:j.white,color:n[1]},item:{backgroundColor:n[12],border:`1px solid ${n[11]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.08)"},header:{backgroundColor:"transparent",color:n[1]},headerHover:{backgroundColor:n[12]},body:{color:n[6]},linkButton:{backgroundColor:I[8],color:I[2]},categoryHeader:{color:n[7]},emptyState:{color:n[8]}},dark:{container:{backgroundColor:n[1],color:n[12]},item:{backgroundColor:n[3],border:`1px solid ${n[5]}`},itemExpanded:{boxShadow:"0 4px 12px rgba(0, 0, 0, 0.3)"},header:{backgroundColor:"transparent",color:n[12]},headerHover:{backgroundColor:n[5]},body:{color:n[8]},linkButton:{backgroundColor:I[0],color:I[6]},categoryHeader:{color:n[8]},emptyState:{color:n[7]}}};function st({item:e,isExpanded:r,onToggle:t,onNavigate:i,theme:s}){let[u,l]=C(!1),d=se[s],{title:g,description:y,href:f,icon:h,external:R}=e.config,v={...D.item,...d.item,...r?d.itemExpanded:{}},P={...D.header,...d.header,...u?d.headerHover:{}},B={...D.chevron,transform:r?"rotate(180deg)":"rotate(0deg)"},W={...D.body,...d.body,maxHeight:r?"500px":"0",paddingBottom:r?"16px":"0"},p=m=>{m.preventDefault(),m.stopPropagation(),f&&i(f,R??!1)};return c("div",{style:v,"data-nav-tip-id":e.config.id,children:[c("button",{style:P,onClick:t,onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),"aria-expanded":r,children:[h&&o("span",{style:D.icon,children:h}),o("span",{children:g}),o("span",{style:B,children:"\u25BC"})]}),c("div",{style:W,"aria-hidden":!r,children:[o("p",{style:D.description,children:y}),f&&c("a",{href:f,onClick:p,style:{...D.linkButton,...d.linkButton},target:R?"_blank":void 0,rel:R?"noopener noreferrer":void 0,children:["Go ",R?"\u2197":"\u2192"]})]})]})}function at({config:e,runtime:r,instanceId:t}){let[i,s]=Ne(p=>p+1,0),[u,l]=C(new Set);H(()=>r.context.subscribe(()=>{s()}),[r.context]),H(()=>{if(r.accumulator?.subscribe)return r.accumulator.subscribe(()=>{s()})},[r.accumulator]),H(()=>{if(!e.scope||!r.accumulator?.register)return;let{events:p,urlContains:m,props:w}=e.scope,_=new Set;for(let $ of e.actions)if($.showWhen?.type==="rules")for(let z of $.showWhen.rules)for(let F of z.conditions)F.type==="event_count"&&F.key&&_.add(F.key);for(let $ of _)r.accumulator.register($,z=>{if(!p.includes(z.name)||m&&!String(z.props?.pathname??"").includes(m))return!1;if(w){for(let[F,ne]of Object.entries(w))if(z.props?.[F]!==ne)return!1}return!0})},[e.scope,e.actions,r.accumulator]);let d=J(()=>e.actions.filter(p=>{if(!p.showWhen)return!0;try{return r.evaluateSync(p.showWhen).value}catch{return!1}}),[e.actions,r,i]),g=J(()=>{let p=new Map;for(let m of d){let w=m.config.category;p.has(w)||p.set(w,[]),p.get(w).push(m)}return p},[d]),y=J(()=>d.some(p=>p.config.category),[d]),f=J(()=>e.theme!=="auto"?e.theme:typeof window<"u"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light",[e.theme]),h=N(p=>{l(m=>{let w=m.has(p),_;if(e.expandBehavior==="single"){for(let $ of m)$!==p&&r.events.publish("nav:toggled",{instanceId:t,tipId:$,expanded:!1,timestamp:Date.now()});_=w?new Set:new Set([p])}else _=new Set(m),w?_.delete(p):_.add(p);return r.events.publish("nav:toggled",{instanceId:t,tipId:p,expanded:!w,timestamp:Date.now()}),_})},[e.expandBehavior,r.events,t]),R=N((p,m)=>{let w=p.trim().toLowerCase();w.startsWith("javascript:")||w.startsWith("data:")||(r.events.publish("nav:tip_clicked",{instanceId:t,href:p,external:m,timestamp:Date.now()}),m?window.open(p,"_blank","noopener,noreferrer"):window.location.href=p)},[r.events,t]),v={...D.container,...se[f].container},P={...D.categoryHeader,...se[f].categoryHeader},B={...D.emptyState,...se[f].emptyState},W=p=>p.map(m=>o(st,{item:m,isExpanded:u.has(m.config.id),onToggle:()=>h(m.config.id),onNavigate:R,theme:f},m.config.id));return d.length===0?o("div",{style:v,"data-adaptive-id":t,"data-adaptive-type":"adaptive-nav",children:o("div",{style:B,children:"No navigation tips available."})}):o("div",{style:v,"data-adaptive-id":t,"data-adaptive-type":"adaptive-nav",children:o("div",{style:D.accordion,children:y?Array.from(g.entries()).map(([p,m])=>c(X.Fragment,{children:[p&&o("div",{style:P,"data-category-header":p,children:p}),W(m)]},p??"__ungrouped")):W(d)})})}var He={mount(e,r){let{runtime:t,instanceId:i="nav-widget",...s}=r||{expandBehavior:"single",theme:"auto",actions:[]};if(t&&typeof ke=="function"){let l=ke(e);return l.render(X.createElement(at,{config:s,runtime:t,instanceId:i})),()=>{l.unmount()}}let u=s.actions||[];return e.innerHTML=`
|
|
2
|
-
<div style="font-family: system-ui; max-width: 100%;">
|
|
3
|
-
${u.map(l=>`
|
|
4
|
-
<div style="margin-bottom: 4px; padding: 12px 16px; background: ${n[12]}; border-radius: 8px;">
|
|
5
|
-
${l.config.icon?`<span>${oe(l.config.icon)}</span> `:""}<strong>${oe(l.config.title)}</strong>
|
|
6
|
-
<p style="margin-top: 8px; color: ${n[6]}; font-size: 13px;">${oe(l.config.description)}</p>
|
|
7
|
-
${l.config.href?`<a href="${oe(l.config.href)}" style="color: ${I[2]}; font-size: 13px;">Go →</a>`:""}
|
|
8
|
-
</div>
|
|
9
|
-
`).join("")}
|
|
10
|
-
</div>
|
|
11
|
-
`,()=>{e.innerHTML=""}}};var it=async(e,r)=>{let t=r.resolveAnchor(e.anchorId);if(!t)throw new Error(`Anchor not found: ${e.anchorId}`);return t.scrollIntoView({behavior:e.behavior??"smooth",block:e.block??"center",inline:e.inline??"nearest"}),r.publishEvent("action.applied",{id:r.generateId(),kind:"navigation:scrollTo",anchorId:e.anchorId,behavior:e.behavior??"smooth"}),{cleanup:()=>{}}},ct=async(e,r)=>{let t=e.url.trim();if(t.toLowerCase().startsWith("javascript:"))throw new Error("javascript: URLs are not allowed");let i=e.target??"_self";return r.publishEvent("action.applied",{id:r.generateId(),kind:"navigation:navigate",url:e.url,target:i}),i==="_blank"?window.open(t,"_blank","noopener,noreferrer"):window.location.href=t,{cleanup:()=>{}}},we=[{kind:"navigation:scrollTo",executor:it},{kind:"navigation:navigate",executor:ct}],re={id:"adaptive-nav",version:"2.0.0",name:"Navigation Tips",description:"Navigation actions and accordion-based tips with per-item conditional visibility",executors:we,widgets:[{id:"adaptive-nav:tips",component:He,metadata:{name:"Navigation Tips",description:"Accordion of contextual navigation tips with per-item visibility",icon:"\u{1F9ED}"}}]};var je={id:"adaptive-nav",version:re.version,name:re.name,description:re.description,runtime:{actions:we.map(({kind:e,executor:r})=>({kind:e,executor:r})),widgets:re.widgets,notifyWatchers(e){return(e.actions??[]).filter(t=>t.notify&&t.showWhen).map(t=>({id:`nav:${t.config.id}`,strategy:t.showWhen,eventName:"nav:tip_revealed",eventProps:{tipId:t.config.id,title:t.notify.title,body:t.notify.body,icon:t.notify.icon}}))}},editor:{component:De,panel:Ie,getActionLabel(e){return(e.config||{}).title||e.kind||"nav:tip"}},metadata:{isBuiltIn:!1}};if(typeof window<"u"){let e=window.SynOS?.appRegistry;e&&typeof e.register=="function"&&e.register(je)}var Sn=je;export{Sn as default,je as manifest};
|
|
12
|
-
//# sourceMappingURL=index.js.map
|