A polished, interactive React/Next.js calendar component inspired by physical wall calendars. This is a fully frontend implementation with zero backend dependencies—all data persists client-side using localStorage.
- Hero image panel with beautiful SVG artwork spanning the full height
- Paper-textured design with realistic shadows and depth
- Glassmorphism styling with backdrop blur effects
- Pinned calendar ring effect (visual detail inspired by physical wall calendars)
- Click-to-select workflow: Click a start date, then an end date to create a range
- Visual feedback: Clear states for start, end, and in-range days
- Hover preview: See the range before committing (desktop only)
- Smart range logic: Selecting again after range is set starts a new selection
- Holiday markers: Special styling for New Year, Independence Day, Christmas
- Monthly memo: Persistent general notes for the current month
- Range-specific notes: Attach notes to individual date ranges
- Saved collections: View all saved range notes with date labels
- Easy management: Remove or update any saved note instantly
- Three scene themes: Alpine (blue), Coast (teal), Desert (orange) with matching accent colors
- Dynamic theming: Accent color changes globally when theme switches
- Smooth interactions: Hover states, micro-animations, and gentle transitions
- Responsive layout:
- Desktop (1240px max): Side-by-side panels
- Tablet (1050px): Stacked centered layout
- Mobile (720px): Optimized touch-friendly interface
- Persistent state: All selections, notes, and theme preference survive page reloads
- Accessibility: Full ARIA labels, semantic HTML, keyboard navigation support
npm installnpm run devThen visit http://localhost:3000
npm run build
npm run startproject/
├── app/
│ ├── page.tsx # Main page entry
│ ├── layout.tsx # Root layout with metadata
│ └── globals.css # All styling (CSS variables, layout, responsive)
├── components/
│ └── WallCalendar.tsx # Main interactive component (380 lines)
├── lib/
│ ├── calendar.ts # Date utilities, scene definitions, SVG art
│ └── storage.ts # localStorage wrapper with typing
└── public/ # Static assets (if any)
- No external dependencies: Uses only React, Next.js, and CSS (no calendaring libraries)
- TypeScript throughout: Fully typed for safety and IDE support
- State management: Single centralized state with localStorage sync
- CSS variables: Theme switching via CSS custom properties
- SVG artwork: Embedded, responsive scenes (no image files)
- Responsive first: Mobile-first design with desktop enhancements
- Dynamic: Adapts based on selected scene theme
- Alpine:
#2f7ef8(cool blue) - Coast:
#0f8b8d(calm teal) - Desert:
#c67a27(warm orange)
- System font stack (Inter, ui-sans-serif, system-ui)
- Responsive sizing using
clamp()for smooth scaling - Clear visual hierarchy with semantic heading levels
- Max-width container (1240px) for desktop, full bleed on mobile
- Glassmorphic panels with subtle gradients
- Paper-textured background for depth
- Generous spacing for visual breathing room
All data is stored locally in localStorage under the key wall-calendar-v1. No backend is required or used:
{
monthOffset: number; // Current month view offset
sceneId: 'alpine' | 'coast' | 'desert'; // Selected theme
rangeStart?: string; // ISO date string (YYYY-MM-DD)
rangeEnd?: string; // ISO date string (YYYY-MM-DD)
monthNote: string; // Month-level memo
rangeNotes: Record<string, string>; // Per-range notes (keyed by "start__end")
}- Date range selection works across months
- Notes save and persist on reload
- Theme switching updates colors dynamically
- Mobile layout stacks properly
- Keyboard navigation functional
- No console errors or warnings
Open source, use freely for any purpose.
Built with React + Next.js + TypeScript A demonstration of clean component architecture, responsive design, and thoughtful UX