@salsita-ai/sdk 0.50.0-develop.801a817d3f → 0.50.0-develop.9267bdc12e

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 (1049) hide show
  1. package/README.md +3 -3
  2. package/dist/admin/create-admin-pages-from-spec.d.ts +1 -1
  3. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  4. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  5. package/dist/application-spec/errors/diagnostic-messages.d.ts +5 -0
  6. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  7. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  8. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  9. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  10. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  11. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  12. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +8 -1
  13. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  14. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  15. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  16. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  17. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  18. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  19. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  20. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  21. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  22. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  23. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  24. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-defaults.d.ts +4 -2
  25. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +56 -56
  26. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +1 -1
  27. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  28. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-phx-globals.js +3 -0
  29. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-relation-expressions.js +1 -1
  30. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.d.ts +6 -8
  31. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +11 -11
  32. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +1 -1
  33. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  34. package/dist/application-spec/generate-application/code/templates/domain-spec.js +12 -12
  35. package/dist/application-spec/generate-application/code/templates/domain.js +5 -5
  36. package/dist/application-spec/generate-application/code/templates/globals.js +5 -4
  37. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -7
  38. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  39. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  40. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  41. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +93 -41
  42. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +10 -4
  43. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  45. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  46. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +39 -13
  47. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -7
  48. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +9 -4
  49. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -2
  50. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +1 -3
  51. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +1 -3
  52. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  53. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  54. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +2 -1
  55. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  56. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +2 -4
  57. package/dist/application-spec/parse-application-files/categorize/module-analysis.d.ts +1 -1
  58. package/dist/application-spec/parse-application-files/categorize/module-analysis.js +1 -1
  59. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.d.ts +1 -1
  60. package/dist/application-spec/parse-application-files/raw-spec/raw-assistant.js +1 -1
  61. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  62. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  63. package/dist/application-spec/parse-application-files/spec/model/defaults.d.ts +7 -2
  64. package/dist/application-spec/parse-application-files/spec/model/defaults.js +1 -1
  65. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.d.ts +25 -0
  66. package/dist/application-spec/parse-application-files/spec/relations/reference-field-type.js +1 -0
  67. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.d.ts +46 -0
  68. package/dist/application-spec/parse-application-files/spec/relations/relation-field-mismatch.js +1 -0
  69. package/dist/application-spec/parse-application-files/spec/relations/relations.d.ts +4 -3
  70. package/dist/application-spec/parse-application-files/spec/relations/relations.js +1 -1
  71. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  72. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  73. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  74. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  75. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  76. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  77. package/dist/application-spec/parse-application-files/spec/sections/infra.d.ts +2 -0
  78. package/dist/application-spec/parse-application-files/spec/sections/infra.js +1 -1
  79. package/dist/client/authorized-client.d.ts +3 -1
  80. package/dist/client/authorized-client.js +1 -1
  81. package/dist/client/contract.d.ts +34 -0
  82. package/dist/client/contract.js +1 -1
  83. package/dist/client/index.d.ts +2 -2
  84. package/dist/client/index.js +1 -1
  85. package/dist/client/local-authorized-client.d.ts +3 -1
  86. package/dist/client/local-authorized-client.js +1 -1
  87. package/dist/client/memory-authorized-client.d.ts +3 -1
  88. package/dist/client/memory-authorized-client.js +1 -1
  89. package/dist/client/phoenix-api.d.ts +271 -30
  90. package/dist/configurator/application-runtime/extensions/create-configurator-extensions.js +1 -1
  91. package/dist/configurator/application-runtime/extensions/selectors.d.ts +3 -1
  92. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  93. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +123 -8
  94. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  95. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  96. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  97. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +5 -1
  98. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  99. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  100. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +9 -1
  101. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  102. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  103. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  104. package/dist/configurator/common/configurator-interface.d.ts +5 -1
  105. package/dist/configurator/common/configurator-interface.js +1 -1
  106. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +6 -0
  107. package/dist/configurator/pages/DefaultConfiguratorLayout.js +1 -0
  108. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  109. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  110. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +2 -1
  111. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -1
  112. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -2
  113. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  114. package/dist/configurator/ui/assistant/thread-items.d.ts +13 -2
  115. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  116. package/dist/configurator/ui/assistant/tool-chip.d.ts +8 -1
  117. package/dist/configurator/ui/assistant/tool-chip.js +1 -1
  118. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.d.ts +1 -75
  119. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -20
  120. package/dist/configurator/ui/configurator-layout/universal/DesktopPreview.js +1 -1
  121. package/dist/configurator/ui/configurator-layout/universal/DesktopSidebar.d.ts +92 -0
  122. package/dist/configurator/ui/configurator-layout/universal/DesktopSidebar.js +16 -0
  123. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  124. package/dist/configurator/ui/configurator-layout/universal/MobilePreview.js +1 -1
  125. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.d.ts +47 -0
  126. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.js +1 -0
  127. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.d.ts +11 -26
  128. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.js +1 -1
  129. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +100 -117
  130. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  131. package/dist/docs/complex-use-cases/sketching.mdx +0 -38
  132. package/dist/docs/controls/select-attribute/cardselect.mdx +9 -13
  133. package/dist/docs/index.json +11 -1
  134. package/dist/docs/integrations/woocommerce/local-development.mdx +1 -1
  135. package/dist/docs/layouts/custom-layout.mdx +981 -0
  136. package/dist/docs/layouts/custom-price.mdx +14 -16
  137. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  138. package/dist/docs/other-features/domain-actions.mdx +1 -1
  139. package/dist/docs/other-features/side-effects.mdx +58 -48
  140. package/dist/docs/other-features/transformers.mdx +1 -1
  141. package/dist/docs/other-features/violation-messages.mdx +52 -56
  142. package/dist/docs/phoenix/admin.mdx +9 -24
  143. package/dist/docs/phoenix/configurator-interface.mdx +105 -65
  144. package/dist/docs/phoenix/deployments.mdx +1 -1
  145. package/dist/docs/phoenix/domain-model.mdx +4 -0
  146. package/dist/docs/phoenix/expression-context.mdx +11 -3
  147. package/dist/docs/phoenix/getting-started.mdx +1 -1
  148. package/dist/docs/phoenix/localization.mdx +3 -22
  149. package/dist/docs/phoenix/phoenix-cli.mdx +123 -48
  150. package/dist/docs/phoenix/project-structure.mdx +24 -11
  151. package/dist/docs/phoenix/quickstart.mdx +2 -2
  152. package/dist/docs/phoenix/sdk-builder-workflow.mdx +12 -11
  153. package/dist/docs/phoenix/webhook-membership.mdx +10 -9
  154. package/dist/docs/phoenix/webhooks.mdx +2 -2
  155. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  156. package/dist/docs/relations/hierarchy.mdx +13 -2
  157. package/dist/docs/ux-guidelines/choosing-a-control.mdx +11 -0
  158. package/dist/domain/admin-domain/__generated/enhanced-model.d.ts +1 -2
  159. package/dist/domain/admin-domain/__generated/model/versions/v1.d.ts +1 -1
  160. package/dist/domain/admin-domain/__generated/model/versions/v2.d.ts +1 -1
  161. package/dist/domain/admin-domain/__generated/model/versions/v3.d.ts +1 -1
  162. package/dist/domain/admin-domain/__generated/model/versions/v4.d.ts +1 -1
  163. package/dist/domain/admin-domain/__generated/model/versions/v5.d.ts +1 -1
  164. package/dist/domain/admin-domain/__generated/model/versions/v6.d.ts +2 -2
  165. package/dist/domain/admin-domain/__generated/model/versions/v6.js +1 -1
  166. package/dist/domain/admin-domain/implementation/common-admin-expressions.d.ts +26 -14
  167. package/dist/domain/admin-domain/implementation/common-admin-migrations.d.ts +1 -1
  168. package/dist/domain/admin-domain/implementation/common-admin-publish.d.ts +1 -2
  169. package/dist/domain/admin-domain/index.d.ts +9 -5
  170. package/dist/domain/admin-domain/index.js +1 -1
  171. package/dist/domain/application/GetApplicationWrapperHandler.d.ts +2 -2
  172. package/dist/domain/application/GetThemeHandler.d.ts +1 -1
  173. package/dist/domain/application/GetWebComponentOptions.d.ts +1 -1
  174. package/dist/domain/application/admin-page-factories.d.ts +1 -2
  175. package/dist/domain/application/application-config.d.ts +28 -97
  176. package/dist/domain/application/assistant/assistant-fields.d.ts +5 -0
  177. package/dist/domain/application/assistant/assistant-fields.js +1 -0
  178. package/dist/domain/application/assistant/assistant-manifest.d.ts +63 -0
  179. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +121 -0
  180. package/dist/domain/application/assistant/assistant-resolved-manifest.js +1 -0
  181. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  182. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  183. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  184. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  185. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  186. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  187. package/dist/domain/application/assistant/index.d.ts +7 -0
  188. package/dist/domain/application/assistant/index.js +1 -0
  189. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.d.ts +20 -0
  190. package/dist/domain/application/assistant/session-setup/AssistantSetupHandler.js +1 -0
  191. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.d.ts +10 -0
  192. package/dist/domain/application/assistant/session-setup/apply-assistant-setup.js +1 -0
  193. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.d.ts +48 -0
  194. package/dist/domain/application/assistant/session-setup/assistant-setup-manifest.js +1 -0
  195. package/dist/domain/application/assistant/session-setup/create-session-assistant.d.ts +15 -0
  196. package/dist/domain/application/assistant/session-setup/create-session-assistant.js +1 -0
  197. package/dist/domain/application/assistant/session-setup/index.d.ts +4 -0
  198. package/dist/domain/application/assistant/session-setup/index.js +1 -0
  199. package/dist/domain/application/assistant-field-options.d.ts +2 -3
  200. package/dist/domain/application/assistant-mutations.d.ts +3 -5
  201. package/dist/domain/application/assistant-mutations.js +1 -1
  202. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -7
  203. package/dist/domain/application/configurator-builder.d.ts +33 -18
  204. package/dist/domain/application/configurator-builder.js +1 -1
  205. package/dist/domain/application/create-initial-published-data.d.ts +6 -7
  206. package/dist/domain/application/index.d.ts +3 -6
  207. package/dist/domain/application/index.js +1 -1
  208. package/dist/domain/application/published-data/DataRowValidatorHandler.d.ts +1 -1
  209. package/dist/domain/application/published-data/FilterPublishedChunksHandler.d.ts +1 -1
  210. package/dist/domain/application/published-data/MapPublishedChunkedDataHandler.d.ts +1 -1
  211. package/dist/domain/application/published-data/MapPublishedRevisionDataHandler.d.ts +1 -1
  212. package/dist/domain/application/published-data/SheetValidatorHandler.d.ts +1 -1
  213. package/dist/domain/application/published-data/build-legend-data.d.ts +1 -1
  214. package/dist/domain/application/published-data/create-finalize-admin-domain.d.ts +1 -2
  215. package/dist/domain/application/published-data/format-field-type.d.ts +1 -1
  216. package/dist/domain/application/published-data/map-data-to-sheet.d.ts +1 -1
  217. package/dist/domain/application/published-data/map-published-chunked-data.d.ts +3 -3
  218. package/dist/domain/application/published-data/map-published-data.d.ts +7 -4
  219. package/dist/domain/application/published-data/validate-sheet-data.d.ts +1 -1
  220. package/dist/domain/available-system-components.js +1 -1
  221. package/dist/domain/core/action/action-factory.d.ts +11 -0
  222. package/dist/domain/core/{action.d.ts → action/action.d.ts} +22 -18
  223. package/dist/domain/core/action/index.d.ts +2 -0
  224. package/dist/domain/core/action/index.js +1 -0
  225. package/dist/domain/{components → core/component}/component-reader-types.d.ts +1 -2
  226. package/dist/domain/{components → core/component}/debug-state-component.d.ts +1 -1
  227. package/dist/domain/core/component/debug-state-component.js +1 -0
  228. package/dist/domain/core/component/domain-component-optic.d.ts +65 -0
  229. package/dist/domain/core/component/domain-component-optic.js +16 -0
  230. package/dist/domain/{components → core/component}/drag-state-component.d.ts +1 -1
  231. package/dist/domain/core/component/drag-state-component.js +1 -0
  232. package/dist/domain/{components → core/component}/export-state-component.d.ts +1 -1
  233. package/dist/domain/core/component/export-state-component.js +1 -0
  234. package/dist/domain/{components → core/component}/fullscreen-state-component.d.ts +1 -1
  235. package/dist/domain/core/component/fullscreen-state-component.js +1 -0
  236. package/dist/domain/{components → core/component}/group-components-by-entity-id-and-name.d.ts +1 -2
  237. package/dist/domain/core/component/group-components-by-entity-id-and-name.js +1 -0
  238. package/dist/domain/{components → core/component}/hover-state-component.d.ts +1 -1
  239. package/dist/domain/core/component/hover-state-component.js +1 -0
  240. package/dist/domain/core/component/index.d.ts +18 -0
  241. package/dist/domain/core/component/index.js +1 -0
  242. package/dist/domain/{components → core/component}/legacy-filter.d.ts +4 -19
  243. package/dist/domain/{components → core/component}/navigation-state-component.d.ts +1 -1
  244. package/dist/domain/core/component/navigation-state-component.js +1 -0
  245. package/dist/domain/{components → core/component}/selection-state-component.d.ts +1 -1
  246. package/dist/domain/core/component/selection-state-component.js +1 -0
  247. package/dist/domain/{components → core/component}/system-component-builder.d.ts +1 -2
  248. package/dist/domain/core/component/system-component-builder.js +1 -0
  249. package/dist/domain/{components → core/component}/system-component-filter.d.ts +38 -20
  250. package/dist/domain/core/component/system-virtual-entity.js +1 -0
  251. package/dist/domain/{components → core/component}/tool-state-component.d.ts +1 -1
  252. package/dist/domain/core/component/tool-state-component.js +1 -0
  253. package/dist/domain/{components → core/component}/updates.d.ts +9 -10
  254. package/dist/domain/{components → core/component}/view-state-component.d.ts +1 -1
  255. package/dist/domain/core/component/view-state-component.js +1 -0
  256. package/dist/domain/{components → core/component}/viewport-state-component.d.ts +1 -1
  257. package/dist/domain/core/component/viewport-state-component.js +1 -0
  258. package/dist/domain/core/data-schema/data-cell-value.d.ts +4 -0
  259. package/dist/domain/core/data-schema/data-schema-array-field.d.ts +5 -0
  260. package/dist/domain/core/data-schema/data-schema-field-object.d.ts +4 -0
  261. package/dist/domain/core/data-schema/data-schema-field.d.ts +2 -0
  262. package/dist/domain/core/data-schema/data-schema-localized-field.d.ts +4 -0
  263. package/dist/domain/core/data-schema/data-schema-localized-field.js +1 -0
  264. package/dist/domain/core/data-schema/data-schema-primitive-field.d.ts +5 -0
  265. package/dist/domain/core/data-schema/data-schema-primitive-field.js +1 -0
  266. package/dist/domain/core/data-schema/data-schema.d.ts +2 -0
  267. package/dist/domain/core/data-schema/data-schema.js +1 -0
  268. package/dist/domain/core/data-schema/index.d.ts +7 -0
  269. package/dist/domain/core/data-schema/index.js +1 -0
  270. package/dist/domain/core/decoder/create-decoder.d.ts +6 -0
  271. package/dist/domain/core/decoder/create-decoder.js +1 -0
  272. package/dist/domain/core/decoder/decoder.d.ts +6 -0
  273. package/dist/domain/core/decoder/decoder.js +1 -0
  274. package/dist/domain/core/decoder/index.d.ts +2 -0
  275. package/dist/domain/core/decoder/index.js +1 -0
  276. package/dist/domain/core/domain-factory.d.ts +4 -5
  277. package/dist/domain/core/domain-factory.js +1 -1
  278. package/dist/domain/core/domain.d.ts +4 -5
  279. package/dist/domain/core/domain.js +1 -1
  280. package/dist/domain/core/emission/index.d.ts +8 -0
  281. package/dist/domain/core/emission/index.js +1 -0
  282. package/dist/domain/core/emission/reset-state-emission.d.ts +12 -0
  283. package/dist/domain/core/emission/reset-state-emission.js +1 -0
  284. package/dist/domain/core/emission/state-emission.d.ts +4 -0
  285. package/dist/domain/core/emission/state-emission.js +1 -0
  286. package/dist/domain/core/emission/state-update-emission.d.ts +14 -0
  287. package/dist/domain/core/emission/state-update-emission.js +1 -0
  288. package/dist/domain/core/emission/state-validation-result.d.ts +18 -0
  289. package/dist/domain/core/emission/state-validation-result.js +1 -0
  290. package/dist/domain/core/emission/transformation-log.d.ts +2 -0
  291. package/dist/domain/core/emission/transformation-log.js +1 -0
  292. package/dist/domain/core/emission/transformer-log-entry.d.ts +6 -0
  293. package/dist/domain/core/emission/transformer-log-entry.js +1 -0
  294. package/dist/domain/core/emission/transformer-log.d.ts +11 -0
  295. package/dist/domain/core/emission/transformer-log.js +1 -0
  296. package/dist/domain/core/emission/transformer-phase.d.ts +1 -0
  297. package/dist/domain/core/emission/transformer-phase.js +1 -0
  298. package/dist/domain/core/expression/aliased-expressions.d.ts +10 -0
  299. package/dist/domain/core/expression/aliased-expressions.js +1 -0
  300. package/dist/domain/core/expression/constant-expressions.d.ts +16 -0
  301. package/dist/domain/core/expression/constant-expressions.js +1 -0
  302. package/dist/domain/core/expression/custom-expression.d.ts +25 -0
  303. package/dist/domain/core/expression/custom-expression.js +1 -0
  304. package/dist/domain/core/expression/expression.d.ts +46 -0
  305. package/dist/domain/core/expression/expression.js +1 -0
  306. package/dist/domain/core/expression/index.d.ts +4 -0
  307. package/dist/domain/core/expression/index.js +1 -0
  308. package/dist/domain/core/index.d.ts +13 -17
  309. package/dist/domain/core/index.js +1 -1
  310. package/dist/domain/{invariants → core/invariant}/builtin-invariant.d.ts +2 -2
  311. package/dist/domain/core/invariant/custom-invariants.d.ts +13 -0
  312. package/dist/domain/core/invariant/custom-invariants.js +1 -0
  313. package/dist/domain/core/invariant/index.d.ts +5 -0
  314. package/dist/domain/core/invariant/index.js +1 -0
  315. package/dist/domain/core/invariant/invariants.d.ts +10 -0
  316. package/dist/domain/core/invariant/invariants.js +1 -0
  317. package/dist/domain/core/invariant/violation-component.js +1 -0
  318. package/dist/domain/{invariants → core/invariant}/violation.d.ts +2 -2
  319. package/dist/domain/core/{component.d.ts → model/component.d.ts} +1 -1
  320. package/dist/domain/core/model/index.d.ts +6 -0
  321. package/dist/domain/core/model/index.js +1 -0
  322. package/dist/domain/core/{reflection.d.ts → model/reflection.d.ts} +1 -1
  323. package/dist/domain/core/model/reflection.js +1 -0
  324. package/dist/domain/core/recipe/index.d.ts +1 -0
  325. package/dist/domain/core/recipe/index.js +1 -0
  326. package/dist/domain/core/recipe/recipes.d.ts +23 -0
  327. package/dist/domain/core/recipe/recipes.js +1 -0
  328. package/dist/domain/core/relation/all-of-type-relation.d.ts +19 -0
  329. package/dist/domain/core/relation/all-of-type-relation.js +1 -0
  330. package/dist/domain/{relations → core/relation}/component-factories.d.ts +1 -2
  331. package/dist/domain/core/relation/component-factories.js +1 -0
  332. package/dist/domain/{relations → core/relation}/composed-of.d.ts +1 -1
  333. package/dist/domain/core/relation/composed-of.js +1 -0
  334. package/dist/domain/core/relation/direct-relation.d.ts +17 -0
  335. package/dist/domain/core/relation/index.d.ts +8 -0
  336. package/dist/domain/core/relation/index.js +1 -0
  337. package/dist/domain/core/relation/indirect-relation.d.ts +25 -0
  338. package/dist/domain/core/relation/indirect-relation.js +1 -0
  339. package/dist/domain/{relations → core/relation}/reference-component.d.ts +4 -5
  340. package/dist/domain/core/relation/reference-component.js +1 -0
  341. package/dist/domain/{relations → core/relation}/reference-field.d.ts +1 -1
  342. package/dist/domain/core/relation/reference-field.js +1 -0
  343. package/dist/domain/core/relation/relation-factory.d.ts +22 -0
  344. package/dist/domain/core/relation/relation-factory.js +1 -0
  345. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  346. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  347. package/dist/domain/core/schema/index.d.ts +3 -0
  348. package/dist/domain/core/schema/index.js +1 -0
  349. package/dist/domain/core/schema/schema-validator.js +1 -0
  350. package/dist/domain/core/state/id-sequence.d.ts +15 -0
  351. package/dist/domain/core/state/id-sequence.js +1 -0
  352. package/dist/domain/core/state/index.d.ts +3 -0
  353. package/dist/domain/core/state/index.js +1 -0
  354. package/dist/domain/core/{migrations.d.ts → state/migrations.d.ts} +15 -47
  355. package/dist/domain/core/state/migrations.js +1 -0
  356. package/dist/domain/core/{state.d.ts → state/state.d.ts} +2 -3
  357. package/dist/domain/domain-builder.d.ts +11 -11
  358. package/dist/domain/domain-builder.js +1 -1
  359. package/dist/domain/domain-context/action-system/action-system.d.ts +2 -4
  360. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  361. package/dist/domain/domain-context/action-system/index.d.ts +1 -0
  362. package/dist/domain/domain-context/action-system/index.js +1 -0
  363. package/dist/domain/domain-context/analytics-system/index.d.ts +2 -0
  364. package/dist/domain/domain-context/analytics-system/index.js +1 -0
  365. package/dist/domain/domain-context/create-transformer.d.ts +2 -2
  366. package/dist/domain/domain-context/dimension-system/dimension-state.js +1 -1
  367. package/dist/domain/domain-context/dimension-system/dimension-system.d.ts +3 -4
  368. package/dist/domain/domain-context/dimension-system/dimension-system.js +1 -1
  369. package/dist/domain/domain-context/dimension-system/index.d.ts +1 -0
  370. package/dist/domain/domain-context/dimension-system/index.js +1 -0
  371. package/dist/domain/domain-context/domain-context-systems.d.ts +8 -10
  372. package/dist/domain/domain-context/index.d.ts +8 -18
  373. package/dist/domain/domain-context/index.js +1 -1
  374. package/dist/domain/domain-context/navigation-system/index.d.ts +3 -0
  375. package/dist/domain/domain-context/navigation-system/index.js +1 -0
  376. package/dist/domain/domain-context/navigation-system/navigation-system.d.ts +5 -8
  377. package/dist/domain/domain-context/navigation-system/navigation-system.js +1 -1
  378. package/dist/domain/domain-context/navigation-system/navigation-updates.d.ts +1 -12
  379. package/dist/domain/domain-context/navigation-system/navigation-updates.js +1 -1
  380. package/dist/domain/domain-context/navigation-system/selection-transformers.d.ts +2 -2
  381. package/dist/domain/domain-context/navigation-system/selection-transformers.js +1 -1
  382. package/dist/domain/domain-context/recipe-system/index.d.ts +1 -0
  383. package/dist/domain/domain-context/recipe-system/index.js +1 -0
  384. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.d.ts +2 -4
  385. package/dist/domain/domain-context/recipe-system/recipe-cooker-system.js +1 -1
  386. package/dist/domain/domain-context/relation-transformers/cascade-deletes.d.ts +3 -3
  387. package/dist/domain/domain-context/relation-transformers/cascade-deletes.js +1 -1
  388. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.d.ts +3 -3
  389. package/dist/domain/domain-context/relation-transformers/cascade-ref-pruning.js +1 -1
  390. package/dist/domain/domain-context/relation-transformers/create-entity-refs.d.ts +3 -3
  391. package/dist/domain/domain-context/relation-transformers/create-entity-refs.js +2 -2
  392. package/dist/domain/domain-context/relation-transformers/index.d.ts +4 -0
  393. package/dist/domain/domain-context/relation-transformers/index.js +1 -0
  394. package/dist/domain/domain-context/relation-transformers/replace-refs.d.ts +3 -3
  395. package/dist/domain/domain-context/relation-transformers/replace-refs.js +1 -1
  396. package/dist/domain/domain-context/store-system/apply-updates.d.ts +1 -3
  397. package/dist/domain/domain-context/store-system/apply-updates.js +1 -1
  398. package/dist/domain/domain-context/store-system/index.d.ts +4 -0
  399. package/dist/domain/domain-context/store-system/index.js +1 -0
  400. package/dist/domain/domain-context/store-system/next-domain-entity-id.d.ts +1 -13
  401. package/dist/domain/domain-context/store-system/next-domain-entity-id.js +1 -1
  402. package/dist/domain/domain-context/store-system/reconcile-projected-entities.d.ts +1 -2
  403. package/dist/domain/domain-context/store-system/reconcile-projected-entities.js +1 -1
  404. package/dist/domain/domain-context/store-system/store-system.d.ts +2 -39
  405. package/dist/domain/domain-context/store-system/store-system.js +2 -2
  406. package/dist/domain/domain-context/store-system/system-state.d.ts +2 -4
  407. package/dist/domain/domain-context/store-system/system-state.js +1 -1
  408. package/dist/domain/domain-context/transformers/actions-builder.d.ts +1 -2
  409. package/dist/domain/domain-context/transformers/actions-builder.js +1 -1
  410. package/dist/domain/domain-context/transformers/auto-snap-transformer.d.ts +6 -10
  411. package/dist/domain/domain-context/transformers/auto-snap-transformer.js +1 -1
  412. package/dist/domain/domain-context/transformers/chain-builder.d.ts +3 -3
  413. package/dist/domain/domain-context/transformers/context.d.ts +2 -7
  414. package/dist/domain/domain-context/transformers/context.js +1 -1
  415. package/dist/domain/domain-context/transformers/entity-builder.d.ts +1 -5
  416. package/dist/domain/domain-context/transformers/entity-builder.js +1 -1
  417. package/dist/domain/domain-context/transformers/index.d.ts +1 -1
  418. package/dist/domain/domain-context/transformers/index.js +1 -1
  419. package/dist/domain/domain-context/transformers/then-builder.d.ts +1 -2
  420. package/dist/domain/domain-context/transformers/then-builder.js +1 -1
  421. package/dist/domain/domain-context/transformers/when-builder.d.ts +3 -9
  422. package/dist/domain/domain-context/transformers/when-builder.js +1 -1
  423. package/dist/domain/domain-context/undo-system.d.ts +2 -3
  424. package/dist/domain/domain-runtime/access/selectors.d.ts +9 -0
  425. package/dist/domain/domain-runtime/access/selectors.js +1 -1
  426. package/dist/domain/domain-runtime/access/types.d.ts +2 -0
  427. package/dist/domain/domain-runtime/access/types.js +1 -1
  428. package/dist/domain/domain-runtime/domain-context/action-context.d.ts +11 -0
  429. package/dist/domain/domain-runtime/domain-context/action-context.js +1 -0
  430. package/dist/domain/domain-runtime/domain-context/component-reader.d.ts +1 -4
  431. package/dist/domain/domain-runtime/domain-context/component-reader.js +1 -1
  432. package/dist/domain/domain-runtime/domain-context/domain-context.js +1 -1
  433. package/dist/domain/domain-runtime/domain-context/expression-context.d.ts +8 -0
  434. package/dist/domain/domain-runtime/domain-context/expression-context.js +1 -0
  435. package/dist/domain/domain-runtime/domain-context/index.d.ts +3 -0
  436. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.d.ts +18 -0
  437. package/dist/domain/domain-runtime/domain-context/runtime-expression-context.js +1 -0
  438. package/dist/domain/domain-runtime/domain-context/selectors.d.ts +19 -25
  439. package/dist/domain/domain-runtime/domain-context/selectors.js +1 -1
  440. package/dist/domain/domain-runtime/domain-context/types.d.ts +4 -1
  441. package/dist/domain/domain-runtime/domain-runtime.d.ts +88 -72
  442. package/dist/domain/domain-runtime/errors/implementation-error-collector.d.ts +19 -0
  443. package/dist/domain/domain-runtime/errors/implementation-error-collector.js +1 -0
  444. package/dist/domain/domain-runtime/errors/implementation-error.d.ts +46 -0
  445. package/dist/domain/domain-runtime/errors/implementation-error.js +1 -0
  446. package/dist/domain/domain-runtime/errors/implementation-errors.d.ts +13 -0
  447. package/dist/domain/domain-runtime/errors/implementation-errors.js +1 -0
  448. package/dist/domain/domain-runtime/errors/index.d.ts +4 -0
  449. package/dist/domain/domain-runtime/errors/index.js +1 -0
  450. package/dist/domain/domain-runtime/errors/to-implementation-errors.d.ts +10 -0
  451. package/dist/domain/domain-runtime/errors/to-implementation-errors.js +1 -0
  452. package/dist/domain/domain-runtime/index.d.ts +1 -0
  453. package/dist/domain/domain-runtime/index.js +1 -1
  454. package/dist/domain/domain-runtime/spec/create-violation-expressions.d.ts +24 -0
  455. package/dist/domain/domain-runtime/spec/create-violation-expressions.js +1 -0
  456. package/dist/domain/domain-runtime/spec/index.d.ts +5 -0
  457. package/dist/domain/domain-runtime/spec/index.js +1 -1
  458. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  459. package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.d.ts +1 -2
  460. package/dist/domain/{application → domain-runtime/spec/module-checks}/element-registration.d.ts +6 -1
  461. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -0
  462. package/dist/domain/{application → domain-runtime/spec/module-checks}/handler-registration.d.ts +5 -0
  463. package/dist/domain/domain-runtime/spec/module-checks/handler-registration.js +1 -0
  464. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +8 -0
  465. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -0
  466. package/dist/domain/domain-runtime/spec/module-checks/project-modules.d.ts +32 -0
  467. package/dist/domain/domain-runtime/spec/module-checks/project-modules.js +1 -0
  468. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.d.ts +4 -0
  469. package/dist/domain/domain-runtime/spec/module-checks/resolve-action-modules.js +1 -0
  470. package/dist/domain/domain-runtime/spec/module-checks/resolve-component-optic-modules.d.ts +4 -0
  471. package/dist/domain/domain-runtime/spec/module-checks/resolve-component-optic-modules.js +1 -0
  472. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.d.ts +15 -0
  473. package/dist/domain/domain-runtime/spec/module-checks/resolve-expression-modules.js +1 -0
  474. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.d.ts +22 -0
  475. package/dist/domain/domain-runtime/spec/module-checks/resolve-imported-transformers.js +1 -0
  476. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.d.ts +6 -0
  477. package/dist/domain/domain-runtime/spec/module-checks/resolve-invariant-modules.js +1 -0
  478. package/dist/domain/{actions → domain-runtime/spec}/prepare-action-implementations.d.ts +1 -1
  479. package/dist/domain/domain-runtime/spec/prepare-action-implementations.js +5 -0
  480. package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.d.ts +1 -1
  481. package/dist/domain/domain-runtime/spec/selectors.d.ts +7 -8
  482. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  483. package/dist/domain/domain-runtime/spec/types.d.ts +6 -6
  484. package/dist/domain/{system-components → extensions}/angle-indicator.d.ts +1 -1
  485. package/dist/domain/extensions/angle-indicator.js +1 -0
  486. package/dist/domain/extensions/attribute-switch.js +1 -0
  487. package/dist/domain/{system-components → extensions}/autorotate-camera-component.d.ts +1 -1
  488. package/dist/domain/extensions/autorotate-camera-component.js +1 -0
  489. package/dist/domain/{system-components → extensions}/basic-sidebar-footer.d.ts +1 -1
  490. package/dist/domain/extensions/basic-sidebar-footer.js +1 -0
  491. package/dist/domain/extensions/camera-based-hidden-entity-object.js +1 -0
  492. package/dist/domain/extensions/camera-based-hidden-entity.js +1 -0
  493. package/dist/domain/{system-components → extensions}/canvas-config.d.ts +1 -1
  494. package/dist/domain/extensions/canvas-config.js +1 -0
  495. package/dist/domain/extensions/canvas-custom-environment.js +1 -0
  496. package/dist/domain/{system-components → extensions}/canvas-padding.d.ts +1 -1
  497. package/dist/domain/extensions/canvas-padding.js +1 -0
  498. package/dist/domain/{system-components → extensions}/canvas-preset-environment.d.ts +1 -1
  499. package/dist/domain/extensions/canvas-preset-environment.js +1 -0
  500. package/dist/domain/{system-components → extensions}/child-entity-recipe-hierarchy.d.ts +2 -2
  501. package/dist/domain/extensions/child-entity-recipe-hierarchy.js +1 -0
  502. package/dist/domain/extensions/client-side-image.js +1 -0
  503. package/dist/domain/extensions/color-value.js +1 -0
  504. package/dist/domain/{system-components → extensions}/common/angle-indicator-schema.d.ts +1 -1
  505. package/dist/domain/extensions/common/angle-indicator-schema.js +1 -0
  506. package/dist/domain/{system-components → extensions}/common/dimension-indicator-schema.d.ts +1 -1
  507. package/dist/domain/extensions/common/dimension-indicator-schema.js +1 -0
  508. package/dist/domain/extensions/common/index.d.ts +4 -0
  509. package/dist/domain/extensions/common/index.js +1 -0
  510. package/dist/domain/{system-components → extensions}/custom-header.d.ts +2 -2
  511. package/dist/domain/{system-components → extensions}/custom-header.js +1 -1
  512. package/dist/domain/extensions/custom-price-footer.js +1 -0
  513. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.d.ts +2 -2
  514. package/dist/domain/{system-components → extensions}/custom-sidebar-footer.js +1 -1
  515. package/dist/domain/{system-components → extensions}/dimension-indicator.d.ts +1 -1
  516. package/dist/domain/extensions/dimension-indicator.js +1 -0
  517. package/dist/domain/{system-components → extensions}/editable-angle-indicator.d.ts +3 -2
  518. package/dist/domain/extensions/editable-angle-indicator.js +1 -0
  519. package/dist/domain/{system-components → extensions}/editable-distance-dimension-indicator.d.ts +3 -2
  520. package/dist/domain/extensions/editable-distance-dimension-indicator.js +1 -0
  521. package/dist/domain/{system-components → extensions}/editable-offset-indicator.d.ts +3 -2
  522. package/dist/domain/extensions/editable-offset-indicator.js +1 -0
  523. package/dist/domain/{system-components → extensions}/editable-size-indicator.d.ts +3 -2
  524. package/dist/domain/extensions/editable-size-indicator.js +1 -0
  525. package/dist/domain/{system-components → extensions}/entity-header.d.ts +1 -1
  526. package/dist/domain/extensions/entity-header.js +1 -0
  527. package/dist/domain/{system-components → extensions}/exit-tool-mode-fab.d.ts +1 -1
  528. package/dist/domain/extensions/exit-tool-mode-fab.js +1 -0
  529. package/dist/domain/{system-components → extensions}/finalize-action.d.ts +1 -1
  530. package/dist/domain/extensions/finalize-action.js +1 -0
  531. package/dist/domain/extensions/finalize-component.js +1 -0
  532. package/dist/domain/extensions/fit-selection-orthographic-camera-component.js +1 -0
  533. package/dist/domain/extensions/fit-selection-perspective-camera-component.js +1 -0
  534. package/dist/domain/{system-components → extensions}/fixed-header.d.ts +1 -1
  535. package/dist/domain/extensions/fixed-header.js +1 -0
  536. package/dist/domain/{system-components → extensions}/floating-header.d.ts +1 -1
  537. package/dist/domain/extensions/floating-header.js +1 -0
  538. package/dist/domain/{system-components → extensions}/hidden-header.d.ts +1 -1
  539. package/dist/domain/extensions/hidden-header.js +1 -0
  540. package/dist/domain/{system-components → extensions}/hidden-sidebar-footer.d.ts +1 -1
  541. package/dist/domain/extensions/hidden-sidebar-footer.js +1 -0
  542. package/dist/domain/{system-components → extensions}/horizontal-tabs.d.ts +1 -1
  543. package/dist/domain/extensions/horizontal-tabs.js +1 -0
  544. package/dist/domain/extensions/index.d.ts +69 -0
  545. package/dist/domain/extensions/index.js +1 -0
  546. package/dist/domain/{system-components → extensions}/list-selector-dimension-indicator.d.ts +3 -2
  547. package/dist/domain/extensions/list-selector-dimension-indicator.js +1 -0
  548. package/dist/domain/extensions/multilingual-text-value.js +1 -0
  549. package/dist/domain/extensions/navigation-steps.js +1 -0
  550. package/dist/domain/{system-components → extensions}/offset-anchors.d.ts +1 -1
  551. package/dist/domain/extensions/offset-anchors.js +1 -0
  552. package/dist/domain/{system-components → extensions}/offset-indicator.d.ts +1 -2
  553. package/dist/domain/extensions/offset-indicator.js +1 -0
  554. package/dist/domain/{system-components → extensions}/offset.d.ts +1 -1
  555. package/dist/domain/extensions/offset.js +1 -0
  556. package/dist/domain/{system-components → extensions}/other-action.d.ts +1 -1
  557. package/dist/domain/extensions/other-action.js +1 -0
  558. package/dist/domain/{system-components → extensions}/property-page.d.ts +2 -2
  559. package/dist/domain/extensions/property-page.js +1 -0
  560. package/dist/domain/{system-components → extensions}/read-sidebar-footer.d.ts +1 -1
  561. package/dist/domain/extensions/read-sidebar-footer.js +1 -0
  562. package/dist/domain/{system-components → extensions}/replace-entity-recipe-hierarchy.d.ts +2 -2
  563. package/dist/domain/extensions/replace-entity-recipe-hierarchy.js +1 -0
  564. package/dist/domain/extensions/rotatable.js +1 -0
  565. package/dist/domain/extensions/rotation-handle.js +1 -0
  566. package/dist/domain/extensions/save-template-thumbnail.js +1 -0
  567. package/dist/domain/{system-components → extensions}/scene-entity-add-fab.d.ts +1 -1
  568. package/dist/domain/extensions/scene-entity-add-fab.js +1 -0
  569. package/dist/domain/extensions/scene-entity-animation.js +1 -0
  570. package/dist/domain/extensions/scene-entity-control.js +1 -0
  571. package/dist/domain/{system-components → extensions}/scene-entity-delete-fab.d.ts +1 -1
  572. package/dist/domain/extensions/scene-entity-delete-fab.js +1 -0
  573. package/dist/domain/extensions/scene-entity-floor-object.js +1 -0
  574. package/dist/domain/{system-components → extensions}/scene-entity-html-hotspot.d.ts +1 -1
  575. package/dist/domain/extensions/scene-entity-html-hotspot.js +1 -0
  576. package/dist/domain/{system-components → extensions}/scene-entity-navigation-hotspot.d.ts +1 -1
  577. package/dist/domain/extensions/scene-entity-navigation-hotspot.js +1 -0
  578. package/dist/domain/{system-components → extensions}/scene-entity-object-html-hotspot.d.ts +1 -1
  579. package/dist/domain/extensions/scene-entity-object-html-hotspot.js +1 -0
  580. package/dist/domain/{system-components → extensions}/scene-entity-select-hotspot.d.ts +1 -1
  581. package/dist/domain/extensions/scene-entity-select-hotspot.js +1 -0
  582. package/dist/domain/extensions/scene-entity-wall-object.js +1 -0
  583. package/dist/domain/extensions/selectable-component.js +1 -0
  584. package/dist/domain/{system-components → extensions}/sidebar-tabs.d.ts +1 -1
  585. package/dist/domain/extensions/sidebar-tabs.js +1 -0
  586. package/dist/domain/extensions/simple-summary.js +1 -0
  587. package/dist/domain/{system-components → extensions}/size.d.ts +1 -1
  588. package/dist/domain/extensions/size.js +1 -0
  589. package/dist/domain/{system-components → extensions}/sketching-draw.d.ts +1 -1
  590. package/dist/domain/extensions/sketching-draw.js +1 -0
  591. package/dist/domain/{system-components → extensions}/sketching-edit.d.ts +2 -2
  592. package/dist/domain/extensions/sketching-edit.js +1 -0
  593. package/dist/domain/extensions/summary-component.js +1 -0
  594. package/dist/domain/extensions/text-value.js +1 -0
  595. package/dist/domain/extensions/tool-controls.js +1 -0
  596. package/dist/domain/{system-components → extensions}/tool-menu-fab.d.ts +2 -2
  597. package/dist/domain/extensions/tool-menu-fab.js +1 -0
  598. package/dist/domain/{system-components → extensions}/toolbar.d.ts +2 -2
  599. package/dist/domain/{system-components → extensions}/toolbar.js +1 -1
  600. package/dist/domain/{system-components → extensions}/universal-sidebar-footer.d.ts +1 -1
  601. package/dist/domain/extensions/universal-sidebar-footer.js +1 -0
  602. package/dist/domain/extensions/view-controls.js +1 -0
  603. package/dist/domain/index.d.ts +2 -32
  604. package/dist/domain/index.js +1 -1
  605. package/dist/domain/mocks/create-mock-domain-context.d.ts +1 -1
  606. package/dist/domain/mocks/create-mock-domain-runtime-services.d.ts +1 -1
  607. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +30 -21
  608. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  609. package/dist/domain/mocks/create-mock-domain.d.ts +1 -1
  610. package/dist/domain/mocks/create-mock-domain.js +1 -1
  611. package/dist/domain/mocks/create-mock-state.d.ts +2 -2
  612. package/dist/domain/projections/blender-projections/blender-projections.d.ts +2 -3
  613. package/dist/domain/projections/blender-projections/blender-projections.js +1 -1
  614. package/dist/domain/projections/blender-projections/camera.d.ts +2 -2
  615. package/dist/domain/projections/collision-projections.d.ts +1 -1
  616. package/dist/domain/projections/composition-projections.d.ts +1 -1
  617. package/dist/domain/projections/composition-projections.js +1 -1
  618. package/dist/domain/projections/constraint-projections.d.ts +1 -1
  619. package/dist/domain/projections/index.d.ts +1 -1
  620. package/dist/domain/projections/position-projections.d.ts +1 -1
  621. package/dist/domain/projections/projected-entities-projections.d.ts +2 -3
  622. package/dist/domain/projections/snap-matching.d.ts +1 -2
  623. package/dist/domain/projections/snap-utils.d.ts +1 -2
  624. package/dist/domain/projections/snapping-projections.d.ts +1 -1
  625. package/dist/domain/projections/validation-projections.d.ts +3 -20
  626. package/dist/domain/projections/validation-projections.js +1 -1
  627. package/dist/domain/sketching/sketching-projections.d.ts +1 -1
  628. package/dist/domain/system-components/admin-sidebar.d.ts +1 -1
  629. package/dist/domain/system-components/admin-sidebar.js +1 -1
  630. package/dist/domain/system-components/angle-dimension.js +1 -1
  631. package/dist/domain/system-components/application-config.d.ts +1 -1
  632. package/dist/domain/system-components/application-config.js +1 -1
  633. package/dist/domain/system-components/attribute-selection.js +1 -1
  634. package/dist/domain/system-components/bounding-box-component.d.ts +1 -1
  635. package/dist/domain/system-components/bounding-box-component.js +1 -1
  636. package/dist/domain/system-components/bounding-sphere-component.d.ts +1 -1
  637. package/dist/domain/system-components/bounding-sphere-component.js +1 -1
  638. package/dist/domain/system-components/child-entity-recipes.d.ts +1 -1
  639. package/dist/domain/system-components/child-entity-recipes.js +1 -1
  640. package/dist/domain/system-components/child-entity-selection.d.ts +1 -2
  641. package/dist/domain/system-components/child-entity-selection.js +1 -1
  642. package/dist/domain/system-components/collision-box-geometry.d.ts +1 -1
  643. package/dist/domain/system-components/collision-box-geometry.js +1 -1
  644. package/dist/domain/system-components/collision-geometries.d.ts +1 -1
  645. package/dist/domain/system-components/collision-geometry.d.ts +1 -1
  646. package/dist/domain/system-components/collision-geometry.js +1 -1
  647. package/dist/domain/system-components/collision-point-geometry.d.ts +1 -1
  648. package/dist/domain/system-components/collision-point-geometry.js +1 -1
  649. package/dist/domain/system-components/common/index.d.ts +0 -4
  650. package/dist/domain/system-components/common/index.js +1 -1
  651. package/dist/domain/system-components/common/recipes.d.ts +1 -2
  652. package/dist/domain/system-components/constraint.d.ts +1 -1
  653. package/dist/domain/system-components/constraint.js +1 -1
  654. package/dist/domain/system-components/create-blueprint.d.ts +1 -1
  655. package/dist/domain/system-components/custom-scene-entity.d.ts +1 -1
  656. package/dist/domain/system-components/custom-scene-entity.js +1 -1
  657. package/dist/domain/system-components/detail.js +1 -1
  658. package/dist/domain/system-components/distance-dimension-select.d.ts +1 -1
  659. package/dist/domain/system-components/distance-dimension-select.js +1 -1
  660. package/dist/domain/system-components/distance-dimension.d.ts +1 -1
  661. package/dist/domain/system-components/distance-dimension.js +1 -1
  662. package/dist/domain/system-components/drag-handle.d.ts +1 -1
  663. package/dist/domain/system-components/drag-handle.js +1 -1
  664. package/dist/domain/system-components/fit-entity-orthographic-camera-component.js +1 -1
  665. package/dist/domain/system-components/fit-entity-perspective-camera-component.js +1 -1
  666. package/dist/domain/system-components/fit-root-orthographic-camera-component.js +1 -1
  667. package/dist/domain/system-components/fit-root-perspective-camera-component.js +1 -1
  668. package/dist/domain/system-components/generic-dimension.d.ts +1 -1
  669. package/dist/domain/system-components/generic-dimension.js +1 -1
  670. package/dist/domain/system-components/hidden-entity.js +1 -1
  671. package/dist/domain/system-components/hotspot-drag-handle.d.ts +1 -2
  672. package/dist/domain/system-components/hotspot-drag-handle.js +1 -1
  673. package/dist/domain/system-components/index.d.ts +0 -68
  674. package/dist/domain/system-components/index.js +1 -1
  675. package/dist/domain/system-components/material-override-property-transition.js +1 -1
  676. package/dist/domain/system-components/material-override-transformer.js +1 -1
  677. package/dist/domain/system-components/material-swatch.js +1 -1
  678. package/dist/domain/system-components/navigation-page.js +1 -1
  679. package/dist/domain/system-components/navigation-panel-list.js +1 -1
  680. package/dist/domain/system-components/phoenix-entity-elements/admin-data-table-sidebar.d.ts +1 -1
  681. package/dist/domain/system-components/phoenix-layout-elements/admin-connected-resource-page.d.ts +1 -1
  682. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-actions.d.ts +1 -1
  683. package/dist/domain/system-components/phoenix-layout-elements/admin-data-table-page.d.ts +1 -1
  684. package/dist/domain/system-components/pivot-point.d.ts +1 -1
  685. package/dist/domain/system-components/pivot-point.js +1 -1
  686. package/dist/domain/system-components/price.js +1 -1
  687. package/dist/domain/system-components/projected-entities.d.ts +1 -1
  688. package/dist/domain/system-components/projected-entities.js +1 -1
  689. package/dist/domain/system-components/replace-entity-recipes.d.ts +1 -1
  690. package/dist/domain/system-components/replace-entity-recipes.js +1 -1
  691. package/dist/domain/system-components/scene-entity-ambient-light.js +1 -1
  692. package/dist/domain/system-components/scene-entity-box-object.js +1 -1
  693. package/dist/domain/system-components/scene-entity-directional-light.js +1 -1
  694. package/dist/domain/system-components/scene-entity-local-material-override.js +1 -1
  695. package/dist/domain/system-components/scene-entity-material-override.js +1 -1
  696. package/dist/domain/system-components/scene-entity-object-clip.js +1 -1
  697. package/dist/domain/system-components/scene-entity-object-decal.js +1 -1
  698. package/dist/domain/system-components/scene-entity-object-group.js +1 -1
  699. package/dist/domain/system-components/scene-entity-object-local-material-override.js +1 -1
  700. package/dist/domain/system-components/scene-entity-object-material-override.js +1 -1
  701. package/dist/domain/system-components/scene-entity-object-properties.js +1 -1
  702. package/dist/domain/system-components/scene-entity-object-remote-material-override.js +1 -1
  703. package/dist/domain/system-components/scene-entity-object-text-decal.js +1 -1
  704. package/dist/domain/system-components/scene-entity-object-transformer.js +1 -1
  705. package/dist/domain/system-components/scene-entity-object-transimissive-material-override.js +1 -1
  706. package/dist/domain/system-components/scene-entity-object.js +1 -1
  707. package/dist/domain/system-components/scene-entity-point-light.js +1 -1
  708. package/dist/domain/system-components/scene-entity-properties.js +1 -1
  709. package/dist/domain/system-components/scene-entity-rect-area-light.js +1 -1
  710. package/dist/domain/system-components/scene-entity-remote-material-override.js +1 -1
  711. package/dist/domain/system-components/scene-entity-remote-object.js +1 -1
  712. package/dist/domain/system-components/scene-entity-spot-light.js +1 -1
  713. package/dist/domain/system-components/scene-entity-transimissive-material-override.js +1 -1
  714. package/dist/domain/system-components/sketching-line.d.ts +1 -1
  715. package/dist/domain/system-components/sketching-line.js +1 -1
  716. package/dist/domain/system-components/sketching-rectangle.d.ts +1 -1
  717. package/dist/domain/system-components/sketching-rectangle.js +1 -1
  718. package/dist/domain/system-components/sketching.d.ts +1 -1
  719. package/dist/domain/system-components/sketching.js +1 -1
  720. package/dist/domain/system-components/snap-axis.d.ts +1 -1
  721. package/dist/domain/system-components/snap-axis.js +1 -1
  722. package/dist/domain/system-components/snap-edge.d.ts +1 -1
  723. package/dist/domain/system-components/snap-edge.js +1 -1
  724. package/dist/domain/system-components/snap-plane.d.ts +1 -1
  725. package/dist/domain/system-components/snap-plane.js +1 -1
  726. package/dist/domain/system-components/snap-point.d.ts +1 -1
  727. package/dist/domain/system-components/snap-point.js +1 -1
  728. package/dist/domain/system-components/static-orthographic-camera-component.d.ts +1 -1
  729. package/dist/domain/system-components/static-orthographic-camera-component.js +1 -1
  730. package/dist/domain/system-components/static-perspective-camera-component.d.ts +1 -1
  731. package/dist/domain/system-components/static-perspective-camera-component.js +1 -1
  732. package/dist/domain/utils/eval-cache.d.ts +2 -3
  733. package/dist/domain/utils/map-nested-object.d.ts +1 -1
  734. package/dist/domain/utils/memo-eval.d.ts +2 -4
  735. package/dist/editor/Editor.js +1 -1
  736. package/dist/editor/domain-editors/use-implementation-files.d.ts +8 -8
  737. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  738. package/dist/editor/mocks/EditorMockContext.js +1 -1
  739. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  740. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  741. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  742. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  743. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  744. package/dist/editor/variants/variant-preview-styles.js +1 -0
  745. package/dist/i18n/locales/cs/messages.js +1 -1
  746. package/dist/i18n/locales/da/messages.js +1 -1
  747. package/dist/i18n/locales/de/messages.js +1 -1
  748. package/dist/i18n/locales/de-AT/messages.js +1 -1
  749. package/dist/i18n/locales/en/messages.js +1 -1
  750. package/dist/i18n/locales/en-AU/messages.js +1 -1
  751. package/dist/i18n/locales/en-GB/messages.js +1 -1
  752. package/dist/i18n/locales/es/messages.js +1 -1
  753. package/dist/i18n/locales/fr/messages.js +1 -1
  754. package/dist/i18n/locales/hu/messages.js +1 -1
  755. package/dist/i18n/locales/it/messages.js +1 -1
  756. package/dist/i18n/locales/nl/messages.js +1 -1
  757. package/dist/i18n/locales/pl/messages.js +1 -1
  758. package/dist/i18n/locales/pt/messages.js +1 -1
  759. package/dist/i18n/locales/ro/messages.js +1 -1
  760. package/dist/i18n/locales/sk/messages.js +1 -1
  761. package/dist/i18n/locales/tr/messages.js +1 -1
  762. package/dist/legacy/domain-cli/gen/configurator-builder.js +30 -16
  763. package/dist/legacy/domain-cli/gen/constant-expressions.js +1 -3
  764. package/dist/legacy/domain-cli/gen/defaults.js +1 -7
  765. package/dist/legacy/domain-cli/gen/implementation.js +7 -11
  766. package/dist/legacy/domain-cli/gen/invariants.js +7 -6
  767. package/dist/legacy/domain-cli/gen/relations.js +1 -1
  768. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  769. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  770. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/claude-md.d.ts +1 -1
  771. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/cursor-rules.d.ts +1 -1
  772. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.d.ts +1 -1
  773. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/agents/shared-sdk-content.js +1 -0
  774. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/domain-index.js +17 -15
  775. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.d.ts +1 -1
  776. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/env-example.js +4 -0
  777. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  778. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  779. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  780. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  781. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  782. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  783. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  784. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  785. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  786. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  787. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  788. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  789. package/dist/phoenix/cli.js +1 -1
  790. package/dist/phoenix/commands/dev.js +5 -5
  791. package/dist/phoenix/commands/index.d.ts +1 -0
  792. package/dist/phoenix/commands/index.js +1 -1
  793. package/dist/phoenix/commands/init.d.ts +4 -4
  794. package/dist/phoenix/commands/init.js +1 -1
  795. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  796. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  797. package/dist/phoenix/commands/prettier.js +1 -1
  798. package/dist/phoenix/commands/story-dev.js +2 -2
  799. package/dist/phoenix/commands/variants.d.ts +35 -0
  800. package/dist/phoenix/commands/variants.js +1 -0
  801. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  802. package/dist/phoenix/editor-server/commands-router.js +1 -1
  803. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  804. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  805. package/dist/phoenix/editor-server/editor-server.js +1 -1
  806. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  807. package/dist/phoenix/editor-server/spec-router.js +1 -1
  808. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  809. package/dist/phoenix/scripts/build-admin.js +1 -1
  810. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  811. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  812. package/dist/phoenix/services/index.d.ts +4 -0
  813. package/dist/phoenix/services/index.js +1 -1
  814. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  815. package/dist/phoenix/services/phoenix-application.js +1 -0
  816. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  817. package/dist/phoenix/services/phoenix-store.js +1 -0
  818. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  819. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  820. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  821. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  822. package/dist/phoenix/services/variant-file-session.js +1 -0
  823. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  824. package/dist/phoenix/services/variant-preview-service.js +1 -0
  825. package/dist/phoenix/services/vite-config.js +1 -1
  826. package/dist/phoenix/utils/git/index.d.ts +1 -0
  827. package/dist/phoenix/utils/git/index.js +1 -0
  828. package/dist/phoenix/utils/git/is-inside-git-repository.d.ts +6 -0
  829. package/dist/phoenix/utils/git/is-inside-git-repository.js +1 -0
  830. package/dist/phoenix/utils/index.d.ts +1 -0
  831. package/dist/phoenix/utils/index.js +1 -1
  832. package/dist/react-sdk/application-runtime/hooks/use-access-service.d.ts +2 -0
  833. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  834. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  835. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  836. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  837. package/dist/react-sdk/application-runtime/routing/access-service.d.ts +1 -0
  838. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +57 -40
  839. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  840. package/dist/react-sdk/domain-context/common-hooks/use-domain-context.d.ts +9 -9
  841. package/dist/react-sdk/domain-context/index.d.ts +1 -1
  842. package/dist/react-sdk/domain-context/index.js +1 -1
  843. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +6 -0
  844. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  845. package/dist/ui-sdk/theme/types.d.ts +1 -1
  846. package/dist/webhook/builders/common.d.ts +8 -0
  847. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  848. package/dist/webhook/builders/webhook-builder.js +1 -1
  849. package/package.json +3 -3
  850. package/dist/application-spec/generate-application/code/templates/env-ci.d.ts +0 -1
  851. package/dist/application-spec/generate-application/code/templates/env-ci.js +0 -25
  852. package/dist/application-spec/generate-application/code/templates/env-example.d.ts +0 -1
  853. package/dist/application-spec/generate-application/code/templates/env-example.js +0 -90
  854. package/dist/application-spec/generate-application/code/templates/prettier-ignore.d.ts +0 -1
  855. package/dist/application-spec/generate-application/code/templates/prettier-ignore.js +0 -6
  856. package/dist/application-spec/generate-application/code/templates/private-assets-readme.d.ts +0 -1
  857. package/dist/application-spec/generate-application/code/templates/private-assets-readme.js +0 -24
  858. package/dist/application-spec/generate-application/code/templates/public-assets-readme.d.ts +0 -1
  859. package/dist/application-spec/generate-application/code/templates/public-assets-readme.js +0 -24
  860. package/dist/application-spec/generate-application/code/templates/readme.d.ts +0 -1
  861. package/dist/application-spec/generate-application/code/templates/readme.js +0 -23
  862. package/dist/application-spec/generate-application/code/templates/skills/agents-md.d.ts +0 -1
  863. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +0 -2
  864. package/dist/domain/actions/action-factory.d.ts +0 -10
  865. package/dist/domain/actions/prepare-action-implementations.js +0 -5
  866. package/dist/domain/application/element-registration.js +0 -1
  867. package/dist/domain/application/handler-registration.js +0 -1
  868. package/dist/domain/application/resolve-imported-transformers.d.ts +0 -13
  869. package/dist/domain/application/resolve-imported-transformers.js +0 -1
  870. package/dist/domain/application/resource-builder.d.ts +0 -13
  871. package/dist/domain/application/resource-builder.js +0 -1
  872. package/dist/domain/components/debug-state-component.js +0 -1
  873. package/dist/domain/components/domain-component-optic.d.ts +0 -76
  874. package/dist/domain/components/domain-component-optic.js +0 -16
  875. package/dist/domain/components/drag-state-component.js +0 -1
  876. package/dist/domain/components/export-state-component.js +0 -1
  877. package/dist/domain/components/fullscreen-state-component.js +0 -1
  878. package/dist/domain/components/group-components-by-entity-id-and-name.js +0 -1
  879. package/dist/domain/components/hover-state-component.js +0 -1
  880. package/dist/domain/components/index.d.ts +0 -2
  881. package/dist/domain/components/index.js +0 -1
  882. package/dist/domain/components/navigation-state-component.js +0 -1
  883. package/dist/domain/components/selection-state-component.js +0 -1
  884. package/dist/domain/components/system-component-builder.js +0 -1
  885. package/dist/domain/components/system-virtual-entity.js +0 -1
  886. package/dist/domain/components/tool-state-component.js +0 -1
  887. package/dist/domain/components/view-state-component.js +0 -1
  888. package/dist/domain/components/viewport-state-component.js +0 -1
  889. package/dist/domain/core/expression.d.ts +0 -50
  890. package/dist/domain/core/json-schema.js +0 -1
  891. package/dist/domain/core/migrations.js +0 -1
  892. package/dist/domain/core/reflection.js +0 -1
  893. package/dist/domain/domain-context/recipe-system/recipes.d.ts +0 -57
  894. package/dist/domain/domain-context/recipe-system/recipes.js +0 -1
  895. package/dist/domain/expressions/constant-expressions.d.ts +0 -9
  896. package/dist/domain/expressions/constant-expressions.js +0 -1
  897. package/dist/domain/expressions/custom-expression.d.ts +0 -13
  898. package/dist/domain/expressions/custom-expression.js +0 -1
  899. package/dist/domain/expressions/index.d.ts +0 -1
  900. package/dist/domain/expressions/index.js +0 -1
  901. package/dist/domain/invariants/custom-invariants.d.ts +0 -22
  902. package/dist/domain/invariants/custom-invariants.js +0 -1
  903. package/dist/domain/invariants/invariants.d.ts +0 -68
  904. package/dist/domain/invariants/invariants.js +0 -1
  905. package/dist/domain/invariants/violation-component.js +0 -1
  906. package/dist/domain/relations/all-of-type-relation.d.ts +0 -33
  907. package/dist/domain/relations/all-of-type-relation.js +0 -1
  908. package/dist/domain/relations/component-factories.js +0 -1
  909. package/dist/domain/relations/composed-of.js +0 -1
  910. package/dist/domain/relations/direct-relation.d.ts +0 -29
  911. package/dist/domain/relations/indirect-relation.d.ts +0 -81
  912. package/dist/domain/relations/indirect-relation.js +0 -1
  913. package/dist/domain/relations/reference-component.js +0 -1
  914. package/dist/domain/relations/relation-factory.d.ts +0 -19
  915. package/dist/domain/relations/relation-factory.js +0 -1
  916. package/dist/domain/relations/relation-implementation.d.ts +0 -8
  917. package/dist/domain/system-components/angle-indicator.js +0 -1
  918. package/dist/domain/system-components/attribute-switch.js +0 -1
  919. package/dist/domain/system-components/autorotate-camera-component.js +0 -1
  920. package/dist/domain/system-components/basic-sidebar-footer.js +0 -1
  921. package/dist/domain/system-components/camera-based-hidden-entity-object.js +0 -1
  922. package/dist/domain/system-components/camera-based-hidden-entity.js +0 -1
  923. package/dist/domain/system-components/canvas-config.js +0 -1
  924. package/dist/domain/system-components/canvas-custom-environment.js +0 -1
  925. package/dist/domain/system-components/canvas-padding.js +0 -1
  926. package/dist/domain/system-components/canvas-preset-environment.js +0 -1
  927. package/dist/domain/system-components/child-entity-recipe-hierarchy.js +0 -1
  928. package/dist/domain/system-components/client-side-image.js +0 -1
  929. package/dist/domain/system-components/color-value.js +0 -1
  930. package/dist/domain/system-components/common/angle-indicator-schema.js +0 -1
  931. package/dist/domain/system-components/common/dimension-indicator-schema.js +0 -1
  932. package/dist/domain/system-components/custom-price-footer.js +0 -1
  933. package/dist/domain/system-components/dimension-indicator.js +0 -1
  934. package/dist/domain/system-components/editable-angle-indicator.js +0 -1
  935. package/dist/domain/system-components/editable-distance-dimension-indicator.js +0 -1
  936. package/dist/domain/system-components/editable-offset-indicator.js +0 -1
  937. package/dist/domain/system-components/editable-size-indicator.js +0 -1
  938. package/dist/domain/system-components/entity-header.js +0 -1
  939. package/dist/domain/system-components/exit-tool-mode-fab.js +0 -1
  940. package/dist/domain/system-components/finalize-action.js +0 -1
  941. package/dist/domain/system-components/finalize-component.js +0 -1
  942. package/dist/domain/system-components/fit-selection-orthographic-camera-component.js +0 -1
  943. package/dist/domain/system-components/fit-selection-perspective-camera-component.js +0 -1
  944. package/dist/domain/system-components/fixed-header.js +0 -1
  945. package/dist/domain/system-components/floating-header.js +0 -1
  946. package/dist/domain/system-components/hidden-header.js +0 -1
  947. package/dist/domain/system-components/hidden-sidebar-footer.js +0 -1
  948. package/dist/domain/system-components/horizontal-tabs.js +0 -1
  949. package/dist/domain/system-components/list-selector-dimension-indicator.js +0 -1
  950. package/dist/domain/system-components/multilingual-text-value.js +0 -1
  951. package/dist/domain/system-components/navigation-steps.js +0 -1
  952. package/dist/domain/system-components/offset-anchors.js +0 -1
  953. package/dist/domain/system-components/offset-indicator.js +0 -1
  954. package/dist/domain/system-components/offset.js +0 -1
  955. package/dist/domain/system-components/other-action.js +0 -1
  956. package/dist/domain/system-components/property-page.js +0 -1
  957. package/dist/domain/system-components/read-sidebar-footer.js +0 -1
  958. package/dist/domain/system-components/replace-entity-recipe-hierarchy.js +0 -1
  959. package/dist/domain/system-components/rotatable.js +0 -1
  960. package/dist/domain/system-components/rotation-handle.js +0 -1
  961. package/dist/domain/system-components/save-template-thumbnail.js +0 -1
  962. package/dist/domain/system-components/scene-entity-add-fab.js +0 -1
  963. package/dist/domain/system-components/scene-entity-animation.js +0 -1
  964. package/dist/domain/system-components/scene-entity-control.js +0 -1
  965. package/dist/domain/system-components/scene-entity-delete-fab.js +0 -1
  966. package/dist/domain/system-components/scene-entity-floor-object.js +0 -1
  967. package/dist/domain/system-components/scene-entity-html-hotspot.js +0 -1
  968. package/dist/domain/system-components/scene-entity-navigation-hotspot.js +0 -1
  969. package/dist/domain/system-components/scene-entity-object-html-hotspot.js +0 -1
  970. package/dist/domain/system-components/scene-entity-select-hotspot.js +0 -1
  971. package/dist/domain/system-components/scene-entity-wall-object.js +0 -1
  972. package/dist/domain/system-components/selectable-component.js +0 -1
  973. package/dist/domain/system-components/sidebar-tabs.js +0 -1
  974. package/dist/domain/system-components/simple-summary.js +0 -1
  975. package/dist/domain/system-components/size.js +0 -1
  976. package/dist/domain/system-components/sketching-draw.js +0 -1
  977. package/dist/domain/system-components/sketching-edit.js +0 -1
  978. package/dist/domain/system-components/summary-component.js +0 -1
  979. package/dist/domain/system-components/text-value.js +0 -1
  980. package/dist/domain/system-components/tool-controls.js +0 -1
  981. package/dist/domain/system-components/tool-menu-fab.js +0 -1
  982. package/dist/domain/system-components/universal-sidebar-footer.js +0 -1
  983. package/dist/domain/system-components/view-controls.js +0 -1
  984. package/dist/phoenix/application-spec/generate-assistant-prompt.d.ts +0 -12
  985. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
  986. /package/dist/domain/{components/component-reader-types.js → application/assistant/assistant-manifest.js} +0 -0
  987. /package/dist/domain/{actions → core/action}/action-factory.js +0 -0
  988. /package/dist/domain/core/{action.js → action/action.js} +0 -0
  989. /package/dist/domain/core/{enhanced-json-schema.js → component/component-reader-types.js} +0 -0
  990. /package/dist/domain/{components → core/component}/legacy-filter.js +0 -0
  991. /package/dist/domain/{components → core/component}/system-component-filter.js +0 -0
  992. /package/dist/domain/{components → core/component}/system-virtual-entity.d.ts +0 -0
  993. /package/dist/domain/{components → core/component}/updates.js +0 -0
  994. /package/dist/domain/core/{expression.js → data-schema/data-cell-value.js} +0 -0
  995. /package/dist/domain/core/{schema-validator.js → data-schema/data-schema-array-field.js} +0 -0
  996. /package/dist/domain/{relations/reference-field.js → core/data-schema/data-schema-field-object.js} +0 -0
  997. /package/dist/domain/{relations/relation-implementation.js → core/data-schema/data-schema-field.js} +0 -0
  998. /package/dist/domain/{invariants → core/invariant}/builtin-invariant.js +0 -0
  999. /package/dist/domain/{invariants → core/invariant}/violation-component.d.ts +0 -0
  1000. /package/dist/domain/{invariants → core/invariant}/violation.js +0 -0
  1001. /package/dist/domain/core/{alias.d.ts → model/alias.d.ts} +0 -0
  1002. /package/dist/domain/core/{alias.js → model/alias.js} +0 -0
  1003. /package/dist/domain/core/{common-definitions.d.ts → model/common-definitions.d.ts} +0 -0
  1004. /package/dist/domain/core/{common-definitions.js → model/common-definitions.js} +0 -0
  1005. /package/dist/domain/core/{component.js → model/component.js} +0 -0
  1006. /package/dist/domain/core/{model.d.ts → model/model.d.ts} +0 -0
  1007. /package/dist/domain/core/{model.js → model/model.js} +0 -0
  1008. /package/dist/domain/core/{preset.d.ts → model/preset.d.ts} +0 -0
  1009. /package/dist/domain/core/{preset.js → model/preset.js} +0 -0
  1010. /package/dist/domain/{relations → core/relation}/direct-relation.js +0 -0
  1011. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  1012. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  1013. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  1014. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  1015. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  1016. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  1017. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
  1018. /package/dist/domain/core/{state.js → state/state.js} +0 -0
  1019. /package/dist/domain/{expressions → domain-runtime/spec}/memoize-expression.js +0 -0
  1020. /package/dist/domain/{expressions → domain-runtime/spec}/prepare-domain-expressions.js +0 -0
  1021. /package/dist/domain/{system-components → extensions}/attribute-switch.d.ts +0 -0
  1022. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity-object.d.ts +0 -0
  1023. /package/dist/domain/{system-components → extensions}/camera-based-hidden-entity.d.ts +0 -0
  1024. /package/dist/domain/{system-components → extensions}/canvas-custom-environment.d.ts +0 -0
  1025. /package/dist/domain/{system-components → extensions}/client-side-image.d.ts +0 -0
  1026. /package/dist/domain/{system-components → extensions}/color-value.d.ts +0 -0
  1027. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.d.ts +0 -0
  1028. /package/dist/domain/{system-components → extensions}/common/dimension-indicators.js +0 -0
  1029. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.d.ts +0 -0
  1030. /package/dist/domain/{system-components → extensions}/common/editable-indicator-button-variant.js +0 -0
  1031. /package/dist/domain/{system-components → extensions}/custom-price-footer.d.ts +0 -0
  1032. /package/dist/domain/{system-components → extensions}/finalize-component.d.ts +0 -0
  1033. /package/dist/domain/{system-components → extensions}/fit-selection-orthographic-camera-component.d.ts +0 -0
  1034. /package/dist/domain/{system-components → extensions}/fit-selection-perspective-camera-component.d.ts +0 -0
  1035. /package/dist/domain/{system-components → extensions}/multilingual-text-value.d.ts +0 -0
  1036. /package/dist/domain/{system-components → extensions}/navigation-steps.d.ts +0 -0
  1037. /package/dist/domain/{system-components → extensions}/rotatable.d.ts +0 -0
  1038. /package/dist/domain/{system-components → extensions}/rotation-handle.d.ts +0 -0
  1039. /package/dist/domain/{system-components → extensions}/save-template-thumbnail.d.ts +0 -0
  1040. /package/dist/domain/{system-components → extensions}/scene-entity-animation.d.ts +0 -0
  1041. /package/dist/domain/{system-components → extensions}/scene-entity-control.d.ts +0 -0
  1042. /package/dist/domain/{system-components → extensions}/scene-entity-floor-object.d.ts +0 -0
  1043. /package/dist/domain/{system-components → extensions}/scene-entity-wall-object.d.ts +0 -0
  1044. /package/dist/domain/{system-components → extensions}/selectable-component.d.ts +0 -0
  1045. /package/dist/domain/{system-components → extensions}/simple-summary.d.ts +0 -0
  1046. /package/dist/domain/{system-components → extensions}/summary-component.d.ts +0 -0
  1047. /package/dist/domain/{system-components → extensions}/text-value.d.ts +0 -0
  1048. /package/dist/domain/{system-components → extensions}/tool-controls.d.ts +0 -0
  1049. /package/dist/domain/{system-components → extensions}/view-controls.d.ts +0 -0
@@ -0,0 +1,981 @@
1
+ # Custom Layout
2
+
3
+ Make the configurator look like the brand's own product page. A furniture shop wants its table configurator to read like the rest of its site: a floating panel on the left with the product's name, the edge finishes as picture cards, the price in large type and one clear call to action, and the table in the space beside it. The project writes that page as one React component. Phoenix supplies the 3D scene, the product's state and a few hooks; every pixel around the scene is the project's own.
4
+
5
+ - [Choose this approach](#choose-this-approach)
6
+ - [Register the layout](#register-the-layout)
7
+ - [What the layout has to do](#what-the-layout-has-to-do)
8
+ - [Read and change the product](#read-and-change-the-product)
9
+ - [Draw the choices](#draw-the-choices)
10
+ - [Offer fullscreen](#offer-fullscreen)
11
+ - [Serve read mode](#serve-read-mode)
12
+ - [The spec the layout reads](#the-spec-the-layout-reads)
13
+ - [Try the example](#try-the-example)
14
+ - [Test cases](#test-cases)
15
+ - [Known gaps](#known-gaps)
16
+ - [Related pages](#related-pages)
17
+ - [Complete Implementation](#complete-implementation)
18
+
19
+ ## Choose this approach
20
+
21
+ Write your own layout when the configurator has to follow a design the built-in layout cannot take on: the brand's typography, controls and spacing, a panel on the left, a top bar with the price, an area the built-in layout has no place for.
22
+
23
+ Stay with the built-in layout when its structure fits and only its parts change. [Universal](?path=/docs/layouts-universal--docs) demonstrates that layout, and the pages of its parts describe what the spec configures: [Header](?path=/docs/layouts-header-floating--docs), [Sidebar](?path=/docs/layouts-sidebar-general--docs), [Sidebar Footer](?path=/docs/layouts-sidebar-footer-basic--docs), [Toolbar](?path=/docs/layouts-toolbar--docs) and [View Controls](?path=/docs/layouts-view-controls--docs).
24
+
25
+ A project layout replaces all of that. None of the built-in sidebar, footer, toolbar or property pages is rendered for it, so the layout builds every control the user needs. This example uses no SDK component that draws UI: only the scene, the safe-area hook and hooks that read and change the product's state. A layout may also mount the SDK's own pieces where it wants them, see [Configurator Interface → Loaded Configuration UI](?path=/docs/phoenix-configurator-interface--docs#loaded-configuration-ui).
26
+
27
+ ## Register the layout
28
+
29
+ Create `src/elements/ConfiguratorLayout.tsx` with a default export made by `phx.frontend.createCustomPhoenixLayoutElement`. The name `ConfiguratorLayout` is what makes it the layout: Phoenix renders the element registered under that name for every loaded configuration, in owner and in read mode, whatever `layout` the spec sets. Nothing in the YAML refers to it.
30
+
31
+ ```tsx
32
+ import { Box } from '@mui/material'
33
+
34
+ import { LayoutSlots, useSceneSafeArea } from '@salsita-ai/sdk/configurator'
35
+
36
+ import { phx } from '../../.phoenix/phx.js'
37
+ import { FullscreenToggle } from '../_shared/FullscreenToggle.js'
38
+ import { ProductPanel } from '../_shared/ProductPanel.js'
39
+
40
+ const GUTTER = 24
41
+ const PANEL_WIDTH = 380
42
+
43
+ const ConfiguratorLayout = () => {
44
+ const { containerRef, safeAreaRef } = useSceneSafeArea()
45
+ const isFullscreen = phx.frontend.useIsFullscreenActive()
46
+
47
+ return (
48
+ <Box component="div" ref={containerRef} sx={{ position: 'absolute', inset: 0 }}>
49
+ <LayoutSlots.SharedCanvas />
50
+
51
+ {!isFullscreen && (
52
+ <Box
53
+ component="aside"
54
+ sx={{
55
+ position: 'absolute',
56
+ insetBlockStart: GUTTER,
57
+ insetInlineStart: GUTTER,
58
+ inlineSize: PANEL_WIDTH,
59
+ maxBlockSize: `calc(100% - ${2 * GUTTER}px)`,
60
+ display: 'flex',
61
+ flexDirection: 'column',
62
+ borderRadius: 5,
63
+ bgcolor: 'background.paper',
64
+ boxShadow: '0 12px 40px rgba(0, 0, 0, 0.12)',
65
+ overflow: 'hidden',
66
+ }}
67
+ >
68
+ <ProductPanel />
69
+ </Box>
70
+ )}
71
+
72
+ <Box
73
+ component="div"
74
+ ref={safeAreaRef}
75
+ sx={{
76
+ position: 'absolute',
77
+ insetBlock: 0,
78
+ insetInlineStart: isFullscreen ? 0 : PANEL_WIDTH + 2 * GUTTER,
79
+ insetInlineEnd: 0,
80
+ pointerEvents: 'none',
81
+ }}
82
+ >
83
+ <Box
84
+ component="div"
85
+ sx={{ position: 'absolute', insetBlockStart: GUTTER, insetInlineEnd: GUTTER, pointerEvents: 'auto' }}
86
+ >
87
+ <FullscreenToggle />
88
+ </Box>
89
+ </Box>
90
+ </Box>
91
+ )
92
+ }
93
+
94
+ export default phx.frontend.createCustomPhoenixLayoutElement('ConfiguratorLayout', ConfiguratorLayout)
95
+ ```
96
+
97
+ The components it uses live in `src/_shared/`, which Phoenix does not import by convention, so the layout imports them itself. Application projects receive `phx` as a global. Storybook examples cannot rely on that project environment, so these files import it from `../../.phoenix/phx.js`; leave that import out in a project.
98
+
99
+ ## What the layout has to do
100
+
101
+ - **Position the root and cover the page.** `LayoutSlots.SharedCanvas` is absolutely positioned and fills its nearest positioned ancestor. The root here is `position: absolute; inset: 0`.
102
+ - **Mount the shared canvas.** The app loader stays on screen until the scene has loaded. A layout without `LayoutSlots.SharedCanvas` never gets past the loader unless the project sets `appLoader: legacy`.
103
+ - **Put the UI above the canvas.** The canvas is opaque. Content that is positioned and comes after it in the markup is painted above it; unpositioned content is painted under it and cannot be seen.
104
+ - **Tell the camera where the free area is.** `useSceneSafeArea()` returns two refs. `containerRef` goes on the element that covers the whole canvas, `safeAreaRef` on the region the product should stay visible in, here everything right of the panel. The camera then frames the product in that region. The hook measures again whenever either of the two elements resizes; for a change no resize reports, such as a `transform` on an ancestor settling at the end of an animation, it also returns `update` to call. Without the two refs the product is centred in the whole canvas and sits against the panel.
105
+ - **Let the pointer through.** The safe-area element lies over the canvas, so it sets `pointerEvents: 'none'`; otherwise the scene cannot be orbited. The fullscreen button inside it switches pointer events back on.
106
+ - **Honour fullscreen.** Fullscreen is a flag in the product's state, not a browser feature. The layout reads it with `phx.frontend.useIsFullscreenActive()`, removes the panel and lets the safe area start at the left edge, so the camera frames the product in the whole canvas.
107
+ - **Serve read mode.** The same element renders a configuration shared for viewing, and the layout decides what a viewer sees.
108
+
109
+ ## Read and change the product
110
+
111
+ The panel reads everything it shows from hooks and writes the customer's choice back through one of them. The table lists the hooks the whole layout uses:
112
+
113
+ ```tsx
114
+ import { Box, Button, Typography } from '@mui/material'
115
+
116
+ import { detailComponent } from '@salsita-ai/sdk/domain'
117
+ import { useResolveLocalizable } from '@salsita-ai/sdk/react'
118
+
119
+ import { phx } from '../../.phoenix/phx.js'
120
+ import { EdgeFinishCards } from './EdgeFinishCards.js'
121
+
122
+ export const ProductPanel = () => {
123
+ const resolve = useResolveLocalizable()
124
+ const detail = phx.frontend.useFirstRootComponent(detailComponent)
125
+ const price = phx.frontend.useRootEntityPrice()
126
+ const tableId = phx.frontend.useRootEntityId()
127
+ const edgeFinish = phx.frontend.useAttributeSelection(tableId, 'edgeFinish')
128
+ const { accessInfo } = phx.frontend.useAccessService()
129
+ const navigationState = phx.frontend.useActiveNavigationState()
130
+ const pushNavigate = phx.frontend.usePushNavigate()
131
+ const popNavigate = phx.frontend.usePopNavigate()
132
+
133
+ const isReadMode = accessInfo.viewMode
134
+ const isReview = isReadMode || navigationState === 'checkout'
135
+ const chosenEdge = edgeFinish.options.find(option => option.value === edgeFinish.value)
136
+
137
+ return (
138
+ <>
139
+ <Box component="header" sx={{ display: 'grid', gap: 1, padding: 3, paddingBlockEnd: 2 }}>
140
+ {isReadMode ? (
141
+ <Typography
142
+ variant="overline"
143
+ sx={{ justifySelf: 'start', paddingInline: 1.5, borderRadius: 999, bgcolor: 'action.selected' }}
144
+ >
145
+ View only
146
+ </Typography>
147
+ ) : (
148
+ <Typography variant="overline" color="text.secondary">
149
+ {resolve(detail?.state.subtitle)}
150
+ </Typography>
151
+ )}
152
+ <Typography variant="h5" component="h2" fontWeight={700}>
153
+ {resolve(detail?.state.title)}
154
+ </Typography>
155
+ <Typography variant="body2" color="text.secondary">
156
+ {resolve(detail?.state.description)}
157
+ </Typography>
158
+ </Box>
159
+
160
+ <Box component="div" sx={{ display: 'grid', gap: 1.5, paddingInline: 3, paddingBlockEnd: 3, overflowY: 'auto' }}>
161
+ <Typography variant="subtitle2" component="h3">
162
+ Edge finish
163
+ </Typography>
164
+ {isReview ? (
165
+ <Box component="div" sx={{ padding: 2, borderRadius: 3, bgcolor: 'action.hover' }}>
166
+ <Typography variant="body2" fontWeight={600}>
167
+ {resolve(chosenEdge?.title)}
168
+ </Typography>
169
+ <Typography variant="caption" color="text.secondary">
170
+ {resolve(chosenEdge?.description)}
171
+ </Typography>
172
+ </Box>
173
+ ) : (
174
+ <EdgeFinishCards selection={edgeFinish} />
175
+ )}
176
+ </Box>
177
+
178
+ <Box component="footer" sx={{ display: 'grid', gap: 2, padding: 3, borderTop: 1, borderColor: 'divider' }}>
179
+ <Box component="div" sx={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between' }}>
180
+ <Typography variant="body2" color="text.secondary">
181
+ Total price
182
+ </Typography>
183
+ <Typography variant="h5" component="p" fontWeight={700}>
184
+ {price}
185
+ </Typography>
186
+ </Box>
187
+ {isReview && !isReadMode && (
188
+ <Typography variant="body2" color="text.secondary">
189
+ Your table is ready for a quote. A real shop collects the contact details here.
190
+ </Typography>
191
+ )}
192
+ {!isReadMode && (
193
+ <Button
194
+ size="large"
195
+ variant={isReview ? 'outlined' : 'contained'}
196
+ onClick={isReview ? popNavigate : () => pushNavigate('checkout')}
197
+ sx={{ minBlockSize: 48, borderRadius: 999, textTransform: 'none', fontWeight: 600 }}
198
+ >
199
+ {isReview ? 'Back to the configuration' : 'Review and request a quote'}
200
+ </Button>
201
+ )}
202
+ </Box>
203
+ </>
204
+ )
205
+ }
206
+ ```
207
+
208
+ | Hook | What the layout uses it for |
209
+ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
210
+ | `phx.frontend.useFirstRootComponent(detailComponent)` | The `detail` component of the root entity: name, subtitle and description. `detailComponent` comes from `@salsita-ai/sdk/domain`; the hook returns `null` without one. |
211
+ | `phx.frontend.useRootEntityId()` | The id of the table, which the control hooks take. |
212
+ | `phx.frontend.useAttributeSelection(entityId, instanceName)` | The `attributeSelection` component named `edgeFinish`: the current `value` and the `options`, each with `title`, `description`, `value`, `disabled` and `onSelect`. |
213
+ | `phx.frontend.useRootEntityPrice()` | The root entity's `price` component, formatted for the current locale and currency, or `null` without one. |
214
+ | `phx.frontend.useAccessService()` | `accessInfo.viewMode` is `true` while a configuration shared for viewing is open, and also while the host sets the `readonly` property. |
215
+ | `phx.frontend.useActiveNavigationState()` | The active navigation state; the panel shows its review step while it is `checkout`. |
216
+ | `phx.frontend.usePushNavigate()` and `phx.frontend.usePopNavigate()` | Enter the review step and leave it again. |
217
+ | `phx.frontend.useIsFullscreenActive()` and `phx.frontend.useSetFullscreen()` | Read the fullscreen flag, and set it from the layout's own button. |
218
+ | `useResolveLocalizable()` from `@salsita-ai/sdk/react` | Turns the localizable texts of the spec into strings in the current language. [Localization](?path=/docs/phoenix-localization--docs) describes it and `LocalizableMessage`. |
219
+
220
+ Calling an option's `onSelect` is the whole write: it changes `edgeFinish` on the table, the scene morphs the edge and the price expression recalculates. The option fields are named for display: the spec's `label` arrives as `title`, its `img` as `imageSrc`.
221
+
222
+ The review step is the layout's own: the button pushes the `checkout` navigation state, and the panel shows a summary instead of the cards. A real shop collects the contact details there and sends the request.
223
+
224
+ ## Draw the choices
225
+
226
+ The edge finish is a visual choice, so the panel shows it as cards with a drawing of each profile, as [Choosing a Control](?path=/docs/ux-guidelines-choosing-a-control--docs) recommends for shapes. The selected card has a border in the theme's primary colour, a tinted background and a check mark, so the state does not depend on colour alone. The cards form a radio group: the group has `role="radiogroup"` and a label, each card `role="radio"` and `aria-checked`, only the selected card is in the tab order, and the arrow keys move the selection, skipping disabled options, as in a native radio group. Each card is at least 44 pixels high and shows a focus ring for keyboard users.
227
+
228
+ ```tsx
229
+ import { Box, ButtonBase, type SxProps, type Theme, Typography } from '@mui/material'
230
+ import type { KeyboardEvent } from 'react'
231
+
232
+ import { type UseAttributeSelection, useResolveLocalizable } from '@salsita-ai/sdk/react'
233
+
234
+ // Cross-sections of the tabletop's edge, keyed by the option values of the spec.
235
+ const EDGE_PROFILES: Readonly<Record<string, string>> = {
236
+ None: 'M0 4H32V20H0Z',
237
+ Facet: 'M0 4H26L32 10V14L26 20H0Z',
238
+ Round: 'M0 4H24A8 8 0 0 1 24 20H0Z',
239
+ TreeTrunk: 'M0 4H27C33 5 28 9 34 11C29 13 34 17 27 20H0Z',
240
+ }
241
+
242
+ const CHECK_BADGE: SxProps<Theme> = {
243
+ position: 'absolute',
244
+ insetBlockStart: 10,
245
+ insetInlineEnd: 10,
246
+ display: 'grid',
247
+ placeItems: 'center',
248
+ inlineSize: 22,
249
+ blockSize: 22,
250
+ borderRadius: '50%',
251
+ bgcolor: 'primary.main',
252
+ color: 'primary.contrastText',
253
+ fontSize: 13,
254
+ }
255
+
256
+ // Arrow keys move the selection between the cards, as in a native radio group.
257
+ const ARROW_STEPS: Readonly<Record<string, number | undefined>> = {
258
+ ArrowRight: 1,
259
+ ArrowDown: 1,
260
+ ArrowLeft: -1,
261
+ ArrowUp: -1,
262
+ }
263
+
264
+ interface EdgeFinishCardsProps {
265
+ readonly selection: ReturnType<UseAttributeSelection>
266
+ }
267
+
268
+ export const EdgeFinishCards = ({ selection }: EdgeFinishCardsProps) => {
269
+ const resolve = useResolveLocalizable()
270
+ const { options } = selection
271
+ // The card in the tab order: the selected one, or the first enabled one. Disabled cards are never in it.
272
+ const selectedIndex = options.findIndex(option => option.value === selection.value && !option.disabled)
273
+ const focusIndex = selectedIndex >= 0 ? selectedIndex : options.findIndex(option => !option.disabled)
274
+
275
+ const handleKeyDown = (event: KeyboardEvent<HTMLElement>, index: number) => {
276
+ const step = ARROW_STEPS[event.key]
277
+
278
+ if (step === undefined) {
279
+ return
280
+ }
281
+
282
+ event.preventDefault()
283
+ // The next enabled option in the arrow's direction, wrapping around; disabled options are skipped.
284
+ const count = options.length
285
+ const next = Array.from(
286
+ { length: count - 1 },
287
+ (_, offset) => (((index + step * (offset + 1)) % count) + count) % count
288
+ ).find(candidate => !options[candidate]?.disabled)
289
+
290
+ if (next === undefined) {
291
+ return
292
+ }
293
+
294
+ options[next]?.onSelect()
295
+ event.currentTarget.parentElement?.querySelectorAll<HTMLElement>('[role="radio"]')[next]?.focus()
296
+ }
297
+
298
+ return (
299
+ <Box
300
+ component="div"
301
+ role="radiogroup"
302
+ aria-label="Edge finish"
303
+ sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1.5 }}
304
+ >
305
+ {options.map((option, index) => {
306
+ const isSelected = option.value === selection.value
307
+
308
+ return (
309
+ <ButtonBase
310
+ key={String(option.value)}
311
+ role="radio"
312
+ aria-checked={isSelected}
313
+ tabIndex={index === focusIndex ? 0 : -1}
314
+ disabled={option.disabled}
315
+ onClick={option.onSelect}
316
+ onKeyDown={event => handleKeyDown(event, index)}
317
+ sx={{
318
+ position: 'relative',
319
+ display: 'grid',
320
+ justifyItems: 'start',
321
+ gap: 0.5,
322
+ padding: 2,
323
+ borderRadius: 3,
324
+ border: 2,
325
+ borderColor: isSelected ? 'primary.main' : 'divider',
326
+ bgcolor: isSelected ? 'action.hover' : 'transparent',
327
+ textAlign: 'start',
328
+ transition: 'border-color 150ms, background-color 150ms',
329
+ '&:hover': { borderColor: isSelected ? 'primary.main' : 'text.disabled' },
330
+ '&.Mui-focusVisible': { outline: 2, outlineColor: 'primary.main', outlineOffset: 2 },
331
+ '&.Mui-disabled': { opacity: 0.4 },
332
+ }}
333
+ >
334
+ {isSelected && (
335
+ <Box component="span" aria-hidden sx={CHECK_BADGE}>
336
+ ✓
337
+ </Box>
338
+ )}
339
+ <Box
340
+ component="svg"
341
+ viewBox="0 0 36 24"
342
+ aria-hidden
343
+ sx={{ inlineSize: 60, blockSize: 40, color: '#b98b5e' }}
344
+ >
345
+ <path d={EDGE_PROFILES[String(option.value)]} fill="currentColor" />
346
+ </Box>
347
+ <Typography variant="body2" fontWeight={600}>
348
+ {resolve(option.title)}
349
+ </Typography>
350
+ <Typography variant="caption" color="text.secondary">
351
+ {resolve(option.description)}
352
+ </Typography>
353
+ </ButtonBase>
354
+ )
355
+ })}
356
+ </Box>
357
+ )
358
+ }
359
+ ```
360
+
361
+ The drawings are keyed by the option values of the spec. A spec can carry a picture per option instead, as `img`, which the hook returns as `imageSrc`; [CardSelect](?path=/docs/controls-select-attribute-cardselect--docs) shows the SDK's own card control.
362
+
363
+ ## Offer fullscreen
364
+
365
+ Fullscreen is a flag in the configurator's state, not the browser's fullscreen mode. `phx.frontend.useIsFullscreenActive()` reads it and `phx.frontend.useSetFullscreen()` returns a function that sets it: `setFullscreen(true)` turns it on, `setFullscreen(false)` off. The layout's own button flips it, and the layout decides what to hide.
366
+
367
+ ```tsx
368
+ import { Button } from '@mui/material'
369
+
370
+ import { phx } from '../../.phoenix/phx.js'
371
+
372
+ const ENTER_ICON = 'M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5'
373
+ const EXIT_ICON = 'M9 4v5H4M15 4v5h5M15 20v-5h5M9 20v-5H4'
374
+
375
+ export const FullscreenToggle = () => {
376
+ const isFullscreen = phx.frontend.useIsFullscreenActive()
377
+ const setFullscreen = phx.frontend.useSetFullscreen()
378
+
379
+ return (
380
+ <Button
381
+ onClick={() => setFullscreen(!isFullscreen)}
382
+ startIcon={
383
+ <svg viewBox="0 0 24 24" width={20} height={20} fill="none" stroke="currentColor" strokeWidth={2}>
384
+ <path d={isFullscreen ? EXIT_ICON : ENTER_ICON} />
385
+ </svg>
386
+ }
387
+ sx={{
388
+ minBlockSize: 44,
389
+ paddingInline: 2.5,
390
+ borderRadius: 999,
391
+ bgcolor: 'background.paper',
392
+ color: 'text.primary',
393
+ boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',
394
+ textTransform: 'none',
395
+ fontWeight: 600,
396
+ '&:hover': { bgcolor: 'background.paper', boxShadow: '0 6px 20px rgba(0, 0, 0, 0.18)' },
397
+ }}
398
+ >
399
+ {isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
400
+ </Button>
401
+ )
402
+ }
403
+ ```
404
+
405
+ The button stays in the free area in both states, so the way back is always where the user left it. [Interaction Modes](?path=/docs/ux-guidelines-interaction-modes--docs#full-screen-preview) describes what fullscreen hides.
406
+
407
+ ## Serve read mode
408
+
409
+ While `accessInfo.viewMode` is `true` the panel marks the view as view only, replaces the cards with the chosen finish and shows the price without an action. The hooks do not hide or disable anything in read mode: what a viewer can change is decided by what the layout renders. Rotating and zooming the scene, and fullscreen, stay available, as [Interaction Modes](?path=/docs/ux-guidelines-interaction-modes--docs#view-only-mode) recommends.
410
+
411
+ ## The spec the layout reads
412
+
413
+ The layout reads three components of the root entity and one navigation state; the scene components are in the complete implementation below.
414
+
415
+ ```yaml
416
+ navigationStates:
417
+ - configure
418
+ - checkout
419
+
420
+ components:
421
+ Table:
422
+ detail:
423
+ main:
424
+ title: Linden dining table
425
+ subtitle: Solid oak, seats six
426
+ description: A solid oak top on slender steel legs, finished with the edge profile of your choice.
427
+ price:
428
+ main:
429
+ price:
430
+ $read: $price
431
+ attributeSelection:
432
+ edgeFinish:
433
+ value:
434
+ $bind: edgeFinish
435
+ options:
436
+ - label: Square
437
+ description: Crisp and modern
438
+ value: None
439
+ - label: Facet
440
+ description: A light bevel
441
+ value: Facet
442
+ - label: Round
443
+ description: Soft to the touch
444
+ value: Round
445
+ - label: Tree trunk
446
+ description: The natural edge
447
+ value: TreeTrunk
448
+ ```
449
+
450
+ `$price` is a custom expression in `src/expressions/table.ts` that adds a surcharge per finish. The example sets no `applicationConfig` and no layout components: `layout`, the header, the sidebar footer, the toolbar, `viewControls` and property pages configure the built-in layout and have no effect on this one.
451
+
452
+ ## Try the example
453
+
454
+ To see read mode, open **Mocks** in the editor rail on the left and apply the **Read User** template.
455
+
456
+ ## Test cases
457
+
458
+ - The panel is on the left and the table is centred in the area to the right of it, not in the whole canvas.
459
+ - Choosing **Tree trunk** moves the check mark to that card, changes the edge of the tabletop and raises the price from $1,290.00 to $1,630.00.
460
+ - Tab reaches the selected card, and the arrow keys move the selection to the next or previous card.
461
+ - Dragging in the area to the right of the panel orbits the camera.
462
+ - **Review and request a quote** replaces the cards with the chosen finish; **Back to the configuration** brings them back.
463
+ - **Fullscreen** removes the panel and the table moves to the centre of the canvas; **Exit fullscreen** brings both back.
464
+ - With the **Read User** mock the panel says **View only**, shows the chosen finish and the price, and has no button.
465
+
466
+ ## Known gaps
467
+
468
+ A project layout has only what it renders. This one leaves out the following, each of which a product may need.
469
+
470
+ - **Phone width.** The panel is written for desktop: on a narrow screen it covers the scene. A phone layout puts the panel in a bottom sheet and moves the safe area above it.
471
+ - **Error, violation and side-effect messages.** The layout mounts nothing that shows them. `LayoutSlots.Services` raises invariant violations and side effects as snackbars, and shows "Oops, something went wrong" for an error thrown while the state is validated, for example by a custom expression, which any spec with custom expressions can hit, this one included; `LayoutSlots.DesktopSnackbarsRoot` is the element the snackbars are rendered into. A layout mounts both, or reads `phx.frontend.useStateValidity()` and shows them its own way.
472
+ - **A finalize page from the spec.** The review step here is the layout's own and submits nothing. It does not show a `finalizePage` component and does not check `phx.frontend.useFinalizeViolations()`. [Finalization](?path=/docs/phoenix-finalization--docs) covers what a real flow does.
473
+ - **Toolbar actions.** Undo and redo, camera reset, measurements, sharing and language switching are not offered. A layout can mount `LayoutSlots.DesktopToolbar` for the toolbar the spec configures, or build its own buttons.
474
+ - **View controls, tool controls and leaving a tool mode.** A spec can configure view controls and tool controls, and a tool mode has a button that leaves it. The built-in layout places them with `LayoutSlots.DesktopViewControls`, `LayoutSlots.DesktopToolControls` and `LayoutSlots.DesktopCallToAction`; this layout mounts none of them, so they do not appear.
475
+ - **A project's layout dialog.** A dialog the project registers with `phx.frontend.createLayoutDialog` is shown by `LayoutDialog`, which the built-in layout mounts. This layout does not; a layout that needs the dialog mounts `LayoutDialog` from `@salsita-ai/sdk/configurator`.
476
+ - **Selection.** The table has no parts to select. A product with selectable parts reads `phx.frontend.useSelectedDomainEntityId()` and shows the controls of the selected part.
477
+ - **Clone to edit in read mode.** With `shareCloneToEdit` set, the built-in layout's `LayoutSlots.DesktopReadonlyBanner` offers **Edit configuration** to a viewer; this layout's "View only" label offers nothing. A layout mounts the banner, or builds its own action with `LayoutSlots.useIsCloningAllowed()` and `LayoutSlots.CloneToEditDialog`.
478
+ - **Back and close.** The built-in header's back button returns to the product choice, runs the host's close action or leaves the expanded view, whichever applies. This layout has none of them. `useCloseAction()` from `@salsita-ai/sdk/configurator` returns the host's close action, or `null` when there is none; the hook that chooses among the three is not exported.
479
+ - **Analytics.** The built-in fullscreen and finalize buttons record `FullScreenModeToggled` and `FinalizeButtonClicked`; this layout's buttons record nothing. A layout that wants the events pushes `FrontendAnalyticsFactory.FullScreenModeToggled()` and the like, from `@salsita-ai/sdk/configurator`, with `phx.frontend.useAnalytics().push(...)`.
480
+ - **Preview start screen.** The built-in layout shows a preview while `usePreview().isPreview` is set, which `preview: auto` does on phones without the project opting in. This layout ignores it and always renders the interface.
481
+ - **Assistant panel.** It is not exported, so a project layout cannot show it.
482
+ - **"Powered by Salsita" mark.** The built-in layout shows it; a project layout decides whether to mount `LayoutSlots.DesktopPoweredBy`, and this one does not.
483
+
484
+ ## Related pages
485
+
486
+ - [Configurator Interface → Loaded Configuration UI](?path=/docs/phoenix-configurator-interface--docs#loaded-configuration-ui) is the reference for the element name, the minimal layout and the SDK pieces a layout can mount.
487
+ - [Universal](?path=/docs/layouts-universal--docs) is the built-in layout this one replaces.
488
+ - [Header / Custom](?path=/docs/layouts-header-custom--docs) replaces only the header, with the price from `useRootEntityPrice()`.
489
+ - [Canvas Padding](?path=/docs/layouts-canvas-padding--docs) scales the gaps `useSceneSafeArea()` measures.
490
+ - [Presets / Custom](?path=/docs/layouts-presets-custom--docs) replaces the preset screen the same way.
491
+
492
+ ## Complete Implementation
493
+
494
+ {/* AUTO-GENERATED SECTION: This section is automatically updated by 'phoenix story build' */}
495
+
496
+ <details>
497
+ <summary>Click to view the complete implementation files</summary>
498
+
499
+ ### ./spec/domain.yaml
500
+
501
+ ```yaml
502
+ model:
503
+ latest:
504
+ entityTypes:
505
+ - Table
506
+ aliases:
507
+ RootEntity:
508
+ - Table
509
+ commonTypes:
510
+ EdgeFinish:
511
+ enum:
512
+ - None
513
+ - Facet
514
+ - Round
515
+ - TreeTrunk
516
+ shapes:
517
+ Table:
518
+ edgeFinish:
519
+ $ref: '#/model/latest/commonTypes/EdgeFinish'
520
+
521
+ presets:
522
+ - rootEntityType: Table
523
+ initialDomainEntities:
524
+ - id: Table-1
525
+ type: Table
526
+ edgeFinish: None
527
+
528
+ navigationStates:
529
+ - configure
530
+ - checkout
531
+
532
+ components:
533
+ Table:
534
+ detail:
535
+ main:
536
+ title: Linden dining table
537
+ subtitle: Solid oak, seats six
538
+ description: A solid oak top on slender steel legs, finished with the edge profile of your choice.
539
+ price:
540
+ main:
541
+ price:
542
+ $read: $price
543
+ attributeSelection:
544
+ edgeFinish:
545
+ value:
546
+ $bind: edgeFinish
547
+ options:
548
+ - label: Square
549
+ description: Crisp and modern
550
+ value: None
551
+ - label: Facet
552
+ description: A light bevel
553
+ value: Facet
554
+ - label: Round
555
+ description: Soft to the touch
556
+ value: Round
557
+ - label: Tree trunk
558
+ description: The natural edge
559
+ value: TreeTrunk
560
+ fitRootPerspectiveCamera:
561
+ main:
562
+ priority: 1
563
+ fov: 35
564
+ near: 100
565
+ far: 10000
566
+ minDistance: 1000
567
+ maxDistance: 9000
568
+ distance: 5000
569
+ azimuthAngle: 1.5
570
+ polarAngle: 1.1
571
+ fitMeshChanges: true
572
+ sceneEntityRemoteObject:
573
+ top:
574
+ fileUrl: /models/tables.gltf
575
+ objectName: RECHTHOEK_RECTANGLE
576
+ dimensionUnit: m
577
+ leg:
578
+ fileUrl: /models/tables.gltf
579
+ objectName: AXL_LEG
580
+ dimensionUnit: m
581
+ sceneEntityObjectProperties:
582
+ top:
583
+ offsetY: 820
584
+ morphTargetInfluences:
585
+ Facet:
586
+ value:
587
+ $read: $edgeFinishFacet
588
+ scaleOne: 1
589
+ scaleZero: 0
590
+ Bol:
591
+ value:
592
+ $read: $edgeFinishRound
593
+ scaleOne: 1
594
+ scaleZero: 0
595
+ Boomstamrand:
596
+ value:
597
+ $read: $edgeFinishTreeTrunk
598
+ scaleOne: 1
599
+ scaleZero: 0
600
+ leg:
601
+ morphTargetInfluences:
602
+ Length:
603
+ value: 1000
604
+ scaleOne: 3000
605
+ scaleZero: 1400
606
+ Width:
607
+ value: 700
608
+ scaleOne: 1300
609
+ scaleZero: 600
610
+ Height:
611
+ value: 780
612
+ scaleOne: 780
613
+ scaleZero: 740
614
+ ```
615
+
616
+ ### ./src/\_shared/EdgeFinishCards.tsx
617
+
618
+ ```tsx
619
+ import { Box, ButtonBase, type SxProps, type Theme, Typography } from '@mui/material'
620
+ import type { KeyboardEvent } from 'react'
621
+
622
+ import { type UseAttributeSelection, useResolveLocalizable } from '@salsita-ai/sdk/react'
623
+
624
+ // Cross-sections of the tabletop's edge, keyed by the option values of the spec.
625
+ const EDGE_PROFILES: Readonly<Record<string, string>> = {
626
+ None: 'M0 4H32V20H0Z',
627
+ Facet: 'M0 4H26L32 10V14L26 20H0Z',
628
+ Round: 'M0 4H24A8 8 0 0 1 24 20H0Z',
629
+ TreeTrunk: 'M0 4H27C33 5 28 9 34 11C29 13 34 17 27 20H0Z',
630
+ }
631
+
632
+ const CHECK_BADGE: SxProps<Theme> = {
633
+ position: 'absolute',
634
+ insetBlockStart: 10,
635
+ insetInlineEnd: 10,
636
+ display: 'grid',
637
+ placeItems: 'center',
638
+ inlineSize: 22,
639
+ blockSize: 22,
640
+ borderRadius: '50%',
641
+ bgcolor: 'primary.main',
642
+ color: 'primary.contrastText',
643
+ fontSize: 13,
644
+ }
645
+
646
+ // Arrow keys move the selection between the cards, as in a native radio group.
647
+ const ARROW_STEPS: Readonly<Record<string, number | undefined>> = {
648
+ ArrowRight: 1,
649
+ ArrowDown: 1,
650
+ ArrowLeft: -1,
651
+ ArrowUp: -1,
652
+ }
653
+
654
+ interface EdgeFinishCardsProps {
655
+ readonly selection: ReturnType<UseAttributeSelection>
656
+ }
657
+
658
+ export const EdgeFinishCards = ({ selection }: EdgeFinishCardsProps) => {
659
+ const resolve = useResolveLocalizable()
660
+ const { options } = selection
661
+ // The card in the tab order: the selected one, or the first enabled one. Disabled cards are never in it.
662
+ const selectedIndex = options.findIndex(option => option.value === selection.value && !option.disabled)
663
+ const focusIndex = selectedIndex >= 0 ? selectedIndex : options.findIndex(option => !option.disabled)
664
+
665
+ const handleKeyDown = (event: KeyboardEvent<HTMLElement>, index: number) => {
666
+ const step = ARROW_STEPS[event.key]
667
+
668
+ if (step === undefined) {
669
+ return
670
+ }
671
+
672
+ event.preventDefault()
673
+ // The next enabled option in the arrow's direction, wrapping around; disabled options are skipped.
674
+ const count = options.length
675
+ const next = Array.from(
676
+ { length: count - 1 },
677
+ (_, offset) => (((index + step * (offset + 1)) % count) + count) % count
678
+ ).find(candidate => !options[candidate]?.disabled)
679
+
680
+ if (next === undefined) {
681
+ return
682
+ }
683
+
684
+ options[next]?.onSelect()
685
+ event.currentTarget.parentElement?.querySelectorAll<HTMLElement>('[role="radio"]')[next]?.focus()
686
+ }
687
+
688
+ return (
689
+ <Box
690
+ component="div"
691
+ role="radiogroup"
692
+ aria-label="Edge finish"
693
+ sx={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 1.5 }}
694
+ >
695
+ {options.map((option, index) => {
696
+ const isSelected = option.value === selection.value
697
+
698
+ return (
699
+ <ButtonBase
700
+ key={String(option.value)}
701
+ role="radio"
702
+ aria-checked={isSelected}
703
+ tabIndex={index === focusIndex ? 0 : -1}
704
+ disabled={option.disabled}
705
+ onClick={option.onSelect}
706
+ onKeyDown={event => handleKeyDown(event, index)}
707
+ sx={{
708
+ position: 'relative',
709
+ display: 'grid',
710
+ justifyItems: 'start',
711
+ gap: 0.5,
712
+ padding: 2,
713
+ borderRadius: 3,
714
+ border: 2,
715
+ borderColor: isSelected ? 'primary.main' : 'divider',
716
+ bgcolor: isSelected ? 'action.hover' : 'transparent',
717
+ textAlign: 'start',
718
+ transition: 'border-color 150ms, background-color 150ms',
719
+ '&:hover': { borderColor: isSelected ? 'primary.main' : 'text.disabled' },
720
+ '&.Mui-focusVisible': { outline: 2, outlineColor: 'primary.main', outlineOffset: 2 },
721
+ '&.Mui-disabled': { opacity: 0.4 },
722
+ }}
723
+ >
724
+ {isSelected && (
725
+ <Box component="span" aria-hidden sx={CHECK_BADGE}>
726
+ ✓
727
+ </Box>
728
+ )}
729
+ <Box
730
+ component="svg"
731
+ viewBox="0 0 36 24"
732
+ aria-hidden
733
+ sx={{ inlineSize: 60, blockSize: 40, color: '#b98b5e' }}
734
+ >
735
+ <path d={EDGE_PROFILES[String(option.value)]} fill="currentColor" />
736
+ </Box>
737
+ <Typography variant="body2" fontWeight={600}>
738
+ {resolve(option.title)}
739
+ </Typography>
740
+ <Typography variant="caption" color="text.secondary">
741
+ {resolve(option.description)}
742
+ </Typography>
743
+ </ButtonBase>
744
+ )
745
+ })}
746
+ </Box>
747
+ )
748
+ }
749
+ ```
750
+
751
+ ### ./src/\_shared/FullscreenToggle.tsx
752
+
753
+ ```tsx
754
+ import { Button } from '@mui/material'
755
+
756
+ import { phx } from '../../.phoenix/phx.js'
757
+
758
+ const ENTER_ICON = 'M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5'
759
+ const EXIT_ICON = 'M9 4v5H4M15 4v5h5M15 20v-5h5M9 20v-5H4'
760
+
761
+ export const FullscreenToggle = () => {
762
+ const isFullscreen = phx.frontend.useIsFullscreenActive()
763
+ const setFullscreen = phx.frontend.useSetFullscreen()
764
+
765
+ return (
766
+ <Button
767
+ onClick={() => setFullscreen(!isFullscreen)}
768
+ startIcon={
769
+ <svg viewBox="0 0 24 24" width={20} height={20} fill="none" stroke="currentColor" strokeWidth={2}>
770
+ <path d={isFullscreen ? EXIT_ICON : ENTER_ICON} />
771
+ </svg>
772
+ }
773
+ sx={{
774
+ minBlockSize: 44,
775
+ paddingInline: 2.5,
776
+ borderRadius: 999,
777
+ bgcolor: 'background.paper',
778
+ color: 'text.primary',
779
+ boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',
780
+ textTransform: 'none',
781
+ fontWeight: 600,
782
+ '&:hover': { bgcolor: 'background.paper', boxShadow: '0 6px 20px rgba(0, 0, 0, 0.18)' },
783
+ }}
784
+ >
785
+ {isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
786
+ </Button>
787
+ )
788
+ }
789
+ ```
790
+
791
+ ### ./src/\_shared/ProductPanel.tsx
792
+
793
+ ```tsx
794
+ import { Box, Button, Typography } from '@mui/material'
795
+
796
+ import { detailComponent } from '@salsita-ai/sdk/domain'
797
+ import { useResolveLocalizable } from '@salsita-ai/sdk/react'
798
+
799
+ import { phx } from '../../.phoenix/phx.js'
800
+ import { EdgeFinishCards } from './EdgeFinishCards.js'
801
+
802
+ export const ProductPanel = () => {
803
+ const resolve = useResolveLocalizable()
804
+ const detail = phx.frontend.useFirstRootComponent(detailComponent)
805
+ const price = phx.frontend.useRootEntityPrice()
806
+ const tableId = phx.frontend.useRootEntityId()
807
+ const edgeFinish = phx.frontend.useAttributeSelection(tableId, 'edgeFinish')
808
+ const { accessInfo } = phx.frontend.useAccessService()
809
+ const navigationState = phx.frontend.useActiveNavigationState()
810
+ const pushNavigate = phx.frontend.usePushNavigate()
811
+ const popNavigate = phx.frontend.usePopNavigate()
812
+
813
+ const isReadMode = accessInfo.viewMode
814
+ const isReview = isReadMode || navigationState === 'checkout'
815
+ const chosenEdge = edgeFinish.options.find(option => option.value === edgeFinish.value)
816
+
817
+ return (
818
+ <>
819
+ <Box component="header" sx={{ display: 'grid', gap: 1, padding: 3, paddingBlockEnd: 2 }}>
820
+ {isReadMode ? (
821
+ <Typography
822
+ variant="overline"
823
+ sx={{ justifySelf: 'start', paddingInline: 1.5, borderRadius: 999, bgcolor: 'action.selected' }}
824
+ >
825
+ View only
826
+ </Typography>
827
+ ) : (
828
+ <Typography variant="overline" color="text.secondary">
829
+ {resolve(detail?.state.subtitle)}
830
+ </Typography>
831
+ )}
832
+ <Typography variant="h5" component="h2" fontWeight={700}>
833
+ {resolve(detail?.state.title)}
834
+ </Typography>
835
+ <Typography variant="body2" color="text.secondary">
836
+ {resolve(detail?.state.description)}
837
+ </Typography>
838
+ </Box>
839
+
840
+ <Box component="div" sx={{ display: 'grid', gap: 1.5, paddingInline: 3, paddingBlockEnd: 3, overflowY: 'auto' }}>
841
+ <Typography variant="subtitle2" component="h3">
842
+ Edge finish
843
+ </Typography>
844
+ {isReview ? (
845
+ <Box component="div" sx={{ padding: 2, borderRadius: 3, bgcolor: 'action.hover' }}>
846
+ <Typography variant="body2" fontWeight={600}>
847
+ {resolve(chosenEdge?.title)}
848
+ </Typography>
849
+ <Typography variant="caption" color="text.secondary">
850
+ {resolve(chosenEdge?.description)}
851
+ </Typography>
852
+ </Box>
853
+ ) : (
854
+ <EdgeFinishCards selection={edgeFinish} />
855
+ )}
856
+ </Box>
857
+
858
+ <Box component="footer" sx={{ display: 'grid', gap: 2, padding: 3, borderTop: 1, borderColor: 'divider' }}>
859
+ <Box component="div" sx={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between' }}>
860
+ <Typography variant="body2" color="text.secondary">
861
+ Total price
862
+ </Typography>
863
+ <Typography variant="h5" component="p" fontWeight={700}>
864
+ {price}
865
+ </Typography>
866
+ </Box>
867
+ {isReview && !isReadMode && (
868
+ <Typography variant="body2" color="text.secondary">
869
+ Your table is ready for a quote. A real shop collects the contact details here.
870
+ </Typography>
871
+ )}
872
+ {!isReadMode && (
873
+ <Button
874
+ size="large"
875
+ variant={isReview ? 'outlined' : 'contained'}
876
+ onClick={isReview ? popNavigate : () => pushNavigate('checkout')}
877
+ sx={{ minBlockSize: 48, borderRadius: 999, textTransform: 'none', fontWeight: 600 }}
878
+ >
879
+ {isReview ? 'Back to the configuration' : 'Review and request a quote'}
880
+ </Button>
881
+ )}
882
+ </Box>
883
+ </>
884
+ )
885
+ }
886
+ ```
887
+
888
+ ### ./src/elements/ConfiguratorLayout.tsx
889
+
890
+ ```tsx
891
+ import { Box } from '@mui/material'
892
+
893
+ import { LayoutSlots, useSceneSafeArea } from '@salsita-ai/sdk/configurator'
894
+
895
+ import { phx } from '../../.phoenix/phx.js'
896
+ import { FullscreenToggle } from '../_shared/FullscreenToggle.js'
897
+ import { ProductPanel } from '../_shared/ProductPanel.js'
898
+
899
+ const GUTTER = 24
900
+ const PANEL_WIDTH = 380
901
+
902
+ const ConfiguratorLayout = () => {
903
+ const { containerRef, safeAreaRef } = useSceneSafeArea()
904
+ const isFullscreen = phx.frontend.useIsFullscreenActive()
905
+
906
+ return (
907
+ <Box component="div" ref={containerRef} sx={{ position: 'absolute', inset: 0 }}>
908
+ <LayoutSlots.SharedCanvas />
909
+
910
+ {!isFullscreen && (
911
+ <Box
912
+ component="aside"
913
+ sx={{
914
+ position: 'absolute',
915
+ insetBlockStart: GUTTER,
916
+ insetInlineStart: GUTTER,
917
+ inlineSize: PANEL_WIDTH,
918
+ maxBlockSize: `calc(100% - ${2 * GUTTER}px)`,
919
+ display: 'flex',
920
+ flexDirection: 'column',
921
+ borderRadius: 5,
922
+ bgcolor: 'background.paper',
923
+ boxShadow: '0 12px 40px rgba(0, 0, 0, 0.12)',
924
+ overflow: 'hidden',
925
+ }}
926
+ >
927
+ <ProductPanel />
928
+ </Box>
929
+ )}
930
+
931
+ <Box
932
+ component="div"
933
+ ref={safeAreaRef}
934
+ sx={{
935
+ position: 'absolute',
936
+ insetBlock: 0,
937
+ insetInlineStart: isFullscreen ? 0 : PANEL_WIDTH + 2 * GUTTER,
938
+ insetInlineEnd: 0,
939
+ pointerEvents: 'none',
940
+ }}
941
+ >
942
+ <Box
943
+ component="div"
944
+ sx={{ position: 'absolute', insetBlockStart: GUTTER, insetInlineEnd: GUTTER, pointerEvents: 'auto' }}
945
+ >
946
+ <FullscreenToggle />
947
+ </Box>
948
+ </Box>
949
+ </Box>
950
+ )
951
+ }
952
+
953
+ export default phx.frontend.createCustomPhoenixLayoutElement('ConfiguratorLayout', ConfiguratorLayout)
954
+ ```
955
+
956
+ ### ./src/expressions/table.ts
957
+
958
+ ```ts
959
+ import { phx } from '../../.phoenix/phx.js'
960
+
961
+ const EDGE_FINISH_SURCHARGE = { None: 0, Facet: 90, Round: 120, TreeTrunk: 340 }
962
+
963
+ export default phx.domain.implementCustomExpressions({
964
+ Table: {
965
+ $price: s => {
966
+ return 1290 + EDGE_FINISH_SURCHARGE[s.edgeFinish]
967
+ },
968
+ $edgeFinishFacet: s => {
969
+ return s.edgeFinish === 'Facet' ? 1 : 0
970
+ },
971
+ $edgeFinishRound: s => {
972
+ return s.edgeFinish === 'Round' ? 1 : 0
973
+ },
974
+ $edgeFinishTreeTrunk: s => {
975
+ return s.edgeFinish === 'TreeTrunk' ? 1 : 0
976
+ },
977
+ },
978
+ })
979
+ ```
980
+
981
+ </details>