Index: chapterx-frontend/src/pages/LandingPage.tsx
===================================================================
--- chapterx-frontend/src/pages/LandingPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/LandingPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,181 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Feather, Star, BookOpen, Users, Sparkles, ArrowRight, ChevronRight } from 'lucide-react'
+import logo from '../assets/chapterX-removebg-preview.png'
+import { useStoryStore } from '../store/storyStore'
+import { useAuthStore } from '../store/authStore'
+import { Button } from '../components/ui/Button'
+import { StoryCard } from '../components/ui/StoryCard'
+import { GenreBadge } from '../components/ui/Badge'
+
+const features = [
+  { icon: <BookOpen size={24} className="text-indigo-400" />, title: 'Read & Discover', desc: 'Explore thousands of stories across every genre. From fantasy epics to contemporary fiction.' },
+  { icon: <Feather size={24} className="text-violet-400" />, title: 'Write & Publish', desc: 'Share your stories with a passionate community. Get feedback, likes, and readers from day one.' },
+  { icon: <Users size={24} className="text-amber-400" />, title: 'Collaborate', desc: 'Invite co-authors, editors, and beta readers. Build stories together with real-time collaboration.' },
+  { icon: <Sparkles size={24} className="text-emerald-400" />, title: 'AI Assistance', desc: 'Get intelligent writing suggestions for grammar, style, plot, and pacing to improve your craft.' },
+]
+
+const genres = ['Fantasy', 'Sci-Fi', 'Romance', 'Historical Fiction', 'Adventure', 'Thriller', 'Mystery', 'Horror']
+
+export const LandingPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { stories } = useStoryStore()
+  const { currentUser } = useAuthStore()
+
+  const trending = stories.filter(s => s.status === 'published').slice(0, 4)
+
+  return (
+    <div className="min-h-screen">
+      {/* Hero */}
+      <section className="relative overflow-hidden py-20 sm:py-32">
+        <div className="absolute inset-0 bg-gradient-to-br from-indigo-950/50 via-slate-950 to-violet-950/30" />
+        <div className="absolute top-20 left-10 w-72 h-72 bg-indigo-600/10 rounded-full blur-3xl" />
+        <div className="absolute bottom-10 right-10 w-96 h-96 bg-violet-600/10 rounded-full blur-3xl" />
+
+        <div className="relative max-w-7xl mx-auto px-4 text-center">
+          <div className="inline-flex items-center gap-2 px-4 py-2 rounded-full glass text-sm text-indigo-300 mb-8 border border-indigo-500/20">
+            <Star size={14} className="text-amber-400 fill-amber-400" />
+            The collaborative storytelling platform
+          </div>
+
+          <div className="flex justify-center mb-6">
+            <img src={logo} alt="ChapterX" className="h-32 w-32 object-contain" />
+          </div>
+
+          <h1 className="font-serif text-5xl sm:text-6xl lg:text-7xl font-bold text-white mb-6 leading-tight">
+            Write Your Own Story.
+            <br />
+            <span className="bg-gradient-to-r from-indigo-400 via-violet-400 to-purple-400 bg-clip-text text-transparent">
+              Anyone Could Be Shakespeare.
+            </span>
+          </h1>
+
+          <p className="text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
+            ChapterX is where writers and readers connect. Publish your stories, collaborate with others,
+            and discover your next great read.
+          </p>
+
+          <div className="flex flex-col sm:flex-row items-center justify-center gap-4">
+            {currentUser ? (
+              <>
+                <Button size="lg" onClick={() => navigate('/browse')}>
+                  <BookOpen size={18} />
+                  Browse Stories
+                  <ArrowRight size={16} />
+                </Button>
+                {(currentUser.role === 'writer' || currentUser.role === 'admin') && (
+                  <Button size="lg" variant="secondary" onClick={() => navigate('/writer/create-story')}>
+                    <Feather size={18} />
+                    Start Writing
+                  </Button>
+                )}
+              </>
+            ) : (
+              <>
+                <Button size="lg" onClick={() => navigate('/register')}>
+                  Get Started Free
+                  <ArrowRight size={16} />
+                </Button>
+                <Button size="lg" variant="ghost" onClick={() => navigate('/browse')}>
+                  Browse Stories
+                </Button>
+              </>
+            )}
+          </div>
+
+        </div>
+      </section>
+
+      {/* Features */}
+      <section className="py-20 max-w-7xl mx-auto px-4">
+        <div className="text-center mb-12">
+          <h2 className="font-serif text-3xl sm:text-4xl font-bold text-white mb-4">
+            Everything You Need
+          </h2>
+          <p className="text-slate-400 max-w-xl mx-auto">
+            A complete platform for creative writing and reading.
+          </p>
+        </div>
+        <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
+          {features.map(f => (
+            <div key={f.title} className="glass rounded-2xl p-6 hover:border-indigo-500/30 transition-all duration-300 hover:-translate-y-1">
+              <div className="w-12 h-12 rounded-xl bg-slate-800 flex items-center justify-center mb-4">
+                {f.icon}
+              </div>
+              <h3 className="font-serif font-semibold text-white mb-2">{f.title}</h3>
+              <p className="text-slate-400 text-sm leading-relaxed">{f.desc}</p>
+            </div>
+          ))}
+        </div>
+      </section>
+
+      {/* Genres */}
+      <section className="py-16 bg-slate-900/50">
+        <div className="max-w-7xl mx-auto px-4">
+          <div className="flex items-center justify-between mb-8">
+            <h2 className="font-serif text-2xl font-bold text-white">Explore Genres</h2>
+            <button onClick={() => navigate('/genres')} className="text-indigo-400 hover:text-indigo-300 text-sm flex items-center gap-1">
+              See all <ChevronRight size={14} />
+            </button>
+          </div>
+          <div className="flex flex-wrap gap-3">
+            {genres.map(g => (
+              <button
+                key={g}
+                onClick={() => navigate(`/genres/${g.toLowerCase().replace(' ', '-')}`)}
+                className="transition-transform hover:scale-105"
+              >
+                <GenreBadge genre={g} />
+              </button>
+            ))}
+          </div>
+        </div>
+      </section>
+
+      {/* Trending stories */}
+      <section className="py-20 max-w-7xl mx-auto px-4">
+        <div className="flex items-center justify-between mb-8">
+          <div>
+            <h2 className="font-serif text-2xl font-bold text-white">Trending Stories</h2>
+            <p className="text-slate-500 text-sm mt-1">Most popular right now</p>
+          </div>
+          <Button variant="ghost" size="sm" onClick={() => navigate('/browse')}>
+            View all
+            <ChevronRight size={14} />
+          </Button>
+        </div>
+        <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
+          {trending.map(story => (
+            <StoryCard key={story.story_id} story={story} />
+          ))}
+        </div>
+      </section>
+
+      {/* CTA */}
+      {!currentUser && (
+        <section className="py-20">
+          <div className="max-w-3xl mx-auto px-4 text-center">
+            <div className="glass rounded-3xl p-12 border border-indigo-500/20">
+              <h2 className="font-serif text-3xl font-bold text-white mb-4">
+                Ready to Begin Your Story?
+              </h2>
+              <p className="text-slate-400 mb-8">
+                Join thousands of writers and readers on ChapterX today.
+              </p>
+              <div className="flex flex-col sm:flex-row gap-4 justify-center">
+                <Button size="lg" onClick={() => navigate('/register')}>
+                  <Feather size={18} />
+                  Start Writing
+                </Button>
+                <Button size="lg" variant="secondary" onClick={() => navigate('/browse')}>
+                  <BookOpen size={18} />
+                  Just Browse
+                </Button>
+              </div>
+            </div>
+          </div>
+        </section>
+      )}
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/NotificationsPage.tsx
===================================================================
--- chapterx-frontend/src/pages/NotificationsPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/NotificationsPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,105 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Bell, Heart, MessageCircle, Users, Settings, Check, ExternalLink } from 'lucide-react'
+import { useNotificationStore } from '../store/notificationStore'
+import { useAuthStore } from '../store/authStore'
+import { Button } from '../components/ui/Button'
+import { NotificationType } from '../types'
+
+const typeIcon = (type: NotificationType) => {
+  switch (type) {
+    case 'like': return <Heart size={16} className="text-rose-400" />
+    case 'comment': return <MessageCircle size={16} className="text-blue-400" />
+    case 'collaboration': return <Users size={16} className="text-violet-400" />
+    case 'system': return <Settings size={16} className="text-slate-400" />
+    default: return <Bell size={16} className="text-slate-400" />
+  }
+}
+
+function formatDate(str: string) {
+  return new Date(str).toLocaleDateString('en-US', {
+    month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit',
+  })
+}
+
+export const NotificationsPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { notifications, markAllRead, markRead } = useNotificationStore()
+
+  if (!currentUser) {
+    return (
+      <div className="max-w-2xl mx-auto px-4 py-20 text-center">
+        <Bell size={48} className="mx-auto mb-4 text-slate-600" />
+        <h2 className="text-2xl text-white mb-4">Sign in to view notifications</h2>
+        <Button onClick={() => navigate('/login')}>Sign In</Button>
+      </div>
+    )
+  }
+
+  const userNotifications = notifications
+  const unread = userNotifications.filter(n => !n.is_read)
+
+  return (
+    <div className="max-w-2xl mx-auto px-4 py-8">
+      <div className="flex items-center justify-between mb-8">
+        <div>
+          <h1 className="font-serif text-2xl font-bold text-white">Notifications</h1>
+          {unread.length > 0 && (
+            <p className="text-slate-400 text-sm mt-1">{unread.length} unread</p>
+          )}
+        </div>
+        {unread.length > 0 && (
+          <Button variant="ghost" size="sm" onClick={markAllRead}>
+            <Check size={14} />
+            Mark all read
+          </Button>
+        )}
+      </div>
+
+      {userNotifications.length === 0 ? (
+        <div className="text-center py-16 text-slate-500">
+          <Bell size={48} className="mx-auto mb-4 opacity-40" />
+          <p className="text-lg font-medium">No notifications yet</p>
+          <p className="text-sm mt-1">You'll see activity here when readers interact with your content.</p>
+        </div>
+      ) : (
+        <div className="space-y-2">
+          {userNotifications.map(n => (
+            <div
+              key={n.notification_id}
+              className={`flex gap-4 p-4 rounded-2xl border transition-colors cursor-pointer ${
+                !n.is_read
+                  ? 'bg-indigo-500/5 border-indigo-500/20 hover:bg-indigo-500/10'
+                  : 'bg-slate-800 border-slate-700 hover:bg-slate-700/50'
+              }`}
+              onClick={() => {
+                markRead(n.notification_id)
+                if (n.link) navigate(n.link)
+              }}
+            >
+              <div className="w-10 h-10 rounded-full bg-slate-700 flex items-center justify-center flex-shrink-0">
+                {typeIcon(n.type)}
+              </div>
+              <div className="flex-1 min-w-0">
+                <div className="flex items-start justify-between gap-2">
+                  <p className="text-white text-sm font-medium">{n.title}</p>
+                  <div className="flex items-center gap-2 flex-shrink-0">
+                    {!n.is_read && (
+                      <div className="w-2 h-2 rounded-full bg-indigo-400" />
+                    )}
+                    {n.link && (
+                      <ExternalLink size={12} className="text-slate-600" />
+                    )}
+                  </div>
+                </div>
+                <p className="text-slate-400 text-sm mt-0.5 leading-relaxed">{n.message}</p>
+                <p className="text-slate-600 text-xs mt-2">{formatDate(n.created_at)}</p>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/admin/AdminContentPage.tsx
===================================================================
--- chapterx-frontend/src/pages/admin/AdminContentPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/admin/AdminContentPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,32 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { ArrowLeft, BookOpen } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { ContentModerationTable } from '../../components/admin/ContentModerationTable'
+
+export const AdminContentPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { stories } = useStoryStore()
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      <div className="flex items-center gap-3 mb-8">
+        <button onClick={() => navigate('/admin')} className="text-slate-400 hover:text-white transition-colors">
+          <ArrowLeft size={20} />
+        </button>
+        <div>
+          <h1 className="font-serif text-2xl font-bold text-white">Content Moderation</h1>
+          <p className="text-slate-400 text-sm mt-0.5">{stories.length} total stories</p>
+        </div>
+      </div>
+
+      <div className="bg-slate-900 border border-slate-700 rounded-2xl p-6">
+        <div className="flex items-center gap-2 mb-6">
+          <BookOpen size={18} className="text-violet-400" />
+          <h2 className="text-white font-semibold">All Stories</h2>
+        </div>
+        <ContentModerationTable />
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/admin/AdminDashboard.tsx
===================================================================
--- chapterx-frontend/src/pages/admin/AdminDashboard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/admin/AdminDashboard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,130 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Shield, Users, BookOpen, AlertTriangle, Settings, ChevronRight } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { PlatformStats } from '../../components/admin/PlatformStats'
+import { Button } from '../../components/ui/Button'
+import { RoleBadge } from '../../components/ui/Badge'
+import { Avatar } from '../../components/ui/Avatar'
+
+function timeAgo(str: string): string {
+  const diff = Date.now() - new Date(str).getTime()
+  const m = Math.floor(diff / 60000)
+  if (m < 1) return 'just now'
+  if (m < 60) return `${m}m ago`
+  const h = Math.floor(m / 60)
+  if (h < 24) return `${h}h ago`
+  return `${Math.floor(h / 24)}d ago`
+}
+
+export const AdminDashboard: React.FC = () => {
+  const navigate = useNavigate()
+  const { allUsers } = useAuthStore()
+  const { stories } = useStoryStore()
+  const { notifications } = useNotificationStore()
+
+  const recentUsers = [...allUsers].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()).slice(0, 5)
+  const recentStories = [...stories].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()).slice(0, 5)
+
+  const adminLinks = [
+    { to: '/admin/users', icon: <Users size={20} className="text-blue-400" />, label: 'Manage Users', desc: `${allUsers.length} registered users`, color: 'bg-blue-500/10 border-blue-500/20' },
+    { to: '/admin/content', icon: <BookOpen size={20} className="text-violet-400" />, label: 'Content Moderation', desc: `${stories.length} total stories`, color: 'bg-violet-500/10 border-violet-500/20' },
+    { to: '/admin/genres', icon: <Settings size={20} className="text-amber-400" />, label: 'Manage Genres', desc: 'Add or remove genres', color: 'bg-amber-500/10 border-amber-500/20' },
+  ]
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="flex items-center gap-3 mb-8">
+        <div className="w-10 h-10 rounded-xl bg-rose-500/20 flex items-center justify-center">
+          <Shield size={20} className="text-rose-400" />
+        </div>
+        <div>
+          <h1 className="font-serif text-3xl font-bold text-white">Admin Dashboard</h1>
+          <p className="text-slate-400 text-sm mt-0.5">Platform management and moderation</p>
+        </div>
+      </div>
+
+      {/* Platform stats */}
+      <div className="mb-8">
+        <h2 className="font-serif text-xl font-bold text-white mb-4">Platform Overview</h2>
+        <PlatformStats />
+      </div>
+
+      {/* Quick links */}
+      <div className="grid grid-cols-1 sm:grid-cols-3 gap-4 mb-8">
+        {adminLinks.map(link => (
+          <button
+            key={link.to}
+            onClick={() => navigate(link.to)}
+            className={`flex items-center gap-4 p-5 rounded-2xl border ${link.color} hover:scale-105 transition-all group text-left`}
+          >
+            <div className="w-12 h-12 rounded-xl bg-slate-800 flex items-center justify-center">
+              {link.icon}
+            </div>
+            <div className="flex-1">
+              <p className="text-white font-semibold">{link.label}</p>
+              <p className="text-slate-400 text-sm">{link.desc}</p>
+            </div>
+            <ChevronRight size={16} className="text-slate-500 group-hover:text-white transition-colors" />
+          </button>
+        ))}
+      </div>
+
+      <div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
+        {/* Recent users */}
+        <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+          <div className="flex items-center justify-between mb-4">
+            <h3 className="font-serif text-lg font-bold text-white">Recent Users</h3>
+            <Button size="sm" variant="ghost" onClick={() => navigate('/admin/users')}>
+              View all <ChevronRight size={14} />
+            </Button>
+          </div>
+          <div className="space-y-3">
+            {recentUsers.map(user => (
+              <div key={user.user_id} className="flex items-center gap-3">
+                <Avatar name={user.name} size="sm" />
+                <div className="flex-1 min-w-0">
+                  <p className="text-white text-sm font-medium">{user.name} {user.surname}</p>
+                  <p className="text-slate-500 text-xs">@{user.username}</p>
+                </div>
+                <RoleBadge role={user.role} />
+              </div>
+            ))}
+          </div>
+        </div>
+
+        {/* Recent stories */}
+        <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+          <div className="flex items-center justify-between mb-4">
+            <h3 className="font-serif text-lg font-bold text-white">Recent Stories</h3>
+            <Button size="sm" variant="ghost" onClick={() => navigate('/admin/content')}>
+              View all <ChevronRight size={14} />
+            </Button>
+          </div>
+          <div className="space-y-3">
+            {recentStories.map(story => (
+              <div key={story.story_id} className="flex items-center gap-3">
+                <div className="flex-1 min-w-0">
+                  <p className="text-white text-sm font-medium truncate">{story.title}</p>
+                  <p className="text-slate-500 text-xs">by @{story.author_username}</p>
+                </div>
+                <span className={`text-xs px-2 py-0.5 rounded-full ${
+                  story.status === 'published'
+                    ? 'bg-emerald-500/20 text-emerald-400'
+                    : story.status === 'draft'
+                    ? 'bg-amber-500/20 text-amber-400'
+                    : 'bg-slate-500/20 text-slate-400'
+                }`}>
+                  {story.status}
+                </span>
+              </div>
+            ))}
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/admin/AdminGenresPage.tsx
===================================================================
--- chapterx-frontend/src/pages/admin/AdminGenresPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/admin/AdminGenresPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,126 @@
+import React, { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { ArrowLeft, Plus, Trash2, Tag } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { Modal } from '../../components/ui/Modal'
+import { Genre } from '../../types'
+
+export const AdminGenresPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { genres, addGenre, deleteGenre } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [addOpen, setAddOpen] = useState(false)
+  const [newName, setNewName] = useState('')
+  const [deleteTarget, setDeleteTarget] = useState<Genre | null>(null)
+
+  const handleAdd = () => {
+    if (!newName.trim()) return
+    if (genres.some(g => g.name.toLowerCase() === newName.trim().toLowerCase())) {
+      addToast('Genre already exists', 'error')
+      return
+    }
+    addGenre({ genre_id: Date.now(), name: newName.trim(), story_count: 0 })
+    addToast(`Genre "${newName.trim()}" added!`)
+    setNewName('')
+    setAddOpen(false)
+  }
+
+  const handleDelete = (genre: Genre) => {
+    if (genre.story_count > 0) {
+      addToast('Cannot delete genre with associated stories', 'error')
+      return
+    }
+    deleteGenre(genre.genre_id)
+    addToast(`Genre "${genre.name}" deleted`, 'info')
+    setDeleteTarget(null)
+  }
+
+  return (
+    <div className="max-w-4xl mx-auto px-4 py-8">
+      <div className="flex items-center justify-between mb-8">
+        <div className="flex items-center gap-3">
+          <button onClick={() => navigate('/admin')} className="text-slate-400 hover:text-white transition-colors">
+            <ArrowLeft size={20} />
+          </button>
+          <div>
+            <h1 className="font-serif text-2xl font-bold text-white">Manage Genres</h1>
+            <p className="text-slate-400 text-sm mt-0.5">{genres.length} genres</p>
+          </div>
+        </div>
+        <Button onClick={() => setAddOpen(true)}>
+          <Plus size={16} />
+          Add Genre
+        </Button>
+      </div>
+
+      <div className="bg-slate-900 border border-slate-700 rounded-2xl overflow-hidden">
+        <div className="flex items-center gap-2 px-6 py-4 border-b border-slate-700">
+          <Tag size={18} className="text-amber-400" />
+          <h2 className="text-white font-semibold">All Genres</h2>
+        </div>
+        <div className="divide-y divide-slate-800">
+          {genres.map(genre => (
+            <div key={genre.genre_id} className="flex items-center justify-between px-6 py-4 hover:bg-slate-800/50 transition-colors">
+              <div className="flex items-center gap-4">
+                <div className="w-2 h-2 rounded-full bg-indigo-500" />
+                <span className="text-white font-medium">{genre.name}</span>
+              </div>
+              <div className="flex items-center gap-4">
+                <span className="text-slate-500 text-sm">{genre.story_count} stories</span>
+                <button
+                  onClick={() => setDeleteTarget(genre)}
+                  className={`transition-colors p-1 rounded ${
+                    genre.story_count > 0
+                      ? 'text-slate-700 cursor-not-allowed'
+                      : 'text-slate-500 hover:text-rose-400 hover:bg-rose-500/10'
+                  }`}
+                  disabled={genre.story_count > 0}
+                  title={genre.story_count > 0 ? 'Cannot delete genre with stories' : 'Delete genre'}
+                >
+                  <Trash2 size={14} />
+                </button>
+              </div>
+            </div>
+          ))}
+        </div>
+      </div>
+
+      {/* Add modal */}
+      <Modal isOpen={addOpen} onClose={() => setAddOpen(false)} title="Add Genre" size="sm">
+        <div className="space-y-4">
+          <div>
+            <label className="block text-sm text-slate-400 mb-1.5">Genre Name</label>
+            <input
+              value={newName}
+              onChange={e => setNewName(e.target.value)}
+              onKeyDown={e => e.key === 'Enter' && handleAdd()}
+              placeholder="e.g., Dystopia..."
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+            />
+          </div>
+          <div className="flex gap-3">
+            <Button variant="secondary" className="flex-1" onClick={() => setAddOpen(false)}>Cancel</Button>
+            <Button className="flex-1" onClick={handleAdd} disabled={!newName.trim()}>Add Genre</Button>
+          </div>
+        </div>
+      </Modal>
+
+      {/* Delete confirm */}
+      <Modal isOpen={!!deleteTarget} onClose={() => setDeleteTarget(null)} title="Delete Genre" size="sm">
+        {deleteTarget && (
+          <div className="space-y-4">
+            <p className="text-slate-300 text-sm">
+              Delete the genre <strong className="text-white">"{deleteTarget.name}"</strong>? This action cannot be undone.
+            </p>
+            <div className="flex gap-3">
+              <Button variant="secondary" className="flex-1" onClick={() => setDeleteTarget(null)}>Cancel</Button>
+              <Button variant="danger" className="flex-1" onClick={() => handleDelete(deleteTarget)}>Delete</Button>
+            </div>
+          </div>
+        )}
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/admin/AdminUsersPage.tsx
===================================================================
--- chapterx-frontend/src/pages/admin/AdminUsersPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/admin/AdminUsersPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,33 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { ArrowLeft, Users } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { UserTable } from '../../components/admin/UserTable'
+import { Button } from '../../components/ui/Button'
+
+export const AdminUsersPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { allUsers } = useAuthStore()
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      <div className="flex items-center gap-3 mb-8">
+        <button onClick={() => navigate('/admin')} className="text-slate-400 hover:text-white transition-colors">
+          <ArrowLeft size={20} />
+        </button>
+        <div>
+          <h1 className="font-serif text-2xl font-bold text-white">User Management</h1>
+          <p className="text-slate-400 text-sm mt-0.5">{allUsers.length} registered users</p>
+        </div>
+      </div>
+
+      <div className="bg-slate-900 border border-slate-700 rounded-2xl p-6">
+        <div className="flex items-center gap-2 mb-6">
+          <Users size={18} className="text-blue-400" />
+          <h2 className="text-white font-semibold">All Users</h2>
+        </div>
+        <UserTable />
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/auth/LoginPage.tsx
===================================================================
--- chapterx-frontend/src/pages/auth/LoginPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/auth/LoginPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,151 @@
+import React, { useState } from 'react'
+import { useNavigate, Link } from 'react-router-dom'
+import { Eye, EyeOff } from 'lucide-react'
+import logo from '../../assets/chapterX-removebg-preview.png'
+import { useAuthStore } from '../../store/authStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { Avatar } from '../../components/ui/Avatar'
+import { RoleBadge } from '../../components/ui/Badge'
+
+const quickUsers = [
+  { username: 'admin_alex', name: 'Alex Admin', role: 'admin' as const },
+  { username: 'elena_writes', name: 'Elena Dimitrova', role: 'writer' as const },
+  { username: 'boris_writer', name: 'Boris Nikolov', role: 'writer' as const },
+  { username: 'sara_reader', name: 'Sara Petkovska', role: 'regular' as const },
+]
+
+export const LoginPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { login, switchUser } = useAuthStore()
+  const { addToast } = useUIStore()
+  const [email, setEmail] = useState('')
+  const [password, setPassword] = useState('')
+  const [showPw, setShowPw] = useState(false)
+  const [loading, setLoading] = useState(false)
+  const [errors, setErrors] = useState<{ email?: string; password?: string }>({})
+
+  const validate = () => {
+    const e: typeof errors = {}
+    if (!email.trim()) e.email = 'Email or username is required'
+    if (!password.trim()) e.password = 'Password is required'
+    setErrors(e)
+    return Object.keys(e).length === 0
+  }
+
+  const handleSubmit = async (ev: React.FormEvent) => {
+    ev.preventDefault()
+    if (!validate()) return
+    setLoading(true)
+    try {
+      await login(email, password)
+      addToast('Welcome back!')
+      navigate('/')
+    } catch (err: any) {
+      addToast(err.message || 'Login failed', 'error')
+    } finally {
+      setLoading(false)
+    }
+  }
+
+  const handleQuickLogin = (username: string) => {
+    const { allUsers } = useAuthStore.getState()
+    const user = allUsers.find(u => u.username === username)
+    if (user) {
+      switchUser(user.user_id)
+      addToast(`Signed in as ${user.name}`)
+      navigate('/')
+    }
+  }
+
+  return (
+    <div className="min-h-[80vh] flex items-center justify-center px-4 py-12">
+      <div className="w-full max-w-md">
+        {/* Logo */}
+        <div className="text-center mb-8">
+          <Link to="/" className="inline-flex items-center gap-2 mb-6">
+            <img src={logo} alt="ChapterX" className="h-20 w-20 object-contain" />
+          </Link>
+          <h1 className="font-serif text-2xl font-bold text-white">Welcome back</h1>
+          <p className="text-slate-400 text-sm mt-2">Sign in to your account</p>
+        </div>
+
+        {/* Quick login */}
+        <div className="mb-6">
+          <p className="text-xs text-slate-500 text-center mb-3">Quick demo login</p>
+          <div className="grid grid-cols-2 gap-2">
+            {quickUsers.map(u => (
+              <button
+                key={u.username}
+                onClick={() => handleQuickLogin(u.username)}
+                className="flex items-center gap-2 p-3 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/50 hover:bg-slate-700/50 transition-all group"
+              >
+                <Avatar name={u.name} size="sm" />
+                <div className="text-left min-w-0">
+                  <p className="text-white text-xs font-medium truncate">{u.name}</p>
+                  <RoleBadge role={u.role} />
+                </div>
+              </button>
+            ))}
+          </div>
+        </div>
+
+        <div className="flex items-center gap-3 mb-6">
+          <div className="flex-1 h-px bg-slate-700" />
+          <span className="text-slate-600 text-xs">or sign in with email</span>
+          <div className="flex-1 h-px bg-slate-700" />
+        </div>
+
+        {/* Form */}
+        <form onSubmit={handleSubmit} className="space-y-4">
+          <div>
+            <label className="block text-sm text-slate-400 mb-1.5">Email or Username</label>
+            <input
+              type="text"
+              value={email}
+              onChange={e => { setEmail(e.target.value); setErrors(p => ({ ...p, email: '' })) }}
+              placeholder="you@example.com"
+              className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition-colors ${
+                errors.email ? 'border-rose-500' : 'border-slate-700'
+              }`}
+            />
+            {errors.email && <p className="text-rose-400 text-xs mt-1">{errors.email}</p>}
+          </div>
+          <div>
+            <label className="block text-sm text-slate-400 mb-1.5">Password</label>
+            <div className="relative">
+              <input
+                type={showPw ? 'text' : 'password'}
+                value={password}
+                onChange={e => { setPassword(e.target.value); setErrors(p => ({ ...p, password: '' })) }}
+                placeholder="••••••••"
+                className={`w-full px-4 py-3 pr-12 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition-colors ${
+                  errors.password ? 'border-rose-500' : 'border-slate-700'
+                }`}
+              />
+              <button
+                type="button"
+                onClick={() => setShowPw(!showPw)}
+                className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-500 hover:text-slate-300"
+              >
+                {showPw ? <EyeOff size={16} /> : <Eye size={16} />}
+              </button>
+            </div>
+            {errors.password && <p className="text-rose-400 text-xs mt-1">{errors.password}</p>}
+          </div>
+
+          <Button type="submit" className="w-full" size="lg" loading={loading}>
+            Sign In
+          </Button>
+        </form>
+
+        <p className="text-center text-slate-500 text-sm mt-6">
+          Don't have an account?{' '}
+          <Link to="/register" className="text-indigo-400 hover:text-indigo-300">
+            Create one
+          </Link>
+        </p>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/auth/RegisterPage.tsx
===================================================================
--- chapterx-frontend/src/pages/auth/RegisterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/auth/RegisterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,224 @@
+import React, { useState } from 'react'
+import { useNavigate, Link } from 'react-router-dom'
+import { BookOpen, PenLine, ArrowLeft, Eye, EyeOff } from 'lucide-react'
+import logo from '../../assets/chapterX-removebg-preview.png'
+import { useAuthStore } from '../../store/authStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+
+type Role = 'regular' | 'writer'
+type Step = 1 | 2
+
+export const RegisterPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { register } = useAuthStore()
+  const { addToast } = useUIStore()
+  const [step, setStep] = useState<Step>(1)
+  const [role, setRole] = useState<Role>('regular')
+  const [loading, setLoading] = useState(false)
+  const [showPw, setShowPw] = useState(false)
+  const [form, setForm] = useState({
+    username: '',
+    email: '',
+    name: '',
+    surname: '',
+    password: '',
+    confirmPassword: '',
+  })
+  const [errors, setErrors] = useState<Record<string, string>>({})
+
+  const validate = () => {
+    const e: Record<string, string> = {}
+    if (!form.username.trim()) e.username = 'Username is required'
+    if (form.username.length < 3) e.username = 'Username must be at least 3 characters'
+    if (!form.email.includes('@')) e.email = 'Enter a valid email address'
+    if (!form.name.trim()) e.name = 'First name is required'
+    if (!form.surname.trim()) e.surname = 'Last name is required'
+    if (form.password.length < 6) e.password = 'Password must be at least 6 characters'
+    if (form.password !== form.confirmPassword) e.confirmPassword = 'Passwords do not match'
+    setErrors(e)
+    return Object.keys(e).length === 0
+  }
+
+  const handleSubmit = async (ev: React.FormEvent) => {
+    ev.preventDefault()
+    if (!validate()) return
+    setLoading(true)
+    try {
+      await register(
+        { username: form.username, email: form.email, name: form.name, surname: form.surname, password: form.password },
+        role
+      )
+      addToast('Account created! Welcome to ChapterX.')
+      navigate('/')
+    } catch (err: any) {
+      addToast(err.message || 'Registration failed', 'error')
+    } finally {
+      setLoading(false)
+    }
+  }
+
+  const setField = (field: string, value: string) => {
+    setForm(p => ({ ...p, [field]: value }))
+    setErrors(p => ({ ...p, [field]: '' }))
+  }
+
+  return (
+    <div className="min-h-[80vh] flex items-center justify-center px-4 py-12">
+      <div className="w-full max-w-md">
+        <div className="text-center mb-8">
+          <Link to="/" className="inline-flex items-center gap-2 mb-6">
+            <img src={logo} alt="ChapterX" className="h-20 w-20 object-contain" />
+          </Link>
+          <h1 className="font-serif text-2xl font-bold text-white">Create your account</h1>
+          <p className="text-slate-400 text-sm mt-2">Step {step} of 2</p>
+
+          {/* Progress */}
+          <div className="flex gap-2 justify-center mt-4">
+            <div className="h-1 w-16 rounded-full bg-indigo-600" />
+            <div className={`h-1 w-16 rounded-full transition-colors ${step === 2 ? 'bg-indigo-600' : 'bg-slate-700'}`} />
+          </div>
+        </div>
+
+        {step === 1 ? (
+          <div className="space-y-4">
+            <h2 className="text-white font-semibold text-center mb-6">I want to join as...</h2>
+            <div className="grid grid-cols-1 gap-4">
+              <button
+                onClick={() => setRole('regular')}
+                className={`flex items-start gap-4 p-5 rounded-2xl border-2 transition-all ${
+                  role === 'regular'
+                    ? 'border-indigo-500 bg-indigo-500/10'
+                    : 'border-slate-700 bg-slate-800 hover:border-slate-600'
+                }`}
+              >
+                <div className={`w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 ${
+                  role === 'regular' ? 'bg-indigo-500/30' : 'bg-slate-700'
+                }`}>
+                  <BookOpen size={20} className="text-indigo-400" />
+                </div>
+                <div className="text-left">
+                  <p className="font-semibold text-white">Reader</p>
+                  <p className="text-slate-400 text-sm mt-1">
+                    Browse stories, leave comments, build reading lists, and follow your favorite authors.
+                  </p>
+                </div>
+              </button>
+              <button
+                onClick={() => setRole('writer')}
+                className={`flex items-start gap-4 p-5 rounded-2xl border-2 transition-all ${
+                  role === 'writer'
+                    ? 'border-violet-500 bg-violet-500/10'
+                    : 'border-slate-700 bg-slate-800 hover:border-slate-600'
+                }`}
+              >
+                <div className={`w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0 ${
+                  role === 'writer' ? 'bg-violet-500/30' : 'bg-slate-700'
+                }`}>
+                  <PenLine size={20} className="text-violet-400" />
+                </div>
+                <div className="text-left">
+                  <p className="font-semibold text-white">Writer</p>
+                  <p className="text-slate-400 text-sm mt-1">
+                    Publish stories, write chapters, collaborate with others, and get AI writing assistance.
+                  </p>
+                </div>
+              </button>
+            </div>
+            <Button className="w-full mt-6" size="lg" onClick={() => setStep(2)}>
+              Continue
+            </Button>
+            <p className="text-center text-slate-500 text-sm">
+              Already have an account?{' '}
+              <Link to="/login" className="text-indigo-400 hover:text-indigo-300">Sign in</Link>
+            </p>
+          </div>
+        ) : (
+          <form onSubmit={handleSubmit} className="space-y-4">
+            <button
+              type="button"
+              onClick={() => setStep(1)}
+              className="flex items-center gap-1 text-sm text-slate-400 hover:text-white mb-2"
+            >
+              <ArrowLeft size={14} />
+              Back
+            </button>
+
+            <div className="grid grid-cols-2 gap-3">
+              <div>
+                <label className="block text-sm text-slate-400 mb-1.5">First Name</label>
+                <input
+                  value={form.name}
+                  onChange={e => setField('name', e.target.value)}
+                  placeholder="Elena"
+                  className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 ${errors.name ? 'border-rose-500' : 'border-slate-700'}`}
+                />
+                {errors.name && <p className="text-rose-400 text-xs mt-1">{errors.name}</p>}
+              </div>
+              <div>
+                <label className="block text-sm text-slate-400 mb-1.5">Last Name</label>
+                <input
+                  value={form.surname}
+                  onChange={e => setField('surname', e.target.value)}
+                  placeholder="Dimitrova"
+                  className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 ${errors.surname ? 'border-rose-500' : 'border-slate-700'}`}
+                />
+                {errors.surname && <p className="text-rose-400 text-xs mt-1">{errors.surname}</p>}
+              </div>
+            </div>
+
+            {[
+              { field: 'username', label: 'Username', placeholder: 'elena_writes', type: 'text' },
+              { field: 'email', label: 'Email', placeholder: 'you@example.com', type: 'email' },
+            ].map(f => (
+              <div key={f.field}>
+                <label className="block text-sm text-slate-400 mb-1.5">{f.label}</label>
+                <input
+                  type={f.type}
+                  value={(form as any)[f.field]}
+                  onChange={e => setField(f.field, e.target.value)}
+                  placeholder={f.placeholder}
+                  className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 ${(errors as any)[f.field] ? 'border-rose-500' : 'border-slate-700'}`}
+                />
+                {(errors as any)[f.field] && <p className="text-rose-400 text-xs mt-1">{(errors as any)[f.field]}</p>}
+              </div>
+            ))}
+
+            <div>
+              <label className="block text-sm text-slate-400 mb-1.5">Password</label>
+              <div className="relative">
+                <input
+                  type={showPw ? 'text' : 'password'}
+                  value={form.password}
+                  onChange={e => setField('password', e.target.value)}
+                  placeholder="Min. 6 characters"
+                  className={`w-full px-4 py-3 pr-12 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 ${errors.password ? 'border-rose-500' : 'border-slate-700'}`}
+                />
+                <button type="button" onClick={() => setShowPw(!showPw)} className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-500 hover:text-slate-300">
+                  {showPw ? <EyeOff size={16} /> : <Eye size={16} />}
+                </button>
+              </div>
+              {errors.password && <p className="text-rose-400 text-xs mt-1">{errors.password}</p>}
+            </div>
+
+            <div>
+              <label className="block text-sm text-slate-400 mb-1.5">Confirm Password</label>
+              <input
+                type="password"
+                value={form.confirmPassword}
+                onChange={e => setField('confirmPassword', e.target.value)}
+                placeholder="••••••••"
+                className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 ${errors.confirmPassword ? 'border-rose-500' : 'border-slate-700'}`}
+              />
+              {errors.confirmPassword && <p className="text-rose-400 text-xs mt-1">{errors.confirmPassword}</p>}
+            </div>
+
+            <Button type="submit" className="w-full" size="lg" loading={loading}>
+              Create Account as {role === 'writer' ? 'Writer' : 'Reader'}
+            </Button>
+          </form>
+        )}
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/browse/BrowsePage.tsx
===================================================================
--- chapterx-frontend/src/pages/browse/BrowsePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/browse/BrowsePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,166 @@
+import React, { useState, useMemo } from 'react'
+import { Search, SlidersHorizontal, X } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useAuthStore } from '../../store/authStore'
+import { StoryGrid } from '../../components/story/StoryGrid'
+import { GenreBadge } from '../../components/ui/Badge'
+
+const sortOptions = [
+  { value: 'popular', label: 'Most Popular' },
+  { value: 'recent', label: 'Most Recent' },
+  { value: 'views', label: 'Most Viewed' },
+  { value: 'comments', label: 'Most Discussed' },
+]
+
+const allGenres = ['Fantasy', 'Sci-Fi', 'Romance', 'Historical Fiction', 'Adventure', 'Thriller', 'Mystery', 'Horror', 'Contemporary', 'Poetry']
+
+export const BrowsePage: React.FC = () => {
+  const { stories } = useStoryStore()
+  const { currentUser, showMatureContent, setShowMatureContent } = useAuthStore()
+  const [search, setSearch] = useState('')
+  const [selectedGenres, setSelectedGenres] = useState<string[]>([])
+  const [sort, setSort] = useState('popular')
+  const [showFilters, setShowFilters] = useState(false)
+
+  const filtered = useMemo(() => {
+    let list = stories.filter(s => s.status === 'published')
+
+    if (!showMatureContent && !currentUser) {
+      list = list.filter(s => !s.mature_content)
+    }
+
+    if (search.trim()) {
+      const q = search.toLowerCase()
+      list = list.filter(s =>
+        s.title.toLowerCase().includes(q) ||
+        s.short_description.toLowerCase().includes(q) ||
+        s.author_username.toLowerCase().includes(q)
+      )
+    }
+
+    if (selectedGenres.length > 0) {
+      list = list.filter(s => selectedGenres.some(g => s.genres.includes(g)))
+    }
+
+    switch (sort) {
+      case 'popular': return [...list].sort((a, b) => b.total_likes - a.total_likes)
+      case 'recent': return [...list].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
+      case 'views': return [...list].sort((a, b) => b.total_views - a.total_views)
+      case 'comments': return [...list].sort((a, b) => b.total_comments - a.total_comments)
+      default: return list
+    }
+  }, [stories, search, selectedGenres, sort, showMatureContent, currentUser])
+
+  const toggleGenre = (g: string) =>
+    setSelectedGenres(prev => prev.includes(g) ? prev.filter(x => x !== g) : [...prev, g])
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="mb-8">
+        <h1 className="font-serif text-3xl font-bold text-white mb-2">Browse Stories</h1>
+        <p className="text-slate-400">Discover your next favorite read</p>
+      </div>
+
+      {/* Search + controls */}
+      <div className="flex flex-col sm:flex-row gap-3 mb-6">
+        <div className="relative flex-1">
+          <Search size={16} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-500" />
+          <input
+            value={search}
+            onChange={e => setSearch(e.target.value)}
+            placeholder="Search titles, authors, descriptions..."
+            className="w-full pl-10 pr-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+          />
+          {search && (
+            <button onClick={() => setSearch('')} className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-500 hover:text-white">
+              <X size={16} />
+            </button>
+          )}
+        </div>
+        <select
+          value={sort}
+          onChange={e => setSort(e.target.value)}
+          className="px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-slate-300 focus:outline-none focus:border-indigo-500 text-sm"
+        >
+          {sortOptions.map(o => <option key={o.value} value={o.value}>{o.label}</option>)}
+        </select>
+        <button
+          onClick={() => setShowFilters(!showFilters)}
+          className={`flex items-center gap-2 px-4 py-3 rounded-xl border text-sm font-medium transition-colors ${
+            showFilters || selectedGenres.length > 0
+              ? 'border-indigo-500 bg-indigo-500/10 text-indigo-300'
+              : 'border-slate-700 bg-slate-800 text-slate-300 hover:border-slate-600'
+          }`}
+        >
+          <SlidersHorizontal size={16} />
+          Filters
+          {selectedGenres.length > 0 && (
+            <span className="bg-indigo-500 text-white text-xs w-5 h-5 rounded-full flex items-center justify-center">
+              {selectedGenres.length}
+            </span>
+          )}
+        </button>
+      </div>
+
+      {/* Filters panel */}
+      {showFilters && (
+        <div className="bg-slate-800 border border-slate-700 rounded-2xl p-5 mb-6">
+          <div className="flex items-center justify-between mb-4">
+            <h3 className="text-white font-medium">Filter by Genre</h3>
+            {selectedGenres.length > 0 && (
+              <button onClick={() => setSelectedGenres([])} className="text-xs text-slate-400 hover:text-white">
+                Clear all
+              </button>
+            )}
+          </div>
+          <div className="flex flex-wrap gap-2 mb-4">
+            {allGenres.map(g => (
+              <button
+                key={g}
+                onClick={() => toggleGenre(g)}
+                className={`transition-transform hover:scale-105 ${selectedGenres.includes(g) ? 'opacity-100' : 'opacity-70 hover:opacity-100'}`}
+              >
+                <GenreBadge genre={g} />
+              </button>
+            ))}
+          </div>
+          {currentUser && (
+            <div className="flex items-center gap-3 pt-3 border-t border-slate-700">
+              <label className="flex items-center gap-2 cursor-pointer">
+                <div
+                  onClick={() => setShowMatureContent(!showMatureContent)}
+                  className={`w-10 h-6 rounded-full transition-colors ${showMatureContent ? 'bg-indigo-600' : 'bg-slate-600'} relative`}
+                >
+                  <div className={`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${showMatureContent ? 'translate-x-5' : 'translate-x-1'}`} />
+                </div>
+                <span className="text-sm text-slate-400">Show mature content (18+)</span>
+              </label>
+            </div>
+          )}
+        </div>
+      )}
+
+      {/* Result count */}
+      <div className="flex items-center justify-between mb-4">
+        <p className="text-slate-500 text-sm">{filtered.length} stories found</p>
+        {selectedGenres.length > 0 && (
+          <div className="flex items-center gap-2">
+            <span className="text-xs text-slate-500">Active filters:</span>
+            {selectedGenres.map(g => (
+              <button
+                key={g}
+                onClick={() => toggleGenre(g)}
+                className="flex items-center gap-1 text-xs px-2 py-1 bg-indigo-500/20 text-indigo-300 rounded-full border border-indigo-500/30 hover:bg-rose-500/20 hover:text-rose-300 hover:border-rose-500/30 transition-colors"
+              >
+                {g} <X size={10} />
+              </button>
+            ))}
+          </div>
+        )}
+      </div>
+
+      <StoryGrid stories={filtered} emptyMessage="No stories match your filters." />
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/browse/GenrePage.tsx
===================================================================
--- chapterx-frontend/src/pages/browse/GenrePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/browse/GenrePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,79 @@
+import React from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { StoryGrid } from '../../components/story/StoryGrid'
+import { getGenreGradient } from '../../components/story/GenreBadge'
+
+function toTitleCase(s: string) {
+  return s.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase())
+}
+
+export const GenrePage: React.FC = () => {
+  const { genre } = useParams<{ genre: string }>()
+  const navigate = useNavigate()
+  const { stories } = useStoryStore()
+
+  const genreName = toTitleCase(genre || '')
+  const gradient = getGenreGradient(genreName)
+  const filtered = stories.filter(
+    s => s.status === 'published' && s.genres.some(g => g.toLowerCase() === genreName.toLowerCase())
+  )
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      {/* Hero */}
+      <div className={`relative rounded-2xl overflow-hidden mb-8 h-40 bg-gradient-to-br ${gradient}`}>
+        <div className="absolute inset-0 flex flex-col justify-end p-8">
+          <button
+            onClick={() => navigate('/genres')}
+            className="flex items-center gap-2 text-white/70 hover:text-white text-sm mb-3 transition-colors w-fit"
+          >
+            <ArrowLeft size={16} />
+            All Genres
+          </button>
+          <h1 className="font-serif text-3xl font-bold text-white">{genreName}</h1>
+          <p className="text-white/70 text-sm mt-1">{filtered.length} stories</p>
+        </div>
+        <div className="absolute top-4 right-8 w-32 h-32 rounded-full bg-white/5 blur-xl" />
+      </div>
+
+      <StoryGrid
+        stories={filtered}
+        emptyMessage={`No ${genreName} stories published yet.`}
+      />
+    </div>
+  )
+}
+
+export const GenresListPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { genres } = useStoryStore()
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      <div className="mb-8">
+        <h1 className="font-serif text-3xl font-bold text-white mb-2">Explore Genres</h1>
+        <p className="text-slate-400">Find stories by your favorite genre</p>
+      </div>
+      <div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-4">
+        {genres.map(genre => {
+          const gradient = getGenreGradient(genre.name)
+          return (
+            <button
+              key={genre.genre_id}
+              onClick={() => navigate(`/genres/${genre.name.toLowerCase().replace(' ', '-')}`)}
+              className={`relative rounded-2xl overflow-hidden h-32 bg-gradient-to-br ${gradient} hover:scale-105 transition-transform group`}
+            >
+              <div className="absolute inset-0 flex flex-col items-center justify-center p-4">
+                <p className="font-serif font-semibold text-white text-center">{genre.name}</p>
+                <p className="text-white/60 text-xs mt-1">{genre.story_count} stories</p>
+              </div>
+              <div className="absolute inset-0 bg-black/20 group-hover:bg-black/10 transition-colors" />
+            </button>
+          )
+        })}
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/profile/ProfilePage.tsx
===================================================================
--- chapterx-frontend/src/pages/profile/ProfilePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/profile/ProfilePage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,163 @@
+import React, { useState } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { BookOpen, Heart, Users, Calendar, MessageCircle, Eye } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { Avatar } from '../../components/ui/Avatar'
+import { RoleBadge, StatusBadge } from '../../components/ui/Badge'
+import { StoryCard } from '../../components/ui/StoryCard'
+import { GenreBadge } from '../../components/ui/Badge'
+
+type Tab = 'stories' | 'about'
+
+export const ProfilePage: React.FC = () => {
+  const { username } = useParams<{ username: string }>()
+  const navigate = useNavigate()
+  const { allUsers, currentUser } = useAuthStore()
+  const { stories, comments } = useStoryStore()
+  const [tab, setTab] = useState<Tab>('stories')
+
+  const user = allUsers.find(u => u.username === username)
+
+  if (!user) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">User not found</h2>
+      </div>
+    )
+  }
+
+  const userStories = stories.filter(s => s.user_id === user.user_id && s.status === 'published')
+  const totalLikes = userStories.reduce((acc, s) => acc + s.total_likes, 0)
+  const totalViews = userStories.reduce((acc, s) => acc + s.total_views, 0)
+  const userComments = comments.filter(c => c.user_id === user.user_id)
+  const allGenres = [...new Set(userStories.flatMap(s => s.genres))]
+
+  return (
+    <div className="max-w-5xl mx-auto px-4 py-8">
+      {/* Profile header */}
+      <div className="relative mb-8">
+        {/* Cover */}
+        <div className="h-32 sm:h-48 rounded-2xl bg-gradient-to-br from-indigo-900 via-violet-900 to-purple-900 mb-16 sm:mb-20 overflow-hidden">
+          <div className="absolute inset-0 rounded-2xl opacity-40">
+            <div className="absolute top-4 left-16 w-32 h-32 rounded-full bg-white/10 blur-2xl" />
+            <div className="absolute bottom-2 right-8 w-24 h-24 rounded-full bg-white/10 blur-xl" />
+          </div>
+        </div>
+
+        {/* Avatar + info */}
+        <div className="absolute bottom-0 left-0 right-0 px-6 flex items-end justify-between">
+          <Avatar name={`${user.name} ${user.surname}`} size="xl" className="ring-4 ring-slate-950" />
+          {currentUser?.user_id === user.user_id && (
+            <button className="mb-2 text-sm text-indigo-400 hover:text-indigo-300 transition-colors">
+              Edit Profile
+            </button>
+          )}
+        </div>
+      </div>
+
+      {/* User info */}
+      <div className="mb-8">
+        <div className="flex items-center gap-3 mb-1">
+          <h1 className="font-serif text-2xl font-bold text-white">
+            {user.name} {user.surname}
+          </h1>
+          <RoleBadge role={user.role} />
+        </div>
+        <p className="text-slate-400">@{user.username}</p>
+        {user.bio && <p className="text-slate-300 mt-3 max-w-xl">{user.bio}</p>}
+        <div className="flex items-center gap-4 mt-4 flex-wrap">
+          <span className="flex items-center gap-1 text-slate-400 text-sm">
+            <Calendar size={14} />
+            Joined {new Date(user.created_at).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}
+          </span>
+          <span className="flex items-center gap-1 text-slate-400 text-sm">
+            <Users size={14} />
+            {user.follower_count} followers · {user.following_count} following
+          </span>
+        </div>
+      </div>
+
+      {/* Stats */}
+      <div className="grid grid-cols-2 sm:grid-cols-4 gap-4 mb-8">
+        {[
+          { icon: <BookOpen size={16} className="text-indigo-400" />, value: userStories.length, label: 'Stories' },
+          { icon: <Heart size={16} className="text-rose-400" />, value: totalLikes.toLocaleString(), label: 'Likes' },
+          { icon: <Eye size={16} className="text-blue-400" />, value: totalViews.toLocaleString(), label: 'Views' },
+          { icon: <MessageCircle size={16} className="text-amber-400" />, value: userComments.length, label: 'Comments' },
+        ].map(s => (
+          <div key={s.label} className="bg-slate-800 border border-slate-700 rounded-xl p-4 text-center">
+            <div className="flex justify-center mb-1">{s.icon}</div>
+            <p className="text-xl font-bold text-white">{s.value}</p>
+            <p className="text-slate-500 text-xs">{s.label}</p>
+          </div>
+        ))}
+      </div>
+
+      {/* Tabs */}
+      <div className="flex gap-1 p-1 bg-slate-800 rounded-xl mb-6 w-fit">
+        {(['stories', 'about'] as Tab[]).map(t => (
+          <button
+            key={t}
+            onClick={() => setTab(t)}
+            className={`px-4 py-2 rounded-lg text-sm font-medium capitalize transition-colors ${
+              tab === t ? 'bg-indigo-600 text-white' : 'text-slate-400 hover:text-white'
+            }`}
+          >
+            {t}
+          </button>
+        ))}
+      </div>
+
+      {/* Tab content */}
+      {tab === 'stories' ? (
+        <div>
+          {userStories.length === 0 ? (
+            <div className="text-center py-16 text-slate-500">
+              <BookOpen size={40} className="mx-auto mb-3 opacity-40" />
+              <p>No published stories yet.</p>
+            </div>
+          ) : (
+            <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
+              {userStories.map(story => (
+                <StoryCard key={story.story_id} story={story} />
+              ))}
+            </div>
+          )}
+        </div>
+      ) : (
+        <div className="space-y-6">
+          <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+            <h3 className="text-white font-semibold mb-3">About</h3>
+            <p className="text-slate-300">{user.bio || 'No bio provided.'}</p>
+          </div>
+          {allGenres.length > 0 && (
+            <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+              <h3 className="text-white font-semibold mb-3">Writes In</h3>
+              <div className="flex flex-wrap gap-2">
+                {allGenres.map(g => <GenreBadge key={g} genre={g} />)}
+              </div>
+            </div>
+          )}
+          <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+            <h3 className="text-white font-semibold mb-3">Stats</h3>
+            <div className="space-y-3">
+              <div className="flex justify-between text-sm">
+                <span className="text-slate-400">Role</span>
+                <RoleBadge role={user.role} />
+              </div>
+              <div className="flex justify-between text-sm">
+                <span className="text-slate-400">Member since</span>
+                <span className="text-white">{new Date(user.created_at).toLocaleDateString()}</span>
+              </div>
+              <div className="flex justify-between text-sm">
+                <span className="text-slate-400">Published stories</span>
+                <span className="text-white">{userStories.length}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+      )}
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx
===================================================================
--- chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,134 @@
+import React, { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Globe, BookOpen, User } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { ReadingList } from '../../types'
+import { Modal } from '../../components/ui/Modal'
+import { GenreBadge } from '../../components/ui/Badge'
+import { Avatar } from '../../components/ui/Avatar'
+
+export const CommunityListsPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { readingLists } = useStoryStore()
+  const [selectedList, setSelectedList] = useState<ReadingList | null>(null)
+
+  const publicLists = readingLists.filter(l => l.is_public)
+
+  return (
+    <div className="max-w-6xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="mb-8">
+        <div className="flex items-center gap-2 mb-2">
+          <Globe size={20} className="text-indigo-400" />
+          <h1 className="font-serif text-3xl font-bold text-white">Community Reading Lists</h1>
+        </div>
+        <p className="text-slate-400">Discover curated lists from the ChapterX community</p>
+      </div>
+
+      {publicLists.length === 0 ? (
+        <div className="flex flex-col items-center py-20 text-slate-500">
+          <Globe size={48} className="mb-4 opacity-40" />
+          <p className="text-lg font-medium">No public lists yet</p>
+          <p className="text-sm mt-1">Be the first to share your reading list!</p>
+        </div>
+      ) : (
+        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
+          {publicLists.map(list => (
+            <div
+              key={list.list_id}
+              className="bg-slate-800 border border-slate-700 rounded-2xl overflow-hidden hover:border-indigo-500/30 transition-all cursor-pointer group"
+              onClick={() => setSelectedList(list)}
+            >
+              {/* Cover preview */}
+              <div className="h-24 bg-gradient-to-br from-indigo-900/50 via-violet-900/30 to-slate-900 p-4 flex items-end">
+                <div className="flex gap-1">
+                  {Array.from({ length: Math.min(3, list.stories.length) }).map((_, i) => (
+                    <div key={i} className={`w-10 h-14 rounded bg-slate-700 border border-slate-600 -ml-${i > 0 ? '2' : '0'}`} style={{ transform: `rotate(${(i - 1) * 5}deg)` }} />
+                  ))}
+                </div>
+              </div>
+
+              <div className="p-5">
+                <div className="flex items-start justify-between gap-2 mb-3">
+                  <h3 className="text-white font-semibold group-hover:text-indigo-300 transition-colors">
+                    {list.name}
+                  </h3>
+                  <span className="flex items-center gap-1 text-xs text-emerald-400 flex-shrink-0">
+                    <Globe size={11} /> Public
+                  </span>
+                </div>
+
+                <div className="flex items-center gap-2 mb-3">
+                  <Avatar name={list.username} size="sm" />
+                  <span className="text-slate-400 text-sm">@{list.username}</span>
+                </div>
+
+                {list.description && (
+                  <p className="text-slate-500 text-sm mb-3 line-clamp-2">{list.description}</p>
+                )}
+
+                <div className="flex items-center justify-between text-xs text-slate-500">
+                  <span className="flex items-center gap-1">
+                    <BookOpen size={12} />
+                    {list.stories.length} stories
+                  </span>
+                  <button
+                    className="text-indigo-400 hover:text-indigo-300 transition-colors"
+                    onClick={e => { e.stopPropagation(); setSelectedList(list) }}
+                  >
+                    View list →
+                  </button>
+                </div>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+
+      {/* List detail modal */}
+      {selectedList && (
+        <Modal
+          isOpen={!!selectedList}
+          onClose={() => setSelectedList(null)}
+          title={selectedList.name}
+          size="lg"
+        >
+          <div>
+            <div className="flex items-center gap-2 mb-4">
+              <Avatar name={selectedList.username} size="sm" />
+              <div>
+                <p className="text-white text-sm font-medium">@{selectedList.username}</p>
+                <p className="text-slate-500 text-xs">{selectedList.stories.length} stories</p>
+              </div>
+            </div>
+            {selectedList.description && (
+              <p className="text-slate-400 text-sm mb-4">{selectedList.description}</p>
+            )}
+
+            {selectedList.stories.length === 0 ? (
+              <p className="text-slate-500 text-sm text-center py-8">This list is empty.</p>
+            ) : (
+              <div className="space-y-3">
+                {selectedList.stories.map(item => (
+                  <div
+                    key={item.item_id}
+                    className="flex items-center gap-3 p-3 bg-slate-800 rounded-xl border border-slate-700 hover:border-indigo-500/40 cursor-pointer transition-colors"
+                    onClick={() => { navigate(`/story/${item.story_id}`); setSelectedList(null) }}
+                  >
+                    <div className="flex-1 min-w-0">
+                      <p className="text-white font-medium text-sm">{item.story_title}</p>
+                      <p className="text-slate-500 text-xs">by {item.author_username}</p>
+                    </div>
+                    <div className="flex flex-wrap gap-1">
+                      {item.genres.slice(0, 2).map(g => <GenreBadge key={g} genre={g} />)}
+                    </div>
+                  </div>
+                ))}
+              </div>
+            )}
+          </div>
+        </Modal>
+      )}
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx
===================================================================
--- chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,200 @@
+import React, { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Plus, BookOpen, Lock, Globe, Trash2, X } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { Modal } from '../../components/ui/Modal'
+import { GenreBadge } from '../../components/ui/Badge'
+
+export const ReadingListPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { readingLists, createReadingList, deleteReadingList, removeStoryFromList } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [createOpen, setCreateOpen] = useState(false)
+  const [newListName, setNewListName] = useState('')
+  const [newListDesc, setNewListDesc] = useState('')
+  const [isPublic, setIsPublic] = useState(false)
+
+  if (!currentUser) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <BookOpen size={48} className="mx-auto mb-4 text-slate-600" />
+        <h2 className="text-2xl text-white mb-2">Sign in to view your reading lists</h2>
+        <Button onClick={() => navigate('/login')} className="mt-4">Sign In</Button>
+      </div>
+    )
+  }
+
+  const myLists = readingLists.filter(l => l.user_id === currentUser.user_id)
+
+  const handleCreate = () => {
+    if (!newListName.trim()) return
+    createReadingList({
+      list_id: Date.now(),
+      user_id: currentUser.user_id,
+      username: currentUser.username,
+      name: newListName.trim(),
+      description: newListDesc.trim() || undefined,
+      is_public: isPublic,
+      created_at: new Date().toISOString(),
+      stories: [],
+    })
+    addToast(`"${newListName}" created!`)
+    setNewListName('')
+    setNewListDesc('')
+    setIsPublic(false)
+    setCreateOpen(false)
+  }
+
+  return (
+    <div className="max-w-6xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="flex items-center justify-between mb-8">
+        <div>
+          <h1 className="font-serif text-3xl font-bold text-white">My Reading Lists</h1>
+          <p className="text-slate-400 mt-1">{myLists.length} list{myLists.length !== 1 ? 's' : ''}</p>
+        </div>
+        <Button onClick={() => setCreateOpen(true)}>
+          <Plus size={16} />
+          New List
+        </Button>
+      </div>
+
+      {myLists.length === 0 ? (
+        <div className="flex flex-col items-center py-20 text-slate-500">
+          <BookOpen size={48} className="mb-4 opacity-40" />
+          <h3 className="text-lg font-medium text-white mb-2">No reading lists yet</h3>
+          <p className="text-sm mb-4">Create your first list to save stories you love.</p>
+          <Button onClick={() => setCreateOpen(true)}>
+            <Plus size={14} />
+            Create Reading List
+          </Button>
+        </div>
+      ) : (
+        <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
+          {myLists.map(list => (
+            <div key={list.list_id} className="bg-slate-800 border border-slate-700 rounded-2xl overflow-hidden hover:border-indigo-500/30 transition-all">
+              {/* Header */}
+              <div className="p-5 border-b border-slate-700">
+                <div className="flex items-start justify-between gap-3">
+                  <div>
+                    <div className="flex items-center gap-2 mb-1">
+                      <h3 className="text-white font-semibold">{list.name}</h3>
+                      {list.is_public ? (
+                        <span className="flex items-center gap-1 text-xs text-emerald-400">
+                          <Globe size={11} /> Public
+                        </span>
+                      ) : (
+                        <span className="flex items-center gap-1 text-xs text-slate-500">
+                          <Lock size={11} /> Private
+                        </span>
+                      )}
+                    </div>
+                    {list.description && (
+                      <p className="text-slate-400 text-sm">{list.description}</p>
+                    )}
+                    <p className="text-slate-500 text-xs mt-1">{list.stories.length} stories</p>
+                  </div>
+                  <button
+                    onClick={() => { deleteReadingList(list.list_id); addToast('List deleted', 'info') }}
+                    className="text-slate-500 hover:text-rose-400 transition-colors p-1"
+                  >
+                    <Trash2 size={14} />
+                  </button>
+                </div>
+              </div>
+
+              {/* Stories */}
+              <div className="p-4">
+                {list.stories.length === 0 ? (
+                  <p className="text-slate-600 text-sm text-center py-4">No stories yet.</p>
+                ) : (
+                  <div className="space-y-2">
+                    {list.stories.slice(0, 4).map(item => (
+                      <div key={item.item_id} className="flex items-center gap-3 p-2 rounded-lg hover:bg-slate-700/50 group">
+                        <div className="flex-1 min-w-0">
+                          <button
+                            onClick={() => navigate(`/story/${item.story_id}`)}
+                            className="text-white text-sm font-medium hover:text-indigo-300 transition-colors truncate block text-left"
+                          >
+                            {item.story_title}
+                          </button>
+                          <div className="flex items-center gap-2 mt-0.5">
+                            <span className="text-slate-500 text-xs">by {item.author_username}</span>
+                            {item.genres.slice(0, 1).map(g => <GenreBadge key={g} genre={g} />)}
+                          </div>
+                        </div>
+                        <button
+                          onClick={() => removeStoryFromList(list.list_id, item.story_id)}
+                          className="opacity-0 group-hover:opacity-100 text-slate-500 hover:text-rose-400 transition-all"
+                        >
+                          <X size={14} />
+                        </button>
+                      </div>
+                    ))}
+                    {list.stories.length > 4 && (
+                      <p className="text-slate-500 text-xs text-center pt-1">
+                        +{list.stories.length - 4} more stories
+                      </p>
+                    )}
+                  </div>
+                )}
+                <button
+                  onClick={() => navigate('/browse')}
+                  className="w-full mt-3 py-2 text-xs text-indigo-400 hover:text-indigo-300 flex items-center justify-center gap-1 transition-colors border border-dashed border-slate-700 rounded-lg hover:border-indigo-500/50"
+                >
+                  <Plus size={12} />
+                  Add stories
+                </button>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+
+      {/* Create modal */}
+      <Modal isOpen={createOpen} onClose={() => setCreateOpen(false)} title="Create Reading List">
+        <div className="space-y-4">
+          <div>
+            <label className="block text-sm text-slate-400 mb-1.5">List Name *</label>
+            <input
+              value={newListName}
+              onChange={e => setNewListName(e.target.value)}
+              placeholder="My Fantasy Favorites..."
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+            />
+          </div>
+          <div>
+            <label className="block text-sm text-slate-400 mb-1.5">Description <span className="text-slate-600">(optional)</span></label>
+            <textarea
+              value={newListDesc}
+              onChange={e => setNewListDesc(e.target.value)}
+              placeholder="What's this list about?"
+              rows={2}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-none"
+            />
+          </div>
+          <div className="flex items-center gap-3">
+            <button
+              onClick={() => setIsPublic(!isPublic)}
+              className={`w-10 h-6 rounded-full transition-colors ${isPublic ? 'bg-indigo-600' : 'bg-slate-600'} relative`}
+            >
+              <div className={`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${isPublic ? 'translate-x-5' : 'translate-x-1'}`} />
+            </button>
+            <div>
+              <p className="text-white text-sm">{isPublic ? 'Public' : 'Private'}</p>
+              <p className="text-slate-500 text-xs">{isPublic ? 'Anyone can see this list' : 'Only you can see this list'}</p>
+            </div>
+          </div>
+          <div className="flex gap-3 pt-2">
+            <Button variant="secondary" className="flex-1" onClick={() => setCreateOpen(false)}>Cancel</Button>
+            <Button className="flex-1" onClick={handleCreate} disabled={!newListName.trim()}>Create List</Button>
+          </div>
+        </div>
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/story/ChapterReadPage.tsx
===================================================================
--- chapterx-frontend/src/pages/story/ChapterReadPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/story/ChapterReadPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,165 @@
+import React, { useEffect, useState } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft, ArrowRight, BookOpen, Eye, ChevronLeft, ChevronRight } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { Button } from '../../components/ui/Button'
+
+export const ChapterReadPage: React.FC = () => {
+  const { storyId, chapterId } = useParams<{ storyId: string; chapterId: string }>()
+  const navigate = useNavigate()
+  const { stories, chapters, incrementViewCount } = useStoryStore()
+  const [scrollProgress, setScrollProgress] = useState(0)
+  const [viewed, setViewed] = useState(false)
+
+  const story = stories.find(s => s.story_id === Number(storyId))
+  const chapter = chapters.find(c => c.chapter_id === Number(chapterId))
+  const storyChapters = chapters
+    .filter(c => c.story_id === Number(storyId) && c.is_published)
+    .sort((a, b) => a.chapter_number - b.chapter_number)
+
+  const currentIndex = storyChapters.findIndex(c => c.chapter_id === Number(chapterId))
+  const prevChapter = currentIndex > 0 ? storyChapters[currentIndex - 1] : null
+  const nextChapter = currentIndex < storyChapters.length - 1 ? storyChapters[currentIndex + 1] : null
+
+  // Track scroll progress
+  useEffect(() => {
+    const handler = () => {
+      const el = document.documentElement
+      const progress = (el.scrollTop / (el.scrollHeight - el.clientHeight)) * 100
+      setScrollProgress(Math.min(100, progress))
+      // Increment view count when 30% read
+      if (progress > 30 && !viewed) {
+        setViewed(true)
+        if (chapter) incrementViewCount(chapter.chapter_id)
+      }
+    }
+    window.addEventListener('scroll', handler)
+    return () => window.removeEventListener('scroll', handler)
+  }, [chapter, viewed, incrementViewCount])
+
+  if (!story || !chapter) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">Chapter not found</h2>
+        <Button onClick={() => navigate('/browse')}>Browse Stories</Button>
+      </div>
+    )
+  }
+
+  return (
+    <div className="min-h-screen">
+      {/* Progress bar */}
+      <div className="fixed top-0 left-0 right-0 z-50 h-1 bg-slate-800">
+        <div
+          className="h-full bg-gradient-to-r from-indigo-500 to-violet-500 transition-all duration-100"
+          style={{ width: `${scrollProgress}%` }}
+        />
+      </div>
+
+      {/* Top nav */}
+      <div className="sticky top-1 z-40 glass border-b border-white/5">
+        <div className="max-w-3xl mx-auto px-4 py-3 flex items-center justify-between">
+          <button
+            onClick={() => navigate(`/story/${story.story_id}`)}
+            className="flex items-center gap-2 text-slate-400 hover:text-white text-sm transition-colors"
+          >
+            <ArrowLeft size={16} />
+            <span className="hidden sm:block">{story.title}</span>
+          </button>
+
+          <div className="text-center">
+            <p className="text-white text-sm font-medium">{chapter.title}</p>
+            <p className="text-slate-500 text-xs">Chapter {chapter.chapter_number}</p>
+          </div>
+
+          <div className="flex items-center gap-1 text-slate-400 text-xs">
+            <Eye size={12} />
+            {scrollProgress.toFixed(0)}%
+          </div>
+        </div>
+      </div>
+
+      {/* Content */}
+      <div className="max-w-3xl mx-auto px-4 py-12">
+        {/* Chapter header */}
+        <div className="text-center mb-12">
+          <p className="text-indigo-400 text-sm font-medium mb-2 uppercase tracking-widest">
+            Chapter {chapter.chapter_number}
+          </p>
+          <h1 className="font-serif text-3xl sm:text-4xl font-bold text-white mb-4">
+            {chapter.title}
+          </h1>
+          <div className="flex items-center justify-center gap-4 text-slate-500 text-sm">
+            <span className="flex items-center gap-1">
+              <BookOpen size={13} />
+              {chapter.word_count.toLocaleString()} words
+            </span>
+            <span className="flex items-center gap-1">
+              <Eye size={13} />
+              {chapter.view_count.toLocaleString()} reads
+            </span>
+          </div>
+          <div className="mt-4 w-16 h-px bg-gradient-to-r from-transparent via-indigo-500 to-transparent mx-auto" />
+        </div>
+
+        {/* Chapter content */}
+        <div className="prose prose-lg prose-invert max-w-none">
+          {chapter.content.split('\n\n').map((para, i) => (
+            <p
+              key={i}
+              className="text-slate-300 leading-relaxed text-lg mb-6 first-letter:text-4xl first-letter:font-serif first-letter:font-bold first-letter:text-white first-letter:float-left first-letter:mr-2 first-letter:mt-1"
+              style={i !== 0 ? { textIndent: '2rem' } : undefined}
+            >
+              {para}
+            </p>
+          ))}
+        </div>
+
+        {/* Chapter navigation */}
+        <div className="mt-16 pt-8 border-t border-slate-700">
+          <div className="flex items-center justify-between gap-4">
+            {prevChapter ? (
+              <button
+                onClick={() => navigate(`/story/${storyId}/chapter/${prevChapter.chapter_id}`)}
+                className="flex items-center gap-2 px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/50 transition-all group flex-1 max-w-[45%]"
+              >
+                <ChevronLeft size={18} className="text-slate-400 group-hover:text-indigo-400 flex-shrink-0" />
+                <div className="text-left min-w-0">
+                  <p className="text-xs text-slate-500">Previous</p>
+                  <p className="text-white text-sm truncate">{prevChapter.title}</p>
+                </div>
+              </button>
+            ) : (
+              <div className="flex-1" />
+            )}
+
+            <Button
+              variant="ghost"
+              size="sm"
+              onClick={() => navigate(`/story/${story.story_id}`)}
+            >
+              Contents
+            </Button>
+
+            {nextChapter ? (
+              <button
+                onClick={() => navigate(`/story/${storyId}/chapter/${nextChapter.chapter_id}`)}
+                className="flex items-center gap-2 px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/50 transition-all group flex-1 max-w-[45%] justify-end"
+              >
+                <div className="text-right min-w-0">
+                  <p className="text-xs text-slate-500">Next</p>
+                  <p className="text-white text-sm truncate">{nextChapter.title}</p>
+                </div>
+                <ChevronRight size={18} className="text-slate-400 group-hover:text-indigo-400 flex-shrink-0" />
+              </button>
+            ) : (
+              <div className="flex-1 text-center">
+                <p className="text-slate-500 text-sm">End of story</p>
+              </div>
+            )}
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/story/StoryDetailPage.tsx
===================================================================
--- chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,282 @@
+import React, { useState } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft, BookOpen, Eye, Users, Calendar, Plus, BookmarkPlus } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useAuthStore } from '../../store/authStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { GenreBadge } from '../../components/ui/Badge'
+import { Avatar } from '../../components/ui/Avatar'
+import { ChapterList } from '../../components/story/ChapterList'
+import { CommentSection } from '../../components/story/CommentSection'
+import { LikeButton } from '../../components/story/LikeButton'
+import { Modal } from '../../components/ui/Modal'
+import { getGenreGradient } from '../../components/story/GenreBadge'
+import { ReadingListItem } from '../../types'
+
+export const StoryDetailPage: React.FC = () => {
+  const { id } = useParams<{ id: string }>()
+  const navigate = useNavigate()
+  const { stories, chapters, collaborations, readingLists, addStoryToList, createReadingList } = useStoryStore()
+  const { currentUser } = useAuthStore()
+  const { addToast } = useUIStore()
+  const [listModalOpen, setListModalOpen] = useState(false)
+  const [newListName, setNewListName] = useState('')
+
+  const story = stories.find(s => s.story_id === Number(id))
+  if (!story) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">Story not found</h2>
+        <Button onClick={() => navigate('/browse')}>Browse Stories</Button>
+      </div>
+    )
+  }
+
+  const storyChapters = chapters.filter(c => c.story_id === story.story_id)
+  const storyCollabs = collaborations.filter(c => c.story_id === story.story_id)
+  const gradient = getGenreGradient(story.genres[0])
+  const myLists = currentUser ? readingLists.filter(l => l.user_id === currentUser.user_id) : []
+
+  const handleAddToList = (listId: number) => {
+    const list = readingLists.find(l => l.list_id === listId)
+    if (!list) return
+    if (list.stories.some(s => s.story_id === story.story_id)) {
+      addToast('Already in this list', 'info')
+      return
+    }
+    const item: ReadingListItem = {
+      item_id: Date.now(),
+      list_id: listId,
+      story_id: story.story_id,
+      story_title: story.title,
+      author_username: story.author_username,
+      added_at: new Date().toISOString(),
+      genres: story.genres,
+    }
+    addStoryToList(listId, item)
+    addToast(`Added to "${list.name}"!`)
+    setListModalOpen(false)
+  }
+
+  const handleCreateList = () => {
+    if (!newListName.trim() || !currentUser) return
+    const newList = {
+      list_id: Date.now(),
+      user_id: currentUser.user_id,
+      username: currentUser.username,
+      name: newListName.trim(),
+      is_public: false,
+      created_at: new Date().toISOString(),
+      stories: [{
+        item_id: Date.now() + 1,
+        list_id: Date.now(),
+        story_id: story.story_id,
+        story_title: story.title,
+        author_username: story.author_username,
+        added_at: new Date().toISOString(),
+        genres: story.genres,
+      }],
+    }
+    createReadingList(newList)
+    addToast(`Created "${newListName}" and added story!`)
+    setNewListName('')
+    setListModalOpen(false)
+  }
+
+  const isOwner = currentUser?.user_id === story.user_id
+
+  return (
+    <div className="max-w-5xl mx-auto px-4 py-8">
+      {/* Back */}
+      <button
+        onClick={() => navigate(-1)}
+        className="flex items-center gap-2 text-slate-400 hover:text-white mb-6 text-sm transition-colors"
+      >
+        <ArrowLeft size={16} />
+        Back
+      </button>
+
+      {/* Hero */}
+      <div className={`relative rounded-2xl overflow-hidden mb-8 bg-gradient-to-br ${gradient}`}>
+        <div className="absolute inset-0 bg-gradient-to-t from-slate-950/90 via-slate-950/30 to-transparent" />
+        <div className="relative p-8 sm:p-12">
+          <div className="flex flex-wrap gap-2 mb-4">
+            {story.genres.map(g => <GenreBadge key={g} genre={g} />)}
+            {story.mature_content && (
+              <span className="px-2 py-0.5 text-xs font-medium rounded-full border bg-rose-500/20 text-rose-400 border-rose-500/30">
+                18+
+              </span>
+            )}
+          </div>
+          <h1 className="font-serif text-3xl sm:text-4xl font-bold text-white mb-3">{story.title}</h1>
+          <p className="text-slate-300 text-lg mb-6 leading-relaxed max-w-2xl">{story.short_description}</p>
+
+          <div className="flex items-center gap-4 flex-wrap">
+            <div className="flex items-center gap-2">
+              <Avatar name={story.author_username} size="sm" />
+              <span className="text-white text-sm font-medium">{story.author_username}</span>
+            </div>
+            <div className="flex items-center gap-1 text-slate-400 text-sm">
+              <Eye size={14} />
+              {story.total_views.toLocaleString()} views
+            </div>
+            <div className="flex items-center gap-1 text-slate-400 text-sm">
+              <BookOpen size={14} />
+              {story.total_chapters} chapters
+            </div>
+            <div className="flex items-center gap-1 text-slate-400 text-sm">
+              <Calendar size={14} />
+              {new Date(story.created_at).toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
+        {/* Main content */}
+        <div className="lg:col-span-2 space-y-8">
+          {/* Action bar */}
+          <div className="flex items-center gap-3 flex-wrap">
+            <LikeButton storyId={story.story_id} authorUserId={story.user_id} totalLikes={story.total_likes} />
+            {currentUser && (
+              <Button variant="secondary" size="sm" onClick={() => setListModalOpen(true)}>
+                <BookmarkPlus size={14} />
+                Save to List
+              </Button>
+            )}
+            {isOwner && (
+              <Button variant="ghost" size="sm" onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}>
+                Edit Story
+              </Button>
+            )}
+          </div>
+
+          {/* Chapters */}
+          <div>
+            <div className="flex items-center justify-between mb-4">
+              <h2 className="font-serif text-xl font-bold text-white">Chapters</h2>
+              {isOwner && (
+                <Button size="sm" onClick={() => navigate(`/writer/create-chapter/${story.story_id}`)}>
+                  <Plus size={14} />
+                  Add Chapter
+                </Button>
+              )}
+            </div>
+            <ChapterList chapters={storyChapters} storyId={story.story_id} />
+          </div>
+
+          {/* Comments */}
+          <div className="border-t border-slate-700 pt-8">
+            <CommentSection storyId={story.story_id} authorUserId={story.user_id} />
+          </div>
+        </div>
+
+        {/* Sidebar */}
+        <div className="space-y-6">
+          {/* Story info */}
+          <div className="bg-slate-800 border border-slate-700 rounded-2xl p-5">
+            <h3 className="text-white font-semibold mb-4">Story Info</h3>
+            <div className="space-y-3 text-sm">
+              <div className="flex justify-between">
+                <span className="text-slate-400">Status</span>
+                <span className="text-white capitalize">{story.status}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-slate-400">Chapters</span>
+                <span className="text-white">{story.total_chapters}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-slate-400">Likes</span>
+                <span className="text-white">{story.total_likes.toLocaleString()}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-slate-400">Views</span>
+                <span className="text-white">{story.total_views.toLocaleString()}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-slate-400">Comments</span>
+                <span className="text-white">{story.total_comments}</span>
+              </div>
+              <div className="flex justify-between">
+                <span className="text-slate-400">Published</span>
+                <span className="text-white">{new Date(story.created_at).toLocaleDateString()}</span>
+              </div>
+            </div>
+          </div>
+
+          {/* Collaborators */}
+          {storyCollabs.length > 0 && (
+            <div className="bg-slate-800 border border-slate-700 rounded-2xl p-5">
+              <div className="flex items-center gap-2 mb-4">
+                <Users size={16} className="text-violet-400" />
+                <h3 className="text-white font-semibold">Collaborators</h3>
+              </div>
+              <div className="space-y-3">
+                {storyCollabs.map(c => (
+                  <div key={c.collab_id} className="flex items-center gap-2">
+                    <Avatar name={c.name} size="sm" />
+                    <div>
+                      <p className="text-white text-sm">@{c.username}</p>
+                      <p className="text-slate-500 text-xs">{c.role}</p>
+                    </div>
+                  </div>
+                ))}
+              </div>
+            </div>
+          )}
+        </div>
+      </div>
+
+      {/* Reading list modal */}
+      <Modal isOpen={listModalOpen} onClose={() => setListModalOpen(false)} title="Save to Reading List">
+        <div className="space-y-3">
+          {myLists.length > 0 ? (
+            <>
+              <p className="text-slate-400 text-sm mb-3">Select a list:</p>
+              {myLists.map(list => (
+                <button
+                  key={list.list_id}
+                  onClick={() => handleAddToList(list.list_id)}
+                  className="w-full flex items-center justify-between p-3 bg-slate-800 rounded-xl border border-slate-700 hover:border-indigo-500/50 transition-colors"
+                >
+                  <span className="text-white text-sm">{list.name}</span>
+                  <span className="text-slate-500 text-xs">{list.stories.length} stories</span>
+                </button>
+              ))}
+              <div className="border-t border-slate-700 pt-3">
+                <p className="text-slate-400 text-sm mb-2">Or create a new list:</p>
+                <div className="flex gap-2">
+                  <input
+                    value={newListName}
+                    onChange={e => setNewListName(e.target.value)}
+                    placeholder="List name..."
+                    className="flex-1 px-3 py-2 bg-slate-800 border border-slate-700 rounded-xl text-white text-sm placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+                  />
+                  <Button size="sm" onClick={handleCreateList} disabled={!newListName.trim()}>
+                    Create
+                  </Button>
+                </div>
+              </div>
+            </>
+          ) : (
+            <div>
+              <p className="text-slate-400 text-sm mb-3">You don't have any reading lists yet. Create one:</p>
+              <div className="flex gap-2">
+                <input
+                  value={newListName}
+                  onChange={e => setNewListName(e.target.value)}
+                  placeholder="My Favorites..."
+                  className="flex-1 px-3 py-2 bg-slate-800 border border-slate-700 rounded-xl text-white text-sm placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+                />
+                <Button size="sm" onClick={handleCreateList} disabled={!newListName.trim()}>
+                  Create
+                </Button>
+              </div>
+            </div>
+          )}
+        </div>
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/writer/CreateChapterPage.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/CreateChapterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/writer/CreateChapterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,120 @@
+import React, { useState } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft, BookOpen } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { Chapter } from '../../types'
+
+export const CreateChapterPage: React.FC = () => {
+  const { storyId } = useParams<{ storyId: string }>()
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { stories, chapters, addChapter } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [form, setForm] = useState({ title: '', content: '' })
+  const [errors, setErrors] = useState<Record<string, string>>({})
+  const [loading, setLoading] = useState(false)
+
+  const story = stories.find(s => s.story_id === Number(storyId))
+  const storyChapters = chapters.filter(c => c.story_id === Number(storyId))
+  const wordCount = form.content.trim().split(/\s+/).filter(Boolean).length
+
+  if (!story) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">Story not found</h2>
+        <Button onClick={() => navigate('/writer')}>Back</Button>
+      </div>
+    )
+  }
+
+  const validate = () => {
+    const e: Record<string, string> = {}
+    if (!form.title.trim()) e.title = 'Chapter title is required'
+    if (!form.content.trim()) e.content = 'Chapter content is required'
+    if (wordCount < 10) e.content = 'Chapter must be at least 10 words'
+    setErrors(e)
+    return Object.keys(e).length === 0
+  }
+
+  const handleSubmit = async (isPublished: boolean) => {
+    if (!validate() || !currentUser) return
+    setLoading(true)
+    await new Promise(r => setTimeout(r, 400))
+    const chapter: Chapter = {
+      chapter_id: Date.now(),
+      story_id: Number(storyId),
+      title: form.title.trim(),
+      content: form.content.trim(),
+      chapter_number: storyChapters.length + 1,
+      word_count: wordCount,
+      view_count: 0,
+      created_at: new Date().toISOString(),
+      updated_at: new Date().toISOString(),
+      is_published: isPublished,
+    }
+    addChapter(chapter)
+    addToast(isPublished ? 'Chapter published!' : 'Chapter saved as draft!')
+    navigate(`/writer/edit-story/${storyId}`)
+    setLoading(false)
+  }
+
+  return (
+    <div className="max-w-3xl mx-auto px-4 py-8">
+      <div className="flex items-center gap-3 mb-8">
+        <button onClick={() => navigate(`/writer/edit-story/${storyId}`)} className="text-slate-400 hover:text-white transition-colors">
+          <ArrowLeft size={20} />
+        </button>
+        <div>
+          <p className="text-slate-400 text-sm">{story.title}</p>
+          <h1 className="font-serif text-2xl font-bold text-white">New Chapter</h1>
+          <p className="text-slate-500 text-xs mt-0.5">Chapter {storyChapters.length + 1}</p>
+        </div>
+      </div>
+
+      <div className="space-y-6">
+        <div>
+          <label className="block text-sm font-medium text-slate-300 mb-1.5">Chapter Title *</label>
+          <input
+            value={form.title}
+            onChange={e => { setForm(f => ({ ...f, title: e.target.value })); setErrors(e => ({ ...e, title: '' })) }}
+            placeholder="The Awakening..."
+            className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 font-serif text-lg ${errors.title ? 'border-rose-500' : 'border-slate-700'}`}
+          />
+          {errors.title && <p className="text-rose-400 text-xs mt-1">{errors.title}</p>}
+        </div>
+
+        <div>
+          <div className="flex items-center justify-between mb-1.5">
+            <label className="text-sm font-medium text-slate-300">Chapter Content *</label>
+            <div className="flex items-center gap-2 text-xs text-slate-500">
+              <BookOpen size={12} />
+              <span className={wordCount > 100 ? 'text-emerald-400' : wordCount > 50 ? 'text-amber-400' : 'text-slate-500'}>
+                {wordCount.toLocaleString()} words
+              </span>
+            </div>
+          </div>
+          <textarea
+            value={form.content}
+            onChange={e => { setForm(f => ({ ...f, content: e.target.value })); setErrors(e => ({ ...e, content: '' })) }}
+            placeholder="Begin your chapter here..."
+            rows={20}
+            className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-y font-serif text-base leading-relaxed ${errors.content ? 'border-rose-500' : 'border-slate-700'}`}
+          />
+          {errors.content && <p className="text-rose-400 text-xs mt-1">{errors.content}</p>}
+        </div>
+
+        <div className="flex gap-3 pt-4 border-t border-slate-700">
+          <Button variant="secondary" className="flex-1" onClick={() => handleSubmit(false)} loading={loading}>
+            Save as Draft
+          </Button>
+          <Button className="flex-1" onClick={() => handleSubmit(true)} loading={loading}>
+            Publish Chapter
+          </Button>
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/writer/CreateStoryPage.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/CreateStoryPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/writer/CreateStoryPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,190 @@
+import React, { useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Feather, ArrowLeft, X } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { Story } from '../../types'
+
+const ALL_GENRES = ['Fantasy', 'Sci-Fi', 'Romance', 'Historical Fiction', 'Adventure', 'Thriller', 'Mystery', 'Horror', 'Contemporary', 'Poetry']
+
+export const CreateStoryPage: React.FC = () => {
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { addStory } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [form, setForm] = useState({
+    title: '',
+    short_description: '',
+    content: '',
+    genres: [] as string[],
+    mature_content: false,
+  })
+  const [errors, setErrors] = useState<Record<string, string>>({})
+  const [loading, setLoading] = useState(false)
+
+  const validate = () => {
+    const e: Record<string, string> = {}
+    if (!form.title.trim()) e.title = 'Title is required'
+    if (!form.short_description.trim()) e.short_description = 'Description is required'
+    if (form.short_description.length > 280) e.short_description = 'Max 280 characters'
+    if (!form.content.trim()) e.content = 'Story content is required'
+    if (form.genres.length === 0) e.genres = 'Select at least one genre'
+    setErrors(e)
+    return Object.keys(e).length === 0
+  }
+
+  const handleSubmit = async (status: 'draft' | 'published') => {
+    if (!validate() || !currentUser) return
+    setLoading(true)
+    await new Promise(r => setTimeout(r, 500))
+    const story: Story = {
+      story_id: Date.now(),
+      ...form,
+      user_id: currentUser.user_id,
+      author_username: currentUser.username,
+      status,
+      created_at: new Date().toISOString(),
+      updated_at: new Date().toISOString(),
+      total_likes: 0,
+      total_comments: 0,
+      total_chapters: 0,
+      total_views: 0,
+    }
+    addStory(story)
+    addToast(status === 'published' ? 'Story published!' : 'Draft saved!')
+    navigate(`/writer/edit-story/${story.story_id}`)
+    setLoading(false)
+  }
+
+  const toggleGenre = (g: string) => {
+    setForm(f => ({
+      ...f,
+      genres: f.genres.includes(g) ? f.genres.filter(x => x !== g) : [...f.genres, g],
+    }))
+    setErrors(e => ({ ...e, genres: '' }))
+  }
+
+  const setField = (field: string, value: string | boolean) => {
+    setForm(f => ({ ...f, [field]: value }))
+    setErrors(e => ({ ...e, [field]: '' }))
+  }
+
+  return (
+    <div className="max-w-3xl mx-auto px-4 py-8">
+      <div className="flex items-center gap-3 mb-8">
+        <button onClick={() => navigate('/writer')} className="text-slate-400 hover:text-white transition-colors">
+          <ArrowLeft size={20} />
+        </button>
+        <div>
+          <h1 className="font-serif text-2xl font-bold text-white">Create New Story</h1>
+          <p className="text-slate-400 text-sm mt-0.5">Tell your story to the world</p>
+        </div>
+      </div>
+
+      <div className="space-y-6">
+        {/* Title */}
+        <div>
+          <label className="block text-sm font-medium text-slate-300 mb-1.5">Story Title *</label>
+          <input
+            value={form.title}
+            onChange={e => setField('title', e.target.value)}
+            placeholder="The Chronicles of Eldoria..."
+            className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 text-lg font-serif ${errors.title ? 'border-rose-500' : 'border-slate-700'}`}
+          />
+          {errors.title && <p className="text-rose-400 text-xs mt-1">{errors.title}</p>}
+        </div>
+
+        {/* Short description */}
+        <div>
+          <label className="block text-sm font-medium text-slate-300 mb-1.5">Short Description * <span className="text-slate-500 font-normal">(shown on story cards)</span></label>
+          <textarea
+            value={form.short_description}
+            onChange={e => setField('short_description', e.target.value)}
+            placeholder="When the last dragon awakens..."
+            rows={3}
+            maxLength={280}
+            className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-none ${errors.short_description ? 'border-rose-500' : 'border-slate-700'}`}
+          />
+          <div className="flex justify-between items-center mt-1">
+            {errors.short_description ? <p className="text-rose-400 text-xs">{errors.short_description}</p> : <span />}
+            <span className="text-slate-600 text-xs">{form.short_description.length}/280</span>
+          </div>
+        </div>
+
+        {/* Content */}
+        <div>
+          <label className="block text-sm font-medium text-slate-300 mb-1.5">Story Content *</label>
+          <textarea
+            value={form.content}
+            onChange={e => setField('content', e.target.value)}
+            placeholder="Begin your story here. This is the introduction that readers will see..."
+            rows={8}
+            className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-y font-serif ${errors.content ? 'border-rose-500' : 'border-slate-700'}`}
+          />
+          {errors.content && <p className="text-rose-400 text-xs mt-1">{errors.content}</p>}
+        </div>
+
+        {/* Genres */}
+        <div>
+          <label className="block text-sm font-medium text-slate-300 mb-2">Genres * <span className="text-slate-500 font-normal">(select 1-3)</span></label>
+          <div className="flex flex-wrap gap-2 mb-2">
+            {ALL_GENRES.map(g => (
+              <button
+                key={g}
+                type="button"
+                onClick={() => toggleGenre(g)}
+                className={`px-3 py-1.5 rounded-full text-sm border transition-all ${
+                  form.genres.includes(g)
+                    ? 'bg-indigo-500/30 text-indigo-300 border-indigo-500/50'
+                    : 'bg-slate-800 text-slate-400 border-slate-700 hover:border-slate-500'
+                }`}
+              >
+                {form.genres.includes(g) && <span className="mr-1">✓</span>}
+                {g}
+              </button>
+            ))}
+          </div>
+          {form.genres.length > 0 && (
+            <div className="flex flex-wrap gap-1 mt-1">
+              {form.genres.map(g => (
+                <span key={g} className="flex items-center gap-1 text-xs px-2 py-0.5 bg-indigo-500/20 text-indigo-300 rounded-full">
+                  {g}
+                  <button onClick={() => toggleGenre(g)}><X size={10} /></button>
+                </span>
+              ))}
+            </div>
+          )}
+          {errors.genres && <p className="text-rose-400 text-xs mt-1">{errors.genres}</p>}
+        </div>
+
+        {/* Mature content */}
+        <div className="flex items-center gap-3">
+          <button
+            type="button"
+            onClick={() => setField('mature_content', !form.mature_content)}
+            className={`w-11 h-6 rounded-full transition-colors ${form.mature_content ? 'bg-rose-500' : 'bg-slate-600'} relative flex-shrink-0`}
+          >
+            <div className={`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${form.mature_content ? 'translate-x-6' : 'translate-x-1'}`} />
+          </button>
+          <div>
+            <p className="text-white text-sm font-medium">Mature Content (18+)</p>
+            <p className="text-slate-500 text-xs">Enable for stories with adult themes</p>
+          </div>
+        </div>
+
+        {/* Actions */}
+        <div className="flex gap-3 pt-4 border-t border-slate-700">
+          <Button variant="secondary" className="flex-1" onClick={() => handleSubmit('draft')} loading={loading}>
+            Save as Draft
+          </Button>
+          <Button className="flex-1" onClick={() => handleSubmit('published')} loading={loading}>
+            <Feather size={16} />
+            Publish Story
+          </Button>
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/writer/EditChapterPage.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/EditChapterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/writer/EditChapterPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,123 @@
+import React, { useState, useEffect } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft, Save, Globe, BookOpen } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { AISuggestionPanel } from '../../components/writer/AISuggestionPanel'
+
+export const EditChapterPage: React.FC = () => {
+  const { chapterId } = useParams<{ chapterId: string }>()
+  const navigate = useNavigate()
+  const { stories, chapters, updateChapter } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [saving, setSaving] = useState(false)
+
+  const chapter = chapters.find(c => c.chapter_id === Number(chapterId))
+  const story = chapter ? stories.find(s => s.story_id === chapter.story_id) : null
+
+  const [form, setForm] = useState({ title: '', content: '' })
+
+  useEffect(() => {
+    if (chapter) {
+      setForm({ title: chapter.title, content: chapter.content })
+    }
+  }, [chapter?.chapter_id])
+
+  if (!chapter || !story) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">Chapter not found</h2>
+        <Button onClick={() => navigate('/writer')}>Back</Button>
+      </div>
+    )
+  }
+
+  const wordCount = form.content.trim().split(/\s+/).filter(Boolean).length
+
+  const handleSave = async (publish?: boolean) => {
+    setSaving(true)
+    await new Promise(r => setTimeout(r, 400))
+    updateChapter(chapter.chapter_id, {
+      ...form,
+      word_count: wordCount,
+      is_published: publish !== undefined ? publish : chapter.is_published,
+    })
+    addToast('Chapter saved!')
+    setSaving(false)
+  }
+
+  return (
+    <div className="max-w-5xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="flex items-center justify-between mb-8">
+        <div className="flex items-center gap-3">
+          <button
+            onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}
+            className="text-slate-400 hover:text-white transition-colors"
+          >
+            <ArrowLeft size={20} />
+          </button>
+          <div>
+            <p className="text-slate-400 text-sm">{story.title} · Chapter {chapter.chapter_number}</p>
+            <h1 className="font-serif text-2xl font-bold text-white">Edit Chapter</h1>
+          </div>
+        </div>
+        <div className="flex gap-2">
+          {!chapter.is_published && (
+            <Button size="sm" variant="secondary" onClick={() => handleSave(true)} loading={saving}>
+              <Globe size={14} />
+              Publish
+            </Button>
+          )}
+          <Button size="sm" onClick={() => handleSave()} loading={saving}>
+            <Save size={14} />
+            Save
+          </Button>
+        </div>
+      </div>
+
+      <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
+        {/* Editor */}
+        <div className="lg:col-span-2 space-y-5">
+          <div>
+            <label className="block text-sm font-medium text-slate-300 mb-1.5">Chapter Title</label>
+            <input
+              value={form.title}
+              onChange={e => setForm(f => ({ ...f, title: e.target.value }))}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white focus:outline-none focus:border-indigo-500 font-serif text-lg"
+            />
+          </div>
+          <div>
+            <div className="flex items-center justify-between mb-1.5">
+              <label className="text-sm font-medium text-slate-300">Content</label>
+              <span className="flex items-center gap-1 text-xs text-slate-500">
+                <BookOpen size={12} />
+                {wordCount.toLocaleString()} words
+              </span>
+            </div>
+            <textarea
+              value={form.content}
+              onChange={e => setForm(f => ({ ...f, content: e.target.value }))}
+              rows={24}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white focus:outline-none focus:border-indigo-500 resize-y font-serif text-base leading-relaxed"
+            />
+          </div>
+
+          <div className={`text-xs px-3 py-2 rounded-lg flex items-center gap-2 ${
+            chapter.is_published
+              ? 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/20'
+              : 'bg-amber-500/10 text-amber-400 border border-amber-500/20'
+          }`}>
+            {chapter.is_published ? 'Published — visible to readers' : 'Draft — not visible to readers'}
+          </div>
+        </div>
+
+        {/* AI Suggestions panel */}
+        <div>
+          <AISuggestionPanel chapterId={chapter.chapter_id} storyId={chapter.story_id} />
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/writer/EditStoryPage.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/EditStoryPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/writer/EditStoryPage.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,221 @@
+import React, { useState, useEffect } from 'react'
+import { useParams, useNavigate } from 'react-router-dom'
+import { ArrowLeft, Plus, Save, Globe, Archive, Trash2 } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { Button } from '../../components/ui/Button'
+import { ChapterList } from '../../components/story/ChapterList'
+import { CollaboratorManager } from '../../components/writer/CollaboratorManager'
+import { Modal } from '../../components/ui/Modal'
+
+const ALL_GENRES = ['Fantasy', 'Sci-Fi', 'Romance', 'Historical Fiction', 'Adventure', 'Thriller', 'Mystery', 'Horror', 'Contemporary', 'Poetry']
+
+export const EditStoryPage: React.FC = () => {
+  const { id } = useParams<{ id: string }>()
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { stories, chapters, updateStory, deleteStory, updateStoryStatus } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [deleteConfirm, setDeleteConfirm] = useState(false)
+  const [saving, setSaving] = useState(false)
+
+  const story = stories.find(s => s.story_id === Number(id))
+
+  const [form, setForm] = useState({
+    title: '',
+    short_description: '',
+    content: '',
+    genres: [] as string[],
+    mature_content: false,
+  })
+
+  useEffect(() => {
+    if (story) {
+      setForm({
+        title: story.title,
+        short_description: story.short_description,
+        content: story.content,
+        genres: [...story.genres],
+        mature_content: story.mature_content,
+      })
+    }
+  }, [story?.story_id])
+
+  if (!story) {
+    return (
+      <div className="max-w-4xl mx-auto px-4 py-20 text-center">
+        <h2 className="text-2xl text-white mb-4">Story not found</h2>
+        <Button onClick={() => navigate('/writer')}>Back to Dashboard</Button>
+      </div>
+    )
+  }
+
+  const canEdit = currentUser?.user_id === story.user_id || currentUser?.role === 'admin'
+  if (!canEdit) navigate('/writer')
+
+  const storyChapters = chapters.filter(c => c.story_id === story.story_id)
+
+  const handleSave = async () => {
+    setSaving(true)
+    await new Promise(r => setTimeout(r, 400))
+    updateStory(story.story_id, { ...form, updated_at: new Date().toISOString() })
+    addToast('Story updated!')
+    setSaving(false)
+  }
+
+  const handleDelete = () => {
+    deleteStory(story.story_id)
+    addToast('Story deleted', 'info')
+    navigate('/writer')
+  }
+
+  const toggleGenre = (g: string) =>
+    setForm(f => ({
+      ...f,
+      genres: f.genres.includes(g) ? f.genres.filter(x => x !== g) : [...f.genres, g],
+    }))
+
+  return (
+    <div className="max-w-5xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="flex items-center justify-between mb-8">
+        <div className="flex items-center gap-3">
+          <button onClick={() => navigate('/writer')} className="text-slate-400 hover:text-white transition-colors">
+            <ArrowLeft size={20} />
+          </button>
+          <div>
+            <h1 className="font-serif text-2xl font-bold text-white">Edit Story</h1>
+            <p className="text-slate-400 text-sm mt-0.5">Status: <span className="capitalize text-white">{story.status}</span></p>
+          </div>
+        </div>
+        <div className="flex gap-2">
+          {story.status === 'draft' && (
+            <Button size="sm" variant="secondary" onClick={() => { updateStoryStatus(story.story_id, 'published'); addToast('Story published!') }}>
+              <Globe size={14} />
+              Publish
+            </Button>
+          )}
+          {story.status === 'published' && (
+            <Button size="sm" variant="ghost" onClick={() => { updateStoryStatus(story.story_id, 'archived'); addToast('Story archived', 'info') }}>
+              <Archive size={14} />
+              Archive
+            </Button>
+          )}
+          <Button size="sm" variant="danger" onClick={() => setDeleteConfirm(true)}>
+            <Trash2 size={14} />
+          </Button>
+          <Button size="sm" onClick={handleSave} loading={saving}>
+            <Save size={14} />
+            Save
+          </Button>
+        </div>
+      </div>
+
+      <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
+        {/* Form */}
+        <div className="lg:col-span-2 space-y-6">
+          <div>
+            <label className="block text-sm font-medium text-slate-300 mb-1.5">Title</label>
+            <input
+              value={form.title}
+              onChange={e => setForm(f => ({ ...f, title: e.target.value }))}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white focus:outline-none focus:border-indigo-500 font-serif text-lg"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-slate-300 mb-1.5">Short Description</label>
+            <textarea
+              value={form.short_description}
+              onChange={e => setForm(f => ({ ...f, short_description: e.target.value }))}
+              rows={3}
+              maxLength={280}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white focus:outline-none focus:border-indigo-500 resize-none"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-slate-300 mb-1.5">Story Content</label>
+            <textarea
+              value={form.content}
+              onChange={e => setForm(f => ({ ...f, content: e.target.value }))}
+              rows={6}
+              className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white focus:outline-none focus:border-indigo-500 resize-y font-serif"
+            />
+          </div>
+          <div>
+            <label className="block text-sm font-medium text-slate-300 mb-2">Genres</label>
+            <div className="flex flex-wrap gap-2">
+              {ALL_GENRES.map(g => (
+                <button
+                  key={g}
+                  type="button"
+                  onClick={() => toggleGenre(g)}
+                  className={`px-3 py-1.5 rounded-full text-sm border transition-all ${
+                    form.genres.includes(g)
+                      ? 'bg-indigo-500/30 text-indigo-300 border-indigo-500/50'
+                      : 'bg-slate-800 text-slate-400 border-slate-700 hover:border-slate-500'
+                  }`}
+                >
+                  {g}
+                </button>
+              ))}
+            </div>
+          </div>
+          <div className="flex items-center gap-3">
+            <button
+              type="button"
+              onClick={() => setForm(f => ({ ...f, mature_content: !f.mature_content }))}
+              className={`w-11 h-6 rounded-full transition-colors ${form.mature_content ? 'bg-rose-500' : 'bg-slate-600'} relative`}
+            >
+              <div className={`absolute top-1 w-4 h-4 bg-white rounded-full transition-transform ${form.mature_content ? 'translate-x-6' : 'translate-x-1'}`} />
+            </button>
+            <span className="text-sm text-slate-300">Mature Content (18+)</span>
+          </div>
+        </div>
+
+        {/* Sidebar */}
+        <div className="space-y-6">
+          {/* Chapters */}
+          <div className="bg-slate-800 border border-slate-700 rounded-2xl p-5">
+            <div className="flex items-center justify-between mb-4">
+              <h3 className="text-white font-semibold">Chapters</h3>
+              <Button size="sm" onClick={() => navigate(`/writer/create-chapter/${story.story_id}`)}>
+                <Plus size={13} />
+                Add
+              </Button>
+            </div>
+            <ChapterList
+              chapters={storyChapters}
+              storyId={story.story_id}
+              showEditLinks
+              onEdit={cid => navigate(`/writer/edit-chapter/${cid}`)}
+            />
+          </div>
+
+          {/* Collaborators */}
+          <CollaboratorManager
+            storyId={story.story_id}
+            storyTitle={story.title}
+            ownerId={story.user_id}
+          />
+        </div>
+      </div>
+
+      {/* Delete confirm */}
+      <Modal isOpen={deleteConfirm} onClose={() => setDeleteConfirm(false)} title="Delete Story" size="sm">
+        <div className="space-y-4">
+          <p className="text-slate-300 text-sm">
+            Are you sure you want to permanently delete "{story.title}"? This cannot be undone.
+          </p>
+          <div className="flex gap-3">
+            <Button variant="secondary" className="flex-1" onClick={() => setDeleteConfirm(false)}>Cancel</Button>
+            <Button variant="danger" className="flex-1" onClick={handleDelete}>
+              <Trash2 size={14} />
+              Delete
+            </Button>
+          </div>
+        </div>
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/pages/writer/WriterDashboard.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/WriterDashboard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/pages/writer/WriterDashboard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,151 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Plus, BookOpen, Eye, Heart, MessageCircle, TrendingUp, Bell } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { Button } from '../../components/ui/Button'
+import { StatusBadge } from '../../components/ui/Badge'
+import { StoryAnalytics } from '../../components/writer/StoryAnalytics'
+
+function timeAgo(str: string): string {
+  const diff = Date.now() - new Date(str).getTime()
+  const m = Math.floor(diff / 60000)
+  if (m < 1) return 'just now'
+  if (m < 60) return `${m}m ago`
+  const h = Math.floor(m / 60)
+  if (h < 24) return `${h}h ago`
+  return `${Math.floor(h / 24)}d ago`
+}
+
+export const WriterDashboard: React.FC = () => {
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { stories } = useStoryStore()
+  const { notifications } = useNotificationStore()
+
+  if (!currentUser) return null
+
+  const myStories = stories.filter(s => s.user_id === currentUser.user_id)
+  const published = myStories.filter(s => s.status === 'published')
+  const drafts = myStories.filter(s => s.status === 'draft')
+  const totalViews = myStories.reduce((acc, s) => acc + s.total_views, 0)
+  const totalLikes = myStories.reduce((acc, s) => acc + s.total_likes, 0)
+
+  const recentNotifs = notifications.slice(0, 5)
+
+  return (
+    <div className="max-w-7xl mx-auto px-4 py-8">
+      {/* Header */}
+      <div className="flex items-center justify-between mb-8">
+        <div>
+          <h1 className="font-serif text-3xl font-bold text-white">
+            Welcome back, {currentUser.name}!
+          </h1>
+          <p className="text-slate-400 mt-1">Here's how your stories are performing</p>
+        </div>
+        <Button onClick={() => navigate('/writer/create-story')}>
+          <Plus size={16} />
+          New Story
+        </Button>
+      </div>
+
+      {/* Stats */}
+      <div className="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
+        {[
+          { icon: <BookOpen size={20} className="text-indigo-300" />, label: 'Total Stories', value: myStories.length, sub: `${published.length} published`, color: 'bg-indigo-500/20' },
+          { icon: <Eye size={20} className="text-blue-300" />, label: 'Total Views', value: totalViews.toLocaleString(), sub: 'All time', color: 'bg-blue-500/20' },
+          { icon: <Heart size={20} className="text-rose-300" />, label: 'Total Likes', value: totalLikes.toLocaleString(), sub: 'Across all stories', color: 'bg-rose-500/20' },
+          { icon: <TrendingUp size={20} className="text-emerald-300" />, label: 'Drafts', value: drafts.length, sub: 'In progress', color: 'bg-emerald-500/20' },
+        ].map(s => (
+          <div key={s.label} className="bg-slate-800 border border-slate-700 rounded-2xl p-5">
+            <div className={`w-10 h-10 rounded-xl ${s.color} flex items-center justify-center mb-3`}>
+              {s.icon}
+            </div>
+            <p className="text-2xl font-bold text-white">{s.value}</p>
+            <p className="text-slate-400 text-sm mt-0.5">{s.label}</p>
+            <p className="text-slate-600 text-xs mt-0.5">{s.sub}</p>
+          </div>
+        ))}
+      </div>
+
+      <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
+        {/* My stories */}
+        <div className="lg:col-span-2">
+          <div className="flex items-center justify-between mb-4">
+            <h2 className="font-serif text-xl font-bold text-white">My Stories</h2>
+          </div>
+          {myStories.length === 0 ? (
+            <div className="bg-slate-800 border border-slate-700 rounded-2xl p-12 text-center">
+              <BookOpen size={40} className="mx-auto mb-4 text-slate-600" />
+              <h3 className="text-white font-medium mb-2">No stories yet</h3>
+              <p className="text-slate-500 text-sm mb-4">Start your writing journey today!</p>
+              <Button onClick={() => navigate('/writer/create-story')}>
+                <Plus size={14} />
+                Create Your First Story
+              </Button>
+            </div>
+          ) : (
+            <div className="space-y-3">
+              {myStories.map(story => (
+                <div key={story.story_id} className="flex items-center gap-4 p-4 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/40 transition-colors">
+                  <div className="flex-1 min-w-0">
+                    <div className="flex items-center gap-2 mb-1">
+                      <h3 className="text-white font-medium text-sm truncate">{story.title}</h3>
+                      <StatusBadge status={story.status} />
+                    </div>
+                    <div className="flex items-center gap-3 text-slate-500 text-xs">
+                      <span className="flex items-center gap-1"><Eye size={11} /> {story.total_views.toLocaleString()}</span>
+                      <span className="flex items-center gap-1"><Heart size={11} /> {story.total_likes}</span>
+                      <span className="flex items-center gap-1"><MessageCircle size={11} /> {story.total_comments}</span>
+                      <span>{story.total_chapters} chapters</span>
+                    </div>
+                  </div>
+                  <div className="flex gap-2 flex-shrink-0">
+                    <Button size="sm" variant="ghost" onClick={() => navigate(`/story/${story.story_id}`)}>View</Button>
+                    <Button size="sm" variant="secondary" onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}>Edit</Button>
+                  </div>
+                </div>
+              ))}
+            </div>
+          )}
+        </div>
+
+        {/* Recent notifications */}
+        <div>
+          <div className="flex items-center gap-2 mb-4">
+            <Bell size={16} className="text-amber-400" />
+            <h2 className="font-serif text-xl font-bold text-white">Recent Activity</h2>
+          </div>
+          <div className="space-y-2">
+            {recentNotifs.length === 0 ? (
+              <div className="text-center py-8 text-slate-500 text-sm">No recent activity</div>
+            ) : (
+              recentNotifs.map(n => (
+                <div key={n.notification_id} className={`p-3 rounded-xl border text-sm ${
+                  !n.is_read ? 'bg-indigo-500/5 border-indigo-500/20' : 'bg-slate-800 border-slate-700'
+                }`}>
+                  <p className="text-white text-xs font-medium">{n.title}</p>
+                  <p className="text-slate-400 text-xs mt-0.5 line-clamp-2">{n.message}</p>
+                  <p className="text-slate-600 text-xs mt-1">{timeAgo(n.created_at)}</p>
+                </div>
+              ))
+            )}
+          </div>
+        </div>
+      </div>
+
+      {/* Analytics */}
+      {myStories.some(s => s.status === 'published') && (
+        <div className="mt-10">
+          <div className="flex items-center gap-2 mb-6">
+            <TrendingUp size={18} className="text-indigo-400" />
+            <h2 className="font-serif text-xl font-bold text-white">Analytics</h2>
+            <span className="text-slate-500 text-sm">(Story: The Chronicles of Eldoria)</span>
+          </div>
+          <StoryAnalytics />
+        </div>
+      )}
+    </div>
+  )
+}
