@salsita-ai/sdk 0.50.0-develop.c28cfb7ded → 0.50.0-develop.c4848d224b

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 (688) hide show
  1. package/README.md +19 -14
  2. package/dist/admin/default-admin-elements.d.ts +9 -0
  3. package/dist/admin/default-admin-elements.js +1 -0
  4. package/dist/admin/default-elements/built-in-entity-element.d.ts +10 -0
  5. package/dist/admin/default-elements/built-in-entity-element.js +1 -0
  6. package/dist/admin/default-elements/built-in-layout-element.d.ts +10 -0
  7. package/dist/admin/default-elements/built-in-layout-element.js +1 -0
  8. package/dist/admin/default-elements/index.d.ts +2 -0
  9. package/dist/admin/default-elements/index.js +1 -0
  10. package/dist/admin/index.d.ts +1 -0
  11. package/dist/admin/index.js +1 -1
  12. package/dist/application-spec/caching/content-diff.js +1 -1
  13. package/dist/application-spec/core/application-file.d.ts +0 -2
  14. package/dist/application-spec/core/application-file.js +1 -1
  15. package/dist/application-spec/errors/diagnostic-codes.d.ts +5 -0
  16. package/dist/application-spec/errors/diagnostic-codes.js +1 -1
  17. package/dist/application-spec/errors/diagnostic-messages.d.ts +5 -0
  18. package/dist/application-spec/errors/diagnostic-messages.js +1 -1
  19. package/dist/application-spec/generate-application/code/common/code-imports.js +1 -1
  20. package/dist/application-spec/generate-application/code/common/env-reader.js +2 -2
  21. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  22. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  23. package/dist/application-spec/generate-application/code/common/single-quoted-string.d.ts +6 -0
  24. package/dist/application-spec/generate-application/code/common/single-quoted-string.js +1 -0
  25. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  26. package/dist/application-spec/generate-application/code/generate-application-code.d.ts +3 -2
  27. package/dist/application-spec/generate-application/code/generate-application-code.js +1 -1
  28. package/dist/application-spec/generate-application/code/project-scaffolding.d.ts +15 -14
  29. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  30. package/dist/application-spec/generate-application/code/story-files.js +1 -1
  31. package/dist/application-spec/generate-application/code/templates/admin-config.js +3 -0
  32. package/dist/application-spec/generate-application/code/templates/common/format-property-key.d.ts +7 -0
  33. package/dist/application-spec/generate-application/code/templates/common/format-property-key.js +1 -0
  34. package/dist/application-spec/generate-application/code/templates/common/schema-to-type-string.js +3 -3
  35. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/domain-factory-types.d.ts +35 -0
  36. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/domain-factory-types.js +5 -0
  37. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/index.d.ts +1 -0
  38. package/dist/application-spec/generate-application/code/templates/domain-spec/factory-types/index.js +1 -0
  39. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.d.ts +1 -1
  40. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-component-optics.js +6 -6
  41. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-domain-block.js +59 -63
  42. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.d.ts +8 -0
  43. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-invariants.js +1 -1
  44. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-presets.js +1 -1
  45. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-resources.js +13 -13
  46. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.d.ts +1 -1
  47. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-states.js +2 -2
  48. package/dist/application-spec/generate-application/code/templates/domain-spec/index.d.ts +2 -1
  49. package/dist/application-spec/generate-application/code/templates/domain-spec/index.js +1 -1
  50. package/dist/application-spec/generate-application/code/templates/eslint-config.d.ts +5 -0
  51. package/dist/application-spec/generate-application/code/templates/eslint-config.js +4 -5
  52. package/dist/application-spec/generate-application/code/templates/frontend-config.js +3 -5
  53. package/dist/application-spec/generate-application/code/templates/gitignore.js +0 -3
  54. package/dist/application-spec/generate-application/code/templates/global-definition/generate-phx-types.d.ts +43 -0
  55. package/dist/application-spec/generate-application/code/templates/global-definition/generate-phx-types.js +31 -0
  56. package/dist/application-spec/generate-application/code/templates/global-definition/index.d.ts +1 -0
  57. package/dist/application-spec/generate-application/code/templates/global-definition/index.js +1 -1
  58. package/dist/application-spec/generate-application/code/templates/globals.js +24 -44
  59. package/dist/application-spec/generate-application/code/templates/index.d.ts +3 -2
  60. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  61. package/dist/application-spec/generate-application/code/templates/lingui-rc.d.ts +5 -0
  62. package/dist/application-spec/generate-application/code/templates/lingui-rc.js +4 -4
  63. package/dist/application-spec/generate-application/code/templates/prettier-config.d.ts +5 -0
  64. package/dist/application-spec/generate-application/code/templates/prettier-config.js +4 -5
  65. package/dist/application-spec/generate-application/code/templates/root-tsconfig.d.ts +6 -0
  66. package/dist/application-spec/generate-application/code/templates/root-tsconfig.js +2 -0
  67. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  68. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +1 -1
  69. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +5 -5
  70. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +3 -3
  71. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  72. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +2 -2
  73. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +16 -4
  74. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +2 -2
  75. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.d.ts +58 -0
  76. package/dist/application-spec/generate-application/code/templates/spec-code/collect-spec-code.js +1 -0
  77. package/dist/application-spec/generate-application/code/templates/spec-code/index.d.ts +2 -0
  78. package/dist/application-spec/generate-application/code/templates/spec-code/index.js +1 -0
  79. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.d.ts +18 -0
  80. package/dist/application-spec/generate-application/code/templates/spec-code/spec-code.js +41 -0
  81. package/dist/application-spec/generate-application/code/templates/spec-messages/index.d.ts +1 -0
  82. package/dist/application-spec/generate-application/code/templates/spec-messages/index.js +1 -0
  83. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.d.ts +20 -0
  84. package/dist/application-spec/generate-application/code/templates/spec-messages/spec-messages.js +6 -0
  85. package/dist/application-spec/generate-application/code/templates/story/phx-module.d.ts +8 -2
  86. package/dist/application-spec/generate-application/code/templates/story/phx-module.js +15 -3
  87. package/dist/application-spec/generate-application/code/templates/story/wrapper.d.ts +3 -0
  88. package/dist/application-spec/generate-application/code/templates/story/wrapper.js +2 -1
  89. package/dist/application-spec/generate-application/code/templates/tsconfig.d.ts +5 -0
  90. package/dist/application-spec/generate-application/code/templates/tsconfig.js +1 -1
  91. package/dist/application-spec/generate-application/code/templates/webhooks-config.js +2 -3
  92. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.d.ts +6 -4
  93. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-model-runtime.js +1 -1
  94. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +3 -2
  95. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  96. package/dist/application-spec/generate-application/runtime/admin-runtime/states-runtime.d.ts +2 -2
  97. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +13 -6
  98. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  99. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.d.ts +6 -4
  100. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-model-runtime.js +1 -1
  101. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +3 -2
  102. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  103. package/dist/application-spec/generate-application/runtime/configurator-runtime/states-runtime.d.ts +2 -2
  104. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +2 -2
  105. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +2 -2
  106. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.d.ts +2 -1
  107. package/dist/application-spec/generate-application/runtime/sections/build-sdk-optic.js +1 -1
  108. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.d.ts +2 -1
  109. package/dist/application-spec/generate-application/runtime/sections/build-user-bound-optic.js +1 -1
  110. package/dist/application-spec/generate-application/runtime/sections/component-optic.d.ts +3 -0
  111. package/dist/application-spec/generate-application/runtime/sections/component-optic.js +1 -1
  112. package/dist/application-spec/generate-application/runtime/sections/data-runtime.d.ts +4 -4
  113. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.d.ts +7 -4
  114. package/dist/application-spec/generate-application/runtime/sections/expression-runtime.js +1 -1
  115. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.d.ts +9 -5
  116. package/dist/application-spec/generate-application/runtime/sections/generate-memo-eval-plan-runtime.js +1 -1
  117. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.d.ts +3 -1
  118. package/dist/application-spec/generate-application/runtime/sections/reflection-constants-runtime.js +1 -1
  119. package/dist/application-spec/generate-application/runtime/sections/theme-runtime.d.ts +2 -2
  120. package/dist/application-spec/generate-application/runtime/sections/transformers-runtime.d.ts +3 -3
  121. package/dist/application-spec/generate-application/runtime/spec-code/index.d.ts +2 -0
  122. package/dist/application-spec/generate-application/runtime/spec-code/index.js +1 -0
  123. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.d.ts +18 -0
  124. package/dist/application-spec/generate-application/runtime/spec-code/resolve-spec-code.js +1 -0
  125. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.d.ts +17 -0
  126. package/dist/application-spec/generate-application/runtime/spec-code/spec-code-module.js +1 -0
  127. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.d.ts +9 -0
  128. package/dist/application-spec/generate-application/runtime-spec/decode-runtime-spec.js +1 -0
  129. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.d.ts +8 -0
  130. package/dist/application-spec/generate-application/runtime-spec/encode-runtime-spec.js +1 -0
  131. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.d.ts +27 -0
  132. package/dist/application-spec/generate-application/runtime-spec/encoded-runtime-spec.js +1 -0
  133. package/dist/application-spec/generate-application/runtime-spec/index.d.ts +5 -0
  134. package/dist/application-spec/generate-application/runtime-spec/index.js +1 -0
  135. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.d.ts +68 -0
  136. package/dist/application-spec/generate-application/runtime-spec/runtime-spec.js +1 -0
  137. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.d.ts +40 -0
  138. package/dist/application-spec/generate-application/runtime-spec/spec-code-id.js +1 -0
  139. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +28 -0
  140. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  141. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.d.ts +16 -0
  142. package/dist/application-spec/parse-application-files/categorize/earlier-generated-editor-configs.js +9 -0
  143. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.d.ts +9 -0
  144. package/dist/application-spec/parse-application-files/categorize/earlier-generated-tsconfig.js +1 -0
  145. package/dist/application-spec/parse-application-files/raw-spec/parse-yaml-spec-file.js +1 -1
  146. package/dist/application-spec/parse-application-files/spec/application/admin-spec/admin-spec.js +1 -1
  147. package/dist/application-spec/parse-application-files/spec/application/configurator-spec/configurator-spec.js +1 -1
  148. package/dist/application-spec/parse-application-files/spec/common/index.d.ts +1 -0
  149. package/dist/application-spec/parse-application-files/spec/common/index.js +1 -1
  150. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.d.ts +3 -0
  151. package/dist/application-spec/parse-application-files/spec/common/value-type/format-value-type.js +1 -0
  152. package/dist/application-spec/parse-application-files/spec/common/value-type/index.d.ts +5 -0
  153. package/dist/application-spec/parse-application-files/spec/common/value-type/index.js +1 -0
  154. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.d.ts +6 -0
  155. package/dist/application-spec/parse-application-files/spec/common/value-type/intersect-value-types.js +1 -0
  156. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.d.ts +8 -0
  157. package/dist/application-spec/parse-application-files/spec/common/value-type/is-assignable-value-type.js +1 -0
  158. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.d.ts +10 -0
  159. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type-at.js +1 -0
  160. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.d.ts +98 -0
  161. package/dist/application-spec/parse-application-files/spec/common/value-type/value-type.js +1 -0
  162. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.d.ts +13 -0
  163. package/dist/application-spec/parse-application-files/spec/components/bindings/component-path.js +1 -0
  164. package/dist/application-spec/parse-application-files/spec/components/bindings/index.d.ts +2 -0
  165. package/dist/application-spec/parse-application-files/spec/components/bindings/index.js +1 -1
  166. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.d.ts +24 -0
  167. package/dist/application-spec/parse-application-files/spec/components/bindings/read-binding-type.js +1 -0
  168. package/dist/application-spec/parse-application-files/spec/components/component-state-type.d.ts +8 -0
  169. package/dist/application-spec/parse-application-files/spec/components/component-state-type.js +1 -0
  170. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.d.ts +13 -0
  171. package/dist/application-spec/parse-application-files/spec/components/filter-criterion-types.js +1 -0
  172. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.d.ts +14 -0
  173. package/dist/application-spec/parse-application-files/spec/components/static-entity-id.js +1 -0
  174. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.d.ts +6 -0
  175. package/dist/application-spec/parse-application-files/spec/components/user-component-entry.js +1 -1
  176. package/dist/application-spec/parse-application-files/spec/components/user-components.d.ts +7 -4
  177. package/dist/application-spec/parse-application-files/spec/components/user-components.js +1 -1
  178. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.d.ts +24 -0
  179. package/dist/application-spec/parse-application-files/spec/expressions/expression-read-types.js +1 -0
  180. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.d.ts +13 -0
  181. package/dist/application-spec/parse-application-files/spec/expressions/expression-read.js +1 -0
  182. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.d.ts +9 -0
  183. package/dist/application-spec/parse-application-files/spec/expressions/expression-value-type.js +1 -0
  184. package/dist/application-spec/parse-application-files/spec/expressions/expressions.d.ts +6 -2
  185. package/dist/application-spec/parse-application-files/spec/expressions/expressions.js +1 -1
  186. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.d.ts +3 -1
  187. package/dist/application-spec/parse-application-files/spec/expressions/user-expressions.js +1 -1
  188. package/dist/application-spec/parse-application-files/spec/invariants/invariants.d.ts +2 -2
  189. package/dist/application-spec/parse-application-files/spec/invariants/invariants.js +1 -1
  190. package/dist/application-spec/parse-application-files/spec/model/index.d.ts +1 -0
  191. package/dist/application-spec/parse-application-files/spec/model/index.js +1 -1
  192. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.d.ts +10 -0
  193. package/dist/application-spec/parse-application-files/spec/model/model-type-resolution.js +1 -0
  194. package/dist/client/phoenix-api.d.ts +367 -0
  195. package/dist/configurator/ConfiguratorApp.js +1 -1
  196. package/dist/configurator/app-loader-content/DefaultAppLoaderContent.d.ts +2 -0
  197. package/dist/configurator/app-loader-content/DefaultAppLoaderContent.js +5 -0
  198. package/dist/configurator/app-loader-content/app-loader-content-name.d.ts +5 -0
  199. package/dist/configurator/app-loader-content/app-loader-content-name.js +1 -0
  200. package/dist/configurator/app-loader-content/index.d.ts +2 -0
  201. package/dist/configurator/app-loader-content/index.js +1 -0
  202. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +7 -1
  203. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  204. package/dist/configurator/application-runtime/extensions/systems/camera-control-system/camera-control-system.d.ts +1 -1
  205. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.d.ts +12 -0
  206. package/dist/configurator/application-runtime/extensions/systems/graphql-system/close-unclosed-braces.js +1 -0
  207. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +1 -1
  208. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  209. package/dist/configurator/common/configurator-interface.d.ts +112 -5
  210. package/dist/configurator/common/configurator-interface.js +1 -1
  211. package/dist/configurator/common/index.d.ts +2 -2
  212. package/dist/configurator/common/index.js +1 -1
  213. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.d.ts +12 -0
  214. package/dist/configurator/configuration-not-found-page/ConfigurationNotFoundPageElement.js +1 -0
  215. package/dist/configurator/configuration-not-found-page/create-configuration-not-found-page.d.ts +9 -0
  216. package/dist/configurator/configuration-not-found-page/create-configuration-not-found-page.js +1 -0
  217. package/dist/configurator/configuration-not-found-page/index.d.ts +2 -0
  218. package/dist/configurator/configuration-not-found-page/index.js +1 -0
  219. package/dist/configurator/configurator-context/ConfiguratorResponsiveProvider.d.ts +12 -0
  220. package/dist/configurator/configurator-context/ConfiguratorResponsiveProvider.js +1 -0
  221. package/dist/configurator/configurator-context/PresetSelectionProvider.js +1 -1
  222. package/dist/configurator/configurator-context/PreviewContextProvider.js +1 -1
  223. package/dist/configurator/configurator-context/ViewportStateSync.d.ts +2 -2
  224. package/dist/configurator/configurator-context/ViewportStateSync.js +1 -1
  225. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +6 -0
  226. package/dist/configurator/configurator-error-page/BuiltInConfiguratorErrorPage.d.ts +6 -0
  227. package/dist/configurator/configurator-error-page/BuiltInConfiguratorErrorPage.js +1 -0
  228. package/dist/configurator/configurator-error-page/ConfiguratorErrorPageElement.d.ts +12 -0
  229. package/dist/configurator/configurator-error-page/ConfiguratorErrorPageElement.js +1 -0
  230. package/dist/configurator/configurator-error-page/create-configurator-error-page.d.ts +9 -0
  231. package/dist/configurator/configurator-error-page/create-configurator-error-page.js +1 -0
  232. package/dist/configurator/configurator-error-page/index.d.ts +3 -0
  233. package/dist/configurator/configurator-error-page/index.js +1 -0
  234. package/dist/configurator/index.d.ts +3 -0
  235. package/dist/configurator/index.js +1 -1
  236. package/dist/configurator/pages/ConfiguratorErrorPage.d.ts +0 -1
  237. package/dist/configurator/pages/ConfiguratorErrorPage.js +1 -1
  238. package/dist/configurator/pages/ConfiguratorNotFoundPage.js +1 -1
  239. package/dist/configurator/pages/DefaultConfiguratorLayout.d.ts +3 -2
  240. package/dist/configurator/pages/DefaultNotAuthenticatedPage.d.ts +8 -0
  241. package/dist/configurator/pages/DefaultNotAuthenticatedPage.js +1 -0
  242. package/dist/configurator/pages/DefaultPresetUi.d.ts +7 -0
  243. package/dist/configurator/pages/DefaultPresetUi.js +1 -0
  244. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  245. package/dist/configurator/pages/NewConfiguratorPage.js +1 -1
  246. package/dist/configurator/pages/PresetCreationErrorPage.d.ts +1 -1
  247. package/dist/configurator/pages/PresetCreationErrorPage.js +1 -1
  248. package/dist/configurator/pages/RootPage.js +1 -1
  249. package/dist/configurator/pages/default-configurator-elements.d.ts +7 -1
  250. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  251. package/dist/configurator/pages/default-elements/built-in-entity-element.d.ts +10 -0
  252. package/dist/configurator/pages/default-elements/built-in-entity-element.js +1 -0
  253. package/dist/configurator/pages/default-elements/built-in-layout-element.d.ts +10 -0
  254. package/dist/configurator/pages/default-elements/built-in-layout-element.js +1 -0
  255. package/dist/configurator/pages/default-elements/domain-control-elements.d.ts +6 -0
  256. package/dist/configurator/pages/default-elements/domain-control-elements.js +1 -0
  257. package/dist/configurator/pages/default-elements/index.d.ts +5 -0
  258. package/dist/configurator/pages/default-elements/index.js +1 -0
  259. package/dist/configurator/pages/default-elements/recipe-panel-elements.d.ts +3 -0
  260. package/dist/configurator/pages/default-elements/recipe-panel-elements.js +1 -0
  261. package/dist/configurator/pages/default-elements/scene-controls/BuiltInAddEntityFab.d.ts +3 -0
  262. package/dist/configurator/pages/default-elements/scene-controls/BuiltInAddEntityFab.js +1 -0
  263. package/dist/configurator/pages/default-elements/scene-controls/BuiltInDeleteEntityFab.d.ts +3 -0
  264. package/dist/configurator/pages/default-elements/scene-controls/BuiltInDeleteEntityFab.js +1 -0
  265. package/dist/configurator/pages/default-elements/scene-controls/BuiltInNavigationHotspot.d.ts +3 -0
  266. package/dist/configurator/pages/default-elements/scene-controls/BuiltInNavigationHotspot.js +1 -0
  267. package/dist/configurator/pages/default-elements/scene-controls/BuiltInSelectionHotspot.d.ts +3 -0
  268. package/dist/configurator/pages/default-elements/scene-controls/BuiltInSelectionHotspot.js +1 -0
  269. package/dist/configurator/pages/default-elements/scene-controls/BuiltInToolMenuFab.d.ts +3 -0
  270. package/dist/configurator/pages/default-elements/scene-controls/BuiltInToolMenuFab.js +1 -0
  271. package/dist/configurator/pages/default-elements/scene-controls/index.d.ts +6 -0
  272. package/dist/configurator/pages/default-elements/scene-controls/index.js +1 -0
  273. package/dist/configurator/pages/default-elements/scene-controls/scene-control-elements.d.ts +6 -0
  274. package/dist/configurator/pages/default-elements/scene-controls/scene-control-elements.js +1 -0
  275. package/dist/configurator/pages/default-elements/sidebar-footer-elements.d.ts +7 -0
  276. package/dist/configurator/pages/default-elements/sidebar-footer-elements.js +1 -0
  277. package/dist/configurator/pages/default-elements/toolbar-elements.d.ts +7 -0
  278. package/dist/configurator/pages/default-elements/toolbar-elements.js +1 -0
  279. package/dist/configurator/pages/error-boundaries/GeneralErrorBoundary.js +1 -1
  280. package/dist/configurator/preset-screen-elements/PresetDeviceNotSupportedElement.d.ts +4 -0
  281. package/dist/configurator/preset-screen-elements/PresetDeviceNotSupportedElement.js +1 -0
  282. package/dist/configurator/preset-screen-elements/PresetPageActionElement.d.ts +4 -0
  283. package/dist/configurator/preset-screen-elements/PresetPageActionElement.js +1 -0
  284. package/dist/configurator/preset-screen-elements/index.d.ts +2 -0
  285. package/dist/configurator/preset-screen-elements/index.js +1 -0
  286. package/dist/configurator/scene/index.d.ts +1 -0
  287. package/dist/configurator/scene/index.js +1 -1
  288. package/dist/configurator/scene/scene-controls/DeleteEntityFab.js +1 -1
  289. package/dist/configurator/scene/scene-controls/SelectionHotspot.js +1 -1
  290. package/dist/configurator/scene/scene-controls/ToolFab.d.ts +4 -0
  291. package/dist/configurator/scene/scene-controls/ToolFab.js +1 -1
  292. package/dist/configurator/scene/scene-controls/use-scene-control-tooltip.d.ts +2 -1
  293. package/dist/configurator/scene/scene-entity/scene-controls/SceneEntityHtmlHotspots.js +1 -1
  294. package/dist/configurator/toolbar-actions/index.d.ts +2 -0
  295. package/dist/configurator/toolbar-actions/index.js +1 -0
  296. package/dist/configurator/toolbar-actions/use-assistant-panel.d.ts +18 -0
  297. package/dist/configurator/toolbar-actions/use-assistant-panel.js +1 -0
  298. package/dist/configurator/toolbar-actions/use-measurements.d.ts +35 -0
  299. package/dist/configurator/toolbar-actions/use-measurements.js +1 -0
  300. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -2
  301. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  302. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -1
  303. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  304. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.d.ts +1 -1
  305. package/dist/configurator/ui/assistant/entity-link/AssistantEntityLink.js +1 -1
  306. package/dist/configurator/ui/assistant/entity-link/entity-link-state.d.ts +1 -1
  307. package/dist/configurator/ui/assistant/entity-link/index.d.ts +0 -1
  308. package/dist/configurator/ui/assistant/entity-link/index.js +1 -1
  309. package/dist/configurator/ui/assistant/form/AssistantForm.d.ts +19 -0
  310. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -0
  311. package/dist/configurator/ui/assistant/form/built-in-form-registry.d.ts +10 -0
  312. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +1 -0
  313. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +11 -0
  314. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -0
  315. package/dist/configurator/ui/assistant/form/describe-build-errors.d.ts +6 -0
  316. package/dist/configurator/ui/assistant/form/describe-build-errors.js +1 -0
  317. package/dist/configurator/ui/assistant/form/form-element-definition.d.ts +14 -0
  318. package/dist/configurator/ui/assistant/form/form-element-definition.js +1 -0
  319. package/dist/configurator/ui/assistant/form/form-model.d.ts +38 -0
  320. package/dist/configurator/ui/assistant/form/form-model.js +1 -0
  321. package/dist/configurator/ui/assistant/form/form-registry.d.ts +31 -0
  322. package/dist/configurator/ui/assistant/form/form-registry.js +8 -0
  323. package/dist/configurator/ui/assistant/form/form-state.d.ts +4 -0
  324. package/dist/configurator/ui/assistant/form/form-state.js +1 -0
  325. package/dist/configurator/ui/assistant/form/index.d.ts +2 -0
  326. package/dist/configurator/ui/assistant/form/index.js +1 -0
  327. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +9 -0
  328. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -0
  329. package/dist/configurator/ui/assistant/form/read-form-attributes.d.ts +13 -0
  330. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -0
  331. package/dist/configurator/ui/assistant/form-elements/FormGroup.d.ts +3 -0
  332. package/dist/configurator/ui/assistant/form-elements/FormGroup.js +1 -0
  333. package/dist/configurator/ui/assistant/form-elements/FormOptions.d.ts +3 -0
  334. package/dist/configurator/ui/assistant/form-elements/FormOptions.js +1 -0
  335. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +3 -0
  336. package/dist/configurator/ui/assistant/form-elements/FormReply.js +1 -0
  337. package/dist/configurator/ui/assistant/form-elements/FormText.d.ts +3 -0
  338. package/dist/configurator/ui/assistant/form-elements/FormText.js +1 -0
  339. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +34 -0
  340. package/dist/configurator/ui/assistant/form-elements/form-element-props.js +1 -0
  341. package/dist/configurator/ui/assistant/form-elements/index.d.ts +5 -0
  342. package/dist/configurator/ui/assistant/form-elements/index.js +1 -0
  343. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.d.ts +16 -0
  344. package/dist/configurator/ui/assistant/reference-link/AssistantReferenceLink.js +1 -0
  345. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.d.ts +34 -0
  346. package/dist/configurator/ui/assistant/reference-link/assistant-link-target.js +1 -0
  347. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.d.ts +25 -0
  348. package/dist/configurator/ui/assistant/reference-link/assistant-reference-details.js +1 -0
  349. package/dist/configurator/ui/assistant/reference-link/index.d.ts +3 -0
  350. package/dist/configurator/ui/assistant/reference-link/index.js +1 -0
  351. package/dist/configurator/ui/assistant/reference-link/reference-styles.d.ts +12 -0
  352. package/dist/configurator/ui/assistant/reference-link/reference-styles.js +1 -0
  353. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.d.ts +8 -0
  354. package/dist/configurator/ui/assistant/reference-link/use-assistant-reference-details.js +1 -0
  355. package/dist/configurator/ui/assistant/resource-image/AssistantImage.d.ts +9 -0
  356. package/dist/configurator/ui/assistant/resource-image/AssistantImage.js +1 -0
  357. package/dist/configurator/ui/assistant/resource-image/index.d.ts +3 -0
  358. package/dist/configurator/ui/assistant/resource-image/index.js +1 -0
  359. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +11 -0
  360. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -0
  361. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.d.ts +5 -0
  362. package/dist/configurator/ui/assistant/resource-image/use-resource-image-url.js +1 -0
  363. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +2 -0
  364. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  365. package/dist/configurator/ui/assistant/thread-items.d.ts +8 -1
  366. package/dist/configurator/ui/assistant/thread-items.js +1 -1
  367. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -1
  368. package/dist/configurator/ui/configurator-layout/slots/canvas/LayoutCanvas.js +1 -1
  369. package/dist/configurator/ui/configurator-layout/slots/canvas/SharedCanvas.js +1 -1
  370. package/dist/configurator/ui/configurator-layout/slots/mobile-tabs/use-mobile-tabs.d.ts +1 -1
  371. package/dist/configurator/ui/configurator-layout/slots/mobile-tabs/use-mobile-tabs.js +1 -1
  372. package/dist/configurator/ui/configurator-layout/slots/services/InvariantViolations.js +1 -1
  373. package/dist/configurator/ui/configurator-layout/slots/services/Services.js +1 -1
  374. package/dist/configurator/ui/configurator-layout/slots/sidebar-tabs/use-sidebar-tabs.d.ts +1 -1
  375. package/dist/configurator/ui/configurator-layout/slots/sidebar-tabs/use-sidebar-tabs.js +1 -1
  376. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.d.ts +1 -1
  377. package/dist/configurator/ui/configurator-layout/universal/use-layout-scene-safe-area.js +1 -1
  378. package/dist/configurator/ui/configurator-layout/universal/use-scene-safe-area.d.ts +1 -1
  379. package/dist/configurator/ui/legacy/layout/common/CommonFinalizeButton.js +1 -1
  380. package/dist/configurator/ui/legacy/layout/common/CommonSummaryButton.js +1 -1
  381. package/dist/configurator/ui/legacy/layout/common/CommonTopNavigation.js +1 -1
  382. package/dist/configurator/ui/legacy/layout/common/ReactiveInterfaceLayout.js +1 -1
  383. package/dist/configurator/ui/legacy/layout/common/ResponsiveFinalizeButton.js +1 -1
  384. package/dist/configurator/ui/legacy/layout/common/SummaryReadLayout.js +1 -1
  385. package/dist/configurator/ui/legacy/layout/simple/SimpleOwnerLayout.js +1 -1
  386. package/dist/configurator/ui/legacy/layout/simple/SimpleTopNavigation.js +1 -1
  387. package/dist/configurator/ui/legacy/layout/steps/StepsNavigation.js +1 -1
  388. package/dist/configurator/ui/legacy/layout/steps/StepsOwnerLayout.js +1 -1
  389. package/dist/configurator/ui/legacy/layout/steps/StepsSidebarFooter.js +1 -1
  390. package/dist/configurator/ui/legacy/layout/tabs/TabsOwnerLayout.js +1 -1
  391. package/dist/configurator/ui/legacy/toolbar/common/DimensionUnitSelector.js +1 -1
  392. package/dist/configurator/ui/legacy/toolbar/common/MeasurementsIndicatorsSwitch.js +1 -1
  393. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/FullscreenToolbarAction.js +1 -1
  394. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/HelpToolbarAction.js +1 -1
  395. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/MeasurementsToolbarAction.js +1 -1
  396. package/dist/configurator/ui/legacy/toolbar/desktop-toolbar/UndoRedoToolbarGroup.js +1 -1
  397. package/dist/configurator/ui/phoenix-layout-elements/AppLoader.js +2 -6
  398. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -1
  399. package/dist/configurator/ui/phoenix-layout-elements/EnterFullscreenToolbarButton.js +1 -1
  400. package/dist/configurator/ui/phoenix-layout-elements/ExitFullscreenToolbarButton.js +1 -1
  401. package/dist/configurator/ui/phoenix-layout-elements/HelpToolbarButton.js +1 -1
  402. package/dist/configurator/ui/phoenix-layout-elements/LanguageMenuAction.js +1 -1
  403. package/dist/configurator/ui/phoenix-layout-elements/LanguageToolbarButton.js +1 -1
  404. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.d.ts +1 -0
  405. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomOwnerUi.js +1 -1
  406. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.d.ts +1 -0
  407. package/dist/configurator/ui/phoenix-layout-elements/LayoutCustomReadUi.js +1 -1
  408. package/dist/configurator/ui/phoenix-layout-elements/MeasurementsMenuAction.js +1 -1
  409. package/dist/configurator/ui/phoenix-layout-elements/MeasurementsToolbarButton.js +1 -1
  410. package/dist/configurator/ui/phoenix-layout-elements/RedoToolbarButton.js +1 -1
  411. package/dist/configurator/ui/phoenix-layout-elements/ShareToolbarButton.js +1 -1
  412. package/dist/configurator/ui/phoenix-layout-elements/UndoToolbarButton.js +1 -1
  413. package/dist/configurator/ui/phoenix-layout-elements/header/common/back-button/use-go-back-action.js +1 -1
  414. package/dist/configurator/ui/phoenix-layout-elements/header/common/horizontal-tabs/DesktopHorizontalTabs.js +1 -1
  415. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/DesktopNavigationSteps.d.ts +1 -1
  416. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/DesktopNavigationSteps.js +1 -1
  417. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.d.ts +2 -8
  418. package/dist/configurator/ui/phoenix-layout-elements/header/common/step-navigation/StepsNavigation.js +1 -1
  419. package/dist/configurator/ui/phoenix-layout-elements/measurements/DimensionUnitSelector.js +1 -1
  420. package/dist/configurator/ui/phoenix-layout-elements/measurements/MeasurementsIndicatorsSwitch.js +1 -1
  421. package/dist/configurator/ui/phoenix-layout-elements/share/ShareModal.js +1 -1
  422. package/dist/configurator/ui/phoenix-layout-elements/share/use-share.d.ts +7 -8
  423. package/dist/configurator/ui/phoenix-layout-elements/share/use-share.js +1 -1
  424. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/basic/BasicFinalizeButton.js +1 -1
  425. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/CustomFinalizeButton.js +1 -1
  426. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/EnterSummaryButton.js +1 -1
  427. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/FinalizeActions.js +1 -1
  428. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/NextStepButton.js +1 -1
  429. package/dist/configurator/ui/phoenix-layout-elements/sidebar-footer/common/PreviousStepButton.js +1 -1
  430. package/dist/configurator/ui/preset-layout/CategoryPresetUi.js +1 -1
  431. package/dist/configurator/ui/preset-layout/PresetUi.d.ts +4 -0
  432. package/dist/configurator/ui/preset-layout/PresetUi.js +1 -1
  433. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.d.ts +10 -0
  434. package/dist/configurator/ui/save-message-snackbars/SaveMessageSnackbars.js +1 -0
  435. package/dist/configurator/ui/save-message-snackbars/index.d.ts +1 -0
  436. package/dist/configurator/ui/save-message-snackbars/index.js +1 -0
  437. package/dist/docs/complex-use-cases/focus-mode.mdx +2 -0
  438. package/dist/docs/controls/select-child-entity/cardselect.mdx +1 -0
  439. package/dist/docs/fabs/basic.mdx +6 -2
  440. package/dist/docs/index.json +1 -1
  441. package/dist/docs/layouts/custom-layout.mdx +328 -16
  442. package/dist/docs/other-features/error-5xx.mdx +1 -1
  443. package/dist/docs/other-features/navigation-hotspot.mdx +2 -0
  444. package/dist/docs/other-features/not-found-404.mdx +1 -1
  445. package/dist/docs/phoenix/clerk-sign-in.mdx +1 -1
  446. package/dist/docs/phoenix/components.mdx +6 -0
  447. package/dist/docs/phoenix/configurator-interface.mdx +220 -59
  448. package/dist/docs/phoenix/deployments.mdx +2 -6
  449. package/dist/docs/phoenix/domain-model.mdx +2 -0
  450. package/dist/docs/phoenix/finalization.mdx +1 -1
  451. package/dist/docs/phoenix/getting-started.mdx +6 -3
  452. package/dist/docs/phoenix/layout-slots.mdx +23 -23
  453. package/dist/docs/phoenix/localization.mdx +10 -6
  454. package/dist/docs/phoenix/migration-guide.mdx +24 -11
  455. package/dist/docs/phoenix/phoenix-cli.mdx +65 -20
  456. package/dist/docs/phoenix/project-structure.mdx +66 -32
  457. package/dist/docs/phoenix/quickstart.mdx +7 -7
  458. package/dist/docs/phoenix/sdk-builder-workflow.mdx +7 -7
  459. package/dist/docs/phoenix/testing.mdx +8 -0
  460. package/dist/docs/phoenix/webhooks.mdx +4 -4
  461. package/dist/docs/selection-and-highlight/hotspots.mdx +2 -0
  462. package/dist/domain/application/assistant/assistant-form-elements.d.ts +28 -0
  463. package/dist/domain/application/assistant/assistant-form-elements.js +1 -0
  464. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  465. package/dist/domain/application/assistant/index.d.ts +2 -0
  466. package/dist/domain/application/assistant/index.js +1 -1
  467. package/dist/domain/application/assistant-recipe-groups.d.ts +3 -1
  468. package/dist/domain/core/schema/extended-schema-validator.js +1 -1
  469. package/dist/domain/domain-runtime/spec/module-checks/element-registration.d.ts +12 -11
  470. package/dist/domain/domain-runtime/spec/module-checks/element-registration.js +1 -1
  471. package/dist/domain/domain-runtime/spec/module-checks/index.d.ts +1 -1
  472. package/dist/domain/domain-runtime/spec/module-checks/index.js +1 -1
  473. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  474. package/dist/domain/system-components/child-entity-selection.js +1 -1
  475. package/dist/domain/system-components/common/scene-entity-control-schema.d.ts +3 -0
  476. package/dist/domain/system-components/common/scene-entity-control-schema.js +1 -1
  477. package/dist/editor/Editor.d.ts +7 -0
  478. package/dist/editor/Editor.js +1 -1
  479. package/dist/editor/mocks/CreateMockYaml.js +2 -2
  480. package/dist/editor/mocks/EditorMockContext.d.ts +2 -0
  481. package/dist/editor/mocks/EditorMockContext.js +1 -1
  482. package/dist/globals/index.d.ts +2 -0
  483. package/dist/i18n/locales/cs/messages.js +1 -1
  484. package/dist/i18n/locales/da/messages.js +1 -1
  485. package/dist/i18n/locales/de/messages.js +1 -1
  486. package/dist/i18n/locales/de-AT/messages.js +1 -1
  487. package/dist/i18n/locales/en/messages.js +1 -1
  488. package/dist/i18n/locales/en-AU/messages.js +1 -1
  489. package/dist/i18n/locales/en-GB/messages.js +1 -1
  490. package/dist/i18n/locales/es/messages.js +1 -1
  491. package/dist/i18n/locales/fr/messages.js +1 -1
  492. package/dist/i18n/locales/hu/messages.js +1 -1
  493. package/dist/i18n/locales/it/messages.js +1 -1
  494. package/dist/i18n/locales/nl/messages.js +1 -1
  495. package/dist/i18n/locales/pl/messages.js +1 -1
  496. package/dist/i18n/locales/pt/messages.js +1 -1
  497. package/dist/i18n/locales/ro/messages.js +1 -1
  498. package/dist/i18n/locales/sk/messages.js +1 -1
  499. package/dist/i18n/locales/tr/messages.js +1 -1
  500. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  501. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  502. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +79 -80
  503. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +10 -11
  504. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +9 -10
  505. package/dist/phoenix/application-spec/application-spec-builder.d.ts +0 -2
  506. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  507. package/dist/phoenix/application-spec/generate-application-spec-project.d.ts +0 -2
  508. package/dist/phoenix/application-spec/generate-application-spec-project.js +2 -2
  509. package/dist/phoenix/application-spec/generate-application-spec-story.js +2 -2
  510. package/dist/phoenix/application-spec/generate-project-files.d.ts +0 -2
  511. package/dist/phoenix/application-spec/project-files.js +1 -1
  512. package/dist/phoenix/bin.d.ts +2 -0
  513. package/dist/phoenix/bin.js +2 -0
  514. package/dist/phoenix/check-configs/built-in-eslint-config.d.ts +9 -0
  515. package/dist/phoenix/check-configs/built-in-eslint-config.js +1 -0
  516. package/dist/phoenix/check-configs/eslint-config.d.ts +10 -0
  517. package/dist/phoenix/check-configs/eslint-config.js +1 -0
  518. package/dist/phoenix/check-configs/index.d.ts +8 -0
  519. package/dist/phoenix/check-configs/index.js +1 -0
  520. package/dist/phoenix/check-configs/typescript-project.d.ts +5 -0
  521. package/dist/phoenix/check-configs/typescript-project.js +1 -0
  522. package/dist/phoenix/cli.d.ts +0 -1
  523. package/dist/phoenix/cli.js +1 -2
  524. package/dist/phoenix/commands/build.js +1 -1
  525. package/dist/phoenix/commands/check.js +1 -1
  526. package/dist/phoenix/commands/clean.js +1 -1
  527. package/dist/phoenix/commands/deploy.js +2 -2
  528. package/dist/phoenix/commands/deps/deps.d.ts +73 -0
  529. package/dist/phoenix/commands/deps/deps.js +3 -0
  530. package/dist/phoenix/commands/deps/index.d.ts +1 -0
  531. package/dist/phoenix/commands/deps/index.js +1 -0
  532. package/dist/phoenix/commands/deps/sdk-manifest.d.ts +12 -0
  533. package/dist/phoenix/commands/deps/sdk-manifest.js +1 -0
  534. package/dist/phoenix/commands/dev.js +5 -5
  535. package/dist/phoenix/commands/fix.js +1 -1
  536. package/dist/phoenix/commands/index.d.ts +1 -0
  537. package/dist/phoenix/commands/index.js +1 -1
  538. package/dist/phoenix/commands/init.d.ts +17 -5
  539. package/dist/phoenix/commands/init.js +1 -1
  540. package/dist/phoenix/commands/link.js +1 -1
  541. package/dist/phoenix/commands/prettier.js +1 -1
  542. package/dist/phoenix/commands/sync.js +1 -1
  543. package/dist/phoenix/commands/unlink.js +1 -1
  544. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -2
  545. package/dist/phoenix/services/application-spec-project-watcher.js +2 -2
  546. package/dist/phoenix/services/lingui.d.ts +8 -0
  547. package/dist/phoenix/services/lingui.js +1 -1
  548. package/dist/phoenix/services/swc.js +1 -1
  549. package/dist/phoenix/services/vite-config.js +1 -1
  550. package/dist/phoenix/utils/index.d.ts +4 -2
  551. package/dist/phoenix/utils/index.js +1 -1
  552. package/dist/phoenix/utils/node-version/index.d.ts +1 -0
  553. package/dist/phoenix/utils/node-version/index.js +1 -0
  554. package/dist/phoenix/utils/node-version/supported-node-version.d.ts +12 -0
  555. package/dist/phoenix/utils/node-version/supported-node-version.js +4 -0
  556. package/dist/phoenix/utils/package-info.d.ts +0 -9
  557. package/dist/phoenix/utils/package-info.js +1 -1
  558. package/dist/phoenix/utils/package-manager/index.d.ts +2 -0
  559. package/dist/phoenix/utils/package-manager/index.js +1 -0
  560. package/dist/phoenix/utils/package-manager/package-manager-commands.d.ts +19 -0
  561. package/dist/phoenix/utils/package-manager/package-manager-commands.js +1 -0
  562. package/dist/phoenix/utils/package-manager/pnpm-project.d.ts +9 -0
  563. package/dist/phoenix/utils/package-manager/pnpm-project.js +1 -0
  564. package/dist/phoenix/utils/run-command.d.ts +11 -0
  565. package/dist/phoenix/utils/run-command.js +1 -1
  566. package/dist/phoenix/utils/sdk-tool/index.d.ts +1 -0
  567. package/dist/phoenix/utils/sdk-tool/index.js +1 -0
  568. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.d.ts +15 -0
  569. package/dist/phoenix/utils/sdk-tool/resolve-sdk-tool-bin.js +1 -0
  570. package/dist/{configurator/common → react-sdk/application-runtime/common-services/analytics}/frontend-analytics.d.ts +4 -0
  571. package/dist/react-sdk/application-runtime/common-services/analytics/index.d.ts +1 -0
  572. package/dist/react-sdk/application-runtime/common-services/analytics/index.js +1 -1
  573. package/dist/react-sdk/domain-application-context/DomainLifecycleBoundary.js +1 -1
  574. package/dist/react-sdk/domain-context/common-hooks/index.d.ts +8 -0
  575. package/dist/react-sdk/domain-context/common-hooks/index.js +1 -0
  576. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.d.ts +15 -4
  577. package/dist/react-sdk/domain-context/common-hooks/use-configurator-messages.js +1 -1
  578. package/dist/react-sdk/domain-context/component-hooks/index.d.ts +1 -0
  579. package/dist/react-sdk/domain-context/component-hooks/index.js +1 -0
  580. package/dist/react-sdk/domain-context/component-hooks/use-component.js +1 -1
  581. package/dist/react-sdk/domain-context/entity-hooks/use-domain-entity-state.js +1 -1
  582. package/dist/react-sdk/domain-context/entity-hooks/use-entity-price.js +1 -1
  583. package/dist/react-sdk/domain-context/entity-hooks/use-root-entity-id.js +1 -1
  584. package/dist/react-sdk/domain-context/entity-hooks/use-root-entity-state.js +1 -1
  585. package/dist/react-sdk/domain-context/index.d.ts +6 -0
  586. package/dist/react-sdk/domain-context/index.js +1 -1
  587. package/dist/react-sdk/domain-context/system-hooks/composition-hooks.js +1 -1
  588. package/dist/react-sdk/domain-context/system-hooks/dimension-hooks.js +1 -1
  589. package/dist/react-sdk/domain-context/system-hooks/generate-share-link-hooks.d.ts +8 -0
  590. package/dist/react-sdk/domain-context/system-hooks/generate-share-link-hooks.js +1 -0
  591. package/dist/react-sdk/domain-context/system-hooks/hover-hooks.js +1 -1
  592. package/dist/react-sdk/domain-context/system-hooks/locale-switch-hooks.d.ts +24 -0
  593. package/dist/react-sdk/domain-context/system-hooks/locale-switch-hooks.js +1 -0
  594. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  595. package/dist/react-sdk/domain-context/system-hooks/selection-hooks.js +1 -1
  596. package/dist/react-sdk/domain-context/system-hooks/share-links-hooks.d.ts +32 -0
  597. package/dist/react-sdk/domain-context/system-hooks/share-links-hooks.js +1 -0
  598. package/dist/react-sdk/domain-context/system-hooks/step-navigation-hooks.d.ts +57 -0
  599. package/dist/react-sdk/domain-context/system-hooks/step-navigation-hooks.js +1 -0
  600. package/dist/react-sdk/domain-context/system-hooks/tab-navigation-hooks.d.ts +61 -0
  601. package/dist/react-sdk/domain-context/system-hooks/tab-navigation-hooks.js +1 -0
  602. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.d.ts +20 -0
  603. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.js +1 -0
  604. package/dist/react-sdk/elements/configurator-error-page-props.d.ts +20 -0
  605. package/dist/react-sdk/elements/configurator-error-page-props.js +1 -0
  606. package/dist/react-sdk/elements/index.d.ts +1 -0
  607. package/dist/react-sdk/handlers/FinalizeActionRunner.d.ts +13 -0
  608. package/dist/react-sdk/handlers/FinalizeActionRunner.js +1 -0
  609. package/dist/react-sdk/handlers/FinalizeActionsHost.d.ts +10 -0
  610. package/dist/react-sdk/handlers/FinalizeActionsHost.js +1 -0
  611. package/dist/react-sdk/handlers/FinalizeActionsProvider.d.ts +11 -0
  612. package/dist/react-sdk/handlers/FinalizeActionsProvider.js +1 -0
  613. package/dist/react-sdk/handlers/finalize-actions-context.d.ts +6 -0
  614. package/dist/react-sdk/handlers/finalize-actions-context.js +1 -0
  615. package/dist/react-sdk/handlers/finalize-actions-store.d.ts +23 -0
  616. package/dist/react-sdk/handlers/finalize-actions-store.js +1 -0
  617. package/dist/react-sdk/handlers/index.d.ts +6 -0
  618. package/dist/react-sdk/handlers/index.js +1 -1
  619. package/dist/{configurator/common → react-sdk/handlers}/use-finalize-action.d.ts +3 -2
  620. package/dist/react-sdk/handlers/use-finalize-action.js +1 -0
  621. package/dist/react-sdk/handlers/use-finalize-actions.d.ts +53 -0
  622. package/dist/react-sdk/handlers/use-finalize-actions.js +1 -0
  623. package/dist/react-sdk/index.d.ts +2 -0
  624. package/dist/react-sdk/index.js +1 -1
  625. package/dist/react-sdk/loading-state/loading-state-manager.d.ts +5 -0
  626. package/dist/react-sdk/loading-state/loading-state-manager.js +1 -1
  627. package/dist/react-sdk/responsive-state/ResponsiveStateProvider.d.ts +25 -0
  628. package/dist/react-sdk/responsive-state/ResponsiveStateProvider.js +1 -0
  629. package/dist/react-sdk/responsive-state/canvas-padding.d.ts +14 -0
  630. package/dist/react-sdk/responsive-state/canvas-padding.js +1 -0
  631. package/dist/react-sdk/responsive-state/index.d.ts +5 -0
  632. package/dist/react-sdk/responsive-state/index.js +1 -0
  633. package/dist/react-sdk/responsive-state/responsive-state-manager.d.ts +111 -0
  634. package/dist/react-sdk/responsive-state/responsive-state-manager.js +1 -0
  635. package/dist/react-sdk/responsive-state/use-responsive-state-manager.d.ts +10 -0
  636. package/dist/react-sdk/responsive-state/use-responsive-state-manager.js +1 -0
  637. package/dist/react-sdk/responsive-state/use-responsive-state.d.ts +11 -0
  638. package/dist/react-sdk/responsive-state/use-responsive-state.js +1 -0
  639. package/dist/react-sdk/scene-control-elements/AddEntityFabElement.d.ts +36 -0
  640. package/dist/react-sdk/scene-control-elements/AddEntityFabElement.js +1 -0
  641. package/dist/react-sdk/scene-control-elements/DeleteEntityFabElement.d.ts +44 -0
  642. package/dist/react-sdk/scene-control-elements/DeleteEntityFabElement.js +1 -0
  643. package/dist/react-sdk/scene-control-elements/NavigationHotspotElement.d.ts +38 -0
  644. package/dist/react-sdk/scene-control-elements/NavigationHotspotElement.js +1 -0
  645. package/dist/react-sdk/scene-control-elements/SelectionHotspotElement.d.ts +30 -0
  646. package/dist/react-sdk/scene-control-elements/SelectionHotspotElement.js +1 -0
  647. package/dist/react-sdk/scene-control-elements/ToolMenuFabElement.d.ts +30 -0
  648. package/dist/react-sdk/scene-control-elements/ToolMenuFabElement.js +1 -0
  649. package/dist/react-sdk/scene-control-elements/create-add-entity-fab.d.ts +9 -0
  650. package/dist/react-sdk/scene-control-elements/create-add-entity-fab.js +1 -0
  651. package/dist/react-sdk/scene-control-elements/create-delete-entity-fab.d.ts +9 -0
  652. package/dist/react-sdk/scene-control-elements/create-delete-entity-fab.js +1 -0
  653. package/dist/react-sdk/scene-control-elements/create-navigation-hotspot.d.ts +10 -0
  654. package/dist/react-sdk/scene-control-elements/create-navigation-hotspot.js +1 -0
  655. package/dist/react-sdk/scene-control-elements/create-selection-hotspot.d.ts +9 -0
  656. package/dist/react-sdk/scene-control-elements/create-selection-hotspot.js +1 -0
  657. package/dist/react-sdk/scene-control-elements/create-tool-menu-fab.d.ts +9 -0
  658. package/dist/react-sdk/scene-control-elements/create-tool-menu-fab.js +1 -0
  659. package/dist/react-sdk/scene-control-elements/index.d.ts +11 -0
  660. package/dist/react-sdk/scene-control-elements/index.js +1 -0
  661. package/dist/react-sdk/scene-control-elements/scene-control-tooltip-visibility.d.ts +5 -0
  662. package/dist/react-sdk/scene-control-elements/scene-control-tooltip-visibility.js +1 -0
  663. package/dist/react-sdk/session/NotAuthenticatedPage.d.ts +4 -0
  664. package/dist/react-sdk/session/NotAuthenticatedPage.js +1 -1
  665. package/dist/ui-sdk/responsive-application/ResponsiveApplicationProvider.d.ts +9 -0
  666. package/dist/ui-sdk/responsive-application/ResponsiveApplicationProvider.js +1 -1
  667. package/dist/ui-sdk/responsive-application/index.d.ts +1 -0
  668. package/dist/ui-sdk/responsive-application/responsive-state-store.d.ts +57 -0
  669. package/dist/ui-sdk/responsive-application/responsive-state-store.js +1 -0
  670. package/dist/ui-sdk/responsive-application/use-store-responsive-info.d.ts +7 -0
  671. package/dist/ui-sdk/responsive-application/use-store-responsive-info.js +1 -0
  672. package/dist/ui-sdk/theme/types.d.ts +1 -1
  673. package/package.json +19 -14
  674. package/schema/domain-spec.json +86 -8
  675. package/dist/application-spec/generate-application/code/templates/nvmrc.d.ts +0 -1
  676. package/dist/application-spec/generate-application/code/templates/nvmrc.js +0 -2
  677. package/dist/application-spec/generate-application/code/templates/package-json.d.ts +0 -10
  678. package/dist/application-spec/generate-application/code/templates/package-json.js +0 -1
  679. package/dist/configurator/common/use-finalize-action.js +0 -1
  680. package/dist/configurator/ui/assistant/entity-link/entity-link-target.d.ts +0 -5
  681. package/dist/configurator/ui/assistant/entity-link/entity-link-target.js +0 -1
  682. package/dist/configurator/ui/phoenix-layout-elements/language/use-locale-options.d.ts +0 -4
  683. package/dist/configurator/ui/phoenix-layout-elements/language/use-locale-options.js +0 -1
  684. package/dist/configurator/ui/phoenix-layout-elements/measurements/use-measurements-visibility.d.ts +0 -4
  685. package/dist/configurator/ui/phoenix-layout-elements/measurements/use-measurements-visibility.js +0 -1
  686. package/dist/phoenix/commands/generate-project-files.d.ts +0 -6
  687. package/dist/phoenix/commands/generate-project-files.js +0 -1
  688. /package/dist/{configurator/common → react-sdk/application-runtime/common-services/analytics}/frontend-analytics.js +0 -0
@@ -1,6 +1,6 @@
1
1
  # Custom Layout
2
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. On a phone the panel becomes a sheet at the bottom, and a button on the table's edge offers the finishes right where they apply. 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.
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. On a phone the panel becomes a sheet at the bottom, and a button on the table's edge offers the finishes right where they apply, and the layout's own buttons switch between the whole table and a close-up of its edge. 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
4
 
5
5
  - [Choose this approach](#choose-this-approach)
6
6
  - [Register the layout](#register-the-layout)
@@ -13,6 +13,7 @@ Make the configurator look like the brand's own product page. A furniture shop w
13
13
  - [Serve read mode](#serve-read-mode)
14
14
  - [Fit a phone](#fit-a-phone)
15
15
  - [Put a control on the product](#put-a-control-on-the-product)
16
+ - [Control the scene](#control-the-scene)
16
17
  - [The spec the layout reads](#the-spec-the-layout-reads)
17
18
  - [Try the example](#try-the-example)
18
19
  - [Test cases](#test-cases)
@@ -44,6 +45,7 @@ import { BottomSheet } from '../_shared/BottomSheet.js'
44
45
  import { FullscreenToggle } from '../_shared/FullscreenToggle.js'
45
46
  import { MessageToast } from '../_shared/MessageToast.js'
46
47
  import { ProductPanel } from '../_shared/ProductPanel.js'
48
+ import { SceneControls } from '../_shared/SceneControls.js'
47
49
 
48
50
  const GUTTER = 24
49
51
  const PANEL_WIDTH = 380
@@ -122,14 +124,26 @@ const ConfiguratorLayout = () => {
122
124
  sx={{
123
125
  position: 'absolute',
124
126
  pointerEvents: 'auto',
125
- // Desktop: bottom left. Phone: at the top beside the fullscreen button, clear of the sheet's handle.
127
+ // Desktop: bottom left, above the row of view controls. Phone: at the top beside the fullscreen button,
128
+ // clear of the sheet's handle and the view controls.
126
129
  ...(isDesktop
127
- ? { insetBlockEnd: GUTTER, insetInlineStart: GUTTER }
130
+ ? { insetBlockEnd: 2 * GUTTER + TOUCH_TARGET, insetInlineStart: GUTTER }
128
131
  : { insetBlockStart: gutter, insetInline: `${gutter}px ${2 * gutter + TOUCH_TARGET}px` }),
129
132
  }}
130
133
  >
131
134
  <MessageToast />
132
135
  </Box>
136
+ {/* A phone in fullscreen keeps only the reset, as the built-in layout does. Below 1024 pixels (`tablet`) the
137
+ free area beside the panel is narrow, so the reset shows only its icon there too. */}
138
+ <Box
139
+ component="div"
140
+ sx={{ position: 'absolute', insetBlockEnd: gutter, insetInlineEnd: gutter, pointerEvents: 'auto' }}
141
+ >
142
+ <SceneControls
143
+ compact={!isDesktop || (viewports?.includes('tablet') ?? false)}
144
+ resetOnly={!isDesktop && isFullscreen}
145
+ />
146
+ </Box>
133
147
  </Box>
134
148
  )}
135
149
 
@@ -150,7 +164,7 @@ The components it uses live in `src/_shared/`, which Phoenix does not import by
150
164
  ## What the layout has to do
151
165
 
152
166
  - **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`.
153
- - **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`.
167
+ - **Mount the shared canvas.** It renders the scene, and the app loader stays on screen until the scene has loaded. A layout without a canvas is not held by the loader: it leaves once the configuration is up.
154
168
  - **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.
155
169
  - **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, or above the sheet on a phone. 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.
156
170
  - **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.
@@ -319,6 +333,9 @@ export const ProductPanel = ({ collapsed = false, inSheet = false }: ProductPane
319
333
  | `phx.frontend.useComponents({ componentTypes: [finalizeActionComponent] })` | The spec's `finalizeAction` components; the panel offers the primary one in its review step. `finalizeActionComponent` comes from `@salsita-ai/sdk/domain`. |
320
334
  | `phx.frontend.useFinalizeAction(handler)` | Run the finalize action's handler, with its pending state, its error and whether finalizing is possible; see [Request a quote](#request-a-quote). |
321
335
  | `phx.frontend.useIsFullscreenActive()` and `phx.frontend.useSetFullscreen()` | Read the fullscreen flag, and set it from the layout's own button. |
336
+ | `phx.frontend.useActiveViewState()` and `phx.frontend.useSetViewState()` | Read the active view state, one of the spec's `viewStates`, to mark the active view button, and make another one active; see [Control the scene](#control-the-scene). |
337
+ | `phx.frontend.useResetCamera()` | Move the camera back to the framing of the active camera, undoing the customer's orbit, pan and zoom. |
338
+ | `phx.frontend.useUndoRedo()` | Not used here: whether there is a change to undo or redo, and `undo` and `redo`, for a layout's own undo and redo buttons; see [Known gaps](#known-gaps). |
322
339
  | `useActiveViewports()` from `@salsita-ai/sdk/react` | The width classes of the configurator's container, or `null` before it is measured; the layout renders its phone arrangement unless it includes `desktop`, see [Fit a phone](#fit-a-phone). |
323
340
  | `phx.frontend.useConfiguratorMessages(onMessage)` | Receive violations, side-effect hints and errors one by one, with their text resolved, for the layout's own toast; see [Show messages](#show-messages). |
324
341
  | `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`. |
@@ -524,7 +541,7 @@ The button stays in the free area in both states, so the way back is always wher
524
541
 
525
542
  ## Show messages
526
543
 
527
- When a change is rejected because it breaks an invariant, when a committed change carries a hint, or when an error is thrown while a change is validated, the configurator has a message for the customer. `phx.frontend.useConfiguratorMessages(onMessage)` calls `onMessage` once for each, with the text already in the customer's language, and the layout shows it its own way. Here a toast shows a message for six seconds, colored by its severity, at the bottom of the free area on a desktop and at its top on a phone:
544
+ When a change is rejected because it breaks an invariant, when a committed change carries a hint, when an error is thrown while a change is validated, or when saving the configuration fails and later succeeds again, the configurator has a message for the customer. `phx.frontend.useConfiguratorMessages(onMessage)` calls `onMessage` once for each, with the text already in the customer's language, and the layout shows it its own way. Here a toast shows a message for six seconds, colored by its severity, at the bottom left of the free area above the view controls on a desktop, and at its top on a phone:
528
545
 
529
546
  ```tsx
530
547
  import { Alert } from '@mui/material'
@@ -543,7 +560,7 @@ const severityOf = (message: ConfiguratorMessage) => {
543
560
  return VIOLATION_SEVERITY[message.violation.severity]
544
561
  }
545
562
 
546
- return message.kind === 'error' ? 'error' : 'info'
563
+ return message.kind === 'error' || message.kind === 'saveError' ? 'error' : 'info'
547
564
  }
548
565
 
549
566
  export const MessageToast = () => {
@@ -580,7 +597,7 @@ export const MessageToast = () => {
580
597
  }
581
598
  ```
582
599
 
583
- The hook takes a new function on every render without missing a message, so passing the state setter, or an inline function, is fine. `message.kind` is `'violation'`, `'sideEffect'` or `'error'`; a violation also carries `entityId` and the `violation` itself, with its `severity`. A rejected change brings one message for each violation of the rejected state, including notices and warnings that were already present, so the toast keeps the most severe message while it is shown instead of letting a later notice replace the reason for the rejection. The layout mounts the toast in the safe-area element, which sets `pointerEvents: 'none'`, so the toast's wrapper switches pointer events back on for the close button.
600
+ The hook takes a new function on every render without missing a message, so passing the state setter, or an inline function, is fine. `message.kind` is `'violation'`, `'sideEffect'`, `'error'`, `'saveError'` or `'saveRecovery'`; the toast shows an error and a failed save as errors, a hint and the save that succeeded again as information. A violation also carries `entityId` and the `violation` itself, with its `severity`. A rejected change brings one message for each violation of the rejected state, including notices and warnings that were already present, so the toast keeps the most severe message while it is shown instead of letting a later notice replace the reason for the rejection. The layout mounts the toast in the safe-area element, which sets `pointerEvents: 'none'`, so the toast's wrapper switches pointer events back on for the close button.
584
601
 
585
602
  To give the toast something to show, the spec registers one transformer. Choosing **Tree trunk** keeps the change and adds a hint to it, which arrives as a `sideEffect` message:
586
603
 
@@ -603,7 +620,7 @@ export default phx.frontend.transformerBuilder.when
603
620
  .build('tree-trunk-delivery')
604
621
  ```
605
622
 
606
- [Configurator Interface → Loaded Configuration UI](?path=/docs/phoenix-configurator-interface--docs#loaded-configuration-ui) lists the messages the hook does not deliver: a failure to save, errors of the built-in finalize and other actions, and preset errors stay snackbars.
623
+ [Configurator Interface → Loaded Configuration UI](?path=/docs/phoenix-configurator-interface--docs#loaded-configuration-ui) lists the messages the hook does not deliver: errors of the built-in finalize and other actions stay snackbars, and a failure to start from a preset is raised on the preset screen.
607
624
 
608
625
  ## Request a quote
609
626
 
@@ -1015,9 +1032,156 @@ export default phx.frontend.createCustomPhoenixEntityElement('EdgeFinishHotspot'
1015
1032
 
1016
1033
  [Html Hotspots](?path=/docs/controls-scene-html-hotspots--docs) describes the component and its other properties.
1017
1034
 
1035
+ The SDK's own controls on the product, such as `sceneEntityAddFab` and `sceneEntitySelectHotspot`, keep the SDK's look in a project layout too. Each is rendered through an entity element of its own name, so a project gives it the brand's look by registering that name, for example with `phx.frontend.createAddEntityFab`; see [Configurator Interface → In-Scene Controls](?path=/docs/phoenix-configurator-interface--docs#in-scene-controls). `htmlHotspot` is for a control the SDK has none of, like this one.
1036
+
1037
+ ## Control the scene
1038
+
1039
+ The four finishes differ by a few millimetres on a table two metres long, so from the default distance the difference is hard to judge. The layout offers two views, **Whole table** and **Edge close-up**, a close and low look at a corner of the top, and a **Reset view** button that brings back the framing after the customer has orbited, panned or zoomed.
1040
+
1041
+ **Views are view states.** The spec lists them, and each camera says by its `$filter` in which view states and at which widths it applies. The two close-up cameras have the highest priorities and apply only in the `edge` view state, the desktop one with `desktop` and the phone one with `mobile`, a little farther away. In the `overview` view state, the first in the list and so the initial one, only the two whole-table cameras of [Fit a phone](#fit-a-phone) apply. A camera always looks at the middle of the table, so the close-up shows the near corner, where the edge profile is seen on both sides:
1042
+
1043
+ ```yaml
1044
+ viewStates:
1045
+ - overview
1046
+ - edge
1047
+
1048
+ components:
1049
+ Table:
1050
+ fitRootPerspectiveCamera:
1051
+ edge:
1052
+ priority: 4
1053
+ fov: 35
1054
+ near: 100
1055
+ far: 10000
1056
+ minDistance: 800
1057
+ maxDistance: 9000
1058
+ distance: 2000
1059
+ azimuthAngle: 0.5
1060
+ polarAngle: 1.15
1061
+ fitMeshChanges: true
1062
+ $filter:
1063
+ viewports: [desktop]
1064
+ viewStates: [edge]
1065
+ edgePhone:
1066
+ priority: 3
1067
+ fov: 35
1068
+ near: 100
1069
+ far: 10000
1070
+ minDistance: 800
1071
+ maxDistance: 12000
1072
+ distance: 3000
1073
+ azimuthAngle: 0.5
1074
+ polarAngle: 1.15
1075
+ fitMeshChanges: true
1076
+ $filter:
1077
+ viewports: [mobile]
1078
+ viewStates: [edge]
1079
+ ```
1080
+
1081
+ **The buttons.** `phx.frontend.useActiveViewState()` returns the active view state and `phx.frontend.useSetViewState()` a function that makes another one active; the camera then moves to the camera of that view state. `phx.frontend.useResetCamera()` returns a function that moves the camera back to the framing of the active camera, the whole table or the close-up:
1082
+
1083
+ ```tsx
1084
+ import { Box, Button, Tooltip } from '@mui/material'
1085
+
1086
+ import { phx } from '../../.phoenix/phx.js'
1087
+
1088
+ // The spec's view states, each with the label of the button that shows it
1089
+ const VIEWS = [
1090
+ { state: 'overview', label: 'Whole table' },
1091
+ { state: 'edge', label: 'Edge close-up' },
1092
+ ] as const
1093
+
1094
+ const RESET_ICON = 'M4 12a8 8 0 1 0 2.4-5.7M4 4v4h4'
1095
+
1096
+ const SURFACE_SX = {
1097
+ borderRadius: 999,
1098
+ bgcolor: 'background.paper',
1099
+ boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',
1100
+ } as const
1101
+
1102
+ const BUTTON_SX = {
1103
+ minBlockSize: 44,
1104
+ minInlineSize: 44,
1105
+ borderRadius: 999,
1106
+ textTransform: 'none',
1107
+ fontWeight: 600,
1108
+ whiteSpace: 'nowrap',
1109
+ } as const
1110
+
1111
+ interface SceneControlsProps {
1112
+ // The reset button shows only its icon, with its label as tooltip and accessible name
1113
+ readonly compact?: boolean
1114
+ // Only the reset button, without the view buttons
1115
+ readonly resetOnly?: boolean
1116
+ }
1117
+
1118
+ // The layout's own camera controls: one button per view state of the spec, and a reset that undoes an orbit
1119
+ export const SceneControls = ({ compact = false, resetOnly = false }: SceneControlsProps) => {
1120
+ const activeView = phx.frontend.useActiveViewState()
1121
+ const setViewState = phx.frontend.useSetViewState()
1122
+ const resetCamera = phx.frontend.useResetCamera()
1123
+ const resetIcon = (
1124
+ <svg viewBox="0 0 24 24" width={20} height={20} fill="none" stroke="currentColor" strokeWidth={2}>
1125
+ <path d={RESET_ICON} />
1126
+ </svg>
1127
+ )
1128
+
1129
+ return (
1130
+ <Box component="div" sx={{ display: 'flex', gap: 1 }}>
1131
+ {!resetOnly && (
1132
+ <Box component="div" role="group" aria-label="View" sx={{ ...SURFACE_SX, display: 'flex' }}>
1133
+ {VIEWS.map(view => {
1134
+ const isActive = activeView === view.state
1135
+
1136
+ return (
1137
+ <Button
1138
+ key={view.state}
1139
+ aria-pressed={isActive}
1140
+ onClick={() => setViewState(view.state)}
1141
+ sx={{
1142
+ ...BUTTON_SX,
1143
+ paddingInline: 2,
1144
+ bgcolor: isActive ? 'text.primary' : 'transparent',
1145
+ color: isActive ? 'background.paper' : 'text.primary',
1146
+ '&:hover': { bgcolor: isActive ? 'text.primary' : 'action.hover' },
1147
+ }}
1148
+ >
1149
+ {view.label}
1150
+ </Button>
1151
+ )
1152
+ })}
1153
+ </Box>
1154
+ )}
1155
+ <Tooltip title={compact ? 'Reset view' : ''}>
1156
+ <Button
1157
+ onClick={resetCamera}
1158
+ aria-label={compact ? 'Reset view' : undefined}
1159
+ startIcon={compact ? undefined : resetIcon}
1160
+ sx={{
1161
+ ...SURFACE_SX,
1162
+ ...BUTTON_SX,
1163
+ paddingInline: compact ? 0 : 2,
1164
+ color: 'text.primary',
1165
+ '&:hover': { bgcolor: 'background.paper', boxShadow: '0 6px 20px rgba(0, 0, 0, 0.18)' },
1166
+ }}
1167
+ >
1168
+ {compact ? resetIcon : 'Reset view'}
1169
+ </Button>
1170
+ </Tooltip>
1171
+ </Box>
1172
+ )
1173
+ }
1174
+ ```
1175
+
1176
+ - The view buttons are a group with `aria-pressed`, so a screen reader announces which view is active, and the active one is drawn dark, not only in another colour.
1177
+ - On a desktop the controls sit at the bottom right of the free area and the toast above its bottom left; on a phone they sit at the bottom of the free area, just above the sheet. On a phone, and on a desktop arrangement below 1024 pixels, where `tablet` is also active and the free area beside the panel is narrow, **Reset view** shows only its icon, with its label as tooltip and accessible name.
1178
+ - In fullscreen the controls stay on a desktop. On a phone the view buttons are hidden and **Reset view** stays, as [Interaction Modes](?path=/docs/ux-guidelines-interaction-modes--docs#full-screen-preview) describes for the built-in layout: on a phone the canvas is small and the product comes first, and the way back to the framed product is still needed after an orbit.
1179
+ - The controls stay in the review step and in read mode: changing the view changes nothing in the configuration, and a viewer may look at the product as closely as the customer.
1180
+ - The hooks need no `viewControls` component. That component configures the built-in layout's view controls and has no effect here.
1181
+
1018
1182
  ## The spec the layout reads
1019
1183
 
1020
- The layout reads four components of the root entity and its navigation states; the scene components are in the complete implementation below.
1184
+ The layout reads four components of the root entity and its navigation and view states; the scene components are in the complete implementation below. `SceneControls` names the view states `overview` and `edge` in its code, so they must match the spec's `viewStates`.
1021
1185
 
1022
1186
  ```yaml
1023
1187
  navigationStates:
@@ -1025,6 +1189,10 @@ navigationStates:
1025
1189
  - checkout
1026
1190
  - requested
1027
1191
 
1192
+ viewStates:
1193
+ - overview
1194
+ - edge
1195
+
1028
1196
  components:
1029
1197
  Table:
1030
1198
  detail:
@@ -1077,7 +1245,7 @@ The same layout in a frame 390 pixels wide, as on a phone. Opened on its own fro
1077
1245
 
1078
1246
  - The panel is on the left and the table is centred in the area to the right of it, not in the whole canvas.
1079
1247
  - 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.
1080
- - Choosing **Tree trunk** also shows "Tree trunk edges are cut by hand, so delivery takes three weeks longer." at the bottom of the free area, until its close button is clicked or six seconds pass. Choosing another finish shows nothing.
1248
+ - Choosing **Tree trunk** also shows "Tree trunk edges are cut by hand, so delivery takes three weeks longer." at the bottom left of the free area, above the view controls, until its close button is clicked or six seconds pass. Choosing another finish shows nothing.
1081
1249
  - Tab reaches the selected card, and the arrow keys move the selection to the next or previous card.
1082
1250
  - Dragging in the area to the right of the panel orbits the camera.
1083
1251
  - **Review and request a quote** replaces the cards with the chosen finish and offers **Request a quote**; **Back to the configuration** brings the cards back.
@@ -1092,14 +1260,18 @@ The same layout in a frame 390 pixels wide, as on a phone. Opened on its own fro
1092
1260
  - On the phone, the review step, **Request a quote** and the thank-you message work with the sheet collapsed and open.
1093
1261
  - On the phone, choosing **Tree trunk** shows the hint at the top of the free area, beside the fullscreen button.
1094
1262
  - On the phone, the fullscreen button removes the sheet and the table moves to the centre of the canvas; pressing it again brings the sheet back in the position it had.
1263
+ - **Edge close-up** moves the camera close to the near corner of the top, where the edge profile shows; the button is drawn dark and the other light. **Whole table** returns to the whole table.
1264
+ - After dragging in the free area to orbit the table, **Reset view** returns to the framing of the active view, the whole table or the close-up.
1265
+ - The view buttons and **Reset view** sit at the bottom right of the free area on a desktop and just above the sheet on a phone, and overlap neither the panel, the sheet, the button on the edge nor the toast.
1266
+ - In fullscreen the view controls stay on a desktop. On a phone the view buttons are hidden and **Reset view** stays; after an orbit it restores the framing.
1095
1267
 
1096
1268
  ## Known gaps
1097
1269
 
1098
1270
  A project layout has only what it renders. This one leaves out the following, each of which a product may need. [Layout Slots](?path=/docs/phoenix-layout-slots--docs) describes every `LayoutSlots` member named here.
1099
1271
 
1100
- - **Messages that stay snackbars.** The toast shows violations, side effects and errors, and the finalize button shows its own error. A failure to save the configuration is still raised as a snackbar, which renders into `LayoutSlots.DesktopSnackbarsRoot`; this layout mounts no snackbar root, so it appears outside the configurator. A layout that wants it inside mounts the root.
1101
- - **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.
1102
- - **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. Nor does this layout build view buttons or a camera reset of its own.
1272
+ - **Messages that stay snackbars.** The toast shows violations, side effects, errors and failed saves, and the finalize button shows its own error. Two kinds of message stay snackbars. An error of a built-in action, such as one from `LayoutSlots.DesktopToolbar`, renders into `LayoutSlots.DesktopSnackbarsRoot`; this layout mounts neither, and a layout that mounts such an action mounts the root too, or the snackbar appears outside the configurator. A failure to start from a preset appears on the preset screen, before this layout mounts; a project replaces that screen with `phx.frontend.createPresetUi`, see [Configurator Interface → Preset UI](?path=/docs/phoenix-configurator-interface--docs#preset-ui).
1273
+ - **Toolbar actions.** Undo and redo, 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: `phx.frontend.useUndoRedo()`, `useMeasurements()`, `useShareLinks()` and `useLocaleSwitch()` serve single actions, pushing the same analytics events as the built-in buttons; see [Configurator Interface → Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout).
1274
+ - **The spec's 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 the spec's `viewControls` and `toolControls` do not appear. Its views come from its own buttons instead, see [Control the scene](#control-the-scene), and it has no tool modes.
1103
1275
  - **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`.
1104
1276
  - **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.
1105
1277
  - **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`.
@@ -1158,6 +1330,10 @@ navigationStates:
1158
1330
  - checkout
1159
1331
  - requested
1160
1332
 
1333
+ viewStates:
1334
+ - overview
1335
+ - edge
1336
+
1161
1337
  components:
1162
1338
  Table:
1163
1339
  detail:
@@ -1229,6 +1405,34 @@ components:
1229
1405
  fitMeshChanges: true
1230
1406
  $filter:
1231
1407
  viewports: [mobile]
1408
+ edge:
1409
+ priority: 4
1410
+ fov: 35
1411
+ near: 100
1412
+ far: 10000
1413
+ minDistance: 800
1414
+ maxDistance: 9000
1415
+ distance: 2000
1416
+ azimuthAngle: 0.5
1417
+ polarAngle: 1.15
1418
+ fitMeshChanges: true
1419
+ $filter:
1420
+ viewports: [desktop]
1421
+ viewStates: [edge]
1422
+ edgePhone:
1423
+ priority: 3
1424
+ fov: 35
1425
+ near: 100
1426
+ far: 10000
1427
+ minDistance: 800
1428
+ maxDistance: 12000
1429
+ distance: 3000
1430
+ azimuthAngle: 0.5
1431
+ polarAngle: 1.15
1432
+ fitMeshChanges: true
1433
+ $filter:
1434
+ viewports: [mobile]
1435
+ viewStates: [edge]
1232
1436
  sceneEntityRemoteObject:
1233
1437
  top:
1234
1438
  fileUrl: /models/tables.gltf
@@ -1645,7 +1849,7 @@ const severityOf = (message: ConfiguratorMessage) => {
1645
1849
  return VIOLATION_SEVERITY[message.violation.severity]
1646
1850
  }
1647
1851
 
1648
- return message.kind === 'error' ? 'error' : 'info'
1852
+ return message.kind === 'error' || message.kind === 'saveError' ? 'error' : 'info'
1649
1853
  }
1650
1854
 
1651
1855
  export const MessageToast = () => {
@@ -1879,6 +2083,101 @@ export const ReviewActions = ({ handler, label, onBack }: ReviewActionsProps) =>
1879
2083
  }
1880
2084
  ```
1881
2085
 
2086
+ ### ./src/\_shared/SceneControls.tsx
2087
+
2088
+ ```tsx
2089
+ import { Box, Button, Tooltip } from '@mui/material'
2090
+
2091
+ import { phx } from '../../.phoenix/phx.js'
2092
+
2093
+ // The spec's view states, each with the label of the button that shows it
2094
+ const VIEWS = [
2095
+ { state: 'overview', label: 'Whole table' },
2096
+ { state: 'edge', label: 'Edge close-up' },
2097
+ ] as const
2098
+
2099
+ const RESET_ICON = 'M4 12a8 8 0 1 0 2.4-5.7M4 4v4h4'
2100
+
2101
+ const SURFACE_SX = {
2102
+ borderRadius: 999,
2103
+ bgcolor: 'background.paper',
2104
+ boxShadow: '0 4px 16px rgba(0, 0, 0, 0.12)',
2105
+ } as const
2106
+
2107
+ const BUTTON_SX = {
2108
+ minBlockSize: 44,
2109
+ minInlineSize: 44,
2110
+ borderRadius: 999,
2111
+ textTransform: 'none',
2112
+ fontWeight: 600,
2113
+ whiteSpace: 'nowrap',
2114
+ } as const
2115
+
2116
+ interface SceneControlsProps {
2117
+ // The reset button shows only its icon, with its label as tooltip and accessible name
2118
+ readonly compact?: boolean
2119
+ // Only the reset button, without the view buttons
2120
+ readonly resetOnly?: boolean
2121
+ }
2122
+
2123
+ // The layout's own camera controls: one button per view state of the spec, and a reset that undoes an orbit
2124
+ export const SceneControls = ({ compact = false, resetOnly = false }: SceneControlsProps) => {
2125
+ const activeView = phx.frontend.useActiveViewState()
2126
+ const setViewState = phx.frontend.useSetViewState()
2127
+ const resetCamera = phx.frontend.useResetCamera()
2128
+ const resetIcon = (
2129
+ <svg viewBox="0 0 24 24" width={20} height={20} fill="none" stroke="currentColor" strokeWidth={2}>
2130
+ <path d={RESET_ICON} />
2131
+ </svg>
2132
+ )
2133
+
2134
+ return (
2135
+ <Box component="div" sx={{ display: 'flex', gap: 1 }}>
2136
+ {!resetOnly && (
2137
+ <Box component="div" role="group" aria-label="View" sx={{ ...SURFACE_SX, display: 'flex' }}>
2138
+ {VIEWS.map(view => {
2139
+ const isActive = activeView === view.state
2140
+
2141
+ return (
2142
+ <Button
2143
+ key={view.state}
2144
+ aria-pressed={isActive}
2145
+ onClick={() => setViewState(view.state)}
2146
+ sx={{
2147
+ ...BUTTON_SX,
2148
+ paddingInline: 2,
2149
+ bgcolor: isActive ? 'text.primary' : 'transparent',
2150
+ color: isActive ? 'background.paper' : 'text.primary',
2151
+ '&:hover': { bgcolor: isActive ? 'text.primary' : 'action.hover' },
2152
+ }}
2153
+ >
2154
+ {view.label}
2155
+ </Button>
2156
+ )
2157
+ })}
2158
+ </Box>
2159
+ )}
2160
+ <Tooltip title={compact ? 'Reset view' : ''}>
2161
+ <Button
2162
+ onClick={resetCamera}
2163
+ aria-label={compact ? 'Reset view' : undefined}
2164
+ startIcon={compact ? undefined : resetIcon}
2165
+ sx={{
2166
+ ...SURFACE_SX,
2167
+ ...BUTTON_SX,
2168
+ paddingInline: compact ? 0 : 2,
2169
+ color: 'text.primary',
2170
+ '&:hover': { bgcolor: 'background.paper', boxShadow: '0 6px 20px rgba(0, 0, 0, 0.18)' },
2171
+ }}
2172
+ >
2173
+ {compact ? resetIcon : 'Reset view'}
2174
+ </Button>
2175
+ </Tooltip>
2176
+ </Box>
2177
+ )
2178
+ }
2179
+ ```
2180
+
1882
2181
  ### ./src/elements/ConfiguratorLayout.tsx
1883
2182
 
1884
2183
  ```tsx
@@ -1893,6 +2192,7 @@ import { BottomSheet } from '../_shared/BottomSheet.js'
1893
2192
  import { FullscreenToggle } from '../_shared/FullscreenToggle.js'
1894
2193
  import { MessageToast } from '../_shared/MessageToast.js'
1895
2194
  import { ProductPanel } from '../_shared/ProductPanel.js'
2195
+ import { SceneControls } from '../_shared/SceneControls.js'
1896
2196
 
1897
2197
  const GUTTER = 24
1898
2198
  const PANEL_WIDTH = 380
@@ -1971,14 +2271,26 @@ const ConfiguratorLayout = () => {
1971
2271
  sx={{
1972
2272
  position: 'absolute',
1973
2273
  pointerEvents: 'auto',
1974
- // Desktop: bottom left. Phone: at the top beside the fullscreen button, clear of the sheet's handle.
2274
+ // Desktop: bottom left, above the row of view controls. Phone: at the top beside the fullscreen button,
2275
+ // clear of the sheet's handle and the view controls.
1975
2276
  ...(isDesktop
1976
- ? { insetBlockEnd: GUTTER, insetInlineStart: GUTTER }
2277
+ ? { insetBlockEnd: 2 * GUTTER + TOUCH_TARGET, insetInlineStart: GUTTER }
1977
2278
  : { insetBlockStart: gutter, insetInline: `${gutter}px ${2 * gutter + TOUCH_TARGET}px` }),
1978
2279
  }}
1979
2280
  >
1980
2281
  <MessageToast />
1981
2282
  </Box>
2283
+ {/* A phone in fullscreen keeps only the reset, as the built-in layout does. Below 1024 pixels (`tablet`) the
2284
+ free area beside the panel is narrow, so the reset shows only its icon there too. */}
2285
+ <Box
2286
+ component="div"
2287
+ sx={{ position: 'absolute', insetBlockEnd: gutter, insetInlineEnd: gutter, pointerEvents: 'auto' }}
2288
+ >
2289
+ <SceneControls
2290
+ compact={!isDesktop || (viewports?.includes('tablet') ?? false)}
2291
+ resetOnly={!isDesktop && isFullscreen}
2292
+ />
2293
+ </Box>
1982
2294
  </Box>
1983
2295
  )}
1984
2296
 
@@ -12,7 +12,7 @@ Error page that is displayed when needed.
12
12
 
13
13
  ## Code
14
14
 
15
- The `ErrorPage` is provided in the default in the `LoadedConfigurationDetailPage` and `PresetSelectionProvider`.
15
+ In production the configurator renders the layout element `ConfiguratorErrorPage` when an error reaches its error boundary or a configuration cannot be created from the only preset. Its default is a built-in page made with `ErrorPage` from `@salsita-ai/sdk/ui`; this example renders `ErrorPage` directly to show it. A project replaces the page with `phx.frontend.createConfiguratorErrorPage`, see [Configurator Interface → Configurator Error Page](?path=/docs/phoenix-configurator-interface--docs#configurator-error-page), which also lists the cases that still show another page.
16
16
 
17
17
  ## Example
18
18
 
@@ -96,6 +96,8 @@ Key observations:
96
96
  - With `pushToStack: true` and no `canStackOnto`, the new state is always pushed on top
97
97
  - With `canStackOnto: [Legs]`, the stack is "rewound" to `Legs` before pushing - any states after `Legs` are removed
98
98
 
99
+ The hotspot is the entity element `NavigationHotspot`. A project replaces its look by registering its own with `phx.frontend.createNavigationHotspot`, which receives `navigationState` and `onNavigate`, the navigation with the stack rules above. See [Configurator Interface → In-Scene Controls](?path=/docs/phoenix-configurator-interface--docs#in-scene-controls).
100
+
99
101
  ## Example
100
102
 
101
103
  This example demonstrates navigation hotspots with stack behavior. The sidebar shows breadcrumbs displaying the current navigation stack for easier understanding.
@@ -12,7 +12,7 @@ Error page that is displayed when the configuration is not accesible.
12
12
 
13
13
  ## Code
14
14
 
15
- The `NotFoundPage` is provided in the default in the `ConfiguratorRoot` and `ConfiguratorApp`.
15
+ The configurator renders the layout element `ConfigurationNotFoundPage`, whose default is the built-in page, `ConfigurationNotFoundPage` from `@salsita-ai/sdk/react`. This example renders that component directly to show it. A project replaces the page with `phx.frontend.createConfigurationNotFoundPage`, see [Configurator Interface → Configuration Not Found Page](?path=/docs/phoenix-configurator-interface--docs#configuration-not-found-page), which also lists when the page is shown.
16
16
 
17
17
  ## Example
18
18
 
@@ -14,7 +14,7 @@ useAuthHook: true
14
14
  useClerk: true
15
15
  ```
16
16
 
17
- `phoenix sync` then adds `@clerk/clerk-react` as a direct application dependency and generates typed Clerk environment readers. `phoenix deployment:prepare-local` writes the deployment's public `CLERK_PUBLISHABLE_KEY` to `.env.generated`; application source should read it from `phx.frontendEnv`, not hardcode a key.
17
+ `@clerk/clerk-react` then becomes a dependency the project declares: run `phoenix deps` through your package manager (for example `pnpm phoenix deps`) and install to add it, because `phoenix sync`, `dev` and `build` stop while it is missing. `phoenix sync` generates typed Clerk environment readers. In a project on the legacy pipeline (see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)), `phoenix sync` adds the dependency itself. `phoenix deployment:prepare-local` writes the deployment's public `CLERK_PUBLISHABLE_KEY` to `.env.generated`; application source should read it from `phx.frontendEnv`, not hardcode a key.
18
18
 
19
19
  ## Configure the auth webhook
20
20
 
@@ -273,6 +273,12 @@ components:
273
273
 
274
274
  `$bind` is essential for form controls that need to show current state and accept changes, any UI element that both displays and modifies data, and interactive controls like attribute selectors, toggles, sliders, and input fields.
275
275
 
276
+ ### Types of bound values
277
+
278
+ The build checks that the field a `$read` or `$bind` reads fits the prop it is read into, the filter criterion, or, for `$filter: { $read: field }`, the whole filter. A `string` field read into a number prop, a nullable field read into a text, or an array read into a boolean is reported as `COMPONENT_BINDING_TYPE_MISMATCH` at the prop. A field whose schema gives its type only as `tsType` is not checked here. Expressions are checked where their type is settled.
279
+
280
+ A prop or filter criterion that takes an entity id, such as the `value` of `childEntitySelection` or `selectedEntityIds`, cannot hold an id written in YAML: an entity id is a branded type that only comes from the domain state. Bind it to a field or expression that holds the id; a written id is reported as `COMPONENT_STATIC_ENTITY_ID`.
281
+
276
282
  ### `$eval` - Inline Expressions
277
283
 
278
284
  `$eval` allows simple dynamic calculations directly in YAML without defining separate `$expression` implementations in TypeScript. It can appear wherever `$read` is allowed — including in component filter `active` properties — and is mutually exclusive with `$read` on the same property, but both can coexist on the same component instance across different properties.