diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..08380a2 --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,175 @@ + +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@600&family=Inter:wght@400;500&display=swap'); + +:root { + --primary-color: #0D9488; + --primary-gradient-start: #14B8A6; + --primary-gradient-end: #2DD4BF; + --accent-color: #F0F9FF; + --background-color: #FFFFFF; + --surface-color: #F8FAFC; + --text-color: #0F172A; + --subtle-text-color: #64748B; + --border-color: #E2E8F0; + --radius-md: 0.5rem; + --radius-full: 9999px; + --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); +} + +body { + font-family: 'Inter', sans-serif; + background-color: var(--background-color); + color: var(--text-color); + margin: 0; + padding: 2rem; +} + +h1, h2 { + font-family: 'Poppins', sans-serif; + font-weight: 600; + color: var(--primary-color); +} + +.container { + max-width: 800px; + margin: 0 auto; +} + +.header { + text-align: center; + margin-bottom: 3rem; + padding-bottom: 1rem; + border-bottom: 1px solid var(--border-color); +} + +.header h1 { + font-size: 2.5rem; + margin-bottom: 0.5rem; + background: linear-gradient(to right, var(--primary-gradient-start), var(--primary-color)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.entry-form { + background-color: var(--surface-color); + padding: 2rem; + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + margin-bottom: 3rem; +} + +.mood-selector { + display: flex; + justify-content: center; + gap: 1rem; + margin-bottom: 1.5rem; +} + +.mood-selector label { + cursor: pointer; + font-size: 2.5rem; + transition: transform 0.2s ease; +} + +.mood-selector input { + display: none; +} + +.mood-selector label:hover { + transform: scale(1.2); +} + +.mood-selector input:checked + label { + transform: scale(1.3); + filter: saturate(1.5); +} + +textarea { + width: 100%; + padding: 1rem; + border-radius: var(--radius-md); + border: 1px solid var(--border-color); + font-family: 'Inter', sans-serif; + font-size: 1rem; + resize: vertical; + min-height: 100px; +} + +.btn-submit { + display: block; + width: 100%; + padding: 1rem; + margin-top: 1rem; + border: none; + border-radius: var(--radius-md); + background: linear-gradient(to right, var(--primary-gradient-start), var(--primary-color)); + color: white; + font-size: 1.1rem; + font-weight: 500; + cursor: pointer; + transition: box-shadow 0.2s ease; +} + +.btn-submit:hover { + box-shadow: var(--shadow-md); +} + +.entries-list h2 { + text-align: center; + margin-bottom: 2rem; +} + +.entry-card { + background-color: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + padding: 1.5rem; + margin-bottom: 1rem; + display: flex; + gap: 1.5rem; + align-items: flex-start; +} + +.entry-card .mood { + font-size: 2rem; +} + +.entry-card .content { + flex-grow: 1; +} + +.entry-card .date { + font-size: 0.875rem; + color: var(--subtle-text-color); + margin-bottom: 0.5rem; +} + +.entry-card .notes { + font-size: 1rem; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* Toast Notification */ +.toast { + position: fixed; + top: 20px; + right: 20px; + background-color: var(--primary-color); + color: white; + padding: 1rem 1.5rem; + border-radius: var(--radius-md); + box-shadow: var(--shadow-md); + opacity: 0; + visibility: hidden; + transform: translateY(-20px); + transition: opacity 0.3s, transform 0.3s, visibility 0.3s; + z-index: 1000; +} + +.toast.show { + opacity: 1; + visibility: visible; + transform: translateY(0); +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..d5995f0 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,29 @@ + +document.addEventListener('DOMContentLoaded', () => { + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.has('saved') && urlParams.get('saved') === '1') { + showToast('Growth entry saved successfully!'); + // Clean up the URL + history.replaceState(null, '', window.location.pathname); + } +}); + +function showToast(message) { + const toast = document.createElement('div'); + toast.className = 'toast'; + toast.textContent = message; + document.body.appendChild(toast); + + // Animate in + setTimeout(() => { + toast.classList.add('show'); + }, 100); + + // Animate out and remove + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => { + document.body.removeChild(toast); + }, 300); + }, 3000); +} diff --git a/index.php b/index.php index 7205f3d..546baa6 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,128 @@ exec("CREATE TABLE IF NOT EXISTS growth_entries ( + id INT PRIMARY KEY AUTO_INCREMENT, + entry_date DATE NOT NULL, + mood VARCHAR(255) NOT NULL, + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )"); +} catch (PDOException $e) { + die("Database setup failed: " . $e->getMessage()); +} + +// --- FORM HANDLING --- +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $mood = $_POST['mood'] ?? ''; + $notes = $_POST['notes'] ?? ''; + $entry_date = date('Y-m-d'); + + if (!empty($mood)) { + try { + $stmt = $pdo->prepare("INSERT INTO growth_entries (entry_date, mood, notes) VALUES (?, ?, ?)"); + $stmt->execute([$entry_date, $mood, $notes]); + header('Location: index.php?saved=1'); + exit; + } catch (PDOException $e) { + // In a real app, log this error instead of dying + die("Failed to save entry: " . $e->getMessage()); + } + } +} + +// --- DATA FETCHING --- +$entries = []; +try { + $stmt = $pdo->query("SELECT * FROM growth_entries ORDER BY created_at DESC"); + $entries = $stmt->fetchAll(); +} catch (PDOException $e) { + // In a real app, you might want to display a friendly error to the user + error_log("Failed to fetch entries: " . $e->getMessage()); +} + +// --- METADATA --- +$projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'Track your daily growth and progress.'; +$projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? ''; + ?> - New Style - - + Daily Growth Tracker + - - + + + - - - - - - - - - - - - + + + + + + -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

-
-
- + +
+
+

Daily Growth Tracker

+

Your personal space to reflect and grow, one day at a time.

+
+ +
+
+

How was your day?

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

Past Entries

+ +

No entries yet. Add one above to get started!

+ + +
+
+
+
+

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