/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useMemo } from 'react'; import { motion, AnimatePresence } from 'motion/react'; // Components import { Sidebar } from './components/Sidebar'; import { NotebooksView } from './components/NotebooksView'; import { AgentsView } from './components/AgentsView'; import { SettingsView } from './components/SettingsView'; import { AISidebar } from './components/AISidebar'; // Data & Types import { CARNETS, ALL_NOTES } from './constants'; import { NavigationView, SettingsTab, AITab, AITone, Carnet, Note } from './types'; export default function App() { const [activeView, setActiveView] = useState('notebooks'); const [activeSettingsTab, setActiveSettingsTab] = useState('general'); const [selectedAgentId, setSelectedAgentId] = useState(null); const [isDarkMode, setIsDarkMode] = useState(false); const [carnets, setCarnets] = useState(CARNETS); const [notes, setNotes] = useState(ALL_NOTES); const [activeCarnetId, setActiveCarnetId] = useState('4'); const [activeNoteId, setActiveNoteId] = useState(null); const [selectedTagIds, setSelectedTagIds] = useState([]); const [isAISidebarOpen, setIsAISidebarOpen] = useState(false); const [aiTab, setAiTab] = useState('discussion'); const [selectedTone, setSelectedTone] = useState('Professional'); // Modal States const [showNewCarnetModal, setShowNewCarnetModal] = useState<{ isOpen: boolean; parentId?: string }>({ isOpen: false }); const [showNewNoteModal, setShowNewNoteModal] = useState(false); // Form States const [newCarnetName, setNewCarnetName] = useState(''); const [newNoteTitle, setNewNoteTitle] = useState(''); const [newNoteContent, setNewNoteContent] = useState(''); const togglePin = (noteId: string) => { setNotes(notes.map(n => n.id === noteId ? { ...n, isPinned: !n.isPinned } : n)); }; const filteredNotes = useMemo(() => { let result = notes.filter(n => n.carnetId === activeCarnetId); if (selectedTagIds.length > 0) { result = result.filter(note => selectedTagIds.every(tagId => note.tags?.some(tag => tag.id === tagId)) ); } return [...result].sort((a, b) => { if (a.isPinned && !b.isPinned) return -1; if (!a.isPinned && b.isPinned) return 1; return 0; }); }, [activeCarnetId, notes]); const activeNote = useMemo(() => notes.find(n => n.id === activeNoteId), [activeNoteId, notes]); const activeCarnet = useMemo(() => carnets.find(c => c.id === activeCarnetId), [activeCarnetId, carnets]); const handleAddCarnet = (e: React.FormEvent) => { e.preventDefault(); if (!newCarnetName.trim()) return; const newCarnet: Carnet = { id: Date.now().toString(), name: newCarnetName, initial: newCarnetName.charAt(0).toUpperCase(), type: 'Project', parentId: showNewCarnetModal.parentId }; setCarnets([...carnets, newCarnet]); setNewCarnetName(''); setShowNewCarnetModal({ isOpen: false }); setActiveCarnetId(newCarnet.id); }; const handleAddNote = (e: React.FormEvent) => { e.preventDefault(); if (!newNoteTitle.trim() || !newNoteContent.trim()) return; const newNote: Note = { id: `n-${Date.now()}`, carnetId: activeCarnetId, title: newNoteTitle, date: new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }).format(new Date()), content: newNoteContent, imageUrl: 'https://images.unsplash.com/photo-1487958449943-2429e8be8625?auto=format&fit=crop&q=80&w=800&h=600', tags: [] }; setNotes([newNote, ...notes]); setNewNoteTitle(''); setNewNoteContent(''); setShowNewNoteModal(false); setActiveNoteId(newNote.id); }; return (
setShowNewCarnetModal({ isOpen: show, parentId })} />
{activeView === 'notebooks' && ( setShowNewCarnetModal({ isOpen: show, parentId })} /> )} {activeView === 'agents' && ( )} {activeView === 'settings' && ( )}
{/* Modals */} {showNewCarnetModal.isOpen && (
setShowNewCarnetModal({ isOpen: false })} className="absolute inset-0 bg-ink/40 backdrop-blur-sm" />

{showNewCarnetModal.parentId ? 'Create Sub-Carnet' : 'Create New Carnet'}

{showNewCarnetModal.parentId && (

Inside: {carnets.find(c => c.id === showNewCarnetModal.parentId)?.name}

)}
setNewCarnetName(e.target.value)} placeholder="E.g., Sustainable Patterns" className="w-full bg-white dark:bg-[#2A2A2A] border border-border rounded-lg px-4 py-3 outline-none focus:border-ink transition-colors font-serif italic text-lg text-ink dark:text-dark-ink" />
)} {showNewNoteModal && (
setShowNewNoteModal(false)} className="absolute inset-0 bg-ink/40 backdrop-blur-sm" />

Add Architectural Note

setNewNoteTitle(e.target.value)} placeholder="Enter the title of your study..." className="w-full bg-white dark:bg-[#2A2A2A] border border-border rounded-lg px-5 py-4 outline-none focus:border-ink transition-colors font-serif text-2xl text-ink dark:text-dark-ink" />