From e0efb745d5988ea687c0dcddf5c2c592ce33f950 Mon Sep 17 00:00:00 2001 From: Anil Matcha Date: Thu, 12 Feb 2026 22:02:20 +0530 Subject: [PATCH] feat: Add image generation studio with Muapi API integration - Add ImageStudio component with prompt input, model/AR/resolution pickers - Integrate Muapi API client with x-api-key auth and result polling - Add generation history sidebar with thumbnails and download - Add AuthModal and SettingsModal for API key management - Configure Vite proxy for CORS-free API access in development - Add model definitions with endpoint mappings from schema data - Add Tailwind CSS styling with dark theme and glassmorphism design - Add Header component with settings and logout controls --- index.html | 2 +- models_dump.json | 2006 ++++++++++++++++++++++++++++ package-lock.json | 2189 +++++++++++++++++++++++++++---- package.json | 10 +- postcss.config.js | 5 + src/components/AuthModal.js | 60 + src/components/Header.js | 75 ++ src/components/ImageStudio.js | 578 ++++++++ src/components/SettingsModal.js | 92 ++ src/components/Sidebar.js | 83 ++ src/lib/models.js | 2023 ++++++++++++++++++++++++++++ src/lib/muapi.js | 172 +++ src/main.js | 64 +- src/style.css | 109 +- src/styles/global.css | 75 ++ src/styles/studio.css | 119 ++ src/styles/variables.css | 49 + tailwind.config.js | 36 + vite.config.js | 17 + 19 files changed, 7361 insertions(+), 403 deletions(-) create mode 100644 models_dump.json create mode 100644 postcss.config.js create mode 100644 src/components/AuthModal.js create mode 100644 src/components/Header.js create mode 100644 src/components/ImageStudio.js create mode 100644 src/components/SettingsModal.js create mode 100644 src/components/Sidebar.js create mode 100644 src/lib/models.js create mode 100644 src/lib/muapi.js create mode 100644 src/styles/global.css create mode 100644 src/styles/studio.css create mode 100644 src/styles/variables.css create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/index.html b/index.html index d733f14..509fa42 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - open-higgsfield-ai + Open-Higgsfield AI
diff --git a/models_dump.json b/models_dump.json new file mode 100644 index 0000000..b69a0bb --- /dev/null +++ b/models_dump.json @@ -0,0 +1,2006 @@ +{ + "t2i": [ + { + "id": "nano-banana", + "name": "Nano Banana", + "inputs": { + "prompt": { + "examples": [ + "A portrait of me in a modern living room. Change it so I’m dressed in 1950s attire with a polka-dot dress, while maintaining my face and hairstyle." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9", + "3:2", + "2:3", + "5:4", + "4:5", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "flux-dev", + "name": "Flux Dev", + "inputs": { + "prompt": { + "examples": [ + "Extreme close-up of a single tiger eye, direct frontal view. Detailed iris and pupil. Sharp focus on eye texture and color. Natural lighting to capture authentic eye shine and depth. The word \"FLUX\" is painted over it in big, white brush strokes with visible texture." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-dev-lora", + "name": "Flux Dev Lora", + "inputs": { + "prompt": { + "examples": [ + "A female warrior in ornate armor standing on a cliff during sunset, flowing cape, wind blowing through her hair, detailed fantasy art style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "model_id": { + "examples": [ + { + "model": "civitai:119351@317153", + "weight": 1 + } + ], + "title": "LoRA Ids", + "name": "model_id", + "type": "array", + "items": { + "type": "object", + "properties": { + "model": { + "type": "string", + "format": "url", + "title": "Model ID", + "description": "The Civitai LoRA model ID." + }, + "weight": { + "type": "number", + "title": "Weight", + "description": "A list of LoRA models to use for generation. Each item must include an `id` (e.g., \"civitai:1642876@1864626\") and a `weight` between 0 and 4. You can include up to 4 models. The `id` can be found in the Civitai model URL. These models will be applied with the specified weights by the Flux Dev system during image generation.", + "minValue": 0, + "maxValue": 4, + "step": 0.01, + "default": 1 + } + } + }, + "description": "The unique identifier of a LoRA model hosted on Civitai, used by the Flux Dev image generation system. This ID tells Flux Dev which specific LoRA model to apply during generation. You can find the model ID in the Civitai model URL (e.g., model_id: civitai:1642876@1864626).", + "maxItems": 4 + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64, + "isEdit": true + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64, + "isEdit": true + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "flux-kontext-dev-t2i", + "name": "Flux Kontext Dev T2I", + "inputs": { + "prompt": { + "examples": [ + "A powerful wizard casting a glowing spell in a dark forest, wearing a hooded robe, with swirling magical energy, epic fantasy art." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "hidream-i1-fast", + "name": "Hidream I1 Fast", + "inputs": { + "prompt": { + "examples": [ + "A colorful cartoon-style cat sitting on a skateboard, wide smile, playful background, 2D flat illustration style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hidream-i1-dev", + "name": "Hidream I1 Dev", + "inputs": { + "prompt": { + "examples": [ + "A colorful cartoon-style cat sitting on a skateboard, wide smile, playful background, 2D flat illustration style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hidream-i1-full", + "name": "Hidream I1 Full", + "inputs": { + "prompt": { + "examples": [ + "A majestic elven queen standing in a glowing forest, wearing intricate golden armor with emerald details, sunlight rays filtering through the trees, ultra-detailed fantasy concept art." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "ai-anime-generator", + "name": "Ai Anime Generator", + "inputs": { + "prompt": { + "examples": [ + "A cheerful anime girl with short pink hair and green eyes, wearing a school uniform, standing under cherry blossom trees, soft lighting, anime style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1, + "isEdit": true + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "wan2.1-text-to-image", + "name": "Wan2.1 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A young woman with freckles and natural makeup, standing in soft sunlight, sharp focus, DSLR photo style, ultra-realistic skin texture." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-kontext-pro-t2i", + "name": "Flux Kontext Pro T2I", + "inputs": { + "prompt": { + "examples": [ + "A steampunk owl with mechanical wings, perched on a glowing gear, cinematic lighting." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "16:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "flux-kontext-max-t2i", + "name": "Flux Kontext Max T2I", + "inputs": { + "prompt": { + "examples": [ + "A realistic portrait of a woman with curly hair, wearing a silk blouse, studio lighting, high detail." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "16:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "gpt4o-text-to-image", + "name": "Gpt4o Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A diagram of the solar system with labeled planets, cartoon style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "enum": [ + 1, + 2, + 4 + ], + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1 + } + } + }, + { + "id": "midjourney-v7-text-to-image", + "name": "Midjourney v7 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A sprawling futuristic city at dusk, illuminated with vibrant neon signs, layered skyscrapers, elevated highways with flying cars, warm atmospheric glow, ultra-detailed sci-fi architecture, cinematic composition — digital art, high contrast, 8K" + ], + "description": "The prompt to generate the image", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "speed": { + "enum": [ + "relaxed", + "fast", + "turbo" + ], + "title": "Speed", + "name": "speed", + "type": "string", + "description": "The speed of which corresponds to different speed of Midjourney", + "default": "relaxed" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "1:2", + "2:1", + "2:3", + "3:2", + "5:6", + "6:5" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "variety": { + "title": "Variety", + "name": "variety", + "type": "int", + "description": "Controls the diversity of generated images. Increment by 5 each time. Higher values create more diverse results. Lower values create more consistent results.", + "default": 5, + "minValue": 0, + "maxValue": 100, + "step": 5 + }, + "stylization": { + "title": "Stylization", + "name": "stylization", + "type": "int", + "description": "Controls the artistic style intensity. Higher values create more stylized results. Lower values create more realistic results.", + "default": 1, + "minValue": 0, + "maxValue": 1000, + "step": 1 + }, + "weirdness": { + "title": "Weirdness", + "name": "weirdness", + "type": "int", + "description": "Controls the creativity and uniqueness. Higher values create more unusual results. Lower values create more conventional results.", + "default": 1, + "minValue": 0, + "maxValue": 3000, + "step": 1 + } + } + }, + { + "id": "flux-schnell", + "name": "Flux Schnell", + "inputs": { + "prompt": { + "examples": [ + "A cozy mountain cabin surrounded by pine trees during snowfall, warm light glowing from windows, twilight scene" + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "bytedance-seedream-v3", + "name": "Bytedance Seedream v3", + "inputs": { + "prompt": { + "examples": [ + "A magical forest with glowing mushrooms and a crystal river under a starry sky, dreamy and ethereal style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "qwen-image", + "name": "Qwen Image", + "inputs": { + "prompt": { + "examples": [ + "A serene Japanese garden in autumn, with red maple leaves falling gently, a small stone bridge over a koi pond, photorealistic detail, soft morning light" + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "9:21", + "3:2", + "2:3" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "16:9" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-pulid", + "name": "Flux Pulid", + "inputs": { + "prompt": { + "examples": [ + "Recreate the same person in a Renaissance-style painting with ornate collar and soft candlelight ambiance." + ], + "description": "Text prompt describing the image (max 1500 characters).", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + "https://d3adwkbyhxyrtq.cloudfront.net/ai-images/186/818590409074/b5aa9200-ed01-43b2-8ed7-091255f3d164.jpg" + ], + "description": "URL of the input image used to generate image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "ideogram-v3-t2i", + "name": "Ideogram v3 T2I", + "inputs": { + "prompt": { + "examples": [ + "A retro 80s style poster with the words 'MUAPI APP' glowing in pink and blue neon lights, cyberpunk city skyline in the background, cinematic design, highly detailed." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "render_speed": { + "enum": [ + "Turbo", + "Balanced", + "Quality" + ], + "title": "Render Speed", + "name": "render_speed", + "type": "string", + "description": "The rendering speed to use.", + "default": "Balanced" + }, + "style": { + "enum": [ + "Auto", + "General", + "Realistic", + "Design" + ], + "title": "Style", + "name": "style", + "type": "string", + "description": "The style type to generate with.", + "default": "Auto" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4", + "name": "Google Imagen4", + "inputs": { + "prompt": { + "examples": [ + "A grand waterfall cascading down glowing crystal cliffs under a twilight sky, bioluminescent plants illuminating the scene, a lone explorer standing on a cliff edge with a futuristic lantern, cinematic ultra-realism." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4-fast", + "name": "Google Imagen4 Fast", + "inputs": { + "prompt": { + "examples": [ + "A playful panda astronaut bouncing on the moon, leaving heart-shaped footprints, with a pastel-colored galaxy in the background." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4-ultra", + "name": "Google Imagen4 Ultra", + "inputs": { + "prompt": { + "examples": [ + "A close-up portrait of an old lighthouse keeper, wrinkled hands holding a brass lantern, stormy sea waves crashing behind, ultra-detailed realism." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "sdxl-image", + "name": "Sdxl Image", + "inputs": { + "prompt": { + "examples": [ + "An elven archer standing in a bioluminescent forest at night, glowing foliage, intricate leather armor, dynamic pose, painterly high-detail concept art." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "bytedance-seedream-v4", + "name": "Bytedance Seedream v4", + "inputs": { + "prompt": { + "examples": [ + "A tranquil shoreline at dawn where waves turn into glowing ribbons of light, painting the sky with dreamlike hues of violet and gold. A figure walks along the edge, leaving footsteps that bloom into luminous flowers, symbolizing imagination flowing seamlessly into reality." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1K", + "2K", + "4K" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "Resolution of the output image.", + "default": "4K" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hunyuan-image-2.1", + "name": "Hunyuan Image 2.1", + "inputs": { + "prompt": { + "examples": [ + "A vast ink-wash landscape where misty mountains rise into drifting clouds, rivers flowing like silver threads across valleys. In the distance, a solitary pavilion glows with warm lantern light, blending classical Chinese painting aesthetics with modern cinematic realism." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "chroma-image", + "name": "Chroma Image", + "inputs": { + "prompt": { + "examples": [ + "A futuristic studio bathed in radiant beams of shifting neon colors — cyan, magenta, amber, and emerald — that blend into surreal gradients across walls and objects. A crystal-like prism floats at the center, splitting light into vibrant chromatic waves that ripple outward, painting the scene in glowing, ever-changing hues." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-redux", + "name": "Flux Redux", + "inputs": { + "prompt": { + "examples": [ + "Reimagine the forest cabin as a mystical fantasy retreat at twilight, glowing lanterns hanging from the trees, magical fireflies in the air, cinematic atmosphere with enchanted vibes." + ], + "description": "Text prompt describing the image (max 1500 characters).", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + "https://d3adwkbyhxyrtq.cloudfront.net/webassets/videomodels/flux-redux-input.jpg" + ], + "description": "URL of the input image used to generate image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-krea-dev", + "name": "Flux Krea Dev", + "inputs": { + "prompt": { + "examples": [ + "Close-up shot of a midnight blue sports car on wet asphalt, city lights reflected in its paint, shallow depth of field, cinematic realism." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "perfect-pony-xl", + "name": "Perfect Pony Xl", + "inputs": { + "prompt": { + "examples": [ + "A warm, photorealistic portrait of a dappled pony standing in a sunlit stable, dust motes floating in golden light, textured mane, high detail on fur and eyes." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "neta-lumina", + "name": "Neta Lumina", + "inputs": { + "prompt": { + "examples": [ + "A poised young woman with long silver hair and heterochromatic eyes (one blue, one green), wearing a flowing cheongsam with cranes embroidered, standing in a dimly lit grand staircase. Soft ethereal lighting, painterly anime style, rich textures, delicate lace and pearl accessories." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "wan2.5-text-to-image", + "name": "Wan2.5 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A majestic waterfall cascading from towering cliffs into a misty valley, with glowing bioluminescent plants along the riverbanks, a lone explorer standing on a rock, cinematic lighting and ultra-detailed scenery." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1322, + "minValue": 768, + "maxValue": 1440, + "step": 1 + } + } + }, + { + "id": "hunyuan-image-3.0", + "name": "Hunyuan Image 3.0", + "inputs": { + "prompt": { + "examples": [ + "A traditional Chinese courtyard with red lanterns hanging from wooden beams, moonlight reflecting from jade floor tiles. In the courtyard, a modern artist sits painting on an easel, neon blue sneakers, graffiti-style mural beginning behind them. Blend of classical aesthetics and modern street art." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "leonardoai-phoenix-1.0", + "name": "Leonardoai Phoenix 1.0", + "inputs": { + "prompt": { + "examples": [ + "A magical forest at twilight, giant bioluminescent mushrooms illuminating a misty path, a crystal-clear river winding through twisted trees, fireflies dancing, soft ambient glow, ancient stone ruins partially visible, cinematic fantasy lighting, high-detail textures on foliage and moss, ethereal atmosphere, volumetric lighting rays piercing through branches." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "4:5", + "5:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "leonardoai-lucid-origin", + "name": "Leonardoai Lucid Origin", + "inputs": { + "prompt": { + "examples": [ + "A towering medieval castle perched on a cliff, waterfalls cascading around it, sunrise casting golden light on the stone walls, mist rising from the valley below, flying dragons circling above, realistic clouds and sky reflections, cinematic wide-angle view, ultra-detailed textures on stone and water, epic fantasy atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "4:5", + "5:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "reve-text-to-image", + "name": "Reve Text To Image", + "inputs": { + "prompt": { + "examples": [ + "An astronaut stands in a strange, bioluminescent purple jungle on an alien planet. She slowly reaches out her hand as a graceful creature made of translucent energy curiously approaches, gently touching her glove's fingertip with its tendril. The reflection of the planet's two moons is visible on her helmet's visor. Sense of wonder, photorealistic, cinematic." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "21:9", + "16:9", + "4:3", + "1:1", + "3:4", + "9:16", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "grok-imagine-text-to-image", + "name": "Grok Imagine Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A futuristic samurai standing under glowing neon lights in a rainy cyberpunk alley, reflections on wet pavement, dramatic rim lighting, highly detailed armor, cinematic atmosphere, ultra-realistic style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "9:16", + "16:9", + "2:3", + "3:2", + "1:1" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image. Get 6 images each time.", + "default": "1:1" + } + } + }, + { + "id": "nano-banana-pro", + "name": "Nano Banana Pro", + "inputs": { + "prompt": { + "examples": [ + "A radiant golden banana floating in a futuristic glass chamber, surrounded by swirling particles of light and data streams forming geometric shapes. Electric blue reflections ripple across the surface as energy pulses outward, turning fragments of light into vivid artworks suspended mid-air. Symbolizing playful innovation, AI precision, and evolution of creative power." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9", + "3:2", + "2:3", + "5:4", + "4:5", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k", + "4k" + ], + "description": "The target resolution of the generated image.", + "type": "string", + "title": "Resolution", + "name": "resolution", + "default": "1k" + } + } + }, + { + "id": "kling-o1-text-to-image", + "name": "Kling O1 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A towering arcology city at dusk built into a canyon, terraces lit with warm lanterns and bioluminescent gardens cascading down the rock face. Floating trams glide between terraces, mist curls from hidden waterfalls, and a faint green aurora shivers above the canyon rim. Deep orange sunset meets teal dusk, dramatic rim lighting, ultra-detailed architecture, cinematic wide-angle composition, 8k, hyperreal textures." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 9, + "step": 1 + } + } + }, + { + "id": "z-image-turbo", + "name": "Z Image Turbo", + "inputs": { + "prompt": { + "examples": [ + "A colossal glass hourglass floating in a dark void, filled not with sand but with glowing galaxies swirling inside. Each galaxy emits colorful nebula clouds that leak through cracks in the glass, forming cosmic streams drifting into the darkness. Bright rim lighting around the hourglass, reflective glass surfaces, deep space background, ultra-detailed sci-fi render, 8k quality, volumetric glow, high contrast." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-dev", + "name": "Flux 2 Dev", + "inputs": { + "prompt": { + "examples": [ + "A giant mechanical butterfly made of chrome wings and glowing blue energy veins, hovering above a mirror-smooth lake during twilight. Each wing reflects the sky while emitting soft neon trails. The lake surface ripples lightly from the energy pulses. Mist rolls across the water, and distant mountains fade into a deep violet horizon. Ultra-realistic lighting, cinematic composition, 8k render, high contrast, reflective metal textures." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-flex", + "name": "Flux 2 Flex", + "inputs": { + "prompt": { + "examples": [ + "A monumental crystalline arch towering above an endless desert of shifting silver sand, glowing with internal prisms that refract rainbow beams across the dunes. Beneath the arch floats a slowly rotating orb of condensed starlight, casting long ethereal shadows. In the distance, colossal sand whales breach from metallic dunes, their bodies shimmering with mirrored scales. Overhead, a fractured moon illuminates the scene with cold blue radiance. Ultra-detailed fantasy–sci-fi fusion, cinematic wide-angle view, volumetric light rays, 8k clarity, high contrast, dreamlike atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "flux-2-pro", + "name": "Flux 2 Pro", + "inputs": { + "prompt": { + "examples": [ + "A colossal throne forged from intertwining meteor-iron branches, floating above a storm-torn ocean. Each branch pulses with glowing red runes, casting fiery reflections across the churning waves below. Above the throne hovers a massive eclipsed sun, its corona exploding into swirling arcs of molten light. Lightning erupts from the clouds and climbs the metal branches like living serpents. A lone hooded figure stands at the edge of the water, cloak whipping in the wind, illuminated only by the molten eclipse. Ultra-cinematic composition, hyper-detailed textures, 8k resolution, dramatic contrast, dark epic fantasy atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "vidu-q2-text-to-image", + "name": "Vidu Q2 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A colossal floating serpent made of shimmering stardust coils around a broken moon suspended in deep space. Each scale glows with shifting nebula colors, sending ripples of light across the void. Meteor fragments drift slowly around the creature, leaving trails of violet plasma. Beneath the serpent, a crystalline ring structure orbits the shattered moon, reflecting cosmic beams in intricate patterns. The background is a star field swirling into a spiral galaxy, with vibrant energy storms crackling along the horizon. Ultra-cinematic cosmic fantasy, high contrast, 8k detail, volumetric glow, deep space atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k", + "4k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "bytedance-seedream-v4.5", + "name": "Bytedance Seedream V4.5", + "inputs": { + "prompt": { + "examples": [ + "A massive floating temple forged from translucent sapphire glass hovers above a storm-lit ocean. Crystalline towers refract lightning into rainbow shards that scatter across the waves below. Gigantic chains made of glowing runes suspend the temple in the air as swirling storm clouds coil around it. Beneath the structure, a vortex of shimmering water spirals upward, feeding energy into the floating palace. Distant thunder illuminates the scene with cold blue flashes, casting dramatic shadows across the ocean surface. Ultra-cinematic fantasy–sci-fi fusion, hyper-detailed textures, volumetric lighting, 8k clarity." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "quality": { + "enum": [ + "basic", + "high" + ], + "title": "Quality", + "name": "quality", + "type": "string", + "description": "Quality of the output image.", + "default": "basic" + } + } + }, + { + "id": "gpt-image-1.5", + "name": "Gpt Image 1.5", + "inputs": { + "prompt": { + "examples": [ + "A colossal hourglass floating in a silent cosmic void, its upper chamber filled with swirling golden sand that transforms into glowing constellations as it falls. The lower chamber contains a miniature ocean suspended in zero gravity, with waves frozen mid-motion and bioluminescent creatures glowing beneath the surface. Cracks in the glass emit thin beams of white light that bend and refract through drifting stardust. In the background, fragmented planets orbit slowly, partially illuminated by a distant supernova. Ultra-cinematic surreal concept, dramatic contrast between warm gold and deep blue, hyper-detailed textures, volumetric light rays, 8k clarity, dreamlike atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "quality": { + "enum": [ + "low", + "medium", + "high" + ], + "title": "Quality", + "name": "quality", + "type": "string", + "description": "The quality of the generated image.", + "default": "medium" + } + } + }, + { + "id": "wan2.6-text-to-image", + "name": "Wan2.6 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A colossal floating bridge forged from glowing white stone spans a vast abyss filled with swirling clouds of light. Along the bridge, towering statues carved from ancient marble stand in silent formation, their eyes emitting faint golden beams that illuminate engraved runes beneath their feet. Below the bridge, fragments of ruined cities drift slowly through the mist, catching reflections from the glowing stone above. Overhead, a twilight sky fades from deep blue to soft amber, with distant stars beginning to appear. Cinematic fantasy environment, high contrast lighting, volumetric fog, ultra-detailed textures, epic scale." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + } + } + }, + { + "id": "qwen-text-to-image-2512", + "name": "Qwen Text To Image 2512", + "inputs": { + "prompt": { + "examples": [ + "A colossal biomechanical whale swimming slowly through a vast sky made of soft clouds and fractured light. Its translucent body reveals glowing internal organs shaped like rotating gears and flowing energy veins. Below it, a sprawling patchwork of farmland and rivers curves with the planet’s surface, catching reflections from the whale’s luminous glow. Long fabric banners trail from the whale’s fins, fluttering gently in the wind like ceremonial streamers. The camera angle is wide and aerial, emphasizing scale and serenity. Soft sunrise colors, cinematic depth, ultra-detailed surreal sci-fi atmosphere." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "type": "integer", + "title": "Width", + "name": "width", + "description": "Width of the image in pixels", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "type": "integer", + "title": "Height", + "name": "height", + "description": "Height of the image in pixels", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-klein-4b", + "name": "Flux 2 Klein 4b", + "inputs": { + "prompt": { + "examples": [ + "A small round robot sitting at a café table outdoors, holding a tiny cup of coffee with both hands. The robot has a simple white body, a glowing digital face showing a happy expression, and short stubby legs dangling from the chair. Morning sunlight casts soft shadows on the pavement, potted plants surround the café, and steam gently rises from the coffee cup. Clean, minimal, cute, modern illustration style, bright colors, friendly mood." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + } + } + }, + { + "id": "flux-2-klein-9b", + "name": "Flux 2 Klein 9b", + "inputs": { + "prompt": { + "examples": [ + "A cute corgi puppy wearing a tiny yellow raincoat stands on a wet sidewalk after rain. Small puddles reflect the city lights, and the puppy looks up with bright curious eyes while holding a green leaf in its mouth. Soft evening light, shallow depth of field, clean background, warm and cheerful mood, high detail fur texture, realistic yet adorable style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + } + } + }, + { + "id": "z-image-base", + "name": "Z Image Base", + "inputs": { + "prompt": { + "examples": [ + "A cozy late-night diner interior with warm yellow lighting, rain tapping against large glass windows, and a lone barista cleaning the counter. A slice of pie sits under a glass dome, steam rises from a fresh cup of coffee, and neon signs outside softly glow and reflect across the wet street. Cinematic realism, shallow depth of field, calm mood, high detail, modern photography style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + null + ], + "description": "URL of the input image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + }, + "strength": { + "title": "Strength", + "name": "strength", + "type": "int", + "description": "Controls the strength of the transformation. Higher values produce outputs more different from the input image.", + "default": 0.6, + "minValue": 0, + "maxValue": 1, + "step": 0.01 + } + } + } + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6185c2c..d07ad8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,422 +7,451 @@ "": { "name": "open-higgsfield-ai", "version": "0.0.0", + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/vite": "^4.1.18", + "puppeteer": "^24.37.2" + }, "devDependencies": { - "vite": "^7.3.1" + "autoprefixer": "^10.4.24", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "vite": "^5.4.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.12.0.tgz", + "integrity": "sha512-Xuq42yxcQJ54ti8ZHNzF5snFvtpgXzNToJ1bXUGQRaiO8t+B6UM8sTUJfvV+AJnqtkJU/7hdy6nbKyA12aHtRw==", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, "engines": { "node": ">=18" } @@ -434,7 +463,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -447,7 +475,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -460,7 +487,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -473,7 +499,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -486,7 +511,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -499,7 +523,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -512,7 +535,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -525,7 +547,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -538,7 +559,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -551,7 +571,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -564,7 +583,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -577,7 +595,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -590,7 +607,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -603,7 +619,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -616,7 +631,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -629,7 +643,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -642,7 +655,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -655,7 +667,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -668,7 +679,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -681,7 +691,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -694,7 +703,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "openharmony" @@ -707,7 +715,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -720,7 +727,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -733,7 +739,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -746,81 +751,872 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, + "node_modules/@types/node": { + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "optional": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", + "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/basic-ftp": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chromium-bidi": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.1.1.tgz", + "integrity": "sha512-zB9MpoPd7VJwjowQqiW3FKOvQwffFMjQ8Iejp5ZW+sJaKLRhZX1sTxzl3Zt22TDB4zP0OOqs8lRoY7eAW5geyQ==", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1566079", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", + "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "dev": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "engines": { - "node": ">=12.0.0" + "node": "*" }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -830,11 +1626,407 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -848,29 +2040,100 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -894,11 +2157,109 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "24.37.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.2.tgz", + "integrity": "sha512-FV1W/919ve0y0oiS/3Rp5XY4MUNUokpZOH/5M4MMDfrrvh6T9VbdKvAHrAFHBuCxvluDxhjra20W7Iz6HJUcIQ==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.1", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1566079", + "puppeteer-core": "24.37.2", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.37.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.2.tgz", + "integrity": "sha512-nN8qwE3TGF2vA/+xemPxbesntTuqD9vCGOiZL2uh8HES3pPzLX20MyQjB42dH2rhQ3W3TljZ4ZaKZ0yX/abQuw==", + "dependencies": { + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.1", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1566079", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.4.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/rollup": { "version": "4.57.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", - "dev": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -938,49 +2299,211 @@ "fsevents": "~2.3.2" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "engines": { + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "optional": true + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -989,25 +2512,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -1028,14 +2545,104 @@ }, "terser": { "optional": true - }, - "tsx": { + } + } + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.0.tgz", + "integrity": "sha512-U9VIlNRrq94d1xxR9JrCEAx5Gv/2W7ERSv8oWRoNe/QYbfccS0V3h/H6qeNeCRJxXGMhhnkqvwNrvPAYeuP9VA==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { "optional": true }, - "yaml": { + "utf-8-validate": { "optional": true } } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index e8e7f73..6cee35f 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,14 @@ "preview": "vite preview" }, "devDependencies": { - "vite": "^7.3.1" + "autoprefixer": "^10.4.24", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "vite": "^5.4.0" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "@tailwindcss/vite": "^4.1.18", + "puppeteer": "^24.37.2" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..4d19be2 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +} diff --git a/src/components/AuthModal.js b/src/components/AuthModal.js new file mode 100644 index 0000000..3fbaf4f --- /dev/null +++ b/src/components/AuthModal.js @@ -0,0 +1,60 @@ +export function AuthModal(onSuccess) { + const overlay = document.createElement('div'); + overlay.className = 'fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-sm px-6'; + + const modal = document.createElement('div'); + modal.className = 'w-full max-w-md bg-panel-bg border border-white/10 rounded-3xl p-8 shadow-3xl animate-fade-in-up'; + + modal.innerHTML = ` +
+
+ + + +
+

Muapi API Key Required

+

Please provide your Muapi.ai API key to start creating high-aesthetic images.

+
+ +
+
+ + +
+ +
+ + + Get an API Key at Muapi.ai → + +
+
+ `; + + overlay.appendChild(modal); + document.body.appendChild(overlay); + + const input = modal.querySelector('#muapi-key-input'); + const btn = modal.querySelector('#save-key-btn'); + + btn.onclick = () => { + const key = input.value.trim(); + if (key) { + localStorage.setItem('muapi_key', key); + document.body.removeChild(overlay); + if (onSuccess) onSuccess(); + } else { + input.classList.add('border-red-500/50'); + setTimeout(() => input.classList.remove('border-red-500/50'), 2000); + } + }; + + return overlay; +} diff --git a/src/components/Header.js b/src/components/Header.js new file mode 100644 index 0000000..d8b05e7 --- /dev/null +++ b/src/components/Header.js @@ -0,0 +1,75 @@ +export function Header() { + const header = document.createElement('header'); + header.className = 'w-full flex flex-col z-50 sticky top-0'; + + + // 2. Main Navigation Bar + const navBar = document.createElement('div'); + navBar.className = 'w-full h-16 bg-black flex items-center justify-between px-4 md:px-6 border-b border-white/5 backdrop-blur-md bg-opacity-95'; + + const leftPart = document.createElement('div'); + leftPart.className = 'flex items-center gap-8'; + + // Logo + const logoContainer = document.createElement('div'); + logoContainer.className = 'cursor-pointer hover:scale-110 transition-transform'; + logoContainer.innerHTML = ` +
+ + + + + +
+ `; + + const menu = document.createElement('nav'); + menu.className = 'hidden lg:flex items-center gap-6 text-[13px] font-bold text-secondary'; + const items = ['Explore', 'Image', 'Video', 'Edit', 'Character', 'Contests', 'Vibe Motion', 'Cinema Studio', 'AI Influencer', 'Apps', 'Assist', 'Community']; + + items.forEach(item => { + const link = document.createElement('a'); + link.textContent = item; + link.className = `hover:text-white transition-all cursor-pointer relative group ${item === 'Image' ? 'text-white' : ''}`; + + // Active Indicator or Dot + if (item === 'Image') { + const dot = document.createElement('div'); + dot.className = 'absolute -bottom-1 left-1/2 -translate-x-1/2 w-1 h-1 bg-primary rounded-full'; + link.appendChild(dot); + } + + if (item === 'Contests') { + link.innerHTML += ' New'; + } + menu.appendChild(link); + }); + + leftPart.appendChild(logoContainer); + leftPart.appendChild(menu); + + const rightPart = document.createElement('div'); + rightPart.className = 'flex items-center gap-4'; + + const keyBtn = document.createElement('button'); + keyBtn.className = 'p-2 text-secondary hover:text-white transition-colors'; + keyBtn.title = 'Update API Key'; + keyBtn.innerHTML = ` + + + + `; + keyBtn.onclick = () => { + localStorage.removeItem('muapi_key'); + window.location.reload(); + }; + + rightPart.appendChild(keyBtn); + + navBar.appendChild(leftPart); + navBar.appendChild(rightPart); + + header.appendChild(navBar); + + return header; +} diff --git a/src/components/ImageStudio.js b/src/components/ImageStudio.js new file mode 100644 index 0000000..351a589 --- /dev/null +++ b/src/components/ImageStudio.js @@ -0,0 +1,578 @@ +import { muapi } from '../lib/muapi.js'; +import { t2iModels, getAspectRatiosForModel } from '../lib/models.js'; +import { AuthModal } from './AuthModal.js'; + +export function ImageStudio() { + const container = document.createElement('div'); + container.className = 'w-full h-full flex flex-col items-center justify-center bg-app-bg relative p-4 md:p-6 overflow-hidden'; + + // --- State --- + const defaultModel = t2iModels[0]; + let selectedModel = defaultModel.id; + let selectedModelName = defaultModel.name; + let selectedAr = '1:1'; + let dropdownOpen = null; + + // Helper: Get valid resolutions/quality options for a model + const getResolutionsForModel = (modelId) => { + const model = t2iModels.find(m => m.id === modelId); + if (!model) return ['1K']; // Default + + // Check for specific resolution enum + if (model.inputs?.resolution?.enum) { + return model.inputs.resolution.enum.map(r => r.toUpperCase()); + } + + // Check for megapixels enum + if (model.inputs?.megapixels?.enum) { + return model.inputs.megapixels.enum; + } + + // Fallback logic based on common models + if (modelId.includes('flux')) return ['1K']; // Flux usually fixed + if (modelId.includes('midjourney')) return ['1K']; + + // Default set for others if not specified + return ['1K', '2K', '4K']; + }; + + // ========================================== + // 1. HERO SECTION + // ========================================== + const hero = document.createElement('div'); + hero.className = 'flex flex-col items-center mb-10 md:mb-20 animate-fade-in-up transition-all duration-700'; + hero.innerHTML = ` +
+
+
+ + + +
+ + + + + +
+ +
+
+
+

Nano Banana Pro

+

Create stunning, high-aesthetic images in seconds

+ `; + container.appendChild(hero); + + // ========================================== + // 2. PROMPT BAR (Tailwind Refactor) + // ========================================== + const promptWrapper = document.createElement('div'); + promptWrapper.className = 'w-full max-w-4xl relative z-40 animate-fade-in-up'; + promptWrapper.style.animationDelay = '0.2s'; + + const bar = document.createElement('div'); + bar.className = 'w-full bg-[#111]/90 backdrop-blur-xl border border-white/10 rounded-[1.5rem] md:rounded-[2.5rem] p-3 md:p-5 flex flex-col gap-3 md:gap-5 shadow-3xl'; + + // Top Row: Input + const topRow = document.createElement('div'); + topRow.className = 'flex items-start gap-5 px-2'; + + topRow.innerHTML = ` + + `; + + const textarea = document.createElement('textarea'); + textarea.placeholder = 'Describe the scene you imagine'; + textarea.className = 'flex-1 bg-transparent border-none text-white text-base md:text-xl placeholder:text-muted focus:outline-none resize-none pt-2.5 leading-relaxed min-h-[40px]'; + textarea.rows = 1; + textarea.oninput = () => { + textarea.style.height = 'auto'; + textarea.style.height = textarea.scrollHeight + 'px'; + }; + + topRow.appendChild(textarea); + bar.appendChild(topRow); + + // Bottom Row: Controls + const bottomRow = document.createElement('div'); + bottomRow.className = 'flex flex-col sm:flex-row items-stretch sm:items-center justify-between gap-4 px-2 pt-4 border-t border-white/5'; + + const controlsLeft = document.createElement('div'); + controlsLeft.className = 'flex items-center gap-1.5 md:gap-2.5 relative overflow-x-auto no-scrollbar pb-1 md:pb-0'; + + const createControlBtn = (icon, label, id) => { + const btn = document.createElement('button'); + btn.id = id; + btn.className = 'flex items-center gap-1.5 md:gap-2.5 px-3 md:px-4 py-2 md:py-2.5 bg-white/5 hover:bg-white/10 rounded-xl md:rounded-2xl transition-all border border-white/5 group whitespace-nowrap'; + btn.innerHTML = ` + ${icon} + ${label} + + `; + return btn; + }; + + const modelBtn = createControlBtn(` +
+ G +
+ `, selectedModelName, 'model-btn'); + + const arBtn = createControlBtn(` + + `, selectedAr, 'ar-btn'); + + const qualityBtn = createControlBtn(` + + `, '1K', 'quality-btn'); + + controlsLeft.appendChild(modelBtn); + controlsLeft.appendChild(arBtn); + controlsLeft.appendChild(qualityBtn); + + // Initial Resolution Visibility (only show for models with explicit resolution/megapixels enums) + const initialModel = t2iModels[0]; + const hasInitialRes = initialModel?.inputs?.resolution?.enum || initialModel?.inputs?.megapixels?.enum; + qualityBtn.style.display = hasInitialRes ? 'flex' : 'none'; + + const generateBtn = document.createElement('button'); + generateBtn.className = 'bg-primary text-black px-6 md:px-8 py-3 md:py-3.5 rounded-xl md:rounded-[1.5rem] font-black text-sm md:text-base hover:shadow-glow hover:scale-105 active:scale-95 transition-all flex items-center justify-center gap-2.5 w-full sm:w-auto shadow-lg'; + generateBtn.innerHTML = `Generate ✨`; + + bottomRow.appendChild(controlsLeft); + bottomRow.appendChild(generateBtn); + bar.appendChild(bottomRow); + promptWrapper.appendChild(bar); + container.appendChild(promptWrapper); + + // ========================================== + // 3. DROPDOWNS (Professional implementation) + // ========================================== + const dropdown = document.createElement('div'); + dropdown.className = 'absolute bottom-[102%] left-2 z-50 transition-all opacity-0 pointer-events-none scale-95 origin-bottom-left glass rounded-3xl p-3 translate-y-2 w-[calc(100vw-3rem)] max-w-xs shadow-4xl border border-white/10 flex flex-col'; + + const showDropdown = (type, anchorBtn) => { + dropdown.innerHTML = ''; + dropdown.classList.remove('opacity-0', 'pointer-events-none'); + dropdown.classList.add('opacity-100', 'pointer-events-auto'); + + if (type === 'model') { + dropdown.classList.add('w-[calc(100vw-3rem)]', 'max-w-xs'); + dropdown.classList.remove('max-w-[240px]', 'max-w-[200px]'); + dropdown.innerHTML = ` +
+
+
+ + +
+
+
Available models
+
+
+ `; + const list = dropdown.querySelector('#model-list-container'); + + const renderModels = (filter = '') => { + list.innerHTML = ''; + const filtered = t2iModels.filter(m => m.name.toLowerCase().includes(filter.toLowerCase()) || m.id.toLowerCase().includes(filter.toLowerCase())); + + filtered.forEach(m => { + const item = document.createElement('div'); + item.className = `flex items-center justify-between p-3.5 hover:bg-white/5 rounded-2xl cursor-pointer transition-all border border-transparent hover:border-white/5 ${selectedModel === m.id ? 'bg-white/5 border-white/5' : ''}`; + item.innerHTML = ` +
+
${m.name.charAt(0)}
+
+ ${m.name} +
+
+ ${selectedModel === m.id ? '' : ''} + `; + item.onclick = (e) => { + e.stopPropagation(); + selectedModel = m.id; + selectedModelName = m.name; + // Reset AR to first valid for model + const availableArs = getAspectRatiosForModel(selectedModel); + selectedAr = availableArs[0]; + document.getElementById('model-btn-label').textContent = selectedModelName; + document.getElementById('ar-btn-label').textContent = selectedAr; + + // Show/Hide quality button based on model support (only resolution/megapixels enums) + const model = t2iModels.find(mod => mod.id === selectedModel); + const hasQuality = model?.inputs?.resolution?.enum || model?.inputs?.megapixels?.enum; + qualityBtn.style.display = hasQuality ? 'flex' : 'none'; + + // Reset resolution label if current is not valid for new model + if (hasQuality) { + const validResolutions = getResolutionsForModel(selectedModel); + const currentRes = document.getElementById('quality-btn-label').textContent; + if (!validResolutions.includes(currentRes)) { + document.getElementById('quality-btn-label').textContent = validResolutions[0]; + } + } + + closeDropdown(); + }; + list.appendChild(item); + }); + }; + + renderModels(); + + const searchInput = dropdown.querySelector('#model-search'); + searchInput.onclick = (e) => e.stopPropagation(); + searchInput.oninput = (e) => renderModels(e.target.value); + + } else if (type === 'ar') { + dropdown.classList.add('max-w-[240px]'); + dropdown.innerHTML = `
Aspect Ratio
`; + const list = document.createElement('div'); + list.className = 'flex flex-col gap-1'; + + const availableArs = getAspectRatiosForModel(selectedModel); + availableArs.forEach(r => { + const item = document.createElement('div'); + item.className = 'flex items-center justify-between p-3.5 hover:bg-white/5 rounded-2xl cursor-pointer transition-all group'; + item.innerHTML = ` +
+
+
+
+ ${r} +
+ ${selectedAr === r ? '' : ''} + `; + item.onclick = (e) => { + e.stopPropagation(); + selectedAr = r; + document.getElementById('ar-btn-label').textContent = r; + closeDropdown(); + }; + list.appendChild(item); + }); + dropdown.appendChild(list); + } else if (type === 'quality') { + dropdown.classList.add('max-w-[200px]'); + dropdown.innerHTML = `
Resolution
`; + const list = document.createElement('div'); + list.className = 'flex flex-col gap-1'; + + // Dynamic resolution options + const options = getResolutionsForModel(selectedModel); + + options.forEach(opt => { + const item = document.createElement('div'); + item.className = 'flex items-center justify-between p-3.5 hover:bg-white/5 rounded-2xl cursor-pointer transition-all group'; + item.innerHTML = ` + ${opt} + ${document.getElementById('quality-btn-label').textContent === opt ? '' : ''} + `; + item.onclick = (e) => { + e.stopPropagation(); + document.getElementById('quality-btn-label').textContent = opt; + closeDropdown(); + }; + list.appendChild(item); + }); + dropdown.appendChild(list); + } + + // Position dropdown + const btnRect = anchorBtn.getBoundingClientRect(); + const containerRect = container.getBoundingClientRect(); + + // Horizontal position + if (window.innerWidth < 768) { + // Center on mobile + dropdown.style.left = '50%'; + dropdown.style.transform = 'translateX(-50%) translate(0, 8px)'; + } else { + // Align with button on desktop + dropdown.style.left = `${btnRect.left - containerRect.left}px`; + dropdown.style.transform = 'translate(0, 8px)'; + } + + // Vertical position (always above button) + dropdown.style.bottom = `${containerRect.bottom - btnRect.top + 8}px`; + }; + + const closeDropdown = () => { + dropdown.classList.add('opacity-0', 'pointer-events-none'); + dropdown.classList.remove('opacity-100', 'pointer-events-auto'); + dropdownOpen = null; + }; + + modelBtn.onclick = (e) => { + e.stopPropagation(); + if (dropdownOpen === 'model') closeDropdown(); + else { + dropdownOpen = 'model'; + showDropdown('model', modelBtn); + } + }; + + arBtn.onclick = (e) => { + e.stopPropagation(); + if (dropdownOpen === 'ar') closeDropdown(); + else { + dropdownOpen = 'ar'; + showDropdown('ar', arBtn); + } + }; + + qualityBtn.onclick = (e) => { + e.stopPropagation(); + if (dropdownOpen === 'quality') closeDropdown(); + else { + dropdownOpen = 'quality'; + showDropdown('quality', qualityBtn); + } + }; + + window.onclick = () => closeDropdown(); + container.appendChild(dropdown); + + // ========================================== + // 4. CANVAS AREA + HISTORY + // ========================================== + const generationHistory = []; + + // History sidebar + const historySidebar = document.createElement('div'); + historySidebar.className = 'fixed right-0 top-0 h-full w-20 md:w-24 bg-black/60 backdrop-blur-xl border-l border-white/5 z-50 flex flex-col items-center py-4 gap-3 overflow-y-auto transition-all duration-500 translate-x-full opacity-0'; + historySidebar.id = 'history-sidebar'; + + const historyLabel = document.createElement('div'); + historyLabel.className = 'text-[9px] font-bold text-muted uppercase tracking-widest mb-2 rotate-0'; + historyLabel.textContent = 'History'; + historySidebar.appendChild(historyLabel); + + const historyList = document.createElement('div'); + historyList.className = 'flex flex-col gap-2 w-full px-2'; + historySidebar.appendChild(historyList); + + container.appendChild(historySidebar); + + // Main canvas + const canvas = document.createElement('div'); + canvas.className = 'absolute inset-0 flex flex-col items-center justify-center p-4 min-[800px]:p-16 z-10 opacity-0 pointer-events-none transition-all duration-1000 translate-y-10 scale-95'; + + const imageContainer = document.createElement('div'); + imageContainer.className = 'relative group'; + + const resultImg = document.createElement('img'); + resultImg.className = 'max-h-[60vh] max-w-[80vw] rounded-3xl shadow-3xl border border-white/10 interactive-glow object-contain'; + imageContainer.appendChild(resultImg); + + // Canvas Controls + const canvasControls = document.createElement('div'); + canvasControls.className = 'mt-6 flex gap-3 opacity-0 transition-opacity delay-500 duration-500 justify-center'; + + const regenerateBtn = document.createElement('button'); + regenerateBtn.className = 'bg-white/10 hover:bg-white/20 px-6 py-2.5 rounded-2xl text-xs font-bold transition-all border border-white/5 backdrop-blur-lg text-white'; + regenerateBtn.textContent = '↻ Regenerate'; + + const downloadBtn = document.createElement('button'); + downloadBtn.className = 'bg-primary text-black px-6 py-2.5 rounded-2xl text-xs font-bold transition-all shadow-glow active:scale-95'; + downloadBtn.textContent = '↓ Download'; + + const newPromptBtn = document.createElement('button'); + newPromptBtn.className = 'bg-white/10 hover:bg-white/20 px-6 py-2.5 rounded-2xl text-xs font-bold transition-all border border-white/5 backdrop-blur-lg text-white'; + newPromptBtn.textContent = '+ New'; + + canvasControls.appendChild(regenerateBtn); + canvasControls.appendChild(downloadBtn); + canvasControls.appendChild(newPromptBtn); + + canvas.appendChild(imageContainer); + canvas.appendChild(canvasControls); + container.appendChild(canvas); + + // --- Helper: Show image in canvas --- + const showImageInCanvas = (imageUrl) => { + // Fully hide hero and prompt + hero.classList.add('hidden'); + promptWrapper.classList.add('hidden'); + + resultImg.src = imageUrl; + resultImg.onload = () => { + canvas.classList.remove('opacity-0', 'pointer-events-none', 'translate-y-10', 'scale-95'); + canvas.classList.add('opacity-100', 'translate-y-0', 'scale-100'); + canvasControls.classList.remove('opacity-0'); + canvasControls.classList.add('opacity-100'); + }; + }; + + // --- Helper: Add to history --- + const addToHistory = (entry) => { + generationHistory.unshift(entry); + + // Save to localStorage + localStorage.setItem('muapi_history', JSON.stringify(generationHistory.slice(0, 50))); + + // Show sidebar + historySidebar.classList.remove('translate-x-full', 'opacity-0'); + historySidebar.classList.add('translate-x-0', 'opacity-100'); + + renderHistory(); + }; + + const renderHistory = () => { + historyList.innerHTML = ''; + generationHistory.forEach((entry, idx) => { + const thumb = document.createElement('div'); + thumb.className = `relative group/thumb cursor-pointer rounded-xl overflow-hidden border-2 transition-all duration-300 ${idx === 0 ? 'border-primary shadow-glow' : 'border-white/10 hover:border-white/30'}`; + + thumb.innerHTML = ` + ${entry.prompt?.substring(0, 30) || 'Generated'} +
+ +
+ `; + + thumb.onclick = (e) => { + if (e.target.closest('.hist-download')) { + downloadImage(entry.url, `muapi-${entry.id || idx}.jpg`); + return; + } + showImageInCanvas(entry.url); + // Update active border + historyList.querySelectorAll('div').forEach(t => { + t.classList.remove('border-primary', 'shadow-glow'); + t.classList.add('border-white/10'); + }); + thumb.classList.remove('border-white/10'); + thumb.classList.add('border-primary', 'shadow-glow'); + }; + + historyList.appendChild(thumb); + }); + }; + + // --- Helper: Download image --- + const downloadImage = async (url, filename) => { + try { + const response = await fetch(url); + const blob = await response.blob(); + const blobUrl = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = blobUrl; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(blobUrl); + } catch (err) { + // Fallback: open in new tab + window.open(url, '_blank'); + } + }; + + // --- Load history from localStorage --- + try { + const saved = JSON.parse(localStorage.getItem('muapi_history') || '[]'); + if (saved.length > 0) { + saved.forEach(e => generationHistory.push(e)); + historySidebar.classList.remove('translate-x-full', 'opacity-0'); + historySidebar.classList.add('translate-x-0', 'opacity-100'); + renderHistory(); + } + } catch (e) { /* ignore */ } + + // --- Button Handlers --- + downloadBtn.onclick = () => { + const current = resultImg.src; + if (current) { + const entry = generationHistory.find(e => e.url === current); + downloadImage(current, `muapi-${entry?.id || 'image'}.jpg`); + } + }; + + regenerateBtn.onclick = () => { + generateBtn.click(); + }; + + newPromptBtn.onclick = () => { + // Reset to prompt view + canvas.classList.add('opacity-0', 'pointer-events-none', 'translate-y-10', 'scale-95'); + canvas.classList.remove('opacity-100', 'translate-y-0', 'scale-100'); + canvasControls.classList.add('opacity-0'); + canvasControls.classList.remove('opacity-100'); + // Restore hero and prompt + hero.classList.remove('hidden', 'opacity-0', 'scale-95', '-translate-y-10', 'pointer-events-none'); + promptWrapper.classList.remove('hidden', 'opacity-40'); + textarea.value = ''; + textarea.focus(); + }; + + // ========================================== + // 5. GENERATION LOGIC + // ========================================== + generateBtn.onclick = async () => { + const prompt = textarea.value.trim(); + if (!prompt) return; + + // Lazy API Key Check + const apiKey = localStorage.getItem('muapi_key'); + if (!apiKey) { + AuthModal(() => { + // Key saved, now trigger generation + generateBtn.click(); + }); + return; + } + + // Animate Out Hero + hero.classList.add('opacity-0', 'scale-95', '-translate-y-10', 'pointer-events-none'); + + generateBtn.disabled = true; + generateBtn.innerHTML = ` Generating...`; + + try { + const res = await muapi.generateImage({ + prompt, + model: selectedModel, + aspect_ratio: selectedAr + }); + + console.log('[ImageStudio] Full response:', res); + + if (res && res.url) { + // Add to history + addToHistory({ + id: res.id || Date.now().toString(), + url: res.url, + prompt: prompt, + model: selectedModel, + aspect_ratio: selectedAr, + timestamp: new Date().toISOString() + }); + + // Show image + showImageInCanvas(res.url); + } else { + console.error('[ImageStudio] No image URL in response:', res); + throw new Error('No image URL returned by API'); + } + } catch (e) { + console.error(e); + generateBtn.innerHTML = `Error: ${e.message.slice(0, 40)}`; + setTimeout(() => { + generateBtn.innerHTML = `Generate ✨`; + generateBtn.disabled = false; + }, 3000); + } finally { + generateBtn.disabled = false; + generateBtn.innerHTML = `Generate ✨`; + } + }; + + return container; +} diff --git a/src/components/SettingsModal.js b/src/components/SettingsModal.js new file mode 100644 index 0000000..0d85482 --- /dev/null +++ b/src/components/SettingsModal.js @@ -0,0 +1,92 @@ +export function SettingsModal(onClose) { + const overlay = document.createElement('div'); + overlay.className = 'fixed inset-0 bg-black/80 flex items-center justify-center z-50'; + overlay.style.position = 'fixed'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.right = '0'; + overlay.style.bottom = '0'; + overlay.style.backgroundColor = 'rgba(0,0,0,0.8)'; + overlay.style.display = 'flex'; + overlay.style.alignItems = 'center'; + overlay.style.justifyContent = 'center'; + overlay.style.zIndex = '100'; + + const modal = document.createElement('div'); + modal.className = 'bg-card p-6 rounded-xl border border-border-color w-96 glass'; + modal.style.background = 'var(--bg-card)'; + modal.style.padding = '1.5rem'; + modal.style.borderRadius = 'var(--border-radius-xl)'; + modal.style.border = '1px solid var(--border-color)'; + modal.style.width = '24rem'; + + const title = document.createElement('h2'); + title.textContent = 'Settings'; + title.className = 'text-xl font-bold mb-4'; + title.style.marginBottom = '1rem'; + + const label = document.createElement('label'); + label.textContent = 'Muapi API Key'; + label.className = 'block text-sm text-secondary mb-2'; + + const input = document.createElement('input'); + input.type = 'password'; + input.className = 'w-full mb-4 p-2 rounded bg-input border border-border-color'; + input.value = localStorage.getItem('muapi_key') || ''; + input.placeholder = 'sk-...'; + input.style.width = '100%'; + input.style.marginBottom = '1rem'; + + const btnContainer = document.createElement('div'); + btnContainer.className = 'flex justify-end gap-2'; + btnContainer.style.display = 'flex'; + btnContainer.style.justifyContent = 'flex-end'; + btnContainer.style.gap = '0.5rem'; + + const cancelBtn = document.createElement('button'); + cancelBtn.textContent = 'Cancel'; + cancelBtn.className = 'px-4 py-2 rounded hover:bg-white/5'; + cancelBtn.onclick = () => { + document.body.removeChild(overlay); + if (onClose) onClose(); + }; + + const saveBtn = document.createElement('button'); + saveBtn.textContent = 'Save'; + saveBtn.className = 'px-4 py-2 rounded bg-primary text-black font-medium'; + saveBtn.style.backgroundColor = 'var(--color-primary)'; + saveBtn.style.color = 'black'; + saveBtn.style.fontWeight = '500'; + + saveBtn.onclick = () => { + const key = input.value.trim(); + if (key) { + localStorage.setItem('muapi_key', key); + alert('API Key saved!'); + document.body.removeChild(overlay); + if (onClose) onClose(); + } else { + alert('Please enter a valid key'); + } + }; + + modal.appendChild(title); + modal.appendChild(label); + modal.appendChild(input); + + btnContainer.appendChild(cancelBtn); + btnContainer.appendChild(saveBtn); + modal.appendChild(btnContainer); + + overlay.appendChild(modal); + + // Close on outside click + overlay.addEventListener('click', (e) => { + if (e.target === overlay) { + document.body.removeChild(overlay); + if (onClose) onClose(); + } + }); + + return overlay; +} diff --git a/src/components/Sidebar.js b/src/components/Sidebar.js new file mode 100644 index 0000000..3c3accc --- /dev/null +++ b/src/components/Sidebar.js @@ -0,0 +1,83 @@ +export function Sidebar() { + const element = document.createElement('aside'); + element.className = 'glass-panel'; + element.style.width = '72px'; + element.style.height = '100%'; + element.style.display = 'flex'; + element.style.flexDirection = 'column'; + element.style.alignItems = 'center'; + element.style.padding = '1.5rem 0'; + element.style.zIndex = '50'; + element.style.background = 'var(--bg-panel)'; + + // Logo + const logo = document.createElement('div'); + logo.innerHTML = ``; + logo.className = 'mb-10 text-primary'; + element.appendChild(logo); + + const navItems = [ + { id: 'image', icon: '', label: 'Canvas' }, + { id: 'video', icon: '', label: 'Video' }, + { id: 'library', icon: '', label: 'Library' }, + ]; + + const bottomItems = [ + { id: 'settings', icon: '', label: 'Settings' } + ]; + + let activeTab = 'image'; + + const createButton = (item) => { + const container = document.createElement('div'); + container.className = 'flex flex-col items-center gap-1 mb-6 cursor-pointer group'; + + const iconBtn = document.createElement('button'); + iconBtn.innerHTML = item.icon; + iconBtn.className = 'w-10 h-10 rounded-xl flex items-center justify-center transition-all bg-transparent text-secondary group-hover:bg-white/5 group-hover:text-white'; + + const label = document.createElement('span'); + label.textContent = item.label; + label.className = 'text-[9px] font-bold uppercase tracking-widest text-secondary group-hover:text-white transition-colors'; + + if (activeTab === item.id && item.id !== 'settings') { + iconBtn.classList.add('active-nav-btn'); + iconBtn.style.color = 'var(--color-primary)'; + label.style.color = 'var(--color-primary)'; + } + + container.onclick = () => { + const event = new CustomEvent('navigate', { detail: { page: item.id } }); + window.dispatchEvent(event); + + if (item.id !== 'settings') { + activeTab = item.id; + element.querySelectorAll('.active-nav-btn').forEach(btn => { + btn.classList.remove('active-nav-btn'); + btn.style.color = 'var(--text-secondary)'; + btn.nextSibling.style.color = 'var(--text-secondary)'; + }); + iconBtn.classList.add('active-nav-btn'); + iconBtn.style.color = 'var(--color-primary)'; + label.style.color = 'var(--color-primary)'; + } + }; + + container.appendChild(iconBtn); + container.appendChild(label); + return container; + }; + + const navContainer = document.createElement('div'); + navContainer.className = 'flex flex-col flex-1 w-full items-center'; + navItems.forEach(item => navContainer.appendChild(createButton(item))); + element.appendChild(navContainer); + + const bottomContainer = document.createElement('div'); + bottomContainer.className = 'flex flex-col w-full items-center mt-auto'; + bottomItems.forEach(item => bottomContainer.appendChild(createButton(item))); + element.appendChild(bottomContainer); + + return element; +} + diff --git a/src/lib/models.js b/src/lib/models.js new file mode 100644 index 0000000..5994678 --- /dev/null +++ b/src/lib/models.js @@ -0,0 +1,2023 @@ +// Auto-generated from models_dump.json +export const t2iModels = [ + { + "id": "nano-banana", + "name": "Nano Banana", + "endpoint": "nano-banana", + "inputs": { + "prompt": { + "examples": [ + "A portrait of me in a modern living room. Change it so I’m dressed in 1950s attire with a polka-dot dress, while maintaining my face and hairstyle." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9", + "3:2", + "2:3", + "5:4", + "4:5", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "flux-dev", + "name": "Flux Dev", + "endpoint": "flux-dev-image", + "inputs": { + "prompt": { + "examples": [ + "Extreme close-up of a single tiger eye, direct frontal view. Detailed iris and pupil. Sharp focus on eye texture and color. Natural lighting to capture authentic eye shine and depth. The word \"FLUX\" is painted over it in big, white brush strokes with visible texture." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-dev-lora", + "name": "Flux Dev Lora", + "inputs": { + "prompt": { + "examples": [ + "A female warrior in ornate armor standing on a cliff during sunset, flowing cape, wind blowing through her hair, detailed fantasy art style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "model_id": { + "examples": [ + { + "model": "civitai:119351@317153", + "weight": 1 + } + ], + "title": "LoRA Ids", + "name": "model_id", + "type": "array", + "items": { + "type": "object", + "properties": { + "model": { + "type": "string", + "format": "url", + "title": "Model ID", + "description": "The Civitai LoRA model ID." + }, + "weight": { + "type": "number", + "title": "Weight", + "description": "A list of LoRA models to use for generation. Each item must include an `id` (e.g., \"civitai:1642876@1864626\") and a `weight` between 0 and 4. You can include up to 4 models. The `id` can be found in the Civitai model URL. These models will be applied with the specified weights by the Flux Dev system during image generation.", + "minValue": 0, + "maxValue": 4, + "step": 0.01, + "default": 1 + } + } + }, + "description": "The unique identifier of a LoRA model hosted on Civitai, used by the Flux Dev image generation system. This ID tells Flux Dev which specific LoRA model to apply during generation. You can find the model ID in the Civitai model URL (e.g., model_id: civitai:1642876@1864626).", + "maxItems": 4 + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64, + "isEdit": true + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64, + "isEdit": true + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "flux-kontext-dev-t2i", + "name": "Flux Kontext Dev T2I", + "inputs": { + "prompt": { + "examples": [ + "A powerful wizard casting a glowing spell in a dark forest, wearing a hooded robe, with swirling magical energy, epic fantasy art." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "hidream-i1-fast", + "name": "Hidream I1 Fast", + "inputs": { + "prompt": { + "examples": [ + "A colorful cartoon-style cat sitting on a skateboard, wide smile, playful background, 2D flat illustration style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hidream-i1-dev", + "name": "Hidream I1 Dev", + "inputs": { + "prompt": { + "examples": [ + "A colorful cartoon-style cat sitting on a skateboard, wide smile, playful background, 2D flat illustration style." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hidream-i1-full", + "name": "Hidream I1 Full", + "inputs": { + "prompt": { + "examples": [ + "A majestic elven queen standing in a glowing forest, wearing intricate golden armor with emerald details, sunlight rays filtering through the trees, ultra-detailed fantasy concept art." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "ai-anime-generator", + "name": "Ai Anime Generator", + "inputs": { + "prompt": { + "examples": [ + "A cheerful anime girl with short pink hair and green eyes, wearing a school uniform, standing under cherry blossom trees, soft lighting, anime style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1, + "isEdit": true + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "wan2.1-text-to-image", + "name": "Wan2.1 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A young woman with freckles and natural makeup, standing in soft sunlight, sharp focus, DSLR photo style, ultra-realistic skin texture." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-kontext-pro-t2i", + "name": "Flux Kontext Pro T2I", + "inputs": { + "prompt": { + "examples": [ + "A steampunk owl with mechanical wings, perched on a glowing gear, cinematic lighting." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "16:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "flux-kontext-max-t2i", + "name": "Flux Kontext Max T2I", + "inputs": { + "prompt": { + "examples": [ + "A realistic portrait of a woman with curly hair, wearing a silk blouse, studio lighting, high detail." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "16:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "gpt4o-text-to-image", + "name": "Gpt4o Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A diagram of the solar system with labeled planets, cartoon style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "enum": [ + 1, + 2, + 4 + ], + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1 + } + } + }, + { + "id": "midjourney-v7-text-to-image", + "name": "Midjourney v7 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A sprawling futuristic city at dusk, illuminated with vibrant neon signs, layered skyscrapers, elevated highways with flying cars, warm atmospheric glow, ultra-detailed sci-fi architecture, cinematic composition — digital art, high contrast, 8K" + ], + "description": "The prompt to generate the image", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "speed": { + "enum": [ + "relaxed", + "fast", + "turbo" + ], + "title": "Speed", + "name": "speed", + "type": "string", + "description": "The speed of which corresponds to different speed of Midjourney", + "default": "relaxed" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "1:2", + "2:1", + "2:3", + "3:2", + "5:6", + "6:5" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "variety": { + "title": "Variety", + "name": "variety", + "type": "int", + "description": "Controls the diversity of generated images. Increment by 5 each time. Higher values create more diverse results. Lower values create more consistent results.", + "default": 5, + "minValue": 0, + "maxValue": 100, + "step": 5 + }, + "stylization": { + "title": "Stylization", + "name": "stylization", + "type": "int", + "description": "Controls the artistic style intensity. Higher values create more stylized results. Lower values create more realistic results.", + "default": 1, + "minValue": 0, + "maxValue": 1000, + "step": 1 + }, + "weirdness": { + "title": "Weirdness", + "name": "weirdness", + "type": "int", + "description": "Controls the creativity and uniqueness. Higher values create more unusual results. Lower values create more conventional results.", + "default": 1, + "minValue": 0, + "maxValue": 3000, + "step": 1 + } + } + }, + { + "id": "flux-schnell", + "name": "Flux Schnell", + "endpoint": "flux-schnell-image", + "inputs": { + "prompt": { + "examples": [ + "A cozy mountain cabin surrounded by pine trees during snowfall, warm light glowing from windows, twilight scene" + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image. The value must be divisible by 64, eg: 128...512, 576, 640...2048.", + "default": 1024, + "minValue": 128, + "maxValue": 2048, + "step": 64 + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "bytedance-seedream-v3", + "name": "Bytedance Seedream v3", + "inputs": { + "prompt": { + "examples": [ + "A magical forest with glowing mushrooms and a crystal river under a starry sky, dreamy and ethereal style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "qwen-image", + "name": "Qwen Image", + "inputs": { + "prompt": { + "examples": [ + "A serene Japanese garden in autumn, with red maple leaves falling gently, a small stone bridge over a koi pond, photorealistic detail, soft morning light" + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "21:9", + "9:21", + "3:2", + "2:3" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "16:9" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-pulid", + "name": "Flux Pulid", + "inputs": { + "prompt": { + "examples": [ + "Recreate the same person in a Renaissance-style painting with ornate collar and soft candlelight ambiance." + ], + "description": "Text prompt describing the image (max 1500 characters).", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + "https://d3adwkbyhxyrtq.cloudfront.net/ai-images/186/818590409074/b5aa9200-ed01-43b2-8ed7-091255f3d164.jpg" + ], + "description": "URL of the input image used to generate image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "ideogram-v3-t2i", + "name": "Ideogram v3 T2I", + "inputs": { + "prompt": { + "examples": [ + "A retro 80s style poster with the words 'MUAPI APP' glowing in pink and blue neon lights, cyberpunk city skyline in the background, cinematic design, highly detailed." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "render_speed": { + "enum": [ + "Turbo", + "Balanced", + "Quality" + ], + "title": "Render Speed", + "name": "render_speed", + "type": "string", + "description": "The rendering speed to use.", + "default": "Balanced" + }, + "style": { + "enum": [ + "Auto", + "General", + "Realistic", + "Design" + ], + "title": "Style", + "name": "style", + "type": "string", + "description": "The style type to generate with.", + "default": "Auto" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4", + "name": "Google Imagen4", + "inputs": { + "prompt": { + "examples": [ + "A grand waterfall cascading down glowing crystal cliffs under a twilight sky, bioluminescent plants illuminating the scene, a lone explorer standing on a cliff edge with a futuristic lantern, cinematic ultra-realism." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4-fast", + "name": "Google Imagen4 Fast", + "inputs": { + "prompt": { + "examples": [ + "A playful panda astronaut bouncing on the moon, leaving heart-shaped footprints, with a pastel-colored galaxy in the background." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1, + "isEdit": true + } + } + }, + { + "id": "google-imagen4-ultra", + "name": "Google Imagen4 Ultra", + "inputs": { + "prompt": { + "examples": [ + "A close-up portrait of an old lighthouse keeper, wrinkled hands holding a brass lantern, stormy sea waves crashing behind, ultra-detailed realism." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "sdxl-image", + "name": "Sdxl Image", + "inputs": { + "prompt": { + "examples": [ + "An elven archer standing in a bioluminescent forest at night, glowing foliage, intricate leather armor, dynamic pose, painterly high-detail concept art." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "bytedance-seedream-v4", + "name": "Bytedance Seedream v4", + "inputs": { + "prompt": { + "examples": [ + "A tranquil shoreline at dawn where waves turn into glowing ribbons of light, painting the sky with dreamlike hues of violet and gold. A figure walks along the edge, leaving footsteps that bloom into luminous flowers, symbolizing imagination flowing seamlessly into reality." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1K", + "2K", + "4K" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "Resolution of the output image.", + "default": "4K" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "hunyuan-image-2.1", + "name": "Hunyuan Image 2.1", + "inputs": { + "prompt": { + "examples": [ + "A vast ink-wash landscape where misty mountains rise into drifting clouds, rivers flowing like silver threads across valleys. In the distance, a solitary pavilion glows with warm lantern light, blending classical Chinese painting aesthetics with modern cinematic realism." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "chroma-image", + "name": "Chroma Image", + "inputs": { + "prompt": { + "examples": [ + "A futuristic studio bathed in radiant beams of shifting neon colors — cyan, magenta, amber, and emerald — that blend into surreal gradients across walls and objects. A crystal-like prism floats at the center, splitting light into vibrant chromatic waves that ripple outward, painting the scene in glowing, ever-changing hues." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-redux", + "name": "Flux Redux", + "inputs": { + "prompt": { + "examples": [ + "Reimagine the forest cabin as a mystical fantasy retreat at twilight, glowing lanterns hanging from the trees, magical fireflies in the air, cinematic atmosphere with enchanted vibes." + ], + "description": "Text prompt describing the image (max 1500 characters).", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + "https://d3adwkbyhxyrtq.cloudfront.net/webassets/videomodels/flux-redux-input.jpg" + ], + "description": "URL of the input image used to generate image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "flux-krea-dev", + "name": "Flux Krea Dev", + "inputs": { + "prompt": { + "examples": [ + "Close-up shot of a midnight blue sports car on wet asphalt, city lights reflected in its paint, shallow depth of field, cinematic realism." + ], + "description": "Text prompt describing the image. The length of the prompt must be between 2 and 3000 characters.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "3:2", + "2:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 4, + "step": 1 + } + } + }, + { + "id": "perfect-pony-xl", + "name": "Perfect Pony Xl", + "inputs": { + "prompt": { + "examples": [ + "A warm, photorealistic portrait of a dappled pony standing in a sunlit stable, dust motes floating in golden light, textured mane, high detail on fur and eyes." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "neta-lumina", + "name": "Neta Lumina", + "inputs": { + "prompt": { + "examples": [ + "A poised young woman with long silver hair and heterochromatic eyes (one blue, one green), wearing a flowing cheongsam with cranes embroidered, standing in a dimly lit grand staircase. Soft ethereal lighting, painterly anime style, rich textures, delicate lace and pearl accessories." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "wan2.5-text-to-image", + "name": "Wan2.5 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A majestic waterfall cascading from towering cliffs into a misty valley, with glowing bioluminescent plants along the riverbanks, a lone explorer standing on a rock, cinematic lighting and ultra-detailed scenery." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1322, + "minValue": 768, + "maxValue": 1440, + "step": 1 + } + } + }, + { + "id": "hunyuan-image-3.0", + "name": "Hunyuan Image 3.0", + "inputs": { + "prompt": { + "examples": [ + "A traditional Chinese courtyard with red lanterns hanging from wooden beams, moonlight reflecting from jade floor tiles. In the courtyard, a modern artist sits painting on an easel, neon blue sneakers, graffiti-style mural beginning behind them. Blend of classical aesthetics and modern street art." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "leonardoai-phoenix-1.0", + "name": "Leonardoai Phoenix 1.0", + "inputs": { + "prompt": { + "examples": [ + "A magical forest at twilight, giant bioluminescent mushrooms illuminating a misty path, a crystal-clear river winding through twisted trees, fireflies dancing, soft ambient glow, ancient stone ruins partially visible, cinematic fantasy lighting, high-detail textures on foliage and moss, ethereal atmosphere, volumetric lighting rays piercing through branches." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "4:5", + "5:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "leonardoai-lucid-origin", + "name": "Leonardoai Lucid Origin", + "inputs": { + "prompt": { + "examples": [ + "A towering medieval castle perched on a cliff, waterfalls cascading around it, sunrise casting golden light on the stone walls, mist rising from the valley below, flying dragons circling above, realistic clouds and sky reflections, cinematic wide-angle view, ultra-detailed textures on stone and water, epic fantasy atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "3:4", + "4:3", + "4:5", + "5:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "reve-text-to-image", + "name": "Reve Text To Image", + "inputs": { + "prompt": { + "examples": [ + "An astronaut stands in a strange, bioluminescent purple jungle on an alien planet. She slowly reaches out her hand as a graceful creature made of translucent energy curiously approaches, gently touching her glove's fingertip with its tendril. The reflection of the planet's two moons is visible on her helmet's visor. Sense of wonder, photorealistic, cinematic." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "21:9", + "16:9", + "4:3", + "1:1", + "3:4", + "9:16", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + } + } + }, + { + "id": "grok-imagine-text-to-image", + "name": "Grok Imagine Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A futuristic samurai standing under glowing neon lights in a rainy cyberpunk alley, reflections on wet pavement, dramatic rim lighting, highly detailed armor, cinematic atmosphere, ultra-realistic style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "9:16", + "16:9", + "2:3", + "3:2", + "1:1" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image. Get 6 images each time.", + "default": "1:1" + } + } + }, + { + "id": "nano-banana-pro", + "name": "Nano Banana Pro", + "endpoint": "nano-banana-pro", + "inputs": { + "prompt": { + "examples": [ + "A radiant golden banana floating in a futuristic glass chamber, surrounded by swirling particles of light and data streams forming geometric shapes. Electric blue reflections ripple across the surface as energy pulses outward, turning fragments of light into vivid artworks suspended mid-air. Symbolizing playful innovation, AI precision, and evolution of creative power." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "3:4", + "4:3", + "9:16", + "16:9", + "3:2", + "2:3", + "5:4", + "4:5", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k", + "4k" + ], + "description": "The target resolution of the generated image.", + "type": "string", + "title": "Resolution", + "name": "resolution", + "default": "1k" + } + } + }, + { + "id": "kling-o1-text-to-image", + "name": "Kling O1 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A towering arcology city at dusk built into a canyon, terraces lit with warm lanterns and bioluminescent gardens cascading down the rock face. Floating trams glide between terraces, mist curls from hidden waterfalls, and a faint green aurora shivers above the canyon rim. Deep orange sunset meets teal dusk, dramatic rim lighting, ultra-detailed architecture, cinematic wide-angle composition, 8k, hyperreal textures." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + }, + "num_images": { + "title": "Number of images", + "name": "num_images", + "type": "int", + "description": "Number of images generated in single request. Each number will charge separately", + "default": 1, + "minValue": 1, + "maxValue": 9, + "step": 1 + } + } + }, + { + "id": "z-image-turbo", + "name": "Z Image Turbo", + "inputs": { + "prompt": { + "examples": [ + "A colossal glass hourglass floating in a dark void, filled not with sand but with glowing galaxies swirling inside. Each galaxy emits colorful nebula clouds that leak through cracks in the glass, forming cosmic streams drifting into the darkness. Bright rim lighting around the hourglass, reflective glass surfaces, deep space background, ultra-detailed sci-fi render, 8k quality, volumetric glow, high contrast." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-dev", + "name": "Flux 2 Dev", + "inputs": { + "prompt": { + "examples": [ + "A giant mechanical butterfly made of chrome wings and glowing blue energy veins, hovering above a mirror-smooth lake during twilight. Each wing reflects the sky while emitting soft neon trails. The lake surface ripples lightly from the energy pulses. Mist rolls across the water, and distant mountains fade into a deep violet horizon. Ultra-realistic lighting, cinematic composition, 8k render, high contrast, reflective metal textures." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-flex", + "name": "Flux 2 Flex", + "inputs": { + "prompt": { + "examples": [ + "A monumental crystalline arch towering above an endless desert of shifting silver sand, glowing with internal prisms that refract rainbow beams across the dunes. Beneath the arch floats a slowly rotating orb of condensed starlight, casting long ethereal shadows. In the distance, colossal sand whales breach from metallic dunes, their bodies shimmering with mirrored scales. Overhead, a fractured moon illuminates the scene with cold blue radiance. Ultra-detailed fantasy–sci-fi fusion, cinematic wide-angle view, volumetric light rays, 8k clarity, high contrast, dreamlike atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "flux-2-pro", + "name": "Flux 2 Pro", + "inputs": { + "prompt": { + "examples": [ + "A colossal throne forged from intertwining meteor-iron branches, floating above a storm-torn ocean. Each branch pulses with glowing red runes, casting fiery reflections across the churning waves below. Above the throne hovers a massive eclipsed sun, its corona exploding into swirling arcs of molten light. Lightning erupts from the clouds and climbs the metal branches like living serpents. A lone hooded figure stands at the edge of the water, cloak whipping in the wind, illuminated only by the molten eclipse. Ultra-cinematic composition, hyper-detailed textures, 8k resolution, dramatic contrast, dark epic fantasy atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "vidu-q2-text-to-image", + "name": "Vidu Q2 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A colossal floating serpent made of shimmering stardust coils around a broken moon suspended in deep space. Each scale glows with shifting nebula colors, sending ripples of light across the void. Meteor fragments drift slowly around the creature, leaving trails of violet plasma. Beneath the serpent, a crystalline ring structure orbits the shattered moon, reflecting cosmic beams in intricate patterns. The background is a star field swirling into a spiral galaxy, with vibrant energy storms crackling along the horizon. Ultra-cinematic cosmic fantasy, high contrast, 8k detail, volumetric glow, deep space atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "resolution": { + "enum": [ + "1k", + "2k", + "4k" + ], + "title": "Resolution", + "name": "resolution", + "type": "string", + "description": "The target resolution of the generated image.", + "default": "1k" + } + } + }, + { + "id": "bytedance-seedream-v4.5", + "name": "Bytedance Seedream V4.5", + "inputs": { + "prompt": { + "examples": [ + "A massive floating temple forged from translucent sapphire glass hovers above a storm-lit ocean. Crystalline towers refract lightning into rainbow shards that scatter across the waves below. Gigantic chains made of glowing runes suspend the temple in the air as swirling storm clouds coil around it. Beneath the structure, a vortex of shimmering water spirals upward, feeding energy into the floating palace. Distant thunder illuminates the scene with cold blue flashes, casting dramatic shadows across the ocean surface. Ultra-cinematic fantasy–sci-fi fusion, hyper-detailed textures, volumetric lighting, 8k clarity." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "16:9", + "9:16", + "4:3", + "3:4", + "2:3", + "3:2", + "21:9" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "quality": { + "enum": [ + "basic", + "high" + ], + "title": "Quality", + "name": "quality", + "type": "string", + "description": "Quality of the output image.", + "default": "basic" + } + } + }, + { + "id": "gpt-image-1.5", + "name": "Gpt Image 1.5", + "inputs": { + "prompt": { + "examples": [ + "A colossal hourglass floating in a silent cosmic void, its upper chamber filled with swirling golden sand that transforms into glowing constellations as it falls. The lower chamber contains a miniature ocean suspended in zero gravity, with waves frozen mid-motion and bioluminescent creatures glowing beneath the surface. Cracks in the glass emit thin beams of white light that bend and refract through drifting stardust. In the background, fragmented planets orbit slowly, partially illuminated by a distant supernova. Ultra-cinematic surreal concept, dramatic contrast between warm gold and deep blue, hyper-detailed textures, volumetric light rays, 8k clarity, dreamlike atmosphere." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "1:1", + "2:3", + "3:2" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "Aspect ratio of the output image.", + "default": "1:1" + }, + "quality": { + "enum": [ + "low", + "medium", + "high" + ], + "title": "Quality", + "name": "quality", + "type": "string", + "description": "The quality of the generated image.", + "default": "medium" + } + } + }, + { + "id": "wan2.6-text-to-image", + "name": "Wan2.6 Text To Image", + "inputs": { + "prompt": { + "examples": [ + "A colossal floating bridge forged from glowing white stone spans a vast abyss filled with swirling clouds of light. Along the bridge, towering statues carved from ancient marble stand in silent formation, their eyes emitting faint golden beams that illuminate engraved runes beneath their feet. Below the bridge, fragments of ruined cities drift slowly through the mist, catching reflections from the glowing stone above. Overhead, a twilight sky fades from deep blue to soft amber, with distant stars beginning to appear. Cinematic fantasy environment, high contrast lighting, volumetric fog, ultra-detailed textures, epic scale." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "title": "Width", + "name": "width", + "type": "int", + "description": "Width of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + }, + "height": { + "title": "Height", + "name": "height", + "type": "int", + "description": "Height of the output image.", + "default": 1024, + "minValue": 768, + "maxValue": 1440, + "step": 1 + } + } + }, + { + "id": "qwen-text-to-image-2512", + "name": "Qwen Text To Image 2512", + "inputs": { + "prompt": { + "examples": [ + "A colossal biomechanical whale swimming slowly through a vast sky made of soft clouds and fractured light. Its translucent body reveals glowing internal organs shaped like rotating gears and flowing energy veins. Below it, a sprawling patchwork of farmland and rivers curves with the planet’s surface, catching reflections from the whale’s luminous glow. Long fabric banners trail from the whale’s fins, fluttering gently in the wind like ceremonial streamers. The camera angle is wide and aerial, emphasizing scale and serenity. Soft sunrise colors, cinematic depth, ultra-detailed surreal sci-fi atmosphere." + ], + "description": "Text prompt describing the image, what you want the final edited image to look like.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "width": { + "type": "integer", + "title": "Width", + "name": "width", + "description": "Width of the image in pixels", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + }, + "height": { + "type": "integer", + "title": "Height", + "name": "height", + "description": "Height of the image in pixels", + "default": 1024, + "minValue": 256, + "maxValue": 1536, + "step": 1 + } + } + }, + { + "id": "flux-2-klein-4b", + "name": "Flux 2 Klein 4b", + "inputs": { + "prompt": { + "examples": [ + "A small round robot sitting at a café table outdoors, holding a tiny cup of coffee with both hands. The robot has a simple white body, a glowing digital face showing a happy expression, and short stubby legs dangling from the chair. Morning sunlight casts soft shadows on the pavement, potted plants surround the café, and steam gently rises from the coffee cup. Clean, minimal, cute, modern illustration style, bright colors, friendly mood." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + } + } + }, + { + "id": "flux-2-klein-9b", + "name": "Flux 2 Klein 9b", + "inputs": { + "prompt": { + "examples": [ + "A cute corgi puppy wearing a tiny yellow raincoat stands on a wet sidewalk after rain. Small puddles reflect the city lights, and the puppy looks up with bright curious eyes while holding a green leaf in its mouth. Soft evening light, shallow depth of field, clean background, warm and cheerful mood, high detail fur texture, realistic yet adorable style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + } + } + }, + { + "id": "z-image-base", + "name": "Z Image Base", + "inputs": { + "prompt": { + "examples": [ + "A cozy late-night diner interior with warm yellow lighting, rain tapping against large glass windows, and a lone barista cleaning the counter. A slice of pie sits under a glass dome, steam rises from a fresh cup of coffee, and neon signs outside softly glow and reflect across the wet street. Cinematic realism, shallow depth of field, calm mood, high detail, modern photography style." + ], + "description": "Text prompt describing the image.", + "type": "string", + "title": "Prompt", + "name": "prompt" + }, + "image_url": { + "examples": [ + null + ], + "description": "URL of the input image.", + "field": "image", + "type": "string", + "title": "Image URL", + "name": "image_url" + }, + "aspect_ratio": { + "enum": [ + "16:9", + "9:16", + "1:1", + "3:4", + "4:3", + "21:9", + "9:21" + ], + "title": "Aspect Ratio", + "name": "aspect_ratio", + "type": "string", + "description": "The aspect ratio of the generated image", + "default": "1:1" + }, + "strength": { + "title": "Strength", + "name": "strength", + "type": "int", + "description": "Controls the strength of the transformation. Higher values produce outputs more different from the input image.", + "default": 0.6, + "minValue": 0, + "maxValue": 1, + "step": 0.01 + } + } + } +]; + +export const getModelById = (id) => t2iModels.find(m => m.id === id); + +export const getAspectRatiosForModel = (modelId) => { + const model = getModelById(modelId); + if (!model) return ['1:1']; + + const arInput = model.inputs?.aspect_ratio; + if (arInput && arInput.enum) { + return arInput.enum; + } + + return ['1:1', '16:9', '9:16', '4:3', '3:2', '21:9']; +}; diff --git a/src/lib/muapi.js b/src/lib/muapi.js new file mode 100644 index 0000000..0305f10 --- /dev/null +++ b/src/lib/muapi.js @@ -0,0 +1,172 @@ +import { getModelById } from './models.js'; + +export class MuapiClient { + constructor() { + // Ideally user provides this in settings + this.baseUrl = import.meta.env.DEV ? '' : 'https://api.muapi.ai'; + } + + getKey() { + const key = localStorage.getItem('muapi_key'); + if (!key) throw new Error('API Key missing. Please set it in Settings.'); + return key; + } + + /** + * Generates an image (Text-to-Image or Image-to-Image) + * @param {Object} params + * @param {string} params.model + * @param {string} params.prompt + * @param {string} params.negative_prompt + * @param {string} params.aspect_ratio + * @param {number} params.steps + * @param {number} params.guidance_scale + * @param {number} params.seed + * @param {string} [params.image_url] - If present, treats as Image-to-Image + */ + async generateImage(params) { + const key = this.getKey(); + + // Resolve endpoint from model definition + const modelInfo = getModelById(params.model); + const endpoint = modelInfo?.endpoint || params.model; + const url = `${this.baseUrl}/api/v1/${endpoint}`; + + // Build payload matching the API's expected format + const finalPayload = { + prompt: params.prompt, + }; + + // Aspect ratio (send as string, the API handles it) + if (params.aspect_ratio) { + finalPayload.aspect_ratio = params.aspect_ratio; + } + + // Image-to-Image + if (params.image_url) { + finalPayload.image_url = params.image_url; + finalPayload.strength = params.strength || 0.6; + } else { + finalPayload.image_url = null; + } + + // Optional params if supported by model + if (params.seed && params.seed !== -1) { + finalPayload.seed = params.seed; + } + + console.log('[Muapi] Requesting:', url); + console.log('[Muapi] Payload:', finalPayload); + + try { + // Step 1: Submit the task + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'x-api-key': key + }, + body: JSON.stringify(finalPayload) + }); + + if (!response.ok) { + const errText = await response.text(); + console.error('[Muapi] API Error Body:', errText); + throw new Error(`API Request Failed: ${response.status} ${response.statusText} - ${errText.slice(0, 100)}`); + } + + const submitData = await response.json(); + console.log('[Muapi] Submit Response:', submitData); + + // Extract request_id for polling + const requestId = submitData.request_id || submitData.id; + if (!requestId) { + // Some endpoints return the result directly + return submitData; + } + + // Step 2: Poll for results + console.log('[Muapi] Polling for results, request_id:', requestId); + const result = await this.pollForResult(requestId, key); + + // Normalize: extract image URL from outputs array + const imageUrl = result.outputs?.[0] || result.url || result.output?.url; + console.log('[Muapi] Image URL:', imageUrl); + return { ...result, url: imageUrl }; + + } catch (error) { + console.error("Muapi Client Error:", error); + throw error; + } + } + + /** + * Polls the predictions endpoint until the result is ready. + * @param {string} requestId - The request ID from the submit response + * @param {string} key - The API key + * @param {number} maxAttempts - Maximum polling attempts (default 60 = ~2 min) + * @param {number} interval - Polling interval in ms (default 2000) + */ + async pollForResult(requestId, key, maxAttempts = 60, interval = 2000) { + const pollUrl = `${this.baseUrl}/api/v1/predictions/${requestId}/result`; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + await new Promise(resolve => setTimeout(resolve, interval)); + + console.log(`[Muapi] Polling attempt ${attempt}/${maxAttempts}...`); + + try { + const response = await fetch(pollUrl, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'x-api-key': key + } + }); + + if (!response.ok) { + const errText = await response.text(); + console.warn(`[Muapi] Poll error (${response.status}):`, errText); + // Continue polling on non-fatal errors + if (response.status >= 500) continue; + throw new Error(`Poll Failed: ${response.status} - ${errText.slice(0, 100)}`); + } + + const data = await response.json(); + console.log('[Muapi] Poll Response:', data); + + const status = data.status?.toLowerCase(); + + if (status === 'completed' || status === 'succeeded' || status === 'success') { + return data; + } + + if (status === 'failed' || status === 'error') { + throw new Error(`Generation failed: ${data.error || 'Unknown error'}`); + } + + // Otherwise (processing, pending, etc.) keep polling + } catch (error) { + if (attempt === maxAttempts) throw error; + console.warn('[Muapi] Poll attempt failed, retrying...', error.message); + } + } + + throw new Error('Generation timed out after polling.'); + } + + getDimensionsFromAR(ar) { + // Base unit 1024 (Flux standard) + switch (ar) { + case '1:1': return [1024, 1024]; + case '16:9': return [1280, 720]; // 1024*1024 area approx + case '9:16': return [720, 1280]; + case '4:3': return [1152, 864]; + case '3:2': return [1216, 832]; + case '21:9': return [1536, 640]; + default: return [1024, 1024]; + } + } +} + +export const muapi = new MuapiClient(); diff --git a/src/main.js b/src/main.js index 5fc3358..1c27927 100644 --- a/src/main.js +++ b/src/main.js @@ -1,24 +1,44 @@ -import './style.css' -import javascriptLogo from './javascript.svg' -import viteLogo from '/vite.svg' -import { setupCounter } from './counter.js' +import './style.css'; +import { Header } from './components/Header.js'; +import { ImageStudio } from './components/ImageStudio.js'; -document.querySelector('#app').innerHTML = ` -
- - - - - - -

Hello Vite!

-
- -
-

- Click on the Vite logo to learn more -

-
-` +const app = document.querySelector('#app'); +let contentArea; // Declare contentArea globally so navigate can access it -setupCounter(document.querySelector('#counter')) +app.innerHTML = ''; +app.appendChild(Header()); + +contentArea = document.createElement('main'); // Assign to global contentArea +contentArea.id = 'content-area'; +contentArea.className = 'flex-1 relative w-full overflow-hidden flex flex-col bg-app-bg'; +app.appendChild(contentArea); + +// Initial Route +navigate('image'); + +// Router +function navigate(page) { + contentArea.innerHTML = ''; + + if (page === 'image') { + contentArea.appendChild(ImageStudio()); + } else if (page === 'video') { + contentArea.innerHTML = '
Video Studio Coming Soon 🎬
'; + } else if (page === 'cinema') { + contentArea.innerHTML = '
Cinema Studio Coming Soon 🎥
'; + } +} + +// Initial Load +navigate('image'); + +// Event Listener for Navigation +window.addEventListener('navigate', (e) => { + if (e.detail.page === 'settings') { + import('./components/SettingsModal.js').then(({ SettingsModal }) => { + document.body.appendChild(SettingsModal()); + }); + } else { + navigate(e.detail.page); + } +}); diff --git a/src/style.css b/src/style.css index 8df73e3..635c923 100644 --- a/src/style.css +++ b/src/style.css @@ -1,96 +1,29 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} +@import './styles/global.css'; +@import './styles/studio.css'; +/* App-specific layout */ #app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; + display: flex; + flex-direction: column; + width: 100vw; + height: 100vh; + overflow: hidden; + background: var(--bg-app); } -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.vanilla:hover { - filter: drop-shadow(0 0 2em #f7df1eaa); +main { + flex: 1; + position: relative; + overflow: hidden; + display: flex; } -.card { - padding: 2em; +/* Utilities */ +.no-scrollbar::-webkit-scrollbar { + display: none; } -.read-the-docs { - color: #888; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} +.no-scrollbar { + -ms-overflow-style: none; + scrollbar-width: none; +} \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..f0b334d --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1,75 @@ +@import "tailwindcss"; + +@theme { + --color-primary: #d9ff00; + --color-primary-hover: #c4e600; + --color-app-bg: #050505; + --color-panel-bg: #0a0a0a; + --color-card-bg: #141414; + --color-secondary: #a1a1aa; + --color-muted: #52525b; + + --font-sans: "Inter", "system-ui", "-apple-system", "sans-serif"; + + --radius-xl: 1rem; + --radius-2xl: 1.5rem; + --radius-3xl: 2rem; + + --shadow-glow: 0 0 20px rgba(217, 255, 0, 0.4); + --shadow-glow-accent: 0 0 20px rgba(168, 85, 247, 0.4); + --shadow-3xl: 0 35px 60px -15px rgba(0, 0, 0, 0.8); +} + +@layer base { + body { + @apply bg-app-bg text-white font-sans antialiased h-screen overflow-hidden; + } + + /* Custom Scrollbar Refinement */ + ::-webkit-scrollbar { + @apply w-1.5 h-1.5; + } + + ::-webkit-scrollbar-track { + @apply bg-transparent; + } + + ::-webkit-scrollbar-thumb { + @apply bg-white/10 rounded-full hover:bg-white/20 transition-colors; + } +} + +@layer components { + .glass { + @apply bg-black/80 backdrop-blur-2xl border border-white/10 shadow-3xl; + } + + .glass-panel { + @apply bg-black/60 backdrop-blur-xl border border-white/5; + } + + .neon-border { + @apply border border-primary/20 hover:border-primary/50 transition-colors; + } + + .interactive-glow { + @apply transition-all duration-300 hover:shadow-glow hover:scale-[1.02] active:scale-[0.98]; + } +} + +/* Custom Animations */ +@keyframes fade-in-up { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-fade-in-up { + animation: fade-in-up 0.6s cubic-bezier(0.23, 1, 0.32, 1) forwards; +} \ No newline at end of file diff --git a/src/styles/studio.css b/src/styles/studio.css new file mode 100644 index 0000000..3ba92a1 --- /dev/null +++ b/src/styles/studio.css @@ -0,0 +1,119 @@ +/* Studio Specific Styles */ + +.style-card { + position: relative; + border-radius: var(--border-radius-lg); + overflow: hidden; + aspect-ratio: 16/10; + cursor: pointer; + border: 1px solid var(--border-color); + transition: all var(--transition-normal); +} + +.style-card:hover { + border-color: var(--color-primary); + transform: translateY(-2px); + box-shadow: var(--shadow-glow); +} + +.style-card.active { + border-color: var(--color-primary); + box-shadow: var(--shadow-glow); +} + +.style-card img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.7; + transition: opacity var(--transition-normal); +} + +.style-card:hover img, +.style-card.active img { + opacity: 1; +} + +.style-card .label { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 0.5rem; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.8)); + color: white; + font-size: 0.75rem; + font-weight: 600; +} + +/* Prompt Bar Layout */ +.prompt-bar-container { + display: flex; + gap: 1rem; + width: 100%; +} + +.prompt-field { + flex: 1; + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.prompt-field label { + font-size: 0.7rem; + color: var(--text-secondary); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + padding-left: 0.25rem; +} + +.prompt-field textarea { + background: rgba(255, 255, 255, 0.03); + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: var(--border-radius-md); + padding: 0.75rem; + color: white; + resize: none; + font-size: 0.85rem; + transition: all var(--transition-fast); +} + +.prompt-field textarea:focus { + background: rgba(255, 255, 255, 0.05); + border-color: var(--color-primary); + outline: none; +} + +/* Canvas Toolbar */ +.canvas-toolbar { + position: absolute; + top: 1rem; + right: 1rem; + display: flex; + gap: 0.5rem; + opacity: 0; + transition: opacity var(--transition-normal); +} + +.result-wrapper:hover .canvas-toolbar { + opacity: 1; +} + +.toolbar-btn { + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); + color: white; + padding: 0.5rem; + border-radius: var(--border-radius-md); + cursor: pointer; + transition: all var(--transition-fast); +} + +.toolbar-btn:hover { + background: var(--color-primary); + color: black; + border-color: var(--color-primary); +} \ No newline at end of file diff --git a/src/styles/variables.css b/src/styles/variables.css new file mode 100644 index 0000000..d568432 --- /dev/null +++ b/src/styles/variables.css @@ -0,0 +1,49 @@ +:root { + /* Brand Colors */ + --color-primary: #d9ff00; + /* Neon Yellow-Green (Higgsfield Nano) */ + --color-primary-hover: #c4e600; + --color-accent: #a855f7; + /* Creative Purple */ + --color-accent-hover: #9333ea; + --color-danger: #ef4444; + + /* Backgrounds - Strict Dark Mode */ + --bg-app: #050505; + /* Deepest Black */ + --bg-panel: #0a0a0a; + /* Panel Background */ + --bg-card: #141414; + /* Card/Input Background */ + --bg-glass: rgba(10, 10, 10, 0.8); + + /* Text */ + --text-primary: #ffffff; + --text-secondary: #a1a1aa; + --text-muted: #52525b; + + /* UI Elements */ + --border-color: #27272a; + --border-light: rgba(255, 255, 255, 0.1); + + --border-radius-sm: 6px; + --border-radius-md: 10px; + --border-radius-lg: 16px; + --border-radius-xl: 24px; + --border-radius-full: 9999px; + + /* Effects */ + --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1); + --shadow-glow: 0 0 20px rgba(176, 251, 93, 0.4); + --shadow-glow-accent: 0 0 20px rgba(168, 85, 247, 0.4); + --backdrop-blur: blur(20px); + + /* Transitions */ + --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); + --transition-normal: 300ms cubic-bezier(0.4, 0, 0.2, 1); + + /* Typography */ + --font-family: 'Inter', system-ui, -apple-system, sans-serif; +} \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..a2c4fac --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,36 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + primary: { + DEFAULT: '#d9ff00', + hover: '#c4e600', + }, + 'app-bg': '#050505', + 'panel-bg': '#0a0a0a', + 'card-bg': '#141414', + secondary: '#a1a1aa', + muted: '#52525b', + }, + fontFamily: { + sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'], + }, + borderRadius: { + 'xl': '1rem', + '2xl': '1.5rem', + '3xl': '2rem', + }, + boxShadow: { + 'glow': '0 0 20px rgba(217, 255, 0, 0.4)', + 'glow-accent': '0 0 20px rgba(168, 85, 247, 0.4)', + '3xl': '0 35px 60px -15px rgba(0, 0, 0, 0.8)', + } + }, + }, + plugins: [], +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..4116fde --- /dev/null +++ b/vite.config.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite'; +import tailwindcss from '@tailwindcss/vite'; + +export default defineConfig({ + plugins: [ + tailwindcss(), + ], + server: { + proxy: { + '/api': { + target: 'https://api.muapi.ai', + changeOrigin: true, + secure: false + } + } + } +});