@salsita-ai/sdk 0.50.0-develop.be40f0cee8 → 0.50.0-develop.d6ed5efd42

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 (543) hide show
  1. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  2. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  3. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  4. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  5. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  6. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  7. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  8. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  9. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  10. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  11. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  12. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  13. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  14. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  15. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  16. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  17. package/dist/application-spec/generate-application/code/templates/domain-spec.js +4 -4
  18. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  19. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -0
  20. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  21. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +1 -1
  22. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  23. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +41 -13
  24. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +1 -1
  25. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +2 -2
  26. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  27. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  28. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  29. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +30 -3
  30. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -5
  31. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +8 -4
  32. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  33. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  34. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  35. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  36. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  37. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  38. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  39. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  40. package/dist/client/phoenix-api.d.ts +58 -30
  41. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  42. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +158 -13
  43. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  44. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  45. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  46. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +8 -3
  47. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  48. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
  49. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  50. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +16 -1
  51. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  52. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
  53. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
  54. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  55. package/dist/configurator/common/frontend-analytics.d.ts +21 -21
  56. package/dist/configurator/index.d.ts +0 -1
  57. package/dist/configurator/index.js +1 -1
  58. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  59. package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
  60. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  61. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +1 -6
  62. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  63. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
  64. package/dist/configurator/ui/assistant/AssistantThread.d.ts +1 -6
  65. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  66. package/dist/configurator/ui/assistant/index.d.ts +1 -1
  67. package/dist/configurator/ui/assistant/index.js +1 -1
  68. package/dist/configurator/ui/assistant/thread-items.d.ts +1 -1
  69. package/dist/configurator/ui/assistant/tool-chip.d.ts +8 -1
  70. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  71. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
  72. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
  73. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +2 -2
  74. package/dist/configurator/ui/configurator-layout/universal/Layout.js +1 -1
  75. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  76. package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
  77. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +2 -2
  78. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -1
  79. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  80. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  81. package/dist/docs/index.json +1 -1
  82. package/dist/docs/layouts/custom-price.mdx +14 -16
  83. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  84. package/dist/docs/layouts/toolbar.mdx +3 -1
  85. package/dist/docs/other-features/domain-actions.mdx +1 -1
  86. package/dist/docs/other-features/side-effects.mdx +68 -34
  87. package/dist/docs/other-features/transformers.mdx +1 -1
  88. package/dist/docs/phoenix/admin.mdx +9 -24
  89. package/dist/docs/phoenix/localization.mdx +3 -22
  90. package/dist/docs/phoenix/phoenix-cli.mdx +81 -2
  91. package/dist/docs/phoenix/project-structure.mdx +9 -2
  92. package/dist/docs/phoenix/sdk-builder-workflow.mdx +4 -3
  93. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  94. package/dist/docs/relations/hierarchy.mdx +13 -2
  95. package/dist/domain/actions/action-factory.d.ts +4 -4
  96. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -1
  97. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  98. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  99. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  100. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  101. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  102. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  103. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  104. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +1 -3
  105. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  106. package/dist/domain/admin-domain/index.d.ts +1 -1
  107. package/dist/domain/application/admin-page-factories.d.ts +1 -1
  108. package/dist/domain/application/application-config.d.ts +25 -75
  109. package/dist/domain/application/assistant/assistant-manifest.d.ts +61 -0
  110. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +95 -0
  111. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  112. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  113. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  114. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  115. package/dist/{phoenix/application-spec → domain/application/assistant}/generate-assistant-prompt.d.ts +6 -5
  116. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  117. package/dist/domain/application/assistant/index.d.ts +4 -0
  118. package/dist/domain/application/assistant/index.js +1 -0
  119. package/dist/domain/application/assistant-field-options.d.ts +2 -3
  120. package/dist/domain/application/assistant-mutations.d.ts +2 -4
  121. package/dist/domain/application/assistant-mutations.js +1 -1
  122. package/dist/domain/application/assistant-recipe-groups.d.ts +2 -4
  123. package/dist/domain/application/configurator-builder.d.ts +33 -18
  124. package/dist/domain/application/configurator-builder.js +1 -1
  125. package/dist/domain/application/element-registration.d.ts +5 -0
  126. package/dist/domain/application/element-registration.js +1 -1
  127. package/dist/domain/application/handler-registration.d.ts +5 -0
  128. package/dist/domain/application/handler-registration.js +1 -1
  129. package/dist/domain/application/index.d.ts +5 -4
  130. package/dist/domain/application/index.js +1 -1
  131. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  132. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +1 -1
  133. package/dist/domain/application/published-data/map-published-data.d.ts +1 -2
  134. package/dist/domain/application/resolve-imported-transformers.d.ts +12 -2
  135. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  136. package/dist/domain/components/component-reader-types.d.ts +1 -2
  137. package/dist/domain/components/debug-state-component.d.ts +1 -1
  138. package/dist/domain/components/debug-state-component.js +1 -1
  139. package/dist/domain/components/domain-component-optic.d.ts +4 -6
  140. package/dist/domain/components/domain-component-optic.js +2 -2
  141. package/dist/domain/components/drag-state-component.d.ts +1 -1
  142. package/dist/domain/components/drag-state-component.js +1 -1
  143. package/dist/domain/components/export-state-component.d.ts +1 -1
  144. package/dist/domain/components/export-state-component.js +1 -1
  145. package/dist/domain/components/fullscreen-state-component.d.ts +1 -1
  146. package/dist/domain/components/fullscreen-state-component.js +1 -1
  147. package/dist/domain/components/group-components-by-entity-id-and-name.d.ts +1 -2
  148. package/dist/domain/components/group-components-by-entity-id-and-name.js +1 -1
  149. package/dist/domain/components/hover-state-component.d.ts +1 -1
  150. package/dist/domain/components/hover-state-component.js +1 -1
  151. package/dist/domain/components/legacy-filter.d.ts +1 -2
  152. package/dist/domain/components/navigation-state-component.d.ts +1 -1
  153. package/dist/domain/components/navigation-state-component.js +1 -1
  154. package/dist/domain/components/selection-state-component.d.ts +1 -1
  155. package/dist/domain/components/selection-state-component.js +1 -1
  156. package/dist/domain/components/system-component-builder.d.ts +1 -2
  157. package/dist/domain/components/system-component-builder.js +1 -1
  158. package/dist/domain/components/system-component-filter.d.ts +1 -3
  159. package/dist/domain/components/system-virtual-entity.js +1 -1
  160. package/dist/domain/components/tool-state-component.d.ts +1 -1
  161. package/dist/domain/components/tool-state-component.js +1 -1
  162. package/dist/domain/components/updates.d.ts +17 -2
  163. package/dist/domain/components/view-state-component.d.ts +1 -1
  164. package/dist/domain/components/view-state-component.js +1 -1
  165. package/dist/domain/components/viewport-state-component.d.ts +1 -1
  166. package/dist/domain/components/viewport-state-component.js +1 -1
  167. package/dist/domain/core/action.d.ts +4 -5
  168. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  169. package/dist/domain/core/decoder/create-decoder.js +1 -0
  170. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  171. package/dist/domain/core/decoder/index.d.ts +2 -0
  172. package/dist/domain/core/decoder/index.js +1 -0
  173. package/dist/domain/core/domain-factory.d.ts +3 -4
  174. package/dist/domain/core/domain-factory.js +1 -1
  175. package/dist/domain/core/domain.d.ts +3 -4
  176. package/dist/domain/core/domain.js +1 -1
  177. package/dist/domain/{expressions → core/expression}/constant-expressions.d.ts +2 -3
  178. package/dist/domain/core/expression/constant-expressions.js +1 -0
  179. package/dist/domain/{expressions → core/expression}/custom-expression.d.ts +4 -5
  180. package/dist/domain/core/expression/custom-expression.js +1 -0
  181. package/dist/domain/core/{expression.d.ts → expression/expression.d.ts} +6 -8
  182. package/dist/domain/core/expression/expression.js +1 -0
  183. package/dist/domain/core/expression/index.d.ts +5 -0
  184. package/dist/domain/core/expression/index.js +1 -0
  185. package/dist/domain/{expressions → core/expression}/memoize-expression.d.ts +2 -2
  186. package/dist/domain/{expressions → core/expression}/prepare-domain-expressions.d.ts +1 -1
  187. package/dist/domain/core/index.d.ts +7 -17
  188. package/dist/domain/core/index.js +1 -1
  189. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  190. package/dist/domain/core/model/index.d.ts +6 -0
  191. package/dist/domain/core/model/index.js +1 -0
  192. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  193. package/dist/domain/core/model/reflection.js +1 -0
  194. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  195. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  196. package/dist/domain/core/schema/index.d.ts +3 -0
  197. package/dist/domain/core/schema/index.js +1 -0
  198. package/dist/domain/core/schema/schema-validator.js +1 -0
  199. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  200. package/dist/domain/core/state/id-sequence.js +1 -0
  201. package/dist/domain/core/state/index.d.ts +3 -0
  202. package/dist/domain/core/state/index.js +1 -0
  203. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +1 -2
  204. package/dist/domain/core/{state.d.ts → state/state.d.ts} +1 -2
  205. package/dist/domain/domain-builder.d.ts +11 -8
  206. package/dist/domain/domain-builder.js +1 -1
  207. package/dist/domain/domain-context/action-system/action-system.d.ts +1 -3
  208. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  209. package/dist/domain/domain-context/create-transformer.d.ts +1 -1
  210. package/dist/domain/domain-context/domain-context-systems.d.ts +1 -3
  211. package/dist/domain/domain-context/index.d.ts +2 -2
  212. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +1 -2
  213. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -1
  214. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +1 -1
  215. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  216. package/dist/domain/domain-context/recipe-system/recipes.d.ts +1 -3
  217. package/dist/domain/domain-context/recipe-system/recipes.js +1 -1
  218. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +1 -1
  219. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  220. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +1 -1
  221. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +1 -1
  222. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +1 -1
  223. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -2
  224. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  225. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -12
  226. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  227. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -1
  228. package/dist/domain/domain-context/store-system/store-system.d.ts +1 -3
  229. package/dist/domain/domain-context/store-system/store-system.js +1 -1
  230. package/dist/domain/domain-context/store-system/system-state.d.ts +1 -3
  231. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -1
  232. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  233. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +1 -2
  234. package/dist/domain/domain-context/transformers/chain-builder.d.ts +2 -2
  235. package/dist/domain/domain-context/transformers/context.d.ts +1 -3
  236. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -1
  237. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  238. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -1
  239. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  240. package/dist/domain/domain-context/transformers/when-builder.d.ts +1 -2
  241. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  242. package/dist/domain/domain-context/undo-system.d.ts +1 -1
  243. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -3
  244. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  245. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +1 -2
  246. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  247. package/dist/domain/domain-runtime/domain-runtime.d.ts +4 -4
  248. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  249. package/dist/domain/domain-runtime/spec/selectors.d.ts +2 -2
  250. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  251. package/dist/domain/domain-runtime/spec/types.d.ts +3 -3
  252. package/dist/domain/index.d.ts +3 -4
  253. package/dist/domain/index.js +1 -1
  254. package/dist/domain/invariants/builtin-invariant.d.ts +1 -2
  255. package/dist/domain/invariants/custom-invariants.d.ts +1 -3
  256. package/dist/domain/invariants/invariants.d.ts +10 -4
  257. package/dist/domain/invariants/invariants.js +1 -1
  258. package/dist/domain/invariants/violation.d.ts +1 -1
  259. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +3 -3
  260. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  261. package/dist/domain/project-modules/index.d.ts +1 -0
  262. package/dist/domain/project-modules/index.js +1 -0
  263. package/dist/domain/project-modules/project-modules.d.ts +41 -0
  264. package/dist/domain/project-modules/project-modules.js +1 -0
  265. package/dist/domain/projections/projected-entities-projections.d.ts +1 -2
  266. package/dist/domain/projections/snap-matching.d.ts +1 -2
  267. package/dist/domain/projections/snap-utils.d.ts +1 -2
  268. package/dist/domain/relations/all-of-type-relation.d.ts +1 -4
  269. package/dist/domain/relations/all-of-type-relation.js +1 -1
  270. package/dist/domain/relations/component-factories.d.ts +1 -2
  271. package/dist/domain/relations/composed-of.d.ts +1 -1
  272. package/dist/domain/relations/composed-of.js +1 -1
  273. package/dist/domain/relations/direct-relation.d.ts +1 -3
  274. package/dist/domain/relations/indirect-relation.d.ts +1 -4
  275. package/dist/domain/relations/indirect-relation.js +1 -1
  276. package/dist/domain/relations/reference-component.d.ts +1 -2
  277. package/dist/domain/relations/reference-component.js +1 -1
  278. package/dist/domain/relations/reference-field.d.ts +1 -1
  279. package/dist/domain/relations/relation-factory.d.ts +1 -3
  280. package/dist/domain/relations/relation-implementation.d.ts +1 -4
  281. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  282. package/dist/domain/system-components/admin-sidebar.js +1 -1
  283. package/dist/domain/system-components/angle-indicator.d.ts +1 -1
  284. package/dist/domain/system-components/angle-indicator.js +1 -1
  285. package/dist/domain/system-components/application-config.d.ts +1 -1
  286. package/dist/domain/system-components/application-config.js +1 -1
  287. package/dist/domain/system-components/attribute-selection.js +1 -1
  288. package/dist/domain/system-components/autorotate-camera-component.d.ts +1 -1
  289. package/dist/domain/system-components/basic-sidebar-footer.d.ts +1 -1
  290. package/dist/domain/system-components/basic-sidebar-footer.js +1 -1
  291. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  292. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  293. package/dist/domain/system-components/camera-based-hidden-entity-object.js +1 -1
  294. package/dist/domain/system-components/camera-based-hidden-entity.js +1 -1
  295. package/dist/domain/system-components/canvas-config.d.ts +1 -1
  296. package/dist/domain/system-components/canvas-config.js +1 -1
  297. package/dist/domain/system-components/canvas-padding.d.ts +1 -1
  298. package/dist/domain/system-components/canvas-padding.js +1 -1
  299. package/dist/domain/system-components/canvas-preset-environment.d.ts +1 -1
  300. package/dist/domain/system-components/canvas-preset-environment.js +1 -1
  301. package/dist/domain/system-components/child-entity-selection.d.ts +1 -1
  302. package/dist/domain/system-components/client-side-image.js +1 -1
  303. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  304. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  305. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  306. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  307. package/dist/domain/system-components/common/dimension-indicator-schema.d.ts +1 -1
  308. package/dist/domain/system-components/common/dimension-indicator-schema.js +1 -1
  309. package/dist/domain/system-components/constraint.d.ts +1 -1
  310. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  311. package/dist/domain/system-components/custom-header.d.ts +1 -1
  312. package/dist/domain/system-components/custom-header.js +1 -1
  313. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  314. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  315. package/dist/domain/system-components/custom-sidebar-footer.d.ts +1 -1
  316. package/dist/domain/system-components/custom-sidebar-footer.js +1 -1
  317. package/dist/domain/system-components/dimension-indicator.d.ts +1 -1
  318. package/dist/domain/system-components/dimension-indicator.js +1 -1
  319. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  320. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  321. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  322. package/dist/domain/system-components/distance-dimension.js +1 -1
  323. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  324. package/dist/domain/system-components/drag-handle.js +1 -1
  325. package/dist/domain/system-components/editable-angle-indicator.d.ts +1 -1
  326. package/dist/domain/system-components/editable-angle-indicator.js +1 -1
  327. package/dist/domain/system-components/editable-distance-dimension-indicator.d.ts +1 -1
  328. package/dist/domain/system-components/editable-distance-dimension-indicator.js +1 -1
  329. package/dist/domain/system-components/editable-offset-indicator.d.ts +1 -1
  330. package/dist/domain/system-components/editable-offset-indicator.js +1 -1
  331. package/dist/domain/system-components/editable-size-indicator.d.ts +1 -1
  332. package/dist/domain/system-components/editable-size-indicator.js +1 -1
  333. package/dist/domain/system-components/exit-tool-mode-fab.d.ts +1 -1
  334. package/dist/domain/system-components/exit-tool-mode-fab.js +1 -1
  335. package/dist/domain/system-components/finalize-action.d.ts +1 -1
  336. package/dist/domain/system-components/finalize-action.js +1 -1
  337. package/dist/domain/system-components/fixed-header.d.ts +1 -1
  338. package/dist/domain/system-components/fixed-header.js +1 -1
  339. package/dist/domain/system-components/floating-header.d.ts +1 -1
  340. package/dist/domain/system-components/floating-header.js +1 -1
  341. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  342. package/dist/domain/system-components/generic-dimension.js +1 -1
  343. package/dist/domain/system-components/hidden-header.d.ts +1 -1
  344. package/dist/domain/system-components/hidden-header.js +1 -1
  345. package/dist/domain/system-components/hidden-sidebar-footer.d.ts +1 -1
  346. package/dist/domain/system-components/hidden-sidebar-footer.js +1 -1
  347. package/dist/domain/system-components/horizontal-tabs.d.ts +1 -1
  348. package/dist/domain/system-components/horizontal-tabs.js +1 -1
  349. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -1
  350. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  351. package/dist/domain/system-components/list-selector-dimension-indicator.d.ts +1 -1
  352. package/dist/domain/system-components/list-selector-dimension-indicator.js +1 -1
  353. package/dist/domain/system-components/material-swatch.js +1 -1
  354. package/dist/domain/system-components/offset-anchors.d.ts +1 -1
  355. package/dist/domain/system-components/offset-anchors.js +1 -1
  356. package/dist/domain/system-components/offset-indicator.d.ts +1 -2
  357. package/dist/domain/system-components/offset-indicator.js +1 -1
  358. package/dist/domain/system-components/offset.d.ts +1 -1
  359. package/dist/domain/system-components/offset.js +1 -1
  360. package/dist/domain/system-components/other-action.d.ts +1 -1
  361. package/dist/domain/system-components/other-action.js +1 -1
  362. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  363. package/dist/domain/system-components/pivot-point.js +1 -1
  364. package/dist/domain/system-components/price.js +1 -1
  365. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  366. package/dist/domain/system-components/projected-entities.js +1 -1
  367. package/dist/domain/system-components/property-page.d.ts +1 -1
  368. package/dist/domain/system-components/property-page.js +1 -1
  369. package/dist/domain/system-components/read-sidebar-footer.d.ts +1 -1
  370. package/dist/domain/system-components/read-sidebar-footer.js +1 -1
  371. package/dist/domain/system-components/save-template-thumbnail.js +1 -1
  372. package/dist/domain/system-components/scene-entity-add-fab.js +1 -1
  373. package/dist/domain/system-components/scene-entity-delete-fab.js +1 -1
  374. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  375. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  376. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +1 -1
  377. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  378. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  379. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  380. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  381. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  382. package/dist/domain/system-components/scene-entity-select-hotspot.js +1 -1
  383. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  384. package/dist/domain/system-components/sidebar-tabs.d.ts +1 -1
  385. package/dist/domain/system-components/sidebar-tabs.js +1 -1
  386. package/dist/domain/system-components/simple-summary.js +1 -1
  387. package/dist/domain/system-components/size.d.ts +1 -1
  388. package/dist/domain/system-components/size.js +1 -1
  389. package/dist/domain/system-components/sketching-draw.d.ts +1 -1
  390. package/dist/domain/system-components/sketching-draw.js +1 -1
  391. package/dist/domain/system-components/sketching-edit.d.ts +1 -1
  392. package/dist/domain/system-components/sketching-edit.js +1 -1
  393. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  394. package/dist/domain/system-components/sketching-line.js +1 -1
  395. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  396. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  397. package/dist/domain/system-components/sketching.d.ts +1 -1
  398. package/dist/domain/system-components/sketching.js +1 -1
  399. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  400. package/dist/domain/system-components/snap-axis.js +1 -1
  401. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  402. package/dist/domain/system-components/snap-edge.js +1 -1
  403. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  404. package/dist/domain/system-components/snap-plane.js +1 -1
  405. package/dist/domain/system-components/snap-point.d.ts +1 -1
  406. package/dist/domain/system-components/snap-point.js +1 -1
  407. package/dist/domain/system-components/summary-component.js +1 -1
  408. package/dist/domain/system-components/tool-menu-fab.d.ts +1 -1
  409. package/dist/domain/system-components/tool-menu-fab.js +1 -1
  410. package/dist/domain/system-components/toolbar.d.ts +1 -1
  411. package/dist/domain/system-components/toolbar.js +1 -1
  412. package/dist/domain/system-components/universal-sidebar-footer.d.ts +1 -1
  413. package/dist/domain/system-components/universal-sidebar-footer.js +1 -1
  414. package/dist/domain/utils/eval-cache.d.ts +1 -2
  415. package/dist/domain/utils/memo-eval.d.ts +1 -3
  416. package/dist/editor/Editor.js +1 -1
  417. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  418. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  419. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  420. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  421. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  422. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  423. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  424. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  425. package/dist/editor/variants/variant-preview-styles.js +1 -0
  426. package/dist/i18n/locales/cs/messages.js +1 -1
  427. package/dist/i18n/locales/da/messages.js +1 -1
  428. package/dist/i18n/locales/de/messages.js +1 -1
  429. package/dist/i18n/locales/de-AT/messages.js +1 -1
  430. package/dist/i18n/locales/en/messages.js +1 -1
  431. package/dist/i18n/locales/en-AU/messages.js +1 -1
  432. package/dist/i18n/locales/en-GB/messages.js +1 -1
  433. package/dist/i18n/locales/es/messages.js +1 -1
  434. package/dist/i18n/locales/fr/messages.js +1 -1
  435. package/dist/i18n/locales/hu/messages.js +1 -1
  436. package/dist/i18n/locales/it/messages.js +1 -1
  437. package/dist/i18n/locales/nl/messages.js +1 -1
  438. package/dist/i18n/locales/pl/messages.js +1 -1
  439. package/dist/i18n/locales/pt/messages.js +1 -1
  440. package/dist/i18n/locales/ro/messages.js +1 -1
  441. package/dist/i18n/locales/sk/messages.js +1 -1
  442. package/dist/i18n/locales/tr/messages.js +1 -1
  443. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  444. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  445. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  446. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  447. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  448. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  449. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  450. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  451. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  452. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  453. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  454. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  455. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  456. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  457. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  458. package/dist/phoenix/cli.js +1 -1
  459. package/dist/phoenix/commands/deploy.js +2 -2
  460. package/dist/phoenix/commands/dev.js +5 -5
  461. package/dist/phoenix/commands/index.d.ts +1 -0
  462. package/dist/phoenix/commands/index.js +1 -1
  463. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  464. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  465. package/dist/phoenix/commands/story-dev.js +2 -2
  466. package/dist/phoenix/commands/variants.d.ts +35 -0
  467. package/dist/phoenix/commands/variants.js +1 -0
  468. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  469. package/dist/phoenix/editor-server/commands-router.js +1 -1
  470. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  471. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  472. package/dist/phoenix/editor-server/editor-server.js +1 -1
  473. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  474. package/dist/phoenix/editor-server/spec-router.js +1 -1
  475. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  476. package/dist/phoenix/scripts/build-admin.js +1 -1
  477. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  478. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  479. package/dist/phoenix/services/index.d.ts +4 -0
  480. package/dist/phoenix/services/index.js +1 -1
  481. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  482. package/dist/phoenix/services/phoenix-application.js +1 -0
  483. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  484. package/dist/phoenix/services/phoenix-store.js +1 -0
  485. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  486. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  487. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  488. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  489. package/dist/phoenix/services/variant-file-session.js +1 -0
  490. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  491. package/dist/phoenix/services/variant-preview-service.js +1 -0
  492. package/dist/phoenix/services/vite-config.js +1 -1
  493. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
  494. package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
  495. package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
  496. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  497. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  498. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  499. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  500. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +4 -4
  501. package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
  502. package/dist/ui-sdk/common/use-viewport-size.js +1 -1
  503. package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
  504. package/dist/webhook/builders/common.d.ts +3 -0
  505. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  506. package/dist/webhook/builders/webhook-builder.js +1 -1
  507. package/package.json +4 -4
  508. package/dist/configurator/assistant/index.d.ts +0 -1
  509. package/dist/configurator/assistant/index.js +0 -1
  510. package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -30
  511. package/dist/configurator/assistant/use-assistant-chat.js +0 -1
  512. package/dist/configurator/ui/assistant/AssistantPanelProvider.d.ts +0 -42
  513. package/dist/configurator/ui/assistant/AssistantPanelProvider.js +0 -1
  514. package/dist/domain/core/json-schema.js +0 -1
  515. package/dist/domain/core/reflection.js +0 -1
  516. package/dist/domain/expressions/constant-expressions.js +0 -1
  517. package/dist/domain/expressions/custom-expression.js +0 -1
  518. package/dist/domain/expressions/index.d.ts +0 -1
  519. package/dist/domain/expressions/index.js +0 -1
  520. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
  521. /package/dist/domain/{core/enhanced-json-schema.js → application/assistant/assistant-manifest.js} +0 -0
  522. /package/dist/domain/{core/expression.js → application/assistant/assistant-resolved-manifest.js} +0 -0
  523. /package/dist/domain/core/{schema-validator.js → decoder/decoder.js} +0 -0
  524. /package/dist/domain/{expressions → core/expression}/memoize-expression.js +0 -0
  525. /package/dist/domain/{expressions → core/expression}/prepare-domain-expressions.js +0 -0
  526. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  527. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  528. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  529. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  530. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  531. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  532. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  533. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  534. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  535. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  536. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  537. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  538. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  539. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  540. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  541. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  542. /package/dist/domain/core/{migrations.js → state/migrations.js} +0 -0
  543. /package/dist/domain/core/{state.js → state/state.js} +0 -0
@@ -1 +1 @@
1
- import{GraphQLError as e,buildSchema as t,defaultFieldResolver as i,getNamedType as o,graphql as a,validateSchema as n}from"graphql";import{assertExistence as r,createSelector as s,isMessageDescriptor as l,isMultilingualString as c}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as h,findAssistantMutation as d}from"#package/domain";import{createEntityMeta as m}from"./entity-meta.js";let p={errors:[new e('No assistant manifest in the application spec. The GraphQL schema is generated from the "assistant" section. Add an "assistant" section to a spec file to expose a schema.')]},u={errors:[new e("The configuration is not loaded yet, so there is no state to query. Run the query again once the configurator has finished loading.")]},f=new RegExp(h.pattern),y=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,g=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,v=e=>e instanceof Error?e.message:String(e),S=e=>/[.!?]$/.test(e)?e:`${e}.`,_=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,x=(e,t)=>{let i=_(e)?e._raw:void 0;if(y(i))return i;if(!Array.isArray(e)&&!_(e))return e;if(t.has(e))throw Error("The value contains itself. Return ids or copies of the values instead of objects that reference each other.");let o=new Set([...t,e]);return Array.isArray(e)?e.map(e=>x(e,o)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,x(t,o)]))},w=(e,t)=>Array.isArray(e)?e.map(e=>w(e,t)):"string"==typeof e||l(e)||c(e)?t(e):e,$=t=>new e(`The GraphQL schema generated from the "assistant" manifest is invalid: ${S(t)} Regenerate the application so the schema is rebuilt from the current spec.`),E=e=>(e.errors?.length??0)>0,b=t=>({errors:[new e(`Not run: operation ${t+1} failed, so the operations after it were skipped and no change of the list takes effect. Fix the failing operation and send the whole list again.`)]});export class GraphQLSystem{_context;_selectSchema=s([s.leaf(e=>e)],e=>{try{let i=t(e),o=n(i);return o.length>0?$(o.map(e=>e.message).join(" ")):i}catch(e){return $(v(e))}});_selectFieldResolver=s([s.leaf(e=>e)],t=>(a,n,r,s)=>{if(s.parentType===s.schema.getQueryType())return i(a,n,r,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),n,r);if(!y(a))return i(a,n,r,s);if("meta"===s.fieldName){let e;return m({entity:a,state:("object"==typeof(e=g(a,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??r.state},{manifest:r.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i),find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e)})}let{source:l,localized:c}=t[s.parentType.name]?.[s.fieldName]??{source:s.fieldName},h=((t,i)=>{try{return g(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${y(t)?t.id:"an entity"}: ${S(v(o))} The expression threw while the query read it; fix the expression or the configuration state it reads.`,{originalError:o instanceof Error?o:void 0})}})(a,l);return c?w(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(s.returnType).name?((t,i,o)=>{try{return x(o,new Set)}catch(o){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${y(t)?t.id:"an entity"}: ${S(v(o))} A JSON field can only return data that serializes to JSON.`,{originalError:o instanceof Error?o:void 0})}})(a,l,h):h});constructor(e){this._context=e}_get$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().get$Entity(e,t);_find$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().getEntity(e,t)?this._get$Entity(e,t):null;_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={root:(e,{state:t})=>this._get$Entity(t.rootEntityId,t),entities:({ids:t},{state:i})=>{if(null==t)return i.entities.map(e=>this._get$Entity(e.id,i));var o=i.rootEntityId;let a=t.filter(e=>!f.test(e));if(a.length>0)throw new e(`${a.map(e=>`"${e}"`).join(", ")} ${1===a.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${o}". Use ids as returned by the "id" field.`);return t.map(e=>f.test(e)?this._find$Entity(e,i):null)},selectedEntity:(e,{state:t})=>this._find$Entity(this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),t),navigation:(e,{state:t})=>{let i=this._context.domainContextSelectors.getNavigationSystem();return{navigationState:i.getActiveNavigationState(t),viewState:i.getActiveViewState(t),toolState:i.getActiveToolState(t)}}};_resolveType=e=>y(e)?e.type:void 0;initialize=()=>{};_resolveMutation=(t,i,o,a)=>{if(void 0!==a.failedMutationField)throw new e(`Not run: the earlier field "${a.failedMutationField}" of this operation failed, so "${i}" was skipped and no change of the operation takes effect. Fix the failing field and send the operation again.`);try{return this._runMutation(t,o,a)}catch(e){throw a.failedMutationField=i,e}};_runMutation=(t,i,o)=>{let a=d(t,o.manifest);if(!a)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. Regenerate the application so the schema matches the configurator.`);let n=o.state,r=a.implementation(i,n,{manifest:o.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(n),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(r.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(r.updates,n,"committed");if(!i.validity.valid)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: ${(e=>{if("uncaught"===e.severity)return`validating it threw: ${S(v(e.error))}`;let t=[...new Set(e.entityViolations.filter(({violation:t})=>t.severity===e.severity).map(({entityId:e})=>e))];return`it has ${e.severity} violations on ${t.join(", ")}.`})(i.validity)} Change the request so the configuration stays valid.`);o.emissions.push(i),o.state=i.state}return r.readResult({previousState:n,state:o.state})};_setup=()=>{let t=this._context.specSelectors.getAssistant();if(!t)return{ready:!1,result:p};let i=this._selectSchema(t.sdl);return i instanceof e?{ready:!1,result:{errors:[i]}}:{ready:!0,assistant:t,schema:i,fieldResolver:this._selectFieldResolver(t.fields)}};prepare=async(e,t)=>{let i,o=this._setup();if(!o.ready)return t.map(()=>({result:o.result,emissions:[]}));let n={manifest:o.assistant,state:e,emissions:[],failedMutationField:void 0},r=[];for(let[e,s]of t.entries())if(void 0===i){let t=n.emissions.length;n.failedMutationField=void 0;let l=await a({schema:o.schema,source:s.document,rootValue:this._rootValue,contextValue:n,variableValues:s.variables,operationName:s.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType});r.push({result:l,emissions:n.emissions.slice(t)}),E(l)&&(i=e)}else r.push({result:b(i),emissions:[]});return r};_prepareAndCommit=async e=>{let t,i,o,a=this._context.domainContextSelectors.getStoreSystem(),n=await this.prepare(a.stateSlices.committed.value.state,e),s=n.map(({result:e})=>e),l=n.flatMap(e=>e.emissions);return s.some(E)||0===l.length?{results:s,outcome:"none"}:{results:s,outcome:a.commitPrepared((t=r(l[0]),i=r(l[l.length-1]),o=l.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:t.previousState,state:i.state,updates:l.flatMap(e=>e.updates),validity:i.validity,transformationLog:o?l.flatMap(e=>e.transformationLog??[]):void 0}))}};execute=async e=>{if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>u),committed:!1};let t=await this._prepareAndCommit(e),{results:i,outcome:o}="conflict"===t.outcome?await this._prepareAndCommit(e):t;return"committed"===o?{results:i,committed:!0}:"held"===o?{results:i,committed:!1,message:"The changes were not committed yet: the application held them, usually to ask the user for approval. They may still be applied once the user approves, and the next turn shows whether they were. Do not send the operations again."}:"conflict"===o?{results:i,committed:!1,message:"The changes were not committed, because the configuration changed while they were being applied. The results describe a state that was discarded. Query the current configuration and send the operations again if they still make sense."}:{results:i,committed:!1}}}
1
+ import{GraphQLError as e,buildSchema as t,defaultFieldResolver as i,getNamedType as o,graphql as a,validateSchema as n}from"graphql";import{assertExistence as r,createSelector as s,isMessageDescriptor as l,isMultilingualString as c}from"@salsita-ai/common/utils";import{DomainEntityIdSchema as h,findAssistantMutation as d}from"#package/domain";import{createEntityMeta as m}from"./entity-meta.js";import{readSideEffects as p}from"./side-effects.js";let f={errors:[new e('No assistant manifest in the application spec. The GraphQL schema is generated from the "assistant" section. Add an "assistant" section to a spec file to expose a schema.')]},u={errors:[new e("The configuration is not loaded yet, so there is no state to query. Run the query again once the configurator has finished loading.")]},y=new RegExp(h.pattern),g=e=>"object"==typeof e&&null!==e&&"type"in e&&"string"==typeof e.type&&"id"in e&&"string"==typeof e.id,v=(e,t)=>"object"==typeof e&&null!==e?Reflect.get(e,t):void 0,S=e=>e instanceof Error?e.message:String(e),x=e=>/[.!?]$/.test(e)?e:`${e}.`,_=e=>"object"==typeof e&&null!==e&&Object.getPrototypeOf(e)===Object.prototype,w=(e,t)=>{let i=_(e)?e._raw:void 0;if(g(i))return i;if(!Array.isArray(e)&&!_(e))return e;if(t.has(e))throw Error("The value contains itself. Return ids or copies of the values instead of objects that reference each other.");let o=new Set([...t,e]);return Array.isArray(e)?e.map(e=>w(e,o)):Object.fromEntries(Object.entries(e).map(([e,t])=>[e,w(t,o)]))};export const localize=(e,t)=>Array.isArray(e)?e.map(e=>localize(e,t)):"string"==typeof e||l(e)||c(e)?t(e):e;let E=t=>new e(`The GraphQL schema generated from the "assistant" manifest is invalid: ${x(t)} Regenerate the application so the schema is rebuilt from the current spec.`),$=e=>(e.errors?.length??0)>0,b=t=>({errors:[new e(`Not run: operation ${t+1} failed, so the operations after it were skipped and no change of the list takes effect. Fix the failing operation and send the whole list again.`)]});export class GraphQLSystem{_context;_selectSchema=s([s.leaf(e=>e)],e=>{try{let i=t(e),o=n(i);return o.length>0?E(o.map(e=>e.message).join(" ")):i}catch(e){return E(S(e))}});_selectFieldResolver=s([s.leaf(e=>e)],t=>(a,n,r,s)=>{if(s.parentType===s.schema.getQueryType())return i(a,n,r,s);if(s.parentType===s.schema.getMutationType())return this._resolveMutation(s.fieldName,String(s.path.key),n,r);if(!g(a))return i(a,n,r,s);if("meta"===s.fieldName){let e;return m({entity:a,state:("object"==typeof(e=v(a,"_state"))&&null!==e&&"entities"in e&&"rootEntityId"in e?e:void 0)??r.state},{manifest:r.manifest,recipes:this._recipeContext(),prepareStateEmission:(e,t,i)=>this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(e,t,i),find$Entity:(e,t)=>this._find$Entity(e,t),validateEntity:e=>this._context.domainContextSelectors.getDomain().validateEntity(e)})}let{source:l,localized:c}=t[s.parentType.name]?.[s.fieldName]??{source:s.fieldName},h=((t,i)=>{try{return v(t,i)}catch(o){throw new e(`Expression "${i}" failed on ${g(t)?t.id:"an entity"}: ${x(S(o))} The expression threw while the query read it; fix the expression or the configuration state it reads.`,{originalError:o instanceof Error?o:void 0})}})(a,l);return c?localize(h,this._context.domainServicesSelectors.getResolveLocalizable()):l.startsWith("$")&&"JSON"===o(s.returnType).name?((t,i,o)=>{try{return w(o,new Set)}catch(o){throw new e(`Expression "${i}" returned a value that is not plain serializable data on ${g(t)?t.id:"an entity"}: ${x(S(o))} A JSON field can only return data that serializes to JSON.`,{originalError:o instanceof Error?o:void 0})}})(a,l,h):h});constructor(e){this._context=e}_get$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().get$Entity(e,t);_find$Entity=(e,t)=>this._context.domainContextSelectors.getDomain().getEntity(e,t)?this._get$Entity(e,t):null;_recipeContext=()=>({componentReader:this._context.domainContextSelectors.getComponentReader(),recipeCooker:this._context.domainContextSelectors.getRecipeCookerSystem(),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});_rootValue={root:(e,{state:t})=>this._get$Entity(t.rootEntityId,t),entities:({ids:t},{state:i})=>{if(null==t)return i.entities.map(e=>this._get$Entity(e.id,i));var o=i.rootEntityId;let a=t.filter(e=>!y.test(e));if(a.length>0)throw new e(`${a.map(e=>`"${e}"`).join(", ")} ${1===a.length?"is not an entity id":"are not entity ids"}. Entity ids have the form "<Type>-<number>", e.g. "${o}". Use ids as returned by the "id" field.`);return t.map(e=>y.test(e)?this._find$Entity(e,i):null)},selectedEntity:(e,{state:t})=>this._find$Entity(this._context.domainContextSelectors.getNavigationSystem().getActiveSelectionState(t),t),navigation:(e,{state:t})=>{let i=this._context.domainContextSelectors.getNavigationSystem();return{navigationState:i.getActiveNavigationState(t),viewState:i.getActiveViewState(t),toolState:i.getActiveToolState(t)}}};_resolveType=e=>g(e)?e.type:void 0;initialize=()=>{};_resolveMutation=(t,i,o,a)=>{if(void 0!==a.failedMutationField)throw new e(`Not run: the earlier field "${a.failedMutationField}" of this operation failed, so "${i}" was skipped and no change of the operation takes effect. Fix the failing field and send the operation again.`);try{return this._runMutation(t,o,a)}catch(e){throw a.failedMutationField=i,e}};_runMutation=(t,i,o)=>{let a=d(t,o.manifest);if(!a)throw new e(`The schema declares the mutation "${t}", but the configurator has no implementation for it. Regenerate the application so the schema matches the configurator.`);let n=o.state,r=a.implementation(i,n,{manifest:o.manifest,action:this._context.domainContextSelectors.getActionSystem().createContext(n),resolveLocalizable:this._context.domainServicesSelectors.getResolveLocalizable()});if(r.updates.length>0){let i=this._context.domainContextSelectors.getStoreSystem().prepareStateEmission(r.updates,n,"committed");if(!i.validity.valid)throw new e(`The changes of "${t}" were not applied, because the resulting configuration is invalid: ${(e=>{if("uncaught"===e.severity)return`validating it threw: ${x(S(e.error))}`;let t=[...new Set(e.entityViolations.filter(({violation:t})=>t.severity===e.severity).map(({entityId:e})=>e))];return`it has ${e.severity} violations on ${t.join(", ")}.`})(i.validity)} Change the request so the configuration stays valid.`);o.emissions.push(i),o.state=i.state}return r.readResult({previousState:n,state:o.state})};_setup=()=>{let t=this._context.specSelectors.getAssistant();if(!t)return{ready:!1,result:f};let i=this._selectSchema(t.sdl);return i instanceof e?{ready:!1,result:{errors:[i]}}:{ready:!0,assistant:t,schema:i,fieldResolver:this._selectFieldResolver(t.fields)}};prepare=async(e,t)=>{let i,o=this._setup();if(!o.ready)return t.map(()=>({result:o.result,emissions:[]}));let n={manifest:o.assistant,state:e,emissions:[],failedMutationField:void 0},r=[];for(let[e,s]of t.entries())if(void 0===i){let t=n.emissions.length;n.failedMutationField=void 0;let l=await a({schema:o.schema,source:s.document,rootValue:this._rootValue,contextValue:n,variableValues:s.variables,operationName:s.operationName,fieldResolver:o.fieldResolver,typeResolver:this._resolveType});r.push({result:l,emissions:n.emissions.slice(t)}),$(l)&&(i=e)}else r.push({result:b(i),emissions:[]});return r};readSideEffects=e=>{let t=this._context.domainServicesSelectors.getResolveLocalizable();return e.flatMap(({emissions:e})=>e.flatMap(e=>p(e.updates,t)))};_prepareAndCommit=async e=>{let t,i,o,a=this._context.domainContextSelectors.getStoreSystem(),n=await this.prepare(a.stateSlices.committed.value.state,e),s=n.map(({result:e})=>e),l=this.readSideEffects(n),c=n.flatMap(e=>e.emissions);return s.some($)||0===c.length?{results:s,sideEffects:l,outcome:"none"}:{results:s,sideEffects:l,outcome:a.commitPrepared((t=r(c[0]),i=r(c[c.length-1]),o=c.some(e=>void 0!==e.transformationLog),{kind:"committed",previousState:t.previousState,state:i.state,updates:c.flatMap(e=>e.updates),validity:i.validity,transformationLog:o?c.flatMap(e=>e.transformationLog??[]):void 0}))}};execute=async e=>{if(!this._context.domainContextSelectors.getStoreSystem().isInitialized)return{results:e.map(()=>u),committed:!1,sideEffects:[]};let t=await this._prepareAndCommit(e),{results:i,sideEffects:o,outcome:a}="conflict"===t.outcome?await this._prepareAndCommit(e):t;return"committed"===a?{results:i,committed:!0,sideEffects:o}:"held"===a?{results:i,committed:!1,message:"The changes were not committed yet: the application held them, usually to ask the user for approval. They may still be applied once the user approves, and the next turn shows whether they were. Do not send the operations again.",sideEffects:o}:"conflict"===a?{results:i,committed:!1,message:"The changes were not committed, because the configuration changed while they were being applied. The results describe a state that was discarded. Query the current configuration and send the operations again if they still make sense.",sideEffects:o}:{results:i,committed:!1,sideEffects:o}}}
@@ -0,0 +1,9 @@
1
+ import type { Localizable } from '@salsita-ai/common/utils';
2
+ import type { DataUpdate, DomainEntity } from '#package/domain';
3
+ /**
4
+ * What the updates of an emission tell the assistant agent the configurator did beyond what was
5
+ * asked, in applied order with duplicates kept, the way the user gets them as snackbars. An update's
6
+ * `agentHint` replaces its user-facing `hint` for the agent, `null` keeps the update from the agent,
7
+ * and an update with neither says nothing. Empty text counts as none, as it does for the snackbar.
8
+ */
9
+ export declare const readSideEffects: (updates: ReadonlyArray<DataUpdate<DomainEntity<string>, DomainEntity<string>>>, resolveLocalizable: (message: Localizable) => string) => readonly string[];
@@ -0,0 +1 @@
1
+ export const readSideEffects=(e,t)=>e.flatMap(({hint:e,agentHint:a})=>null===a?[]:void 0!==a?a?[a]:[]:e?[t(e)]:[]);
@@ -1,5 +1,5 @@
1
1
  export { AnimationSystem, type AnimationSystemContext } from './animation-system.js';
2
- export { type AssistantClientTool, AssistantSystem, type AssistantSystemContext, } from './assistant-system/assistant-system.js';
2
+ export { type AssistantChatSnapshot, type AssistantClientTool, type AssistantPanelSnapshot, AssistantSystem, type AssistantSystemContext, } from './assistant-system/assistant-system.js';
3
3
  export { CameraControlSystem, CameraControlType } from './camera-control-system/camera-control-system.js';
4
4
  export { type AnyCameraSystem, CameraSystem, type CameraSystemContext } from './camera-control-system/camera-system.js';
5
5
  export { createCameraControls } from './camera-control-system/create-camera-controls.js';
@@ -1,25 +1,25 @@
1
1
  import { type EntityId } from '#package/domain';
2
- declare const CloseConfiguratorClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
3
- declare const PreviousStepButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
4
- declare const NextStepButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
5
- declare const FinalizeButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
6
- declare const SummaryButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
7
- declare const TopNavigationStepClicked: (step: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
8
- declare const HorizontalTabClicked: (tab: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
9
- declare const GoToProductsClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
10
- declare const ExpandedViewClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
11
- declare const ProductSelected: (productType: string, productName: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
12
- declare const SelectionHotspotClicked: (id: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
13
- declare const RedoButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
14
- declare const UndoButtonClicked: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
15
- declare const GlobalDimensionsButtonClicked: (dimensionUnit: string) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
16
- declare const MeasurementsMenuToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
17
- declare const MeasurementsMenuClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
18
- declare const DimensionIndicatorsToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
19
- declare const FullScreenModeToggled: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
20
- declare const HelpDialogOpened: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
21
- declare const HelpDialogClosed: () => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
22
- declare const EntityDeleteHotspotClicked: (id: EntityId) => import("../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
2
+ declare const CloseConfiguratorClicked: () => import("#package/domain").UserActionEvent;
3
+ declare const PreviousStepButtonClicked: () => import("#package/domain").UserActionEvent;
4
+ declare const NextStepButtonClicked: () => import("#package/domain").UserActionEvent;
5
+ declare const FinalizeButtonClicked: () => import("#package/domain").UserActionEvent;
6
+ declare const SummaryButtonClicked: () => import("#package/domain").UserActionEvent;
7
+ declare const TopNavigationStepClicked: (step: string) => import("#package/domain").UserActionEvent;
8
+ declare const HorizontalTabClicked: (tab: string) => import("#package/domain").UserActionEvent;
9
+ declare const GoToProductsClicked: () => import("#package/domain").UserActionEvent;
10
+ declare const ExpandedViewClosed: () => import("#package/domain").UserActionEvent;
11
+ declare const ProductSelected: (productType: string, productName: string) => import("#package/domain").UserActionEvent;
12
+ declare const SelectionHotspotClicked: (id: string) => import("#package/domain").UserActionEvent;
13
+ declare const RedoButtonClicked: () => import("#package/domain").UserActionEvent;
14
+ declare const UndoButtonClicked: () => import("#package/domain").UserActionEvent;
15
+ declare const GlobalDimensionsButtonClicked: (dimensionUnit: string) => import("#package/domain").UserActionEvent;
16
+ declare const MeasurementsMenuToggled: () => import("#package/domain").UserActionEvent;
17
+ declare const MeasurementsMenuClosed: () => import("#package/domain").UserActionEvent;
18
+ declare const DimensionIndicatorsToggled: () => import("#package/domain").UserActionEvent;
19
+ declare const FullScreenModeToggled: () => import("#package/domain").UserActionEvent;
20
+ declare const HelpDialogOpened: () => import("#package/domain").UserActionEvent;
21
+ declare const HelpDialogClosed: () => import("#package/domain").UserActionEvent;
22
+ declare const EntityDeleteHotspotClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
23
23
  export declare const FrontendAnalyticsFactory: {
24
24
  CloseConfiguratorClicked: typeof CloseConfiguratorClicked;
25
25
  PreviousStepButtonClicked: typeof PreviousStepButtonClicked;
@@ -1,6 +1,5 @@
1
1
  export { ConfiguratorApp } from './ConfiguratorApp.js';
2
2
  export * from './application-runtime/index.js';
3
- export * from './assistant/index.js';
4
3
  export * from './common/index.js';
5
4
  export * from './configurator-context/index.js';
6
5
  export * from './pages/index.js';
@@ -1 +1 @@
1
- export{ConfiguratorApp}from"./ConfiguratorApp.js";export*from"./application-runtime/index.js";export*from"./assistant/index.js";export*from"./common/index.js";export*from"./configurator-context/index.js";export*from"./pages/index.js";export*from"./scene/index.js";export*from"./ui/index.js";export*from"./integration/index.js";
1
+ export{ConfiguratorApp}from"./ConfiguratorApp.js";export*from"./application-runtime/index.js";export*from"./common/index.js";export*from"./configurator-context/index.js";export*from"./pages/index.js";export*from"./scene/index.js";export*from"./ui/index.js";export*from"./integration/index.js";
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e,Fragment as i}from"react/jsx-runtime";import r from"mui-modal-provider";import{memo as n,useCallback as t,useMemo as a}from"react";import{match as d}from"ts-pattern";import{InvalidAccessKeyError as s}from"#package/client";import{BuiltInLoadingPhase as u,CommonAnalyticsFactory as l,DomainLifecycleBoundary as m,LoadedDataProvider as c,useAccessService as f,useAnalyticsService as p,useAuthorizedClient as g,useConfiguratorDomainFactory as v,useConfiguratorLoadStatus as w,useConfiguratorRawLoadedData as y,useExpectPhase as h,useLoadedDataActions as I,useLoadingError as C,useLoadingPhase as b,useLogger as j,useRoutingService as x}from"#package/react-sdk";import{IntegrationSubscription as k,OnConfiguratorReadyProvider as L,ViewportStateSync as U,useLayoutSystemConfig as M}from"../configurator-context/index.js";import{Layout as S,Legacy as E}from"../ui/index.js";import{LayoutCustomOwnerUi as F,LayoutCustomReadUi as R,LayoutDialog as D}from"../ui/phoenix-layout-elements/index.js";import{ConfiguratorNotFoundPage as T}from"./ConfiguratorNotFoundPage.js";import{DevContextFallback as P}from"./error-boundaries/DevContextFallback.js";import{DevLoadingFallback as A}from"./error-boundaries/DevLoadingFallback.js";import{LoadingErrorBoundary as O}from"./error-boundaries/LoadingErrorBoundary.js";import{useLoad as V}from"./use-load.js";let q=n(n=>{let{viewMode:t}=n,s=M(),{ownerUi:u,readUi:l}=a(()=>d(s.layout).with("simple",()=>({ownerUi:o(E.SimpleOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("tabs",()=>({ownerUi:o(E.TabsOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("steps",()=>({ownerUi:o(E.StepsOwnerLayout,{}),readUi:o(E.SummaryReadLayout,{})})).with("universal",()=>({ownerUi:o(S,{}),readUi:o(S,{})})).with("custom",()=>({ownerUi:o(F,{}),readUi:o(R,{})})).exhaustive(),[s.layout]);return o(r,{children:e(L,{children:[t?l:u,"universal"===s.layout&&e(i,{children:[o(E.CommonFinalizePage,{}),o(D,{})]})]})})});export const LoadedConfiguratorDetailPage=()=>{h(u.SceneAssets);let{configurationId:i,accessInfo:r}=f(),n=g(),a=x(),d=j(),L=p(),{startConfiguratorLoad:M,completeConfiguratorLoad:S,failConfiguratorLoad:E,resetConfiguratorLoad:F}=I(),{isLoading:R,isError:D}=w(),z=y(),B=v(),G=t(()=>r.viewMode&&void 0!==r.revisionId?n.getConfigurationRevision(i,r.revisionId):n.getConfiguration(i),[r.revisionId,r.viewMode,n,i]),N=t(()=>{M()},[M]),H=t(o=>{S({initialRevisionId:o.revisionId,initialEntities:o.data,modelVersion:o.modelVersion,rootEntityType:o.rootEntityType,schemaIdentity:B}),L.push(l.ConfigurationLoaded(o.configurationId,o.revisionId,r.viewMode?"read":"owner")),d.appendToGlobalContext({configurationId:o.configurationId,revisionId:o.revisionId,mode:r.viewMode}),d.info("Configuration loaded.")},[r.viewMode,L,S,B,d]),J=t(o=>{if(E(o),o instanceof s)return void a.rejectAccessToken(i,r.raw);let e=o instanceof Error?o:Error("Configuration loading failed with an unknown error.",{cause:o});d.error("Configuration loading failed because the API request did not succeed. Verify the configuration ID and access token.",{configurationId:i},e)},[r.raw,i,E,d,a]),K=t(()=>{F()},[F]);return(V({key:[n,i,r.revisionId,r.viewMode],load:G,onStart:N,onSuccess:H,onError:J,onCleanup:K}),b({id:u.DataFetch,label:"Loading configurationâ€Ļ"},R),C(D),D)?o(T,{}):null===z?null:o(c,{value:z,children:o(O,{fallbackRender:e=>o(A,{...e}),children:o(m,{type:"configurator",children:o(O,{FallbackComponent:P,children:e(k,{children:[o(U,{}),o(q,{viewMode:r.viewMode})]})})})})})};
1
+ import{jsx as e,jsxs as o,Fragment as i}from"react/jsx-runtime";import r from"mui-modal-provider";import{memo as n,useCallback as t,useEffect as a,useMemo as d}from"react";import{match as s}from"ts-pattern";import{InvalidAccessKeyError as l}from"#package/client";import{BuiltInLoadingPhase as u,CommonAnalyticsFactory as m,DomainLifecycleBoundary as c,LoadedDataProvider as f,useAccessService as p,useAnalyticsService as g,useAuthorizedClient as v,useConfiguratorDomainFactory as w,useConfiguratorLoadStatus as y,useConfiguratorRawLoadedData as h,useExpectPhase as I,useLoadedDataActions as j,useLoadingError as x,useLoadingPhase as C,useLogger as b,useRoutingService as k,useSpecAssistant as L}from"#package/react-sdk";import{useConfigurator as U}from"../application-runtime/index.js";import{IntegrationSubscription as M,OnConfiguratorReadyProvider as S,ViewportStateSync as E,useLayoutSystemConfig as F}from"../configurator-context/index.js";import{Layout as R,Legacy as D}from"../ui/index.js";import{LayoutCustomOwnerUi as T,LayoutCustomReadUi as P,LayoutDialog as A}from"../ui/phoenix-layout-elements/index.js";import{ConfiguratorNotFoundPage as O}from"./ConfiguratorNotFoundPage.js";import{DevContextFallback as V}from"./error-boundaries/DevContextFallback.js";import{DevLoadingFallback as q}from"./error-boundaries/DevLoadingFallback.js";import{LoadingErrorBoundary as z}from"./error-boundaries/LoadingErrorBoundary.js";import{useLoad as B}from"./use-load.js";let G=n(n=>{let{viewMode:t}=n,l=F();(()=>{let{assistantSystem:e}=U(),o=null!=L();a(()=>{if(o)return e.activate()},[e,o])})();let{ownerUi:u,readUi:m}=d(()=>s(l.layout).with("simple",()=>({ownerUi:e(D.SimpleOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("tabs",()=>({ownerUi:e(D.TabsOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("steps",()=>({ownerUi:e(D.StepsOwnerLayout,{}),readUi:e(D.SummaryReadLayout,{})})).with("universal",()=>({ownerUi:e(R,{}),readUi:e(R,{})})).with("custom",()=>({ownerUi:e(T,{}),readUi:e(P,{})})).exhaustive(),[l.layout]);return e(r,{children:o(S,{children:[t?m:u,"universal"===l.layout&&o(i,{children:[e(D.CommonFinalizePage,{}),e(A,{})]})]})})});export const LoadedConfiguratorDetailPage=()=>{I(u.SceneAssets);let{configurationId:i,accessInfo:r}=p(),n=v(),a=k(),d=b(),s=g(),{startConfiguratorLoad:L,completeConfiguratorLoad:U,failConfiguratorLoad:S,resetConfiguratorLoad:F}=j(),{isLoading:R,isError:D}=y(),T=h(),P=w(),A=t(()=>r.viewMode&&void 0!==r.revisionId?n.getConfigurationRevision(i,r.revisionId):n.getConfiguration(i),[r.revisionId,r.viewMode,n,i]),N=t(()=>{L()},[L]),H=t(e=>{U({initialRevisionId:e.revisionId,initialEntities:e.data,modelVersion:e.modelVersion,rootEntityType:e.rootEntityType,schemaIdentity:P}),s.push(m.ConfigurationLoaded(e.configurationId,e.revisionId,r.viewMode?"read":"owner")),d.appendToGlobalContext({configurationId:e.configurationId,revisionId:e.revisionId,mode:r.viewMode}),d.info("Configuration loaded.")},[r.viewMode,s,U,P,d]),J=t(e=>{if(S(e),e instanceof l)return void a.rejectAccessToken(i,r.raw);let o=e instanceof Error?e:Error("Configuration loading failed with an unknown error.",{cause:e});d.error("Configuration loading failed because the API request did not succeed. Verify the configuration ID and access token.",{configurationId:i},o)},[r.raw,i,S,d,a]),K=t(()=>{F()},[F]);return(B({key:[n,i,r.revisionId,r.viewMode],load:A,onStart:N,onSuccess:H,onError:J,onCleanup:K}),C({id:u.DataFetch,label:"Loading configurationâ€Ļ"},R),x(D),D)?e(O,{}):null===T?null:e(f,{value:T,children:e(z,{fallbackRender:o=>e(q,{...o}),children:e(c,{type:"configurator",children:e(z,{FallbackComponent:V,children:o(M,{children:[e(E,{}),e(G,{viewMode:r.viewMode})]})})})})})};
@@ -1,5 +1,5 @@
1
- declare const PerspectiveCameraDragEvent: () => import("../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
2
- declare const OrthographicCameraDragEvent: () => import("../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
1
+ declare const PerspectiveCameraDragEvent: () => import("#package/domain").UserActionEvent;
2
+ declare const OrthographicCameraDragEvent: () => import("#package/domain").UserActionEvent;
3
3
  export declare const SceneAnalyticsFactory: {
4
4
  PerspectiveCameraDragEvent: typeof PerspectiveCameraDragEvent;
5
5
  OrthographicCameraDragEvent: typeof OrthographicCameraDragEvent;
@@ -1 +1 @@
1
- import{jsx as t,jsxs as e}from"react/jsx-runtime";import{Tooltip as a,styled as i}from"@mui/material";import{memo as n,useCallback as s}from"react";import{match as o}from"ts-pattern";import{useLocalizable as r}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{AssistantPanelName as d}from"./theme.js";let c={id:"sdk.assistant.tool.updateDesign.label",message:"Update design"},m={id:"sdk.assistant.tool.readDesign.label",message:"Read design"},p={id:"sdk.assistant.tool.mistake.hint",message:"The assistant made a mistake."},h=i("div",{name:d,slot:"chips"})(({theme:{palette:t,spacing:e,typography:a}})=>({...a.caption,alignItems:"start",color:t.text.secondary,display:"grid",gap:e(.75),gridTemplateColumns:"min-content minmax(0, 1fr)"})),g=i("span",{name:d,slot:"activity"})(({theme:{typography:t}})=>({blockSize:`calc(${t.caption.lineHeight} * 1em)`,display:"grid",placeItems:"center"})),f=i(l,{name:d,slot:"activityIcon"})({fontSize:14,'[data-chips="active"] &':{animation:"phx-assistant-turn 2.4s linear infinite","@media (prefers-reduced-motion: reduce)":{animation:"none"}},"@keyframes phx-assistant-turn":{to:{rotate:"360deg"}}}),k=i("span",{name:d,slot:"chip"})(({theme:{palette:t,spacing:e}})=>({cursor:"default",display:"inline-block",whiteSpace:"nowrap","&:not(:last-child)::after":{color:t.text.secondary,content:'"\xb7"',display:"inline-block",marginInline:e(.75),textDecoration:"none"},'&[data-chip="failed"]':{color:t.error.main},'&[data-chip="flawed"]':{textDecoration:"line-through",textDecorationColor:t.error.main}})),u=n(({tool:e})=>{let{chip:i,input:n,result:l}=e,d=r(c),h=r(m),g=r(p),f=o(i.label).with({kind:"text"},({text:t})=>t).with({kind:"updateDesign"},()=>d).with({kind:"readDesign"},()=>h).exhaustive(),u=s(()=>{console.info(`Assistant tool call "${f}"`,{input:n,result:l})},[n,f,l]);return t(a,{title:"failed"===i.state||"flawed"===i.state?g:"",placement:"top-start",children:t(k,{onClick:u,"data-chip":i.state,children:f})})});export const AssistantToolChips=n(({tools:a,isActive:i})=>e(h,{"data-chips":i?"active":"done","aria-busy":i,children:[t(g,{children:t(f,{name:"Gear"})}),t("div",{children:a.map(e=>t(u,{tool:e},e.id))})]}));
1
+ import{jsx as t,jsxs as e}from"react/jsx-runtime";import{Tooltip as a,styled as i}from"@mui/material";import{memo as s,useCallback as o}from"react";import{match as n}from"ts-pattern";import{useLocalizable as r}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{AssistantPanelName as d}from"./theme.js";let m={id:"sdk.assistant.tool.updateDesign.label",message:"Update design"},c={id:"sdk.assistant.tool.readDesign.label",message:"Read design"},p={id:"sdk.assistant.tool.mistake.hint",message:"The assistant made a mistake."},h={id:"sdk.assistant.tool.cancelled.hint",message:"Stopped before it finished."},g={id:"sdk.assistant.tool.noResult.hint",message:"The result of this step was lost. It may or may not have been done."},f={id:"sdk.assistant.tool.toolBudget.hint",message:"Not done: the assistant reached its limit of steps for one message."},u=i("div",{name:d,slot:"chips"})(({theme:{palette:t,spacing:e,typography:a}})=>({...a.caption,alignItems:"start",color:t.text.secondary,display:"grid",gap:e(.75),gridTemplateColumns:"min-content minmax(0, 1fr)"})),k=i("span",{name:d,slot:"activity"})(({theme:{typography:t}})=>({blockSize:`calc(${t.caption.lineHeight} * 1em)`,display:"grid",placeItems:"center"})),x=i(l,{name:d,slot:"activityIcon"})({fontSize:14,'[data-chips="active"] &':{animation:"phx-assistant-turn 2.4s linear infinite","@media (prefers-reduced-motion: reduce)":{animation:"none"}},"@keyframes phx-assistant-turn":{to:{rotate:"360deg"}}}),w=i("span",{name:d,slot:"chip"})(({theme:{palette:t,spacing:e}})=>({cursor:"default",display:"inline-block",whiteSpace:"nowrap","&:not(:last-child)::after":{color:t.text.secondary,content:'"\xb7"',display:"inline-block",marginInline:e(.75),textDecoration:"none"},'&[data-chip="failed"]':{color:t.error.main},'&[data-chip="flawed"]':{textDecoration:"line-through",textDecorationColor:t.error.main}})),y=s(({tool:e})=>{let{chip:i,input:s,result:l}=e,d=r(m),u=r(c),k=r(p),x=r(h),y=r(g),b=r(f),v=n(i.label).with({kind:"text"},({text:t})=>t).with({kind:"updateDesign"},()=>d).with({kind:"readDesign"},()=>u).exhaustive(),C=o(()=>{console.info(`Assistant tool call "${v}"`,{input:s,result:l})},[s,v,l]);return t(a,{title:n(i).with({errorCode:"cancelled"},()=>x).with({errorCode:"no_result"},()=>y).with({errorCode:"tool_budget"},()=>b).with({state:"failed"},{state:"flawed"},()=>k).otherwise(()=>""),placement:"top-start",children:t(w,{onClick:C,"data-chip":i.state,children:v})})});export const AssistantToolChips=s(({tools:a,isActive:i})=>e(u,{"data-chips":i?"active":"done","aria-busy":i,children:[t(k,{children:t(x,{name:"Gear"})}),t("div",{children:a.map(e=>t(y,{tool:e},e.id))})]}));
@@ -1,11 +1,6 @@
1
- import type { AssistantChatState } from '../../assistant/index.js';
2
- export interface AssistantComposerProps {
3
- readonly chat: AssistantChatState | undefined;
4
- readonly onFocusChange: (isFocused: boolean) => void;
5
- }
6
1
  /**
7
2
  * The message input of the panel. Enter sends and Shift+Enter adds a line. While a reply runs the
8
3
  * send control is a Stop control and the input stays editable, so the next message can be written.
9
4
  * A thread this session may not continue disables the input and says why.
10
5
  */
11
- export declare const AssistantComposer: ({ chat, onFocusChange }: AssistantComposerProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const AssistantComposer: () => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- import{jsx as e,jsxs as a}from"react/jsx-runtime";import{Trans as r}from"@lingui/react";import{IconButton as o,InputBase as i,Tooltip as t,styled as n}from"@mui/material";import{useCallback as s,useRef as d,useState as l}from"react";import{useLocalizable as m}from"#package/react-sdk";import{PhxIcon as c,useResponsive as p}from"#package/ui-sdk";import{AssistantPanelName as u}from"./theme.js";let b={id:"sdk.assistant.composer.placeholder",message:"Ask or tell me what to changeâ€Ļ"},g={id:"sdk.assistant.composer.send.label",message:"Send"},h={id:"sdk.assistant.composer.stop.label",message:"Stop"},k=n("form",{name:u,slot:"composer"})(({theme:{palette:e,spacing:a}})=>({borderBlockStart:`1px solid ${e.divider}`,display:"grid",gap:a(.75),paddingBlock:a(1.25),paddingInline:`var(--phx-sidebar-padding, ${a(2)})`})),f=n("div",{name:u,slot:"inputFrame"})(({theme:{palette:e,spacing:a}})=>({alignItems:"flex-end",border:`1px solid ${e.divider}`,borderRadius:12,display:"flex",gap:a(1),paddingBlock:a(.5),paddingInline:`${a(1.5)} ${a(.5)}`,"&:focus-within":{borderColor:e.primary.main},"&:has(textarea:disabled)":{background:e.action.disabledBackground}})),x=n(i,{name:u,slot:"input"})(({theme:{spacing:e,typography:a}})=>({...a.body2,flex:1,paddingBlock:e(.75)})),v=n(o,{name:u,slot:"sendButton"})(({theme:{palette:e}})=>({background:e.primary.main,borderRadius:8,color:e.primary.contrastText,"&:hover":{background:e.primary.dark},"&.Mui-disabled":{background:e.action.disabledBackground,color:e.action.disabled}})),y=n(o,{name:u,slot:"stopButton"})(({theme:{palette:e}})=>({background:e.text.primary,borderRadius:8,color:e.background.paper,"&:hover":{background:e.text.secondary}})),B=n("span")({background:"currentColor",blockSize:10,borderRadius:2,inlineSize:10,margin:5}),C=n("div",{name:u,slot:"hint"})(({theme:{palette:e,typography:a}})=>({...a.caption,color:e.text.secondary}));export const AssistantComposer=({chat:o,onFocusChange:i})=>{let[n,u]=l(""),R=d(null),{isDesktop:S}=p(),w=m(b),z=m(g),$=m(h),j=o?.isLoading??!1,I=o?.isContinuable??!0,A=n.trim(),D=null!=o&&I&&!j&&A.length>0,P=s(()=>{o&&D&&(u(""),o.send(A),S||R.current?.blur())},[D,o,A,S]),T=s(e=>{e.preventDefault(),P()},[P]),E=s(e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),P())},[P]),F=s(()=>{o?.stop()},[o]);return a(k,{onSubmit:T,children:[!I&&e(C,{role:"status",children:e(r,{id:"sdk.assistant.composer.notContinuable",message:"This conversation can be read here, but it can no longer be continued."})}),a(f,{children:[e(x,{multiline:!0,maxRows:6,placeholder:w,value:n,disabled:!I,inputRef:R,onChange:e=>u(e.target.value),onKeyDown:E,onFocus:()=>i(!0),onBlur:()=>i(!1),inputProps:{"aria-label":w}}),j?e(t,{title:$,placement:"top",children:e(y,{size:"small","aria-label":$,onClick:F,children:e(B,{})})}):e(t,{title:z,placement:"top",children:e("span",{children:e(v,{type:"submit",size:"small","aria-label":z,disabled:!D,children:e(c,{name:"PaperPlaneRightBold",fontSize:"small"})})})})]}),e(C,{children:e(r,{id:"sdk.assistant.composer.disclaimer",message:"AI can be wrong. Check the result."})})]})};
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{Trans as i}from"@lingui/react";import{IconButton as o,InputBase as r,Tooltip as t,styled as n}from"@mui/material";import{useCallback as s,useRef as d,useState as l}from"react";import{useEagerObservableSelector as m,useLocalizable as c}from"#package/react-sdk";import{PhxIcon as p,useResponsive as u}from"#package/ui-sdk";import{useConfigurator as b}from"../../application-runtime/index.js";import{AssistantPanelName as g}from"./theme.js";let h={id:"sdk.assistant.composer.placeholder",message:"Ask or tell me what to changeâ€Ļ"},k={id:"sdk.assistant.composer.send.label",message:"Send"},f={id:"sdk.assistant.composer.stop.label",message:"Stop"},x=n("form",{name:g,slot:"composer"})(({theme:{palette:e,spacing:a}})=>({borderBlockStart:`1px solid ${e.divider}`,display:"grid",gap:a(.75),paddingBlock:a(1.25),paddingInline:`var(--phx-sidebar-padding, ${a(2)})`})),y=n("div",{name:g,slot:"inputFrame"})(({theme:{palette:e,spacing:a}})=>({alignItems:"flex-end",border:`1px solid ${e.divider}`,borderRadius:12,display:"flex",gap:a(1),paddingBlock:a(.5),paddingInline:`${a(1.5)} ${a(.5)}`,"&:focus-within":{borderColor:e.primary.main},"&:has(textarea:disabled)":{background:e.action.disabledBackground}})),v=n(r,{name:g,slot:"input"})(({theme:{spacing:e,typography:a}})=>({...a.body2,flex:1,paddingBlock:e(.75)})),B=n(o,{name:g,slot:"sendButton"})(({theme:{palette:e}})=>({background:e.primary.main,borderRadius:8,color:e.primary.contrastText,"&:hover":{background:e.primary.dark},"&.Mui-disabled":{background:e.action.disabledBackground,color:e.action.disabled}})),C=n(o,{name:g,slot:"stopButton"})(({theme:{palette:e}})=>({background:e.text.primary,borderRadius:8,color:e.background.paper,"&:hover":{background:e.text.secondary}})),R=n("span")({background:"currentColor",blockSize:10,borderRadius:2,inlineSize:10,margin:5}),S=n("div",{name:g,slot:"hint"})(({theme:{palette:e,typography:a}})=>({...a.caption,color:e.text.secondary}));export const AssistantComposer=()=>{let{assistantSystem:o}=b(),[r,n]=l(""),g=d(null),{isDesktop:I}=u(),$=c(h),j=c(k),w=c(f),{isReplying:z,isContinuable:F}=m(o.chat$,e=>({isReplying:e.isLoading,isContinuable:e.isContinuable}),[]),A=r.trim(),D=F&&!z&&A.length>0,P=s(()=>{D&&(n(""),o.send(A),I||g.current?.blur())},[o,D,A,I]),T=s(e=>{e.preventDefault(),P()},[P]),E=s(e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),P())},[P]),K=s(()=>{o.stop()},[o]);return a(x,{onSubmit:T,children:[!F&&e(S,{role:"status",children:e(i,{id:"sdk.assistant.composer.notContinuable",message:"This conversation can be read here, but it can no longer be continued."})}),a(y,{children:[e(v,{multiline:!0,maxRows:6,placeholder:$,value:r,disabled:!F,inputRef:g,onChange:e=>n(e.target.value),onKeyDown:E,onFocus:()=>o.setInputFocused(!0),onBlur:()=>o.setInputFocused(!1),inputProps:{"aria-label":$}}),z?e(t,{title:w,placement:"top",children:e(C,{size:"small","aria-label":w,onClick:K,children:e(R,{})})}):e(t,{title:j,placement:"top",children:e("span",{children:e(B,{type:"submit",size:"small","aria-label":j,disabled:!D,children:e(p,{name:"PaperPlaneRightBold",fontSize:"small"})})})})]}),e(S,{children:e(i,{id:"sdk.assistant.composer.disclaimer",message:"AI can be wrong. Check the result."})})]})};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{IconButton as a,Tooltip as s,Typography as n,styled as r}from"@mui/material";import{useCallback as o}from"react";import{useLocalizable as i}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{AssistantComposer as d}from"./AssistantComposer.js";import{useAssistantPanel as m,useAssistantPanelConversation as p}from"./AssistantPanelProvider.js";import{AssistantThread as c}from"./AssistantThread.js";import{AssistantPanelName as h}from"./theme.js";let u={id:"sdk.assistant.panel.title",message:"Assistant"},g={id:"sdk.assistant.panel.close.label",message:"Close assistant"};export const ASSISTANT_PANEL_SLOT="slot[assistant]";let b=r("section",{name:h,slot:"root"})(({theme:{palette:e}})=>({background:`var(--phx-sidebar-background, ${e.background.paper})`,border:"var(--phx-sidebar-border, 0)",borderRadius:"inherit",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",inset:0,overflow:"hidden",position:"absolute",zIndex:1})),f=r("header",{name:h,slot:"header"})(({theme:{palette:e,spacing:t}})=>({alignItems:"center",borderBlockEnd:`1px solid ${e.divider}`,display:"flex",gap:t(1),justifyContent:"space-between",paddingBlock:t(1),paddingInline:`var(--phx-sidebar-padding, ${t(2)}) ${t(1)}`})),x=r(n,{name:h,slot:"title"})({fontWeight:600}),k=r(a,{name:h,slot:"closeButton"})({}),j=e=>{e.target instanceof Element&&e.target.closest("button")&&e.preventDefault()};export const AssistantPanel=()=>{let a=m(),n=p(),r=i(u),h=i(g),v=a?.setOpen,A=o(()=>{v?.(!1)},[v]);return a?.open&&n?t(b,{"data-sidebar":"slot[assistant]","aria-label":r,onMouseDown:j,children:[t(f,{children:[e(x,{variant:"subtitle1",component:"h2",children:r}),e(s,{title:h,placement:"top",children:e(k,{size:"small","aria-label":h,onClick:A,children:e(l,{name:"X"})})})]}),e(c,{chat:n.chat,onRetry:n.reloadThread}),e(d,{chat:n.chat,onFocusChange:a.setInputFocused})]}):null};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{IconButton as s,Tooltip as a,Typography as i,styled as n}from"@mui/material";import{useCallback as r}from"react";import{useLocalizable as o}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{useConfigurator as m}from"../../application-runtime/index.js";import{AssistantComposer as d}from"./AssistantComposer.js";import{AssistantThread as p}from"./AssistantThread.js";import{AssistantPanelName as c}from"./theme.js";import{useIsAssistantPanelOpen as u}from"./use-is-assistant-panel-open.js";let b={id:"sdk.assistant.panel.title",message:"Assistant"},f={id:"sdk.assistant.panel.close.label",message:"Close assistant"};export const ASSISTANT_PANEL_SLOT="slot[assistant]";let g=n("section",{name:c,slot:"root"})(({theme:{palette:e}})=>({background:`var(--phx-sidebar-background, ${e.background.paper})`,border:"var(--phx-sidebar-border, 0)",borderRadius:"inherit",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",inset:0,overflow:"hidden",position:"absolute",zIndex:1})),h=n("header",{name:c,slot:"header"})(({theme:{palette:e,spacing:t}})=>({alignItems:"center",borderBlockEnd:`1px solid ${e.divider}`,display:"flex",gap:t(1),justifyContent:"space-between",paddingBlock:t(1),paddingInline:`var(--phx-sidebar-padding, ${t(2)}) ${t(1)}`})),x=n(i,{name:c,slot:"title"})({fontWeight:600}),k=n(s,{name:c,slot:"closeButton"})({}),j=e=>{e.target instanceof Element&&e.target.closest("button")&&e.preventDefault()};export const AssistantPanel=()=>{let{assistantSystem:s}=m(),i=u(),n=o(b),c=o(f),v=r(()=>{s.setOpen(!1)},[s]);return i?t(g,{"data-sidebar":"slot[assistant]","aria-label":n,onMouseDown:j,children:[t(h,{children:[e(x,{variant:"subtitle1",component:"h2",children:n}),e(a,{title:c,placement:"top",children:e(k,{size:"small","aria-label":c,onClick:v,children:e(l,{name:"X"})})})]}),e(p,{}),e(d,{})]}):null};
@@ -1,11 +1,6 @@
1
- import type { AssistantChatState } from '../../assistant/index.js';
2
- export interface AssistantThreadProps {
3
- readonly chat: AssistantChatState | undefined;
4
- readonly onRetry: () => void;
5
- }
6
1
  /**
7
2
  * The conversation: user bubbles, assistant Markdown, tool chips, and what the panel
8
3
  * has to say itself, which is a greeting for an empty thread, a "Thinkingâ€Ļ" line and a failure with
9
4
  * its way out. It follows a streaming reply until the user scrolls up.
10
5
  */
11
- export declare const AssistantThread: ({ chat, onRetry }: AssistantThreadProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const AssistantThread: () => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- import{jsx as e,jsxs as i}from"react/jsx-runtime";import{Trans as a}from"@lingui/react";import{Button as s,styled as t}from"@mui/material";import{useMemo as n}from"react";import{match as r}from"ts-pattern";import{PhxIcon as o}from"#package/ui-sdk";import{AssistantToolChips as l}from"./AssistantChips.js";import{AssistantMarkdown as d}from"./AssistantMarkdown.js";import{describeAssistantFailure as m}from"./assistant-failure.js";import{AssistantPanelName as p}from"./theme.js";import{buildThreadView as h}from"./thread-items.js";import{useFollowStream as c}from"./use-follow-stream.js";let g=t("div",{name:p,slot:"thread"})({display:"grid",position:"relative"}),u=t("div",{name:p,slot:"messages"})(({theme:{spacing:e,typography:i}})=>({...i.body2,display:"flex",flexDirection:"column",gap:e(1.5),overflowY:"auto",overscrollBehavior:"contain",paddingBlock:e(2),paddingInline:`var(--phx-sidebar-padding, ${e(2)})`,"& > :first-child":{marginBlockStart:"auto"}})),f=t("div",{name:p,slot:"userMessage"})(({theme:{palette:e,spacing:i}})=>({alignSelf:"flex-end",background:`hsl(from ${e.primary.main} h s l / 12%)`,borderRadius:"14px 14px 4px 14px",maxInlineSize:"85%",overflowWrap:"anywhere",paddingBlock:i(1),paddingInline:i(1.5),whiteSpace:"pre-wrap"})),k=t("div",{name:p,slot:"greeting"})({}),v=t("div",{name:p,slot:"status"})(({theme:{palette:e,typography:i}})=>({...i.caption,color:e.text.secondary})),w=t("div",{name:p,slot:"notice"})(({theme:{palette:e,shape:i,spacing:a}})=>({alignItems:"center",background:e.action.hover,borderRadius:i.borderRadius,display:"flex",flexWrap:"wrap",gap:a(1),justifyContent:"space-between",paddingBlock:a(1),paddingInline:a(1.5)})),b=t(s,{name:p,slot:"newReplyButton"})(({theme:{palette:e,spacing:i}})=>({background:e.text.primary,borderRadius:"calc(infinity * 1px)",color:e.background.paper,insetBlockEnd:i(1),insetInlineStart:"50%",position:"absolute",translate:"-50% 0","&:hover":{background:e.text.secondary}})),x=({item:i,isActive:a})=>r(i).with({kind:"user"},({text:i})=>e(f,{children:i})).with({kind:"text"},({markdown:i,isStreaming:a})=>e(d,{markdown:i,isStreaming:a})).with({kind:"tools"},({tools:i})=>e(l,{tools:i,isActive:a})).exhaustive();export const AssistantThread=({chat:t,onRetry:l})=>{let d=t?.messages,p=t?.isLoading??!1,{items:f,isThinking:y}=n(()=>h(d??[],p),[d,p]),j=n(()=>f.filter(({kind:e})=>"user"===e).length,[f]),I=t?.error?m(t.failedStatus):void 0,{scrollerRef:S,hasUnseenContent:T,handleScroll:A,scrollToEnd:B}=c(n(()=>({messages:d,isThinking:y,failure:I?.kind}),[d,y,I?.kind]),j);return i(g,{children:[i(u,{ref:S,onScroll:A,role:"log","aria-live":"polite",children:[t?.isLoaded===!0&&0===f.length&&!p&&!I&&e(k,{children:e(a,{id:"sdk.assistant.thread.greeting",message:"Hi. I can answer questions about this design and change it with you. Tell me what you need."})}),f.map(i=>e(x,{item:i,isActive:p&&i===f.at(-1)},i.id)),y&&e(v,{children:e(a,{id:"sdk.assistant.thread.thinking",message:"Thinkingâ€Ļ"})}),I&&i(w,{role:"alert",children:[e("span",{children:r(I.kind).with("notAvailable",()=>e(a,{id:"sdk.assistant.failure.notAvailable",message:"The assistant is not available here."})).with("busy",()=>e(a,{id:"sdk.assistant.failure.busy",message:"The assistant is still working on an earlier message."})).with("unavailable",()=>e(a,{id:"sdk.assistant.failure.unavailable",message:"The assistant is unavailable right now."})).exhaustive()}),I.canRetry&&e(s,{size:"small",variant:"outlined",color:"inherit",onClick:l,children:e(a,{id:"sdk.assistant.failure.retry.label",message:"Try again"})})]})]}),T&&e(b,{size:"small",onClick:B,endIcon:e(o,{name:"CaretDown"}),children:e(a,{id:"sdk.assistant.thread.newReply.label",message:"New reply"})})]})};
1
+ import{jsx as e,jsxs as i}from"react/jsx-runtime";import{Trans as a}from"@lingui/react";import{Button as t,styled as s}from"@mui/material";import{useMemo as r}from"react";import{match as n}from"ts-pattern";import{useEagerObservableValue as o}from"#package/react-sdk";import{PhxIcon as l}from"#package/ui-sdk";import{useConfigurator as d}from"../../application-runtime/index.js";import{AssistantToolChips as m}from"./AssistantChips.js";import{AssistantMarkdown as p}from"./AssistantMarkdown.js";import{describeAssistantFailure as c}from"./assistant-failure.js";import{AssistantPanelName as h}from"./theme.js";import{buildThreadView as g}from"./thread-items.js";import{useFollowStream as u}from"./use-follow-stream.js";let f=s("div",{name:h,slot:"thread"})({display:"grid",position:"relative"}),k=s("div",{name:h,slot:"messages"})(({theme:{spacing:e,typography:i}})=>({...i.body2,display:"flex",flexDirection:"column",gap:e(1.5),overflowY:"auto",overscrollBehavior:"contain",paddingBlock:e(2),paddingInline:`var(--phx-sidebar-padding, ${e(2)})`,"& > :first-child":{marginBlockStart:"auto"}})),v=s("div",{name:h,slot:"userMessage"})(({theme:{palette:e,spacing:i}})=>({alignSelf:"flex-end",background:`hsl(from ${e.primary.main} h s l / 12%)`,borderRadius:"14px 14px 4px 14px",maxInlineSize:"85%",overflowWrap:"anywhere",paddingBlock:i(1),paddingInline:i(1.5),whiteSpace:"pre-wrap"})),w=s("div",{name:h,slot:"greeting"})({}),b=s("div",{name:h,slot:"status"})(({theme:{palette:e,typography:i}})=>({...i.caption,color:e.text.secondary})),x=s("div",{name:h,slot:"notice"})(({theme:{palette:e,shape:i,spacing:a}})=>({alignItems:"center",background:e.action.hover,borderRadius:i.borderRadius,display:"flex",flexWrap:"wrap",gap:a(1),justifyContent:"space-between",paddingBlock:a(1),paddingInline:a(1.5)})),y=s(t,{name:h,slot:"newReplyButton"})(({theme:{palette:e,spacing:i}})=>({background:e.text.primary,borderRadius:"calc(infinity * 1px)",color:e.background.paper,insetBlockEnd:i(1),insetInlineStart:"50%",position:"absolute",translate:"-50% 0","&:hover":{background:e.text.secondary}})),j=({item:i,isActive:a})=>n(i).with({kind:"user"},({text:i})=>e(v,{children:i})).with({kind:"text"},({markdown:i,isStreaming:a})=>e(p,{markdown:i,isStreaming:a})).with({kind:"tools"},({tools:i})=>e(m,{tools:i,isActive:a})).exhaustive();export const AssistantThread=()=>{let{assistantSystem:s}=d(),m=o(s.chat$),{messages:p,isLoading:h}=m,{items:v,isThinking:T}=r(()=>g(p,h),[p,h]),I=r(()=>v.filter(({kind:e})=>"user"===e).length,[v]),S=m.error?c(m.failedStatus):void 0,{scrollerRef:A,hasUnseenContent:B,handleScroll:R,scrollToEnd:C}=u(r(()=>({messages:p,isThinking:T,failure:S?.kind}),[p,T,S?.kind]),I);return i(f,{children:[i(k,{ref:A,onScroll:R,role:"log","aria-live":"polite",children:[m.isLoaded&&0===v.length&&!h&&!S&&e(w,{children:e(a,{id:"sdk.assistant.thread.greeting",message:"Hi. I can answer questions about this design and change it with you. Tell me what you need."})}),v.map(i=>e(j,{item:i,isActive:h&&i===v.at(-1)},i.id)),T&&e(b,{children:e(a,{id:"sdk.assistant.thread.thinking",message:"Thinkingâ€Ļ"})}),S&&i(x,{role:"alert",children:[e("span",{children:n(S.kind).with("notAvailable",()=>e(a,{id:"sdk.assistant.failure.notAvailable",message:"The assistant is not available here."})).with("busy",()=>e(a,{id:"sdk.assistant.failure.busy",message:"The assistant is still working on an earlier message."})).with("unavailable",()=>e(a,{id:"sdk.assistant.failure.unavailable",message:"The assistant is unavailable right now."})).exhaustive()}),S.canRetry&&e(t,{size:"small",variant:"outlined",color:"inherit",onClick:s.reloadThread,children:e(a,{id:"sdk.assistant.failure.retry.label",message:"Try again"})})]})]}),B&&e(y,{size:"small",onClick:C,endIcon:e(l,{name:"CaretDown"}),children:e(a,{id:"sdk.assistant.thread.newReply.label",message:"New reply"})})]})};
@@ -1,2 +1,2 @@
1
1
  export { AssistantPanel, ASSISTANT_PANEL_SLOT } from './AssistantPanel.js';
2
- export { AssistantPanelProvider, useAssistantPanel, type AssistantPanelState } from './AssistantPanelProvider.js';
2
+ export { useIsAssistantPanelOpen } from './use-is-assistant-panel-open.js';
@@ -1 +1 @@
1
- export{AssistantPanel,ASSISTANT_PANEL_SLOT}from"./AssistantPanel.js";export{AssistantPanelProvider,useAssistantPanel}from"./AssistantPanelProvider.js";
1
+ export{AssistantPanel,ASSISTANT_PANEL_SLOT}from"./AssistantPanel.js";export{useIsAssistantPanelOpen}from"./use-is-assistant-panel-open.js";
@@ -1,4 +1,4 @@
1
- import type { UIMessage } from '@tanstack/ai-react';
1
+ import type { UIMessage } from '@tanstack/ai-client';
2
2
  import { type AssistantToolChip } from './tool-chip.js';
3
3
  /** A tool call of the thread, with what its chip shows and what a click on the chip logs. */
4
4
  export interface AssistantToolItem {
@@ -1,3 +1,4 @@
1
+ import { type AssistantToolErrorCode } from '@salsita-ai/contracts/assistant';
1
2
  /**
2
3
  * How a tool call of the assistant looks in the thread: still running, finished, a change that was
3
4
  * not kept (`failed`), or a read that answered with errors (`flawed`), which matters less because
@@ -16,6 +17,11 @@ export type AssistantToolChipLabel = {
16
17
  export interface AssistantToolChip {
17
18
  readonly label: AssistantToolChipLabel;
18
19
  readonly state: AssistantToolChipState;
20
+ /**
21
+ * Why the server recorded an error in place of the call's result, when it said so with a code this
22
+ * panel knows. Nothing for a call that went wrong for any other reason.
23
+ */
24
+ readonly errorCode: AssistantToolErrorCode | undefined;
19
25
  }
20
26
  /** A tool call of a message as the chip reads it. */
21
27
  export interface AssistantToolCall {
@@ -32,6 +38,7 @@ export interface AssistantToolCall {
32
38
  /**
33
39
  * Describes one tool call for its chip: the label in the order operation names, fixed text for the
34
40
  * `apply` and `query` tools, tool name; and whether the call runs, finished, or went wrong. Why it
35
- * went wrong is not part of it: the tool result words that for the model, not for the user.
41
+ * went wrong is part of it only as the code of an error the server recorded: the text of a tool
42
+ * result is worded for the model, not for the user.
36
43
  */
37
44
  export declare const describeToolCall: (call: AssistantToolCall) => AssistantToolChip;
@@ -1 +1 @@
1
- import{Kind as e,parse as t}from"graphql";import{z as n}from"zod";import{applyTool as r,queryTool as a}from"@salsita-ai/contracts/assistant";let o=n.object({operations:n.array(n.object({query:n.string(),operationName:n.string().nullish()}))}),i=n.object({results:n.array(n.object({errors:n.array(n.unknown()).optional()})),committed:n.boolean()});export const describeToolCall=n=>{let s=(({name:n,input:i})=>{let s,l=(s=o.safeParse(i)).success?s.data.operations.flatMap(({query:n,operationName:r})=>r??(n=>{try{let r=t(n).definitions.find(t=>t.kind===e.OPERATION_DEFINITION);return r?.kind===e.OPERATION_DEFINITION?r.name?.value:void 0}catch{return}})(n)??[]):[];return l.length>0?{kind:"text",text:l.join(", ")}:n===r.name?{kind:"updateDesign"}:n===a.name?{kind:"readDesign"}:{kind:"text",text:n}})(n);return null==n.result&&null==n.error?{label:s,state:n.isReplyRunning?"running":"done"}:{label:s,state:(({name:e,result:t,error:n})=>{if(null!=n)return e===a.name?"flawed":"failed";let o=i.safeParse(t);if(!o.success)return"done";let{results:s,committed:l}=o.data;return e===r.name?l?"done":"failed":s.some(({errors:e})=>(e?.length??0)>0)||0===s.length?"flawed":"done"})(n)}};
1
+ import{Kind as e,parse as t}from"graphql";import{z as n}from"zod";import{ASSISTANT_TOOL_ERROR_CODES as r,AssistantToolError as a,applyTool as i,queryTool as o}from"@salsita-ai/contracts/assistant";let l=n.object({operations:n.array(n.object({query:n.string(),operationName:n.string().nullish()}))}),s=n.object({results:n.array(n.object({errors:n.array(n.unknown()).optional()})),committed:n.boolean()});export const describeToolCall=n=>{let d=(({name:n,input:r})=>{let a,s=(a=l.safeParse(r)).success?a.data.operations.flatMap(({query:n,operationName:r})=>r??(n=>{try{let r=t(n).definitions.find(t=>t.kind===e.OPERATION_DEFINITION);return r?.kind===e.OPERATION_DEFINITION?r.name?.value:void 0}catch{return}})(n)??[]):[];return s.length>0?{kind:"text",text:s.join(", ")}:n===i.name?{kind:"updateDesign"}:n===o.name?{kind:"readDesign"}:{kind:"text",text:n}})(n);if(null==n.result&&null==n.error)return{label:d,state:n.isReplyRunning?"running":"done",errorCode:void 0};let u=(e=>{let t=a.safeParse(e);if(t.success)return r.find(e=>e===t.data.code)})(n.result);return{label:d,state:(({name:e,result:t,error:n},r)=>{if(null!=n||null!=r)return e===o.name?"flawed":"failed";if(e!==i.name&&e!==o.name)return"done";let a=s.safeParse(t);if(!a.success)return e===o.name?"flawed":"failed";let{results:l,committed:d}=a.data;return e===i.name?d?"done":"failed":l.some(({errors:e})=>(e?.length??0)>0)||0===l.length?"flawed":"done"})(n,u),errorCode:u}};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Whether the assistant panel is shown: it was opened and the application spec still has the
3
+ * `assistant` section, which editor hot reload can take away under an open panel.
4
+ */
5
+ export declare const useIsAssistantPanelOpen: () => boolean;
@@ -0,0 +1 @@
1
+ import{useEagerObservableSelector as e,useSpecAssistant as n}from"#package/react-sdk";import{useConfigurator as t}from"../../application-runtime/index.js";export const useIsAssistantPanelOpen=()=>{let{assistantSystem:p}=t(),r=n();return e(p.panel$,e=>e.open,[])&&null!=r};
@@ -1,4 +1,4 @@
1
- import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes as e,paperClasses as r,snackbarClasses as d,styled as i,useTheme as n,useThemeProps as s}from"@mui/material";import{AnimatePresence as l,motion as p}from"motion/react";import{useCallback as b,useRef as u}from"react";import{useAccessService as c,useIsFullscreenActive as m}from"#package/react-sdk";import{attrf as h,commonStyles as y,numToPx as g,useInvalidateScrollTimeline as f,useIsEmpty as x,useResponsive as k}from"#package/ui-sdk";import{usePreview as v}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as S,AssistantPanel as E,useAssistantPanel as w}from"../../assistant/index.js";import{LayoutSlots as R}from"../slots/index.js";import{DesktopPreview as $}from"./DesktopPreview.js";import{useSceneSafeArea as B}from"./use-scene-safe-area.js";let C="PhxDesktopSidebar",D="minimalist",T="split",I="visible",A="hidden",P="assistant",F={Root:i("div",{name:C,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>[`
1
+ import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes as e,paperClasses as r,snackbarClasses as d,styled as i,useTheme as n,useThemeProps as s}from"@mui/material";import{AnimatePresence as l,motion as p}from"motion/react";import{useCallback as b,useRef as u}from"react";import{useAccessService as c,useIsFullscreenActive as m}from"#package/react-sdk";import{attrf as h,commonStyles as y,numToPx as g,useInvalidateScrollTimeline as f,useIsEmpty as x,useResponsive as k}from"#package/ui-sdk";import{usePreview as v}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as S,AssistantPanel as E,useIsAssistantPanelOpen as w}from"../../assistant/index.js";import{LayoutSlots as R}from"../slots/index.js";import{DesktopPreview as $}from"./DesktopPreview.js";import{useSceneSafeArea as B}from"./use-scene-safe-area.js";let C="PhxDesktopSidebar",D="minimalist",T="split",I="visible",A="hidden",P="assistant",F={Root:i("div",{name:C,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>[`
2
2
  --phx-sidebar-background: ${a.background};
3
3
  --phx-sidebar-border: ${a.border};
4
4
  --phx-sidebar-filter: ${a.filter};
@@ -46,4 +46,4 @@ import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes
46
46
  180deg,
47
47
  hsl(from black h s l / 12%),
48
48
  hsl(from black h s l / 0%) 8px
49
- )`}=s({props:{},name:C}),{hasMiniSidebar:N,hasSplitSidebar:V}=R.useSidebarContent(),X=w()?.open??!1,{accessInfo:G}=c(),J=m(),{isPreview:K,isHidden:O}=v(),Q=!O&&!K,U=!J,{setCanvasPadding:Y,setAnimating:Z}=k(),{containerRef:_,safeAreaRef:aa,update:at}=B(Y,N&&!X,Q),ao=b(()=>{Z(!0)},[Z]),ae=b(()=>{Z(!1),at()},[Z,at]),ar=Q&&U,ad=x(e,{disabled:!ar}),ai=x(r,{disabled:!ar});f(r,{disabled:!ar});let an={background:g,border:S,borderRadius:L,filter:W,isHeaderEmpty:ad,isContentEmpty:ai,padding:q,scrollableIndicatorBackground:M,width:y};return a(o,{children:t(l,{mode:"wait",children:[!O&&K&&a($,{},"preview-layout"),Q&&t(z,{layoutId:"ui-layout",layout:!0,ownerState:{sidebarWidth:y},"data-layout":h({state:{initial:!J,fullscreen:J}}),onLayoutAnimationStart:ao,onLayoutAnimationComplete:ae,children:[a(H,{ref:_}),a("header",{"data-layout":"slot[header]",children:a(R.DesktopHeader,{})}),t("main",{"data-layout":"slot[body]",children:[a("div",{"data-layout":"slot[body.top] interactive",children:a(R.DesktopCallToAction,{})}),a("div",{ref:aa,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.bottom] interactive",children:[a("div",{"data-layout":"slot[body.toolbar]",children:a(R.DesktopToolbar,{})}),a("div",{"data-layout":"slot[body.toolControls]",children:!J&&a(R.DesktopToolControls,{})}),a("div",{"data-layout":"slot[body.viewControls]",children:a(R.DesktopViewControls,{})}),a("div",{"data-layout":"slot[body.logo]",children:a(R.DesktopPoweredBy,{})}),a("div",{"data-layout":"slot[body.sideEffects]",children:a(R.DesktopSnackbarsRoot,{})})]})]}),a("aside",{"data-layout":"slot[sidebar]",children:t(F.Root,{ownerState:an,"data-sidebar":h({variant:{[`${D}`]:N,[`${T}`]:V},state:{[`${I}`]:U,[`${A}`]:!U,[`${P}`]:X}}),inert:U?void 0:"",children:[a(F.Tabs,{ownerState:an,"data-sidebar":"slot[tabs]",children:a(R.DesktopSidebarTabs,{})}),a(F.Header,{ref:e,ownerState:an,"data-sidebar":"slot[header]",children:a(R.DesktopSidebarBackButton,{})}),a(F.Body,{ownerState:an,"data-sidebar":"slot[body]",children:a(F.Content,{ref:r,ownerState:an,"data-sidebar":"slot[content]",children:a(R.DesktopSidebarContent,{})})}),a(F.Footer,{ownerState:an,"data-sidebar":"slot[footer]",children:a(R.DesktopSidebarFooter,{})}),a(E,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:[G.viewMode&&!J&&a(R.DesktopReadonlyBanner,{}),a(R.DesktopFooter,{})]})]},"interface-layout")]})})};
49
+ )`}=s({props:{},name:C}),{hasMiniSidebar:N,hasSplitSidebar:V}=R.useSidebarContent(),X=w(),{accessInfo:G}=c(),J=m(),{isPreview:K,isHidden:O}=v(),Q=!O&&!K,U=!J,{setCanvasPadding:Y,setAnimating:Z}=k(),{containerRef:_,safeAreaRef:aa,update:at}=B(Y,N&&!X,Q),ao=b(()=>{Z(!0)},[Z]),ae=b(()=>{Z(!1),at()},[Z,at]),ar=Q&&U,ad=x(e,{disabled:!ar}),ai=x(r,{disabled:!ar});f(r,{disabled:!ar});let an={background:g,border:S,borderRadius:L,filter:W,isHeaderEmpty:ad,isContentEmpty:ai,padding:q,scrollableIndicatorBackground:M,width:y};return a(o,{children:t(l,{mode:"wait",children:[!O&&K&&a($,{},"preview-layout"),Q&&t(z,{layoutId:"ui-layout",layout:!0,ownerState:{sidebarWidth:y},"data-layout":h({state:{initial:!J,fullscreen:J}}),onLayoutAnimationStart:ao,onLayoutAnimationComplete:ae,children:[a(H,{ref:_}),a("header",{"data-layout":"slot[header]",children:a(R.DesktopHeader,{})}),t("main",{"data-layout":"slot[body]",children:[a("div",{"data-layout":"slot[body.top] interactive",children:a(R.DesktopCallToAction,{})}),a("div",{ref:aa,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.bottom] interactive",children:[a("div",{"data-layout":"slot[body.toolbar]",children:a(R.DesktopToolbar,{})}),a("div",{"data-layout":"slot[body.toolControls]",children:!J&&a(R.DesktopToolControls,{})}),a("div",{"data-layout":"slot[body.viewControls]",children:a(R.DesktopViewControls,{})}),a("div",{"data-layout":"slot[body.logo]",children:a(R.DesktopPoweredBy,{})}),a("div",{"data-layout":"slot[body.sideEffects]",children:a(R.DesktopSnackbarsRoot,{})})]})]}),a("aside",{"data-layout":"slot[sidebar]",children:t(F.Root,{ownerState:an,"data-sidebar":h({variant:{[`${D}`]:N,[`${T}`]:V},state:{[`${I}`]:U,[`${A}`]:!U,[`${P}`]:X}}),inert:U?void 0:"",children:[a(F.Tabs,{ownerState:an,"data-sidebar":"slot[tabs]",children:a(R.DesktopSidebarTabs,{})}),a(F.Header,{ref:e,ownerState:an,"data-sidebar":"slot[header]",children:a(R.DesktopSidebarBackButton,{})}),a(F.Body,{ownerState:an,"data-sidebar":"slot[body]",children:a(F.Content,{ref:r,ownerState:an,"data-sidebar":"slot[content]",children:a(R.DesktopSidebarContent,{})})}),a(F.Footer,{ownerState:an,"data-sidebar":"slot[footer]",children:a(R.DesktopSidebarFooter,{})}),a(E,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:[G.viewMode&&!J&&a(R.DesktopReadonlyBanner,{}),a(R.DesktopFooter,{})]})]},"interface-layout")]})})};
@@ -1 +1 @@
1
- import{jsx as r,jsxs as s,Fragment as o}from"react/jsx-runtime";import{useResponsive as t}from"#package/ui-sdk";import{AssistantPanelProvider as e}from"../../assistant/index.js";import{LayoutSlots as a}from"../slots/index.js";import{DesktopLayout as i}from"./DesktopLayout.js";import{MobileLayout as m}from"./MobileLayout.js";export const Layout=()=>{let{isDesktop:n}=t();return s(o,{children:[r(a.Services,{}),r(a.SharedCanvas,{}),r(e,{children:n?r(i,{}):r(m,{})})]})};
1
+ import{jsx as r,jsxs as o,Fragment as s}from"react/jsx-runtime";import{useResponsive as t}from"#package/ui-sdk";import{LayoutSlots as e}from"../slots/index.js";import{DesktopLayout as a}from"./DesktopLayout.js";import{MobileLayout as m}from"./MobileLayout.js";export const Layout=()=>{let{isDesktop:i}=t();return o(s,{children:[r(e.Services,{}),r(e.SharedCanvas,{}),i?r(a,{}):r(m,{})]})};
@@ -1,11 +1,11 @@
1
- import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarClasses as o,styled as i,useTheme as r,useThemeProps as n}from"@mui/material";import d from"lodash/noop.js";import{AnimatePresence as s}from"motion/react";import{useRef as l}from"react";import{useAccessService as m,useIsFullscreenActive as c}from"#package/react-sdk";import{attrf as p,commonStyles as u,numToPx as b,useIsEmpty as h,useResponsive as g,useViewportSize as f}from"#package/ui-sdk";import{usePreview as y}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as x,AssistantPanel as v,useAssistantPanel as w}from"../../assistant/index.js";import{LayoutSlots as S}from"../slots/index.js";import{MobileHeader as $}from"../slots/slots.js";import{MobilePreview as k}from"./MobilePreview.js";import{useSceneSafeArea as C}from"./use-scene-safe-area.js";let F="visible",M="hidden",T=i("div",{name:"PhxMobileHeader",slot:"root"})(({theme:{spacing:t}})=>({...u.transition.fadeInFrom,alignItems:"center",display:"flex",gap:t(1),justifyContent:"space-between",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-header*="slot"]':{display:"flex",gap:t(2),"& > *":{pointerEvents:"auto"}},'[data-header="slot[center]"]':{display:"grid",inset:0,placeItems:"center",position:"absolute"},[`&[data-header*="${F}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-header*="${M}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 -60%"}})),I="visible",R="hidden",B=i("div",{name:"PhxMobileControls",slot:"root"})(({theme:{spacing:t}})=>({alignItems:"end",display:"flex",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-controls*="slot"]':{"& > *":{pointerEvents:"auto"}},'[data-controls="slot[toolControls]"]':{...u.transition.fadeInFrom,"&:not(:empty)":{marginInlineEnd:t(2)},"& > *":{...u.transition.fadeIn,transitionDelay:"300ms",transitionDuration:"300ms"}},'[data-controls="slot[viewControls]"]':{...u.transition.fadeInFrom,marginInlineStart:"auto"},'[data-controls="slot[toolbar]"]':{"&:not(:empty)":{marginInlineStart:t(2)}},[`&[data-controls*="${I}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"}},[`&[data-controls*="${R}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"}}})),E="PhxMobileSidebar",P="visible",D="hidden",j="assistant",A={Root:i("div",{name:E,slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t})=>[`
1
+ import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarClasses as o,styled as i,useTheme as r,useThemeProps as n}from"@mui/material";import d from"lodash/noop.js";import{AnimatePresence as s}from"motion/react";import{useRef as l}from"react";import{useAccessService as m,useEagerObservableSelector as c,useIsFullscreenActive as p}from"#package/react-sdk";import{attrf as u,commonStyles as b,numToPx as h,useIsEmpty as g,useResponsive as f,useViewportSize as y}from"#package/ui-sdk";import{useConfigurator as x}from"../../../application-runtime/index.js";import{usePreview as v}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as w,AssistantPanel as S,useIsAssistantPanelOpen as $}from"../../assistant/index.js";import{LayoutSlots as k}from"../slots/index.js";import{MobileHeader as C}from"../slots/slots.js";import{MobilePreview as F}from"./MobilePreview.js";import{useSceneSafeArea as M}from"./use-scene-safe-area.js";let T="visible",I="hidden",R=i("div",{name:"PhxMobileHeader",slot:"root"})(({theme:{spacing:t}})=>({...b.transition.fadeInFrom,alignItems:"center",display:"flex",gap:t(1),justifyContent:"space-between",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-header*="slot"]':{display:"flex",gap:t(2),"& > *":{pointerEvents:"auto"}},'[data-header="slot[center]"]':{display:"grid",inset:0,placeItems:"center",position:"absolute"},[`&[data-header*="${T}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-header*="${I}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 -60%"}})),B="visible",E="hidden",P=i("div",{name:"PhxMobileControls",slot:"root"})(({theme:{spacing:t}})=>({alignItems:"end",display:"flex",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-controls*="slot"]':{"& > *":{pointerEvents:"auto"}},'[data-controls="slot[toolControls]"]':{...b.transition.fadeInFrom,"&:not(:empty)":{marginInlineEnd:t(2)},"& > *":{...b.transition.fadeIn,transitionDelay:"300ms",transitionDuration:"300ms"}},'[data-controls="slot[viewControls]"]':{...b.transition.fadeInFrom,marginInlineStart:"auto"},'[data-controls="slot[toolbar]"]':{"&:not(:empty)":{marginInlineStart:t(2)}},[`&[data-controls*="${B}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"}},[`&[data-controls*="${E}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"}}})),D="PhxMobileSidebar",j="visible",A="hidden",z="assistant",H={Root:i("div",{name:D,slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t})=>[`
2
2
  --phx-sidebar-background: ${t.background};
3
3
  --phx-sidebar-padding: ${t.padding};
4
4
  --phx-sidebar-radius: ${t.borderRadius}px;
5
- `,{...u.transition.fadeInFrom,background:"var(--phx-sidebar-background)",borderStartStartRadius:"var(--phx-sidebar-radius)",borderStartEndRadius:"var(--phx-sidebar-radius)",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",position:"relative","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{background:"hsl(from gold h s l / 50%)"},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-sidebar-radius":0,'[data-sidebar*="slot[header]"]':{paddingBlock:0,"& > *":{display:"none"}}}},[`&[data-sidebar*="${P}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-sidebar*="${D}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"},[`&[data-sidebar*="${j}"] > :not([data-sidebar="${x}"])`]:{visibility:"hidden"}}]),Header:i("header",{name:E,slot:"header",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({alignItems:"center",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",display:"grid",gap:t(1),gridTemplateColumns:"repeat(2, minmax(0, 1fr))",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","& > *":{...u.transition.fadeIn,transitionDelay:"100ms",transitionDuration:"300ms"},'[data-sidebar="slot[header.start]"]':{},'[data-sidebar="slot[header.end]"]':{justifySelf:"end"}})),Body:i("div",{name:E,slot:"body",shouldForwardProp:t=>"ownerState"!==t})({display:"grid",gridTemplateRows:"minmax(0, 1fr)"}),Content:i("div",{name:E,slot:"content",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({...u.layout.normalizeScrollableContainer,display:"grid",gap:t(2),gridAutoRows:"min-content",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:empty":{paddingBlock:0}})),Tabs:i("div",{name:E,slot:"tabs",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"calc(var(--phx-sidebar-padding) * 0.75)","&:is(:empty)":{border:0,padding:0}})),Footer:i("footer",{name:E,slot:"footer",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{borderColor:"transparent",paddingBlock:0}}))};export const PhxMobileLayoutName="PhxMobileLayout";let z="initial",H="fullscreen",L="min(480px, 50cqb)",q=["auto","min-content","max-content","fit-content"],N=i("div",{name:"PhxMobileLayout",slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t,theme:{spacing:a}})=>[`
5
+ `,{...b.transition.fadeInFrom,background:"var(--phx-sidebar-background)",borderStartStartRadius:"var(--phx-sidebar-radius)",borderStartEndRadius:"var(--phx-sidebar-radius)",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",position:"relative","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{background:"hsl(from gold h s l / 50%)"},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-sidebar-radius":0,'[data-sidebar*="slot[header]"]':{paddingBlock:0,"& > *":{display:"none"}}}},[`&[data-sidebar*="${j}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-sidebar*="${A}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"},[`&[data-sidebar*="${z}"] > :not([data-sidebar="${w}"])`]:{visibility:"hidden"}}]),Header:i("header",{name:D,slot:"header",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({alignItems:"center",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",display:"grid",gap:t(1),gridTemplateColumns:"repeat(2, minmax(0, 1fr))",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","& > *":{...b.transition.fadeIn,transitionDelay:"100ms",transitionDuration:"300ms"},'[data-sidebar="slot[header.start]"]':{},'[data-sidebar="slot[header.end]"]':{justifySelf:"end"}})),Body:i("div",{name:D,slot:"body",shouldForwardProp:t=>"ownerState"!==t})({display:"grid",gridTemplateRows:"minmax(0, 1fr)"}),Content:i("div",{name:D,slot:"content",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({...b.layout.normalizeScrollableContainer,display:"grid",gap:t(2),gridAutoRows:"min-content",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:empty":{paddingBlock:0}})),Tabs:i("div",{name:D,slot:"tabs",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"calc(var(--phx-sidebar-padding) * 0.75)","&:is(:empty)":{border:0,padding:0}})),Footer:i("footer",{name:D,slot:"footer",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{borderColor:"transparent",paddingBlock:0}}))};export const PhxMobileLayoutName="PhxMobileLayout";let L="initial",q="fullscreen",N="min(480px, 50cqb)",V=["auto","min-content","max-content","fit-content"],G=i("div",{name:"PhxMobileLayout",slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t,theme:{spacing:a}})=>[`
6
6
  --inspect: off; // đŸ•šī¸ inspection mode toggle
7
7
 
8
- --phx-layout-sidebar-track-size: ${b(t.sidebarHeight)};
8
+ --phx-layout-sidebar-track-size: ${h(t.sidebarHeight)};
9
9
  --phx-layout-gutter: ${a(2)};
10
10
  `,{display:"grid",gridTemplateColumns:`
11
11
  [full-start]
@@ -39,4 +39,4 @@ import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarC
39
39
  [footer-end]
40
40
  var(--phx-layout-gutter)
41
41
  [full-end]
42
- `},'[data-layout*="slot[body.header]"]':{gridArea:"header-start / main-start / header-end / main-end"},'[data-layout*="slot[body.footer]"]':{gridArea:"footer-start / main-start / footer-end / main-end",position:"relative"},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"full","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${a(2)})`,position:"absolute"},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"sidebar-start / full-start / sidebar-end / full-end",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{gridArea:"footer-start / full-start / footer-end / full-end",zIndex:1},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-layout-sidebar-track-size":"min-content"}},[`&[data-layout*="${z}"]`]:{transitionDelay:"200ms",transitionDuration:"300ms"},[`&[data-layout*="${H}"]`]:{transitionDelay:"0ms",transitionDuration:"300ms"},[`&:has([data-sidebar*="${D}"])[class]`]:{"--phx-layout-sidebar-track-size":0}},null!=t.assistantFocusHeight&&{'[data-layout*="slot[sidebar]"]':{alignSelf:"start",blockSize:`min(100%, ${t.assistantFocusHeight}px)`,gridRow:"full-start / full-end",zIndex:2}}]),V=i("div")({gridArea:"1 / 1 / -1 / -1"}),G=t=>({inert:t?"":void 0});export const MobileLayout=()=>{let o=l(null),{palette:i,shape:u,spacing:b}=r(),{sidebarHeight:x=L}=n({props:{},name:"PhxMobileLayout"}),{background:J=i.background.paper,borderRadius:K=u.sidebarBorderRadius??u.borderRadius,padding:O=b(2)}=n({props:{},name:E}),{accessInfo:Q}=m(),U=c(),{isPreview:W,isHidden:X}=y(),Y=!X&&!W,Z=!U&&Y,_=!U&&Y,tt=!U,{setCanvasPadding:ta}=g(),{containerRef:te,safeAreaRef:to}=C(Y?ta:d,!1),ti=h(o,{disabled:!tt}),tr=w(),tn=tr?.open??!1,td=tn&&tt&&(tr?.isInputFocused??!1),ts=f(),tl=ti&&!tn,tm={isContentEmpty:tl,sidebarHeight:tn?q.includes(x)?L:x:x,assistantFocusHeight:td?ts?.[1]:void 0},tc={background:J,borderRadius:K,padding:O,isContentEmpty:tl};return a(e,{children:[t(s,{initial:!1,children:!X&&W&&t(k,{})}),a(N,{ownerState:tm,"data-layout":p({state:{[`${z}`]:!U,[`${H}`]:U}}),...G(!Y),children:[t(V,{ref:te}),t("div",{"data-layout":"slot[sideEffects]",children:t(S.MobileSnackbarsRoot,{})}),a("main",{"data-layout":"slot[body]",children:[t("header",{"data-layout":"slot[body.header]",children:a(T,{"data-header":p({state:{[`${F}`]:Z,[`${M}`]:!Z}}),...G(!Z),children:[t("div",{"data-header":"slot[start]",children:t($,{})}),t("div",{"data-header":"slot[center]",children:t(S.MobileCallToAction,{})}),a("div",{"data-header":"slot[end]",children:[Q.viewMode&&!U&&t(S.MobileReadonlyBanner,{}),t(S.MobileHamburgerMenu,{})]})]})}),t("div",{ref:to,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.footer] interactive",children:a(B,{"data-controls":p({state:{[`${I}`]:_,[`${R}`]:!_}}),children:[t("div",{"data-controls":"slot[toolControls]",...G(!_),children:t(S.MobileToolControls,{})}),t("div",{"data-controls":"slot[viewControls]",...G(!_),children:t(S.MobileViewControls,{})}),t("div",{"data-controls":"slot[toolbar]",children:Y&&t(S.MobileToolbar,{})})]})})]}),t("aside",{"data-layout":"slot[sidebar]",children:a(A.Root,{ownerState:tc,"data-sidebar":p({state:{[`${P}`]:tt,[`${D}`]:!tt,[`${j}`]:tn}}),...G(!tt),children:[a(A.Header,{ownerState:tc,"data-sidebar":"slot[header]",children:[t("div",{"data-sidebar":"slot[header.start]",children:t(S.MobileSidebarBackButton,{})}),t("div",{"data-sidebar":"slot[header.end]",children:t(S.MobilePoweredBy,{})})]}),t(A.Body,{ownerState:tc,"data-sidebar":"slot[body]",children:t(A.Content,{ref:o,ownerState:tc,"data-sidebar":"slot[content]",children:t(S.MobileSidebarContent,{})})}),t(A.Tabs,{ownerState:tc,"data-sidebar":"slot[tabs]",children:t(S.MobileTabs,{})}),t(A.Footer,{ownerState:tc,"data-sidebar":"slot[footer]",children:t(S.MobileSidebarFooter,{})}),t(v,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:t(S.MobileFooter,{})})]})]})};
42
+ `},'[data-layout*="slot[body.header]"]':{gridArea:"header-start / main-start / header-end / main-end"},'[data-layout*="slot[body.footer]"]':{gridArea:"footer-start / main-start / footer-end / main-end",position:"relative"},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"full","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${a(2)})`,position:"absolute"},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"sidebar-start / full-start / sidebar-end / full-end",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{gridArea:"footer-start / full-start / footer-end / full-end",zIndex:1},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-layout-sidebar-track-size":"min-content"}},[`&[data-layout*="${L}"]`]:{transitionDelay:"200ms",transitionDuration:"300ms"},[`&[data-layout*="${q}"]`]:{transitionDelay:"0ms",transitionDuration:"300ms"},[`&:has([data-sidebar*="${A}"])[class]`]:{"--phx-layout-sidebar-track-size":0}},null!=t.assistantFocusHeight&&{'[data-layout*="slot[sidebar]"]':{alignSelf:"start",blockSize:`min(100%, ${t.assistantFocusHeight}px)`,gridRow:"full-start / full-end",zIndex:2}}]),J=i("div")({gridArea:"1 / 1 / -1 / -1"}),K=t=>({inert:t?"":void 0});export const MobileLayout=()=>{let o=l(null),{palette:i,shape:b,spacing:h}=r(),{sidebarHeight:w=N}=n({props:{},name:"PhxMobileLayout"}),{background:O=i.background.paper,borderRadius:Q=b.sidebarBorderRadius??b.borderRadius,padding:U=h(2)}=n({props:{},name:D}),{accessInfo:W}=m(),X=p(),{isPreview:Y,isHidden:Z}=v(),_=!Z&&!Y,tt=!X&&_,ta=!X&&_,te=!X,{setCanvasPadding:to}=f(),{containerRef:ti,safeAreaRef:tr}=M(_?to:d,!1),tn=g(o,{disabled:!te}),{assistantSystem:td}=x(),ts=$(),tl=c(td.panel$,t=>t.isInputFocused,[]),tm=ts&&te&&tl,tc=y(tm),tp=tn&&!ts,tu={isContentEmpty:tp,sidebarHeight:ts?V.includes(w)?N:w:w,assistantFocusHeight:tm?tc?.[1]:void 0},tb={background:O,borderRadius:Q,padding:U,isContentEmpty:tp};return a(e,{children:[t(s,{initial:!1,children:!Z&&Y&&t(F,{})}),a(G,{ownerState:tu,"data-layout":u({state:{[`${L}`]:!X,[`${q}`]:X}}),...K(!_),children:[t(J,{ref:ti}),t("div",{"data-layout":"slot[sideEffects]",children:t(k.MobileSnackbarsRoot,{})}),a("main",{"data-layout":"slot[body]",children:[t("header",{"data-layout":"slot[body.header]",children:a(R,{"data-header":u({state:{[`${T}`]:tt,[`${I}`]:!tt}}),...K(!tt),children:[t("div",{"data-header":"slot[start]",children:t(C,{})}),t("div",{"data-header":"slot[center]",children:t(k.MobileCallToAction,{})}),a("div",{"data-header":"slot[end]",children:[W.viewMode&&!X&&t(k.MobileReadonlyBanner,{}),t(k.MobileHamburgerMenu,{})]})]})}),t("div",{ref:tr,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.footer] interactive",children:a(P,{"data-controls":u({state:{[`${B}`]:ta,[`${E}`]:!ta}}),children:[t("div",{"data-controls":"slot[toolControls]",...K(!ta),children:t(k.MobileToolControls,{})}),t("div",{"data-controls":"slot[viewControls]",...K(!ta),children:t(k.MobileViewControls,{})}),t("div",{"data-controls":"slot[toolbar]",children:_&&t(k.MobileToolbar,{})})]})})]}),t("aside",{"data-layout":"slot[sidebar]",children:a(H.Root,{ownerState:tb,"data-sidebar":u({state:{[`${j}`]:te,[`${A}`]:!te,[`${z}`]:ts}}),...K(!te),children:[a(H.Header,{ownerState:tb,"data-sidebar":"slot[header]",children:[t("div",{"data-sidebar":"slot[header.start]",children:t(k.MobileSidebarBackButton,{})}),t("div",{"data-sidebar":"slot[header.end]",children:t(k.MobilePoweredBy,{})})]}),t(H.Body,{ownerState:tb,"data-sidebar":"slot[body]",children:t(H.Content,{ref:o,ownerState:tb,"data-sidebar":"slot[content]",children:t(k.MobileSidebarContent,{})})}),t(H.Tabs,{ownerState:tb,"data-sidebar":"slot[tabs]",children:t(k.MobileTabs,{})}),t(H.Footer,{ownerState:tb,"data-sidebar":"slot[footer]",children:t(k.MobileSidebarFooter,{})}),t(S,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:t(k.MobileFooter,{})})]})]})};
@@ -57,6 +57,6 @@ declare const ResponsiveNavigation: <VALUE extends string, ENTITY_ID extends Dom
57
57
  */
58
58
  export declare const MobileControls: {
59
59
  Navigation: typeof ResponsiveNavigation;
60
- ViewOnlyMode: (inProps: import("../../../../ui-sdk/components/mobile-controls/MobileControls").ViewOnlyModeProps & import("#package/ui-sdk").MobileControlsThemeableProps) => import("react/jsx-runtime").JSX.Element;
60
+ ViewOnlyMode: (inProps: import("#package/ui-sdk").ViewOnlyModeProps & import("#package/ui-sdk").MobileControlsThemeableProps) => import("react/jsx-runtime").JSX.Element;
61
61
  };
62
62
  export {};
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Opens and closes the assistant panel. It renders nothing where there is no panel to open: in a
3
- * project without an assistant, or in a layout that does not carry the panel.
2
+ * Opens and closes the assistant panel. It renders nothing in a project without an assistant. A
3
+ * layout that lists the button is expected to carry the panel; the button does not check for it.
4
4
  */
5
5
  export declare const AssistantToolbarButton: import("react").FunctionComponent<{
6
6
  readonly showTitle?: boolean;
@@ -1 +1 @@
1
- import{jsx as t}from"react/jsx-runtime";import{Badge as r}from"@mui/material";import{memo as s,useCallback as a}from"react";import{assistantToolbarButtonSchema as o,createPhoenixLayoutElement as e}from"#package/domain";import{useLocalizable as i}from"#package/react-sdk";import{DesktopToolbar as n,PhxIcon as m,useResponsive as l}from"#package/ui-sdk";import{useAssistantPanel as p}from"../assistant/index.js";let c={id:"sdk.assistant.toolbarButton.label",message:"Assistant"};export const AssistantToolbarButton=e({schema:o,component:s(s=>{let{icon:o,showTitle:e=!0}=s,d=p(),u=i(c),{isPhone:k,isTablet:f}=l(),A=d?.open??!1,b=d?.setOpen,g=a(()=>{b?.(!A)},[A,b]);return d?t(n.Button,{title:u,onClick:g,showTitle:e&&!k&&!f,"aria-pressed":A,sx:{'&[aria-pressed="true"]':{backgroundColor:"action.selected"}},children:t(r,{color:"primary",variant:"dot",overlap:"circular",invisible:!d.hasUnreadReply,children:t(m,{name:o??(A?"CustomAiAssistantBold":"CustomAiAssistant")})})}):null})});
1
+ import{jsx as t}from"react/jsx-runtime";import{Badge as r}from"@mui/material";import{memo as o,useCallback as a}from"react";import{assistantToolbarButtonSchema as i,createPhoenixLayoutElement as e}from"#package/domain";import{useEagerObservableValue as s,useLocalizable as n,useSpecAssistant as m}from"#package/react-sdk";import{DesktopToolbar as l,PhxIcon as p,useResponsive as c}from"#package/ui-sdk";import{useConfigurator as d}from"../../application-runtime/index.js";let u={id:"sdk.assistant.toolbarButton.label",message:"Assistant"};export const AssistantToolbarButton=e({schema:i,component:o(o=>{let{icon:i,showTitle:e=!0}=o,{assistantSystem:k}=d(),f=m(),{open:A,hasUnreadReply:b}=s(k.panel$),g=n(u),{isPhone:x,isTablet:h}=c(),B=a(()=>{k.setOpen(!A)},[k,A]);return f?t(l.Button,{title:g,onClick:B,showTitle:e&&!x&&!h,"aria-pressed":A,sx:{'&[aria-pressed="true"]':{backgroundColor:"action.selected"}},children:t(r,{color:"primary",variant:"dot",overlap:"circular",invisible:!b,children:t(p,{name:i??(A?"CustomAiAssistantBold":"CustomAiAssistant")})})}):null})});