diff --git a/src/app/chain/page.tsx b/src/app/chain/page.tsx
index 1a13f2f0..3737958c 100644
--- a/src/app/chain/page.tsx
+++ b/src/app/chain/page.tsx
@@ -52,9 +52,11 @@ export default function ChainPlotPage() {
const { state, error, chainPlot, reset } = useChainPlot();
const { valid, charCount } = validateContentLength(content);
+ const titleValid = title.trim().length > 0;
const canSubmit =
(state === "idle" || state === "error") &&
storylineId !== null &&
+ titleValid &&
valid;
if (!isConnected) {
@@ -139,18 +141,25 @@ export default function ChainPlotPage() {
{/* Chapter title */}
setTitle(e.target.value.slice(0, 100))}
disabled={busy || noStoryline}
- placeholder={noStoryline ? "Select a storyline first" : "e.g. The Awakening"}
+ placeholder={noStoryline ? "Select a storyline first" : "e.g. The Silent Storm"}
maxLength={100}
className="border-border bg-surface text-foreground placeholder:text-muted w-full rounded border px-3 py-2 text-sm focus:border-accent focus:outline-none disabled:opacity-50"
/>
-
{title.length}/100
+
+ {!titleValid && content.length > 0 ? (
+ Title is required
+ ) : (
+
+ )}
+ {title.length} / 100 chars
+
{/* Content */}