:root{--bg:#f4f4f2;--text:#1b1b1d;--text-secondary:#5c5c58;--text-muted:#8a8a85;--input-bg:#ffffff;--input-border:#c9c9c4;--card-bg:transparent;--card-border:#d9d9d4;--detail-border:#e4e4df;--info-border:#d9d9d4;--info-text:#5c5c58;--error-text:#c8362d;--picker-bg:#e6e6e1;--picker-highlight:rgba(255,255,255,0.7);--dot-color:#aaa;--ok:#1e9e5a;--warn:#a67c0f;--over:#c8362d;--radius:2px}html[data-theme=dark]{--bg:#0b0b0c;--text:#ededea;--text-secondary:#a3a39e;--text-muted:#6e6e69;--input-bg:#141416;--input-border:#333338;--card-bg:transparent;--card-border:#28282c;--detail-border:#28282c;--info-border:#28282c;--info-text:#a3a39e;--error-text:#f0554c;--picker-bg:#1b1b1e;--picker-highlight:rgba(255,255,255,0.1);--dot-color:#666;--picker-indicator-filter:invert(0.8);--ok:#3ecf7a;--warn:#e2b93b;--over:#f0554c}*{box-sizing:border-box;margin:0;padding:0}html{height:100%}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;min-height:100%;display:flex;justify-content:center;align-items:center;padding:0 1rem;color:var(--text);background:var(--bg);-webkit-text-size-adjust:100%;transition:background .2s,color .2s}@media (max-width:500px){body{align-items:flex-start}}.container{width:100%;max-width:480px;padding:2rem 0 3rem;position:relative}h1{margin-bottom:1.8rem;font-size:1.6rem;letter-spacing:-.02em}h1,h1.brand{font-weight:700}h1.brand{display:flex;align-items:center;justify-content:flex-start;gap:.55rem;font-size:clamp(1.5rem,6vw,1.9rem);letter-spacing:-.04em;margin-bottom:1.4rem;padding-right:2.5rem}.brand-logo{width:30px;height:30px;flex-shrink:0;color:var(--text)}form{display:flex;flex-direction:column;gap:.85rem}.field label{display:block;font-weight:600;font-size:.74rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);margin-bottom:.4rem}.field input{padding:.7rem .8rem;border:1px solid var(--input-border);border-radius:var(--radius);font-size:1rem;width:100%;background:var(--input-bg);color:var(--text);transition:border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none}.field input:focus{outline:none;border-color:var(--text-secondary);box-shadow:0 0 0 1px var(--text-secondary)}.check{display:flex;align-items:flex-start;gap:.6rem;font-size:.88rem;color:var(--text);cursor:pointer}.check input{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:16px;height:16px;margin-top:2px;flex-shrink:0;border:1px solid var(--input-border);border-radius:var(--radius);background:var(--input-bg);cursor:pointer;position:relative}.check input:checked{background:var(--text);border-color:var(--text)}.check input:checked:after{content:"";position:absolute;left:4px;top:1px;width:5px;height:9px;border-right:2px solid var(--bg);border-bottom:2px solid var(--bg);transform:rotate(45deg)}.check input:focus-visible{outline:none;box-shadow:0 0 0 1px var(--text-secondary)}.check small{display:block;font-size:.74rem;color:var(--text-muted);line-height:1.4}.session-row{display:flex;justify-content:space-between;align-items:center;gap:.75rem;padding:.7rem .9rem;border:1px solid var(--card-border);border-left:2px solid var(--text-secondary);border-radius:var(--radius);font-size:.9rem;color:var(--text-secondary)}.session-row b{color:var(--text);font-weight:600}.link-btn{background:none;border:0;padding:0;font:inherit;font-size:.85rem;font-weight:600;color:var(--text-secondary);text-decoration:underline;text-underline-offset:3px;cursor:pointer}.link-btn:hover{color:var(--text)}.field-hint{margin-top:.4rem;font-size:.74rem;line-height:1.45;color:var(--text-muted)}.field-hint code{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:.74rem;color:var(--text-secondary)}.date-section{margin-top:.3rem}.date-section>label{display:block;font-weight:600;font-size:.74rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);margin-bottom:.4rem}.grade-select{display:flex;gap:.5rem}.grade-select button{flex:1 1;padding:.5rem .4rem;background:transparent;color:var(--text-secondary);border:1px solid var(--input-border);border-radius:var(--radius);font-size:.85rem;font-weight:500;cursor:pointer;transition:background .2s,border-color .2s,color .2s}.grade-select button:hover:not(.active){border-color:var(--text-secondary);color:var(--text)}.grade-select button.active{background:var(--text);color:var(--bg);border-color:var(--text)}.semester-presets{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:.4rem;gap:.4rem;margin-bottom:.5rem}.semester-presets button{padding:.4rem .3rem;background:transparent;color:var(--text-secondary);border:1px solid var(--input-border);border-radius:var(--radius);font-size:.75rem;font-weight:500;cursor:pointer;transition:background .2s,border-color .2s}.semester-presets button:hover:not(:disabled):not(.active){border-color:var(--text-secondary);color:var(--text)}.semester-presets button.active{background:var(--text);color:var(--bg);border-color:var(--text)}.semester-presets button:disabled{opacity:.4;cursor:not-allowed}.presets{display:flex;gap:.5rem;margin-bottom:.5rem}.presets button{flex:1 1;padding:.45rem .4rem;background:transparent;color:var(--text-secondary);border:1px solid var(--input-border);border-radius:var(--radius);font-size:.78rem;font-weight:500;cursor:pointer;transition:background .2s,border-color .2s}.presets button:hover:not(.active){border-color:var(--text-secondary);color:var(--text)}.presets button.active{background:var(--text);color:var(--bg);border-color:var(--text)}.date-row{display:grid;grid-template-columns:1fr 1fr;grid-gap:.75rem;gap:.75rem}@media (max-width:500px){.date-row{grid-template-columns:1fr}}.date-group label{display:block;font-weight:500;font-size:.78rem;color:var(--text-muted);margin-bottom:.25rem}button[type=submit]{margin-top:.6rem;padding:.85rem;background:var(--text);color:var(--bg);border:1px solid var(--text);border-radius:var(--radius);font-size:1rem;font-weight:600;cursor:pointer;transition:background .2s,border-color .2s,transform .1s;-webkit-appearance:none;-moz-appearance:none;appearance:none;touch-action:manipulation}button[type=submit]:hover{background:var(--text-secondary);border-color:var(--text-secondary)}button[type=submit]:active{transform:scale(.99)}button[type=submit]:disabled{opacity:.5;cursor:wait;transform:none}#result{position:relative;margin-top:1.8rem;padding:1.25rem;background:var(--card-bg)}#result,.share-icon-btn{border:1px solid var(--card-border);border-radius:var(--radius)}.share-icon-btn{position:absolute;top:.9rem;right:.9rem;width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:transparent;color:var(--text-secondary);cursor:pointer;transition:border-color .2s,color .2s}.share-icon-btn:hover{border-color:var(--text-secondary);color:var(--text)}.share-modal{max-width:460px}.share{display:flex;flex-direction:column;gap:.9rem}.share-canvas{width:100%;height:auto;display:block;border:1px solid var(--card-border)}.share-actions{display:flex;gap:.5rem}.share-btn{padding:.7rem .5rem;border-radius:var(--radius);border:1px solid var(--input-border);background:transparent;color:var(--text);font-size:.9rem;font-weight:600;cursor:pointer;transition:background .2s,border-color .2s,color .2s}.share-btn:hover{border-color:var(--text-secondary)}.share-btn.primary{flex:1 1;background:var(--text);color:var(--bg);border-color:var(--text)}.share-btn.primary:hover{background:var(--text-secondary);border-color:var(--text-secondary)}.share-save{flex:1 1}.share-note{text-align:center;font-size:.82rem;color:var(--ok);margin:0}.big-number{font-size:3.5rem;font-weight:700;text-align:left;line-height:1;letter-spacing:-.045em;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;margin-top:.4rem}.big-number.green{color:var(--ok)}.big-number.yellow{color:var(--warn)}.big-number.red{color:var(--over)}.big-label{text-align:left;color:var(--text-muted);margin:.35rem 0 .9rem;font-size:.9rem}.details{list-style:none}.details li{display:flex;justify-content:space-between;align-items:baseline;padding:.5rem 0;border-bottom:1px solid var(--detail-border);font-size:.88rem;color:var(--text-secondary);gap:.5rem}.details li:last-child{border-bottom:none}.details .val{font-weight:600;white-space:nowrap;color:var(--text);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}#error{margin-top:1.2rem;padding:.75rem .9rem;background:transparent;color:var(--error-text);border:1px solid var(--error-text);border-left-width:2px;border-radius:var(--radius);font-size:.9rem}.date-group input[type=date]{padding:.7rem .8rem;border:1px solid var(--input-border);border-radius:var(--radius);font-size:1rem;width:100%;background:var(--input-bg);color:var(--text);transition:border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:inherit}.date-group input[type=date]:focus{outline:none;border-color:var(--text-secondary);box-shadow:0 0 0 1px var(--text-secondary)}.date-group input[type=date]::-webkit-calendar-picker-indicator{filter:var(--picker-indicator-filter,none);cursor:pointer}.brand-row{position:relative}.theme-toggle{position:absolute;top:50%;right:0;transform:translateY(-50%);width:30px;height:30px;background:none;border:1px solid var(--card-border);border-radius:var(--radius);color:var(--text-secondary);cursor:pointer;padding:0;line-height:0;transition:border-color .2s,color .2s;display:flex;align-items:center;justify-content:center}.theme-toggle:hover{border-color:var(--text-secondary);color:var(--text)}@media (max-width:380px){.container{padding:1.2rem 0 2rem}h1{font-size:1.35rem;margin-bottom:1.3rem}.big-number{font-size:2.8rem}}.notice{padding:.55rem .8rem;background:color-mix(in srgb,var(--over) 12%,transparent);border:1px solid color-mix(in srgb,var(--over) 35%,transparent);border-left:2px solid var(--over);border-radius:var(--radius);font-size:.82rem;color:var(--text);line-height:1.4}.info-box,.notice{margin-bottom:1.2rem}.info-box{background:transparent;border:1px solid var(--info-border);border-left:2px solid var(--text-secondary);border-radius:var(--radius);padding:.7rem .9rem;font-size:.85rem;color:var(--info-text);line-height:1.45}.info-box strong{color:var(--text);font-weight:600}.tagline{color:var(--text-secondary);font-size:.95rem}.features,.tagline{margin-bottom:1.4rem}.features{display:flex;gap:1.2rem;flex-wrap:wrap}.feature{display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:var(--text-secondary)}.feature svg{flex-shrink:0}.progress-bar-container{position:relative;height:4px;background:var(--picker-bg);border-radius:0;margin:.4rem 0 .45rem}.progress-bar-fill{height:100%;border-radius:0;transition:width .5s ease}.progress-bar-fill.green{background:var(--ok)}.progress-bar-fill.yellow{background:var(--warn)}.progress-bar-fill.red{background:var(--over)}.progress-bar-limit{position:absolute;right:0;top:-3px;bottom:-3px;width:2px;background:var(--text-secondary)}.status-text{font-size:.85rem;font-weight:600;margin-bottom:1rem}.status-text.green{color:var(--ok)}.status-text.yellow{color:var(--warn)}.status-text.red{color:var(--over)}.stats-box{margin-top:1rem;padding:1.2rem 1.5rem;background:var(--card-bg);border:1px solid var(--card-border);border-radius:var(--radius);gap:1rem}.stat-bar-group,.stats-box{display:flex;flex-direction:column}.stat-bar-group{gap:.35rem}.stat-bar-header{display:flex;justify-content:space-between;font-size:.82rem;font-weight:600;color:var(--text-secondary)}.stat-bar-track{height:4px;background:var(--picker-bg);overflow:hidden}.stat-bar-fill{height:100%;transition:width .5s ease}.stat-bar-fill.blue{background:var(--text-secondary)}.stat-bar-fill.green{background:var(--ok)}.stat-bar-fill.yellow{background:var(--warn)}.stat-bar-fill.red{background:var(--over)}.stats-hint{font-size:.8rem;color:var(--text-muted);text-align:left;margin-top:.2rem}.faq{margin-top:2.5rem;border-top:1px solid var(--card-border);padding-top:1.4rem}.faq-title{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);margin-bottom:.5rem}.faq-item{border-bottom:1px solid var(--detail-border)}.faq-question{width:100%;display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;background:none;border:none;color:var(--text);font-size:.9rem;font-weight:500;text-align:left;cursor:pointer}.faq-chevron{transition:transform .2s ease;flex-shrink:0;color:var(--text-muted)}.faq-item.open .faq-chevron{transform:rotate(180deg)}.faq-answer{max-height:0;overflow:hidden;transition:max-height .3s ease}.faq-item.open .faq-answer{max-height:200px}.faq-answer p{padding:0 0 .75rem;font-size:.85rem;line-height:1.5}.details-btn,.faq-answer p{color:var(--text-secondary)}.details-btn{width:100%;margin-top:.6rem;padding:.65rem;background:transparent;border:1px solid var(--input-border);border-radius:var(--radius);font-size:.88rem;font-weight:500;cursor:pointer;transition:border-color .2s,color .2s}.details-btn:hover{border-color:var(--text-secondary);color:var(--text)}.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:100;padding:1rem}.modal{background:var(--bg);border:1px solid var(--card-border);border-radius:var(--radius);width:100%;max-width:560px;max-height:80vh;display:flex;flex-direction:column}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:.9rem 1.25rem;border-bottom:1px solid var(--card-border)}.modal-header h2{font-size:1rem;font-weight:600}.modal-close{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--text-muted);padding:.25rem .5rem;border-radius:var(--radius);line-height:1;transition:color .2s}.modal-close:hover{color:var(--text)}.modal-body{overflow-y:auto;padding:1rem 1.25rem}.breakdown-table{width:100%;border-collapse:collapse;font-size:.85rem;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.breakdown-table th{text-align:left;font-weight:600;font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);padding:.5rem .4rem;border-bottom:1px solid var(--text-secondary)}.breakdown-table td{padding:.45rem .4rem;border-bottom:1px solid var(--detail-border)}.breakdown-table tbody tr:hover{background:var(--picker-bg)}.breakdown-table tfoot td{font-weight:700;border-top:1px solid var(--text-secondary);border-bottom:none;padding-top:.6rem}.period-toggle{display:grid;grid-template-columns:1fr 1fr;grid-gap:.5rem;gap:.5rem;margin-bottom:.5rem}.period-toggle button{padding:.8rem .5rem;background:transparent;color:var(--text-secondary);border:1px solid var(--input-border);border-radius:var(--radius);font-size:.92rem;font-weight:600;cursor:pointer;transition:background .2s,border-color .2s,color .2s}.period-toggle .stage{opacity:.65;font-weight:500}.period-toggle button:hover:not(.active){border-color:var(--text-secondary);color:var(--text)}.period-toggle button.active{background:var(--text);color:var(--bg);border-color:var(--text)}.custom-toggle{width:100%;display:flex;justify-content:space-between;align-items:center;padding:.45rem .1rem;background:none;border:none;color:var(--text-muted);font-size:.82rem;font-weight:500;cursor:pointer}.custom-toggle:hover{color:var(--text-secondary)}.custom-toggle svg{transition:transform .2s ease;flex-shrink:0}.custom-toggle.open svg{transform:rotate(180deg)}.custom-section{max-height:0;overflow:hidden;transition:max-height .3s ease}.custom-section.open{max-height:520px}.custom-inner{display:flex;flex-direction:column;gap:.5rem;padding:.25rem 0 .3rem}.custom-hint{line-height:1.4}.custom-hint,.result-period{font-size:.78rem;color:var(--text-muted)}.result-period{text-align:left;font-weight:600;margin-bottom:.2rem;padding-right:2.5rem}.result-class{font-weight:700;color:var(--text-secondary)}.remaining-hero{display:flex;flex-direction:column;align-items:flex-start;gap:.15rem;margin:.2rem 0 .8rem;padding:.15rem 0 .15rem .8rem;border-left:2px solid var(--text-secondary);border-radius:0;text-align:left}.remaining-hero.ok{border-left-color:var(--ok)}.remaining-hero.over{border-left-color:var(--over)}.remaining-num{font-size:1.2rem;font-weight:700;letter-spacing:-.02em}.remaining-hero.ok .remaining-num{color:var(--ok)}.remaining-hero.over .remaining-num{color:var(--over)}.remaining-sub{font-size:.8rem;color:var(--text-secondary)}.bar-wrap{margin-bottom:.9rem}.bar-labels{font-size:.7rem;color:var(--text-muted);margin-top:.4rem;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.bar-labels,.projection{display:flex;justify-content:space-between}.projection{align-items:center;gap:.5rem;padding:.55rem 0;margin-bottom:.9rem;background:transparent;border-top:1px solid var(--detail-border);border-bottom:1px solid var(--detail-border);border-radius:0}.projection-label{font-size:.85rem;color:var(--text-secondary)}.projection-val{font-size:1.05rem;font-weight:700;white-space:nowrap;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.projection-val.green{color:var(--ok)}.projection-val.yellow{color:var(--warn)}.projection-val.red{color:var(--over)}.split{margin:.4rem 0 .9rem}.split-title{font-size:.74rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-secondary);margin-bottom:.45rem}.split-bar{display:flex;height:4px;border-radius:0;overflow:hidden;background:var(--picker-bg)}.split-ex{background:var(--ok)}.split-un{background:var(--over)}.split-legend{display:flex;justify-content:space-between;gap:.5rem 1rem;margin-top:.45rem;font-size:.76rem;color:var(--text-secondary);flex-wrap:wrap}.split-legend .dot{display:inline-block;width:8px;height:8px;border-radius:0;margin-right:5px}.split-legend .dot.ex{background:var(--ok)}.split-legend .dot.un{background:var(--over)}.wt{margin-top:1.2rem}.wt-nav{display:flex;align-items:center;justify-content:center;gap:1rem;margin-bottom:.7rem}.wt-nav button{background:none;border:1px solid var(--input-border);color:var(--text);width:32px;height:32px;border-radius:var(--radius);font-size:1.2rem;line-height:1;cursor:pointer;transition:border-color .2s,color .2s}.wt-nav button:hover:not(:disabled){border-color:var(--text-secondary)}.wt-nav button:disabled{opacity:.35;cursor:default}.wt-nav .wt-today{width:auto;padding:0 .6rem;font-size:.78rem;font-weight:600;color:var(--text-secondary)}.wt-label{font-size:.9rem;font-weight:600;min-width:160px;text-align:center;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.wt-scroll{overflow-x:auto}.wt-grid{display:grid;grid-template-columns:40px repeat(5,minmax(58px,1fr));min-width:100%}.wt-dayhead{display:flex;flex-direction:column;align-items:center;font-size:.72rem;font-weight:600;color:var(--text-secondary);padding-bottom:.35rem}.wt-dayhead span{font-size:.95rem;font-weight:700}.wt-dayhead span,.wt-dayhead.today{color:var(--text)}.wt-dayhead.today span{border-bottom:2px solid var(--text)}.wt-axis{position:relative}.wt-tick{position:absolute;right:4px;font-size:.58rem;color:var(--text-muted);transform:translateY(-50%);white-space:nowrap;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.wt-col{position:relative;border-left:1px solid var(--detail-border)}.wt-col.today{background:color-mix(in srgb,var(--text) 5%,transparent)}.wt-block{position:absolute;box-sizing:border-box;background:var(--picker-bg);border:1px solid var(--input-border);border-radius:var(--radius);padding:2px 4px;overflow:hidden;display:flex;flex-direction:column;line-height:1.15}.wt-subj{font-size:.68rem;font-weight:700}.wt-meta,.wt-subj{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wt-meta{font-size:.6rem;color:var(--text-muted)}.wt-block.miss-un{border:2px solid var(--over)}.wt-block.miss-ex{border:2px solid var(--warn)}.wt-block.cancelled{opacity:.5}.wt-block.cancelled .wt-subj{text-decoration:line-through}.wt-block.event{border-left:3px solid var(--text-secondary)}.wt-block.future{opacity:.6;border-style:dashed}.wt-empty{font-size:.9rem;padding:1.8rem 0}.wt-empty,.wt-holiday{text-align:center;color:var(--text-muted)}.wt-holiday{position:absolute;top:6px;left:0;right:0;font-size:.6rem;opacity:.7}.wt-legend{display:flex;justify-content:center;gap:1rem;margin-top:.7rem;font-size:.72rem;color:var(--text-secondary);flex-wrap:wrap}.wt-legend i.lg{display:inline-block;width:12px;height:12px;border-radius:var(--radius);vertical-align:-1px;margin-right:3px;background:var(--picker-bg);border:1px solid var(--input-border)}.wt-legend i.miss-un{border:2px solid var(--over)}.wt-legend i.miss-ex{border:2px solid var(--warn)}.wt-legend i.cancelled{opacity:.5}.wt-legend i.future{opacity:.6;border-style:dashed}