diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b28bd6a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Charushi06 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/css/auth.css b/css/auth.css new file mode 100644 index 0000000..ab2e863 --- /dev/null +++ b/css/auth.css @@ -0,0 +1,354 @@ +/* ============================================================ + AUTH PAGES — signin.html / signup.html + Split-screen premium layout + ============================================================ */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); + +.auth-page { + min-height: 100dvh; + display: grid; + grid-template-columns: 1fr 1fr; + background: var(--bg-base); + overflow: hidden; +} + +/* ── LEFT PANEL ── */ +.auth-left { + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 40px; + overflow: hidden; + background: var(--bg-depth); +} + +/* Animated mesh background */ +.auth-mesh { + position: absolute; + inset: 0; + pointer-events: none; + overflow: hidden; +} +.auth-mesh::before { + content: ''; + position: absolute; + width: 600px; height: 600px; + border-radius: 50%; + background: radial-gradient(circle, rgba(108,99,255,0.18) 0%, transparent 70%); + top: -150px; left: -150px; + animation: meshFloat1 8s ease-in-out infinite; +} +.auth-mesh::after { + content: ''; + position: absolute; + width: 500px; height: 500px; + border-radius: 50%; + background: radial-gradient(circle, rgba(56,189,248,0.10) 0%, transparent 70%); + bottom: -100px; right: -100px; + animation: meshFloat2 10s ease-in-out infinite; +} +.auth-orb { + position: absolute; + width: 300px; height: 300px; + border-radius: 50%; + background: radial-gradient(circle, rgba(108,99,255,0.12) 0%, transparent 70%); + top: 50%; left: 50%; + transform: translate(-50%,-50%); + animation: meshFloat3 12s ease-in-out infinite; +} + +/* Subtle grid */ +.auth-grid { + position: absolute; + inset: 0; + background-image: + linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px), + linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px); + background-size: 48px 48px; + mask-image: radial-gradient(ellipse at 50% 50%, black 20%, transparent 75%); +} + +@keyframes meshFloat1 { + 0%,100% { transform: translate(0,0) scale(1); } + 50% { transform: translate(40px,30px) scale(1.1); } +} +@keyframes meshFloat2 { + 0%,100% { transform: translate(0,0) scale(1); } + 50% { transform: translate(-30px,-20px) scale(1.08); } +} +@keyframes meshFloat3 { + 0%,100% { transform: translate(-50%,-50%) scale(1); } + 50% { transform: translate(-50%,-50%) scale(1.3); } +} + +.auth-left-top { + position: relative; + z-index: 1; +} +.auth-brand { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 64px; +} +.auth-brand-icon { + width: 36px; height: 36px; + background: var(--accent); + border-radius: var(--radius-md); + display: flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-accent); +} +.auth-brand-name { + font-size: var(--text-lg); + font-weight: 700; + letter-spacing: -0.03em; + color: var(--text-primary); +} + +.auth-hero-label { + font-size: var(--text-xs); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.12em; + color: var(--accent-light); + margin-bottom: 16px; +} +.auth-hero-title { + font-size: clamp(26px, 3vw, 38px); + font-weight: 700; + line-height: 1.15; + letter-spacing: -0.03em; + color: var(--text-primary); + margin-bottom: 16px; +} +.auth-hero-sub { + font-size: var(--text-md); + color: var(--text-tertiary); + line-height: 1.7; + max-width: 380px; +} + +/* Feature pills */ +.auth-features { + position: relative; + z-index: 1; + margin-top: 48px; + display: flex; + flex-direction: column; + gap: var(--space-3); +} +.auth-feature { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 12px 16px; + background: rgba(255,255,255,0.04); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-md); + animation: fadeInUp var(--dur-enter) var(--ease-out) both; +} +.auth-feature:nth-child(1) { animation-delay: 200ms; } +.auth-feature:nth-child(2) { animation-delay: 300ms; } +.auth-feature:nth-child(3) { animation-delay: 400ms; } +.auth-feature-icon { + width: 32px; height: 32px; + border-radius: var(--radius-sm); + background: var(--accent-dim); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} +.auth-feature-icon svg { color: var(--accent-light); } +.auth-feature-text { + font-size: var(--text-sm); + font-weight: 500; + color: var(--text-secondary); +} + +.auth-left-bottom { + position: relative; + z-index: 1; + font-size: var(--text-xs); + color: var(--text-faint); +} + +/* ── RIGHT PANEL ── */ +.auth-right { + display: flex; + align-items: center; + justify-content: center; + padding: 40px; + background: var(--bg-base); + position: relative; +} + +.auth-card { + width: 100%; + max-width: 400px; + background: var(--surface-glass); + backdrop-filter: var(--blur-md); + -webkit-backdrop-filter: var(--blur-md); + border: 1px solid var(--border-default); + border-radius: var(--radius-2xl); + padding: 40px; + box-shadow: var(--shadow-xl); + animation: scaleIn var(--dur-enter) var(--ease-spring) both; +} + +.auth-card-title { + font-size: var(--text-2xl); + font-weight: 700; + letter-spacing: -0.03em; + color: var(--text-primary); + margin-bottom: 6px; +} +.auth-card-sub { + font-size: var(--text-sm); + color: var(--text-tertiary); + margin-bottom: 32px; + line-height: 1.5; +} + +.auth-form { + display: flex; + flex-direction: column; + gap: 18px; +} + +/* Floating label input */ +.auth-field { + position: relative; +} +.auth-field-label { + display: block; + font-size: var(--text-xs); + font-weight: 500; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.07em; + margin-bottom: 6px; +} +.auth-field-input { + width: 100%; + padding: 11px 14px; + background: var(--surface-1); + border: 1px solid var(--border-default); + border-radius: var(--radius-md); + font-size: var(--text-sm); + color: var(--text-primary); + transition: border-color var(--dur-base) var(--ease-out), + box-shadow var(--dur-base) var(--ease-out), + background var(--dur-base) var(--ease-out); +} +.auth-field-input::placeholder { color: var(--text-faint); } +.auth-field-input:hover { border-color: var(--border-strong); } +.auth-field-input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-dim); + background: rgba(108,99,255,0.05); + outline: none; +} + +.auth-submit { + width: 100%; + padding: 12px; + font-size: var(--text-sm); + font-weight: 600; + border-radius: var(--radius-md); + background: var(--accent); + color: #fff; + border: none; + cursor: pointer; + box-shadow: var(--shadow-accent); + transition: all var(--dur-base) var(--ease-out); + position: relative; + overflow: hidden; + letter-spacing: -0.01em; + margin-top: 6px; +} +.auth-submit::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(to bottom, rgba(255,255,255,0.10), transparent); +} +.auth-submit:hover { + background: var(--accent-hover); + box-shadow: var(--shadow-accent-lg); + transform: translateY(-1px); +} +.auth-submit:active { transform: scale(0.98); } +.auth-submit:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +/* Loading spinner inside button */ +.auth-submit .spinner { + width: 16px; height: 16px; + border: 2px solid rgba(255,255,255,0.3); + border-top-color: #fff; + border-radius: 50%; + animation: spin 0.7s linear infinite; + display: inline-block; + margin-right: 8px; + vertical-align: middle; +} + +.auth-error { + font-size: var(--text-xs); + color: var(--danger); + margin-top: 4px; + display: none; +} +.auth-error.visible { display: block; } + +.auth-divider { + display: flex; + align-items: center; + gap: var(--space-3); + color: var(--text-faint); + font-size: var(--text-xs); + margin: 4px 0; +} +.auth-divider::before, .auth-divider::after { + content: ''; + flex: 1; + height: 1px; + background: var(--border-subtle); +} + +.auth-switch { + text-align: center; + font-size: var(--text-xs); + color: var(--text-tertiary); + margin-top: 20px; +} +.auth-switch a { + color: var(--accent-light); + font-weight: 500; + transition: color var(--dur-fast); +} +.auth-switch a:hover { color: var(--accent-hover); } + +/* ── MOBILE AUTH ── */ +@media (max-width: 768px) { + .auth-page { + grid-template-columns: 1fr; + grid-template-rows: auto 1fr; + } + .auth-left { + padding: 24px; + min-height: unset; + } + .auth-features { display: none; } + .auth-hero-title { font-size: 22px; } + .auth-brand { margin-bottom: 24px; } + .auth-right { padding: 24px; align-items: flex-start; } + .auth-card { padding: 28px 24px; border-radius: var(--radius-xl); } +} diff --git a/css/dashboard.css b/css/dashboard.css new file mode 100644 index 0000000..53107dd --- /dev/null +++ b/css/dashboard.css @@ -0,0 +1,724 @@ +/* ============================================================ + Dashboard — Layout, Sidebar, Header, Content Areas + ============================================================ */ + +/* --- App Shell --- */ +.app-shell { + display: grid; + grid-template-columns: 240px 1fr; + grid-template-rows: auto 1fr; + grid-template-areas: + 'sidebar topbar' + 'sidebar content'; + min-height: 100dvh; + max-height: 100dvh; + overflow: hidden; +} + +/* --- Sidebar --- */ +.sidebar { + grid-area: sidebar; + display: flex; + flex-direction: column; + background: var(--color-surface); + border-right: 1px solid var(--color-border); + height: 100dvh; + overflow-y: auto; + overflow-x: hidden; + padding: var(--sp-4) 0; + position: relative; + z-index: 10; + transition: transform var(--t-slow); +} + +.sidebar::-webkit-scrollbar { width: 4px; } +.sidebar::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: var(--r-full); } + +.sidebar-brand { + display: flex; + align-items: center; + gap: var(--sp-3); + padding: var(--sp-2) var(--sp-4) var(--sp-5); + border-bottom: 1px solid var(--color-border-soft); + margin-bottom: var(--sp-2); +} + +.sidebar-brand-icon { + width: 32px; + height: 32px; + background: linear-gradient(135deg, var(--color-accent), #7c3aed); + border-radius: var(--r-md); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.sidebar-brand-icon svg { color: white; } +.sidebar-brand-name { font-size: var(--text-md); font-weight: 700; color: var(--color-text); } + +.sidebar-section { padding: var(--sp-2) 0; } + +.sidebar-section-label { + padding: var(--sp-2) var(--sp-4) var(--sp-1); + font-size: var(--text-xs); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--color-text-4); +} + +.nav-item { + display: flex; + align-items: center; + gap: var(--sp-3); + padding: 8px var(--sp-4); + border-radius: 0; + cursor: pointer; + color: var(--color-text-2); + font-size: var(--text-sm); + font-weight: 500; + transition: all var(--t-fast); + position: relative; + margin: 1px 0; + user-select: none; +} + +.nav-item:hover { + background: var(--color-surface-3); + color: var(--color-text); +} + +.nav-item.active { + background: var(--color-accent-soft); + color: var(--color-accent); +} + +.nav-item.active::before { + content: ''; + position: absolute; + left: 0; + top: 4px; + bottom: 4px; + width: 3px; + background: var(--color-accent); + border-radius: 0 var(--r-full) var(--r-full) 0; +} + +.nav-item svg { flex-shrink: 0; opacity: 0.7; } +.nav-item.active svg { opacity: 1; } + +.nav-item-label { flex: 1; } + +.nav-badge { + font-size: 11px; + font-weight: 600; + padding: 1px 6px; + border-radius: var(--r-full); + background: var(--color-surface-3); + color: var(--color-text-3); + min-width: 20px; + text-align: center; +} + +.nav-item.active .nav-badge { + background: var(--color-accent-soft); + color: var(--color-accent-text); +} + +/* Subjects in sidebar */ +.sidebar-subjects { padding: 0 var(--sp-2); } + +.subject-nav-item { + display: flex; + align-items: center; + gap: var(--sp-3); + padding: 7px var(--sp-2); + border-radius: var(--r-md); + cursor: pointer; + font-size: var(--text-sm); + font-weight: 500; + color: var(--color-text-2); + transition: all var(--t-fast); +} + +.subject-nav-item:hover { background: var(--color-surface-3); color: var(--color-text); } +.subject-nav-item.active { background: var(--color-surface-3); color: var(--color-text); } + +.subject-dot { + width: 8px; + height: 8px; + border-radius: 50%; + flex-shrink: 0; +} + +.subject-task-count { + margin-left: auto; + font-size: var(--text-xs); + color: var(--color-text-4); + font-weight: 500; +} + +.add-subject-btn { + display: flex; + align-items: center; + gap: var(--sp-2); + padding: 7px var(--sp-2); + margin: var(--sp-1) 0; + border-radius: var(--r-md); + cursor: pointer; + font-size: var(--text-sm); + color: var(--color-text-3); + transition: all var(--t-fast); + width: 100%; + text-align: left; + border: none; + background: none; +} + +.add-subject-btn:hover { color: var(--color-accent); background: var(--color-accent-soft); } + +/* Sidebar bottom */ +.sidebar-bottom { + margin-top: auto; + padding: var(--sp-4); + border-top: 1px solid var(--color-border-soft); +} + +.sidebar-user { + display: flex; + align-items: center; + gap: var(--sp-3); + padding: var(--sp-2); + border-radius: var(--r-md); + cursor: pointer; + transition: background var(--t-fast); +} + +.sidebar-user:hover { background: var(--color-surface-3); } + +.sidebar-user-info { flex: 1; min-width: 0; } +.sidebar-user-name { font-size: var(--text-sm); font-weight: 600; color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.sidebar-user-email { font-size: var(--text-xs); color: var(--color-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } + +/* --- Top Bar --- */ +.topbar { + grid-area: topbar; + display: flex; + align-items: center; + gap: var(--sp-3); + padding: 0 var(--sp-6); + height: 56px; + background: var(--color-surface); + border-bottom: 1px solid var(--color-border); + position: sticky; + top: 0; + z-index: 5; +} + +.topbar-title { + font-size: var(--text-lg); + font-weight: 700; + color: var(--color-text); + flex: 1; +} + +.topbar-actions { display: flex; align-items: center; gap: var(--sp-2); } + +.topbar-menu-btn { + display: none; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border-radius: var(--r-md); + color: var(--color-text-2); + transition: all var(--t-fast); +} +.topbar-menu-btn:hover { background: var(--color-surface-3); color: var(--color-text); } + +/* --- Content Area --- */ +.content-area { + grid-area: content; + overflow-y: auto; + overflow-x: hidden; + background: var(--color-bg); + height: calc(100dvh - 56px); +} + +.content-area::-webkit-scrollbar { width: 6px; } +.content-area::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: var(--r-full); } + +/* View panels */ +.view-panel { + display: none; + padding: var(--sp-6); + animation: fadeIn 180ms ease; +} +.view-panel.active { display: block; } + +/* --- Dashboard View --- */ +.dashboard-grid { + display: grid; + grid-template-columns: 1fr 320px; + gap: var(--sp-6); + max-width: 1200px; +} + +@media (max-width: 1100px) { + .dashboard-grid { grid-template-columns: 1fr; } +} + +.stat-cards { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: var(--sp-4); + margin-bottom: var(--sp-6); +} + +.stat-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--r-lg); + padding: var(--sp-5); + transition: box-shadow var(--t-base); +} + +.stat-card:hover { box-shadow: var(--shadow-md); } + +.stat-label { + font-size: var(--text-xs); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--color-text-3); + margin-bottom: var(--sp-2); +} + +.stat-value { + font-size: var(--text-2xl); + font-weight: 700; + color: var(--color-text); + line-height: 1; + margin-bottom: var(--sp-1); +} + +.stat-sub { + font-size: var(--text-xs); + color: var(--color-text-3); +} + +.stat-accent-dot { + width: 8px; + height: 8px; + border-radius: 50%; + margin-bottom: var(--sp-3); +} + +/* Section headings */ +.section-heading { + font-size: var(--text-base); + font-weight: 700; + color: var(--color-text); + margin-bottom: var(--sp-4); + display: flex; + align-items: center; + justify-content: space-between; +} + +.section-heading-link { + font-size: var(--text-xs); + font-weight: 500; + color: var(--color-accent); + cursor: pointer; +} +.section-heading-link:hover { text-decoration: underline; } + +/* Task items */ +.task-item { + display: flex; + align-items: flex-start; + gap: var(--sp-3); + padding: var(--sp-3) var(--sp-4); + border-radius: var(--r-md); + background: var(--color-surface); + border: 1px solid var(--color-border); + margin-bottom: var(--sp-2); + transition: all var(--t-fast); + cursor: pointer; +} + +.task-item:hover { border-color: var(--color-accent); box-shadow: var(--shadow-sm); } +.task-item.done { opacity: 0.5; } +.task-item.done .task-title { text-decoration: line-through; color: var(--color-text-3); } + +.task-check { + width: 18px; + height: 18px; + border-radius: var(--r-sm); + border: 2px solid var(--color-border); + flex-shrink: 0; + margin-top: 2px; + display: flex; + align-items: center; + justify-content: center; + transition: all var(--t-fast); + cursor: pointer; +} + +.task-check:hover { border-color: var(--color-accent); background: var(--color-accent-soft); } +.task-check.checked { background: var(--color-accent); border-color: var(--color-accent); } +.task-check.checked svg { display: block; } +.task-check svg { display: none; color: white; } + +.task-content { flex: 1; min-width: 0; } +.task-title { font-size: var(--text-sm); font-weight: 500; color: var(--color-text); line-height: 1.4; } +.task-meta { display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-1); flex-wrap: wrap; } +.task-subject-tag { font-size: var(--text-xs); padding: 2px 8px; border-radius: var(--r-full); font-weight: 500; } +.task-due { font-size: var(--text-xs); color: var(--color-text-3); } +.task-due.overdue { color: var(--color-danger); font-weight: 500; } +.task-due.soon { color: var(--color-warning); font-weight: 500; } + +.task-actions { opacity: 0; transition: opacity var(--t-fast); display: flex; gap: var(--sp-1); } +.task-item:hover .task-actions { opacity: 1; } + +/* Task groups */ +.task-group { margin-bottom: var(--sp-6); } +.task-group-header { display: flex; align-items: center; gap: var(--sp-2); margin-bottom: var(--sp-3); padding-bottom: var(--sp-2); border-bottom: 1px solid var(--color-border-soft); } +.task-group-title { font-size: var(--text-sm); font-weight: 700; color: var(--color-text-2); text-transform: uppercase; letter-spacing: 0.05em; } +.task-group-count { font-size: var(--text-xs); color: var(--color-text-4); } + +/* Empty state */ +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--sp-16) var(--sp-8); + text-align: center; + gap: var(--sp-3); +} + +.empty-state-icon { + width: 56px; + height: 56px; + background: var(--color-surface-3); + border-radius: var(--r-xl); + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-4); + margin-bottom: var(--sp-2); +} + +.empty-state-title { font-size: var(--text-md); font-weight: 600; color: var(--color-text); } +.empty-state-desc { font-size: var(--text-sm); color: var(--color-text-3); max-width: 280px; line-height: 1.6; } + +/* --- Calendar View --- */ +.cal-header { + display: flex; + align-items: center; + gap: var(--sp-4); + margin-bottom: var(--sp-5); +} + +.cal-month-title { font-size: var(--text-xl); font-weight: 700; flex: 1; } + +.cal-nav-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: var(--r-md); + border: 1px solid var(--color-border); + background: var(--color-surface); + color: var(--color-text-2); + cursor: pointer; + transition: all var(--t-fast); +} +.cal-nav-btn:hover { background: var(--color-surface-3); color: var(--color-text); border-color: var(--color-accent); } + +.cal-view-toggle { display: flex; gap: var(--sp-1); background: var(--color-surface-3); padding: 3px; border-radius: var(--r-md); } +.cal-view-btn { padding: 4px 12px; font-size: var(--text-xs); font-weight: 500; border-radius: var(--r-sm); cursor: pointer; color: var(--color-text-3); transition: all var(--t-fast); } +.cal-view-btn.active { background: var(--color-surface); color: var(--color-text); box-shadow: var(--shadow-sm); } + +.cal-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 4px; +} + +.cal-day-label { + text-align: center; + font-size: var(--text-xs); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--color-text-3); + padding: var(--sp-2) 0; +} + +.cal-cell { + min-height: 80px; + background: var(--color-surface); + border: 1px solid var(--color-border-soft); + border-radius: var(--r-md); + padding: var(--sp-2); + cursor: pointer; + transition: all var(--t-fast); +} + +.cal-cell:hover { border-color: var(--color-accent); background: var(--color-accent-soft); } +.cal-cell.today { border-color: var(--color-accent); background: var(--color-accent-soft); } +.cal-cell.empty { background: var(--color-bg); border-color: transparent; cursor: default; } +.cal-cell.empty:hover { border-color: transparent; background: var(--color-bg); } + +.cal-day-num { + font-size: var(--text-sm); + font-weight: 600; + color: var(--color-text-2); + margin-bottom: 4px; + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; +} + +.cal-cell.today .cal-day-num { + background: var(--color-accent); + color: white; +} + +.cal-event { + font-size: 10px; + padding: 2px 5px; + border-radius: 3px; + margin-bottom: 2px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 500; +} + +/* --- Focus Mode View --- */ +.focus-view { + display: grid; + grid-template-columns: 1fr 320px; + gap: var(--sp-6); + max-width: 900px; +} + +@media (max-width: 900px) { .focus-view { grid-template-columns: 1fr; } } + +.timer-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--r-xl); + padding: var(--sp-8); + display: flex; + flex-direction: column; + align-items: center; + gap: var(--sp-6); +} + +.timer-wrap { position: relative; width: 180px; height: 180px; } +.timer-svg { transform: rotate(-90deg); } +.timer-text { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + font-size: var(--text-2xl); + font-weight: 700; + font-variant-numeric: tabular-nums; + color: var(--color-text); +} + +/* --- Smart Paste Panel --- */ +.smart-panel { + background: var(--color-surface); + border-left: 1px solid var(--color-border); + width: 320px; + flex-shrink: 0; + display: flex; + flex-direction: column; + height: calc(100dvh - 56px); + overflow: hidden; +} + +.smart-panel-collapsed { width: 0; overflow: hidden; } + +.panel-header { + display: flex; + align-items: center; + gap: var(--sp-3); + padding: var(--sp-4) var(--sp-5); + border-bottom: 1px solid var(--color-border); + flex-shrink: 0; +} + +.panel-title { font-size: var(--text-base); font-weight: 700; } +.panel-subtitle { font-size: var(--text-xs); color: var(--color-text-3); } + +.panel-toggle { + display: flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + border-radius: var(--r-md); + color: var(--color-text-3); + transition: all var(--t-fast); + margin-left: auto; +} +.panel-toggle:hover { background: var(--color-surface-3); color: var(--color-text); } + +.panel-body { flex: 1; overflow-y: auto; padding: var(--sp-4) var(--sp-5); } + +.paste-zone { + background: var(--color-bg); + border: 1.5px dashed var(--color-border); + border-radius: var(--r-lg); + padding: var(--sp-4); + margin-bottom: var(--sp-4); + transition: border-color var(--t-fast), background var(--t-fast); +} +.paste-zone:focus-within { border-color: var(--color-accent); background: var(--color-accent-soft); } + +.paste-textarea { + width: 100%; + min-height: 120px; + background: transparent; + border: none; + outline: none; + resize: none; + font-size: var(--text-sm); + color: var(--color-text); + line-height: 1.6; + font-family: var(--font); +} +.paste-textarea::placeholder { color: var(--color-text-4); } + +.paste-hint { + font-size: var(--text-xs); + color: var(--color-text-4); + margin-top: var(--sp-2); +} + +.extract-item { + background: var(--color-surface-2); + border: 1px solid var(--color-border); + border-radius: var(--r-md); + padding: var(--sp-3) var(--sp-4); + margin-bottom: var(--sp-2); + animation: fadeIn 200ms ease; +} + +.extract-item-title { font-size: var(--text-sm); font-weight: 500; color: var(--color-text); margin-bottom: var(--sp-1); } +.extract-item-meta { font-size: var(--text-xs); color: var(--color-text-3); } + +.panel-actions { + padding: var(--sp-4) var(--sp-5); + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--sp-2); + flex-shrink: 0; +} + +/* --- Profile View --- */ +.profile-hero { + display: flex; + align-items: center; + gap: var(--sp-6); + padding: var(--sp-8); + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--r-xl); + margin-bottom: var(--sp-6); +} + +.profile-info { flex: 1; } +.profile-name { font-size: var(--text-2xl); font-weight: 700; margin-bottom: var(--sp-1); } +.profile-email { font-size: var(--text-sm); color: var(--color-text-3); margin-bottom: var(--sp-4); } +.profile-stats { display: flex; gap: var(--sp-6); } +.profile-stat-item { text-align: center; } +.profile-stat-num { font-size: var(--text-xl); font-weight: 700; color: var(--color-accent); } +.profile-stat-label { font-size: var(--text-xs); color: var(--color-text-3); margin-top: 2px; } + +.profile-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--sp-5); +} + +@media (max-width: 700px) { .profile-grid { grid-template-columns: 1fr; } } + +/* Subject distribution */ +.subject-bar-item { + display: flex; + align-items: center; + gap: var(--sp-3); + margin-bottom: var(--sp-3); +} +.subject-bar-label { font-size: var(--text-sm); font-weight: 500; width: 100px; color: var(--color-text); flex-shrink: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.subject-bar-track { flex: 1; height: 6px; background: var(--color-surface-3); border-radius: var(--r-full); overflow: hidden; } +.subject-bar-fill { height: 100%; border-radius: var(--r-full); transition: width 600ms ease; } +.subject-bar-count { font-size: var(--text-xs); color: var(--color-text-3); width: 24px; text-align: right; flex-shrink: 0; } + +/* --- Settings View --- */ +.settings-grid { + display: grid; + grid-template-columns: 200px 1fr; + gap: var(--sp-8); + max-width: 860px; +} + +@media (max-width: 700px) { .settings-grid { grid-template-columns: 1fr; } } + +.settings-nav { display: flex; flex-direction: column; gap: var(--sp-1); } +.settings-nav-item { padding: 8px var(--sp-3); border-radius: var(--r-md); font-size: var(--text-sm); font-weight: 500; cursor: pointer; color: var(--color-text-2); transition: all var(--t-fast); } +.settings-nav-item:hover { background: var(--color-surface-3); color: var(--color-text); } +.settings-nav-item.active { background: var(--color-accent-soft); color: var(--color-accent); } + +.settings-section { display: none; } +.settings-section.active { display: block; animation: fadeIn 180ms ease; } + +.settings-section-title { font-size: var(--text-xl); font-weight: 700; margin-bottom: var(--sp-6); } + +.settings-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--sp-4) 0; + border-bottom: 1px solid var(--color-border-soft); +} +.settings-row:last-child { border-bottom: none; } +.settings-row-info { flex: 1; } +.settings-row-label { font-size: var(--text-sm); font-weight: 500; color: var(--color-text); } +.settings-row-desc { font-size: var(--text-xs); color: var(--color-text-3); margin-top: 2px; } + +/* ------------------------------------------------------------------ */ +/* Right-panel integration into app shell */ +/* ------------------------------------------------------------------ */ +.app-shell-with-panel { + display: grid; + grid-template-columns: 240px 1fr 320px; + grid-template-rows: 56px 1fr; + grid-template-areas: + 'sidebar topbar panel' + 'sidebar content panel'; + min-height: 100dvh; + max-height: 100dvh; + overflow: hidden; +} + +.smart-panel { grid-area: panel; } + +/* Compact view */ +.compact-view .task-item { padding: var(--sp-2) var(--sp-3); } +.compact-view .cal-cell { min-height: 60px; } +.compact-view .stat-card { padding: var(--sp-3); } diff --git a/css/design-system.css b/css/design-system.css new file mode 100644 index 0000000..b0fe4e5 --- /dev/null +++ b/css/design-system.css @@ -0,0 +1,588 @@ +/* ============================================================ + STUDYPLAN — PREMIUM DESIGN SYSTEM + Dark-first, glass-morphism, indigo-accent + ============================================================ */ + +:root { + /* ── BACKGROUNDS ── */ + --bg-base: #0B0B0F; + --bg-depth: #111318; + --bg-raised: #161A22; + + /* ── SURFACES ── */ + --surface-1: #1A1F2B; + --surface-2: #202635; + --surface-3: rgba(255,255,255,0.04); + --surface-glass: rgba(22,26,34,0.72); + + /* ── BORDERS ── */ + --border-subtle: rgba(255,255,255,0.06); + --border-default: rgba(255,255,255,0.10); + --border-strong: rgba(255,255,255,0.16); + --border-accent: rgba(108,99,255,0.40); + + /* ── ACCENT ── */ + --accent: #6C63FF; + --accent-light: #7C72FF; + --accent-hover: #8B84FF; + --accent-dim: rgba(108,99,255,0.15); + --accent-glow: rgba(108,99,255,0.25); + + /* ── TEXT ── */ + --text-primary: #FFFFFF; + --text-secondary: #B7C0D1; + --text-tertiary: #8B93A7; + --text-faint: #4B5568; + --text-inverse: #0B0B0F; + + /* ── SEMANTIC ── */ + --success: #4ADE80; + --success-dim: rgba(74,222,128,0.12); + --danger: #EF4444; + --danger-dim: rgba(239,68,68,0.12); + --warning: #F59E0B; + --warning-dim: rgba(245,158,11,0.12); + --info: #38BDF8; + --info-dim: rgba(56,189,248,0.12); + + /* ── RADIUS ── */ + --radius-xs: 6px; + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 16px; + --radius-xl: 20px; + --radius-2xl: 24px; + --radius-full: 9999px; + + /* ── SPACING ── */ + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --space-8: 32px; + --space-10: 40px; + --space-12: 48px; + --space-16: 64px; + + /* ── SHADOWS ── */ + --shadow-xs: 0 1px 3px rgba(0,0,0,0.4); + --shadow-sm: 0 2px 8px rgba(0,0,0,0.5), 0 1px 2px rgba(0,0,0,0.6); + --shadow-md: 0 4px 16px rgba(0,0,0,0.5), 0 2px 6px rgba(0,0,0,0.4); + --shadow-lg: 0 8px 32px rgba(0,0,0,0.6), 0 4px 12px rgba(0,0,0,0.4); + --shadow-xl: 0 16px 48px rgba(0,0,0,0.7), 0 8px 20px rgba(0,0,0,0.5); + --shadow-accent: 0 4px 20px rgba(108,99,255,0.3); + --shadow-accent-lg: 0 8px 32px rgba(108,99,255,0.4); + + /* ── TRANSITIONS ── */ + --ease-out: cubic-bezier(0.16, 1, 0.3, 1); + --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + --dur-fast: 120ms; + --dur-base: 200ms; + --dur-slow: 320ms; + --dur-enter: 400ms; + + /* ── TYPOGRAPHY ── */ + --font-sans: 'Inter', 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif; + --font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace; + + /* ── TYPE SCALE ── */ + --text-xs: 11px; + --text-sm: 13px; + --text-base: 14px; + --text-md: 15px; + --text-lg: 17px; + --text-xl: 20px; + --text-2xl: 24px; + --text-3xl: 30px; + --text-4xl: 36px; + --text-5xl: 48px; + + /* ── LAYOUT ── */ + --sidebar-w: 240px; + --sidebar-collapsed-w: 64px; + --navbar-h: 56px; + --panel-w: 340px; + --content-max: 1200px; + + /* ── BLUR ── */ + --blur-sm: blur(8px); + --blur-md: blur(16px); + --blur-lg: blur(24px); + --blur-xl: blur(40px); +} + +/* ── BASE RESET ── */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + scroll-behavior: smooth; + font-size: 16px; +} + +body { + font-family: var(--font-sans); + font-size: var(--text-base); + background: var(--bg-base); + color: var(--text-primary); + line-height: 1.6; + min-height: 100dvh; + overflow-x: hidden; +} + +img, svg, video { display: block; max-width: 100%; } +button { cursor: pointer; border: none; background: none; font: inherit; color: inherit; } +input, textarea, select { font: inherit; color: inherit; background: transparent; border: none; outline: none; } +ul, ol { list-style: none; } +a { color: inherit; text-decoration: none; } + +:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + border-radius: var(--radius-sm); +} + +::selection { + background: rgba(108,99,255,0.3); + color: #fff; +} + +::-webkit-scrollbar { width: 6px; height: 6px; } +::-webkit-scrollbar-track { background: transparent; } +::-webkit-scrollbar-thumb { + background: rgba(255,255,255,0.10); + border-radius: var(--radius-full); +} +::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.18); } + +/* ── UTILITY CLASSES ── */ +.hidden { display: none !important; } +.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; } +.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + +/* ── GLASS SURFACE ── */ +.glass { + background: var(--surface-glass); + backdrop-filter: var(--blur-md); + -webkit-backdrop-filter: var(--blur-md); + border: 1px solid var(--border-default); +} + +/* ── BUTTON SYSTEM ── */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--space-2); + padding: 9px 16px; + font-size: var(--text-sm); + font-weight: 500; + border-radius: var(--radius-md); + border: 1px solid transparent; + transition: all var(--dur-base) var(--ease-out); + position: relative; + white-space: nowrap; + user-select: none; + letter-spacing: -0.01em; +} +.btn:active { transform: scale(0.97); } + +.btn-primary { + background: var(--accent); + color: #fff; + border-color: rgba(255,255,255,0.12); + box-shadow: var(--shadow-accent), inset 0 1px 0 rgba(255,255,255,0.12); +} +.btn-primary:hover { + background: var(--accent-hover); + box-shadow: var(--shadow-accent-lg); + transform: translateY(-1px); +} + +.btn-secondary { + background: var(--surface-2); + color: var(--text-secondary); + border-color: var(--border-default); +} +.btn-secondary:hover { + background: var(--surface-3); + color: var(--text-primary); + border-color: var(--border-strong); +} + +.btn-ghost { + background: transparent; + color: var(--text-secondary); + border-color: transparent; +} +.btn-ghost:hover { + background: var(--surface-3); + color: var(--text-primary); +} + +.btn-danger { + background: var(--danger-dim); + color: var(--danger); + border-color: rgba(239,68,68,0.2); +} +.btn-danger:hover { + background: rgba(239,68,68,0.2); +} + +.btn-sm { + padding: 6px 12px; + font-size: var(--text-xs); + border-radius: var(--radius-sm); +} + +.btn-lg { + padding: 12px 24px; + font-size: var(--text-md); + border-radius: var(--radius-lg); +} + +.btn-icon { + width: 32px; + height: 32px; + padding: 0; + border-radius: var(--radius-sm); + flex-shrink: 0; +} + +.btn-icon-lg { + width: 38px; + height: 38px; + padding: 0; + border-radius: var(--radius-md); + flex-shrink: 0; +} + +/* ── INPUT SYSTEM ── */ +.input-wrap { + position: relative; + display: flex; + flex-direction: column; + gap: var(--space-1); +} + +.input-label { + font-size: var(--text-xs); + font-weight: 500; + color: var(--text-tertiary); + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.input { + width: 100%; + padding: 10px 14px; + font-size: var(--text-sm); + background: var(--surface-1); + border: 1px solid var(--border-default); + border-radius: var(--radius-md); + color: var(--text-primary); + transition: border-color var(--dur-base) var(--ease-out), + box-shadow var(--dur-base) var(--ease-out); +} +.input::placeholder { color: var(--text-faint); } +.input:hover { border-color: var(--border-strong); } +.input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-dim); + background: var(--surface-2); +} + +select.input { cursor: pointer; } + +/* ── BADGE ── */ +.badge { + display: inline-flex; + align-items: center; + padding: 2px 7px; + font-size: var(--text-xs); + font-weight: 600; + border-radius: var(--radius-full); + background: var(--accent-dim); + color: var(--accent-hover); + border: 1px solid var(--border-accent); + letter-spacing: 0.02em; +} +.badge-success { background: var(--success-dim); color: var(--success); border-color: rgba(74,222,128,0.2); } +.badge-danger { background: var(--danger-dim); color: var(--danger); border-color: rgba(239,68,68,0.2); } +.badge-warning { background: var(--warning-dim); color: var(--warning); border-color: rgba(245,158,11,0.2); } + +/* ── TOAST SYSTEM ── */ +#toast-container { + position: fixed; + bottom: 24px; + right: 24px; + z-index: 9999; + display: flex; + flex-direction: column; + gap: var(--space-2); + pointer-events: none; +} + +.toast { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 12px 16px; + background: var(--surface-2); + border: 1px solid var(--border-default); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + backdrop-filter: var(--blur-md); + font-size: var(--text-sm); + font-weight: 500; + color: var(--text-primary); + pointer-events: auto; + min-width: 260px; + max-width: 380px; + transform: translateX(110%); + opacity: 0; + transition: transform var(--dur-enter) var(--ease-out), opacity var(--dur-base) var(--ease-out); +} +.toast.show { + transform: translateX(0); + opacity: 1; +} +.toast.hide { + transform: translateX(110%); + opacity: 0; +} +.toast-dot { + width: 8px; height: 8px; + border-radius: 50%; + flex-shrink: 0; +} +.toast-success .toast-dot { background: var(--success); } +.toast-error .toast-dot { background: var(--danger); } +.toast-info .toast-dot { background: var(--accent); } +.toast-warning .toast-dot { background: var(--warning); } + +/* ── MODAL BACKDROP ── */ +.modal-backdrop { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.7); + backdrop-filter: var(--blur-sm); + -webkit-backdrop-filter: var(--blur-sm); + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + padding: var(--space-4); + opacity: 0; + transition: opacity var(--dur-base) var(--ease-out); +} +.modal-backdrop.open { + opacity: 1; +} +.modal-backdrop.open .modal-card { + transform: translateY(0) scale(1); + opacity: 1; +} + +.modal-card { + background: var(--surface-1); + border: 1px solid var(--border-default); + border-radius: var(--radius-2xl); + box-shadow: var(--shadow-xl); + width: 100%; + max-width: 440px; + padding: var(--space-8); + transform: translateY(16px) scale(0.97); + opacity: 0; + transition: transform var(--dur-enter) var(--ease-out), + opacity var(--dur-enter) var(--ease-out); +} + +/* ── DIVIDER ── */ +.divider { + height: 1px; + background: var(--border-subtle); + width: 100%; + margin: var(--space-4) 0; +} + +/* ── SKELETON LOADER ── */ +@keyframes shimmer { + 0% { background-position: -400px 0; } + 100% { background-position: 400px 0; } +} +.skeleton { + background: linear-gradient(90deg, + var(--surface-1) 25%, + var(--surface-2) 50%, + var(--surface-1) 75% + ); + background-size: 800px 100%; + animation: shimmer 1.6s ease-in-out infinite; + border-radius: var(--radius-sm); +} + +/* ── PROGRESS RING ── */ +.progress-ring { transform: rotate(-90deg); } +.progress-ring-track { + fill: none; + stroke: rgba(255,255,255,0.06); +} +.progress-ring-fill { + fill: none; + stroke: var(--accent); + stroke-linecap: round; + transition: stroke-dashoffset var(--dur-slow) var(--ease-out); +} + +/* ── ANIMATIONS ── */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} +@keyframes fadeInUp { + from { opacity: 0; transform: translateY(16px); } + to { opacity: 1; transform: translateY(0); } +} +@keyframes slideInRight { + from { opacity: 0; transform: translateX(16px); } + to { opacity: 1; transform: translateX(0); } +} +@keyframes scaleIn { + from { opacity: 0; transform: scale(0.95); } + to { opacity: 1; transform: scale(1); } +} +@keyframes spin { to { transform: rotate(360deg); } } +@keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } } +@keyframes breathe { + 0%,100% { box-shadow: 0 0 20px rgba(108,99,255,0.2); } + 50% { box-shadow: 0 0 40px rgba(108,99,255,0.45); } +} + +.animate-fade-in { animation: fadeIn var(--dur-enter) var(--ease-out) both; } +.animate-fade-in-up { animation: fadeInUp var(--dur-enter) var(--ease-out) both; } +.animate-scale-in { animation: scaleIn var(--dur-enter) var(--ease-spring) both; } + +/* stagger helpers */ +.stagger-1 { animation-delay: 60ms; } +.stagger-2 { animation-delay: 120ms; } +.stagger-3 { animation-delay: 180ms; } +.stagger-4 { animation-delay: 240ms; } +.stagger-5 { animation-delay: 300ms; } + +/* ── REDUCED MOTION ── */ +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + } +} + +/* ── COMMAND PALETTE ── */ +#cmd-palette-backdrop { + position: fixed; + inset: 0; + background: rgba(0,0,0,0.6); + backdrop-filter: var(--blur-sm); + z-index: 9000; + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 18vh; +} +#cmd-palette { + width: 560px; + max-width: calc(100vw - 32px); + background: var(--surface-1); + border: 1px solid var(--border-default); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-xl); + overflow: hidden; +} +#cmd-input-wrap { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 14px 16px; + border-bottom: 1px solid var(--border-subtle); +} +#cmd-input-wrap svg { color: var(--text-faint); flex-shrink: 0; } +#cmd-input { + flex: 1; + font-size: var(--text-md); + background: transparent; + color: var(--text-primary); +} +#cmd-input::placeholder { color: var(--text-faint); } +#cmd-results { + max-height: 360px; + overflow-y: auto; + padding: var(--space-2); +} +.cmd-item { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 9px 12px; + border-radius: var(--radius-md); + cursor: pointer; + font-size: var(--text-sm); + color: var(--text-secondary); + transition: background var(--dur-fast), color var(--dur-fast); +} +.cmd-item:hover, .cmd-item.selected { + background: var(--accent-dim); + color: var(--text-primary); +} +.cmd-item svg { color: var(--text-tertiary); flex-shrink: 0; } +.cmd-footer { + display: flex; + align-items: center; + gap: var(--space-4); + padding: 10px 16px; + border-top: 1px solid var(--border-subtle); + font-size: var(--text-xs); + color: var(--text-faint); +} +.cmd-footer kbd { + background: var(--surface-3); + border: 1px solid var(--border-default); + border-radius: 4px; + padding: 2px 6px; + font-size: 10px; + font-family: var(--font-mono); +} + +/* ── TOOLTIP ── */ +[data-tooltip] { + position: relative; +} +[data-tooltip]::after { + content: attr(data-tooltip); + position: absolute; + bottom: calc(100% + 6px); + left: 50%; + transform: translateX(-50%); + background: var(--surface-2); + color: var(--text-secondary); + font-size: var(--text-xs); + white-space: nowrap; + padding: 5px 8px; + border-radius: var(--radius-sm); + border: 1px solid var(--border-default); + box-shadow: var(--shadow-sm); + pointer-events: none; + opacity: 0; + transition: opacity var(--dur-base); + z-index: 100; +} +[data-tooltip]:hover::after { opacity: 1; } diff --git a/css/index.css b/css/index.css index f5561bd..e6acc90 100644 --- a/css/index.css +++ b/css/index.css @@ -1,3 +1,59 @@ +<<<<<<< HEAD +/* ============================================================ + DASHBOARD — index.css + Premium dark SaaS layout + ============================================================ */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); + +/* ── LAYOUT SHELL ── */ +body { background: var(--bg-base); } + +.app-shell { + display: grid; + grid-template-rows: var(--navbar-h) 1fr; + grid-template-columns: var(--sidebar-w) 1fr var(--panel-w); + height: 100dvh; + overflow: hidden; + transition: grid-template-columns var(--dur-slow) var(--ease-out); +} +.app-shell.panel-collapsed { + grid-template-columns: var(--sidebar-w) 1fr 0px; +} +.app-shell.sidebar-collapsed { + grid-template-columns: var(--sidebar-collapsed-w) 1fr var(--panel-w); +} + +/* ── NAVBAR ── */ +.navbar { + grid-column: 1 / -1; + grid-row: 1; + height: var(--navbar-h); + display: flex; + align-items: center; + gap: var(--space-4); + padding: 0 var(--space-5); + background: rgba(11,11,15,0.85); + backdrop-filter: var(--blur-md); + -webkit-backdrop-filter: var(--blur-md); + border-bottom: 1px solid var(--border-subtle); + position: sticky; + top: 0; + z-index: 200; +} + +.navbar-brand { + display: flex; + align-items: center; + gap: 10px; + text-decoration: none; + flex-shrink: 0; + width: calc(var(--sidebar-w) - 20px); +} +.navbar-logo { + width: 30px; height: 30px; + background: var(--accent); + border-radius: var(--radius-sm); +======= /* css/index.css */ *, *::before, @@ -88,14 +144,70 @@ body { background: var(--color-background-tertiary); color: var(--color-text-primary); min-height: 100vh; +>>>>>>> upstream/main display: flex; - flex-direction: column; align-items: center; justify-content: center; - padding: 32px 16px; - overflow-x: hidden; + box-shadow: var(--shadow-accent); + flex-shrink: 0; +} +.navbar-name { + font-size: var(--text-md); + font-weight: 700; + letter-spacing: -0.03em; + color: var(--text-primary); +} + +<<<<<<< HEAD +/* Search bar */ +.navbar-search { + flex: 1; + max-width: 420px; + position: relative; +} +.navbar-search-icon { + position: absolute; + left: 12px; + top: 50%; + transform: translateY(-50%); + color: var(--text-faint); + pointer-events: none; +} +.navbar-search-input { + width: 100%; + padding: 7px 12px 7px 36px; + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-full); + font-size: var(--text-sm); + color: var(--text-secondary); + transition: border-color var(--dur-base), box-shadow var(--dur-base); +} +.navbar-search-input::placeholder { color: var(--text-faint); } +.navbar-search-input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-dim); + color: var(--text-primary); + background: var(--surface-2); +} +.navbar-search-kbd { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + font-size: 10px; + font-family: var(--font-mono); + color: var(--text-faint); + background: var(--surface-2); + border: 1px solid var(--border-subtle); + border-radius: 4px; + padding: 2px 5px; + pointer-events: none; } +.navbar-right { + margin-left: auto; +======= /* Animations */ @keyframes fadeIn { from { @@ -456,10 +568,204 @@ body { .tasks-actions-bar { margin-top: 18px; +>>>>>>> upstream/main display: flex; - gap: 10px; + align-items: center; + gap: var(--space-2); +} + +.navbar-btn { + width: 34px; height: 34px; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-sm); + color: var(--text-tertiary); + background: transparent; + transition: background var(--dur-fast), color var(--dur-fast); + position: relative; + cursor: pointer; + border: none; +} +.navbar-btn:hover { + background: var(--surface-3); + color: var(--text-primary); +} + +.notif-dot { + position: absolute; + top: 6px; right: 6px; + width: 6px; height: 6px; + border-radius: 50%; + background: var(--danger); + border: 1.5px solid var(--bg-base); +} + +.navbar-avatar { + width: 30px; height: 30px; + border-radius: 50%; + background: linear-gradient(135deg, var(--accent), var(--accent-hover)); + display: flex; + align-items: center; + justify-content: center; + font-size: var(--text-xs); + font-weight: 700; + color: #fff; + cursor: pointer; + border: 1.5px solid var(--border-accent); + transition: border-color var(--dur-base), box-shadow var(--dur-base); +} +.navbar-avatar:hover { + border-color: var(--accent-hover); + box-shadow: var(--shadow-accent); +} + +/* ── SIDEBAR ── */ +.sidebar { + grid-row: 2; + grid-column: 1; + width: var(--sidebar-w); + height: calc(100dvh - var(--navbar-h)); + overflow-y: auto; + overflow-x: hidden; + background: var(--bg-depth); + border-right: 1px solid var(--border-subtle); + display: flex; + flex-direction: column; + padding: var(--space-4) var(--space-3); + transition: width var(--dur-slow) var(--ease-out); + flex-shrink: 0; +} + +.sidebar-section { + margin-bottom: var(--space-6); +} +.sidebar-section-label { + font-size: var(--text-xs); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-faint); + padding: 0 var(--space-3); + margin-bottom: var(--space-2); +} + +.sidebar-item { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 8px var(--space-3); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-weight: 500; + color: var(--text-tertiary); + cursor: pointer; + transition: background var(--dur-fast), color var(--dur-fast); + position: relative; + white-space: nowrap; + overflow: hidden; + user-select: none; +} +.sidebar-item:hover { + background: var(--surface-3); + color: var(--text-secondary); +} +.sidebar-item.active { + background: var(--accent-dim); + color: var(--text-primary); +} +.sidebar-item.active::before { + content: ''; + position: absolute; + left: 0; top: 25%; bottom: 25%; + width: 2px; + background: var(--accent); + border-radius: 0 2px 2px 0; +} +.sidebar-item svg { flex-shrink: 0; } +.sidebar-item-badge { + margin-left: auto; + min-width: 18px; + height: 18px; + padding: 0 5px; + background: var(--surface-2); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-full); + font-size: 10px; + font-weight: 600; + color: var(--text-tertiary); + display: flex; + align-items: center; + justify-content: center; +} +.sidebar-item.active .sidebar-item-badge { + background: var(--accent-dim); + border-color: var(--border-accent); + color: var(--accent-light); +} + +.subject-item { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 7px var(--space-3); + border-radius: var(--radius-md); + cursor: pointer; + font-size: var(--text-sm); + color: var(--text-tertiary); + transition: background var(--dur-fast), color var(--dur-fast); +} +.subject-item:hover { background: var(--surface-3); color: var(--text-secondary); } +.subject-dot { + width: 8px; height: 8px; + border-radius: 50%; + flex-shrink: 0; +} +.subject-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.subject-count { + font-size: 10px; + color: var(--text-faint); + flex-shrink: 0; +} + +.sidebar-add-btn { + display: flex; + align-items: center; + gap: var(--space-2); + padding: 7px var(--space-3); + border-radius: var(--radius-md); + font-size: var(--text-sm); + color: var(--text-faint); + cursor: pointer; + transition: color var(--dur-fast), background var(--dur-fast); + border: 1px dashed var(--border-subtle); + margin-top: var(--space-2); +} +.sidebar-add-btn:hover { color: var(--accent-light); border-color: var(--border-accent); background: var(--accent-dim); } + +/* ── MAIN CONTENT ── */ +.main-content { + grid-row: 2; + grid-column: 2; + overflow-y: auto; + height: calc(100dvh - var(--navbar-h)); + padding: var(--space-6); + display: flex; + flex-direction: column; + gap: var(--space-6); +} + +.page-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--space-4); flex-wrap: wrap; } +<<<<<<< HEAD +.page-title { + font-size: var(--text-xl); +======= .task-action-btn { border: 1px solid var(--color-border-success); @@ -468,10 +774,19 @@ body { border-radius: var(--border-radius-sm); padding: 7px 12px; font-size: 12px; +>>>>>>> upstream/main font-weight: 700; - cursor: pointer; - transition: all 0.2s ease; + letter-spacing: -0.03em; + color: var(--text-primary); } +<<<<<<< HEAD +.page-subtitle { + font-size: var(--text-sm); + color: var(--text-tertiary); + margin-top: 2px; +} +.page-actions { +======= .task-action-btn:hover { filter: brightness(0.98); @@ -1242,11 +1557,36 @@ body { position: relative; width: 240px; height: 240px; +>>>>>>> upstream/main display: flex; align-items: center; - justify-content: center; + gap: var(--space-2); +} + +<<<<<<< HEAD +.stats-row { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--space-4); } +.stat-card { + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + padding: var(--space-5); + transition: border-color var(--dur-base), transform var(--dur-base), box-shadow var(--dur-base); + animation: fadeInUp var(--dur-enter) var(--ease-out) both; +} +.stat-card:hover { + border-color: var(--border-default); + transform: translateY(-2px); + box-shadow: var(--shadow-md); +} +.stat-card-label { + font-size: var(--text-xs); + font-weight: 500; +======= .timer-svg { position: absolute; top: 0; @@ -1295,10 +1635,25 @@ body { font-size: 13px; font-weight: 600; color: var(--color-text-tertiary); +>>>>>>> upstream/main text-transform: uppercase; - letter-spacing: 0.05em; - margin-bottom: 12px; + letter-spacing: 0.07em; + color: var(--text-faint); + margin-bottom: var(--space-2); +} +<<<<<<< HEAD +.stat-card-value { + font-size: var(--text-3xl); + font-weight: 700; + letter-spacing: -0.04em; + color: var(--text-primary); + line-height: 1; + margin-bottom: 4px; } +.stat-card-sub { + font-size: var(--text-xs); + color: var(--text-faint); +======= .active-focus-task { background: var(--color-background-primary); @@ -1345,155 +1700,45 @@ body { .focus-task-item .task-name { margin-bottom: 0; flex: 1; +>>>>>>> upstream/main } +.stat-card-accent { border-top: 2px solid var(--accent); } +.stat-card-success { border-top: 2px solid var(--success); } +.stat-card-danger { border-top: 2px solid var(--danger); } +.stat-card-warning { border-top: 2px solid var(--warning); } - -/* Header */ -.site-header { - width: 100%; - max-width: 1200px; - margin: 0 auto 16px auto; - padding: 16px 24px; - background: var(--color-background-primary); - border: 1px solid var(--color-border-tertiary); - border-radius: var(--border-radius-lg); - box-shadow: var(--shadow-md); - - display: flex; - align-items: center; - justify-content: space-between; -} - -.header-left { - display: flex; - align-items: center; - gap: 12px; -} - -.logo { - width: 40px; - height: 40px; - border-radius: 2px; -} - -.site-title { - font-size: 20px; - font-weight: 700; - color: var(--color-text-primary); -} - -.header-nav { - display: flex; - gap: 24px; -} - -.header-nav a { - text-decoration: none; - color: var(--color-text-secondary); - font-weight: 500; - transition: color 0.2s; -} - -.header-nav a:hover { - color: var(--color-text-primary); -} - -.profile-btn { - padding: 8px 16px; - border: none; - border-radius: var(--border-radius-md); - background: var(--color-text-primary); - color: var(--color-background-primary); - cursor: pointer; - font-weight: 600; +/* ── CALENDAR ── */ +.cal-section { + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + padding: var(--space-5); + animation: fadeIn var(--dur-enter) var(--ease-out) both; } - -/* Footer */ -.site-footer { - width: 100%; - max-width: 1200px; - margin: 16px auto 0 auto; - padding: 16px 24px; - background: var(--color-background-primary); - border: 1px solid var(--color-border-tertiary); - border-radius: var(--border-radius-lg); - box-shadow: var(--shadow-md); - +.cal-header { display: flex; align-items: center; justify-content: space-between; - color: var(--color-text-secondary); - font-size: 14px; + margin-bottom: var(--space-5); } - -.footer-links { - display: flex; - gap: 16px; -} - -.footer-links a { - text-decoration: none; - color: var(--color-text-secondary); -} - -.footer-links a:hover { - color: var(--color-text-primary); +.cal-title { + font-size: var(--text-lg); + font-weight: 700; + letter-spacing: -0.02em; + color: var(--text-primary); } - -/* Global crash boundary UI */ -.crash-screen { - min-height: 100vh; - width: 100%; +.cal-nav { + width: 30px; height: 30px; + border-radius: var(--radius-sm); + background: var(--surface-3); + border: 1px solid var(--border-subtle); display: flex; align-items: center; justify-content: center; - padding: 24px; - background: - radial-gradient(circle at 20% 20%, rgba(24, 95, 165, 0.16), transparent 40%), - radial-gradient(circle at 80% 0%, rgba(22, 101, 52, 0.14), transparent 42%), - var(--color-background-tertiary); -} - -.crash-card { - width: min(560px, 100%); - border-radius: var(--border-radius-lg); - border: 1px solid var(--color-border-tertiary); - background: var(--color-background-primary); - box-shadow: var(--shadow-lg); - padding: 28px; -} - -.crash-illustration { - font-size: 30px; - margin-bottom: 12px; -} - -.crash-title { - font-size: 28px; - margin-bottom: 10px; -} - -.crash-copy { - color: var(--color-text-secondary); - line-height: 1.5; - margin-bottom: 8px; -} - -.crash-quote { - color: var(--color-text-info); - font-weight: 600; - margin-bottom: 16px; -} - -.crash-refresh { - border: none; - border-radius: var(--border-radius-md); - padding: 10px 16px; - font-size: 14px; - font-weight: 700; - color: var(--color-background-primary); - background: var(--color-text-primary); cursor: pointer; +<<<<<<< HEAD + color: var(--text-secondary); +======= } .crash-refresh:hover { @@ -1549,20 +1794,36 @@ body { #new-task-modal .modal-card h3, #new-subject-modal .modal-card h3 { margin: 0 0 12px; +>>>>>>> upstream/main font-size: 18px; - font-weight: 600; - letter-spacing: 0.01em; - color: #f9fafb; + transition: background var(--dur-fast), color var(--dur-fast); } +.cal-nav:hover { background: var(--surface-2); color: var(--text-primary); } +.cal-nav-btns { display: flex; gap: var(--space-2); } - -#new-task-modal label, -#new-subject-modal label { - display: block; - font-size: 11px; +.cal-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 2px; +} +.cal-day-label { + text-align: center; + font-size: var(--text-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; +<<<<<<< HEAD + color: var(--text-faint); + padding: 4px 0 8px; +} +.cal-day { + aspect-ratio: 1; + display: flex; + align-items: center; + justify-content: center; + font-size: var(--text-sm); + border-radius: var(--radius-sm); +======= color: #9ca3af; /* muted */ margin-bottom: 4px; @@ -1666,25 +1927,153 @@ body { margin-bottom: 4px; } -#new-subject-modal .subject-color-swatch { - width: 28px; - height: 28px; +#new-subject-modal .subject-color-swatch { + width: 28px; + height: 28px; + border-radius: 50%; + border: 2px solid rgba(255, 255, 255, 0.25); +>>>>>>> upstream/main + cursor: pointer; + transition: background var(--dur-fast), color var(--dur-fast); + color: var(--text-secondary); + position: relative; +} +.cal-day:hover { background: var(--surface-3); color: var(--text-primary); } +.cal-day.today { + background: var(--accent-dim); + color: var(--accent-hover); + font-weight: 700; + border: 1px solid var(--border-accent); +} +.cal-day.has-tasks::after { + content: ''; + position: absolute; + bottom: 4px; left: 50%; + transform: translateX(-50%); + width: 4px; height: 4px; + border-radius: 50%; + background: var(--accent); +} +.cal-day.other-month { color: var(--text-faint); } + +.cal-legend { + display: flex; + gap: var(--space-5); + margin-top: var(--space-4); + padding-top: var(--space-4); + border-top: 1px solid var(--border-subtle); +} +.cal-legend-item { + display: flex; + align-items: center; + gap: var(--space-2); + font-size: var(--text-xs); + color: var(--text-tertiary); +} +.cal-legend-dot { + width: 6px; height: 6px; + border-radius: 50%; +} + +/* ── TASKS SECTION ── */ +.tasks-section { + display: flex; + flex-direction: column; + gap: var(--space-4); + animation: fadeIn var(--dur-enter) var(--ease-out) both; +} + +.tasks-group { + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + overflow: hidden; +} +.tasks-group-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--space-4) var(--space-5); + border-bottom: 1px solid var(--border-subtle); + cursor: pointer; +} +.tasks-group-title { + font-size: var(--text-sm); + font-weight: 600; + color: var(--text-primary); + display: flex; + align-items: center; + gap: var(--space-3); +} +.tasks-group-count { + font-size: var(--text-xs); + color: var(--text-faint); + background: var(--surface-3); + padding: 2px 7px; + border-radius: var(--radius-full); +} + +.task-item { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 12px var(--space-5); + border-bottom: 1px solid var(--border-subtle); + transition: background var(--dur-fast); + animation: slideInRight var(--dur-enter) var(--ease-out) both; +} +.task-item:last-child { border-bottom: none; } +.task-item:hover { background: var(--surface-3); } +.task-item.completed { opacity: 0.5; } +.task-item.completed .task-title { text-decoration: line-through; color: var(--text-faint); } +.task-item.overdue .task-deadline { color: var(--danger); } +.task-item.soon .task-deadline { color: var(--warning); } + +.task-check { + width: 18px; height: 18px; border-radius: 50%; - border: 2px solid rgba(255, 255, 255, 0.25); - cursor: pointer; - padding: 0; + border: 1.5px solid var(--border-strong); flex-shrink: 0; - box-sizing: border-box; - transition: transform 0.12s ease, box-shadow 0.12s ease; + cursor: pointer; + transition: all var(--dur-base) var(--ease-spring); + display: flex; + align-items: center; + justify-content: center; } - -#new-subject-modal .subject-color-swatch:hover { - transform: scale(1.06); +.task-check:hover { + border-color: var(--accent); + background: var(--accent-dim); } +.task-check.checked { + background: var(--success); + border-color: var(--success); +} +<<<<<<< HEAD +.task-check.checked svg { color: #fff; } -#new-subject-modal .subject-color-swatch--selected { - box-shadow: 0 0 0 2px #0f172a, 0 0 0 4px #a5b4fc; +.task-info { flex: 1; min-width: 0; } +.task-title { + font-size: var(--text-sm); + font-weight: 500; + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.task-meta { + display: flex; + align-items: center; + gap: var(--space-3); + margin-top: 2px; } +.task-subject { font-size: var(--text-xs); color: var(--text-faint); } +.task-deadline { + font-size: var(--text-xs); + color: var(--text-faint); + display: flex; + align-items: center; + gap: 3px; +======= /* css/index.css */ *, @@ -1798,8 +2187,18 @@ body { --color-text-purple: #b9b5f5; --color-background-purple: rgba(185, 181, 245, 0.15); +>>>>>>> upstream/main } +.task-deadline.overdue { color: var(--danger); } +.task-deadline.soon { color: var(--warning); } +<<<<<<< HEAD +.task-priority { + width: 6px; height: 6px; + border-radius: 50%; + flex-shrink: 0; + margin-left: auto; +======= :root[data-theme="light"] { --color-background-primary: #ffffff; --color-background-secondary: #f7f7f5; @@ -1828,20 +2227,29 @@ body { --color-text-purple: #3c3489; --color-background-purple: #eeedfe; +>>>>>>> upstream/main } +.priority-high { background: var(--danger); } +.priority-medium { background: var(--warning); } +.priority-low { background: var(--success); } -body { - font-family: var(--font-sans); - background: var(--color-background-tertiary); - color: var(--color-text-primary); - min-height: 100vh; +/* Empty state */ +.empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; - padding: 32px 16px; - overflow-x: hidden; + padding: var(--space-16) var(--space-8); + text-align: center; + gap: var(--space-4); } +<<<<<<< HEAD +.empty-state-icon { + width: 56px; height: 56px; + border-radius: var(--radius-xl); + background: var(--surface-2); + border: 1px solid var(--border-subtle); +======= /* Animations */ @keyframes fadeIn { @@ -2203,10 +2611,51 @@ body { .tasks-actions-bar { margin-top: 18px; +>>>>>>> upstream/main display: flex; - gap: 10px; - flex-wrap: wrap; + align-items: center; + justify-content: center; + color: var(--text-faint); + margin-bottom: var(--space-2); +} +<<<<<<< HEAD +.empty-state-title { + font-size: var(--text-md); + font-weight: 600; + color: var(--text-secondary); +} +.empty-state-desc { + font-size: var(--text-sm); + color: var(--text-faint); + max-width: 280px; + line-height: 1.6; +} + +/* ── FOCUS MODE ── */ +.focus-section { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-8); + padding: var(--space-8) 0; + animation: fadeInUp var(--dur-enter) var(--ease-out) both; +} + +.focus-timer-wrap { + position: relative; + display: flex; + align-items: center; + justify-content: center; + animation: breathe 4s ease-in-out infinite; +} +.focus-timer-svg { transform: rotate(-90deg); } +.focus-timer-text { + position: absolute; + text-align: center; } +.focus-timer-value { + font-size: var(--text-4xl); +======= .task-action-btn { border: 1px solid var(--color-border-success); @@ -2215,10 +2664,263 @@ body { border-radius: var(--border-radius-sm); padding: 7px 12px; font-size: 12px; +>>>>>>> upstream/main font-weight: 700; + letter-spacing: -0.04em; + color: var(--text-primary); + display: block; +} +<<<<<<< HEAD +.focus-timer-label { + font-size: var(--text-xs); + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--text-faint); +} + +.focus-controls { + display: flex; + align-items: center; + gap: var(--space-3); +} +.focus-duration-row { + display: flex; + align-items: center; + gap: var(--space-3); + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + padding: var(--space-4) var(--space-5); +} +.focus-duration-label { + font-size: var(--text-sm); + color: var(--text-secondary); +} +.focus-duration-input { + width: 60px; + text-align: center; + padding: 6px; + background: var(--surface-2); + border: 1px solid var(--border-default); + border-radius: var(--radius-sm); + font-size: var(--text-sm); + font-weight: 600; + color: var(--text-primary); + transition: border-color var(--dur-base); +} +.focus-duration-input:focus { + border-color: var(--accent); + box-shadow: 0 0 0 2px var(--accent-dim); +} + +.focus-task-section { + width: 100%; + max-width: 480px; + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-lg); + overflow: hidden; +} +.focus-task-header { + padding: var(--space-4) var(--space-5); + border-bottom: 1px solid var(--border-subtle); + font-size: var(--text-sm); + font-weight: 600; + color: var(--text-secondary); +} +.focus-task-active { + padding: var(--space-4) var(--space-5); + background: var(--accent-dim); + border-bottom: 1px solid var(--border-accent); + font-size: var(--text-sm); + color: var(--text-primary); + font-weight: 500; +} +.focus-task-list { max-height: 200px; overflow-y: auto; } +.focus-task-item { + padding: 10px var(--space-5); + font-size: var(--text-sm); + color: var(--text-secondary); + border-bottom: 1px solid var(--border-subtle); cursor: pointer; - transition: all 0.2s ease; + transition: background var(--dur-fast), color var(--dur-fast); +} +.focus-task-item:hover { background: var(--surface-3); color: var(--text-primary); } +.focus-task-item:last-child { border-bottom: none; } + +/* ── SMART PASTE PANEL ── */ +.panel { + grid-row: 2; + grid-column: 3; + width: var(--panel-w); + height: calc(100dvh - var(--navbar-h)); + background: var(--bg-depth); + border-left: 1px solid var(--border-subtle); + display: flex; + flex-direction: column; + overflow: hidden; + transition: width var(--dur-slow) var(--ease-out), opacity var(--dur-slow); + flex-shrink: 0; +} +.app-shell.panel-collapsed .panel { + width: 0; + opacity: 0; + pointer-events: none; +} + +.panel-header { + display: flex; + align-items: center; + gap: var(--space-3); + padding: 14px var(--space-5); + border-bottom: 1px solid var(--border-subtle); + flex-shrink: 0; +} +.panel-toggle { + width: 28px; height: 28px; + border-radius: var(--radius-sm); + background: var(--surface-3); + border: 1px solid var(--border-subtle); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: var(--text-tertiary); + transition: all var(--dur-fast); + flex-shrink: 0; +} +.panel-toggle:hover { background: var(--surface-2); color: var(--text-primary); } +.panel-title { + font-size: var(--text-sm); + font-weight: 600; + color: var(--text-primary); +} +.panel-sub { + font-size: var(--text-xs); + color: var(--text-faint); + margin-top: 1px; +} + +.panel-body { + flex: 1; + overflow-y: auto; + padding: var(--space-5); + display: flex; + flex-direction: column; + gap: var(--space-4); +} + +.paste-zone { + background: var(--surface-1); + border: 1px dashed var(--border-default); + border-radius: var(--radius-lg); + padding: var(--space-5); + display: flex; + flex-direction: column; + gap: var(--space-3); + transition: border-color var(--dur-base), background var(--dur-base); } +.paste-zone:hover { border-color: var(--accent); background: rgba(108,99,255,0.03); } +.paste-zone-hint { + font-size: var(--text-xs); + color: var(--text-faint); + text-align: center; +} +.paste-textarea { + width: 100%; + min-height: 120px; + resize: vertical; + background: transparent; + border: none; + font-size: var(--text-sm); + color: var(--text-primary); + line-height: 1.6; + outline: none; +} +.paste-textarea::placeholder { color: var(--text-faint); } + +.paste-actions { + display: flex; + gap: var(--space-2); +} + +.extract-preview { + display: flex; + flex-direction: column; + gap: var(--space-2); +} +.extract-item { + display: flex; + align-items: flex-start; + gap: var(--space-2); + padding: 10px var(--space-3); + background: var(--surface-1); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-md); + font-size: var(--text-sm); + animation: fadeInUp var(--dur-enter) var(--ease-out) both; +} +.extract-item-check { + width: 16px; height: 16px; + border: 1px solid var(--border-strong); + border-radius: 4px; + flex-shrink: 0; + margin-top: 2px; + cursor: pointer; +} +.extract-item-text { flex: 1; color: var(--text-secondary); } +.extract-item-date { + font-size: var(--text-xs); + color: var(--accent-light); + margin-top: 2px; +} + +.add-to-planner-btn { + width: 100%; + padding: 11px; + font-size: var(--text-sm); + font-weight: 600; + background: var(--accent); + color: #fff; + border: none; + border-radius: var(--radius-md); + cursor: pointer; + box-shadow: var(--shadow-accent); + transition: all var(--dur-base) var(--ease-out); +} +.add-to-planner-btn:hover { + background: var(--accent-hover); + box-shadow: var(--shadow-accent-lg); + transform: translateY(-1px); +} +.add-to-planner-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +/* ── PROFILE DROPDOWN ── */ +.profile-dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + width: 240px; + background: var(--surface-1); + border: 1px solid var(--border-default); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + overflow: hidden; + z-index: 500; + animation: fadeInUp var(--dur-base) var(--ease-out) both; +} +.profile-dropdown-user { + padding: var(--space-4); + border-bottom: 1px solid var(--border-subtle); +} +.profile-dropdown-email { + font-size: var(--text-sm); +======= .task-action-btn:hover { filter: brightness(0.98); @@ -2807,63 +3509,76 @@ body { .header-nav a { text-decoration: none; color: var(--color-text-secondary); +>>>>>>> upstream/main font-weight: 500; - transition: color 0.2s; -} - -.header-nav a:hover { - color: var(--color-text-primary); + color: var(--text-primary); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } - -.profile-btn { - padding: 8px 16px; - border: none; - border-radius: var(--border-radius-md); - background: var(--color-text-primary); - color: var(--color-background-primary); - cursor: pointer; - font-weight: 600; +.profile-dropdown-role { + font-size: var(--text-xs); + color: var(--text-faint); + margin-top: 2px; } - -/* Footer */ -.site-footer { - width: 100%; - max-width: 1200px; - margin: 16px auto 0 auto; - padding: 16px 24px; - background: var(--color-background-primary); - border: 1px solid var(--color-border-tertiary); - border-radius: var(--border-radius-lg); - box-shadow: var(--shadow-md); - +.profile-dropdown-item { display: flex; align-items: center; - justify-content: space-between; - color: var(--color-text-secondary); - font-size: 14px; + gap: var(--space-3); + padding: 9px var(--space-4); + font-size: var(--text-sm); + color: var(--text-secondary); + cursor: pointer; + transition: background var(--dur-fast), color var(--dur-fast); } +.profile-dropdown-item:hover { background: var(--surface-3); color: var(--text-primary); } +.profile-dropdown-item.danger { color: var(--danger); } +.profile-dropdown-item.danger:hover { background: var(--danger-dim); } +.profile-dropdown-sep { height: 1px; background: var(--border-subtle); } -.footer-links { - display: flex; - gap: 16px; +/* ── TOGGLE SWITCH ── */ +.toggle-switch { + position: relative; + width: 38px; height: 22px; + flex-shrink: 0; } - -.footer-links a { - text-decoration: none; - color: var(--color-text-secondary); +<<<<<<< HEAD +.toggle-switch input { + opacity: 0; width: 0; height: 0; + position: absolute; } - -.footer-links a:hover { - color: var(--color-text-primary); +.toggle-track { + position: absolute; + inset: 0; + background: var(--surface-2); + border: 1px solid var(--border-default); + border-radius: var(--radius-full); + cursor: pointer; + transition: background var(--dur-base), border-color var(--dur-base); } - -/* Settings Toggle Switch */ -.toggle-switch { - position: relative; - display: inline-block; - width: 44px; - height: 24px; +.toggle-track::after { + content: ''; + position: absolute; + width: 14px; height: 14px; + border-radius: 50%; + background: var(--text-faint); + top: 3px; left: 3px; + transition: transform var(--dur-base) var(--ease-spring), background var(--dur-base); +} +.toggle-switch input:checked + .toggle-track { + background: var(--accent); + border-color: var(--accent); } +.toggle-switch input:checked + .toggle-track::after { + transform: translateX(16px); + background: #fff; +} + +/* Subject color swatches */ +.subject-color-swatches { + display: flex; + gap: var(--space-2); +======= .toggle-switch input { opacity: 0; @@ -4802,34 +5517,58 @@ body { justify-content: space-between; gap: 18px; align-items: flex-start; +>>>>>>> upstream/main flex-wrap: wrap; } - -.smart-workload-title { - font-size: 14px; - font-weight: 700; - margin-bottom: 8px; - color: #ffcc66; +.subject-swatch { + width: 24px; height: 24px; + border-radius: 50%; + cursor: pointer; + border: 2px solid transparent; + transition: transform var(--dur-fast), border-color var(--dur-fast); } - -.smart-workload-score { - min-width: 90px; - font-size: 12px; - margin-bottom: 10px; - color: #cfcfcf; +.subject-swatch:hover { transform: scale(1.15); } +.subject-swatch.selected { + border-color: #fff; + transform: scale(1.15); + box-shadow: 0 0 0 3px rgba(255,255,255,0.2); } -.smart-suggestion-list { - margin: 0; - padding-left: 18px; +/* ── RESPONSIVE ── */ +@media (max-width: 1200px) { + :root { --panel-w: 300px; } } - -.smart-suggestion-list li { - margin-bottom: 6px; - color: #e6e6e6; - line-height: 1.5; - font-size: 13px; +@media (max-width: 1024px) { + .app-shell { + grid-template-columns: var(--sidebar-w) 1fr; + } + .panel { display: none; } +} +@media (max-width: 768px) { + :root { --sidebar-w: 0px; --navbar-h: 52px; } + .app-shell { + grid-template-columns: 1fr; + grid-template-rows: var(--navbar-h) 1fr; + } + .sidebar { + position: fixed; + left: 0; top: var(--navbar-h); bottom: 0; + width: 260px; + z-index: 300; + transform: translateX(-100%); + transition: transform var(--dur-slow) var(--ease-out); + border-right: 1px solid var(--border-default); + } + .sidebar.open { transform: translateX(0); } + .main-content { grid-column: 1; padding: var(--space-4); } + .stats-row { grid-template-columns: repeat(2, 1fr); } + .page-title { font-size: var(--text-lg); } +} +<<<<<<< HEAD +@media (max-width: 480px) { + .stats-row { grid-template-columns: 1fr; } } +======= .smart-workload-card.high { border-color: rgba(255, 77, 77, 0.5); @@ -4966,3 +5705,4 @@ body { @keyframes slideDown { to { opacity: 0; transform: translateY(10px); } } +>>>>>>> upstream/main diff --git a/css/responsive.css b/css/responsive.css new file mode 100644 index 0000000..755e188 --- /dev/null +++ b/css/responsive.css @@ -0,0 +1,154 @@ +/* ============================================================ + Responsive — Mobile, Tablet, Desktop + ============================================================ */ + +/* Mobile sidebar overlay */ +.sidebar-overlay { + display: none; + position: fixed; + inset: 0; + background: rgba(0,0,0,0.5); + z-index: 9; + backdrop-filter: blur(2px); + animation: fadeIn 150ms ease; +} + +/* Tablet: 768px–1024px */ +@media (max-width: 1024px) { + .app-shell-with-panel { + grid-template-columns: 240px 1fr; + grid-template-areas: + 'sidebar topbar' + 'sidebar content'; + } + .smart-panel { + position: fixed; + right: 0; + top: 56px; + height: calc(100dvh - 56px); + z-index: 20; + transform: translateX(100%); + transition: transform var(--t-slow); + box-shadow: var(--shadow-xl); + } + .smart-panel.open { + transform: translateX(0); + } + .panel-fab { + display: flex !important; + } +} + +/* Mobile: ≤768px */ +@media (max-width: 768px) { + .app-shell, + .app-shell-with-panel { + grid-template-columns: 1fr; + grid-template-rows: 56px 1fr; + grid-template-areas: + 'topbar' + 'content'; + } + + .sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + z-index: 100; + transform: translateX(-100%); + width: 260px; + height: 100dvh; + box-shadow: var(--shadow-xl); + } + + .sidebar.open { + transform: translateX(0); + transition: transform var(--t-slow); + } + + .sidebar-overlay.show { + display: block; + } + + .topbar-menu-btn { display: flex; } + + .content-area { + height: calc(100dvh - 56px); + padding-bottom: 80px; /* space for FAB */ + } + + .view-panel { padding: var(--sp-4); } + + .dashboard-grid { grid-template-columns: 1fr; } + + .stat-cards { grid-template-columns: repeat(2, 1fr); } + + .focus-view { grid-template-columns: 1fr; } + + .profile-hero { + flex-direction: column; + text-align: center; + padding: var(--sp-6); + } + + .profile-stats { justify-content: center; } + + .profile-grid { grid-template-columns: 1fr; } + + .settings-grid { grid-template-columns: 1fr; } + + .cal-cell { min-height: 56px; } + .cal-event { display: none; } + .cal-cell.has-events::after { + content: ''; + width: 4px; + height: 4px; + border-radius: 50%; + background: var(--color-accent); + display: block; + margin: 2px auto 0; + } + + .smart-panel { + position: fixed; + right: 0; + top: 0; + height: 100dvh; + width: 90vw !important; + max-width: 360px; + z-index: 200; + transform: translateX(100%); + transition: transform var(--t-slow); + } + .smart-panel.open { transform: translateX(0); } +} + +/* Floating Action Button — Smart Paste trigger on mobile/tablet */ +.panel-fab { + display: none; + position: fixed; + bottom: var(--sp-6); + right: var(--sp-6); + z-index: 30; + width: 52px; + height: 52px; + border-radius: var(--r-full); + background: var(--color-accent); + color: white; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-lg); + transition: all var(--t-spring); + border: none; + cursor: pointer; +} +.panel-fab:hover { background: var(--color-accent-hover); transform: scale(1.05); } +.panel-fab:active { transform: scale(0.96); } + +/* Touch target minimum */ +@media (hover: none) { + .nav-item { min-height: 44px; } + .btn { min-height: 40px; } + .task-item { min-height: 44px; } +} diff --git a/index.html b/index.html index 3333d17..f8908f0 100644 --- a/index.html +++ b/index.html @@ -1,24 +1,36 @@ - + - StudyPlan + StudyPlan — Dashboard + +<<<<<<< HEAD + + +======= +>>>>>>> upstream/main + - -
-
- -

Welcome back

-

Sign in to your StudyPlan account

+<<<<<<< HEAD + +
- +
- -
+ - -
-
+
+ + + - -