UNPKG

@uplink-protocol/calendar-controller

Version:

Flexible calendar API supporting both calendar and date-picker integrations for any JavaScript framework or library

706 lines (668 loc) β€’ 93.8 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Calendar Controller - Interactive Documentation & Live Demos</title> <script src="https://cdn.tailwindcss.com"></script> <script> tailwind.config = { darkMode: 'class', theme: { extend: { colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", background: "hsl(var(--background))", foreground: "hsl(var(--foreground))", primary: { DEFAULT: "hsl(var(--primary))", foreground: "hsl(var(--primary-foreground))" }, secondary: { DEFAULT: "hsl(var(--secondary))", foreground: "hsl(var(--secondary-foreground))" }, destructive: { DEFAULT: "hsl(var(--destructive))", foreground: "hsl(var(--destructive-foreground))" }, muted: { DEFAULT: "hsl(var(--muted))", foreground: "hsl(var(--muted-foreground))" }, accent: { DEFAULT: "hsl(var(--accent))", foreground: "hsl(var(--accent-foreground))" }, popover: { DEFAULT: "hsl(var(--popover))", foreground: "hsl(var(--popover-foreground))" }, card: { DEFAULT: "hsl(var(--card))", foreground: "hsl(var(--card-foreground))" } }, borderRadius: { lg: "var(--radius)", md: "calc(var(--radius) - 2px)", sm: "calc(var(--radius) - 4px)" }, fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'], mono: ['JetBrains Mono', 'Consolas', 'monospace'] }, animation: { 'float': 'float 6s ease-in-out infinite', 'fade-in': 'fadeIn 0.5s ease-in-out', 'slide-in': 'slideIn 0.3s ease-out', 'bounce-in': 'bounceIn 0.6s ease-out', 'pulse-slow': 'pulse 3s ease-in-out infinite', 'shimmer': 'shimmer 2s linear infinite' }, keyframes: { float: { '0%, 100%': { transform: 'translateY(0px)', opacity: '0.7' }, '50%': { transform: 'translateY(-10px)', opacity: '1' } }, fadeIn: { '0%': { opacity: '0' }, '100%': { opacity: '1' } }, slideIn: { '0%': { transform: 'translateX(-100%)', opacity: '0' }, '100%': { transform: 'translateX(0)', opacity: '1' } }, bounceIn: { '0%': { transform: 'scale(0.3)', opacity: '0' }, '50%': { transform: 'scale(1.05)' }, '70%': { transform: 'scale(0.9)' }, '100%': { transform: 'scale(1)', opacity: '1' } }, shimmer: { '0%': { transform: 'translateX(-100%)' }, '100%': { transform: 'translateX(100%)' } } } } } } </script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"> <style> :root { --background: 0 0% 100%; --foreground: 222.2 84% 4.9%; --card: 0 0% 100%; --card-foreground: 222.2 84% 4.9%; --popover: 0 0% 100%; --popover-foreground: 222.2 84% 4.9%; --primary: 221.2 83.2% 53.3%; --primary-foreground: 210 40% 98%; --secondary: 210 40% 96%; --secondary-foreground: 222.2 84% 4.9%; --muted: 210 40% 96%; --muted-foreground: 215.4 16.3% 46.9%; --accent: 210 40% 96%; --accent-foreground: 222.2 84% 4.9%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; --ring: 221.2 83.2% 53.3%; --radius: 0.75rem; } .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; --card: 222.2 84% 4.9%; --card-foreground: 210 40% 98%; --popover: 222.2 84% 4.9%; --popover-foreground: 210 40% 98%; --primary: 217.2 91.2% 59.8%; --primary-foreground: 222.2 84% 4.9%; --secondary: 217.2 32.6% 17.5%; --secondary-foreground: 210 40% 98%; --muted: 217.2 32.6% 17.5%; --muted-foreground: 215 20.2% 65.1%; --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; --destructive: 0 62.8% 30.6%; --destructive-foreground: 210 40% 98%; --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 224.3 76.3% 94.1%; } * { border-color: hsl(var(--border)); } body { background: linear-gradient(135deg, hsl(var(--primary)) 0%, hsl(var(--primary) / 0.8) 100%); color: hsl(var(--foreground)); font-family: 'Inter', system-ui, sans-serif; min-height: 100vh; } /* Essential animations only */ @keyframes float { 0%, 100% { transform: translateY(0px) translateX(0px); opacity: 0.3; } 50% { transform: translateY(-10px) translateX(5px); opacity: 0.7; } } @keyframes shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } .particle { position: absolute; width: 2px; height: 2px; background: hsl(var(--primary-foreground) / 0.4); border-radius: 50%; opacity: 0.3; animation: float 8s ease-in-out infinite; } .shimmer::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent); animation: shimmer 3s infinite; } /* Smooth scrolling for anchors */ html { scroll-behavior: smooth; } </style> </head> <body class="bg-gradient-to-br from-primary to-primary/80 text-foreground font-sans min-h-screen"> <!-- Hero Section --> <section class="relative py-20 px-6 overflow-hidden"> <div class="max-w-6xl mx-auto"> <div class="flex items-center justify-between"> <div> <h1 class="text-4xl md:text-5xl font-bold mb-4 text-white"> Calendar Controller <span class="block text-xl md:text-2xl font-normal opacity-90 mt-2"> Interactive Documentation & Live Demos </span> </h1> <p class="text-lg md:text-xl opacity-90 mb-6 max-w-2xl text-white"> Explore the complete API surface of our powerful Calendar Controller through interactive examples. Built with TypeScript, featuring comprehensive accessibility support and internationalization. </p> <div class="flex flex-wrap gap-4"> <div class="bg-white/20 backdrop-blur-sm rounded-lg px-4 py-2"> <span class="text-sm font-medium text-white">✨ 40+ Methods</span> </div> <div class="bg-white/20 backdrop-blur-sm rounded-lg px-4 py-2"> <span class="text-sm font-medium text-white">🌍 i18n Support</span> </div> <div class="bg-white/20 backdrop-blur-sm rounded-lg px-4 py-2"> <span class="text-sm font-medium text-white">β™Ώ Accessibility</span> </div> </div> </div> <div class="hidden lg:block"> <div class="bg-white/10 backdrop-blur-sm rounded-xl p-6 text-center border border-white/20"> <div class="text-3xl font-bold text-white mb-2" id="methodCount">41</div> <div class="text-sm text-white/80">Available Methods</div> </div> </div> </div> </div> </section> <div class="max-w-7xl mx-auto p-6"> <div class="grid grid-cols-1 lg:grid-cols-4 gap-6"> <!-- Sidebar Navigation --> <aside class="lg:col-span-1"> <div class="bg-card/80 backdrop-blur-sm rounded-xl p-6 border border-border/50 sticky top-6"> <nav class="mb-8"> <h3 class="text-lg font-semibold mb-4 text-foreground">Quick Navigation</h3> <ul class="space-y-2"> <li><a href="#calendar-display" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">πŸ—“οΈ Live Calendar</a></li> <li><a href="#basic-selection" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">πŸ‘† Date Selection</a></li> <li><a href="#range-selection" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">πŸ“… Range Selection</a></li> <li><a href="#navigation" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">🧭 Navigation</a></li> <li><a href="#constraints" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">🚫 Date Constraints</a></li> <li><a href="#internationalization" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">🌍 Internationalization</a></li> <li><a href="#accessibility" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">β™Ώ Accessibility</a></li> <li><a href="#advanced" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">⚑ Advanced Features</a></li> <li><a href="#events" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">πŸ“‘ Events & Bindings</a></li> <li><a href="#api-reference" class="flex items-center text-sm text-muted-foreground hover:text-foreground transition-colors py-2 px-3 rounded-lg hover:bg-accent">πŸ“š API Reference</a></li> </ul> </nav> <div class="bg-gradient-to-br from-primary/10 to-primary/20 rounded-lg p-4 border border-primary/20"> <div class="text-2xl font-bold text-primary mb-1" id="methodCountSidebar">41</div> <div class="text-sm text-muted-foreground">Methods Available</div> <div class="text-xs text-muted-foreground mt-2 opacity-80"> All methods tested βœ“ </div> </div> </div> </aside> <!-- Main Content --> <main class="lg:col-span-3 space-y-8"> <!-- Advanced Floating Calendar Widget --> <section id="calendar-display" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-calendar-alt text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Advanced Floating Calendar</h2> <p class="text-muted-foreground">Experience a completely redesigned floating calendar with enhanced features, modern UI, and advanced interactions.</p> </div> </div> <!-- Floating Calendar Widget Placeholder (moved to body) --> <div class="widget-placeholder"> <div class="bg-blue-50 border-2 border-dashed border-blue-200 rounded-lg p-6 text-center"> <i class="fas fa-arrow-up text-blue-400 text-2xl mb-3"></i> <h3 class="text-lg font-semibold text-blue-700 mb-2">Smart Floating Calendar Active</h3> <p class="text-blue-600">The interactive floating calendar widget is now positioned at the top-right corner of your screen.</p> <p class="text-sm text-blue-500 mt-2">Scroll to see it stay visible β€’ Drag to reposition β€’ Click minimize to collapse</p> </div> </div> <!-- Feature Description and Demo Controls --> <div class="space-y-6"> <h3 class="text-lg font-semibold text-foreground"> Enhanced Floating Calendar Features </h3> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.advancedCalendar.showAnimationDemo()"> <i class="fas fa-magic"></i> Animation Demo </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.advancedCalendar.toggleTheme()"> <i class="fas fa-palette"></i> Toggle Theme </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition-colors" onclick="window.advancedCalendar.enableRangeMode()"> <i class="fas fa-calendar-alt"></i> Range Selection </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors" onclick="window.advancedCalendar.stressTest()"> <i class="fas fa-bolt"></i> Performance Test </button> </div> <div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900 border-2 border-blue-200 dark:border-blue-800 rounded-xl p-6 relative"> <div class="absolute top-4 left-4 text-xl">πŸ’‘</div> <div class="ml-8 space-y-3"> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Widget Status:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="widgetStatus">Active & Interactive</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Selected Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="widgetSelectedDate">None</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Current Theme:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="widgetTheme">Default</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Interaction Mode:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="widgetMode">Single Selection</span> </div> </div> </div> </div> </div> <div class="relative bg-gradient-to-br from-slate-800 to-slate-900 text-slate-200 p-6 rounded-xl font-mono text-sm my-6 overflow-x-auto border border-slate-700 leading-relaxed" data-lang="javascript"> <div class="absolute top-3 right-4 text-slate-500 text-xs uppercase font-semibold bg-slate-700/50 px-2 py-1 rounded border border-slate-600/50">JavaScript</div> <pre class="m-0 whitespace-pre-wrap break-words">// Initialize the Advanced Floating Calendar const advancedCalendar = new AdvancedFloatingCalendar({ container: '#floating-calendar-widget', initialDate: new Date(), features: { draggable: true, minimizable: true, quickActions: true, animations: true, themes: ['default', 'dark', 'gradient'], rangeSelection: true }, position: { top: 20, right: 20 }, responsive: true }); // Enhanced event handling advancedCalendar.on('dateSelect', (date) => { console.log('Date selected:', date); updateStatus(`Selected: ${date.toLocaleDateString()}`); }); advancedCalendar.on('minimize', () => { console.log('Calendar minimized'); }); advancedCalendar.on('dragEnd', (position) => { console.log('New position:', position); localStorage.setItem('calendarPosition', JSON.stringify(position)); });</pre></div> </section> <!-- Date Selection --> <section id="basic-selection" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-hand-pointer text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Intelligent Date Selection</h2> <p class="text-muted-foreground">Single and multi-date selection with validation, formatting, and smart date handling.</p> </div> </div> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.selectToday()"> <i class="fas fa-calendar-day"></i> Select Today </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.selectSpecificDate()"> <i class="fas fa-calendar-plus"></i> Select Future Date </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors" onclick="window.calendarDemo.clearSelection()"> <i class="fas fa-times"></i> Clear Selection </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition-colors" onclick="window.calendarDemo.selectRandomDate()"> <i class="fas fa-random"></i> Random Date </button> </div> <div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900 border-2 border-blue-200 dark:border-blue-800 rounded-xl p-6 relative"> <div class="absolute top-4 left-4 text-xl">πŸ’‘</div> <div class="ml-8 space-y-3"> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Selected Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="selectedDateDisplay">None</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Formatted:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="formattedDateDisplay">--</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Is Today:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="isTodayDisplay">false</span> </div> </div> </div> </div> <div class="relative bg-gradient-to-br from-slate-800 to-slate-900 text-slate-200 p-6 rounded-xl font-mono text-sm my-6 overflow-x-auto border border-slate-700 leading-relaxed" data-lang="javascript"> <div class="absolute top-3 right-4 text-slate-500 text-xs uppercase font-semibold bg-slate-700/50 px-2 py-1 rounded border border-slate-600/50">JavaScript</div> <pre class="m-0 whitespace-pre-wrap break-words">// Select specific dates calendar.methods.selectDate(2025, 4, 15); // May 15, 2025 // Select today programmatically const today = new Date(); calendar.methods.selectDate( today.getFullYear(), today.getMonth(), today.getDate() ); // Clear all selections calendar.methods.clearSelection(); // Check if date is today const isToday = calendar.methods.isToday(selectedDate); // Get formatted date string const formatted = calendar.methods.formatDate(selectedDate);</pre></div> </section> <!-- Range Selection --> <section id="range-selection" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-calendar-week text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Advanced Range Selection</h2> <p class="text-muted-foreground">Select date ranges with visual feedback, smart range validation, and flexible range handling.</p> </div> </div> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.enableRangeSelection()"> <i class="fas fa-calendar-alt"></i> Enable Range Mode </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.selectThisWeek()"> <i class="fas fa-calendar-week"></i> Select This Week </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.selectNextMonth()"> <i class="fas fa-calendar"></i> Select Next Month </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors" onclick="window.calendarDemo.disableRangeSelection()"> <i class="fas fa-calendar-day"></i> Single Date Mode </button> </div> <div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900 border-2 border-blue-200 dark:border-blue-800 rounded-xl p-6 relative"> <div class="absolute top-4 left-4 text-xl">πŸ’‘</div> <div class="ml-8 space-y-3"> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Mode:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="selectionModeDisplay">Single</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Range Start:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="rangeStartDisplay">--</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Range End:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="rangeEndDisplay">--</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Days Selected:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="rangeDaysDisplay">0</span> </div> </div> </div> </div> <div class="relative bg-gradient-to-br from-slate-800 to-slate-900 text-slate-200 p-6 rounded-xl font-mono text-sm my-6 overflow-x-auto border border-slate-700 leading-relaxed" data-lang="javascript"> <div class="absolute top-3 right-4 text-slate-500 text-xs uppercase font-semibold bg-slate-700/50 px-2 py-1 rounded border border-slate-600/50">JavaScript</div> <pre class="m-0 whitespace-pre-wrap break-words">// Enable range selection mode calendar.methods.setRangeSelection(true); // Select a date range programmatically calendar.methods.selectDateRange( new Date(2025, 4, 1), // Start: May 1, 2025 new Date(2025, 4, 15) // End: May 15, 2025 ); // Get current range selection const range = calendar.bindings.selectedRange.current; console.log('Start:', range.start); console.log('End:', range.end); // Calculate days in range const dayCount = Math.ceil( (range.end - range.start) / (1000 * 60 * 60 * 24) ) + 1;</pre></div> </section> <!-- Navigation Controls --> <section id="navigation" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-compass text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Powerful Navigation</h2> <p class="text-muted-foreground">Navigate through dates, months, and years with keyboard support and programmatic control.</p> </div> </div> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.goToNextYear()"> <i class="fas fa-fast-forward"></i> Next Year </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.goToPreviousYear()"> <i class="fas fa-fast-backward"></i> Previous Year </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition-colors" onclick="window.calendarDemo.goToSpecificDate()"> <i class="fas fa-calendar-check"></i> Go to Date </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors" onclick="window.calendarDemo.jumpToFuture()"> <i class="fas fa-rocket"></i> Jump to 2030 </button> </div> <div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-6"> <button class="inline-flex items-center gap-2 px-3 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors text-sm" onclick="window.calendarDemo.testKeyboardNav('ArrowUp')"> <i class="fas fa-arrow-up"></i> Week Up </button> <button class="inline-flex items-center gap-2 px-3 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors text-sm" onclick="window.calendarDemo.testKeyboardNav('ArrowDown')"> <i class="fas fa-arrow-down"></i> Week Down </button> <button class="inline-flex items-center gap-2 px-3 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors text-sm" onclick="window.calendarDemo.testKeyboardNav('ArrowLeft')"> <i class="fas fa-arrow-left"></i> Day Left </button> <button class="inline-flex items-center gap-2 px-3 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors text-sm" onclick="window.calendarDemo.testKeyboardNav('ArrowRight')"> <i class="fas fa-arrow-right"></i> Day Right </button> </div> <div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900 border-2 border-blue-200 dark:border-blue-800 rounded-xl p-6 relative"> <div class="absolute top-4 left-4 text-xl">πŸ’‘</div> <div class="ml-8 space-y-3"> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Current Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="currentDateDisplay">Loading...</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Focused Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="focusedDateDisplay">--</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Current View:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="currentViewDisplay">Month View</span> </div> </div> </div> </div> <div class="relative bg-gradient-to-br from-slate-800 to-slate-900 text-slate-200 p-6 rounded-xl font-mono text-sm my-6 overflow-x-auto border border-slate-700 leading-relaxed" data-lang="javascript"> <div class="absolute top-3 right-4 text-slate-500 text-xs uppercase font-semibold bg-slate-700/50 px-2 py-1 rounded border border-slate-600/50">JavaScript</div> <pre class="m-0 whitespace-pre-wrap break-words">// Navigate to specific dates calendar.methods.goToDate(new Date(2025, 11, 25)); // Christmas 2025 calendar.methods.goToMonth(6, 2025); // July 2025 calendar.methods.goToYear(2030); // Keyboard navigation simulation calendar.methods.moveFocusRight(); // Move focus one day right calendar.methods.moveFocusLeft(); // Move focus one day left calendar.methods.moveFocusUp(); // Move focus one week up calendar.methods.moveFocusDown(); // Move focus one week down // Focus management calendar.methods.focusDate(new Date()); calendar.methods.selectFocusedDate();</pre></div> </section> <!-- Date Constraints --> <section id="constraints" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-shield-alt text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Smart Date Constraints</h2> <p class="text-muted-foreground">Set minimum/maximum dates, disable specific dates, and implement business rules with ease.</p> </div> </div> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.setMinMaxDates()"> <i class="fas fa-calendar-times"></i> Set Date Range </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-amber-600 text-white rounded-lg hover:bg-amber-700 transition-colors" onclick="window.calendarDemo.disableWeekends()"> <i class="fas fa-ban"></i> Disable Weekends </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors" onclick="window.calendarDemo.disableHolidays()"> <i class="fas fa-gift"></i> Disable Holidays </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors" onclick="window.calendarDemo.clearConstraints()"> <i class="fas fa-unlock"></i> Clear All </button> </div> <div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900 border-2 border-blue-200 dark:border-blue-800 rounded-xl p-6 relative"> <div class="absolute top-4 left-4 text-xl">πŸ’‘</div> <div class="ml-8 space-y-3"> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Min Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="minDateDisplay">None</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Max Date:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="maxDateDisplay">None</span> </div> <div class="flex items-center"> <span class="font-semibold text-blue-800 dark:text-blue-200 mr-3 inline-block min-w-[120px]">Disabled Dates:</span> <span class="text-blue-600 dark:text-blue-300 font-mono text-sm bg-blue-100 dark:bg-blue-800 px-2 py-1 rounded" id="disabledDatesDisplay">0</span> </div> </div> </div> </div> <div class="relative bg-gradient-to-br from-slate-800 to-slate-900 text-slate-200 p-6 rounded-xl font-mono text-sm my-6 overflow-x-auto border border-slate-700 leading-relaxed" data-lang="javascript"> <div class="absolute top-3 right-4 text-slate-500 text-xs uppercase font-semibold bg-slate-700/50 px-2 py-1 rounded border border-slate-600/50">JavaScript</div> <pre class="m-0 whitespace-pre-wrap break-words">// Set minimum and maximum selectable dates calendar.methods.setMinDate(new Date(2025, 0, 1)); // Jan 1, 2025 calendar.methods.setMaxDate(new Date(2025, 11, 31)); // Dec 31, 2025 // Disable specific dates const holidays = [ new Date(2025, 0, 1), // New Year new Date(2025, 6, 4), // Independence Day new Date(2025, 11, 25) // Christmas ]; holidays.forEach(date => { calendar.methods.addDisabledDate(date); }); // Disable weekends for (let i = 0; i < 365; i++) { const date = new Date(2025, 0, 1 + i); if (date.getDay() === 0 || date.getDay() === 6) { calendar.methods.addDisabledDate(date); } }</pre></div> </section> <!-- Internationalization --> <section id="internationalization" class="bg-card backdrop-blur-sm rounded-xl p-6 border border-border/50 shadow-lg"> <div class="flex items-start gap-4 mb-6"> <div class="bg-primary/10 p-3 rounded-lg"> <i class="fas fa-globe-americas text-primary text-xl"></i> </div> <div> <h2 class="text-2xl font-bold text-foreground mb-2">Global Internationalization</h2> <p class="text-muted-foreground">Built-in support for 50+ locales with automatic formatting, RTL languages, and cultural date preferences.</p> </div> </div> <div class="space-y-4"> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('en-US')"> <i class="fas fa-flag-usa"></i> English (US) </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('es-ES')"> <i class="fas fa-flag"></i> EspaΓ±ol </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('fr-FR')"> <i class="fas fa-flag"></i> FranΓ§ais </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('de-DE')"> <i class="fas fa-flag"></i> Deutsch </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('ja-JP')"> <i class="fas fa-flag"></i> ζ—₯本θͺž </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-lg hover:bg-primary/90 transition-colors" onclick="window.calendarDemo.changeLocale('ar-SA')"> <i class="fas fa-flag"></i> Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ© </button> </div> <div class="flex flex-wrap gap-3"> <button class="inline-flex items-center gap-2 px-4 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors" onclick="window.calendarDemo.changeFirstDayOfWeek(0)"> <i class="fas fa-calendar-week"></i> Sunday First </button> <button class="inline-flex items-center gap-2 px-4 py-2 bg-secondary text-secondary-foreground rounded-lg hover:bg-secondary/90 transition-colors"