@salsita-ai/sdk 0.50.0-develop.2f8d91de91 → 0.50.0-develop.30ea3b5e1a

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 (92) hide show
  1. package/dist/application-spec/generate-application/code/project-scaffolding.js +2 -2
  2. package/dist/application-spec/generate-application/code/standalone-app-files.d.ts +2 -2
  3. package/dist/application-spec/generate-application/code/standalone-app-files.js +1 -1
  4. package/dist/application-spec/generate-application/code/templates/index.d.ts +0 -1
  5. package/dist/application-spec/generate-application/code/templates/index.js +1 -1
  6. package/dist/application-spec/generate-application/code/templates/package-json.js +1 -1
  7. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.d.ts +1 -1
  8. package/dist/application-spec/generate-application/code/templates/skills/sdk-content.js +1 -1
  9. package/dist/application-spec/generate-application/code/templates/webhook-index.d.ts +6 -1
  10. package/dist/application-spec/generate-application/code/templates/webhook-index.js +10 -1
  11. package/dist/application-spec/generate-application/index.d.ts +2 -0
  12. package/dist/application-spec/generate-application/index.js +1 -1
  13. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.d.ts +6 -2
  14. package/dist/application-spec/generate-application/runtime/admin-runtime/admin-runtime.js +1 -1
  15. package/dist/application-spec/generate-application/runtime/application-runtime.d.ts +8 -1
  16. package/dist/application-spec/generate-application/runtime/application-runtime.js +1 -1
  17. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.d.ts +5 -1
  18. package/dist/application-spec/generate-application/runtime/configurator-runtime/configurator-runtime.js +1 -1
  19. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.d.ts +43 -0
  20. package/dist/application-spec/generate-application/runtime/factory-data/factory-data-runtime.js +1 -0
  21. package/dist/application-spec/generate-application/runtime/factory-data/index.d.ts +3 -0
  22. package/dist/application-spec/generate-application/runtime/factory-data/index.js +1 -0
  23. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.d.ts +13 -0
  24. package/dist/application-spec/generate-application/runtime/factory-data/recipe-defaults.js +1 -0
  25. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.d.ts +16 -0
  26. package/dist/application-spec/generate-application/runtime/factory-data/static-violations.js +1 -0
  27. package/dist/application-spec/generate-application/runtime/migrations/index.d.ts +1 -0
  28. package/dist/application-spec/generate-application/runtime/migrations/index.js +1 -0
  29. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.d.ts +53 -0
  30. package/dist/application-spec/generate-application/runtime/migrations/migration-runtime.js +1 -0
  31. package/dist/application-spec/parse-application-files/categorize/categorize-files.d.ts +6 -0
  32. package/dist/application-spec/parse-application-files/categorize/categorize-files.js +1 -1
  33. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +29 -0
  34. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  35. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +7 -1
  36. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  37. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +6 -0
  38. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  39. package/dist/configurator/common/configurator-interface.d.ts +10 -1
  40. package/dist/configurator/common/configurator-interface.js +1 -1
  41. package/dist/configurator/common/index.d.ts +1 -0
  42. package/dist/configurator/common/index.js +1 -1
  43. package/dist/configurator/common/use-finalize-action.d.ts +5 -1
  44. package/dist/configurator/common/use-finalize-action.js +1 -1
  45. package/dist/configurator/common/use-reset-camera.d.ts +6 -0
  46. package/dist/configurator/common/use-reset-camera.js +1 -0
  47. package/dist/configurator/ui/assistant/AssistantChips.d.ts +8 -2
  48. package/dist/configurator/ui/assistant/AssistantChips.js +1 -1
  49. package/dist/configurator/ui/assistant/AssistantThread.js +1 -1
  50. package/dist/docs/index.json +1 -1
  51. package/dist/docs/layouts/custom-layout.mdx +886 -161
  52. package/dist/docs/phoenix/configurator-interface.mdx +18 -10
  53. package/dist/docs/phoenix/layout-slots.mdx +4 -2
  54. package/dist/docs/phoenix/phoenix-cli.mdx +20 -6
  55. package/dist/docs/phoenix/project-structure.mdx +8 -3
  56. package/dist/docs/phoenix/sdk-builder-workflow.mdx +1 -1
  57. package/dist/docs/phoenix/webhooks.mdx +17 -0
  58. package/dist/domain/domain-context/index.d.ts +1 -1
  59. package/dist/domain/domain-context/undo-system.d.ts +28 -1
  60. package/dist/domain/domain-context/undo-system.js +1 -1
  61. package/dist/i18n/locales/cs/messages.js +1 -1
  62. package/dist/i18n/locales/da/messages.js +1 -1
  63. package/dist/i18n/locales/de/messages.js +1 -1
  64. package/dist/i18n/locales/de-AT/messages.js +1 -1
  65. package/dist/i18n/locales/en/messages.js +1 -1
  66. package/dist/i18n/locales/en-AU/messages.js +1 -1
  67. package/dist/i18n/locales/en-GB/messages.js +1 -1
  68. package/dist/i18n/locales/es/messages.js +1 -1
  69. package/dist/i18n/locales/fr/messages.js +1 -1
  70. package/dist/i18n/locales/hu/messages.js +1 -1
  71. package/dist/i18n/locales/it/messages.js +1 -1
  72. package/dist/i18n/locales/nl/messages.js +1 -1
  73. package/dist/i18n/locales/pl/messages.js +1 -1
  74. package/dist/i18n/locales/pt/messages.js +1 -1
  75. package/dist/i18n/locales/ro/messages.js +1 -1
  76. package/dist/i18n/locales/sk/messages.js +1 -1
  77. package/dist/i18n/locales/tr/messages.js +1 -1
  78. package/dist/phoenix/application-spec/application-spec-builder.js +1 -1
  79. package/dist/phoenix/commands/check.js +1 -1
  80. package/dist/phoenix/commands/dev.js +5 -5
  81. package/dist/phoenix/commands/fix.js +1 -1
  82. package/dist/phoenix/services/application-spec-project-watcher.d.ts +2 -0
  83. package/dist/phoenix/services/application-spec-project-watcher.js +3 -3
  84. package/dist/phoenix/services/swc.js +1 -1
  85. package/dist/react-sdk/domain-context/index.d.ts +1 -1
  86. package/dist/react-sdk/domain-context/index.js +1 -1
  87. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.d.ts +5 -0
  88. package/dist/react-sdk/domain-context/system-hooks/navigation-hooks.js +1 -1
  89. package/dist/ui-sdk/theme/types.d.ts +1 -1
  90. package/package.json +33 -29
  91. package/dist/application-spec/generate-application/code/templates/webhook-implementation.d.ts +0 -1
  92. package/dist/application-spec/generate-application/code/templates/webhook-implementation.js +0 -7
@@ -165,6 +165,10 @@ const popNavigate = phx.frontend.usePopNavigate() // popNavigate() returns to th
165
165
  // Fullscreen: a flag in the configurator's state that the layout honours; it does not put the browser into fullscreen
166
166
  const isFullscreen = phx.frontend.useIsFullscreenActive()
167
167
  const setFullscreen = phx.frontend.useSetFullscreen() // setFullscreen(true) or setFullscreen(false)
168
+
169
+ // View state and camera
170
+ const setViewState = phx.frontend.useSetViewState() // setViewState(state) makes one of the spec's viewStates active
171
+ const resetCamera = phx.frontend.useResetCamera() // resetCamera() undoes the user's orbit, pan and zoom
168
172
  ```
169
173
 
170
174
  ### Controls
@@ -463,15 +467,17 @@ Texts from the spec, such as option titles and the `detail` fields, are `Localiz
463
467
 
464
468
  **Mode, fullscreen, preview and navigation**
465
469
 
466
- | Hook | Returns |
467
- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
468
- | `phx.frontend.useAccessService()` | `{ configurationId, accessInfo }`. `accessInfo.viewMode` is `true` while a configuration shared for viewing is open, and also while the host sets the `readonly` property. |
469
- | `phx.frontend.useIsFullscreenActive()` and `phx.frontend.useSetFullscreen()` | The fullscreen flag, a `boolean`, and a function `(enabled: boolean) => void` that sets it. |
470
- | `usePreview()` from `@salsita-ai/sdk/configurator` | `{ isPreview, isExpanded, isPreviewEnabled, isHidden, enter, leave }`. The layout shows a preview start screen while `isPreview` is `true`. |
471
- | `phx.frontend.useActiveNavigationState()` | The active navigation state, one of the spec's `navigationStates`. |
472
- | `phx.frontend.usePushNavigate()` and `phx.frontend.usePopNavigate()` | `(state) => void`, which enters a state and remembers the active one, and `() => void`, which returns to the remembered state and does nothing when there is none. `phx.frontend.useNavigate()` returns `(state) => void`, which enters a state and forgets the history. |
473
- | `phx.frontend.useActiveViewState()` and `phx.frontend.useActiveToolState()` | The active view state and tool state. |
474
- | `useActiveViewports()` from `@salsita-ai/sdk/react` | The responsive breakpoints the configurator's container satisfies, as `Viewport[]`, or `null` before it is measured. It follows the container, not the window, so it is the switch between a desktop and a phone layout. |
470
+ | Hook | Returns |
471
+ | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
472
+ | `phx.frontend.useAccessService()` | `{ configurationId, accessInfo }`. `accessInfo.viewMode` is `true` while a configuration shared for viewing is open, and also while the host sets the `readonly` property. |
473
+ | `phx.frontend.useIsFullscreenActive()` and `phx.frontend.useSetFullscreen()` | The fullscreen flag, a `boolean`, and a function `(enabled: boolean) => void` that sets it. |
474
+ | `usePreview()` from `@salsita-ai/sdk/configurator` | `{ isPreview, isExpanded, isPreviewEnabled, isHidden, enter, leave }`. The layout shows a preview start screen while `isPreview` is `true`. |
475
+ | `phx.frontend.useActiveNavigationState()` | The active navigation state, one of the spec's `navigationStates`. |
476
+ | `phx.frontend.usePushNavigate()` and `phx.frontend.usePopNavigate()` | `(state) => void`, which enters a state and remembers the active one, and `() => void`, which returns to the remembered state and does nothing when there is none. `phx.frontend.useNavigate()` returns `(state) => void`, which enters a state and forgets the history. |
477
+ | `phx.frontend.useActiveViewState()` and `phx.frontend.useActiveToolState()` | The active view state and tool state. |
478
+ | `phx.frontend.useSetViewState()` | `(state) => void`, which makes the given view state, one of the spec's `viewStates`, the active one; setting the active state again keeps it. Cameras and components filtered by `viewStates` follow the change. |
479
+ | `phx.frontend.useResetCamera()` | `() => void`, which moves the camera back to the framing of the active camera configuration, undoing the user's orbit, pan and zoom, as the toolbar's reset button does. Besides `phx.frontend`, `@salsita-ai/sdk/configurator` exports it, not `@salsita-ai/sdk/react`. |
480
+ | `useActiveViewports()` from `@salsita-ai/sdk/react` | The responsive breakpoints the configurator's container satisfies, as `Viewport[]`, or `null` before it is measured. It follows the container, not the window, so it is the switch between a desktop and a phone layout. `desktop` is a container wider than 768 pixels and `mobile` one at most 768 pixels wide; `phone` is narrower than 480 and `tablet` between 480 and 1024 pixels; `landscape` and `portrait` follow the browser window's orientation. The built-in layout uses its phone arrangement unless `desktop` is active. |
475
481
 
476
482
  **Violations**
477
483
 
@@ -492,9 +498,11 @@ Each action gets a component of its own that calls `phx.frontend.useFinalizeActi
492
498
 
493
499
  - `run()`, which records the finalize-button click for analytics and then runs the handler. It does nothing while `disabled` or `isPending`.
494
500
  - `isPending`, `true` while the handler runs.
495
- - `error`, what the handler's last run rejected with, or `null`. It is cleared when the action runs again. No snackbar is raised; the layout shows the error its own way.
501
+ - `error`, what the handler's last run rejected with, or `null`; a rejection that is not an `Error` is wrapped in one, with the value as its `cause`. It is cleared when the action runs again. No snackbar is raised; the layout shows the error its own way.
496
502
  - `disabled` and `hints`, those of `useFinalizeViolations()`: finalizing is not possible while a `warning`, `fixable` or `fatal` violation holds or the configuration failed to save, and `hints` says why.
497
503
 
504
+ `isPending` and `error` belong to the mounted component: when it unmounts during a run, the handler keeps running, and a component mounted afterwards starts with `isPending` false and no `error`.
505
+
498
506
  ```tsx
499
507
  import { finalizeActionComponent } from '@salsita-ai/sdk/domain'
500
508
  import { PhoenixHandlerBoundary, useResolveLocalizable } from '@salsita-ai/sdk/react'
@@ -27,7 +27,7 @@ export const Toolbar = () => (
27
27
  - A slot takes no props unless its row names them, and reads what it shows from the spec and the configurator's state. It renders inside the configurator only, under a `ConfiguratorLayout`.
28
28
  - A slot brings its own look but not its place: it adds no padding or scrolling around itself, so the layout puts it in a container. Two members differ: `SharedCanvas` fills its nearest positioned ancestor, and `DesktopSidebar` brings the sidebar's spacing and scrolling with it.
29
29
  - Read mode means `useAccessService().accessInfo.viewMode` is `true`: a configuration shared for viewing is open, or the host sets the `readonly` property. "No change" in the read-mode column means the slot renders the same for a viewer, so the layout decides whether a viewer sees it.
30
- - `Desktop*` and `Mobile*` members are twins that differ in size and arrangement; [Phone layout](#phone-layout) lists the phone ones. The container's width, not the window's, decides which one fits: `useActiveViewports()` from `@salsita-ai/sdk/react` returns the breakpoints the container satisfies.
30
+ - `Desktop*` and `Mobile*` members are twins that differ in size and arrangement; [Phone layout](#phone-layout) lists the phone ones. The container's width, not the window's, decides which one fits: `useActiveViewports()` from `@salsita-ai/sdk/react` returns the breakpoints the container satisfies. The built-in layout uses the `Desktop*` members while `desktop` is active, for a container wider than 768 pixels, and the `Mobile*` members otherwise, while `mobile` is active; `phone` means narrower than 480 pixels and `tablet` between 480 and 1024.
31
31
 
32
32
  ## Canvas and services
33
33
 
@@ -42,7 +42,7 @@ export const Toolbar = () => (
42
42
 
43
43
  - Mount `SharedCanvas`, not `Canvas`: `Canvas` suspends while it probes the GPU on its first mount, and `SharedCanvas` holds the boundary that catches it. Without either, the app loader stays on screen unless the project sets `appLoader: legacy`.
44
44
  - `SharedCanvas` fills its nearest positioned ancestor and paints an opaque background, so the layout positions its own UI after it in the markup.
45
- - Snackbars are raised by `Services`, and also by the built-in finalize and footer actions when their handler fails and when saving the configuration fails. A layout that shows violations, side-effect hints and validation errors its own way calls `phx.frontend.useConfiguratorMessages(onMessage)` instead of mounting `Services`, see [Configurator Interface → Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout); the other snackbars still need a root. A finalize action the layout runs with `phx.frontend.useFinalizeAction` raises no snackbar; its error is the hook's `error`. They render into the snackbar root the layout mounts; with no root mounted they render into the page's `document.body`, outside the configurator. The desktop root is a zero-height element the snackbars stack upwards from, so the layout places it where their bottom edge belongs. The phone root leaves them fixed to the viewport, see `MobileSnackbarsRoot`.
45
+ - Snackbars are raised by `Services`, and also by the built-in finalize and footer actions when their handler fails and when saving the configuration fails. A layout that shows violations, side-effect hints and validation errors its own way calls `phx.frontend.useConfiguratorMessages(onMessage)` instead of mounting `Services`, see [Configurator Interface → Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout); the other snackbars still need a root. They render into the snackbar root the layout mounts; with no root mounted they render into the page's `document.body`, outside the configurator. The desktop root is a zero-height element the snackbars stack upwards from, so the layout places it where their bottom edge belongs. The phone root leaves them fixed to the viewport, see `MobileSnackbarsRoot`. A finalize action the layout runs with `phx.frontend.useFinalizeAction` raises no snackbar; its error is the hook's `error`.
46
46
 
47
47
  ## Desktop sidebar
48
48
 
@@ -70,6 +70,8 @@ A sidebar footer with `universalSidebarFooter` does not check read mode, althoug
70
70
  | `ToolControls` | The same component as `DesktopToolControls` and `MobileToolControls` | As `DesktopToolControls` | Nothing without the component | No change |
71
71
  | `DesktopCallToAction` | **The button that leaves a tool mode, not the finalize button.** Clicking it switches to the component's `exitTo` tool state | An `exitToolModeFab` component, usually filtered to the tool states it belongs to | Nothing. It throws when more than one is active | Nothing |
72
72
 
73
+ Instead of `DesktopViewControls` or `MobileViewControls`, a layout can build its own view buttons with `phx.frontend.useActiveViewState()` and `phx.frontend.useSetViewState()`, which need no `viewControls` component, see [Hooks for a Project Layout](?path=/docs/phoenix-configurator-interface--docs#hooks-for-a-project-layout).
74
+
73
75
  ## Banners and branding
74
76
 
75
77
  | Member | Shows | Fed by | With nothing configured | Read mode |
@@ -138,7 +138,7 @@ The same streams are available in the editor's **Logs** sidebar panel with per-s
138
138
  Runs all code quality checks in sequence:
139
139
 
140
140
  1. **TypeScript** — Type checking with `tsc`
141
- 2. **ESLint** — Linting rules
141
+ 2. **ESLint** — Linting rules, over `src/`; a project with no files there passes
142
142
  3. **Prettier** — Code formatting
143
143
 
144
144
  ### `phoenix fix`
@@ -147,12 +147,23 @@ Auto-fixes ESLint and Prettier issues. Equivalent to running `eslint --fix` and
147
147
 
148
148
  ## Environment Variables
149
149
 
150
- When you run `deployment:prepare-local` or `deployment:prepare`, the CLI communicates with the Phoenix server, which generates environment variables and writes them to `.env.generated`.
150
+ When you run `deployment:prepare-local` or `deployment:prepare`, the CLI communicates with the Phoenix server, which generates environment variables and writes them to `.env.generated`. `phoenix dev` does the same for its development deployment when it starts.
151
+
152
+ ### The generated env file
153
+
154
+ A project has one generated env file. Phoenix keeps it in `.phoenix/`, as `.phoenix/.env.generated`, unless the project has a `.env.generated` in its root, which then is the one that counts.
155
+
156
+ - `phoenix dev` reads and writes `.phoenix/.env.generated` in a project without a root `.env.generated`, and creates no file in the project root. In a project that has a root `.env.generated`, it reads and writes that file and `.phoenix/.env.generated` is not used.
157
+ - The deployment and environment commands (`deployment:prepare`, `deployment:prepare-dev`, `deployment:prepare-local`, `deployment:build-envs` and the others with an `--outFile` option) write `.env.generated` in the project root unless `--outFile` or `OUT_FILE` names another file. Deploy pipelines read it there. Once one of them has written it, `phoenix dev` and `phoenix build` use it.
158
+ - Everything that reads environment variables follows the same rule: the root `.env.generated` when it exists, otherwise `.phoenix/.env.generated`. The two files are never merged.
159
+ - `phoenix clean` removes `.phoenix/` and with it `.phoenix/.env.generated`; the next `phoenix dev` prepares the development deployment again. A root `.env.generated` stays.
160
+
161
+ This holds for a project on the application-spec pipeline. In a project on the legacy pipeline (see [Current and legacy project tooling](#current-and-legacy-project-tooling)), `phoenix dev` always reads and writes `.env.generated` in the project root.
151
162
 
152
163
  ### Data Flow
153
164
 
154
165
  ```
155
- spec/application.yaml → Server prepares environment → CLI writes .env.generated → Frontend/Webhooks read it
166
+ spec/application.yaml → Server prepares environment → CLI writes the generated env file → Frontend/Webhooks read it
156
167
  ```
157
168
 
158
169
  ### Project Scripts
@@ -173,7 +184,7 @@ A project may have other scripts than these five, such as `sync`, `test` or `ver
173
184
 
174
185
  ### Server-Generated Variables
175
186
 
176
- These are automatically computed by the server and written to `.env.generated`:
187
+ These are automatically computed by the server and written to the generated env file:
177
188
 
178
189
  | Variable | Purpose |
179
190
  | -------------------------------- | ------------------------------------------------------- |
@@ -261,7 +272,7 @@ A development environment keeps the AI assistant's conversation when the assista
261
272
  Environment variables are resolved in this order (highest to lowest priority):
262
273
 
263
274
  1. Process environment variables (shell)
264
- 2. `.env.generated` (created by deployment commands)
275
+ 2. [The generated env file](#the-generated-env-file): `.env.generated` in the project root when the project has one, otherwise `.phoenix/.env.generated`
265
276
  3. `.env` (manual overrides)
266
277
 
267
278
  ### Generated Config Files
@@ -292,13 +303,16 @@ Starts the full development environment: Vite dev server, development webhook tu
292
303
  | `--region` | `PHOENIX_REGION` | `eu` | Region of the signed-in workspace, used when no server URL is set |
293
304
  | `--skipUpload` / `--su` | `SKIP_UPLOAD` | `false` | Skip the S3 asset upload when the development deployment is prepared at startup |
294
305
 
306
+ With the application-spec pipeline, `phoenix dev` creates an empty `src/` folder when the project has none, so that it rebuilds when the first source file, such as `src/webhooks/index.ts`, is added.
307
+
295
308
  In `server` persistence mode the project comes from `--projectSlug`, `PROJECT_SLUG` or `project` in the spec, and the credential from `DEVELOPMENT_KEY` or the `phoenix login` sign-in; see [Starting a New Project](#starting-a-new-project). When signed in, the environment is always your own development environment and `--environmentSlug` is ignored.
296
309
 
297
310
  The dev server watches for changes in:
298
311
 
299
312
  - `spec/**/*.yaml` — Domain specification files
300
313
  - `src/**/*.{ts,tsx,yaml,yml,json,html,css}` — Source files
301
- - `.env`, `.env.generated` — Environment files (triggers full Vite restart)
314
+ - `.env` — Environment file; a change restarts the Vite dev server
315
+ - `.env.generated`, `.phoenix/.env.generated` — Generated env files; a change rebuilds the project files. Only a file that exists when `phoenix dev` starts is watched: a root `.env.generated` that a deployment command creates while dev runs is not watched; restart `phoenix dev` to use it.
302
316
 
303
317
  When linked SDK packages are detected (`phoenix link`), changes to SDK dist files are also watched.
304
318
 
@@ -44,7 +44,7 @@ project-root/
44
44
  | `invariants/` | Domain constraints |
45
45
  | `transformers/` | Data transformation logic |
46
46
  | `handlers/` | Event & lifecycle handlers |
47
- | `webhooks/` | Webhook implementations |
47
+ | `webhooks/` | Webhook implementations, entered through `index.ts` |
48
48
  | `migrations/` | Data schema migrations (v\*.ts) - auto-created based on model versions |
49
49
  | `locales/` | Locale catalogs (`.po` sources; compiled `.ts`, do not edit) |
50
50
  | `_*` | Shared code folders at any depth (not auto-imported) |
@@ -56,6 +56,9 @@ factory returns, or an array of those. A file that exports anything else, such a
56
56
  shape. When several files in `handlers/`, `elements/`, `transformers/`, `components/`, `admin/elements/` and
57
57
  `admin/components/` are wrong, the error lists all of them, one numbered line per file. Keep plain components and helpers in a `_*` folder.
58
58
 
59
+ With the application-spec pipeline, sync does not write `src/webhooks/index.ts`, and a project without it gets a
60
+ built-in webhook; see [Webhook Entry Point](?path=/docs/phoenix-webhooks--docs#webhook-entry-point).
61
+
59
62
  ### Admin Folders (src/admin/)
60
63
 
61
64
  The `admin/` folder supports these admin-specific categories:
@@ -189,18 +192,20 @@ type CustomMaterial = Phx['AdminModel']['CustomMaterial']
189
192
  | `.gitignore` | Partially | Only in a git repository; see Markers |
190
193
  | `.env` | No | Git-ignored, local config |
191
194
  | `.env.example` | No | Template for env vars |
192
- | `.env.generated` | Yes | Auto-generated IDs, git-ignored |
195
+ | `.env.generated` | Yes | Optional, git-ignored; see below |
193
196
  | `README.md` | No | Project documentation |
194
197
  | `AGENTS.md` | No | Your own coding-agent instructions |
195
198
  | `.claude/skills/phoenix*/`, `.agents/skills/phoenix*/` | Yes | Phoenix agent skills |
196
199
 
197
200
  Sync does not write `README.md`, `AGENTS.md`, `.env.example`, `.env.ci` or the `README.md` files in `assets/public/` and `assets/private/`. Earlier SDK versions wrote them once; a project that has them keeps them, and they are yours to edit.
198
201
 
202
+ Phoenix keeps the generated env file, with the IDs and values of the prepared deployment, in `.phoenix/` unless the project has a `.env.generated` in its root, which then is the one that counts. `phoenix dev` creates no `.env.generated` in the project root; the deployment and environment commands write it there. See [The generated env file](?path=/docs/phoenix-phoenix-cli--docs#the-generated-env-file).
203
+
199
204
  With the application-spec pipeline (see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)), Phoenix does not write a `.prettierignore`, and a fresh clone or CI checkout of a project has none. `phoenix check` and `phoenix fix` do not read one: they skip `.phoenix/`, `dist/`, the compiled catalogs in `src/locales/`, `pnpm-lock.yaml` and `.linguirc` on their own. A project that runs Prettier directly, as `prettier --check .` or from an editor, can add its own `.prettierignore`. To commit it, add a `!.prettierignore` line after the Phoenix block of `.gitignore`, because that block lists the file. The legacy pipeline writes `.prettierignore` on every sync.
200
205
 
201
206
  ### DO NOT EDIT (Fully Auto-Generated)
202
207
 
203
- - **Everything in `.phoenix/`** - Completely regenerated on each build. The one exception is `.phoenix/variants/`, where a coding agent writes the option files for `phoenix variants`; a rebuild keeps it
208
+ - **Everything in `.phoenix/`** - Completely regenerated on each build. The exceptions are `.phoenix/variants/`, where a coding agent writes the option files for `phoenix variants`, and `.phoenix/.env.generated`, the generated env file of `phoenix dev`; a rebuild keeps both
204
209
  - `tsconfig.json`, `eslint.config.js`, `prettier.config.js`
205
210
  - `.linguirc`, `.nvmrc`
206
211
  - `src/locales/**/*.ts` - Compiled from `.po` catalogs
@@ -22,7 +22,7 @@ pnpm install
22
22
  pnpm phoenix sync
23
23
  ```
24
24
 
25
- `phoenix init [folder]` writes the starter project: `package.json`, `pnpm-workspace.yaml` and the starter spec, `spec/application.yaml` and `spec/configurator.yaml`, which describe one box you can resize and recolour. The starter depends on the same SDK version as the CLI that created it, and its `package.json` has the `dev`, `build`, `deploy`, `check` and `fix` scripts, which are yours to change. `phoenix sync` then adds the rest of the project: webhooks and lint config. It writes a `.gitignore` only when the folder is inside a git repository; run `git init` before the first sync, or sync again after it, to get the file.
25
+ `phoenix init [folder]` writes the starter project: `package.json`, `pnpm-workspace.yaml` and the starter spec, `spec/application.yaml` and `spec/configurator.yaml`, which describe one box you can resize and recolour. The starter depends on the same SDK version as the CLI that created it, and its `package.json` has the `dev`, `build`, `deploy`, `check` and `fix` scripts, which are yours to change. `phoenix sync` then adds the rest of the project: the TypeScript, lint and formatting config and the agent skills. It writes no webhook code: a project without `src/webhooks/index.ts` gets a built-in webhook (see [Webhook Entry Point](?path=/docs/phoenix-webhooks--docs#webhook-entry-point)). It writes a `.gitignore` only when the folder is inside a git repository; run `git init` before the first sync, or sync again after it, to get the file.
26
26
 
27
27
  `init` only writes these files: it asks nothing and contacts no server. It refuses a folder that already has a `spec/` folder. A `package.json` already in the folder is kept, as long as it depends on the SDK.
28
28
 
@@ -34,6 +34,23 @@ Phoenix provides domain-aware builders through the global `phx.webhooks` namespa
34
34
 
35
35
  ### Webhook Entry Point
36
36
 
37
+ Your webhook is the default export of `src/webhooks/index.ts`. With the application-spec pipeline (see [Current and legacy project tooling](?path=/docs/phoenix-phoenix-cli--docs#current-and-legacy-project-tooling)), the file is yours to create; sync does not write it. A project without it gets a built-in webhook, so it builds and deploys with no webhook code. The built-in webhook has one handler, an anonymous auth handler, which the platform calls only when `spec/application.yaml` sets `useAuthHook`. The legacy pipeline writes the file with that webhook on the first sync.
38
+
39
+ Create `src/webhooks/index.ts` when the project needs its own handlers: finalization, backend data, or an auth handler that does more than start an anonymous session. A project that sets `useAuthHook` or `useClerk` needs its own auth handler, because the built-in one answers only anonymous requests. The smallest file is the built-in webhook itself:
40
+
41
+ ```ts
42
+ // src/webhooks/index.ts
43
+ const authHandler = phx.webhooks.authHandlerBuilder
44
+ .withAnonymousHandler(async () => ({ success: true, data: {}, role: 'anonymous' }))
45
+ .build()
46
+
47
+ export default phx.webhooks.webhookBuilder.withAuthHook(authHandler).build()
48
+ ```
49
+
50
+ The next `phoenix sync` or `phoenix build`, or the rebuild of a running `phoenix dev`, uses the file; deleting it brings the built-in webhook back. A webhook needs at least one handler, and a project with any other file in `src/webhooks/` must have `index.ts`.
51
+
52
+ A webhook with more handlers:
53
+
37
54
  ```ts
38
55
  // src/webhooks/index.ts
39
56
  import { authHandler } from './handlers/auth-handler.js'
@@ -2,7 +2,7 @@ export { type AnalyticsSystem, NoopAnalyticsSystem, type AnalyticsEvent, Analyti
2
2
  export { NavigationUpdateTag, isInitialNavigationUpdate, isNavigationUpdate, isInitialViewUpdate, isViewUpdate, isInitialSelectionUpdate, isSelectUpdate, isDeselectUpdate, isInitialFullscreenUpdate, isToggleFullscreenUpdate, isInitialDebugUpdate, isInitialViewportUpdate, isSetViewportUpdate, isInitialDragUpdate, isDragStartUpdate, isDragEndUpdate, isInitialToolUpdate, isToolUpdate, isExportUpdate, createAutoSelectionTransformer, NavigationSystem, type NavigationSystemContext, createResetSelectionOnNavigationTransformer, createNavigationOnSelectionTransformer, createNavigationOnDeselectTransformer, createSelectParentOnDeselectionTransformer, createNavigationOnSelectionChangeTransformer, type AnyNavigationSystem, } from './navigation-system/index.js';
3
3
  export { StoreSystem, type TransformerRegistration, type UpdateTransformer, type TransformerLogFunction, type Transformers, type StateSliceName, type StateEmissionKind, type CommitPreparedOutcome, nextDomainEntityId, getIdSequence, applyUpdates, SystemState, SystemStateInitialUpdateTag, SystemStateUpdateTag, type SystemStateContext, type AnyCreateTransformersFactory, type AnyStoreSystem, type Unregister, } from './store-system/index.js';
4
4
  export { createRefReplaceTransformer, createCascadeDeletesTransformer, createCascadeRefPruningTransformer, createCreateEntityRefsTransformer, } from './relation-transformers/index.js';
5
- export { type CanBeUndonePredicate, type CanBeUndoneContext, type UndoCapabilities, UndoSystem, UNDO_REDO_RESET_TAG, isUndoRedoReset, type AnyUndoSystem, } from './undo-system.js';
5
+ export { type CanBeUndonePredicate, type CanBeUndoneContext, type UndoCapabilities, type UndoStep, UndoSystem, UNDO_REDO_RESET_TAG, isUndoRedoReset, type AnyUndoSystem, } from './undo-system.js';
6
6
  export { DimensionSystem, type AnyDimensionSystem, type DimensionSystemContext, type AngleDimensionViolation, type DistanceDimensionViolation, type GenericDimensionViolation, } from './dimension-system/index.js';
7
7
  export { ActionSystem, type AnyActionSystem, type ActionSystemContext } from './action-system/index.js';
8
8
  export { RecipeCookerSystem, type AnyRecipeCookerSystem, type RecipeCookerSystemContext, ReplaceRecipeUpdateTag, isReplaceEntityUpdate, type IsReplaceRecipeUpdate, CreateRecipeUpdateTag, isCreateEntityUpdate, type IsCreateRecipeUpdate, } from './recipe-system/index.js';
@@ -1,10 +1,31 @@
1
1
  import type { ObservableWithLastValue } from '@salsita-ai/common/utils';
2
- import type { $DomainEntity, DomainEntity, ResetStateEmission, StateEmission } from '../core/index.js';
2
+ import type { $DomainEntity, DomainEntity, DomainState, ResetStateEmission, StateEmission } from '../core/index.js';
3
3
  import type { DomainContextSelectors } from '../domain-runtime/index.js';
4
4
  export interface UndoCapabilities {
5
5
  readonly canUndo: boolean;
6
6
  readonly canRedo: boolean;
7
7
  }
8
+ /**
9
+ * One step of the undo history: a state that undo and redo return to.
10
+ *
11
+ * A step is made by an undoable change. The non-undoable commits made on top of it afterwards, such
12
+ * as a selection or a navigation, do not make steps of their own; returning to the step keeps them,
13
+ * so undoing a later change does not also take back what the user selected since. A step therefore
14
+ * holds two states: the one that identifies it and the one it returns to.
15
+ */
16
+ export interface UndoStep<ENTITIES extends DomainEntity<string>> {
17
+ /**
18
+ * The state the undoable change committed. It identifies the step and never changes, so a caller
19
+ * that knows which state its own change committed can tell whether that change is the step the
20
+ * configuration is at.
21
+ */
22
+ readonly committedState: DomainState<ENTITIES>;
23
+ /**
24
+ * What undo or redo resets the store to: `committedState` plus the non-undoable commits made on
25
+ * top of it before the next undoable change.
26
+ */
27
+ readonly restoreState: DomainState<ENTITIES>;
28
+ }
8
29
  export interface CanBeUndoneContext<ENTITIES extends DomainEntity<string>, $MAP extends Record<ENTITIES['type'], $DomainEntity<ENTITIES>>> {
9
30
  oldEmission: StateEmission<ENTITIES, $MAP>;
10
31
  newEmission: StateEmission<ENTITIES, $MAP>;
@@ -39,6 +60,12 @@ export declare class UndoSystem<ENTITIES extends DomainEntity<string>, $MAP exte
39
60
  private _activeIsUndoable;
40
61
  private readonly _canSubject;
41
62
  readonly can$: ObservableWithLastValue<UndoCapabilities>;
63
+ private readonly _tipSubject;
64
+ /**
65
+ * The step the configuration is at: the top of the stack, or the step an undo or redo returned to.
66
+ * Nothing while the stack is empty, before the first undoable change and after a reset.
67
+ */
68
+ readonly tip$: ObservableWithLastValue<UndoStep<ENTITIES> | undefined>;
42
69
  constructor(_context: UndoSystemContext);
43
70
  initialize: () => void;
44
71
  /**
@@ -1 +1 @@
1
- import{BehaviorSubject as t,pairwise as e}from"rxjs";let s=t=>t.oldEmission.state.entities!==t.newEmission.state.entities;export const UNDO_REDO_RESET_TAG={};export const isUndoRedoReset=t=>"reset"===t.kind&&t.tag===UNDO_REDO_RESET_TAG;export class UndoSystem{_context;_stack=[];_currentIndex=-1;_activeIsUndoable;_canSubject=new t({canUndo:!1,canRedo:!1});can$=this._canSubject;constructor(t){this._context=t,this._context.selectors.getStoreSystem().stateSlices.committed.pipe(e()).subscribe(([t,e])=>{if("reset"===e.kind&&e.tag!==UNDO_REDO_RESET_TAG)return void this.resetStack();let n=this._activeIsUndoable?.handler??s;("reset"!==e.kind||e.tag!==UNDO_REDO_RESET_TAG)&&n({oldEmission:t,newEmission:e})&&(this._stack=[...this._stack.slice(0,this._currentIndex),t.state,e.state],this._currentIndex=this._stack.length-1,this._refresh())})}initialize=()=>{this.resetStack()};registerIsUndoable(t){let e={handler:t};return this._activeIsUndoable=e,()=>{this._activeIsUndoable===e&&(this._activeIsUndoable=void 0)}}resetStack(){this._stack=[],this._currentIndex=-1,this._refresh()}_refresh(){this._canSubject.next({canUndo:this.canUndo(),canRedo:this.canRedo()})}canUndo(){return this._currentIndex>0}canRedo(){return this._currentIndex<this._stack.length-1}undo(){let t=this._stack[this._currentIndex-1];void 0!==t&&(this._currentIndex--,this._context.selectors.getStoreSystem().reset(t,UNDO_REDO_RESET_TAG),this._refresh())}redo(){let t=this._stack[this._currentIndex+1];void 0!==t&&(this._currentIndex++,this._context.selectors.getStoreSystem().reset(t,UNDO_REDO_RESET_TAG),this._refresh())}}
1
+ import{BehaviorSubject as t,pairwise as e}from"rxjs";let s=t=>t.oldEmission.state.entities!==t.newEmission.state.entities;export const UNDO_REDO_RESET_TAG={};export const isUndoRedoReset=t=>"reset"===t.kind&&t.tag===UNDO_REDO_RESET_TAG;export class UndoSystem{_context;_stack=[];_currentIndex=-1;_activeIsUndoable;_canSubject=new t({canUndo:!1,canRedo:!1});can$=this._canSubject;_tipSubject=new t(void 0);tip$=this._tipSubject;constructor(t){this._context=t,this._context.selectors.getStoreSystem().stateSlices.committed.pipe(e()).subscribe(([t,e])=>{if("reset"===e.kind&&e.tag!==UNDO_REDO_RESET_TAG)return void this.resetStack();let i=this._activeIsUndoable?.handler??s;if("reset"===e.kind&&e.tag===UNDO_REDO_RESET_TAG||!i({oldEmission:t,newEmission:e}))return;let r=this._stack[this._currentIndex],n={committedState:r?.committedState??t.state,restoreState:t.state},c={committedState:e.state,restoreState:e.state};this._stack=[...this._stack.slice(0,this._currentIndex),n,c],this._currentIndex=this._stack.length-1,this._refresh()})}initialize=()=>{this.resetStack()};registerIsUndoable(t){let e={handler:t};return this._activeIsUndoable=e,()=>{this._activeIsUndoable===e&&(this._activeIsUndoable=void 0)}}resetStack(){this._stack=[],this._currentIndex=-1,this._refresh()}_refresh(){this._canSubject.next({canUndo:this.canUndo(),canRedo:this.canRedo()}),this._tipSubject.next(this._stack[this._currentIndex])}canUndo(){return this._currentIndex>0}canRedo(){return this._currentIndex<this._stack.length-1}undo(){let t=this._stack[this._currentIndex-1];void 0!==t&&(this._currentIndex--,this._context.selectors.getStoreSystem().reset(t.restoreState,UNDO_REDO_RESET_TAG),this._refresh())}redo(){let t=this._stack[this._currentIndex+1];void 0!==t&&(this._currentIndex++,this._context.selectors.getStoreSystem().reset(t.restoreState,UNDO_REDO_RESET_TAG),this._refresh())}}
@@ -1 +1 @@
1
- export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.admin.error.system.message":["Moment\xe1lně m\xe1me technick\xe9 probl\xe9my. Zkuste to pros\xedm za p\xe1r minut. Děkujeme za vaši trpělivost!"],"sdk.admin.error.system.title":["Syst\xe9mov\xe1 chyba"],"sdk.angleDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je větš\xed než povolen\xe9 maximum ",["limitWithUnit"],"."],"sdk.angleDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je menš\xed než povolen\xe9 minimum ",["limitWithUnit"],"."],"sdk.assistant.composer.disclaimer":["AI se může m\xfdlit. V\xfdsledek si zkontrolujte."],"sdk.assistant.composer.placeholder":["Zeptejte se nebo napište, co změnit…"],"sdk.assistant.composer.send.label":["Odeslat"],"sdk.assistant.composer.stop.label":["Zastavit"],"sdk.assistant.failure.busy":["Asistent ještě pracuje na předchoz\xed zpr\xe1vě."],"sdk.assistant.failure.notAvailable":["Asistent zde nen\xed dostupn\xfd."],"sdk.assistant.failure.retry.label":["Zkusit znovu"],"sdk.assistant.failure.unavailable":["Asistent teď nen\xed dostupn\xfd."],"sdk.assistant.panel.close.label":["Zavř\xedt asistenta"],"sdk.assistant.panel.title":["Asistent"],"sdk.assistant.thread.earlierSummarized":["Dř\xedvějš\xed konverzace shrnuta"],"sdk.assistant.thread.greeting":["Dobr\xfd den. Mohu odpov\xeddat na ot\xe1zky k tomuto n\xe1vrhu a upravovat ho s v\xe1mi. Napište, co potřebujete."],"sdk.assistant.thread.loading":["Nač\xedt\xe1m konverzaci…"],"sdk.assistant.thread.loadingEarlier":["Nač\xedt\xe1m dř\xedvějš\xed konverzaci…"],"sdk.assistant.thread.newReply.label":["Nov\xe1 odpověď"],"sdk.assistant.thread.resuming":["Obnovuji konverzaci…"],"sdk.assistant.thread.showEarlier.label":["Zobrazit dř\xedvějš\xed konverzaci"],"sdk.assistant.thread.thinking":["Přem\xfdšl\xedm…"],"sdk.assistant.tool.cancelled.hint":["Zastaveno před dokončen\xedm."],"sdk.assistant.tool.mistake.hint":["Asistent udělal chybu."],"sdk.assistant.tool.noResult.hint":["V\xfdsledek tohoto kroku se ztratil. Krok mohl, ale nemusel b\xfdt proveden."],"sdk.assistant.tool.readDesign.label":["Čten\xed n\xe1vrhu"],"sdk.assistant.tool.toolBudget.hint":["Neprovedeno: asistent dos\xe1hl limitu kroků pro jednu zpr\xe1vu."],"sdk.assistant.tool.updateDesign.label":["\xdaprava n\xe1vrhu"],"sdk.assistant.toolbarButton.label":["Asistent"],"sdk.chat.disclaimer.close.label":["Zavř\xedt"],"sdk.chat.disclaimer.dialog.title":["Ozn\xe1men\xed o asistentovi"],"sdk.chat.disclaimer.full.message":["<0>N\xe1sleduj\xedc\xed prohl\xe1šen\xed m\xe1 za c\xedl informovat uživatele o omezen\xedch a pokynech pro použ\xedv\xe1n\xed AI chatbota dostupn\xe9ho na tomto webu. Před komunikac\xed s chatbotem si pros\xedm pozorně přečtěte toto prohl\xe1šen\xed.</0><1><2>Obecn\xe9 informace:</2> AI chatbot je automatizovan\xfd syst\xe9m poh\xe1něn\xfd OpenAI/ChatGPT. Je navržen tak, aby poskytoval informace a pomoc na z\xe1kladě dostupn\xfdch informac\xed o produktech nab\xedzen\xfdch na tomto webu. I když se snaž\xedme poskytovat přesn\xe9 informace prostřednictv\xedm AI chatbota, nemůžeme zaručit přesnost, \xfaplnost nebo aktu\xe1lnost poskytovan\xfdch informac\xed. Doporučujeme použ\xedvat odpovědi jako v\xfdchoz\xed bod a ověřovat odpovědi u poskytovatele těchto informac\xed (vlastn\xedka tohoto webu) nebo jak\xe9koli dostupn\xe9 produktov\xe9 dokumentace.</1><3><4>Odpovědnost uživatele:</4> Uživatel\xe9 AI chatbota nesou v\xfdhradn\xed odpovědnost za sv\xe9 interakce a spol\xe9h\xe1n\xed na poskytovan\xe9 informace. Je důležit\xe9 b\xfdt opatrn\xfd a použ\xedvat vlastn\xed \xfasudek při interpretaci a jedn\xe1n\xed na z\xe1kladě odpověd\xed chatbota. Ani vlastn\xedk tohoto webu, ani poskytovatel technologie chatbota nelze činit odpovědn\xfdm za jak\xe9koli činy, ztr\xe1ty nebo škody vypl\xfdvaj\xedc\xed z použ\xedv\xe1n\xed chatbota.</3><5><6>Ochrana \xfadajů a bezpečnost:</6> Upřednostňujeme ochranu a bezpečnost informac\xed uživatelů. Mějte na paměti, že konverzace s chatbotem mohou b\xfdt zkontrolov\xe1ny vlastn\xedkem tohoto webu a poskytovatelem technologie za \xfačelem zlepšen\xed v\xfdsledků. Zat\xedmco OpenAI/ChatGPT uchov\xe1v\xe1 z\xe1znamy těchto konverzac\xed po dobu 30 dnů, tato data se nepouž\xedvaj\xed k tr\xe9nov\xe1n\xed jejich AI modelů. Nesd\xedlejte ž\xe1dn\xe9 citliv\xe9 nebo osobn\xed informace ve sv\xfdch konverzac\xedch.</5><7>Použ\xedv\xe1n\xedm tohoto AI chatbota vyjadřujete svůj souhlas a porozuměn\xed v\xfdše uveden\xe9mu prohl\xe1šen\xed. Pokud nesouhlas\xedte s kteroukoli č\xe1st\xed tohoto prohl\xe1šen\xed, doporučujeme chatbot nepouž\xedvat.</7>"],"sdk.chat.disclaimer.inline.message":["Asistent je experiment\xe1ln\xed a může poskytovat nepřesn\xe9 informace."],"sdk.chat.disclaimer.seeMore.label":["V\xedce informac\xed"],"sdk.chat.header.desktop.title":["Asistent"],"sdk.chat.input.default.placeholder":["Napište zpr\xe1vu..."],"sdk.chat.input.footer.placeholder":["Napište zpr\xe1vu..."],"sdk.chat.mobile.assistant.label":["Asistent"],"sdk.chat.send.button.label":["Odeslat zpr\xe1vu"],"sdk.chat.system.error.message":["Došlo k chybě při komunikaci s asistentem. Zkuste to pros\xedm znovu."],"sdk.chat.welcome.greeting.message":["Ahoj! Jsem v\xe1š asistent a pomohu v\xe1m s konfigurac\xed produktu. Na co se chcete zeptat?"],"sdk.collision.warning.tooltip":["Předměty jsou př\xedliš bl\xedzko nebo se překr\xfdvaj\xed"],"sdk.controls.dimension.angle.error":["Neplatn\xfd \xfahel"],"sdk.controls.dimension.angle.hint":["Zadejte \xfahel"],"sdk.controls.dimension.angle.hintRange":["Zadejte č\xedslo mezi ",["0"],["unitLabelWithSpace"]," a ",["1"],["unitLabelWithSpace"],"."],"sdk.controls.dimension.angleSlider.error":["Neplatn\xfd \xfahel"],"sdk.controls.dimension.distance.error":["Neplatn\xe1 vzd\xe1lenost"],"sdk.controls.dimension.distance.hint":["Zadejte vzd\xe1lenost"],"sdk.controls.dimension.distance.hintRange":["Vzd\xe1lenost mus\xed b\xfdt mezi ",["0"]," a ",["1"]],"sdk.controls.dimension.distanceSlider.error":["Neplatn\xe1 vzd\xe1lenost"],"sdk.controls.dimension.generic.error":["Neplatn\xe1 hodnota"],"sdk.controls.dimension.generic.hint":["Zadejte hodnotu"],"sdk.controls.dimension.generic.hintRange":["Hodnota mus\xed b\xfdt mezi ",["min"]," a ",["max"]],"sdk.controls.dimension.genericSlider.error":["Neplatn\xe1 hodnota"],"sdk.controls.dimension.indicator.apply":["Použ\xedt"],"sdk.controls.dimension.indicator.cancel":["Zrušit"],"sdk.controls.dimension.offset.hint":["Zadejte odsazen\xed"],"sdk.controls.dimension.size.hint":["Zadejte rozměr"],"sdk.controls.entity.add.close.label":["Zavř\xedt"],"sdk.controls.entity.add.nothingMessage":["Ž\xe1dn\xe9 položky k přid\xe1n\xed"],"sdk.controls.entity.childDelete.label":["Smazat"],"sdk.controls.entity.childSelect.label":["Vybrat"],"sdk.controls.entity.delete.label":["Smazat"],"sdk.controls.entity.replace.label":["Nahradit"],"sdk.controls.property.back.label":["Zpět"],"sdk.controls.recipeGroup.notFound.message":["Nenalezeno"],"sdk.controls.recipeGroup.notFound.title":["Skupina, kterou hled\xe1te, již nen\xed k dispozici. Vyberte pros\xedm jinou skupinu."],"sdk.controls.tool.close.label":["Zavř\xedt"],"sdk.controls.units.feet.label":["stopy"],"sdk.controls.units.inch.label":["palce"],"sdk.controls.upload.dragDrop.hint":["Přet\xe1hněte soubory sem nebo klikněte pro v\xfdběr"],"sdk.controls.upload.failed.error":["Nahr\xe1v\xe1n\xed se nezdařilo"],"sdk.controls.upload.link.label":["Nebo vložte odkaz"],"sdk.controls.upload.size.error":["Soubor je př\xedliš velk\xfd"],"sdk.distanceDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["0"],", což je větš\xed než povolen\xe9 maximum ",["1"],"."],"sdk.distanceDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["0"],", což je menš\xed než povolen\xe9 minimum ",["1"],"."],"sdk.finalize.notConfigured.tooltip":["Funkce dokončen\xed nen\xed nakonfigurov\xe1na."],"sdk.finalize.outOfSync.hint":["Konfigurace nen\xed synchronizov\xe1na. Někter\xe9 změny nebyly spr\xe1vně uloženy."],"sdk.genericDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je větš\xed než povolen\xe9 maximum ",["limitWithUnit"],"."],"sdk.genericDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je menš\xed než povolen\xe9 minimum ",["limitWithUnit"],"."],"sdk.layout.banner.readonly.cancel.label":["Zrušit"],"sdk.layout.banner.readonly.clone.label":["Klonovat pro \xfapravy"],"sdk.layout.banner.readonly.clone.message":["Chcete vytvořit kopii t\xe9to konfigurace pro \xfapravy?"],"sdk.layout.banner.readonly.clone.title":["Klonovat konfiguraci"],"sdk.layout.banner.readonly.editConfig.label":["Upravit konfiguraci"],"sdk.layout.banner.readonly.editMobile.label":["Upravit"],"sdk.layout.banner.readonly.info.message":["Tato konfigurace je pouze pro čten\xed. Chcete-li ji upravit, vytvořte kopii."],"sdk.layout.button.closeConfigurator.label":["Zavř\xedt konfigur\xe1tor"],"sdk.layout.button.closePresetPreview.label":["Zavř\xedt n\xe1hled přednastaven\xed"],"sdk.layout.button.desktopBack.label":["Zpět"],"sdk.layout.button.desktopSidebarBack.label":["Zpět"],"sdk.layout.button.mobileBack.label":["Zpět"],"sdk.layout.button.mobileSidebarBack.label":["Zpět"],"sdk.layout.button.presetBack.label":["Zpět"],"sdk.layout.button.saveRecipe.label":["Uložit recept"],"sdk.layout.button.saveTemplate.label":["Uložit šablonu"],"sdk.layout.button.setTemplate.label":["Nastavit jako šablonu"],"sdk.layout.controls.mobile.view3d.label":["3D zobrazen\xed"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Pouze pro zobrazen\xed.</0> Pro \xfapravy konfigurace použijte zař\xedzen\xed s větš\xed obrazovkou."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Pouze pro zobrazen\xed.</0> Pro \xfapravy konfigurace použijte zař\xedzen\xed s větš\xed obrazovkou nebo zkuste změnit orientaci zař\xedzen\xed."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Celkov\xe1 cena"],"sdk.layout.hamburgerMenu.language.dialogTitle":["Vyberte jazyk"],"sdk.layout.hamburgerMenu.language.label":["Jazyk"],"sdk.layout.menu.hamburger.close.label":["Zavř\xedt"],"sdk.layout.menu.hamburger.help.label":["N\xe1pověda"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Zavř\xedt n\xe1povědu"],"sdk.layout.menu.hamburger.share.label":["Sd\xedlet"],"sdk.layout.menu.hamburger.title":["Menu"],"sdk.layout.menu.hamburger.tooltip":["Otevř\xedt menu"],"sdk.layout.menu.language.close.label":["Zavř\xedt"],"sdk.layout.menu.measurements.close.label":["Zavř\xedt"],"sdk.layout.menu.measurements.label":["Měřen\xed"],"sdk.layout.navigation.common.product.label":["Produkt"],"sdk.layout.navigation.mobile.product.label":["Produkt"],"sdk.layout.navigation.steps.first.label":["Prvn\xed"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Dokončit"],"sdk.layout.sidebar.finalize.label":["Dokončit"],"sdk.layout.sidebar.finalizePage.label":["Dokončit"],"sdk.layout.sidebar.nextStep.label":["Dalš\xed krok"],"sdk.layout.sidebar.nextStepShort.label":["Dalš\xed"],"sdk.layout.sidebar.previousStep.label":["Předchoz\xed krok"],"sdk.layout.sidebar.price.label":["Cena"],"sdk.layout.sidebar.totalPrice.label":["Celkov\xe1 cena"],"sdk.layout.summary.button.label":["Shrnut\xed"],"sdk.layout.toolbar.mobile.tools.title":["N\xe1stroje"],"sdk.layout.toolbar.mobile.units.label":["Jednotky"],"sdk.measurements":["Měřen\xed"],"sdk.messages.error.configNotFound.message":["Konfigurace nebyla nalezena. Možn\xe1 byla smaz\xe1na nebo jste zadali nespr\xe1vn\xfd odkaz."],"sdk.messages.error.configNotFound.title":["Konfigurace nenalezena"],"sdk.messages.error.configurator.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.configurator.message":["Hopsa, něco se pokazilo! Zkuste to pros\xedm znovu nebo kontaktujte podporu."],"sdk.messages.error.configurator.title":["Chyba konfigur\xe1toru"],"sdk.messages.error.configuratorRoot.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.configuratorRoot.message":["Konfigur\xe1tor nen\xed dostupn\xfd. Zkuste to pros\xedm znovu později."],"sdk.messages.error.configuratorRoot.title":["Konfigur\xe1tor nedostupn\xfd"],"sdk.messages.error.gpuDisabled.message":["GPU akcelerace je zak\xe1z\xe1na. V\xfdkon může b\xfdt sn\xedžen. Pro lepš\xed v\xfdkon povolte hardware akceleraci v nastaven\xed prohl\xedžeče."],"sdk.messages.error.gpuDisabled.title":["GPU akcelerace zak\xe1z\xe1na"],"sdk.messages.error.notFound.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.webglNotSupported.message":["V\xe1š prohl\xedžeč nepodporuje WebGL, kter\xfd je potřebn\xfd pro 3D zobrazen\xed. Zkuste použ\xedt jin\xfd prohl\xedžeč nebo aktualizovat st\xe1vaj\xedc\xed."],"sdk.messages.error.webglNotSupported.title":["WebGL nen\xed podporov\xe1n"],"sdk.messages.finalize.error":["Oops, něco se pokazilo"],"sdk.messages.navigation.goToHomepage.label":["Přej\xedt na domovskou str\xe1nku"],"sdk.messages.otherAction.error":["Oops, něco se pokazilo"],"sdk.messages.system.invalidDeployment.close.label":["Zavř\xedt"],"sdk.messages.system.invalidDeployment.message":["Toto nasazen\xed nen\xed platn\xe9 nebo bylo smaz\xe1no."],"sdk.messages.system.invalidDeployment.title":["Neplatn\xe9 nasazen\xed"],"sdk.messages.validation.uncaughtError.message":["Došlo k neoček\xe1van\xe9 chybě. Zkuste to pros\xedm znovu."],"sdk.persist.system.error.dismiss":["Zavř\xedt"],"sdk.persist.system.error.message":["Při pokusu o aktualizaci konfigurace došlo k chybě"],"sdk.persist.system.error.recovered":["Konfigurace aktualizov\xe1na"],"sdk.presets.category.count.message":[["count"]," přednastaven\xed"],"sdk.presets.category.heading.title":["Kategorie"],"sdk.presets.create.error.dismiss.label":["Zavř\xedt"],"sdk.presets.create.error.message":["Z t\xe9to předvolby se nepodařilo spustit konfiguraci. Zkuste to pros\xedm znovu."],"sdk.presets.detail.close.label":["Zavř\xedt"],"sdk.presets.detail.learnMore.label":["Dozvědět se v\xedce"],"sdk.presets.detail.select.label":["Vybrat"],"sdk.presets.preview.title":["N\xe1hled"],"sdk.presets.select.button.label":["Vybrat"],"sdk.presets.start.button.label":["Zač\xedt"],"sdk.preview.customize.title":["Přizpůsobit"],"sdk.preview.start.button.label":["Zač\xedt"],"sdk.sketching.angle.apply.label":["Použ\xedt"],"sdk.sketching.angle.cancel.label":["Zrušit"],"sdk.sketching.angle.control.label":["\xdahel"],"sdk.sketching.angle.control.text":["Upravit \xfahel"],"sdk.sketching.angle.control.title":["Nastavit \xfahel"],"sdk.sketching.angle.input.error":["Zadejte platn\xe9 č\xedslo!"],"sdk.sketching.dimension.apply.label":["Použ\xedt"],"sdk.sketching.dimension.cancel.label":["Zrušit"],"sdk.sketching.dimension.depth.label":["Hloubka"],"sdk.sketching.dimension.depth.text":["Upravit hloubku"],"sdk.sketching.dimension.depth.title":["Nastavit hloubku"],"sdk.sketching.dimension.input.error":["Zadejte platn\xe9 č\xedslo!"],"sdk.sketching.dimension.length.label":["D\xe9lka"],"sdk.sketching.dimension.length.text":["Upravit d\xe9lku"],"sdk.sketching.dimension.length.title":["Nastavit d\xe9lku"],"sdk.sketching.dimension.width.label":["Š\xedřka"],"sdk.sketching.dimension.width.text":["Upravit š\xedřku"],"sdk.sketching.dimension.width.title":["Nastavit š\xedřku"],"sdk.sketching.draw.done.label":["Hotovo"],"sdk.sketching.spotlight.label":["Klikněte pro zač\xe1tek kreslen\xed"],"sdk.toolbar.actions.undoRedo.label":["Zpět/Vpřed"],"sdk.toolbar.camera.reset.label":["Resetovat kameru"],"sdk.toolbar.camera.reset.labelAriaLabel":["Resetovat kameru na v\xfdchoz\xed pozici"],"sdk.toolbar.fullscreen.enter.label":["Cel\xe1 obrazovka"],"sdk.toolbar.fullscreen.exit.label":["Ukončit celou obrazovku"],"sdk.toolbar.help.close.label":["Zavř\xedt n\xe1povědu"],"sdk.toolbar.help.label":["N\xe1pověda"],"sdk.toolbar.language.title":["Jazyk"],"sdk.toolbar.measurements.change.aria":["Změnit měřen\xed"],"sdk.toolbar.measurements.indicators.label":["Indik\xe1tory měřen\xed"],"sdk.toolbar.measurements.input.aria":["Změnit vstup měřen\xed"],"sdk.toolbar.measurements.units.aria":["Změnit jednotky měřen\xed"],"sdk.toolbar.mobile.fullscreen.enter.label":["Cel\xe1 obrazovka"],"sdk.toolbar.mobile.fullscreen.exit.label":["Ukončit celou obrazovku"],"sdk.toolbar.mobile.fullscreen.title":["Cel\xe1 obrazovka"],"sdk.toolbar.mobile.open.aria":["Otevř\xedt mobiln\xed n\xe1stroje"],"sdk.toolbar.mobile.viewControls.label":["Ovl\xe1d\xe1n\xed zobrazen\xed"],"sdk.toolbar.share.allowEdit.label":["Povolit \xfapravy"],"sdk.toolbar.share.allowEditShort.label":["\xdapravy"],"sdk.toolbar.share.close.label":["Zavř\xedt"],"sdk.toolbar.share.copiedLinkButtonTitle":["Odkaz zkop\xedrov\xe1n"],"sdk.toolbar.share.copyLink.label":["Kop\xedrovat odkaz"],"sdk.toolbar.share.copyLinkButtonTitle":["Kop\xedrovat odkaz"],"sdk.toolbar.share.input.aria":["Vstup pro sd\xedlen\xed odkazu"],"sdk.toolbar.share.label":["Sd\xedlet"],"sdk.toolbar.share.linkCopied.label":["Odkaz zkop\xedrov\xe1n"],"sdk.toolbar.share.loading.label":["Nač\xedt\xe1n\xed..."],"sdk.toolbar.share.open.label":["Otevř\xedt"],"sdk.toolbar.share.section.label":["Sd\xedlet"],"sdk.toolbar.undoRedo.redo.label":["Vpřed"],"sdk.toolbar.undoRedo.undo.label":["Zpět"],"sdk.toolbar.viewControls.title":["Ovl\xe1d\xe1n\xed zobrazen\xed"],"sdk.totalPrice":["Celkov\xe1 cena"]}');
1
+ export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.admin.error.system.message":["Moment\xe1lně m\xe1me technick\xe9 probl\xe9my. Zkuste to pros\xedm za p\xe1r minut. Děkujeme za vaši trpělivost!"],"sdk.admin.error.system.title":["Syst\xe9mov\xe1 chyba"],"sdk.angleDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je větš\xed než povolen\xe9 maximum ",["limitWithUnit"],"."],"sdk.angleDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je menš\xed než povolen\xe9 minimum ",["limitWithUnit"],"."],"sdk.assistant.composer.disclaimer":["AI se může m\xfdlit. V\xfdsledek si zkontrolujte."],"sdk.assistant.composer.placeholder":["Zeptejte se nebo napište, co změnit…"],"sdk.assistant.composer.send.label":["Odeslat"],"sdk.assistant.composer.stop.label":["Zastavit"],"sdk.assistant.failure.busy":["Asistent ještě pracuje na předchoz\xed zpr\xe1vě."],"sdk.assistant.failure.notAvailable":["Asistent zde nen\xed dostupn\xfd."],"sdk.assistant.failure.retry.label":["Zkusit znovu"],"sdk.assistant.failure.unavailable":["Asistent teď nen\xed dostupn\xfd."],"sdk.assistant.panel.close.label":["Zavř\xedt asistenta"],"sdk.assistant.panel.title":["Asistent"],"sdk.assistant.thread.earlierSummarized":["Dř\xedvějš\xed konverzace shrnuta"],"sdk.assistant.thread.greeting":["Dobr\xfd den. Mohu odpov\xeddat na ot\xe1zky k tomuto n\xe1vrhu a upravovat ho s v\xe1mi. Napište, co potřebujete."],"sdk.assistant.thread.loading":["Nač\xedt\xe1m konverzaci…"],"sdk.assistant.thread.loadingEarlier":["Nač\xedt\xe1m dř\xedvějš\xed konverzaci…"],"sdk.assistant.thread.newReply.label":["Nov\xe1 odpověď"],"sdk.assistant.thread.resuming":["Obnovuji konverzaci…"],"sdk.assistant.thread.showEarlier.label":["Zobrazit dř\xedvějš\xed konverzaci"],"sdk.assistant.thread.thinking":["Přem\xfdšl\xedm…"],"sdk.assistant.tool.cancelled.hint":["Zastaveno před dokončen\xedm."],"sdk.assistant.tool.mistake.hint":["Asistent udělal chybu."],"sdk.assistant.tool.noResult.hint":["V\xfdsledek tohoto kroku se ztratil. Krok mohl, ale nemusel b\xfdt proveden."],"sdk.assistant.tool.readDesign.label":["Čten\xed n\xe1vrhu"],"sdk.assistant.tool.toolBudget.hint":["Neprovedeno: asistent dos\xe1hl limitu kroků pro jednu zpr\xe1vu."],"sdk.assistant.tool.undo.label":["Zpět"],"sdk.assistant.tool.updateDesign.label":["\xdaprava n\xe1vrhu"],"sdk.assistant.toolbarButton.label":["Asistent"],"sdk.chat.disclaimer.close.label":["Zavř\xedt"],"sdk.chat.disclaimer.dialog.title":["Ozn\xe1men\xed o asistentovi"],"sdk.chat.disclaimer.full.message":["<0>N\xe1sleduj\xedc\xed prohl\xe1šen\xed m\xe1 za c\xedl informovat uživatele o omezen\xedch a pokynech pro použ\xedv\xe1n\xed AI chatbota dostupn\xe9ho na tomto webu. Před komunikac\xed s chatbotem si pros\xedm pozorně přečtěte toto prohl\xe1šen\xed.</0><1><2>Obecn\xe9 informace:</2> AI chatbot je automatizovan\xfd syst\xe9m poh\xe1něn\xfd OpenAI/ChatGPT. Je navržen tak, aby poskytoval informace a pomoc na z\xe1kladě dostupn\xfdch informac\xed o produktech nab\xedzen\xfdch na tomto webu. I když se snaž\xedme poskytovat přesn\xe9 informace prostřednictv\xedm AI chatbota, nemůžeme zaručit přesnost, \xfaplnost nebo aktu\xe1lnost poskytovan\xfdch informac\xed. Doporučujeme použ\xedvat odpovědi jako v\xfdchoz\xed bod a ověřovat odpovědi u poskytovatele těchto informac\xed (vlastn\xedka tohoto webu) nebo jak\xe9koli dostupn\xe9 produktov\xe9 dokumentace.</1><3><4>Odpovědnost uživatele:</4> Uživatel\xe9 AI chatbota nesou v\xfdhradn\xed odpovědnost za sv\xe9 interakce a spol\xe9h\xe1n\xed na poskytovan\xe9 informace. Je důležit\xe9 b\xfdt opatrn\xfd a použ\xedvat vlastn\xed \xfasudek při interpretaci a jedn\xe1n\xed na z\xe1kladě odpověd\xed chatbota. Ani vlastn\xedk tohoto webu, ani poskytovatel technologie chatbota nelze činit odpovědn\xfdm za jak\xe9koli činy, ztr\xe1ty nebo škody vypl\xfdvaj\xedc\xed z použ\xedv\xe1n\xed chatbota.</3><5><6>Ochrana \xfadajů a bezpečnost:</6> Upřednostňujeme ochranu a bezpečnost informac\xed uživatelů. Mějte na paměti, že konverzace s chatbotem mohou b\xfdt zkontrolov\xe1ny vlastn\xedkem tohoto webu a poskytovatelem technologie za \xfačelem zlepšen\xed v\xfdsledků. Zat\xedmco OpenAI/ChatGPT uchov\xe1v\xe1 z\xe1znamy těchto konverzac\xed po dobu 30 dnů, tato data se nepouž\xedvaj\xed k tr\xe9nov\xe1n\xed jejich AI modelů. Nesd\xedlejte ž\xe1dn\xe9 citliv\xe9 nebo osobn\xed informace ve sv\xfdch konverzac\xedch.</5><7>Použ\xedv\xe1n\xedm tohoto AI chatbota vyjadřujete svůj souhlas a porozuměn\xed v\xfdše uveden\xe9mu prohl\xe1šen\xed. Pokud nesouhlas\xedte s kteroukoli č\xe1st\xed tohoto prohl\xe1šen\xed, doporučujeme chatbot nepouž\xedvat.</7>"],"sdk.chat.disclaimer.inline.message":["Asistent je experiment\xe1ln\xed a může poskytovat nepřesn\xe9 informace."],"sdk.chat.disclaimer.seeMore.label":["V\xedce informac\xed"],"sdk.chat.header.desktop.title":["Asistent"],"sdk.chat.input.default.placeholder":["Napište zpr\xe1vu..."],"sdk.chat.input.footer.placeholder":["Napište zpr\xe1vu..."],"sdk.chat.mobile.assistant.label":["Asistent"],"sdk.chat.send.button.label":["Odeslat zpr\xe1vu"],"sdk.chat.system.error.message":["Došlo k chybě při komunikaci s asistentem. Zkuste to pros\xedm znovu."],"sdk.chat.welcome.greeting.message":["Ahoj! Jsem v\xe1š asistent a pomohu v\xe1m s konfigurac\xed produktu. Na co se chcete zeptat?"],"sdk.collision.warning.tooltip":["Předměty jsou př\xedliš bl\xedzko nebo se překr\xfdvaj\xed"],"sdk.controls.dimension.angle.error":["Neplatn\xfd \xfahel"],"sdk.controls.dimension.angle.hint":["Zadejte \xfahel"],"sdk.controls.dimension.angle.hintRange":["Zadejte č\xedslo mezi ",["0"],["unitLabelWithSpace"]," a ",["1"],["unitLabelWithSpace"],"."],"sdk.controls.dimension.angleSlider.error":["Neplatn\xfd \xfahel"],"sdk.controls.dimension.distance.error":["Neplatn\xe1 vzd\xe1lenost"],"sdk.controls.dimension.distance.hint":["Zadejte vzd\xe1lenost"],"sdk.controls.dimension.distance.hintRange":["Vzd\xe1lenost mus\xed b\xfdt mezi ",["0"]," a ",["1"]],"sdk.controls.dimension.distanceSlider.error":["Neplatn\xe1 vzd\xe1lenost"],"sdk.controls.dimension.generic.error":["Neplatn\xe1 hodnota"],"sdk.controls.dimension.generic.hint":["Zadejte hodnotu"],"sdk.controls.dimension.generic.hintRange":["Hodnota mus\xed b\xfdt mezi ",["min"]," a ",["max"]],"sdk.controls.dimension.genericSlider.error":["Neplatn\xe1 hodnota"],"sdk.controls.dimension.indicator.apply":["Použ\xedt"],"sdk.controls.dimension.indicator.cancel":["Zrušit"],"sdk.controls.dimension.offset.hint":["Zadejte odsazen\xed"],"sdk.controls.dimension.size.hint":["Zadejte rozměr"],"sdk.controls.entity.add.close.label":["Zavř\xedt"],"sdk.controls.entity.add.nothingMessage":["Ž\xe1dn\xe9 položky k přid\xe1n\xed"],"sdk.controls.entity.childDelete.label":["Smazat"],"sdk.controls.entity.childSelect.label":["Vybrat"],"sdk.controls.entity.delete.label":["Smazat"],"sdk.controls.entity.replace.label":["Nahradit"],"sdk.controls.property.back.label":["Zpět"],"sdk.controls.recipeGroup.notFound.message":["Nenalezeno"],"sdk.controls.recipeGroup.notFound.title":["Skupina, kterou hled\xe1te, již nen\xed k dispozici. Vyberte pros\xedm jinou skupinu."],"sdk.controls.tool.close.label":["Zavř\xedt"],"sdk.controls.units.feet.label":["stopy"],"sdk.controls.units.inch.label":["palce"],"sdk.controls.upload.dragDrop.hint":["Přet\xe1hněte soubory sem nebo klikněte pro v\xfdběr"],"sdk.controls.upload.failed.error":["Nahr\xe1v\xe1n\xed se nezdařilo"],"sdk.controls.upload.link.label":["Nebo vložte odkaz"],"sdk.controls.upload.size.error":["Soubor je př\xedliš velk\xfd"],"sdk.distanceDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["0"],", což je větš\xed než povolen\xe9 maximum ",["1"],"."],"sdk.distanceDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["0"],", což je menš\xed než povolen\xe9 minimum ",["1"],"."],"sdk.finalize.notConfigured.tooltip":["Funkce dokončen\xed nen\xed nakonfigurov\xe1na."],"sdk.finalize.outOfSync.hint":["Konfigurace nen\xed synchronizov\xe1na. Někter\xe9 změny nebyly spr\xe1vně uloženy."],"sdk.genericDimension.hintMessageTooLarge":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je větš\xed než povolen\xe9 maximum ",["limitWithUnit"],"."],"sdk.genericDimension.hintMessageTooSmall":["Aktu\xe1ln\xed hodnota je ",["currentWithUnit"],", což je menš\xed než povolen\xe9 minimum ",["limitWithUnit"],"."],"sdk.layout.banner.readonly.cancel.label":["Zrušit"],"sdk.layout.banner.readonly.clone.label":["Klonovat pro \xfapravy"],"sdk.layout.banner.readonly.clone.message":["Chcete vytvořit kopii t\xe9to konfigurace pro \xfapravy?"],"sdk.layout.banner.readonly.clone.title":["Klonovat konfiguraci"],"sdk.layout.banner.readonly.editConfig.label":["Upravit konfiguraci"],"sdk.layout.banner.readonly.editMobile.label":["Upravit"],"sdk.layout.banner.readonly.info.message":["Tato konfigurace je pouze pro čten\xed. Chcete-li ji upravit, vytvořte kopii."],"sdk.layout.button.closeConfigurator.label":["Zavř\xedt konfigur\xe1tor"],"sdk.layout.button.closePresetPreview.label":["Zavř\xedt n\xe1hled přednastaven\xed"],"sdk.layout.button.desktopBack.label":["Zpět"],"sdk.layout.button.desktopSidebarBack.label":["Zpět"],"sdk.layout.button.mobileBack.label":["Zpět"],"sdk.layout.button.mobileSidebarBack.label":["Zpět"],"sdk.layout.button.presetBack.label":["Zpět"],"sdk.layout.button.saveRecipe.label":["Uložit recept"],"sdk.layout.button.saveTemplate.label":["Uložit šablonu"],"sdk.layout.button.setTemplate.label":["Nastavit jako šablonu"],"sdk.layout.controls.mobile.view3d.label":["3D zobrazen\xed"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Pouze pro zobrazen\xed.</0> Pro \xfapravy konfigurace použijte zař\xedzen\xed s větš\xed obrazovkou."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Pouze pro zobrazen\xed.</0> Pro \xfapravy konfigurace použijte zař\xedzen\xed s větš\xed obrazovkou nebo zkuste změnit orientaci zař\xedzen\xed."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Celkov\xe1 cena"],"sdk.layout.hamburgerMenu.language.dialogTitle":["Vyberte jazyk"],"sdk.layout.hamburgerMenu.language.label":["Jazyk"],"sdk.layout.menu.hamburger.close.label":["Zavř\xedt"],"sdk.layout.menu.hamburger.help.label":["N\xe1pověda"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Zavř\xedt n\xe1povědu"],"sdk.layout.menu.hamburger.share.label":["Sd\xedlet"],"sdk.layout.menu.hamburger.title":["Menu"],"sdk.layout.menu.hamburger.tooltip":["Otevř\xedt menu"],"sdk.layout.menu.language.close.label":["Zavř\xedt"],"sdk.layout.menu.measurements.close.label":["Zavř\xedt"],"sdk.layout.menu.measurements.label":["Měřen\xed"],"sdk.layout.navigation.common.product.label":["Produkt"],"sdk.layout.navigation.mobile.product.label":["Produkt"],"sdk.layout.navigation.steps.first.label":["Prvn\xed"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Dokončit"],"sdk.layout.sidebar.finalize.label":["Dokončit"],"sdk.layout.sidebar.finalizePage.label":["Dokončit"],"sdk.layout.sidebar.nextStep.label":["Dalš\xed krok"],"sdk.layout.sidebar.nextStepShort.label":["Dalš\xed"],"sdk.layout.sidebar.previousStep.label":["Předchoz\xed krok"],"sdk.layout.sidebar.price.label":["Cena"],"sdk.layout.sidebar.totalPrice.label":["Celkov\xe1 cena"],"sdk.layout.summary.button.label":["Shrnut\xed"],"sdk.layout.toolbar.mobile.tools.title":["N\xe1stroje"],"sdk.layout.toolbar.mobile.units.label":["Jednotky"],"sdk.measurements":["Měřen\xed"],"sdk.messages.error.configNotFound.message":["Konfigurace nebyla nalezena. Možn\xe1 byla smaz\xe1na nebo jste zadali nespr\xe1vn\xfd odkaz."],"sdk.messages.error.configNotFound.title":["Konfigurace nenalezena"],"sdk.messages.error.configurator.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.configurator.message":["Hopsa, něco se pokazilo! Zkuste to pros\xedm znovu nebo kontaktujte podporu."],"sdk.messages.error.configurator.title":["Chyba konfigur\xe1toru"],"sdk.messages.error.configuratorRoot.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.configuratorRoot.message":["Konfigur\xe1tor nen\xed dostupn\xfd. Zkuste to pros\xedm znovu později."],"sdk.messages.error.configuratorRoot.title":["Konfigur\xe1tor nedostupn\xfd"],"sdk.messages.error.gpuDisabled.message":["GPU akcelerace je zak\xe1z\xe1na. V\xfdkon může b\xfdt sn\xedžen. Pro lepš\xed v\xfdkon povolte hardware akceleraci v nastaven\xed prohl\xedžeče."],"sdk.messages.error.gpuDisabled.title":["GPU akcelerace zak\xe1z\xe1na"],"sdk.messages.error.notFound.backToHome.label":["Zpět na domovskou str\xe1nku"],"sdk.messages.error.webglNotSupported.message":["V\xe1š prohl\xedžeč nepodporuje WebGL, kter\xfd je potřebn\xfd pro 3D zobrazen\xed. Zkuste použ\xedt jin\xfd prohl\xedžeč nebo aktualizovat st\xe1vaj\xedc\xed."],"sdk.messages.error.webglNotSupported.title":["WebGL nen\xed podporov\xe1n"],"sdk.messages.finalize.error":["Oops, něco se pokazilo"],"sdk.messages.navigation.goToHomepage.label":["Přej\xedt na domovskou str\xe1nku"],"sdk.messages.otherAction.error":["Oops, něco se pokazilo"],"sdk.messages.system.invalidDeployment.close.label":["Zavř\xedt"],"sdk.messages.system.invalidDeployment.message":["Toto nasazen\xed nen\xed platn\xe9 nebo bylo smaz\xe1no."],"sdk.messages.system.invalidDeployment.title":["Neplatn\xe9 nasazen\xed"],"sdk.messages.validation.uncaughtError.message":["Došlo k neoček\xe1van\xe9 chybě. Zkuste to pros\xedm znovu."],"sdk.persist.system.error.dismiss":["Zavř\xedt"],"sdk.persist.system.error.message":["Při pokusu o aktualizaci konfigurace došlo k chybě"],"sdk.persist.system.error.recovered":["Konfigurace aktualizov\xe1na"],"sdk.presets.category.count.message":[["count"]," přednastaven\xed"],"sdk.presets.category.heading.title":["Kategorie"],"sdk.presets.create.error.dismiss.label":["Zavř\xedt"],"sdk.presets.create.error.message":["Z t\xe9to předvolby se nepodařilo spustit konfiguraci. Zkuste to pros\xedm znovu."],"sdk.presets.detail.close.label":["Zavř\xedt"],"sdk.presets.detail.learnMore.label":["Dozvědět se v\xedce"],"sdk.presets.detail.select.label":["Vybrat"],"sdk.presets.preview.title":["N\xe1hled"],"sdk.presets.select.button.label":["Vybrat"],"sdk.presets.start.button.label":["Zač\xedt"],"sdk.preview.customize.title":["Přizpůsobit"],"sdk.preview.start.button.label":["Zač\xedt"],"sdk.sketching.angle.apply.label":["Použ\xedt"],"sdk.sketching.angle.cancel.label":["Zrušit"],"sdk.sketching.angle.control.label":["\xdahel"],"sdk.sketching.angle.control.text":["Upravit \xfahel"],"sdk.sketching.angle.control.title":["Nastavit \xfahel"],"sdk.sketching.angle.input.error":["Zadejte platn\xe9 č\xedslo!"],"sdk.sketching.dimension.apply.label":["Použ\xedt"],"sdk.sketching.dimension.cancel.label":["Zrušit"],"sdk.sketching.dimension.depth.label":["Hloubka"],"sdk.sketching.dimension.depth.text":["Upravit hloubku"],"sdk.sketching.dimension.depth.title":["Nastavit hloubku"],"sdk.sketching.dimension.input.error":["Zadejte platn\xe9 č\xedslo!"],"sdk.sketching.dimension.length.label":["D\xe9lka"],"sdk.sketching.dimension.length.text":["Upravit d\xe9lku"],"sdk.sketching.dimension.length.title":["Nastavit d\xe9lku"],"sdk.sketching.dimension.width.label":["Š\xedřka"],"sdk.sketching.dimension.width.text":["Upravit š\xedřku"],"sdk.sketching.dimension.width.title":["Nastavit š\xedřku"],"sdk.sketching.draw.done.label":["Hotovo"],"sdk.sketching.spotlight.label":["Klikněte pro zač\xe1tek kreslen\xed"],"sdk.toolbar.actions.undoRedo.label":["Zpět/Vpřed"],"sdk.toolbar.camera.reset.label":["Resetovat kameru"],"sdk.toolbar.camera.reset.labelAriaLabel":["Resetovat kameru na v\xfdchoz\xed pozici"],"sdk.toolbar.fullscreen.enter.label":["Cel\xe1 obrazovka"],"sdk.toolbar.fullscreen.exit.label":["Ukončit celou obrazovku"],"sdk.toolbar.help.close.label":["Zavř\xedt n\xe1povědu"],"sdk.toolbar.help.label":["N\xe1pověda"],"sdk.toolbar.language.title":["Jazyk"],"sdk.toolbar.measurements.change.aria":["Změnit měřen\xed"],"sdk.toolbar.measurements.indicators.label":["Indik\xe1tory měřen\xed"],"sdk.toolbar.measurements.input.aria":["Změnit vstup měřen\xed"],"sdk.toolbar.measurements.units.aria":["Změnit jednotky měřen\xed"],"sdk.toolbar.mobile.fullscreen.enter.label":["Cel\xe1 obrazovka"],"sdk.toolbar.mobile.fullscreen.exit.label":["Ukončit celou obrazovku"],"sdk.toolbar.mobile.fullscreen.title":["Cel\xe1 obrazovka"],"sdk.toolbar.mobile.open.aria":["Otevř\xedt mobiln\xed n\xe1stroje"],"sdk.toolbar.mobile.viewControls.label":["Ovl\xe1d\xe1n\xed zobrazen\xed"],"sdk.toolbar.share.allowEdit.label":["Povolit \xfapravy"],"sdk.toolbar.share.allowEditShort.label":["\xdapravy"],"sdk.toolbar.share.close.label":["Zavř\xedt"],"sdk.toolbar.share.copiedLinkButtonTitle":["Odkaz zkop\xedrov\xe1n"],"sdk.toolbar.share.copyLink.label":["Kop\xedrovat odkaz"],"sdk.toolbar.share.copyLinkButtonTitle":["Kop\xedrovat odkaz"],"sdk.toolbar.share.input.aria":["Vstup pro sd\xedlen\xed odkazu"],"sdk.toolbar.share.label":["Sd\xedlet"],"sdk.toolbar.share.linkCopied.label":["Odkaz zkop\xedrov\xe1n"],"sdk.toolbar.share.loading.label":["Nač\xedt\xe1n\xed..."],"sdk.toolbar.share.open.label":["Otevř\xedt"],"sdk.toolbar.share.section.label":["Sd\xedlet"],"sdk.toolbar.undoRedo.redo.label":["Vpřed"],"sdk.toolbar.undoRedo.undo.label":["Zpět"],"sdk.toolbar.viewControls.title":["Ovl\xe1d\xe1n\xed zobrazen\xed"],"sdk.totalPrice":["Celkov\xe1 cena"]}');
@@ -1 +1 @@
1
- export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Tilbage til hjemmesiden"],"sdk.admin.error.system.message":["Vi oplever i \xf8jeblikket tekniske problemer. Pr\xf8v igen om et par minutter. Tak for din t\xe5lmodighed!"],"sdk.admin.error.system.title":["Systemfejl"],"sdk.angleDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["limitWithUnit"],"."],"sdk.angleDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er mindre end det tilladte minimum p\xe5 ",["limitWithUnit"],"."],"sdk.assistant.composer.disclaimer":["AI kan tage fejl. Kontroll\xe9r resultatet."],"sdk.assistant.composer.placeholder":["Sp\xf8rg, eller fort\xe6l mig, hvad der skal \xe6ndres…"],"sdk.assistant.composer.send.label":["Send"],"sdk.assistant.composer.stop.label":["Stop"],"sdk.assistant.failure.busy":["Assistenten arbejder stadig p\xe5 en tidligere besked."],"sdk.assistant.failure.notAvailable":["Assistenten er ikke tilg\xe6ngelig her."],"sdk.assistant.failure.retry.label":["Pr\xf8v igen"],"sdk.assistant.failure.unavailable":["Assistenten er ikke tilg\xe6ngelig lige nu."],"sdk.assistant.panel.close.label":["Luk assistenten"],"sdk.assistant.panel.title":["Assistent"],"sdk.assistant.thread.earlierSummarized":["Tidligere samtale opsummeret"],"sdk.assistant.thread.greeting":["Hej. Jeg kan svare p\xe5 sp\xf8rgsm\xe5l om dette design og \xe6ndre det sammen med dig. Fort\xe6l mig, hvad du har brug for."],"sdk.assistant.thread.loading":["Indl\xe6ser samtalen…"],"sdk.assistant.thread.loadingEarlier":["Indl\xe6ser den tidligere samtale…"],"sdk.assistant.thread.newReply.label":["Nyt svar"],"sdk.assistant.thread.resuming":["Genoptager samtalen…"],"sdk.assistant.thread.showEarlier.label":["Vis tidligere samtale"],"sdk.assistant.thread.thinking":["T\xe6nker…"],"sdk.assistant.tool.cancelled.hint":["Stoppet, f\xf8r det blev f\xe6rdigt."],"sdk.assistant.tool.mistake.hint":["Assistenten lavede en fejl."],"sdk.assistant.tool.noResult.hint":["Resultatet af dette trin gik tabt. Det er m\xe5ske blevet udf\xf8rt, m\xe5ske ikke."],"sdk.assistant.tool.readDesign.label":["L\xe6s design"],"sdk.assistant.tool.toolBudget.hint":["Ikke udf\xf8rt: assistenten n\xe5ede sin gr\xe6nse for trin til \xe9n besked."],"sdk.assistant.tool.updateDesign.label":["Opdater design"],"sdk.assistant.toolbarButton.label":["Assistent"],"sdk.chat.disclaimer.close.label":["Luk"],"sdk.chat.disclaimer.dialog.title":["AI-assistent disclaimer"],"sdk.chat.disclaimer.full.message":["<0>F\xf8lgende ansvarsfraskrivelse er beregnet til at informere brugere om begr\xe6nsningerne og brugerretningslinjerne for AI-chatbotten, der er tilg\xe6ngelig p\xe5 dette websted. L\xe6s venligst denne ansvarsfraskrivelse omhyggeligt, f\xf8r du interagerer med chatbotten.</0><1><2>Generelle oplysninger:</2> AI-chatbotten er et automatiseret system drevet af OpenAI/ChatGPT. Den er designet til at give information og assistance baseret p\xe5 tilg\xe6ngelige oplysninger om de produkter, der tilbydes p\xe5 dette websted. Selvom vi str\xe6ber efter at levere n\xf8jagtige oplysninger gennem AI-chatbotten, kan vi ikke garantere n\xf8jagtigheden, fuldst\xe6ndigheden eller aktualiteten af de leverede oplysninger. Vi anbefaler, at du bruger svarene som udgangspunkt og verificerer svarene med udbyderen af disse oplysninger (ejeren af dette websted) eller enhver tilg\xe6ngelig produktdokumentation.</1><3><4>Brugeransvar:</4> Brugere af AI-chatbotten b\xe6rer det fulde ansvar for deres interaktioner og afh\xe6ngighed af de leverede oplysninger. Det er vigtigt at udvise forsigtighed og bruge dit sk\xf8n, n\xe5r du fortolker og handler p\xe5 baggrund af chatbottens svar. Hverken ejeren af dette websted eller udbyderen af chatbot-teknologien kan holdes ansvarlig for handlinger, tab eller skader som f\xf8lge af brugen af chatbotten.</3><5><6>Databeskyttelse og sikkerhed:</6> Vi prioriterer beskyttelse og sikkerhed af brugernes oplysninger. V\xe6r opm\xe6rksom p\xe5, at chatbot-samtaler kan blive gennemg\xe5et af ejeren af dette websted og udbyderen af teknologien for at forbedre resultaterne. Selvom OpenAI/ChatGPT opbevarer logfiler af disse samtaler i 30 dage, bruges disse data ikke til at tr\xe6ne deres AI-modeller. Del ikke f\xf8lsomme eller personlige oplysninger i dine samtaler.</5><7>Ved at bruge denne AI-chatbot angiver du din accept og forst\xe5else af ovenst\xe5ende ansvarsfraskrivelse. Hvis du ikke er enig i nogen del af denne ansvarsfraskrivelse, anbefaler vi, at du ikke bruger chatbotten.</7>"],"sdk.chat.disclaimer.inline.message":["AI-assistent kan give fejlagtige oplysninger."],"sdk.chat.disclaimer.seeMore.label":["Se mere"],"sdk.chat.header.desktop.title":["AI-assistent"],"sdk.chat.input.default.placeholder":["Sp\xf8rg mig om noget..."],"sdk.chat.input.footer.placeholder":["Skriv din besked her..."],"sdk.chat.mobile.assistant.label":["Assistent"],"sdk.chat.send.button.label":["Send besked"],"sdk.chat.system.error.message":["Der opstod en fejl. Pr\xf8v igen senere."],"sdk.chat.welcome.greeting.message":["Hej! Jeg er din AI-assistent. Hvordan kan jeg hj\xe6lpe dig i dag?"],"sdk.collision.warning.tooltip":["Elementer er for t\xe6t eller overlapper"],"sdk.controls.dimension.angle.error":["Ugyldig vinkelv\xe6rdi"],"sdk.controls.dimension.angle.hint":["Indtast vinkel i grader"],"sdk.controls.dimension.angle.hintRange":["Angiv et tal mellem ",["0"],["unitLabelWithSpace"]," og ",["1"],["unitLabelWithSpace"],"."],"sdk.controls.dimension.angleSlider.error":["Ugyldig vinkelv\xe6rdi"],"sdk.controls.dimension.distance.error":["Ugyldig afstandsv\xe6rdi"],"sdk.controls.dimension.distance.hint":["Indtast afstand"],"sdk.controls.dimension.distance.hintRange":["Afstand skal v\xe6re mellem ",["0"]," og ",["1"]],"sdk.controls.dimension.distanceSlider.error":["Ugyldig afstandsv\xe6rdi"],"sdk.controls.dimension.generic.error":["Ugyldig v\xe6rdi"],"sdk.controls.dimension.generic.hint":["Indtast v\xe6rdi"],"sdk.controls.dimension.generic.hintRange":["V\xe6rdi skal v\xe6re mellem ",["min"]," og ",["max"]],"sdk.controls.dimension.genericSlider.error":["Ugyldig v\xe6rdi"],"sdk.controls.dimension.indicator.apply":["Anvend"],"sdk.controls.dimension.indicator.cancel":["Annuller"],"sdk.controls.dimension.offset.hint":["Indtast forskydning"],"sdk.controls.dimension.size.hint":["Indtast st\xf8rrelse"],"sdk.controls.entity.add.close.label":["Luk"],"sdk.controls.entity.add.nothingMessage":["Intet at tilf\xf8je"],"sdk.controls.entity.childDelete.label":["Slet"],"sdk.controls.entity.childSelect.label":["V\xe6lg"],"sdk.controls.entity.delete.label":["Slet"],"sdk.controls.entity.replace.label":["Erstat"],"sdk.controls.property.back.label":["Tilbage"],"sdk.controls.recipeGroup.notFound.message":["Ikke fundet"],"sdk.controls.recipeGroup.notFound.title":["Gruppen, du leder efter, er ikke l\xe6ngere tilg\xe6ngelig. V\xe6lg venligst en anden gruppe."],"sdk.controls.tool.close.label":["Luk"],"sdk.controls.units.feet.label":["fod"],"sdk.controls.units.inch.label":["tomme"],"sdk.controls.upload.dragDrop.hint":["Tr\xe6k og slip filer her eller klik for at v\xe6lge"],"sdk.controls.upload.failed.error":["Upload fejlede"],"sdk.controls.upload.link.label":["Eller indtast et link"],"sdk.controls.upload.size.error":["Filen er for stor"],"sdk.distanceDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["0"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["1"],"."],"sdk.distanceDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["0"],", som er mindre end det tilladte minimum p\xe5 ",["1"],"."],"sdk.finalize.notConfigured.tooltip":["Finaliserings-funktionen er ikke konfigureret."],"sdk.finalize.outOfSync.hint":["Konfigurationen er ikke synkroniseret. Nogle \xe6ndringer er ikke blevet korrekt gemt."],"sdk.genericDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["limitWithUnit"],"."],"sdk.genericDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er mindre end det tilladte minimum p\xe5 ",["limitWithUnit"],"."],"sdk.layout.banner.readonly.cancel.label":["Annuller"],"sdk.layout.banner.readonly.clone.label":["Klon for at redigere"],"sdk.layout.banner.readonly.clone.message":["Denne konfiguration er skrivebeskyttet. Du kan klone den for at lave \xe6ndringer."],"sdk.layout.banner.readonly.clone.title":["Skrivebeskyttet konfiguration"],"sdk.layout.banner.readonly.editConfig.label":["Rediger konfiguration"],"sdk.layout.banner.readonly.editMobile.label":["Rediger"],"sdk.layout.banner.readonly.info.message":["Denne konfiguration er skrivebeskyttet"],"sdk.layout.button.closeConfigurator.label":["Luk konfigurator"],"sdk.layout.button.closePresetPreview.label":["Luk forh\xe5ndsvisning"],"sdk.layout.button.desktopBack.label":["Tilbage"],"sdk.layout.button.desktopSidebarBack.label":["Tilbage"],"sdk.layout.button.mobileBack.label":["Tilbage"],"sdk.layout.button.mobileSidebarBack.label":["Tilbage"],"sdk.layout.button.presetBack.label":["Tilbage"],"sdk.layout.button.saveRecipe.label":["Gem opskrift"],"sdk.layout.button.saveTemplate.label":["Gem skabelon"],"sdk.layout.button.setTemplate.label":["S\xe6t som skabelon"],"sdk.layout.controls.mobile.view3d.label":["3D-visning"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Kun visning tilg\xe6ngelig.</0> For at \xe6ndre konfigurationen skal du bruge en enhed med en st\xf8rre sk\xe6rm."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Kun visning tilg\xe6ngelig.</0> For at \xe6ndre konfigurationen skal du bruge en enhed med en st\xf8rre sk\xe6rm eller pr\xf8ve at \xe6ndre din enheds orientering."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Samlet pris"],"sdk.layout.hamburgerMenu.language.dialogTitle":["V\xe6lg sprog"],"sdk.layout.hamburgerMenu.language.label":["Sprog"],"sdk.layout.menu.hamburger.close.label":["Luk"],"sdk.layout.menu.hamburger.help.label":["Hj\xe6lp"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Luk hj\xe6lp"],"sdk.layout.menu.hamburger.share.label":["Del"],"sdk.layout.menu.hamburger.title":["Menu"],"sdk.layout.menu.hamburger.tooltip":["\xc5bn menu"],"sdk.layout.menu.language.close.label":["Luk"],"sdk.layout.menu.measurements.close.label":["Luk"],"sdk.layout.menu.measurements.label":["M\xe5linger"],"sdk.layout.navigation.common.product.label":["Produkt"],"sdk.layout.navigation.mobile.product.label":["Produkt"],"sdk.layout.navigation.steps.first.label":["F\xf8rste"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Afslut"],"sdk.layout.sidebar.finalize.label":["Finaliser"],"sdk.layout.sidebar.finalizePage.label":["G\xe5 til finalisering"],"sdk.layout.sidebar.nextStep.label":["N\xe6ste trin"],"sdk.layout.sidebar.nextStepShort.label":["N\xe6ste"],"sdk.layout.sidebar.previousStep.label":["Forrige trin"],"sdk.layout.sidebar.price.label":["Pris"],"sdk.layout.sidebar.totalPrice.label":["Total pris"],"sdk.layout.summary.button.label":["Oversigt"],"sdk.layout.toolbar.mobile.tools.title":["V\xe6rkt\xf8jer"],"sdk.layout.toolbar.mobile.units.label":["Enheder"],"sdk.measurements":["M\xe5linger"],"sdk.messages.error.configNotFound.message":["Konfigurationen blev ikke fundet"],"sdk.messages.error.configNotFound.title":["Konfiguration ikke fundet"],"sdk.messages.error.configurator.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.configurator.message":["Der opstod en fejl i konfiguratoren"],"sdk.messages.error.configurator.title":["Konfigurator fejl"],"sdk.messages.error.configuratorRoot.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.configuratorRoot.message":["Der opstod en fejl i konfiguratorroden"],"sdk.messages.error.configuratorRoot.title":["Konfigurator rod fejl"],"sdk.messages.error.gpuDisabled.message":["GPU-acceleration er deaktiveret"],"sdk.messages.error.gpuDisabled.title":["GPU-acceleration deaktiveret"],"sdk.messages.error.notFound.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.webglNotSupported.message":["WebGL underst\xf8ttes ikke"],"sdk.messages.error.webglNotSupported.title":["WebGL ikke underst\xf8ttet"],"sdk.messages.finalize.error":["Oops, noget gik galt"],"sdk.messages.navigation.goToHomepage.label":["G\xe5 til hjemmesiden"],"sdk.messages.otherAction.error":["Oops, noget gik galt"],"sdk.messages.system.invalidDeployment.close.label":["Luk"],"sdk.messages.system.invalidDeployment.message":["Ugyldig deployment"],"sdk.messages.system.invalidDeployment.title":["Ugyldig deployment"],"sdk.messages.validation.uncaughtError.message":["Der opstod en uventet fejl"],"sdk.persist.system.error.dismiss":["Afvis"],"sdk.persist.system.error.message":["Der opstod en fejl ved fors\xf8g p\xe5 at opdatere en konfiguration"],"sdk.persist.system.error.recovered":["Konfiguration opdateret"],"sdk.presets.category.count.message":[["count"]," varer"],"sdk.presets.category.heading.title":["Kategorier"],"sdk.presets.create.error.dismiss.label":["Afvis"],"sdk.presets.create.error.message":["Konfigurationen kunne ikke startes fra denne forudindstilling. Pr\xf8v igen."],"sdk.presets.detail.close.label":["Luk"],"sdk.presets.detail.learnMore.label":["L\xe6r mere"],"sdk.presets.detail.select.label":["V\xe6lg"],"sdk.presets.preview.title":["Forh\xe5ndsvisning"],"sdk.presets.select.button.label":["V\xe6lg"],"sdk.presets.start.button.label":["Start"],"sdk.preview.customize.title":["Tilpas"],"sdk.preview.start.button.label":["Start"],"sdk.sketching.angle.apply.label":["Anvend"],"sdk.sketching.angle.cancel.label":["Annuller"],"sdk.sketching.angle.control.label":["Vinkel"],"sdk.sketching.angle.control.text":["Juster vinklen"],"sdk.sketching.angle.control.title":["Indstil vinkel"],"sdk.sketching.angle.input.error":["Angiv venligst et gyldigt tal!"],"sdk.sketching.dimension.apply.label":["Anvend"],"sdk.sketching.dimension.cancel.label":["Annuller"],"sdk.sketching.dimension.depth.label":["Dybde"],"sdk.sketching.dimension.depth.text":["Juster dybden"],"sdk.sketching.dimension.depth.title":["Indstil dybde"],"sdk.sketching.dimension.input.error":["Angiv venligst et gyldigt tal!"],"sdk.sketching.dimension.length.label":["L\xe6ngde"],"sdk.sketching.dimension.length.text":["Juster l\xe6ngden"],"sdk.sketching.dimension.length.title":["Indstil l\xe6ngde"],"sdk.sketching.dimension.width.label":["Bredde"],"sdk.sketching.dimension.width.text":["Juster bredden"],"sdk.sketching.dimension.width.title":["Indstil bredde"],"sdk.sketching.draw.done.label":["F\xe6rdig"],"sdk.sketching.spotlight.label":["Klik for at starte tegning"],"sdk.toolbar.actions.undoRedo.label":["Fortryd/Gendan"],"sdk.toolbar.camera.reset.label":["Nulstil kamera"],"sdk.toolbar.camera.reset.labelAriaLabel":["Nulstil kamera til standardposition"],"sdk.toolbar.fullscreen.enter.label":["Fuld sk\xe6rm"],"sdk.toolbar.fullscreen.exit.label":["Forlad fuld sk\xe6rm"],"sdk.toolbar.help.close.label":["Luk hj\xe6lp"],"sdk.toolbar.help.label":["Hj\xe6lp"],"sdk.toolbar.language.title":["Sprog"],"sdk.toolbar.measurements.change.aria":["Skift m\xe5linger"],"sdk.toolbar.measurements.indicators.label":["M\xe5lingsindikatorer"],"sdk.toolbar.measurements.input.aria":["M\xe5lingsinput"],"sdk.toolbar.measurements.units.aria":["M\xe5lingsenheder"],"sdk.toolbar.mobile.fullscreen.enter.label":["Fuld sk\xe6rm"],"sdk.toolbar.mobile.fullscreen.exit.label":["Forlad fuld sk\xe6rm"],"sdk.toolbar.mobile.fullscreen.title":["Fuld sk\xe6rm"],"sdk.toolbar.mobile.open.aria":["\xc5bn v\xe6rkt\xf8jslinje"],"sdk.toolbar.mobile.viewControls.label":["Visningskontroller"],"sdk.toolbar.share.allowEdit.label":["Tillad redigering"],"sdk.toolbar.share.allowEditShort.label":["Tillad redigering"],"sdk.toolbar.share.close.label":["Luk"],"sdk.toolbar.share.copiedLinkButtonTitle":["Link kopieret"],"sdk.toolbar.share.copyLink.label":["Kopier link"],"sdk.toolbar.share.copyLinkButtonTitle":["Kopier link"],"sdk.toolbar.share.input.aria":["Del link input"],"sdk.toolbar.share.label":["Del"],"sdk.toolbar.share.linkCopied.label":["Link kopieret"],"sdk.toolbar.share.loading.label":["Indl\xe6ser..."],"sdk.toolbar.share.open.label":["\xc5bn"],"sdk.toolbar.share.section.label":["Del"],"sdk.toolbar.undoRedo.redo.label":["Gendan"],"sdk.toolbar.undoRedo.undo.label":["Fortryd"],"sdk.toolbar.viewControls.title":["Visningskontroller"],"sdk.totalPrice":["Total pris"]}');
1
+ export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Tilbage til hjemmesiden"],"sdk.admin.error.system.message":["Vi oplever i \xf8jeblikket tekniske problemer. Pr\xf8v igen om et par minutter. Tak for din t\xe5lmodighed!"],"sdk.admin.error.system.title":["Systemfejl"],"sdk.angleDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["limitWithUnit"],"."],"sdk.angleDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er mindre end det tilladte minimum p\xe5 ",["limitWithUnit"],"."],"sdk.assistant.composer.disclaimer":["AI kan tage fejl. Kontroll\xe9r resultatet."],"sdk.assistant.composer.placeholder":["Sp\xf8rg, eller fort\xe6l mig, hvad der skal \xe6ndres…"],"sdk.assistant.composer.send.label":["Send"],"sdk.assistant.composer.stop.label":["Stop"],"sdk.assistant.failure.busy":["Assistenten arbejder stadig p\xe5 en tidligere besked."],"sdk.assistant.failure.notAvailable":["Assistenten er ikke tilg\xe6ngelig her."],"sdk.assistant.failure.retry.label":["Pr\xf8v igen"],"sdk.assistant.failure.unavailable":["Assistenten er ikke tilg\xe6ngelig lige nu."],"sdk.assistant.panel.close.label":["Luk assistenten"],"sdk.assistant.panel.title":["Assistent"],"sdk.assistant.thread.earlierSummarized":["Tidligere samtale opsummeret"],"sdk.assistant.thread.greeting":["Hej. Jeg kan svare p\xe5 sp\xf8rgsm\xe5l om dette design og \xe6ndre det sammen med dig. Fort\xe6l mig, hvad du har brug for."],"sdk.assistant.thread.loading":["Indl\xe6ser samtalen…"],"sdk.assistant.thread.loadingEarlier":["Indl\xe6ser den tidligere samtale…"],"sdk.assistant.thread.newReply.label":["Nyt svar"],"sdk.assistant.thread.resuming":["Genoptager samtalen…"],"sdk.assistant.thread.showEarlier.label":["Vis tidligere samtale"],"sdk.assistant.thread.thinking":["T\xe6nker…"],"sdk.assistant.tool.cancelled.hint":["Stoppet, f\xf8r det blev f\xe6rdigt."],"sdk.assistant.tool.mistake.hint":["Assistenten lavede en fejl."],"sdk.assistant.tool.noResult.hint":["Resultatet af dette trin gik tabt. Det er m\xe5ske blevet udf\xf8rt, m\xe5ske ikke."],"sdk.assistant.tool.readDesign.label":["L\xe6s design"],"sdk.assistant.tool.toolBudget.hint":["Ikke udf\xf8rt: assistenten n\xe5ede sin gr\xe6nse for trin til \xe9n besked."],"sdk.assistant.tool.undo.label":["Fortryd"],"sdk.assistant.tool.updateDesign.label":["Opdater design"],"sdk.assistant.toolbarButton.label":["Assistent"],"sdk.chat.disclaimer.close.label":["Luk"],"sdk.chat.disclaimer.dialog.title":["AI-assistent disclaimer"],"sdk.chat.disclaimer.full.message":["<0>F\xf8lgende ansvarsfraskrivelse er beregnet til at informere brugere om begr\xe6nsningerne og brugerretningslinjerne for AI-chatbotten, der er tilg\xe6ngelig p\xe5 dette websted. L\xe6s venligst denne ansvarsfraskrivelse omhyggeligt, f\xf8r du interagerer med chatbotten.</0><1><2>Generelle oplysninger:</2> AI-chatbotten er et automatiseret system drevet af OpenAI/ChatGPT. Den er designet til at give information og assistance baseret p\xe5 tilg\xe6ngelige oplysninger om de produkter, der tilbydes p\xe5 dette websted. Selvom vi str\xe6ber efter at levere n\xf8jagtige oplysninger gennem AI-chatbotten, kan vi ikke garantere n\xf8jagtigheden, fuldst\xe6ndigheden eller aktualiteten af de leverede oplysninger. Vi anbefaler, at du bruger svarene som udgangspunkt og verificerer svarene med udbyderen af disse oplysninger (ejeren af dette websted) eller enhver tilg\xe6ngelig produktdokumentation.</1><3><4>Brugeransvar:</4> Brugere af AI-chatbotten b\xe6rer det fulde ansvar for deres interaktioner og afh\xe6ngighed af de leverede oplysninger. Det er vigtigt at udvise forsigtighed og bruge dit sk\xf8n, n\xe5r du fortolker og handler p\xe5 baggrund af chatbottens svar. Hverken ejeren af dette websted eller udbyderen af chatbot-teknologien kan holdes ansvarlig for handlinger, tab eller skader som f\xf8lge af brugen af chatbotten.</3><5><6>Databeskyttelse og sikkerhed:</6> Vi prioriterer beskyttelse og sikkerhed af brugernes oplysninger. V\xe6r opm\xe6rksom p\xe5, at chatbot-samtaler kan blive gennemg\xe5et af ejeren af dette websted og udbyderen af teknologien for at forbedre resultaterne. Selvom OpenAI/ChatGPT opbevarer logfiler af disse samtaler i 30 dage, bruges disse data ikke til at tr\xe6ne deres AI-modeller. Del ikke f\xf8lsomme eller personlige oplysninger i dine samtaler.</5><7>Ved at bruge denne AI-chatbot angiver du din accept og forst\xe5else af ovenst\xe5ende ansvarsfraskrivelse. Hvis du ikke er enig i nogen del af denne ansvarsfraskrivelse, anbefaler vi, at du ikke bruger chatbotten.</7>"],"sdk.chat.disclaimer.inline.message":["AI-assistent kan give fejlagtige oplysninger."],"sdk.chat.disclaimer.seeMore.label":["Se mere"],"sdk.chat.header.desktop.title":["AI-assistent"],"sdk.chat.input.default.placeholder":["Sp\xf8rg mig om noget..."],"sdk.chat.input.footer.placeholder":["Skriv din besked her..."],"sdk.chat.mobile.assistant.label":["Assistent"],"sdk.chat.send.button.label":["Send besked"],"sdk.chat.system.error.message":["Der opstod en fejl. Pr\xf8v igen senere."],"sdk.chat.welcome.greeting.message":["Hej! Jeg er din AI-assistent. Hvordan kan jeg hj\xe6lpe dig i dag?"],"sdk.collision.warning.tooltip":["Elementer er for t\xe6t eller overlapper"],"sdk.controls.dimension.angle.error":["Ugyldig vinkelv\xe6rdi"],"sdk.controls.dimension.angle.hint":["Indtast vinkel i grader"],"sdk.controls.dimension.angle.hintRange":["Angiv et tal mellem ",["0"],["unitLabelWithSpace"]," og ",["1"],["unitLabelWithSpace"],"."],"sdk.controls.dimension.angleSlider.error":["Ugyldig vinkelv\xe6rdi"],"sdk.controls.dimension.distance.error":["Ugyldig afstandsv\xe6rdi"],"sdk.controls.dimension.distance.hint":["Indtast afstand"],"sdk.controls.dimension.distance.hintRange":["Afstand skal v\xe6re mellem ",["0"]," og ",["1"]],"sdk.controls.dimension.distanceSlider.error":["Ugyldig afstandsv\xe6rdi"],"sdk.controls.dimension.generic.error":["Ugyldig v\xe6rdi"],"sdk.controls.dimension.generic.hint":["Indtast v\xe6rdi"],"sdk.controls.dimension.generic.hintRange":["V\xe6rdi skal v\xe6re mellem ",["min"]," og ",["max"]],"sdk.controls.dimension.genericSlider.error":["Ugyldig v\xe6rdi"],"sdk.controls.dimension.indicator.apply":["Anvend"],"sdk.controls.dimension.indicator.cancel":["Annuller"],"sdk.controls.dimension.offset.hint":["Indtast forskydning"],"sdk.controls.dimension.size.hint":["Indtast st\xf8rrelse"],"sdk.controls.entity.add.close.label":["Luk"],"sdk.controls.entity.add.nothingMessage":["Intet at tilf\xf8je"],"sdk.controls.entity.childDelete.label":["Slet"],"sdk.controls.entity.childSelect.label":["V\xe6lg"],"sdk.controls.entity.delete.label":["Slet"],"sdk.controls.entity.replace.label":["Erstat"],"sdk.controls.property.back.label":["Tilbage"],"sdk.controls.recipeGroup.notFound.message":["Ikke fundet"],"sdk.controls.recipeGroup.notFound.title":["Gruppen, du leder efter, er ikke l\xe6ngere tilg\xe6ngelig. V\xe6lg venligst en anden gruppe."],"sdk.controls.tool.close.label":["Luk"],"sdk.controls.units.feet.label":["fod"],"sdk.controls.units.inch.label":["tomme"],"sdk.controls.upload.dragDrop.hint":["Tr\xe6k og slip filer her eller klik for at v\xe6lge"],"sdk.controls.upload.failed.error":["Upload fejlede"],"sdk.controls.upload.link.label":["Eller indtast et link"],"sdk.controls.upload.size.error":["Filen er for stor"],"sdk.distanceDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["0"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["1"],"."],"sdk.distanceDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["0"],", som er mindre end det tilladte minimum p\xe5 ",["1"],"."],"sdk.finalize.notConfigured.tooltip":["Finaliserings-funktionen er ikke konfigureret."],"sdk.finalize.outOfSync.hint":["Konfigurationen er ikke synkroniseret. Nogle \xe6ndringer er ikke blevet korrekt gemt."],"sdk.genericDimension.hintMessageTooLarge":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er st\xf8rre end det tilladte maksimum p\xe5 ",["limitWithUnit"],"."],"sdk.genericDimension.hintMessageTooSmall":["Den aktuelle v\xe6rdi er ",["currentWithUnit"],", som er mindre end det tilladte minimum p\xe5 ",["limitWithUnit"],"."],"sdk.layout.banner.readonly.cancel.label":["Annuller"],"sdk.layout.banner.readonly.clone.label":["Klon for at redigere"],"sdk.layout.banner.readonly.clone.message":["Denne konfiguration er skrivebeskyttet. Du kan klone den for at lave \xe6ndringer."],"sdk.layout.banner.readonly.clone.title":["Skrivebeskyttet konfiguration"],"sdk.layout.banner.readonly.editConfig.label":["Rediger konfiguration"],"sdk.layout.banner.readonly.editMobile.label":["Rediger"],"sdk.layout.banner.readonly.info.message":["Denne konfiguration er skrivebeskyttet"],"sdk.layout.button.closeConfigurator.label":["Luk konfigurator"],"sdk.layout.button.closePresetPreview.label":["Luk forh\xe5ndsvisning"],"sdk.layout.button.desktopBack.label":["Tilbage"],"sdk.layout.button.desktopSidebarBack.label":["Tilbage"],"sdk.layout.button.mobileBack.label":["Tilbage"],"sdk.layout.button.mobileSidebarBack.label":["Tilbage"],"sdk.layout.button.presetBack.label":["Tilbage"],"sdk.layout.button.saveRecipe.label":["Gem opskrift"],"sdk.layout.button.saveTemplate.label":["Gem skabelon"],"sdk.layout.button.setTemplate.label":["S\xe6t som skabelon"],"sdk.layout.controls.mobile.view3d.label":["3D-visning"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Kun visning tilg\xe6ngelig.</0> For at \xe6ndre konfigurationen skal du bruge en enhed med en st\xf8rre sk\xe6rm."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Kun visning tilg\xe6ngelig.</0> For at \xe6ndre konfigurationen skal du bruge en enhed med en st\xf8rre sk\xe6rm eller pr\xf8ve at \xe6ndre din enheds orientering."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Samlet pris"],"sdk.layout.hamburgerMenu.language.dialogTitle":["V\xe6lg sprog"],"sdk.layout.hamburgerMenu.language.label":["Sprog"],"sdk.layout.menu.hamburger.close.label":["Luk"],"sdk.layout.menu.hamburger.help.label":["Hj\xe6lp"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Luk hj\xe6lp"],"sdk.layout.menu.hamburger.share.label":["Del"],"sdk.layout.menu.hamburger.title":["Menu"],"sdk.layout.menu.hamburger.tooltip":["\xc5bn menu"],"sdk.layout.menu.language.close.label":["Luk"],"sdk.layout.menu.measurements.close.label":["Luk"],"sdk.layout.menu.measurements.label":["M\xe5linger"],"sdk.layout.navigation.common.product.label":["Produkt"],"sdk.layout.navigation.mobile.product.label":["Produkt"],"sdk.layout.navigation.steps.first.label":["F\xf8rste"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Afslut"],"sdk.layout.sidebar.finalize.label":["Finaliser"],"sdk.layout.sidebar.finalizePage.label":["G\xe5 til finalisering"],"sdk.layout.sidebar.nextStep.label":["N\xe6ste trin"],"sdk.layout.sidebar.nextStepShort.label":["N\xe6ste"],"sdk.layout.sidebar.previousStep.label":["Forrige trin"],"sdk.layout.sidebar.price.label":["Pris"],"sdk.layout.sidebar.totalPrice.label":["Total pris"],"sdk.layout.summary.button.label":["Oversigt"],"sdk.layout.toolbar.mobile.tools.title":["V\xe6rkt\xf8jer"],"sdk.layout.toolbar.mobile.units.label":["Enheder"],"sdk.measurements":["M\xe5linger"],"sdk.messages.error.configNotFound.message":["Konfigurationen blev ikke fundet"],"sdk.messages.error.configNotFound.title":["Konfiguration ikke fundet"],"sdk.messages.error.configurator.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.configurator.message":["Der opstod en fejl i konfiguratoren"],"sdk.messages.error.configurator.title":["Konfigurator fejl"],"sdk.messages.error.configuratorRoot.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.configuratorRoot.message":["Der opstod en fejl i konfiguratorroden"],"sdk.messages.error.configuratorRoot.title":["Konfigurator rod fejl"],"sdk.messages.error.gpuDisabled.message":["GPU-acceleration er deaktiveret"],"sdk.messages.error.gpuDisabled.title":["GPU-acceleration deaktiveret"],"sdk.messages.error.notFound.backToHome.label":["Tilbage til hjemmesiden"],"sdk.messages.error.webglNotSupported.message":["WebGL underst\xf8ttes ikke"],"sdk.messages.error.webglNotSupported.title":["WebGL ikke underst\xf8ttet"],"sdk.messages.finalize.error":["Oops, noget gik galt"],"sdk.messages.navigation.goToHomepage.label":["G\xe5 til hjemmesiden"],"sdk.messages.otherAction.error":["Oops, noget gik galt"],"sdk.messages.system.invalidDeployment.close.label":["Luk"],"sdk.messages.system.invalidDeployment.message":["Ugyldig deployment"],"sdk.messages.system.invalidDeployment.title":["Ugyldig deployment"],"sdk.messages.validation.uncaughtError.message":["Der opstod en uventet fejl"],"sdk.persist.system.error.dismiss":["Afvis"],"sdk.persist.system.error.message":["Der opstod en fejl ved fors\xf8g p\xe5 at opdatere en konfiguration"],"sdk.persist.system.error.recovered":["Konfiguration opdateret"],"sdk.presets.category.count.message":[["count"]," varer"],"sdk.presets.category.heading.title":["Kategorier"],"sdk.presets.create.error.dismiss.label":["Afvis"],"sdk.presets.create.error.message":["Konfigurationen kunne ikke startes fra denne forudindstilling. Pr\xf8v igen."],"sdk.presets.detail.close.label":["Luk"],"sdk.presets.detail.learnMore.label":["L\xe6r mere"],"sdk.presets.detail.select.label":["V\xe6lg"],"sdk.presets.preview.title":["Forh\xe5ndsvisning"],"sdk.presets.select.button.label":["V\xe6lg"],"sdk.presets.start.button.label":["Start"],"sdk.preview.customize.title":["Tilpas"],"sdk.preview.start.button.label":["Start"],"sdk.sketching.angle.apply.label":["Anvend"],"sdk.sketching.angle.cancel.label":["Annuller"],"sdk.sketching.angle.control.label":["Vinkel"],"sdk.sketching.angle.control.text":["Juster vinklen"],"sdk.sketching.angle.control.title":["Indstil vinkel"],"sdk.sketching.angle.input.error":["Angiv venligst et gyldigt tal!"],"sdk.sketching.dimension.apply.label":["Anvend"],"sdk.sketching.dimension.cancel.label":["Annuller"],"sdk.sketching.dimension.depth.label":["Dybde"],"sdk.sketching.dimension.depth.text":["Juster dybden"],"sdk.sketching.dimension.depth.title":["Indstil dybde"],"sdk.sketching.dimension.input.error":["Angiv venligst et gyldigt tal!"],"sdk.sketching.dimension.length.label":["L\xe6ngde"],"sdk.sketching.dimension.length.text":["Juster l\xe6ngden"],"sdk.sketching.dimension.length.title":["Indstil l\xe6ngde"],"sdk.sketching.dimension.width.label":["Bredde"],"sdk.sketching.dimension.width.text":["Juster bredden"],"sdk.sketching.dimension.width.title":["Indstil bredde"],"sdk.sketching.draw.done.label":["F\xe6rdig"],"sdk.sketching.spotlight.label":["Klik for at starte tegning"],"sdk.toolbar.actions.undoRedo.label":["Fortryd/Gendan"],"sdk.toolbar.camera.reset.label":["Nulstil kamera"],"sdk.toolbar.camera.reset.labelAriaLabel":["Nulstil kamera til standardposition"],"sdk.toolbar.fullscreen.enter.label":["Fuld sk\xe6rm"],"sdk.toolbar.fullscreen.exit.label":["Forlad fuld sk\xe6rm"],"sdk.toolbar.help.close.label":["Luk hj\xe6lp"],"sdk.toolbar.help.label":["Hj\xe6lp"],"sdk.toolbar.language.title":["Sprog"],"sdk.toolbar.measurements.change.aria":["Skift m\xe5linger"],"sdk.toolbar.measurements.indicators.label":["M\xe5lingsindikatorer"],"sdk.toolbar.measurements.input.aria":["M\xe5lingsinput"],"sdk.toolbar.measurements.units.aria":["M\xe5lingsenheder"],"sdk.toolbar.mobile.fullscreen.enter.label":["Fuld sk\xe6rm"],"sdk.toolbar.mobile.fullscreen.exit.label":["Forlad fuld sk\xe6rm"],"sdk.toolbar.mobile.fullscreen.title":["Fuld sk\xe6rm"],"sdk.toolbar.mobile.open.aria":["\xc5bn v\xe6rkt\xf8jslinje"],"sdk.toolbar.mobile.viewControls.label":["Visningskontroller"],"sdk.toolbar.share.allowEdit.label":["Tillad redigering"],"sdk.toolbar.share.allowEditShort.label":["Tillad redigering"],"sdk.toolbar.share.close.label":["Luk"],"sdk.toolbar.share.copiedLinkButtonTitle":["Link kopieret"],"sdk.toolbar.share.copyLink.label":["Kopier link"],"sdk.toolbar.share.copyLinkButtonTitle":["Kopier link"],"sdk.toolbar.share.input.aria":["Del link input"],"sdk.toolbar.share.label":["Del"],"sdk.toolbar.share.linkCopied.label":["Link kopieret"],"sdk.toolbar.share.loading.label":["Indl\xe6ser..."],"sdk.toolbar.share.open.label":["\xc5bn"],"sdk.toolbar.share.section.label":["Del"],"sdk.toolbar.undoRedo.redo.label":["Gendan"],"sdk.toolbar.undoRedo.undo.label":["Fortryd"],"sdk.toolbar.viewControls.title":["Visningskontroller"],"sdk.totalPrice":["Total pris"]}');