|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>NovelCraft - Writing & Organization</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<script src="https://unpkg.com/lucide@latest"></script> |
|
<style> |
|
|
|
::-webkit-scrollbar { |
|
width: 8px; |
|
height: 8px; |
|
} |
|
::-webkit-scrollbar-track { |
|
background: #f1f1f1; |
|
} |
|
::-webkit-scrollbar-thumb { |
|
background: #c1c1c1; |
|
border-radius: 4px; |
|
} |
|
::-webkit-scrollbar-thumb:hover { |
|
background: #a8a8a8; |
|
} |
|
|
|
|
|
@keyframes fadeIn { |
|
from { opacity: 0; } |
|
to { opacity: 1; } |
|
} |
|
.fade-in { |
|
animation: fadeIn 0.2s ease-in-out; |
|
} |
|
|
|
|
|
.dropdown-content { |
|
display: none; |
|
position: absolute; |
|
z-index: 50; |
|
min-width: 220px; |
|
background-color: white; |
|
border: 1px solid #e5e7eb; |
|
border-radius: 0.375rem; |
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); |
|
} |
|
.dropdown:hover .dropdown-content { |
|
display: block; |
|
} |
|
|
|
|
|
.user-message { |
|
background-color: #6366f1; |
|
color: white; |
|
border-radius: 1rem 1rem 0 1rem; |
|
} |
|
.ai-message { |
|
background-color: #f3f4f6; |
|
color: #1f2937; |
|
border-radius: 1rem 1rem 1rem 0; |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-50 text-gray-800 font-sans antialiased flex h-screen overflow-hidden"> |
|
|
|
<div class="w-64 bg-white border-r border-gray-200 flex flex-col h-full"> |
|
<div class="p-4 border-b border-gray-200"> |
|
<h1 class="text-xl font-semibold text-gray-800 flex items-center"> |
|
<i data-lucide="book-open" class="w-5 h-5 mr-2 text-indigo-500"></i> |
|
NovelCraft |
|
</h1> |
|
</div> |
|
|
|
<div class="p-3 border-b border-gray-200"> |
|
<div class="relative"> |
|
<input type="text" placeholder="Search all entries..." class="w-full pl-9 pr-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"> |
|
<i data-lucide="search" class="absolute left-3 top-2.5 text-gray-400 w-4 h-4"></i> |
|
</div> |
|
</div> |
|
|
|
<div class="flex-1 overflow-y-auto"> |
|
<div class="px-3 pt-3"> |
|
<button class="w-full flex items-center justify-between px-3 py-2 bg-indigo-50 text-indigo-600 rounded-md text-sm font-medium"> |
|
<span class="flex items-center"> |
|
<i data-lucide="plus" class="w-4 h-4 mr-2"></i> |
|
New Entry |
|
</span> |
|
</button> |
|
</div> |
|
|
|
<div class="mt-4"> |
|
<div class="px-3"> |
|
<button class="w-full flex items-center justify-between px-3 py-2 bg-indigo-600 text-white rounded-md text-sm font-medium"> |
|
<span class="flex items-center"> |
|
<i data-lucide="library" class="w-4 h-4 mr-2"></i> |
|
Codex |
|
</span> |
|
<i data-lucide="chevron-down" class="w-4 h-4"></i> |
|
</button> |
|
</div> |
|
|
|
<div class="mt-1 pl-8"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="users" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Characters |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="map-pin" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Locations |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="package" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Items |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="scroll" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Lore |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="file-text" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Snippets |
|
</a> |
|
</div> |
|
</div> |
|
|
|
<div class="mt-2"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md mx-2 flex items-center"> |
|
<i data-lucide="calendar" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Timeline |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md mx-2 flex items-center"> |
|
<i data-lucide="bar-chart-2" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Stats |
|
</a> |
|
</div> |
|
</div> |
|
|
|
<div class="p-3 border-t border-gray-200"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="settings" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Settings |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md flex items-center"> |
|
<i data-lucide="help-circle" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Help & Feedback |
|
</a> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="flex-1 flex flex-col h-full overflow-hidden"> |
|
|
|
<div class="bg-white border-b border-gray-200"> |
|
<div class="flex items-center px-4 h-14"> |
|
<div class="flex space-x-1"> |
|
<a href="#" class="px-3 py-2 text-sm font-medium text-gray-500 hover:text-gray-700 rounded-md">Plan</a> |
|
<a href="#" class="px-3 py-2 text-sm font-medium text-gray-500 hover:text-gray-700 rounded-md">Write</a> |
|
<a href="#" class="px-3 py-2 text-sm font-medium text-indigo-600 bg-indigo-50 rounded-md">Chat</a> |
|
<a href="#" class="px-3 py-2 text-sm font-medium text-gray-500 hover:text-gray-700 rounded-md">Review</a> |
|
</div> |
|
|
|
<div class="ml-auto flex items-center space-x-3"> |
|
<button class="p-1 rounded-md hover:bg-gray-100"> |
|
<i data-lucide="bell" class="w-5 h-5 text-gray-500"></i> |
|
</button> |
|
<div class="relative"> |
|
<button class="flex items-center space-x-2 focus:outline-none"> |
|
<div class="w-8 h-8 rounded-full bg-indigo-100 flex items-center justify-center text-indigo-600 font-medium">JD</div> |
|
<span class="text-sm font-medium text-gray-700">John Doe</span> |
|
<i data-lucide="chevron-down" class="w-4 h-4 text-gray-500"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="flex-1 flex overflow-hidden"> |
|
|
|
<div class="w-64 bg-white border-r border-gray-200 flex flex-col h-full overflow-hidden"> |
|
<div class="p-3 border-b border-gray-200"> |
|
<button class="w-full flex items-center justify-center px-3 py-2 bg-indigo-600 text-white rounded-md text-sm font-medium"> |
|
<i data-lucide="plus" class="w-4 h-4 mr-2"></i> |
|
New Thread |
|
</button> |
|
</div> |
|
|
|
<div class="flex-1 overflow-y-auto"> |
|
<div class="px-3 pt-3"> |
|
<div class="flex items-center justify-between"> |
|
<h3 class="text-xs font-semibold text-gray-500 uppercase tracking-wider">Pinned</h3> |
|
<span class="text-xs text-gray-400">1 thread</span> |
|
</div> |
|
|
|
<div class="mt-2"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 bg-gray-100 rounded-md flex items-center justify-between"> |
|
<span>Main Story Brainstorm</span> |
|
<i data-lucide="star" class="w-4 h-4 text-yellow-500"></i> |
|
</a> |
|
</div> |
|
</div> |
|
|
|
<div class="px-3 pt-4"> |
|
<div class="flex items-center justify-between"> |
|
<h3 class="text-xs font-semibold text-gray-500 uppercase tracking-wider">Recent</h3> |
|
<span class="text-xs text-gray-400">3 threads</span> |
|
</div> |
|
|
|
<div class="mt-2 space-y-1"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md"> |
|
<div>Fantasy Novels</div> |
|
<div class="text-xs text-gray-400 mt-1">yesterday at 3:45 PM</div> |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md"> |
|
<div>Character Development</div> |
|
<div class="text-xs text-gray-400 mt-1">2 days ago</div> |
|
</a> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded-md"> |
|
<div>World Building</div> |
|
<div class="text-xs text-gray-400 mt-1">Mar 12</div> |
|
</a> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="flex-1 flex flex-col h-full overflow-hidden bg-gray-50"> |
|
|
|
<div class="bg-white border-b border-gray-200 p-3"> |
|
<div class="flex items-center justify-between"> |
|
<div class="flex items-center space-x-4"> |
|
<div class="relative"> |
|
<select class="appearance-none bg-white border border-gray-300 rounded-md pl-3 pr-8 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"> |
|
<option>General Purpose GPT-4 Turbo</option> |
|
<option>General Purpose Claude 3 Haiku</option> |
|
<option>Writing Assistant GPT-4</option> |
|
<option>Creative Writing Claude 3</option> |
|
</select> |
|
<i data-lucide="chevron-down" class="absolute right-3 top-2.5 text-gray-400 w-4 h-4 pointer-events-none"></i> |
|
</div> |
|
|
|
<div class="flex items-center"> |
|
<span class="text-sm text-gray-500 mr-2">Name:</span> |
|
<input type="text" value="Fantasy Novels" class="border-0 border-b border-gray-300 focus:border-indigo-500 focus:ring-0 px-1 py-0 text-sm w-48"> |
|
</div> |
|
</div> |
|
|
|
<div class="relative dropdown"> |
|
<button class="p-1 rounded-md hover:bg-gray-100"> |
|
<i data-lucide="more-horizontal" class="w-5 h-5 text-gray-500"></i> |
|
</button> |
|
|
|
<div class="dropdown-content right-0 mt-1 py-1 w-48"> |
|
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center"> |
|
<i data-lucide="star" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Pin Thread |
|
</a> |
|
<div class="relative sub-dropdown"> |
|
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center justify-between"> |
|
<span class="flex items-center"> |
|
<i data-lucide="copy" class="w-4 h-4 mr-2 text-gray-500"></i> |
|
Copy conversation |
|
</span> |
|
<i data-lucide="chevron-right" class="w-4 h-4 text-gray-400"></i> |
|
</a> |
|
<div class="sub-dropdown-content absolute left-full top-0 ml-1 py-1 w-40 bg-white border border-gray-200 rounded-md shadow-lg hidden"> |
|
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">JSON</a> |
|
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">YAML</a> |
|
<a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">Markdown</a> |
|
</div> |
|
</div> |
|
<a href="#" class="block px-4 py-2 text-sm text-red-600 hover:bg-gray-100 flex items-center"> |
|
<i data-lucide="trash-2" class="w-4 h-4 mr-2 text-red-500"></i> |
|
Delete Thread |
|
</a> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="flex-1 overflow-y-auto p-4 space-y-4"> |
|
<div class="max-w-3xl mx-auto"> |
|
<div class="bg-gray-100 p-4 rounded-lg text-center text-sm text-gray-500"> |
|
This is a new thread. Start by typing a message in the box below. Any codex entries you mention will be included in the context. Alternatively, you can customize the context with the button at the bottom. |
|
</div> |
|
</div> |
|
|
|
<div class="max-w-3xl mx-auto fade-in"> |
|
<div class="flex justify-end"> |
|
<div class="user-message px-4 py-3 max-w-xl"> |
|
<p>I'm writing a fantasy novel set in a world where magic is derived from music. Can you help me brainstorm some unique magical systems based on different musical concepts?</p> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="max-w-3xl mx-auto fade-in"> |
|
<div class="flex justify-start"> |
|
<div class="ai-message px-4 py-3 max-w-xl"> |
|
<p>That's a fascinating concept! Here are some musical magic system ideas:</p> |
|
<ul class="list-disc pl-5 mt-2 space-y-1"> |
|
<li><strong>Harmonic Resonance:</strong> Wizards must maintain perfect pitch to cast spells, with dissonance causing magical backlash.</li> |
|
<li><strong>Rhythmic Patterns:</strong> Combat magic follows strict time signatures - break the rhythm and the spell collapses.</li> |
|
<li><strong>Instrument Specialization:</strong> Different instruments produce different magical effects (strings for illusions, percussion for elemental magic, etc.)</li> |
|
</ul> |
|
<div class="mt-3 pt-2 border-t border-gray-200 flex items-center justify-between text-xs text-gray-500"> |
|
<span>GPT-4 Turbo · 299 words</span> |
|
<div class="flex space-x-2"> |
|
<button class="hover:text-gray-700 flex items-center"> |
|
<i data-lucide="refresh-cw" class="w-3 h-3 mr-1"></i> Retry |
|
</button> |
|
<button class="hover:text-gray-700 flex items-center"> |
|
<i data-lucide="save" class="w-3 h-3 mr-1"></i> Save as Snippet |
|
</button> |
|
<button class="hover:text-gray-700 flex items-center"> |
|
<i data-lucide="copy" class="w-3 h-3 mr-1"></i> Copy |
|
</button> |
|
<button class="hover:text-gray-700 flex items-center"> |
|
<i data-lucide="file-text" class="w-3 h-3 mr-1"></i> Extract |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="bg-white border-t border-gray-200 p-4"> |
|
<div class="max-w-3xl mx-auto"> |
|
<div class="relative"> |
|
<div class="absolute left-3 top-2.5"> |
|
<button id="context-button" class="text-gray-400 hover:text-gray-600"> |
|
<i data-lucide="file-text" class="w-5 h-5"></i> |
|
</button> |
|
|
|
|
|
<div id="context-dropdown" class="hidden absolute left-0 bottom-full mb-2 w-64 bg-white border border-gray-200 rounded-md shadow-lg z-10 p-2"> |
|
<div class="text-xs font-semibold text-gray-500 px-2 py-1">INCLUDE IN CONTEXT</div> |
|
<div class="space-y-1"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded">Full Novel Outline</a> |
|
<div class="relative"> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded flex justify-between items-center"> |
|
<span>Scene Context</span> |
|
<span class="text-xs text-gray-400">No selection</span> |
|
</a> |
|
</div> |
|
<a href="#" class="block px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 rounded">Full Novel Text</a> |
|
<div class="px-3 py-2 flex items-center"> |
|
<input type="checkbox" id="codex-entries" class="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded"> |
|
<label for="codex-entries" class="ml-2 block text-sm text-gray-700">Codex Entries in Thread</label> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<textarea placeholder="Type your message..." rows="1" class="w-full pl-10 pr-16 py-3 border border-gray-300 rounded-md resize-none focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"></textarea> |
|
|
|
<div class="absolute right-3 top-2.5 flex items-center"> |
|
<button class="p-1 text-gray-400 hover:text-gray-600 mr-1"> |
|
<i data-lucide="paperclip" class="w-5 h-5"></i> |
|
</button> |
|
<button class="px-3 py-1.5 bg-indigo-600 text-white rounded-md text-sm font-medium hover:bg-indigo-700"> |
|
<i data-lucide="send" class="w-4 h-4"></i> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
lucide.createIcons(); |
|
|
|
|
|
const contextButton = document.getElementById('context-button'); |
|
const contextDropdown = document.getElementById('context-dropdown'); |
|
|
|
contextButton.addEventListener('click', (e) => { |
|
e.stopPropagation(); |
|
contextDropdown.classList.toggle('hidden'); |
|
}); |
|
|
|
|
|
document.addEventListener('click', () => { |
|
contextDropdown.classList.add('hidden'); |
|
}); |
|
|
|
|
|
document.querySelectorAll('.sub-dropdown').forEach(dropdown => { |
|
const trigger = dropdown.querySelector('a'); |
|
const content = dropdown.querySelector('.sub-dropdown-content'); |
|
|
|
trigger.addEventListener('mouseenter', () => { |
|
content.classList.remove('hidden'); |
|
}); |
|
|
|
dropdown.addEventListener('mouseleave', () => { |
|
content.classList.add('hidden'); |
|
}); |
|
}); |
|
|
|
|
|
const textarea = document.querySelector('textarea'); |
|
textarea.addEventListener('input', function() { |
|
this.style.height = 'auto'; |
|
this.style.height = (this.scrollHeight) + 'px'; |
|
}); |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=algovenus/novelapp" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |