+
+
+
+ Exit creator
+
+ {saved ? (
+
+
+ Saved
+
+ ) : (
+ Saving…
+ )}
+
+
+
+
+ {data.basics.title || "Create a quest"}
+
+
+
+
+
+ {currentIndex === 0 ? (
+
+ setData((prev) => ({ ...prev, basics: { ...prev.basics, ...patch } }))
+ }
+ />
+ ) : null}
+ {currentIndex === 1 ? (
+
+ setData((prev) => ({
+ ...prev,
+ eligibility: { ...prev.eligibility, ...patch },
+ }))
+ }
+ />
+ ) : null}
+ {currentIndex === 2 ? (
+ setData((prev) => ({ ...prev, tasks }))}
+ />
+ ) : null}
+ {currentIndex === 3 ? (
+
+ setData((prev) => ({ ...prev, rewards: { ...prev.rewards, ...patch } }))
+ }
+ />
+ ) : null}
+ {currentIndex === 4 ? (
+
+ setData((prev) => ({ ...prev, schedule: { ...prev.schedule, ...patch } }))
+ }
+ />
+ ) : null}
+ {currentIndex === 5 ? : null}
+
+
+
setShowPreview(true)}
+ onSaveDraft={handleSaveDraft}
+ onContinue={handleContinue}
+ />
+
+ {showPreview ? (
+ setShowPreview(false)} />
+ ) : null}
+
+ );
+}
diff --git a/frontend/src/components/creator/quests/wizard/WizardFooter.tsx b/frontend/src/components/creator/quests/wizard/WizardFooter.tsx
new file mode 100644
index 0000000..d1575ba
--- /dev/null
+++ b/frontend/src/components/creator/quests/wizard/WizardFooter.tsx
@@ -0,0 +1,63 @@
+import { ArrowRight, Eye, Save } from "lucide-react";
+
+export default function WizardFooter({
+ isFirstStep,
+ isLastStep,
+ canContinue,
+ onBack,
+ onPreview,
+ onSaveDraft,
+ onContinue,
+}: {
+ isFirstStep: boolean;
+ isLastStep: boolean;
+ canContinue: boolean;
+ onBack: () => void;
+ onPreview: () => void;
+ onSaveDraft: () => void;
+ onContinue: () => void;
+}) {
+ return (
+
+ {WIZARD_STEPS.map((step, index) => {
+ const isCompleted = index < maxReachedIndex;
+ const isCurrent = index === currentIndex;
+ const isReachable = index <= maxReachedIndex;
+
+ return (
+
+ {index > 0 ? (
+
+ ) : null}
+
+
+ );
+ })}
+
+ );
+}
diff --git a/frontend/src/components/creator/quests/wizard/fields.tsx b/frontend/src/components/creator/quests/wizard/fields.tsx
new file mode 100644
index 0000000..65ac93b
--- /dev/null
+++ b/frontend/src/components/creator/quests/wizard/fields.tsx
@@ -0,0 +1,238 @@
+import { ChevronDown, ChevronUp, Check } from "lucide-react";
+
+const INPUT_CLASSES =
+ "w-full rounded-lg border border-white/10 bg-[#100D1C] px-3 py-2.5 text-sm text-white placeholder:text-white/30 outline-none transition-colors focus:border-[#8B5CF6]/60";
+
+export function FieldLabel({
+ children,
+ htmlFor,
+ hint,
+}: {
+ children: React.ReactNode;
+ htmlFor?: string;
+ hint?: string;
+}) {
+ return (
+