diff --git a/docker-compose.yml b/docker-compose.yml
index 6badcef..cc75954 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -18,7 +18,7 @@ services:
- /tmp
labels:
- "traefik.enable=true"
- - "traefik.http.routers.rcal.rule=Host(`rcal.jeffemmett.com`)"
+ - "traefik.http.routers.rcal.rule=Host(`rcal.jeffemmett.com`) || Host(`rcal.online`) || Host(`www.rcal.online`)"
- "traefik.http.routers.rcal.entrypoints=web"
- "traefik.http.services.rcal.loadbalancer.server.port=3000"
networks:
diff --git a/src/app/calendar/page.tsx b/src/app/calendar/page.tsx
new file mode 100644
index 0000000..183e225
--- /dev/null
+++ b/src/app/calendar/page.tsx
@@ -0,0 +1,170 @@
+'use client'
+
+import { useState, useEffect, useCallback } from 'react'
+import { Calendar as CalendarIcon, MapPin, Clock, ZoomIn, ZoomOut, Link2, Unlink2 } from 'lucide-react'
+import { TemporalZoomController } from '@/components/calendar'
+import { CalendarHeader } from '@/components/calendar/CalendarHeader'
+import { CalendarSidebar } from '@/components/calendar/CalendarSidebar'
+import { TabLayout } from '@/components/ui/TabLayout'
+import { TemporalTab } from '@/components/tabs/TemporalTab'
+import { SpatialTab } from '@/components/tabs/SpatialTab'
+import { LunarTab } from '@/components/tabs/LunarTab'
+import { ContextTab } from '@/components/tabs/ContextTab'
+import { useCalendarStore, useEffectiveSpatialGranularity } from '@/lib/store'
+import { TemporalGranularity, TEMPORAL_GRANULARITY_LABELS, GRANULARITY_LABELS } from '@/lib/types'
+import type { TabView } from '@/lib/types'
+
+export default function Home() {
+ const [sidebarOpen, setSidebarOpen] = useState(true)
+ const [zoomPanelOpen, setZoomPanelOpen] = useState(false)
+ const {
+ temporalGranularity,
+ activeTab,
+ setActiveTab,
+ zoomCoupled,
+ toggleZoomCoupled,
+ zoomIn,
+ zoomOut,
+ } = useCalendarStore()
+ const effectiveSpatial = useEffectiveSpatialGranularity()
+
+ // Keyboard shortcuts
+ const handleKeyDown = useCallback(
+ (e: KeyboardEvent) => {
+ if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return
+ if (e.ctrlKey || e.metaKey || e.altKey) return
+
+ switch (e.key) {
+ case 'l':
+ case 'L':
+ e.preventDefault()
+ toggleZoomCoupled()
+ break
+ // Tab switching: 1-4
+ case '1':
+ e.preventDefault()
+ setActiveTab('temporal')
+ break
+ case '2':
+ e.preventDefault()
+ setActiveTab('spatial')
+ break
+ case '3':
+ e.preventDefault()
+ setActiveTab('lunar')
+ break
+ case '4':
+ e.preventDefault()
+ setActiveTab('context')
+ break
+ }
+ },
+ [toggleZoomCoupled, setActiveTab]
+ )
+
+ useEffect(() => {
+ window.addEventListener('keydown', handleKeyDown)
+ return () => window.removeEventListener('keydown', handleKeyDown)
+ }, [handleKeyDown])
+
+ return (
+
+ {/* Sidebar */}
+ {sidebarOpen && (
+
setSidebarOpen(false)} />
+ )}
+
+ {/* Main content */}
+
+
setSidebarOpen(!sidebarOpen)}
+ sidebarOpen={sidebarOpen}
+ />
+
+ {/* Main area with optional zoom panel */}
+
+ {/* Tab layout */}
+
+
+ {{
+ temporal: ,
+ spatial: ,
+ lunar: ,
+ context: ,
+ }}
+
+
+
+ {/* Zoom control panel (collapsible) */}
+ {zoomPanelOpen && (
+
+ )}
+
+
+ {/* Footer with calendar info and quick zoom controls */}
+
+
+
+ )
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 183e225..3bc172c 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,170 +1,194 @@
-'use client'
-
-import { useState, useEffect, useCallback } from 'react'
-import { Calendar as CalendarIcon, MapPin, Clock, ZoomIn, ZoomOut, Link2, Unlink2 } from 'lucide-react'
-import { TemporalZoomController } from '@/components/calendar'
-import { CalendarHeader } from '@/components/calendar/CalendarHeader'
-import { CalendarSidebar } from '@/components/calendar/CalendarSidebar'
-import { TabLayout } from '@/components/ui/TabLayout'
-import { TemporalTab } from '@/components/tabs/TemporalTab'
-import { SpatialTab } from '@/components/tabs/SpatialTab'
-import { LunarTab } from '@/components/tabs/LunarTab'
-import { ContextTab } from '@/components/tabs/ContextTab'
-import { useCalendarStore, useEffectiveSpatialGranularity } from '@/lib/store'
-import { TemporalGranularity, TEMPORAL_GRANULARITY_LABELS, GRANULARITY_LABELS } from '@/lib/types'
-import type { TabView } from '@/lib/types'
-
-export default function Home() {
- const [sidebarOpen, setSidebarOpen] = useState(true)
- const [zoomPanelOpen, setZoomPanelOpen] = useState(false)
- const {
- temporalGranularity,
- activeTab,
- setActiveTab,
- zoomCoupled,
- toggleZoomCoupled,
- zoomIn,
- zoomOut,
- } = useCalendarStore()
- const effectiveSpatial = useEffectiveSpatialGranularity()
-
- // Keyboard shortcuts
- const handleKeyDown = useCallback(
- (e: KeyboardEvent) => {
- if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return
- if (e.ctrlKey || e.metaKey || e.altKey) return
-
- switch (e.key) {
- case 'l':
- case 'L':
- e.preventDefault()
- toggleZoomCoupled()
- break
- // Tab switching: 1-4
- case '1':
- e.preventDefault()
- setActiveTab('temporal')
- break
- case '2':
- e.preventDefault()
- setActiveTab('spatial')
- break
- case '3':
- e.preventDefault()
- setActiveTab('lunar')
- break
- case '4':
- e.preventDefault()
- setActiveTab('context')
- break
- }
- },
- [toggleZoomCoupled, setActiveTab]
- )
-
- useEffect(() => {
- window.addEventListener('keydown', handleKeyDown)
- return () => window.removeEventListener('keydown', handleKeyDown)
- }, [handleKeyDown])
+import Link from 'next/link'
+export default function LandingPage() {
return (
-
- {/* Sidebar */}
- {sidebarOpen && (
-
setSidebarOpen(false)} />
- )}
-
- {/* Main content */}
-
-
setSidebarOpen(!sidebarOpen)}
- sidebarOpen={sidebarOpen}
- />
-
- {/* Main area with optional zoom panel */}
-
- {/* Tab layout */}
-
-
- {{
- temporal: ,
- spatial: ,
- lunar: ,
- context: ,
- }}
-
+
+ {/* Nav */}
+
- {/* Footer with calendar info and quick zoom controls */}
-