A responsive web app for creating, editing, and sharing circular "discs" representing planning timelines with multiple rings and activities.
- Circular Disc View: Interactive SVG-based circular planner with drag-and-drop activities
- Multiple Views: Disc, Calendar, and List views of the same data
- Ring Management: Create and manage multiple rings (teams/departments)
- Activity Management: Add, edit, and organize activities with labels and attachments
- Filtering & Search: Filter by rings, labels, text search, and date ranges
- Export/Import: JSON export/import and PNG/PDF export capabilities
- Responsive Design: Works on desktop and mobile devices
- Dark Mode: Light and dark theme support
- Accessibility: Keyboard navigation and screen reader support
- Frontend: React 18+, TypeScript, Vite
- State Management: Zustand
- Routing: React Router v6
- UI: Tailwind CSS + Headless UI
- Forms: React Hook Form + Zod validation
- Charts: Native SVG with D3 for polar math
- Date Utils: date-fns
- Testing: Vitest + React Testing Library + Playwright
- Linting: ESLint + Prettier + Husky
- Node.js 18+
- npm or yarn
- Clone the repository:
git clone <repository-url>
cd orbitaldisk- Install dependencies:
npm install- Start the development server:
npm run dev- Open http://localhost:5173 in your browser.
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run test- Run unit testsnpm run test:ui- Run tests with UInpm run test:e2e- Run E2E testsnpm run lint- Run ESLintnpm run format- Format code with Prettier
src/
├── components/ # Reusable UI components
│ ├── ui/ # Basic UI components (Button, Input, etc.)
│ ├── layout/ # Layout components (AppBar, Sidebar)
│ └── disc/ # Disc-specific components
├── views/ # Page components
├── stores/ # Zustand state management
├── repositories/ # Data persistence layer
├── lib/ # Utility functions
│ ├── date-utils.ts # Date manipulation utilities
│ ├── polar-utils.ts # Polar coordinate calculations
│ └── validation.ts # Zod schemas
├── types/ # TypeScript type definitions
└── test/ # Test setup and utilities
A circular planning timeline with:
- Start and end dates
- Default time unit (day, week, month, quarter)
- Multiple rings
- Labels and activities
- Theme customization
A concentric circle representing a team/department:
- Types: title, date, calendar, shared
- Custom time unit override
- Read-only support for shared rings
An event or task plotted on a ring:
- Start and end dates
- Title and description
- Color and labels
- Attachments and recurrence
- Drag-and-drop repositioning
- Click "New Disc" on the home page
- Enter disc name, start/end dates, and time unit
- Click "Create" to save
- Open a disc
- Click "Add Ring" in the toolbar
- Enter ring name, type, and color
- Click "Create Ring"
- Click on a ring in the disc view
- Fill in activity details (title, dates, color, labels)
- Click "Create" to add the activity
- Click "Filter" in the toolbar
- Select rings, labels, or date ranges
- Click "Apply Filters"
- Export: Click "Export" to download JSON file
- Import: Click "Import" and select JSON file
- Create components in appropriate directories
- Add types to
src/types/index.ts - Update stores if state management is needed
- Add tests for new functionality
- Unit Tests: Test utility functions and components
- Component Tests: Test React components in isolation
- E2E Tests: Test complete user workflows
- Use TypeScript for type safety
- Follow React best practices
- Use Tailwind CSS for styling
- Write tests for new features
- Use semantic commit messages
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - see LICENSE file for details.
- Inspired by Plandisc circular planning methodology
- Built with modern React and TypeScript
- Uses Tailwind CSS for styling
- D3.js for polar coordinate calculations