body{color:#e2e8f0;background:#0f1117;min-height:100vh;font-family:Segoe UI,system-ui,sans-serif}:root{--bg:#f4f5f7;--surface:#fff;--surface2:#f8fafc;--surface3:#f1f5f9;--border:#e2e8f0;--border-strong:#cbd5e1;--text:#111827;--text-sub:#374151;--text-muted:#64748b;--text-faint:#94a3b8;--accent:#2563eb;--accent-soft:#dbeafe;--accent-strong:#1d4ed8;--weekend-bg:#f8fafc;--rev-bg:#eff6ff;--exam-bg:#fff1f2;--holiday-bg:#fff7ed;--selected-bg:#eff6ff;--selected-border:#2563eb;--topbar-h:64px;--legend-h:42px;--panel-w:340px;--shadow-sm:0 1px 2px #0f172a0d;--shadow-md:0 8px 20px #0f172a14;--shadow-lg:0 24px 70px #0f172a47}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg);color:var(--text);min-height:100vh;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,select,input,textarea{font-family:inherit}button,select,a{transition:background .14s,border-color .14s,color .14s,box-shadow .14s}.app{flex-direction:column;height:100vh;display:flex;overflow:hidden}.topbar{height:var(--topbar-h);background:var(--surface);border-bottom:1px solid var(--border);box-shadow:var(--shadow-sm);z-index:20;flex-shrink:0;justify-content:space-between;align-items:center;gap:16px;padding:0 24px;display:flex}.topbar-title{min-width:240px;color:var(--text);letter-spacing:-.02em;align-items:center;gap:10px;font-size:18px;font-weight:850;display:flex}.logo{background:var(--accent);color:#fff;border-radius:9px;justify-content:center;align-items:center;width:30px;height:30px;font-size:15px;display:inline-flex}.topbar-controls{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;display:flex}.topbar-controls select,.topbar-controls button,.topbar-controls a{border:1px solid var(--border)!important;height:34px!important;color:var(--text-sub)!important;box-shadow:none!important;cursor:pointer!important;background:#fff!important;border-radius:9px!important;justify-content:center!important;align-items:center!important;padding:0 12px!important;font-size:12.5px!important;font-weight:700!important;text-decoration:none!important;display:inline-flex!important}.topbar-controls select:hover,.topbar-controls button:hover,.topbar-controls a:hover{color:var(--accent)!important;background:#eff6ff!important;border-color:#bfdbfe!important}.topbar-controls button:last-child{color:#dc2626!important}.topbar-controls button:last-child:hover{color:#dc2626!important;background:#fef2f2!important;border-color:#fecaca!important}.legend{height:var(--legend-h);background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:8px;padding:0 24px;display:flex;overflow-x:auto}.legend-item{background:var(--surface2);height:24px;color:var(--text-muted);white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:0 8px;font-size:11px;font-weight:700;display:inline-flex}.legend-dot{border-radius:999px;flex-shrink:0;width:7px;height:7px;display:inline-block}.legend-calendar-btn{margin-left:auto}.legend-calendar-btn button{color:var(--accent)!important;cursor:pointer!important;background:0 0!important;border:none!important;padding:0 4px!important;font-size:11px!important;font-weight:800!important}.main{flex:1;min-height:0;display:flex;overflow:hidden}.calendar-wrap{min-width:0;height:calc(100vh - var(--topbar-h) - var(--legend-h));flex:1;padding:14px 18px 18px;overflow:auto}.cal-table{table-layout:fixed;border-collapse:separate;border-spacing:5px;width:100%;min-width:1040px}.cal-table colgroup{display:table-column-group}.col-week{width:70px}.col-weekday{width:13.4%}.col-weekend{width:8.2%}.cal-table th{z-index:8;background:var(--bg);height:30px;color:var(--text-muted);letter-spacing:.08em;text-align:center;text-transform:uppercase;border:none;padding:0 4px;font-size:11px;font-weight:850;position:sticky;top:0}.weekday-head,.weekend-head{text-align:center}.weekend-head{color:#b45309}.week-col{width:70px}.week-label{color:#475569;text-align:center;vertical-align:middle;letter-spacing:-.01em;cursor:pointer;background:#eef2f7;border-radius:12px;height:clamp(76px,11.7647vh - 17.6471px,104px);padding:0 8px;font-size:12px;font-weight:900;box-shadow:inset 0 0 0 1px #e2e8f0}.week-label:hover{color:var(--accent);background:#dbeafe}.week-label.rev{color:#1d4ed8;background:#dbeafe}.week-label.exam{color:#dc2626;background:#fee2e2}.cal-cell{border:1px solid var(--border);height:clamp(76px,11.7647vh - 17.6471px,104px);box-shadow:none;vertical-align:top;cursor:pointer;background:#fff;border-radius:12px;padding:8px;position:relative;overflow:hidden}.cal-cell:hover{z-index:5;background:#f8fafc;border-color:#93c5fd}.cal-cell.weekend{background:#f8fafc}.cal-cell.weekend:hover{background:#f1f5f9}.cal-cell.revision{background:#eff6ff;border-color:#bfdbfe}.cal-cell.exam-day{background:#fff1f2;border-color:#fecaca}.cal-cell.selected{box-shadow:inset 0 0 0 2px #2563eb2e;border-color:var(--selected-border)!important;background:#eff6ff!important}.cell-content{flex-direction:column;min-width:0;height:100%;display:flex}.cell-top-row{justify-content:space-between;align-items:flex-start;gap:6px;min-height:22px;margin-bottom:5px;display:flex}.cell-labels{flex-direction:column;gap:2px;min-width:0;display:flex}.cell-label{white-space:nowrap;border-radius:999px;align-items:center;width:fit-content;max-width:74px;height:17px;padding:0 6px;font-size:9px;font-weight:900;line-height:17px;display:inline-flex}.label-holiday{color:#c2410c;background:#fff7ed}.label-rev{color:#1d4ed8;background:#dbeafe}.label-multi{color:#7c3aed;background:#ede9fe}.date-num{color:var(--text);flex-shrink:0;justify-content:flex-end;align-items:flex-start;font-size:12px;font-weight:850;display:flex}.date-text{color:var(--text);font-weight:850;display:inline-block;position:relative}.date-text-past{color:#64748b;display:inline-block;position:relative}.date-text-past:after{content:"";background:#64748bcc;border-radius:999px;height:1.6px;position:absolute;top:52%;left:-2px;right:-2px;transform:translateY(-50%)}.today-pill{background:var(--accent);color:#fff;border-radius:999px;align-items:center;height:21px;padding:0 8px;font-size:11px;font-weight:900;display:inline-flex}.cell-events-preview{flex-direction:column;gap:4px;min-width:0;margin-top:2px;display:flex;overflow:hidden}.cell-event-line{border-left:3px solid var(--event-color);min-width:0;height:20px;color:var(--event-color);background:#f8fafc;border-radius:7px;grid-template-columns:auto 1fr;align-items:center;gap:5px;padding:0 7px;font-size:10.5px;font-weight:800;line-height:20px;display:grid;position:relative}.cell-event-course{text-overflow:ellipsis;white-space:nowrap;max-width:48px;overflow:hidden}.cell-event-title{min-width:0;color:var(--text-sub);text-overflow:ellipsis;white-space:nowrap;font-weight:650;overflow:hidden}.cell-event-more{height:18px;color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;background:#f1f5f9;border-radius:7px;padding:0 7px;font-size:10px;font-weight:800;line-height:18px;overflow:hidden}.dot-row{opacity:.75;flex-wrap:wrap;align-self:flex-start;gap:4px;margin-top:auto;display:flex}.done-dot-row{background:#94a3b814;border-radius:999px;align-items:center;gap:4px;width:fit-content;margin-top:auto;padding:3px 6px;display:inline-flex}.event-dot{border-radius:999px;width:6px;height:6px;display:inline-block}.done-event-dot{background:#64748b;box-shadow:0 0 0 2px #64748b1f}.done-dot-count{color:#64748b;font-size:9px;font-weight:900;line-height:1}.urgency-badge{pointer-events:none;border:14px solid #0000;border-width:0 14px 14px 0;width:0;height:0;position:absolute;top:0;right:0}.urgency-badge.urgency-1{border-right-color:#f97316}.urgency-badge.urgency-3{border-right-color:#22c55e}.panel{width:var(--panel-w);background:var(--surface);border-left:1px solid var(--border);flex-direction:column;flex-shrink:0;display:flex;overflow-y:auto}.panel-header{z-index:7;background:var(--surface);border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:10px;padding:18px;display:flex;position:sticky;top:0}.panel-date{color:var(--text);font-size:14px;font-weight:850;line-height:1.45}.holiday-badge{color:#c2410c;background:#fff7ed;border-radius:999px;align-items:center;height:22px;margin-top:6px;padding:0 9px;font-size:11px;font-weight:800;display:inline-flex}.add-btn,.close-btn{cursor:pointer;border-radius:10px;height:34px;font-size:13px;font-weight:800}.add-btn{background:var(--accent);color:#fff;border:none;padding:0 14px;box-shadow:0 8px 18px #2563eb2e}.add-btn:hover{background:var(--accent-strong)}.close-btn{border:1px solid var(--border);width:34px;color:var(--text-muted);background:#fff}.close-btn:hover{color:var(--text);background:#f8fafc}.add-form{border-bottom:1px solid var(--border);background:#f8fafc;flex-direction:column;gap:10px;padding:14px 18px;display:flex}.add-form select,.add-form input{border:1px solid var(--border);width:100%;height:38px;color:var(--text);background:#fff;border-radius:10px;padding:0 12px;font-size:13px;font-weight:600}.add-form select:focus,.add-form input:focus,.share-modal input:focus,.share-modal textarea:focus,.share-modal select:focus{outline:none;box-shadow:0 0 0 3px #2563eb1f;border-color:#93c5fd!important}.time-row{flex-direction:column;gap:5px;display:flex}.midnight-warn{color:#ea580c;font-size:11px;font-weight:800}.save-btn{color:#fff;cursor:pointer;background:#16a34a;border:none;border-radius:10px;height:38px;font-size:13px;font-weight:850;box-shadow:0 8px 18px #16a34a29}.save-btn:hover{background:#15803d}.event-list{flex-direction:column;gap:10px;padding:14px 18px 22px;display:flex}.no-events{border:1px dashed var(--border-strong);color:var(--text-faint);text-align:center;background:#f8fafc;border-radius:16px;margin-top:18px;padding:28px 16px;font-size:13px;font-weight:700}.event-card{border:1.5px solid color-mix(in srgb, var(--event-color) 42%, var(--border));box-shadow:-5px 7px 16px color-mix(in srgb, var(--event-color) 13%, transparent);background:#fff;border-radius:16px;align-items:flex-start;gap:10px;padding:12px;display:flex}.event-card:hover{border-color:color-mix(in srgb, var(--event-color) 62%, var(--border));box-shadow:-7px 9px 20px color-mix(in srgb, var(--event-color) 18%, transparent)}.event-card.done{opacity:.82;background:linear-gradient(135deg,#fff 0%,#f7fef9 100%);border-color:#bbf7d0;box-shadow:-4px 6px 14px #16a34a14}.event-card-left{border-left:none;flex:1;min-width:0;padding-left:0}.event-card-topline{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px;display:flex}.event-done-badge{color:#15803d;letter-spacing:.02em;background:#dcfce7;border-radius:999px;align-items:center;height:20px;padding:0 8px;font-size:10px;font-weight:900;display:inline-flex}.event-card.done .event-title{color:#475569;-webkit-text-decoration:line-through #15803d59;text-decoration:line-through #15803d59;text-decoration-thickness:1px}.event-card.done .event-meta,.event-card.done .event-time{color:#94a3b8}.event-type-badge{letter-spacing:.04em;border-radius:999px;align-items:center;height:20px;margin-bottom:6px;padding:0 8px;font-size:10px;font-weight:900;display:inline-flex}.event-title{color:var(--text);font-size:14px;font-weight:750;line-height:1.35}.event-meta,.event-time{color:var(--text-muted);margin-top:4px;font-size:11.5px;font-weight:600}.midnight-tag{color:#ea580c;font-weight:850}.event-actions{flex-direction:column;gap:5px;display:flex}.event-actions button{border:1px solid var(--border);width:28px;height:28px;color:var(--text-muted);cursor:pointer;background:#f8fafc;border-radius:9px;justify-content:center;align-items:center;font-size:12px;display:flex}.event-actions button:hover{color:var(--accent);background:#eff6ff;border-color:#bfdbfe}.countdown{margin-left:6px;font-size:11px;font-weight:850}.countdown-1d{color:#f97316}.countdown-3d{color:#16a34a}.countdown-ok{color:#2563eb}.countdown-today{color:#ea580c}.countdown-past{color:#94a3b8}.share-overlay{z-index:200;background:#0f172a57;justify-content:center;align-items:center;padding:22px;display:flex;position:fixed;inset:0}.share-modal{border:1px solid var(--border);width:100%;max-width:430px;max-height:86vh;box-shadow:var(--shadow-lg);background:#fff;border-radius:18px;padding:24px;overflow-y:auto}.share-modal input,.share-modal textarea,.share-modal select{border:1px solid var(--border)!important;color:var(--text)!important;background:#fff!important;border-radius:10px!important}.share-modal button{border-radius:10px!important;font-weight:800!important}.calendar-overlay{z-index:9999;background:#0f172a6b;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.calendar-modal{width:min(1100px,94vw);height:min(760px,88vh);box-shadow:var(--shadow-lg);background:#fff;border-radius:18px;flex-direction:column;display:flex;overflow:hidden}.calendar-modal-header{border-bottom:1px solid var(--border);background:#fff;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;height:56px;padding:0 16px 0 20px;display:flex}.calendar-modal-title{color:var(--text);font-size:15px;font-weight:900}.calendar-modal-actions{align-items:center;gap:8px;display:flex}.calendar-year,.calendar-download,.calendar-close{border:1px solid var(--border);height:32px;color:var(--text-sub);cursor:pointer;background:#fff;border-radius:9px;justify-content:center;align-items:center;padding:0 12px;font-size:12px;font-weight:800;text-decoration:none;display:inline-flex}.calendar-year.active{background:var(--accent);border-color:var(--accent);color:#fff}.calendar-download{color:var(--accent);background:#eff6ff;border-color:#bfdbfe}.calendar-close{color:#64748b;width:32px;padding:0;font-size:20px;line-height:1}.calendar-close:hover{color:#dc2626;background:#fee2e2;border-color:#fecaca}.calendar-image-wrap{background:#f8fafc;flex:1;min-height:0;padding:14px;overflow:auto}.calendar-image{background:#fff;border-radius:10px;width:100%;height:auto;display:block}.mobile-handle{display:none}@media (width<=900px){:root{--topbar-h:auto;--legend-h:auto}.app{height:auto;min-height:100vh;overflow:visible}.topbar{flex-direction:column;align-items:flex-start;height:auto;padding:12px}.topbar-title{width:100%;min-width:0;font-size:16px}.topbar-controls{justify-content:flex-start;width:100%}.topbar-controls select,.topbar-controls button,.topbar-controls a{height:32px!important;padding:0 9px!important;font-size:11.5px!important}.legend{gap:6px;height:auto;padding:8px 12px}.legend-item{height:22px;padding:0 8px;font-size:10.5px}.main{flex-direction:column;height:auto;overflow:visible}.calendar-wrap{-webkit-overflow-scrolling:touch;flex:none;width:100%;height:auto;padding:10px 8px;display:block;overflow-x:auto}.cal-table{border-spacing:4px;width:760px;min-width:760px}.col-week{width:54px}.col-weekday{width:14%}.col-weekend{width:8%}.cal-table th{height:28px;font-size:10px}.week-label{z-index:6;background:#eef2f7;width:54px;min-width:54px;height:74px;font-size:9px;position:sticky;left:0}.cal-table thead th:first-child{z-index:9;background:var(--bg);width:54px;min-width:54px;position:sticky;left:0}.cal-cell{border-radius:11px;height:74px;padding:7px}.date-num{font-size:11px}.today-pill{height:20px;padding:0 7px;font-size:10px}.cell-label{height:16px;padding:0 5px;font-size:8px}.cell-events-preview{gap:3px}.cell-event-line{height:18px;padding:0 6px;font-size:9px}.cell-event-title{display:none}.cell-event-course{max-width:76px}.cell-event-more{height:16px;font-size:9px;line-height:16px}.urgency-badge{border-width:0 11px 11px 0}.panel{z-index:100;border-left:none;border-top:1px solid var(--border);border-radius:18px 18px 0 0;width:100%;max-height:64vh;position:fixed;bottom:0;left:0;box-shadow:0 -18px 46px #0f172a2e}.mobile-handle{background:var(--border-strong);border-radius:999px;width:42px;height:4px;margin:10px auto 2px;display:block}.main.panel-open .calendar-wrap{padding-bottom:66vh}.share-overlay{padding:14px}.share-modal{border-radius:16px;padding:18px}.calendar-overlay{padding:12px}.calendar-modal{border-radius:14px;width:96vw;height:86vh}.calendar-modal-header{flex-wrap:wrap;height:auto;min-height:54px;padding:10px 12px}.calendar-modal-actions{flex-wrap:wrap}.calendar-image-wrap{padding:8px}}.subject-section-grid{grid-template-columns:1fr;gap:14px;display:grid}.subject-section{border:1px solid var(--border);background:#fff;border-radius:14px;padding:12px}.subject-section-course{background:linear-gradient(135deg,#fff 0%,#f8fbff 100%);border-color:#dbeafe}.subject-section-custom{background:linear-gradient(135deg,#fff 0%,#fcf7ff 100%);border-color:#eadcff}.subject-section-header{justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:10px;display:flex}.subject-section-title{color:var(--text);font-size:13px;font-weight:900}.subject-section-hint{color:var(--text-muted);margin-top:2px;font-size:10.5px;font-weight:650;line-height:1.35}.subject-limit-pill{color:#1d4ed8;background:#dbeafe;border-radius:999px;flex-shrink:0;align-items:center;height:22px;padding:0 8px;font-size:10px;font-weight:900;display:inline-flex}.subject-limit-pill-custom{color:#7e22ce;background:#f3e8ff}.subject-list{flex-direction:column;gap:8px;margin-bottom:12px;display:flex}.subject-empty{color:var(--text-faint);text-align:center;padding:12px 0;font-size:13px}.subject-row{border:1px solid var(--border);background:var(--surface2);border-radius:12px;align-items:center;gap:8px;padding:9px 10px;display:flex}.subject-row-course{background:#fff;border-style:solid}.subject-row-custom{background:linear-gradient(135deg,#fff 0%,#faf5ff 100%);border-style:dashed}.subject-color-dot,.subject-color-diamond{flex-shrink:0;width:13px;height:13px;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #94a3b838}.subject-color-dot{border-radius:999px}.subject-color-diamond{border-radius:4px;transform:rotate(45deg)}.subject-main{flex:1;align-items:center;gap:6px;min-width:0;display:flex}.subject-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text);font-size:13px;font-weight:750;overflow:hidden}.subject-kind{border-radius:999px;flex-shrink:0;align-items:center;height:18px;padding:0 7px;font-size:10px;font-weight:900;display:inline-flex}.subject-kind-course{color:#1d4ed8;background:#dbeafe}.subject-kind-custom{color:#7e22ce;background:#f3e8ff}.subject-color-list,.subject-new-color-list{flex-wrap:wrap;align-items:center;gap:5px;display:flex}.subject-color-choice,.subject-new-color{cursor:pointer;border:2px solid #fff;border-radius:999px;width:18px;height:18px;box-shadow:0 0 0 1px #94a3b880}.subject-row-custom .subject-color-choice,.subject-new-color-list-custom .subject-new-color{border-radius:5px}.subject-color-choice.active,.subject-new-color.active{outline:2px solid var(--accent);outline-offset:2px}.subject-new-color-list-custom .subject-new-color.active{outline-color:#7c3aed}.subject-delete{color:var(--text-muted);cursor:pointer;background:0 0;border:none;flex-shrink:0;font-size:12px;font-weight:800}.subject-delete:hover{color:#dc2626}.subject-add-grid{grid-template-columns:112px 1fr;gap:8px;margin-bottom:10px;display:grid}.subject-add-grid-single{grid-template-columns:1fr}.subject-add-grid select,.subject-add-grid input{border:1px solid var(--border);width:100%;height:36px;color:var(--text);background:#fff;border-radius:9px;padding:0 10px;font-size:13px;font-weight:650}.subject-new-color-list{margin-bottom:12px}.subject-add-btn{color:#fff;cursor:pointer;border:none;border-radius:9px;width:100%;height:34px;font-size:13px;font-weight:850}.subject-add-btn-course{background:var(--accent)}.subject-add-btn-course:hover{background:var(--accent-strong)}.subject-add-btn-custom{background:#7c3aed}.subject-add-btn-custom:hover{background:#6d28d9}.subject-limit-text{color:#c2410c;text-align:center;background:#fff7ed;border-radius:9px;padding:8px 10px;font-size:12px;font-weight:800}.event-card.custom-subject{background:linear-gradient(135deg,#fff 0%,#faf5ff 100%);border-style:dashed}.subject-meta-marker{background:var(--event-color);vertical-align:middle;width:8px;height:8px;margin-right:5px;display:inline-block}.subject-meta-marker.course-subject{border-radius:999px}.subject-meta-marker.custom-subject{border-radius:2px;transform:rotate(45deg)}.done-dot-row{background:#94a3b812;gap:5px;padding:2px 6px}.done-dot-stack{align-items:center;gap:3px;display:inline-flex}.done-event-dot{opacity:.72;box-shadow:0 0 0 1px #ffffffbf}
