:root{--primary:#0f766e;--primary-2:#0d9488;--accent:#c2410c;--bg:#f0fdfa;--card:#fff;--text:#123d3a;--muted:#526a68;--border:#99dcd5;--danger:#b91c1c;--warning:#9a3412;--shadow:0 8px 24px rgba(15,118,110,.1);font-family:"Noto Sans TC","Microsoft JhengHei",system-ui,sans-serif;color:var(--text);background:var(--bg);font-size:16px}
[hidden]{display:none!important}
*{box-sizing:border-box}body{margin:0;min-height:100vh;background:linear-gradient(180deg,#e6fffb,#f8fffe 40%)}button,input,select{font:inherit}button{cursor:pointer}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #f97316;outline-offset:2px}.login-shell{max-width:480px;min-height:100vh;margin:auto;padding:max(44px,env(safe-area-inset-top)) 24px 32px;display:flex;flex-direction:column;justify-content:center}.brand-mark{width:64px;height:64px;border-radius:18px;background:var(--primary);color:#fff;display:grid;place-items:center;font-size:34px;font-weight:900;box-shadow:var(--shadow);margin-bottom:20px}.eyebrow{font-size:.76rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--primary);margin:0 0 6px}.login-shell h1{font-size:2.35rem;line-height:1.12;margin:0}.login-copy{color:var(--muted);line-height:1.7}.login-card,.panel{background:var(--card);border:1px solid var(--border);border-radius:18px;box-shadow:var(--shadow)}.login-card{display:grid;gap:10px;padding:18px;margin:14px 0 10px}.employee-login-card{margin-top:0}.prototype-note{font-size:.78rem;color:var(--muted);text-align:center;margin-top:20px}.button{border:0;min-height:48px;border-radius:12px;padding:12px 18px;font-weight:800;transition:opacity .2s,background .2s}.button:active{opacity:.75}.primary{background:var(--accent);color:#fff}.secondary{background:#fff;color:var(--primary);border:1px solid var(--primary)}.ghost{background:transparent;color:var(--primary)}.compact{min-height:44px;padding:9px 13px;font-size:.88rem}.field-error{font-size:.82rem;color:var(--danger);margin:0}.app-shell{max-width:760px;margin:auto;min-height:100vh;padding-bottom:calc(88px + env(safe-area-inset-bottom))}.topbar{padding:max(20px,env(safe-area-inset-top)) 18px 12px;display:flex;align-items:center;justify-content:space-between}.topbar h1{font-size:1.55rem;margin:0}.icon-button{width:48px;height:48px;border:0;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--text)}svg{width:23px;height:23px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.page{display:none;padding:8px 16px 22px}.page.active{display:block}.month-row{display:grid;grid-template-columns:48px 1fr 48px;align-items:center;text-align:center;margin-bottom:14px}.month-row small{display:block;color:var(--muted);margin-top:3px}.month-label{font-size:1.1rem;font-weight:900}.month-nav{background:transparent}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:14px}.stat-card{min-width:0;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:13px 10px}.stat-card span,.stat-card small{display:block;font-size:.72rem;color:var(--muted)}.stat-card strong{display:block;font-size:1.7rem;color:var(--primary);margin:4px 0}.stat-card.warning strong{color:var(--warning)}.panel{padding:16px;margin-bottom:14px}.section-heading{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:4px 0 12px}.section-heading h2,.panel h2{font-size:1.15rem;margin:0}.goal-list{display:grid;gap:12px}.goal-row{display:grid;grid-template-columns:44px 1fr auto;gap:10px;align-items:center}.avatar{width:44px;height:44px;border-radius:14px;display:grid;place-items:center;background:#ccfbf1;color:var(--primary);font-weight:900}.goal-info strong,.goal-info small{display:block}.goal-info small{color:var(--muted);font-size:.78rem;margin-top:3px}.progress{height:7px;background:#dff2ef;border-radius:8px;margin-top:7px;overflow:hidden}.progress span{display:block;height:100%;background:var(--primary-2);border-radius:8px}.goal-value{font-weight:900;color:var(--primary)}.goal-value.missing{color:var(--warning)}.tip-panel{display:flex;gap:12px;background:#fff7ed;border-color:#fed7aa}.tip-panel svg{flex:0 0 auto;color:var(--accent)}.tip-panel p{font-size:.86rem;line-height:1.6;margin:5px 0 0}.weekday-row,.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.weekday-row{font-size:.75rem;text-align:center;color:var(--muted);margin-bottom:6px}.calendar-day{position:relative;aspect-ratio:1;border:1px solid var(--border);border-radius:12px;background:#fff;color:var(--text);display:flex;align-items:flex-start;justify-content:flex-start;padding:8px;font-weight:700;min-width:0}.calendar-day.blank{visibility:hidden}.calendar-day.today{border:2px solid var(--primary)}.calendar-day.selected{background:#ccfbf1}.calendar-day.warning{border-color:#fb923c}.calendar-day .off-count{position:absolute;right:5px;bottom:5px;font-size:.64rem;color:var(--muted)}.day-detail{margin-top:14px}.day-detail h3{margin:0 0 5px}.day-person{display:flex;align-items:center;justify-content:space-between;border-top:1px solid #d7eeeb;padding:10px 0}.day-person button{min-height:40px;border:1px solid var(--border);border-radius:10px;background:#fff;padding:7px 11px;color:var(--primary);font-weight:800}.day-person button.rest{background:#fff7ed;color:var(--warning);border-color:#fdba74}.muted,.helper{color:var(--muted);line-height:1.6}.employee-list{display:grid;gap:10px}.employee-card{background:#fff;border:1px solid var(--border);border-radius:16px;padding:14px;display:grid;grid-template-columns:48px 1fr auto;align-items:center;gap:10px}.employee-card.inactive{opacity:.58}.employee-card h3{margin:0;font-size:1rem}.employee-card p{margin:4px 0 0;font-size:.78rem;color:var(--muted)}.employee-actions{display:flex;gap:5px}.mini-button{min-width:44px;min-height:44px;border:0;border-radius:10px;background:#e6fffb;color:var(--primary);font-weight:800}.filter-row{display:flex;gap:8px;margin-bottom:12px}.chip{min-height:44px;border:1px solid var(--border);border-radius:999px;padding:8px 15px;background:#fff;color:var(--text);font-weight:700}.chip.active{background:var(--primary);color:#fff}.form-stack{display:grid;gap:9px}.form-stack label,dialog label,.login-card label{font-weight:800;font-size:.86rem}input,select{width:100%;min-height:48px;border:1px solid #79bdb6;border-radius:10px;background:#fff;padding:10px 12px;color:var(--text);font-size:16px}.input-suffix{display:flex;align-items:center;gap:8px}.input-suffix input{max-width:130px}.helper{font-size:.8rem;margin:0 0 7px}.bottom-nav{position:fixed;left:50%;bottom:0;transform:translateX(-50%);width:min(760px,100%);display:grid;grid-template-columns:repeat(4,1fr);background:rgba(255,255,255,.96);border-top:1px solid var(--border);padding:7px 8px max(7px,env(safe-area-inset-bottom));z-index:10}.nav-item{min-height:58px;border:0;background:transparent;color:var(--muted);display:grid;place-items:center;gap:2px;font-size:.72rem;font-weight:700}.nav-item svg{width:21px;height:21px}.nav-item.active{color:var(--primary)}dialog{width:min(430px,calc(100% - 28px));border:0;border-radius:20px;padding:0;box-shadow:0 24px 70px rgba(0,0,0,.25)}dialog::backdrop{background:rgba(5,36,34,.6)}dialog form{padding:18px;display:grid;gap:9px}.dialog-heading{display:flex;align-items:center;justify-content:space-between}.dialog-heading h2{margin:0}.time-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toast{position:fixed;z-index:40;left:50%;top:max(18px,env(safe-area-inset-top));transform:translate(-50%,-130%);background:#123d3a;color:#fff;padding:11px 18px;border-radius:999px;box-shadow:var(--shadow);font-size:.86rem;font-weight:800;transition:transform .25s}.toast.show{transform:translate(-50%,0)}
.summary-month-row{margin:0 0 8px}.summary-legend{display:flex;gap:18px;font-size:.8rem;color:var(--muted);margin:0 0 10px}.summary-legend span{display:flex;align-items:center;gap:6px}.summary-legend i{width:15px;height:15px;border-radius:4px;border:1px solid var(--border)}.legend-rest{background:#ffedd5;border-color:#fb923c!important}.legend-work{background:#fff}.roster-wrap{max-width:100%;overflow-x:auto;border:1px solid var(--border);border-radius:15px;background:var(--card);box-shadow:var(--shadow);overscroll-behavior-inline:contain}.roster-wrap:focus-visible{outline:3px solid #f97316;outline-offset:2px}.roster-table{border-collapse:separate;border-spacing:0;min-width:max-content;font-size:.76rem}.roster-table th,.roster-table td{width:42px;min-width:42px;height:46px;text-align:center;border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:0}.roster-table thead th{position:sticky;top:0;background:#dff8f4;color:var(--text);z-index:2;font-weight:900}.roster-table .name-cell{position:sticky;left:0;width:78px;min-width:78px;padding:0 8px;background:var(--card);z-index:3;text-align:left;font-weight:900;box-shadow:3px 0 5px rgba(15,118,110,.08)}.roster-table thead .name-cell{z-index:4;background:#dff8f4}.roster-table .total-cell{width:52px;min-width:52px;font-weight:900;color:var(--primary)}.roster-cell{width:100%;height:100%;border:0;background:transparent;color:var(--muted);font-weight:800;cursor:pointer}.roster-cell.rest{background:#ffedd5;color:var(--warning)}.roster-cell:disabled{cursor:default}.summary-helper{margin:10px 2px 0}.bottom-nav{grid-template-columns:repeat(5,1fr);padding-left:4px;padding-right:4px}.nav-item{font-size:.7rem}
@media(min-width:700px){.page{padding-left:30px;padding-right:30px}.topbar{padding-left:30px;padding-right:30px}.stats-grid{gap:14px}.calendar-day{aspect-ratio:1.2}.employee-list{grid-template-columns:1fr 1fr}}
@media(prefers-color-scheme:dark){:root{--bg:#071d1b;--card:#102b28;--text:#e8fffc;--muted:#b7d3d0;--border:#2b5b56;--primary:#5eead4;--primary-2:#2dd4bf;--accent:#ea580c}body{background:linear-gradient(180deg,#061917,#0b2421)}.login-card,.panel,.stat-card,.calendar-day,.employee-card,.icon-button,.chip,.day-person button,input,select{background:var(--card);color:var(--text)}.tip-panel{background:#3b1e10;border-color:#8c4a22}.bottom-nav{background:rgba(10,35,32,.97)}.progress{background:#254b47}.avatar{background:#143d39}.day-person{border-color:var(--border)}.calendar-day.selected,.mini-button{background:#164e49}.button.secondary{background:var(--card);color:var(--primary)}}
@media(prefers-color-scheme:dark){.roster-table thead th,.roster-table thead .name-cell{background:#164e49}.legend-work{background:var(--card)}.roster-cell.rest{background:#5c2d16;color:#fed7aa}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition:none!important}}
textarea{font:inherit;width:100%;min-height:88px;border:1px solid #79bdb6;border-radius:10px;background:#fff;padding:10px 12px;color:var(--text);font-size:16px;line-height:1.5;resize:vertical}textarea:focus-visible{outline:3px solid #f97316;outline-offset:2px}.summary-inline-heading{margin-top:24px}.compact-heading{margin-top:0}.request-card{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 0;border-top:1px solid var(--border)}.request-card:first-child{border-top:0}.request-card p{margin:4px 0 7px;color:var(--muted);font-size:.86rem}.request-actions{display:grid;gap:6px}.mini-button.approve{background:#ccfbf1;color:#0f766e}.status-badge{display:inline-flex;align-items:center;min-height:32px;padding:5px 10px;border-radius:999px;background:#dff8f4;color:#0f766e;font-size:.78rem;font-weight:800}.status-badge.pending{background:#fef3c7;color:#92400e}.status-badge.approved{background:#dcfce7;color:#166534}.status-badge.rejected,.status-badge.rest{background:#fee2e2;color:#991b1b}.audit-row{padding:11px 0;border-top:1px solid var(--border)}.audit-row:first-child{border-top:0}.audit-row p{margin:4px 0;color:var(--muted);font-size:.82rem}.audit-row small{color:var(--muted)}.roster-table .name-cell small{display:block;color:var(--muted);font-size:.64rem}.button:disabled,.mini-button:disabled{cursor:not-allowed;opacity:.55}
@media(prefers-color-scheme:dark){textarea{background:var(--card);color:var(--text)}}
.topbar-actions{display:flex;align-items:center;gap:8px}.session-identity{display:flex;align-items:center;gap:8px;min-height:48px;padding:5px 10px 5px 6px;border:1px solid var(--border);border-radius:16px;background:var(--card);box-shadow:var(--shadow)}.session-avatar{width:36px;height:36px;border-radius:12px;display:grid;place-items:center;flex:0 0 auto;background:var(--primary);color:#fff;font-weight:900}.session-copy{display:grid;line-height:1.15}.session-copy small{font-size:.62rem;color:var(--muted)}.session-copy strong{max-width:6em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.86rem}.session-copy>span{font-size:.65rem;color:var(--primary);font-weight:800}.topbar-actions .icon-button{flex:0 0 48px}@media(max-width:420px){.topbar{align-items:flex-start}.topbar-actions{gap:5px}.session-identity{padding-right:7px}.session-copy>span{display:none}.session-copy strong{max-width:4.5em}}
.password-visibility{display:flex;align-items:center;gap:9px;min-height:44px;width:max-content}.password-visibility input{width:22px;height:22px;min-height:22px;margin:0;accent-color:var(--primary)}
.summary-legend{flex-wrap:wrap;gap:10px 18px}.legend-unassigned{background:#f1f5f9;border-color:#94a3b8!important}.roster-cell.unassigned{background:#f1f5f9;color:#475569}.mini-button.unassigned,.status-badge.unassigned{background:#f1f5f9;color:#475569}@media(prefers-color-scheme:dark){.legend-unassigned,.roster-cell.unassigned,.mini-button.unassigned,.status-badge.unassigned{background:#243433;color:#cbd5e1}}@media print{.roster-cell.unassigned{background:#f1f5f9!important;color:#334155!important}}
@page{size:A4 landscape;margin:8mm}@media print{*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}body{background:#fff!important;color:#000!important}.login-shell,.topbar,.bottom-nav,#dashboard>*:not(#roster-summary),.summary-helper,#print-roster{display:none!important}.app-shell{max-width:none;min-height:0;padding:0}.page{display:none!important;padding:0}.page#dashboard{display:block!important}#roster-summary{display:block!important;margin:0;padding:0;border:0;box-shadow:none}.roster-summary .section-heading{display:flex!important;margin:0 0 6mm}.roster-summary .eyebrow{display:none}.roster-summary h2{font-size:16pt;color:#000}.summary-legend{color:#000;margin-bottom:3mm}.roster-wrap{overflow:visible;border:1px solid #555;border-radius:0;box-shadow:none}.roster-table{width:100%;min-width:0;table-layout:fixed;font-size:8pt}.roster-table th,.roster-table td{position:static!important;width:auto!important;min-width:0!important;height:8mm;border-color:#777}.roster-table .name-cell{width:20mm!important;padding:0 2mm;background:#fff!important;color:#000;box-shadow:none}.roster-table .total-cell{width:10mm!important;color:#000}.roster-table thead th{background:#dff8f4!important;color:#000}.roster-cell{color:#444!important}.roster-cell.rest{background:#ffedd5!important;color:#7c2d12!important}}
.brand-mark{display:block;background:transparent;color:transparent;object-fit:cover}
