Index: chapterx-frontend/src/components/DevSwitcher.tsx
===================================================================
--- chapterx-frontend/src/components/DevSwitcher.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/DevSwitcher.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,82 @@
+import React, { useState } from 'react'
+import { Code2, X, User } from 'lucide-react'
+import { useAuthStore } from '../store/authStore'
+import { Avatar } from './ui/Avatar'
+import { RoleBadge } from './ui/Badge'
+import { useUIStore } from '../store/uiStore'
+
+const DEV_USERS = [
+  { user_id: 0, username: 'Guest', name: 'Guest', role: 'guest' as const },
+  { user_id: 1, username: 'admin_alex', name: 'Alex Admin', role: 'admin' as const },
+  { user_id: 2, username: 'elena_writes', name: 'Elena Dimitrova', role: 'writer' as const },
+  { user_id: 3, username: 'marco_author', name: 'Marco Rossi', role: 'writer' as const },
+  { user_id: 4, username: 'sara_reader', name: 'Sara Petkovska', role: 'regular' as const },
+  { user_id: 9, username: 'boris_writer', name: 'Boris Nikolov', role: 'writer' as const },
+]
+
+export const DevSwitcher: React.FC = () => {
+  const [open, setOpen] = useState(false)
+  const { currentUser, switchUser } = useAuthStore()
+  const { addToast } = useUIStore()
+
+  const handleSwitch = (userId: number, name: string, role: string) => {
+    switchUser(userId)
+    addToast(`Switched to ${name} (${role})`)
+    setOpen(false)
+  }
+
+  return (
+    <div className="fixed bottom-6 left-6 z-[90]">
+      {open && (
+        <div className="absolute bottom-12 left-0 w-64 bg-slate-900 border border-indigo-500/30 rounded-2xl shadow-2xl overflow-hidden">
+          <div className="flex items-center justify-between px-4 py-3 border-b border-slate-700 bg-indigo-500/10">
+            <div className="flex items-center gap-2">
+              <Code2 size={14} className="text-indigo-400" />
+              <span className="text-indigo-300 text-xs font-semibold uppercase tracking-wide">Dev Switcher</span>
+            </div>
+            <button onClick={() => setOpen(false)} className="text-slate-400 hover:text-white">
+              <X size={14} />
+            </button>
+          </div>
+          <div className="p-2">
+            {DEV_USERS.map(u => (
+              <button
+                key={u.user_id}
+                onClick={() => handleSwitch(u.user_id, u.name, u.role)}
+                className={`w-full flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all ${
+                  (currentUser?.user_id === u.user_id) || (!currentUser && u.user_id === 0)
+                    ? 'bg-indigo-600/20 border border-indigo-500/40'
+                    : 'hover:bg-slate-800 border border-transparent'
+                }`}
+              >
+                {u.user_id === 0 ? (
+                  <div className="w-8 h-8 rounded-full bg-slate-700 flex items-center justify-center">
+                    <User size={14} className="text-slate-400" />
+                  </div>
+                ) : (
+                  <Avatar name={u.name} size="sm" />
+                )}
+                <div className="flex-1 text-left">
+                  <p className="text-white text-sm font-medium">{u.name}</p>
+                  <p className="text-slate-500 text-xs">@{u.username}</p>
+                </div>
+                <RoleBadge role={u.role} />
+              </button>
+            ))}
+          </div>
+          <div className="px-4 py-2 border-t border-slate-700 text-center">
+            <p className="text-slate-600 text-xs">Development only</p>
+          </div>
+        </div>
+      )}
+
+      <button
+        onClick={() => setOpen(!open)}
+        className="w-10 h-10 rounded-xl bg-indigo-600 hover:bg-indigo-500 text-white flex items-center justify-center shadow-lg hover:shadow-indigo-500/25 transition-all hover:scale-110 border border-indigo-500"
+        title="Dev User Switcher"
+      >
+        <Code2 size={16} />
+      </button>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/admin/ContentModerationTable.tsx
===================================================================
--- chapterx-frontend/src/components/admin/ContentModerationTable.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/admin/ContentModerationTable.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,124 @@
+import React, { useState } from 'react'
+import { Trash2, Eye, AlertTriangle } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { useUIStore } from '../../store/uiStore'
+import { Story } from '../../types'
+import { StatusBadge, GenreBadge } from '../ui/Badge'
+import { Button } from '../ui/Button'
+import { Modal } from '../ui/Modal'
+import { useNavigate } from 'react-router-dom'
+
+export const ContentModerationTable: React.FC = () => {
+  const { stories, deleteStory } = useStoryStore()
+  const { addNotification } = useNotificationStore()
+  const { addToast } = useUIStore()
+  const navigate = useNavigate()
+  const [confirmStory, setConfirmStory] = useState<Story | null>(null)
+
+  const handleDelete = (story: Story) => {
+    deleteStory(story.story_id)
+    addNotification({
+      user_id: story.user_id,
+      type: 'system',
+      title: 'Story Removed',
+      message: `Your story "${story.title}" has been removed by an administrator.`,
+    })
+    addToast(`"${story.title}" removed from platform`, 'info')
+    setConfirmStory(null)
+  }
+
+  const formatDate = (str: string) =>
+    new Date(str).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
+
+  return (
+    <div>
+      <div className="overflow-x-auto rounded-xl border border-slate-700">
+        <table className="w-full text-sm">
+          <thead>
+            <tr className="border-b border-slate-700 bg-slate-800">
+              <th className="text-left px-4 py-3 text-slate-400 font-medium">Story</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium hidden md:table-cell">Author</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium hidden lg:table-cell">Genres</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium">Status</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium hidden sm:table-cell">Published</th>
+              <th className="text-right px-4 py-3 text-slate-400 font-medium">Actions</th>
+            </tr>
+          </thead>
+          <tbody className="divide-y divide-slate-800">
+            {stories.map(story => (
+              <tr key={story.story_id} className="hover:bg-slate-800/50 transition-colors">
+                <td className="px-4 py-3">
+                  <div>
+                    <p className="text-white font-medium line-clamp-1">{story.title}</p>
+                    {story.mature_content && (
+                      <span className="text-xs text-rose-400">18+</span>
+                    )}
+                  </div>
+                </td>
+                <td className="px-4 py-3 text-slate-400 hidden md:table-cell">@{story.author_username}</td>
+                <td className="px-4 py-3 hidden lg:table-cell">
+                  <div className="flex flex-wrap gap-1">
+                    {story.genres.slice(0, 2).map(g => <GenreBadge key={g} genre={g} />)}
+                  </div>
+                </td>
+                <td className="px-4 py-3"><StatusBadge status={story.status} /></td>
+                <td className="px-4 py-3 text-slate-500 hidden sm:table-cell">{formatDate(story.created_at)}</td>
+                <td className="px-4 py-3">
+                  <div className="flex items-center justify-end gap-2">
+                    <button
+                      onClick={() => navigate(`/story/${story.story_id}`)}
+                      className="text-slate-400 hover:text-white transition-colors p-1"
+                    >
+                      <Eye size={14} />
+                    </button>
+                    <button
+                      onClick={() => setConfirmStory(story)}
+                      className="text-slate-400 hover:text-rose-400 transition-colors p-1"
+                    >
+                      <Trash2 size={14} />
+                    </button>
+                  </div>
+                </td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+        {stories.length === 0 && (
+          <div className="text-center py-10 text-slate-500">No stories to moderate.</div>
+        )}
+      </div>
+
+      {/* Confirm modal */}
+      <Modal
+        isOpen={!!confirmStory}
+        onClose={() => setConfirmStory(null)}
+        title="Remove Story"
+        size="sm"
+      >
+        {confirmStory && (
+          <div className="space-y-4">
+            <div className="flex items-start gap-3 p-3 bg-rose-500/10 rounded-xl border border-rose-500/20">
+              <AlertTriangle size={18} className="text-rose-400 flex-shrink-0 mt-0.5" />
+              <div>
+                <p className="text-white font-medium text-sm">"{confirmStory.title}"</p>
+                <p className="text-slate-400 text-xs mt-1">
+                  This will permanently remove the story and notify the author. This action cannot be undone.
+                </p>
+              </div>
+            </div>
+            <div className="flex gap-3">
+              <Button variant="secondary" className="flex-1" onClick={() => setConfirmStory(null)}>
+                Cancel
+              </Button>
+              <Button variant="danger" className="flex-1" onClick={() => handleDelete(confirmStory)}>
+                <Trash2 size={14} />
+                Remove Story
+              </Button>
+            </div>
+          </div>
+        )}
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/admin/PlatformStats.tsx
===================================================================
--- chapterx-frontend/src/components/admin/PlatformStats.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/admin/PlatformStats.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,37 @@
+import React from 'react'
+import { Users, BookOpen, FileText, Heart, Eye, MessageCircle } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+
+export const PlatformStats: React.FC = () => {
+  const { allUsers } = useAuthStore()
+  const { stories, comments } = useStoryStore()
+
+  const totalViews = stories.reduce((acc, s) => acc + s.total_views, 0)
+  const totalLikes = stories.reduce((acc, s) => acc + s.total_likes, 0)
+  const published = stories.filter(s => s.status === 'published').length
+
+  const stats = [
+    { icon: <Users size={24} className="text-blue-300" />, label: 'Total Users', value: allUsers.length, color: 'bg-blue-500/20', change: '+12 this month' },
+    { icon: <BookOpen size={24} className="text-violet-300" />, label: 'Total Stories', value: stories.length, color: 'bg-violet-500/20', change: `${published} published` },
+    { icon: <FileText size={24} className="text-emerald-300" />, label: 'Comments', value: comments.length, color: 'bg-emerald-500/20', change: 'Platform-wide' },
+    { icon: <Heart size={24} className="text-rose-300" />, label: 'Total Likes', value: totalLikes.toLocaleString(), color: 'bg-rose-500/20', change: 'Across all stories' },
+    { icon: <Eye size={24} className="text-amber-300" />, label: 'Total Views', value: totalViews.toLocaleString(), color: 'bg-amber-500/20', change: 'All time' },
+    { icon: <MessageCircle size={24} className="text-cyan-300" />, label: 'Writers', value: allUsers.filter(u => u.role === 'writer').length, color: 'bg-cyan-500/20', change: 'Active creators' },
+  ]
+
+  return (
+    <div className="grid grid-cols-2 md:grid-cols-3 gap-4">
+      {stats.map(stat => (
+        <div key={stat.label} className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+          <div className={`w-12 h-12 rounded-xl ${stat.color} flex items-center justify-center mb-4`}>
+            {stat.icon}
+          </div>
+          <p className="text-3xl font-bold text-white mb-1">{stat.value}</p>
+          <p className="text-slate-400 text-sm font-medium">{stat.label}</p>
+          <p className="text-slate-600 text-xs mt-1">{stat.change}</p>
+        </div>
+      ))}
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/admin/UserTable.tsx
===================================================================
--- chapterx-frontend/src/components/admin/UserTable.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/admin/UserTable.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,153 @@
+import React, { useState } from 'react'
+import { Search, Shield, UserX, UserCheck } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { useUIStore } from '../../store/uiStore'
+import { User, UserRole } from '../../types'
+import { Avatar } from '../ui/Avatar'
+import { RoleBadge } from '../ui/Badge'
+import { Button } from '../ui/Button'
+import { Modal } from '../ui/Modal'
+
+export const UserTable: React.FC = () => {
+  const { allUsers, updateUserRole, currentUser } = useAuthStore()
+  const { addNotification } = useNotificationStore()
+  const { addToast } = useUIStore()
+  const [search, setSearch] = useState('')
+  const [confirmUser, setConfirmUser] = useState<User | null>(null)
+  const [confirmAction, setConfirmAction] = useState<'promote' | 'demote' | null>(null)
+
+  const filtered = allUsers.filter(
+    u =>
+      u.username.toLowerCase().includes(search.toLowerCase()) ||
+      u.email.toLowerCase().includes(search.toLowerCase()) ||
+      u.name.toLowerCase().includes(search.toLowerCase())
+  )
+
+  const handlePromote = (user: User) => {
+    const newRole: UserRole = user.role === 'regular' ? 'writer' : user.role === 'writer' ? 'admin' : 'admin'
+    updateUserRole(user.user_id, newRole)
+    addNotification({
+      user_id: user.user_id,
+      type: 'system',
+      title: 'Role Updated',
+      message: `Your account has been promoted to ${newRole}.`,
+    })
+    addToast(`${user.username} promoted to ${newRole}`)
+    setConfirmUser(null)
+  }
+
+  const handleDemote = (user: User) => {
+    const newRole: UserRole = user.role === 'admin' ? 'writer' : 'regular'
+    updateUserRole(user.user_id, newRole)
+    addToast(`${user.username} role changed to ${newRole}`, 'info')
+    setConfirmUser(null)
+  }
+
+  const formatDate = (str: string) =>
+    new Date(str).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
+
+  return (
+    <div>
+      {/* Search */}
+      <div className="relative mb-4">
+        <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 users..."
+          className="w-full pl-9 pr-4 py-2.5 bg-slate-800 border border-slate-700 rounded-xl text-sm text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500"
+        />
+      </div>
+
+      {/* Table */}
+      <div className="overflow-x-auto rounded-xl border border-slate-700">
+        <table className="w-full text-sm">
+          <thead>
+            <tr className="border-b border-slate-700 bg-slate-800">
+              <th className="text-left px-4 py-3 text-slate-400 font-medium">User</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium hidden md:table-cell">Email</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium">Role</th>
+              <th className="text-left px-4 py-3 text-slate-400 font-medium hidden sm:table-cell">Joined</th>
+              <th className="text-right px-4 py-3 text-slate-400 font-medium">Actions</th>
+            </tr>
+          </thead>
+          <tbody className="divide-y divide-slate-800">
+            {filtered.map(user => (
+              <tr key={user.user_id} className="hover:bg-slate-800/50 transition-colors">
+                <td className="px-4 py-3">
+                  <div className="flex items-center gap-3">
+                    <Avatar name={user.name} size="sm" />
+                    <div>
+                      <p className="text-white font-medium">{user.name} {user.surname}</p>
+                      <p className="text-slate-500 text-xs">@{user.username}</p>
+                    </div>
+                  </div>
+                </td>
+                <td className="px-4 py-3 text-slate-400 hidden md:table-cell">{user.email}</td>
+                <td className="px-4 py-3"><RoleBadge role={user.role} /></td>
+                <td className="px-4 py-3 text-slate-500 hidden sm:table-cell">{formatDate(user.created_at)}</td>
+                <td className="px-4 py-3">
+                  <div className="flex items-center justify-end gap-2">
+                    {user.user_id !== currentUser?.user_id && user.role !== 'admin' && (
+                      <button
+                        onClick={() => { setConfirmUser(user); setConfirmAction('promote') }}
+                        className="flex items-center gap-1 text-xs text-indigo-400 hover:text-indigo-300 px-2 py-1 rounded bg-indigo-500/10 hover:bg-indigo-500/20 transition-colors"
+                      >
+                        <UserCheck size={12} />
+                        Promote
+                      </button>
+                    )}
+                    {user.user_id !== currentUser?.user_id && user.role !== 'regular' && (
+                      <button
+                        onClick={() => { setConfirmUser(user); setConfirmAction('demote') }}
+                        className="flex items-center gap-1 text-xs text-rose-400 hover:text-rose-300 px-2 py-1 rounded bg-rose-500/10 hover:bg-rose-500/20 transition-colors"
+                      >
+                        <UserX size={12} />
+                        Demote
+                      </button>
+                    )}
+                  </div>
+                </td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+        {filtered.length === 0 && (
+          <div className="text-center py-10 text-slate-500">No users found.</div>
+        )}
+      </div>
+
+      {/* Confirm modal */}
+      <Modal
+        isOpen={!!confirmUser && !!confirmAction}
+        onClose={() => { setConfirmUser(null); setConfirmAction(null) }}
+        title={confirmAction === 'promote' ? 'Promote User' : 'Demote User'}
+        size="sm"
+      >
+        {confirmUser && (
+          <div className="space-y-4">
+            <p className="text-slate-300 text-sm">
+              {confirmAction === 'promote'
+                ? `Promote @${confirmUser.username} to the next role tier?`
+                : `Demote @${confirmUser.username} to a lower role?`}
+            </p>
+            <div className="flex gap-3">
+              <Button variant="secondary" className="flex-1" onClick={() => { setConfirmUser(null); setConfirmAction(null) }}>
+                Cancel
+              </Button>
+              <Button
+                variant={confirmAction === 'promote' ? 'primary' : 'danger'}
+                className="flex-1"
+                onClick={() => confirmAction === 'promote' ? handlePromote(confirmUser) : handleDemote(confirmUser)}
+              >
+                <Shield size={14} />
+                Confirm
+              </Button>
+            </div>
+          </div>
+        )}
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/layout/Footer.tsx
===================================================================
--- chapterx-frontend/src/components/layout/Footer.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/layout/Footer.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,48 @@
+import React from 'react'
+import { Link } from 'react-router-dom'
+import { Feather } from 'lucide-react'
+
+export const Footer: React.FC = () => (
+  <footer className="border-t border-slate-800 mt-auto">
+    <div className="max-w-7xl mx-auto px-4 py-10">
+      <div className="grid grid-cols-1 md:grid-cols-4 gap-8 mb-8">
+        <div className="col-span-1">
+          <Link to="/" className="flex items-center gap-2 mb-3">
+            <div className="w-7 h-7 rounded-lg bg-gradient-to-br from-indigo-500 to-violet-600 flex items-center justify-center">
+              <Feather size={14} className="text-white" />
+            </div>
+            <span className="font-serif font-bold text-white">ChapterX</span>
+          </Link>
+          <p className="text-slate-500 text-sm">
+            A collaborative storytelling platform for writers and readers.
+          </p>
+        </div>
+        <div>
+          <h4 className="text-white text-sm font-medium mb-3">Explore</h4>
+          <ul className="space-y-2 text-slate-500 text-sm">
+            <li><Link to="/browse" className="hover:text-white transition-colors">Browse Stories</Link></li>
+            <li><Link to="/genres" className="hover:text-white transition-colors">Genres</Link></li>
+            <li><Link to="/community-lists" className="hover:text-white transition-colors">Reading Lists</Link></li>
+          </ul>
+        </div>
+        <div>
+          <h4 className="text-white text-sm font-medium mb-3">Create</h4>
+          <ul className="space-y-2 text-slate-500 text-sm">
+            <li><Link to="/register" className="hover:text-white transition-colors">Start Writing</Link></li>
+            <li><Link to="/writer" className="hover:text-white transition-colors">Writer Dashboard</Link></li>
+          </ul>
+        </div>
+        <div>
+          <h4 className="text-white text-sm font-medium mb-3">Account</h4>
+          <ul className="space-y-2 text-slate-500 text-sm">
+            <li><Link to="/login" className="hover:text-white transition-colors">Sign In</Link></li>
+            <li><Link to="/register" className="hover:text-white transition-colors">Register</Link></li>
+          </ul>
+        </div>
+      </div>
+      <div className="border-t border-slate-800 pt-6 text-center text-slate-600 text-sm">
+        &copy; {new Date().getFullYear()} ChapterX. All rights reserved.
+      </div>
+    </div>
+  </footer>
+)
Index: chapterx-frontend/src/components/layout/Navbar.tsx
===================================================================
--- chapterx-frontend/src/components/layout/Navbar.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/layout/Navbar.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,223 @@
+import React, { useState, useRef, useEffect } from 'react'
+import { Link, useNavigate, useLocation } from 'react-router-dom'
+import { Bell, Menu, X, ChevronDown, BookOpen, PenLine, Shield, List } from 'lucide-react'
+import logo from '../../assets/chapterX-removebg-preview.png'
+import { useAuthStore } from '../../store/authStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { Avatar } from '../ui/Avatar'
+import { RoleBadge } from '../ui/Badge'
+import { Button } from '../ui/Button'
+import { NotificationDropdown } from '../notifications/NotificationDropdown'
+
+export const Navbar: React.FC = () => {
+  const navigate = useNavigate()
+  const location = useLocation()
+  const { currentUser, logout } = useAuthStore()
+  const { notifications } = useNotificationStore()
+  const unread = notifications.filter(n => !n.is_read).length
+
+  const [mobileOpen, setMobileOpen] = useState(false)
+  const [userMenuOpen, setUserMenuOpen] = useState(false)
+  const [notifOpen, setNotifOpen] = useState(false)
+  const userMenuRef = useRef<HTMLDivElement>(null)
+  const notifRef = useRef<HTMLDivElement>(null)
+
+  useEffect(() => {
+    const handler = (e: MouseEvent) => {
+      if (userMenuRef.current && !userMenuRef.current.contains(e.target as Node)) setUserMenuOpen(false)
+      if (notifRef.current && !notifRef.current.contains(e.target as Node)) setNotifOpen(false)
+    }
+    document.addEventListener('mousedown', handler)
+    return () => document.removeEventListener('mousedown', handler)
+  }, [])
+
+  const navLinks = [
+    { to: '/browse', label: 'Browse', icon: <BookOpen size={16} /> },
+    { to: '/genres', label: 'Genres', icon: null },
+    { to: '/community-lists', label: 'Reading Lists', icon: <List size={16} /> },
+  ]
+
+  const isActive = (path: string) => location.pathname.startsWith(path)
+
+  return (
+    <nav className="sticky top-0 z-40 glass border-b border-white/10">
+      <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
+        <div className="flex items-center justify-between h-16">
+          {/* Logo */}
+          <Link to="/" className="flex items-center gap-2 flex-shrink-0 group">
+            <img src={logo} alt="ChapterX" className="h-14 w-14 object-contain group-hover:scale-110 transition-transform" />
+          </Link>
+
+          {/* Desktop nav */}
+          <div className="hidden md:flex items-center gap-1">
+            {navLinks.map(link => (
+              <Link
+                key={link.to}
+                to={link.to}
+                className={`flex items-center gap-1.5 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+                  isActive(link.to)
+                    ? 'bg-indigo-500/20 text-indigo-300'
+                    : 'text-slate-400 hover:text-white hover:bg-slate-800'
+                }`}
+              >
+                {link.icon}
+                {link.label}
+              </Link>
+            ))}
+            {currentUser?.role === 'writer' || currentUser?.role === 'admin' ? (
+              <Link
+                to="/writer"
+                className={`flex items-center gap-1.5 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+                  isActive('/writer')
+                    ? 'bg-indigo-500/20 text-indigo-300'
+                    : 'text-slate-400 hover:text-white hover:bg-slate-800'
+                }`}
+              >
+                <PenLine size={16} />
+                Write
+              </Link>
+            ) : null}
+            {currentUser?.role === 'admin' && (
+              <Link
+                to="/admin"
+                className={`flex items-center gap-1.5 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+                  isActive('/admin')
+                    ? 'bg-rose-500/20 text-rose-300'
+                    : 'text-slate-400 hover:text-white hover:bg-slate-800'
+                }`}
+              >
+                <Shield size={16} />
+                Admin
+              </Link>
+            )}
+          </div>
+
+          {/* Right side */}
+          <div className="flex items-center gap-2">
+            {currentUser ? (
+              <>
+                {/* Notification bell */}
+                <div className="relative" ref={notifRef}>
+                  <button
+                    onClick={() => { setNotifOpen(!notifOpen); setUserMenuOpen(false) }}
+                    className="relative p-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-800 transition-colors"
+                  >
+                    <Bell size={18} />
+                    {unread > 0 && (
+                      <span className="absolute -top-0.5 -right-0.5 w-4 h-4 bg-rose-500 text-white text-xs rounded-full flex items-center justify-center font-medium">
+                        {unread > 9 ? '9+' : unread}
+                      </span>
+                    )}
+                  </button>
+                  {notifOpen && <NotificationDropdown onClose={() => setNotifOpen(false)} />}
+                </div>
+
+                {/* User menu */}
+                <div className="relative" ref={userMenuRef}>
+                  <button
+                    onClick={() => { setUserMenuOpen(!userMenuOpen); setNotifOpen(false) }}
+                    className="flex items-center gap-2 px-2 py-1.5 rounded-xl hover:bg-slate-800 transition-colors"
+                  >
+                    <Avatar name={currentUser.name} size="sm" />
+                    <span className="hidden sm:block text-sm text-slate-300">{currentUser.username}</span>
+                    <ChevronDown size={14} className="text-slate-500" />
+                  </button>
+
+                  {userMenuOpen && (
+                    <div className="absolute right-0 top-full mt-2 w-52 bg-slate-900 border border-slate-700 rounded-2xl shadow-2xl z-50 overflow-hidden py-1">
+                      <div className="px-4 py-3 border-b border-slate-700">
+                        <p className="text-sm font-medium text-white">{currentUser.name} {currentUser.surname}</p>
+                        <div className="flex items-center gap-2 mt-1">
+                          <p className="text-xs text-slate-500">@{currentUser.username}</p>
+                          <RoleBadge role={currentUser.role} />
+                        </div>
+                      </div>
+                      <div className="py-1">
+                        <button onClick={() => { navigate(`/profile/${currentUser.username}`); setUserMenuOpen(false) }}
+                          className="w-full text-left px-4 py-2 text-sm text-slate-300 hover:bg-slate-800 hover:text-white transition-colors">
+                          My Profile
+                        </button>
+                        <button onClick={() => { navigate('/reading-lists'); setUserMenuOpen(false) }}
+                          className="w-full text-left px-4 py-2 text-sm text-slate-300 hover:bg-slate-800 hover:text-white transition-colors">
+                          My Reading Lists
+                        </button>
+                        {(currentUser.role === 'writer' || currentUser.role === 'admin') && (
+                          <button onClick={() => { navigate('/writer'); setUserMenuOpen(false) }}
+                            className="w-full text-left px-4 py-2 text-sm text-slate-300 hover:bg-slate-800 hover:text-white transition-colors">
+                            Writer Dashboard
+                          </button>
+                        )}
+                        {currentUser.role === 'admin' && (
+                          <button onClick={() => { navigate('/admin'); setUserMenuOpen(false) }}
+                            className="w-full text-left px-4 py-2 text-sm text-slate-300 hover:bg-slate-800 hover:text-white transition-colors">
+                            Admin Panel
+                          </button>
+                        )}
+                      </div>
+                      <div className="border-t border-slate-700 py-1">
+                        <button
+                          onClick={() => { logout(); setUserMenuOpen(false); navigate('/') }}
+                          className="w-full text-left px-4 py-2 text-sm text-rose-400 hover:bg-slate-800 transition-colors"
+                        >
+                          Sign Out
+                        </button>
+                      </div>
+                    </div>
+                  )}
+                </div>
+              </>
+            ) : (
+              <div className="hidden sm:flex items-center gap-2">
+                <Button variant="ghost" size="sm" onClick={() => navigate('/login')}>
+                  Sign In
+                </Button>
+                <Button size="sm" onClick={() => navigate('/register')}>
+                  Get Started
+                </Button>
+              </div>
+            )}
+
+            {/* Mobile hamburger */}
+            <button
+              className="md:hidden p-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-800"
+              onClick={() => setMobileOpen(!mobileOpen)}
+            >
+              {mobileOpen ? <X size={20} /> : <Menu size={20} />}
+            </button>
+          </div>
+        </div>
+
+        {/* Mobile menu */}
+        {mobileOpen && (
+          <div className="md:hidden pb-4 border-t border-slate-800 mt-2 pt-4 space-y-1">
+            {navLinks.map(link => (
+              <Link
+                key={link.to}
+                to={link.to}
+                onClick={() => setMobileOpen(false)}
+                className={`flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${
+                  isActive(link.to)
+                    ? 'bg-indigo-500/20 text-indigo-300'
+                    : 'text-slate-400 hover:text-white hover:bg-slate-800'
+                }`}
+              >
+                {link.icon}
+                {link.label}
+              </Link>
+            ))}
+            {!currentUser && (
+              <div className="flex gap-2 pt-2">
+                <Button variant="ghost" size="sm" onClick={() => { navigate('/login'); setMobileOpen(false) }} className="flex-1">
+                  Sign In
+                </Button>
+                <Button size="sm" onClick={() => { navigate('/register'); setMobileOpen(false) }} className="flex-1">
+                  Get Started
+                </Button>
+              </div>
+            )}
+          </div>
+        )}
+      </div>
+    </nav>
+  )
+}
Index: chapterx-frontend/src/components/notifications/NotificationDropdown.tsx
===================================================================
--- chapterx-frontend/src/components/notifications/NotificationDropdown.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/notifications/NotificationDropdown.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,92 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Heart, MessageCircle, Users, Bell, Settings, Check } from 'lucide-react'
+import { useNotificationStore } from '../../store/notificationStore'
+import { NotificationType } from '../../types'
+
+const typeIcon = (type: NotificationType) => {
+  const props = { size: 14 }
+  switch (type) {
+    case 'like': return <Heart {...props} className="text-rose-400" />
+    case 'comment': return <MessageCircle {...props} className="text-blue-400" />
+    case 'collaboration': return <Users {...props} className="text-violet-400" />
+    case 'follow': return <Bell {...props} className="text-amber-400" />
+    case 'system': return <Settings {...props} className="text-slate-400" />
+    default: return <Bell {...props} className="text-slate-400" />
+  }
+}
+
+function timeAgo(dateStr: string): string {
+  const diff = Date.now() - new Date(dateStr).getTime()
+  const mins = Math.floor(diff / 60000)
+  if (mins < 1) return 'just now'
+  if (mins < 60) return `${mins}m ago`
+  const hrs = Math.floor(mins / 60)
+  if (hrs < 24) return `${hrs}h ago`
+  return `${Math.floor(hrs / 24)}d ago`
+}
+
+interface Props {
+  onClose: () => void
+}
+
+export const NotificationDropdown: React.FC<Props> = ({ onClose }) => {
+  const navigate = useNavigate()
+  const { notifications, markAllRead, markRead } = useNotificationStore()
+  const recent = notifications.slice(0, 5)
+
+  return (
+    <div className="absolute right-0 top-full mt-2 w-80 bg-slate-900 border border-slate-700 rounded-2xl shadow-2xl z-50 overflow-hidden">
+      <div className="flex items-center justify-between px-4 py-3 border-b border-slate-700">
+        <span className="text-sm font-semibold text-white">Notifications</span>
+        <button
+          onClick={markAllRead}
+          className="text-xs text-indigo-400 hover:text-indigo-300 flex items-center gap-1 transition-colors"
+        >
+          <Check size={12} />
+          Mark all read
+        </button>
+      </div>
+      <div className="divide-y divide-slate-800">
+        {recent.length === 0 ? (
+          <div className="px-4 py-8 text-center text-slate-500 text-sm">
+            No notifications yet
+          </div>
+        ) : (
+          recent.map(n => (
+            <div
+              key={n.notification_id}
+              className={`flex gap-3 px-4 py-3 cursor-pointer transition-colors ${
+                !n.is_read ? 'bg-indigo-500/5 hover:bg-indigo-500/10' : 'hover:bg-slate-800'
+              }`}
+              onClick={() => {
+                markRead(n.notification_id)
+                if (n.link) { navigate(n.link); onClose() }
+              }}
+            >
+              <div className="mt-0.5 w-6 h-6 rounded-full bg-slate-800 flex items-center justify-center flex-shrink-0">
+                {typeIcon(n.type)}
+              </div>
+              <div className="flex-1 min-w-0">
+                <p className="text-xs font-medium text-white">{n.title}</p>
+                <p className="text-xs text-slate-400 line-clamp-2">{n.message}</p>
+                <p className="text-xs text-slate-600 mt-0.5">{timeAgo(n.created_at)}</p>
+              </div>
+              {!n.is_read && (
+                <div className="w-2 h-2 rounded-full bg-indigo-400 flex-shrink-0 mt-1.5" />
+              )}
+            </div>
+          ))
+        )}
+      </div>
+      <div className="border-t border-slate-700 p-2">
+        <button
+          onClick={() => { navigate('/notifications'); onClose() }}
+          className="w-full text-center text-xs text-indigo-400 hover:text-indigo-300 py-1.5 rounded-lg hover:bg-slate-800 transition-colors"
+        >
+          View all notifications
+        </button>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/story/ChapterList.tsx
===================================================================
--- chapterx-frontend/src/components/story/ChapterList.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/story/ChapterList.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,85 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Eye, BookOpen, Lock } from 'lucide-react'
+import { Chapter } from '../../types'
+
+interface ChapterListProps {
+  chapters: Chapter[]
+  storyId: number
+  showEditLinks?: boolean
+  onEdit?: (chapterId: number) => void
+}
+
+function formatDate(str: string) {
+  return new Date(str).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
+}
+
+export const ChapterList: React.FC<ChapterListProps> = ({ chapters, storyId, showEditLinks, onEdit }) => {
+  const navigate = useNavigate()
+  const sorted = [...chapters].sort((a, b) => a.chapter_number - b.chapter_number)
+
+  if (sorted.length === 0) {
+    return (
+      <div className="flex flex-col items-center py-10 text-slate-500">
+        <BookOpen size={36} className="mb-3 opacity-40" />
+        <p>No chapters yet.</p>
+      </div>
+    )
+  }
+
+  return (
+    <div className="space-y-2">
+      {sorted.map(chapter => (
+        <div
+          key={chapter.chapter_id}
+          className={`flex items-center gap-4 p-4 rounded-xl bg-slate-800 border border-slate-700 transition-all ${
+            chapter.is_published
+              ? 'hover:border-indigo-500/40 hover:bg-slate-700/50 cursor-pointer'
+              : 'opacity-60'
+          }`}
+          onClick={() => {
+            if (chapter.is_published) navigate(`/story/${storyId}/chapter/${chapter.chapter_id}`)
+          }}
+        >
+          {/* Number */}
+          <div className="w-10 h-10 rounded-lg bg-slate-700 flex items-center justify-center text-indigo-400 font-semibold text-sm flex-shrink-0">
+            {chapter.chapter_number}
+          </div>
+
+          {/* Info */}
+          <div className="flex-1 min-w-0">
+            <div className="flex items-center gap-2">
+              <h4 className="text-white text-sm font-medium truncate">{chapter.title}</h4>
+              {!chapter.is_published && (
+                <span className="flex items-center gap-1 text-amber-400 text-xs">
+                  <Lock size={11} />
+                  Draft
+                </span>
+              )}
+            </div>
+            <div className="flex items-center gap-3 text-slate-500 text-xs mt-0.5">
+              <span>{chapter.word_count.toLocaleString()} words</span>
+              <span>{formatDate(chapter.created_at)}</span>
+            </div>
+          </div>
+
+          {/* Views */}
+          <div className="flex items-center gap-1 text-slate-500 text-xs flex-shrink-0">
+            <Eye size={12} />
+            {chapter.view_count.toLocaleString()}
+          </div>
+
+          {/* Edit button */}
+          {showEditLinks && onEdit && (
+            <button
+              onClick={(e) => { e.stopPropagation(); onEdit(chapter.chapter_id) }}
+              className="text-indigo-400 hover:text-indigo-300 text-xs px-2 py-1 rounded bg-indigo-500/10 hover:bg-indigo-500/20 transition-colors flex-shrink-0"
+            >
+              Edit
+            </button>
+          )}
+        </div>
+      ))}
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/story/CommentSection.tsx
===================================================================
--- chapterx-frontend/src/components/story/CommentSection.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/story/CommentSection.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,148 @@
+import React, { useState } from 'react'
+import { MessageCircle, Trash2, Send } from 'lucide-react'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { useUIStore } from '../../store/uiStore'
+import { Comment } from '../../types'
+import { Avatar } from '../ui/Avatar'
+import { Button } from '../ui/Button'
+
+interface CommentSectionProps {
+  storyId: number
+  authorUserId: number
+}
+
+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 CommentSection: React.FC<CommentSectionProps> = ({ storyId, authorUserId }) => {
+  const { currentUser } = useAuthStore()
+  const { comments, addComment, deleteComment } = useStoryStore()
+  const { addNotification } = useNotificationStore()
+  const { addToast } = useUIStore()
+  const [text, setText] = useState('')
+  const [submitting, setSubmitting] = useState(false)
+
+  const storyComments = comments
+    .filter(c => c.story_id === storyId)
+    .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
+
+  const handleSubmit = async () => {
+    if (!text.trim() || !currentUser) return
+    setSubmitting(true)
+    await new Promise(r => setTimeout(r, 300))
+    const comment: Comment = {
+      comment_id: Date.now(),
+      story_id: storyId,
+      user_id: currentUser.user_id,
+      username: currentUser.username,
+      content: text.trim(),
+      created_at: new Date().toISOString(),
+    }
+    addComment(comment)
+    if (currentUser.user_id !== authorUserId) {
+      addNotification({
+        user_id: authorUserId,
+        type: 'comment',
+        title: 'New Comment',
+        message: `${currentUser.username} commented: "${text.trim().slice(0, 60)}..."`,
+        link: `/story/${storyId}`,
+      })
+    }
+    setText('')
+    setSubmitting(false)
+    addToast('Comment posted!')
+  }
+
+  return (
+    <div className="space-y-4">
+      <div className="flex items-center gap-2 mb-4">
+        <MessageCircle size={18} className="text-indigo-400" />
+        <h3 className="text-white font-semibold">Comments ({storyComments.length})</h3>
+      </div>
+
+      {/* Input */}
+      {currentUser ? (
+        <div className="flex gap-3">
+          <Avatar name={currentUser.name} size="sm" />
+          <div className="flex-1">
+            <textarea
+              value={text}
+              onChange={e => setText(e.target.value)}
+              placeholder="Share your thoughts..."
+              rows={3}
+              className="w-full bg-slate-800 border border-slate-700 rounded-xl px-4 py-3 text-sm text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-none"
+            />
+            <div className="flex justify-end mt-2">
+              <Button
+                size="sm"
+                onClick={handleSubmit}
+                loading={submitting}
+                disabled={!text.trim()}
+              >
+                <Send size={14} />
+                Post Comment
+              </Button>
+            </div>
+          </div>
+        </div>
+      ) : (
+        <div className="bg-slate-800 border border-slate-700 rounded-xl p-4 text-center">
+          <p className="text-slate-400 text-sm">
+            <a href="/login" className="text-indigo-400 hover:text-indigo-300">Sign in</a> to leave a comment.
+          </p>
+        </div>
+      )}
+
+      {/* Comment list */}
+      <div className="space-y-3">
+        {storyComments.length === 0 ? (
+          <div className="text-center py-8 text-slate-500 text-sm">
+            No comments yet. Be the first to share your thoughts!
+          </div>
+        ) : (
+          storyComments.map(comment => (
+            <CommentCard
+              key={comment.comment_id}
+              comment={comment}
+              canDelete={currentUser?.user_id === comment.user_id || currentUser?.role === 'admin'}
+              onDelete={() => { deleteComment(comment.comment_id); addToast('Comment deleted', 'info') }}
+            />
+          ))
+        )}
+      </div>
+    </div>
+  )
+}
+
+const CommentCard: React.FC<{
+  comment: Comment
+  canDelete: boolean
+  onDelete: () => void
+}> = ({ comment, canDelete, onDelete }) => (
+  <div className="flex gap-3 p-4 bg-slate-800 rounded-xl border border-slate-700">
+    <Avatar name={comment.username} size="sm" />
+    <div className="flex-1 min-w-0">
+      <div className="flex items-center justify-between">
+        <span className="text-sm font-medium text-white">{comment.username}</span>
+        <div className="flex items-center gap-2">
+          <span className="text-xs text-slate-500">{timeAgo(comment.created_at)}</span>
+          {canDelete && (
+            <button onClick={onDelete} className="text-slate-500 hover:text-rose-400 transition-colors">
+              <Trash2 size={13} />
+            </button>
+          )}
+        </div>
+      </div>
+      <p className="text-slate-300 text-sm mt-1 leading-relaxed">{comment.content}</p>
+    </div>
+  </div>
+)
Index: chapterx-frontend/src/components/story/GenreBadge.tsx
===================================================================
--- chapterx-frontend/src/components/story/GenreBadge.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/story/GenreBadge.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,27 @@
+import React from 'react'
+import { GenreBadge as GenreBadgeUI } from '../ui/Badge'
+
+interface GenreBadgeProps {
+  genre: string
+  onClick?: () => void
+}
+
+export const GenreBadge: React.FC<GenreBadgeProps> = ({ genre, onClick }) => (
+  <GenreBadgeUI genre={genre} onClick={onClick} />
+)
+
+export function getGenreGradient(genre: string): string {
+  const gradients: Record<string, string> = {
+    Fantasy: 'from-purple-900 via-indigo-900 to-indigo-800',
+    'Sci-Fi': 'from-cyan-900 via-blue-900 to-blue-800',
+    Romance: 'from-pink-900 via-rose-900 to-rose-800',
+    'Historical Fiction': 'from-amber-900 via-orange-900 to-orange-800',
+    Adventure: 'from-green-900 via-emerald-900 to-emerald-800',
+    Thriller: 'from-gray-900 via-slate-800 to-slate-700',
+    Mystery: 'from-violet-900 via-purple-900 to-purple-800',
+    Horror: 'from-red-900 via-rose-900 to-slate-900',
+    Contemporary: 'from-blue-900 via-indigo-900 to-slate-800',
+    Poetry: 'from-rose-900 via-pink-900 to-pink-800',
+  }
+  return gradients[genre] || 'from-indigo-900 via-violet-900 to-violet-800'
+}
Index: chapterx-frontend/src/components/story/LikeButton.tsx
===================================================================
--- chapterx-frontend/src/components/story/LikeButton.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/story/LikeButton.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,56 @@
+import React from 'react'
+import { Heart } from 'lucide-react'
+import { useNavigate } from 'react-router-dom'
+import { useAuthStore } from '../../store/authStore'
+import { useStoryStore } from '../../store/storyStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { useUIStore } from '../../store/uiStore'
+
+interface LikeButtonProps {
+  storyId: number
+  authorUserId: number
+  totalLikes: number
+}
+
+export const LikeButton: React.FC<LikeButtonProps> = ({ storyId, authorUserId, totalLikes }) => {
+  const navigate = useNavigate()
+  const { currentUser } = useAuthStore()
+  const { toggleLike, isLiked } = useStoryStore()
+  const { addNotification } = useNotificationStore()
+  const { addToast } = useUIStore()
+
+  const liked = currentUser ? isLiked(currentUser.user_id, storyId) : false
+
+  const handleClick = () => {
+    if (!currentUser) {
+      addToast('Please sign in to like stories.', 'info')
+      navigate('/login')
+      return
+    }
+    toggleLike(currentUser.user_id, storyId)
+    if (!liked && currentUser.user_id !== authorUserId) {
+      addNotification({
+        user_id: authorUserId,
+        type: 'like',
+        title: 'New Like',
+        message: `${currentUser.username} liked your story.`,
+        link: `/story/${storyId}`,
+      })
+    }
+    addToast(liked ? 'Removed from likes' : 'Added to likes!', liked ? 'info' : 'success')
+  }
+
+  return (
+    <button
+      onClick={handleClick}
+      className={`flex items-center gap-2 px-4 py-2 rounded-xl border transition-all duration-200 ${
+        liked
+          ? 'bg-rose-500/20 border-rose-500/40 text-rose-400 hover:bg-rose-500/30'
+          : 'bg-slate-800 border-slate-700 text-slate-400 hover:border-rose-500/40 hover:text-rose-400 hover:bg-rose-500/10'
+      }`}
+    >
+      <Heart size={16} className={liked ? 'fill-rose-400' : ''} />
+      <span className="text-sm font-medium">{totalLikes.toLocaleString()}</span>
+    </button>
+  )
+}
Index: chapterx-frontend/src/components/story/StoryGrid.tsx
===================================================================
--- chapterx-frontend/src/components/story/StoryGrid.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/story/StoryGrid.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,69 @@
+import React, { useState, useEffect } from 'react'
+import { Story } from '../../types'
+import { StoryCard } from '../ui/StoryCard'
+import { BookOpen } from 'lucide-react'
+
+interface StoryGridProps {
+  stories: Story[]
+  showStatus?: boolean
+  emptyMessage?: string
+  loading?: boolean
+}
+
+const SkeletonCard = () => (
+  <div className="rounded-xl overflow-hidden bg-slate-800 border border-slate-700 animate-pulse">
+    <div className="h-40 bg-slate-700" />
+    <div className="p-4 space-y-2">
+      <div className="h-4 bg-slate-700 rounded w-3/4" />
+      <div className="h-3 bg-slate-700 rounded w-1/3" />
+      <div className="h-3 bg-slate-700 rounded w-full" />
+      <div className="h-3 bg-slate-700 rounded w-5/6" />
+      <div className="flex gap-2 mt-2">
+        <div className="h-5 bg-slate-700 rounded-full w-16" />
+        <div className="h-5 bg-slate-700 rounded-full w-16" />
+      </div>
+    </div>
+  </div>
+)
+
+export const StoryGrid: React.FC<StoryGridProps> = ({
+  stories,
+  showStatus = false,
+  emptyMessage = 'No stories found.',
+  loading: externalLoading,
+}) => {
+  const [loading, setLoading] = useState(true)
+
+  useEffect(() => {
+    const timer = setTimeout(() => setLoading(false), 800)
+    return () => clearTimeout(timer)
+  }, [])
+
+  const isLoading = externalLoading !== undefined ? externalLoading : loading
+
+  if (isLoading) {
+    return (
+      <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
+        {Array.from({ length: 3 }).map((_, i) => <SkeletonCard key={i} />)}
+      </div>
+    )
+  }
+
+  if (stories.length === 0) {
+    return (
+      <div className="flex flex-col items-center justify-center py-20 text-slate-500">
+        <BookOpen size={48} className="mb-4 opacity-40" />
+        <p className="text-lg font-medium">{emptyMessage}</p>
+        <p className="text-sm mt-1">Try adjusting your search or filters.</p>
+      </div>
+    )
+  }
+
+  return (
+    <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
+      {stories.map(story => (
+        <StoryCard key={story.story_id} story={story} showStatus={showStatus} />
+      ))}
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/ui/Avatar.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Avatar.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Avatar.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,58 @@
+import React from 'react'
+
+interface AvatarProps {
+  name: string
+  image?: string
+  size?: 'sm' | 'md' | 'lg' | 'xl'
+  className?: string
+}
+
+const sizeMap = {
+  sm: 'w-8 h-8 text-xs',
+  md: 'w-10 h-10 text-sm',
+  lg: 'w-16 h-16 text-xl',
+  xl: 'w-24 h-24 text-3xl',
+}
+
+const colors = [
+  'from-indigo-500 to-violet-500',
+  'from-violet-500 to-purple-500',
+  'from-pink-500 to-rose-500',
+  'from-emerald-500 to-teal-500',
+  'from-amber-500 to-orange-500',
+  'from-cyan-500 to-blue-500',
+]
+
+function getColorIndex(name: string): number {
+  let hash = 0
+  for (let i = 0; i < name.length; i++) hash = name.charCodeAt(i) + ((hash << 5) - hash)
+  return Math.abs(hash) % colors.length
+}
+
+export const Avatar: React.FC<AvatarProps> = ({ name, image, size = 'md', className = '' }) => {
+  const initials = name
+    .split(' ')
+    .map(p => p[0])
+    .slice(0, 2)
+    .join('')
+    .toUpperCase()
+  const colorClass = colors[getColorIndex(name)]
+
+  if (image) {
+    return (
+      <img
+        src={image}
+        alt={name}
+        className={`${sizeMap[size]} rounded-full object-cover ring-2 ring-slate-700 ${className}`}
+      />
+    )
+  }
+
+  return (
+    <div
+      className={`${sizeMap[size]} rounded-full bg-gradient-to-br ${colorClass} flex items-center justify-center font-semibold text-white ring-2 ring-slate-700 flex-shrink-0 ${className}`}
+    >
+      {initials}
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/ui/Badge.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Badge.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Badge.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,68 @@
+import React from 'react'
+import { UserRole, StoryStatus } from '../../types'
+
+interface RoleBadgeProps {
+  role: UserRole
+}
+
+interface StatusBadgeProps {
+  status: StoryStatus
+}
+
+interface GenreBadgeProps {
+  genre: string
+  onClick?: () => void
+}
+
+export const RoleBadge: React.FC<RoleBadgeProps> = ({ role }) => {
+  const styles = {
+    admin: 'bg-rose-500/20 text-rose-400 border-rose-500/30',
+    writer: 'bg-indigo-500/20 text-indigo-400 border-indigo-500/30',
+    regular: 'bg-slate-500/20 text-slate-400 border-slate-500/30',
+    guest: 'bg-gray-500/20 text-gray-400 border-gray-500/30',
+  }
+  const labels = { admin: 'Admin', writer: 'Writer', regular: 'Reader', guest: 'Guest' }
+  return (
+    <span className={`px-2 py-0.5 text-xs font-medium rounded-full border ${styles[role]}`}>
+      {labels[role]}
+    </span>
+  )
+}
+
+export const StatusBadge: React.FC<StatusBadgeProps> = ({ status }) => {
+  const styles = {
+    draft: 'bg-amber-500/20 text-amber-400 border-amber-500/30',
+    published: 'bg-emerald-500/20 text-emerald-400 border-emerald-500/30',
+    archived: 'bg-slate-500/20 text-slate-400 border-slate-500/30',
+  }
+  const labels = { draft: 'Draft', published: 'Published', archived: 'Archived' }
+  return (
+    <span className={`px-2 py-0.5 text-xs font-medium rounded-full border ${styles[status]}`}>
+      {labels[status]}
+    </span>
+  )
+}
+
+export const GenreBadge: React.FC<GenreBadgeProps> = ({ genre, onClick }) => {
+  const colors: Record<string, string> = {
+    Fantasy: 'bg-purple-500/20 text-purple-300 border-purple-500/30 hover:bg-purple-500/30',
+    'Sci-Fi': 'bg-cyan-500/20 text-cyan-300 border-cyan-500/30 hover:bg-cyan-500/30',
+    Romance: 'bg-pink-500/20 text-pink-300 border-pink-500/30 hover:bg-pink-500/30',
+    'Historical Fiction': 'bg-amber-500/20 text-amber-300 border-amber-500/30 hover:bg-amber-500/30',
+    Adventure: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/30 hover:bg-emerald-500/30',
+    Thriller: 'bg-slate-500/20 text-slate-300 border-slate-500/30 hover:bg-slate-500/30',
+    Mystery: 'bg-violet-500/20 text-violet-300 border-violet-500/30 hover:bg-violet-500/30',
+    Horror: 'bg-red-500/20 text-red-300 border-red-500/30 hover:bg-red-500/30',
+    Contemporary: 'bg-blue-500/20 text-blue-300 border-blue-500/30 hover:bg-blue-500/30',
+    Poetry: 'bg-rose-500/20 text-rose-300 border-rose-500/30 hover:bg-rose-500/30',
+  }
+  const style = colors[genre] || 'bg-indigo-500/20 text-indigo-300 border-indigo-500/30 hover:bg-indigo-500/30'
+  return (
+    <span
+      className={`px-2 py-0.5 text-xs font-medium rounded-full border transition-colors ${style} ${onClick ? 'cursor-pointer' : ''}`}
+      onClick={onClick}
+    >
+      {genre}
+    </span>
+  )
+}
Index: chapterx-frontend/src/components/ui/Button.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Button.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Button.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,70 @@
+import React from 'react'
+
+interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
+  variant?: 'primary' | 'secondary' | 'danger' | 'ghost'
+  size?: 'sm' | 'md' | 'lg'
+  loading?: boolean
+  children: React.ReactNode
+}
+
+export const Button: React.FC<ButtonProps> = ({
+  variant = 'primary',
+  size = 'md',
+  loading = false,
+  children,
+  className = '',
+  disabled,
+  ...props
+}) => {
+  const base =
+    'inline-flex items-center justify-center font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-slate-900 disabled:opacity-50 disabled:cursor-not-allowed'
+
+  const variants = {
+    primary:
+      'bg-gradient-to-r from-indigo-600 to-violet-600 text-white hover:from-indigo-500 hover:to-violet-500 focus:ring-indigo-500 shadow-lg glow-indigo hover:scale-105 active:scale-95',
+    secondary:
+      'bg-slate-700 text-slate-100 hover:bg-slate-600 focus:ring-slate-500 border border-slate-600',
+    danger:
+      'bg-gradient-to-r from-rose-600 to-rose-500 text-white hover:from-rose-500 hover:to-rose-400 focus:ring-rose-500 shadow-lg',
+    ghost:
+      'bg-transparent text-slate-300 hover:bg-slate-800 hover:text-white focus:ring-slate-500 border border-transparent hover:border-slate-600',
+  }
+
+  const sizes = {
+    sm: 'px-3 py-1.5 text-sm gap-1.5',
+    md: 'px-4 py-2 text-sm gap-2',
+    lg: 'px-6 py-3 text-base gap-2',
+  }
+
+  return (
+    <button
+      className={`${base} ${variants[variant]} ${sizes[size]} ${className}`}
+      disabled={disabled || loading}
+      {...props}
+    >
+      {loading && (
+        <svg
+          className="animate-spin h-4 w-4"
+          xmlns="http://www.w3.org/2000/svg"
+          fill="none"
+          viewBox="0 0 24 24"
+        >
+          <circle
+            className="opacity-25"
+            cx="12"
+            cy="12"
+            r="10"
+            stroke="currentColor"
+            strokeWidth="4"
+          />
+          <path
+            className="opacity-75"
+            fill="currentColor"
+            d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
+          />
+        </svg>
+      )}
+      {children}
+    </button>
+  )
+}
Index: chapterx-frontend/src/components/ui/Modal.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Modal.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Modal.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,68 @@
+import React, { useEffect } from 'react'
+import { X } from 'lucide-react'
+
+interface ModalProps {
+  isOpen: boolean
+  onClose: () => void
+  title?: string
+  children: React.ReactNode
+  size?: 'sm' | 'md' | 'lg' | 'xl'
+}
+
+const sizeMap = {
+  sm: 'max-w-sm',
+  md: 'max-w-md',
+  lg: 'max-w-lg',
+  xl: 'max-w-2xl',
+}
+
+export const Modal: React.FC<ModalProps> = ({
+  isOpen,
+  onClose,
+  title,
+  children,
+  size = 'md',
+}) => {
+  useEffect(() => {
+    const handler = (e: KeyboardEvent) => {
+      if (e.key === 'Escape') onClose()
+    }
+    if (isOpen) document.addEventListener('keydown', handler)
+    return () => document.removeEventListener('keydown', handler)
+  }, [isOpen, onClose])
+
+  if (!isOpen) return null
+
+  return (
+    <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
+      <div
+        className="absolute inset-0 bg-black/70 backdrop-blur-sm"
+        onClick={onClose}
+      />
+      <div
+        className={`relative w-full ${sizeMap[size]} bg-slate-900 border border-slate-700 rounded-2xl shadow-2xl z-10 max-h-[90vh] overflow-y-auto`}
+      >
+        {title && (
+          <div className="flex items-center justify-between p-6 border-b border-slate-700">
+            <h2 className="text-lg font-semibold text-white font-serif">{title}</h2>
+            <button
+              onClick={onClose}
+              className="p-1.5 text-slate-400 hover:text-white hover:bg-slate-700 rounded-lg transition-colors"
+            >
+              <X size={18} />
+            </button>
+          </div>
+        )}
+        {!title && (
+          <button
+            onClick={onClose}
+            className="absolute top-4 right-4 p-1.5 text-slate-400 hover:text-white hover:bg-slate-700 rounded-lg transition-colors z-10"
+          >
+            <X size={18} />
+          </button>
+        )}
+        <div className="p-6">{children}</div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/ui/Spinner.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Spinner.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Spinner.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,31 @@
+import React from 'react'
+
+interface SpinnerProps {
+  size?: 'sm' | 'md' | 'lg'
+  className?: string
+}
+
+const sizes = { sm: 'h-4 w-4', md: 'h-8 w-8', lg: 'h-12 w-12' }
+
+export const Spinner: React.FC<SpinnerProps> = ({ size = 'md', className = '' }) => (
+  <svg
+    className={`animate-spin ${sizes[size]} text-indigo-400 ${className}`}
+    xmlns="http://www.w3.org/2000/svg"
+    fill="none"
+    viewBox="0 0 24 24"
+  >
+    <circle
+      className="opacity-25"
+      cx="12"
+      cy="12"
+      r="10"
+      stroke="currentColor"
+      strokeWidth="4"
+    />
+    <path
+      className="opacity-75"
+      fill="currentColor"
+      d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
+    />
+  </svg>
+)
Index: chapterx-frontend/src/components/ui/StoryCard.tsx
===================================================================
--- chapterx-frontend/src/components/ui/StoryCard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/StoryCard.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,96 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { Heart, MessageCircle, Eye, Lock } from 'lucide-react'
+import { Story } from '../../types'
+import { useAuthStore } from '../../store/authStore'
+import { StatusBadge, GenreBadge } from './Badge'
+import { getGenreGradient } from '../story/GenreBadge'
+
+interface StoryCardProps {
+  story: Story
+  showStatus?: boolean
+}
+
+export const StoryCard: React.FC<StoryCardProps> = ({ story, showStatus = false }) => {
+  const navigate = useNavigate()
+  const { currentUser, showMatureContent } = useAuthStore()
+
+  const isMature = story.mature_content
+  const isGuest = !currentUser
+  const blurContent = isMature && isGuest && !showMatureContent
+
+  const primaryGenre = story.genres[0] || 'Fantasy'
+  const gradient = getGenreGradient(primaryGenre)
+
+  return (
+    <div
+      className="relative group cursor-pointer rounded-xl overflow-hidden bg-slate-800 border border-slate-700 hover:border-indigo-500/50 transition-all duration-300 hover:scale-105 hover:shadow-xl hover:shadow-indigo-500/10"
+      onClick={() => navigate(`/story/${story.story_id}`)}
+    >
+      {/* Cover */}
+      <div className={`relative h-40 bg-gradient-to-br ${gradient} flex items-end p-4`}>
+        {/* Mature ribbon */}
+        {isMature && (
+          <div className="absolute top-2 right-2 bg-rose-500/90 text-white text-xs px-2 py-0.5 rounded-full font-medium flex items-center gap-1">
+            <Lock size={10} />
+            18+
+          </div>
+        )}
+        {/* Status badge */}
+        {showStatus && (
+          <div className="absolute top-2 left-2">
+            <StatusBadge status={story.status} />
+          </div>
+        )}
+        {/* Blur overlay for mature on guest */}
+        {blurContent && (
+          <div className="absolute inset-0 backdrop-blur-md bg-slate-900/60 flex items-center justify-center">
+            <div className="text-center">
+              <Lock size={24} className="text-slate-400 mx-auto mb-1" />
+              <p className="text-xs text-slate-400">Mature Content</p>
+              <p className="text-xs text-slate-500">Login to view</p>
+            </div>
+          </div>
+        )}
+        {/* Genre decorative circles */}
+        <div className="absolute top-4 left-4 w-20 h-20 rounded-full bg-white/5 blur-xl" />
+        <div className="absolute bottom-2 right-8 w-12 h-12 rounded-full bg-white/5 blur-lg" />
+      </div>
+
+      {/* Content */}
+      <div className="p-4">
+        <h3 className="font-serif font-semibold text-white text-sm leading-tight mb-1 line-clamp-2 group-hover:text-indigo-300 transition-colors">
+          {story.title}
+        </h3>
+        <p className="text-slate-500 text-xs mb-2">by {story.author_username}</p>
+        <p className="text-slate-400 text-xs line-clamp-2 mb-3">{story.short_description}</p>
+
+        {/* Genre badges */}
+        <div className="flex flex-wrap gap-1 mb-3">
+          {story.genres.slice(0, 2).map(g => (
+            <GenreBadge key={g} genre={g} />
+          ))}
+          {story.genres.length > 2 && (
+            <span className="text-xs text-slate-500">+{story.genres.length - 2}</span>
+          )}
+        </div>
+
+        {/* Stats */}
+        <div className="flex items-center gap-3 text-slate-500 text-xs">
+          <span className="flex items-center gap-1">
+            <Heart size={12} />
+            {story.total_likes.toLocaleString()}
+          </span>
+          <span className="flex items-center gap-1">
+            <MessageCircle size={12} />
+            {story.total_comments}
+          </span>
+          <span className="flex items-center gap-1 ml-auto">
+            <Eye size={12} />
+            {story.total_views.toLocaleString()}
+          </span>
+        </div>
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/ui/Toast.tsx
===================================================================
--- chapterx-frontend/src/components/ui/Toast.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/ui/Toast.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,41 @@
+import React from 'react'
+import { CheckCircle, XCircle, AlertTriangle, Info, X } from 'lucide-react'
+import { useUIStore } from '../../store/uiStore'
+
+const icons = {
+  success: <CheckCircle size={18} className="text-emerald-400" />,
+  error: <XCircle size={18} className="text-rose-400" />,
+  warning: <AlertTriangle size={18} className="text-amber-400" />,
+  info: <Info size={18} className="text-blue-400" />,
+}
+
+const styles = {
+  success: 'border-emerald-500/30 bg-emerald-500/10',
+  error: 'border-rose-500/30 bg-rose-500/10',
+  warning: 'border-amber-500/30 bg-amber-500/10',
+  info: 'border-blue-500/30 bg-blue-500/10',
+}
+
+export const ToastContainer: React.FC = () => {
+  const { toasts, removeToast } = useUIStore()
+
+  return (
+    <div className="fixed bottom-6 right-6 z-[100] flex flex-col gap-2 pointer-events-none">
+      {toasts.map(toast => (
+        <div
+          key={toast.id}
+          className={`pointer-events-auto flex items-center gap-3 px-4 py-3 rounded-xl border glass shadow-xl min-w-[280px] max-w-sm ${styles[toast.type]} animate-pulse-once`}
+        >
+          {icons[toast.type]}
+          <p className="text-sm text-slate-100 flex-1">{toast.message}</p>
+          <button
+            onClick={() => removeToast(toast.id)}
+            className="text-slate-400 hover:text-white transition-colors ml-1"
+          >
+            <X size={14} />
+          </button>
+        </div>
+      ))}
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/writer/AISuggestionPanel.tsx
===================================================================
--- chapterx-frontend/src/components/writer/AISuggestionPanel.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/writer/AISuggestionPanel.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,182 @@
+import React, { useState, useEffect } from 'react'
+import { Sparkles, Check, X, Clock, ChevronDown, ChevronUp } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useUIStore } from '../../store/uiStore'
+import { AISuggestion, SuggestionType } from '../../types'
+import { Button } from '../ui/Button'
+
+interface AISuggestionPanelProps {
+  chapterId: number
+  storyId?: number
+}
+
+const typeColors: Record<SuggestionType, string> = {
+  grammar: 'bg-blue-500/20 text-blue-300 border-blue-500/30',
+  style: 'bg-violet-500/20 text-violet-300 border-violet-500/30',
+  plot: 'bg-amber-500/20 text-amber-300 border-amber-500/30',
+  character: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/30',
+  pacing: 'bg-pink-500/20 text-pink-300 border-pink-500/30',
+}
+
+const SuggestionCard: React.FC<{
+  suggestion: AISuggestion
+  onAccept: () => void
+  onReject: () => void
+}> = ({ suggestion, onAccept, onReject }) => {
+  const [expanded, setExpanded] = useState(false)
+
+  return (
+    <div className="bg-slate-800 border border-slate-700 rounded-xl p-4">
+      <div className="flex items-start justify-between gap-3 mb-3">
+        <div className="flex items-center gap-2">
+          <span className={`px-2 py-0.5 text-xs font-medium rounded-full border ${typeColors[suggestion.suggestion_type]}`}>
+            {suggestion.suggestion_type}
+          </span>
+          {suggestion.accepted === true && (
+            <span className="flex items-center gap-1 text-xs text-emerald-400">
+              <Check size={12} /> Accepted
+            </span>
+          )}
+          {suggestion.accepted === false && (
+            <span className="flex items-center gap-1 text-xs text-rose-400">
+              <X size={12} /> Rejected
+            </span>
+          )}
+          {suggestion.accepted === null && (
+            <span className="flex items-center gap-1 text-xs text-amber-400">
+              <Clock size={12} /> Pending
+            </span>
+          )}
+        </div>
+        <button
+          onClick={() => setExpanded(!expanded)}
+          className="text-slate-500 hover:text-slate-300 transition-colors"
+        >
+          {expanded ? <ChevronUp size={16} /> : <ChevronDown size={16} />}
+        </button>
+      </div>
+
+      <div className="space-y-3">
+        <div>
+          <p className="text-xs text-slate-500 mb-1">Original:</p>
+          <p className="text-sm text-slate-400 bg-slate-900 rounded-lg p-3 italic border border-slate-700">
+            "{suggestion.original_text}"
+          </p>
+        </div>
+        <div>
+          <p className="text-xs text-slate-500 mb-1">Suggested:</p>
+          <p className="text-sm text-emerald-300 bg-emerald-500/5 rounded-lg p-3 border border-emerald-500/20">
+            "{suggestion.suggested_text}"
+          </p>
+        </div>
+
+        {expanded && (
+          <div>
+            <p className="text-xs text-slate-500 mb-1">Explanation:</p>
+            <p className="text-sm text-slate-400">{suggestion.explanation}</p>
+            {suggestion.applied_at && (
+              <p className="text-xs text-slate-600 mt-2">
+                Applied: {new Date(suggestion.applied_at).toLocaleString()}
+              </p>
+            )}
+          </div>
+        )}
+
+        {suggestion.accepted === null && (
+          <div className="flex gap-2 pt-1">
+            <Button size="sm" onClick={onAccept} className="flex-1">
+              <Check size={14} />
+              Accept
+            </Button>
+            <Button size="sm" variant="danger" onClick={onReject} className="flex-1">
+              <X size={14} />
+              Reject
+            </Button>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+export const AISuggestionPanel: React.FC<AISuggestionPanelProps> = ({ chapterId, storyId }) => {
+  const { aiSuggestions, acceptSuggestion, rejectSuggestion, fetchSuggestions } = useStoryStore()
+  const { addToast } = useUIStore()
+  const [tab, setTab] = useState<'pending' | 'accepted' | 'rejected'>('pending')
+  const [loading, setLoading] = useState(false)
+
+  useEffect(() => {
+    setLoading(true)
+    fetchSuggestions().finally(() => setLoading(false))
+  }, [chapterId])
+
+  // Filter by storyId if available (backend), else fall back to chapterId (mock)
+  const chapterSuggestions = aiSuggestions.filter(s =>
+    storyId ? (s as any).story_id === storyId : s.chapter_id === chapterId
+  )
+  const pending = chapterSuggestions.filter(s => s.accepted === null)
+  const accepted = chapterSuggestions.filter(s => s.accepted === true)
+  const rejected = chapterSuggestions.filter(s => s.accepted === false)
+
+  const currentList = tab === 'pending' ? pending : tab === 'accepted' ? accepted : rejected
+
+  return (
+    <div className="bg-slate-900 border border-slate-700 rounded-2xl p-6">
+      <div className="flex items-center gap-2 mb-4">
+        <Sparkles size={18} className="text-violet-400" />
+        <h3 className="text-white font-semibold">AI Writing Suggestions</h3>
+        <span className="ml-auto text-xs text-slate-500">{chapterSuggestions.length} total</span>
+      </div>
+
+      {/* Tabs */}
+      <div className="flex gap-1 p-1 bg-slate-800 rounded-xl mb-4">
+        {([
+          { key: 'pending', label: 'Pending', count: pending.length },
+          { key: 'accepted', label: 'Accepted', count: accepted.length },
+          { key: 'rejected', label: 'Rejected', count: rejected.length },
+        ] as const).map(t => (
+          <button
+            key={t.key}
+            onClick={() => setTab(t.key)}
+            className={`flex-1 flex items-center justify-center gap-1.5 py-1.5 rounded-lg text-sm font-medium transition-colors ${
+              tab === t.key
+                ? 'bg-indigo-600 text-white'
+                : 'text-slate-400 hover:text-white'
+            }`}
+          >
+            {t.label}
+            <span className={`text-xs px-1.5 py-0.5 rounded-full ${
+              tab === t.key ? 'bg-indigo-500' : 'bg-slate-700'
+            }`}>
+              {t.count}
+            </span>
+          </button>
+        ))}
+      </div>
+
+      {/* Suggestions */}
+      <div className="space-y-3">
+        {loading ? (
+          <div className="text-center py-8 text-slate-500 text-sm">
+            <Sparkles size={32} className="mx-auto mb-2 opacity-30 animate-pulse" />
+            Loading suggestions...
+          </div>
+        ) : currentList.length === 0 ? (
+          <div className="text-center py-8 text-slate-500 text-sm">
+            <Sparkles size={32} className="mx-auto mb-2 opacity-30" />
+            No {tab} suggestions
+          </div>
+        ) : (
+          currentList.map(s => (
+            <SuggestionCard
+              key={s.suggestion_id}
+              suggestion={s}
+              onAccept={async () => { await acceptSuggestion(s.suggestion_id); addToast('Suggestion accepted!') }}
+              onReject={async () => { await rejectSuggestion(s.suggestion_id); addToast('Suggestion rejected', 'info') }}
+            />
+          ))
+        )}
+      </div>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/writer/CollaboratorManager.tsx
===================================================================
--- chapterx-frontend/src/components/writer/CollaboratorManager.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/writer/CollaboratorManager.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,190 @@
+import React, { useState } from 'react'
+import { Users, Trash2, UserPlus, Shield } from 'lucide-react'
+import { useStoryStore } from '../../store/storyStore'
+import { useAuthStore } from '../../store/authStore'
+import { useNotificationStore } from '../../store/notificationStore'
+import { useUIStore } from '../../store/uiStore'
+import { Collaboration, CollaboratorRole, PermissionLevel } from '../../types'
+import { Button } from '../ui/Button'
+import { Avatar } from '../ui/Avatar'
+import { Modal } from '../ui/Modal'
+
+interface CollaboratorManagerProps {
+  storyId: number
+  storyTitle: string
+  ownerId: number
+}
+
+const roles: CollaboratorRole[] = ['co-author', 'editor', 'proofreader', 'beta-reader']
+
+const permissionLabels: Record<PermissionLevel, string> = {
+  1: 'View Only',
+  2: 'Comment',
+  3: 'Edit Chapters',
+  4: 'Manage Story',
+  5: 'Full Access',
+}
+
+export const CollaboratorManager: React.FC<CollaboratorManagerProps> = ({
+  storyId,
+  storyTitle,
+  ownerId,
+}) => {
+  const { collaborations, addCollaboration, removeCollaboration, updateCollaborationPermission } = useStoryStore()
+  const { allUsers } = useAuthStore()
+  const { addNotification } = useNotificationStore()
+  const { addToast } = useUIStore()
+
+  const [inviteOpen, setInviteOpen] = useState(false)
+  const [selectedUser, setSelectedUser] = useState('')
+  const [selectedRole, setSelectedRole] = useState<CollaboratorRole>('editor')
+  const [selectedLevel, setSelectedLevel] = useState<PermissionLevel>(3)
+
+  const storyCollabs = collaborations.filter(c => c.story_id === storyId)
+  const collabUserIds = new Set(storyCollabs.map(c => c.user_id))
+  const availableUsers = allUsers.filter(u => u.user_id !== ownerId && !collabUserIds.has(u.user_id))
+
+  const handleInvite = () => {
+    const user = availableUsers.find(u => u.username === selectedUser)
+    if (!user) { addToast('User not found', 'error'); return }
+
+    const newCollab: Collaboration = {
+      collab_id: Date.now(),
+      story_id: storyId,
+      story_title: storyTitle,
+      user_id: user.user_id,
+      username: user.username,
+      name: user.name,
+      role: selectedRole,
+      permission_level: selectedLevel,
+      joined_at: new Date().toISOString(),
+    }
+    addCollaboration(newCollab)
+    addNotification({
+      user_id: user.user_id,
+      type: 'collaboration',
+      title: 'Collaboration Invite',
+      message: `You've been invited to collaborate on "${storyTitle}" as ${selectedRole}.`,
+      link: `/story/${storyId}`,
+    })
+    addToast(`${user.username} added as collaborator!`)
+    setInviteOpen(false)
+    setSelectedUser('')
+  }
+
+  const handleRemove = (collab: Collaboration) => {
+    removeCollaboration(collab.user_id, storyId)
+    addToast(`${collab.username} removed from collaborators`, 'info')
+  }
+
+  return (
+    <div className="bg-slate-900 border border-slate-700 rounded-2xl p-6">
+      <div className="flex items-center justify-between mb-4">
+        <div className="flex items-center gap-2">
+          <Users size={18} className="text-violet-400" />
+          <h3 className="text-white font-semibold">Collaborators</h3>
+          <span className="text-xs text-slate-500">({storyCollabs.length})</span>
+        </div>
+        <Button size="sm" onClick={() => setInviteOpen(true)}>
+          <UserPlus size={14} />
+          Invite
+        </Button>
+      </div>
+
+      {storyCollabs.length === 0 ? (
+        <div className="text-center py-8 text-slate-500 text-sm">
+          <Users size={32} className="mx-auto mb-2 opacity-30" />
+          No collaborators yet
+        </div>
+      ) : (
+        <div className="space-y-3">
+          {storyCollabs.map(collab => (
+            <div key={collab.collab_id} className="flex items-center gap-3 p-3 bg-slate-800 rounded-xl border border-slate-700">
+              <Avatar name={collab.name} size="sm" />
+              <div className="flex-1 min-w-0">
+                <p className="text-sm font-medium text-white">@{collab.username}</p>
+                <div className="flex items-center gap-2 mt-0.5">
+                  <span className="text-xs text-violet-400">{collab.role}</span>
+                  <span className="text-slate-600">·</span>
+                  <Shield size={11} className="text-slate-500" />
+                  <span className="text-xs text-slate-500">Level {collab.permission_level}: {permissionLabels[collab.permission_level]}</span>
+                </div>
+              </div>
+              <div className="flex items-center gap-2">
+                <select
+                  value={collab.permission_level}
+                  onChange={e => {
+                    updateCollaborationPermission(collab.user_id, storyId, Number(e.target.value) as PermissionLevel)
+                    addToast('Permission updated')
+                  }}
+                  className="bg-slate-700 border border-slate-600 text-slate-300 text-xs rounded-lg px-2 py-1 focus:outline-none focus:border-indigo-500"
+                >
+                  {([1, 2, 3, 4, 5] as PermissionLevel[]).map(l => (
+                    <option key={l} value={l}>Level {l}</option>
+                  ))}
+                </select>
+                <button
+                  onClick={() => handleRemove(collab)}
+                  className="text-slate-500 hover:text-rose-400 transition-colors p-1"
+                >
+                  <Trash2 size={14} />
+                </button>
+              </div>
+            </div>
+          ))}
+        </div>
+      )}
+
+      {/* Invite Modal */}
+      <Modal isOpen={inviteOpen} onClose={() => setInviteOpen(false)} title="Invite Collaborator">
+        <div className="space-y-4">
+          <div>
+            <label className="block text-sm text-slate-400 mb-1">Select User</label>
+            <select
+              value={selectedUser}
+              onChange={e => setSelectedUser(e.target.value)}
+              className="w-full bg-slate-800 border border-slate-700 text-slate-300 rounded-xl px-4 py-2 focus:outline-none focus:border-indigo-500"
+            >
+              <option value="">-- Choose a user --</option>
+              {availableUsers.map(u => (
+                <option key={u.user_id} value={u.username}>
+                  @{u.username} ({u.role})
+                </option>
+              ))}
+            </select>
+          </div>
+          <div>
+            <label className="block text-sm text-slate-400 mb-1">Role</label>
+            <select
+              value={selectedRole}
+              onChange={e => setSelectedRole(e.target.value as CollaboratorRole)}
+              className="w-full bg-slate-800 border border-slate-700 text-slate-300 rounded-xl px-4 py-2 focus:outline-none focus:border-indigo-500"
+            >
+              {roles.map(r => <option key={r} value={r}>{r}</option>)}
+            </select>
+          </div>
+          <div>
+            <label className="block text-sm text-slate-400 mb-1">Permission Level</label>
+            <select
+              value={selectedLevel}
+              onChange={e => setSelectedLevel(Number(e.target.value) as PermissionLevel)}
+              className="w-full bg-slate-800 border border-slate-700 text-slate-300 rounded-xl px-4 py-2 focus:outline-none focus:border-indigo-500"
+            >
+              {([1, 2, 3, 4, 5] as PermissionLevel[]).map(l => (
+                <option key={l} value={l}>Level {l} – {permissionLabels[l]}</option>
+              ))}
+            </select>
+          </div>
+          <div className="flex gap-3 pt-2">
+            <Button variant="secondary" className="flex-1" onClick={() => setInviteOpen(false)}>
+              Cancel
+            </Button>
+            <Button className="flex-1" onClick={handleInvite} disabled={!selectedUser}>
+              Send Invite
+            </Button>
+          </div>
+        </div>
+      </Modal>
+    </div>
+  )
+}
Index: chapterx-frontend/src/components/writer/StoryAnalytics.tsx
===================================================================
--- chapterx-frontend/src/components/writer/StoryAnalytics.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
+++ chapterx-frontend/src/components/writer/StoryAnalytics.tsx	(revision b62cefc14094ca5ac7154f7d48797a1e6c444935)
@@ -0,0 +1,95 @@
+import React from 'react'
+import {
+  LineChart,
+  Line,
+  BarChart,
+  Bar,
+  XAxis,
+  YAxis,
+  CartesianGrid,
+  Tooltip,
+  ResponsiveContainer,
+} from 'recharts'
+import { Eye, Heart, MessageCircle, TrendingUp, Clock, BarChart2 } from 'lucide-react'
+import { mockAnalytics } from '../../data/mockData'
+
+const StatCard: React.FC<{ icon: React.ReactNode; label: string; value: string | number; color: string }> = ({
+  icon, label, value, color,
+}) => (
+  <div className={`p-4 bg-slate-800 rounded-xl border border-slate-700`}>
+    <div className={`w-10 h-10 rounded-xl ${color} flex items-center justify-center mb-3`}>
+      {icon}
+    </div>
+    <p className="text-2xl font-bold text-white">{value.toLocaleString()}</p>
+    <p className="text-slate-400 text-sm mt-0.5">{label}</p>
+  </div>
+)
+
+const CustomTooltip = ({ active, payload, label }: any) => {
+  if (active && payload && payload.length) {
+    return (
+      <div className="bg-slate-800 border border-slate-700 rounded-xl px-3 py-2 text-sm">
+        <p className="text-slate-400 mb-1">{label}</p>
+        {payload.map((p: any) => (
+          <p key={p.dataKey} className="text-white font-medium">
+            {p.name}: {p.value.toLocaleString()}
+          </p>
+        ))}
+      </div>
+    )
+  }
+  return null
+}
+
+export const StoryAnalytics: React.FC = () => {
+  const analytics = mockAnalytics
+  const viewsData = analytics.views_over_time.filter((_, i) => i % 5 === 0)
+  const likesData = analytics.likes_over_time.filter((_, i) => i % 5 === 0)
+
+  return (
+    <div className="space-y-6">
+      {/* Stat cards */}
+      <div className="grid grid-cols-2 lg:grid-cols-5 gap-4">
+        <StatCard icon={<Eye size={18} className="text-blue-300" />} label="Total Views" value={analytics.total_views} color="bg-blue-500/20" />
+        <StatCard icon={<Heart size={18} className="text-rose-300" />} label="Total Likes" value={analytics.total_likes} color="bg-rose-500/20" />
+        <StatCard icon={<MessageCircle size={18} className="text-violet-300" />} label="Comments" value={analytics.total_comments} color="bg-violet-500/20" />
+        <StatCard icon={<Clock size={18} className="text-amber-300" />} label="Avg Read (min)" value={analytics.avg_read_time} color="bg-amber-500/20" />
+        <StatCard icon={<BarChart2 size={18} className="text-emerald-300" />} label="Completion %" value={`${analytics.completion_rate}%`} color="bg-emerald-500/20" />
+      </div>
+
+      {/* Views chart */}
+      <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+        <div className="flex items-center gap-2 mb-4">
+          <TrendingUp size={16} className="text-blue-400" />
+          <h3 className="text-white font-semibold">Views Over Time</h3>
+        </div>
+        <ResponsiveContainer width="100%" height={200}>
+          <LineChart data={viewsData}>
+            <CartesianGrid strokeDasharray="3 3" stroke="#334155" />
+            <XAxis dataKey="date" tick={{ fill: '#64748b', fontSize: 11 }} tickLine={false} axisLine={false} />
+            <YAxis tick={{ fill: '#64748b', fontSize: 11 }} tickLine={false} axisLine={false} />
+            <Tooltip content={<CustomTooltip />} />
+            <Line type="monotone" dataKey="views" stroke="#6366f1" strokeWidth={2} dot={false} name="Views" />
+          </LineChart>
+        </ResponsiveContainer>
+      </div>
+
+      {/* Likes chart */}
+      <div className="bg-slate-800 border border-slate-700 rounded-2xl p-6">
+        <div className="flex items-center gap-2 mb-4">
+          <Heart size={16} className="text-rose-400" />
+          <h3 className="text-white font-semibold">Likes Over Time</h3>
+        </div>
+        <ResponsiveContainer width="100%" height={200}>
+          <BarChart data={likesData}>
+            <CartesianGrid strokeDasharray="3 3" stroke="#334155" />
+            <XAxis dataKey="date" tick={{ fill: '#64748b', fontSize: 11 }} tickLine={false} axisLine={false} />
+            <YAxis tick={{ fill: '#64748b', fontSize: 11 }} tickLine={false} axisLine={false} />
+            <Tooltip content={<CustomTooltip />} />
+            <Bar dataKey="likes" fill="#f43f5e" radius={[4, 4, 0, 0]} name="Likes" />
+          </BarChart>
+        </ResponsiveContainer>
+      </div>
+    </div>
+  )
+}
