@salsita-ai/sdk 0.50.0-develop.ef06ca4ac1 → 0.50.0-develop.f0150c4c2f

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 (189) hide show
  1. package/dist/configurator/common/configurator-interface.d.ts +52 -2
  2. package/dist/configurator/common/configurator-interface.js +1 -1
  3. package/dist/configurator/configurator-context/configurator-hooks/layout-hooks.d.ts +4 -0
  4. package/dist/configurator/index.d.ts +1 -0
  5. package/dist/configurator/index.js +1 -1
  6. package/dist/configurator/pages/default-configurator-elements.d.ts +3 -2
  7. package/dist/configurator/pages/default-configurator-elements.js +1 -1
  8. package/dist/configurator/pages/default-elements/index.d.ts +1 -0
  9. package/dist/configurator/pages/default-elements/index.js +1 -1
  10. package/dist/configurator/pages/default-elements/scene-controls/BuiltInAddEntityFab.d.ts +3 -0
  11. package/dist/configurator/pages/default-elements/scene-controls/BuiltInAddEntityFab.js +1 -0
  12. package/dist/configurator/pages/default-elements/scene-controls/BuiltInDeleteEntityFab.d.ts +3 -0
  13. package/dist/configurator/pages/default-elements/scene-controls/BuiltInDeleteEntityFab.js +1 -0
  14. package/dist/configurator/pages/default-elements/scene-controls/BuiltInNavigationHotspot.d.ts +3 -0
  15. package/dist/configurator/pages/default-elements/scene-controls/BuiltInNavigationHotspot.js +1 -0
  16. package/dist/configurator/pages/default-elements/scene-controls/BuiltInSelectionHotspot.d.ts +3 -0
  17. package/dist/configurator/pages/default-elements/scene-controls/BuiltInSelectionHotspot.js +1 -0
  18. package/dist/configurator/pages/default-elements/scene-controls/BuiltInToolMenuFab.d.ts +3 -0
  19. package/dist/configurator/pages/default-elements/scene-controls/BuiltInToolMenuFab.js +1 -0
  20. package/dist/configurator/pages/default-elements/scene-controls/index.d.ts +6 -0
  21. package/dist/configurator/pages/default-elements/scene-controls/index.js +1 -0
  22. package/dist/configurator/pages/default-elements/scene-controls/scene-control-elements.d.ts +6 -0
  23. package/dist/configurator/pages/default-elements/scene-controls/scene-control-elements.js +1 -0
  24. package/dist/configurator/scene/index.d.ts +1 -0
  25. package/dist/configurator/scene/index.js +1 -1
  26. package/dist/configurator/scene/scene-controls/ToolFab.d.ts +4 -0
  27. package/dist/configurator/scene/scene-controls/ToolFab.js +1 -1
  28. package/dist/configurator/scene/scene-controls/use-scene-control-tooltip.d.ts +2 -1
  29. package/dist/configurator/scene/scene-entity/scene-controls/SceneEntityHtmlHotspots.js +1 -1
  30. package/dist/configurator/toolbar-actions/index.d.ts +3 -0
  31. package/dist/configurator/toolbar-actions/index.js +1 -0
  32. package/dist/configurator/toolbar-actions/use-assistant-panel.d.ts +18 -0
  33. package/dist/configurator/toolbar-actions/use-assistant-panel.js +1 -0
  34. package/dist/configurator/toolbar-actions/use-measurements.d.ts +35 -0
  35. package/dist/configurator/toolbar-actions/use-measurements.js +1 -0
  36. package/dist/configurator/toolbar-actions/use-toolbar-actions.d.ts +100 -0
  37. package/dist/configurator/toolbar-actions/use-toolbar-actions.js +1 -0
  38. package/dist/configurator/toolbar-actions/use-toolbar-help.d.ts +7 -0
  39. package/dist/configurator/toolbar-actions/use-toolbar-help.js +1 -0
  40. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +1 -1
  41. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -1
  42. package/dist/configurator/ui/assistant/alert/AssistantAlert.d.ts +8 -0
  43. package/dist/configurator/ui/assistant/alert/AssistantAlert.js +1 -0
  44. package/dist/configurator/ui/assistant/alert/index.d.ts +2 -0
  45. package/dist/configurator/ui/assistant/alert/index.js +1 -0
  46. package/dist/configurator/ui/assistant/alert/remark-alerts.d.ts +10 -0
  47. package/dist/configurator/ui/assistant/alert/remark-alerts.js +1 -0
  48. package/dist/configurator/ui/assistant/form/AssistantForm.js +1 -1
  49. package/dist/configurator/ui/assistant/form/built-in-form-registry.js +1 -1
  50. package/dist/configurator/ui/assistant/form/compose-answer.d.ts +2 -1
  51. package/dist/configurator/ui/assistant/form/compose-answer.js +1 -1
  52. package/dist/configurator/ui/assistant/form/form-model.d.ts +3 -2
  53. package/dist/configurator/ui/assistant/form/form-registry.d.ts +1 -1
  54. package/dist/configurator/ui/assistant/form/form-registry.js +2 -2
  55. package/dist/configurator/ui/assistant/form/parse-form-block.d.ts +2 -1
  56. package/dist/configurator/ui/assistant/form/parse-form-block.js +1 -1
  57. package/dist/configurator/ui/assistant/form/read-form-attributes.js +1 -1
  58. package/dist/configurator/ui/assistant/form-elements/FormCard.d.ts +9 -0
  59. package/dist/configurator/ui/assistant/form-elements/FormCard.js +1 -0
  60. package/dist/configurator/ui/assistant/form-elements/FormConfirm.d.ts +9 -0
  61. package/dist/configurator/ui/assistant/form-elements/FormConfirm.js +1 -0
  62. package/dist/configurator/ui/assistant/form-elements/FormGroup.d.ts +4 -1
  63. package/dist/configurator/ui/assistant/form-elements/FormNumber.d.ts +9 -0
  64. package/dist/configurator/ui/assistant/form-elements/FormNumber.js +1 -0
  65. package/dist/configurator/ui/assistant/form-elements/FormOptions.d.ts +4 -1
  66. package/dist/configurator/ui/assistant/form-elements/FormReply.d.ts +4 -1
  67. package/dist/configurator/ui/assistant/form-elements/FormSwatch.d.ts +10 -0
  68. package/dist/configurator/ui/assistant/form-elements/FormSwatch.js +1 -0
  69. package/dist/configurator/ui/assistant/form-elements/FormText.d.ts +4 -1
  70. package/dist/configurator/ui/assistant/form-elements/FormText.js +1 -1
  71. package/dist/configurator/ui/assistant/form-elements/clamp-form-number.d.ts +10 -0
  72. package/dist/configurator/ui/assistant/form-elements/clamp-form-number.js +1 -0
  73. package/dist/configurator/ui/assistant/form-elements/form-element-props.d.ts +17 -13
  74. package/dist/configurator/ui/assistant/form-elements/index.d.ts +4 -0
  75. package/dist/configurator/ui/assistant/form-elements/index.js +1 -1
  76. package/dist/configurator/ui/assistant/resource-image/index.d.ts +1 -1
  77. package/dist/configurator/ui/assistant/resource-image/index.js +1 -1
  78. package/dist/configurator/ui/assistant/resource-image/resource-path.d.ts +0 -9
  79. package/dist/configurator/ui/assistant/resource-image/resource-path.js +1 -1
  80. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +2 -2
  81. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -2
  82. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -1
  83. package/dist/configurator/ui/phoenix-layout-elements/LanguageMenuAction.js +1 -1
  84. package/dist/configurator/ui/phoenix-layout-elements/LanguageToolbarButton.js +1 -1
  85. package/dist/configurator/ui/phoenix-layout-elements/MeasurementsMenuAction.js +1 -1
  86. package/dist/configurator/ui/phoenix-layout-elements/MeasurementsToolbarButton.js +1 -1
  87. package/dist/configurator/ui/phoenix-layout-elements/ShareToolbarButton.js +1 -1
  88. package/dist/configurator/ui/phoenix-layout-elements/measurements/DimensionUnitSelector.js +1 -1
  89. package/dist/configurator/ui/phoenix-layout-elements/measurements/MeasurementsIndicatorsSwitch.js +1 -1
  90. package/dist/configurator/ui/phoenix-layout-elements/share/ShareModal.js +1 -1
  91. package/dist/configurator/ui/phoenix-layout-elements/share/use-share.d.ts +7 -8
  92. package/dist/configurator/ui/phoenix-layout-elements/share/use-share.js +1 -1
  93. package/dist/docs/complex-use-cases/focus-mode.mdx +2 -0
  94. package/dist/docs/fabs/basic.mdx +4 -0
  95. package/dist/docs/index.json +18 -1
  96. package/dist/docs/layouts/custom-layout.mdx +3 -1
  97. package/dist/docs/layouts/gallery/kestrel-kettle.mdx +1858 -0
  98. package/dist/docs/other-features/navigation-hotspot.mdx +2 -0
  99. package/dist/docs/phoenix/configurator-interface.mdx +68 -1
  100. package/dist/docs/phoenix/sdk-builder-workflow.mdx +1 -1
  101. package/dist/docs/selection-and-highlight/hotspots.mdx +2 -0
  102. package/dist/domain/application/assistant/form/assistant-form-elements.d.ts +163 -0
  103. package/dist/domain/application/assistant/form/assistant-form-elements.js +1 -0
  104. package/dist/domain/application/assistant/form/assistant-resource-path.d.ts +10 -0
  105. package/dist/domain/application/assistant/form/assistant-resource-path.js +1 -0
  106. package/dist/domain/application/assistant/form/get-assistant-form-value-attribute.d.ts +6 -0
  107. package/dist/domain/application/assistant/form/get-assistant-form-value-attribute.js +1 -0
  108. package/dist/domain/application/assistant/form/index.d.ts +4 -0
  109. package/dist/domain/application/assistant/form/index.js +1 -0
  110. package/dist/domain/application/assistant/generate-assistant-prompt.d.ts +3 -0
  111. package/dist/domain/application/assistant/generate-assistant-prompt.js +1 -1
  112. package/dist/domain/application/assistant/index.d.ts +1 -2
  113. package/dist/domain/application/assistant/index.js +1 -1
  114. package/dist/domain/domain-runtime/environment/types.d.ts +1 -1
  115. package/dist/i18n/locales/cs/messages.js +1 -1
  116. package/dist/i18n/locales/da/messages.js +1 -1
  117. package/dist/i18n/locales/de/messages.js +1 -1
  118. package/dist/i18n/locales/de-AT/messages.js +1 -1
  119. package/dist/i18n/locales/en/messages.js +1 -1
  120. package/dist/i18n/locales/en-AU/messages.js +1 -1
  121. package/dist/i18n/locales/en-GB/messages.js +1 -1
  122. package/dist/i18n/locales/es/messages.js +1 -1
  123. package/dist/i18n/locales/fr/messages.js +1 -1
  124. package/dist/i18n/locales/hu/messages.js +1 -1
  125. package/dist/i18n/locales/it/messages.js +1 -1
  126. package/dist/i18n/locales/nl/messages.js +1 -1
  127. package/dist/i18n/locales/pl/messages.js +1 -1
  128. package/dist/i18n/locales/pt/messages.js +1 -1
  129. package/dist/i18n/locales/ro/messages.js +1 -1
  130. package/dist/i18n/locales/sk/messages.js +1 -1
  131. package/dist/i18n/locales/tr/messages.js +1 -1
  132. package/dist/react-sdk/application-runtime/runtime/create-application-runtime.js +1 -1
  133. package/dist/react-sdk/domain-context/index.d.ts +3 -0
  134. package/dist/react-sdk/domain-context/index.js +1 -1
  135. package/dist/react-sdk/domain-context/system-hooks/generate-share-link-hooks.d.ts +8 -0
  136. package/dist/react-sdk/domain-context/system-hooks/generate-share-link-hooks.js +1 -0
  137. package/dist/react-sdk/domain-context/system-hooks/locale-switch-hooks.d.ts +24 -0
  138. package/dist/react-sdk/domain-context/system-hooks/locale-switch-hooks.js +1 -0
  139. package/dist/react-sdk/domain-context/system-hooks/share-links-hooks.d.ts +32 -0
  140. package/dist/react-sdk/domain-context/system-hooks/share-links-hooks.js +1 -0
  141. package/dist/react-sdk/domain-context/system-hooks/undo-redo-hooks.js +1 -1
  142. package/dist/react-sdk/index.d.ts +1 -0
  143. package/dist/react-sdk/index.js +1 -1
  144. package/dist/react-sdk/scene-control-elements/AddEntityFabElement.d.ts +36 -0
  145. package/dist/react-sdk/scene-control-elements/AddEntityFabElement.js +1 -0
  146. package/dist/react-sdk/scene-control-elements/DeleteEntityFabElement.d.ts +44 -0
  147. package/dist/react-sdk/scene-control-elements/DeleteEntityFabElement.js +1 -0
  148. package/dist/react-sdk/scene-control-elements/NavigationHotspotElement.d.ts +38 -0
  149. package/dist/react-sdk/scene-control-elements/NavigationHotspotElement.js +1 -0
  150. package/dist/react-sdk/scene-control-elements/SelectionHotspotElement.d.ts +30 -0
  151. package/dist/react-sdk/scene-control-elements/SelectionHotspotElement.js +1 -0
  152. package/dist/react-sdk/scene-control-elements/ToolMenuFabElement.d.ts +30 -0
  153. package/dist/react-sdk/scene-control-elements/ToolMenuFabElement.js +1 -0
  154. package/dist/react-sdk/scene-control-elements/create-add-entity-fab.d.ts +9 -0
  155. package/dist/react-sdk/scene-control-elements/create-add-entity-fab.js +1 -0
  156. package/dist/react-sdk/scene-control-elements/create-delete-entity-fab.d.ts +9 -0
  157. package/dist/react-sdk/scene-control-elements/create-delete-entity-fab.js +1 -0
  158. package/dist/react-sdk/scene-control-elements/create-navigation-hotspot.d.ts +10 -0
  159. package/dist/react-sdk/scene-control-elements/create-navigation-hotspot.js +1 -0
  160. package/dist/react-sdk/scene-control-elements/create-selection-hotspot.d.ts +9 -0
  161. package/dist/react-sdk/scene-control-elements/create-selection-hotspot.js +1 -0
  162. package/dist/react-sdk/scene-control-elements/create-tool-menu-fab.d.ts +9 -0
  163. package/dist/react-sdk/scene-control-elements/create-tool-menu-fab.js +1 -0
  164. package/dist/react-sdk/scene-control-elements/index.d.ts +11 -0
  165. package/dist/react-sdk/scene-control-elements/index.js +1 -0
  166. package/dist/react-sdk/scene-control-elements/scene-control-tooltip-visibility.d.ts +5 -0
  167. package/dist/react-sdk/scene-control-elements/scene-control-tooltip-visibility.js +1 -0
  168. package/dist/react-sdk/web-component/create-web-component.js +1 -1
  169. package/dist/react-sdk/web-component/god-mode/god-mode-registry.d.ts +30 -0
  170. package/dist/react-sdk/web-component/god-mode/god-mode-registry.js +1 -0
  171. package/dist/react-sdk/web-component/god-mode/index.d.ts +1 -0
  172. package/dist/react-sdk/web-component/god-mode/index.js +1 -0
  173. package/dist/ui-sdk/icons/__generated/Lightbulb.d.ts +3 -0
  174. package/dist/ui-sdk/icons/__generated/Lightbulb.js +1 -0
  175. package/dist/ui-sdk/icons/__generated/XCircle.d.ts +3 -0
  176. package/dist/ui-sdk/icons/__generated/XCircle.js +1 -0
  177. package/dist/ui-sdk/icons/__generated/index.d.ts +4 -0
  178. package/dist/ui-sdk/icons/__generated/index.js +1 -1
  179. package/dist/ui-sdk/icons/icons-registry.js +1 -1
  180. package/dist/ui-sdk/theme/types.d.ts +1 -1
  181. package/package.json +3 -3
  182. package/dist/configurator/ui/phoenix-layout-elements/language/use-locale-options.d.ts +0 -4
  183. package/dist/configurator/ui/phoenix-layout-elements/language/use-locale-options.js +0 -1
  184. package/dist/configurator/ui/phoenix-layout-elements/measurements/use-measurements-visibility.d.ts +0 -4
  185. package/dist/configurator/ui/phoenix-layout-elements/measurements/use-measurements-visibility.js +0 -1
  186. package/dist/domain/application/assistant/assistant-form-elements.d.ts +0 -28
  187. package/dist/domain/application/assistant/assistant-form-elements.js +0 -1
  188. package/dist/react-sdk/application-runtime/runtime/god-mode.d.ts +0 -19
  189. package/dist/react-sdk/application-runtime/runtime/god-mode.js +0 -1
@@ -1,11 +1,3 @@
1
- import type { AccessLevel } from '@salsita-ai/contracts/api';
2
- export interface GenerateShareLinkOptions {
3
- access: AccessLevel;
4
- expiration?: number;
5
- }
6
- export declare const useGenerateShareLink: () => (options: GenerateShareLinkOptions) => Promise<{
7
- readonly link: string;
8
- }>;
9
1
  interface UseShareDataParams {
10
2
  /**
11
3
  * Expiration time in hours. When undefined, links do not expire.
@@ -14,6 +6,9 @@ interface UseShareDataParams {
14
6
  ownerLinkDisabled: boolean;
15
7
  readRevisionLinkDisabled: boolean;
16
8
  }
9
+ /**
10
+ * @deprecated Use useShareLinks() instead. This API will be removed in a future version.
11
+ */
17
12
  export declare const useShareData: (params: UseShareDataParams) => {
18
13
  isLoadingOwnerData: boolean;
19
14
  isLoadingRevisionData: boolean;
@@ -24,6 +19,10 @@ export declare const useShareData: (params: UseShareDataParams) => {
24
19
  readonly link: string;
25
20
  }> | undefined;
26
21
  };
22
+ /**
23
+ * @deprecated Use useShareLinks() instead, whose `available`, `ownerLinkAvailable` and `readLinkAvailable` say which
24
+ * links can be shared. This API will be removed in a future version.
25
+ */
27
26
  export declare const useShareSettings: () => {
28
27
  disabled: boolean;
29
28
  ownerLinkDisabled: boolean;
@@ -1 +1 @@
1
- import{useQuery as e}from"@tanstack/react-query";import{useCallback as t}from"react";import{match as r}from"ts-pattern";import{applicationConfigComponent as a}from"#package/domain";import{useAuthorizedClient as s,useConfigurationId as i,useDomain as n,useDomainApplication as o,useFirstRootComponent as d}from"#package/react-sdk";export const useGenerateShareLink=()=>{let e=d(a),n=e?.state.shareStrategy??"deployment-registered",{configurationPersistSystem:c}=o(),l=i(),h=s();return t(async e=>{let t=r(n).with("deployment-registered",()=>void 0).with("current-frontend",()=>{let e=new URL(window.location.href);return e.searchParams.delete("cid"),e.searchParams.delete("ca"),e.toString()}).exhaustive(),a=await c.save();return h.generateShareLink(l,"rr"===e.access?a:void 0,e.expiration,e.access,t)},[n,c,h,l])};export const useShareData=t=>{let{expiration:r,ownerLinkDisabled:a,readRevisionLinkDisabled:s}=t,o=useGenerateShareLink(),{storeSystem:d}=n(),c=i(),l=d.stateSlices.committed.value.state,{data:h,isLoading:m}=e({queryKey:["share-owner-link",c],staleTime:1/0,queryFn:()=>o({access:"o",expiration:r}),enabled:!a}),{data:u,isLoading:p,isFetchedAfterMount:y}=e({queryKey:["share-revision-link",c,l.entities,l.rootEntityId],queryFn:()=>o({access:"rr",expiration:r}),enabled:!s});return{isLoadingOwnerData:m,isLoadingRevisionData:p,ownerData:h,revisionData:y?u:void 0}};export const useShareSettings=()=>{let e=d(a),t=e?.state.shareDisabled??!1,r=t||(e?.state.shareOwnerLinkDisabled??!1),s=t||(e?.state.shareReadRevisionLinkDisabled??!1);return{disabled:r&&s,ownerLinkDisabled:r,readRevisionLinkDisabled:s}};
1
+ import{useQuery as e}from"@tanstack/react-query";import{applicationConfigComponent as a}from"#package/domain";import{useConfigurationId as t,useDomain as r,useFirstRootComponent as s,useGenerateShareLink as i}from"#package/react-sdk";export const useShareData=a=>{let{expiration:s,ownerLinkDisabled:n,readRevisionLinkDisabled:o}=a,d=i(),{storeSystem:c}=r(),l=t(),u=c.stateSlices.committed.value.state,{data:m,isLoading:h}=e({queryKey:["share-owner-link",l],staleTime:1/0,queryFn:()=>d({access:"o",expiration:s}),enabled:!n}),{data:k,isLoading:y,isFetchedAfterMount:p}=e({queryKey:["share-revision-link",l,u.entities,u.rootEntityId],queryFn:()=>d({access:"rr",expiration:s}),enabled:!o});return{isLoadingOwnerData:h,isLoadingRevisionData:y,ownerData:m,revisionData:p?k:void 0}};export const useShareSettings=()=>{let e=s(a),t=e?.state.shareDisabled??!1,r=t||(e?.state.shareOwnerLinkDisabled??!1),i=t||(e?.state.shareReadRevisionLinkDisabled??!1);return{disabled:r&&i,ownerLinkDisabled:r,readRevisionLinkDisabled:i}};
@@ -69,6 +69,8 @@ components:
69
69
 
70
70
  The toolMenuFab is scene HTML rendered at the entity's position in the 3D scene. It supports positioning properties (`offsetX`, `offsetY`, `offsetZ`) and appearance properties like opacity and visibility.
71
71
 
72
+ The FAB and its menu are the entity element `ToolMenuFab`. A project replaces them by registering its own with `phx.frontend.createToolMenuFab`, which receives the `options` and `onSelectTool(toolState)`. See [Configurator Interface → In-Scene Controls](?path=/docs/phoenix-configurator-interface--docs#in-scene-controls).
73
+
72
74
  ### Step 3: Add exitToolModeFab component
73
75
 
74
76
  The `exitToolModeFab` component renders a button in the call to action layout slot, providing a clear way to exit the current tool mode. This appears in the UI chrome, not in the scene:
@@ -131,6 +131,10 @@ components:
131
131
  - non-existent
132
132
  ```
133
133
 
134
+ ### Your own FABs
135
+
136
+ The FABs are the entity elements `DeleteEntityFab` and `AddEntityFab`. A project replaces their look by registering its own with `phx.frontend.createDeleteEntityFab` or `phx.frontend.createAddEntityFab`; the spec's settings and positions above still apply. The delete FAB's replacement gets `onDelete`, `disabled` and `disabledHint`; the add FAB's reads its recipes with `phx.frontend.useGroupedRecipeOptions`. See [Configurator Interface → In-Scene Controls](?path=/docs/phoenix-configurator-interface--docs#in-scene-controls).
137
+
134
138
  ## Example
135
139
 
136
140
  Here you can see the live example!
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-10-16T01:37:48.962Z",
2
+ "generatedAt": "2026-10-16T15:24:48.764Z",
3
3
  "categories": [
4
4
  {
5
5
  "name": "Phoenix",
@@ -881,6 +881,23 @@
881
881
  ],
882
882
  "subcategories": []
883
883
  },
884
+ {
885
+ "name": "Gallery",
886
+ "docs": [
887
+ {
888
+ "title": "Kestrel Kettle",
889
+ "description": "Sell a small product from one calm page that looks like the shop's own. A specialty-coffee shop, Aldermoor Coffee, sells its Kestrel pour-over kettle in three finishes, two handle woods and with or...",
890
+ "path": "docs/layouts/gallery/kestrel-kettle.mdx",
891
+ "category": [
892
+ "Layouts",
893
+ "Gallery",
894
+ "Kestrel Kettle"
895
+ ],
896
+ "source": "storybook-example"
897
+ }
898
+ ],
899
+ "subcategories": []
900
+ },
884
901
  {
885
902
  "name": "Header",
886
903
  "docs": [
@@ -1032,6 +1032,8 @@ export default phx.frontend.createCustomPhoenixEntityElement('EdgeFinishHotspot'
1032
1032
 
1033
1033
  [Html Hotspots](?path=/docs/controls-scene-html-hotspots--docs) describes the component and its other properties.
1034
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
+
1035
1037
  ## Control the scene
1036
1038
 
1037
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.
@@ -1268,7 +1270,7 @@ The same layout in a frame 390 pixels wide, as on a phone. Opened on its own fro
1268
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.
1269
1271
 
1270
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).
1271
- - **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; for undo and redo, `phx.frontend.useUndoRedo()` gives `canUndo`, `canRedo`, `undo` and `redo`, and pushes the same analytics events as the built-in buttons.
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.useToolbarActions()` returns the spec's toolbar as runnable entries, and `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).
1272
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.
1273
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`.
1274
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.