:root{--background:#ffffff;--foreground:#09090b;--card:#ffffff;--muted:#71717a;--muted-bg:#f4f4f5;--border:#e4e4e7;--primary:#5b21b6;--primary-hover:#501da0;--primary-foreground:#fafafa;--accent:#f5f2fb;--accent-foreground:#491a92;--ring:#5b21b6;--danger:#dc2626;--danger-bg:#fef2f2;--radius:8px;--shadow-sm:0 1px 2px 0 rgb(0 0 0/0.05);--in:#ad90da;--in-bg:#ebe4f6;--in-text:#491a92;--out:#4b1b95;--out-bg:#5b21b6;--out-text:#ffffff;--block:#a1a1aa;--block-bg:#f4f4f5;--block-text:#52525b;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--sans:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,Helvetica,Arial,sans-serif}*{box-sizing:border-box}body,html{margin:0;padding:0}body{background:var(--background);color:var(--foreground);font-family:var(--sans);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}a{color:inherit}:focus-visible{outline:2px solid var(--ring);outline-offset:2px;border-radius:4px}.shell{max-width:1040px;margin:0 auto;padding:0 20px}.site-header{background:rgba(255,255,255,.9);-webkit-backdrop-filter:saturate(180%) blur(8px);backdrop-filter:saturate(180%) blur(8px);border-bottom:1px solid var(--border);position:-webkit-sticky;position:sticky;top:0;z-index:10}.header-row{display:flex;align-items:center;justify-content:space-between;height:56px}.brand{display:inline-flex;align-items:center;gap:9px;font-weight:600;letter-spacing:-.01em;text-decoration:none;font-size:16px}.brand-mark{width:24px;height:24px;border-radius:6px;display:block}.login-wrap .brand-mark{width:32px;height:32px;border-radius:8px}.nav{display:flex;gap:20px}.nav a{text-decoration:none;color:var(--muted);font-size:14px;font-weight:500;padding:4px 0;border-bottom:2px solid transparent;transition:color .12s}.nav a.active,.nav a:hover{color:var(--foreground)}.nav a.active{border-bottom-color:var(--primary)}.page-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin:28px 0 16px;flex-wrap:wrap}h1{font-size:24px;margin:0;letter-spacing:-.02em}h1,h2{font-weight:600}h2{font-size:15px;margin:28px 0 10px;letter-spacing:-.01em}.sub{color:var(--muted);font-size:13px}.month-nav{display:flex;align-items:center;gap:8px}.month-nav a{text-decoration:none;border:1px solid var(--border);background:var(--card);border-radius:6px;padding:6px 12px;font-size:14px;box-shadow:var(--shadow-sm)}.month-nav a:hover{background:var(--accent)}.month-label{font-family:var(--mono);font-size:13px;min-width:96px;text-align:center}.cal-wrap{overflow-x:auto}.cal{display:grid;grid-template-columns:repeat(7,minmax(118px,1fr));background:var(--border);grid-gap:1px;gap:1px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;min-width:840px;box-shadow:var(--shadow-sm)}.cal-dow{background:var(--muted-bg);padding:6px 8px;font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.cal-day{background:var(--card);min-height:96px;padding:6px}.cal-day.dim{background:#fafafa}.cal-day.today{box-shadow:inset 0 0 0 2px var(--ring)}.cal-date{font-family:var(--mono);font-size:12px;color:var(--muted);margin-bottom:4px}.cal-day.today .cal-date{color:var(--primary);font-weight:700}.chip{display:block;text-decoration:none;border-radius:6px;padding:3px 7px;font-size:12px;line-height:1.3;margin-bottom:4px;border-left:3px solid transparent;overflow:hidden}.chip .t{font-family:var(--mono);font-size:11px;display:block;opacity:.85}.chip.in{background:var(--in-bg);color:var(--in-text);border-left-color:var(--in)}.chip.out{background:var(--out-bg);color:var(--out-text);border-left-color:#3b1576;font-weight:600}.chip.block{background:var(--block-bg);color:var(--block-text);border-left-color:#d4d4d8}.chip:hover{filter:brightness(.97)}.badge{display:inline-block;font-family:var(--mono);font-size:11px;font-weight:500;border-radius:9999px;padding:2px 8px;vertical-align:1px;border:1px solid transparent}.badge.in{background:var(--in-bg);color:var(--in-text)}.badge.out{background:var(--out-bg);color:var(--out-text)}.badge.cancelled{background:var(--danger-bg);color:var(--danger)}.badge.block,.badge.ical{background:var(--muted-bg);color:var(--block-text);border-color:var(--border)}.list{border:1px solid var(--border);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow-sm)}.row{display:flex;align-items:center;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border);text-decoration:none}.row:last-child{border-bottom:none}.row:hover{background:#fafafa}.row .date{width:92px;color:var(--muted)}.row .date,.row .time{font-family:var(--mono);font-size:13px}.row .time{width:76px}.row .who{flex:1 1}.row .meta{color:var(--muted);font-size:13px}.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow-sm)}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-gap:14px;gap:14px}.form-grid .full{grid-column:1/-1}label{display:block;font-size:13px;font-weight:500;color:var(--foreground);margin-bottom:6px}input,select,textarea{width:100%;height:36px;padding:6px 12px;border:1px solid var(--border);border-radius:6px;font:inherit;background:var(--background);color:var(--foreground);box-shadow:var(--shadow-sm)}input:focus-visible,select:focus-visible,textarea:focus-visible{outline:none;border-color:var(--ring);box-shadow:0 0 0 3px rgb(91 33 182/.2)}input::placeholder,textarea::placeholder{color:#a1a1aa}textarea{min-height:160px;height:auto;font-family:var(--mono);font-size:13px}.hint{font-size:12px;color:var(--muted);margin-top:6px}.btn{display:inline-flex;align-items:center;justify-content:center;height:36px;border:1px solid var(--primary);background:var(--primary);color:var(--primary-foreground);border-radius:6px;padding:0 16px;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;box-shadow:var(--shadow-sm);transition:background .12s,border-color .12s}.btn:hover{background:var(--primary-hover);border-color:var(--primary-hover)}.btn:disabled{opacity:.5;cursor:default}.btn.ghost{background:var(--card);color:var(--foreground);border-color:var(--border)}.btn.ghost:hover{background:var(--accent);border-color:var(--border)}.btn.danger{background:var(--card);color:var(--danger);border-color:#fecaca}.btn.danger:hover{background:var(--danger-bg);border-color:#fecaca}.actions{display:flex;gap:10px;align-items:center;margin-top:16px;flex-wrap:wrap}.notice{border-radius:6px;padding:10px 12px;font-size:14px;margin:12px 0;border:1px solid transparent}.notice.ok{background:var(--accent);color:var(--accent-foreground);border-color:#ded3f0}.notice.err{background:var(--danger-bg);color:var(--danger);border-color:#fecaca}.legend{display:flex;gap:14px;font-size:12px;color:var(--muted);margin:10px 0 24px}.legend .k{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:5px;vertical-align:-1px}.login-wrap{max-width:380px;margin:80px auto}.login-wrap h1{display:flex;align-items:center;gap:10px}.month-list{display:none}@media (max-width:700px){.header-row{flex-direction:column;align-items:flex-start;gap:4px;height:auto;padding-top:10px;padding-bottom:6px}.nav{width:100%;gap:18px;overflow-x:auto;white-space:nowrap;padding-bottom:2px;-webkit-overflow-scrolling:touch}.nav a{font-size:14px;padding:6px 0}.page-head{margin:16px 0 12px}.month-nav{flex-wrap:wrap;row-gap:8px}.month-nav a{padding:8px 14px}input,select,textarea{font-size:16px;height:40px}textarea{height:auto}.btn{height:40px;padding:0 16px}.form-grid{grid-template-columns:1fr}.cal-wrap{overflow:visible}.cal{min-width:0;grid-template-columns:repeat(7,minmax(0,1fr))}.cal-dow{padding:4px 2px;font-size:10px;text-align:center;letter-spacing:.04em}.cal-day{padding:4px 3px}.cal-day,.cal-day.dim{min-height:46px}.cal-date{font-size:11px;margin-bottom:2px}.chip{display:inline-block;width:9px;height:9px;padding:0;margin:2px 3px 0 0;border-radius:50%;border-left:none;font-size:0;line-height:0;color:transparent}.chip .t{display:none}.chip.in{background:var(--in)}.chip.out{background:var(--out)}.chip.block{background:var(--block)}.month-list{display:block;margin-top:12px}.row{flex-wrap:wrap;row-gap:4px;padding:12px 14px}.row .who{flex:1 1 100%}.row .date,.row .time{width:auto}.legend{flex-wrap:wrap;row-gap:6px}}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}