diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..39ddf1e --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,376 @@ + +/* --- Base & Typography --- */ +:root { + --font-family: 'Nunito', sans-serif; + --panel-bg: rgba(255, 255, 255, 0.7); + --text-color: #333; + --primary-color: #86A8E7; + --accent-color: #7FDEB5; + --border-radius-lg: 12px; + --border-radius-sm: 8px; + --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +body { + font-family: var(--font-family); + margin: 0; + padding: 2rem; + box-sizing: border-box; + background: #a7d8f0; /* Fallback color */ + color: var(--text-color); + transition: background 0.5s ease; +} + +h1, h2 { + font-weight: 700; + margin-top: 0; +} + +h1 { + font-size: 2rem; +} + +h2 { + font-size: 1.5rem; + margin-bottom: 1rem; + border-bottom: 1px solid rgba(0,0,0,0.1); + padding-bottom: 0.5rem; +} + +/* --- Layout --- */ +.app-container { + display: flex; + gap: 2rem; + height: calc(100vh - 4rem); +} + +.panel { + padding: 2rem; + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow); + background-color: var(--panel-bg); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + transition: background-color 0.5s ease; + z-index: 10; +} + +.task-panel { + flex: 1; + display: flex; + flex-direction: column; +} + +.garden-panel { + flex: 2; + display: flex; + flex-direction: column; +} + +header { + margin-bottom: 1.5rem; +} + +/* --- Task Manager --- */ +#task-form { + display: flex; + margin-bottom: 1.5rem; +} + +#task-input { + flex-grow: 1; + padding: 0.75rem; + border: 1px solid #ccc; + border-radius: var(--border-radius-sm); + font-size: 1rem; +} + +#task-form button { + padding: 0.75rem 1.5rem; + border: none; + background-color: var(--primary-color); + color: white; + border-radius: var(--border-radius-sm); + cursor: pointer; + margin-left: 0.5rem; + transition: background-color 0.3s; +} + +#task-form button:hover { + background-color: #6c94d8; +} + +#task-list { + list-style: none; + padding: 0; + margin: 0; + overflow-y: auto; + flex-grow: 1; +} + +#task-list li { + display: flex; + align-items: center; + padding: 0.75rem; + margin-bottom: 0.5rem; + background: rgba(255, 255, 255, 0.5); + border-radius: var(--border-radius-sm); + transition: all 0.3s; +} + +#task-list li.completed { + text-decoration: line-through; + opacity: 0.6; +} + +#task-list li input[type="checkbox"] { + margin-right: 0.75rem; + width: 18px; + height: 18px; +} + +#task-list li .delete-btn { + margin-left: auto; + background: none; + border: none; + color: #ff6b6b; + cursor: pointer; + font-size: 1.2rem; + opacity: 0.5; + transition: opacity 0.3s; +} + +#task-list li:hover .delete-btn { + opacity: 1; +} + + +/* --- Garden --- */ +.garden-panel header { + display: flex; + justify-content: space-between; + align-items: center; +} + +#garden { + flex-grow: 1; + position: relative; + border-radius: var(--border-radius-sm); + overflow: hidden; + background: transparent; +} + +/* --- Background Scene --- */ +.sky { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 60%; + background: linear-gradient(to bottom, #a7d8f0, #cce7f5); + z-index: 1; +} + +.cloud { + position: absolute; + background: white; + border-radius: 50px; + opacity: 0.9; +} +.cloud-1 { + top: 15%; + left: 10%; + width: 120px; + height: 40px; +} +.cloud-2 { + top: 25%; + right: 15%; + width: 150px; + height: 50px; +} +.cloud::before, .cloud::after { + content: ''; + position: absolute; + background: white; + border-radius: 50%; +} +.cloud-1::before { top: -20px; left: 20px; width: 50px; height: 50px; } +.cloud-1::after { top: -10px; right: 30px; width: 40px; height: 40px; } +.cloud-2::before { top: -30px; left: 30px; width: 70px; height: 70px; } +.cloud-2::after { top: -20px; right: 20px; width: 60px; height: 60px; } + + +.hills { + position: absolute; + bottom: 10%; + left: 0; + width: 100%; + height: 40%; + z-index: 2; +} +.hill { + position: absolute; + bottom: 0; + border-radius: 50% 50% 0 0; +} +.hill-1 { + left: -20%; + width: 80%; + height: 80%; + background: #c5dcb7; +} +.hill-2 { + right: -15%; + width: 70%; + height: 60%; + background: #b3d0a7; +} + +.ground { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 15%; + background: #9fcc93; + z-index: 3; +} + + +.garden-controls { + margin-top: 1rem; + text-align: center; +} + +.garden-controls button, .theme-btn { + padding: 0.5rem 1rem; + border-radius: var(--border-radius-sm); + border: 1px solid var(--primary-color); + background-color: transparent; + color: var(--primary-color); + cursor: pointer; + margin: 0 0.25rem; + transition: all 0.3s; +} + +.garden-controls button:hover, .theme-btn:hover, .theme-btn.active { + background-color: var(--primary-color); + color: white; +} + +/* --- New Flower Styles --- */ +.garden-element { + position: absolute; + bottom: 5%; + transform-origin: bottom center; + z-index: 4; + transition: transform 0.5s ease-out; +} + +.garden-element.grow { + animation: grow-animation 1.5s cubic-bezier(0.68, -0.55, 0.27, 1.55); +} + +.garden-element.shrink { + transform: scale(0); +} + +@keyframes grow-animation { + from { transform: scale(0); } + to { transform: scale(1); } +} + +.flower-daisy { + width: 80px; + height: 120px; + position: relative; +} + +.flower-daisy .stem { + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 6px; + height: 80px; + background: #4a7c4a; + border-radius: 3px; +} + +.flower-daisy .leaf { + position: absolute; + bottom: 20px; + width: 30px; + height: 25px; + background: #6a9a6a; + border-radius: 50% 0; +} + +.flower-daisy .leaf.left { + left: 0; + transform: rotate(20deg); +} + +.flower-daisy .leaf.right { + right: 0; + transform: rotate(-20deg) scaleX(-1); +} + +.flower-head { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 60px; +} + +.flower-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 20px; + height: 20px; + background: #ffdd57; + border-radius: 50%; + z-index: 2; +} + +.petal { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; +} + +.petal div { + position: absolute; + top: 50%; + left: 50%; + margin-top: -10px; + margin-left: -5px; + width: 10px; + height: 20px; + border-radius: 5px; + transform-origin: 50% 100%; +} + +/* Petal Colors */ +.petal-pink div { background-color: #ffaccb; } +.petal-yellow div { background-color: #fff38a; } +.petal-purple div { background-color: #d9abff; } +.petal-white div { background-color: #ffffff; } + + +.petal .p1 { transform: rotate(0deg) translateY(-15px); } +.petal .p2 { transform: rotate(45deg) translateY(-15px); } +.petal .p3 { transform: rotate(90deg) translateY(-15px); } +.petal .p4 { transform: rotate(135deg) translateY(-15px); } +.petal .p5 { transform: rotate(180deg) translateY(-15px); } +.petal .p6 { transform: rotate(225deg) translateY(-15px); } +.petal .p7 { transform: rotate(270deg) translateY(-15px); } +.petal .p8 { transform: rotate(315deg) translateY(-15px); } diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..2613a2a --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,199 @@ +document.addEventListener('DOMContentLoaded', () => { + // DOM Elements + const taskForm = document.getElementById('task-form'); + const taskInput = document.getElementById('task-input'); + const taskList = document.getElementById('task-list'); + const garden = document.getElementById('garden'); + const soundToggle = document.getElementById('sound-toggle'); + const ambientSound = document.getElementById('ambient-sound'); + const shareBtn = document.getElementById('share-btn'); + + // App State + let tasks = JSON.parse(localStorage.getItem('tasks')) || []; + let gardenElements = JSON.parse(localStorage.getItem('gardenElements')) || []; + const flowerColors = ['pink', 'yellow', 'purple', 'white']; + + // --- Initialization --- + function init() { + tasks.forEach(renderTask); + gardenElements.forEach(renderGardenElement); + } + + // --- State Management --- + function saveState() { + localStorage.setItem('tasks', JSON.stringify(tasks)); + localStorage.setItem('gardenElements', JSON.stringify(gardenElements)); + } + + // --- Task Management --- + taskForm.addEventListener('submit', e => { + e.preventDefault(); + const title = taskInput.value.trim(); + if (title) { + const newTask = { id: Date.now(), title, completed: false }; + tasks.push(newTask); + renderTask(newTask); + saveState(); + taskInput.value = ''; + } + }); + + function renderTask(task) { + const li = document.createElement('li'); + li.dataset.id = task.id; + if (task.completed) { + li.classList.add('completed'); + } + li.innerHTML = ` + + ${escapeHTML(task.title)} + + `; + taskList.appendChild(li); + + li.querySelector('input[type="checkbox"]').addEventListener('change', (e) => { + toggleTaskCompletion(task.id, e.target.checked); + }); + li.querySelector('.delete-btn').addEventListener('click', () => { + deleteTask(task.id); + }); + } + + function toggleTaskCompletion(id, isCompleted) { + const taskIndex = tasks.findIndex(t => t.id === id); + if (taskIndex > -1) { + tasks[taskIndex].completed = isCompleted; + const taskElement = taskList.querySelector(`[data-id='${id}']`); + if (taskElement) { + taskElement.classList.toggle('completed', isCompleted); + } + + if (isCompleted) { + addGardenElement(id); + } else { + removeGardenElement(id); + } + saveState(); + } + } + + function deleteTask(id) { + tasks = tasks.filter(t => t.id !== id); + const taskElement = taskList.querySelector(`[data-id='${id}']`); + if (taskElement) { + taskElement.remove(); + } + removeGardenElement(id); + saveState(); + } + + // --- Garden Management --- + function addGardenElement(taskId) { + if (gardenElements.some(el => el.taskId === taskId)) return; + + const newElement = { + id: Date.now(), + taskId: taskId, + x: Math.random() * 80 + 10, // 10% to 90% to avoid edges + color: flowerColors[Math.floor(Math.random() * flowerColors.length)] + }; + gardenElements.push(newElement); + renderGardenElement(newElement); + saveState(); + } + + function renderGardenElement(element) { + const el = document.createElement('div'); + el.dataset.id = element.id; + el.classList.add('garden-element', 'grow'); + el.style.left = `${element.x}%`; + + el.innerHTML = ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `; + + // Find the ground element to append to + const ground = garden.querySelector('.ground'); + if (ground) { + ground.appendChild(el); + } else { + garden.appendChild(el); // Fallback + } + } + + function removeGardenElement(taskId) { + const elementToRemoveIdx = gardenElements.findIndex(el => el.taskId === taskId); + if (elementToRemoveIdx > -1) { + const elementToRemove = gardenElements[elementToRemoveIdx]; + const el = garden.querySelector(`[data-id='${elementToRemove.id}']`); + if (el) { + el.classList.remove('grow'); + el.classList.add('shrink'); + setTimeout(() => { + el.remove(); + }, 500); + } + gardenElements.splice(elementToRemoveIdx, 1); + saveState(); + } + } + + // --- Controls --- + soundToggle.addEventListener('click', () => { + if (ambientSound.paused) { + ambientSound.play().catch(e => console.error("Audio play failed: ", e)); + soundToggle.textContent = 'Pause Sound'; + } else { + ambientSound.pause(); + soundToggle.textContent = 'Play Sound'; + } + }); + + shareBtn.addEventListener('click', () => { + const gardenPanel = document.querySelector('.garden-panel'); + const controls = gardenPanel.querySelector('.garden-controls'); + + controls.style.visibility = 'hidden'; + + html2canvas(gardenPanel, { + useCORS: true, + backgroundColor: '#a7d8f0' // Match sky color + }).then(canvas => { + const link = document.createElement('a'); + link.download = 'my-mindful-garden.png'; + link.href = canvas.toDataURL(); + link.click(); + controls.style.visibility = 'visible'; + }).catch(err => { + console.error('Could not share garden:', err); + controls.style.visibility = 'visible'; + }); + }); + + // --- Utility --- + function escapeHTML(str) { + return str.replace(/[&<>"']/g, s => ({ + '&': '&', '<': '<', '>': '>', '"': '"', "'" : ''' + }[s])); + } + + // --- Run App --- + init(); +}); \ No newline at end of file diff --git a/assets/pasted-20250917-211717-027d3df4.png b/assets/pasted-20250917-211717-027d3df4.png new file mode 100644 index 0000000..d9dc948 Binary files /dev/null and b/assets/pasted-20250917-211717-027d3df4.png differ diff --git a/assets/pasted-20250917-212634-e7e164ad.png b/assets/pasted-20250917-212634-e7e164ad.png new file mode 100644 index 0000000..dd727b9 Binary files /dev/null and b/assets/pasted-20250917-212634-e7e164ad.png differ diff --git a/db/config.php b/db/config.php deleted file mode 100644 index 03e0e2f..0000000 --- a/db/config.php +++ /dev/null @@ -1,17 +0,0 @@ - PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - ]); - } - return $pdo; -} diff --git a/index.php b/index.php index e13ae95..a57cf84 100644 --- a/index.php +++ b/index.php @@ -1,131 +1,70 @@ - - + - - - New Style - - - - + + + Mindful Garden + + + + + + + + + + + + - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

Flatlogic AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

+ + +
+ +
+
+

Mindful Garden

+

Tasks

+
+
+ + +
+
    +
    + + +
    +
    +

    Your Garden

    +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + + +
    +
    -
    - + + + + - + \ No newline at end of file