diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx
new file mode 100644
index 00000000..e8625f6d
--- /dev/null
+++ b/packages/ui/src/App.tsx
@@ -0,0 +1,207 @@
+import React from "react";
+import { Toaster } from "@/components/ui/toaster";
+import { Toaster as Sonner } from "@/components/ui/sonner";
+import { TooltipProvider } from "@/components/ui/tooltip";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { BrowserRouter, Routes, Route, useLocation } from "react-router-dom";
+import { AuthProvider, useAuth } from "@/hooks/useAuth";
+import { PostNavigationProvider } from "@/contexts/PostNavigationContext";
+import { OrganizationProvider } from "@/contexts/OrganizationContext";
+import { LogProvider, useLog } from "@/contexts/LogContext";
+import { LayoutProvider } from "@/contexts/LayoutContext";
+import { MediaRefreshProvider } from "@/contexts/MediaRefreshContext";
+import { ProfilesProvider } from "@/contexts/ProfilesContext";
+import { WebSocketProvider } from "@/contexts/WS_Socket";
+import { registerAllWidgets } from "@/lib/registerWidgets";
+import TopNavigation from "@/components/TopNavigation";
+import GlobalDragDrop from "@/components/GlobalDragDrop";
+
+// Register all widgets on app boot
+registerAllWidgets();
+
+import Index from "./pages/Index";
+import Auth from "./pages/Auth";
+import Profile from "./pages/Profile";
+import Post from "./pages/Post";
+import UserProfile from "./pages/UserProfile";
+import UserCollections from "./pages/UserCollections";
+import Collections from "./pages/Collections";
+import NewCollection from "./pages/NewCollection";
+import UserPage from "./pages/UserPage";
+import NewPage from "./pages/NewPage";
+import TagPage from "./pages/TagPage";
+import SearchResults from "./pages/SearchResults";
+import Wizard from "./pages/Wizard";
+import NewPost from "./pages/NewPost";
+
+import Organizations from "./pages/Organizations";
+const ProviderSettings = React.lazy(() => import("./pages/ProviderSettings"));
+const PlaygroundEditor = React.lazy(() => import("./pages/PlaygroundEditor"));
+const PlaygroundEditorLLM = React.lazy(() => import("./pages/PlaygroundEditorLLM"));
+const VideoPlayerPlayground = React.lazy(() => import("./pages/VideoPlayerPlayground"));
+const VideoFeedPlayground = React.lazy(() => import("./pages/VideoFeedPlayground"));
+const VideoPlayerPlaygroundIntern = React.lazy(() => import("./pages/VideoPlayerPlaygroundIntern"));
+const NotFound = React.lazy(() => import("./pages/NotFound"));
+const AdminPage = React.lazy(() => import("./pages/AdminPage"));
+const PlaygroundImages = React.lazy(() => import("./pages/PlaygroundImages"));
+const PlaygroundImageEditor = React.lazy(() => import("./pages/PlaygroundImageEditor"));
+const VideoGenPlayground = React.lazy(() => import("./pages/VideoGenPlayground"));
+const PlaygroundCanvas = React.lazy(() => import("./pages/PlaygroundCanvas"));
+import LogsPage from "./components/logging/LogsPage";
+
+const queryClient = new QueryClient();
+
+const VersionMap = React.lazy(() => import("./pages/VersionMap"));
+
+//
Content not found or failed to load.
+Experiment with widgets and layout
+
+
+
+
+
+
+ Unique identifier used for templating key reference. +
+
+
-
-
-
-
-
No root template found. Please load the email context first.
"); + } + }; + updatePreview(); + }, [loadedPages, pageId]); // Removed viewMode dependency + + const handleDumpJson = async () => { + try { + const json = await exportPageLayout(pageId); + setLayoutJson(JSON.stringify(JSON.parse(json), null, 2)); + await navigator.clipboard.writeText(json); + toast.success("JSON dumped to console, clipboard, and view"); + } catch (e) { + console.error("Failed to dump JSON", e); + toast.error("Failed to dump JSON"); + } + }; + + const handleLoadTemplate = async (template: ILayoutTemplate) => { + try { + await importPageLayout(pageId, template.layoutJson); + toast.success(`Loaded template: ${template.name}`); + setLayoutJson(null); + } catch (e) { + console.error("Failed to load template", e); + toast.error("Failed to load template"); + } + }; + + const handleSaveTemplate = async () => { + if (!newTemplateName.trim()) { + toast.error("Please enter a template name"); + return; + } + try { + const json = await exportPageLayout(pageId); + LayoutTemplateManager.saveTemplate(newTemplateName.trim(), json); + toast.success("Template saved locally"); + setIsSaveDialogOpen(false); + setNewTemplateName(''); + refreshTemplates(); + } catch (e) { + console.error("Failed to save template", e); + toast.error("Failed to save template"); + } + }; + + const handlePasteJson = async () => { + if (!pasteJsonContent.trim()) { + toast.error("Please enter JSON content"); + return; + } + try { + JSON.parse(pasteJsonContent); + await importPageLayout(pageId, pasteJsonContent); + toast.success("Layout imported from JSON"); + setIsPasteDialogOpen(false); + setPasteJsonContent(''); + setLayoutJson(null); + } catch (e) { + console.error("Failed to import JSON", e); + toast.error("Invalid JSON format"); + } + }; + + const handleLoadContext = async () => { + const bundleUrl = '/widgets/email/library.json'; + try { + const result = await loadWidgetBundle(bundleUrl); + const { count, rootTemplateUrl } = result; + + toast.success(`Loaded ${count} email widgets`); + + const currentLayout = loadedPages.get(pageId); + if (currentLayout) { + const bundles = new Set(currentLayout.loadedBundles || []); + let changed = false; + + if (!bundles.has(bundleUrl)) { + bundles.add(bundleUrl); + currentLayout.loadedBundles = Array.from(bundles); + changed = true; + } + + if (rootTemplateUrl && currentLayout.rootTemplate !== rootTemplateUrl) { + currentLayout.rootTemplate = rootTemplateUrl; + changed = true; + } + + if (changed) { + await saveToApi(); + toast.success("Context saved to layout"); + } + } + } catch (e) { + console.error("Failed to load context", e); + toast.error("Failed to load email context"); + } + }; + + const handleExportHtml = async () => { + const layout = loadedPages.get(pageId); + if (!layout) return; + + if (!layout.rootTemplate) { + toast.error("No root template found. Please load a context first."); + return; + } + + try { + const { generateEmailHtml } = await import('@/lib/emailExporter'); + const html = await generateEmailHtml(layout, layout.rootTemplate); + + const blob = new Blob([html], { type: 'text/html' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `${layout.name.toLowerCase().replace(/\s+/g, '-')}.html`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + + toast.success("Exported HTML"); + } catch (e) { + console.error("Failed to export HTML", e); + toast.error("Export failed"); + } + }; + + const handleSendTestEmail = async () => { + const layout = loadedPages.get(pageId); + if (!layout) { + toast.error("Layout not loaded"); + return; + } + + if (!layout.rootTemplate) { + toast.error("No root template found. Please load a context first."); + return; + } + + try { + toast.info("Generating email..."); + const { generateEmailHtml } = await import('@/lib/emailExporter'); + let html = await generateEmailHtml(layout, layout.rootTemplate); + + const dummyId = import.meta.env.DEFAULT_POST_TEST_ID || '00000000-0000-0000-0000-000000000000'; + const serverUrl = import.meta.env.VITE_SERVER_IMAGE_API_URL; + + toast.info("Sending test email..."); + const response = await fetch(`${serverUrl}/api/send/email/${dummyId}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + html, + subject: `[Test] ${layout.name} - ${new Date().toLocaleTimeString()}` + }) + }); + + if (response.ok) { + toast.success("Test email sent!"); + } else { + const err = await response.text(); + console.error("Failed to send test email", err); + toast.error(`Failed to send: ${response.statusText}`); + } + + } catch (e) { + console.error("Failed to send test email", e); + toast.error("Failed to send test email"); + } + }; + + const currentLayout = loadedPages.get(pageId); + + return { + // State + currentLayout, + viewMode, setViewMode, + previewHtml, + htmlSize, + isAppReady, + isEditMode, setIsEditMode, + pageId, + pageName, + layoutJson, + templates, + isSaveDialogOpen, setIsSaveDialogOpen, + newTemplateName, setNewTemplateName, + isPasteDialogOpen, setIsPasteDialogOpen, + pasteJsonContent, setPasteJsonContent, + + // Handlers + handleDumpJson, + handleLoadTemplate, + handleSaveTemplate, + handlePasteJson, + handleLoadContext, + handleExportHtml, + handleSendTestEmail, + importPageLayout // Expose importPageLayout for direct external updates + }; +} diff --git a/packages/ui/src/hooks/useResponsiveImage.ts b/packages/ui/src/hooks/useResponsiveImage.ts index 30218453..e3861cb1 100644 --- a/packages/ui/src/hooks/useResponsiveImage.ts +++ b/packages/ui/src/hooks/useResponsiveImage.ts @@ -27,7 +27,6 @@ export const useResponsiveImage = ({ useEffect(() => { let isMounted = true; - const generateResponsiveImages = async () => { if (!src || !enabled) { if (isMounted) { diff --git a/packages/ui/src/hooks/useSelection.tsx b/packages/ui/src/hooks/useSelection.tsx new file mode 100644 index 00000000..8c020c3e --- /dev/null +++ b/packages/ui/src/hooks/useSelection.tsx @@ -0,0 +1,90 @@ +import { useState, useCallback, useEffect } from 'react'; +import { useLayout } from '@/contexts/LayoutContext'; + +interface UseSelectionProps { + pageId: string; +} + +export function useSelection({ pageId }: UseSelectionProps) { + const [selectedWidgetId, setSelectedWidgetId] = useState| Guidance Method | +Prompt | +Scale | +Input Image | +Guidance Image | +Output Image | +
|---|---|---|---|---|---|
| ControlNet Canny | +An exotic colorful shell on the beach | +1.0 | +![]() |
+ ![]() |
+ ![]() |
+
| ControlNet Depth | +A dog, exploring an alien planet | +0.8 | +![]() |
+ ![]() |
+ ![]() |
+
| ControlNet Recoloring | +A vibrant photo of a woman | +1.00 | +![]() |
+ ![]() |
+ ![]() |
+
| ControlNet Color Grid | +A dynamic fantasy illustration of an erupting volcano | +0.7 | +![]() |
+ ![]() |
+ ![]() |
+
| Guidance Method | +Prompt | +Mode | +Scale | +Guidance Image | +Output Image | +
|---|---|---|---|---|---|
| Image Prompt Adapter | +A drawing of a lion laid on a table. | +regular | +0.85 | +![]() |
+ ![]() |
+
| Image Prompt Adapter | +A drawing of a bird. | +style | +1 | +![]() |
+ ![]() |
+
+
+
+ **prompt**: A surreal and whimsical food concept photo of a
+ sunny-side-up egg clipped to a rope with a wooden clothespin, against a
+ bright turquoise background. The yolk is glossy and slightly runny,
+ dripping downward, creating a playful and unexpected visual. The
+ composition is clean, colorful, and minimalistic, with a creative twist
+ that evokes humor and imagination. On the bottom text "Just hanging
+ out... Sunny side up!"
+
+
+
+
+
+ This API endpoint supports content moderation via an optional parameter
+ that can prevent generation if input images contain inappropriate
+ content, and filters out unsafe generated images - the first blocked
+ input image will fail the entire request.
+ operationId: text-to-image-base
+ parameters:
+ - in: path
+ name: model_version
+ schema:
+ type: string
+ enum:
+ - '2.3'
+ - '3.2'
+ required: true
+ description: >-
+ The model version you would like to use in the request. We recommend
+ to use our most advanced text-to-image model, Bria 3.2, that offers
+ enhanced aesthetics, exceptional prompt alignment and strong
+ capabilities in generating text within images.
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ prompt:
+ type: string
+ description: >-
+ The prompt you would like to use to generate images. Bria
+ currently supports prompts in English only.
+ num_results:
+ type: integer
+ description: >-
+ How many images you would like to generate. When using any
+ Guidance Method, please use the value 1.
+ minimum: 1
+ default: 4
+ maximum: 4
+ aspect_ratio:
+ type: string
+ description: >-
+ The aspect ratio of the image. When a ControlNet is being
+ used, the aspect ratio is defined by the guidance image and
+ this parameter is ignored.
+ default: '1:1'
+ enum:
+ - '1:1'
+ - '2:3'
+ - '3:2'
+ - '3:4'
+ - '4:3'
+ - '4:5'
+ - '5:4'
+ - '9:16'
+ - '16:9'
+ sync:
+ type: boolean
+ description: >-
+ Determines the response mode. When true, responses are
+ synchronous. With false, responses are asynchronous,
+ immediately providing URLs for images that are generated in
+ the background. Use polling for the URLs to retrieve images
+ once ready.
+ default: false
+ seed:
+ type: integer
+ description: >-
+ You can choose whether you want your generated result to be
+ random or predictable. You can recreate the same result in
+ the future by using the seed value of a result from the
+ response with the prompt, model type and model version. You
+ can exclude this parameter if you are not interested in
+ recreating your results. This parameter is optional.
+ negative_prompt:
+ type: string
+ description: >-
+ Specify here elements that you didn't ask in the prompt, but
+ are being generated, and you would like to exclude. This
+ parameter is optional. Bria currently supports prompts in
+ English only.
+ steps_num:
+ type: integer
+ description: >-
+ The number of iterations the model goes through to refine
+ the generated image. This parameter is optional.
+ minimum: 20
+ default: 30
+ maximum: 50
+ text_guidance_scale:
+ type: number
+ format: float
+ description: >-
+ Determines how closely the generated image should adhere to
+ the input text description. This parameter is optional.
+ minimum: 1
+ maximum: 10
+ default: 5
+ medium:
+ type: string
+ enum:
+ - photography
+ - art
+ description: >-
+ Which medium should be included in your generated images.
+ This parameter is optional.
+ prompt_enhancement:
+ type: boolean
+ description: >-
+ When set to true, enhances the provided prompt by generating
+ additional, more descriptive variations, resulting in more
+ diverse and creative output images. Note that turning this
+ flag on may result in a few additional seconds to the
+ inference time. Built with Meta Llama 3.
+ default: false
+ enhance_image:
+ type: boolean
+ default: false
+ description: >
+ When set to true, generates images with richer details,
+ sharper textures, and enhanced clarity.
+
+
+ Slightly increases generation time per image.
+ prompt_content_moderation:
+ type: boolean
+ default: true
+ description: >
+ When enabled (default: true), the input prompt is scanned
+ for NSFW or ethically restricted terms before image
+ generation. If the prompt violates Bria's ethical
+ guidelines, the request will be rejected with a 408 error.
+ content_moderation:
+ type: boolean
+ default: false
+ description: >
+ When enabled, applies content moderation to both input
+ visuals and generated outputs.
+
+
+ For input images:
+
+ - Processing stops at the first image that fails moderation
+
+ - Returns a 422 error with details about which parameter
+ failed
+
+
+ For synchronous requests (sync=true):
+
+ - If all generated images fail moderation, returns a 422
+ error
+
+ - If some images pass and others fail, returns a 200
+ response with successful generations and "blocked" objects
+ for failed ones
+
+
+ For asynchronous requests (sync=false):
+
+ - Failed images are replaced with zero-byte files at their
+ placeholder URLs
+
+ - Successful images are stored at their original placeholder
+ URLs
+ ip_signal:
+ type: boolean
+ default: false
+ description: >-
+ Flags prompts with potential IP content. If detected, a
+ warning will be included in the response.
+ guidance_method_1:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_1_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_1_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_1. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ guidance_method_2:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_2_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_2_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_2. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ image_prompt_mode:
+ type: string
+ enum:
+ - regular
+ - style_only
+ default: regular
+ description: >
+ - `regular`: Uses the image’s content, style elements, and
+ color palette to guide generation.
+
+ - `style_only`: Uses the image’s high-level style elements
+ and color palette to influence the generated output.
+
+ The support for image prompt is currently available only
+ when model_version="2.3".
+ image_prompt_file:
+ type: string
+ description: >
+ The image file to be used as guidance, in base64 format.
+ Accepted formats are jpeg, jpg, png, webp.
+
+ The support for image prompt is currently available only
+ when model_version="2.3".
+
+ Maximum file size 12MB. This image can be of any aspect
+ ratio, even when it's not alligned with the one defined in
+ the parameter 'aspect_ratio' or by visuals provided to the
+ ControlNets.
+ image_prompt_urls:
+ type: array
+ items:
+ type: string
+ format: uri
+ description: >
+ A list of URLs of images that should be used as guidance.
+ The images can be of different aspect ratios. Accepted
+ formats are jpeg, jpg, png, webp.
+
+ The URLs should point to accessible, publicly available
+ images.
+
+ The support for image prompt is currently available only
+ when model_version="2.3".
+ image_prompt_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: >
+ The impact of the provided image on the generated results. A
+ value between 0.0 (no impact) and 1.0 (full impact).
+ example:
+ prompt: a book
+ num_results: 2
+ sync: true
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again,
+ you should use in the request the prompt and
+ the seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always
+ includes exactly one URL. When sync=false,
+ the request is asynchronous — the URL is
+ returned immediately, but the image will
+ become available once the inference process
+ is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ - type: object
+ required:
+ - error_code
+ - description
+ properties:
+ error_code:
+ type: string
+ example: '408'
+ description:
+ type: string
+ example: Query doesn't stand with Bria's ethic rules
+ examples:
+ success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_222222.png
+ seed: 222222
+ uuid: some_uuid_222222
+ partial_success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - blocked: true
+ error_code: '422'
+ description: >-
+ The request could not be completed because the
+ generated visual did not pass content moderation.
+ prompt_blocked:
+ value:
+ error_code: '408'
+ description: Query doesn't stand with Bria's ethic rules
+ '209':
+ description: >-
+ Successful operation, a model version that is no longer available
+ was requested. The request was redirected to the latest model
+ version.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again, you
+ should use in the request the prompt and the
+ seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always includes
+ exactly one URL. When sync=false, the request is
+ asynchronous — the URL is returned immediately,
+ but the image will become available once the
+ inference process is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '405':
+ description: Method not allowed.
+ '415':
+ description: >-
+ Unsupported Media Type. Invalid file type. Supported file types are
+ jpeg, jpg, png, webp.
+ '422':
+ description: Unprocessable Content
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ input_violation:
+ value: >-
+ The request could not be completed because the visual in the
+ '{parameter_name}' parameter did not pass content
+ moderation.
+ all_outputs_blocked:
+ value: >-
+ The request could not be completed because all generated
+ visuals did not pass content moderation.
+ invalid_url:
+ value: >-
+ Unprocessable Entity. The URL does not point to a valid
+ image or is inaccessible.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+ /text-to-image/fast/{model_version}:
+ post:
+ summary: Generate Image - Fast
+ tags:
+ - Endpoints
+ description: >-
+
+
+ **Description**
+
+
+ This Image Generation pipeline is optimized for speed, enabling builders
+ to rapidly generate high-quality, photorealistic or artistic images
+ without compromising visual fidelity. It leverages Bria’s proprietary
+ text-to-image foundation models, combined with performance-oriented
+ enhancements that ensure faster generation while maintaining control and
+ flexibility. The pipeline supports native generation at 1MP resolution
+ and accommodates a wide range of aspect ratios, making it ideal for
+ applications that require quick turnaround with consistent output
+ control.
+
+
+
+ **An example:**
+
+
+ **prompt**: A portrait of a Beautiful and playful ethereal singer, art
+ deco, fantasy, intricate art deco golden designs, elegant, highly
+ detailed, sharp focus, blurry background, teal and orange shades
+
+
+ **BRIA FAST model 2.3:**
+
+
+
+
+ This API endpoint supports content moderation via an optional parameter
+ that can prevent generation if input images contain inappropriate
+ content, and filters out unsafe generated images - the first blocked
+ input image will fail the entire request.
+ operationId: text-to-image-fast
+ parameters:
+ - in: path
+ name: model_version
+ schema:
+ type: string
+ enum:
+ - '2.3'
+ required: true
+ description: The model version you would like to use in the request.
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ prompt:
+ type: string
+ description: >-
+ The prompt you would like to use to generate images. Bria
+ currently supports prompts in English only.
+ num_results:
+ type: integer
+ description: How many images you would like to generate.
+ minimum: 1
+ maximum: 4
+ default: 4
+ aspect_ratio:
+ type: string
+ description: >-
+ The aspect ratio of the image. The aspect ratio of the
+ image. When a ControlNet is being used, the aspect ratio is
+ defined by the guidance image and this parameter is ignored.
+ default: '1:1'
+ enum:
+ - '1:1'
+ - '2:3'
+ - '3:2'
+ - '3:4'
+ - '4:3'
+ - '4:5'
+ - '5:4'
+ - '9:16'
+ - '16:9'
+ sync:
+ type: boolean
+ description: >-
+ Determines the response mode. When true, responses are
+ synchronous. With false, responses are asynchronous,
+ immediately providing URLs for images that are generated in
+ the background. Use polling for the URLs to retrieve images
+ once ready.
+ default: false
+ seed:
+ type: integer
+ description: >-
+ You can choose whether you want your generated result to be
+ random or predictable. You can recreate the same result in
+ the future by using the seed value of a result from the
+ response with the prompt, model type and model version. You
+ can exclude this parameter if you are not interested in
+ recreating your results. This parameter is optional.
+ steps_num:
+ type: integer
+ description: >-
+ The number of iterations the model goes through to refine
+ the generated image. This parameter is optional.
+ minimum: 4
+ maximum: 10
+ default: 8
+ medium:
+ type: string
+ enum:
+ - photography
+ - art
+ description: >-
+ Which medium should be included in your generated images.
+ This parameter is optional.
+ prompt_enhancement:
+ type: boolean
+ description: >-
+ When set to true, enhances the provided prompt by generating
+ additional, more descriptive variations, resulting in more
+ diverse and creative output images. Note that turning this
+ flag on may result in a few additional seconds to the
+ inference time.
+ default: false
+ enhance_image:
+ type: boolean
+ default: false
+ description: >
+ When set to true, generates images with richer details,
+ sharper textures, and enhanced clarity.
+
+
+ Slightly increases generation time per image.
+ prompt_content_moderation:
+ type: boolean
+ default: true
+ description: >
+ When enabled (default: true), the input prompt is scanned
+ for NSFW or ethically restricted terms before image
+ generation. If the prompt violates Bria's ethical
+ guidelines, the request will be rejected with a 408 error.
+ content_moderation:
+ type: boolean
+ default: false
+ description: >
+ When enabled, applies content moderation to both input
+ visuals and generated outputs.
+
+
+ For input images:
+
+ - Processing stops at the first image that fails moderation
+
+ - Returns a 422 error with details about which parameter
+ failed
+
+
+ For synchronous requests (sync=true):
+
+ - If all generated images fail moderation, returns a 422
+ error
+
+ - If some images pass and others fail, returns a 200
+ response with successful generations and "blocked" objects
+ for failed ones
+
+
+ For asynchronous requests (sync=false):
+
+ - Failed images are replaced with zero-byte files at their
+ placeholder URLs
+
+ - Successful images are stored at their original placeholder
+ URLs
+ ip_signal:
+ type: boolean
+ default: false
+ description: >-
+ Flags prompts with potential IP content. If detected, a
+ warning will be included in the response.
+ guidance_method_1:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_1_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_1_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_1. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ guidance_method_2:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_2_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_2_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_2. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ image_prompt_mode:
+ type: string
+ enum:
+ - regular
+ - style_only
+ default: regular
+ description: >
+ - `regular`: Uses the image’s content, style elements, and
+ color palette to guide generation.
+
+ - `style_only`: Uses the image’s high-level style elements
+ and color palette to influence the generated output.
+ image_prompt_file:
+ type: string
+ description: >
+ The image file to be used as guidance, in base64 format.
+ Accepted formats are jpeg, jpg, png, webp.
+
+ Maximum file size 12MB. This image can be of any aspect
+ ratio, even when it's not alligned with the one defined in
+ the parameter 'aspect_ratio' or by visuals provided to the
+ ControlNets.
+ image_prompt_urls:
+ type: array
+ items:
+ type: string
+ format: uri
+ description: >
+ A list of URLs of images that should be used as guidance.
+ The images can be of different aspect ratios. Accepted
+ formats are jpeg, jpg, png, webp.
+
+ The URLs should point to accessible, publicly available
+ images.
+ image_prompt_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: >
+ The impact of the provided image on the generated results. A
+ value between 0.0 (no impact) and 1.0 (full impact).
+ example:
+ prompt: a book
+ num_results: 2
+ sync: true
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again,
+ you should use in the request the prompt and
+ the seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always
+ includes exactly one URL. When sync=false,
+ the request is asynchronous — the URL is
+ returned immediately, but the image will
+ become available once the inference process
+ is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ - type: object
+ required:
+ - error_code
+ - description
+ properties:
+ error_code:
+ type: string
+ example: '408'
+ description:
+ type: string
+ example: Query doesn't stand with Bria's ethic rules
+ examples:
+ success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_222222.png
+ seed: 222222
+ uuid: some_uuid_222222
+ partial_success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - blocked: true
+ error_code: '422'
+ description: >-
+ The request could not be completed because the
+ generated visual did not pass content moderation.
+ prompt_blocked:
+ value:
+ error_code: '408'
+ description: Query doesn't stand with Bria's ethic rules
+ '209':
+ description: >-
+ Successful operation, a model version that is no longer available
+ was requested. The request was redirected to the latest model
+ version.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again, you
+ should use in the request the prompt and the
+ seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always includes
+ exactly one URL. When sync=false, the request is
+ asynchronous — the URL is returned immediately,
+ but the image will become available once the
+ inference process is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '405':
+ description: Method not allowed.
+ '415':
+ description: >-
+ Unsupported Media Type. Invalid file type. Supported file types are
+ jpeg, jpg, png, webp.
+ '422':
+ description: Unprocessable Content
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ input_violation:
+ value: >-
+ The request could not be completed because the visual in the
+ '{parameter_name}' parameter did not pass content
+ moderation.
+ all_outputs_blocked:
+ value: >-
+ The request could not be completed because all generated
+ visuals did not pass content moderation.
+ invalid_url:
+ value: >-
+ Unprocessable Entity. The URL does not point to a valid
+ image or is inaccessible.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+ /text-to-image/hd/{model_version}:
+ post:
+ summary: Generate Image - HD
+ tags:
+ - Endpoints
+ description: >-
+
+
+ **Description**
+
+
+ This Image Generation pipeline is designed for builders working on
+ projects that demand maximum image detail and clarity. It leverages
+ Bria’s proprietary text-to-image foundation models, enhanced to deliver
+ high-resolution outputs while preserving control and flexibility. The
+ pipeline supports native generation at 1920×1080 resolution (or
+ 1536×1536 for square aspect ratios) and accommodates a wide range of
+ aspect ratios, making it ideal for use cases where visual precision and
+ output quality are critical.
+
+
+ **Examples:**
+
+
+ **prompt**: A photo of detailed short female blond hair viewed from
+ behind, with rich texture and clearly visible individual strands that
+ give depth and realism, and featuring subtle waves reflect light
+
+
+ **BRIA HD model 2.2:**
+
+
+
+
+
+ **prompt**: A portrait of a Beautiful and playful ethereal singer, art
+ deco, fantasy, intricate art deco golden designs, elegant, highly
+ detailed, sharp focus, blurry background, teal and orange shades
+
+
+ **BRIA HD model 2.2:**
+
+
+
+
+ This API endpoint supports content moderation via an optional parameter
+ that filters out unsafe generated images.
+ operationId: text-to-image-hd
+ parameters:
+ - in: path
+ name: model_version
+ schema:
+ type: string
+ enum:
+ - '2.2'
+ required: true
+ description: The model version you would like to use in the request.
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ prompt:
+ type: string
+ description: >-
+ The prompt you would like to use to generate images. Bria
+ currently supports prompts in English only.
+ num_results:
+ type: integer
+ description: How many images you would like to generate.
+ minimum: 1
+ default: 4
+ maximum: 4
+ aspect_ratio:
+ type: string
+ description: The aspect ratio of the image.
+ default: '1:1'
+ enum:
+ - '1:1'
+ - '2:3'
+ - '3:2'
+ - '3:4'
+ - '4:3'
+ - '4:5'
+ - '5:4'
+ - '9:16'
+ - '16:9'
+ sync:
+ type: boolean
+ description: >-
+ Determines the response mode. When true, responses are
+ synchronous, and applicable to single-image requests. With
+ false, responses are asynchronous, immediately providing
+ URLs for images that are generated in the background. Use
+ polling for the URLs to retrieve images once ready.
+ default: false
+ seed:
+ type: integer
+ description: >-
+ You can choose whether you want your generated result to be
+ random or predictable. You can recreate the same result in
+ the future by using the seed value of a result from the
+ response with the prompt, model type and model version. You
+ can exclude this parameter if you are not interested in
+ recreating your results. This parameter is optional.
+ negative_prompt:
+ type: string
+ description: >-
+ Specify here elements that you didn't ask in the prompt, but
+ are being generated, and you would like to exclude. This
+ parameter is optional. Bria currently supports prompts in
+ English only.
+ steps_num:
+ type: integer
+ description: >-
+ The number of iterations the model goes through to refine
+ the generated image. This parameter is optional.
+ minimum: 20
+ default: 30
+ maximum: 50
+ text_guidance_scale:
+ type: number
+ format: float
+ description: >-
+ Determines how closely the generated image should adhere to
+ the input text description. This parameter is optional.
+ minimum: 1
+ maximum: 10
+ default: 5
+ medium:
+ type: string
+ enum:
+ - photography
+ - art
+ description: >-
+ Which medium should be included in your generated images.
+ This parameter is optional.
+ prompt_enhancement:
+ type: boolean
+ description: >-
+ When set to true, enhances the provided prompt by generating
+ additional, more descriptive variations, resulting in more
+ diverse and creative output images. Note that turning this
+ flag on may result in a few additional seconds to the
+ inference time.
+ default: false
+ enhance_image:
+ type: boolean
+ default: false
+ description: >
+ When set to true, generates images with richer details,
+ sharper textures, and enhanced clarity.
+
+
+ Slightly increases generation time per image.
+ content_moderation:
+ type: boolean
+ default: false
+ description: >
+ When enabled, applies content moderation to generated
+ outputs.
+
+
+ For synchronous requests (sync=true):
+
+ - If all generated images fail moderation, returns a 422
+ error
+
+ - If some images pass and others fail, returns a 200
+ response with successful generations and "blocked" objects
+ for failed ones
+
+
+ For asynchronous requests (sync=false):
+
+ - Failed images are replaced with zero-byte files at their
+ placeholder URLs
+
+ - Successful images are stored at their original placeholder
+ URLs
+ ip_signal:
+ type: boolean
+ default: false
+ description: >-
+ Flags prompts with potential IP content. If detected, a
+ warning will be included in the response.
+ examples:
+ valid prompt:
+ value:
+ prompt: a book
+ num_results: 2
+ sync: true
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again,
+ you should use in the request the prompt and
+ the seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always
+ includes exactly one URL. When sync=false,
+ the request is asynchronous — the URL is
+ returned immediately, but the image will
+ become available once the inference process
+ is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ - type: object
+ required:
+ - error_code
+ - description
+ properties:
+ error_code:
+ type: string
+ example: '408'
+ description:
+ type: string
+ example: Query doesn't stand with Bria's ethic rules
+ examples:
+ success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_222222.png
+ seed: 222222
+ uuid: some_uuid_222222
+ partial_success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - blocked: true
+ error_code: '422'
+ description: >-
+ The request could not be completed because the
+ generated visual did not pass content moderation.
+ prompt_blocked:
+ value:
+ error_code: '408'
+ description: Query doesn't stand with Bria's ethic rules
+ '209':
+ description: >-
+ Successful operation, a model version that is no longer available
+ was requested. The request was redirected to the latest model
+ version.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again, you
+ should use in the request the prompt and the
+ seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always includes
+ exactly one URL. When sync=false, the request is
+ asynchronous — the URL is returned immediately,
+ but the image will become available once the
+ inference process is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '405':
+ description: Method not allowed.
+ '415':
+ description: >-
+ Unsupported Media Type. Invalid file type. Supported file types are
+ jpeg, jpg, png, webp.
+ '422':
+ description: Unprocessable Content
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ input_violation:
+ value: >-
+ The request could not be completed because the visual in the
+ '{parameter_name}' parameter did not pass content
+ moderation.
+ all_outputs_blocked:
+ value: >-
+ The request could not be completed because all generated
+ visuals did not pass content moderation.
+ invalid_url:
+ value: >-
+ Unprocessable Entity. The URL does not point to a valid
+ image or is inaccessible.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+ /text-to-vector/base/{model_version}:
+ post:
+ summary: Generate Vector Graphics - Base (Beta)
+ tags:
+ - Endpoints
+ description: >-
+
+
+ **Description**
+
+
+ This Vector Generation pipeline enables builders to integrate the
+ generation of high-quality, editable vector graphic assets into their
+ products or workflows. It leverages Bria’s proprietary text-to-image
+ foundation models, enhanced to produce vector-compatible outputs while
+ maintaining control and flexibility. The pipeline supports generation of
+ scalable assets such as icons, logos, and illustrations, making it ideal
+ for use cases requiring vector graphics.
+
+
+
+ **Examples:**
+
+
+ **prompt**: A sticker of a cute kitten
+
+
+
+
+
+
+ **prompt**: A beautiful butterfly
+
+
+ 
+
+
+ On the left, a generated vector illustration. On the right, the same illustration after being re-colored in a vector editor
+
+ This API endpoint supports content moderation via an optional parameter that can prevent generation if input images contain inappropriate content, and filters out unsafe generated images - the first blocked input image will fail the entire request.
+ operationId: text-to-vector-base
+ parameters:
+ - in: path
+ name: model_version
+ schema:
+ type: string
+ enum:
+ - '2.3'
+ - '3.2'
+ required: true
+ description: >-
+ The model version you would like to use in the request. We recommend
+ to use our most advanced text-to-image model, Bria 3.2, that offers
+ enhanced aesthetics, exceptional prompt alignment and strong
+ capabilities in generating text within images.
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ prompt:
+ type: string
+ description: >-
+ The prompt you would like to use to generate images. Bria
+ currently supports prompts in English only.
+ num_results:
+ type: integer
+ description: >-
+ The aspect ratio of the image. When a ControlNet is being
+ used, the aspect ratio is defined by the guidance image and
+ this parameter is ignored.
+ minimum: 1
+ default: 4
+ maximum: 4
+ aspect_ratio:
+ type: string
+ description: The aspect ratio of the image.
+ default: '1:1'
+ enum:
+ - '1:1'
+ - '2:3'
+ - '3:2'
+ - '3:4'
+ - '4:3'
+ - '4:5'
+ - '5:4'
+ - '9:16'
+ - '16:9'
+ sync:
+ type: boolean
+ description: >-
+ Determines the response mode. When true, responses are
+ synchronous. With false, responses are asynchronous,
+ immediately providing URLs for images that are generated in
+ the background. Use polling for the URLs to retrieve images
+ once ready.
+ default: false
+ seed:
+ type: integer
+ description: >-
+ You can choose whether you want your generated result to be
+ random or predictable. You can recreate the same result in
+ the future by using the seed value of a result from the
+ response with the prompt, model type and model version. You
+ can exclude this parameter if you are not interested in
+ recreating your results. This parameter is optional.
+ negative_prompt:
+ type: string
+ description: >-
+ Specify here elements that you didn't ask in the prompt, but
+ are being generated, and you would like to exclude. This
+ parameter is optional. Bria currently supports prompts in
+ English only.
+ steps_num:
+ type: integer
+ description: >-
+ The number of iterations the model goes through to refine
+ the generated image. This parameter is optional.
+ minimum: 20
+ default: 30
+ maximum: 50
+ text_guidance_scale:
+ type: number
+ format: float
+ description: >-
+ Determines how closely the generated image should adhere to
+ the input text description. This parameter is optional.
+ minimum: 1
+ maximum: 10
+ default: 5
+ prompt_content_moderation:
+ type: boolean
+ default: true
+ description: >
+ When enabled (default: true), the input prompt is scanned
+ for NSFW or ethically restricted terms before image
+ generation. If the prompt violates Bria's ethical
+ guidelines, the request will be rejected with a 408 error.
+ content_moderation:
+ type: boolean
+ default: false
+ description: >
+ When enabled, applies content moderation to both input
+ visuals and generated outputs.
+
+
+ For input images:
+
+ - Processing stops at the first image that fails moderation
+
+ - Returns a 422 error with details about which parameter
+ failed
+
+
+ For synchronous requests (sync=true):
+
+ - If all generated images fail moderation, returns a 422
+ error
+
+ - If some images pass and others fail, returns a 200
+ response with successful generations and "blocked" objects
+ for failed ones
+
+
+ For asynchronous requests (sync=false):
+
+ - Failed images are replaced with zero-byte files at their
+ placeholder URLs
+
+ - Successful images are stored at their original placeholder
+ URLs
+ ip_signal:
+ type: boolean
+ default: false
+ description: >-
+ Flags prompts with potential IP content. If detected, a
+ warning will be included in the response.
+ guidance_method_1:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_1_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_1_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_1. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ guidance_method_2:
+ type: string
+ enum:
+ - controlnet_canny
+ - controlnet_depth
+ - controlnet_recoloring
+ - controlnet_color_grid
+ description: >-
+ Which guidance type you would like to include in the
+ generation. Up to 2 guidance methods can be combined during
+ a single inference. This parameter is optional.
+ guidance_method_2_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: The impact of the guidance.
+ guidance_method_2_image_file:
+ type: string
+ description: >-
+ The image that should be used as guidance, in base64 format,
+ with the method defined in guidance_method_2. Accepted
+ formats are jpeg, jpg, png, webp. Maximum file size 12MB. If
+ more then one guidance method is used, all guidance images
+ must be of the same aspect ratio, and this will be the
+ aspect ratio of the generated results. If guidance_method_1
+ is selected, an image must be provided.
+ image_prompt_mode:
+ type: string
+ enum:
+ - regular
+ - style_only
+ default: regular
+ description: >
+ - `regular`: Uses the image’s content, style elements, and
+ color palette to guide generation.
+
+ - `style_only`: Uses the image’s high-level style elements
+ and color palette to influence the generated output.
+
+ The support for image prompt is currently available only
+ when model_version="2.3".
+ image_prompt_file:
+ type: string
+ description: >
+ The image file to be used as guidance, in base64 format.
+ Accepted formats are jpeg, jpg, png, webp.
+
+ Maximum file size 12MB. This image can be of any aspect
+ ratio, even when it's not alligned with the one defined in
+ the parameter 'aspect_ratio' or by visuals provided to the
+ ControlNets.
+ image_prompt_urls:
+ type: array
+ items:
+ type: string
+ format: uri
+ description: >
+ A list of URLs of images that should be used as guidance.
+ The images can be of different aspect ratios. Accepted
+ formats are jpeg, jpg, png, webp.
+
+ The URLs should point to accessible, publicly available
+ images.
+ image_prompt_scale:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 1
+ description: >
+ The impact of the provided image on the generated results. A
+ value between 0.0 (no impact) and 1.0 (full impact).
+ examples:
+ valid prompt:
+ value:
+ prompt: A simplistic flat icon of a megaphone
+ num_results: 2
+ sync: true
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again,
+ you should use in the request the prompt and
+ the seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always
+ includes exactly one URL. When sync=false,
+ the request is asynchronous — the URL is
+ returned immediately, but the image will
+ become available once the inference process
+ is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ - type: object
+ required:
+ - error_code
+ - description
+ properties:
+ error_code:
+ type: string
+ example: '408'
+ description:
+ type: string
+ example: Query doesn't stand with Bria's ethic rules
+ examples:
+ success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_222222.png
+ seed: 222222
+ uuid: some_uuid_222222
+ partial_success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - blocked: true
+ error_code: '422'
+ description: >-
+ The request could not be completed because the
+ generated visual did not pass content moderation.
+ prompt_blocked:
+ value:
+ error_code: '408'
+ description: Query doesn't stand with Bria's ethic rules
+ '209':
+ description: >-
+ Successful operation, a model version that is no longer available
+ was requested. The request was redirected to the latest model
+ version.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again, you
+ should use in the request the prompt and the
+ seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always includes
+ exactly one URL. When sync=false, the request is
+ asynchronous — the URL is returned immediately,
+ but the image will become available once the
+ inference process is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '405':
+ description: Method not allowed.
+ '415':
+ description: >-
+ Unsupported Media Type. Invalid file type. Supported file types are
+ jpeg, jpg, png, webp.
+ '422':
+ description: Unprocessable Content
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ input_violation:
+ value: >-
+ The request could not be completed because the visual in the
+ '{parameter_name}' parameter did not pass content
+ moderation.
+ all_outputs_blocked:
+ value: >-
+ The request could not be completed because all generated
+ visuals did not pass content moderation.
+ invalid_url:
+ value: >-
+ Unprocessable Entity. The URL does not point to a valid
+ image or is inaccessible.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+ /text-to-vector/fast/{model_version}:
+ post:
+ summary: Generate Vector Graphics - Fast (Beta)
+ tags:
+ - Endpoints
+ description: >-
+
+
+ **Description**
+
+
+ This Vector Generation pipeline is optimized for speed, enabling
+ builders to quickly integrate the generation of high-quality, editable
+ vector graphic assets into their products or workflows. It leverages
+ Bria’s proprietary text-to-image foundation models, enhanced to
+ accelerate output while maintaining control and flexibility. The
+ pipeline supports generation of scalable assets such as icons, logos,
+ and illustrations, making it ideal for use cases that require rapid
+ delivery of vector graphics.
+
+
+ **Examples:**
+
+
+ **prompt**: An icon of a bird with a blue head and yellow beak against a
+ solid background
+
+
+
+
+
+ Generated Visual (combined into a gif)
+
+
+ - **Convert Sketches to Illustrations**
+
+ Structure reference image
+
+
+
+ prompt: A watercolor painting of a lively urban street featuring a red vintage car parked in front of multi-story buildings, where soft, fluid brushstrokes capture the subtle gradients in the building facades, with warm earth tones blending into cool blues and grays for the shadows, giving the scene a nostalgic and dreamy atmosphere.
+
+ structure_ref_influence: 0.75
+
+ Generated Visual
+
+
+ - **Generate Diverse Variations**
+
+ Structure reference image
+
+
+
+ prompt: A ginger kitten sits on a textured beige surface, surrounded by soft balls of yarn.
+
+ structure_ref_influence: 0.75
+
+ Generated Visual
+
+
+ - **Stylize Typography and Logos**
+
+ Structure reference image
+
+
+
+ prompt: curled orange peel.
+
+ structure_ref_influence: 0.1
+
+ Generated Visual
+
+
+
+ **Interoperability with Tailored Generation**
+
+ - **Reskin Gaming Assets**: Maintain the structure and detail of assets
+ while updating textures and colors for fresh looks without altering the
+ original shape or layout.
+
+
+ - **Iterate on Gaming Asset Designs**: Simplifies design iteration for
+ gaming assets, enabling rapid exploration and refinement.
+
+
+ - **Customize Marketing Assets**: Transform marketing visuals while
+ preserving their composition, adding new styles and elements with
+ structural guidance.
+
+
+ - **Adapt User-Generated Content**: Repurpose user-generated content for
+ marketing campaigns, making it fit seamlessly with brand aesthetics.
+
+
+ **For practical tips, view our guide
+ [here](https://www.notion.so/134ba153467980a28d25de394f651c4a?pvs=21).**
+
+ This API endpoint supports content moderation via an optional parameter
+ that can prevent generation if input images contain inappropriate
+ content, and filters out unsafe generated images - the first blocked
+ input image will fail the entire request.
+ operationId: reimagine-structure-reference
+ parameters:
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ structure_image_url:
+ type: string
+ description: >-
+ A publicly available URL of the structure reference image.
+ If both structure_image_url and structure_image_file are
+ provided, structure_image_url will be used. Accepted formats
+ are jpeg, jpg, png, webp. Maximum file size 12MB.
+ structure_image_file:
+ type: string
+ description: >-
+ The image file containing the structure reference, in base64
+ format. This parameter is used if structure_image_url is not
+ provided. Accepted formats are jpeg, jpg, png, webp. Maximum
+ file size 12MB.
+ structure_ref_influence:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1
+ default: 0.75
+ description: >-
+ The influence of the structure reference on the generated
+ image. This parameter is optional. Higher value means more
+ adherence to the reference structure.
+ prompt:
+ type: string
+ description: The text prompt describing the desired output image.
+ num_results:
+ type: integer
+ description: >-
+ How many images you would like to generate. This parameter
+ is optional. When fast=false, only num_results=1 is
+ supported.
+ minimum: 1
+ default: 4
+ maximum: 4
+ sync:
+ type: boolean
+ description: >-
+ Determines the response mode. When true, responses are
+ synchronous. With false, responses are asynchronous,
+ immediately providing URLs for images that are generated in
+ the background. Use polling for the URLs to retrieve images
+ once ready. This parameter is optional. When fast=false, it
+ is recommended to use sync=false.
+ default: true
+ fast:
+ type: boolean
+ default: true
+ description: >-
+ Tradeoff between speed and control. Set to true for fast
+ mode when speed is critical. Set to false for regular mode
+ when you need tighter control of composition, style, and
+ fine details. Currently, tailored models trained using the
+ "Max" training version do not support this parameter.
+ seed:
+ type: integer
+ description: >-
+ You can choose whether you want your generated result to be
+ random or predictable. You can recreate the same result in
+ the future by using the seed value of a result from the
+ response with the prompt and other parameters. This
+ parameter is optional.
+ enhance_image:
+ type: boolean
+ default: false
+ description: >
+ When set to true, generates images with richer details,
+ sharper textures, and enhanced clarity.
+
+
+ Slightly increases generation time per image.
+ prompt_content_moderation:
+ type: boolean
+ default: true
+ description: >
+ When enabled (default: true), the input prompt is scanned
+ for NSFW or ethically restricted terms before image
+ generation. If the prompt violates Bria's ethical
+ guidelines, the request will be rejected with a 408 error.
+ content_moderation:
+ type: boolean
+ default: false
+ description: >
+ When enabled, applies content moderation to both input
+ visuals and generated outputs.
+
+
+ For input images:
+
+ - Processing stops at the first image that fails moderation
+
+ - Returns a 422 error with details about which parameter
+ failed
+
+
+ For synchronous requests (sync=true):
+
+ - If all generated images fail moderation, returns a 422
+ error
+
+ - If some images pass and others fail, returns a 200
+ response with successful generations and "blocked" objects
+ for failed ones
+
+
+ For asynchronous requests (sync=false):
+
+ - Failed images are replaced with zero-byte files at their
+ placeholder URLs
+
+ - Successful images are stored at their original placeholder
+ URLs
+ ip_signal:
+ type: boolean
+ default: false
+ description: >-
+ Flags prompts with potential IP content. If detected, a
+ warning will be included in the response.
+ tailored_model_id:
+ type: string
+ description: >-
+ The ID of the tailored model to use for generation. This
+ parameter is optional.
+ tailored_checkpoint_step:
+ type: integer
+ description: >-
+ The specific checkpoint step to use for inference. This is
+ optional and only relevant for models trained in 'expert'
+ mode. If no checkpoint is provided, the model's
+ 'active_model_version' will be used.
+ tailored_model_influence:
+ type: number
+ format: float
+ minimum: 0
+ maximum: 1.5
+ default: 0.5
+ description: >-
+ The influence of the tailored model on the generation. Only
+ relevant if tailored_model_id is provided. This parameter is
+ optional. When the training data was minimal or less
+ diverse, lower the influence to improve flexibility in the
+ results.
+ include_generation_prefix:
+ type: boolean
+ default: true
+ description: >-
+ This is relevant only when a tailored model is being used.
+ When true, the model's generation prefix is automatically
+ prepended to your prompt to maintain consistency with the
+ training data, while false allows you to override the
+ training prefix and write the complete prompt yourself,
+ including any preferred prefix text.
+ steps_num:
+ type: integer
+ description: >-
+ The number of iterations the model goes through to refine
+ the generated image. This parameter is optional. When
+ fast=false, or for tailored models trained using the 'Max'
+ training version, the default value is 30, the minimum is 20
+ and the maximum is 50.
+ minimum: 4
+ default: 12
+ maximum: 50
+ examples:
+ valid prompt:
+ value:
+ prompt: a book
+ structure_image_url: URL
+ num_results: 2
+ sync: true
+ fast: true
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ oneOf:
+ - type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again,
+ you should use in the request the prompt and
+ the seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always
+ includes exactly one URL. When sync=false,
+ the request is asynchronous — the URL is
+ returned immediately, but the image will
+ become available once the inference process
+ is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ - type: object
+ required:
+ - error_code
+ - description
+ properties:
+ error_code:
+ type: string
+ example: '408'
+ description:
+ type: string
+ example: Query doesn't stand with Bria's ethic rules
+ examples:
+ success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_222222.png
+ seed: 222222
+ uuid: some_uuid_222222
+ partial_success:
+ value:
+ result:
+ - urls:
+ - >-
+ https://storage.server/generate_image/some_uuid/seed_111111.png
+ seed: 111111
+ uuid: some_uuid_111111
+ - blocked: true
+ error_code: '422'
+ description: >-
+ The request could not be completed because the
+ generated visual did not pass content moderation.
+ prompt_blocked:
+ value:
+ error_code: '408'
+ description: Query doesn't stand with Bria's ethic rules
+ '209':
+ description: >-
+ Successful operation, a model version that is no longer available
+ was requested. The request was redirected to the latest model
+ version.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ result:
+ type: array
+ description: >-
+ There are multiple objects in this array (based on the
+ amount specified in num_results) and each object
+ represents a single image or a blocked result.
+ items:
+ oneOf:
+ - type: object
+ properties:
+ seed:
+ type: integer
+ description: >-
+ If you want to recreate the result again, you
+ should use in the request the prompt and the
+ seed of the response.
+ urls:
+ type: array
+ items:
+ type: string
+ description: >-
+ A list containing a single URL where the
+ generated image can be found. Always includes
+ exactly one URL. When sync=false, the request is
+ asynchronous — the URL is returned immediately,
+ but the image will become available once the
+ inference process is complete.
+ uuid:
+ type: string
+ - type: object
+ properties:
+ blocked:
+ type: boolean
+ error_code:
+ type: string
+ description:
+ type: string
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '404':
+ description: Not Found. Model with the specified ID does not exist
+ '405':
+ description: Method not allowed.
+ '415':
+ description: >-
+ Unsupported Media Type. Invalid file type. Supported file types are
+ jpeg, jpg, png, webp.
+ '422':
+ description: Unprocessable Content
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ input_violation:
+ value: >-
+ The request could not be completed because the visual in the
+ '{parameter_name}' parameter did not pass content
+ moderation.
+ all_outputs_blocked:
+ value: >-
+ The request could not be completed because all generated
+ visuals did not pass content moderation.
+ invalid_url:
+ value: >-
+ Unprocessable Entity. The URL does not point to a valid
+ image or is inaccessible.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+ /prompt_enhancer:
+ post:
+ summary: Prompt enhancement
+ tags:
+ - Endpoints
+ description: >-
+
+
+ **Description**
+
+
+ The /prompt_enhancer route is designed to boost users' creativity by
+ transforming simple prompts into more detailed and vivid descriptions.
+ This helps generate richer, more diverse images. (It is also available
+ as a built-in flag in all of our /text-to-image routes, excluding
+ tailored generation.)
+
+
+ We recommend using this feature by offering users a range of prompts to
+ choose from before generating an image, enabling them to explore
+ creative ideas.
+
+
+ *Works best with short to medium prompts of up to approximately 50
+ words.
+
+
+ **Examples:**
+
+
+ **original prompt**: A cat
+
+
+
+
+
+ **enhanced prompt**: A black and white photograph of a sophisticated
+ Siamese cat, sitting in a chair next to a large window, with the urban
+ cityscape visible in the background
+
+
+
+ operationId: prompt-enhancer
+ parameters:
+ - in: header
+ name: api_token
+ schema:
+ type: string
+ required: true
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ prompt:
+ type: string
+ description: The original prompt that to enhance.
+ examples:
+ valid prompt:
+ value:
+ prompt: an old man fishing
+ responses:
+ '200':
+ description: Successful operation.
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ results:
+ type: string
+ description: the new enhanced prompt
+ examples:
+ valid prompt:
+ value:
+ results:
+ prompt variations: >-
+ A close-up, detailed illustration of a fluffy white cat
+ sitting on a windowsill, with its eyes wide open,
+ surrounded by soft, warm light, and a few books
+ scattered nearby
+ '400':
+ description: Bad request.
+ '403':
+ description: Forbidden
+ content:
+ application/json:
+ schema:
+ type: string
+ examples:
+ quota_exceeded:
+ value: >-
+ Quota exceeded: Free users can make up to 1000 requests in
+ total. Please upgrade your plan to continue using the
+ service.
+ access_denied:
+ value: >-
+ Access denied: Your subscription does not include access to
+ this feature/product.
+ '429':
+ description: >-
+ Request limit exceeded. Your account has reached its maximum allowed
+ requests. Please upgrade your plan or try again later.
+ '500':
+ description: Internal server error.
+components: {}
diff --git a/packages/ui/src/i18n/it.json b/packages/ui/src/i18n/it.json
new file mode 100644
index 00000000..43d81b9b
--- /dev/null
+++ b/packages/ui/src/i18n/it.json
@@ -0,0 +1,458 @@
+{
+ "Search pictures, users, collections...": "Cerca immagini, utenti, collezioni...",
+ "Search": "Ricerca",
+ "AI Image Generator": "Generatore di immagini AI",
+ "Language": "Lingua",
+ "Sign in": "Accedi",
+ "Loading...": "Caricamento...",
+ "My Profile": "Il mio profilo",
+ "Enter your Google API key": "Inserire la chiave API di Google",
+ "Enter your OpenAI API key": "Inserire la chiave API OpenAI",
+ "General": "Generale",
+ "Organizations": "Organizzazioni",
+ "API Keys": "Chiavi API",
+ "Profile": "Profilo",
+ "Gallery": "Galleria",
+ "Profile Settings": "Impostazioni del profilo",
+ "Manage your account settings and preferences": "Gestire le impostazioni e le preferenze dell'account",
+ "Google API Key": "Chiave API di Google",
+ "For Google services (stored securely)": "Per i servizi Google (memorizzati in modo sicuro)",
+ "OpenAI API Key": "Chiave API OpenAI",
+ "For AI image generation (stored securely)": "Per la generazione di immagini AI (archiviate in modo sicuro)",
+ "Save API Keys": "Salvare le chiavi API",
+ "AP Gateway": "Gateway AP",
+ "AP IP Address": "Indirizzo IP AP",
+ "AP Password": "Password AP",
+ "AP SSID": "SSID DELL'AP",
+ "AP Subnet Mask": "Maschera di sottorete AP",
+ "API URL": "URL API",
+ "AUTO": "AUTO",
+ "AUTO MULTI": "AUTO MULTI",
+ "AUTO MULTI BALANCED": "AUTO MULTI BILANCIATO",
+ "AUTO_MULTI": "AUTO_MULTI",
+ "AUTO_MULTI_BALANCED": "AUTO_MULTI_BILANCIATO",
+ "AUTO_TIMEOUT": "AUTO_TIMEOUT",
+ "Access Point (AP) Mode": "Modalità punto di accesso (AP)",
+ "Add Container": "Aggiungere un contenitore",
+ "Add Samples": "Aggiungi campioni",
+ "Add Slave": "Aggiungi Slave",
+ "Add Widget": "Aggiungi widget",
+ "Add a set of sample control points to this plot": "Aggiungere una serie di punti di controllo campione a questo grafico",
+ "Add all": "Aggiungi tutti",
+ "Addr:": "Indirizzo:",
+ "Address Picker": "Scegliere l'indirizzo",
+ "Advanced": "Avanzato",
+ "All Stop": "Tutti gli stop",
+ "Apply": "Applicare",
+ "Argument 0:": "Argomento 0:",
+ "Argument 1:": "Argomento 1:",
+ "Argument 2 (Optional):": "Argomento 2 (facoltativo):",
+ "Arguments:": "Argomenti:",
+ "Associated Controllers:": "Controllori associati:",
+ "Associated Signal Plot (Optional)": "Traccia del segnale associato (opzionale)",
+ "Aux": "Aux",
+ "BALANCE": "EQUILIBRIO",
+ "BALANCE_MAX_DIFF": "EQUILIBRIO_MAX_DIFF",
+ "Buzzer": "Cicalino",
+ "Buzzer: Fast Blink": "Cicalino: Lampeggio veloce",
+ "Buzzer: Long Beep/Short Pause": "Cicalino: Segnale acustico lungo/pausa breve",
+ "Buzzer: Off": "Cicalino: Spento",
+ "Buzzer: Slow Blink": "Cicalino: Lampeggio lento",
+ "Buzzer: Solid On": "Cicalino: Acceso fisso",
+ "CE": "CE",
+ "COM Write": "Scrivere COM",
+ "CP Description (Optional):": "Descrizione del PC (opzionale):",
+ "CP Name (Optional):": "Nome del PC (facoltativo):",
+ "CSV": "CSV",
+ "Call Function": "Funzione di chiamata",
+ "Call Method": "Metodo di chiamata",
+ "Call REST API": "Chiamare l'API REST",
+ "Cancel": "Annullamento",
+ "Carina": "Carina",
+ "Cassandra Left": "Cassandra Sinistra",
+ "Cassandra Right": "Cassandra Giusto",
+ "Castor": "Castore",
+ "Cetus": "Cetus",
+ "Charts": "Grafici",
+ "Child Profiles (Sub-plots)": "Profili dei bambini (sottotrame)",
+ "Clear": "Libero",
+ "Clear All": "Cancella tutto",
+ "Clear All CPs": "Azzeramento di tutti i PC",
+ "Clear Chart": "Grafico chiaro",
+ "Click \"Add Container\" to start building your layout": "Fare clic su \"Aggiungi contenitore\" per iniziare a costruire il layout",
+ "Click \"Add Widget\" to start building your HMI": "Fate clic su \"Aggiungi widget\" per iniziare a costruire il vostro HMI",
+ "Coil to Write:": "Bobina da scrivere:",
+ "Coils": "Bobine",
+ "Color": "Colore",
+ "Coma B": "Coma B",
+ "Commons": "Comuni",
+ "Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configurare il nuovo punto di controllo. Premere Invio per confermare o Esc per annullare.",
+ "Configure the series to be displayed on the chart.": "Configurare le serie da visualizzare nel grafico.",
+ "Connect": "Collegare",
+ "Connect to a Modbus server to see controller data.": "Collegarsi a un server Modbus per visualizzare i dati del controllore.",
+ "Connect to view register data.": "Collegarsi per visualizzare i dati del registro.",
+ "Connected, but no register data received yet. Waiting for data...": "Connesso, ma non sono ancora stati ricevuti dati di registro. In attesa di dati...",
+ "Connects to an existing Wi-Fi network.": "Si collega a una rete Wi-Fi esistente.",
+ "Containers": "Contenitori",
+ "Continue": "Continua",
+ "Control Points": "Punti di controllo",
+ "Control Points List": "Elenco dei punti di controllo",
+ "Controller Chart": "Grafico del controllore",
+ "Controller Partitions": "Partizioni del controllore",
+ "Copy \"{plotName}\" to...": "Copiare \"{plotName}\" in...",
+ "Copy \"{profileName}\" to...": "Copiare \"{nomeprofilo}\" in...",
+ "Copy this plot to another slot...": "Copia questa trama in un altro slot...",
+ "Copy to existing slot...": "Copia nello slot esistente...",
+ "Copy to...": "Copia a...",
+ "Copy...": "Copia...",
+ "Corona": "Corona",
+ "Corvus": "Corvus",
+ "Crater": "Cratere",
+ "Create Control Point": "Creare un punto di controllo",
+ "Create New Control Point": "Creare un nuovo punto di controllo",
+ "Creates its own Wi-Fi network.": "Crea la propria rete Wi-Fi.",
+ "Crux": "Crux",
+ "Current Status": "Stato attuale",
+ "Custom Widgets": "Widget personalizzati",
+ "DEC": "DEC",
+ "Dashboard": "Cruscotto",
+ "Delete": "Cancellare",
+ "Delete Profile": "Cancellare il profilo",
+ "Delete control point": "Cancellare il punto di controllo",
+ "Delta Vfd[15]": "Delta Vfd[15]",
+ "Description": "Descrizione",
+ "Device Hostname": "Nome host del dispositivo",
+ "Disable All": "Disattivare tutti",
+ "Disconnect": "Disconnessione",
+ "Display Message": "Messaggio sul display",
+ "Download": "Scaricare",
+ "Download All JSON": "Scarica tutti i JSON",
+ "Download English Translations": "Scarica le traduzioni in inglese",
+ "Download JSON for {name}": "Scarica JSON per {nome}",
+ "Download Plot": "Scarica la trama",
+ "Drag and resize widgets": "Trascinare e ridimensionare i widget",
+ "Duplicate Profile": "Profilo duplicato",
+ "Duration (hh:mm:ss)": "Durata (hh:mm:ss)",
+ "Duration:": "Durata:",
+ "E.g., Quick Ramp Up": "Ad esempio, accelerazione rapida",
+ "ERROR": "ERRORE",
+ "Edit": "Modifica",
+ "Edit Profile": "Modifica profilo",
+ "Edit mode: Add, move, and configure widgets": "Modalità di modifica: Aggiungere, spostare e configurare i widget",
+ "Edit mode: Configure containers and add widgets": "Modalità di modifica: Configurare i contenitori e aggiungere widget",
+ "Empty Canvas": "Tela vuota",
+ "Empty Layout": "Layout vuoto",
+ "Enable All": "Abilitazione di tutti",
+ "Enable control unavailable for {name}": "Abilita il controllo non disponibile per {nome}",
+ "Enabled": "Abilitato",
+ "End Index": "Indice finale",
+ "Enter CP description": "Inserire la descrizione del PC",
+ "Enter CP name": "Inserire il nome del PC",
+ "Export": "Esportazione",
+ "Export JSON": "Esportazione JSON",
+ "Export to CSV": "Esportazione in CSV",
+ "Favorite Coils": "Bobine preferite",
+ "Favorite Registers": "Registri preferiti",
+ "Favorites": "Preferiti",
+ "File name": "Nome del file",
+ "Fill": "Riempimento",
+ "Filling": "Riempimento",
+ "General Settings": "Impostazioni generali",
+ "Global Settings": "Impostazioni globali",
+ "HEX": "ESADECIMALE",
+ "HMI Edit Mode Active": "Modalità di modifica HMI attiva",
+ "Hardware I/O": "Hardware I/O",
+ "Heating Time": "Tempo di riscaldamento",
+ "Help": "Aiuto",
+ "Home": "Casa",
+ "HomingAuto": "HomingAuto",
+ "HomingMan": "HomingMan",
+ "Hostname": "Nome host",
+ "ID:": "ID:",
+ "IDLE": "IDLE",
+ "Idle": "Inattivo",
+ "Import": "Importazione",
+ "Import JSON": "Importazione di JSON",
+ "Info": "Info",
+ "Integrations": "Integrazioni",
+ "Interlocked": "Interbloccati",
+ "Jammed": "Inceppato",
+ "Joystick": "Joystick",
+ "LOADCELL": "CELLA DI CARICO",
+ "Last updated": "Ultimo aggiornamento",
+ "Loadcell[25]": "Cella di carico[25]",
+ "Loadcell[26]": "Cella di carico[26]",
+ "Loading Cassandra settings...": "Caricamento delle impostazioni di Cassandra...",
+ "Loading network settings...": "Caricamento delle impostazioni di rete...",
+ "Loading profiles from Modbus...": "Caricamento dei profili da Modbus...",
+ "Logs": "Registri",
+ "Low": "Basso",
+ "MANUAL": "MANUALE",
+ "MANUAL MULTI": "MULTI MANUALE",
+ "MANUAL_MULTI": "MANUALE_MULTI",
+ "MAXLOAD": "CARICO MASSIMO",
+ "MAX_TIME": "TEMPO MASSIMO",
+ "MINLOAD": "CARICO MINIMO",
+ "MULTI_TIMEOUT": "MULTI_TIMEOUT",
+ "Manage slave devices (max 1).": "Gestire i dispositivi slave (max 1).",
+ "Markdown": "Markdown",
+ "Master Configuration": "Configurazione master",
+ "Master Name": "Nome del master",
+ "Max": "Massimo",
+ "Max Simultaneous": "Massima simultaneità",
+ "Mid": "Medio",
+ "Min": "Min",
+ "Modbus": "Modbus",
+ "Mode": "Modalità",
+ "Move control point down": "Spostare il punto di controllo verso il basso",
+ "Move control point up": "Spostare il punto di controllo verso l'alto",
+ "N/A": "N/D",
+ "NONE": "NESSUNO",
+ "Network": "Rete",
+ "Network Settings": "Impostazioni di rete",
+ "No Operation": "Nessuna operazione",
+ "No coils data available. Try refreshing.": "Non sono disponibili dati sulle bobine. Prova a rinfrescare.",
+ "No containers yet": "Non ci sono ancora contenitori",
+ "No enabled profile": "Nessun profilo abilitato",
+ "No register data available. Try refreshing.": "Non ci sono dati di registro disponibili. Provare ad aggiornare.",
+ "No source found.": "Nessuna fonte trovata.",
+ "No widgets found": "Nessun widget trovato",
+ "No widgets yet": "Non ci sono ancora widget",
+ "None": "Nessuno",
+ "OC": "OC",
+ "OFFLINE": "OFFLINE",
+ "OK": "OK",
+ "OL": "OL",
+ "ON": "ON",
+ "ONLINE": "ONLINE",
+ "OV": "OV",
+ "OVERLOAD": "SOVRACCARICO",
+ "Offset": "Offset",
+ "Operatorswitch": "Interruttore operatore",
+ "PID Control": "Controllo PID",
+ "PV": "PV",
+ "Partitions": "Divisori",
+ "Pause": "Pausa",
+ "Pause Profile": "Profilo di pausa",
+ "Phapp": "Phapp",
+ "Play from start": "Giocare dall'inizio",
+ "Playground": "Parco giochi",
+ "Plunge": "Tuffo",
+ "Plunger": "Stantuffo",
+ "PlungingAuto": "TuffoAuto",
+ "PlungingMan": "Uomo che si tuffa",
+ "PolyMech - Cassandra": "PolyMech - Cassandra",
+ "Pop-out": "A scomparsa",
+ "PostFlow": "PostFlow",
+ "Press": "Stampa",
+ "Press Cylinder": "Cilindro di stampa",
+ "Press Cylinder Controls": "Controlli del cilindro della pressa",
+ "Presscylinder": "Cilindro a pressione",
+ "Profile Curves": "Curve del profilo",
+ "Profile Name": "Nome del profilo",
+ "Profile SP": "Profilo SP",
+ "Profiles": "Profili",
+ "Properties:": "Proprietà:",
+ "REMOTE": "REMOTO",
+ "Real time Charting": "Grafici in tempo reale",
+ "Real-time Charts": "Grafici in tempo reale",
+ "Record": "Record",
+ "Refresh Rate": "Frequenza di aggiornamento",
+ "Registers": "Registri",
+ "Remove all": "Rimuovi tutto",
+ "Remove all control points from this plot": "Rimuovere tutti i punti di controllo da questo grafico",
+ "Replay": "Riproduzione",
+ "Reset": "Reset",
+ "Reset Zoom": "Azzeramento dello zoom",
+ "ResettingJam": "Azzeramento dell'inceppamento",
+ "Restart at end": "Riavvio alla fine",
+ "Run Action": "Eseguire l'azione",
+ "Run this control point action now": "Eseguire ora l'azione del punto di controllo",
+ "SP": "SP",
+ "SP CMD Addr:": "SP CMD Addr:",
+ "SP:": "SP:",
+ "STA Gateway": "Gateway STA",
+ "STA IP Address": "Indirizzo IP STA",
+ "STA Password": "Password STA",
+ "STA Primary DNS": "STA DNS primario",
+ "STA SSID": "SSID STA",
+ "STA Secondary DNS": "STA DNS secondario",
+ "STA Subnet Mask": "Maschera di sottorete STA",
+ "STALLED": "STALLATO",
+ "Samplesignalplot 0": "Grafico del segnale dei campioni 0",
+ "Save AP Settings": "Salvare le impostazioni AP",
+ "Save All Settings": "Salva tutte le impostazioni",
+ "Save As": "Salva con nome",
+ "Save STA Settings": "Salvare le impostazioni STA",
+ "Save Signal Plot": "Salvare il grafico del segnale",
+ "Scale": "Scala",
+ "Scale:": "Scala:",
+ "Search...": "Ricerca...",
+ "Select Known Coil...": "Selezionare la bobina nota...",
+ "Select a control point to see its properties.": "Selezionare un punto di controllo per visualizzarne le proprietà.",
+ "Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Selezionare un plot di destinazione. Il contenuto di \"{plotName}\" sovrascriverà il plot selezionato. Questa azione non può essere annullata.",
+ "Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Selezionare un profilo di destinazione. Il contenuto di \"{profileName}\" sovrascriverà il profilo selezionato. Questa azione non può essere annullata.",
+ "Select a plot to overwrite": "Selezionare una trama da sovrascrivere",
+ "Select a profile to overwrite": "Selezionare un profilo da sovrascrivere",
+ "Select a register or coil address": "Selezionare un registro o un indirizzo di bobina",
+ "Select a signal plot to associate and edit": "Selezionare un grafico del segnale da associare e modificare",
+ "Select source...": "Selezionare la fonte...",
+ "Select type": "Selezionare il tipo",
+ "Selected child profiles will start, stop, pause, and resume with this parent profile.": "I profili figlio selezionati si avviano, si fermano, si mettono in pausa e riprendono con questo profilo genitore.",
+ "Send IFTTT Notification": "Invia una notifica IFTTT",
+ "Sequential Heating": "Riscaldamento sequenziale",
+ "Sequential Heating Control": "Controllo del riscaldamento sequenziale",
+ "Series": "Serie",
+ "Series Toggles": "Serie Toggles",
+ "Series settings": "Impostazioni della serie",
+ "Set All": "Imposta tutto",
+ "Set All SP": "Imposta tutti gli SP",
+ "Set as Default": "Imposta come predefinito",
+ "Settings": "Impostazioni",
+ "Settings...": "Impostazioni...",
+ "Shortplot 70s": "Trama breve 70s",
+ "Show Legend": "Mostra Legenda",
+ "Show PV": "Mostra PV",
+ "Show SP": "Mostra SP",
+ "Signal Control Point Details": "Dettagli del punto di controllo del segnale",
+ "Signal Plot Editor": "Editor di trame di segnale",
+ "Signal plots configuration loaded from API.": "Configurazione delle trame di segnale caricata dall'API.",
+ "Signalplot 922 Slot 2": "Signalplot 922 Slot 2",
+ "Signalplot 923 Slot 3": "Signalplot 923 Slot 3",
+ "Signals": "Segnali",
+ "Slave Mode": "Modalità Slave",
+ "Slave:": "Schiavo:",
+ "Slaves": "Schiavi",
+ "Slot": "Slot",
+ "Slot:": "Slot:",
+ "Source": "Fonte",
+ "Start": "Inizio",
+ "Start Index": "Indice di partenza",
+ "Start PID Controllers": "Avvio dei controllori PID",
+ "Start Profile": "Iniziare il profilo",
+ "State:": "Stato:",
+ "Station (STA) Mode": "Modalità stazione (STA)",
+ "Stop": "Stop",
+ "Stop PID Controllers": "Arresto dei controllori PID",
+ "Stop Profile": "Profilo dell'arresto",
+ "Stop and reset": "Arresto e ripristino",
+ "Stop at end": "Arresto alla fine",
+ "Stopped": "Interrotto",
+ "Stopping": "Arresto",
+ "Switch to edit mode to add containers": "Passare alla modalità di modifica per aggiungere i contenitori",
+ "Switch to edit mode to add widgets": "Passare alla modalità di modifica per aggiungere i widget",
+ "System Calls": "Chiamate di sistema",
+ "System Information": "Informazioni sul sistema",
+ "System Messages": "Messaggi di sistema",
+ "Target Controllers (Registers)": "Controllori di destinazione (registri)",
+ "Temperature Control Points": "Punti di controllo della temperatura",
+ "Temperature Profiles": "Profili di temperatura",
+ "This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Questo hostname viene utilizzato sia per la modalità STA che per quella AP. Le modifiche apportate saranno salvate in entrambe le modalità.",
+ "This is where you'll design and configure your HMI layouts.": "Qui si progettano e configurano i layout HMI.",
+ "This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Questa operazione cancella definitivamente il profilo \"{profileName}\" dal server. Questa azione non può essere annullata.",
+ "Time:": "Tempo:",
+ "Timeline:": "Cronologia:",
+ "Title (Optional)": "Titolo (facoltativo)",
+ "Total": "Totale",
+ "Total Cost": "Costo totale",
+ "Total:": "Totale:",
+ "Type:": "Tipo:",
+ "Unknown": "Sconosciuto",
+ "Update Profile": "Aggiornamento del profilo",
+ "Upload": "Caricare",
+ "Upload All JSON": "Caricare tutti i JSON",
+ "Upload JSON for {name}": "Caricare JSON per {nome}",
+ "Upload Plot": "Carica trama",
+ "User Defined": "Definito dall'utente",
+ "Value:": "Valore:",
+ "View": "Vista",
+ "View mode: Interact with your widgets": "Modalità di visualizzazione: Interagire con i widget",
+ "Visible Controllers": "Controllori visibili",
+ "Watched Items": "Articoli osservati",
+ "When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Quando la modalità Slave è abilitata, tutti i controllori Omron saranno disabilitati per l'elaborazione.",
+ "Widget editor and drag-and-drop functionality coming soon...": "Editor di widget e funzionalità drag-and-drop in arrivo...",
+ "Widgets": "Widget",
+ "Window (min)": "Finestra (min)",
+ "Window Offset": "Sfalsamento della finestra",
+ "Write Coil": "Scrivere la bobina",
+ "Write GPIO": "Scrivere GPIO",
+ "Write Holding Register": "Scrivere il registro di mantenimento",
+ "X-Axis": "Asse X",
+ "Y-Axis Left": "Asse Y Sinistra",
+ "accel": "accel",
+ "decel": "decelerare",
+ "e.g., Start Heating": "ad esempio, Avvio del riscaldamento",
+ "e.g., Turn on coil for pre-heating stage": "ad esempio, accendere la bobina per la fase di preriscaldamento",
+ "err": "sbagliare",
+ "fwd": "in avanti",
+ "in seconds": "in secondi",
+ "info": "info",
+ "none": "nessuno",
+ "reset": "azzeramento",
+ "reset_fault": "reset_fault",
+ "rev": "rev",
+ "run": "corsa",
+ "setup": "impostazione",
+ "stop": "fermarsi",
+ "Loading comments...": "Caricamento dei commenti...",
+ "Edit with AI Wizard": "Modifica con AI Wizard",
+ "Be the first to like this": "Sii il primo a cui piace questo",
+ "Versions": "Versioni",
+ "Current": "Attuale",
+ "Add a comment...": "Aggiungi un commento...",
+ "Post Comment": "Commento al post",
+ "No comments yet": "Non ci sono ancora commenti",
+ "Be the first to comment!": "Sii il primo a commentare!",
+ "Save": "Risparmiare",
+ "likes": "piace",
+ "like": "come",
+ "Prompt Templates": "Modelli di prompt",
+ "Optimize prompt with AI": "Ottimizzare il prompt con l'AI",
+ "Describe the image you want to create or edit... (Ctrl+V to paste images)": "Descrivete l'immagine che volete creare o modificare... (Ctrl+V per incollare le immagini)",
+ "e.g. Cyberpunk Portrait": "ad esempio Ritratto Cyberpunk",
+ "Prompt": "Prompt",
+ "Templates": "Modelli",
+ "Optimize": "Ottimizzare",
+ "Selected Images": "Immagini selezionate",
+ "Upload Images": "Caricare le immagini",
+ "Choose Files": "Scegliere i file",
+ "No images selected": "Nessuna immagine selezionata",
+ "Upload images or select from gallery": "Caricare le immagini o selezionarle dalla galleria",
+ "No templates saved yet": "Nessun modello salvato",
+ "Save current as template": "Salvare la versione corrente come modello",
+ "Loading profile...": "Caricamento del profilo...",
+ "Back to feed": "Torna all'alimentazione",
+ "Create Post": "Creare un post",
+ "posts": "posti",
+ "followers": "seguaci",
+ "following": "di seguito",
+ "Joined": "Iscritto",
+ "Collections": "Collezioni",
+ "New": "Nuovo",
+ "POSTS": "POSTI",
+ "HIDDEN": "NASCOSTO",
+ "Profile picture": "Immagine del profilo",
+ "your.email@example.com": "your.email@example.com",
+ "Enter username": "Inserire il nome utente",
+ "Enter display name": "Inserire il nome del display",
+ "Tell us about yourself...": "Ci parli di lei...",
+ "Change Avatar": "Cambia Avatar",
+ "Email": "Email",
+ "Username": "Nome utente",
+ "Display Name": "Nome visualizzato",
+ "Bio": "Bio",
+ "Your preferred language for the interface": "La lingua preferita per l'interfaccia",
+ "Save Changes": "Salva le modifiche",
+ "Edit Picture": "Modifica immagine",
+ "Edit Details": "Modifica dei dettagli",
+ "Generate Title & Description with AI": "Generare titolo e descrizione con l'intelligenza artificiale",
+ "Enter a title...": "Inserire un titolo...",
+ "Record audio": "Registrare l'audio",
+ "Describe your photo... You can use **markdown** formatting!": "Descrivi la tua foto... Puoi usare la formattazione **markdown**!",
+ "Description (Optional)": "Descrizione (opzionale)",
+ "Visible": "Visibile",
+ "Make this picture visible to others": "Rendere questa immagine visibile agli altri",
+ "Update": "Aggiornamento",
+ "Loading versions...": "Caricamento delle versioni...",
+ "No other versions available for this image.": "Non sono disponibili altre versioni per questa immagine."
+}
\ No newline at end of file
diff --git a/packages/ui/src/i18n/nl.json b/packages/ui/src/i18n/nl.json
new file mode 100644
index 00000000..4b0f4b00
--- /dev/null
+++ b/packages/ui/src/i18n/nl.json
@@ -0,0 +1,458 @@
+{
+ "Search pictures, users, collections...": "Foto's, gebruikers, collecties zoeken...",
+ "Search": "Zoek op",
+ "AI Image Generator": "AI Afbeelding Generator",
+ "Language": "Taal",
+ "Sign in": "Aanmelden",
+ "Loading...": "Aan het laden...",
+ "My Profile": "Mijn profiel",
+ "Enter your Google API key": "Voer uw Google API-sleutel in",
+ "Enter your OpenAI API key": "Voer uw OpenAI API-sleutel in",
+ "General": "Algemeen",
+ "Organizations": "Organisaties",
+ "API Keys": "API-sleutels",
+ "Profile": "Profiel",
+ "Gallery": "Galerij",
+ "Profile Settings": "Profielinstellingen",
+ "Manage your account settings and preferences": "Uw accountinstellingen en voorkeuren beheren",
+ "Google API Key": "Google API-sleutel",
+ "For Google services (stored securely)": "Voor Google-services (veilig opgeslagen)",
+ "OpenAI API Key": "OpenAI API sleutel",
+ "For AI image generation (stored securely)": "Voor het genereren van AI-afbeeldingen (veilig opgeslagen)",
+ "Save API Keys": "API-sleutels opslaan",
+ "AP Gateway": "AP Gateway",
+ "AP IP Address": "IP-adres AP",
+ "AP Password": "AP wachtwoord",
+ "AP SSID": "AP SSID",
+ "AP Subnet Mask": "AP-subnetmasker",
+ "API URL": "API URL",
+ "AUTO": "AUTO",
+ "AUTO MULTI": "AUTO MULTI",
+ "AUTO MULTI BALANCED": "AUTO MULTI-GEBALANCEERD",
+ "AUTO_MULTI": "AUTO_MULTI",
+ "AUTO_MULTI_BALANCED": "AUTO_MULTI_GEBALANCEERD",
+ "AUTO_TIMEOUT": "AUTO_TIMEOUT",
+ "Access Point (AP) Mode": "Modus toegangspunt (AP)",
+ "Add Container": "Container toevoegen",
+ "Add Samples": "Monsters toevoegen",
+ "Add Slave": "Slaaf toevoegen",
+ "Add Widget": "Widget toevoegen",
+ "Add a set of sample control points to this plot": "Een set controlepunten toevoegen aan deze plot",
+ "Add all": "Alles toevoegen",
+ "Addr:": "Adres:",
+ "Address Picker": "Adreskiezer",
+ "Advanced": "Geavanceerd",
+ "All Stop": "Alle stoppen",
+ "Apply": "Toepassen",
+ "Argument 0:": "Argument 0:",
+ "Argument 1:": "Argument 1:",
+ "Argument 2 (Optional):": "Argument 2 (optioneel):",
+ "Arguments:": "Argumenten:",
+ "Associated Controllers:": "Bijbehorende controllers:",
+ "Associated Signal Plot (Optional)": "Bijbehorend signaalplot (optioneel)",
+ "Aux": "Aux",
+ "BALANCE": "BALANS",
+ "BALANCE_MAX_DIFF": "BALANS_MAX_VERSCHIL",
+ "Buzzer": "Zoemer",
+ "Buzzer: Fast Blink": "Zoemer: Snel knipperen",
+ "Buzzer: Long Beep/Short Pause": "Zoemer: Lange piep/korte pauze",
+ "Buzzer: Off": "Zoemer: Uit",
+ "Buzzer: Slow Blink": "Zoemer: Langzaam knipperen",
+ "Buzzer: Solid On": "Zoemer: Continu aan",
+ "CE": "CE",
+ "COM Write": "COM schrijven",
+ "CP Description (Optional):": "CP Beschrijving (optioneel):",
+ "CP Name (Optional):": "CP-naam (optioneel):",
+ "CSV": "CSV",
+ "Call Function": "Functie oproepen",
+ "Call Method": "Bel methode",
+ "Call REST API": "REST API oproepen",
+ "Cancel": "Annuleren",
+ "Carina": "Carina",
+ "Cassandra Left": "Cassandra Links",
+ "Cassandra Right": "Cassandra Rechts",
+ "Castor": "Castor",
+ "Cetus": "Cetus",
+ "Charts": "Grafieken",
+ "Child Profiles (Sub-plots)": "Kindprofielen (subplots)",
+ "Clear": "Duidelijk",
+ "Clear All": "Alles wissen",
+ "Clear All CPs": "Alle CP's wissen",
+ "Clear Chart": "Duidelijke grafiek",
+ "Click \"Add Container\" to start building your layout": "Klik op \"Container toevoegen\" om te beginnen met het bouwen van je lay-out",
+ "Click \"Add Widget\" to start building your HMI": "Klik op \"Widget toevoegen\" om te beginnen met het bouwen van uw HMI",
+ "Coil to Write:": "Spoel om te schrijven:",
+ "Coils": "Spoelen",
+ "Color": "Kleur",
+ "Coma B": "Coma B",
+ "Commons": "Commons",
+ "Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configureer het nieuwe controlepunt. Druk op Enter om te bevestigen of op Esc om te annuleren.",
+ "Configure the series to be displayed on the chart.": "Configureer de series die moeten worden weergegeven op de grafiek.",
+ "Connect": "Maak verbinding met",
+ "Connect to a Modbus server to see controller data.": "Maak verbinding met een Modbus-server om controllergegevens te bekijken.",
+ "Connect to view register data.": "Maak verbinding om registergegevens te bekijken.",
+ "Connected, but no register data received yet. Waiting for data...": "Verbonden, maar nog geen registergegevens ontvangen. Wachten op gegevens...",
+ "Connects to an existing Wi-Fi network.": "Maakt verbinding met een bestaand Wi-Fi-netwerk.",
+ "Containers": "Containers",
+ "Continue": "Ga verder",
+ "Control Points": "Controlepunten",
+ "Control Points List": "Lijst met controlepunten",
+ "Controller Chart": "Regelaar Grafiek",
+ "Controller Partitions": "Controller-partities",
+ "Copy \"{plotName}\" to...": "Kopieer \"{plotnaam}\" naar...",
+ "Copy \"{profileName}\" to...": "Kopieer \"{profielnaam}\" naar...",
+ "Copy this plot to another slot...": "Kopieer deze plot naar een andere sleuf...",
+ "Copy to existing slot...": "Kopiëren naar bestaande sleuf...",
+ "Copy to...": "Kopiëren naar...",
+ "Copy...": "Kopiëren...",
+ "Corona": "Corona",
+ "Corvus": "Corvus",
+ "Crater": "Krater",
+ "Create Control Point": "Controlepunt maken",
+ "Create New Control Point": "Nieuw controlepunt maken",
+ "Creates its own Wi-Fi network.": "Maakt zijn eigen Wi-Fi-netwerk.",
+ "Crux": "Crux",
+ "Current Status": "Huidige status",
+ "Custom Widgets": "Aangepaste Widgets",
+ "DEC": "DEC",
+ "Dashboard": "Dashboard",
+ "Delete": "Verwijder",
+ "Delete Profile": "Profiel verwijderen",
+ "Delete control point": "Controlepunt verwijderen",
+ "Delta Vfd[15]": "Delta Vfd[15]",
+ "Description": "Beschrijving",
+ "Device Hostname": "Hostnaam apparaat",
+ "Disable All": "Alles uitschakelen",
+ "Disconnect": "Ontkoppelen",
+ "Display Message": "Bericht weergeven",
+ "Download": "Downloaden",
+ "Download All JSON": "Alle JSON downloaden",
+ "Download English Translations": "Engelse vertalingen downloaden",
+ "Download JSON for {name}": "JSON downloaden voor {naam}",
+ "Download Plot": "Download Plot",
+ "Drag and resize widgets": "Widgets slepen en formaat wijzigen",
+ "Duplicate Profile": "Duplicaat profiel",
+ "Duration (hh:mm:ss)": "Duur (uu:mm:ss)",
+ "Duration:": "Duur:",
+ "E.g., Quick Ramp Up": "Bijvoorbeeld Quick Ramp Up",
+ "ERROR": "FOUT",
+ "Edit": "Bewerk",
+ "Edit Profile": "Profiel bewerken",
+ "Edit mode: Add, move, and configure widgets": "Bewerkingsmodus: Widgets toevoegen, verplaatsen en configureren",
+ "Edit mode: Configure containers and add widgets": "Bewerkingsmodus: Containers configureren en widgets toevoegen",
+ "Empty Canvas": "Leeg canvas",
+ "Empty Layout": "Lege lay-out",
+ "Enable All": "Alles inschakelen",
+ "Enable control unavailable for {name}": "Controle niet beschikbaar voor {naam} inschakelen",
+ "Enabled": "Ingeschakeld",
+ "End Index": "Einde Index",
+ "Enter CP description": "CP-beschrijving invoeren",
+ "Enter CP name": "Voer CP-naam in",
+ "Export": "Exporteer",
+ "Export JSON": "JSON exporteren",
+ "Export to CSV": "Exporteren naar CSV",
+ "Favorite Coils": "Favoriete spoelen",
+ "Favorite Registers": "Favoriete registers",
+ "Favorites": "Favorieten",
+ "File name": "Bestandsnaam",
+ "Fill": "Vullen",
+ "Filling": "Vullen",
+ "General Settings": "Algemene instellingen",
+ "Global Settings": "Wereldwijde instellingen",
+ "HEX": "HEX",
+ "HMI Edit Mode Active": "HMI-bewerkingsmodus actief",
+ "Hardware I/O": "Hardware I/O",
+ "Heating Time": "Opwarmtijd",
+ "Help": "Help",
+ "Home": "Home",
+ "HomingAuto": "HomingAuto",
+ "HomingMan": "HomingMan",
+ "Hostname": "Hostnaam",
+ "ID:": "ID:",
+ "IDLE": "IDLE",
+ "Idle": "Inactief",
+ "Import": "Importeren",
+ "Import JSON": "JSON importeren",
+ "Info": "Info",
+ "Integrations": "Integraties",
+ "Interlocked": "Vergrendeld",
+ "Jammed": "Vastgelopen",
+ "Joystick": "Joystick",
+ "LOADCELL": "LOADCELL",
+ "Last updated": "Laatst bijgewerkt",
+ "Loadcell[25]": "Loadcell[25]",
+ "Loadcell[26]": "Loadcell[26]",
+ "Loading Cassandra settings...": "Cassandra instellingen laden...",
+ "Loading network settings...": "Netwerkinstellingen laden...",
+ "Loading profiles from Modbus...": "Profielen laden van Modbus...",
+ "Logs": "Logboeken",
+ "Low": "Laag",
+ "MANUAL": "HANDMATIG",
+ "MANUAL MULTI": "HANDMATIG MULTI",
+ "MANUAL_MULTI": "HANDMATIG_MULTI",
+ "MAXLOAD": "MAXLOAD",
+ "MAX_TIME": "MAX_TIJD",
+ "MINLOAD": "MINLOAD",
+ "MULTI_TIMEOUT": "MULTI_TIMEOUT",
+ "Manage slave devices (max 1).": "Slave-apparaten beheren (max 1).",
+ "Markdown": "Markdown",
+ "Master Configuration": "Hoofdconfiguratie",
+ "Master Name": "Master Naam",
+ "Max": "Max",
+ "Max Simultaneous": "Max. gelijktijdig",
+ "Mid": "Midden",
+ "Min": "Min",
+ "Modbus": "Modbus",
+ "Mode": "Modus",
+ "Move control point down": "Verplaats controlepunt omlaag",
+ "Move control point up": "Verplaats controlepunt omhoog",
+ "N/A": "N.V.T",
+ "NONE": "GEEN",
+ "Network": "Netwerk",
+ "Network Settings": "Netwerkinstellingen",
+ "No Operation": "Geen bediening",
+ "No coils data available. Try refreshing.": "Geen spoelgegevens beschikbaar. Probeer te verversen.",
+ "No containers yet": "Nog geen containers",
+ "No enabled profile": "Geen ingeschakeld profiel",
+ "No register data available. Try refreshing.": "Geen registergegevens beschikbaar. Probeer te verversen.",
+ "No source found.": "Geen bron gevonden.",
+ "No widgets found": "Geen widgets gevonden",
+ "No widgets yet": "Nog geen widgets",
+ "None": "Geen",
+ "OC": "OC",
+ "OFFLINE": "OFFLINE",
+ "OK": "OK",
+ "OL": "OL",
+ "ON": "OP",
+ "ONLINE": "ONLINE",
+ "OV": "OV",
+ "OVERLOAD": "OVERLOAD",
+ "Offset": "Offset",
+ "Operatorswitch": "Operatorschakelaar",
+ "PID Control": "PID-regeling",
+ "PV": "PV",
+ "Partitions": "Scheidingswanden",
+ "Pause": "Pauze",
+ "Pause Profile": "Profiel pauzeren",
+ "Phapp": "Phapp",
+ "Play from start": "Speel vanaf het begin",
+ "Playground": "Speeltuin",
+ "Plunge": "Duik",
+ "Plunger": "Plunjer",
+ "PlungingAuto": "DuikAuto",
+ "PlungingMan": "DuikendMan",
+ "PolyMech - Cassandra": "PolyMech - Cassandra",
+ "Pop-out": "Pop-up",
+ "PostFlow": "PostFlow",
+ "Press": "Druk op",
+ "Press Cylinder": "Perscilinder",
+ "Press Cylinder Controls": "Cilinderbediening",
+ "Presscylinder": "Perscilinder",
+ "Profile Curves": "Profielcurven",
+ "Profile Name": "Profielnaam",
+ "Profile SP": "Profiel SP",
+ "Profiles": "Profielen",
+ "Properties:": "Eigenschappen:",
+ "REMOTE": "AFSTAND",
+ "Real time Charting": "Real-time grafieken",
+ "Real-time Charts": "Real-time grafieken",
+ "Record": "Opnemen",
+ "Refresh Rate": "Verversingssnelheid",
+ "Registers": "Registers",
+ "Remove all": "Alles verwijderen",
+ "Remove all control points from this plot": "Alle controlepunten uit dit diagram verwijderen",
+ "Replay": "Replay",
+ "Reset": "Reset",
+ "Reset Zoom": "Zoom resetten",
+ "ResettingJam": "ResettenJam",
+ "Restart at end": "Opnieuw starten aan het einde",
+ "Run Action": "Actie uitvoeren",
+ "Run this control point action now": "Voer deze controlepuntactie nu uit",
+ "SP": "SP",
+ "SP CMD Addr:": "SP CMD Addr:",
+ "SP:": "SP:",
+ "STA Gateway": "STA Gateway",
+ "STA IP Address": "STA IP-adres",
+ "STA Password": "STA Wachtwoord",
+ "STA Primary DNS": "STA Primair DNS",
+ "STA SSID": "STA SSID",
+ "STA Secondary DNS": "STA Secundair DNS",
+ "STA Subnet Mask": "STA Subnetmasker",
+ "STALLED": "STALLED",
+ "Samplesignalplot 0": "Voorbeeldsignaalplot 0",
+ "Save AP Settings": "AP-instellingen opslaan",
+ "Save All Settings": "Alle instellingen opslaan",
+ "Save As": "Opslaan als",
+ "Save STA Settings": "STA-instellingen opslaan",
+ "Save Signal Plot": "Signaalplot opslaan",
+ "Scale": "Schaal",
+ "Scale:": "Schaal:",
+ "Search...": "Zoeken...",
+ "Select Known Coil...": "Selecteer bekende spoel...",
+ "Select a control point to see its properties.": "Selecteer een controlepunt om de eigenschappen ervan te bekijken.",
+ "Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Selecteer een bestemmingsplot. De inhoud van \"{plotnaam}\" overschrijft het geselecteerde perceel. Deze actie kan niet ongedaan worden gemaakt.",
+ "Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Selecteer een doelprofiel. De inhoud van \"{profileName}\" zal het geselecteerde profiel overschrijven. Deze actie kan niet ongedaan worden gemaakt.",
+ "Select a plot to overwrite": "Selecteer een perceel om te overschrijven",
+ "Select a profile to overwrite": "Selecteer een profiel om te overschrijven",
+ "Select a register or coil address": "Selecteer een register of spoeladres",
+ "Select a signal plot to associate and edit": "Selecteer een signaalplot om te koppelen en te bewerken",
+ "Select source...": "Selecteer bron...",
+ "Select type": "Selecteer type",
+ "Selected child profiles will start, stop, pause, and resume with this parent profile.": "Geselecteerde kindprofielen zullen starten, stoppen, pauzeren en hervatten met dit ouderprofiel.",
+ "Send IFTTT Notification": "IFTTT-kennisgeving verzenden",
+ "Sequential Heating": "Sequentiële verwarming",
+ "Sequential Heating Control": "Sequentiële verwarmingsregeling",
+ "Series": "Serie",
+ "Series Toggles": "Serieschakelaars",
+ "Series settings": "Serie-instellingen",
+ "Set All": "Alles instellen",
+ "Set All SP": "Alle SP instellen",
+ "Set as Default": "Instellen als standaard",
+ "Settings": "Instellingen",
+ "Settings...": "Instellingen...",
+ "Shortplot 70s": "Korte Plot 70",
+ "Show Legend": "Legende weergeven",
+ "Show PV": "Toon PV",
+ "Show SP": "Toon SP",
+ "Signal Control Point Details": "Details signaalcontrolepunt",
+ "Signal Plot Editor": "Signaalplot-editor",
+ "Signal plots configuration loaded from API.": "Signaalplots configuratie geladen van API.",
+ "Signalplot 922 Slot 2": "Signaalplot 922 sleuf 2",
+ "Signalplot 923 Slot 3": "Signaalplot 923 Sleuf 3",
+ "Signals": "Signalen",
+ "Slave Mode": "Slavenmodus",
+ "Slave:": "Slaaf:",
+ "Slaves": "Slaven",
+ "Slot": "Sleuf",
+ "Slot:": "Gleuf:",
+ "Source": "Bron",
+ "Start": "Start",
+ "Start Index": "Index starten",
+ "Start PID Controllers": "PID-regelaars starten",
+ "Start Profile": "Profiel starten",
+ "State:": "Staat:",
+ "Station (STA) Mode": "Station (STA) Modus",
+ "Stop": "Stop",
+ "Stop PID Controllers": "PID-regelaars stoppen",
+ "Stop Profile": "Stop profiel",
+ "Stop and reset": "Stoppen en resetten",
+ "Stop at end": "Stoppen aan het einde",
+ "Stopped": "Gestopt",
+ "Stopping": "Stoppen",
+ "Switch to edit mode to add containers": "Schakel over naar de bewerkingsmodus om containers toe te voegen",
+ "Switch to edit mode to add widgets": "Schakel over naar de bewerkingsmodus om widgets toe te voegen",
+ "System Calls": "Systeemoproepen",
+ "System Information": "Systeeminformatie",
+ "System Messages": "Systeemberichten",
+ "Target Controllers (Registers)": "Doelcontrollers (registers)",
+ "Temperature Control Points": "Temperatuurcontrolepunten",
+ "Temperature Profiles": "Temperatuurprofielen",
+ "This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Deze hostnaam wordt gebruikt voor zowel de STA- als de AP-modus. Wijzigingen hier worden opgeslagen in beide vormen.",
+ "This is where you'll design and configure your HMI layouts.": "Hier ontwerpt en configureert u uw HMI lay-outs.",
+ "This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Dit zal het profiel \"{profileName}\" permanent verwijderen van de server. Deze actie kan niet ongedaan worden gemaakt.",
+ "Time:": "Tijd:",
+ "Timeline:": "Tijdlijn:",
+ "Title (Optional)": "Titel (optioneel)",
+ "Total": "Totaal",
+ "Total Cost": "Totale kosten",
+ "Total:": "Totaal:",
+ "Type:": "Type:",
+ "Unknown": "Onbekend",
+ "Update Profile": "Profiel bijwerken",
+ "Upload": "Uploaden",
+ "Upload All JSON": "Alle JSON uploaden",
+ "Upload JSON for {name}": "JSON uploaden voor {naam}",
+ "Upload Plot": "Upload perceel",
+ "User Defined": "Door gebruiker gedefinieerd",
+ "Value:": "Waarde:",
+ "View": "Bekijk",
+ "View mode: Interact with your widgets": "Weergavemodus: Interactie met je widgets",
+ "Visible Controllers": "Zichtbare regelaars",
+ "Watched Items": "Bekeken items",
+ "When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Als de slave-modus is ingeschakeld, worden alle Omron-controllers uitgeschakeld voor verwerking.",
+ "Widget editor and drag-and-drop functionality coming soon...": "Widget editor en drag-and-drop functionaliteit binnenkort beschikbaar...",
+ "Widgets": "Widgets",
+ "Window (min)": "Venster (min)",
+ "Window Offset": "Venster offset",
+ "Write Coil": "Spoel schrijven",
+ "Write GPIO": "GPIO schrijven",
+ "Write Holding Register": "Schrijf houdregister",
+ "X-Axis": "X-as",
+ "Y-Axis Left": "Y-as links",
+ "accel": "accel",
+ "decel": "decel",
+ "e.g., Start Heating": "bijv. Start Verwarming",
+ "e.g., Turn on coil for pre-heating stage": "bijv. Spiraal inschakelen voor voorverwarmen",
+ "err": "err",
+ "fwd": "fwd",
+ "in seconds": "in seconden",
+ "info": "info",
+ "none": "geen",
+ "reset": "reset",
+ "reset_fault": "reset_fout",
+ "rev": "rev",
+ "run": "uitvoeren",
+ "setup": "setup",
+ "stop": "stop",
+ "Loading comments...": "Reacties laden...",
+ "Edit with AI Wizard": "Bewerken met AI Wizard",
+ "Be the first to like this": "Vind dit als eerste leuk",
+ "Versions": "Versies",
+ "Current": "Huidige",
+ "Add a comment...": "Een opmerking toevoegen...",
+ "Post Comment": "Reactie plaatsen",
+ "No comments yet": "Nog geen opmerkingen",
+ "Be the first to comment!": "Geef als eerste uw commentaar!",
+ "Save": "Sla",
+ "likes": "houdt van",
+ "like": "zoals",
+ "Prompt Templates": "Sjablonen voor vragen",
+ "Optimize prompt with AI": "Optimaliseer prompt met AI",
+ "Describe the image you want to create or edit... (Ctrl+V to paste images)": "Beschrijf de afbeelding die je wilt maken of bewerken... (Ctrl+V om afbeeldingen te plakken)",
+ "e.g. Cyberpunk Portrait": "bijvoorbeeld Cyberpunk-portret",
+ "Prompt": "Prompt",
+ "Templates": "Sjablonen",
+ "Optimize": "Optimaliseer",
+ "Selected Images": "Geselecteerde afbeeldingen",
+ "Upload Images": "Afbeeldingen uploaden",
+ "Choose Files": "Bestanden kiezen",
+ "No images selected": "Geen afbeeldingen geselecteerd",
+ "Upload images or select from gallery": "Upload afbeeldingen of selecteer ze uit de galerij",
+ "No templates saved yet": "Nog geen sjablonen opgeslagen",
+ "Save current as template": "Huidige opslaan als sjabloon",
+ "Loading profile...": "Profiel laden...",
+ "Back to feed": "Terug naar feed",
+ "Create Post": "Maak post",
+ "posts": "berichten",
+ "followers": "volgers",
+ "following": "volgend op",
+ "Joined": "Aangesloten bij",
+ "Collections": "Collecties",
+ "New": "Nieuw",
+ "POSTS": "POSTEN",
+ "HIDDEN": "VERBORGEN",
+ "Profile picture": "Profielfoto",
+ "your.email@example.com": "your.email@example.com",
+ "Enter username": "Gebruikersnaam invoeren",
+ "Enter display name": "Weergavenaam invoeren",
+ "Tell us about yourself...": "Vertel ons over jezelf...",
+ "Change Avatar": "Avatar wijzigen",
+ "Email": "E-mail",
+ "Username": "Gebruikersnaam",
+ "Display Name": "Naam weergeven",
+ "Bio": "Bio",
+ "Your preferred language for the interface": "De taal van je voorkeur voor de interface",
+ "Save Changes": "Wijzigingen opslaan",
+ "Edit Picture": "Afbeelding bewerken",
+ "Edit Details": "Details bewerken",
+ "Generate Title & Description with AI": "Titel en beschrijving genereren met AI",
+ "Enter a title...": "Voer een titel in...",
+ "Record audio": "Audio opnemen",
+ "Describe your photo... You can use **markdown** formatting!": "Beschrijf je foto... Je kunt **markdown** opmaak gebruiken!",
+ "Description (Optional)": "Beschrijving (optioneel)",
+ "Visible": "Zichtbaar",
+ "Make this picture visible to others": "Maak deze foto zichtbaar voor anderen",
+ "Update": "Update",
+ "Loading versions...": "Laden van versies...",
+ "No other versions available for this image.": "Er zijn geen andere versies beschikbaar voor deze afbeelding."
+}
\ No newline at end of file
diff --git a/packages/ui/src/index.css b/packages/ui/src/index.css
new file mode 100644
index 00000000..8e0a67d3
--- /dev/null
+++ b/packages/ui/src/index.css
@@ -0,0 +1,330 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+/* Photo sharing app design system - modern gradients and glass effects */
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 240 10% 15%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 15%;
+ --card-glass: 0 0% 100% / 0.8;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 15%;
+
+ --primary: 262 83% 58%;
+ --primary-foreground: 0 0% 98%;
+ --primary-glow: 280 100% 70%;
+
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+
+ --accent: 193 76% 59%;
+ --accent-foreground: 0 0% 98%;
+ --accent-glow: 193 100% 70%;
+
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --ring: 262 83% 58%;
+
+ --radius: 0.75rem;
+
+ /* Photo sharing specific tokens */
+ --gradient-primary: linear-gradient(135deg, hsl(262 83% 58%), hsl(280 100% 70%));
+ --gradient-secondary: linear-gradient(135deg, hsl(193 76% 59%), hsl(262 83% 58%));
+ --gradient-hero: linear-gradient(135deg, hsl(0 0% 100%) 0%, hsl(262 83% 58% / 0.05) 100%);
+ --glass-bg: hsl(0 0% 100% / 0.8);
+ --glass-border: hsl(240 5.9% 90%);
+ --photo-shadow: 0 25px 50px -12px hsl(262 83% 58% / 0.15);
+ --glow-shadow: 0 0 40px hsl(262 83% 58% / 0.2);
+
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 240 5.3% 26.1%;
+ --sidebar-primary: 240 5.9% 10%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 240 4.8% 95.9%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 220 13% 91%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+
+ .dark {
+ /* Material Design dark theme base - #121212 */
+ --background: 0 0% 7%;
+ --foreground: 0 0% 95%;
+
+ /* Surface elevation system following Material Design */
+ --card: 0 0% 9%;
+ /* 1dp elevation = base + 5% white overlay */
+ --card-foreground: 0 0% 95%;
+ --card-glass: 0 0% 12% / 0.8;
+ /* Higher elevation surfaces */
+
+ --popover: 0 0% 11%;
+ /* 2dp elevation = base + 7% white overlay */
+ --popover-foreground: 0 0% 95%;
+
+ /* Accessible primary colors for dark theme */
+ --primary: 270 91% 75%;
+ /* Lighter for better accessibility */
+ --primary-foreground: 0 0% 10%;
+ --primary-glow: 280 100% 80%;
+
+ --secondary: 0 0% 15%;
+ /* 3dp elevation = base + 8% white overlay */
+ --secondary-foreground: 0 0% 95%;
+
+ --muted: 0 0% 15%;
+ --muted-foreground: 0 0% 65%;
+ /* Better contrast for muted text */
+
+ --accent: 270 91% 75%;
+ --accent-foreground: 0 0% 10%;
+ --accent-glow: 280 100% 80%;
+
+ --destructive: 0 70% 50%;
+ /* More accessible red */
+ --destructive-foreground: 0 0% 95%;
+
+ --border: 0 0% 15%;
+ --input: 0 0% 15%;
+ --ring: 270 91% 75%;
+
+ /* Material Design elevation surfaces */
+ --surface-1dp: 0 0% 9%;
+ /* Cards, switches */
+ --surface-2dp: 0 0% 11%;
+ /* App bars (resting) */
+ --surface-3dp: 0 0% 12%;
+ /* Refresh indicator, search bar (resting) */
+ --surface-4dp: 0 0% 13%;
+ /* App bars (scrolled) */
+ --surface-6dp: 0 0% 14%;
+ /* FAB (resting), snackbars */
+ --surface-8dp: 0 0% 15%;
+ /* Menus, cards (picked up), switches (thumb) */
+ --surface-12dp: 0 0% 16%;
+ /* FAB (pressed) */
+ --surface-16dp: 0 0% 17%;
+ /* Navigation drawer, modal bottom sheets */
+ --surface-24dp: 0 0% 18%;
+ /* Dialogs */
+
+ /* Photo sharing specific tokens for dark mode */
+ --gradient-primary: linear-gradient(135deg, hsl(270 91% 75%), hsl(280 100% 80%));
+ --gradient-secondary: linear-gradient(135deg, hsl(270 91% 75%), hsl(260 85% 70%));
+ --gradient-hero: linear-gradient(135deg, hsl(0 0% 7%) 0%, hsl(270 91% 75% / 0.1) 100%);
+ --glass-bg: hsl(0 0% 12% / 0.4);
+ --glass-border: hsl(270 91% 75% / 0.2);
+ --photo-shadow: 0 25px 50px -12px hsl(270 91% 75% / 0.25);
+ --glow-shadow: 0 0 40px hsl(270 91% 75% / 0.3);
+
+ --sidebar-background: 0 0% 7%;
+ --sidebar-foreground: 0 0% 95%;
+ --sidebar-primary: 270 91% 75%;
+ --sidebar-primary-foreground: 0 0% 10%;
+ --sidebar-accent: 0 0% 15%;
+ --sidebar-accent-foreground: 0 0% 95%;
+ --sidebar-border: 0 0% 15%;
+ --sidebar-ring: 270 91% 75%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+@layer utilities {
+ .scrollbar-hide {
+ -ms-overflow-style: none;
+ /* Internet Explorer 10+ */
+ scrollbar-width: none;
+ /* Firefox */
+ }
+
+ .scrollbar-hide::-webkit-scrollbar {
+ display: none;
+ /* Safari and Chrome */
+ }
+
+ /* Custom thin scrollbar */
+ .scrollbar-custom::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+ }
+
+ .scrollbar-custom::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ .scrollbar-custom::-webkit-scrollbar-thumb {
+ background-color: hsl(var(--muted-foreground) / 0.3);
+ border-radius: 20px;
+ }
+
+ .scrollbar-custom::-webkit-scrollbar-thumb:hover {
+ background-color: hsl(var(--muted-foreground) / 0.5);
+ }
+}
+
+@layer components {
+
+ /* Ensure links in prose content are clickable and styled */
+ .prose a {
+ @apply text-primary hover:text-primary/80 underline hover:no-underline transition-colors cursor-pointer;
+ }
+
+ .prose a:visited {
+ @apply text-primary/70;
+ }
+
+ /* Enhanced prose table styling */
+ .prose table {
+ @apply w-full border-collapse border border-border;
+ }
+
+ .prose thead {
+ @apply bg-muted/50;
+ }
+
+ .prose th {
+ @apply border border-border px-4 py-2 text-left font-semibold;
+ }
+
+ .prose td {
+ @apply border border-border px-4 py-2;
+ }
+
+ .prose tbody tr:hover {
+ @apply bg-muted/30;
+ }
+
+ /* Heading styles */
+ .prose h1 {
+ @apply text-3xl font-bold mb-4 mt-6;
+ }
+
+ .prose h2 {
+ @apply text-2xl font-bold mb-3 mt-5;
+ }
+
+ .prose h3 {
+ @apply text-xl font-semibold mb-2 mt-4;
+ }
+
+ .prose h4 {
+ @apply text-lg font-semibold mb-2 mt-3;
+ }
+
+ /* List styles */
+ .prose ul {
+ @apply list-disc list-inside mb-4;
+ }
+
+ .prose ol {
+ @apply list-decimal list-inside mb-4;
+ }
+
+ .prose li {
+ @apply mb-1;
+ }
+
+ /* Code blocks */
+ .prose code {
+ @apply bg-muted px-1.5 py-0.5 rounded text-sm font-mono text-foreground font-medium;
+ }
+
+ .prose pre {
+ @apply bg-muted p-4 rounded-lg overflow-x-auto mb-4 text-foreground;
+ }
+
+ .prose pre code {
+ @apply bg-transparent p-0 text-foreground font-normal;
+ }
+
+ /* Blockquotes */
+ .prose blockquote {
+ @apply border-l-4 border-primary pl-4 italic my-4;
+ }
+
+ /* Paragraphs */
+ .prose p {
+ @apply mb-4;
+ }
+
+ /* Horizontal rules */
+ .prose hr {
+ @apply border-t border-border my-6;
+ }
+
+ /* Strong/Bold */
+ .prose strong {
+ @apply font-bold;
+ }
+
+ /* Emphasis/Italic */
+ .prose em {
+ @apply italic;
+ }
+}
+
+/* TikTok-style Video Player Overrides */
+@layer components {
+
+ /* Force Vidstack video to use object-contain for full video display */
+ [data-media-player] video {
+ object-fit: contain !important;
+ object-position: center !important;
+ max-width: 100% !important;
+ max-height: 100% !important;
+ width: 100% !important;
+ height: 100% !important;
+ }
+
+ /* Constrain video player to viewport */
+ [data-media-player] {
+ max-width: 100% !important;
+ max-height: 100% !important;
+ }
+
+ /* Email Widget Overrides (Design View) */
+ /* Fix for "font-size: 0" hack in email templates causing invisible text in editor */
+ .html-widget-container .long-text {
+ font-size: 12px;
+ /* The inline style from the widget prop will override this if valid */
+ }
+
+ /*
+ Reset email table structure for Editor View
+ - Makes the gray structural background transparent
+ - Allows widgets to take full width of their container in the editor
+ */
+ .html-widget-container .vb-outer {
+ background-color: transparent !important;
+ height: auto !important;
+ }
+
+ .html-widget-container .vb-outer div {
+ max-width: 100% !important;
+ }
+
+ .html-widget-container table {
+ max-width: 100% !important;
+ }
+}
\ No newline at end of file
diff --git a/packages/ui/src/lib/db.ts b/packages/ui/src/lib/db.ts
index e9ab957e..87a926b8 100644
--- a/packages/ui/src/lib/db.ts
+++ b/packages/ui/src/lib/db.ts
@@ -369,7 +369,7 @@ export interface FeedPost {
}
export const fetchFeedPosts = async (
- source: 'home' | 'collection' | 'tag' | 'user' = 'home',
+ source: 'home' | 'collection' | 'tag' | 'user' | 'widget' = 'home',
sourceId?: string,
isOrgContext?: boolean,
orgSlug?: string,
@@ -380,7 +380,7 @@ export const fetchFeedPosts = async (
};
export const fetchFeedPostsPaginated = async (
- source: 'home' | 'collection' | 'tag' | 'user' = 'home',
+ source: 'home' | 'collection' | 'tag' | 'user' | 'widget' = 'home',
sourceId?: string,
isOrgContext?: boolean,
orgSlug?: string,
diff --git a/packages/ui/src/lib/emailExporter.ts b/packages/ui/src/lib/emailExporter.ts
new file mode 100644
index 00000000..aa84c909
--- /dev/null
+++ b/packages/ui/src/lib/emailExporter.ts
@@ -0,0 +1,129 @@
+import { PageLayout, LayoutContainer, WidgetInstance } from './unifiedLayoutManager';
+import { widgetRegistry } from './widgetRegistry';
+import { template } from '@/lib/variables';
+import { marked } from 'marked';
+
+export const generateEmailHtml = async (layout: PageLayout, rootTemplateUrl: string): Promise`;
+ html += `
|
Restoring Playground...
+
+ {layoutJson}
+
+ + Separate tags with commas +
+- Separate tags with commas -
-{slugError}
- )} -- URL: /user/{userId}/pages/{slugValue || page.slug} -
-{page.slug}
-