  :root{
    --ink:#1C1C1E;
    --red:#A6192E;
    --red-dark:#7A1222;
    --paper:#F4F4F2;
    --line:#E2DFD8;
    --muted:#7A7873;
    --green:#2F7A4B;
    --green-bg:#E6F2EA;
    --amber:#B9790C;
    --amber-bg:#FBEFDD;
    --blue:#33627F;
    --blue-bg:#E4EEF3;
    --gray:#726F68;
    --gray-bg:#EAE8E2;
  }
  *{box-sizing:border-box}
  body{margin:0}
  .bniAtt{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;color:var(--ink);max-width:820px;margin:0 auto;padding:0 0 40px;background:#fff}
  .bniAtt .band{background:var(--red);color:#fff;padding:22px 28px;border-radius:10px 10px 0 0}
  .bniAtt .eyebrow{font-size:11px;letter-spacing:.14em;text-transform:uppercase;opacity:.85;font-weight:600}
  .bniAtt h1{font-size:23px;font-weight:800;margin:6px 0 0;letter-spacing:-.01em}
  .bniAtt .tabs{display:flex;border:1px solid var(--line);border-top:none;background:var(--paper)}
  .bniAtt .tab{flex:1;text-align:center;padding:12px;font-size:13px;font-weight:700;color:var(--muted);cursor:pointer;border-bottom:3px solid transparent}
  .bniAtt .tab.active{color:var(--ink);border-bottom-color:var(--red);background:#fff}
  .bniAtt .panel{border:1px solid var(--line);border-top:none;padding:24px 28px}

  .bniAtt .field{margin-bottom:18px}
  .bniAtt .field label{display:block;font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px;font-weight:700}
  .bniAtt .field label .opt{text-transform:none;font-weight:400;letter-spacing:0;color:var(--muted);opacity:.8}
  .bniAtt .field input[type=text],.bniAtt .field input[type=date],.bniAtt .field input[type=password]{width:100%;border:1px solid var(--line);border-radius:8px;padding:11px 12px;font-size:14.5px;background:#fff}
  .bniAtt .field input:focus{outline:none;border-color:var(--red)}
  .bniAtt .field input.invalid{border-color:var(--red);background:#FCEFEF}
  .bniAtt .statusGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .bniAtt .statusGrid.invalid .statusBtn{border-color:var(--red)}
  .bniAtt .statusBtn{border:1.5px solid var(--line);background:#fff;border-radius:8px;padding:12px;font-size:13.5px;font-weight:700;cursor:pointer;color:var(--muted);text-align:left}
  .bniAtt .statusBtn[data-status=hadir].active{background:var(--green-bg);border-color:var(--green);color:var(--green)}
  .bniAtt .statusBtn[data-status=medical].active{background:var(--amber-bg);border-color:var(--amber);color:var(--amber)}
  .bniAtt .statusBtn[data-status=substitute].active{background:var(--blue-bg);border-color:var(--blue);color:var(--blue)}
  .bniAtt .statusBtn[data-status=absent].active{background:var(--gray-bg);border-color:var(--gray);color:var(--gray)}
  .bniAtt .errText{color:var(--red);font-size:12px;margin-top:6px;display:none}
  .bniAtt .errText.show{display:block}
  .bniAtt .submitBtn{width:100%;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:13px;font-size:14.5px;font-weight:700;cursor:pointer;margin-top:6px}
  .bniAtt .submitBtn:hover{background:var(--red-dark)}
  .bniAtt .confirm{background:var(--green-bg);border-radius:8px;padding:14px;margin-top:16px;display:none}
  .bniAtt .confirm.show{display:block}
  .bniAtt .confirm.error{background:#FCEFEF;border:1px solid var(--red)}
  .bniAtt .confirm .ok{color:var(--green);font-size:13.5px;font-weight:700;margin-bottom:10px}
  .bniAtt .confirm.error .ok{color:var(--red)}
  .bniAtt .confirm pre{background:#fff;border:1px solid var(--line);border-radius:8px;padding:10px 12px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;font-size:13px;white-space:pre-wrap;margin:0 0 10px;color:var(--ink)}
  .bniAtt .copyBtn{border:1px solid var(--green);background:#fff;color:var(--green);border-radius:7px;padding:9px 14px;font-size:13px;font-weight:700;cursor:pointer}
  .bniAtt .copyBtn:hover{background:var(--green-bg)}
  .bniAtt .copyBtn.copied{background:var(--green);color:#fff}

  .bniAtt .summary{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin-bottom:18px}
  .bniAtt .chip{border-radius:8px;padding:10px 12px;text-align:center;cursor:pointer;user-select:none;transition:all .18s ease;border:2px solid transparent;position:relative}
  .bniAtt .chip:hover{transform:translateY(-1px);filter:brightness(0.96)}
  .bniAtt .chip:active{transform:translateY(0)}
  .bniAtt .summary.has-filter .chip{opacity:.45}
  .bniAtt .summary.has-filter .chip.active{opacity:1;border-color:currentColor;box-shadow:0 3px 10px rgba(0,0,0,.12);transform:scale(1.02)}
  .bniAtt .chip .n{font-size:22px;font-weight:800;line-height:1.1}
  .bniAtt .chip .l{font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-top:2px}
  .bniAtt .chip.hadir{background:var(--green-bg);color:var(--green)}
  .bniAtt .chip.medical{background:var(--amber-bg);color:var(--amber)}
  .bniAtt .chip.substitute{background:var(--blue-bg);color:var(--blue)}
  .bniAtt .chip.absent{background:var(--gray-bg);color:var(--gray)}
  .bniAtt table{width:100%;border-collapse:collapse;font-size:13px}
  .bniAtt thead th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:8px 6px;border-bottom:2px solid var(--ink)}
  .bniAtt tbody tr{border-bottom:1px solid var(--line)}
  .bniAtt tbody td{padding:8px 6px;vertical-align:top}
  .bniAtt .badge{display:inline-block;border-radius:999px;padding:3px 9px;font-size:11.5px;font-weight:700}
  .bniAtt .badge.hadir{background:var(--green-bg);color:var(--green)}
  .bniAtt .badge.medical{background:var(--amber-bg);color:var(--amber)}
  .bniAtt .badge.substitute{background:var(--blue-bg);color:var(--blue)}
  .bniAtt .badge.absent{background:var(--gray-bg);color:var(--gray)}
  .bniAtt .empty{color:var(--muted);font-size:13px;text-align:center;padding:24px 0}
  .bniAtt .adminActions{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;gap:10px;flex-wrap:wrap}
  .bniAtt .btn{border:1px solid var(--line);background:#fff;border-radius:7px;padding:9px 14px;font-size:13px;font-weight:600;cursor:pointer;color:var(--ink)}
  .bniAtt .btn:hover{border-color:var(--ink)}
  .bniAtt .dateRow{display:flex;align-items:center;gap:10px}
  .bniAtt .dateRow label{font-size:12px;color:var(--muted);font-weight:700;text-transform:uppercase;letter-spacing:.05em}
  .bniAtt .dateRow input{border:1px solid var(--line);border-radius:7px;padding:8px 10px;font-size:13.5px}
  .bniAtt .gateWrap{max-width:320px;margin:20px auto;text-align:center}
  .bniAtt .gateWrap .lock{font-size:13px;color:var(--muted);margin-bottom:14px}
  .bniAtt .gateWrap input{width:100%;border:1px solid var(--line);border-radius:8px;padding:11px 12px;font-size:14.5px;text-align:center;margin-bottom:10px}
  .bniAtt .gateWrap input.invalid{border-color:var(--red);background:#FCEFEF}
  .bniAtt .gateWrap button{width:100%;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:12px;font-size:13.5px;font-weight:700;cursor:pointer}
  .bniAtt .gateWrap button:hover{background:var(--red-dark)}
  .bniAtt .gateErr{color:var(--red);font-size:12px;margin-top:8px;display:none;font-weight:600}
  .bniAtt .gateErr.show{display:block}
  @media print{
    .bniAtt .tabs,.bniAtt .adminActions,.bniAtt form,.bniAtt .confirm{display:none}
  }

  /* Added for deployment: members open this from a phone link. Desktop
     rendering is unchanged — this only trims horizontal padding on narrow
     screens so the form does not run into the edge. */
  @media (max-width:480px){
    .bniAtt .band{padding:18px 16px}
    .bniAtt .panel{padding:20px 16px}
    .bniAtt .summary{gap:6px}
    .bniAtt .chip{padding:10px 6px}
    .bniAtt .chip .n{font-size:19px}
    .bniAtt .chip .l{font-size:10px}
  }

  /* ---- Jadwal blokir (weekly site blocking) ---- */
  .bniAtt .blockNotice{display:none;border:1px solid var(--amber);background:var(--amber-bg);border-radius:8px;padding:22px 20px;text-align:center}
  .bniAtt .blockNotice.show{display:block}
  .bniAtt .blockNotice .bTitle{color:var(--amber);font-size:15px;font-weight:800;margin-bottom:8px}
  .bniAtt .blockNotice .bMsg{color:var(--ink);font-size:14px;line-height:1.5;white-space:pre-wrap}
  .bniAtt .blockNotice .bMeta{color:var(--muted);font-size:12px;margin-top:12px}
  .bniAtt .adminBanner{display:none;border:1px solid var(--amber);background:var(--amber-bg);color:var(--amber);border-radius:8px;padding:10px 12px;font-size:12.5px;font-weight:700;margin-bottom:16px}
  .bniAtt .adminBanner.show{display:block}

  .bniAtt .section{margin-top:30px;padding-top:22px;border-top:2px solid var(--ink)}
  .bniAtt .section h2{font-size:14px;font-weight:800;margin:0 0 4px;letter-spacing:-.01em}
  .bniAtt .section .hint{font-size:12px;color:var(--muted);margin-bottom:14px;line-height:1.5}
  .bniAtt .schedForm{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:8px}
  .bniAtt .schedForm select,.bniAtt .schedForm input{width:100%;border:1px solid var(--line);border-radius:8px;padding:9px 10px;font-size:13.5px;background:#fff;color:var(--ink);font-family:inherit}
  .bniAtt .schedForm select:focus,.bniAtt .schedForm input:focus,.bniAtt .schedMsg:focus{outline:none;border-color:var(--red)}
  .bniAtt .schedMsg{width:100%;border:1px solid var(--line);border-radius:8px;padding:10px 12px;font-size:13.5px;line-height:1.55;background:#fff;color:var(--ink);font-family:inherit;resize:vertical;min-height:110px;display:block}
  .bniAtt .schedErr{color:var(--red);font-size:12px;margin:0 0 8px;display:none;font-weight:600}
  .bniAtt .schedErr.show{display:block}
  .bniAtt .schedTable td .msgCell{color:var(--muted);font-size:12.5px}
  .bniAtt .rowActions{display:flex;gap:6px;justify-content:flex-end}
  .bniAtt .btnMini{border:1px solid var(--line);background:#fff;border-radius:6px;padding:5px 9px;font-size:11.5px;font-weight:700;cursor:pointer;color:var(--muted);font-family:inherit}
  .bniAtt .btnMini:hover{border-color:var(--ink);color:var(--ink)}
  .bniAtt .btnMini.danger:hover{border-color:var(--red);color:var(--red)}
  .bniAtt .pill{display:inline-block;border-radius:999px;padding:3px 9px;font-size:11.5px;font-weight:700}
  .bniAtt .pill.on{background:var(--green-bg);color:var(--green)}
  .bniAtt .pill.off{background:var(--gray-bg);color:var(--gray)}
  @media (max-width:480px){
    .bniAtt .schedForm{grid-template-columns:1fr;gap:10px}
    .bniAtt .schedPair{grid-template-columns:1fr}
  }
  @media print{
    .bniAtt .section,.bniAtt .adminBanner{display:none}
  }

  /* ---- Multi-line / rich-text block message ---- */
  .bniAtt .msgTools{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin:6px 0 10px;flex-wrap:wrap}
  .bniAtt .msgHint{font-size:11.5px;color:var(--muted);line-height:1.6}
  .bniAtt .msgCount{font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
  .bniAtt .msgCount.over{color:var(--red);font-weight:700}
  .bniAtt .msgPreview{border:1px dashed var(--line);border-radius:8px;padding:14px 16px;margin-bottom:12px;background:var(--paper)}
  .bniAtt .previewLabel{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:700;margin-bottom:8px}
  .bniAtt .msgHint code,.bniAtt .bMsg code{background:var(--gray-bg);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.92em}
  .bniAtt .bMsg strong{font-weight:800}
  .bniAtt .bMsg em{font-style:italic}
  .bniAtt .bMsg a{color:var(--red);text-decoration:underline}
  /* Mirror the real notice exactly, so the preview is trustworthy: the
     pre-wrap that preserves line breaks lives on .blockNotice .bMsg. */
  .bniAtt .msgPreview .bMsg{text-align:center;color:var(--ink);font-size:14px;line-height:1.5;white-space:pre-wrap}
  /* Keep a long message from stretching the schedule table. */
  .bniAtt .schedTable td .msgCell{display:block;white-space:pre-wrap;max-height:4.6em;overflow:hidden;line-height:1.5}

  /* ---- Multi-day block windows (start day/time -> end day/time) ---- */
  .bniAtt .schedCol{display:flex;flex-direction:column;gap:5px;min-width:0}
  .bniAtt .schedColLabel{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:700}
  .bniAtt .schedPair{display:grid;grid-template-columns:1.15fr .85fr;gap:6px;min-width:0}
  .bniAtt .schedPair select,.bniAtt .schedPair input{min-width:0}
  .bniAtt .schedSpan{font-size:12px;color:var(--muted);margin:2px 0 10px;line-height:1.5}
  .bniAtt .schedSpan strong{color:var(--ink);font-weight:700}
  .bniAtt .schedSpan.warn{color:var(--red);font-weight:600}

  /* ---- Rekap admin: tambah & hapus data ---- */
  .bniAtt .actionGroup{display:flex;gap:8px;flex-wrap:wrap}
  .bniAtt .btn.primary{background:var(--ink);color:#fff;border-color:var(--ink)}
  .bniAtt .btn.primary:hover{background:var(--red-dark);border-color:var(--red-dark)}
  .bniAtt .btn.danger{background:var(--red);color:#fff;border-color:var(--red)}
  .bniAtt .btn.danger:hover{background:var(--red-dark);border-color:var(--red-dark)}
  .bniAtt .btn:disabled{opacity:.55;cursor:not-allowed}

  .bniAtt .addForm{border:1px solid var(--line);border-radius:8px;background:var(--paper);padding:16px;margin-bottom:16px}
  .bniAtt .addFormTitle{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-weight:700;margin-bottom:12px}
  .bniAtt .addFormTitle strong{color:var(--ink);text-transform:none;letter-spacing:0}
  .bniAtt .addGrid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  .bniAtt .addCol{display:flex;flex-direction:column;gap:5px;min-width:0}
  .bniAtt .addCol label{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:700}
  .bniAtt .addCol label .opt{text-transform:none;font-weight:400;letter-spacing:0;opacity:.8}
  .bniAtt .addCol input,.bniAtt .addCol select{width:100%;border:1px solid var(--line);border-radius:8px;padding:9px 10px;font-size:13.5px;background:#fff;color:var(--ink);font-family:inherit}
  .bniAtt .addCol input:focus,.bniAtt .addCol select:focus{outline:none;border-color:var(--red)}
  .bniAtt .addCol input.invalid{border-color:var(--red);background:#FCEFEF}
  .bniAtt .addHint{font-size:11.5px;color:var(--muted);margin-top:10px;line-height:1.5}
  .bniAtt .addErr{color:var(--red);font-size:12px;font-weight:600;margin-top:8px;display:none}
  .bniAtt .addErr.show{display:block}
  .bniAtt .addActions{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}

  .bniAtt th.colAction,.bniAtt td.colAction{width:1%;white-space:nowrap;text-align:right}

  /* Confirmation dialog — a real modal rather than window.confirm(), which
     blocks the page and cannot be styled. */
  .bniAtt .modalOverlay{position:fixed;inset:0;background:rgba(28,28,30,.55);display:flex;align-items:center;justify-content:center;padding:20px;z-index:50}
  .bniAtt .modalBox{background:#fff;border-radius:10px;max-width:400px;width:100%;padding:22px 24px;box-shadow:0 18px 50px rgba(0,0,0,.28)}
  .bniAtt .modalTitle{font-size:15px;font-weight:800;margin-bottom:8px}
  .bniAtt .modalBody{font-size:13.5px;color:var(--muted);line-height:1.55}
  .bniAtt .modalBody strong{color:var(--ink);font-weight:700}
  .bniAtt .modalErr{color:var(--red);font-size:12px;font-weight:600;margin-top:10px;display:none}
  .bniAtt .modalErr.show{display:block}
  .bniAtt .modalActions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}

  @media (max-width:480px){
    .bniAtt .addGrid{grid-template-columns:1fr}
  }
  @media print{
    .bniAtt .addForm,.bniAtt .modalOverlay,.bniAtt th.colAction,.bniAtt td.colAction{display:none}
  }

  /* ---- Master member & "belum isi" ---- */
  :root{--pending:#A6192E;--pending-bg:#FBEAEC}
  .bniAtt .chip.pending{background:var(--pending-bg);color:var(--pending)}
  .bniAtt .badge.pending{background:var(--pending-bg);color:var(--pending)}
  .bniAtt tr.pendingRow td{color:var(--muted)}
  .bniAtt tr.pendingRow td:first-child{color:var(--ink)}
  .bniAtt .countTag{display:inline-block;margin-left:6px;background:var(--gray-bg);color:var(--gray);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:700;vertical-align:middle}
  .bniAtt .memberAdd{display:flex;gap:8px;margin-bottom:10px}
  .bniAtt .memberAdd input{flex:1;min-width:0;border:1px solid var(--line);border-radius:8px;padding:9px 10px;font-size:13.5px;font-family:inherit}
  .bniAtt .memberAdd input:focus{outline:none;border-color:var(--red)}
  .bniAtt .savedHint{font-size:12px;color:var(--muted);margin-top:6px}
  .bniAtt .linkBtn{border:none;background:none;padding:0;margin-left:4px;font:inherit;font-weight:700;color:var(--red);cursor:pointer;text-decoration:underline}
  @media (max-width:480px){
    .bniAtt .summary{grid-template-columns:repeat(3,1fr)}
  }

  /* ---- Admin sub-tabs: Absensi / Master Member / Jadwal Blokir ---- */
  .bniAtt .subTabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:18px;overflow-x:auto}
  .bniAtt .subTab{border:none;background:none;padding:9px 14px;font:inherit;font-size:13px;font-weight:700;color:var(--muted);cursor:pointer;border-bottom:3px solid transparent;margin-bottom:-1px;white-space:nowrap}
  .bniAtt .subTab:hover{color:var(--ink)}
  .bniAtt .subTab.active{color:var(--ink);border-bottom-color:var(--red)}
  .bniAtt .subTab .countTag{margin-left:4px}
  /* Panes reuse .section for their headings and hints, minus the divider that
     separated them when they were stacked. */
  .bniAtt .subPane.section{margin-top:0;padding-top:0;border-top:none}
  @media (max-width:480px){
    .bniAtt .subTab{padding:9px 10px;font-size:12.5px}
  }
  @media print{
    .bniAtt .subTabs{display:none}
  }
