/* ==========================================================================
   COMPONENTS — nút, form, thẻ, bảng, modal, drawer, toast, tooltip, popover, tabs
   Sinh ra từ đợt refactor: chỉ di chuyển code, không đổi luật CSS nào.
   ========================================================================== */
/* --- 5. BUTTONS ----------------------------------------------------------- */
.btn{
  --btn-h:38px;
  position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-8);
  min-height:var(--btn-h);padding:0 14px;border-radius:var(--r-md);
  font-size:var(--fs-14);font-weight:500;line-height:1;letter-spacing:var(--tr-snug);
  border:1px solid transparent;background:var(--surface);color:var(--text);
  white-space:nowrap;cursor:pointer;
  transition:background var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease),
             color var(--dur-1) var(--ease),box-shadow var(--dur-1) var(--ease),opacity var(--dur-1);
}
.btn svg{width:16px;height:16px;}
.btn:active{transform:translateY(.5px);}

.btn-primary{background:var(--accent);color:var(--text-on-accent);box-shadow:var(--sh-xs);}
.btn-primary:hover{background:var(--accent-hover);}
.btn-primary:active{background:var(--accent-active);}

.btn-secondary{background:var(--surface);border-color:var(--border-strong);color:var(--text);box-shadow:var(--sh-xs);}
.btn-secondary:hover{background:var(--surface-hover);border-color:var(--border-stronger);}
.btn-secondary:active{background:var(--surface-active);}

.btn-outline{background:transparent;border-color:var(--accent-border);color:var(--accent-text);}
.btn-outline:hover{background:var(--accent-bg);border-color:var(--accent);}

.btn-ghost{background:transparent;color:var(--text-2);}
.btn-ghost:hover{background:var(--surface-hover);color:var(--text);}
.btn-ghost:active{background:var(--surface-active);}

.btn-danger{background:var(--danger);color:#fff;}
.btn-danger:hover{background:var(--danger-hover);}
:root[data-theme="dark"] .btn-danger{color:#1A0A0A;}

.btn-danger-quiet{background:transparent;border-color:var(--danger-border);color:var(--danger);}
.btn-danger-quiet:hover{background:var(--danger-bg);}

.btn-sm{--btn-h:32px;padding:0 10px;font-size:var(--fs-13);gap:6px;}
.btn-sm svg{width:14px;height:14px;}
.btn-lg{--btn-h:46px;padding:0 20px;font-size:var(--fs-15);border-radius:var(--r-lg);}
.btn-block{width:100%;}

.btn-icon{--btn-h:38px;width:var(--btn-h);padding:0;flex:0 0 auto;}
.btn-icon.btn-sm{--btn-h:32px;}
.btn-icon.btn-lg{--btn-h:46px;}

.btn:disabled,.btn[aria-disabled="true"]{opacity:.45;pointer-events:none;box-shadow:none;}

/* Loading: nhãn mờ đi, spinner chồng lên — nút không đổi kích thước. */
.btn.is-loading,.btn.loading{pointer-events:none;}
.btn.is-loading > *,.btn.loading > *{opacity:.25;}
.btn.is-loading::after,.btn.loading::after{
  content:"";position:absolute;width:16px;height:16px;border-radius:50%;
  border:2px solid currentColor;border-top-color:transparent;animation:dzt-spin .6s linear infinite;
}
@keyframes dzt-spin{to{transform:rotate(360deg);}}

.spinner{width:18px;height:18px;border-radius:50%;border:2px solid var(--border-strong);border-top-color:var(--accent);animation:dzt-spin .6s linear infinite;}

/* --- 6. FORMS ------------------------------------------------------------- */
.field{display:flex;flex-direction:column;gap:6px;}
.field > label,.label{font-size:var(--fs-13);font-weight:500;color:var(--text-2);}
.hint{font-size:var(--fs-12);color:var(--text-3);}
.field-msg{display:flex;align-items:flex-start;gap:6px;font-size:var(--fs-12);}
.field-msg svg{width:14px;height:14px;margin-top:2px;}
.field.is-error .field-msg{color:var(--danger);}
.field.is-success .field-msg{color:var(--success);}

.input,.textarea,.select{
  width:100%;min-height:40px;padding:9px 12px;
  background:var(--surface);color:var(--text);
  border:1px solid var(--border-strong);border-radius:var(--r-md);
  font-size:var(--fs-14);line-height:1.4;
  transition:border-color var(--dur-1) var(--ease),box-shadow var(--dur-1) var(--ease),background var(--dur-1);
}
.textarea{min-height:96px;resize:vertical;padding:10px 12px;}
.input::placeholder,.textarea::placeholder{color:var(--text-3);}
.input:hover,.textarea:hover,.select:hover{border-color:var(--border-stronger);}
.input:focus,.textarea:focus,.select:focus{
  outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--ring);
}
.input:disabled,.textarea:disabled,.select:disabled{background:var(--bg-sunken);color:var(--text-3);cursor:not-allowed;}
.field.is-error .input,.field.is-error .textarea,.input.is-error{border-color:var(--danger);}
.field.is-error .input:focus,.input.is-error:focus{box-shadow:0 0 0 3px var(--danger-bg);}
.field.is-success .input,.input.is-success{border-color:var(--success);}

.select{
  appearance:none;padding-right:34px;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23656F72' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center;background-size:15px;
}
:root[data-theme="dark"] .select{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23838E90' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
}

/* Ô nhập có icon hai bên */
.input-wrap{position:relative;display:flex;align-items:center;}
.input-wrap > svg{position:absolute;left:12px;width:16px;height:16px;color:var(--text-3);pointer-events:none;transition:color var(--dur-1);}
.input-wrap > .input{padding-left:38px;}
.input-wrap:focus-within > svg{color:var(--accent);}
.input-wrap .input-affix{position:absolute;right:6px;display:flex;align-items:center;}

/* Autofill: giữ nền và chữ đúng theme */
.input:-webkit-autofill,.input:-webkit-autofill:hover,.input:-webkit-autofill:focus{
  -webkit-text-fill-color:var(--text);
  -webkit-box-shadow:0 0 0 1000px var(--surface) inset;
  caret-color:var(--text);
  transition:background-color 9999s ease-out 0s;
}

/* Checkbox & radio — vẽ lại, giữ input thật để dùng được bàn phím */
.check,.radio{display:inline-flex;align-items:flex-start;gap:10px;cursor:pointer;user-select:none;font-size:var(--fs-14);color:var(--text-2);}
.check input,.radio input{position:absolute;opacity:0;width:0;height:0;}
.check .box,.radio .box{
  flex:0 0 auto;width:18px;height:18px;margin-top:1px;
  border:1.5px solid var(--border-stronger);background:var(--surface);
  display:grid;place-items:center;
  transition:background var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease);
}
.check .box{border-radius:var(--r-xs);}
.radio .box{border-radius:50%;}
.check .box svg{width:12px;height:12px;color:var(--text-on-accent);opacity:0;transform:scale(.7);transition:opacity var(--dur-1),transform var(--dur-2) var(--ease);stroke-width:2.75;}
.radio .box::after{content:"";width:8px;height:8px;border-radius:50%;background:var(--text-on-accent);opacity:0;transform:scale(.5);transition:opacity var(--dur-1),transform var(--dur-2) var(--ease);}
.check:hover .box,.radio:hover .box{border-color:var(--accent);}
.check input:checked + .box,.radio input:checked + .box{background:var(--accent);border-color:var(--accent);}
.check input:checked + .box svg,.radio input:checked + .box::after{opacity:1;transform:scale(1);}
.check input:focus-visible + .box,.radio input:focus-visible + .box{outline:2px solid var(--accent);outline-offset:2px;}
.check input:disabled ~ *,.radio input:disabled ~ *{opacity:.5;}

/* Nhóm nút chọn (segmented control) — dùng cho bộ lọc */
.seg{display:inline-flex;gap:2px;padding:3px;background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r-md);}
.seg button{
  padding:6px 12px;border-radius:var(--r-sm);font-size:var(--fs-13);font-weight:500;color:var(--text-2);
  white-space:nowrap;transition:background var(--dur-1),color var(--dur-1);
}
.seg button:hover{color:var(--text);background:var(--surface-hover);}
.seg button.active{background:var(--surface);color:var(--text);box-shadow:var(--sh-xs);}

/* --- 7. CARD -------------------------------------------------------------- */
.card{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);
}
.card-hover{transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease);}
.card-hover:hover{border-color:var(--border-stronger);box-shadow:var(--sh-md);}
.card-head{padding:var(--sp-20) var(--sp-20) 0;display:flex;align-items:flex-start;gap:var(--sp-12);}
.card-title{font-size:var(--fs-15);font-weight:600;letter-spacing:var(--tr-snug);}
.card-sub{font-size:var(--fs-13);color:var(--text-3);margin-top:2px;}
.card-body{padding:var(--sp-20);}
.card-foot{padding:var(--sp-16) var(--sp-20);border-top:1px solid var(--border);}

/* --- 8. BADGE / CHIP / AVATAR --------------------------------------------- */
.badge{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 8px;border-radius:var(--r-full);
  font-size:var(--fs-11);font-weight:600;line-height:1.5;letter-spacing:.01em;
  border:1px solid var(--border);background:var(--bg-subtle);color:var(--text-2);white-space:nowrap;
}
.badge .dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:0 0 auto;}
.badge-accent{background:var(--accent-bg);border-color:var(--accent-border);color:var(--accent-text);}
.badge-success{background:var(--success-bg);border-color:var(--success-border);color:var(--success);}
.badge-warning{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning);}
.badge-danger{background:var(--danger-bg);border-color:var(--danger-border);color:var(--danger);}
.badge-square{border-radius:var(--r-sm);}

.avatar{
  flex:0 0 auto;width:36px;height:36px;border-radius:50%;
  display:grid;place-items:center;
  background:var(--accent-bg);color:var(--accent-text);
  border:1px solid var(--accent-border);
  font-size:var(--fs-14);font-weight:600;text-transform:uppercase;overflow:hidden;
}
.avatar-sm{width:28px;height:28px;font-size:var(--fs-12);}
.avatar-lg{width:44px;height:44px;font-size:var(--fs-16);}
.avatar-admin{background:color-mix(in srgb,var(--v-500) 12%,transparent);border-color:color-mix(in srgb,var(--v-500) 32%,transparent);color:var(--v-500);}

/* --- 9. PROGRESS ---------------------------------------------------------- */
.progress{height:6px;background:var(--bg-sunken);border-radius:var(--r-full);overflow:hidden;}
.progress > span{display:block;height:100%;width:0;background:var(--accent);border-radius:var(--r-full);transition:width var(--dur-4) var(--ease);}
.progress-xs{height:4px;}
.progress-lg{height:8px;}
.progress-success > span{background:var(--success);}

/* --- 10. SKELETON --------------------------------------------------------- */
.skeleton{
  background:var(--bg-sunken);border-radius:var(--r-sm);
  animation:dzt-pulse 1.4s var(--ease-in-out) infinite;
}
@keyframes dzt-pulse{0%,100%{opacity:1;}50%{opacity:.55;}}
.skeleton-text{height:12px;}
.skeleton-line + .skeleton-line{margin-top:8px;}

/* --- 11. EMPTY STATE ------------------------------------------------------ */
.empty{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:var(--sp-64) var(--sp-24);gap:var(--sp-4);
}
.empty-icon{
  width:44px;height:44px;border-radius:var(--r-lg);display:grid;place-items:center;
  background:var(--bg-sunken);color:var(--text-3);margin-bottom:var(--sp-12);
}
.empty-icon svg{width:20px;height:20px;}
.empty-title{font-size:var(--fs-15);font-weight:600;color:var(--text);}
.empty-text{font-size:var(--fs-13);color:var(--text-3);max-width:380px;}
.empty-action{margin-top:var(--sp-16);}

/* --- 12. TABLE ------------------------------------------------------------ */
.table-wrap{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface);overflow:hidden;}
.table-scroll{overflow-x:auto;}
table.table{width:100%;border-collapse:collapse;font-size:var(--fs-14);}
.table thead th{
  position:sticky;top:0;z-index:1;
  background:var(--bg-subtle);
  padding:10px var(--sp-16);text-align:left;
  font-size:var(--fs-12);font-weight:600;letter-spacing:.02em;color:var(--text-3);
  border-bottom:1px solid var(--border);white-space:nowrap;
}
.table thead th.sortable{cursor:pointer;user-select:none;transition:color var(--dur-1);}
.table thead th.sortable:hover{color:var(--text);}
.table th .sort-ico{display:inline-block;width:12px;height:12px;margin-left:5px;vertical-align:-2px;opacity:0;transition:opacity var(--dur-1),transform var(--dur-2) var(--ease);}
.table th.sortable:hover .sort-ico{opacity:.45;}
.table th[aria-sort] .sort-ico{opacity:1;color:var(--accent-text);}
.table th[aria-sort="descending"] .sort-ico{transform:rotate(180deg);}
.table tbody td{padding:12px var(--sp-16);border-bottom:1px solid var(--border);vertical-align:middle;}
.table tbody tr:last-child td{border-bottom:0;}
.table tbody tr{transition:background var(--dur-1) var(--ease);}
.table tbody tr.row-main{cursor:pointer;}
.table tbody tr.row-main:hover{background:var(--surface-hover);}
.table tbody tr.is-selected{background:var(--accent-bg);}
.table tbody tr.is-selected td:first-child{box-shadow:inset 2px 0 0 var(--accent);}
.table-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-16);padding:10px var(--sp-16);border-top:1px solid var(--border);background:var(--surface);flex-wrap:wrap;}

.pagination{display:flex;align-items:center;gap:4px;}
.pagination button{
  min-width:32px;height:32px;padding:0 8px;border-radius:var(--r-sm);
  font-size:var(--fs-13);font-weight:500;color:var(--text-2);
  display:inline-flex;align-items:center;justify-content:center;
  transition:background var(--dur-1),color var(--dur-1);
}
.pagination button:hover:not(:disabled){background:var(--surface-hover);color:var(--text);}
.pagination button[aria-current="page"]{background:var(--accent);color:var(--text-on-accent);}
.pagination button:disabled{opacity:.35;pointer-events:none;}
.pagination svg{width:15px;height:15px;}

/* --- 13. OVERLAY: MODAL / DRAWER ------------------------------------------ */
.scrim{
  position:fixed;inset:0;background:rgba(12,16,17,.45);
  animation:dzt-fade var(--dur-3) var(--ease-out) both;
}
:root[data-theme="dark"] .scrim{background:rgba(0,0,0,.62);}
@keyframes dzt-fade{from{opacity:0;}to{opacity:1;}}

.modal-root{position:fixed;inset:0;z-index:80;display:none;align-items:center;justify-content:center;padding:var(--sp-24);}
.modal-root.open{display:flex;}
.modal{
  position:relative;z-index:1;width:100%;max-width:420px;
  background:var(--surface-raised);border:1px solid var(--border);border-radius:var(--r-xl);
  box-shadow:var(--sh-xl);animation:dzt-scale-in var(--dur-3) var(--ease-out) both;
}
@keyframes dzt-scale-in{from{opacity:0;transform:scale(.98) translateY(4px);}to{opacity:1;transform:none;}}
.modal-head{padding:var(--sp-24) var(--sp-24) 0;}
.modal-head h3{font-size:var(--fs-18);font-weight:600;}
.modal-body{padding:var(--sp-12) var(--sp-24) var(--sp-24);font-size:var(--fs-14);color:var(--text-2);line-height:var(--lh-body);}
.modal-foot{display:flex;gap:var(--sp-8);justify-content:flex-end;padding:var(--sp-16) var(--sp-24);border-top:1px solid var(--border);}
.modal-foot .btn{min-width:96px;}
.modal-icon{width:40px;height:40px;border-radius:var(--r-lg);display:grid;place-items:center;margin-bottom:var(--sp-16);}
.modal-icon svg{width:20px;height:20px;}
.modal-icon.danger{background:var(--danger-bg);color:var(--danger);}
.modal-icon.accent{background:var(--accent-bg);color:var(--accent-text);}
/* Hộp thoại rộng (biểu mẫu nhiều cột). Thân tự cuộn khi màn hình thấp. */
.modal-lg{max-width:760px;}
.modal-lg .modal-body{max-height:calc(100vh - 220px);overflow-y:auto;overscroll-behavior:contain;}

.drawer-root{position:fixed;inset:0;z-index:70;display:none;}
.drawer-root.open{display:block;}
.drawer{
  position:absolute;top:0;right:0;height:100%;width:min(720px,100%);
  background:var(--surface);border-left:1px solid var(--border);box-shadow:var(--sh-xl);
  display:flex;flex-direction:column;
  animation:dzt-slide-left var(--dur-4) var(--ease-out) both;
}
@keyframes dzt-slide-left{from{transform:translateX(24px);opacity:0;}to{transform:none;opacity:1;}}
.drawer-head{display:flex;align-items:center;gap:var(--sp-12);padding:var(--sp-20) var(--sp-24);border-bottom:1px solid var(--border);flex:0 0 auto;}
.drawer-head h2{font-size:var(--fs-16);font-weight:600;flex:1;}
.drawer-body{flex:1;overflow-y:auto;padding:var(--sp-20) var(--sp-24) var(--sp-32);overscroll-behavior:contain;}

/* --- 14. TOAST ------------------------------------------------------------ */
.toast{
  position:fixed;left:50%;bottom:var(--sp-24);z-index:90;
  display:flex;align-items:center;gap:10px;
  padding:11px 16px;border-radius:var(--r-md);
  background:var(--n-900);color:var(--n-25);border:1px solid transparent;
  font-size:var(--fs-13);font-weight:500;box-shadow:var(--sh-lg);
  opacity:0;transform:translate(-50%,8px);pointer-events:none;
  transition:opacity var(--dur-2) var(--ease),transform var(--dur-2) var(--ease);
}
:root[data-theme="dark"] .toast{background:var(--surface-raised);border-color:var(--border-strong);color:var(--text);}
.toast.show{opacity:1;transform:translate(-50%,0);}
.toast svg{width:16px;height:16px;color:var(--success);}
.toast.err svg{color:var(--danger);}

/* --- 15. TOOLTIP ---------------------------------------------------------- */
[data-tip]{position:relative;}
[data-tip]::after{
  content:attr(data-tip);position:absolute;z-index:60;
  bottom:calc(100% + 8px);left:50%;transform:translate(-50%,3px);
  padding:5px 9px;border-radius:var(--r-sm);
  background:var(--n-900);color:var(--n-25);
  font-size:var(--fs-12);font-weight:500;line-height:1.4;white-space:nowrap;
  opacity:0;pointer-events:none;
  transition:opacity var(--dur-1) var(--ease),transform var(--dur-1) var(--ease);
}
:root[data-theme="dark"] [data-tip]::after{background:var(--n-800);color:var(--text);border:1px solid var(--border-strong);}
[data-tip]:hover::after,[data-tip]:focus-visible::after{opacity:1;transform:translate(-50%,0);}
[data-tip-side="right"]::after{bottom:auto;left:calc(100% + 8px);top:50%;transform:translate(-3px,-50%);}
[data-tip-side="right"]:hover::after,[data-tip-side="right"]:focus-visible::after{transform:translate(0,-50%);}

/* --- 16. POPOVER / MENU --------------------------------------------------- */
.popover{
  position:absolute;z-index:65;min-width:220px;
  background:var(--surface-raised);border:1px solid var(--border);border-radius:var(--r-lg);
  box-shadow:var(--sh-lg);padding:6px;
  opacity:0;transform:translateY(-4px);pointer-events:none;
  transition:opacity var(--dur-2) var(--ease),transform var(--dur-2) var(--ease);
}
.popover.open{opacity:1;transform:none;pointer-events:auto;}
.menu-item{
  display:flex;align-items:center;gap:10px;width:100%;
  padding:8px 10px;border-radius:var(--r-sm);
  font-size:var(--fs-13);font-weight:500;color:var(--text-2);text-align:left;
  transition:background var(--dur-1),color var(--dur-1);
}
.menu-item svg{width:15px;height:15px;}
.menu-item:hover{background:var(--surface-hover);color:var(--text);}
.menu-item.danger{color:var(--danger);}
.menu-item.danger:hover{background:var(--danger-bg);}
.menu-label{padding:8px 10px 4px;font-size:var(--fs-11);font-weight:600;letter-spacing:var(--tr-wide);text-transform:uppercase;color:var(--text-3);}
.menu-sep{height:1px;background:var(--border);margin:5px 0;}

/* --- 17. TABS ------------------------------------------------------------- */
.tabs{display:flex;gap:var(--sp-24);border-bottom:1px solid var(--border);}
.tabs button{
  position:relative;padding:10px 0;font-size:var(--fs-14);font-weight:500;color:var(--text-3);
  transition:color var(--dur-1);
}
.tabs button:hover{color:var(--text);}
.tabs button.active{color:var(--text);}
.tabs button.active::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;
  background:var(--accent);border-radius:2px 2px 0 0;
}

/* --- 18. ACCORDION -------------------------------------------------------- */
.acc-head{
  display:flex;align-items:center;gap:10px;width:100%;text-align:left;
  padding:10px 12px;border-radius:var(--r-md);color:var(--text);
  transition:background var(--dur-1) var(--ease);
}
.acc-head:hover{background:var(--surface-hover);}
.acc-chev{width:15px;height:15px;color:var(--text-3);transition:transform var(--dur-2) var(--ease);}
.is-collapsed > .acc-head .acc-chev,.acc-head[aria-expanded="false"] .acc-chev{transform:rotate(-90deg);}

