diff --git a/app/globals.css b/app/globals.css index 9ca2d70..6def69c 100644 --- a/app/globals.css +++ b/app/globals.css @@ -12,11 +12,20 @@ --accent: #4f7a58; --accent-soft: #dbe6dd; --accent-ink: #2f5d35; + --danger: #e11d48; + --danger-hover: #be123c; + --danger-contrast: #fff8fb; --danger-soft: rgba(190, 24, 93, 0.08); --danger-ink: #be123c; --danger-line: rgba(190, 24, 93, 0.24); --line: rgba(23, 23, 23, 0.08); --line-strong: rgba(23, 23, 23, 0.14); + --shadow-surface: 0 22px 60px rgba(15, 23, 42, 0.08); + --shadow-elevated: 0 18px 44px rgba(15, 23, 42, 0.08); + --shadow-button: 0 16px 40px rgba(15, 23, 42, 0.18); + --shadow-button-hover: 0 20px 48px rgba(15, 23, 42, 0.24); + --shadow-toast: 0 18px 50px rgba(15, 23, 42, 0.12); + --shadow-accent: 0 16px 40px rgba(79, 122, 88, 0.1); } :root[data-theme="dark"] { @@ -31,11 +40,20 @@ --accent: #8db896; --accent-soft: rgba(141, 184, 150, 0.16); --accent-ink: #d7ecd9; + --danger: #ff6b93; + --danger-hover: #ff5b88; + --danger-contrast: #220710; --danger-soft: rgba(190, 24, 93, 0.16); --danger-ink: #ffb3c7; --danger-line: rgba(255, 179, 199, 0.28); --line: rgba(255, 255, 255, 0.1); --line-strong: rgba(255, 255, 255, 0.18); + --shadow-surface: 0 22px 60px rgba(0, 0, 0, 0.24); + --shadow-elevated: 0 18px 44px rgba(0, 0, 0, 0.22); + --shadow-button: 0 16px 40px rgba(0, 0, 0, 0.32); + --shadow-button-hover: 0 20px 48px rgba(0, 0, 0, 0.4); + --shadow-toast: 0 18px 50px rgba(0, 0, 0, 0.28); + --shadow-accent: 0 16px 40px rgba(79, 122, 88, 0.22); color-scheme: dark; } diff --git a/components/dashboard-form-browser.tsx b/components/dashboard-form-browser.tsx index e4352cb..526a5e5 100644 --- a/components/dashboard-form-browser.tsx +++ b/components/dashboard-form-browser.tsx @@ -6,10 +6,10 @@ import { ArrowDown, ArrowUp, LayoutGrid, Plus, TableProperties } from "lucide-re import { useEffect, useMemo, useState } from "react"; import { createFormAction } from "@/app/(creator)/actions"; -import { Badge } from "@/components/ui/badge"; +import { FormStatusBadge } from "@/components/form-status-badge"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; -import type { FormListItem } from "@/lib/forms"; +import type { FormListItem } from "@/lib/form-types"; import { cn, formatDate } from "@/lib/utils"; type DashboardView = "grid" | "table"; @@ -155,9 +155,7 @@ export function DashboardFormBrowser({ forms }: { forms: FormListItem[] }) {

{form.title}

- - {form.status === "PUBLISHED" ? "Published" : "Draft"} - +

{form.description || "No description yet."}

@@ -228,9 +226,7 @@ export function DashboardFormBrowser({ forms }: { forms: FormListItem[] }) { - - {form.status === "PUBLISHED" ? "Published" : "Draft"} - + {form.responseCount} {formatDate(form.updatedAt)} diff --git a/components/form-builder-panels.tsx b/components/form-builder-panels.tsx new file mode 100644 index 0000000..c1a5692 --- /dev/null +++ b/components/form-builder-panels.tsx @@ -0,0 +1,304 @@ +import { Copy, Link as LinkIcon, LoaderCircle, MessagesSquare, Plus, Save, Settings2, Trash2, type LucideIcon } from "lucide-react"; +import Link from "next/link"; +import type { Dispatch, SetStateAction } from "react"; + +import { FormStatusBadge } from "@/components/form-status-badge"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { + blockTypeLabels, + isQuestionBlock, + type BlockConfig, + type ChoiceBlockConfig, + type LongTextBlockConfig, + type ShortTextBlockConfig, + type TextBlockConfig, +} from "@/lib/blocks"; +import type { BuilderBlock, BuilderForm } from "@/lib/form-types"; + +export type FormMetadataDraft = { + title: string; + description: string; + completionTitle: string; + completionMessage: string; + completionLinkLabel: string; + completionLinkUrl: string; + slug: string; +}; + +export function BuilderHeader({ + form, + settingsSelected, + busy, + onOpenSettings, + onTogglePublished, +}: { + form: BuilderForm; + settingsSelected: boolean; + busy: string | null; + onOpenSettings: () => void; + onTogglePublished: () => void; +}) { + return ( +
+
+

Builder

+
+

{form.title}

+ +
+

Edit blocks, update settings, and review responses.

+
+
+ + + + + +
+
+ ); +} + +export function FormSettingsPanel({ + metadataDraft, + setMetadataDraft, + shareHref, + copyShareLink, + deleteForm, + saveMetadata, + busy, +}: { + metadataDraft: FormMetadataDraft; + setMetadataDraft: Dispatch>; + shareHref: string; + copyShareLink: () => void; + deleteForm: () => void; + saveMetadata: () => void; + busy: string | null; +}) { + return ( +
+
+

Settings

+
+ +
+ +