:root{--bg: #f8f7f4;--surface: #ffffff;--text: #1a1a1a;--text-muted: #6b6b6b;--border: #e8e6e1;--accent: #2d6a4f;--accent-hover: #1b4332;--accent-solid: #2d6a4f;--accent-solid-hover: #1b4332;--radius: 12px;--shadow: 0 2px 12px rgba(0, 0, 0, .06);--shadow-lift: 0 4px 16px rgba(0, 0, 0, .09);--shadow-sheet: 0 -4px 24px rgba(0, 0, 0, .12);--overlay: rgba(0, 0, 0, .4);--fab-glow: 0 4px 16px rgba(45, 106, 79, .35);--fab-size: 56px;--tint-base: #ffffff;--accent-tint: #e8f5ee;--wk-hatch: rgba(0, 0, 0, .05);color-scheme:light dark;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5;color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;--success: #2d6a4f;--danger: #9b2226;--info: #5c4d7d;--warning: #9a6700}@media(prefers-color-scheme:dark){:root{--bg: #16171a;--surface: #1e2024;--text: #eceded;--text-muted: #9a9ea4;--border: #2e3137;--accent: #5aab82;--accent-hover: #74c39a;--accent-solid: #2f7a58;--accent-solid-hover: #328260;--shadow: 0 2px 12px rgba(0, 0, 0, .4);--shadow-lift: 0 4px 16px rgba(0, 0, 0, .5);--shadow-sheet: 0 -4px 24px rgba(0, 0, 0, .55);--overlay: rgba(0, 0, 0, .6);--fab-glow: 0 4px 16px rgba(0, 0, 0, .55);--tint-base: #1e2024;--accent-tint: #23372e;--wk-hatch: rgba(255, 255, 255, .05);--success: #5aab82;--danger: #e4707a;--info: #a99ad0;--warning: #d9a441}}*{box-sizing:border-box}body{margin:0;background:var(--bg)}.app{max-width:480px;margin:0 auto}main{padding:24px 20px 32px}section{margin-bottom:32px;animation:rise-in .4s ease both}section:nth-of-type(2){animation-delay:.05s}section:nth-of-type(3){animation-delay:.1s}section:nth-of-type(4){animation-delay:.15s}@keyframes rise-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.section-title{font-size:1rem;font-weight:600;margin:0}.app-header{margin-bottom:32px;animation:rise-in .4s ease both}.greeting{font:inherit;font-size:1.375rem;font-weight:700;background:none;border:none;padding:0;color:var(--text);cursor:pointer}.today-date{margin:2px 0 0;color:var(--text-muted);font-size:.9375rem}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}@media(hover:hover){.card:hover{transform:translateY(-1px);box-shadow:var(--shadow-lift)}}.card{transition:transform .15s,box-shadow .15s}.btn{font:inherit;cursor:pointer;border:none;border-radius:8px;transition:background .15s,color .15s}.btn-primary{background:var(--accent-solid);color:#fff;padding:14px 20px;font-weight:600}.btn-primary:hover{background:var(--accent-solid-hover)}.btn-secondary{width:100%;padding:10px;background:var(--bg);color:var(--accent);font-weight:600;border:1px solid var(--border)}.btn-text{background:none;color:var(--accent);font-weight:600;padding:4px 8px}.btn-full{width:100%}.btn-danger{color:var(--danger)}.btn:disabled{opacity:.5;cursor:not-allowed}.fab{position:fixed;right:20px;bottom:24px;width:var(--fab-size);height:var(--fab-size);border-radius:50%;border:none;background:var(--accent-solid);color:#fff;font-size:1.75rem;line-height:1;cursor:pointer;box-shadow:var(--fab-glow);transition:background .15s;z-index:50}.fab:hover{background:var(--accent-solid-hover)}@media(min-width:520px){.fab{right:calc(50% - 220px)}}.empty-state{font-size:.9375rem;color:var(--text-muted);padding:16px;text-align:center;background:var(--surface);border-radius:var(--radius);border:1px dashed var(--border)}.badge{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;border-radius:4px;padding:2px 6px;background:color-mix(in srgb,var(--course-color, var(--accent)) 12%,var(--tint-base));color:var(--course-color, var(--accent))}.icon-btn{background:none;border:none;color:var(--text-muted);font-size:1.125rem;line-height:1;cursor:pointer;padding:4px 8px;border-radius:6px}.icon-btn:hover{color:var(--danger)}.timetable{padding:8px 16px}.tt-day{padding:12px 0;border-bottom:1px solid var(--border)}.tt-day:last-child{border-bottom:none}.tt-day-name{font-size:.8125rem;font-weight:600;color:var(--text-muted);margin-bottom:6px;display:flex;align-items:center;gap:8px}.tt-today .tt-day-name{color:var(--accent)}.tt-today-tag{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;background:var(--accent-tint);color:var(--accent);border-radius:4px;padding:1px 6px}.tt-classes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.tt-class{display:flex;align-items:center;gap:8px;font-size:.875rem;padding:6px 8px 6px 10px;border-left:3px solid var(--course-color, var(--accent));border-radius:6px;background:color-mix(in srgb,var(--course-color, var(--accent)) 5%,var(--surface));min-width:0}.tt-class-main{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer;flex:1;min-width:0;display:flex;align-items:center;gap:8px;text-align:left}.tt-time{color:var(--text-muted);white-space:nowrap;font-variant-numeric:tabular-nums}.tt-course{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tt-location{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tt-class .icon-btn{margin-left:auto}.next-class{border-left:3px solid var(--course-color, var(--accent));margin-bottom:12px}.next-class-label{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--accent);margin-bottom:4px}.next-class-row{display:flex;justify-content:space-between;align-items:center;gap:12px}.next-class-name{font-weight:600}.next-class-meta{font-size:.875rem;color:var(--text-muted)}.next-class-countdown{font-weight:700;color:var(--accent);white-space:nowrap}.module-list{display:flex;flex-direction:column;gap:10px}.module-card{display:flex;align-items:center;gap:12px;width:100%;font:inherit;text-align:left;cursor:pointer;color:var(--text)}.module-color{width:10px;height:10px;flex:none;border-radius:50%;background:var(--course-color, var(--accent))}.module-info{display:flex;flex-direction:column;min-width:0}.module-name{font-weight:600}.module-meta{font-size:.8125rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.module-chevron{margin-left:auto;color:var(--text-muted);font-size:1.25rem}.detail-header{margin-bottom:16px;animation:rise-in .4s ease both}.back-btn{margin-left:-8px}.module-hero{display:flex;align-items:flex-start;gap:12px}.module-hero .module-color{margin-top:8px}.module-hero-name{font-size:1.25rem;font-weight:700;margin:0}.module-hero-meta{font-size:.875rem;color:var(--text-muted)}.module-hero-lecturer{font-size:.875rem;color:var(--text-muted);margin-top:4px}.detail-actions{display:flex;gap:10px;margin-top:12px}.outline-text{font-size:.9375rem;white-space:pre-wrap}.task-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.task-card{display:flex;align-items:flex-start;gap:12px}.task-check{width:20px;height:20px;flex:none;margin-top:2px;accent-color:var(--accent);cursor:pointer}.task-main{display:flex;flex-direction:column;gap:4px;background:none;border:none;padding:0;font:inherit;text-align:left;cursor:pointer;color:var(--text);min-width:0;flex:1}.task-title{font-weight:600}.task-done .task-title{text-decoration:line-through;color:var(--text-muted)}.task-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.8125rem}.due-label{color:var(--text-muted)}.due-overdue{color:var(--danger);font-weight:600}.due-today{color:var(--warning);font-weight:600}.due-soon{color:var(--warning)}.due-done{color:var(--success)}.doing-label{color:var(--info);font-weight:500}.done-toggle{margin-top:10px}.field{display:flex;flex-direction:column;gap:6px;margin-bottom:16px;border:none;padding:0;min-width:0}.field span{font-size:.875rem;font-weight:500;color:var(--text-muted)}.field input,.field select,.field textarea{font:inherit;padding:12px 14px;border:1px solid var(--border);border-radius:8px;background:var(--bg);width:100%;color:var(--text)}.field textarea{resize:vertical}.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--accent);outline-offset:0;border-color:transparent}.field-row{display:flex;gap:12px}.field-row .field{flex:1}.field-error{color:var(--danger);font-size:.8125rem;margin:-8px 0 16px}.color-field{margin:0 0 20px}.color-swatches{display:flex;gap:10px;flex-wrap:wrap}.swatch{width:32px;height:32px;border-radius:50%;border:2px solid transparent;cursor:pointer;padding:0}.swatch-active{border-color:var(--text);box-shadow:0 0 0 2px var(--surface) inset}.delete-btn{margin-top:10px}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--overlay);display:flex;align-items:flex-end;justify-content:center;z-index:100;animation:overlay-in .18s ease both}.modal{background:var(--surface);width:100%;max-width:480px;max-height:90dvh;overflow-y:auto;border-radius:var(--radius) var(--radius) 0 0;box-shadow:var(--shadow-sheet);animation:sheet-in .28s cubic-bezier(.22,.61,.36,1) both}@media(min-width:480px){.modal-overlay{align-items:center;padding:20px}.modal{border-radius:var(--radius)}}@keyframes overlay-in{0%{opacity:0}to{opacity:1}}@keyframes sheet-in{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 20px 0}.modal-title{font-size:1.125rem;font-weight:700;margin:0}.modal-close{background:none;border:none;font-size:1.5rem;line-height:1;color:var(--text-muted);cursor:pointer;padding:4px 8px;border-radius:6px}.modal-close:hover{color:var(--text)}.modal-body{padding:16px 20px 24px}.profile-line{margin:4px 0 0;color:var(--text-muted);font-size:.8125rem}.today-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.today-class{display:flex;align-items:center;gap:14px;width:100%;font:inherit;text-align:left;cursor:pointer;color:var(--text);border-left:3px solid var(--course-color, var(--accent))}.today-class-past{opacity:.55}.today-time{font-size:.8125rem;color:var(--text-muted);white-space:nowrap;font-variant-numeric:tabular-nums;line-height:1.4}.today-info{display:flex;flex-direction:column;min-width:0}.today-name{font-weight:600}.today-meta{font-size:.8125rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.week-btn{margin-top:12px}.week-stage{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;overflow:auto;-webkit-overflow-scrolling:touch;background:var(--bg);padding:16px max(16px,env(safe-area-inset-right)) 16px max(16px,env(safe-area-inset-left))}@media(orientation:portrait){.week-stage{inset:auto;top:50%;left:50%;width:100dvh;height:100dvw;transform:translate(-50%,-50%) rotate(90deg);transform-origin:center center}}.week-stage section{margin-bottom:0}.wk-header{gap:12px;margin-bottom:10px}.wk-header .section-title{margin-right:auto}.wk-card{padding:0;overflow:hidden}.wk-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}.wk-table{width:100%;min-width:340px;border-collapse:collapse;font-size:.75rem;font-variant-numeric:tabular-nums}.wk-table th,.wk-table td{border:1px solid var(--border);padding:0;text-align:left;vertical-align:top}.wk-table tbody td:empty{background-image:repeating-linear-gradient(45deg,transparent 0 5px,var(--wk-hatch) 5px 6px)}.wk-table tbody td{height:1px}.wk-table thead th{padding:9px 6px;font-size:.5625rem;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted);text-align:left;background:var(--surface)}.wk-table thead th.wk-today{color:var(--accent);background:var(--accent-tint)}.wk-table td.wk-today{background:var(--accent-tint)}.wk-time{padding:8px 6px!important;font-size:.625rem;font-weight:500;color:var(--text-muted);white-space:nowrap;width:1%;text-align:center!important;vertical-align:middle!important;background:var(--bg)}.wk-cell{font:inherit;display:flex;flex-direction:column;justify-content:center;gap:1px;width:100%;height:100%;box-sizing:border-box;cursor:pointer;color:var(--text);background:var(--surface);border:0;border-left:3px solid var(--course-color, var(--accent));text-align:left;padding:7px 6px 7px 7px;overflow:hidden}.wk-cell-code{font-size:.625rem;font-weight:700;letter-spacing:.02em;color:var(--course-color, var(--accent));white-space:nowrap}.wk-cell-name{font-size:.625rem;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.wk-cell-loc{font-size:.5625rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em;color:var(--text-muted);white-space:nowrap}.wk-cell+.wk-cell{border-top:1px solid var(--border)}.ca-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px}.ca-card{display:flex;flex-direction:column;align-items:flex-start;gap:2px;font:inherit;text-align:left;cursor:pointer;color:var(--text)}.ca-course{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--course-color, var(--text-muted));margin-bottom:2px}.ca-value{font-size:1.25rem;font-weight:700}.ca-empty{color:var(--text-muted)}.ca-status{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.ca-qualified{color:var(--success)}.ca-below{color:var(--danger)}.ca-divider{width:100%;border-top:1px solid var(--border);margin:8px 0}.ca-target{font-size:.8125rem;color:var(--text-muted)}.ca-unreachable{color:var(--danger)}.ca-summary{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:10px}.ca-targets{display:flex;flex-direction:column;gap:2px;text-align:right}.assessment-weight{color:var(--info);font-weight:500}.weight-check{font-size:.8125rem;color:var(--warning);margin:-4px 0 10px}.assessment-score{color:var(--text-muted)}@media(prefers-color-scheme:dark){.badge{color:color-mix(in srgb,var(--course-color, var(--accent)) 60%,#fff)}.ca-course{color:color-mix(in srgb,var(--course-color, var(--text-muted)) 60%,#fff)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}}.tt-group{font-size:.75rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.03em}.due-past{color:var(--text-muted)}.mark-chip{font-size:.75rem;font-weight:600;color:var(--accent)}.mark-chip-empty{font-weight:500;color:var(--warning)}.field-hint{margin:-6px 0 12px;font-size:.78rem;color:var(--text-muted)}
