@mgamadeus/ddd-agents 0.0.0-stage → 0.1.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -2
  3. package/dist/chat.js +5263 -0
  4. package/dist/chat.js.map +1 -0
  5. package/dist/chunks/AgentsConversationClientContext-C4T7g_Qk.js +22 -0
  6. package/dist/chunks/AgentsConversationClientContext-C4T7g_Qk.js.map +1 -0
  7. package/dist/chunks/ConversationMarkdown-W7NHglmL.js +399 -0
  8. package/dist/chunks/ConversationMarkdown-W7NHglmL.js.map +1 -0
  9. package/dist/chunks/WebSearchResultsConversationWidget-BvnLWHyi.js +5059 -0
  10. package/dist/chunks/WebSearchResultsConversationWidget-BvnLWHyi.js.map +1 -0
  11. package/dist/chunks/canvas-behaviours-BRFR1ALE.js +45 -0
  12. package/dist/chunks/canvas-behaviours-BRFR1ALE.js.map +1 -0
  13. package/dist/chunks/canvas-feature-flags-BmmxC3bz.js +11 -0
  14. package/dist/chunks/canvas-feature-flags-BmmxC3bz.js.map +1 -0
  15. package/dist/chunks/canvasBodies-9SuF6NAB.js +289 -0
  16. package/dist/chunks/canvasBodies-9SuF6NAB.js.map +1 -0
  17. package/dist/chunks/d3-7.6.1.min.js-DTmPafrl.js +6 -0
  18. package/dist/chunks/d3-7.6.1.min.js-DTmPafrl.js.map +1 -0
  19. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js +20 -0
  20. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js.map +1 -0
  21. package/dist/chunks/widget-image-readiness-signal-DeOuL89j.js +25 -0
  22. package/dist/chunks/widget-image-readiness-signal-DeOuL89j.js.map +1 -0
  23. package/dist/chunks/widget-name-resolver-DyIY6Zu4.js +9736 -0
  24. package/dist/chunks/widget-name-resolver-DyIY6Zu4.js.map +1 -0
  25. package/dist/chunks/withPollingChangeSubscription-BLDAWF-o.js +251 -0
  26. package/dist/chunks/withPollingChangeSubscription-BLDAWF-o.js.map +1 -0
  27. package/dist/client-testing.js +346 -0
  28. package/dist/client-testing.js.map +1 -0
  29. package/dist/client.js +16 -0
  30. package/dist/client.js.map +1 -0
  31. package/dist/contract.js +31 -0
  32. package/dist/contract.js.map +1 -0
  33. package/dist/image-render.js +334 -0
  34. package/dist/image-render.js.map +1 -0
  35. package/dist/index.js +80 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/kit.js +13 -0
  38. package/dist/kit.js.map +1 -0
  39. package/dist/preview.js +733 -0
  40. package/dist/preview.js.map +1 -0
  41. package/dist/renderer.js +115 -0
  42. package/dist/renderer.js.map +1 -0
  43. package/dist/styles.css +6768 -0
  44. package/dist/types/chat/AgentChat/AgentChat.d.ts +37 -0
  45. package/dist/types/chat/AgentChatActivityHistory/AgentChatActivityHistory.d.ts +6 -0
  46. package/dist/types/chat/AgentChatActivityIndicator/AgentChatActivityIndicator.d.ts +8 -0
  47. package/dist/types/chat/CanvasPane/CanvasPane.d.ts +15 -0
  48. package/dist/types/chat/CanvasResizeHandle/CanvasResizeHandle.d.ts +10 -0
  49. package/dist/types/chat/CanvasResizeHandle/use-canvas-resize.d.ts +43 -0
  50. package/dist/types/chat/ConversationClosedBar/ConversationClosedBar.d.ts +10 -0
  51. package/dist/types/chat/ConversationErrorCard/ConversationErrorCard.d.ts +13 -0
  52. package/dist/types/chat/ConversationIntroCard/ConversationIntroCard.d.ts +10 -0
  53. package/dist/types/chat/ConversationLoadingStates.d.ts +2 -0
  54. package/dist/types/chat/ConversationMessage/ConversationCallMarkerChip/ConversationCallMarkerChip.d.ts +14 -0
  55. package/dist/types/chat/ConversationMessage/ConversationCallMarkerChip/VoiceBarsIcon/VoiceBarsIcon.d.ts +8 -0
  56. package/dist/types/chat/ConversationMessage/ConversationMessageSystem/ConversationMessageSystem.d.ts +8 -0
  57. package/dist/types/chat/ConversationMessage/ConversationMessageSystem/ConversationMessageSystemHeader/ConversationMessageSystemHeader.d.ts +9 -0
  58. package/dist/types/chat/ConversationMessage/ConversationMessageUser/ConversationMessageUser.d.ts +7 -0
  59. package/dist/types/chat/ConversationMessage/ConversationMessageUser/ConversationMessageUserWidgets.d.ts +14 -0
  60. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/ConversationMessageHeader/ConversationMessageHeader.d.ts +7 -0
  61. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/ConversationMessageThinking/ConversationMessageThinking.d.ts +7 -0
  62. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/ConversationMessageWidgets.d.ts +29 -0
  63. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/copyRichToClipboard.d.ts +1 -0
  64. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/hooks/useFreshMessageBlockReveal.d.ts +14 -0
  65. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/hooks/useStreamingText.d.ts +8 -0
  66. package/dist/types/chat/ConversationMessage/ConversationMessageWidgets/hooks/useTypewriter.d.ts +12 -0
  67. package/dist/types/chat/ConversationMessage/ConversationTaskInstructionDisclosure/ConversationTaskInstructionDisclosure.d.ts +12 -0
  68. package/dist/types/chat/ConversationMessageInput/ConversationMessageInput.d.ts +111 -0
  69. package/dist/types/chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentPreviewCard.d.ts +34 -0
  70. package/dist/types/chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentsErrorBox.d.ts +22 -0
  71. package/dist/types/chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentsPreviewStrip.d.ts +12 -0
  72. package/dist/types/chat/ConversationMessageInput/ConversationMessageInputAttachments/convert-bytes-to-size-string.d.ts +2 -0
  73. package/dist/types/chat/ConversationMessageInput/ConversationMessageInputComposerWidgets/ConversationMessageInputComposerWidgets.d.ts +12 -0
  74. package/dist/types/chat/ConversationMessageList/ConversationMessageList.d.ts +75 -0
  75. package/dist/types/chat/ConversationScrollToLatestMessageButton/ConversationScrollToLatestMessageButton.d.ts +6 -0
  76. package/dist/types/chat/ConversationSuggestionCard/ConversationSuggestionCard.d.ts +7 -0
  77. package/dist/types/chat/ConversationView.d.ts +216 -0
  78. package/dist/types/chat/ConversationViewBody/ConversationViewBody.d.ts +214 -0
  79. package/dist/types/chat/ConversationViewBody/hooks/useIsMessagesBottomOutOfView.d.ts +2 -0
  80. package/dist/types/chat/ConversationViewBody/hooks/usePinQuestionOnSend.d.ts +24 -0
  81. package/dist/types/chat/assistant-message-has-renderable-markdown.d.ts +13 -0
  82. package/dist/types/chat/chat-assistant-identity.d.ts +24 -0
  83. package/dist/types/chat/chat-message.d.ts +11 -0
  84. package/dist/types/chat/controller/AgentChatController.d.ts +97 -0
  85. package/dist/types/chat/controller/activity-ticker.d.ts +120 -0
  86. package/dist/types/chat/controller/changed-messages-request.d.ts +12 -0
  87. package/dist/types/chat/controller/chat-scroll-target.d.ts +10 -0
  88. package/dist/types/chat/controller/conversation-change-signal-rules.d.ts +64 -0
  89. package/dist/types/chat/controller/derive-agent-activity.d.ts +31 -0
  90. package/dist/types/chat/controller/merge-activity-elements.d.ts +25 -0
  91. package/dist/types/chat/controller/pending-start-request.d.ts +38 -0
  92. package/dist/types/chat/controller/use-activity-ticker.d.ts +60 -0
  93. package/dist/types/chat/controller/use-conversation-activity.d.ts +38 -0
  94. package/dist/types/chat/controller/use-conversation-live-updates.d.ts +30 -0
  95. package/dist/types/chat/controller/use-conversation-message-pages.d.ts +24 -0
  96. package/dist/types/chat/controller/use-conversation-scroll-jump.d.ts +47 -0
  97. package/dist/types/chat/controller/use-conversation-search.d.ts +31 -0
  98. package/dist/types/chat/controller/use-conversation-signals.d.ts +44 -0
  99. package/dist/types/chat/controller/use-debounced-semantic-search.d.ts +15 -0
  100. package/dist/types/chat/conversation-send-message.d.ts +43 -0
  101. package/dist/types/chat/last-wire-message-is-unanswered-user-message.d.ts +22 -0
  102. package/dist/types/chat/normalize-server-message-to-markdown.d.ts +23 -0
  103. package/dist/types/chat/store/agents-chat-state.d.ts +132 -0
  104. package/dist/types/chat/store/conversation-error-type.d.ts +32 -0
  105. package/dist/types/chat/store/create-agents-chat-store.d.ts +23 -0
  106. package/dist/types/chat/store/index.d.ts +5 -0
  107. package/dist/types/chat/store/merge-chat-messages.d.ts +20 -0
  108. package/dist/types/chat/store/reduce-agents-chat-state.d.ts +7 -0
  109. package/dist/types/chat/store/use-agents-chat-store.d.ts +22 -0
  110. package/dist/types/chat/strip-pre-call-message-marker.d.ts +12 -0
  111. package/dist/types/chat/use-canvas-shell-transitions.d.ts +25 -0
  112. package/dist/types/client/AgentsConversationClient.d.ts +93 -0
  113. package/dist/types/client/AgentsConversationClientContext.d.ts +17 -0
  114. package/dist/types/client/polling/createPollingConversationChangeSubscription.d.ts +62 -0
  115. package/dist/types/client/polling/withPollingChangeSubscription.d.ts +11 -0
  116. package/dist/types/client/testing/createInMemoryAgentsConversationClient.d.ts +139 -0
  117. package/dist/types/contract/conversation.d.ts +370 -0
  118. package/dist/types/entries/chat.d.ts +21 -0
  119. package/dist/types/entries/client-testing.d.ts +1 -0
  120. package/dist/types/entries/client.d.ts +4 -0
  121. package/dist/types/entries/contract.d.ts +1 -0
  122. package/dist/types/entries/image-render.d.ts +9 -0
  123. package/dist/types/entries/index.d.ts +9 -0
  124. package/dist/types/entries/kit.d.ts +4 -0
  125. package/dist/types/entries/preview.d.ts +8 -0
  126. package/dist/types/entries/renderer.d.ts +15 -0
  127. package/dist/types/entries/widgets.d.ts +16 -0
  128. package/dist/types/image-render/ComposedViewEmailDataTimes/ComposedViewEmailDataTimes.d.ts +15 -0
  129. package/dist/types/image-render/WidgetImageRender.d.ts +55 -0
  130. package/dist/types/image-render/WidgetImageRenderContext.d.ts +14 -0
  131. package/dist/types/image-render/composed-view-data-times.d.ts +20 -0
  132. package/dist/types/image-render/frozen-widget-requests.d.ts +2 -0
  133. package/dist/types/image-render/live-widget-requests.d.ts +4 -0
  134. package/dist/types/image-render/widget-image-google-map.d.ts +7 -0
  135. package/dist/types/image-render/widget-image-readiness-signal.d.ts +16 -0
  136. package/dist/types/image-render/widget-image-readiness.d.ts +9 -0
  137. package/dist/types/image-render/widget-image-render.types.d.ts +47 -0
  138. package/dist/types/kit/ComposedViewConversationWidget.d.ts +14 -0
  139. package/dist/types/kit/ComposedViewDataSourceLoader.d.ts +20 -0
  140. package/dist/types/kit/ComposedViewRenderer.d.ts +30 -0
  141. package/dist/types/kit/ComposedViewSlotErrorBoundary.d.ts +23 -0
  142. package/dist/types/kit/ModelText/ModelText.d.ts +12 -0
  143. package/dist/types/kit/components/embedding/EmbeddedConversationWidget.d.ts +26 -0
  144. package/dist/types/kit/components/map/map-full-screen-instance.d.ts +26 -0
  145. package/dist/types/kit/components/map/map-presentation-context.d.ts +8 -0
  146. package/dist/types/kit/components/text/shared/text-node-values.d.ts +39 -0
  147. package/dist/types/kit/composed-view-component-types.d.ts +61 -0
  148. package/dist/types/kit/composed-view-components.d.ts +7 -0
  149. package/dist/types/kit/composed-view-tones.d.ts +20 -0
  150. package/dist/types/kit/entity-detail/EntityDetailCanvasBody.d.ts +9 -0
  151. package/dist/types/kit/entity-detail/entity-detail-bodies.d.ts +32 -0
  152. package/dist/types/kit/entity-detail/entity-detail-name.d.ts +9 -0
  153. package/dist/types/kit/hooks/use-debounced-value.d.ts +2 -0
  154. package/dist/types/kit/map-full-screen/MapFullScreenCanvasBody.d.ts +11 -0
  155. package/dist/types/preview/WidgetPreviewHost.d.ts +20 -0
  156. package/dist/types/preview/preview-stub-components.d.ts +3 -0
  157. package/dist/types/preview/widget-preview-fixtures.d.ts +17 -0
  158. package/dist/types/preview/widget-preview-hydration.d.ts +10 -0
  159. package/dist/types/preview/widget-preview-readiness.d.ts +27 -0
  160. package/dist/types/preview/widget-preview-requests.d.ts +16 -0
  161. package/dist/types/preview/widget-preview-signal.d.ts +10 -0
  162. package/dist/types/preview/widget-preview.types.d.ts +134 -0
  163. package/dist/types/provider/AgentsProvider.d.ts +33 -0
  164. package/dist/types/provider/class-names.d.ts +7 -0
  165. package/dist/types/provider/components/default-components.d.ts +3 -0
  166. package/dist/types/provider/components/icon-names.d.ts +9 -0
  167. package/dist/types/provider/components/index.d.ts +39 -0
  168. package/dist/types/provider/components/types.d.ts +463 -0
  169. package/dist/types/provider/environment.d.ts +262 -0
  170. package/dist/types/provider/index.d.ts +4 -0
  171. package/dist/types/renderer/ConversationDeepLinkedWidget.d.ts +18 -0
  172. package/dist/types/renderer/ConversationMarkdown.d.ts +21 -0
  173. package/dist/types/renderer/ConversationWidgetActions/ConversationWidgetActions.d.ts +7 -0
  174. package/dist/types/renderer/ConversationWidgetCallbacksContext.d.ts +234 -0
  175. package/dist/types/renderer/ConversationWidgetContext.d.ts +32 -0
  176. package/dist/types/renderer/ConversationWidgetErrorBoundary.d.ts +25 -0
  177. package/dist/types/renderer/ConversationWidgetHost.d.ts +36 -0
  178. package/dist/types/renderer/ConversationWidgetRenderContext.d.ts +3 -0
  179. package/dist/types/renderer/MarkdownLink.d.ts +6 -0
  180. package/dist/types/renderer/WindowedWidget/WindowedWidget.d.ts +16 -0
  181. package/dist/types/renderer/_access/ConversationWidgetFeatureGate.d.ts +21 -0
  182. package/dist/types/renderer/_agent-space/ConversationWidgetAgentSpaceFrame.d.ts +12 -0
  183. package/dist/types/renderer/_agent-space/ConversationWidgetAgentSpaceHeader.d.ts +15 -0
  184. package/dist/types/renderer/_agent-space/agent-space-name.hydrator.d.ts +7 -0
  185. package/dist/types/renderer/_agent-space/declared-agent-space-key-field-name.d.ts +8 -0
  186. package/dist/types/renderer/_agent-space/use-resolved-conversation-widget-agent-space-key.d.ts +16 -0
  187. package/dist/types/renderer/_agent-space/widget-agent-space-key-attribute.d.ts +13 -0
  188. package/dist/types/renderer/balanced-json-object.d.ts +12 -0
  189. package/dist/types/renderer/canvas/CanvasRestoreOnMount.d.ts +19 -0
  190. package/dist/types/renderer/canvas/canvas-behaviours.d.ts +84 -0
  191. package/dist/types/renderer/canvas/canvas-body-props.d.ts +18 -0
  192. package/dist/types/renderer/canvas/canvas-feature-flags.d.ts +11 -0
  193. package/dist/types/renderer/canvas/canvas-reducers.d.ts +46 -0
  194. package/dist/types/renderer/canvas/canvas-state.d.ts +107 -0
  195. package/dist/types/renderer/canvas/canvasBodies.d.ts +19 -0
  196. package/dist/types/renderer/canvas/canvasStorage.d.ts +25 -0
  197. package/dist/types/renderer/canvas/decide-canvas-open.d.ts +32 -0
  198. package/dist/types/renderer/canvas/entity-detail-instance.d.ts +27 -0
  199. package/dist/types/renderer/canvas/find-widget-fences-in-markdown.d.ts +32 -0
  200. package/dist/types/renderer/canvas/use-anchor-widget-payload.d.ts +8 -0
  201. package/dist/types/renderer/composer-widget-fence.d.ts +30 -0
  202. package/dist/types/renderer/conversation-composer-widget.d.ts +13 -0
  203. package/dist/types/renderer/conversation-widget-props.d.ts +54 -0
  204. package/dist/types/renderer/conversation-widget-state-partition.d.ts +31 -0
  205. package/dist/types/renderer/conversationWidgetAstPlugin.d.ts +11 -0
  206. package/dist/types/renderer/conversationWidgetRegistry.d.ts +74 -0
  207. package/dist/types/renderer/detect-unrendered-widgets.d.ts +42 -0
  208. package/dist/types/renderer/markdown-contains-widget.d.ts +13 -0
  209. package/dist/types/renderer/reference-naked-widget-json.d.ts +1 -0
  210. package/dist/types/renderer/remarkWidgetFencePlugin.d.ts +22 -0
  211. package/dist/types/renderer/render-report/widget-render-report-collector.d.ts +57 -0
  212. package/dist/types/renderer/render-report/widget-render-report.d.ts +29 -0
  213. package/dist/types/renderer/repair-malformed-widget-fences.d.ts +11 -0
  214. package/dist/types/renderer/resolve-deep-linkable-widget.d.ts +25 -0
  215. package/dist/types/renderer/restoreTextDirectivesPlugin.d.ts +12 -0
  216. package/dist/types/renderer/widget-click-signal-sources.d.ts +15 -0
  217. package/dist/types/renderer/widget-fence-json.d.ts +16 -0
  218. package/dist/types/renderer/widget-fence-syntax.d.ts +25 -0
  219. package/dist/types/renderer/widget-hydration/index.d.ts +8 -0
  220. package/dist/types/renderer/widget-hydration/section-hydration.d.ts +41 -0
  221. package/dist/types/renderer/widget-hydration/use-widget-hydration.d.ts +27 -0
  222. package/dist/types/renderer/widget-hydration/widget-hydration-state-store.d.ts +27 -0
  223. package/dist/types/renderer/widget-hydration/widget-hydration.reducer.d.ts +39 -0
  224. package/dist/types/renderer/widget-hydration/widget-hydration.registry.d.ts +7 -0
  225. package/dist/types/renderer/widget-hydration/widget-hydration.slice.d.ts +8 -0
  226. package/dist/types/renderer/widget-hydration/widget-hydration.types.d.ts +27 -0
  227. package/dist/types/renderer/widget-name-resolver.d.ts +22 -0
  228. package/dist/types/renderer/widget-tree/bounded-json.d.ts +23 -0
  229. package/dist/types/renderer/widget-tree/composed-node-schema.d.ts +143 -0
  230. package/dist/types/renderer/widget-tree/composed-view-data-sources.d.ts +41 -0
  231. package/dist/types/renderer/widget-tree/composed-view-tree.d.ts +111 -0
  232. package/dist/types/renderer/widget-tree/expression/evaluate-expression.d.ts +65 -0
  233. package/dist/types/renderer/widget-tree/expression/parse-expression.d.ts +71 -0
  234. package/dist/types/renderer/widget-tree/resolve-composed-view-values.d.ts +49 -0
  235. package/dist/types/renderer/widget-tree/use-composed-view-state.d.ts +16 -0
  236. package/dist/types/renderer/widget-windowing.d.ts +25 -0
  237. package/dist/types/widgets/CanvasWidgetCard/CanvasWidgetCard.d.ts +79 -0
  238. package/dist/types/widgets/CanvasWidgetCard/CanvasWidgetSwitch.d.ts +61 -0
  239. package/dist/types/widgets/CanvasWidgetCard/canvas-for-message-widget.d.ts +8 -0
  240. package/dist/types/widgets/CanvasWidgetCard/use-canvas-viable.d.ts +15 -0
  241. package/dist/types/widgets/ClockConversationWidget/ClockConversationWidget.d.ts +11 -0
  242. package/dist/types/widgets/ClockConversationWidget/ClockWidget/AnalogClockFace.d.ts +12 -0
  243. package/dist/types/widgets/ClockConversationWidget/ClockWidget/ClockRow.d.ts +23 -0
  244. package/dist/types/widgets/ClockConversationWidget/ClockWidget/ClockWidget.d.ts +21 -0
  245. package/dist/types/widgets/ClockConversationWidget/ClockWidget/DayNightGlyph.d.ts +8 -0
  246. package/dist/types/widgets/ClockConversationWidget/shared/clock-time.d.ts +52 -0
  247. package/dist/types/widgets/ClockConversationWidget/shared/clock-widget-payload.d.ts +23 -0
  248. package/dist/types/widgets/ClockConversationWidget/shared/use-clock-settings.d.ts +18 -0
  249. package/dist/types/widgets/ConceptExplainerConversationWidget/ConceptExplainerConversationWidget.d.ts +14 -0
  250. package/dist/types/widgets/ConceptExplainerConversationWidget/ConceptExplainerWidget/ConceptExplainerWidget.d.ts +27 -0
  251. package/dist/types/widgets/ConceptExplainerConversationWidget/shared/ConceptExplainerTextView.d.ts +11 -0
  252. package/dist/types/widgets/ConceptExplainerConversationWidget/shared/concept-explainer-type.d.ts +89 -0
  253. package/dist/types/widgets/ConceptExplainerConversationWidget/shared/concept-explainer-types.d.ts +17 -0
  254. package/dist/types/widgets/ConceptExplainerConversationWidget/shared/concept-explainer-widget-payload.d.ts +25 -0
  255. package/dist/types/widgets/ConceptExplainerConversationWidget/shared/use-concept-explainer-language.d.ts +8 -0
  256. package/dist/types/widgets/ConversationSearchResultsConversationWidget/ConversationSearchResultsCanvas.d.ts +9 -0
  257. package/dist/types/widgets/ConversationSearchResultsConversationWidget/ConversationSearchResultsCanvasBody.d.ts +7 -0
  258. package/dist/types/widgets/ConversationSearchResultsConversationWidget/ConversationSearchResultsConversationWidget.d.ts +15 -0
  259. package/dist/types/widgets/ConversationSearchResultsConversationWidget/shared/conversation-search-results-widget-payload.d.ts +42 -0
  260. package/dist/types/widgets/ConversationSearchResultsConversationWidget/shared/search-hit-excerpt.d.ts +1 -0
  261. package/dist/types/widgets/CurrencyConverterConversationWidget/CurrencyConverterConversationWidget.d.ts +8 -0
  262. package/dist/types/widgets/CurrencyConverterConversationWidget/CurrencyConverterWidget/CurrencyConverterWidget.d.ts +17 -0
  263. package/dist/types/widgets/CurrencyConverterConversationWidget/CurrencyConverterWidget/CurrencyLabel/CurrencyLabel.d.ts +9 -0
  264. package/dist/types/widgets/CurrencyConverterConversationWidget/shared/currency-converter-widget-payload.d.ts +22 -0
  265. package/dist/types/widgets/CurrencyConverterConversationWidget/shared/currency-display.d.ts +30 -0
  266. package/dist/types/widgets/CustomVisualizationConversationWidget/CustomVisualizationConversationWidget.d.ts +11 -0
  267. package/dist/types/widgets/CustomVisualizationConversationWidget/CustomVisualizationWidget/CustomVisualizationFrame.d.ts +14 -0
  268. package/dist/types/widgets/CustomVisualizationConversationWidget/CustomVisualizationWidget/CustomVisualizationWidget.d.ts +15 -0
  269. package/dist/types/widgets/CustomVisualizationConversationWidget/shared/custom-visualization-frame-protocol.d.ts +77 -0
  270. package/dist/types/widgets/CustomVisualizationConversationWidget/shared/custom-visualization-libraries.d.ts +25 -0
  271. package/dist/types/widgets/CustomVisualizationConversationWidget/shared/custom-visualization-sandbox-config.d.ts +21 -0
  272. package/dist/types/widgets/CustomVisualizationConversationWidget/shared/custom-visualization-widget-payload.d.ts +55 -0
  273. package/dist/types/widgets/CustomVisualizationConversationWidget/shared/read-custom-visualization-theme.d.ts +5 -0
  274. package/dist/types/widgets/EntityMentionConversationWidget/EntityMentionAskButton/EntityMentionAskButton.d.ts +13 -0
  275. package/dist/types/widgets/EntityMentionConversationWidget/EntityMentionCard/EntityMentionCard.d.ts +11 -0
  276. package/dist/types/widgets/EntityMentionConversationWidget/EntityMentionConversationWidget.d.ts +9 -0
  277. package/dist/types/widgets/EntityMentionConversationWidget/shared/entity-mention-presentation.d.ts +4 -0
  278. package/dist/types/widgets/EntityMentionConversationWidget/shared/entity-mention.d.ts +33 -0
  279. package/dist/types/widgets/EntityMentionConversationWidget/shared/use-entity-mention-composer.d.ts +17 -0
  280. package/dist/types/widgets/MultiChoiceConversationWidget/MultiChoiceConversationWidget.d.ts +2 -0
  281. package/dist/types/widgets/MultiChoiceConversationWidget/shared/multi-choice-widget-payload.d.ts +16 -0
  282. package/dist/types/widgets/QuickRepliesConversationWidget/QuickRepliesConversationWidget.d.ts +38 -0
  283. package/dist/types/widgets/QuickRepliesConversationWidget/shared/quick-replies-widget-payload.d.ts +20 -0
  284. package/dist/types/widgets/SuggestedActions/SuggestedActions.d.ts +10 -0
  285. package/dist/types/widgets/ToolTraceConversationWidget/ToolTraceConversationWidget.d.ts +8 -0
  286. package/dist/types/widgets/WebSearchResultsConversationWidget/SourceFavicon.d.ts +10 -0
  287. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchAnswer.d.ts +6 -0
  288. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchReferences.d.ts +12 -0
  289. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchResultsCanvas.d.ts +10 -0
  290. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchResultsCanvasBody.d.ts +7 -0
  291. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchResultsConversationWidget.d.ts +14 -0
  292. package/dist/types/widgets/WebSearchResultsConversationWidget/WebSearchSourcesList.d.ts +10 -0
  293. package/dist/types/widgets/WebSearchResultsConversationWidget/shared/display-hostname.d.ts +9 -0
  294. package/dist/types/widgets/WebSearchResultsConversationWidget/shared/web-search-results-widget-payload.d.ts +30 -0
  295. package/dist/types/widgets/WritingDraftConversationWidget/WritingDraftConversationWidget.d.ts +14 -0
  296. package/dist/types/widgets/WritingDraftConversationWidget/WritingDraftWidget/WritingDraftBody.d.ts +9 -0
  297. package/dist/types/widgets/WritingDraftConversationWidget/WritingDraftWidget/WritingDraftWidget.d.ts +44 -0
  298. package/dist/types/widgets/WritingDraftConversationWidget/shared/draft-mail-link.d.ts +17 -0
  299. package/dist/types/widgets/WritingDraftConversationWidget/shared/draft-plain-text.d.ts +7 -0
  300. package/dist/types/widgets/WritingDraftConversationWidget/shared/remark-draft-line-breaks.d.ts +13 -0
  301. package/dist/types/widgets/WritingDraftConversationWidget/shared/writing-draft-widget-payload.d.ts +23 -0
  302. package/dist/types/widgets/_shared/ConversationWidgetButton.d.ts +4 -0
  303. package/dist/types/widgets/_shared/DonePill.d.ts +14 -0
  304. package/dist/types/widgets/_shared/modern/WidgetKpiValue.d.ts +24 -0
  305. package/dist/types/widgets/_shared/modern/WidgetListRow.d.ts +14 -0
  306. package/dist/types/widgets/_shared/modern/WidgetStatusChip.d.ts +8 -0
  307. package/dist/types/widgets/_shared/modern/WidgetSurface.d.ts +13 -0
  308. package/dist/types/widgets/_shared/modern/WidgetSurfaceSkeleton.d.ts +11 -0
  309. package/dist/types/widgets/_shared/modern/index.d.ts +16 -0
  310. package/dist/types/widgets/_shared/skeleton-primitives.d.ts +20 -0
  311. package/dist/types/widgets/_shared/use-stack-when-wrapped.d.ts +6 -0
  312. package/dist/types/widgets/_shared/widget-payload-validation.d.ts +22 -0
  313. package/dist/widgets.js +84 -0
  314. package/dist/widgets.js.map +1 -0
  315. package/package.json +147 -3
@@ -0,0 +1,733 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { aF as WidgetSurface, q as Text, V as getWidgetSelfHydrationKeyFieldName, c as DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME, b4 as readWidgetAgentSpaceKeyAttribute, ai as WidgetRenderReportContext, b0 as buildWidgetAgentSpaceKeyProps, af as StandaloneConversationWidgetProvider, aY as ConversationWidgetRenderContext, a_ as WidgetImageRenderContext, bh as CANVAS_VIABLE_MIN_WIDTH, Q as getSandboxLegacyAliases, bi as listWidgetHydratorTypes, as as getWidgetHydrator, bj as unregisterWidgetHydrator, Z as registerWidgetHydrator } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
4
+ import { useRef, useState, useMemo, useEffect, useCallback } from "react";
5
+ import { J as buildComposedViewComponentRegistry, K as composedViewComponents, v as resolveWidgetName, o as conversationWidgetRegistry, j as ConversationWidgetErrorBoundary, L as ComposedViewComponentsContext } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
6
+ import { c as canvasBodies } from "./chunks/canvasBodies-9SuF6NAB.js";
7
+ import { d as canvasBehaviourOf } from "./chunks/canvas-behaviours-BRFR1ALE.js";
8
+ import { d as decideCanvasOpen } from "./chunks/decide-canvas-open-Ct-wnNEJ.js";
9
+ import { p as publishWidgetImageReadiness } from "./chunks/widget-image-readiness-signal-DeOuL89j.js";
10
+ import axios from "axios";
11
+ const page = "agents_page_5VMDeD";
12
+ const chatColumn = "agents_chatColumn_FWcgdJ";
13
+ const widget = "agents_widget_3qpgMy";
14
+ const canvasPane = "agents_canvasPane_i61o2I";
15
+ const composerLog = "agents_composerLog_Ye3k8o";
16
+ const composerEntry = "agents_composerEntry_bykht3";
17
+ const stubVideo = "agents_stubVideo_6wGFeT";
18
+ const stubVideoThumbnail = "agents_stubVideoThumbnail_sTsShW";
19
+ const stubVideoText = "agents_stubVideoText_ScUzLZ";
20
+ const styles = {
21
+ page,
22
+ chatColumn,
23
+ widget,
24
+ canvasPane,
25
+ composerLog,
26
+ composerEntry,
27
+ stubVideo,
28
+ stubVideoThumbnail,
29
+ stubVideoText
30
+ };
31
+ const formatDuration = (durationSeconds) => {
32
+ if (typeof durationSeconds !== "number" || !Number.isFinite(durationSeconds) || durationSeconds < 0) return null;
33
+ const minutes = Math.floor(durationSeconds / 60);
34
+ const seconds = Math.floor(durationSeconds % 60);
35
+ return `${minutes}:${String(seconds).padStart(2, "0")}`;
36
+ };
37
+ const StubVideo = ({ props }) => {
38
+ const duration = formatDuration(props.durationSeconds);
39
+ return /* @__PURE__ */ jsx(WidgetSurface, { level: "flat", compact: true, children: /* @__PURE__ */ jsxs("div", { className: styles.stubVideo, children: [
40
+ typeof props.thumbnail === "string" ? /* @__PURE__ */ jsx("img", { className: styles.stubVideoThumbnail, src: props.thumbnail, alt: "" }) : null,
41
+ /* @__PURE__ */ jsxs("div", { className: styles.stubVideoText, children: [
42
+ /* @__PURE__ */ jsx(Text, { role: "body", weight: "bold", translate: false, children: typeof props.title === "string" ? props.title : "" }),
43
+ /* @__PURE__ */ jsx(Text, { role: "caption", color: "var(--agents-fg-light)", translate: false, children: [typeof props.channel === "string" ? props.channel : null, duration].filter(Boolean).join(" · ") })
44
+ ] })
45
+ ] }) });
46
+ };
47
+ const PREVIEW_STUB_COMPONENTS = [{ nodeType: "Video", component: StubVideo }];
48
+ const buildPreviewComposedViewComponents = () => buildComposedViewComponentRegistry([
49
+ ...Object.values(composedViewComponents),
50
+ ...PREVIEW_STUB_COMPONENTS.filter(
51
+ (stub) => !Object.prototype.hasOwnProperty.call(composedViewComponents, stub.nodeType)
52
+ )
53
+ ]);
54
+ const wireName$I = "ComposedView";
55
+ const fixtures$I = /* @__PURE__ */ JSON.parse(`[{"name":"data-poll-bars","description":"ChatGPT ref 01: a poll as a table of share bars with the change since January, the caption and the source chip — Table + Repeat + TableCell bar / signed tone.","expectedState":"data","width":720,"payload":{"title":"Aktuelle Sonntagsfrage","data":{"parties":[{"party":"CSU","share":36,"shareOfMax":0.9,"change":-3,"changeTone":"danger"},{"party":"AfD","share":21,"shareOfMax":0.525,"change":2,"changeTone":"success"},{"party":"Grüne","share":15,"shareOfMax":0.375,"change":2,"changeTone":"success"},{"party":"Freie Wähler","share":9,"shareOfMax":0.225,"change":0,"changeTone":"muted"},{"party":"SPD","share":8,"shareOfMax":0.2,"change":0,"changeTone":"muted"},{"party":"Linke","share":4,"shareOfMax":0.1,"change":1,"changeTone":"success"},{"party":"Sonstige","share":7,"shareOfMax":0.175,"change":-2,"changeTone":"danger"}]},"view":{"type":"Table","caption":"Infratest dimap / BR24 BayernTrend, 20. Oktober 2026 · 1.207 Befragte. Rechts: Veränderung in Prozentpunkten seit Januar 2026.","source":{"name":"www.infratest-dimap.de","url":"https://www.infratest-dimap.de/umfragen-analysen/bundeslaender/bayern/"},"children":[{"type":"Repeat","items":{"$data":"parties"},"children":[{"type":"TableRow","children":[{"type":"TableCell","value":{"$item":"party"}},{"type":"TableCell","value":{"$item":"share"},"format":"percent","bar":{"$item":"shareOfMax"},"align":"end"},{"type":"TableCell","value":{"$item":"change"},"signed":true,"tone":{"$item":"changeTone"},"align":"end"}]}]}]}}},{"name":"data-poll-bar-chart","description":"ChatGPT ref 01 as ONE bar chart with the change per bar: a bar per party on its track with the value, the signed change since January at the right (plus green, minus red, zero muted), the line naming what the change counts, the caption with institute, date and sample, and the source chip.","expectedState":"data","width":720,"payload":{"title":"Aktuelle Sonntagsfrage","data":{"parties":[{"party":"CSU","share":36,"shareOfMax":0.9,"change":-3,"changeTone":"danger"},{"party":"AfD","share":21,"shareOfMax":0.525,"change":2,"changeTone":"success"},{"party":"Grüne","share":15,"shareOfMax":0.375,"change":2,"changeTone":"success"},{"party":"Freie Wähler","share":9,"shareOfMax":0.225,"change":0,"changeTone":"muted"},{"party":"SPD","share":8,"shareOfMax":0.2,"change":0,"changeTone":"muted"},{"party":"Linke","share":4,"shareOfMax":0.1,"change":1,"changeTone":"success"},{"party":"Sonstige","share":7,"shareOfMax":0.175,"change":-2,"changeTone":"danger"}]},"view":{"type":"Chart","kind":"bar","horizontal":true,"data":{"$data":"parties"},"x":"party","series":[{"field":"share","label":"Anteil"}],"valueFormat":"percent","caption":"Infratest dimap / BR24 BayernTrend, 20. Oktober 2026 · 1.207 Befragte","source":{"name":"www.infratest-dimap.de","url":"https://www.infratest-dimap.de/umfragen-analysen/bundeslaender/bayern/"},"deltaField":"change","deltaUnit":"pp","deltaLabel":"Rechts: Veränderung in Prozentpunkten seit Januar 2026."}}},{"name":"data-line-chart","description":"ChatGPT ref 03: four parties over three polls, percent axis, legend under the plot; clicking a legend entry hides its series, hovering a point shows the tooltip.","expectedState":"data","width":720,"interactions":[{"name":"hide-afd","click":{"selector":".apexcharts-legend-series[seriesname='AfD']"}},{"name":"hover-point","hover":{"selector":".apexcharts-svg"}}],"payload":{"data":{"polls":[{"date":"Jan. 2024","csu":40,"afd":15,"gruene":13,"fw":13},{"date":"Jan. 2026","csu":39,"afd":19,"gruene":13,"fw":9},{"date":"Okt. 2026","csu":36,"afd":21,"gruene":15,"fw":9}]},"view":{"type":"Chart","kind":"line","title":"Entwicklung der wichtigsten Parteien","data":{"$data":"polls"},"x":"date","series":[{"field":"csu","label":"CSU"},{"field":"afd","label":"AfD"},{"field":"gruene","label":"Grüne"},{"field":"fw","label":"Freie Wähler"}],"valueFormat":"percent","min":0,"max":45,"caption":"Infratest dimap / BayernTREND, Januar 2024 bis Oktober 2026","source":{"name":"www.infratest-dimap.de","url":"https://www.infratest-dimap.de/umfragen-analysen/bundeslaender/bayern/"}}}},{"name":"data-coalition-table","description":"ChatGPT ref 04: the short form — three columns, seats right-aligned, the majority as a check or a cross.","expectedState":"data","width":720,"payload":{"title":"Rechnerische Koalitionsmöglichkeiten","data":{"coalitions":[{"coalition":"CSU + Freie Wähler","seats":94,"majority":true},{"coalition":"CSU + Grüne","seats":104,"majority":true},{"coalition":"CSU + SPD","seats":86,"majority":false}]},"view":{"type":"Table","columns":[{"key":"coalition","label":"Koalition"},{"key":"seats","label":"Sitze"},{"key":"majority","label":"Mehrheit (91)"}],"rows":{"$data":"coalitions"},"caption":"Auf Grundlage der GMS-Umfrage vom 19. Oktober 2026 bei modellierten 180 Sitzen.","source":{"name":"GMS-Umfrage Bayern"}}}},{"name":"data-cohort-heatmap","description":"ChatGPT ref 12: a retention cohort table of heat cells, the Nutzer / Umsatz toggle (Tabs, lane L5) switching every cell; missing months show a dash.","expectedState":"data","width":720,"interactions":[{"name":"switch-to-revenue","click":{"text":"Umsatz"}}],"payload":{"title":"Retention Analysis","state":{"mode":"users"},"data":{"usersRows":[{"cohort":"Mai","m0":100,"h0":1,"m1":82,"h1":0.55,"m2":74,"h2":0.35,"m3":69,"h3":0.225,"m4":65,"h4":0.125},{"cohort":"Juni","m0":100,"h0":1,"m1":85,"h1":0.625,"m2":78,"h2":0.45,"m3":72,"h3":0.3,"m4":null,"h4":null},{"cohort":"Juli","m0":100,"h0":1,"m1":81,"h1":0.525,"m2":75,"h2":0.375,"m3":null,"h3":null,"m4":null,"h4":null},{"cohort":"Aug.","m0":100,"h0":1,"m1":88,"h1":0.7,"m2":null,"h2":null,"m3":null,"h3":null,"m4":null,"h4":null}],"revenueRows":[{"cohort":"Mai","m0":100,"h0":1,"m1":88,"h1":0.7,"m2":81,"h2":0.525,"m3":77,"h3":0.425,"m4":74,"h4":0.35},{"cohort":"Juni","m0":100,"h0":1,"m1":90,"h1":0.75,"m2":84,"h2":0.6,"m3":79,"h3":0.475,"m4":null,"h4":null},{"cohort":"Juli","m0":100,"h0":1,"m1":86,"h1":0.65,"m2":80,"h2":0.5,"m3":null,"h3":null,"m4":null,"h4":null},{"cohort":"Aug.","m0":100,"h0":1,"m1":92,"h1":0.8,"m2":null,"h2":null,"m3":null,"h3":null,"m4":null,"h4":null}]},"computed":{"cohortRows":"mode == \\"users\\" ? usersRows : revenueRows"},"view":{"type":"Surface","subtitle":"Kohorten 2026 · Beispieldaten","slots":{"header":[{"type":"Tabs","options":[{"id":"users","label":"Nutzer"},{"id":"revenue","label":"Umsatz"}],"value":{"$state":"mode"},"onChange":{"set":"mode"}}]},"children":[{"type":"Table","caption":"Niedrig → Hoch: je dunkler, desto höher die Bindung.","children":[{"type":"TableRow","header":true,"children":[{"type":"TableCell","value":""},{"type":"TableCell","value":"M0","align":"center"},{"type":"TableCell","value":"M1","align":"center"},{"type":"TableCell","value":"M2","align":"center"},{"type":"TableCell","value":"M3","align":"center"},{"type":"TableCell","value":"M4","align":"center"}]},{"type":"Repeat","items":{"$computed":"cohortRows"},"children":[{"type":"TableRow","children":[{"type":"TableCell","value":{"$item":"cohort"}},{"type":"TableCell","value":{"$item":"m0"},"format":"percent","heat":{"$item":"h0"},"align":"center"},{"type":"TableCell","value":{"$item":"m1"},"format":"percent","heat":{"$item":"h1"},"align":"center"},{"type":"TableCell","value":{"$item":"m2"},"format":"percent","heat":{"$item":"h2"},"align":"center"},{"type":"TableCell","value":{"$item":"m3"},"format":"percent","heat":{"$item":"h3"},"align":"center"},{"type":"TableCell","value":{"$item":"m4"},"format":"percent","heat":{"$item":"h4"},"align":"center"}]}]}]}]}}},{"name":"data-mrr-simulator","description":"ChatGPT ref 16: Bear / Base / Bull tabs, two KPI tiles, the MRR line chart and the start-customers slider on one state; the copy button copies the scenario.","expectedState":"data","width":720,"interactions":[{"name":"scenario-bull","click":{"text":"Bull"}},{"name":"scenario-bear","click":{"text":"Bear"}}],"payload":{"title":"MRR Growth Simulator","state":{"scenario":"base","customers":800},"data":{"months":[{"month":"M1","bear":1,"base":1,"bull":1},{"month":"M2","bear":1.02,"base":1.055,"bull":1.09},{"month":"M3","bear":1.0404,"base":1.113,"bull":1.1881},{"month":"M4","bear":1.0612,"base":1.1742,"bull":1.295},{"month":"M5","bear":1.0824,"base":1.2388,"bull":1.4116},{"month":"M6","bear":1.1041,"base":1.307,"bull":1.5386},{"month":"M7","bear":1.1262,"base":1.3788,"bull":1.6771},{"month":"M8","bear":1.1487,"base":1.4547,"bull":1.828},{"month":"M9","bear":1.1717,"base":1.5347,"bull":1.9926},{"month":"M10","bear":1.1951,"base":1.6191,"bull":2.1719},{"month":"M11","bear":1.219,"base":1.7081,"bull":2.3674},{"month":"M12","bear":1.2434,"base":1.8021,"bull":2.5804}]},"computed":{"factor12":"scenario == \\"bear\\" ? last(months).bear : scenario == \\"bull\\" ? last(months).bull : last(months).base","growth":"scenario == \\"bear\\" ? 2 : scenario == \\"bull\\" ? 9 : 5.5","grossGrowth":"growth + 3","plotted":"map(months, r => {month: r.month, mrr: round(customers * 79 * (scenario == \\"bear\\" ? r.bear : scenario == \\"bull\\" ? r.bull : r.base))})","mrr12":"round(customers * 79 * factor12)"},"actions":{"copyScenario":{"type":"copy","value":{"$computed":"plotted"}}},"view":{"type":"Surface","subtitle":"12-Monats-Modell · 79 € ARPA · Beispieldaten","children":[{"type":"Tabs","options":[{"id":"bear","label":"Bear"},{"id":"base","label":"Base"},{"id":"bull","label":"Bull"}],"value":{"$state":"scenario"},"onChange":{"set":"scenario"}},{"type":"Grid","columns":2,"children":[{"type":"KpiTile","label":"MRR Monat 12","value":{"$computed":"mrr12"},"format":"currency","currency":"EUR"},{"type":"KpiTile","label":"Netto-Wachstum / Monat","value":{"$computed":"growth"},"format":"percent","signed":true,"tone":"success"}]},{"type":"Chart","kind":"line","data":{"$computed":"plotted"},"x":"month","series":[{"field":"mrr","label":"MRR"}],"valueFormat":"currency","currency":"EUR","min":0},{"type":"Slider","label":"Startkunden","min":200,"max":2000,"step":50,"value":{"$state":"customers"},"onChange":{"set":"customers"}},{"type":"Grid","columns":2,"children":[{"type":"KpiTile","label":"Wachstumsrate","value":{"$computed":"grossGrowth"},"format":"percent","signed":true},{"type":"KpiTile","label":"Churn-Rate","value":3,"format":"percent","higherIsBetter":false,"source":{"name":"Modellannahme"}}]},{"type":"Button","label":"Szenariodaten als JSON kopieren","icon":"copy","onClick":{"action":"copyScenario"},"fullWidth":true}]}}},{"name":"data-stock-chart","description":"ChatGPT ref 31: the price as a KPI tile with its change, the 1D / 5D range tabs over the price area chart (intraday or the five daily closes), the key stats in a four-column table.","expectedState":"data","width":720,"interactions":[{"name":"hover-price","hover":{"selector":".apexcharts-svg"}},{"name":"range-5d","click":{"text":"5D"}}],"payload":{"title":"Apple Inc (AAPL)","data":{"intraday":[{"time":"9:30","price":350},{"time":"9:36","price":349.1},{"time":"9:43","price":348.2},{"time":"9:49","price":347.3},{"time":"9:56","price":346.62},{"time":"10:02","price":346.06},{"time":"10:09","price":345.87},{"time":"10:15","price":346.06},{"time":"10:22","price":345.6},{"time":"10:28","price":345.6},{"time":"10:35","price":345.6},{"time":"10:41","price":345.88},{"time":"10:48","price":345.6},{"time":"10:54","price":345.86},{"time":"11:00","price":346.02},{"time":"11:07","price":345.6},{"time":"11:14","price":345.6},{"time":"11:20","price":345.6},{"time":"11:26","price":345.6},{"time":"11:33","price":346.2},{"time":"11:39","price":345.62},{"time":"11:46","price":345.6},{"time":"11:52","price":346.12},{"time":"11:59","price":345.95},{"time":"12:05","price":345.6},{"time":"12:12","price":345.6},{"time":"12:18","price":345.6},{"time":"12:25","price":346.14},{"time":"12:31","price":345.72},{"time":"12:38","price":345.6},{"time":"12:45","price":345.66},{"time":"12:51","price":345.67},{"time":"12:58","price":346.21},{"time":"13:04","price":346.6},{"time":"13:11","price":346.36},{"time":"13:17","price":345.93},{"time":"13:24","price":346.32},{"time":"13:30","price":346.9},{"time":"13:37","price":346.24},{"time":"13:43","price":346.5},{"time":"13:49","price":346.93},{"time":"13:56","price":347.07},{"time":"14:03","price":346.66},{"time":"14:09","price":346.99},{"time":"14:15","price":347.24},{"time":"14:22","price":346.79},{"time":"14:29","price":346.93},{"time":"14:35","price":346.51},{"time":"14:41","price":345.86},{"time":"14:48","price":345.6},{"time":"14:55","price":345.6},{"time":"15:01","price":345.6},{"time":"15:07","price":345.74},{"time":"15:14","price":346.13},{"time":"15:20","price":346.68},{"time":"15:27","price":347.25},{"time":"15:33","price":347.84},{"time":"15:40","price":348.17},{"time":"15:46","price":347.86},{"time":"15:53","price":347.73}],"fiveDays":[{"time":"17. Okt.","price":344.62},{"time":"20. Okt.","price":346.8},{"time":"21. Okt.","price":345.91},{"time":"22. Okt.","price":348.22},{"time":"23. Okt.","price":347.73}]},"view":{"type":"Stack","children":[{"type":"KpiTile","label":"Kurs · 23. Okt., 19:58:16 EDT","value":347.73,"format":"currency","currency":"USD","delta":-0.49,"deltaFormat":"currency","deltaLabel":"(0,14 %) · nachbörslich 347,60 $","detail":"NASDAQ, Echtzeit","source":{"name":"Nasdaq","url":"https://www.nasdaq.com/market-activity/stocks/aapl"}},{"type":"Tabs","options":[{"id":"1d","label":"1D"},{"id":"5d","label":"5D"}],"value":{"$state":"range"},"onChange":{"set":"range"}},{"type":"Chart","kind":"area","data":{"$computed":"pricePoints"},"x":"time","series":[{"field":"price","label":"Kurs"}],"valueFormat":"number","min":344,"max":352},{"type":"Table","children":[{"type":"TableRow","children":[{"type":"TableCell","value":"Öffnen","tone":"muted"},{"type":"TableCell","value":349.49,"align":"end"},{"type":"TableCell","value":"Volumen","tone":"muted"},{"type":"TableCell","value":39500000,"format":"compact","align":"end"}]},{"type":"TableRow","children":[{"type":"TableCell","value":"Marktkapitalisierung","tone":"muted"},{"type":"TableCell","value":5120000000000,"format":"compact","align":"end"},{"type":"TableCell","value":"Tagestief","tone":"muted"},{"type":"TableCell","value":345.41,"align":"end"}]},{"type":"TableRow","children":[{"type":"TableCell","value":"Jahrestief","tone":"muted"},{"type":"TableCell","value":0.12,"align":"end"},{"type":"TableCell","value":"EPS (TTM)","tone":"muted"},{"type":"TableCell","value":8.71,"align":"end"}]},{"type":"TableRow","children":[{"type":"TableCell","value":"Tageshoch","tone":"muted"},{"type":"TableCell","value":351.7,"align":"end"},{"type":"TableCell","value":"Jahreshoch","tone":"muted"},{"type":"TableCell","value":1023,"align":"end"}]},{"type":"TableRow","children":[{"type":"TableCell","value":"KGV","tone":"muted"},{"type":"TableCell","value":39.92,"align":"end"},{"type":"TableCell"},{"type":"TableCell"}]}],"source":{"name":"www.nasdaq.com","url":"https://www.nasdaq.com/market-activity/stocks/aapl"}}]},"state":{"range":"1d"},"computed":{"pricePoints":"range == \\"5d\\" ? fiveDays : intraday"}}},{"name":"data-analytics-studio","description":"ChatGPT ref 52, the data half: period tabs, channel select, reference date, benchmark checkbox and traffic slider (lane L5) drive three KPI tiles, the line chart with its comparison series, the channel bar and pie charts, the scatter chart and the detail table with a Repeat, a total row and the date in its caption.","expectedState":"data","width":720,"interactions":[{"name":"four-weeks","click":{"text":"4 Wochen"}},{"name":"benchmark-off","click":{"text":"Vergleichswerte"}}],"payload":{"title":"Analytics Studio","state":{"period":"7d","channel":"all","asOf":"2026-10-25","scale":100,"benchmark":true},"data":{"days":[{"x":"Mo","organic":500,"paid":300,"direct":180,"rate":3.5},{"x":"Di","organic":580,"paid":340,"direct":200,"rate":4},{"x":"Mi","organic":520,"paid":320,"direct":200,"rate":3.8},{"x":"Do","organic":640,"paid":400,"direct":220,"rate":4.4},{"x":"Fr","organic":600,"paid":360,"direct":170,"rate":4.6},{"x":"Sa","organic":720,"paid":500,"direct":240,"rate":5.3},{"x":"So","organic":630,"paid":400,"direct":180,"rate":4.2}],"weeks":[{"x":"W1","organic":3400,"paid":2100,"direct":1300,"rate":3.7},{"x":"W2","organic":3950,"paid":2350,"direct":1600,"rate":3.9},{"x":"W3","organic":4300,"paid":2550,"direct":1750,"rate":4.2},{"x":"W4","organic":4700,"paid":2750,"direct":1850,"rate":4.5}]},"computed":{"baseRows":"period == \\"7d\\" ? days : weeks","channelVisits":"map(baseRows, r => {x: r.x, rate: r.rate, visits: channel == \\"organic\\" ? r.organic : channel == \\"paid\\" ? r.paid : channel == \\"direct\\" ? r.direct : r.organic + r.paid + r.direct})","plotted":"map(channelVisits, r => {x: r.x, visits: round(r.visits * scale / 100), comparison: round(r.visits * scale / 100 * 0.9), conversions: round(r.visits * scale / 100 * r.rate / 100), rate: r.rate})","totalVisits":"sum(plotted, r => r.visits)","totalConversions":"sum(plotted, r => r.conversions)","averageRate":"totalVisits > 0 ? round(totalConversions / totalVisits * 10000) / 100 : 0","channelTotals":"[{name: \\"Organic\\", visitors: round(sum(baseRows, r => r.organic) * scale / 100)}, {name: \\"Paid\\", visitors: round(sum(baseRows, r => r.paid) * scale / 100)}, {name: \\"Direct\\", visitors: round(sum(baseRows, r => r.direct) * scale / 100)}]","channelLabel":"channel == \\"organic\\" ? \\"Organic\\" : channel == \\"paid\\" ? \\"Paid\\" : channel == \\"direct\\" ? \\"Direct\\" : \\"Alle Kanäle\\"","tableCaption":"\\"Detailtabelle · \\" + asOf + (period == \\"7d\\" ? \\" · Tageswerte\\" : \\" · Wochenwerte\\")"},"view":{"type":"Stack","children":[{"type":"Surface","title":"Filter & State","density":"compact","children":[{"type":"Tabs","label":"Zeitraum","options":[{"id":"7d","label":"7 Tage"},{"id":"30d","label":"4 Wochen"}],"value":{"$state":"period"},"onChange":{"set":"period"}},{"type":"Select","label":"Kanal","options":[{"id":"all","label":"Alle Kanäle"},{"id":"organic","label":"Organic"},{"id":"paid","label":"Paid"},{"id":"direct","label":"Direct"}],"value":{"$state":"channel"},"onChange":{"set":"channel"}},{"type":"DatePicker","label":"Referenzdatum","value":{"$state":"asOf"},"onChange":{"set":"asOf"}},{"type":"Slider","label":"Traffic-Skalierung","min":50,"max":150,"step":10,"unit":"%","value":{"$state":"scale"},"onChange":{"set":"scale"}},{"type":"Checkbox","label":"Vergleichswerte (90 % der Besucher) anzeigen","checked":{"$state":"benchmark"},"onChange":{"set":"benchmark"}}]},{"type":"Grid","columns":3,"children":[{"type":"KpiTile","label":"Besucher","value":{"$computed":"totalVisits"},"detail":{"$computed":"channelLabel"}},{"type":"KpiTile","label":"Conversions","value":{"$computed":"totalConversions"},"detail":"Simuliert"},{"type":"KpiTile","label":"Conversion","value":{"$computed":"averageRate"},"format":"percent","detail":"Gewichtet"}]},{"type":"Grid","columns":2,"minColumnWidth":"regular","children":[{"type":"Chart","kind":"line","title":"Line · Besucher","data":{"$computed":"plotted"},"x":"x","series":[{"field":"visits","label":"Besucher"},{"field":"comparison","label":"Vergleich","visible":{"$state":"benchmark"}}]},{"type":"Chart","kind":"bar","title":"Bar · Kanäle","data":{"$computed":"channelTotals"},"x":"name","series":[{"field":"visitors","label":"Besucher"}]},{"type":"Chart","kind":"pie","title":"Pie · Traffic-Mix","data":{"$computed":"channelTotals"},"x":"name","series":[{"field":"visitors","label":"Besucher"}]},{"type":"Chart","kind":"scatter","title":"Scatter · Traffic / CVR","data":{"$computed":"plotted"},"x":"visits","xLabel":"Besucher","series":[{"field":"rate","label":"Conversion Rate"}],"valueFormat":"percent"}]},{"type":"Table","caption":{"$computed":"tableCaption"},"children":[{"type":"TableRow","header":true,"children":[{"type":"TableCell","value":"Zeitraum"},{"type":"TableCell","value":"Besucher","align":"end"},{"type":"TableCell","value":"Conversions","align":"end"},{"type":"TableCell","value":"CVR","align":"end"}]},{"type":"Repeat","items":{"$computed":"plotted"},"children":[{"type":"TableRow","children":[{"type":"TableCell","value":{"$item":"x"}},{"type":"TableCell","value":{"$item":"visits"}},{"type":"TableCell","value":{"$item":"conversions"}},{"type":"TableCell","value":{"$item":"rate"},"format":"percent","decimals":1}]}]},{"type":"TableRow","emphasis":true,"children":[{"type":"TableCell","value":"Gesamt"},{"type":"TableCell","value":{"$computed":"totalVisits"}},{"type":"TableCell","value":{"$computed":"totalConversions"}},{"type":"TableCell","value":{"$computed":"averageRate"},"format":"percent"}]}]}]}}},{"name":"data-review-sources-donut","description":"Shares of a whole as a donut: the practice's reviews by platform (Google, Jameda, Facebook), the share on each slice, the total in the middle, the legend under the ring, the caption with the date and the source chip.","expectedState":"data","locale":"de","width":528,"dataSet":"kassel-dental-practice","payload":{"view":{"type":"Chart","kind":"donut","title":"Bewertungen nach Plattform","data":[{"platform":"Google","reviews":87},{"platform":"Jameda","reviews":32},{"platform":"Facebook","reviews":11}],"x":"platform","series":[{"field":"reviews","label":"Bewertungen"}],"caption":"130 Bewertungen insgesamt, Stand 25. Oktober 2026","source":{"name":"Example Reviews · Bewertungsquellen"}}}},{"name":"data-profile-views-heatmap","description":"A heatmap of the Google Business Profile views by weekday × time of day over the last four weeks: one heat row per weekday, one column per two-hour slot, the count in each cell; the caption names the period.","expectedState":"data","locale":"de","width":528,"dataSet":"kassel-dental-practice","payload":{"data":{"views":[{"day":"Mo","h08":64,"h10":58,"h12":41,"h14":46,"h16":52,"h18":33},{"day":"Di","h08":57,"h10":52,"h12":38,"h14":43,"h16":49,"h18":30},{"day":"Mi","h08":52,"h10":47,"h12":35,"h14":40,"h16":44,"h18":27},{"day":"Do","h08":55,"h10":50,"h12":37,"h14":42,"h16":47,"h18":29},{"day":"Fr","h08":49,"h10":44,"h12":31,"h14":24,"h16":19,"h18":22},{"day":"Sa","h08":21,"h10":28,"h12":26,"h14":19,"h16":15,"h18":12},{"day":"So","h08":11,"h10":17,"h12":19,"h14":16,"h16":18,"h18":20}]},"view":{"type":"Chart","kind":"heatmap","title":"Profilaufrufe nach Wochentag und Uhrzeit","data":{"$data":"views"},"x":"day","series":[{"field":"h08","label":"8–10"},{"field":"h10","label":"10–12"},{"field":"h12","label":"12–14"},{"field":"h14","label":"14–16"},{"field":"h16","label":"16–18"},{"field":"h18","label":"18–20"}],"caption":"Aufrufe des Google-Profils, 28. September bis 25. Oktober 2026 (Uhrzeit in Stunden)","source":{"name":"Google Business Profile · Statistiken"}}}},{"name":"data-review-request-funnel","description":"The stages of a process as a funnel: review invitations sent → e-mail opened → review link clicked → review written, each stage a centered bar with its count and the conversion from the stage before in percent; caption and source chip.","expectedState":"data","locale":"de","width":528,"dataSet":"kassel-dental-practice","payload":{"view":{"type":"Chart","kind":"funnel","title":"Bewertungseinladungen der letzten 30 Tage","data":[{"stage":"Einladungen versendet","count":64},{"stage":"E-Mail geöffnet","count":41},{"stage":"Bewertungslink geklickt","count":19},{"stage":"Bewertung geschrieben","count":5}],"x":"stage","series":[{"field":"count","label":"Patienten"}],"caption":"Einladungen per E-Mail, 26. September bis 25. Oktober 2026","source":{"name":"Example Review Invitations · Bewertungseinladungen"}}}},{"name":"data-profile-radar","description":"ChatGPT ref 14 with real data: the practice's Google profile across six completeness dimensions against the average of its five local competitors, two polygons, the legend under the plot, hovering a point shows both values.","expectedState":"data","locale":"de","width":528,"dataSet":"kassel-dental-practice","interactions":[{"name":"hover-point","hover":{"position":{"x":352,"y":125}}}],"payload":{"data":{"dimensions":[{"dimension":"Fotos","own":55,"competitors":75},{"dimension":"Öffnungszeiten","own":100,"competitors":95},{"dimension":"Leistungen","own":90,"competitors":70},{"dimension":"Attribute","own":70,"competitors":65},{"dimension":"Bewertungen","own":92,"competitors":68},{"dimension":"Beiträge","own":60,"competitors":40}]},"view":{"type":"Chart","kind":"radar","title":"Google-Profil im Vergleich","data":{"$data":"dimensions"},"x":"dimension","series":[{"field":"own","label":"Ihre Praxis"},{"field":"competitors","label":"Ø 5 Wettbewerber"}],"valueFormat":"percent","min":0,"max":100,"caption":"Vollständigkeit je Bereich in Prozent, Stand 25. Oktober 2026","source":{"name":"Google Business Profile · Example Analytics Wettbewerbsanalyse"}}}},{"name":"data-list","description":"The List node: a numbered short form, ListItems with a trailing Icon and a Repeat of ListItems (no single ChatGPT screenshot; ref 52's carousel content as entries).","expectedState":"data","width":528,"payload":{"title":"Kanäle im Überblick","data":{"channels":[{"name":"Organic","visitors":"4.190","share":"51,1 % Anteil"},{"name":"Paid","visitors":"2.620","share":"32,0 % Anteil"},{"name":"Direct","visitors":"1.390","share":"16,9 % Anteil"}]},"view":{"type":"List","marker":"number","children":[{"type":"Repeat","items":{"$data":"channels"},"children":[{"type":"ListItem","title":{"$item":"name"},"description":"Besucher","meta":{"$item":"share"},"value":{"$item":"visitors"},"slots":{"trailing":[{"type":"Icon","name":"lineChart","tone":"muted"}]}}]}]}}},{"name":"data-loading","description":"Loading: a table and a chart bound to a tool result that is still pending show skeletons in their shape.","expectedState":"loading","width":528,"payload":{"view":{"type":"Stack","children":[{"type":"KpiTile","label":"Besucher","value":{"$from":{"toolCall":"call_7","path":"$.total","state":"pending"}}},{"type":"Chart","kind":"line","title":"Besucher","data":{"$from":{"toolCall":"call_7","path":"$.rows[*]","state":"pending"}},"x":"x","series":[{"field":"visits"}]},{"type":"Table","columns":[{"key":"x","label":"Tag"},{"key":"visits","label":"Besucher"}],"rows":{"$from":{"toolCall":"call_7","path":"$.rows[*]","state":"pending"}}}]}}},{"name":"data-empty","description":"Empty: a chart and a table over an empty dataset show one muted line each and report empty (the preview reads the block's render report, so its state is empty).","expectedState":"empty","width":528,"payload":{"data":{"none":[]},"view":{"type":"Stack","children":[{"type":"Chart","kind":"bar","title":"Bewertungen pro Monat","data":{"$data":"none"},"x":"month","series":[{"field":"count"}]},{"type":"Table","columns":[{"key":"name","label":"Wettbewerber"}],"rows":{"$data":"none"},"emptyText":"Noch keine Wettbewerber erfasst."}]}}},{"name":"data-error","description":"Error: rows without a number in the series and an unknown bound icon report failed (INVALID_PROP); the rest of the tree renders.","expectedState":"error","width":528,"payload":{"state":{"icon":"rocket"},"view":{"type":"Stack","children":[{"type":"Chart","kind":"line","title":"Besucher","data":[{"x":"Mo","visits":"viele"}],"x":"x","series":[{"field":"visits"}],"source":{"name":"Google Analytics"}},{"type":"Icon","name":{"$state":"icon"},"label":"Status"},{"type":"KpiTile","label":"Besucher","value":8200,"source":{"name":"Google Analytics"}}]}}},{"name":"data-visibility-overview-ro","description":"AW-351 synthetic regression/state fixture; supplied problematic literals preserved.","expectedState":"data","width":672,"payload":{"title":"Vizibilitate online","view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"google-profile","label":"Google profile","value":"Verificat · publicat","detail":"Profilul este vizibil pe Google.","source":{"name":"getGoogleProfile"}},{"type":"KpiTile","id":"reviews","label":"Reviews","value":"5/5 · 22 recenzii","detail":"Recenzii publicate de clienți.","source":{"name":"getReviews"}},{"type":"KpiTile","id":"listings","label":"Listings","value":"19 din 20 corecte","detail":"O înregistrare necesită verificare.","source":{"name":"getListings"}},{"type":"KpiTile","id":"organic-rank","label":"Google organic rank","value":12,"detail":"Poziția medie în rezultatele organice.","source":{"name":"getGoogleOrganicRank"}},{"type":"KpiTile","id":"maps-rank","label":"Google Maps rank","value":4,"detail":"Poziția medie pe Google Maps.","source":{"name":"getGoogleMapsRank"}},{"type":"KpiTile","id":"ai-visibility","label":"AI Visibility","value":"61,4/100","detail":"Vizibilitate în răspunsurile generate de AI.","source":{"name":"getAiVisibility"}}]}}},{"name":"data-visibility-overview-toned","description":"AW-351: the visibility overview with the judgement tones a model may set (status accents, meter colours).","expectedState":"data","width":672,"payload":{"title":"Vizibilitate online","view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"google-profile","label":"Google profile","value":"Verificat · publicat","detail":"Profilul este vizibil pe Google.","source":{"name":"getGoogleProfile"},"tone":"success"},{"type":"KpiTile","id":"reviews","label":"Reviews","value":"5/5 · 22 recenzii","detail":"Recenzii publicate de clienți.","source":{"name":"getReviews"},"tone":"success"},{"type":"KpiTile","id":"listings","label":"Listings","value":"19 din 20 corecte","detail":"O înregistrare necesită verificare.","source":{"name":"getListings"},"tone":"warning"},{"type":"KpiTile","id":"organic-rank","label":"Google organic rank","value":12,"detail":"Poziția medie în rezultatele organice.","source":{"name":"getGoogleOrganicRank"}},{"type":"KpiTile","id":"maps-rank","label":"Google Maps rank","value":4,"detail":"Poziția medie pe Google Maps.","source":{"name":"getGoogleMapsRank"}},{"type":"KpiTile","id":"ai-visibility","label":"AI Visibility","value":"61,4/100","detail":"Vizibilitate în răspunsurile generate de AI.","source":{"name":"getAiVisibility"},"tone":"warning"}]}}},{"name":"data-kpi-numeric-suffixes","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"numeric-0","label":"Metric 1","value":{"$state":"fixture_numeric_0"}},{"type":"KpiTile","id":"numeric-1","label":"Metric 2","value":{"$state":"fixture_numeric_1"},"unit":"%"},{"type":"KpiTile","id":"numeric-2","label":"Metric 3","value":{"$state":"fixture_numeric_2"},"unit":"/100"},{"type":"KpiTile","id":"numeric-3","label":"Metric 4","value":{"$state":"fixture_numeric_3"},"unit":"recenzii"},{"type":"KpiTile","id":"numeric-4","label":"Metric 5","value":{"$state":"fixture_numeric_4"},"unit":"EUR / lună","format":"currency","currency":"EUR"},{"type":"KpiTile","id":"numeric-5","label":"Metric 6","value":{"$state":"fixture_numeric_5"},"unit":"visits in the last 28 days","format":"compact"}]},"state":{"fixture_numeric_0":8,"fixture_numeric_1":0,"fixture_numeric_2":-12.5,"fixture_numeric_3":"61,4/100","fixture_numeric_4":113498,"fixture_numeric_5":8200}}},{"name":"data-kpi-text-unicode","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"text-0","label":"Status 1","value":"Verified","detail":"Updated today"},{"type":"KpiTile","id":"text-1","label":"Status 2","value":"Verificat · publicat"},{"type":"KpiTile","id":"text-2","label":"Status 3","value":{"$state":"fixture_text_2"},"detail":"Updated today"},{"type":"KpiTile","id":"text-3","label":"Status 4","value":{"$state":"fixture_text_3"}},{"type":"KpiTile","id":"text-4","label":"Status 5","value":"Informații verificate azi","detail":"Updated today"},{"type":"KpiTile","id":"text-5","label":"Status 6","value":"Știință, încredere și țară"}]},"state":{"fixture_text_2":"5/5 · 22 recenzii","fixture_text_3":"19 din 20 corecte"}}},{"name":"data-kpi-long-text","description":"AW-351 synthetic fixture. Unsourced figures use literal datasets to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":2,"children":[{"type":"KpiTile","id":"long-status","label":"Google profile","value":"Profil verificat și publicat; informațiile despre companie sunt actualizate în toate directoarele disponibile.","detail":"Date actualizate pentru toate locațiile companiei în ultimele douăzeci și opt de zile, inclusiv înregistrările care necesită verificare.","source":{"name":"getGoogleBusinessProfileVerificationAndPublicationStatusForAllLocations"}},{"type":"KpiTile","id":"compound","label":"Status","value":"Donaudampfschifffahrtsgesellschaftskapitän"}]}}},{"name":"data-kpi-mixed-optional","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":4,"children":[{"type":"KpiTile","id":"mixed-0","label":"Metric 1","value":{"$state":"fixture_mixed_0"}},{"type":"KpiTile","id":"mixed-1","label":"Metric 2","value":"Verificat · publicat","detail":"Updated today","unit":"%","delta":5,"higherIsBetter":false,"deltaLabel":"vs previous month","source":{"name":"getGoogleProfile"}},{"type":"KpiTile","id":"mixed-2","label":"Metric 3","value":12,"detail":"Results collected during the last twenty-eight days","unit":"visits in the last 28 days","delta":0,"higherIsBetter":true,"deltaLabel":"vs previous month","source":{"name":"Google profile","url":"https://example.com/profile"}},{"type":"KpiTile","id":"mixed-3","label":"Metric 4","value":"19 din 20 corecte","detail":"Date actualizate pentru toate locațiile companiei în ultimele douăzeci și opt de zile, inclusiv înregistrările care necesită verificare.","delta":-0.5,"higherIsBetter":false,"deltaLabel":"vs previous month","source":{"name":"getGoogleBusinessProfileVerificationAndPublicationStatusForAllLocations"}},{"type":"KpiTile","id":"mixed-4","label":"Metric 5","value":{"$state":"fixture_mixed_4"}},{"type":"KpiTile","id":"mixed-5","label":"Metric 6","value":"Știință, încredere și țară","detail":"Updated today","unit":"%","delta":5,"higherIsBetter":false,"deltaLabel":"vs previous month","source":{"name":"getGoogleProfile"}},{"type":"KpiTile","id":"mixed-6","label":"Metric 7","value":12,"detail":"Results collected during the last twenty-eight days","unit":"visits in the last 28 days","delta":0,"higherIsBetter":true,"deltaLabel":"vs previous month","source":{"name":"Google profile","url":"https://example.com/profile"}},{"type":"KpiTile","id":"mixed-7","label":"Metric 8","value":"Verificat · publicat","detail":"Date actualizate pentru toate locațiile companiei în ultimele douăzeci și opt de zile, inclusiv înregistrările care necesită verificare.","delta":-0.5,"higherIsBetter":false,"deltaLabel":"vs previous month","source":{"name":"getGoogleBusinessProfileVerificationAndPublicationStatusForAllLocations"}}]},"state":{"fixture_mixed_0":12,"fixture_mixed_4":12}}},{"name":"data-visibility-overview-en","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"google-profile","label":"Google business profile","value":"Verified · published","detail":"Updated today","source":{"name":"getGoogleProfile"}},{"type":"KpiTile","id":"reviews","label":"Customer reviews","value":"5/5 · 22 reviews","detail":"Results collected during the last twenty-eight days","source":{"name":"getReviews"}},{"type":"KpiTile","id":"listings","label":"Directory listings","value":"19 of 20 correct","detail":"Updated today","source":{"name":"getListings"}},{"type":"KpiTile","id":"organic-rank","label":"Google organic rank","value":12,"detail":"Results collected during the last twenty-eight days","source":{"name":"getGoogleOrganicRank"}},{"type":"KpiTile","id":"maps-rank","label":"Google Maps rank","value":4,"detail":"Updated today","source":{"name":"getGoogleMapsRank"}},{"type":"KpiTile","id":"ai-visibility","label":"AI Visibility","value":"61,4/100","detail":"Results collected during the last twenty-eight days","source":{"name":"getAiVisibility"}},{"type":"KpiTile","id":"locale-decimal","label":"Score","value":{"$state":"fixture_locale_decimal"}},{"type":"KpiTile","id":"locale-currency","label":"Budget","value":{"$state":"fixture_locale_currency"},"format":"currency","currency":"EUR"}]},"state":{"fixture_locale_decimal":12.5,"fixture_locale_currency":113498}}},{"name":"data-visibility-overview-de","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"data","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"google-profile","label":"Google-Unternehmensprofil","value":"Verifiziert · veröffentlicht","detail":"Heute aktualisiert","source":{"name":"getGoogleProfile"}},{"type":"KpiTile","id":"reviews","label":"Kundenbewertungen","value":"5/5 · 22 Bewertungen","detail":"Ergebnisse aus den vergangenen achtundzwanzig Tagen","source":{"name":"getReviews"}},{"type":"KpiTile","id":"listings","label":"Branchenverzeichnisse","value":"19 von 20 korrekt","detail":"Heute aktualisiert","source":{"name":"getListings"}},{"type":"KpiTile","id":"organic-rank","label":"Organische Google-Platzierung","value":12,"detail":"Ergebnisse aus den vergangenen achtundzwanzig Tagen","source":{"name":"getGoogleOrganicRank"}},{"type":"KpiTile","id":"maps-rank","label":"Google-Maps-Platzierung","value":4,"detail":"Heute aktualisiert","source":{"name":"getGoogleMapsRank"}},{"type":"KpiTile","id":"ai-visibility","label":"KI-Sichtbarkeit","value":"61,4/100","detail":"Ergebnisse aus den vergangenen achtundzwanzig Tagen","source":{"name":"getAiVisibility"}},{"type":"KpiTile","id":"locale-decimal","label":"Score","value":{"$state":"fixture_locale_decimal"}},{"type":"KpiTile","id":"locale-currency","label":"Budget","value":{"$state":"fixture_locale_currency"},"format":"currency","currency":"EUR"}]},"state":{"fixture_locale_decimal":12.5,"fixture_locale_currency":113498}}},{"name":"data-kpi-pending","description":"AW-351 synthetic fixture. Unsourced figures use literal datasets to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"loading","width":672,"payload":{"view":{"type":"KpiTile","id":"pending-metric","label":"Besucher","value":{"$from":{"toolCall":"call_7","path":"$.total","state":"pending"}}}}},{"name":"data-kpi-empty","description":"AW-351 synthetic fixture. Unsourced figures use literal datasets to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"empty","width":672,"payload":{"state":{"missing":null},"view":{"type":"KpiTile","id":"empty-metric","label":"Conversions","value":{"$state":"missing"}}}},{"name":"data-kpi-pending-mixed","description":"AW-351 synthetic fixture. Unsourced figures use bound literal state to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"loading","width":672,"payload":{"view":{"type":"Grid","id":"visibility","columns":3,"children":[{"type":"KpiTile","id":"pending-metric","label":"Pending","value":{"$from":{"toolCall":"call_7","path":"$.total","state":"pending"}}},{"type":"KpiTile","id":"resolved-metric","label":"Resolved","value":{"$state":"fixture_resolved_metric"}},{"type":"KpiTile","id":"empty-metric","label":"Empty","value":{"$state":"missing"}},{"type":"KpiTile","id":"text-metric","label":"Status","value":"Verified"}]},"state":{"missing":null,"fixture_resolved_metric":22}}},{"name":"data-kpi-failed","description":"AW-351 synthetic fixture. Unsourced figures use literal datasets to exercise layout without provenance warnings; no customer facts are implied.","expectedState":"error","width":672,"payload":{"data":{"metric":{"$from":{"toolCall":"call_7","path":"$.total","state":"failed"}}},"view":{"type":"KpiTile","id":"failed-metric","label":"Reviews","value":{"$data":"metric"}}}},{"name":"data-kpi-source-no-source","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":672,"payload":{"state":{"metric":4},"view":{"type":"KpiTile","id":"no-source","label":"No source","value":{"$state":"metric"}}}},{"name":"data-kpi-source-name-only","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":672,"payload":{"state":{"metric":4},"view":{"type":"KpiTile","id":"name-only","label":"Name-only source","value":{"$state":"metric"},"source":{"name":"getRankings"}}}},{"name":"data-kpi-source-named-url","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":672,"payload":{"state":{"metric":4},"view":{"type":"KpiTile","id":"named-url","label":"Named URL","value":{"$state":"metric"},"source":{"name":"Rankings report","url":"https://example.com/rankings"}}}},{"name":"data-kpi-source-host-url","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":672,"payload":{"state":{"metric":4},"view":{"type":"KpiTile","id":"host-url","label":"URL without a name","value":{"$state":"metric"},"source":{"url":"https://example.com/rankings"}}}},{"name":"data-kpi-source-long-name","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":672,"payload":{"state":{"metric":4},"view":{"type":"KpiTile","id":"long-name","label":"Long source name","value":{"$state":"metric"},"source":{"name":"Rankings report for all business locations during the previous twenty-eight days","url":"https://example.com/rankings"}}}},{"name":"data-kpi-source-mixed","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":960,"payload":{"state":{"metric":4},"view":{"type":"Grid","id":"source-mixed","columns":3,"children":[{"type":"KpiTile","id":"no-source","label":"No source","value":{"$state":"metric"}},{"type":"KpiTile","id":"name-only","label":"Name-only source","value":{"$state":"metric"},"source":{"name":"getRankings"}},{"type":"KpiTile","id":"named-url","label":"Named URL","value":{"$state":"metric"},"source":{"name":"Rankings report","url":"https://example.com/rankings"}},{"type":"KpiTile","id":"host-url","label":"URL without a name","value":{"$state":"metric"},"source":{"url":"https://example.com/rankings"}},{"type":"KpiTile","id":"long-name","label":"Long source name","value":{"$state":"metric"},"source":{"name":"Rankings report for all business locations during the previous twenty-eight days","url":"https://example.com/rankings"}},{"type":"KpiTile","id":"invalid","label":"Invalid URL","value":{"$state":"metric"},"source":{"name":"Invalid report","url":"https://"}}]}}},{"name":"data-kpi-source-mixed-narrow","description":"AW-351 synthetic source-footer fixture; bound literal state exercises layout without implying customer facts.","expectedState":"data","width":320,"payload":{"state":{"metric":4},"view":{"type":"Grid","id":"source-mixed","columns":3,"children":[{"type":"KpiTile","id":"no-source","label":"No source","value":{"$state":"metric"}},{"type":"KpiTile","id":"name-only","label":"Name-only source","value":{"$state":"metric"},"source":{"name":"getRankings"}},{"type":"KpiTile","id":"named-url","label":"Named URL","value":{"$state":"metric"},"source":{"name":"Rankings report","url":"https://example.com/rankings"}},{"type":"KpiTile","id":"host-url","label":"URL without a name","value":{"$state":"metric"},"source":{"url":"https://example.com/rankings"}},{"type":"KpiTile","id":"long-name","label":"Long source name","value":{"$state":"metric"},"source":{"name":"Rankings report for all business locations during the previous twenty-eight days","url":"https://example.com/rankings"}},{"type":"KpiTile","id":"invalid","label":"Invalid URL","value":{"$state":"metric"},"source":{"name":"Invalid report","url":"https://"}}]}}}]`);
56
+ const __vite_glob_0_0 = {
57
+ wireName: wireName$I,
58
+ fixtures: fixtures$I
59
+ };
60
+ const wireName$H = "ComposedView";
61
+ const fixtures$H = [{ "name": "widget-embedded-weather-forecast", "description": "The Widget node: the embeddable WeatherForecast inside a Stack under a Title and a Caption — today's weather at the dental practice in Kassel (cloudy at 9 °C, rain from 16:00), answered by the WeatherForecast hydration.", "dataSet": "kassel-dental-practice", "payload": { "view": { "type": "Stack", "gap": "small", "children": [{ "type": "Title", "text": "Wetter heute an der Praxis" }, { "type": "Caption", "text": "Wilhelmshöher Allee 120, Kassel – Regen ab etwa 16 Uhr" }, { "type": "Widget", "widget": "WeatherForecast", "fields": { "agentSpaceId": 7 } }] } }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528, "hydration": { "WeatherForecast": { "forecast": { "placeName": "Kassel", "observedAt": "2026-10-25T09:30:00+01:00", "timezone": "Europe/Berlin", "sourceName": "Xweather", "condition": "CLOUDY", "conditionText": "Bewölkt", "temperatureC": 9.1, "feelsLikeC": 7.4, "windKmh": 17, "precipitationMm": 0, "isDaylight": true, "hours": [{ "at": "2026-10-25T10:00:00+01:00", "condition": "CLOUDY", "temperatureC": 9.8, "precipitationProbabilityPercent": 20, "windKmh": 18 }, { "at": "2026-10-25T11:00:00+01:00", "condition": "PARTLY_CLOUDY", "temperatureC": 10.9, "precipitationProbabilityPercent": 15, "windKmh": 19 }, { "at": "2026-10-25T12:00:00+01:00", "condition": "PARTLY_CLOUDY", "temperatureC": 11.8, "precipitationProbabilityPercent": 10, "windKmh": 21 }, { "at": "2026-10-25T13:00:00+01:00", "condition": "PARTLY_CLOUDY", "temperatureC": 12.4, "precipitationProbabilityPercent": 10, "windKmh": 22 }, { "at": "2026-10-25T14:00:00+01:00", "condition": "CLOUDY", "temperatureC": 12.6, "precipitationProbabilityPercent": 25, "windKmh": 22 }, { "at": "2026-10-25T15:00:00+01:00", "condition": "CLOUDY", "temperatureC": 12.1, "precipitationProbabilityPercent": 35, "windKmh": 24 }, { "at": "2026-10-25T16:00:00+01:00", "condition": "RAIN", "temperatureC": 11.3, "precipitationProbabilityPercent": 60, "windKmh": 26 }, { "at": "2026-10-25T17:00:00+01:00", "condition": "RAIN", "temperatureC": 10.4, "precipitationProbabilityPercent": 70, "windKmh": 25 }, { "at": "2026-10-25T18:00:00+01:00", "condition": "CLOUDY", "temperatureC": 9.6, "precipitationProbabilityPercent": 45, "windKmh": 21 }, { "at": "2026-10-25T19:00:00+01:00", "condition": "CLOUDY", "temperatureC": 8.9, "precipitationProbabilityPercent": 30, "windKmh": 18 }, { "at": "2026-10-25T20:00:00+01:00", "condition": "PARTLY_CLOUDY", "temperatureC": 8.2, "precipitationProbabilityPercent": 20, "windKmh": 15 }, { "at": "2026-10-25T21:00:00+01:00", "condition": "PARTLY_CLOUDY", "temperatureC": 7.6, "precipitationProbabilityPercent": 15, "windKmh": 13 }], "minTemperatureC": 6, "maxTemperatureC": 13, "sunrise": "07:38", "sunset": "17:02", "summaryText": "Vormittags freundlich, ab dem späten Nachmittag Regen, abends wieder trocken.", "warnings": [], "days": [] } } } }];
62
+ const __vite_glob_0_1 = {
63
+ wireName: wireName$H,
64
+ fixtures: fixtures$H
65
+ };
66
+ const wireName$G = "ComposedView";
67
+ const fixtures$G = [{ "name": "entity-link-business-card", "description": "Screenshot 20 rebuilt: a business card whose name is an EntityLink (title variant) and whose footer button runs the same openEntity action. The action carries the reference as the backend stores it after resolving it (the L-SERIAL persist contract). A click on the name opens the entityDetail canvas with the body the app registers for the `business` entity type; the example response stands for that body's read of business 301.", "payload": { "actions": { "openLeve": { "type": "openEntity", "ref": "call_places_1:business:0", "entity": { "entityType": "business", "entityId": "301", "agentSpaceId": 7 } } }, "view": { "type": "Surface", "slots": { "media": [{ "type": "Image", "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5a/M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg", "alt": "Der Prinzipalmarkt in Münster", "aspectRatio": "16:9" }], "footer": [{ "type": "Button", "label": "Restaurantdetails öffnen", "onClick": { "action": "openLeve" }, "icon": "info", "fullWidth": true }] }, "children": [{ "type": "Stack", "gap": "xsmall", "children": [{ "type": "Stack", "direction": "row", "justify": "between", "align": "center", "children": [{ "type": "EntityLink", "text": "Altes Gasthaus Leve", "action": "openLeve", "variant": "title" }, { "type": "Badge", "text": "Restaurant" }] }, { "type": "Caption", "text": "Westfälische Küche · Historisches Gasthaus" }, { "type": "Stack", "direction": "row", "gap": "xsmall", "align": "center", "children": [{ "type": "Icon", "name": "starActive" }, { "type": "Text", "text": "4,3" }, { "type": "Caption", "text": "(891)" }] }, { "type": "Stack", "direction": "row", "gap": "xsmall", "align": "center", "children": [{ "type": "Icon", "name": "location", "tone": "muted" }, { "type": "Text", "text": "Alter Steinweg 37, 48143 Münster-Altstadt, Deutschland" }] }] }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open-detail-from-name", "click": { "selector": "[data-testid=composed-entity-link]" } }], "agentSpaceId": 7, "responses": { "GET /api/example/agent-spaces/7/businesses/301": { "business": { "id": 301, "name": "Altes Gasthaus Leve" } } } }, { "name": "entity-link-in-sentence-and-chips", "description": "The entity names inside prose (a Text with inline EntityLinks, as ChatGPT links names in its answer) and the same businesses as chips under it, each chip bound to its own action through a Repeat. Click the second chip: the entityDetail canvas opens for that business.", "payload": { "data": { "businesses": [{ "name": "Kleiner Kiepenkerl", "action": "openKiepenkerl" }, { "name": "Großer Kiepenkerl Gasthaus", "action": "openGrosser" }, { "name": "Gasthaus Stuhlmacher", "action": "openStuhlmacher" }] }, "actions": { "openKiepenkerl": { "type": "openEntity", "ref": "call_c_1:business:0", "entity": { "entityType": "business", "entityId": "9001", "agentSpaceId": 7 } }, "openGrosser": { "type": "openEntity", "ref": "call_c_1:business:1", "entity": { "entityType": "business", "entityId": "301", "agentSpaceId": 7 } }, "openStuhlmacher": { "type": "openEntity", "ref": "call_c_1:business:2", "entity": { "entityType": "business", "entityId": "9003", "agentSpaceId": 7 } } }, "view": { "type": "Stack", "gap": "small", "children": [{ "type": "Text", "text": "Am nächsten an Ihnen liegen", "children": [{ "type": "EntityLink", "text": "Kleiner Kiepenkerl", "action": "openKiepenkerl" }, { "type": "Text", "text": "und" }, { "type": "EntityLink", "text": "Gasthaus Stuhlmacher", "action": "openStuhlmacher" }] }, { "type": "Flow", "gap": "xsmall", "children": [{ "type": "Repeat", "items": { "$data": "businesses" }, "children": [{ "type": "EntityLink", "text": { "$item": "name" }, "action": { "$item": "action" }, "variant": "chip" }] }] }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open-second-chip", "click": { "text": "Großer Kiepenkerl Gasthaus" } }], "agentSpaceId": 7, "responses": { "GET /api/example/agent-spaces/7/businesses/9001": { "business": { "id": 9001, "name": "Kleiner Kiepenkerl" } }, "GET /api/example/agent-spaces/7/businesses/301": { "business": { "id": 301, "name": "Großer Kiepenkerl" } }, "GET /api/example/agent-spaces/7/businesses/9003": { "business": { "id": 9003, "name": "Stuhlmacher" } } } }, { "name": "entity-link-unresolved", "description": "The error state: an EntityLink whose action is gone (the persist pass dropped the reference it could not resolve) — the name shows without the click and the node reports failed UNRESOLVED_REF (ChatGPT's 20b showed a broken panel instead).", "payload": { "view": { "type": "Text", "text": "Ihr stärkster Wettbewerber ist", "children": [{ "type": "EntityLink", "text": "Altes Gasthaus Leve" }] } }, "expectedState": "error", "width": 528 }, { "name": "entity-link-empty", "description": "The empty state: the name is bound to a state value that is empty — nothing shows, the node reports empty.", "payload": { "state": { "name": "" }, "actions": { "openLeve": { "type": "openEntity", "ref": "call_places_1:business:0", "entity": { "entityType": "business", "entityId": "8812", "agentSpaceId": 1 } } }, "view": { "type": "EntityLink", "text": { "$state": "name" }, "action": "openLeve" } }, "expectedState": "empty", "width": 528 }, { "name": "entity-link-loading", "description": "The loading state: the name is bound to a tool result that is not stored yet — a skeleton line.", "payload": { "actions": { "openLeve": { "type": "openEntity", "ref": "call_places_1:business:0", "entity": { "entityType": "business", "entityId": "8812", "agentSpaceId": 1 } } }, "view": { "type": "EntityLink", "text": { "$from": { "toolCall": "call_pending_1", "path": "$.name" } }, "action": "openLeve" } }, "expectedState": "loading", "width": 528 }];
68
+ const __vite_glob_0_2 = {
69
+ wireName: wireName$G,
70
+ fixtures: fixtures$G
71
+ };
72
+ const wireName$F = "ComposedView";
73
+ const fixtures$F = [{ "name": "contact-request", "description": "A Form with a recipient, a subject and a message (the editable e-mail draft of ChatGPT reference 47): the owner edits the fields and sends them to the agent, or declines.", "payload": { "state": { "recipient": "", "subject": "Short request", "message": "Hello,\n\nI am interested in your offer and would like more information on prices, availability and terms.\n\nCould you send me the documents?\n\nKind regards" }, "view": { "type": "Form", "name": "shortRequest", "title": "Short request", "description": "Edit the draft, then send it to me — I will e-mail it for you.", "submitLabel": "Send request", "declineLabel": "Not now", "requiredFields": ["recipient", "message"], "children": [{ "type": "Input", "label": "Recipient", "inputType": "email", "placeholder": "name@example.com", "value": { "$state": "recipient" }, "onChange": { "set": "recipient" } }, { "type": "Input", "label": "Subject", "value": { "$state": "subject" }, "onChange": { "set": "subject" } }, { "type": "Textarea", "label": "Your question", "rows": 7, "value": { "$state": "message" }, "onChange": { "set": "message" } }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "send without a recipient", "click": { "text": "Send request" } }, { "name": "type the recipient", "fill": { "selector": "input[type=email]", "value": "info@example.com" } }, { "name": "send the request", "click": { "text": "Send request" } }] }, { "name": "filter-and-state", "description": "The 'Filter & State' panel of ChatGPT reference 52 as a Form: period tabs, a channel select, a reference date, a traffic slider and a checkbox; Apply sends the chosen settings.", "payload": { "state": { "period": "7d", "channel": "all", "asOf": "2026-10-25", "scale": 100, "benchmark": true }, "view": { "type": "Form", "name": "dashboardFilters", "title": "Filter & state", "description": "Pick what the dashboard shows.", "submitLabel": "Apply", "children": [{ "type": "Tabs", "label": "Period", "options": [{ "id": "7d", "label": "7 days" }, { "id": "4w", "label": "4 weeks" }], "value": { "$state": "period" }, "onChange": { "set": "period" } }, { "type": "Stack", "direction": "row", "children": [{ "type": "Select", "label": "Channel", "options": [{ "id": "all", "label": "All channels" }, { "id": "organic", "label": "Organic" }, { "id": "paid", "label": "Paid" }, { "id": "direct", "label": "Direct" }], "value": { "$state": "channel" }, "onChange": { "set": "channel" } }, { "type": "DatePicker", "label": "Reference date", "value": { "$state": "asOf" }, "onChange": { "set": "asOf" } }] }, { "type": "Slider", "label": "Traffic scaling", "min": 50, "max": 150, "step": 5, "unit": "%", "value": { "$state": "scale" }, "onChange": { "set": "scale" } }, { "type": "Checkbox", "label": "Show comparison values (90 % of visitors)", "checked": { "$state": "benchmark" }, "onChange": { "set": "benchmark" } }], "slots": { "header": [{ "type": "Popover", "label": "Method", "icon": "info", "placement": "end", "text": "All numbers are demo data. The filters work locally and react to your input." }] } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open the method popover", "click": { "text": "Method" } }, { "name": "pick 4 weeks", "click": { "text": "4 weeks" } }, { "name": "apply", "click": { "text": "Apply" } }] }, { "name": "confirm-only", "description": "A Form without inputs (the empty state): one line of text and the two buttons — sends an empty submit or the decline.", "payload": { "view": { "type": "Form", "name": "publishConfirm", "title": "Publish the draft?", "submitLabel": "Publish", "declineLabel": "Not now", "children": [{ "type": "Text", "text": "The post goes live on Google and Facebook.", "tone": "muted" }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "decline", "click": { "text": "Not now" } }] }, { "name": "contact-request-email", "description": "The contact-request form as the e-mail capture shows it: the fields frozen at their values, no action row (run with --mode email).", "payload": { "state": { "recipient": "", "subject": "Short request", "message": "Hello,\n\nI am interested in your offer and would like more information on prices, availability and terms.\n\nCould you send me the documents?\n\nKind regards" }, "view": { "type": "Form", "name": "shortRequest", "title": "Short request", "description": "Edit the draft, then send it to me — I will e-mail it for you.", "submitLabel": "Send request", "declineLabel": "Not now", "requiredFields": ["recipient", "message"], "children": [{ "type": "Input", "label": "Recipient", "inputType": "email", "placeholder": "name@example.com", "value": { "$state": "recipient" }, "onChange": { "set": "recipient" } }, { "type": "Input", "label": "Subject", "value": { "$state": "subject" }, "onChange": { "set": "subject" } }, { "type": "Textarea", "label": "Your question", "rows": 7, "value": { "$state": "message" }, "onChange": { "set": "message" } }] } }, "expectedState": "data", "width": 528 }];
74
+ const __vite_glob_0_3 = {
75
+ wireName: wireName$F,
76
+ fixtures: fixtures$F
77
+ };
78
+ const wireName$E = "ComposedView";
79
+ const fixtures$E = [{ "name": "button-mrr-growth-simulator", "description": "The MRR growth simulator: Bear/Base/Bull tabs, KPIs, the MRR line and a starting-customers slider share one state; a button copies the scenario as JSON (ChatGPT reference 16).", "payload": { "state": { "scenario": "base", "startCustomers": 800 }, "data": { "months": [{ "month": "M1", "bear": 1, "base": 1, "bull": 1 }, { "month": "M2", "bear": 1.02, "base": 1.05, "bull": 1.08 }, { "month": "M3", "bear": 1.0404, "base": 1.1025, "bull": 1.1664 }, { "month": "M4", "bear": 1.0612, "base": 1.1576, "bull": 1.2597 }, { "month": "M5", "bear": 1.0824, "base": 1.2155, "bull": 1.3605 }, { "month": "M6", "bear": 1.1041, "base": 1.2763, "bull": 1.4693 }, { "month": "M7", "bear": 1.1262, "base": 1.3401, "bull": 1.5869 }, { "month": "M8", "bear": 1.1487, "base": 1.4071, "bull": 1.7138 }, { "month": "M9", "bear": 1.1717, "base": 1.4775, "bull": 1.8509 }, { "month": "M10", "bear": 1.1951, "base": 1.5513, "bull": 1.999 }, { "month": "M11", "bear": 1.219, "base": 1.6289, "bull": 2.1589 }, { "month": "M12", "bear": 1.2434, "base": 1.7103, "bull": 2.3316 }] }, "computed": { "growth": 'scenario == "bear" ? 4 : scenario == "base" ? 8 : 12', "churn": 'scenario == "bear" ? 2 : scenario == "base" ? 3 : 4', "netGrowth": "growth - churn", "series": 'map(months, m => ({ month: m.month, mrr: round(startCustomers * 79 * (scenario == "bear" ? m.bear : scenario == "base" ? m.base : m.bull)) }))', "mrrMonth12": "last(series).mrr", "scenarioJson": '"{\\"scenario\\":\\"" + scenario + "\\",\\"startCustomers\\":" + string(startCustomers) + ",\\"mrrMonth12\\":" + string(mrrMonth12) + "}"' }, "actions": { "copyScenario": { "type": "copy", "value": { "$computed": "scenarioJson" } } }, "view": { "type": "Surface", "title": "MRR Growth Simulator", "subtitle": "12-month model · €79 ARPA · example data", "children": [{ "type": "Tabs", "options": [{ "id": "bear", "label": "Bear" }, { "id": "base", "label": "Base" }, { "id": "bull", "label": "Bull" }], "value": { "$state": "scenario" }, "onChange": { "set": "scenario" } }, { "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "MRR month 12", "value": { "$computed": "mrrMonth12" }, "format": "currency", "currency": "EUR", "decimals": 0 }, { "type": "KpiTile", "label": "Net growth / month", "value": { "$computed": "netGrowth" }, "format": "percent", "decimals": 0, "tone": "success", "signed": true }] }, { "type": "Chart", "kind": "line", "data": { "$computed": "series" }, "x": "month", "series": [{ "field": "mrr", "label": "MRR" }], "valueFormat": "currency", "currency": "EUR" }, { "type": "Slider", "label": "Starting customers", "min": 100, "max": 2e3, "step": 50, "value": { "$state": "startCustomers" }, "onChange": { "set": "startCustomers" } }, { "type": "Divider" }, { "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "Growth rate", "value": { "$computed": "growth" }, "format": "percent", "decimals": 0, "signed": true }, { "type": "KpiTile", "label": "Churn rate", "value": { "$computed": "churn" }, "format": "percent", "decimals": 0 }] }, { "type": "Button", "label": "Copy scenario data as JSON", "icon": "copy", "fullWidth": true, "onClick": { "action": "copyScenario" } }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "bull scenario", "click": { "text": "Bull" } }, { "name": "more starting customers", "click": { "selector": ".MuiSlider-thumb" }, "press": "ArrowRight" }, { "name": "copy scenario", "click": { "text": "Copy scenario data as JSON" } }] }, { "name": "button-replay", "description": "The same buttons on a replayed message: visible, inert (mode replay shows it; here the tree is the plain button row).", "payload": { "state": { "visitors": 35e3 }, "actions": { "reset": { "type": "resetState" }, "copyResult": { "type": "copy", "value": { "$state": "visitors" } } }, "view": { "type": "Stack", "direction": "row", "gap": "small", "children": [{ "type": "Button", "label": "Copy JSON", "icon": "copy", "onClick": { "action": "copyResult" } }, { "type": "Button", "label": "Reset", "icon": "reset", "variant": "secondary", "onClick": { "action": "reset" } }] } }, "expectedState": "data", "width": 528 }];
80
+ const __vite_glob_0_4 = {
81
+ wireName: wireName$E,
82
+ fixtures: fixtures$E
83
+ };
84
+ const wireName$D = "ComposedView";
85
+ const fixtures$D = [{ "name": "checkbox-benchmark", "description": "One checkbox with a muted explanation (ChatGPT reference 52).", "payload": { "state": { "benchmark": true }, "view": { "type": "Checkbox", "label": "Show comparison values", "description": "The comparison line is 90 % of the visitors.", "checked": { "$state": "benchmark" }, "onChange": { "set": "benchmark" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "clear", "click": { "text": "Show comparison values" } }] }];
86
+ const __vite_glob_0_5 = {
87
+ wireName: wireName$D,
88
+ fixtures: fixtures$D
89
+ };
90
+ const wireName$C = "ComposedView";
91
+ const fixtures$C = [{ "name": "date-picker-reference-date", "description": "The reference date of the analytics studio (ChatGPT reference 52).", "payload": { "state": { "asOf": "2026-10-25" }, "view": { "type": "DatePicker", "label": "Reference date", "value": { "$state": "asOf" }, "onChange": { "set": "asOf" }, "min": "2026-01-01", "max": "2026-12-31" } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open the calendar", "click": { "selector": "input" } }] }];
92
+ const __vite_glob_0_6 = {
93
+ wireName: wireName$C,
94
+ fixtures: fixtures$C
95
+ };
96
+ const wireName$B = "ComposedView";
97
+ const fixtures$B = [{ "name": "input-basket-value", "description": "A number field and a text field.", "payload": { "state": { "basketValue": 70, "note": "" }, "view": { "type": "Stack", "gap": "medium", "children": [{ "type": "Input", "label": "Basket value (€)", "inputType": "number", "value": { "$state": "basketValue" }, "onChange": { "set": "basketValue" } }, { "type": "Input", "label": "Campaign name", "placeholder": "Autumn sale", "maxLength": 40, "value": { "$state": "note" }, "onChange": { "set": "note" } }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "type a basket value", "fill": { "selector": "input[type=number]", "value": "85" } }] }];
98
+ const __vite_glob_0_7 = {
99
+ wireName: wireName$B,
100
+ fixtures: fixtures$B
101
+ };
102
+ const wireName$A = "ComposedView";
103
+ const fixtures$A = [{ "name": "radio-group-goal", "description": "Three explained choices under each other (ChatGPT's RadioGroup of the base kit).", "payload": { "state": { "goal": "calls" }, "view": { "type": "RadioGroup", "label": "What should the campaign bring?", "options": [{ "id": "calls", "label": "More calls", "description": "Phone calls from your Google profile" }, { "id": "visits", "label": "More visits", "description": "Route requests to your shop" }, { "id": "web", "label": "More website visits" }], "value": { "$state": "goal" }, "onChange": { "set": "goal" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "pick visits", "click": { "text": "More visits" } }] }, { "name": "radio-group-row", "description": "Side by side.", "payload": { "state": { "size": "M" }, "view": { "type": "RadioGroup", "direction": "row", "options": ["S", "M", "L"], "value": { "$state": "size" }, "onChange": { "set": "size" } } }, "expectedState": "data", "width": 528 }];
104
+ const __vite_glob_0_8 = {
105
+ wireName: wireName$A,
106
+ fixtures: fixtures$A
107
+ };
108
+ const wireName$z = "ComposedView";
109
+ const fixtures$z = [{ "name": "select-analytics-studio-filters", "description": "The filter card of the analytics studio: period tabs, channel select, reference date, traffic slider, comparison checkbox; the KPIs follow; Copy JSON and Reset (ChatGPT reference 52).", "payload": { "state": { "period": "7d", "channel": "all", "scale": 100, "benchmark": true, "asOf": "2026-10-25" }, "data": { "days": [{ "x": "Mon", "visitors": 980 }, { "x": "Tue", "visitors": 1120 }, { "x": "Wed", "visitors": 1040 }, { "x": "Thu", "visitors": 1260 }, { "x": "Fri", "visitors": 1130 }, { "x": "Sat", "visitors": 1460 }, { "x": "Sun", "visitors": 1210 }] }, "computed": { "channelShare": 'channel == "all" ? 1 : channel == "organic" ? 0.511 : channel == "paid" ? 0.32 : 0.169', "periodFactor": 'period == "7d" ? 1 : 4', "visitors": "round(sum(days, d => d.visitors) * channelShare * scale / 100 * periodFactor)", "comparison": 'benchmark ? round(visitors * 0.9) : "—"', "settingsJson": '"{\\"period\\":\\"" + period + "\\",\\"channel\\":\\"" + channel + "\\",\\"scale\\":" + string(scale) + ",\\"asOf\\":\\"" + asOf + "\\"}"', "channelLabel": 'channel == "all" ? "All channels" : channel == "organic" ? "Organic" : channel == "paid" ? "Paid" : "Direct"', "comparisonDetail": 'benchmark ? "90 % of the visitors" : "Comparison values are off"' }, "actions": { "copyJson": { "type": "copy", "value": { "$computed": "settingsJson" } }, "reset": { "type": "resetState" } }, "view": { "type": "Surface", "title": "Analytics Studio", "subtitle": "Interactive component test · demo data", "children": [{ "type": "Surface", "title": "Filter & state", "density": "compact", "children": [{ "type": "Tabs", "label": "Period", "options": [{ "id": "7d", "label": "7 days" }, { "id": "30d", "label": "4 weeks" }], "value": { "$state": "period" }, "onChange": { "set": "period" } }, { "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "Select", "label": "Channel", "options": [{ "id": "all", "label": "All channels" }, { "id": "organic", "label": "Organic" }, { "id": "paid", "label": "Paid" }, { "id": "direct", "label": "Direct" }], "value": { "$state": "channel" }, "onChange": { "set": "channel" } }, { "type": "DatePicker", "label": "Reference date", "value": { "$state": "asOf" }, "onChange": { "set": "asOf" } }] }, { "type": "Slider", "label": "Traffic scaling", "min": 50, "max": 150, "step": 10, "unit": "%", "value": { "$state": "scale" }, "onChange": { "set": "scale" } }, { "type": "Checkbox", "label": "Show comparison values (90 % of the visitors)", "checked": { "$state": "benchmark" }, "onChange": { "set": "benchmark" } }] }, { "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "Visitors", "value": { "$computed": "visitors" }, "format": "number", "detail": { "$computed": "channelLabel" } }, { "type": "KpiTile", "label": "Comparison", "value": { "$computed": "comparison" }, "format": "number", "detail": { "$computed": "comparisonDetail" } }] }, { "type": "Stack", "direction": "row", "gap": "small", "children": [{ "type": "Button", "label": "Copy JSON", "icon": "copy", "onClick": { "action": "copyJson" } }, { "type": "Button", "label": "Reset", "icon": "reset", "variant": "secondary", "onClick": { "action": "reset" } }] }] } }, "expectedState": "data", "width": 720, "interactions": [{ "name": "4 weeks", "click": { "text": "4 weeks" } }, { "name": "open the channel list", "click": { "selector": "[role=combobox]" } }, { "name": "pick Organic", "click": { "selector": "[role=option] >> text=Organic" } }, { "name": "clear the comparison", "click": { "text": "Show comparison values (90 % of the visitors)" } }, { "name": "reset", "click": { "text": "Reset" } }] }, { "name": "select-alone", "description": "One drop-down with a label and a placeholder, nothing picked.", "payload": { "state": { "channel": "" }, "view": { "type": "Select", "label": "Channel", "placeholder": "Pick a channel", "options": ["Organic", "Paid", "Direct"], "value": { "$state": "channel" }, "onChange": { "set": "channel" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open", "click": { "selector": "[role=combobox]" } }] }, { "name": "select-no-options", "description": "No usable choice — the drop-down renders nothing inside its card and the block reports failed. The preview sees the card (state data); the block's render report says failed.", "payload": { "view": { "type": "Surface", "title": "Filter & state", "children": [{ "type": "Select", "label": "Channel", "options": [] }] } }, "expectedState": "error", "width": 528 }];
110
+ const __vite_glob_0_9 = {
111
+ wireName: wireName$z,
112
+ fixtures: fixtures$z
113
+ };
114
+ const wireName$y = "ComposedView";
115
+ const fixtures$y = [{ "name": "slider-revenue-simulator", "description": 'The revenue simulator: three sliders recompute two KPIs live; "Copy result" copies the summary (ChatGPT reference 10).', "payload": { "state": { "visitors": 35e3, "conversionRate": 3, "basketValue": 70 }, "computed": { "orders": "round(visitors * conversionRate / 100)", "revenue": "orders * basketValue", "summary": '"Monthly revenue: " + string(revenue) + " EUR, orders: " + string(orders) + ", visitors: " + string(visitors) + ", conversion rate: " + string(conversionRate) + " %, basket value: " + string(basketValue) + " EUR"' }, "actions": { "copyResult": { "type": "copy", "value": { "$computed": "summary" } } }, "view": { "type": "Surface", "title": "Revenue Simulator", "subtitle": "E-commerce · example scenario", "children": [{ "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "Monthly revenue", "value": { "$computed": "revenue" }, "format": "currency", "currency": "EUR", "decimals": 0 }, { "type": "KpiTile", "label": "Orders", "value": { "$computed": "orders" }, "format": "number" }] }, { "type": "Divider" }, { "type": "Slider", "label": "Visitors / month", "min": 0, "max": 1e5, "step": 1e3, "value": { "$state": "visitors" }, "onChange": { "set": "visitors" } }, { "type": "Slider", "label": "Conversion rate", "min": 0.5, "max": 8, "step": 0.1, "unit": "%", "decimals": 1, "value": { "$state": "conversionRate" }, "onChange": { "set": "conversionRate" } }, { "type": "Slider", "label": "Basket value", "min": 10, "max": 200, "step": 5, "unit": "€", "value": { "$state": "basketValue" }, "onChange": { "set": "basketValue" } }, { "type": "Button", "label": "Copy result", "icon": "copy", "fullWidth": true, "onClick": { "action": "copyResult" } }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "more visitors", "click": { "selector": ".MuiSlider-thumb >> nth=0" }, "press": "ArrowRight" }, { "name": "higher conversion rate", "click": { "selector": ".MuiSlider-thumb >> nth=1" }, "press": "ArrowRight" }, { "name": "copy result", "click": { "text": "Copy result" } }] }, { "name": "slider-loading", "description": "The value is bound to a tool result that has not arrived yet — skeleton.", "payload": { "view": { "type": "Slider", "label": "Visitors / month", "min": 0, "max": { "$from": { "toolCall": "call_pending", "path": "$.max" } } } }, "expectedState": "loading", "width": 528 }, { "name": "slider-invalid-range", "description": "max is not above min — the slider renders nothing inside its card and the block reports failed. The preview sees the card (state data); the block's render report says failed.", "payload": { "view": { "type": "Surface", "title": "Revenue Simulator", "children": [{ "type": "Slider", "label": "Visitors / month", "min": 100, "max": 100 }] } }, "expectedState": "error", "width": 528 }];
116
+ const __vite_glob_0_10 = {
117
+ wireName: wireName$y,
118
+ fixtures: fixtures$y
119
+ };
120
+ const wireName$x = "ComposedView";
121
+ const fixtures$x = [{ "name": "tabs-analytics-dashboard", "description": "The nested analytics dashboard: a 7/30-day segmented control in the card header switches the KPIs, the visitor line and the channel bars (ChatGPT reference 05).", "payload": { "state": { "period": "7d" }, "data": { "week": [{ "day": "Mon", "visitors": 980 }, { "day": "Tue", "visitors": 1120 }, { "day": "Wed", "visitors": 1040 }, { "day": "Thu", "visitors": 1260 }, { "day": "Fri", "visitors": 1130 }, { "day": "Sat", "visitors": 1460 }, { "day": "Sun", "visitors": 1210 }], "month": [{ "day": "W1", "visitors": 7600 }, { "day": "W2", "visitors": 8100 }, { "day": "W3", "visitors": 8900 }, { "day": "W4", "visitors": 9500 }], "channelsWeek": [{ "channel": "Organic", "share": 54 }, { "channel": "Paid", "share": 28 }, { "channel": "Direct", "share": 18 }], "channelsMonth": [{ "channel": "Organic", "share": 51 }, { "channel": "Paid", "share": 31 }, { "channel": "Direct", "share": 18 }] }, "computed": { "plotted": 'period == "7d" ? week : month', "channels": 'period == "7d" ? channelsWeek : channelsMonth', "visitors": "sum(plotted, r => r.visitors)", "visitorsDelta": 'period == "7d" ? 12.4 : 9.1', "conversionRate": 'period == "7d" ? 4.6 : 4.3', "conversionDelta": 'period == "7d" ? 0.3 : 0.1' }, "view": { "type": "Surface", "title": "Analytics", "subtitle": "Interactive demo · example data", "slots": { "header": [{ "type": "Tabs", "options": [{ "id": "7d", "label": "7 days" }, { "id": "30d", "label": "30 days" }], "value": { "$state": "period" }, "onChange": { "set": "period" } }] }, "children": [{ "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "Visitors", "value": { "$computed": "visitors" }, "format": "number", "delta": { "$computed": "visitorsDelta" }, "deltaFormat": "percent", "higherIsBetter": true }, { "type": "KpiTile", "label": "Conversion rate", "value": { "$computed": "conversionRate" }, "format": "percent", "decimals": 1, "delta": { "$computed": "conversionDelta" }, "deltaLabel": "pp", "higherIsBetter": true }] }, { "type": "Chart", "kind": "line", "title": "Visitor trend", "data": { "$computed": "plotted" }, "x": "day", "series": [{ "field": "visitors", "label": "Visitors" }], "valueFormat": "number" }, { "type": "Chart", "kind": "bar", "horizontal": true, "title": "Channels", "caption": "Share of traffic", "data": { "$computed": "channels" }, "x": "channel", "series": [{ "field": "share", "label": "Share" }], "valueFormat": "percent" }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "switch to 30 days", "click": { "text": "30 days" } }, { "name": "back to 7 days", "click": { "text": "7 days" } }] }, { "name": "tabs-alone", "description": "One segmented control on its own, with a label and three choices (Bear / Base / Bull).", "payload": { "state": { "scenario": "base" }, "view": { "type": "Tabs", "label": "Scenario", "options": ["Bear", { "id": "base", "label": "Base" }, { "id": "bull", "label": "Bull" }], "value": { "$state": "scenario" }, "onChange": { "set": "scenario" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "pick Bull", "click": { "text": "Bull" } }] }, { "name": "tabs-loading", "description": "The choices are bound to a tool result that has not arrived yet — the control's place is a skeleton.", "payload": { "state": { "period": "7d" }, "view": { "type": "Tabs", "label": "Period", "options": { "$from": { "toolCall": "call_pending", "path": "$.periods" } }, "value": { "$state": "period" }, "onChange": { "set": "period" } } }, "expectedState": "loading", "width": 528 }, { "name": "tabs-no-options", "description": "No usable choice — the control renders nothing inside its card and the block reports failed (INVALID_PROP). The preview sees the card (state data); the block's render report says failed.", "payload": { "view": { "type": "Surface", "title": "Analytics", "children": [{ "type": "Tabs", "label": "Period", "options": [{ "description": "no label" }] }] } }, "expectedState": "error", "width": 528 }];
122
+ const __vite_glob_0_11 = {
123
+ wireName: wireName$x,
124
+ fixtures: fixtures$x
125
+ };
126
+ const wireName$w = "ComposedView";
127
+ const fixtures$w = [{ "name": "textarea-note", "description": "A multi-line field with a counter.", "payload": { "state": { "note": "Open on Sundays from 10 to 14." }, "view": { "type": "Textarea", "label": "Note for the team", "rows": 4, "maxLength": 280, "value": { "$state": "note" }, "onChange": { "set": "note" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "type", "fill": { "selector": "textarea >> visible=true", "value": "Closed on public holidays." } }] }];
128
+ const __vite_glob_0_12 = {
129
+ wireName: wireName$w,
130
+ fixtures: fixtures$w
131
+ };
132
+ const wireName$v = "ComposedView";
133
+ const fixtures$v = /* @__PURE__ */ JSON.parse(`[{"name":"layout-analytics-dashboard","description":"Reference 05: one raised Surface with title, subtitle and the period tabs in its header row, a two-column Grid of KPI tiles, a nested flat Surface with a header badge around the line chart, a Divider and the channel section (a row Stack with the label left and the caption right).","payload":{"state":{"period":"7d"},"data":{"week":[{"date":"Mo","visitors":980},{"date":"Di","visitors":1120},{"date":"Mi","visitors":1040},{"date":"Do","visitors":1260},{"date":"Fr","visitors":1130},{"date":"Sa","visitors":1460},{"date":"So","visitors":1210}],"month":[{"date":"Woche 1","visitors":6800},{"date":"Woche 2","visitors":7900},{"date":"Woche 3","visitors":8600},{"date":"Woche 4","visitors":9300}],"channels":[{"name":"Organic","share":54},{"name":"Paid","share":28},{"name":"Direct","share":18}]},"computed":{"rows":"period == \\"7d\\" ? week : month","visitors":"period == \\"7d\\" ? 8200 : 32600","visitorsDelta":"period == \\"7d\\" ? 12.4 : 9.8","conversion":"period == \\"7d\\" ? \\"4,6 %\\" : \\"4,3 %\\"","conversionDelta":"period == \\"7d\\" ? 0.3 : -0.2"},"view":{"type":"Surface","title":"Analytics","subtitle":"Interaktive Demo · Beispieldaten","slots":{"header":[{"type":"Tabs","options":[{"id":"7d","label":"7 Tage"},{"id":"30d","label":"30 Tage"}],"value":{"$state":"period"},"onChange":{"set":"period"}}]},"children":[{"type":"Grid","columns":2,"children":[{"type":"KpiTile","label":"Besucher","value":{"$computed":"visitors"},"delta":{"$computed":"visitorsDelta"},"deltaFormat":"percent"},{"type":"KpiTile","label":"Conversion Rate","value":{"$computed":"conversion"},"delta":{"$computed":"conversionDelta"},"deltaLabel":"PP"}]},{"type":"Surface","title":"Besucherentwicklung","slots":{"header":[{"type":"Badge","text":"Live-Ansicht"}]},"children":[{"type":"Chart","kind":"line","data":{"$computed":"rows"},"x":"date","series":[{"field":"visitors","label":"Besucher"}]}]},{"type":"Divider"},{"type":"Stack","gap":"small","children":[{"type":"Stack","direction":"row","justify":"between","children":[{"type":"Text","text":"Kanäle","weight":"bold"},{"type":"Caption","text":"Anteil am Traffic"}]},{"type":"Chart","kind":"bar","horizontal":true,"data":{"$data":"channels"},"x":"name","series":[{"field":"share","label":"Anteil"}],"valueFormat":"percent"}]}]}},"expectedState":"data","width":528,"interactions":[{"name":"pick 30 Tage","click":{"text":"30 Tage"}},{"name":"back to 7 Tage","click":{"text":"7 Tage"}}]},{"name":"layout-element-overview-grid","description":"Reference 11: a two-column Grid of six Surfaces, each an icon, a bold title and a muted description; drops to one column on a narrow pane.","payload":{"title":"Welche weiteren Elemente sind möglich?","view":{"type":"Grid","columns":2,"children":[{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"tag","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Produktkarten","weight":"bold"},{"type":"Text","text":"Produktfotos, Preise, Händler und Vergleiche","tone":"muted"}]}]},{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"calendar","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Kalender & Planung","weight":"bold"},{"type":"Text","text":"Datumswahl, Filter und Terminansichten","tone":"muted"}]}]},{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"directions","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Reiseplaner","weight":"bold"},{"type":"Text","text":"Routen mit mehreren Stopps auf Karten","tone":"muted"}]}]},{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"barChart","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Daten-Dashboards","weight":"bold"},{"type":"Text","text":"KPIs, Diagramme und dynamische Tabellen","tone":"muted"}]}]},{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"photo","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Medien","weight":"bold"},{"type":"Text","text":"Fotos, Galerien und verlinkte Videos","tone":"muted"}]}]},{"type":"Surface","density":"compact","children":[{"type":"Stack","direction":"row","children":[{"type":"Icon","name":"edit","tone":"muted"}]},{"type":"Stack","gap":"xsmall","children":[{"type":"Text","text":"Interaktive Oberflächen","weight":"bold"},{"type":"Text","text":"Formulare, Auswahlfelder und Aktionen","tone":"muted"}]}]}]}},"expectedState":"data","width":528},{"name":"layout-analytics-studio","description":"Reference 52 (the layout parts): the raised Surface with its header badge, a nested Surface with the 'Methodik' Popover at the end of its title row, a three-column KPI Grid, the channel Carousel (two slides visible, next arrow) repeated over a dataset with $item, and the action row Stack.","payload":{"state":{"period":"7d"},"data":{"channels":[{"name":"Organic","visitors":4190,"share":"51,1 % Anteil"},{"name":"Paid","visitors":2620,"share":"32,0 % Anteil"},{"name":"Direct","visitors":1390,"share":"16,9 % Anteil"}]},"computed":{"visitors":"period == \\"7d\\" ? 8200 : 32600","conversions":"period == \\"7d\\" ? 354 : 1402"},"actions":{"copyJson":{"type":"copy","value":{"$data":"channels"}},"reset":{"type":"resetState"}},"view":{"type":"Surface","title":"Analytics Studio","subtitle":"Interaktiver Komponenten-Test · Demo-Daten","slots":{"header":[{"type":"Badge","text":"Interaktiv","tone":"success"}]},"children":[{"type":"Surface","title":"Filter & State","slots":{"header":[{"type":"Popover","label":"Methodik","text":"Besucher werden anhand von Kanal und Skalierung berechnet. Der Benchmark beträgt 90 Prozent. Das Datum dient als Beschriftung."}]},"children":[{"type":"Tabs","label":"Zeitraum","options":[{"id":"7d","label":"7 Tage"},{"id":"4w","label":"4 Wochen"}],"value":{"$state":"period"},"onChange":{"set":"period"}}]},{"type":"Grid","columns":3,"gap":"small","children":[{"type":"KpiTile","label":"Besucher","value":{"$computed":"visitors"},"detail":"Alle Kanäle"},{"type":"KpiTile","label":"Conversions","value":{"$computed":"conversions"},"detail":"Simuliert"},{"type":"KpiTile","label":"Conversion","value":"4,32 %","detail":"Gewichtet"}]},{"type":"Stack","gap":"small","children":[{"type":"Text","text":"Kanal-Karussell","weight":"bold"},{"type":"Carousel","label":"Besucher je Kanal","visibleItems":2,"items":{"$data":"channels"},"children":[{"type":"KpiTile","label":{"$item":"name"},"value":{"$item":"visitors"},"unit":"Besucher","detail":{"$item":"share"}}]}]},{"type":"Stack","direction":"row","gap":"small","children":[{"type":"Button","label":"JSON kopieren","icon":"copy","onClick":{"action":"copyJson"}},{"type":"Spacer","grow":true},{"type":"Button","label":"Reset","icon":"reset","variant":"secondary","onClick":{"action":"reset"}}]}]}},"expectedState":"data","width":528,"interactions":[{"name":"open Methodik","click":{"text":"Methodik"}},{"name":"close Methodik","press":"Escape"},{"name":"next channel slide","click":{"selector":"button[aria-label='Show the next slides']"}},{"name":"pick 4 Wochen","click":{"text":"4 Wochen"}},{"name":"reset","click":{"text":"Reset"}}]},{"name":"layout-pressable-channel-tiles","description":"Pressable (catalog name list; tiles of reference 52 made clickable): three channel tiles in a Grid, each a Pressable that writes its channel into state; the selection ring follows a computed comparison and a Quote shows the pick.","payload":{"state":{"channel":"Organic"},"data":{"channels":[{"name":"Organic","visitors":4190,"share":"51,1 % Anteil"},{"name":"Paid","visitors":2620,"share":"32,0 % Anteil"},{"name":"Direct","visitors":1390,"share":"16,9 % Anteil"}]},"computed":{"isOrganic":"channel == \\"Organic\\"","isPaid":"channel == \\"Paid\\"","isDirect":"channel == \\"Direct\\""},"view":{"type":"Stack","children":[{"type":"Grid","columns":3,"gap":"small","children":[{"type":"Pressable","onClick":{"set":"channel"},"value":"Organic","isSelected":{"$computed":"isOrganic"},"label":"Organic auswählen","children":[{"type":"KpiTile","label":"Organic","value":4190,"unit":"Besucher","detail":"51,1 % Anteil"}]},{"type":"Pressable","onClick":{"set":"channel"},"value":"Paid","isSelected":{"$computed":"isPaid"},"label":"Paid auswählen","children":[{"type":"KpiTile","label":"Paid","value":2620,"unit":"Besucher","detail":"32,0 % Anteil"}]},{"type":"Pressable","onClick":{"set":"channel"},"value":"Direct","isSelected":{"$computed":"isDirect"},"label":"Direct auswählen","children":[{"type":"KpiTile","label":"Direct","value":1390,"unit":"Besucher","detail":"16,9 % Anteil"}]}]},{"type":"Quote","text":{"$state":"channel"},"attribution":"Ausgewählter Kanal"}]}},"expectedState":"data","width":528,"interactions":[{"name":"pick Paid","click":{"text":"Paid"}},{"name":"pick Direct","click":{"text":"Direct"}}]},{"name":"layout-quote-flow-divider","description":"Quote, Flow, Divider and Spacer (catalog name list, no screenshot): a patient review of the shared test customer as a quotation with attribution and source link, a hairline, and a Flow of topic badges that wraps on a narrow pane.","payload":{"view":{"type":"Surface","title":"Was Patienten sagen","children":[{"type":"Quote","text":"Als Angstpatientin hatte ich große Sorge vor dem Implantat. Dr. Hoffmann hat jeden Schritt erklärt, und die Wartezeit war kurz.","attribution":"Sabine K., 5 Sterne","source":{"name":"Google-Bewertungen","url":"https://www.google.com/maps/search/?api=1&query=Zahnarztpraxis+Dr.+Lena+Hoffmann+Wilhelmsh%C3%B6her+Allee+120+Kassel"}},{"type":"Divider"},{"type":"Flow","children":[{"type":"Badge","text":"Einfühlsam","tone":"success"},{"type":"Badge","text":"Kurze Wartezeit","tone":"success"},{"type":"Badge","text":"Implantate","tone":"info"},{"type":"Badge","text":"Parkplatz knapp","tone":"warning"},{"type":"Badge","text":"Prophylaxe","tone":"neutral"}]},{"type":"Spacer","size":"small"}]}},"expectedState":"data","width":528,"dataSet":"kassel-dental-practice"},{"name":"layout-carousel-loading","description":"Loading: the Carousel repeats over a $from tool result that is not stored yet — skeleton slides under the title.","payload":{"view":{"type":"Surface","title":"Kanal-Karussell","children":[{"type":"Carousel","items":{"$from":{"toolCall":"call_1","path":"$.rows"}},"children":[{"type":"KpiTile","label":{"$item":"name"},"value":{"$item":"visitors"}}]}]}},"expectedState":"loading","width":528},{"name":"layout-empty","description":"Empty: a Stack without children renders nothing and reports empty.","payload":{"view":{"type":"Stack"}},"expectedState":"empty","width":528}]`);
134
+ const __vite_glob_0_13 = {
135
+ wireName: wireName$v,
136
+ fixtures: fixtures$v
137
+ };
138
+ const wireName$u = "ComposedView";
139
+ const fixtures$u = [{ "name": "map-business-pins", "description": "Map node — three cafés with rating pins and labels, no carousel; the expand control opens the full-screen map with the list (ChatGPT 07 → 02b).", "payload": { "title": "Cafés in Münster", "view": { "type": "Map", "title": "Cafés in Münster", "points": [{ "label": "KAWENTSMANNs CAFE & TAGESBAR", "lat": 51.9632, "lng": 7.6268, "rating": 4.7, "subtitle": "Café", "detail": "Closed", "detailTone": "negative" }, { "label": "roestbar Rothenburg", "lat": 51.9594, "lng": 7.6262, "rating": 4.6, "subtitle": "Café", "detail": "Closed", "detailTone": "negative" }, { "label": "1648 CAFÉ | LOUNGE | GASTRONOMIE", "lat": 51.9606, "lng": 7.629, "rating": 3.9, "subtitle": "Restaurant", "detail": "Closed", "detailTone": "negative" }], "carousel": "hidden", "minHeight": 420 } }, "expectedState": "data", "width": 720, "interactions": [{ "name": "open-full-screen", "click": { "selector": "[data-testid=map-expand]" } }] }, { "name": "map-business-location", "description": "Map node — five restaurants with photo cards in the bottom carousel; a card click selects the point and opens its entity detail panel (ChatGPT 42, 21, 21b).", "payload": { "actions": { "openRestaurant1": { "type": "openEntity", "ref": "call_maps_1:business:0", "entity": { "entityType": "business", "entityId": "301", "agentSpaceId": 7 } }, "openRestaurant2": { "type": "openEntity", "ref": "call_maps_1:business:1", "entity": { "entityType": "business", "entityId": "302", "agentSpaceId": 7 } }, "openRestaurant3": { "type": "openEntity", "ref": "call_maps_1:business:2", "entity": { "entityType": "business", "entityId": "303", "agentSpaceId": 7 } }, "openRestaurant4": { "type": "openEntity", "ref": "call_maps_1:business:3", "entity": { "entityType": "business", "entityId": "304", "agentSpaceId": 7 } }, "openRestaurant5": { "type": "openEntity", "ref": "call_maps_1:business:4", "entity": { "entityType": "business", "entityId": "305", "agentSpaceId": 7 } } }, "view": { "type": "Map", "title": "Restaurants in Münster's old town", "points": [{ "label": "Kleiner Kiepenkerl", "lat": 51.9631, "lng": 7.6264, "rating": 4.3, "subtitle": "Restaurant", "detail": "Closed", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjN2EzYjJlIi8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiNjOWEyN2UiLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjYzlhMjdlIi8+PC9zdmc+", "action": "openRestaurant1", "detailTone": "negative" }, { "label": "Großer Kiepenkerl Gasthaus", "lat": 51.9636, "lng": 7.6255, "rating": 4.2, "subtitle": "Restaurant", "detail": "Closed", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjNWI0NjM2Ii8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiNkOGMzYTUiLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjZDhjM2E1Ii8+PC9zdmc+", "action": "openRestaurant2", "detailTone": "negative" }, { "label": "Altes Gasthaus Leve", "lat": 51.9617, "lng": 7.6311, "rating": 4.3, "subtitle": "Restaurant", "detail": "Closed", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjM2U0YTNkIi8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiNiNWEzNmIiLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjYjVhMzZiIi8+PC9zdmc+", "action": "openRestaurant3", "detailTone": "negative" }, { "label": "Gasthaus Stuhlmacher", "lat": 51.9619, "lng": 7.6283, "rating": 4.1, "subtitle": "Restaurant", "detail": "Closed", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjNGEzYjUyIi8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiNjN2IzZDEiLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjYzdiM2QxIi8+PC9zdmc+", "action": "openRestaurant4", "detailTone": "negative" }, { "label": "Mocca d'or", "lat": 51.9603, "lng": 7.6266, "rating": 3.6, "subtitle": "Restaurant", "detail": "Closed", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjMmYzZDRmIi8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiM5ZmI0YzciLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjOWZiNGM3Ii8+PC9zdmc+", "action": "openRestaurant5", "detailTone": "negative" }], "minHeight": 330 }, "title": "Business location map — five restaurants in Münster" }, "expectedState": "data", "width": 720, "interactions": [{ "name": "select-first-card", "click": { "selector": "[data-testid=map-point-card]" } }, { "name": "open-full-screen", "click": { "selector": "[data-testid=map-expand]" } }] }, { "name": "map-route", "description": "Map node — a route Münster → Köln: the travel-mode badge, the road line, numbered stops, the duration chip, the two stop cards and the distance / usual drive time tiles under the map (ChatGPT 40).", "payload": { "title": "Route Münster → Köln", "view": { "type": "Stack", "gap": "medium", "children": [{ "type": "Stack", "direction": "row", "gap": "small", "align": "center", "children": [{ "type": "Badge", "text": "Car trip" }, { "type": "Text", "text": "Münster to Köln", "tone": "muted" }] }, { "type": "Map", "title": "Münster → Köln", "points": [{ "label": "48143 Münster, Nordrhein-Westfalen", "lat": 51.9607, "lng": 7.6261, "subtitle": "Start here" }, { "label": "Köln", "lat": 50.9375, "lng": 6.9603, "subtitle": "Car ~1 h 36 min", "detail": "Visitor center", "image": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCI+PHJlY3Qgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0IiBmaWxsPSIjNGI1ZDZiIi8+PHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI0OCIgaGVpZ2h0PSIyNiIgcng9IjQiIGZpbGw9IiNjNGNjZDMiLz48Y2lyY2xlIGN4PSI0NiIgY3k9IjE4IiByPSI4IiBmaWxsPSIjYzRjY2QzIi8+PC9zdmc+" }], "route": true, "routePath": [{ "lat": 51.9607, "lng": 7.6261 }, { "lat": 51.8336, "lng": 7.5838 }, { "lat": 51.6597, "lng": 7.5072 }, { "lat": 51.5136, "lng": 7.4653 }, { "lat": 51.3946, "lng": 7.329 }, { "lat": 51.2562, "lng": 7.1508 }, { "lat": 51.0936, "lng": 7.0305 }, { "lat": 50.9375, "lng": 6.9603 }], "routeLabel": "1.6 hours", "minHeight": 350 }, { "type": "Grid", "columns": 2, "gap": "small", "children": [{ "type": "KpiTile", "label": "Route length (ADAC)", "value": 152, "format": "number", "unit": "km", "detail": "approx.", "source": "adac.de" }, { "type": "KpiTile", "label": "Usual drive time", "value": "1 h 47 min", "detail": "without traffic jams", "source": "adac.de" }] }] } }, "expectedState": "data", "width": 720, "interactions": [{ "name": "select-destination", "click": { "selector": "[data-testid=map-point-card][data-point-key=point-1]" } }] }, { "name": "map-empty", "description": "Map node without points — one muted line, the block reports empty.", "payload": { "view": { "type": "Map", "points": [] } }, "expectedState": "empty", "width": 528 }, { "name": "map-loading", "description": "Map node whose points wait for a tool result ($from pending) — the frame-shaped skeleton.", "payload": { "view": { "type": "Map", "points": { "$from": { "toolCall": "call_maps_1", "path": "$.rows", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }];
140
+ const __vite_glob_0_14 = {
141
+ wireName: wireName$u,
142
+ fixtures: fixtures$u
143
+ };
144
+ const wireName$t = "ComposedView";
145
+ const fixtures$t = [{ "name": "image-group-grid", "description": "The Cologne Cathedral gallery of ChatGPT (44): four tiles (two per row at the chat width — the 220px tile floor of the design checklist), the last one counting the hidden pictures; a tile opens the lightbox (Storybook — the preview page mounts no modal root).", "payload": { "title": "Kölner Dom", "view": { "type": "ImageGroup", "images": [{ "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/a/a1/K%C3%B6lner_Dom_nachts_2013.jpg/960px-K%C3%B6lner_Dom_nachts_2013.jpg", "alt": "Cologne Cathedral lit up at night", "title": "Außenfassade bei Nacht", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/9/9f/Dom_%28Deutzer_Br%C3%BCcke%29.jpg/960px-Dom_%28Deutzer_Br%C3%BCcke%29.jpg", "alt": "Cologne Cathedral seen from the Deutz bridge over the Rhine", "title": "Blick von der Deutzer Brücke", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/4/46/K%C3%B6lner_Dom_-_Westfassade-1091.jpg/960px-K%C3%B6lner_Dom_-_Westfassade-1091.jpg", "alt": "The west front of Cologne Cathedral with its two spires", "title": "Westfassade", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/7/76/2025-06-10-Dom_Burgmauer-3409.jpg/960px-2025-06-10-Dom_Burgmauer-3409.jpg", "alt": "Cologne Cathedral above the old city wall", "title": "Dom und Burgmauer", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5a/M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg", "alt": "The Historic Town Hall on the Prinzipalmarkt in Münster", "title": "Historisches Rathaus", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/9/91/M%C3%BCnster%2C_Prinzipalmarkt%2C_Arkaden_--_2021_--_8931-3.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Arkaden_--_2021_--_8931-3.jpg", "alt": "The arcades of the Prinzipalmarkt in Münster", "title": "Arkaden am Prinzipalmarkt", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/a/a2/M%C3%BCnster%2C_Prinzipalmarkt%2C_Historisches_Rathaus%2C_Giebel_--_2021_--_9481.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Historisches_Rathaus%2C_Giebel_--_2021_--_9481.jpg", "alt": "The gable of the Historic Town Hall in Münster", "title": "Rathausgiebel", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }], "layout": "grid", "maxVisible": 4, "aspectRatio": "4:3" } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "open the lightbox", "click": { "selector": 'button[aria-label^="Open the picture"]' } }] }, { "name": "image-group-carousel", "description": "The photo carousel of ChatGPT (09): one large picture with its text, previous / next and the position.", "payload": { "title": "Fotogalerien und Bilder-Karussells", "view": { "type": "ImageGroup", "layout": "carousel", "images": [{ "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5a/M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg", "alt": "The Historic Town Hall and the Stadtweinhaus on the Prinzipalmarkt in Münster", "title": "Historisches Rathaus", "caption": "Gotische Architektur am Prinzipalmarkt", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/9/91/M%C3%BCnster%2C_Prinzipalmarkt%2C_Arkaden_--_2021_--_8931-3.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Arkaden_--_2021_--_8931-3.jpg", "alt": "The arcades of the Prinzipalmarkt in Münster", "title": "Arkaden am Prinzipalmarkt", "caption": "Die Bogengänge der Kaufmannshäuser", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/a/a2/M%C3%BCnster%2C_Prinzipalmarkt%2C_Historisches_Rathaus%2C_Giebel_--_2021_--_9481.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Historisches_Rathaus%2C_Giebel_--_2021_--_9481.jpg", "alt": "The gable of the Historic Town Hall in Münster", "title": "Rathausgiebel", "caption": "Der Schaugiebel von 1395", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "next picture", "click": { "selector": 'button[aria-label="Next picture"]' } }, { "name": "next picture again", "click": { "selector": 'button[aria-label="Next picture"]' } }, { "name": "previous picture", "click": { "selector": 'button[aria-label="Previous picture"]' } }] }, { "name": "image-group-magazine", "description": "The NASA magazine layout of ChatGPT (15): one hero over two tiles, each with title, caption and source chip.", "payload": { "title": "NASA-Fotogalerie im Magazin-Layout", "view": { "type": "ImageGroup", "layout": "magazine", "images": [{ "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/4/44/NASA%E2%80%99s_Webb_Reveals_Cosmic_Cliffs%2C_Glittering_Landscape_of_Star_Birth.jpg/960px-NASA%E2%80%99s_Webb_Reveals_Cosmic_Cliffs%2C_Glittering_Landscape_of_Star_Birth.jpg", "alt": "The Cosmic Cliffs in the Carina Nebula, imaged by the James Webb Space Telescope", "title": "Cosmic Cliffs – Carinanebel", "caption": "Sternentstehungsregion in ungefähr 7.600 Lichtjahren Entfernung.", "source": { "name": "NASA Science", "url": "https://science.nasa.gov" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/f/f1/Pillars_of_Creation_%28NIRCam_Image%29.jpg/960px-Pillars_of_Creation_%28NIRCam_Image%29.jpg", "alt": "The Pillars of Creation in the Eagle Nebula, NIRCam image", "title": "Pillars of Creation", "caption": "Adlernebel · ESA/Webb", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }, { "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/2/29/Southern_Ring_Nebula_%28NIRCam_Image%29.png/960px-Southern_Ring_Nebula_%28NIRCam_Image%29.png", "alt": "The Southern Ring planetary nebula, NIRCam image", "title": "Southern Ring", "caption": "Planetarischer Nebel · NASA", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" } }] } }, "expectedState": "data", "width": 528 }, { "name": "image-group-loading", "description": "The pictures are bound to a pending tool result: skeleton tiles in the tiles' shape.", "payload": { "view": { "type": "ImageGroup", "images": { "$from": { "toolCall": "call_preview_1", "path": "$.images[*]", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "image-group-empty", "description": "A gallery without pictures: one muted line, reported empty NO_DATA.", "payload": { "view": { "type": "ImageGroup", "images": [] } }, "expectedState": "empty", "width": 528 }];
146
+ const __vite_glob_0_15 = {
147
+ wireName: wireName$t,
148
+ fixtures: fixtures$t
149
+ };
150
+ const wireName$s = "ComposedView";
151
+ const fixtures$s = [{ "name": "image-photo", "description": "One real photo with title, caption and source chip — the hero of the ChatGPT photo gallery (09).", "payload": { "title": "Fotos aus Münster", "view": { "type": "Image", "src": "https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5a/M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg", "alt": "The Historic Town Hall and the Stadtweinhaus on the Prinzipalmarkt in Münster", "title": "Historisches Rathaus", "caption": "Gotische Architektur am Prinzipalmarkt", "source": { "name": "commons.wikimedia.org", "url": "https://commons.wikimedia.org" }, "aspectRatio": "4:3" } }, "expectedState": "data", "width": 528 }, { "name": "image-loading", "description": "The picture is bound to a tool result that is still pending: the frame as a skeleton.", "payload": { "view": { "type": "Image", "src": { "$from": { "toolCall": "call_preview_1", "path": "$.image.url", "state": "pending" } }, "alt": "A pending photo" } }, "expectedState": "loading", "width": 528 }, { "name": "image-broken", "description": "The picture does not load: the frame shows the alt text and the node reports failed RENDER_FAILED.", "payload": { "view": { "type": "Image", "src": "https://upload.wikimedia.org/wikipedia/commons/0/00/This_file_does_not_exist.jpg", "alt": "The Historic Town Hall on the Prinzipalmarkt in Münster", "title": "Historisches Rathaus", "caption": "Gotische Architektur am Prinzipalmarkt" } }, "expectedState": "error", "expectedFailedRequests": ["This_file_does_not_exist.jpg"], "width": 528 }];
152
+ const __vite_glob_0_16 = {
153
+ wireName: wireName$s,
154
+ fixtures: fixtures$s
155
+ };
156
+ const wireName$r = "ComposedView";
157
+ const fixtures$r = [{ "name": "youtube-video-cards", "description": "What searchYouTubeVideos dictates for two results (ChatGPT 45, the Münster walking tour): a two-column grid of VideoCards with thumbnail, length chip, title, channel · views · date and the watch link; play swaps in the embed.", "payload": { "view": { "type": "Grid", "columns": 2, "minColumnWidth": "regular", "children": [{ "type": "VideoCard", "title": "Münster, Germany 4k Walking Tour | Explore the Charming Streets & Landmarks", "videoId": "x5-yoDUoz5k", "thumbnail": "https://i.ytimg.com/vi/x5-yoDUoz5k/hqdefault.jpg", "durationSeconds": 1418, "channel": "Duslin Travels", "viewCount": 18234, "publishedAt": "2025-02-08" }, { "type": "VideoCard", "title": "Münster Walking Tour Germany | Spring Sunny day Walk in Münster | 4K HDR 60fps", "videoId": "QZRHqiz_oH4", "thumbnail": "https://i.ytimg.com/vi/QZRHqiz_oH4/hqdefault.jpg", "durationSeconds": 3725, "channel": "Walking Germany", "viewCount": 1284e3, "publishedAt": "2024-05-19" }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "play the first video in place", "click": { "selector": 'button[aria-label^="Play the video Münster, Germany"]' } }] }, { "name": "youtube-video-card-single", "description": "One search result: the VideoCard at the root of the tree — the shape of a one-video answer.", "payload": { "view": { "type": "VideoCard", "title": "Münster, Germany 4k Walking Tour | Explore the Charming Streets & Landmarks", "videoId": "x5-yoDUoz5k", "thumbnail": "https://i.ytimg.com/vi/x5-yoDUoz5k/hqdefault.jpg", "durationSeconds": 1418, "channel": "Duslin Travels", "viewCount": 18234, "publishedAt": "2025-02-08" } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "play in place", "click": { "selector": 'button[aria-label^="Play the video"]' } }] }, { "name": "youtube-video-card-without-details", "description": "A result whose detail read failed: no length and no views, the thumbnail taken from the videoId — the card still plays.", "payload": { "view": { "type": "VideoCard", "title": "Münster, Germany 4k Walking Tour", "videoId": "x5-yoDUoz5k", "channel": "Duslin Travels", "publishedAt": "2025-02-08" } }, "expectedState": "data", "width": 528 }, { "name": "youtube-video-card-loading", "description": "The card bound to a pending tool result: the card-shaped skeleton.", "payload": { "view": { "type": "VideoCard", "title": "Pending video", "videoId": { "$from": { "toolCall": "call_preview_youtube", "path": "$.videos[0].videoId", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "youtube-video-card-unplayable", "description": "A card whose videoId is no YouTube id: it shows its title only and reports failed.", "payload": { "view": { "type": "VideoCard", "title": "A tour without a playable video", "videoId": "not a video id!" } }, "expectedState": "error", "width": 528 }];
158
+ const __vite_glob_0_17 = {
159
+ wireName: wireName$r,
160
+ fixtures: fixtures$r
161
+ };
162
+ const wireName$q = "ComposedView";
163
+ const fixtures$q = [{ "name": "video-youtube", "description": "The YouTube walking tour of ChatGPT (45): a connector video with its derived thumbnail, length, channel and the watch link; play swaps in the embed.", "payload": { "title": "Video – YouTube-Stadtrundgang Münster", "view": { "type": "Video", "title": "Münster, Germany 4k Walking Tour | Explore the Charming Streets & Landmarks", "videoId": "x5-yoDUoz5k", "durationSeconds": 1418, "channel": "Duslin Travels", "source": { "name": "YouTube", "url": "https://www.youtube.com" } } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "play in place", "click": { "selector": 'button[aria-label^="Play the video"]' } }] }, { "name": "video-link", "description": "A video with a plain url and its own thumbnail: play opens the watch page in a new tab.", "payload": { "view": { "type": "Video", "title": "Münster in 4K — a summer evening", "url": "https://www.youtube.com/watch?v=x5-yoDUoz5k", "thumbnail": "https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5a/M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg/960px-M%C3%BCnster%2C_Prinzipalmarkt%2C_Stadtweinhaus_und_Rathaus_--_2023_--_7969-73.jpg", "durationSeconds": 734, "channel": "City Walks" } }, "expectedState": "data", "width": 528 }, { "name": "video-loading", "description": "The video is bound to a pending tool result: the 16:9 frame as a skeleton.", "payload": { "view": { "type": "Video", "title": "Pending video", "videoId": { "$from": { "toolCall": "call_preview_1", "path": "$.videos[0].videoId", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }];
164
+ const __vite_glob_0_18 = {
165
+ wireName: wireName$q,
166
+ fixtures: fixtures$q
167
+ };
168
+ const wireName$p = "ComposedView";
169
+ const fixtures$p = [{ "name": "code-php", "description": "ChatGPT reference 49, the code block: language header, copy and wrap controls, highlighted PHP. The copy button is driven by the spec (_Code.spec.tsx): a headless browser grants no clipboard, so the click changes nothing the preview can wait for.", "payload": { "view": { "type": "Code", "code": "<?php\n\ndeclare(strict_types=1);\n\nfunction conversionRate(\n int $conversions,\n int $visitors\n): float {\n return $visitors > 0\n ? ($conversions / $visitors) * 100.0\n : 0.0;\n}\n\necho conversionRate(750, 25000); // 3", "language": "php" } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "wrap lines", "click": { "text": "Wrap lines" } }] }, { "name": "code-long", "description": "Long code (40 lines) collapses to 24 lines behind 'Show all 40 lines'.", "payload": { "view": { "type": "Code", "code": "echo 'line 1';\necho 'line 2';\necho 'line 3';\necho 'line 4';\necho 'line 5';\necho 'line 6';\necho 'line 7';\necho 'line 8';\necho 'line 9';\necho 'line 10';\necho 'line 11';\necho 'line 12';\necho 'line 13';\necho 'line 14';\necho 'line 15';\necho 'line 16';\necho 'line 17';\necho 'line 18';\necho 'line 19';\necho 'line 20';\necho 'line 21';\necho 'line 22';\necho 'line 23';\necho 'line 24';\necho 'line 25';\necho 'line 26';\necho 'line 27';\necho 'line 28';\necho 'line 29';\necho 'line 30';\necho 'line 31';\necho 'line 32';\necho 'line 33';\necho 'line 34';\necho 'line 35';\necho 'line 36';\necho 'line 37';\necho 'line 38';\necho 'line 39';\necho 'line 40';", "language": "php", "title": "loop.php" } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "show all lines", "click": { "text": "Show all 40 lines" } }] }, { "name": "code-unknown-language", "description": "A language without a grammar stays plain text under its written name.", "payload": { "view": { "type": "Code", "code": "IDENTIFICATION DIVISION.\nPROGRAM-ID. HELLO.", "language": "COBOL" } }, "expectedState": "data", "width": 528 }, { "name": "code-empty", "description": "Empty state: empty code renders nothing and reports empty.", "payload": { "view": { "type": "Code", "code": "" } }, "expectedState": "empty", "width": 528 }, { "name": "code-loading", "description": "Loading state: the code is bound to a pending tool result — the skeleton shows.", "payload": { "view": { "type": "Code", "language": "php", "code": { "$from": { "toolCall": "call_code_1", "path": "$.code", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "code-narrow", "description": "The PHP block at the narrow width: the header controls wrap, long lines scroll.", "payload": { "view": { "type": "Code", "code": "<?php\n\ndeclare(strict_types=1);\n\nfunction conversionRate(\n int $conversions,\n int $visitors\n): float {\n return $visitors > 0\n ? ($conversions / $visitors) * 100.0\n : 0.0;\n}\n\necho conversionRate(750, 25000); // 3", "language": "php" } }, "expectedState": "data", "width": 360 }];
170
+ const __vite_glob_0_19 = {
171
+ wireName: wireName$p,
172
+ fixtures: fixtures$p
173
+ };
174
+ const wireName$o = "ComposedView";
175
+ const fixtures$o = [{ "name": "diagram-widget-lifecycle", "description": "ChatGPT reference 48: the widget life cycle as a Mermaid flowchart (top to bottom, one decision with Ja / Nein branches that join again).", "payload": { "view": { "type": "Diagram", "title": "Mermaid-Diagramm – Widget-Lebenszyklus", "caption": "Hier wird aus einer textuellen Diagrammbeschreibung direkt eine Flowchart-Vorschau.", "source": "flowchart TD\n A[User-Anfrage] --> B[Widget-Suche]\n B --> C{Passendes Widget?}\n C -- Ja --> D[Widget auswählen]\n C -- Nein --> E[UI-Bausteine kombinieren]\n D --> F[Datenquelle abfragen]\n E --> F\n F --> G[Daten validieren]\n G --> H[Darstellung erzeugen]\n H --> I[Interaktion im Chat]" } }, "expectedState": "data", "width": 528 }, { "name": "diagram-sequence", "description": "A second diagram type (sequence) — the reference shows a flowchart only.", "payload": { "view": { "type": "Diagram", "title": "Report e-mail", "source": "sequenceDiagram\n participant Agent\n participant Worker\n Agent->>Worker: Queue the report\n Worker-->>Agent: Delivered" } }, "expectedState": "data", "width": 528 }, { "name": "diagram-invalid-source", "description": "Error state: Mermaid cannot read the source — one muted line shows (observed as data), the node reports failed RENDER_FAILED with Mermaid's parse message.", "payload": { "view": { "type": "Diagram", "title": "Widget-Lebenszyklus", "source": "flowchart TD\n A[User-Anfrage] -->\n B -- -- C" } }, "expectedState": "error", "width": 528 }, { "name": "diagram-empty", "description": "Empty state: an empty source renders nothing and reports empty.", "payload": { "view": { "type": "Diagram", "source": "" } }, "expectedState": "empty", "width": 528 }, { "name": "diagram-loading", "description": "Loading state: the source is bound to a pending tool result — the skeleton shows.", "payload": { "view": { "type": "Diagram", "title": "Widget-Lebenszyklus", "source": { "$from": { "toolCall": "call_diagram_1", "path": "$.source", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "diagram-narrow", "description": "The flowchart at the narrow width: it scales down to the box.", "payload": { "view": { "type": "Diagram", "title": "Widget-Lebenszyklus", "source": "flowchart TD\n A[User-Anfrage] --> B[Widget-Suche]\n B --> C{Passendes Widget?}\n C -- Ja --> D[Widget auswählen]\n C -- Nein --> E[UI-Bausteine kombinieren]\n D --> F[Datenquelle abfragen]\n E --> F\n F --> G[Daten validieren]\n G --> H[Darstellung erzeugen]\n H --> I[Interaktion im Chat]" } }, "expectedState": "data", "width": 360 }];
176
+ const __vite_glob_0_20 = {
177
+ wireName: wireName$o,
178
+ fixtures: fixtures$o
179
+ };
180
+ const wireName$n = "ComposedView";
181
+ const fixtures$n = [{ "name": "math-conversion-rate", "description": "ChatGPT reference 49, the formula block alone (Math node only): heading, LaTeX badge, the formula, the worked example under a hairline.", "payload": { "view": { "type": "Math", "title": "Conversion Rate", "latex": "CR = \\frac{N_{\\text{Conversions}}}{N_{\\text{Visitors}}} \\times 100\\%", "caption": "Beispiel: 750 Conversions bei 25.000 Besuchern ergeben 3 %." } }, "expectedState": "data", "width": 528 }, { "name": "math-and-code-composition", "description": "ChatGPT reference 49 in full: the formula card (Surface with a LaTeX badge, two Math nodes, the example line), the sentence, then the PHP Code block — composed with the layout and text components of lanes L1/L2.", "payload": { "view": { "type": "Stack", "direction": "column", "gap": "medium", "children": [{ "type": "Surface", "title": "Conversion Rate", "slots": { "header": [{ "type": "Badge", "text": "LaTeX" }] }, "children": [{ "type": "Math", "latex": "CR = \\frac{N_{\\text{Conversions}}}{N_{\\text{Visitors}}} \\times 100\\%" }, { "type": "Divider" }, { "type": "Text", "text": "Beispiel: 750 Conversions bei 25.000 Besuchern ergeben 3 %.", "tone": "muted" }, { "type": "Math", "latex": "CR = \\frac{750}{25\\,000} \\times 100\\% = 3\\%" }] }, { "type": "Text", "text": "Das gleiche als PHP 8 mit strenger Typisierung:" }, { "type": "Code", "code": "<?php\n\ndeclare(strict_types=1);\n\nfunction conversionRate(\n int $conversions,\n int $visitors\n): float {\n return $visitors > 0\n ? ($conversions / $visitors) * 100.0\n : 0.0;\n}\n\necho conversionRate(750, 25000); // 3", "language": "php" }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "wrap lines", "click": { "text": "Wrap lines" } }] }, { "name": "math-inline", "description": "An inline formula (display inline) — the ChatGPT reference shows block formulas only; this covers the inline rendering.", "payload": { "view": { "type": "Math", "latex": "E = mc^2", "display": "inline" } }, "expectedState": "data", "width": 528 }, { "name": "math-invalid-latex", "description": "Error state: LaTeX KaTeX cannot read — the source and one muted line show (observed as data), the node reports failed RENDER_FAILED.", "payload": { "view": { "type": "Math", "title": "Conversion Rate", "latex": "CR = \\frac{N_{Conversions}{N_{Visitors}}" } }, "expectedState": "error", "width": 528 }, { "name": "math-empty", "description": "Empty state: an empty formula renders nothing and reports empty.", "payload": { "view": { "type": "Math", "latex": "" } }, "expectedState": "empty", "width": 528 }, { "name": "math-loading", "description": "Loading state: the formula is bound to a tool result that has not arrived yet ($from pending) — the skeleton shows.", "payload": { "view": { "type": "Math", "title": "Conversion Rate", "latex": { "$from": { "toolCall": "call_math_1", "path": "$.formula", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "math-narrow", "description": "The formula block at the narrow width.", "payload": { "view": { "type": "Math", "title": "Conversion Rate", "latex": "CR = \\frac{N_{\\text{Conversions}}}{N_{\\text{Visitors}}} \\times 100\\%", "caption": "Beispiel: 750 Conversions bei 25.000 Besuchern ergeben 3 %." } }, "expectedState": "data", "width": 360 }];
182
+ const __vite_glob_0_21 = {
183
+ wireName: wireName$n,
184
+ fixtures: fixtures$n
185
+ };
186
+ const wireName$m = "ComposedView";
187
+ const fixtures$m = [{ "name": "svg-radar", "description": "ChatGPT reference 14, the radar graphic alone (Svg node only, static markup): heading, caption, the five-axis polygon over its grid.", "payload": { "view": { "type": "Svg", "title": "Marketing Performance Radar", "caption": "Interaktives Fünf-Achsen-Profil · Demo", "label": "Radar: SEO 76, Content 62, Ads 48, Social 86, Email 70 of 100", "markup": "<svg viewBox='0 0 200 200'><g fill='none' stroke='currentColor' stroke-opacity='0.2'><polygon points='100.0,20.0 176.1,75.3 147.0,164.7 53.0,164.7 23.9,75.3'/><polygon points='100.0,40.0 157.1,81.5 135.3,148.5 64.7,148.5 42.9,81.5'/><polygon points='100.0,60.0 138.0,87.6 123.5,132.4 76.5,132.4 62.0,87.6'/><polygon points='100.0,80.0 119.0,93.8 111.8,116.2 88.2,116.2 81.0,93.8'/><line x1='100' y1='100' x2='100.0' y2='20.0'/><line x1='100' y1='100' x2='176.1' y2='75.3'/><line x1='100' y1='100' x2='147.0' y2='164.7'/><line x1='100' y1='100' x2='53.0' y2='164.7'/><line x1='100' y1='100' x2='23.9' y2='75.3'/></g><polygon points='100.0,39.2 147.2,84.7 122.6,131.1 59.6,155.7 46.7,82.7' fill='#4a90d9' fill-opacity='0.22' stroke='#4a90d9' stroke-width='2' stroke-linejoin='round'/><g fill='#4a90d9'><circle r='3.5' cx='100.0' cy='39.2'/><circle r='3.5' cx='147.2' cy='84.7'/><circle r='3.5' cx='122.6' cy='131.1'/><circle r='3.5' cx='59.6' cy='155.7'/><circle r='3.5' cx='46.7' cy='82.7'/></g></svg>" } }, "expectedState": "data", "width": 528 }, { "name": "svg-radar-sliders", "description": "ChatGPT reference 14 in full: the radar drawn from a computed SVG text over five state values, with one Slider (lane L5) per axis inside a Surface (lane L1) — moving a slider reshapes the polygon.", "payload": { "state": { "seo": 76, "content": 62, "ads": 48, "social": 86, "email": 70 }, "data": { "axes": [{ "key": "seo", "label": "SEO", "dx": 0, "dy": -1 }, { "key": "content", "label": "Content", "dx": 0.9511, "dy": -0.309 }, { "key": "ads", "label": "Ads", "dx": 0.5878, "dy": 0.809 }, { "key": "social", "label": "Social", "dx": -0.5878, "dy": 0.809 }, { "key": "email", "label": "Email", "dx": -0.9511, "dy": -0.309 }] }, "computed": { "values": "[seo, content, ads, social, email]", "shape": "join(map(axes, (a, i) => fixed(100 + a.dx * 0.8 * values[i], 1) + ',' + fixed(100 + a.dy * 0.8 * values[i], 1)), ' ')", "grid": `join(map([1, 0.75, 0.5, 0.25], s => "<polygon points='" + join(map(axes, a => fixed(100 + a.dx * 80 * s, 1) + ',' + fixed(100 + a.dy * 80 * s, 1)), ' ') + "'/>"), '')`, "spokes": `join(map(axes, a => "<line x1='100' y1='100' x2='" + fixed(100 + a.dx * 80, 1) + "' y2='" + fixed(100 + a.dy * 80, 1) + "'/>"), '')`, "dots": `join(map(axes, (a, i) => "<circle r='3.5' cx='" + fixed(100 + a.dx * 0.8 * values[i], 1) + "' cy='" + fixed(100 + a.dy * 0.8 * values[i], 1) + "'/>"), '')`, "radar": `"<svg viewBox='0 0 200 200'><g fill='none' stroke='currentColor' stroke-opacity='0.2'>" + grid + spokes + "</g><polygon points='" + shape + "' fill='#4a90d9' fill-opacity='0.22' stroke='#4a90d9' stroke-width='2' stroke-linejoin='round'/><g fill='#4a90d9'>" + dots + "</g></svg>"` }, "view": { "type": "Surface", "title": "Marketing Performance Radar", "subtitle": "Interaktives Fünf-Achsen-Profil · Demo", "children": [{ "type": "Svg", "label": "Marketing performance radar over SEO, Content, Ads, Social and Email", "markup": { "$computed": "radar" } }, { "type": "Stack", "direction": "column", "gap": "medium", "children": [{ "type": "Slider", "label": "SEO", "min": 0, "max": 100, "step": 1, "unit": "/100", "showValue": true, "value": { "$state": "seo" }, "onChange": { "set": "seo" } }, { "type": "Slider", "label": "Content", "min": 0, "max": 100, "step": 1, "unit": "/100", "showValue": true, "value": { "$state": "content" }, "onChange": { "set": "content" } }, { "type": "Slider", "label": "Ads", "min": 0, "max": 100, "step": 1, "unit": "/100", "showValue": true, "value": { "$state": "ads" }, "onChange": { "set": "ads" } }, { "type": "Slider", "label": "Social", "min": 0, "max": 100, "step": 1, "unit": "/100", "showValue": true, "value": { "$state": "social" }, "onChange": { "set": "social" } }, { "type": "Slider", "label": "Email", "min": 0, "max": 100, "step": 1, "unit": "/100", "showValue": true, "value": { "$state": "email" }, "onChange": { "set": "email" } }] }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "move the SEO slider to the middle", "click": { "selector": "[class*='MuiSlider-root']" } }, { "name": "raise SEO by one step", "press": "ArrowRight" }] }, { "name": "svg-unsafe-parts", "description": "Error state: the markup carries a script, an onload handler and an outside image — they are removed, the rest is drawn (observed as data), the node reports failed INVALID_PROP.", "payload": { "view": { "type": "Svg", "title": "Sanitised graphic", "markup": "<svg viewBox='0 0 100 100' onload='alert(1)'><script>alert(1)<\/script><image href='https://example.com/x.png' width='100' height='100'/><circle cx='50' cy='50' r='40' fill='#4a90d9'/></svg>" } }, "expectedState": "error", "width": 528 }, { "name": "svg-empty", "description": "Empty state: empty markup renders nothing and reports empty.", "payload": { "view": { "type": "Svg", "markup": "" } }, "expectedState": "empty", "width": 528 }, { "name": "svg-loading", "description": "Loading state: the markup is bound to a pending tool result — the skeleton shows.", "payload": { "view": { "type": "Svg", "title": "Marketing Performance Radar", "markup": { "$from": { "toolCall": "call_svg_1", "path": "$.markup", "state": "pending" } } } }, "expectedState": "loading", "width": 528 }, { "name": "svg-narrow", "description": "The radar at the narrow width.", "payload": { "view": { "type": "Svg", "title": "Marketing Performance Radar", "caption": "Interaktives Fünf-Achsen-Profil · Demo", "markup": "<svg viewBox='0 0 200 200'><g fill='none' stroke='currentColor' stroke-opacity='0.2'><polygon points='100.0,20.0 176.1,75.3 147.0,164.7 53.0,164.7 23.9,75.3'/><polygon points='100.0,40.0 157.1,81.5 135.3,148.5 64.7,148.5 42.9,81.5'/><polygon points='100.0,60.0 138.0,87.6 123.5,132.4 76.5,132.4 62.0,87.6'/><polygon points='100.0,80.0 119.0,93.8 111.8,116.2 88.2,116.2 81.0,93.8'/><line x1='100' y1='100' x2='100.0' y2='20.0'/><line x1='100' y1='100' x2='176.1' y2='75.3'/><line x1='100' y1='100' x2='147.0' y2='164.7'/><line x1='100' y1='100' x2='53.0' y2='164.7'/><line x1='100' y1='100' x2='23.9' y2='75.3'/></g><polygon points='100.0,39.2 147.2,84.7 122.6,131.1 59.6,155.7 46.7,82.7' fill='#4a90d9' fill-opacity='0.22' stroke='#4a90d9' stroke-width='2' stroke-linejoin='round'/><g fill='#4a90d9'><circle r='3.5' cx='100.0' cy='39.2'/><circle r='3.5' cx='147.2' cy='84.7'/><circle r='3.5' cx='122.6' cy='131.1'/><circle r='3.5' cx='59.6' cy='155.7'/><circle r='3.5' cx='46.7' cy='82.7'/></g></svg>" } }, "expectedState": "data", "width": 360 }];
188
+ const __vite_glob_0_22 = {
189
+ wireName: wireName$m,
190
+ fixtures: fixtures$m
191
+ };
192
+ const wireName$l = "ComposedView";
193
+ const fixtures$l = [{ "name": "text-badge-tones", "description": "One Badge per tone, the status chips of screenshot 52 (Live) and the majority verdicts of 04.", "payload": { "view": { "type": "Stack", "direction": "row", "gap": "small", "children": [{ "type": "Badge", "text": "Mehrheit", "tone": "success" }, { "type": "Badge", "text": "Knapp", "tone": "warning" }, { "type": "Badge", "text": "Keine Mehrheit", "tone": "danger" }, { "type": "Badge", "text": "Live", "tone": "info" }, { "type": "Badge", "text": "Modelliert" }] } }, "expectedState": "data", "width": 528 }];
194
+ const __vite_glob_0_23 = {
195
+ wireName: wireName$l,
196
+ fixtures: fixtures$l
197
+ };
198
+ const wireName$k = "ComposedView";
199
+ const fixtures$k = [{ "name": "text-caption-under-value", "description": "A Caption as the sub-line of a value and as a method note (the KPI caption role of screenshot 52).", "payload": { "view": { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Label", "text": "Besucher" }, { "type": "Title", "text": "7.420" }, { "type": "Caption", "text": "Letzte 7 Tage · errechnet aus Organic + Paid + Direct" }] } }, "expectedState": "data", "width": 360 }];
200
+ const __vite_glob_0_24 = {
201
+ wireName: wireName$k,
202
+ fixtures: fixtures$k
203
+ };
204
+ const wireName$j = "ComposedView";
205
+ const fixtures$j = [{ "name": "text-favicon-sources", "description": "Site icons in front of source names (screenshot 46): by page url, by bare domain, and a url that names no site (glyph).", "payload": { "view": { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Stack", "direction": "row", "gap": "xsmall", "align": "center", "children": [{ "type": "Favicon", "url": "https://www1.wdr.de/nachrichten", "name": "WDR" }, { "type": "Caption", "text": "WDR · 23. Oktober 2026" }] }, { "type": "Stack", "direction": "row", "gap": "xsmall", "align": "center", "children": [{ "type": "Favicon", "url": "antenne-muenster.de", "name": "Antenne Münster" }, { "type": "Caption", "text": "Antenne Münster · 24. Oktober 2026" }] }, { "type": "Stack", "direction": "row", "gap": "xsmall", "align": "center", "children": [{ "type": "Favicon", "url": "kein-link" }, { "type": "Caption", "text": "unbekannte Quelle" }] }] } }, "expectedState": "error", "width": 528 }];
206
+ const __vite_glob_0_25 = {
207
+ wireName: wireName$j,
208
+ fixtures: fixtures$j
209
+ };
210
+ const wireName$i = "ComposedView";
211
+ const fixtures$i = [{ "name": "text-labels-over-values", "description": "Labels above values in a row, the filter labels of screenshot 52 (Zeitraum, Kanal).", "payload": { "view": { "type": "Stack", "direction": "row", "gap": "large", "children": [{ "type": "Stack", "gap": "xsmall", "children": [{ "type": "Label", "text": "Zeitraum" }, { "type": "Text", "text": "7 Tage" }] }, { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Label", "text": "Kanal" }, { "type": "Text", "text": "Alle Kanäle" }] }] } }, "expectedState": "data", "width": 528 }];
212
+ const __vite_glob_0_26 = {
213
+ wireName: wireName$i,
214
+ fixtures: fixtures$i
215
+ };
216
+ const wireName$h = "ComposedView";
217
+ const fixtures$h = [{ "name": "text-follow-up-links", "description": "Screenshot 50 rebuilt with what a ComposedView may do: Title, Text, a Label and three Links that open pages in a new tab. The follow-up pills that ISSUE A NEW CHAT TURN are deliberately not part of the kit — model-written pills stay QuickReplies / SuggestedActions.", "payload": { "view": { "type": "Stack", "gap": "small", "children": [{ "type": "Title", "text": "10. Follow-up-Vorschläge – klickbare Folgefragen" }, { "type": "Text", "text": "Ein kleines, aber praktisches Element: Du kannst eine vorgeschlagene Seite anklicken, um direkt weiterzulesen." }, { "type": "Surface", "title": "Weitere Widget-Demos ausprobieren", "children": [{ "type": "Stack", "gap": "xsmall", "children": [{ "type": "Link", "text": "3D-Sonnensystem", "url": "https://science.nasa.gov/solar-system/" }, { "type": "Link", "text": "SaaS-Dashboard", "url": "https://developers.openai.com/apps-sdk" }, { "type": "Link", "text": "Routenplaner", "url": "https://www.google.com/maps/dir/M%C3%BCnster/K%C3%B6ln" }] }] }, { "type": "Text", "text": "Hier sind außerdem native Folgefrage-Elemente:" }, { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Link", "text": "Interaktives 3D-Sonnensystem zeigen", "url": "https://science.nasa.gov/solar-system/" }, { "type": "Link", "text": "Weitere Widget-Typen vergleichen", "url": "https://developers.openai.com/apps-sdk" }, { "type": "Link", "text": "Reisedashboard demonstrieren", "url": "https://www.muenster.de/tourismus.html" }] }] } }, "expectedState": "data", "width": 720 }, { "name": "text-link-unsafe-url", "description": "A Link whose url is javascript: — the text shows without a link (the node reports failed INVALID_PROP).", "payload": { "view": { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Link", "text": "Artikel öffnen", "url": "https://www.antenne-muenster.de/" }, { "type": "Link", "text": "Kein Link (javascript:)", "url": "javascript:alert(1)" }] } }, "expectedState": "error", "width": 528 }];
218
+ const __vite_glob_0_27 = {
219
+ wireName: wireName$h,
220
+ fixtures: fixtures$h
221
+ };
222
+ const wireName$g = "ComposedView";
223
+ const fixtures$g = [{ "name": "text-markdown-coalition", "description": "Screenshot 04 as one Markdown node: heading, paragraph, a table with ✓/✗, a source link.", "payload": { "view": { "type": "Markdown", "markdown": "## Rechnerische Koalitionsmöglichkeiten\n\nAuf Grundlage der GMS-Umfrage vom 19. Oktober 2026 ergibt sich bei modellierten 180 Sitzen folgende Verteilung:\n\n| Koalition | Sitze | Mehrheit (91) |\n|---|---:|---|\n| CSU + Freie Wähler | 94 | ✓ |\n| CSU + Grüne | 104 | ✓ |\n| CSU + SPD | 86 | ✗ |\n\nQuelle: [wahlrecht.de](https://www.wahlrecht.de/umfragen/landtage/bayern.htm)" } }, "expectedState": "data", "width": 720 }, { "name": "text-markdown-safe-subset", "description": "Raw HTML, an image and a javascript: link in model Markdown: none reach the DOM, the link keeps its text.", "payload": { "view": { "type": "Markdown", "markdown": "**Fett**, *kursiv* und `Code`.\n\n<script>alert(1)<\/script><b>HTML</b> ![Pixel](https://example.org/p.png)\n\n- [WDR](https://www1.wdr.de) öffnet in einem neuen Tab\n- [böse](javascript:alert(1)) bleibt Text\n\n> Ein Zitat." } }, "expectedState": "data", "width": 528 }];
224
+ const __vite_glob_0_28 = {
225
+ wireName: wireName$g,
226
+ fixtures: fixtures$g
227
+ };
228
+ const wireName$f = "ComposedView";
229
+ const fixtures$f = [{ "name": "text-source-ref-news", "description": "Screenshot 46's source line in a regular slot: every source with favicon and link.", "payload": { "view": { "type": "SourceRef", "sources": [{ "name": "WDR", "url": "https://www1.wdr.de/nachrichten/westfalen-lippe/index.html" }, { "name": "Antenne Münster", "url": "https://www.antenne-muenster.de/" }, { "name": "Westfälische Nachrichten", "url": "https://www.wn.de/muenster" }] } }, "expectedState": "data", "width": 720 }, { "name": "text-source-ref-licensed-image", "description": "An image source with author and licence (the attribution line lane L22 fills from Wikimedia Commons).", "payload": { "view": { "type": "SourceRef", "sources": [{ "name": "Wikimedia Commons", "url": "https://commons.wikimedia.org/wiki/File:Cologne_Cathedral.jpg", "title": "Kölner Dom, Westfassade", "author": "Raimond Spekking", "license": "CC BY-SA 4.0", "licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/" }] } }, "expectedState": "data", "width": 528 }];
230
+ const __vite_glob_0_29 = {
231
+ wireName: wireName$f,
232
+ fixtures: fixtures$f
233
+ };
234
+ const wireName$e = "ComposedView";
235
+ const fixtures$e = [{ "name": "text-paragraph-with-source-chip", "description": "Screenshot 46's source line: a muted paragraph that ends in a compact SourceRef chip (WDR +2) which unfolds the full list.", "payload": { "view": { "type": "Text", "text": "Quellen: WDR, Antenne Münster und Westfälische Nachrichten.", "tone": "muted", "children": [{ "type": "SourceRef", "sources": [{ "name": "WDR", "url": "https://www1.wdr.de/nachrichten/westfalen-lippe/index.html" }, { "name": "Antenne Münster", "url": "https://www.antenne-muenster.de/" }, { "name": "Westfälische Nachrichten", "url": "https://www.wn.de/muenster" }] }] } }, "expectedState": "data", "width": 720, "interactions": [{ "name": "unfold-sources", "click": { "selector": "button[aria-expanded]" } }] }, { "name": "text-tones-and-clamp", "description": "The text roles (default, muted, success, danger, bold) and a long paragraph clamped at two lines, the full text on hover and behind Show more.", "payload": { "view": { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Text", "text": "Lärm oder Lebensader? In rund drei Jahren rollen wieder Züge zwischen Münster und Sendenhorst.", "weight": "bold" }, { "type": "Text", "text": "Die Reaktivierung der Bahnstrecke Münster–Sendenhorst nimmt konkrete Formen an. Dafür wurden Fördermittel zugesagt, und die Planung für die Haltepunkte in Wolbeck und Angelmodde läuft bereits seit dem Frühjahr; erste Bauarbeiten sind für das kommende Jahr angekündigt.", "tone": "muted", "maxLines": 2 }, { "type": "Text", "text": "Mehrheit: 104 von 180 Sitzen", "tone": "success" }, { "type": "Text", "text": "Keine Mehrheit: 86 von 180 Sitzen", "tone": "danger" }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "show the whole text", "click": { "selector": "button[aria-expanded='false']" } }, { "name": "clamp it again", "click": { "selector": "button[aria-expanded='true']" } }] }, { "name": "text-markup-shown-as-written", "description": "Model text with HTML-looking markup and an ampersand shows as written (Vanguard Text would otherwise parse it).", "payload": { "view": { "type": "Text", "text": 'A & B <span style="color:red">rot</span> <b>nicht fett</b>' } }, "expectedState": "data", "width": 528 }];
236
+ const __vite_glob_0_30 = {
237
+ wireName: wireName$e,
238
+ fixtures: fixtures$e
239
+ };
240
+ const wireName$d = "ComposedView";
241
+ const fixtures$d = [{ "name": "text-coalition-table", "description": "Screenshot 04 rebuilt: Title, intro Text, a Table with check/cross icons in the majority column (L1 Stack, L3 Table/Icon) and a SourceRef line.", "payload": { "view": { "type": "Stack", "gap": "small", "children": [{ "type": "Title", "text": "Rechnerische Koalitionsmöglichkeiten" }, { "type": "Text", "text": "Auf Grundlage der GMS-Umfrage vom 19. Oktober 2026 ergibt sich bei modellierten 180 Sitzen folgende Verteilung:" }, { "type": "Table", "children": [{ "type": "TableRow", "header": true, "children": [{ "type": "TableCell", "value": "Koalition", "format": "text" }, { "type": "TableCell", "value": "Sitze", "format": "text", "align": "end" }, { "type": "TableCell", "value": "Mehrheit (91)", "format": "text" }] }, { "type": "TableRow", "children": [{ "type": "TableCell", "value": "CSU + Freie Wähler", "format": "text" }, { "type": "TableCell", "value": 94, "align": "end" }, { "type": "TableCell", "children": [{ "type": "Icon", "name": "check", "tone": "success", "label": "Mehrheit" }] }] }, { "type": "TableRow", "children": [{ "type": "TableCell", "value": "CSU + Grüne", "format": "text" }, { "type": "TableCell", "value": 104, "align": "end" }, { "type": "TableCell", "children": [{ "type": "Icon", "name": "check", "tone": "success", "label": "Mehrheit" }] }] }, { "type": "TableRow", "children": [{ "type": "TableCell", "value": "CSU + SPD", "format": "text" }, { "type": "TableCell", "value": 86, "align": "end" }, { "type": "TableCell", "children": [{ "type": "Icon", "name": "close", "tone": "danger", "label": "Keine Mehrheit" }] }] }] }, { "type": "SourceRef", "sources": [{ "name": "GMS-Umfrage, 19. Oktober 2026", "url": "https://www.wahlrecht.de/umfragen/landtage/bayern.htm" }] }] } }, "expectedState": "data", "width": 720 }, { "name": "text-title-levels", "description": "A widget title over a section title with its Caption sub-line.", "payload": { "view": { "type": "Stack", "gap": "xsmall", "children": [{ "type": "Title", "text": "Rechnerische Koalitionsmöglichkeiten" }, { "type": "Caption", "text": "Modelliert: 180 Sitze, Mehrheit ab 91" }, { "type": "Title", "text": "CSU + Grüne", "level": "section" }, { "type": "Text", "text": "104 Sitze – die größte rechnerische Mehrheit." }] } }, "expectedState": "data", "width": 528 }];
242
+ const __vite_glob_0_31 = {
243
+ wireName: wireName$d,
244
+ fixtures: fixtures$d
245
+ };
246
+ const wireName$c = "ComposedView";
247
+ const fixtures$c = [{ "name": "video-card", "description": "One stub component: a single Video node (the core declares its schema, lane L4 builds its component) — the ChatGPT video reference.", "payload": { "view": { "type": "Video", "title": "Münster walking tour — old town and Prinzipalmarkt", "videoId": "x5-yoDUoz5k", "thumbnail": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiA5Ij48cmVjdCB3aWR0aD0iMTYiIGhlaWdodD0iOSIgZmlsbD0iIzQ0NTU2NiIvPjxwb2x5Z29uIHBvaW50cz0iNiwyIDYsNyAxMSw0LjUiIGZpbGw9IiNmZmYiLz48L3N2Zz4=", "durationSeconds": 1418, "channel": "Walking Germany" } }, "stubComposedViewComponents": true, "expectedState": "data", "width": 528 }, { "name": "tree", "description": "A ComposedView tree with state, inline rows, a computed value and a Video root rendered through the preview stub — the richest tree the core can render before the lanes ship their layout and data components.", "payload": { "title": "Videos about Münster", "state": { "period": "7d" }, "data": { "rows": [{ "x": "Mo", "visits": 980 }, { "x": "Di", "visits": 1120 }] }, "computed": { "total": "sum(rows, r => r.visits)" }, "view": { "type": "Video", "title": "Münster in 4K — a summer evening", "url": "https://www.youtube.com/watch?v=x5-yoDUoz5k", "durationSeconds": 734, "channel": "City Walks", "source": { "name": "YouTube", "url": "https://www.youtube.com" } } }, "stubComposedViewComponents": true, "expectedState": "data", "width": 528 }, { "name": "kit-example", "description": "The kit's taught example (ComposedViewKitSpec::JSON_FENCE_SPEC, round 10 K1) with its two $from bindings resolved: Tabs switch a computed between the two datasets, a Repeat of TableRows shows each channel with a sparkline over its own days.", "payload": { "title": "Visits per channel", "state": { "period": "7d" }, "data": { "d7": { "$from": { "toolCall": "call_7", "path": "$.rows[*]", "state": "resolved", "value": [{ "channel": "Google Search", "days": [{ "day": "Mon", "visits": 120 }, { "day": "Tue", "visits": 130 }, { "day": "Wed", "visits": 139 }, { "day": "Thu", "visits": 149 }, { "day": "Fri", "visits": 158 }, { "day": "Sat", "visits": 168 }, { "day": "Sun", "visits": 178 }] }, { "channel": "Google Maps", "days": [{ "day": "Mon", "visits": 80 }, { "day": "Tue", "visits": 86 }, { "day": "Wed", "visits": 93 }, { "day": "Thu", "visits": 99 }, { "day": "Fri", "visits": 106 }, { "day": "Sat", "visits": 112 }, { "day": "Sun", "visits": 118 }] }, { "channel": "Direct", "days": [{ "day": "Mon", "visits": 40 }, { "day": "Tue", "visits": 43 }, { "day": "Wed", "visits": 46 }, { "day": "Thu", "visits": 50 }, { "day": "Fri", "visits": 53 }, { "day": "Sat", "visits": 56 }, { "day": "Sun", "visits": 59 }] }], "rowCount": 3, "resolvedAt": "2026-10-26T09:00:00Z" } }, "d30": { "$from": { "toolCall": "call_8", "path": "$.rows[*]", "state": "resolved", "value": [{ "channel": "Google Search", "days": [{ "day": "Mon", "visits": 504 }, { "day": "Tue", "visits": 544 }, { "day": "Wed", "visits": 585 }, { "day": "Thu", "visits": 625 }, { "day": "Fri", "visits": 665 }, { "day": "Sat", "visits": 706 }, { "day": "Sun", "visits": 746 }] }, { "channel": "Google Maps", "days": [{ "day": "Mon", "visits": 336 }, { "day": "Tue", "visits": 363 }, { "day": "Wed", "visits": 390 }, { "day": "Thu", "visits": 417 }, { "day": "Fri", "visits": 444 }, { "day": "Sat", "visits": 470 }, { "day": "Sun", "visits": 497 }] }, { "channel": "Direct", "days": [{ "day": "Mon", "visits": 168 }, { "day": "Tue", "visits": 181 }, { "day": "Wed", "visits": 195 }, { "day": "Thu", "visits": 208 }, { "day": "Fri", "visits": 222 }, { "day": "Sat", "visits": 235 }, { "day": "Sun", "visits": 249 }] }], "rowCount": 3, "resolvedAt": "2026-10-26T09:00:00Z" } } }, "computed": { "rows": "period == '7d' ? d7 : d30" }, "view": { "type": "Stack", "children": [{ "type": "Tabs", "options": [{ "id": "7d", "label": "7 days" }, { "id": "30d", "label": "30 days" }], "value": { "$state": "period" }, "onChange": { "set": "period" } }, { "type": "Table", "source": { "name": "getVisits" }, "children": [{ "type": "Repeat", "items": { "$computed": "rows" }, "children": [{ "type": "TableRow", "children": [{ "type": "TableCell", "value": { "$item": "channel" } }, { "type": "TableCell", "children": [{ "type": "Chart", "kind": "line", "data": { "$item": "days" }, "x": "day", "series": [{ "field": "visits", "label": "Visits" }] }] }] }] }] }] } }, "expectedState": "data", "width": 528, "interactions": [{ "name": "switch to 30 days", "click": { "text": "30 days" } }] }];
248
+ const __vite_glob_0_32 = {
249
+ wireName: wireName$c,
250
+ fixtures: fixtures$c
251
+ };
252
+ const wireName$b = "Clock";
253
+ const fixtures$b = [{ "name": "default", "description": "One clock — the time in Münster for an owner in Berlin (ChatGPT ClockWidget, ref 36): digital and analog time, place with zone abbreviation, today with +0 h.", "payload": { "clocks": [{ "timeZone": "Europe/Berlin", "label": "Münster, Deutschland" }] }, "settings": { "location": { "location": { "timezone": "Europe/Berlin" } } }, "locale": "de", "expectedState": "data", "width": 528 }, { "name": "world-clock", "description": "The world clock of ref 37 — Berlin, New York, Tokio for an owner in Berlin: one row per place, yesterday / today with the hour difference.", "payload": { "title": "Berlin, New York, Tokio", "clocks": [{ "timeZone": "Europe/Berlin", "label": "Berlin, Deutschland" }, { "timeZone": "America/New_York", "label": "New York, NY, USA" }, { "timeZone": "Asia/Tokyo", "label": "Tokio, Japan" }] }, "settings": { "location": { "location": { "timezone": "Europe/Berlin" } } }, "locale": "de", "expectedState": "data", "width": 528 }, { "name": "world-clock-12h", "description": "The same world clock in 12-hour format for an English-speaking owner in New York, ChatGPT's own field names (tz_name, location) as a weak model would copy them.", "payload": { "time_format": "12h", "zones": [{ "tz_name": "America/New_York", "location": "New York, NY, USA", "tz_alias": "EDT" }, { "tz_name": "Asia/Kolkata", "location": "Bengaluru, India" }, { "tz_name": "Australia/Sydney", "location": "Sydney, Australia" }] }, "settings": { "location": { "location": { "timezone": "America/New_York" } } }, "locale": "en", "expectedState": "data", "width": 528 }, { "name": "unknown-zone", "description": "One valid and one unknown zone id: the unknown one is dropped and reported (failed INVALID_PROP), the valid clock still renders.", "payload": { "clocks": [{ "timeZone": "Asia/Tokyo", "label": "Tokio, Japan" }, { "timeZone": "JST", "label": "Osaka" }] }, "settings": { "location": { "location": { "timezone": "Europe/Berlin" } } }, "locale": "de", "expectedState": "error", "width": 528 }, { "name": "all-unknown", "description": "Only unknown zone ids: one muted line, reported failed.", "payload": { "clocks": [{ "timeZone": "Mars/Olympus_Mons", "label": "Olympus Mons" }] }, "locale": "de", "expectedState": "error", "width": 528 }, { "name": "empty", "description": "A block without any clock: one muted line, reported empty.", "payload": { "clocks": [] }, "locale": "de", "expectedState": "empty", "width": 528 }];
254
+ const __vite_glob_0_33 = {
255
+ wireName: wireName$b,
256
+ fixtures: fixtures$b
257
+ };
258
+ const wireName$a = "ConceptExplainer";
259
+ const fixtures$a = [{ "name": "unknown-type", "description": "A type id no explainer type registers (ChatGPT's MOON_PHASES): one muted line, reported failed INVALID_PROP with the known types.", "payload": { "explainer": "MOON_PHASES" }, "locale": "en", "expectedState": "error", "width": 528 }, { "name": "empty", "description": "A block that names no explainer: one muted line, reported empty.", "payload": {}, "locale": "en", "expectedState": "empty", "width": 528 }];
260
+ const __vite_glob_0_34 = {
261
+ wireName: wireName$a,
262
+ fixtures: fixtures$a
263
+ };
264
+ const wireName$9 = "ConversationSearchResults";
265
+ const fixtures$9 = [{ "name": "render-report-empty", "description": "No group with a readable hit reports empty NO_DATA.", "payload": { "query": "opening hours", "groups": [] }, "expectedState": "empty", "width": 528 }, { "name": "default", "description": 'The owner asked "Was hatten wir zu den Prophylaxe-Wochen besprochen?": three earlier chats of the practice match and render inline.', "dataSet": "kassel-dental-practice", "payload": { "query": "Prophylaxe-Wochen", "title": "Frühere Chats zur Prophylaxe", "groups": [{ "conversationId": 84102, "title": "Prophylaxe-Wochen im November planen", "summary": "Ablauf und Posts für die Prophylaxe-Aktion im November abgestimmt.", "created": "2026-10-24 16:05:00", "updated": "2026-10-24 16:05:00", "hits": [{ "role": "USER", "excerpt": "Wir wollen im November Prophylaxe-Wochen machen mit einem Aktionsangebot für die professionelle Zahnreinigung. Kannst du dazu Posts für Instagram und Facebook planen?", "messageId": 912301, "indexInConversation": 0, "created": "2026-10-24 15:48:00" }, { "role": "ASSISTANT", "excerpt": "Gern: drei Posts – Ankündigung am 29. Oktober, eine Erinnerung zur Monatsmitte und ein Team-Post mit ZFA Miriam zur professionellen Zahnreinigung.", "messageId": 912305, "indexInConversation": 2, "created": "2026-10-24 15:52:00" }] }, { "conversationId": 83560, "title": "Antwort auf die 2-Sterne-Bewertung", "summary": "Antwort auf die Bewertung zur Wartezeit nach der Prophylaxe-Sitzung formuliert.", "created": "2026-10-12 10:31:00", "updated": "2026-10-12 10:31:00", "hits": [{ "role": "USER", "excerpt": "Die neue 2-Sterne-Bewertung beschwert sich über 40 Minuten Wartezeit bei der Prophylaxe. Wie antworten wir am besten?", "messageId": 905118, "indexInConversation": 0, "created": "2026-10-12 10:20:00" }] }, { "conversationId": 82944, "title": "Leistungsseite Prophylaxe überarbeiten", "summary": "Texte der Website-Seite Prophylaxe und die Keyword-Auswahl besprochen.", "created": "2026-09-30 14:02:00", "updated": "2026-09-30 14:02:00", "hits": [{ "role": "ASSISTANT", "excerpt": 'Für "professionelle zahnreinigung kassel" steht die Praxis seit Wochen auf Position 9 – ein eigener Abschnitt zu Ablauf und Kosten der Prophylaxe auf der Seite kann helfen.', "messageId": 899407, "indexInConversation": 4, "created": "2026-09-30 13:55:00" }] }] }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528 }];
266
+ const __vite_glob_0_35 = {
267
+ wireName: wireName$9,
268
+ fixtures: fixtures$9
269
+ };
270
+ const wireName$8 = "CurrencyConverter";
271
+ const fixtures$8 = [{ "name": "default", "description": "100 GBP to USD at the rate of 25 October 2026 — the approved design's reference conversion; the amount is edited and the currencies swapped.", "payload": { "fromCurrency": "GBP", "toCurrency": "USD", "amount": 100, "rate": 1.31842, "rateDate": "2026-10-25" }, "locale": "en", "expectedState": "data", "width": 528, "interactions": [{ "name": "edit-amount", "fill": { "selector": "[data-testid='currency-converter-amount'] input", "value": "250" } }, { "name": "swap", "click": { "selector": "[data-testid='currency-converter-swap']" } }] }, { "name": "english-large-amount", "description": "A large GBP amount in JPY (a currency without decimals), in English formatting, to check grouping and the fit of a long hero number.", "payload": { "fromCurrency": "GBP", "toCurrency": "JPY", "amount": 125e4, "rate": 201.3846, "rateDate": "2026-09-30" }, "locale": "en", "expectedState": "data", "width": 528 }, { "name": "german", "description": "The reference conversion in German: currency names, grouping and decimal marks and the date follow the UI language.", "payload": { "fromCurrency": "GBP", "toCurrency": "USD", "amount": 100, "rate": 1.31842, "rateDate": "2026-10-25" }, "locale": "de", "expectedState": "data", "width": 528 }, { "name": "invalid", "description": "A block without a rate: the widget renders nothing and reports failed (INVALID_PROP).", "payload": { "fromCurrency": "GBP", "toCurrency": "USD", "amount": 100 }, "expectedState": "error", "width": 528 }];
272
+ const __vite_glob_0_36 = {
273
+ wireName: wireName$8,
274
+ fixtures: fixtures$8
275
+ };
276
+ const wireName$7 = "CustomVisualization";
277
+ const fixtures$7 = /* @__PURE__ */ JSON.parse(`[{"name":"solar-system","description":"The ChatGPT custom visualization (53): the Solar System Explorer — a canvas 3D projection of six planets with speed, tilt and zoom sliders, a pause button and drag-to-rotate, all in the model's own HTML/CSS/JS inside the sandbox frame.","payload":{"title":"Solar System Explorer","description":"Interaktive 3D-Projektion · Illustrative Maßstäbe","html":"<div class=\\"explorer\\">\\n <span class=\\"count-badge\\" id=\\"count-badge\\"></span>\\n <canvas id=\\"orbits\\" aria-label=\\"Planet orbits\\"></canvas>\\n <div class=\\"controls\\">\\n <label>Geschwindigkeit<input id=\\"speed\\" type=\\"range\\" min=\\"0\\" max=\\"3\\" step=\\"0.1\\" value=\\"1\\"></label>\\n <label>Neigung<input id=\\"tilt\\" type=\\"range\\" min=\\"0\\" max=\\"80\\" step=\\"1\\" value=\\"53\\"></label>\\n <label>Zoom<input id=\\"zoom\\" type=\\"range\\" min=\\"0.5\\" max=\\"1.6\\" step=\\"0.05\\" value=\\"1\\"></label>\\n <button id=\\"pause\\" type=\\"button\\">Pause</button>\\n </div>\\n <p class=\\"hint\\">Mit der Maus ziehen: Perspektive drehen · Regler verändern die Animation</p>\\n</div>","css":".explorer{position:relative;background:#0b1020;border-radius:12px;overflow:hidden;color:#cbd8f2}\\n.count-badge{position:absolute;top:12px;right:12px;padding:4px 12px;border-radius:999px;background:rgba(203,216,242,.12);font-size:12px}\\ncanvas{display:block;width:100%;aspect-ratio:16/10;cursor:grab}\\ncanvas.dragging{cursor:grabbing}\\n.controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr)) auto;gap:12px;align-items:end;padding:12px 16px;background:#121a30}\\n.controls label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:#9fb0d0}\\n.controls input{width:100%;accent-color:#7ea6ff}\\n.controls button{padding:8px 16px;border-radius:8px;border:0;background:#2a3d6b;color:#fff;font:inherit;cursor:pointer}\\n.hint{margin:0;padding:8px 16px 12px;font-size:12px;color:#7d8bab;text-align:center;background:#121a30}\\n@media (max-width:420px){.controls{grid-template-columns:1fr 1fr}.controls button{grid-column:span 2}}","script":"var bodies = window.AGENTS_VISUALIZATION.data.bodies;\\nvar canvas = document.getElementById(\\"orbits\\");\\nvar context = canvas.getContext(\\"2d\\");\\nvar stars = [];\\nfor (var starIndex = 0; starIndex < 140; starIndex++) stars.push({ x: Math.random(), y: Math.random(), size: Math.random() * 1.2 + 0.2 });\\ndocument.getElementById(\\"count-badge\\").textContent = bodies.length + \\" Planeten\\";\\nvar state = { time: 0, yaw: 0.35, tilt: 53 * Math.PI / 180, zoom: 1, speed: 1, running: true, last: 0 };\\nvar resize = function () {\\n var ratio = window.devicePixelRatio || 1;\\n canvas.width = canvas.clientWidth * ratio;\\n canvas.height = canvas.clientHeight * ratio;\\n context.setTransform(ratio, 0, 0, ratio, 0, 0);\\n};\\nvar project = function (x, z) {\\n var width = canvas.clientWidth, height = canvas.clientHeight;\\n var scale = Math.min(width / 520, height / 470) * state.zoom;\\n var xr = x * Math.cos(state.yaw) - z * Math.sin(state.yaw);\\n var zr = x * Math.sin(state.yaw) + z * Math.cos(state.yaw);\\n var yr = -zr * Math.sin(state.tilt);\\n var depth = zr * Math.cos(state.tilt);\\n var perspective = 900 / (900 + depth * 0.45);\\n return { x: width / 2 + xr * scale * perspective, y: height / 2 + yr * scale * perspective, depth: depth, k: perspective * scale };\\n};\\nvar drawOrbit = function (radius) {\\n context.beginPath();\\n for (var step = 0; step <= 160; step++) {\\n var angle = step / 160 * Math.PI * 2;\\n var point = project(radius * Math.cos(angle), radius * Math.sin(angle));\\n if (step === 0) context.moveTo(point.x, point.y); else context.lineTo(point.x, point.y);\\n }\\n context.strokeStyle = \\"rgba(124,152,203,.29)\\";\\n context.lineWidth = 1;\\n context.stroke();\\n};\\nvar drawBody = function (body) {\\n var radius = Math.max(2, body.size * body.point.k);\\n var shade = context.createRadialGradient(body.point.x - radius * 0.4, body.point.y - radius * 0.4, 0.5, body.point.x, body.point.y, radius * 1.3);\\n shade.addColorStop(0, \\"#ffffff\\");\\n shade.addColorStop(0.23, body.color);\\n shade.addColorStop(1, \\"#172239\\");\\n context.fillStyle = shade;\\n context.beginPath();\\n context.arc(body.point.x, body.point.y, radius, 0, Math.PI * 2);\\n context.fill();\\n if (body.rings) {\\n context.beginPath();\\n context.ellipse(body.point.x, body.point.y, radius * 1.8, radius * 0.52, -0.28, 0, Math.PI * 2);\\n context.strokeStyle = \\"rgba(235,210,160,.75)\\";\\n context.lineWidth = 2;\\n context.stroke();\\n }\\n context.font = \\"12px system-ui, sans-serif\\";\\n context.textAlign = \\"center\\";\\n context.fillStyle = \\"#cbd8f2\\";\\n context.fillText(body.name, body.point.x, body.point.y + radius + 15);\\n};\\nvar draw = function (now) {\\n if (!state.last) state.last = now;\\n if (state.running) state.time += (now - state.last) / 1000 * state.speed;\\n state.last = now;\\n var width = canvas.clientWidth, height = canvas.clientHeight;\\n context.clearRect(0, 0, width, height);\\n stars.forEach(function (star) { context.fillStyle = \\"rgba(203,216,242,.5)\\"; context.fillRect(star.x * width, star.y * height, star.size, star.size); });\\n bodies.forEach(function (body) { drawOrbit(body.orbitRadius); });\\n var sun = project(0, 0);\\n var glow = context.createRadialGradient(sun.x, sun.y, 2, sun.x, sun.y, 34 * state.zoom);\\n glow.addColorStop(0, \\"rgba(255,220,140,1)\\");\\n glow.addColorStop(0.35, \\"rgba(255,180,80,.55)\\");\\n glow.addColorStop(1, \\"rgba(255,150,50,0)\\");\\n context.fillStyle = glow;\\n context.beginPath();\\n context.arc(sun.x, sun.y, 34 * state.zoom, 0, Math.PI * 2);\\n context.fill();\\n var placed = bodies.map(function (body) {\\n var angle = state.time * body.speed * 0.6 + body.phase;\\n return { name: body.name, size: body.size, color: body.color, rings: body.rings, point: project(body.orbitRadius * Math.cos(angle), body.orbitRadius * Math.sin(angle)) };\\n });\\n placed.sort(function (first, second) { return second.point.depth - first.point.depth; }).forEach(drawBody);\\n window.requestAnimationFrame(draw);\\n};\\ndocument.getElementById(\\"speed\\").addEventListener(\\"input\\", function (event) { state.speed = Number(event.target.value); });\\ndocument.getElementById(\\"tilt\\").addEventListener(\\"input\\", function (event) { state.tilt = Number(event.target.value) * Math.PI / 180; });\\ndocument.getElementById(\\"zoom\\").addEventListener(\\"input\\", function (event) { state.zoom = Number(event.target.value); });\\nvar pauseButton = document.getElementById(\\"pause\\");\\npauseButton.addEventListener(\\"click\\", function () { state.running = !state.running; pauseButton.textContent = state.running ? \\"Pause\\" : \\"Weiter\\"; });\\nvar dragStartX = null;\\ncanvas.addEventListener(\\"pointerdown\\", function (event) { dragStartX = event.clientX; canvas.classList.add(\\"dragging\\"); canvas.setPointerCapture(event.pointerId); });\\ncanvas.addEventListener(\\"pointermove\\", function (event) { if (dragStartX === null) return; state.yaw += (event.clientX - dragStartX) * 0.01; dragStartX = event.clientX; });\\ncanvas.addEventListener(\\"pointerup\\", function () { dragStartX = null; canvas.classList.remove(\\"dragging\\"); });\\nwindow.addEventListener(\\"resize\\", resize);\\nresize();\\nwindow.requestAnimationFrame(draw);","data":{"bodies":[{"name":"Merkur","orbitRadius":42,"size":3.5,"color":"#aba7a4","speed":4.1,"phase":0.4},{"name":"Venus","orbitRadius":66,"size":5.5,"color":"#e3bc85","speed":1.7,"phase":2.6},{"name":"Erde","orbitRadius":94,"size":6.5,"color":"#4c9dff","speed":1,"phase":2.2},{"name":"Mars","orbitRadius":126,"size":4.5,"color":"#ef7955","speed":0.65,"phase":0.9},{"name":"Jupiter","orbitRadius":175,"size":11,"color":"#d5a87a","speed":0.3,"phase":5.9},{"name":"Saturn","orbitRadius":225,"size":9,"color":"#d5c18e","speed":0.17,"phase":4.4,"rings":true}]},"height":420},"locale":"de","expectedState":"data","width":528,"interactions":[]},{"name":"d3-bars","description":"An allow-listed library in use: a d3 bar chart drawn by the model's script with the chat's colours (--agents-accent, --agents-fg-light).","payload":{"title":"Bewertungen pro Monat","description":"Neue Google-Bewertungen, Mai bis Oktober 2026","html":"<div id=\\"chart\\"></div>","css":"#chart{padding:8px 4px}#chart text{fill:var(--agents-fg-light);font-size:11px}#chart .domain,#chart .tick line{stroke:var(--agents-divider)}","script":"var rows = window.AGENTS_VISUALIZATION.data.rows;\\nvar width = document.getElementById(\\"chart\\").clientWidth, height = 220, margin = { top: 12, right: 12, bottom: 28, left: 36 };\\nvar svg = d3.select(\\"#chart\\").append(\\"svg\\").attr(\\"width\\", width).attr(\\"height\\", height);\\nvar x = d3.scaleBand().domain(rows.map(function (row) { return row.month; })).range([margin.left, width - margin.right]).padding(0.25);\\nvar y = d3.scaleLinear().domain([0, d3.max(rows, function (row) { return row.reviews; })]).nice().range([height - margin.bottom, margin.top]);\\nsvg.append(\\"g\\").attr(\\"transform\\", \\"translate(0,\\" + (height - margin.bottom) + \\")\\").call(d3.axisBottom(x));\\nsvg.append(\\"g\\").attr(\\"transform\\", \\"translate(\\" + margin.left + \\",0)\\").call(d3.axisLeft(y).ticks(4));\\nsvg.selectAll(\\"rect\\").data(rows).join(\\"rect\\").attr(\\"x\\", function (row) { return x(row.month); }).attr(\\"width\\", x.bandwidth()).attr(\\"y\\", function (row) { return y(row.reviews); }).attr(\\"height\\", function (row) { return y(0) - y(row.reviews); }).attr(\\"rx\\", 4).style(\\"fill\\", \\"var(--agents-accent)\\");\\n","libraries":["d3"],"data":{"rows":[{"month":"Mai","reviews":12},{"month":"Jun","reviews":18},{"month":"Jul","reviews":9},{"month":"Aug","reviews":22},{"month":"Sep","reviews":15},{"month":"Okt","reviews":27}]},"height":240},"locale":"de","expectedState":"data","width":528},{"name":"narrow","description":"The Solar System Explorer at a narrow chat width: the controls wrap into two columns inside the frame.","payload":{"title":"Solar System Explorer","description":"Interaktive 3D-Projektion · Illustrative Maßstäbe","html":"<div class=\\"explorer\\">\\n <span class=\\"count-badge\\" id=\\"count-badge\\"></span>\\n <canvas id=\\"orbits\\" aria-label=\\"Planet orbits\\"></canvas>\\n <div class=\\"controls\\">\\n <label>Geschwindigkeit<input id=\\"speed\\" type=\\"range\\" min=\\"0\\" max=\\"3\\" step=\\"0.1\\" value=\\"1\\"></label>\\n <label>Neigung<input id=\\"tilt\\" type=\\"range\\" min=\\"0\\" max=\\"80\\" step=\\"1\\" value=\\"53\\"></label>\\n <label>Zoom<input id=\\"zoom\\" type=\\"range\\" min=\\"0.5\\" max=\\"1.6\\" step=\\"0.05\\" value=\\"1\\"></label>\\n <button id=\\"pause\\" type=\\"button\\">Pause</button>\\n </div>\\n <p class=\\"hint\\">Mit der Maus ziehen: Perspektive drehen · Regler verändern die Animation</p>\\n</div>","css":".explorer{position:relative;background:#0b1020;border-radius:12px;overflow:hidden;color:#cbd8f2}\\n.count-badge{position:absolute;top:12px;right:12px;padding:4px 12px;border-radius:999px;background:rgba(203,216,242,.12);font-size:12px}\\ncanvas{display:block;width:100%;aspect-ratio:16/10;cursor:grab}\\ncanvas.dragging{cursor:grabbing}\\n.controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr)) auto;gap:12px;align-items:end;padding:12px 16px;background:#121a30}\\n.controls label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:#9fb0d0}\\n.controls input{width:100%;accent-color:#7ea6ff}\\n.controls button{padding:8px 16px;border-radius:8px;border:0;background:#2a3d6b;color:#fff;font:inherit;cursor:pointer}\\n.hint{margin:0;padding:8px 16px 12px;font-size:12px;color:#7d8bab;text-align:center;background:#121a30}\\n@media (max-width:420px){.controls{grid-template-columns:1fr 1fr}.controls button{grid-column:span 2}}","script":"var bodies = window.AGENTS_VISUALIZATION.data.bodies;\\nvar canvas = document.getElementById(\\"orbits\\");\\nvar context = canvas.getContext(\\"2d\\");\\nvar stars = [];\\nfor (var starIndex = 0; starIndex < 140; starIndex++) stars.push({ x: Math.random(), y: Math.random(), size: Math.random() * 1.2 + 0.2 });\\ndocument.getElementById(\\"count-badge\\").textContent = bodies.length + \\" Planeten\\";\\nvar state = { time: 0, yaw: 0.35, tilt: 53 * Math.PI / 180, zoom: 1, speed: 1, running: true, last: 0 };\\nvar resize = function () {\\n var ratio = window.devicePixelRatio || 1;\\n canvas.width = canvas.clientWidth * ratio;\\n canvas.height = canvas.clientHeight * ratio;\\n context.setTransform(ratio, 0, 0, ratio, 0, 0);\\n};\\nvar project = function (x, z) {\\n var width = canvas.clientWidth, height = canvas.clientHeight;\\n var scale = Math.min(width / 520, height / 470) * state.zoom;\\n var xr = x * Math.cos(state.yaw) - z * Math.sin(state.yaw);\\n var zr = x * Math.sin(state.yaw) + z * Math.cos(state.yaw);\\n var yr = -zr * Math.sin(state.tilt);\\n var depth = zr * Math.cos(state.tilt);\\n var perspective = 900 / (900 + depth * 0.45);\\n return { x: width / 2 + xr * scale * perspective, y: height / 2 + yr * scale * perspective, depth: depth, k: perspective * scale };\\n};\\nvar drawOrbit = function (radius) {\\n context.beginPath();\\n for (var step = 0; step <= 160; step++) {\\n var angle = step / 160 * Math.PI * 2;\\n var point = project(radius * Math.cos(angle), radius * Math.sin(angle));\\n if (step === 0) context.moveTo(point.x, point.y); else context.lineTo(point.x, point.y);\\n }\\n context.strokeStyle = \\"rgba(124,152,203,.29)\\";\\n context.lineWidth = 1;\\n context.stroke();\\n};\\nvar drawBody = function (body) {\\n var radius = Math.max(2, body.size * body.point.k);\\n var shade = context.createRadialGradient(body.point.x - radius * 0.4, body.point.y - radius * 0.4, 0.5, body.point.x, body.point.y, radius * 1.3);\\n shade.addColorStop(0, \\"#ffffff\\");\\n shade.addColorStop(0.23, body.color);\\n shade.addColorStop(1, \\"#172239\\");\\n context.fillStyle = shade;\\n context.beginPath();\\n context.arc(body.point.x, body.point.y, radius, 0, Math.PI * 2);\\n context.fill();\\n if (body.rings) {\\n context.beginPath();\\n context.ellipse(body.point.x, body.point.y, radius * 1.8, radius * 0.52, -0.28, 0, Math.PI * 2);\\n context.strokeStyle = \\"rgba(235,210,160,.75)\\";\\n context.lineWidth = 2;\\n context.stroke();\\n }\\n context.font = \\"12px system-ui, sans-serif\\";\\n context.textAlign = \\"center\\";\\n context.fillStyle = \\"#cbd8f2\\";\\n context.fillText(body.name, body.point.x, body.point.y + radius + 15);\\n};\\nvar draw = function (now) {\\n if (!state.last) state.last = now;\\n if (state.running) state.time += (now - state.last) / 1000 * state.speed;\\n state.last = now;\\n var width = canvas.clientWidth, height = canvas.clientHeight;\\n context.clearRect(0, 0, width, height);\\n stars.forEach(function (star) { context.fillStyle = \\"rgba(203,216,242,.5)\\"; context.fillRect(star.x * width, star.y * height, star.size, star.size); });\\n bodies.forEach(function (body) { drawOrbit(body.orbitRadius); });\\n var sun = project(0, 0);\\n var glow = context.createRadialGradient(sun.x, sun.y, 2, sun.x, sun.y, 34 * state.zoom);\\n glow.addColorStop(0, \\"rgba(255,220,140,1)\\");\\n glow.addColorStop(0.35, \\"rgba(255,180,80,.55)\\");\\n glow.addColorStop(1, \\"rgba(255,150,50,0)\\");\\n context.fillStyle = glow;\\n context.beginPath();\\n context.arc(sun.x, sun.y, 34 * state.zoom, 0, Math.PI * 2);\\n context.fill();\\n var placed = bodies.map(function (body) {\\n var angle = state.time * body.speed * 0.6 + body.phase;\\n return { name: body.name, size: body.size, color: body.color, rings: body.rings, point: project(body.orbitRadius * Math.cos(angle), body.orbitRadius * Math.sin(angle)) };\\n });\\n placed.sort(function (first, second) { return second.point.depth - first.point.depth; }).forEach(drawBody);\\n window.requestAnimationFrame(draw);\\n};\\ndocument.getElementById(\\"speed\\").addEventListener(\\"input\\", function (event) { state.speed = Number(event.target.value); });\\ndocument.getElementById(\\"tilt\\").addEventListener(\\"input\\", function (event) { state.tilt = Number(event.target.value) * Math.PI / 180; });\\ndocument.getElementById(\\"zoom\\").addEventListener(\\"input\\", function (event) { state.zoom = Number(event.target.value); });\\nvar pauseButton = document.getElementById(\\"pause\\");\\npauseButton.addEventListener(\\"click\\", function () { state.running = !state.running; pauseButton.textContent = state.running ? \\"Pause\\" : \\"Weiter\\"; });\\nvar dragStartX = null;\\ncanvas.addEventListener(\\"pointerdown\\", function (event) { dragStartX = event.clientX; canvas.classList.add(\\"dragging\\"); canvas.setPointerCapture(event.pointerId); });\\ncanvas.addEventListener(\\"pointermove\\", function (event) { if (dragStartX === null) return; state.yaw += (event.clientX - dragStartX) * 0.01; dragStartX = event.clientX; });\\ncanvas.addEventListener(\\"pointerup\\", function () { dragStartX = null; canvas.classList.remove(\\"dragging\\"); });\\nwindow.addEventListener(\\"resize\\", resize);\\nresize();\\nwindow.requestAnimationFrame(draw);","data":{"bodies":[{"name":"Merkur","orbitRadius":42,"size":3.5,"color":"#aba7a4","speed":4.1,"phase":0.4},{"name":"Venus","orbitRadius":66,"size":5.5,"color":"#e3bc85","speed":1.7,"phase":2.6},{"name":"Erde","orbitRadius":94,"size":6.5,"color":"#4c9dff","speed":1,"phase":2.2},{"name":"Mars","orbitRadius":126,"size":4.5,"color":"#ef7955","speed":0.65,"phase":0.9},{"name":"Jupiter","orbitRadius":175,"size":11,"color":"#d5a87a","speed":0.3,"phase":5.9},{"name":"Saturn","orbitRadius":225,"size":9,"color":"#d5c18e","speed":0.17,"phase":4.4,"rings":true}]},"height":420},"locale":"de","expectedState":"data","width":340},{"name":"script-error","description":"The model's script throws: what rendered stays, one muted line under it, the block reports failed RENDER_FAILED with the error line.","payload":{"title":"Kaputte Visualisierung","html":"<p>Vor dem Fehler</p>","css":"p{margin:16px}","script":"undefinedFunctionCall();"},"expectedState":"error","width":528},{"name":"endless-loop","description":"The model's script never returns: the heartbeat stops, the watchdog removes the frame after 5 s and the block reports failed.","payload":{"title":"Endlosschleife","html":"<p>Rechnet …</p>","css":"","script":"while (true) {}"},"expectedState":"error","width":528},{"name":"unknown-library","description":"A library outside the allow-list: the block is not run, one muted line, reported failed INVALID_PROP.","payload":{"title":"Mit Chart.js","html":"<canvas id=\\"c\\"></canvas>","css":"","script":"new Chart(document.getElementById('c'), {});","libraries":["chart.js"]},"expectedState":"error","width":528}]`);
278
+ const __vite_glob_0_37 = {
279
+ wireName: wireName$7,
280
+ fixtures: fixtures$7
281
+ };
282
+ const wireName$6 = "EntityMention";
283
+ const fixtures$6 = [{ "name": "entity-mention-competitor", "description": `The read-only echo above the owner's own message: the competitor the owner put into the composer with the detail panel's "Ask about this" (ChatGPT's "Anschlussfrage stellen", 21b–21d).`, "payload": { "entityType": "competitor", "entityId": "8812", "label": "Dentalzentrum Kassel-West", "agentSpaceId": 1 }, "expectedState": "data", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "entity-mention-without-label", "description": 'A mention whose opener knew no name: the chip says "About this entry".', "payload": { "entityType": "review", "entityId": "4711" }, "expectedState": "data", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "entity-mention-invalid", "description": "The error state: a fence that names no entity (no entityId) renders nothing and reports failed INVALID_PROP.", "payload": { "entityType": "competitor", "label": "Dentalzentrum Kassel-West" }, "expectedState": "error", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "default", "description": "The owner opened the chat from the competitor list and asks about Dentalzentrum Kassel-West (Friedrich-Ebert-Straße 140, 4.7 ★ from 154 reviews): the chip above their message names it.", "dataSet": "kassel-dental-practice", "payload": { "entityType": "competitor", "entityId": "5124", "label": "Dentalzentrum Kassel-West", "agentSpaceId": 7 }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528 }];
284
+ const __vite_glob_0_38 = {
285
+ wireName: wireName$6,
286
+ fixtures: fixtures$6
287
+ };
288
+ const wireName$5 = "MultiChoice";
289
+ const fixtures$5 = [{ "name": "default", "description": "Choice pills with a confirm — the reservation time pills of the ChatGPT reference.", "payload": { "question": "Which channels should we post on?", "options": [{ "label": "Instagram", "value": "Instagram" }, { "label": "Facebook", "value": "Facebook", "sublabel": "Your page with 1,200 followers" }, { "label": "TikTok", "value": "TikTok" }], "confirmAction": "{values}" }, "expectedState": "data", "width": 528, "interactions": [{ "name": "pick Instagram", "click": { "text": "Instagram" } }, { "name": "pick Facebook", "click": { "text": "Facebook" } }] }, { "name": "render-report-error", "description": "A payload without an options list reports failed INVALID_PROP.", "payload": { "question": "Which channels?" }, "expectedState": "error", "width": 528 }, { "name": "kassel-dental-services", "description": "Which services the November posts of the practice should feature — several may be picked, the confirm sends them.", "dataSet": "kassel-dental-practice", "payload": { "question": "Welche Leistungen sollen die November-Posts zeigen?", "options": [{ "label": "Prophylaxe / professionelle Zahnreinigung", "value": "Prophylaxe", "sublabel": "Passt zu den Prophylaxe-Wochen" }, { "label": "Implantologie", "value": "Implantologie" }, { "label": "Bleaching", "value": "Bleaching" }, { "label": "Kinderzahnheilkunde", "value": "Kinderzahnheilkunde" }, { "label": "Angstpatienten-Behandlung", "value": "Angstpatienten-Behandlung" }], "confirmAction": "{values}" }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528, "interactions": [{ "name": "pick Prophylaxe", "click": { "text": "Prophylaxe / professionelle Zahnreinigung" } }, { "name": "pick Bleaching", "click": { "text": "Bleaching" } }] }];
290
+ const __vite_glob_0_39 = {
291
+ wireName: wireName$5,
292
+ fixtures: fixtures$5
293
+ };
294
+ const wireName$4 = "QuickReplies";
295
+ const fixtures$4 = [{ "name": "default", "description": "An owner question with three answer pills — the follow-up suggestions of the ChatGPT reference as one tap each.", "payload": { "question": "What should we look at next?", "options": ["Compare with last month", "Show the top keywords", "Which competitor grew most?"] }, "expectedState": "data", "width": 528, "interactions": [{ "name": "pick the second answer", "click": { "text": "Show the top keywords" } }] }, { "name": "render-report-error", "description": "Two options that differ only by case drop the card, reported failed INVALID_PROP.", "payload": { "options": ["Yes", "yes"] }, "expectedState": "error", "width": 528 }, { "name": "kassel-dental-next-step", "description": "After the review summary the assistant asks the practice owner what to look at next — three answer pills the model wrote.", "dataSet": "kassel-dental-practice", "payload": { "question": "Womit sollen wir weitermachen?", "options": ["Auf die 2-Sterne-Bewertung antworten", "Bewertungen mit Dentalzentrum Kassel-West vergleichen", "Bewertungsanfragen an Prophylaxe-Patienten senden"] }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528 }];
296
+ const __vite_glob_0_40 = {
297
+ wireName: wireName$4,
298
+ fixtures: fixtures$4
299
+ };
300
+ const wireName$3 = "SuggestedActions";
301
+ const fixtures$3 = [{ "name": "render-report-error", "description": "A fence carries no options attribute, so the widget reports failed INVALID_PROP and renders nothing.", "payload": { "options": [{ "displayText": "Yes", "userAction": "Yes" }] }, "expectedState": "error", "width": 528 }];
302
+ const __vite_glob_0_41 = {
303
+ wireName: wireName$3,
304
+ fixtures: fixtures$3
305
+ };
306
+ const wireName$2 = "ToolTrace";
307
+ const fixtures$2 = [{ "name": "render-report-mounted", "description": "A readable trace mounts (a fence always carries an object, so the unreadable path is spec-only).", "payload": { "name": "Navigate", "input": { "destination": "APP.NAV.EXAMPLE.TASKS" } }, "expectedState": "data", "width": 528 }, { "name": "default", "description": "The muted trace line of a navigation the assistant made for the practice owner: it opened the reviews page of the app.", "dataSet": "kassel-dental-practice", "payload": { "name": "Navigate", "input": { "destination": "APP.NAV.EXAMPLE.REVIEWS" } }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528 }];
308
+ const __vite_glob_0_42 = {
309
+ wireName: wireName$2,
310
+ fixtures: fixtures$2
311
+ };
312
+ const wireName$1 = "WebSearchResults";
313
+ const fixtures$1 = [{ "name": "default", "description": "The sources of a web research answer — the source cards of the ChatGPT news feed reference.", "payload": { "query": "Münster bakery opening hours on public holidays", "provider": "PERPLEXITY", "sources": [{ "url": "https://www.muenster.de/feiertage.html", "title": "Feiertage in Münster" }, { "url": "https://www.ihk.de/nordwestfalen/ladenoeffnung", "title": "Ladenöffnung an Feiertagen" }, { "url": "https://www.bäckerhandwerk.de/oeffnungszeiten", "title": "Öffnungszeiten im Bäckerhandwerk" }] }, "expectedState": "data", "width": 528 }, { "name": "render-report-empty", "description": "No answer and no source with a url reports empty NO_DATA.", "payload": { "query": "opening hours", "sources": [] }, "expectedState": "empty", "width": 528 }, { "name": "kassel-dental-emergency-service", "description": "The owner asked how the dental emergency service in Kassel is organised at weekends (for the practice's Notfallsprechstunde page); the widget carries the three pages the answer used.", "dataSet": "kassel-dental-practice", "payload": { "query": "zahnärztlicher Notdienst Kassel Wochenende", "provider": "PERPLEXITY", "sources": [{ "url": "https://www.lzkh.de/patienten/zahnaerztlicher-notdienst", "title": "Zahnärztlicher Notdienst in Hessen – Landeszahnärztekammer Hessen" }, { "url": "https://www.kzvh.de/patienten/notdienst", "title": "Notdienstsuche – Kassenzahnärztliche Vereinigung Hessen" }, { "url": "https://www.kassel.de/buerger/gesundheit/notdienste.php", "title": "Notdienste und Bereitschaftsdienste – Stadt Kassel" }] }, "agentSpaceId": 7, "locale": "de", "expectedState": "data", "width": 528 }];
314
+ const __vite_glob_0_43 = {
315
+ wireName: wireName$1,
316
+ fixtures: fixtures$1
317
+ };
318
+ const wireName = "WritingDraft";
319
+ const fixtures = [{ "name": "default", "description": "The e-mail draft of ref 47 (ChatGPT WritingArtifact variant=email): headline, recipient and subject rows, the text; the owner opens the editor, changes the text, finishes, and goes back to the original.", "payload": { "kind": "email", "subject": "Kurze Anfrage", "recipient": "not specified", "body": "Guten Tag,\n\nich interessiere mich für Ihr Angebot und hätte gerne einige weitere Informationen zu Preisen, Verfügbarkeit und Konditionen.\n\nKönnten Sie mir die entsprechenden Unterlagen zusenden?\n\nVielen Dank und freundliche Grüße" }, "locale": "de", "expectedState": "data", "width": 528, "interactions": [{ "name": "edit", "click": { "selector": "[data-testid='writing-draft-edit']" } }, { "name": "type-recipient", "fill": { "selector": "[data-testid='writing-draft-recipient-input'] input", "value": "info@dentallabor-kassel.de" } }, { "name": "type-text", "fill": { "selector": "[data-testid='writing-draft-body-input'] textarea:not([aria-hidden='true'])", "value": "Guten Tag,\n\nwir benötigen bis Freitag ein Angebot für zwei Keramikkronen.\n\nVielen Dank und freundliche Grüße\nDr. Lena Hoffmann" } }, { "name": "done", "click": { "selector": "[data-testid='writing-draft-done']" } }, { "name": "reset", "click": { "selector": "[data-testid='writing-draft-reset']" } }], "dataSet": "kassel-dental-practice" }, { "name": "email-with-recipient", "description": "An e-mail with a real address and Markdown formatting (bold, a list, a link) from the dental practice: the open-in-mail action is offered.", "payload": { "kind": "email", "title": "Terminerinnerung an Prophylaxe-Patienten", "recipient": "patienten@zahnarzt-hoffmann-kassel.de", "subject": "Ihre Prophylaxe im November", "body": "Liebe Patientinnen und Patienten,\n\nim **November** bieten wir Prophylaxe-Wochen an:\n\n- professionelle Zahnreinigung in 60 Minuten\n- Termine auch am Samstagvormittag\n- Erinnerung per SMS am Vortag\n\nTermine buchen Sie unter [zahnarzt-hoffmann-kassel.de](https://zahnarzt-hoffmann-kassel.de).\n\nIhre Zahnarztpraxis Dr. Lena Hoffmann\nWilhelmshöher Allee 120, 34119 Kassel" }, "locale": "de", "expectedState": "data", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "post", "description": "A social post draft in English: no recipient or subject rows, no mail action; copy and edit only.", "payload": { "kind": "post", "title": "Prophylaxe weeks post", "body": "**Prophylaxis weeks in November!** Book a professional cleaning at Zahnarztpraxis Dr. Lena Hoffmann on Wilhelmshöher Allee — Saturday mornings included." }, "locale": "en", "expectedState": "data", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "chatgpt-shape", "description": "ChatGPT's own WritingArtifact field names as a weak model would copy them (variant, content.text, to): read through the aliases.", "payload": { "variant": "E-Mail", "subject": "Termin nächste Woche", "to": ["info@dentallabor-kassel.de"], "content": { "format": "markdown", "text": "Hallo Herr Weber,\n\npasst Ihnen Dienstag um 10 Uhr für die Abholung der Abformungen?\n\nBeste Grüße\nDr. Lena Hoffmann" } }, "locale": "de", "expectedState": "data", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "empty", "description": "A block without a text: one muted line, reported empty (NO_DATA).", "payload": { "kind": "email", "subject": "Kurze Anfrage" }, "locale": "de", "expectedState": "empty", "width": 528, "dataSet": "kassel-dental-practice" }, { "name": "unreadable-body", "description": "A body written as an object instead of a text: one muted line, reported failed (INVALID_PROP).", "payload": { "kind": "letter", "body": { "paragraphs": ["Sehr geehrte Damen und Herren,", "…"] } }, "locale": "de", "expectedState": "error", "width": 528, "dataSet": "kassel-dental-practice" }];
320
+ const __vite_glob_0_44 = {
321
+ wireName,
322
+ fixtures
323
+ };
324
+ const DEFAULT_FIELD_NAME_PATTERN = new RegExp(`\\b${DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME}\\b`, "g");
325
+ const mapFixtureToDeclaredAgentSpaceKeyFieldName = (fixture) => {
326
+ const declaredFieldName = getWidgetSelfHydrationKeyFieldName();
327
+ if (declaredFieldName === DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME || fixture === void 0) return fixture;
328
+ return JSON.parse(JSON.stringify(fixture).replace(DEFAULT_FIELD_NAME_PATTERN, declaredFieldName));
329
+ };
330
+ const fixtureModules = /* @__PURE__ */ Object.assign({
331
+ "../kit/components/data/data.preview-fixtures.json": __vite_glob_0_0,
332
+ "../kit/components/embedding/widget.preview-fixtures.json": __vite_glob_0_1,
333
+ "../kit/components/entity/entity-link.preview-fixtures.json": __vite_glob_0_2,
334
+ "../kit/components/form/form.preview-fixtures.json": __vite_glob_0_3,
335
+ "../kit/components/inputs/button.preview-fixtures.json": __vite_glob_0_4,
336
+ "../kit/components/inputs/checkbox.preview-fixtures.json": __vite_glob_0_5,
337
+ "../kit/components/inputs/date-picker.preview-fixtures.json": __vite_glob_0_6,
338
+ "../kit/components/inputs/input.preview-fixtures.json": __vite_glob_0_7,
339
+ "../kit/components/inputs/radio-group.preview-fixtures.json": __vite_glob_0_8,
340
+ "../kit/components/inputs/select.preview-fixtures.json": __vite_glob_0_9,
341
+ "../kit/components/inputs/slider.preview-fixtures.json": __vite_glob_0_10,
342
+ "../kit/components/inputs/tabs.preview-fixtures.json": __vite_glob_0_11,
343
+ "../kit/components/inputs/textarea.preview-fixtures.json": __vite_glob_0_12,
344
+ "../kit/components/layout/layout.preview-fixtures.json": __vite_glob_0_13,
345
+ "../kit/components/map/map.preview-fixtures.json": __vite_glob_0_14,
346
+ "../kit/components/media/image-group.preview-fixtures.json": __vite_glob_0_15,
347
+ "../kit/components/media/image.preview-fixtures.json": __vite_glob_0_16,
348
+ "../kit/components/media/video-card/video-card.preview-fixtures.json": __vite_glob_0_17,
349
+ "../kit/components/media/video.preview-fixtures.json": __vite_glob_0_18,
350
+ "../kit/components/rich/code.preview-fixtures.json": __vite_glob_0_19,
351
+ "../kit/components/rich/diagram.preview-fixtures.json": __vite_glob_0_20,
352
+ "../kit/components/rich/math.preview-fixtures.json": __vite_glob_0_21,
353
+ "../kit/components/rich/svg.preview-fixtures.json": __vite_glob_0_22,
354
+ "../kit/components/text/badge.preview-fixtures.json": __vite_glob_0_23,
355
+ "../kit/components/text/caption.preview-fixtures.json": __vite_glob_0_24,
356
+ "../kit/components/text/favicon.preview-fixtures.json": __vite_glob_0_25,
357
+ "../kit/components/text/label.preview-fixtures.json": __vite_glob_0_26,
358
+ "../kit/components/text/link.preview-fixtures.json": __vite_glob_0_27,
359
+ "../kit/components/text/markdown.preview-fixtures.json": __vite_glob_0_28,
360
+ "../kit/components/text/source-ref.preview-fixtures.json": __vite_glob_0_29,
361
+ "../kit/components/text/text.preview-fixtures.json": __vite_glob_0_30,
362
+ "../kit/components/text/title.preview-fixtures.json": __vite_glob_0_31,
363
+ "../kit/composed-view.preview-fixtures.json": __vite_glob_0_32,
364
+ "../widgets/ClockConversationWidget/clock.preview-fixtures.json": __vite_glob_0_33,
365
+ "../widgets/ConceptExplainerConversationWidget/concept-explainer.preview-fixtures.json": __vite_glob_0_34,
366
+ "../widgets/ConversationSearchResultsConversationWidget/conversation-search-results.preview-fixtures.json": __vite_glob_0_35,
367
+ "../widgets/CurrencyConverterConversationWidget/currency-converter.preview-fixtures.json": __vite_glob_0_36,
368
+ "../widgets/CustomVisualizationConversationWidget/custom-visualization.preview-fixtures.json": __vite_glob_0_37,
369
+ "../widgets/EntityMentionConversationWidget/entity-mention.preview-fixtures.json": __vite_glob_0_38,
370
+ "../widgets/MultiChoiceConversationWidget/multi-choice.preview-fixtures.json": __vite_glob_0_39,
371
+ "../widgets/QuickRepliesConversationWidget/quick-replies.preview-fixtures.json": __vite_glob_0_40,
372
+ "../widgets/SuggestedActions/suggested-actions.preview-fixtures.json": __vite_glob_0_41,
373
+ "../widgets/ToolTraceConversationWidget/tool-trace.preview-fixtures.json": __vite_glob_0_42,
374
+ "../widgets/WebSearchResultsConversationWidget/web-search-results.preview-fixtures.json": __vite_glob_0_43,
375
+ "../widgets/WritingDraftConversationWidget/writing-draft.preview-fixtures.json": __vite_glob_0_44
376
+ });
377
+ const sortByWireName = (fixtureFiles) => fixtureFiles.sort((first, second) => first.wireName.localeCompare(second.wireName));
378
+ const widgetPreviewFixtureFiles = sortByWireName(Object.values(fixtureModules));
379
+ const registerWidgetPreviewFixtureFiles = (fixtureFiles) => {
380
+ widgetPreviewFixtureFiles.push(...fixtureFiles);
381
+ sortByWireName(widgetPreviewFixtureFiles);
382
+ };
383
+ const findWidgetPreviewFixtures = (widgetName) => {
384
+ const fixturesByName = /* @__PURE__ */ new Map();
385
+ for (const fixtureFile of widgetPreviewFixtureFiles) {
386
+ if (fixtureFile.wireName !== widgetName) continue;
387
+ for (const fixture of fixtureFile.fixtures) fixturesByName.set(fixture.name, fixture);
388
+ }
389
+ return [...fixturesByName.values()].map(mapFixtureToDeclaredAgentSpaceKeyFieldName);
390
+ };
391
+ const findWidgetPreviewFixture = (widgetName, fixtureName) => findWidgetPreviewFixtures(widgetName).find((fixture) => fixture.name === fixtureName);
392
+ const buildWidgetPreviewFence = (widgetName, fixture) => "```widget\n" + JSON.stringify({ type: widgetName, ...fixture.payload }) + "\n```";
393
+ const PREVIEW_AGENT_SPACE_KEY = 1;
394
+ const PREVIEW_MESSAGE_ID = 1;
395
+ const WidgetPreview = (props) => {
396
+ const { bootstrap, fixture, readiness, hasHydrationError } = props;
397
+ const widgetRef = useRef(null);
398
+ const widgetName = resolveWidgetName(bootstrap.widgetName);
399
+ const entry = conversationWidgetRegistry.widgets.find((widget22) => widget22.name === widgetName);
400
+ const [canvas, setCanvas] = useState(null);
401
+ const [composerLog2, setComposerLog] = useState([]);
402
+ const agentSpaceKey = Number(readWidgetAgentSpaceKeyAttribute(fixture) ?? PREVIEW_AGENT_SPACE_KEY);
403
+ const fence = useMemo(
404
+ () => buildWidgetPreviewFence(widgetName ?? bootstrap.widgetName, fixture),
405
+ [widgetName, bootstrap.widgetName, fixture]
406
+ );
407
+ const isEmail = bootstrap.mode === "email";
408
+ const isInteractive = bootstrap.mode === "interactive";
409
+ const frozenHydration = isEmail && fixture.hydration && Object.keys(fixture.hydration).length > 0 ? fixture.hydration : null;
410
+ useEffect(() => {
411
+ if (!entry) readiness.fail("UNKNOWN_WIDGET");
412
+ else if (widgetRef.current) return readiness.observe(document.body, widgetRef.current, hasHydrationError);
413
+ }, [entry, readiness, hasHydrationError]);
414
+ const renderReporter = useMemo(() => ({ report: readiness.recordRenderReport }), [readiness]);
415
+ const appendComposerLog = useCallback(
416
+ (kind, text) => setComposerLog((entries) => [...entries, { kind, text }]),
417
+ []
418
+ );
419
+ const openCanvas = useCallback((request) => {
420
+ setCanvas((current) => {
421
+ const decision = decideCanvasOpen(canvasBehaviourOf(request.canvasId), current, null, {
422
+ ...request,
423
+ viewportViable: window.innerWidth >= CANVAS_VIABLE_MIN_WIDTH,
424
+ hostHasCanvasSurface: true
425
+ });
426
+ if (decision.kind === "ignore") return current;
427
+ return {
428
+ canvasId: request.canvasId,
429
+ instanceId: request.instanceId,
430
+ anchor: request.anchor,
431
+ origin: request.origin,
432
+ mountGeneration: (current?.mountGeneration ?? 0) + 1
433
+ };
434
+ });
435
+ }, []);
436
+ const callbacks = useMemo(
437
+ () => ({
438
+ canvas,
439
+ hostHasCanvasSurface: !isEmail,
440
+ openCanvas: isEmail ? () => {
441
+ } : openCanvas,
442
+ closeCanvas: () => setCanvas(null),
443
+ chatAgentSpaceKey: agentSpaceKey,
444
+ messages: [],
445
+ sendMessageToChat: (text) => appendComposerLog("message", text),
446
+ prefillComposer: (text) => appendComposerLog("prefill", text),
447
+ injectSignal: (text) => {
448
+ appendComposerLog("signal", text);
449
+ return Promise.resolve(true);
450
+ }
451
+ }),
452
+ [canvas, isEmail, openCanvas, agentSpaceKey, appendComposerLog]
453
+ );
454
+ if (!entry) return null;
455
+ const WidgetComponent = entry.component;
456
+ const CanvasBody = canvas ? canvasBodies[canvas.canvasId] : null;
457
+ const widget2 = /* @__PURE__ */ jsx(ConversationWidgetErrorBoundary, { widgetName: entry.name, onCrash: readiness.recordWidgetCrash, children: /* @__PURE__ */ jsx(WidgetRenderReportContext.Provider, { value: renderReporter, children: /* @__PURE__ */ jsx(
458
+ WidgetComponent,
459
+ {
460
+ payload: JSON.stringify(fixture.payload),
461
+ ...buildWidgetAgentSpaceKeyProps(String(agentSpaceKey)),
462
+ interactive: isInteractive,
463
+ fresh: isInteractive,
464
+ justDelivered: isInteractive,
465
+ messageId: String(PREVIEW_MESSAGE_ID),
466
+ openedByPage: false
467
+ }
468
+ ) }) });
469
+ return /* @__PURE__ */ jsx(StandaloneConversationWidgetProvider, { callbacks, children: /* @__PURE__ */ jsx(ConversationWidgetRenderContext.Provider, { value: isEmail ? "email" : "conversation", children: /* @__PURE__ */ jsx(WidgetImageRenderContext.Provider, { value: frozenHydration, children: /* @__PURE__ */ jsxs("div", { className: styles.page, "data-testid": "widget-preview-page", children: [
470
+ /* @__PURE__ */ jsxs("div", { className: styles.chatColumn, "data-testid": "widget-preview-frame", children: [
471
+ /* @__PURE__ */ jsx(
472
+ "div",
473
+ {
474
+ ref: widgetRef,
475
+ className: styles.widget,
476
+ "data-testid": "widget-preview-widget",
477
+ inert: isEmail || void 0,
478
+ children: fixture.stubComposedViewComponents ? /* @__PURE__ */ jsx(ComposedViewComponentsContext.Provider, { value: buildPreviewComposedViewComponents(), children: widget2 }) : widget2
479
+ }
480
+ ),
481
+ composerLog2.length > 0 ? /* @__PURE__ */ jsx("div", { className: styles.composerLog, "data-testid": "widget-preview-composer-log", children: composerLog2.map((composerEntry2, entryIndex) => /* @__PURE__ */ jsx(
482
+ Text,
483
+ {
484
+ role: "caption",
485
+ translate: false,
486
+ className: styles.composerEntry,
487
+ children: `${composerEntry2.kind}: ${composerEntry2.text}`
488
+ },
489
+ entryIndex
490
+ )) }) : null
491
+ ] }),
492
+ canvas && CanvasBody ? /* @__PURE__ */ jsx("div", { className: styles.canvasPane, "data-testid": "widget-preview-canvas", "data-canvas-id": canvas.canvasId, children: /* @__PURE__ */ jsx(
493
+ CanvasBody,
494
+ {
495
+ canvas,
496
+ agentSpaceKey,
497
+ anchorMessageMarkdown: fence
498
+ },
499
+ `${canvas.instanceId}#${canvas.mountGeneration}`
500
+ ) }) : null
501
+ ] }) }) }) });
502
+ };
503
+ const WIDGET_PREVIEW_SIGNAL_GLOBAL_NAME = "__AGENTS_WIDGET_PREVIEW_V1__";
504
+ const readWidgetPreviewSignalGlobalNames = () => [
505
+ WIDGET_PREVIEW_SIGNAL_GLOBAL_NAME,
506
+ ...(getSandboxLegacyAliases().previewReadinessGlobalNames ?? []).filter(
507
+ (aliasName) => aliasName !== WIDGET_PREVIEW_SIGNAL_GLOBAL_NAME
508
+ )
509
+ ];
510
+ const publishWidgetPreviewSignal = (signal) => {
511
+ const windowSignals = window;
512
+ for (const globalName of readWidgetPreviewSignalGlobalNames()) windowSignals[globalName] = signal;
513
+ };
514
+ const SKELETON_SELECTOR = '[data-testid="Skeleton"], [class*="Skeleton"], [class*="skeleton"]';
515
+ const LOADING_SELECTOR = `[aria-busy="true"], [role="progressbar"]:not([aria-valuenow]), ${SKELETON_SELECTOR}`;
516
+ const SETTLE_MS = 400;
517
+ const hasRenderedLoadingMarker = (element) => {
518
+ const markers = Array.from(element.querySelectorAll(LOADING_SELECTOR));
519
+ if (markers.length === 0) return false;
520
+ const hasLayout = element.getClientRects().length > 0;
521
+ return !hasLayout || markers.some((marker) => marker.getClientRects().length > 0);
522
+ };
523
+ const observeWidgetPreviewState = (element, hasError, renderReport) => {
524
+ if (hasError || renderReport?.status === "failed") return "error";
525
+ if (renderReport?.status === "pending") return "loading";
526
+ if (hasRenderedLoadingMarker(element)) return "loading";
527
+ if (renderReport?.status === "empty") return "empty";
528
+ if (!element.textContent?.trim() && !element.querySelector("img,svg,canvas,iframe")) return "empty";
529
+ return "data";
530
+ };
531
+ const isSkeletonAnimation = (mutation) => {
532
+ if (mutation.type !== "attributes") return false;
533
+ const target = mutation.target;
534
+ return target instanceof Element && target.closest(SKELETON_SELECTOR) !== null;
535
+ };
536
+ const createWidgetPreviewReadiness = (expectedState) => {
537
+ const missingResponses = [];
538
+ const failedRequests = [];
539
+ let widgetCrashed = false;
540
+ let renderReport;
541
+ let scheduleSettleAgain = () => {
542
+ };
543
+ let revision = 0;
544
+ const publish = (signal) => {
545
+ publishWidgetPreviewSignal({
546
+ version: 1,
547
+ expectedState,
548
+ missingResponses: [...missingResponses],
549
+ failedRequests: [...failedRequests],
550
+ widgetCrashed,
551
+ ...renderReport ? { renderReport } : {},
552
+ ...signal
553
+ });
554
+ document.documentElement.dataset.widgetPreviewState = signal.state;
555
+ };
556
+ publish({ state: "loading", revision });
557
+ const fail = (errorCode) => {
558
+ publish({ state: "failed", revision, error_code: errorCode });
559
+ publishWidgetImageReadiness({ version: 1, state: "failed", error_code: errorCode });
560
+ };
561
+ const recordMissingResponse = (requestKey) => {
562
+ if (!missingResponses.includes(requestKey)) missingResponses.push(requestKey);
563
+ };
564
+ const recordFailedRequest = (requestKey) => {
565
+ if (!failedRequests.includes(requestKey)) failedRequests.push(requestKey);
566
+ };
567
+ const recordWidgetCrash = () => {
568
+ widgetCrashed = true;
569
+ };
570
+ const recordRenderReport = (entry) => {
571
+ renderReport = entry;
572
+ scheduleSettleAgain();
573
+ };
574
+ const settle = (element, hasHydrationError) => {
575
+ const hasError = hasHydrationError() || widgetCrashed || failedRequests.length > 0;
576
+ const observedState = observeWidgetPreviewState(element, hasError, renderReport);
577
+ const { x, y, width, height } = element.getBoundingClientRect();
578
+ const rect = { x, y, width, height };
579
+ revision += 1;
580
+ const expectedStateReached = observedState === expectedState;
581
+ publish({ state: "settled", revision, observedState, expectedStateReached, rect });
582
+ publishWidgetImageReadiness(
583
+ expectedStateReached ? { version: 1, state: "ready", rect } : {
584
+ version: 1,
585
+ state: "failed",
586
+ error_code: `EXPECTED_${expectedState.toUpperCase()}_SAW_${observedState.toUpperCase()}`,
587
+ rect
588
+ }
589
+ );
590
+ };
591
+ const observe = (watchedElement, widgetElement, hasHydrationError) => {
592
+ let settleTimer = null;
593
+ const scheduleSettle = () => {
594
+ if (settleTimer !== null) clearTimeout(settleTimer);
595
+ settleTimer = setTimeout(() => settle(widgetElement, hasHydrationError), SETTLE_MS);
596
+ };
597
+ const mutationObserver = new MutationObserver((mutations) => {
598
+ if (mutations.some((mutation) => !isSkeletonAnimation(mutation))) scheduleSettle();
599
+ });
600
+ mutationObserver.observe(watchedElement, {
601
+ subtree: true,
602
+ childList: true,
603
+ attributes: true,
604
+ characterData: true
605
+ });
606
+ scheduleSettleAgain = scheduleSettle;
607
+ scheduleSettle();
608
+ return () => {
609
+ mutationObserver.disconnect();
610
+ scheduleSettleAgain = () => {
611
+ };
612
+ if (settleTimer !== null) clearTimeout(settleTimer);
613
+ };
614
+ };
615
+ return { observe, fail, recordMissingResponse, recordFailedRequest, recordWidgetCrash, recordRenderReport };
616
+ };
617
+ const widgetPreviewRequestKey = (method, url) => {
618
+ const sortedUrl = new URL(url.toString());
619
+ sortedUrl.searchParams.sort();
620
+ return `${method.toUpperCase()} ${sortedUrl.pathname}${sortedUrl.search}`;
621
+ };
622
+ const SILENTLY_ANSWERED_PATHS = ["/rest_api/v1/log"];
623
+ const isSilentlyAnswered = (url) => SILENTLY_ANSWERED_PATHS.includes(url.pathname);
624
+ const isStatusResponse = (response) => typeof response === "object" && response !== null && typeof response.__status === "number";
625
+ const isPendingResponse = (response) => typeof response === "object" && response !== null && response.__pending === true;
626
+ const installWidgetPreviewRequests = (responses, onMissingResponse, onFailedRequest = () => {
627
+ }) => {
628
+ const originalAdapter = axios.defaults.adapter;
629
+ axios.defaults.adapter = async (config) => {
630
+ const method = (config.method ?? "get").toLowerCase();
631
+ const requestUrl = new URL(axios.getUri(config), window.location.origin);
632
+ if (isSilentlyAnswered(requestUrl)) return { data: {}, status: 200, statusText: "OK", config, headers: {} };
633
+ const requestKey = widgetPreviewRequestKey(method, requestUrl);
634
+ const response = Object.prototype.hasOwnProperty.call(responses, requestKey) ? responses[requestKey] : void 0;
635
+ if (response === void 0) {
636
+ onMissingResponse(requestKey);
637
+ return Promise.reject(Object.assign(new Error(`no preview response for ${requestKey}`), { config }));
638
+ }
639
+ if (isPendingResponse(response)) return new Promise(() => {
640
+ });
641
+ if (isStatusResponse(response)) {
642
+ if (response.__status >= 400) onFailedRequest(requestKey);
643
+ return Promise.reject(
644
+ Object.assign(new Error(`preview response ${response.__status}`), {
645
+ config,
646
+ response: { status: response.__status, data: response.__body ?? null, config, headers: {} }
647
+ })
648
+ );
649
+ }
650
+ return { data: structuredClone(response), status: 200, statusText: "OK", config, headers: {} };
651
+ };
652
+ const originalFetch = window.fetch;
653
+ window.fetch = async (input, init) => {
654
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toLowerCase();
655
+ const url = new URL(input instanceof Request ? input.url : String(input), window.location.origin);
656
+ if (isSilentlyAnswered(url)) return new Response("{}", { status: 200 });
657
+ const requestKey = widgetPreviewRequestKey(method, url);
658
+ const response = Object.prototype.hasOwnProperty.call(responses, requestKey) ? responses[requestKey] : void 0;
659
+ if (response === void 0) {
660
+ onMissingResponse(requestKey);
661
+ return new Response(null, { status: 404 });
662
+ }
663
+ if (isPendingResponse(response)) return new Promise(() => {
664
+ });
665
+ if (isStatusResponse(response)) {
666
+ if (response.__status >= 400) onFailedRequest(requestKey);
667
+ return new Response(JSON.stringify(response.__body ?? null), { status: response.__status });
668
+ }
669
+ return new Response(JSON.stringify(response), { status: 200, headers: { "Content-Type": "application/json" } });
670
+ };
671
+ return () => {
672
+ axios.defaults.adapter = originalAdapter;
673
+ window.fetch = originalFetch;
674
+ };
675
+ };
676
+ const findFixtureHydration = (hydration, type, key) => {
677
+ if (Object.prototype.hasOwnProperty.call(hydration, key))
678
+ return { found: true, value: hydration[key], hydrationKey: key };
679
+ if (Object.prototype.hasOwnProperty.call(hydration, type))
680
+ return { found: true, value: hydration[type], hydrationKey: type };
681
+ return { found: false, hydrationKey: key };
682
+ };
683
+ const answerFromFixture = (value, hydrationKey, onFailedRequest) => {
684
+ if (isPendingResponse(value)) return new Promise(() => {
685
+ });
686
+ if (isStatusResponse(value)) {
687
+ onFailedRequest(`HYDRATION ${hydrationKey}`);
688
+ return Promise.reject(new Error(`preview hydration ${value.__status}`));
689
+ }
690
+ return Promise.resolve(structuredClone(value));
691
+ };
692
+ const installWidgetPreviewHydration = (hydration, onFailedRequest) => {
693
+ const replacedHydrators = /* @__PURE__ */ new Map();
694
+ for (const type of listWidgetHydratorTypes()) {
695
+ const registered = getWidgetHydrator(type);
696
+ if (!registered) continue;
697
+ replacedHydrators.set(type, registered);
698
+ unregisterWidgetHydrator(type);
699
+ registerWidgetHydrator(type, {
700
+ ...registered,
701
+ hydrator: (payload, context) => {
702
+ const fixtureHydration = findFixtureHydration(hydration, type, registered.deriveKey(type, payload));
703
+ return fixtureHydration.found ? answerFromFixture(fixtureHydration.value, fixtureHydration.hydrationKey, onFailedRequest) : registered.hydrator(payload, context);
704
+ }
705
+ });
706
+ }
707
+ return () => {
708
+ for (const [type, registered] of replacedHydrators) {
709
+ unregisterWidgetHydrator(type);
710
+ registerWidgetHydrator(type, registered);
711
+ }
712
+ };
713
+ };
714
+ export {
715
+ PREVIEW_AGENT_SPACE_KEY,
716
+ WIDGET_PREVIEW_SIGNAL_GLOBAL_NAME,
717
+ WidgetPreview,
718
+ buildPreviewComposedViewComponents,
719
+ buildWidgetPreviewFence,
720
+ createWidgetPreviewReadiness,
721
+ findWidgetPreviewFixture,
722
+ findWidgetPreviewFixtures,
723
+ installWidgetPreviewHydration,
724
+ installWidgetPreviewRequests,
725
+ isPendingResponse,
726
+ observeWidgetPreviewState,
727
+ publishWidgetPreviewSignal,
728
+ readWidgetPreviewSignalGlobalNames,
729
+ registerWidgetPreviewFixtureFiles,
730
+ widgetPreviewFixtureFiles,
731
+ widgetPreviewRequestKey
732
+ };
733
+ //# sourceMappingURL=preview.js.map