:root{--ink:#17231f;--muted:#6b7772;--line:#dde5e1;--bg:#f3f6f4;--panel:#fff;--green:#173f35;--accent:#d8eadf;--danger:#a83b32}*{box-sizing:border-box}html,body{background:var(--bg);color:var(--ink);margin:0;font-family:Inter,Noto Sans HK,PingFang HK,system-ui,sans-serif}button,input,select{font:inherit}button{cursor:pointer}.app{grid-template-columns:232px 1fr;min-height:100vh;display:grid}aside{color:#fff;z-index:20;background:#132b25;flex-direction:column;width:232px;padding:26px 16px 18px;display:flex;position:fixed;inset:0 auto 0 0}.aside-brand{align-items:center;gap:11px;padding:0 10px 28px;display:flex}.aside-brand>span,.brand-mark{color:#173f35;background:#d7e8de;border-radius:11px;place-items:center;width:39px;height:39px;font-weight:800;display:grid}.aside-brand b,.aside-brand small{display:block}.aside-brand small{letter-spacing:.15em;color:#a9bbb4;margin-top:2px;font-size:10px}nav{gap:5px;display:grid}nav button{color:#b8c8c2;text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:12px;padding:12px;font-weight:600;display:flex}nav button:hover,nav button.active{color:#fff;background:#25433b}nav i{text-align:center;width:18px;font-style:normal}.aside-foot{border-top:1px solid #345047;align-items:center;gap:9px;margin-top:auto;padding:18px 6px 0;display:flex}.aside-foot b,.aside-foot small{font-size:12px;display:block}.aside-foot small{color:#9eb1aa}.aside-foot button{color:#c5d2cd;background:0 0;border:0;margin-left:auto;font-size:20px}.avatar{color:#24473c;background:#e3ece7;border-radius:50%;flex:none;place-items:center;width:34px;height:34px;font-weight:800;display:grid}.main{grid-column:2;min-width:0;padding:28px 34px 60px}.main>header{justify-content:space-between;align-items:flex-end;margin-bottom:24px;display:flex}.eyebrow{letter-spacing:.16em;color:#6d837a;margin:0 0 6px;font-size:10px;font-weight:800}.main h1{letter-spacing:-.03em;margin:0;font-size:26px}.header-actions{align-items:center;gap:9px;display:flex}.header-actions select,.modal select{border:1px solid var(--line);background:#fff;border-radius:8px;padding:9px}.status{background:#e6e9e7;border-radius:20px;padding:6px 9px;font-size:10px;font-weight:800}.status.draft{color:#6a5521;background:#f4ecd1}.status.published{color:#1c5a3f;background:#dcefe4}.status.locked{color:#743531;background:#f5dedb}.hero{color:#fff;background:linear-gradient(125deg,#173f35,#28574a);border-radius:14px;justify-content:space-between;align-items:center;padding:30px 32px;display:flex;box-shadow:0 9px 24px #153d3320}.hero h2{margin:4px 0 6px;font-size:27px}.hero p{color:#c9dad4;margin:0}.hero .eyebrow{color:#a9c5bb}.hero-actions{gap:8px;display:flex}.hero-actions button,.toolbar button,.quick button,.primary{color:#204a3f;background:#fff;border:1px solid #d8e4df;border-radius:8px;padding:10px 14px;font-weight:700}.hero-actions .primary,.primary{color:#163b31;background:#dcebe2;border-color:#dcebe2}.metric-grid{grid-template-columns:repeat(4,1fr);gap:12px;margin:14px 0;display:grid}.metric{border:1px solid var(--line);background:#fff;border-radius:11px;padding:18px}.metric small{color:var(--muted);font-weight:600;display:block}.metric strong{margin:8px 5px 0 0;font:700 30px Georgia,serif;display:inline-block}.metric span{color:var(--muted);font-size:12px}.metric.warning{border-left:4px solid #cb8144}.panel{border:1px solid var(--line);background:#fff;border-radius:12px;padding:22px;box-shadow:0 3px 12px #173f3508}.panel-title{justify-content:space-between;align-items:center;margin-bottom:18px;display:flex}.panel h2{margin:0;font-size:19px}.day-step{border:1px solid var(--line);border-radius:8px;align-items:center;display:flex;overflow:hidden}.day-step button{background:#f5f7f6;border:0;padding:8px 12px}.day-step b{padding:0 12px;font-size:12px}.coverage{grid-template-columns:repeat(5,1fr);gap:10px;display:grid}.coverage article{border:1px solid var(--line);border-top:4px solid var(--store);border-radius:8px;padding:14px}.coverage article>div{align-items:center;gap:7px;display:flex}.coverage small{color:var(--muted);margin-left:auto}.coverage p{min-height:42px;font-size:13px;line-height:1.6}.coverage em{color:#a24c32;background:#f8e8e2;border-radius:4px;padding:3px 6px;font-size:10px;font-style:normal;font-weight:700}.store-dot{background:var(--store);border-radius:50%;width:8px;height:8px}.quick{margin-top:18px}.quick h3{text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-size:12px}.quick div{gap:8px;display:flex}.quick button{border-color:var(--line);background:#fff}.toolbar{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.toolbar div{gap:8px;display:flex}.toolbar button{padding:8px 11px}.toolbar button:disabled{opacity:.45;cursor:not-allowed}.toolbar span{color:var(--muted);font-size:12px}.roster-panel{padding:14px}.roster-scroll{border:1px solid var(--line);border-radius:8px;max-height:calc(100vh - 210px);overflow:auto}.roster-scroll table{border-collapse:separate;border-spacing:0;min-width:3300px;font-size:12px}.roster-scroll th,.roster-scroll td{border-right:1px solid var(--line);border-bottom:1px solid var(--line);vertical-align:top}.roster-scroll thead th{z-index:4;text-align:center;background:#f7f9f8;min-width:100px;height:52px;padding:8px;position:sticky;top:0}.roster-scroll thead th b,.roster-scroll thead th small{display:block}.roster-scroll thead th small{color:var(--muted);margin-top:4px;font-size:9px}.roster-scroll thead .weekend{background:#eef2f0}.roster-scroll .store-head,.roster-scroll tbody th,.roster-scroll tfoot th{z-index:5;background:#fff;min-width:118px;position:sticky;left:0}.roster-scroll tbody th,.roster-scroll tfoot th{text-align:left;border-left:4px solid var(--store);padding:13px}.roster-scroll tbody th small{color:var(--muted);margin-top:4px;font-size:9px;display:block}.roster-scroll td{background:#fff;height:118px;padding:7px;position:relative}.roster-scroll td:hover{background:#f7faf8}.tags{flex-direction:column;gap:4px;display:flex}.tags span{border-radius:4px;padding:4px 6px;font-size:10px;font-weight:700}.need{color:#a45139;position:absolute;bottom:5px;right:5px}.under{background:linear-gradient(135deg,#fff 80%,#fbebe5)!important}.leave-tags span{font-size:9px}.roster-scroll tfoot td{height:80px}.mobile-date,.print-title{display:none}.modal-back{z-index:50;background:#0d211c99;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{background:#fff;border-radius:14px;width:min(500px,100%);max-height:88vh;padding:26px;position:relative;overflow:auto;box-shadow:0 20px 60px #0004}.modal h2{margin:0;font-size:26px}.modal>p:not(.eyebrow){color:var(--muted);margin:4px 0 18px}.close{background:#eff3f1;border:0;border-radius:50%;width:32px;height:32px;font-size:20px;position:absolute;top:16px;right:16px}.tabs{background:#eef2f0;border-radius:8px;margin-bottom:14px;padding:4px;display:flex}.tabs button{background:0 0;border:0;border-radius:6px;flex:1;padding:8px}.tabs button.active{background:#fff;box-shadow:0 1px 4px #0001}.modal label{gap:5px;font-size:11px;font-weight:700;display:grid}.search{border:1px solid var(--line);border-radius:8px;width:100%;margin:12px 0;padding:11px}.employee-list{gap:5px;display:grid}.employee-list>button{border:1px solid var(--line);text-align:left;background:#fff;border-radius:8px;align-items:center;gap:10px;padding:9px;display:flex}.employee-list>button:hover{border-color:#719286}.employee-list>button:disabled{opacity:.5}.employee-list>button>span:nth-child(2){flex:1}.employee-list b,.employee-list small{display:block}.employee-list small{color:var(--muted);margin-top:2px;font-size:10px}.employee-list em{color:#8a4432;font-size:10px;font-style:normal}.employee-list .recommend{color:#26704f;background:#e2f0e8;border-radius:4px;padding:3px 6px}.employee-form{background:#f5f7f6;border-radius:8px;grid-template-columns:1fr 1fr 120px auto;gap:8px;margin-bottom:15px;padding:12px;display:grid}.employee-form input,.employee-form select{border:1px solid var(--line);border-radius:7px;padding:9px}.employee-table{grid-template-columns:repeat(2,1fr);gap:8px;display:grid}.employee-table article{border:1px solid var(--line);border-radius:9px;align-items:center;gap:11px;padding:11px;display:flex}.employee-table article>div{flex:1}.employee-table b,.employee-table small{display:block}.employee-table small{color:var(--muted);margin-top:3px}.employee-table button{color:#7a5148;background:0 0;border:0}.employee-table .inactive{opacity:.48}.store-pill{background:#edf2ef;border-radius:20px;padding:4px 7px;font-size:10px;font-weight:800}.stats-table{overflow:auto}.stat-row{border-bottom:1px solid var(--line);grid-template-columns:1.2fr repeat(4,.55fr) 2fr;align-items:center;min-width:720px;padding:12px;font-size:13px;display:grid}.stat-row.head{color:var(--muted);text-transform:uppercase;letter-spacing:.08em;background:#f5f7f6;font-size:10px}.audit-list article{border-bottom:1px solid var(--line);gap:12px;padding:14px 0;display:flex}.audit-icon{background:#edf2ef;border-radius:8px;place-items:center;width:32px;height:32px;display:grid}.audit-list p{margin:5px 0;font-size:12px}.audit-list small,.empty,.center{color:var(--muted)}.login-shell{background:radial-gradient(circle at 20% 15%,#dceae2 0,#0000 28%),#f2f5f3;place-items:center;min-height:100vh;display:grid}.login-card{border:1px solid var(--line);background:#fff;border-radius:16px;width:min(430px,100% - 36px);padding:36px;box-shadow:0 18px 60px #173f3515}.login-card .brand-mark{margin-bottom:22px}.login-card h1{margin:0;font-size:28px}.muted{color:var(--muted);line-height:1.6}.login-card form{gap:15px;margin-top:25px;display:grid}.login-card label{gap:6px;font-size:12px;font-weight:700;display:grid}.login-card input{border:1px solid var(--line);border-radius:8px;padding:12px}.login-card .primary{background:var(--green);color:#fff;border-color:var(--green);padding:12px}.secure-note{border-top:1px solid var(--line);color:var(--muted);margin-top:20px;padding-top:16px;font-size:10px}.error{color:var(--danger);font-size:12px}.toast{z-index:100;background:#fff;border:1px solid #eabdb8;border-radius:9px;align-items:center;gap:9px;padding:12px 14px;display:flex;position:fixed;top:18px;right:24px;box-shadow:0 10px 30px #0002}.toast button{background:0 0;border:0;font-size:18px}.save-state{color:#fff;z-index:101;background:#173f35;border-radius:20px;padding:8px 13px;font-size:11px;position:fixed;bottom:20px;right:26px}.save-state.bad{background:#9e3f37}.center{justify-content:center;align-items:center;gap:10px;min-height:100vh;display:flex}.loader{border:2px solid #b9cbc4;border-top-color:#173f35;border-radius:50%;width:18px;height:18px;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}@media (width<=800px){.app{display:block}.app aside{z-index:30;background:#132b25;width:auto;height:66px;padding:6px;position:fixed;inset:auto 0 0}.aside-brand,.aside-foot{display:none}nav{justify-content:space-around;display:flex}nav button{text-align:center;flex-direction:column;gap:1px;padding:7px 6px;font-size:9px}nav i{font-size:17px}.main{padding:20px 14px 88px}.main>header{align-items:flex-start}.main h1{font-size:21px}.header-actions .status{display:none}.header-actions select{max-width:135px}.hero{padding:22px;display:block}.hero h2{font-size:22px}.hero-actions{margin-top:20px}.metric-grid{grid-template-columns:repeat(2,1fr)}.coverage{grid-template-columns:1fr}.quick div{grid-template-columns:1fr 1fr;display:grid}.roster-panel{padding:10px}.toolbar{align-items:flex-start;gap:8px}.toolbar div{flex-wrap:wrap}.toolbar span{display:none}.mobile-date{background:#f2f5f3;border-radius:9px;justify-content:space-between;align-items:center;margin-bottom:8px;padding:6px;display:flex}.mobile-date button{background:#fff;border:0;border-radius:6px;padding:9px 15px}.mobile-date div{text-align:center}.mobile-date small,.mobile-date b{display:block}.mobile-date small{color:var(--muted);font-size:9px}.roster-scroll{border:0;max-height:none;overflow:visible}.roster-scroll table{width:100%;min-width:0;display:block}.roster-scroll thead{display:none}.roster-scroll tbody,.roster-scroll tfoot{display:block}.roster-scroll tbody tr,.roster-scroll tfoot tr{grid-template-columns:1fr;display:grid}.roster-scroll tbody th,.roster-scroll tfoot th{border-top:4px solid var(--store);border-left:0;border-radius:8px 8px 0 0;width:100%;position:static}.roster-scroll tbody td,.roster-scroll tfoot td{border:1px solid var(--line);border-top:0;border-radius:0 0 8px 8px;height:auto;min-height:82px;margin-bottom:10px;display:none}.roster-scroll td.mobile-current{display:block}.roster-scroll tfoot th{border-top-color:#d6ded9}.employee-form,.employee-table{grid-template-columns:1fr}.panel{padding:16px}.panel-title{align-items:flex-start}.modal{padding:22px}.stats-table{margin:0 -16px}.toast{top:12px;left:14px;right:14px}.save-state{bottom:80px}.coverage article{min-height:auto}}.new-month-button{border:1px solid #b9d0c4;border-radius:8px;padding:9px 12px}.month-fields{grid-template-columns:1fr 1fr;gap:10px;margin:18px 0;display:grid}.month-fields input,.month-fields select{border:1px solid var(--line);background:#fff;border-radius:8px;width:100%;padding:10px}.creation-options{gap:8px;display:grid}.creation-options>label{border:1px solid var(--line);cursor:pointer;border-radius:9px;align-items:center;gap:11px;padding:12px;display:flex}.creation-options>label.selected{background:#f0f7f3;border-color:#5e8979}.creation-options>label.disabled{opacity:.5;cursor:not-allowed}.creation-options input{accent-color:var(--green)}.creation-options span,.copy-leaves span,.creation-options b,.creation-options small,.copy-leaves b,.copy-leaves small{display:block}.creation-options small,.copy-leaves small{color:var(--muted);margin-top:3px;font-weight:400}.copy-leaves{background:#f7f9f8;border-radius:9px;align-items:center;gap:11px;margin-top:12px;padding:12px;display:flex!important}.copy-leaves input{accent-color:var(--green)}.modal-actions{justify-content:flex-end;gap:8px;margin-top:20px;display:flex}.modal-actions button{border:1px solid var(--line);background:#fff;border-radius:8px;padding:10px 15px;font-weight:700}.modal-actions .primary{background:var(--green);border-color:var(--green);color:#fff}.modal-actions button:disabled{opacity:.55;cursor:wait}@media (width<=800px){.main>header{gap:10px}.header-actions{flex-direction:column;align-items:flex-end}.new-month-button{padding:7px 9px;font-size:11px}.month-fields{grid-template-columns:1fr}.modal-actions{grid-template-columns:1fr 1fr;display:grid}.modal-actions button{width:100%}}.employee-form{grid-template-columns:1fr 1fr 100px 150px 100px auto}.employee-position{border:1px solid var(--line);background:#fff;border-radius:7px;max-width:145px;padding:7px;font-size:11px}.employee-position:disabled{opacity:.55}.employee-table article>button:disabled{opacity:.4;cursor:not-allowed}.coverage .coverage-breakdown{color:var(--muted);margin:10px 0 8px;font-size:10px;font-weight:700;display:block}.coverage article em{display:inline-block}.roster-scroll .need{text-align:right;max-width:88px;font-size:9px;font-weight:700;line-height:1.35}.print-calendar{display:none}.employee-choice-row{gap:6px;display:flex}.employee-choice{border:1px solid var(--line);text-align:left;background:#fff;border-radius:8px;flex:1;align-items:center;gap:10px;min-width:0;padding:9px;display:flex}.employee-choice:hover{border-color:#719286}.employee-choice:disabled{opacity:.5}.employee-choice>span:nth-child(2){flex:1}.leave-remove{color:#94463b;background:#fff7f5;border:1px solid #ecc9c2;border-radius:8px;flex:none;padding:0 11px;font-size:10px;font-weight:800}.leave-remove:hover{background:#fbe8e4}.new-employee-quota{border:1px solid var(--line);white-space:nowrap;background:#fff;border-radius:7px;align-items:center;gap:6px!important;padding:0 8px!important;display:flex!important}.new-employee-quota span{color:var(--muted);font-size:10px}.new-employee-quota input{border:0!important;width:42px!important;padding:8px 0!important}.employee-off-quota{text-align:center;color:var(--muted);gap:3px;font-size:9px;display:grid}.employee-off-quota input{border:1px solid var(--line);text-align:center;border-radius:7px;width:58px;padding:7px}.employee-off-quota input:disabled{opacity:.5}@media (width<=800px){.employee-form{grid-template-columns:1fr}.employee-position{max-width:125px}.employee-table article{flex-wrap:wrap}.employee-table article>div{min-width:130px}}@media print{@page{size:A4 landscape;margin:7mm}body{background:#fff}.app aside,.main>header,.toolbar,.mobile-date,.toast,.save-state,.need{display:none!important}.app,.main{padding:0;display:block}.panel{box-shadow:none;border:0;padding:0}.roster-scroll{border:1px solid #999;max-height:none;overflow:visible}.roster-scroll table{width:100%;min-width:0;font-size:7px}.roster-scroll thead{display:table-header-group}.roster-scroll tbody{display:table-row-group}.roster-scroll tfoot{display:table-footer-group}.roster-scroll tbody tr,.roster-scroll tfoot tr{display:table-row}.roster-scroll thead th,.roster-scroll tbody th,.roster-scroll tfoot th{padding:3px;min-width:0!important;position:static!important}.roster-scroll td,.roster-scroll tbody td,.roster-scroll tfoot td{border-radius:0;height:65px;min-height:0;margin:0;padding:2px;display:table-cell!important}.tags{gap:1px}.tags span{padding:2px;font-size:6px}.print-title{justify-content:space-between;align-items:end;margin-bottom:5px;display:flex!important}.print-title h1{font-size:16px}.print-title p{font-size:7px}@page{size:A4 landscape;margin:6mm}html,body{-webkit-print-color-adjust:exact;print-color-adjust:exact;width:285mm;height:198mm;overflow:hidden}.roster-panel>.roster-scroll{display:none!important}.print-calendar{color:#17231f;width:100%;height:196mm;display:block!important}.print-calendar>header{border-bottom:1.5px solid #173f35;justify-content:space-between;align-items:flex-end;height:13mm;padding:0 1mm 2mm;display:flex}.print-calendar header p{letter-spacing:.12em;color:#63716b;margin:0 0 1mm;font-size:5.5pt}.print-calendar header h1{margin:0;font-size:15pt;line-height:1}.print-legend{gap:3mm;font-size:6pt;font-weight:700;display:flex}.print-legend span{align-items:center;gap:1mm;display:flex}.print-legend i{border-radius:50%;width:2.2mm;height:2.2mm;display:block}.calendar-grid{border-top:1px solid #87928e;border-left:1px solid #87928e;grid-template-rows:6mm;grid-template-columns:repeat(7,minmax(0,1fr));grid-auto-rows:1fr;height:176mm;display:grid}.calendar-weekday{letter-spacing:.1em;background:#e7eeea;border-bottom:1px solid #87928e;border-right:1px solid #87928e;justify-content:center;align-items:center;font-size:6pt;font-weight:800;display:flex}.calendar-day{background:#fff;border-bottom:1px solid #87928e;border-right:1px solid #87928e;min-width:0;padding:1.2mm;overflow:hidden}.calendar-day.calendar-weekend{background:#f4f7f5}.calendar-day.empty-day{background:#eef2f0}.calendar-date{border-bottom:1px solid #d7dedb;justify-content:space-between;align-items:baseline;margin-bottom:.8mm;padding-bottom:.5mm;display:flex}.calendar-date b{font-size:9pt}.calendar-date small{color:#65736d;font-size:5pt}.calendar-stores{gap:.35mm;display:grid}.calendar-stores>div{grid-template-columns:8mm 1fr;align-items:start;gap:1mm;font-size:5.6pt;line-height:1.2;display:grid}.calendar-stores b{border-left:2px solid;padding-left:1mm}.calendar-stores span{overflow-wrap:anywhere;min-width:0}.calendar-leave,.calendar-note{border-radius:1mm;margin-top:.7mm;padding:.6mm 1mm;font-size:5pt;line-height:1.2}.calendar-leave{color:#78402f;background:#f7e6dc}.calendar-note{color:#52605a;background:#eef1ef}.print-calendar>footer{color:#6b7772;justify-content:space-between;align-items:flex-end;height:5mm;font-size:5pt;display:flex}.calendar-staff-groups{gap:0;display:grid}.calendar-role-head,.calendar-role-row{grid-template-columns:minmax(0,2fr) minmax(11mm,1fr);display:grid}.calendar-role-head{margin-bottom:.35mm;font-size:3.8pt;line-height:1}.calendar-role-head b{color:#58655f;letter-spacing:.04em;background:#eef2f0;padding:.55mm 1mm}.calendar-role-head b:last-child{color:#91483f;text-align:center;background:#fff1ef;border:1px solid #d98b86;border-bottom:0;padding-left:.4mm;padding-right:.4mm}.calendar-role-row{min-width:0;font-size:5.2pt;line-height:1.15}.calendar-store-staff{grid-template-columns:7mm minmax(0,1fr);gap:.6mm;min-width:0;padding:.3mm 0;display:grid}.calendar-store-staff b{border-left:2px solid;padding-left:.8mm}.calendar-store-staff span,.calendar-optometrist-staff{overflow-wrap:anywhere;min-width:0}.calendar-optometrist-staff{color:#6f3934;background:#fff9f8;border-left:1px solid #d98b86;border-right:1px solid #d98b86;padding:.3mm .7mm}.calendar-role-row:last-child .calendar-optometrist-staff{border-bottom:1px solid #d98b86}.calendar-leave{border-radius:.8mm;margin-top:.6mm;padding:.55mm .9mm;font-size:4.8pt;line-height:1.15}.calendar-regular-leave{color:#35558a;background:#edf3ff;border-left:2px solid #4d7fd1}.calendar-other-leave{color:#356645;background:#eef8f0;border-left:2px solid #4b9a63}.calendar-note{margin-top:.5mm;padding:.5mm .8mm;font-size:4.6pt}}
