diff --git a/frontend/apps/artcraft-dashboard/src/components/ui/checkbox.tsx b/frontend/apps/artcraft-dashboard/src/components/ui/checkbox.tsx
index 37308a6862..064dcde810 100644
--- a/frontend/apps/artcraft-dashboard/src/components/ui/checkbox.tsx
+++ b/frontend/apps/artcraft-dashboard/src/components/ui/checkbox.tsx
@@ -1,8 +1,8 @@
-import * as React from "react"
-import { CheckIcon, MinusIcon } from "lucide-react"
-import { Checkbox as CheckboxPrimitive } from "radix-ui"
+import * as React from "react";
+import { CheckIcon, MinusIcon } from "lucide-react";
+import { Checkbox as CheckboxPrimitive } from "radix-ui";
-import { cn } from "@/lib/utils"
+import { cn } from "@/lib/utils";
function Checkbox({
className,
@@ -14,8 +14,8 @@ function Checkbox({
data-slot="checkbox"
checked={checked}
className={cn(
- "peer size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary dark:data-[state=indeterminate]:bg-primary",
- className
+ "peer size-4 shrink-0 rounded-[3px] border border-input shadow-xs transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:bg-input/30 dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary dark:data-[state=indeterminate]:bg-primary",
+ className,
)}
{...props}
>
@@ -30,7 +30,7 @@ function Checkbox({
)}
- )
+ );
}
-export { Checkbox }
+export { Checkbox };
diff --git a/frontend/apps/artcraft-dashboard/src/pages/UserSignups.tsx b/frontend/apps/artcraft-dashboard/src/pages/UserSignups.tsx
index 41ca1e7238..42924a13a0 100644
--- a/frontend/apps/artcraft-dashboard/src/pages/UserSignups.tsx
+++ b/frontend/apps/artcraft-dashboard/src/pages/UserSignups.tsx
@@ -59,7 +59,9 @@ export function UserSignups() {
if (cancelledRef.current) return;
if (resp.success && resp.data) {
- setUsers((prev) => (append ? [...prev, ...resp.data!.users] : resp.data!.users));
+ setUsers((prev) =>
+ append ? [...prev, ...resp.data!.users] : resp.data!.users,
+ );
setNextCursor(resp.data.next_cursor);
} else {
setError(resp.errorMessage || "Failed to load users");
@@ -169,7 +171,9 @@ export function UserSignups() {
onClick={handleRefresh}
disabled={isLoading}
>
-
+
One of the cheapest
- This will permanently delete{" "} - {confirmDelete.name}. This action cannot be - undone. + This will permanently delete {confirmDelete.name} + . This action cannot be undone.
Upload reference image
Click or drag an image here @@ -918,7 +919,10 @@ const NewCharacterView = ({ {/* Name input */}
{title}
++ {title} +
{isEditing ? editingDescription : collapsedDescription}
@@ -480,7 +482,7 @@ function SectionShell({ function CurrentValue({ label, value }: { label: string; value: string }) { return (API keys
++ API keys +
Create and manage keys to access the API programmatically.
@@ -131,7 +139,7 @@ export function ApiKeySection(_props: ApiKeySectionProps) { {loading ? (Copy your key now. For security, you won't be able to see it again.
+
{created.api_key}
void;
}) {
return (
-
+
{item.name}
@@ -346,10 +354,10 @@ function ApiKeyRow({
{/* Truncated prefix, display-only — the full secret is only shown on
create. The trailing ellipsis signals it's not the whole value. */}
-
+
{item.truncated_api_key}…
-
+
{formatDate(item.created_at)}
@@ -497,13 +505,13 @@ function DeleteConfirmModal({
{deleting ? (
-
+
) : (
"Delete"
)}
@@ -543,7 +551,7 @@ function FormActions({
disabled={submitting || disabled}
>
{submitting ? (
-
+
) : (
submitLabel
)}
diff --git a/frontend/apps/artcraft-webapp/src/components/settings-modal/SettingsModal.tsx b/frontend/apps/artcraft-webapp/src/components/settings-modal/SettingsModal.tsx
index 038f5bcc4c..82c0f2abe1 100644
--- a/frontend/apps/artcraft-webapp/src/components/settings-modal/SettingsModal.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/settings-modal/SettingsModal.tsx
@@ -44,7 +44,9 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
- Settings
+
+ Settings
+
@@ -53,8 +55,10 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
key={t.id}
onClick={() => setTab(t.id)}
className={twMerge(
- "h-9 shrink-0 rounded-lg px-3 text-left transition-colors sm:w-full sm:px-2",
- tab === t.id ? "bg-[#63636B]/20" : "hover:bg-white/[0.04]",
+ "h-9 shrink-0 px-3 text-left transition-colors sm:w-full sm:px-2",
+ tab === t.id
+ ? "bg-white/10 text-white"
+ : "text-white/70 hover:bg-white/[0.06] hover:text-white",
)}
>
@@ -68,7 +72,9 @@ export function SettingsModal({ isOpen, onClose }: SettingsModalProps) {
- {activeLabel}
+
+ {activeLabel}
+
{tab === "general" && }
@@ -94,7 +100,9 @@ function GeneralPanel() {
- Enter to generate
+
+ Enter to generate
+
When on, pressing Enter submits the prompt and Shift+Enter adds a
new line. When off (default), both Enter and Shift+Enter add a new
@@ -109,7 +117,9 @@ function GeneralPanel() {
- Play videos with sound
+
+ Play videos with sound
+
When on (default), videos in the media viewer start unmuted so you
don't have to click unmute every time. When off, they start muted.
@@ -123,7 +133,9 @@ function GeneralPanel() {
- Group models by family
+
+ Group models by family
+
When on (default), the model picker groups models into submenus by
family, like Seedance or Veo. When off, every model shows in one
diff --git a/frontend/apps/artcraft-webapp/src/components/sidebar/app-sidebar.tsx b/frontend/apps/artcraft-webapp/src/components/sidebar/app-sidebar.tsx
index 341ad5fbcf..bf78e7b09d 100644
--- a/frontend/apps/artcraft-webapp/src/components/sidebar/app-sidebar.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/sidebar/app-sidebar.tsx
@@ -1,7 +1,24 @@
import { useMemo } from "react";
import { Link, useLocation } from "react-router-dom";
import { motion, useReducedMotion } from "framer-motion";
-import { BoxIcon, CircleHelpIcon, DownloadIcon, FilmIcon, GiftIcon, GlobeIcon, GraduationCapIcon, GroupIcon, HouseIcon, ImageIcon, ImagesIcon, MusicIcon, NewspaperIcon, PencilIcon, VideoIcon, WandSparklesIcon } from "lucide-react";
+import {
+ BoxIcon,
+ CircleHelpIcon,
+ DownloadIcon,
+ FilmIcon,
+ GiftIcon,
+ GlobeIcon,
+ GraduationCapIcon,
+ GroupIcon,
+ HouseIcon,
+ ImageIcon,
+ ImagesIcon,
+ MusicIcon,
+ NewspaperIcon,
+ PencilIcon,
+ VideoIcon,
+ WandSparklesIcon,
+} from "lucide-react";
import type { LucideIcon } from "lucide-react";
import { DynamicIcon, DiscordIcon } from "@storyteller/icons";
import { Button } from "@storyteller/ui-button";
@@ -33,7 +50,9 @@ type NavItem = {
badge?: string;
};
-const PRIMARY_ITEMS: NavItem[] = [{ label: "Home", href: "/", icon: HouseIcon }];
+const PRIMARY_ITEMS: NavItem[] = [
+ { label: "Home", href: "/", icon: HouseIcon },
+];
// Generation entries — make something from a prompt.
const CREATE_ITEMS_STATIC: NavItem[] = [
@@ -150,13 +169,15 @@ function NavMenuItem({
interactive, kept subtle to stay within the "restrained chrome" lane. */}
{item.label}
{item.badge && (
{item.badge}
@@ -173,7 +194,7 @@ function NavMenuItem({
{active && (
@@ -318,7 +339,7 @@ export function AppSidebar() {
onClick={() =>
window.open(DOWNLOAD_URL, "_blank", "noopener,noreferrer")
}
- className="w-full justify-center h-9 text-sm font-semibold rounded-full"
+ className="w-full justify-center h-9"
>
Download ArtCraft
diff --git a/frontend/apps/artcraft-webapp/src/components/sidebar/library-folders-nav.tsx b/frontend/apps/artcraft-webapp/src/components/sidebar/library-folders-nav.tsx
index e5bae76eed..a8682e6a3c 100644
--- a/frontend/apps/artcraft-webapp/src/components/sidebar/library-folders-nav.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/sidebar/library-folders-nav.tsx
@@ -81,7 +81,7 @@ export function LibraryFoldersNav({
type="button"
onClick={() => openNewFolderModal(null)}
aria-label="New folder"
- className="mr-1 flex h-5 w-5 items-center justify-center rounded text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
+ className="mr-1 flex h-5 w-5 items-center justify-center text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
>
@@ -125,7 +125,7 @@ export function LibraryFoldersNav({
type="button"
onClick={() => setExpanded((v) => !v)}
aria-label={expanded ? "Collapse folders" : "Expand folders"}
- className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center rounded text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
+ className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
>
setExpanded((v) => !v)}
aria-label={expanded ? "Collapse tags" : "Expand tags"}
- className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center rounded text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
+ className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center text-sidebar-foreground/50 hover:bg-sidebar-accent hover:text-sidebar-foreground transition-colors group-data-[collapsible=icon]:hidden"
>
{tag.value}
@@ -123,7 +123,7 @@ export function LibraryTagsNav({
});
}}
aria-label={`Options for tag "${tag.value}"`}
- className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center rounded text-sidebar-foreground/50 opacity-0 transition-opacity group-hover/menu-item:opacity-100 hover:bg-sidebar-accent hover:text-sidebar-foreground"
+ className="absolute right-1 top-1/2 -translate-y-1/2 flex h-5 w-5 items-center justify-center text-sidebar-foreground/50 opacity-0 transition-opacity group-hover/menu-item:opacity-100 hover:bg-sidebar-accent hover:text-sidebar-foreground"
>
diff --git a/frontend/apps/artcraft-webapp/src/components/sidebar/mobile-bottom-nav.tsx b/frontend/apps/artcraft-webapp/src/components/sidebar/mobile-bottom-nav.tsx
index 9078d12ec9..5d0b64b11e 100644
--- a/frontend/apps/artcraft-webapp/src/components/sidebar/mobile-bottom-nav.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/sidebar/mobile-bottom-nav.tsx
@@ -32,10 +32,8 @@ export function MobileBottomNav() {
key={item.href}
to={item.href}
className={twMerge(
- "flex flex-1 flex-col items-center justify-center gap-1 py-2 text-[11px] font-medium transition-colors active:scale-95",
- active
- ? "text-primary"
- : "text-base-fg/55 hover:text-base-fg/80",
+ "flex flex-1 flex-col items-center justify-center gap-1 py-2 font-mono text-[10px] font-semibold uppercase tracking-[0.12em] transition-colors",
+ active ? "text-white" : "text-base-fg/55 hover:text-base-fg/80",
)}
>
diff --git a/frontend/apps/artcraft-webapp/src/components/signup-cta-modal.tsx b/frontend/apps/artcraft-webapp/src/components/signup-cta-modal.tsx
index 021493ce62..bf1c3aabc7 100644
--- a/frontend/apps/artcraft-webapp/src/components/signup-cta-modal.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/signup-cta-modal.tsx
@@ -72,7 +72,7 @@ export function SignupCtaModal() {
- {/* Off-center ambient glow, feels designed, not generic */}
-
-
-
Start crafting in seconds.
@@ -105,10 +95,8 @@ export function SignupCtaModal() {
key={perk}
className="flex items-start gap-3 text-[14px] text-white/75"
>
-
-
+
+
{perk}
@@ -117,16 +105,13 @@ export function SignupCtaModal() {
{error && (
-
+
{error}
)}
-
+
Create account with email
@@ -135,7 +120,7 @@ export function SignupCtaModal() {
-
+
or
diff --git a/frontend/apps/artcraft-webapp/src/components/toast/toast.tsx b/frontend/apps/artcraft-webapp/src/components/toast/toast.tsx
index a8cd63b7df..22f0a24cbd 100644
--- a/frontend/apps/artcraft-webapp/src/components/toast/toast.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/toast/toast.tsx
@@ -88,10 +88,10 @@ export const ToastContainer = () => {
{toasts.map((toast) => (
@@ -107,7 +107,7 @@ export const ToastContainer = () => {
onClick={() => dismiss(toast.id)}
className="ml-1 text-white/40 transition-colors hover:text-white/80"
>
-
+
))}
diff --git a/frontend/apps/artcraft-webapp/src/components/topbar/ActiveSceneTitle.tsx b/frontend/apps/artcraft-webapp/src/components/topbar/ActiveSceneTitle.tsx
index 3febdad5cf..a86adcb67b 100644
--- a/frontend/apps/artcraft-webapp/src/components/topbar/ActiveSceneTitle.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/topbar/ActiveSceneTitle.tsx
@@ -121,7 +121,7 @@ export function ActiveSceneTitle() {
onClick={startEdit}
title="Rename scene"
aria-label="Rename scene"
- className="flex min-w-0 max-w-[280px] items-center rounded-lg border border-transparent px-3 py-1.5 text-sm font-semibold text-white transition-all hover:cursor-text hover:bg-white/[0.08]"
+ className="flex min-w-0 max-w-[280px] items-center border border-transparent px-3 py-1.5 text-sm font-semibold text-white transition-colors hover:cursor-text hover:bg-white/10"
>
{title}
) : (
-
+
{title}
)}
@@ -157,8 +157,8 @@ export function ActiveSceneTitle() {
disabled={isSubmitting}
maxLength={120}
className={twMerge(
- "h-[34px] w-fit max-w-full rounded-lg border border-white/[0.12] bg-white/[0.04] px-3 text-sm font-semibold text-white outline-none focus:outline focus:outline-2 focus:outline-brand-primary",
- isSubmitting && "outline outline-2 outline-brand-secondary",
+ "h-[34px] w-fit max-w-full border border-white/15 bg-ui-controls px-3 text-sm font-semibold text-white outline-none focus:outline focus:outline-1 focus:outline-white/60",
+ isSubmitting && "outline outline-1 outline-white/30",
!isValid && "border-danger focus:outline-danger focus:outline-2",
)}
/>
diff --git a/frontend/apps/artcraft-webapp/src/components/topbar/TopBarActions.tsx b/frontend/apps/artcraft-webapp/src/components/topbar/TopBarActions.tsx
index 3c55b60f43..6d27348943 100644
--- a/frontend/apps/artcraft-webapp/src/components/topbar/TopBarActions.tsx
+++ b/frontend/apps/artcraft-webapp/src/components/topbar/TopBarActions.tsx
@@ -14,7 +14,14 @@ import {
Transition,
} from "@headlessui/react";
import { twMerge } from "tailwind-merge";
-import { CoinsIcon, GemIcon, GiftIcon, ImagesIcon, LifeBuoyIcon, SettingsIcon } from "lucide-react";
+import {
+ CoinsIcon,
+ GemIcon,
+ GiftIcon,
+ ImagesIcon,
+ LifeBuoyIcon,
+ SettingsIcon,
+} from "lucide-react";
import { DiscordIcon } from "@storyteller/icons";
import { Button } from "@storyteller/ui-button";
import { PopoverMenu } from "@storyteller/ui-popover";
@@ -99,9 +106,9 @@ export function TopBarActions({ className }: { className?: string }) {
<>
-
+
Pricing
@@ -118,7 +125,7 @@ export function TopBarActions({ className }: { className?: string }) {
variant="primary"
icon={GemIcon}
onClick={() => navigate("/pricing")}
- className="h-8 px-3 text-sm font-semibold rounded-lg"
+ className="h-8 px-3"
>
Upgrade
@@ -128,14 +135,14 @@ export function TopBarActions({ className }: { className?: string }) {
-
+
My Library