@salsita-ai/sdk 0.50.0-develop.dfac20c66b → 0.50.0-develop.ea0d8e208d

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 (294) hide show
  1. package/dist/application-spec/generate-application/code/common/index.d.ts +1 -0
  2. package/dist/application-spec/generate-application/code/common/index.js +1 -1
  3. package/dist/application-spec/generate-application/code/common/project-module-list.d.ts +8 -0
  4. package/dist/application-spec/generate-application/code/common/project-module-list.js +3 -0
  5. package/dist/application-spec/generate-application/code/domain-runtime-files.js +1 -1
  6. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  7. package/dist/application-spec/generate-application/code/templates/admin-domain-code.d.ts +1 -2
  8. package/dist/application-spec/generate-application/code/templates/admin-domain-code.js +6 -14
  9. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.d.ts +1 -2
  10. package/dist/application-spec/generate-application/code/templates/admin-frontend-code.js +4 -4
  11. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.d.ts +1 -2
  12. package/dist/application-spec/generate-application/code/templates/configurator-domain-code.js +7 -16
  13. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.d.ts +1 -2
  14. package/dist/application-spec/generate-application/code/templates/configurator-frontend-code.js +7 -9
  15. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.d.ts +2 -2
  16. package/dist/application-spec/generate-application/code/templates/domain-spec/generate-assistant.js +1 -1
  17. package/dist/application-spec/generate-application/code/templates/domain-spec.js +4 -4
  18. package/dist/application-spec/generate-application/code/templates/domain.js +3 -3
  19. package/dist/application-spec/generate-application/code/templates/index.d.ts +1 -0
  20. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  21. package/dist/application-spec/generate-application/code/templates/skills/agents-md.js +1 -1
  22. package/dist/application-spec/generate-application/code/templates/skills/phoenix-cli-skill.js +1 -1
  23. package/dist/application-spec/generate-application/code/templates/skills/phoenix-create-configurator-skill.js +41 -13
  24. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +1 -1
  25. package/dist/application-spec/generate-application/code/templates/skills/phoenix-review-skill.js +2 -2
  26. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  27. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.d.ts +1 -0
  28. package/dist/application-spec/generate-application/code/templates/skills/phoenix-variants-skill.js +6 -0
  29. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +30 -3
  30. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +19 -5
  31. package/dist/application-spec/generate-application/code/templates/webhook-builders.js +8 -4
  32. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.d.ts +4 -3
  33. package/dist/application-spec/generate-application/runtime/sections/assistant-runtime.js +1 -1
  34. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.d.ts +3 -8
  35. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-field-type.js +1 -1
  36. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.d.ts +9 -43
  37. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  38. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-server-settings.d.ts +2 -2
  39. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant.d.ts +5 -21
  40. package/dist/client/phoenix-api.d.ts +58 -30
  41. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  42. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +158 -13
  43. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  44. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  45. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  46. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +8 -3
  47. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  48. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
  49. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  50. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +16 -1
  51. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  52. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
  53. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
  54. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  55. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -0
  56. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  57. package/dist/configurator/common/frontend-analytics.d.ts +21 -21
  58. package/dist/configurator/index.d.ts +0 -1
  59. package/dist/configurator/index.js +1 -1
  60. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  61. package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
  62. package/dist/configurator/ui/assistant/AssistantChips.d.ts +11 -0
  63. package/dist/configurator/ui/assistant/AssistantChips.js +1 -0
  64. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +6 -0
  65. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -0
  66. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -0
  67. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -0
  68. package/dist/configurator/ui/assistant/AssistantPanel.d.ts +11 -0
  69. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -0
  70. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -0
  71. package/dist/configurator/ui/assistant/AssistantThread.js +1 -0
  72. package/dist/configurator/ui/assistant/assistant-failure.d.ts +18 -0
  73. package/dist/configurator/ui/assistant/assistant-failure.js +1 -0
  74. package/dist/configurator/ui/assistant/index.d.ts +2 -0
  75. package/dist/configurator/ui/assistant/index.js +1 -0
  76. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +6 -0
  77. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -0
  78. package/dist/configurator/ui/assistant/theme.d.ts +2 -0
  79. package/dist/configurator/ui/assistant/theme.js +1 -0
  80. package/dist/configurator/ui/assistant/thread-items.d.ts +37 -0
  81. package/dist/configurator/ui/assistant/thread-items.js +1 -0
  82. package/dist/configurator/ui/assistant/tool-chip.d.ts +44 -0
  83. package/dist/configurator/ui/assistant/tool-chip.js +1 -0
  84. package/dist/configurator/ui/assistant/use-follow-stream.d.ts +17 -0
  85. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -0
  86. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
  87. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
  88. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -5
  89. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.d.ts +2 -0
  90. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  91. package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
  92. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +10 -0
  93. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -0
  94. package/dist/configurator/ui/phoenix-layout-elements/index.d.ts +1 -0
  95. package/dist/configurator/ui/phoenix-layout-elements/index.js +1 -1
  96. package/dist/docs/complex-use-cases/filtered-controls-with-fix-dialog.mdx +84 -98
  97. package/dist/docs/complex-use-cases/navigation-reset-selection.mdx +18 -12
  98. package/dist/docs/index.json +1 -1
  99. package/dist/docs/layouts/custom-price.mdx +14 -16
  100. package/dist/docs/layouts/sidebar/tabs.mdx +24 -21
  101. package/dist/docs/layouts/toolbar.mdx +6 -0
  102. package/dist/docs/other-features/domain-actions.mdx +1 -1
  103. package/dist/docs/other-features/side-effects.mdx +68 -34
  104. package/dist/docs/other-features/transformers.mdx +1 -1
  105. package/dist/docs/phoenix/admin.mdx +9 -24
  106. package/dist/docs/phoenix/localization.mdx +3 -22
  107. package/dist/docs/phoenix/phoenix-cli.mdx +81 -2
  108. package/dist/docs/phoenix/project-structure.mdx +9 -2
  109. package/dist/docs/phoenix/sdk-builder-workflow.mdx +4 -3
  110. package/dist/docs/recipes-and-delete/recipe-hierarchy-selection.mdx +15 -13
  111. package/dist/docs/relations/hierarchy.mdx +13 -2
  112. package/dist/domain/actions/action-factory.d.ts +3 -2
  113. package/dist/domain/application/application-config.d.ts +25 -75
  114. package/dist/domain/application/assistant/assistant-manifest.d.ts +61 -0
  115. package/dist/domain/application/assistant/assistant-resolved-manifest.d.ts +95 -0
  116. package/dist/domain/application/assistant/assistant-value-type.d.ts +9 -0
  117. package/dist/domain/application/assistant/assistant-value-type.js +1 -0
  118. package/dist/domain/application/assistant/build-assistant-manifest.d.ts +4 -0
  119. package/dist/domain/application/assistant/build-assistant-manifest.js +1 -0
  120. package/dist/{phoenix/application-spec → domain/application/assistant}/generate-assistant-prompt.d.ts +6 -5
  121. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -0
  122. package/dist/domain/application/assistant/index.d.ts +4 -0
  123. package/dist/domain/application/assistant/index.js +1 -0
  124. package/dist/domain/application/assistant-field-options.d.ts +1 -1
  125. package/dist/domain/application/assistant-mutations.d.ts +1 -1
  126. package/dist/domain/application/assistant-recipe-groups.d.ts +1 -1
  127. package/dist/domain/application/configurator-builder.d.ts +33 -18
  128. package/dist/domain/application/configurator-builder.js +1 -1
  129. package/dist/domain/application/element-registration.d.ts +5 -0
  130. package/dist/domain/application/element-registration.js +1 -1
  131. package/dist/domain/application/handler-registration.d.ts +5 -0
  132. package/dist/domain/application/handler-registration.js +1 -1
  133. package/dist/domain/application/index.d.ts +5 -4
  134. package/dist/domain/application/index.js +1 -1
  135. package/dist/domain/application/resolve-imported-transformers.d.ts +11 -1
  136. package/dist/domain/application/resolve-imported-transformers.js +1 -1
  137. package/dist/domain/components/domain-component-optic.d.ts +3 -0
  138. package/dist/domain/components/domain-component-optic.js +2 -2
  139. package/dist/domain/components/system-component-builder.js +1 -1
  140. package/dist/domain/components/updates.d.ts +16 -0
  141. package/dist/domain/core/action.d.ts +1 -1
  142. package/dist/domain/core/component.d.ts +1 -1
  143. package/dist/domain/core/domain-factory.js +1 -1
  144. package/dist/domain/core/index.d.ts +1 -3
  145. package/dist/domain/core/index.js +1 -1
  146. package/dist/domain/core/reflection.d.ts +1 -1
  147. package/dist/domain/core/reflection.js +1 -1
  148. package/dist/domain/core/schema/enhanced-json-schema.js +1 -0
  149. package/dist/domain/core/schema/extended-schema-validator.js +1 -0
  150. package/dist/domain/core/schema/index.d.ts +3 -0
  151. package/dist/domain/core/schema/index.js +1 -0
  152. package/dist/domain/core/schema/schema-validator.js +1 -0
  153. package/dist/domain/domain-builder.d.ts +10 -1
  154. package/dist/domain/domain-builder.js +1 -1
  155. package/dist/domain/domain-context/action-system/action-system.js +1 -1
  156. package/dist/domain/domain-context/index.d.ts +1 -1
  157. package/dist/domain/domain-context/store-system/store-system.js +1 -1
  158. package/dist/domain/domain-context/transformers/chain-builder.d.ts +1 -1
  159. package/dist/domain/domain-runtime/domain-runtime.d.ts +4 -4
  160. package/dist/domain/domain-runtime/spec/initialize.js +1 -1
  161. package/dist/domain/domain-runtime/spec/selectors.d.ts +2 -2
  162. package/dist/domain/domain-runtime/spec/selectors.js +1 -1
  163. package/dist/domain/domain-runtime/spec/types.d.ts +3 -3
  164. package/dist/domain/index.d.ts +3 -2
  165. package/dist/domain/index.js +1 -1
  166. package/dist/domain/invariants/invariants.d.ts +9 -0
  167. package/dist/domain/invariants/invariants.js +1 -1
  168. package/dist/domain/mocks/create-mock-domain-runtime.d.ts +3 -3
  169. package/dist/domain/mocks/create-mock-domain-runtime.js +1 -1
  170. package/dist/domain/project-modules/index.d.ts +1 -0
  171. package/dist/domain/project-modules/index.js +1 -0
  172. package/dist/domain/project-modules/project-modules.d.ts +41 -0
  173. package/dist/domain/project-modules/project-modules.js +1 -0
  174. package/dist/domain/system-components/common/dimension-indicator-schema.d.ts +1 -1
  175. package/dist/domain/system-components/common/dimension-indicator-schema.js +1 -1
  176. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.d.ts +44 -0
  177. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.js +1 -0
  178. package/dist/domain/system-components/phoenix-layout-elements/index.d.ts +1 -0
  179. package/dist/domain/system-components/phoenix-layout-elements/index.js +1 -1
  180. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.d.ts +2 -1
  181. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.js +1 -1
  182. package/dist/editor/Editor.js +1 -1
  183. package/dist/editor/domain-editors/use-implementation-files.d.ts +7 -6
  184. package/dist/editor/domain-editors/use-implementation-files.js +1 -1
  185. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  186. package/dist/editor/variants/VariantAnswerFooter.d.ts +17 -0
  187. package/dist/editor/variants/VariantAnswerFooter.js +1 -0
  188. package/dist/editor/variants/VariantPreviewHandler.d.ts +6 -0
  189. package/dist/editor/variants/VariantPreviewHandler.js +1 -0
  190. package/dist/editor/variants/variant-preview-styles.d.ts +49 -0
  191. package/dist/editor/variants/variant-preview-styles.js +1 -0
  192. package/dist/i18n/locales/cs/messages.js +1 -1
  193. package/dist/i18n/locales/da/messages.js +1 -1
  194. package/dist/i18n/locales/de/messages.js +1 -1
  195. package/dist/i18n/locales/de-AT/messages.js +1 -1
  196. package/dist/i18n/locales/en/messages.js +1 -1
  197. package/dist/i18n/locales/en-AU/messages.js +1 -1
  198. package/dist/i18n/locales/en-GB/messages.js +1 -1
  199. package/dist/i18n/locales/es/messages.js +1 -1
  200. package/dist/i18n/locales/fr/messages.js +1 -1
  201. package/dist/i18n/locales/hu/messages.js +1 -1
  202. package/dist/i18n/locales/it/messages.js +1 -1
  203. package/dist/i18n/locales/nl/messages.js +1 -1
  204. package/dist/i18n/locales/pl/messages.js +1 -1
  205. package/dist/i18n/locales/pt/messages.js +1 -1
  206. package/dist/i18n/locales/ro/messages.js +1 -1
  207. package/dist/i18n/locales/sk/messages.js +1 -1
  208. package/dist/i18n/locales/tr/messages.js +1 -1
  209. package/dist/legacy/domain-cli/gen/configurator-builder.js +21 -8
  210. package/dist/legacy/domain-cli/utils/cache.d.ts +1 -1
  211. package/dist/legacy/domain-cli/utils/cache.js +1 -1
  212. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +6 -0
  213. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-admin.js +18 -19
  214. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-configurator.js +15 -16
  215. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-admin.js +22 -23
  216. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/frontend-embedded-configurator.js +15 -16
  217. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.d.ts +7 -2
  218. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/generator-shared.js +8 -12
  219. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.d.ts +1 -1
  220. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/index.js +1 -1
  221. package/dist/legacy/phoenix-cli/project-gen/generators/file-templates/webhook-builders.js +7 -7
  222. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  223. package/dist/phoenix/application-spec/resolve-deployment-data.d.ts +4 -3
  224. package/dist/phoenix/application-spec/resolve-deployment-data.js +2 -2
  225. package/dist/phoenix/cli.js +1 -1
  226. package/dist/phoenix/commands/deploy.js +2 -2
  227. package/dist/phoenix/commands/dev.js +5 -5
  228. package/dist/phoenix/commands/index.d.ts +1 -0
  229. package/dist/phoenix/commands/index.js +1 -1
  230. package/dist/phoenix/commands/prepare-deployment-command.js +2 -2
  231. package/dist/phoenix/commands/prepare-local-environment-command.js +1 -1
  232. package/dist/phoenix/commands/story-dev.js +2 -2
  233. package/dist/phoenix/commands/variants.d.ts +35 -0
  234. package/dist/phoenix/commands/variants.js +1 -0
  235. package/dist/phoenix/editor-server/commands-router.d.ts +68 -1
  236. package/dist/phoenix/editor-server/commands-router.js +1 -1
  237. package/dist/phoenix/editor-server/editor-router.d.ts +65 -0
  238. package/dist/phoenix/editor-server/editor-server.d.ts +3 -3
  239. package/dist/phoenix/editor-server/editor-server.js +1 -1
  240. package/dist/phoenix/editor-server/protocol.d.ts +1 -0
  241. package/dist/phoenix/editor-server/spec-router.js +1 -1
  242. package/dist/phoenix/editor-server/trpc.d.ts +3 -0
  243. package/dist/phoenix/services/application-spec-project-watcher.d.ts +13 -2
  244. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  245. package/dist/phoenix/services/index.d.ts +4 -0
  246. package/dist/phoenix/services/index.js +1 -1
  247. package/dist/phoenix/services/phoenix-application.d.ts +21 -0
  248. package/dist/phoenix/services/phoenix-application.js +1 -0
  249. package/dist/phoenix/services/phoenix-store.d.ts +48 -0
  250. package/dist/phoenix/services/phoenix-store.js +1 -0
  251. package/dist/phoenix/services/phx-variant-previews-plugin.d.ts +9 -0
  252. package/dist/phoenix/services/phx-variant-previews-plugin.js +1 -0
  253. package/dist/phoenix/services/prepare-development-environment.js +1 -1
  254. package/dist/phoenix/services/variant-file-session.d.ts +36 -0
  255. package/dist/phoenix/services/variant-file-session.js +1 -0
  256. package/dist/phoenix/services/variant-preview-service.d.ts +80 -0
  257. package/dist/phoenix/services/variant-preview-service.js +1 -0
  258. package/dist/phoenix/services/vite-config.js +1 -1
  259. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
  260. package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
  261. package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
  262. package/dist/react-sdk/application-runtime/hooks/use-domain-application-props.d.ts +5 -2
  263. package/dist/react-sdk/application-runtime/hooks/use-spec.d.ts +1 -1
  264. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.d.ts +1 -1
  265. package/dist/react-sdk/application-runtime/mocks/create-mock-application-runtime.js +1 -1
  266. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.d.ts +4 -4
  267. package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
  268. package/dist/ui-sdk/common/use-viewport-size.js +1 -1
  269. package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
  270. package/dist/ui-sdk/theme/types.d.ts +4 -0
  271. package/dist/webhook/builders/common.d.ts +3 -0
  272. package/dist/webhook/builders/webhook-builder.d.ts +1 -1
  273. package/dist/webhook/builders/webhook-builder.js +1 -1
  274. package/package.json +5 -8
  275. package/schema/domain-spec.json +24 -0
  276. package/dist/configurator/assistant/index.d.ts +0 -1
  277. package/dist/configurator/assistant/index.js +0 -1
  278. package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -20
  279. package/dist/configurator/assistant/use-assistant-chat.js +0 -1
  280. package/dist/domain/core/json-schema.js +0 -1
  281. package/dist/extras/assistant/AssistantChat.d.ts +0 -6
  282. package/dist/extras/assistant/AssistantChat.js +0 -1
  283. package/dist/extras/assistant/index.d.ts +0 -1
  284. package/dist/extras/assistant/index.js +0 -1
  285. package/dist/phoenix/application-spec/generate-assistant-prompt.js +0 -1
  286. /package/dist/domain/{core/enhanced-json-schema.js → application/assistant/assistant-manifest.js} +0 -0
  287. /package/dist/domain/{core/schema-validator.js → application/assistant/assistant-resolved-manifest.js} +0 -0
  288. /package/dist/domain/core/{schema-validator-ajv.d.ts → schema/create-ajv-schema-validator.d.ts} +0 -0
  289. /package/dist/domain/core/{schema-validator-ajv.js → schema/create-ajv-schema-validator.js} +0 -0
  290. /package/dist/domain/core/{schema-validator-csp.d.ts → schema/create-csp-schema-validator.d.ts} +0 -0
  291. /package/dist/domain/core/{schema-validator-csp.js → schema/create-csp-schema-validator.js} +0 -0
  292. /package/dist/domain/core/{enhanced-json-schema.d.ts → schema/enhanced-json-schema.d.ts} +0 -0
  293. /package/dist/domain/core/{json-schema.d.ts → schema/extended-schema-validator.d.ts} +0 -0
  294. /package/dist/domain/core/{schema-validator.d.ts → schema/schema-validator.d.ts} +0 -0
@@ -1,11 +1,11 @@
1
- import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes as e,paperClasses as r,snackbarClasses as d,styled as i,useTheme as n,useThemeProps as s}from"@mui/material";import{AnimatePresence as l,motion as p}from"motion/react";import{useCallback as b,useRef as u}from"react";import{useAccessService as c,useIsFullscreenActive as m}from"#package/react-sdk";import{attrf as h,commonStyles as y,numToPx as g,useInvalidateScrollTimeline as f,useIsEmpty as k,useResponsive as x}from"#package/ui-sdk";import{usePreview as v}from"../../../configurator-context/index.js";import{LayoutSlots as S}from"../slots/index.js";import{DesktopPreview as E}from"./DesktopPreview.js";import{useSceneSafeArea as w}from"./use-scene-safe-area.js";let R="PhxDesktopSidebar",B="minimalist",$="split",C="visible",D="hidden",T={Root:i("div",{name:R,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>[`
1
+ import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes as e,paperClasses as r,snackbarClasses as d,styled as i,useTheme as n,useThemeProps as s}from"@mui/material";import{AnimatePresence as l,motion as p}from"motion/react";import{useCallback as b,useRef as u}from"react";import{useAccessService as c,useIsFullscreenActive as m}from"#package/react-sdk";import{attrf as h,commonStyles as y,numToPx as g,useInvalidateScrollTimeline as f,useIsEmpty as x,useResponsive as k}from"#package/ui-sdk";import{usePreview as v}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as S,AssistantPanel as E,useIsAssistantPanelOpen as w}from"../../assistant/index.js";import{LayoutSlots as R}from"../slots/index.js";import{DesktopPreview as $}from"./DesktopPreview.js";import{useSceneSafeArea as B}from"./use-scene-safe-area.js";let C="PhxDesktopSidebar",D="minimalist",T="split",I="visible",A="hidden",P="assistant",F={Root:i("div",{name:C,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>[`
2
2
  --phx-sidebar-background: ${a.background};
3
3
  --phx-sidebar-border: ${a.border};
4
4
  --phx-sidebar-filter: ${a.filter};
5
5
  --phx-sidebar-padding: ${a.padding};
6
6
  --phx-sidebar-radius: ${a.borderRadius}px;
7
7
  --phx-sidebar-scrollable-indicator-background: ${a.scrollableIndicatorBackground};
8
- `,{borderRadius:"var(--phx-sidebar-radius)",display:"grid",filter:"var(--phx-sidebar-filter)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",inlineSize:a.width,position:"relative","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{"--phx-sidebar-background":"hsl(from gold h s l / 50%)"},[`&[data-sidebar*="${C}"]`]:{opacity:1},[`&[data-sidebar*="${D}"]`]:{opacity:0}}]),Tabs:i("div",{name:R,slot:"tabs",shouldForwardProp:a=>"ownerState"!==a})(({theme:{spacing:a}})=>({insetBlockStart:0,insetInlineEnd:"100%",maxInlineSize:150,paddingInlineEnd:a(2),position:"absolute","&:is(:empty)":{padding:0},[`.${r.root}`]:{boxShadow:"none"}})),Header:i("header",{name:R,slot:"header",shouldForwardProp:a=>"ownerState"!==a})({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockEnd:0,borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",paddingBlock:"calc(0.6 * var(--phx-sidebar-padding))",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{border:0,paddingBlock:0}}),Body:i("div",{name:R,slot:"body",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockStart:0,borderBlockEnd:0,display:"grid",position:"relative",'[data-layout*="slot[sidebar]"]:where(:has([data-sidebar="slot[header]"])) &':{...a.isHeaderEmpty&&{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",paddingBlockStart:"var(--phx-sidebar-padding)"}},'&:has([data-sidebar*="slot[content]"]:empty)':{...a.isContentEmpty&&{paddingBlock:0}},[`[data-sidebar*="${B}"] &`]:{...a.isContentEmpty&&{border:0}},[`[data-sidebar*="${$}"] &`]:{borderBlockEnd:"var(--phx-sidebar-border)",borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",paddingBlockEnd:"var(--phx-sidebar-padding)"}})),Content:i("div",{name:R,slot:"content",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{spacing:t}})=>({...y.layout.normalizeScrollableContainer,alignContent:"start",borderRadius:"inherit",display:"grid",gap:t(3),padding:"var(--phx-sidebar-padding)","@supports (animation-timeline: scroll())":{"&[data-scrollable]":{scrollTimeline:"--phx-sidebar-timeline y","&::after, &::before":{animation:`${y.keyframes.fadeIn} both`,animationTimeline:"--phx-sidebar-timeline",background:"var(--phx-sidebar-scrollable-indicator-background)",backgroundRepeat:"no-repeat",content:'""',display:"block",insetInline:0,opacity:0,pointerEvents:"none",position:"absolute",zIndex:1},"&::after":{animationDirection:"reverse",animationRange:`calc(100% - ${t(4)}) 100%`,borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",insetBlockStart:"50%",insetBlockEnd:0,scale:"1 -1"},"&::before":{animationRange:`0 ${t(4)}`,borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",insetBlockStart:0,insetBlockEnd:"50%"}}},"&:is(:empty)":{paddingBlock:0},'[data-layout*="slot[sidebar]"] &':{...a.isHeaderEmpty&&{paddingBlockStart:0,"&::before":{borderStartStartRadius:0,borderStartEndRadius:0,insetBlockStart:"var(--phx-sidebar-padding)"}}},[`[data-sidebar*="${$}"] &`]:{paddingBlockEnd:0,"&::after":{borderEndStartRadius:0,borderEndEndRadius:0,insetBlockEnd:"var(--phx-sidebar-padding)"}}})),Footer:i("footer",{name:R,slot:"footer",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{palette:t,spacing:o}})=>({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockStart:`1px solid ${t.divider}`,borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",padding:"var(--phx-sidebar-padding)","&:is(:empty)":{border:0,paddingBlock:0},[`[data-sidebar*="${B}"] &`]:{...a.isContentEmpty&&{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit"}},[`[data-sidebar*="${$}"] &`]:{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",marginBlockStart:o(2)}}))};export const PhxDesktopLayoutName="PhxDesktopLayout";let I="PhxDesktopLayout",A=i(p.div,{name:I,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{spacing:t}})=>{let o=e({"0%":{marginInlineEnd:0},"100%":{marginInlineEnd:t(-2)}});return[`
8
+ `,{borderRadius:"var(--phx-sidebar-radius)",display:"grid",filter:"var(--phx-sidebar-filter)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",inlineSize:a.width,position:"relative","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{"--phx-sidebar-background":"hsl(from gold h s l / 50%)"},[`&[data-sidebar*="${I}"]`]:{opacity:1},[`&[data-sidebar*="${A}"]`]:{opacity:0},[`&[data-sidebar*="${P}"] > :not([data-sidebar="${S}"])`]:{visibility:"hidden"}}]),Tabs:i("div",{name:C,slot:"tabs",shouldForwardProp:a=>"ownerState"!==a})(({theme:{spacing:a}})=>({insetBlockStart:0,insetInlineEnd:"100%",maxInlineSize:150,paddingInlineEnd:a(2),position:"absolute","&:is(:empty)":{padding:0},[`.${r.root}`]:{boxShadow:"none"}})),Header:i("header",{name:C,slot:"header",shouldForwardProp:a=>"ownerState"!==a})({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockEnd:0,borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",paddingBlock:"calc(0.6 * var(--phx-sidebar-padding))",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{border:0,paddingBlock:0}}),Body:i("div",{name:C,slot:"body",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a})=>({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockStart:0,borderBlockEnd:0,display:"grid",position:"relative",'[data-layout*="slot[sidebar]"]:where(:has([data-sidebar="slot[header]"])) &':{...a.isHeaderEmpty&&{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",paddingBlockStart:"var(--phx-sidebar-padding)"}},'&:has([data-sidebar*="slot[content]"]:empty)':{...a.isContentEmpty&&{paddingBlock:0}},[`[data-sidebar*="${D}"] &`]:{...a.isContentEmpty&&{border:0}},[`[data-sidebar*="${T}"] &`]:{borderBlockEnd:"var(--phx-sidebar-border)",borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",paddingBlockEnd:"var(--phx-sidebar-padding)"}})),Content:i("div",{name:C,slot:"content",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{spacing:t}})=>({...y.layout.normalizeScrollableContainer,alignContent:"start",borderRadius:"inherit",display:"grid",gap:t(3),padding:"var(--phx-sidebar-padding)","@supports (animation-timeline: scroll())":{"&[data-scrollable]":{scrollTimeline:"--phx-sidebar-timeline y","&::after, &::before":{animation:`${y.keyframes.fadeIn} both`,animationTimeline:"--phx-sidebar-timeline",background:"var(--phx-sidebar-scrollable-indicator-background)",backgroundRepeat:"no-repeat",content:'""',display:"block",insetInline:0,opacity:0,pointerEvents:"none",position:"absolute",zIndex:1},"&::after":{animationDirection:"reverse",animationRange:`calc(100% - ${t(4)}) 100%`,borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",insetBlockStart:"50%",insetBlockEnd:0,scale:"1 -1"},"&::before":{animationRange:`0 ${t(4)}`,borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",insetBlockStart:0,insetBlockEnd:"50%"}}},"&:is(:empty)":{paddingBlock:0},'[data-layout*="slot[sidebar]"] &':{...a.isHeaderEmpty&&{paddingBlockStart:0,"&::before":{borderStartStartRadius:0,borderStartEndRadius:0,insetBlockStart:"var(--phx-sidebar-padding)"}}},[`[data-sidebar*="${T}"] &`]:{paddingBlockEnd:0,"&::after":{borderEndStartRadius:0,borderEndEndRadius:0,insetBlockEnd:"var(--phx-sidebar-padding)"}}})),Footer:i("footer",{name:C,slot:"footer",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{palette:t,spacing:o}})=>({background:"var(--phx-sidebar-background)",border:"var(--phx-sidebar-border)",borderBlockStart:`1px solid ${t.divider}`,borderEndStartRadius:"inherit",borderEndEndRadius:"inherit",padding:"var(--phx-sidebar-padding)","&:is(:empty)":{border:0,paddingBlock:0},[`[data-sidebar*="${D}"] &`]:{...a.isContentEmpty&&{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit"}},[`[data-sidebar*="${T}"] &`]:{borderBlockStart:"var(--phx-sidebar-border)",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",marginBlockStart:o(2)}}))};export const PhxDesktopLayoutName="PhxDesktopLayout";let j="PhxDesktopLayout",z=i(p.div,{name:j,slot:"root",shouldForwardProp:a=>"ownerState"!==a})(({ownerState:a,theme:{spacing:t}})=>{let o=e({"0%":{marginInlineEnd:0},"100%":{marginInlineEnd:t(-2)}});return[`
9
9
  --inspect: off; // 🕹️ inspection mode toggle
10
10
 
11
11
  --phx-layout-sidebar-track-size: ${g(a.sidebarWidth)};
@@ -38,12 +38,12 @@ import{jsx as a,jsxs as t,Fragment as o}from"react/jsx-runtime";import{keyframes
38
38
  [bottom-start]
39
39
  min-content
40
40
  [bottom-end full-end]
41
- `,inset:0,isolation:"isolate",pointerEvents:"none",position:"absolute","@container style(--inspect: on)":{'& > *, & > * > *, [data-layout*="slot[body.footer]"] > *':{outline:"2px solid hsl(from tomato h s l / 50%)"}},'[data-layout*="interactive"]':{"& > *":{pointerEvents:"auto"}},'[data-layout*="slot[header]"]':{gridArea:"top-start / main-start / top-end / sidebar-end"},'[data-layout*="slot[body]"]':{containerType:"size",display:"grid",gridArea:"main",gridRowStart:"top-end",gridTemplateRows:"min-content 1fr min-content"},'[data-layout*="slot[body.top]"]':{gridArea:"1 / 1 / 2 / -1","& > *":{...y.transition.fadeIn}},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"1 / 1 / 3 / -1","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout*="slot[body.bottom]"]':{alignItems:"end",display:"grid",gap:t(2),gridArea:"3 / 1 / 4 / -1",gridTemplateColumns:"minmax(0, auto) minmax(60px, 1fr)",justifyContent:"start",position:"relative",'&:has([data-layout="slot[body.viewControls]"]:empty)':{gap:0,gridTemplateColumns:"repeat(2, auto)"}},'[data-layout="slot[body.toolbar]"]':{animation:`${o} auto linear both`,animationTimeline:"scroll(self inline)",display:"flex",margin:t(-2),overflowX:"scroll",overscrollBehavior:"contain",padding:t(2),scrollbarWidth:"none","&::after":{content:'""'}},'[data-layout="slot[body.toolControls]"]':{insetBlockEnd:`calc(100% + ${t(6)})`,position:"absolute","& > *":{...y.transition.fadeIn,transitionDuration:"300ms"}},'[data-layout="slot[body.viewControls]"]':{},'[data-layout="slot[body.logo]"], [data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${t(2)})`,position:"absolute"},'[data-layout="slot[body.sideEffects]"]':{insetInline:0,[`.${d.root}`]:{inset:"unset",insetBlockEnd:0,position:"absolute"}},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"top-start / sidebar-start / main-end / sidebar-end",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{display:"grid",gap:"var(--phx-layout-gap)",gridArea:"bottom-start / full-start / bottom-end / full-end"},'&:has([data-header*="fixed"])':{'[data-layout*="slot[header]"]':{gridArea:"full-start / full-start / top-end / full-end"},'[data-layout*="slot[body]"]':{gridRowStart:"main-start"},'[data-layout*="slot[sidebar]"]':{gridRow:"main-start / main-end"}},'&:has([data-header*="floating"])':{'[data-layout*="slot[header]"]':{gridColumnEnd:"main-end"}},[`&:has([data-sidebar*="${B}"])`]:{'[data-layout*="slot[sidebar]"]':{alignContent:"end",gridRow:"main-start / main-end"}},[`&:has([data-header*="floating"]):has([data-sidebar*="${B}"])`]:{'[data-layout*="slot[header]"]':{gridColumnEnd:"sidebar-end"},'[data-layout*="slot[sidebar]"]':{gridRowStart:"top-end"}},[`&:has([data-sidebar*="${D}"])`]:{"--phx-layout-gap":0,"--phx-layout-sidebar-track-size":0,'[data-layout*="slot[sidebar]"]':{overflow:"hidden"}}}]}),P=i("div")({gridArea:"1 / 1 / -1 / -1"});export const DesktopLayout=()=>{let e=u(null),r=u(null),{palette:d,shape:i,spacing:p}=n(),{sidebarWidth:y="clamp(360px, 30cqi, 400px)"}=s({props:{},name:I}),{background:g=d.background.paper,border:F=0,borderRadius:j=i.sidebarBorderRadius??i.borderRadius,filter:z=`
41
+ `,inset:0,isolation:"isolate",pointerEvents:"none",position:"absolute","@container style(--inspect: on)":{'& > *, & > * > *, [data-layout*="slot[body.footer]"] > *':{outline:"2px solid hsl(from tomato h s l / 50%)"}},'[data-layout*="interactive"]':{"& > *":{pointerEvents:"auto"}},'[data-layout*="slot[header]"]':{gridArea:"top-start / main-start / top-end / sidebar-end"},'[data-layout*="slot[body]"]':{containerType:"size",display:"grid",gridArea:"main",gridRowStart:"top-end",gridTemplateRows:"min-content 1fr min-content"},'[data-layout*="slot[body.top]"]':{gridArea:"1 / 1 / 2 / -1","& > *":{...y.transition.fadeIn}},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"1 / 1 / 3 / -1","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout*="slot[body.bottom]"]':{alignItems:"end",display:"grid",gap:t(2),gridArea:"3 / 1 / 4 / -1",gridTemplateColumns:"minmax(0, auto) minmax(60px, 1fr)",justifyContent:"start",position:"relative",'&:has([data-layout="slot[body.viewControls]"]:empty)':{gap:0,gridTemplateColumns:"repeat(2, auto)"}},'[data-layout="slot[body.toolbar]"]':{animation:`${o} auto linear both`,animationTimeline:"scroll(self inline)",display:"flex",margin:t(-2),overflowX:"scroll",overscrollBehavior:"contain",padding:t(2),scrollbarWidth:"none","&::after":{content:'""'}},'[data-layout="slot[body.toolControls]"]':{insetBlockEnd:`calc(100% + ${t(6)})`,position:"absolute","& > *":{...y.transition.fadeIn,transitionDuration:"300ms"}},'[data-layout="slot[body.viewControls]"]':{},'[data-layout="slot[body.logo]"], [data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${t(2)})`,position:"absolute"},'[data-layout="slot[body.sideEffects]"]':{insetInline:0,[`.${d.root}`]:{inset:"unset",insetBlockEnd:0,position:"absolute"}},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"top-start / sidebar-start / main-end / sidebar-end",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{display:"grid",gap:"var(--phx-layout-gap)",gridArea:"bottom-start / full-start / bottom-end / full-end"},'&:has([data-header*="fixed"])':{'[data-layout*="slot[header]"]':{gridArea:"full-start / full-start / top-end / full-end"},'[data-layout*="slot[body]"]':{gridRowStart:"main-start"},'[data-layout*="slot[sidebar]"]':{gridRow:"main-start / main-end"}},'&:has([data-header*="floating"])':{'[data-layout*="slot[header]"]':{gridColumnEnd:"main-end"}},[`&:has([data-sidebar*="${D}"])`]:{'[data-layout*="slot[sidebar]"]':{alignContent:"end",gridRow:"main-start / main-end"}},[`&:has([data-header*="floating"]):has([data-sidebar*="${D}"])`]:{'[data-layout*="slot[header]"]':{gridColumnEnd:"sidebar-end"},'[data-layout*="slot[sidebar]"]':{gridRowStart:"top-end"}},[`&:has([data-sidebar*="${P}"])`]:{'[data-layout*="slot[sidebar]"]':{alignContent:"stretch"}},[`&:has([data-sidebar*="${A}"])`]:{"--phx-layout-gap":0,"--phx-layout-sidebar-track-size":0,'[data-layout*="slot[sidebar]"]':{overflow:"hidden"}}}]}),H=i("div")({gridArea:"1 / 1 / -1 / -1"});export const DesktopLayout=()=>{let e=u(null),r=u(null),{palette:d,shape:i,spacing:p}=n(),{sidebarWidth:y="clamp(360px, 30cqi, 400px)"}=s({props:{},name:j}),{background:g=d.background.paper,border:S=0,borderRadius:L=i.sidebarBorderRadius??i.borderRadius,filter:W=`
42
42
  drop-shadow(0 1px 1.5px hsl(from ${d.common.black} h s l / 12%))
43
43
  drop-shadow(0 1px 0.5px hsl(from ${d.common.black} h s l / 14%))
44
44
  drop-shadow(0 2px 0.5px hsl(from ${d.common.black} h s l / 20%))
45
- `,padding:H=p(2.5),scrollableIndicatorBackground:L=`linear-gradient(
45
+ `,padding:q=p(2.5),scrollableIndicatorBackground:M=`linear-gradient(
46
46
  180deg,
47
47
  hsl(from black h s l / 12%),
48
48
  hsl(from black h s l / 0%) 8px
49
- )`}=s({props:{},name:R}),{hasMiniSidebar:W,hasSplitSidebar:q}=S.useSidebarContent(),{accessInfo:M}=c(),N=m(),{isPreview:V,isHidden:X}=v(),G=!X&&!V,J=!N,{setCanvasPadding:K,setAnimating:O}=x(),{containerRef:Q,safeAreaRef:U,update:Y}=w(K,W,G),Z=b(()=>{O(!0)},[O]),_=b(()=>{O(!1),Y()},[O,Y]),aa=G&&J,at=k(e,{disabled:!aa}),ao=k(r,{disabled:!aa});f(r,{disabled:!aa});let ae={background:g,border:F,borderRadius:j,filter:z,isHeaderEmpty:at,isContentEmpty:ao,padding:H,scrollableIndicatorBackground:L,width:y};return a(o,{children:t(l,{mode:"wait",children:[!X&&V&&a(E,{},"preview-layout"),G&&t(A,{layoutId:"ui-layout",layout:!0,ownerState:{sidebarWidth:y},"data-layout":h({state:{initial:!N,fullscreen:N}}),onLayoutAnimationStart:Z,onLayoutAnimationComplete:_,children:[a(P,{ref:Q}),a("header",{"data-layout":"slot[header]",children:a(S.DesktopHeader,{})}),t("main",{"data-layout":"slot[body]",children:[a("div",{"data-layout":"slot[body.top] interactive",children:a(S.DesktopCallToAction,{})}),a("div",{ref:U,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.bottom] interactive",children:[a("div",{"data-layout":"slot[body.toolbar]",children:a(S.DesktopToolbar,{})}),a("div",{"data-layout":"slot[body.toolControls]",children:!N&&a(S.DesktopToolControls,{})}),a("div",{"data-layout":"slot[body.viewControls]",children:a(S.DesktopViewControls,{})}),a("div",{"data-layout":"slot[body.logo]",children:a(S.DesktopPoweredBy,{})}),a("div",{"data-layout":"slot[body.sideEffects]",children:a(S.DesktopSnackbarsRoot,{})})]})]}),a("aside",{"data-layout":"slot[sidebar]",children:t(T.Root,{ownerState:ae,"data-sidebar":h({variant:{[`${B}`]:W,[`${$}`]:q},state:{[`${C}`]:J,[`${D}`]:!J}}),inert:J?void 0:"",children:[a(T.Tabs,{ownerState:ae,"data-sidebar":"slot[tabs]",children:a(S.DesktopSidebarTabs,{})}),a(T.Header,{ref:e,ownerState:ae,"data-sidebar":"slot[header]",children:a(S.DesktopSidebarBackButton,{})}),a(T.Body,{ownerState:ae,"data-sidebar":"slot[body]",children:a(T.Content,{ref:r,ownerState:ae,"data-sidebar":"slot[content]",children:a(S.DesktopSidebarContent,{})})}),a(T.Footer,{ownerState:ae,"data-sidebar":"slot[footer]",children:a(S.DesktopSidebarFooter,{})})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:[M.viewMode&&!N&&a(S.DesktopReadonlyBanner,{}),a(S.DesktopFooter,{})]})]},"interface-layout")]})})};
49
+ )`}=s({props:{},name:C}),{hasMiniSidebar:N,hasSplitSidebar:V}=R.useSidebarContent(),X=w(),{accessInfo:G}=c(),J=m(),{isPreview:K,isHidden:O}=v(),Q=!O&&!K,U=!J,{setCanvasPadding:Y,setAnimating:Z}=k(),{containerRef:_,safeAreaRef:aa,update:at}=B(Y,N&&!X,Q),ao=b(()=>{Z(!0)},[Z]),ae=b(()=>{Z(!1),at()},[Z,at]),ar=Q&&U,ad=x(e,{disabled:!ar}),ai=x(r,{disabled:!ar});f(r,{disabled:!ar});let an={background:g,border:S,borderRadius:L,filter:W,isHeaderEmpty:ad,isContentEmpty:ai,padding:q,scrollableIndicatorBackground:M,width:y};return a(o,{children:t(l,{mode:"wait",children:[!O&&K&&a($,{},"preview-layout"),Q&&t(z,{layoutId:"ui-layout",layout:!0,ownerState:{sidebarWidth:y},"data-layout":h({state:{initial:!J,fullscreen:J}}),onLayoutAnimationStart:ao,onLayoutAnimationComplete:ae,children:[a(H,{ref:_}),a("header",{"data-layout":"slot[header]",children:a(R.DesktopHeader,{})}),t("main",{"data-layout":"slot[body]",children:[a("div",{"data-layout":"slot[body.top] interactive",children:a(R.DesktopCallToAction,{})}),a("div",{ref:aa,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.bottom] interactive",children:[a("div",{"data-layout":"slot[body.toolbar]",children:a(R.DesktopToolbar,{})}),a("div",{"data-layout":"slot[body.toolControls]",children:!J&&a(R.DesktopToolControls,{})}),a("div",{"data-layout":"slot[body.viewControls]",children:a(R.DesktopViewControls,{})}),a("div",{"data-layout":"slot[body.logo]",children:a(R.DesktopPoweredBy,{})}),a("div",{"data-layout":"slot[body.sideEffects]",children:a(R.DesktopSnackbarsRoot,{})})]})]}),a("aside",{"data-layout":"slot[sidebar]",children:t(F.Root,{ownerState:an,"data-sidebar":h({variant:{[`${D}`]:N,[`${T}`]:V},state:{[`${I}`]:U,[`${A}`]:!U,[`${P}`]:X}}),inert:U?void 0:"",children:[a(F.Tabs,{ownerState:an,"data-sidebar":"slot[tabs]",children:a(R.DesktopSidebarTabs,{})}),a(F.Header,{ref:e,ownerState:an,"data-sidebar":"slot[header]",children:a(R.DesktopSidebarBackButton,{})}),a(F.Body,{ownerState:an,"data-sidebar":"slot[body]",children:a(F.Content,{ref:r,ownerState:an,"data-sidebar":"slot[content]",children:a(R.DesktopSidebarContent,{})})}),a(F.Footer,{ownerState:an,"data-sidebar":"slot[footer]",children:a(R.DesktopSidebarFooter,{})}),a(E,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:[G.viewMode&&!J&&a(R.DesktopReadonlyBanner,{}),a(R.DesktopFooter,{})]})]},"interface-layout")]})})};
@@ -86,6 +86,8 @@ declare module '@mui/material/styles' {
86
86
  }
87
87
  interface LayoutOwnerState {
88
88
  readonly isContentEmpty?: boolean;
89
+ /** Height of the assistant panel while its input has focus: what the on-screen keyboard leaves free. */
90
+ readonly assistantFocusHeight?: number;
89
91
  }
90
92
  export interface ThemeableMobileLayoutProps extends LayoutOwnerState {
91
93
  /**
@@ -1,11 +1,11 @@
1
- import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarClasses as o,styled as r,useTheme as i,useThemeProps as n}from"@mui/material";import d from"lodash/noop.js";import{AnimatePresence as s}from"motion/react";import{useRef as l}from"react";import{useAccessService as m,useIsFullscreenActive as p}from"#package/react-sdk";import{attrf as c,commonStyles as u,numToPx as b,useIsEmpty as h,useResponsive as g}from"#package/ui-sdk";import{usePreview as y}from"../../../configurator-context/index.js";import{LayoutSlots as f}from"../slots/index.js";import{MobileHeader as x}from"../slots/slots.js";import{MobilePreview as v}from"./MobilePreview.js";import{useSceneSafeArea as w}from"./use-scene-safe-area.js";let S="visible",k="hidden",C=r("div",{name:"PhxMobileHeader",slot:"root"})(({theme:{spacing:t}})=>({...u.transition.fadeInFrom,alignItems:"center",display:"flex",gap:t(1),justifyContent:"space-between",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-header*="slot"]':{display:"flex",gap:t(2),"& > *":{pointerEvents:"auto"}},'[data-header="slot[center]"]':{display:"grid",inset:0,placeItems:"center",position:"absolute"},[`&[data-header*="${S}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-header*="${k}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 -60%"}})),$="visible",M="hidden",F=r("div",{name:"PhxMobileControls",slot:"root"})(({theme:{spacing:t}})=>({alignItems:"end",display:"flex",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-controls*="slot"]':{"& > *":{pointerEvents:"auto"}},'[data-controls="slot[toolControls]"]':{...u.transition.fadeInFrom,"&:not(:empty)":{marginInlineEnd:t(2)},"& > *":{...u.transition.fadeIn,transitionDelay:"300ms",transitionDuration:"300ms"}},'[data-controls="slot[viewControls]"]':{...u.transition.fadeInFrom,marginInlineStart:"auto"},'[data-controls="slot[toolbar]"]':{"&:not(:empty)":{marginInlineStart:t(2)}},[`&[data-controls*="${$}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"}},[`&[data-controls*="${M}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"}}})),T="PhxMobileSidebar",I="visible",B="hidden",R={Root:r("div",{name:T,slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t})=>[`
1
+ import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarClasses as o,styled as i,useTheme as r,useThemeProps as n}from"@mui/material";import d from"lodash/noop.js";import{AnimatePresence as s}from"motion/react";import{useRef as l}from"react";import{useAccessService as m,useEagerObservableSelector as c,useIsFullscreenActive as p}from"#package/react-sdk";import{attrf as u,commonStyles as b,numToPx as h,useIsEmpty as g,useResponsive as f,useViewportSize as y}from"#package/ui-sdk";import{useConfigurator as x}from"../../../application-runtime/index.js";import{usePreview as v}from"../../../configurator-context/index.js";import{ASSISTANT_PANEL_SLOT as w,AssistantPanel as S,useIsAssistantPanelOpen as $}from"../../assistant/index.js";import{LayoutSlots as k}from"../slots/index.js";import{MobileHeader as C}from"../slots/slots.js";import{MobilePreview as F}from"./MobilePreview.js";import{useSceneSafeArea as M}from"./use-scene-safe-area.js";let T="visible",I="hidden",R=i("div",{name:"PhxMobileHeader",slot:"root"})(({theme:{spacing:t}})=>({...b.transition.fadeInFrom,alignItems:"center",display:"flex",gap:t(1),justifyContent:"space-between",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-header*="slot"]':{display:"flex",gap:t(2),"& > *":{pointerEvents:"auto"}},'[data-header="slot[center]"]':{display:"grid",inset:0,placeItems:"center",position:"absolute"},[`&[data-header*="${T}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-header*="${I}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 -60%"}})),B="visible",E="hidden",P=i("div",{name:"PhxMobileControls",slot:"root"})(({theme:{spacing:t}})=>({alignItems:"end",display:"flex",position:"relative","@container style(--inspect: on)":{background:"hsl(from tomato h s l / 50%)"},'[data-controls*="slot"]':{"& > *":{pointerEvents:"auto"}},'[data-controls="slot[toolControls]"]':{...b.transition.fadeInFrom,"&:not(:empty)":{marginInlineEnd:t(2)},"& > *":{...b.transition.fadeIn,transitionDelay:"300ms",transitionDuration:"300ms"}},'[data-controls="slot[viewControls]"]':{...b.transition.fadeInFrom,marginInlineStart:"auto"},'[data-controls="slot[toolbar]"]':{"&:not(:empty)":{marginInlineStart:t(2)}},[`&[data-controls*="${B}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"}},[`&[data-controls*="${E}"]`]:{'[data-controls="slot[toolControls]"], [data-controls="slot[viewControls]"]':{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"}}})),D="PhxMobileSidebar",j="visible",A="hidden",z="assistant",H={Root:i("div",{name:D,slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t})=>[`
2
2
  --phx-sidebar-background: ${t.background};
3
3
  --phx-sidebar-padding: ${t.padding};
4
4
  --phx-sidebar-radius: ${t.borderRadius}px;
5
- `,{...u.transition.fadeInFrom,background:"var(--phx-sidebar-background)",borderStartStartRadius:"var(--phx-sidebar-radius)",borderStartEndRadius:"var(--phx-sidebar-radius)",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{background:"hsl(from gold h s l / 50%)"},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-sidebar-radius":0,'[data-sidebar*="slot[header]"]':{paddingBlock:0,"& > *":{display:"none"}}}},[`&[data-sidebar*="${I}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-sidebar*="${B}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"}}]),Header:r("header",{name:T,slot:"header",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({alignItems:"center",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",display:"grid",gap:t(1),gridTemplateColumns:"repeat(2, minmax(0, 1fr))",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","& > *":{...u.transition.fadeIn,transitionDelay:"100ms",transitionDuration:"300ms"},'[data-sidebar="slot[header.start]"]':{},'[data-sidebar="slot[header.end]"]':{justifySelf:"end"}})),Body:r("div",{name:T,slot:"body",shouldForwardProp:t=>"ownerState"!==t})({display:"grid",gridTemplateRows:"minmax(0, 1fr)"}),Content:r("div",{name:T,slot:"content",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({...u.layout.normalizeScrollableContainer,display:"grid",gap:t(2),gridAutoRows:"min-content",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:empty":{paddingBlock:0}})),Tabs:r("div",{name:T,slot:"tabs",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"calc(var(--phx-sidebar-padding) * 0.75)","&:is(:empty)":{border:0,padding:0}})),Footer:r("footer",{name:T,slot:"footer",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{borderColor:"transparent",paddingBlock:0}}))};export const PhxMobileLayoutName="PhxMobileLayout";let E="initial",P="fullscreen",D=r("div",{name:"PhxMobileLayout",slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t,theme:{spacing:a}})=>[`
5
+ `,{...b.transition.fadeInFrom,background:"var(--phx-sidebar-background)",borderStartStartRadius:"var(--phx-sidebar-radius)",borderStartEndRadius:"var(--phx-sidebar-radius)",display:"grid",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"min-content minmax(0, 1fr) min-content",position:"relative","& > *":{pointerEvents:"auto"},"@container style(--inspect: on)":{background:"hsl(from gold h s l / 50%)"},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-sidebar-radius":0,'[data-sidebar*="slot[header]"]':{paddingBlock:0,"& > *":{display:"none"}}}},[`&[data-sidebar*="${j}"]`]:{opacity:1,transitionDuration:"200ms, 300ms",transitionTimingFunction:"linear, ease-out",translate:"0 0"},[`&[data-sidebar*="${A}"]`]:{opacity:0,transitionDuration:"100ms, 100ms",transitionTimingFunction:"linear, ease-in",translate:"0 60%"},[`&[data-sidebar*="${z}"] > :not([data-sidebar="${w}"])`]:{visibility:"hidden"}}]),Header:i("header",{name:D,slot:"header",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({alignItems:"center",borderStartStartRadius:"inherit",borderStartEndRadius:"inherit",display:"grid",gap:t(1),gridTemplateColumns:"repeat(2, minmax(0, 1fr))",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","& > *":{...b.transition.fadeIn,transitionDelay:"100ms",transitionDuration:"300ms"},'[data-sidebar="slot[header.start]"]':{},'[data-sidebar="slot[header.end]"]':{justifySelf:"end"}})),Body:i("div",{name:D,slot:"body",shouldForwardProp:t=>"ownerState"!==t})({display:"grid",gridTemplateRows:"minmax(0, 1fr)"}),Content:i("div",{name:D,slot:"content",shouldForwardProp:t=>"ownerState"!==t})(({theme:{spacing:t}})=>({...b.layout.normalizeScrollableContainer,display:"grid",gap:t(2),gridAutoRows:"min-content",paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:empty":{paddingBlock:0}})),Tabs:i("div",{name:D,slot:"tabs",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"calc(var(--phx-sidebar-padding) * 0.75)","&:is(:empty)":{border:0,padding:0}})),Footer:i("footer",{name:D,slot:"footer",shouldForwardProp:t=>"ownerState"!==t})(({theme:{palette:t}})=>({borderBlockStart:`1px solid ${t.divider}`,paddingBlock:"calc(var(--phx-sidebar-padding) * 0.5)",paddingInline:"var(--phx-sidebar-padding)","&:is(:empty)":{borderColor:"transparent",paddingBlock:0}}))};export const PhxMobileLayoutName="PhxMobileLayout";let L="initial",q="fullscreen",N="min(480px, 50cqb)",V=["auto","min-content","max-content","fit-content"],G=i("div",{name:"PhxMobileLayout",slot:"root",shouldForwardProp:t=>"ownerState"!==t})(({ownerState:t,theme:{spacing:a}})=>[`
6
6
  --inspect: off; // 🕹️ inspection mode toggle
7
7
 
8
- --phx-layout-sidebar-track-size: ${b(t.sidebarHeight)};
8
+ --phx-layout-sidebar-track-size: ${h(t.sidebarHeight)};
9
9
  --phx-layout-gutter: ${a(2)};
10
10
  `,{display:"grid",gridTemplateColumns:`
11
11
  [full-start]
@@ -39,4 +39,4 @@ import{jsx as t,jsxs as a,Fragment as e}from"react/jsx-runtime";import{snackbarC
39
39
  [footer-end]
40
40
  var(--phx-layout-gutter)
41
41
  [full-end]
42
- `},'[data-layout*="slot[body.header]"]':{gridArea:"header-start / main-start / header-end / main-end"},'[data-layout*="slot[body.footer]"]':{gridArea:"footer-start / main-start / footer-end / main-end",position:"relative"},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"full","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${a(2)})`,position:"absolute"},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"sidebar-start / full-start / sidebar-end / full-end",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{gridArea:"footer-start / full-start / footer-end / full-end",zIndex:1},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-layout-sidebar-track-size":"min-content"}},[`&[data-layout*="${E}"]`]:{transitionDelay:"200ms",transitionDuration:"300ms"},[`&[data-layout*="${P}"]`]:{transitionDelay:"0ms",transitionDuration:"300ms"},[`&:has([data-sidebar*="${B}"])[class]`]:{"--phx-layout-sidebar-track-size":0}}]),j=r("div")({gridArea:"1 / 1 / -1 / -1"}),A=t=>({inert:t?"":void 0});export const MobileLayout=()=>{let o=l(null),{palette:r,shape:u,spacing:b}=i(),{sidebarHeight:z="min(480px, 50cqb)"}=n({props:{},name:"PhxMobileLayout"}),{background:H=r.background.paper,borderRadius:L=u.sidebarBorderRadius??u.borderRadius,padding:q=b(2)}=n({props:{},name:T}),{accessInfo:N}=m(),V=p(),{isPreview:G,isHidden:J}=y(),K=!J&&!G,O=!V&&K,Q=!V&&K,U=!V,{setCanvasPadding:W}=g(),{containerRef:X,safeAreaRef:Y}=w(K?W:d,!1),Z=h(o,{disabled:!U}),_={background:H,borderRadius:L,padding:q,isContentEmpty:Z};return a(e,{children:[t(s,{initial:!1,children:!J&&G&&t(v,{})}),a(D,{ownerState:{isContentEmpty:Z,sidebarHeight:z},"data-layout":c({state:{[`${E}`]:!V,[`${P}`]:V}}),...A(!K),children:[t(j,{ref:X}),t("div",{"data-layout":"slot[sideEffects]",children:t(f.MobileSnackbarsRoot,{})}),a("main",{"data-layout":"slot[body]",children:[t("header",{"data-layout":"slot[body.header]",children:a(C,{"data-header":c({state:{[`${S}`]:O,[`${k}`]:!O}}),...A(!O),children:[t("div",{"data-header":"slot[start]",children:t(x,{})}),t("div",{"data-header":"slot[center]",children:t(f.MobileCallToAction,{})}),a("div",{"data-header":"slot[end]",children:[N.viewMode&&!V&&t(f.MobileReadonlyBanner,{}),t(f.MobileHamburgerMenu,{})]})]})}),t("div",{ref:Y,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.footer] interactive",children:a(F,{"data-controls":c({state:{[`${$}`]:Q,[`${M}`]:!Q}}),children:[t("div",{"data-controls":"slot[toolControls]",...A(!Q),children:t(f.MobileToolControls,{})}),t("div",{"data-controls":"slot[viewControls]",...A(!Q),children:t(f.MobileViewControls,{})}),t("div",{"data-controls":"slot[toolbar]",children:K&&t(f.MobileToolbar,{})})]})})]}),t("aside",{"data-layout":"slot[sidebar]",children:a(R.Root,{ownerState:_,"data-sidebar":c({state:{[`${I}`]:U,[`${B}`]:!U}}),...A(!U),children:[a(R.Header,{ownerState:_,"data-sidebar":"slot[header]",children:[t("div",{"data-sidebar":"slot[header.start]",children:t(f.MobileSidebarBackButton,{})}),t("div",{"data-sidebar":"slot[header.end]",children:t(f.MobilePoweredBy,{})})]}),t(R.Body,{ownerState:_,"data-sidebar":"slot[body]",children:t(R.Content,{ref:o,ownerState:_,"data-sidebar":"slot[content]",children:t(f.MobileSidebarContent,{})})}),t(R.Tabs,{ownerState:_,"data-sidebar":"slot[tabs]",children:t(f.MobileTabs,{})}),t(R.Footer,{ownerState:_,"data-sidebar":"slot[footer]",children:t(f.MobileSidebarFooter,{})})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:t(f.MobileFooter,{})})]})]})};
42
+ `},'[data-layout*="slot[body.header]"]':{gridArea:"header-start / main-start / header-end / main-end"},'[data-layout*="slot[body.footer]"]':{gridArea:"footer-start / main-start / footer-end / main-end",position:"relative"},'[data-layout*="slot[body.safeSceneArea]"]':{gridArea:"full","@container style(--inspect: on)":{background:"hsl(from lime h s l / 50%)"}},'[data-layout="slot[body.sideEffects]"]':{insetBlockEnd:`calc(100% + ${a(2)})`,position:"absolute"},'[data-layout*="slot[sidebar]"]':{display:"grid",gridArea:"sidebar-start / full-start / sidebar-end / full-end",gridTemplateColumns:"minmax(0, 1fr)",gridTemplateRows:"minmax(0, auto)"},'[data-layout*="slot[footer]"]':{gridArea:"footer-start / full-start / footer-end / full-end",zIndex:1},'&:has([data-sidebar*="slot[content]"])':{...t.isContentEmpty&&{"--phx-layout-sidebar-track-size":"min-content"}},[`&[data-layout*="${L}"]`]:{transitionDelay:"200ms",transitionDuration:"300ms"},[`&[data-layout*="${q}"]`]:{transitionDelay:"0ms",transitionDuration:"300ms"},[`&:has([data-sidebar*="${A}"])[class]`]:{"--phx-layout-sidebar-track-size":0}},null!=t.assistantFocusHeight&&{'[data-layout*="slot[sidebar]"]':{alignSelf:"start",blockSize:`min(100%, ${t.assistantFocusHeight}px)`,gridRow:"full-start / full-end",zIndex:2}}]),J=i("div")({gridArea:"1 / 1 / -1 / -1"}),K=t=>({inert:t?"":void 0});export const MobileLayout=()=>{let o=l(null),{palette:i,shape:b,spacing:h}=r(),{sidebarHeight:w=N}=n({props:{},name:"PhxMobileLayout"}),{background:O=i.background.paper,borderRadius:Q=b.sidebarBorderRadius??b.borderRadius,padding:U=h(2)}=n({props:{},name:D}),{accessInfo:W}=m(),X=p(),{isPreview:Y,isHidden:Z}=v(),_=!Z&&!Y,tt=!X&&_,ta=!X&&_,te=!X,{setCanvasPadding:to}=f(),{containerRef:ti,safeAreaRef:tr}=M(_?to:d,!1),tn=g(o,{disabled:!te}),{assistantSystem:td}=x(),ts=$(),tl=c(td.panel$,t=>t.isInputFocused,[]),tm=ts&&te&&tl,tc=y(tm),tp=tn&&!ts,tu={isContentEmpty:tp,sidebarHeight:ts?V.includes(w)?N:w:w,assistantFocusHeight:tm?tc?.[1]:void 0},tb={background:O,borderRadius:Q,padding:U,isContentEmpty:tp};return a(e,{children:[t(s,{initial:!1,children:!Z&&Y&&t(F,{})}),a(G,{ownerState:tu,"data-layout":u({state:{[`${L}`]:!X,[`${q}`]:X}}),...K(!_),children:[t(J,{ref:ti}),t("div",{"data-layout":"slot[sideEffects]",children:t(k.MobileSnackbarsRoot,{})}),a("main",{"data-layout":"slot[body]",children:[t("header",{"data-layout":"slot[body.header]",children:a(R,{"data-header":u({state:{[`${T}`]:tt,[`${I}`]:!tt}}),...K(!tt),children:[t("div",{"data-header":"slot[start]",children:t(C,{})}),t("div",{"data-header":"slot[center]",children:t(k.MobileCallToAction,{})}),a("div",{"data-header":"slot[end]",children:[W.viewMode&&!X&&t(k.MobileReadonlyBanner,{}),t(k.MobileHamburgerMenu,{})]})]})}),t("div",{ref:tr,"data-layout":"slot[body.safeSceneArea]"}),t("div",{"data-layout":"slot[body.footer] interactive",children:a(P,{"data-controls":u({state:{[`${B}`]:ta,[`${E}`]:!ta}}),children:[t("div",{"data-controls":"slot[toolControls]",...K(!ta),children:t(k.MobileToolControls,{})}),t("div",{"data-controls":"slot[viewControls]",...K(!ta),children:t(k.MobileViewControls,{})}),t("div",{"data-controls":"slot[toolbar]",children:_&&t(k.MobileToolbar,{})})]})})]}),t("aside",{"data-layout":"slot[sidebar]",children:a(H.Root,{ownerState:tb,"data-sidebar":u({state:{[`${j}`]:te,[`${A}`]:!te,[`${z}`]:ts}}),...K(!te),children:[a(H.Header,{ownerState:tb,"data-sidebar":"slot[header]",children:[t("div",{"data-sidebar":"slot[header.start]",children:t(k.MobileSidebarBackButton,{})}),t("div",{"data-sidebar":"slot[header.end]",children:t(k.MobilePoweredBy,{})})]}),t(H.Body,{ownerState:tb,"data-sidebar":"slot[body]",children:t(H.Content,{ref:o,ownerState:tb,"data-sidebar":"slot[content]",children:t(k.MobileSidebarContent,{})})}),t(H.Tabs,{ownerState:tb,"data-sidebar":"slot[tabs]",children:t(k.MobileTabs,{})}),t(H.Footer,{ownerState:tb,"data-sidebar":"slot[footer]",children:t(k.MobileSidebarFooter,{})}),t(S,{})]})}),t("footer",{"data-layout":"slot[footer] interactive",children:t(k.MobileFooter,{})})]})]})};
@@ -57,6 +57,6 @@ declare const ResponsiveNavigation: <VALUE extends string, ENTITY_ID extends Dom
57
57
  */
58
58
  export declare const MobileControls: {
59
59
  Navigation: typeof ResponsiveNavigation;
60
- ViewOnlyMode: (inProps: import("../../../../ui-sdk/components/mobile-controls/MobileControls").ViewOnlyModeProps & import("#package/ui-sdk").MobileControlsThemeableProps) => import("react/jsx-runtime").JSX.Element;
60
+ ViewOnlyMode: (inProps: import("#package/ui-sdk").ViewOnlyModeProps & import("#package/ui-sdk").MobileControlsThemeableProps) => import("react/jsx-runtime").JSX.Element;
61
61
  };
62
62
  export {};
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Opens and closes the assistant panel. It renders nothing in a project without an assistant. A
3
+ * layout that lists the button is expected to carry the panel; the button does not check for it.
4
+ */
5
+ export declare const AssistantToolbarButton: import("react").FunctionComponent<{
6
+ readonly showTitle?: boolean;
7
+ readonly icon?: string;
8
+ } & {
9
+ children?: import("react").ReactNode;
10
+ }>;
@@ -0,0 +1 @@
1
+ import{jsx as t}from"react/jsx-runtime";import{Badge as r}from"@mui/material";import{memo as o,useCallback as a}from"react";import{assistantToolbarButtonSchema as i,createPhoenixLayoutElement as e}from"#package/domain";import{useEagerObservableValue as s,useLocalizable as n,useSpecAssistant as m}from"#package/react-sdk";import{DesktopToolbar as l,PhxIcon as p,useResponsive as c}from"#package/ui-sdk";import{useConfigurator as d}from"../../application-runtime/index.js";let u={id:"sdk.assistant.toolbarButton.label",message:"Assistant"};export const AssistantToolbarButton=e({schema:i,component:o(o=>{let{icon:i,showTitle:e=!0}=o,{assistantSystem:k}=d(),f=m(),{open:A,hasUnreadReply:b}=s(k.panel$),g=n(u),{isPhone:x,isTablet:h}=c(),B=a(()=>{k.setOpen(!A)},[k,A]);return f?t(l.Button,{title:g,onClick:B,showTitle:e&&!x&&!h,"aria-pressed":A,sx:{'&[aria-pressed="true"]':{backgroundColor:"action.selected"}},children:t(r,{color:"primary",variant:"dot",overlap:"circular",invisible:!b,children:t(p,{name:i??(A?"CustomAiAssistantBold":"CustomAiAssistant")})})}):null})});
@@ -14,6 +14,7 @@ export { UndoToolbarButton } from './UndoToolbarButton.js';
14
14
  export { RedoToolbarButton } from './RedoToolbarButton.js';
15
15
  export { MeasurementsToolbarButton } from './MeasurementsToolbarButton.js';
16
16
  export { HelpToolbarButton } from './HelpToolbarButton.js';
17
+ export { AssistantToolbarButton } from './AssistantToolbarButton.js';
17
18
  export { HelpMenuAction } from './HelpMenuAction.js';
18
19
  export { LanguageMenuAction } from './LanguageMenuAction.js';
19
20
  export { MeasurementsMenuAction } from './MeasurementsMenuAction.js';
@@ -1 +1 @@
1
- export*from"./sidebar-footer/index.js";export*from"./header/index.js";export{useShareData,useShareSettings}from"./share/use-share.js";export{MenuRoutingProvider,useMenuRouting}from"./menu-actions/MenuRoutingContext.js";export{MenuAction}from"./menu-actions/MenuAction.js";export{RoutingMenuAction}from"./menu-actions/RoutingMenuAction.js";export{EnterFullscreenToolbarButton}from"./EnterFullscreenToolbarButton.js";export{ExitFullscreenToolbarButton}from"./ExitFullscreenToolbarButton.js";export{LanguageToolbarButton}from"./LanguageToolbarButton.js";export{ToolbarButtonGroup}from"./ToolbarButtonGroup.js";export{ShareMenuAction}from"./ShareMenuAction.js";export{ShareToolbarButton}from"./ShareToolbarButton.js";export{UndoToolbarButton}from"./UndoToolbarButton.js";export{RedoToolbarButton}from"./RedoToolbarButton.js";export{MeasurementsToolbarButton}from"./MeasurementsToolbarButton.js";export{HelpToolbarButton}from"./HelpToolbarButton.js";export{HelpMenuAction}from"./HelpMenuAction.js";export{LanguageMenuAction}from"./LanguageMenuAction.js";export{MeasurementsMenuAction}from"./MeasurementsMenuAction.js";export{ResetCameraToolbarButton}from"./ResetCameraToolbarButton.js";export{SimpleSummary}from"./SimpleSummary.js";export{ResetUndoListener}from"./ResetUndoListener.js";export{SetAsRecipeButton}from"./SetAsRecipeButton.js";export{LayoutDialog,createLayoutDialog}from"./LayoutDialog.js";export{LayoutFooter,createLayoutFooter}from"./LayoutFooter.js";export{CanvasLoader,createCanvasLoader}from"./CanvasLoader.js";export{AppLoader,createAppLoader}from"./AppLoader.js";export{ToolbarHelp,createToolbarHelp,useToolbarHelpExists}from"./ToolbarHelp.js";export{LayoutToolbarDesktop,createLayoutToolbarDesktop}from"./LayoutToolbarDesktop.js";export{LayoutToolbarDesktopFullScreen,createLayoutToolbarDesktopFullScreen}from"./LayoutToolbarDesktopFullScreen.js";export{LayoutToolbarReadDesktop,createLayoutToolbarReadDesktop}from"./LayoutToolbarReadDesktop.js";export{LayoutToolbarReadDesktopFullScreen,createLayoutToolbarReadDesktopFullScreen}from"./LayoutToolbarReadDesktopFullScreen.js";export{LayoutCustomOwnerUi,createLayoutCustomOwnerUi}from"./LayoutCustomOwnerUi.js";export{LayoutCustomReadUi,createLayoutCustomReadUi}from"./LayoutCustomReadUi.js";export{LayoutAdminUi,createLayoutAdminUi}from"./LayoutAdminUi.js";export{LayoutUserUi,createLayoutUserUi}from"./LayoutUserUi.js";export{ExitToolModeFab}from"./call-to-action/ExitToolModeFab.js";export*from"./svg-throbber-3d/index.js";
1
+ export*from"./sidebar-footer/index.js";export*from"./header/index.js";export{useShareData,useShareSettings}from"./share/use-share.js";export{MenuRoutingProvider,useMenuRouting}from"./menu-actions/MenuRoutingContext.js";export{MenuAction}from"./menu-actions/MenuAction.js";export{RoutingMenuAction}from"./menu-actions/RoutingMenuAction.js";export{EnterFullscreenToolbarButton}from"./EnterFullscreenToolbarButton.js";export{ExitFullscreenToolbarButton}from"./ExitFullscreenToolbarButton.js";export{LanguageToolbarButton}from"./LanguageToolbarButton.js";export{ToolbarButtonGroup}from"./ToolbarButtonGroup.js";export{ShareMenuAction}from"./ShareMenuAction.js";export{ShareToolbarButton}from"./ShareToolbarButton.js";export{UndoToolbarButton}from"./UndoToolbarButton.js";export{RedoToolbarButton}from"./RedoToolbarButton.js";export{MeasurementsToolbarButton}from"./MeasurementsToolbarButton.js";export{HelpToolbarButton}from"./HelpToolbarButton.js";export{AssistantToolbarButton}from"./AssistantToolbarButton.js";export{HelpMenuAction}from"./HelpMenuAction.js";export{LanguageMenuAction}from"./LanguageMenuAction.js";export{MeasurementsMenuAction}from"./MeasurementsMenuAction.js";export{ResetCameraToolbarButton}from"./ResetCameraToolbarButton.js";export{SimpleSummary}from"./SimpleSummary.js";export{ResetUndoListener}from"./ResetUndoListener.js";export{SetAsRecipeButton}from"./SetAsRecipeButton.js";export{LayoutDialog,createLayoutDialog}from"./LayoutDialog.js";export{LayoutFooter,createLayoutFooter}from"./LayoutFooter.js";export{CanvasLoader,createCanvasLoader}from"./CanvasLoader.js";export{AppLoader,createAppLoader}from"./AppLoader.js";export{ToolbarHelp,createToolbarHelp,useToolbarHelpExists}from"./ToolbarHelp.js";export{LayoutToolbarDesktop,createLayoutToolbarDesktop}from"./LayoutToolbarDesktop.js";export{LayoutToolbarDesktopFullScreen,createLayoutToolbarDesktopFullScreen}from"./LayoutToolbarDesktopFullScreen.js";export{LayoutToolbarReadDesktop,createLayoutToolbarReadDesktop}from"./LayoutToolbarReadDesktop.js";export{LayoutToolbarReadDesktopFullScreen,createLayoutToolbarReadDesktopFullScreen}from"./LayoutToolbarReadDesktopFullScreen.js";export{LayoutCustomOwnerUi,createLayoutCustomOwnerUi}from"./LayoutCustomOwnerUi.js";export{LayoutCustomReadUi,createLayoutCustomReadUi}from"./LayoutCustomReadUi.js";export{LayoutAdminUi,createLayoutAdminUi}from"./LayoutAdminUi.js";export{LayoutUserUi,createLayoutUserUi}from"./LayoutUserUi.js";export{ExitToolModeFab}from"./call-to-action/ExitToolModeFab.js";export*from"./svg-throbber-3d/index.js";
@@ -104,106 +104,92 @@ All inputs include countersinkNotAvailable, as that is fixable by auto fix dialo
104
104
  And corresponding transformers
105
105
 
106
106
  ```typescript
107
- configuratorBuilder
108
- .withTransformers(() => [
109
- {
110
- priority: 3,
111
- transformer: (updates, currentState) => {
112
- if (updates.length > 1) {
113
- return updates
114
- }
115
-
116
- const materialUpdate = updates.find(
117
- (u): u is ComponentModification<MaterialSwatchComponent> =>
118
- u.kind === 'modifyComponent' && u.updateTag === 'selectSwatch-material'
119
- )
120
-
121
- if (!materialUpdate) {
122
- return updates
123
- }
124
-
125
- const plate = currentState.domainState.entities.find(Plate.is)!
126
- const newMaterial = materialUpdate.writableState.selectedSwatchKey
127
-
128
- const isAvailable = availableMaterials.some(
129
- state =>
130
- state.material === newMaterial && state.finish === plate.finish && state.thickness === plate.thickness
131
- )
132
-
133
- if (isAvailable) {
134
- return updates
135
- }
136
-
137
- const similarMaterial = availableMaterials.find(m => m.material === newMaterial)
138
-
139
- if (!similarMaterial) {
140
- return updates
141
- }
142
-
143
- const fixUpdate = updateFactory.DomainEntityModification({
144
- entityId: plate.id,
145
- stateDelta: {
146
- material: similarMaterial.material,
147
- finish: similarMaterial.finish,
148
- thickness: similarMaterial.thickness,
149
- },
150
- updateTag: 'fix.material',
151
- })
152
-
153
- return [fixUpdate]
107
+ // src/transformers/fix-finish.ts
108
+ import { availableMaterials } from '../_shared/available-materials.js'
109
+
110
+ export default phx.frontend.transformerBuilder.when
111
+ .entity(['Plate'])
112
+ .modified({ atFields: ['finish'] })
113
+ .then.overrideMatchingUpdate(({ update, getOld$Entity }) => {
114
+ const plate = getOld$Entity()
115
+ const newFinish = update.stateDelta.finish
116
+
117
+ const isAvailable = availableMaterials.some(
118
+ state => state.material === plate.material && state.finish === newFinish && state.thickness === plate.thickness
119
+ )
120
+
121
+ if (isAvailable) {
122
+ return [update]
123
+ }
124
+
125
+ const similarMaterial = availableMaterials.find(m => m.finish === newFinish && m.material === plate.material)
126
+
127
+ if (!similarMaterial) {
128
+ return [update]
129
+ }
130
+
131
+ const fixUpdate = phx.frontend.updates.DomainEntityModification({
132
+ entityId: plate.id,
133
+ stateDelta: {
134
+ material: similarMaterial.material,
135
+ finish: similarMaterial.finish,
136
+ thickness: similarMaterial.thickness,
154
137
  },
155
- },
156
- {
157
- priority: 3.1,
158
- transformer: (updates, currentState) => {
159
- if (updates.length > 1) {
160
- return updates
161
- }
162
-
163
- const materialUpdate = updates.find(
164
- (u): u is ComponentModification<AttributeSelectionComponent> =>
165
- u.kind === 'modifyComponent' &&
166
- u.updateTag === 'AttributeSelect.update' &&
167
- (u.componentInstance.instanceName as string) === 'finish'
168
- )
169
-
170
- if (!materialUpdate) {
171
- return updates
172
- }
173
-
174
- const plate = currentState.domainState.entities.find(Plate.is)!
175
- const newFinish = materialUpdate.writableState.value
176
-
177
- const isAvailable = availableMaterials.some(
178
- state =>
179
- state.material === plate.material && state.finish === newFinish && state.thickness === plate.thickness
180
- )
181
-
182
- if (isAvailable) {
183
- return updates
184
- }
185
-
186
- const similarMaterial = availableMaterials.find(m => m.finish === newFinish && m.material === plate.material)
187
-
188
- if (!similarMaterial) {
189
- return updates
190
- }
191
-
192
- const fixUpdate = updateFactory.DomainEntityModification({
193
- entityId: plate.id,
194
- stateDelta: {
195
- material: similarMaterial.material,
196
- finish: similarMaterial.finish,
197
- thickness: similarMaterial.thickness,
198
- },
199
- updateTag: 'fix.brushed',
200
- })
201
-
202
- return [fixUpdate]
138
+ updateTag: 'fix.brushed',
139
+ })
140
+
141
+ return [fixUpdate]
142
+ })
143
+ .build('fix-finish')
144
+ ```
145
+
146
+ ```typescript
147
+ // src/transformers/fix-material.ts
148
+ import { availableMaterials } from '../_shared/available-materials.js'
149
+
150
+ export default phx.frontend.transformerBuilder.when
151
+ .entity(['Plate'])
152
+ .modified({ atFields: ['material'] })
153
+ .then.overrideMatchingUpdate(({ update, getOld$Entity }) => {
154
+ const plate = getOld$Entity()
155
+ const newMaterial = update.stateDelta.material
156
+
157
+ const isAvailable = availableMaterials.some(
158
+ state => state.material === newMaterial && state.finish === plate.finish && state.thickness === plate.thickness
159
+ )
160
+
161
+ if (isAvailable) {
162
+ return [update]
163
+ }
164
+
165
+ const similarMaterial = availableMaterials.find(m => m.material === newMaterial)
166
+
167
+ if (!similarMaterial) {
168
+ return [update]
169
+ }
170
+
171
+ const fixUpdate = phx.frontend.updates.DomainEntityModification({
172
+ entityId: plate.id,
173
+ stateDelta: {
174
+ material: similarMaterial.material,
175
+ finish: similarMaterial.finish,
176
+ thickness: similarMaterial.thickness,
203
177
  },
204
- },
205
- ])
206
- .buildConfig()
178
+ updateTag: 'fix.material',
179
+ })
180
+
181
+ return [fixUpdate]
182
+ })
183
+ .build('fix-material')
184
+ ```
185
+
186
+ Each file in `src/transformers/` default-exports one transformer and is picked up by its location. The `transformers` section of the spec turns it on by name. For a transformer made with `build(name)` that is the name passed to `build(...)`, which must match the file name with case and dashes ignored (`fix-finish.ts` and `fixFinish` match). For a plain-function export it is the file name:
187
+
188
+ ```yaml
189
+ # spec/application.yaml
190
+ transformers:
191
+ - name: fix-finish
192
+ - name: fix-material
207
193
  ```
208
194
 
209
195
  And FilteredControls
@@ -18,7 +18,7 @@ The `createResetSelectionOnNavigationTransformer` automatically deselects entiti
18
18
 
19
19
  ## Guide
20
20
 
21
- The `createResetSelectionOnNavigationTransformer` is added through the `.withTransformers()` method. It automatically injects a deselect update when navigating to specified states.
21
+ The `createResetSelectionOnNavigationTransformer` is added as a file in `src/transformers/`. It automatically injects a deselect update when navigating to specified states.
22
22
 
23
23
  ### Step 1: Import the transformer
24
24
 
@@ -28,19 +28,25 @@ Import the transformer function from the domain package:
28
28
  import { createResetSelectionOnNavigationTransformer } from '@salsita-ai/sdk/domain'
29
29
  ```
30
30
 
31
- ### Step 2: Add the transformer to your config
31
+ ### Step 2: Add the transformer to your project
32
32
 
33
- Use the `.withTransformers()` method on the builder:
33
+ Create the transformer in a file under `src/transformers/`:
34
34
 
35
35
  ```typescript
36
- const config = configuratorBuilder
37
- .withTransformers(ctx => [
38
- {
39
- priority: 32,
40
- transformer: createResetSelectionOnNavigationTransformer([ApplicationTypes.NavigationState.SecondStep], ctx),
41
- },
42
- ])
43
- .buildConfig()
36
+ // src/transformers/reset-selection.ts
37
+ import { createResetSelectionOnNavigationTransformer } from '@salsita-ai/sdk/domain'
38
+
39
+ export default phx.frontend.createTransformer(ctx =>
40
+ createResetSelectionOnNavigationTransformer([phx.applicationTypes.NavigationState.SecondStep], ctx)
41
+ )
42
+ ```
43
+
44
+ Each file in `src/transformers/` default-exports one transformer and is picked up by its location. The `transformers` section of the spec turns it on by name. For a transformer made with `build(name)` that is the name passed to `build(...)`, which must match the file name with case and dashes ignored (`fix-finish.ts` and `fixFinish` match). For a plain-function export it is the file name:
45
+
46
+ ```yaml
47
+ # spec/application.yaml
48
+ transformers:
49
+ - name: reset-selection
44
50
  ```
45
51
 
46
52
  The transformer takes two arguments:
@@ -97,7 +103,7 @@ When the transformer triggers, any selected entity is deselected automatically.
97
103
  *
98
104
  * @param navigationStates - Array of navigation state names that trigger deselection
99
105
  * @param ctx - Domain context providing access to the navigation system
100
- * @returns Update transformer that can be registered in withTransformers
106
+ * @returns Update transformer to return from a transformer file in src/transformers/
101
107
  *
102
108
  * @example
103
109
  * // Deselect when entering the summary step
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-10-09T06:37:36.994Z",
2
+ "generatedAt": "2026-10-12T21:22:38.378Z",
3
3
  "categories": [
4
4
  {
5
5
  "name": "Phoenix",
@@ -78,24 +78,22 @@ Your custom component has full access to the Material-UI theme and SDK utilities
78
78
 
79
79
  ### Step 3: Attach the component to your entity
80
80
 
81
- Use the configurator builder to attach your custom price component to the root entity:
81
+ Attach your custom price component to the root entity in a file under `src/components/`. The generated code picks the
82
+ file up by its location and registers its default export:
82
83
 
83
84
  ```typescript
84
- const config = configuratorBuilder
85
- .withComponentOptics([
86
- attachComponent
87
- .withEntity('Scene')
88
- .withComponent(customPriceFooterComponent, 'default')
89
- .attach(
90
- memoEval(
91
- (s) => [s.$price],
92
- (price) => ({
93
- node: <AppPrice price={price} />,
94
- })
95
- )
96
- ),
97
- ])
98
- .buildConfig()
85
+ // src/components/custom-price.tsx
86
+ export default phx.domain.attachComponent
87
+ .withEntity('Scene')
88
+ .withComponent(customPriceFooterComponent, 'default')
89
+ .attach(
90
+ memoEval(
91
+ (s) => [s.$price],
92
+ (price) => ({
93
+ node: <AppPrice price={price} />,
94
+ })
95
+ )
96
+ )
99
97
  ```
100
98
 
101
99
  The `memoEval` function takes two arguments:
@@ -179,27 +179,30 @@ When a selected entity has no `sidebarTabs`, its property pages replace the root
179
179
  You can use transformers to automatically navigate to specific tabs when entities are selected or deselected:
180
180
 
181
181
  ```typescript
182
- const config = configuratorBuilder
183
- .withTransformers(ctx => {
184
- return [
185
- // Navigate to BuckyBall's first tab when selected
186
- phx.frontend.transformerBuilder.when
187
- .entity(['BuckyBall'])
188
- .selected()
189
- .then.navigateTo('BuckyBallTab1')
190
- .build('Navigate to BuckyBallTab1')
191
- .register(ctx),
192
-
193
- // Return to global tab1 when BuckyBall is deselected
194
- phx.frontend.transformerBuilder.when
195
- .entity(['BuckyBall'])
196
- .deselected()
197
- .then.navigateTo('tab1')
198
- .build('Navigate to Tab1')
199
- .register(ctx),
200
- ]
201
- })
202
- .buildConfig()
182
+ // src/transformers/bucky-ball-tab.ts
183
+ export default phx.frontend.transformerBuilder.when
184
+ .entity(['BuckyBall'])
185
+ .selected()
186
+ .then.navigateTo('BuckyBallTab1')
187
+ .build('buckyBallTab')
188
+ ```
189
+
190
+ ```typescript
191
+ // src/transformers/tab.ts
192
+ export default phx.frontend.transformerBuilder.when
193
+ .entity(['BuckyBall'])
194
+ .deselected()
195
+ .then.navigateTo('tab1')
196
+ .build('tab')
197
+ ```
198
+
199
+ Each file in `src/transformers/` default-exports one transformer and is picked up by its location. The `transformers` section of the spec turns it on by name. For a transformer made with `build(name)` that is the name passed to `build(...)`, which must match the file name with case and dashes ignored (`fix-finish.ts` and `fixFinish` match). For a plain-function export it is the file name:
200
+
201
+ ```yaml
202
+ # spec/application.yaml
203
+ transformers:
204
+ - name: buckyBallTab
205
+ - name: tab
203
206
  ```
204
207
 
205
208
  This creates smooth navigation flows where selecting specific entities automatically switches to their relevant tabs, and deselecting returns to a default tab state.
@@ -81,6 +81,12 @@ Phoenix provides built-in toolbar buttons for common operations:
81
81
  `props.showIndicatorSwitch: false` to hide the Dimension indicators switch. When omitted, the prop falls back to
82
82
  `applicationConfig.indicatorSwitch`, then `true`.
83
83
  - `helpToolbarButton` - Show help content (supports custom children)
84
+ - `assistantToolbarButton` - Open and close the built-in assistant panel. It renders only in a project whose
85
+ application spec has an `assistant` section. `props.showTitle` defaults to `true`; the label shows on a
86
+ desktop-sized layout only. The default toolbar includes it, in a group of its own, when the spec has an
87
+ `assistant` section. Only the universal layout carries the panel, and the button does not hide itself in a
88
+ layout without it. A custom layout that renders the toolbar therefore defines a `toolbar` component without the
89
+ button, because the default toolbar would add it.
84
90
 
85
91
  ### Mobile Toolbar Configuration
86
92
 
@@ -83,7 +83,7 @@ export default phx.domain.implementActions({
83
83
  })
84
84
  ```
85
85
 
86
- Throw to reject a call: the message reaches the user through the control's hint and the assistant through the failed mutation, so say what went wrong and what to send instead. An action declared without an implementation, or an implementation of a name the spec does not declare, is a type error. A declared action without an implementation also stops the domain from initializing, and under `phoenix dev` the editor reports it as a `MISSING_ACTION_IMPLEMENTATIONS` diagnostic and does not apply the change; an implementation of an undeclared name is logged.
86
+ Throw to reject a call: the message reaches the user through the control's hint and the assistant through the failed mutation, so say what went wrong and what to send instead. An implementation of a name the spec does not declare is a type error. A declared action without an implementation is not: it stops the domain from initializing, and under `phoenix dev` the editor reports it as a `MISSING_ACTION_IMPLEMENTATIONS` diagnostic and does not apply the change; an implementation of an undeclared name is logged.
87
87
 
88
88
  ## Run it from the UI
89
89