├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── repo-to-text └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── app ├── components │ ├── TaskManager.tsx │ ├── categories │ │ └── CategoryModal.tsx │ ├── layout │ │ ├── NavigationPanel.tsx │ │ └── TaskPanelLayout.tsx │ └── tasks │ │ ├── BoardView.tsx │ │ ├── CalendarView.tsx │ │ ├── MindMapNode.tsx │ │ ├── MindMapView.tsx │ │ ├── TaskContextMenu.tsx │ │ ├── TaskDetailPanel.tsx │ │ └── TaskList.tsx ├── favicon.ico ├── globals.css ├── hooks │ ├── useAsyncStorage.ts │ ├── useCategories.ts │ ├── useNavigation.ts │ └── useTasks.ts ├── layout.tsx ├── page.tsx ├── theme │ └── theme.ts └── types │ ├── category.ts │ ├── mindmap.ts │ └── task.ts ├── eslint.config.mjs ├── instructions.txt ├── next.config.ts ├── package-lock.json ├── package.json ├── postcss.config.mjs ├── public ├── file.svg ├── globe.svg ├── next.svg ├── vercel.svg └── window.svg ├── tailwind.config.ts └── tsconfig.json /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: 'bug' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: 'enhancement' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/repo-to-text: -------------------------------------------------------------------------------- 1 | name: Generate Repository Text with Docker Compose 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v3 17 | 18 | - name: Set up Docker Compose 19 | run: | 20 | docker-compose up --build 21 | 22 | - name: Run repo-to-text 23 | run: | 24 | docker-compose run repo-to-text . --output-dir /home/user/output 25 | 26 | - name: Copy output to workspace 27 | run: | 28 | cp /home/user/output/* ./output/ 29 | 30 | - name: Upload output as artifact 31 | uses: actions/upload-artifact@v3 32 | with: 33 | name: repo-text-output 34 | path: ./output/repo-to-text_*.txt 35 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Generate Repository Text 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | workflow_dispatch: # Allows manual triggering 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v3 17 | 18 | - name: Set up Python 19 | uses: actions/setup-python@v4 20 | with: 21 | python-version: '3.12' 22 | 23 | - name: Install dependencies 24 | run: | 25 | python -m pip install --upgrade pip 26 | pip install hatchling pathspec argparse PyYAML 27 | 28 | - name: Install repo-to-text 29 | run: | 30 | pip install repo-to-text 31 | 32 | - name: Run repo-to-text 33 | run: | 34 | repo-to-text . --output-dir ./output 35 | 36 | - name: Upload output as artifact 37 | uses: actions/upload-artifact@v3 38 | with: 39 | name: repo-text-output 40 | path: ./output/repo-to-text_*.txt 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. 37 | -------------------------------------------------------------------------------- /app/components/TaskManager.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React from 'react'; 4 | import TaskList from './tasks/TaskList'; 5 | import BoardView from './tasks/BoardView'; 6 | import MindMapView from './tasks/MindMapView'; 7 | import TaskDetailPanel from './tasks/TaskDetailPanel'; 8 | import { Task } from '../types/task'; 9 | import { useTasks } from '../hooks/useTasks'; 10 | 11 | type ViewMode = 'list' | 'board' | 'mindmap'; 12 | 13 | const TaskManager: React.FC = () => { 14 | const { 15 | tasks, 16 | loading, 17 | addTask, 18 | updateTask, 19 | deleteTask, 20 | updateTaskStatus 21 | } = useTasks(); 22 | 23 | const [selectedTaskId, setSelectedTaskId] = React.useState(null); 24 | const [viewMode, setViewMode] = React.useState('list'); 25 | 26 | const selectedTask = React.useMemo(() => { 27 | return tasks.find(task => task.id === selectedTaskId) || null; 28 | }, [tasks, selectedTaskId]); 29 | 30 | if (loading) { 31 | return ( 32 |
33 |
34 |
35 | ); 36 | } 37 | 38 | return ( 39 |
40 | {/* Main Content */} 41 |
42 | {/* View Toggle */} 43 |
44 |
45 | 55 | 65 | 75 |
76 |
77 | 78 | {/* Task Views */} 79 | {viewMode === 'list' ? ( 80 | 85 | ) : viewMode === 'board' ? ( 86 | 91 | ) : ( 92 | 97 | )} 98 |
99 | 100 | {/* Task Detail Panel */} 101 |
102 | setSelectedTaskId(null)} 105 | onSave={updateTask} 106 | /> 107 |
108 |
109 | ); 110 | }; 111 | 112 | export default TaskManager; -------------------------------------------------------------------------------- /app/components/categories/CategoryModal.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { Category } from '../../types/category'; 3 | 4 | interface CategoryModalProps { 5 | isOpen: boolean; 6 | onClose: () => void; 7 | onSave: (categoryData: Omit) => void; 8 | initialData?: Partial; 9 | } 10 | 11 | const COLORS = [ 12 | '#EF4444', // red 13 | '#F97316', // orange 14 | '#F59E0B', // amber 15 | '#84CC16', // lime 16 | '#10B981', // emerald 17 | '#06B6D4', // cyan 18 | '#3B82F6', // blue 19 | '#6366F1', // indigo 20 | '#8B5CF6', // violet 21 | '#EC4899', // pink 22 | ]; 23 | 24 | const CategoryModal: React.FC = ({ 25 | isOpen, 26 | onClose, 27 | onSave, 28 | initialData = {}, 29 | }) => { 30 | const [name, setName] = useState(initialData.name || ''); 31 | const [description, setDescription] = useState(initialData.description || ''); 32 | const [color, setColor] = useState(initialData.color || COLORS[0]); 33 | 34 | if (!isOpen) return null; 35 | 36 | const handleSubmit = (e: React.FormEvent) => { 37 | e.preventDefault(); 38 | onSave({ 39 | name, 40 | description, 41 | color, 42 | }); 43 | onClose(); 44 | }; 45 | 46 | return ( 47 |
48 |
49 |
50 |

51 | {initialData.id ? 'Edit Category' : 'New Category'} 52 |

53 |
54 |
55 | {/* Name Input */} 56 |
57 | 60 | setName(e.target.value)} 65 | className="w-full px-3 py-2 bg-bg-tertiary border border-border-default rounded-md 66 | focus:outline-none focus:border-accent-primary" 67 | required 68 | /> 69 |
70 | 71 | {/* Description Input */} 72 |
73 | 76 |