flitrx's picture
a digital planner like see in this etsy product link: https://www.etsy.com/listing/1620103130/2026-adhd-digital-planner-dark-rainbow?ls=s&ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=adhd+planner&ref=sr_gallery-1-24&pro=1&sts=1&dd=1&content_source=0f05dc65-7d4d-428f-ab05-6c2bf00b746b%253ALT7454849267120d04b9228c185d89b46b5cb82367&organic_search_click=1&logging_key=0f05dc65-7d4d-428f-ab05-6c2bf00b746b%3ALT7454849267120d04b9228c185d89b46b5cb82367 . analyze the link, study the product and make it for iphone, android and desktop pc.
3267ca9 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calendar | RainbowFocus Digital Planner</title>
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&family=Patrick+Hand&display=swap');
body {
font-family: 'Inter', sans-serif;
}
.handwriting {
font-family: 'Patrick Hand', cursive;
}
.fc-event {
border-radius: 6px;
font-size: 0.875rem;
padding: 2px 4px;
border: none;
}
.fc-daygrid-event {
margin-top: 2px;
margin-bottom: 2px;
}
@media (max-width: 640px) {
.fc-header-toolbar {
flex-direction: column;
align-items: flex-start;
gap: 0.5rem;
}
.fc-toolbar-chunk {
width: 100%;
margin-bottom: 0.5rem;
}
}
</style>
<link href='https://cdn.jsdelivr.net/npm/fullcalendar@5.11.3/main.min.css' rel='stylesheet' />
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.11.3/main.min.js'></script>
</head>
<body class="min-h-screen bg-gradient-to-br from-gray-50 to-gray-100">
<!-- Navbar -->
<nav class="bg-white shadow-sm sticky top-0 z-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center">
<div class="flex-shrink-0 flex items-center">
<i data-feather="calendar" class="text-purple-600"></i>
<span class="ml-2 text-xl font-bold text-gray-800 hand-writing">RainbowFocus</span>
</div>
</div>
<div class="hidden md:ml-6 md:flex md:items-center md:space-x-4">
<a href="index.html" class="px-3 py-2 rounded-md text-sm font-medium text-gray-500 hover:text-gray-700">Dashboard</a>
<a href="calendar.html" class="px-3 py-2 rounded-md text-sm font-medium text-purple-700 bg-purple-100">Calendar</a>
<a href="tasks.html" class="px-3 py-2 rounded-md text-sm font-medium text-gray-500 hover:text-gray-700">Tasks</a>
<a href="notes.html" class="px-3 py-2 rounded-md text-sm font-medium text-gray-500 hover:text-gray-700">Notes</a>
</div>
<div class="flex items-center">
<button class="md:hidden inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none">
<i data-feather="menu"></i>
</button>
</div>
</div>
</div>
</nav>
<main class="max-w-7xl mx-auto py-8 px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-xl shadow-sm p-6">
<div id="calendar" class="mt-4"></div>
</div>
</main>
<!-- Add Event Modal -->
<div id="eventModal" class="fixed inset-0 z-50 hidden overflow-y-auto">
<div class="flex items-center justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
<div class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div class="sm:flex sm:items-start">
<div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-purple-100 sm:mx-0 sm:h-10 sm:w-10">
<i data-feather="calendar" class="text-purple-600"></i>
</div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left w-full">
<h3 class="text-lg leading-6 font-medium text-gray-900" id="modalTitle">Add New Event</h3>
<div class="mt-2">
<form id="eventForm">
<div class="mb-4">
<label for="eventTitle" class="block text-sm font-medium text-gray-700">Event Title</label>
<input type="text" id="eventTitle" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500">
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4 mb-4">
<div>
<label for="startDate" class="block text-sm font-medium text-gray-700">Start</label>
<input type="datetime-local" id="startDate" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500">
</div>
<div>
<label for="endDate" class="block text-sm font-medium text-gray-700">End</label>
<input type="datetime-local" id="endDate" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500">
</div>
</div>
<div class="mb-4">
<label for="eventColor" class="block text-sm font-medium text-gray-700">Color</label>
<select id="eventColor" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500">
<option value="#7c3aed" class="text-purple-600">Purple</option>
<option value="#3b82f6" class="text-blue-600">Blue</option>
<option value="#10b981" class="text-green-600">Green</option>
<option value="#f59e0b" class="text-yellow-600">Yellow</option>
<option value="#f43f5e" class="text-red-600">Red</option>
</select>
</div>
<div class="mb-4">
<label for="eventDescription" class="block text-sm font-medium text-gray-700">Description</label>
<textarea id="eventDescription" rows="3" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500"></textarea>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button type="button" id="saveEvent" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-purple-600 text-base font-medium text-white hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 sm:ml-3 sm:w-auto sm:text-sm">Save</button>
<button type="button" id="cancelEvent" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">Cancel</button>
<button type="button" id="deleteEvent" class="hidden mt-3 w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">Delete</button>
</div>
</div>
</div>
</div>
<!-- Mobile Bottom Navigation -->
<div class="md:hidden fixed bottom-0 left-0 right-0 bg-white shadow-lg border-t border-gray-200">
<div class="flex justify-around items-center h-16">
<a href="index.html" class="flex flex-col items-center justify-center text-gray-500">
<i data-feather="home" class="w-5 h-5"></i>
<span class="text-xs mt-1">Home</span>
</a>
<a href="calendar.html" class="flex flex-col items-center justify-center text-purple-600">
<i data-feather="calendar" class="w-5 h-5"></i>
<span class="text-xs mt-1">Calendar</span>
</a>
<a href="tasks.html" class="flex flex-col items-center justify-center text-gray-500">
<i data-feather="check-circle" class="w-5 h-5"></i>
<span class="text-xs mt-1">Tasks</span>
</a>
<a href="notes.html" class="flex flex-col items-center justify-center text-gray-500">
<i data-feather="book" class="w-5 h-5"></i>
<span class="text-xs mt-1">Notes</span>
</a>
</div>
</div>
<script>
feather.replace();
// Initialize FullCalendar
document.addEventListener('DOMContentLoaded', function() {
const calendarEl = document.getElementById('calendar');
const calendar = new FullCalendar.Calendar(calendarEl, {
initialView: 'dayGridMonth',
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
themeSystem: 'standard',
height: 'auto',
nowIndicator: true,
editable: true,
selectable: true,
selectMirror: true,
dayMaxEvents: true,
eventDisplay: 'block',
eventColor: '#7c3aed',
events: [
{
title: 'Team Meeting',
start: '2023-10-20T10:00:00',
end: '2023-10-20T11:30:00',
color: '#3b82f6'
},
{
title: 'Lunch with Sarah',
start: '2023-10-20T12:00:00',
end: '2023-10-20T13:00:00',
color: '#10b981'
},
{
title: 'Project Deadline',
start: '2023-10-20T17:00:00',
color: '#f43f5e'
},
{
title: 'Grocery Shopping',
start: '2023-10-21T18:00:00',
end: '2023-10-21T19:00:00',
color: '#f59e0b'
},
{
title: 'Doctor Appointment',
start: '2023-10-23T14:00:00',
end: '2023-10-23T15:00:00',
color: '#7c3aed'
},
{
title: 'Weekly Review',
start: '2023-10-24T09:00:00',
end: '2023-10-24T10:30:00',
color: '#8b5cf6'
}
],
dateClick: function(info) {
// Open modal to add new event
document.getElementById('modalTitle').textContent = 'Add New Event';
document.getElementById('eventForm').reset();
document.getElementById('startDate').value = info.dateStr + 'T12:00:00';
document.getElementById('endDate').value = info.dateStr + 'T13:00:00';
document.getElementById('deleteEvent').classList.add('hidden');
// Show modal
document.getElementById('eventModal').classList.remove('hidden');
},
eventClick: function(info) {
// Open modal to edit event
document.getElementById('modalTitle').textContent = 'Edit Event';
document.getElementById('eventTitle').value = info.event.title;
document.getElementById('startDate').value = info.event.start.toISOString().slice(0, 16);
document.getElementById('endDate').value = info.event.end ? info.event.end.toISOString().slice(0, 16) : info.event.start.toISOString().slice(0, 16);
document.getElementById('eventDescription').value = info.event.extendedProps.description || '';
// Set color based on event color
const colorSelect = document.getElementById('eventColor');
for (let i = 0; i < colorSelect.options.length; i++) {
if (colorSelect.options[i].value === info.event.backgroundColor) {
colorSelect.selectedIndex = i;
break;
}
}
document.getElementById('deleteEvent').classList.remove('hidden');
// Show modal
document.getElementById('eventModal').classList.remove('hidden');
// Store event to edit
currentEvent = info.event;
}
});
calendar.render();
// Modal functionality
let currentEvent = null;
document.getElementById('saveEvent').addEventListener('click', function() {
const title = document.getElementById('eventTitle').value;
const start = document.getElementById('startDate').value;
const end = document.getElementById('endDate').value;
const color = document.getElementById('eventColor').value;
const description = document.getElementById('eventDescription').value;
if (currentEvent) {
// Update existing event
currentEvent.setProp('title', title);
currentEvent.setDates(start, end || start);
currentEvent.setProp('backgroundColor', color);
currentEvent.setExtendedProp('description', description);
} else {
// Add new event
calendar.addEvent({
title: title,
start: start,
end: end || start,
backgroundColor: color,
description: description
});
}
// Hide modal
document.getElementById('eventModal').classList.add('hidden');
currentEvent = null;
});
document.getElementById('cancelEvent').addEventListener('click', function() {
document.getElementById('eventModal').classList.add('hidden');
currentEvent = null;
});
document.getElementById('deleteEvent').addEventListener('click', function() {
if (currentEvent) {
currentEvent.remove();
document.getElementById('eventModal').classList.add('hidden');
currentEvent = null;
}
});
});
// Mobile menu toggle functionality
document.querySelector('[data-feather="menu"]').addEventListener('click', function() {
const mobileMenu = document.getElementById('mobile-menu');
mobileMenu.classList.toggle('hidden');
});
</script>
</body>
</html>