+ {/* Post text card */}
+
+
+ Generated post
+
+ {bundle.post.length} / {bundle.charLimit}
+
+
+
{bundle.post}
+
+
+ {/* Copy Post button */}
+
+
+ {/* Hashtag chips */}
+ {bundle.hashtags && bundle.hashtags.length > 0 && (
+
+ {bundle.hashtags.map((tag) => (
+
+ ))}
+
+ )}
+
+ {/* Instagram Carousel slides */}
+ {hasSlides && (
+
+
Carousel slides
+ {bundle.slides!.map((slide, index) => (
+
toggleSlide(index)}
+ >
+
+ Slide {index + 1}
+
+ {openSlides[index] ? "collapse" : "expand"}
+
+
+
+ {slide}
+
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/ui/src/components/WallpaperGeneratePanel.tsx b/ui/src/components/WallpaperGeneratePanel.tsx
new file mode 100644
index 00000000..f1095ce2
--- /dev/null
+++ b/ui/src/components/WallpaperGeneratePanel.tsx
@@ -0,0 +1,199 @@
+import { useState } from "react";
+import { Loader2 } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { Textarea } from "@/components/ui/textarea";
+import {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Progress } from "@/components/ui/progress";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { useContentJob } from "@/hooks/useContentJob";
+import { getContentJobAsset } from "@/api/contentJobs";
+import { WallpaperPreview } from "./WallpaperPreview";
+
+export const PLATFORM_DIMENSIONS: Record