:root{
  --bg:#F7F6F2; --surface1:#FFFFFF; --surface2:#FCFBF9; --border:#E7E5DE;
  --text1:#1F1E1B; --text2:#5C5A54; --textmuted:#948F84;
  --accent:#3E72D4; --accent-100:#E4ECFB; --nav-active-text:#3E72D4;
  --progress-done:#0F6E56;
  --blue-50:#E6F1FB; --blue-800:#0C447C; --blue-300:#85B7EB;
  --amber-50:#FAEEDA; --amber-800:#7A4508; --amber-300:#C97A0E;
  --green-50:#EAF3DE; --green-800:#27500A; --green-300:#5E9C2E;
  --red-50:#FCEBEB; --red-800:#8A1F1F; --red-700:#A32D2D;
  --gray-50:#F1EFE8; --gray-800:#444441; --gray-400:#8C897E;
  --purple-100:#EEEDFE; --purple-800:#26215C;
  --chip-text-default:#1F1E1B;
  --font: -apple-system, "Segoe UI", Inter, Roboto, sans-serif;
}
[data-theme="dark"]{
  --bg:#15140F; --surface1:#1D1C17; --surface2:#211F1A; --border:#33312A;
  --text1:#F2F0EA; --text2:#B8B5AC; --textmuted:#7C786F;
  --accent:#6FA0F0; --accent-100:#16233D; --nav-active-text:#8FB6F5;
  --progress-done:#22957A;
  --blue-50:#17324A; --blue-800:#8FC5F5; --blue-300:#4E88BD;
  --amber-50:#3D2A0C; --amber-800:#F0B65C; --amber-300:#E0993B;
  --green-50:#1D3510; --green-800:#9AD16C; --green-300:#7AB84A;
  --red-50:#3A1414; --red-800:#F0A0A0; --red-700:#E2685F;
  --gray-50:#2B2A26; --gray-800:#C9C6BC; --gray-400:#6E6B62;
  --purple-100:#241F42; --purple-800:#B9B2F2;
  --chip-text-default:#F2F0EA;
}
*{box-sizing:border-box}
body{margin:0;font-family:var(--font);background:var(--bg);color:var(--text1);font-size:14px}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer}
.app{display:flex;min-height:100vh}

/* Sidebar — luôn tối (khác nền sáng/tối chung của trang, đổi bằng nút toggle) — thử theo yêu cầu
   người dùng. Ghi đè custom property NGAY TRÊN .sidebar: mọi rule con (.navlink, .nav-section-title,
   .sidebar-user...) đang dùng var(--surface1)/var(--text2)/var(--border)/... tự động nhận giá trị
   tối mới mà không cần sửa từng rule riêng lẻ. */
.sidebar{
  --surface1:#1D1C17; --surface2:#211F1A; --border:#33312A;
  --text1:#F2F0EA; --text2:#B8B5AC; --textmuted:#7C786F;
  --accent-100:#1E4C91; --nav-active-text:#FFFFFF;
}

.sidebar{width:240px;flex-shrink:0;background:var(--surface1);border-right:1px solid var(--border);padding:16px 10px;display:flex;flex-direction:column;gap:2px;transition:width .12s ease-out;will-change:width}
.sidebar .brand{display:flex;align-items:center;gap:8px;padding:0 8px;margin-bottom:18px}
.sidebar .brand .logo{width:28px;height:28px;border-radius:8px;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px}
.sidebar .brand span{font-weight:600;font-size:14px}
.brand-logo{max-width:100%;max-height:114px;width:auto;height:auto;object-fit:contain;display:block}
/* button.sidebar-collapse-btn (không chỉ .sidebar-collapse-btn suông): cần độ đặc hiệu CAO HƠN
   .icon-btn{display:flex} (định nghĩa Ở SAU trong file, cùng độ đặc hiệu 1 class thì rule sau
   thắng bất kể phần tử có thêm class nào khác) — nếu không nút này sẽ LUÔN hiện kể cả dưới
   861px, phá đúng yêu cầu "chỉ desktop/tablet". */
button.sidebar-collapse-btn{display:none;margin-left:auto;flex-shrink:0}

/* Thu gọn menu (MỚI, theo yêu cầu người dùng) — CHỈ desktop/tablet, dưới 861px sidebar đã là
   off-canvas riêng qua hamburger (xem @media max-width:860px cuối file), 2 cơ chế không liên quan
   nên nút này ẩn hẳn dưới breakpoint đó, class .sidebar-collapsed (gắn lên <html>, xem
   pm-theme-assets.blade.php) cũng chỉ có tác dụng trong khối @media này. */
@media (min-width:861px){
  button.sidebar-collapse-btn{display:flex}

  html.sidebar-collapsed .sidebar{width:68px}
  /* Logo đầy đủ (wordmark, không có bản rút gọn icon-only riêng) không đủ chỗ hiển thị có nghĩa ở
     68px — ẩn hẳn, chỉ còn nút thu gọn/mở rộng canh giữa hàng brand khi đã thu nhỏ. */
  html.sidebar-collapsed .sidebar .brand{justify-content:center}
  html.sidebar-collapsed .sidebar .brand .brand-logo{display:none}
  html.sidebar-collapsed .navlink span,
  html.sidebar-collapsed .nav-section-title,
  html.sidebar-collapsed .nav-chevron,
  /* Submenu con (Cá nhân/Việc nhóm/Mua hàng, Báo hàng lỗi/Đăng ký gia công) không có chỗ hiện nhãn
     khi thu gọn — ẩn hẳn thay vì hiện icon-only khó đoán mục nào là mục nào; mở lại sidebar để vào. */
  html.sidebar-collapsed .nav-subgroup{display:none}
  html.sidebar-collapsed .navlink{justify-content:center;padding-left:9px;padding-right:9px;border-left:none}
  html.sidebar-collapsed .navlink.active{border-left:none}

  /* Rê chuột mở rộng lại (MỚI 2026-08-29, theo yêu cầu người dùng — click menu nhóm lúc đang thu
     gọn bị giật, đề xuất "rê chuột vào mở rộng, click xong tự thu gọn lại"). `(hover:hover) and
     (pointer:fine)` loại thiết bị chạm/tablet không có hover thật — JS ở sidebar.blade.php
     (nav-group-toggle) tự phát hiện qua cùng media query để GIỮ NGUYÊN hành vi bấm-để-mở-rộng cũ
     cho các thiết bị đó, không đụng gì.

     CHỈ ĐỔI CHÍNH `.sidebar` (position:fixed, xem inline <style> ở pm-theme-assets.blade.php) —
     KHÔNG đụng .topbar/.fi-layout (margin-left/width của chúng vẫn giữ theo trạng thái collapsed
     THẬT, không theo hover) — sidebar mở rộng ra thì NỔI ĐÈ lên nội dung bên dưới (z-index:30 >
     .topbar z-index:20) thay vì đẩy nội dung dịch sang phải.

     LỊCH SỬ ĐO ĐẠC (2026-08-29, PerformanceObserver longtask qua browser thật, reload sạch giữa mỗi
     lần đo — reload KHÔNG sạch giữa các lần trước đó từng cho kết quả dương tính giả, lỗi phương
     pháp đã phát hiện lại và sửa mỗi vòng):
       (1) Bản đầu: width animate (transition .12s) + hiện nhãn CÙNG LÚC (display tức thời, không
           transition riêng) = GIẬT ~700-900ms lần hover đầu tiên.
       (2) Sửa bằng `transition: display .12s .12s` (delay hiện nhãn bằng CSS tới khi width animate
           xong) = VẪN GIẬT ~700-900ms như cũ — bản thân CSS animate thuộc tính `display` (dù chỉ để
           delay, không nội suy giá trị) tốn, không liên quan gì relayout text như suy đoán ban đầu.
       (3) Sửa bằng JS `setTimeout` 120ms đổi class tức thời (không qua CSS transition nào) = 0
           longtask — NHƯNG người dùng báo mới: sidebar bung rộng 240px ngay, nhãn còn ẩn tới 120ms
           sau mới hiện → nhìn như "menu trống" 1 nhịp rồi chữ mới hiện, trải nghiệm không mượt.
       (4) Sửa CUỐI: bỏ hẳn animation width lúc hover (`transition:none`, bung TỨC THÌ 68px→240px)
           + hiện nhãn TỨC THÌ cùng lúc (display thường qua :hover, không cần JS/delay gì nữa) —
           KHÔNG còn độ trễ nào giữa lúc rộng ra và lúc thấy chữ (đúng yêu cầu người dùng "xuất hiện
           tức thì"), và longtask GẦN NHƯ luôn = 0, thay vì LUÔN LUÔN giật ~700-900ms như bản (1)/(2).
           Nguyên nhân giật ở (1)/(2): display đổi CÙNG LÚC width đang CHẠY ANIMATION qua NHIỀU frame
           (mỗi frame phải relayout lại nhãn vừa hiện) — bỏ animation (width đổi tức thì, chỉ 1 frame)
           thì đổi display cùng lúc không còn gì để lặp lại giữa các frame.
           LƯU Ý (đo lại nhiều lần qua browser thật): thỉnh thoảng VẪN thấy 1 longtask nhỏ hơn hẳn
           (~90-300ms, hiếm khi tới ~900ms) NGAY CẢ ở bản (4) này — đã kiểm tra: KHÔNG đặc thù riêng
           sidebar/hover, click vào NỘI DUNG bất kỳ (không đụng sidebar) trên trang cũng thỉnh thoảng
           thấy cùng hiện tượng — có vẻ là "thuế" tương tác ĐẦU TIÊN sau khi tải trang nói chung (trang
           dùng CSS Tailwind rất lớn từ Filament), không phải lỗi cơ chế hover ở đây, không chase thêm
           qua CSS được nữa — cần DevTools Performance profiling thật nếu muốn truy tiếp. */
  @media (hover:hover) and (pointer:fine){
    html.sidebar-collapsed .sidebar:hover{width:240px;transition:none}
    html.sidebar-collapsed .sidebar:hover .brand{justify-content:flex-start}
    html.sidebar-collapsed .sidebar:hover .brand .brand-logo{display:block}
    html.sidebar-collapsed .sidebar:hover .navlink span,
    html.sidebar-collapsed .sidebar:hover .nav-chevron{display:inline}
    html.sidebar-collapsed .sidebar:hover .nav-section-title,
    html.sidebar-collapsed .sidebar:hover .nav-subgroup{display:block}
    html.sidebar-collapsed .sidebar:hover .navlink{justify-content:flex-start;padding:9px 10px 9px 7px;border-left:3px solid transparent}
    html.sidebar-collapsed .sidebar:hover .navlink.active{border-left-color:var(--nav-active-text)}
    /* BUG THẬT (người dùng báo 2026-08-29) — rule .navlink ở trên dùng shorthand `padding` (đặt lại
       CẢ 4 cạnh, kể cả padding-left) với độ đặc hiệu CAO HƠN `.nav-subgroup .navlink{padding-left:31px}`
       (thêm .sidebar-collapsed/.sidebar/:hover vào chuỗi selector) — đè mất luôn thụt lề phân cấp của
       menu con mỗi khi hover sidebar đang thu gọn. Ghi đè lại padding-left riêng cho đúng menu con,
       độ đặc hiệu cao hơn nữa (thêm .nav-subgroup) để thắng rule chung phía trên. */
    html.sidebar-collapsed .sidebar:hover .nav-subgroup .navlink{padding-left:31px}
  }
}
.navlink{display:flex;align-items:center;gap:10px;padding:9px 10px 9px 7px;border-radius:8px;color:var(--text2);font-size:13.5px;font-weight:500;border-left:3px solid transparent}
.navlink i{font-size:17px;width:18px;text-align:center}
.navlink:hover{background:var(--surface2)}
/* Làm nổi bật mục đang active hơn bản gốc (chỉ đổi màu nền/chữ) — theo yêu cầu người dùng: thêm
   vạch màu bên trái (đồng bộ accent xanh của sidebar) + chữ đậm hơn hẳn (600) để phân biệt rõ ngay
   cả khi lướt nhanh qua danh sách menu, không phải nhìn kỹ mới nhận ra khác biệt màu nền. */
.navlink.active{background:var(--accent-100);color:var(--nav-active-text);font-weight:600;border-left-color:var(--nav-active-text)}
.nav-section-title{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--textmuted);padding:14px 10px 4px}
.nav-group-toggle{width:100%;background:none;border:none;cursor:pointer;text-align:left;font-family:inherit}
.nav-chevron{margin-left:auto;font-size:13px;flex-shrink:0;transition:transform .15s ease}
.nav-subgroup .navlink{padding-left:31px}

/* Topbar */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
/* sticky: topbar (chứa nút hamburger) trước đây nằm trong luồng cuộn bình thường của trang — cuộn
   xuống là mất luôn, phải cuộn ngược lên đầu mới bấm được hamburger (bug thật, báo trên mobile).
   z-index thấp hơn .sidebar-overlay(29)/.sidebar(30) — khi menu mobile mở, overlay/sidebar vẫn nổi
   đúng lên trên topbar như trước, không đổi hành vi đó. */
.topbar{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid var(--border);background:var(--surface1);position:sticky;top:0;z-index:20}
/* margin-left:auto (2026-09-03, sau khi bỏ tạm ô search giữa topbar): trước đó justify-content:
   space-between của .topbar tự đẩy khối này sang phải nhờ có search-wrap làm phần tử còn lại bên
   trái; giờ hamburger-btn ẩn ở desktop (display:none, chỉ hiện lại dưới breakpoint 861px) nên
   topbar-actions là flex item HIỂN THỊ DUY NHẤT — space-between với 1 item sẽ dạt về flex-start
   (trái) thay vì phải. margin-left:auto tự đẩy sang phải bất kể còn phần tử nào khác hay không. */
.topbar-actions{display:flex;align-items:center;gap:16px;margin-left:auto}
.icon-btn{position:relative;background:none;border:none;color:var(--text2);font-size:19px;display:flex}
.icon-btn .dot{position:absolute;top:-3px;right:-5px;background:var(--red-700);color:#fff;font-size:9px;width:14px;height:14px;border-radius:50%;display:flex;align-items:center;justify-content:center}
.user-menu{display:flex;align-items:center;gap:8px}
.avatar{width:28px;height:28px;border-radius:50%;font-size:11px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.content{padding:22px 26px;flex:1}
.app-footer{padding:14px 26px 4px;margin-top:20px;border-top:1px solid var(--border);font-size:11.5px;color:var(--textmuted);text-align:center}
h1.page-title{font-size:19px;font-weight:600;margin:0 0 18px}

/* Cards & generic */
.card{background:var(--surface1);border:1px solid var(--border);border-radius:12px;padding:16px 18px}
.grid-4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:20px}
.stat-icon{width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:10px}
.stat-value{font-size:24px;font-weight:600;margin:0}
.stat-label{font-size:12px;color:var(--text2);margin:4px 0 0}
.badge{font-size:11px;font-weight:600;padding:3px 9px;border-radius:20px;display:inline-block}

/* Table */
table{width:100%;border-collapse:collapse;font-size:13px}
th{text-align:left;padding:9px 10px;color:var(--text2);font-weight:600;border-bottom:1px solid var(--border);white-space:nowrap}
td{padding:10px;border-bottom:1px solid var(--border);vertical-align:middle}
tr:last-child td{border-bottom:none}
.table-wrap{overflow-x:auto}
.btn{background:var(--accent);color:#fff;border:none;border-radius:8px;padding:8px 14px;font-size:13px;font-weight:600}
.btn-ghost{background:none;border:1px solid var(--border);color:var(--text1);border-radius:8px;padding:7px 12px;font-size:13px}
.btn-sm{padding:5px 10px;font-size:12px}
.toolbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}

/* Project cards */
.proj-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}
.proj-card h3{font-size:14.5px;margin:0 0 2px}
.proj-card .mgr{font-size:12px;color:var(--text2);margin:0 0 10px}
.bar{height:6px;background:var(--surface2);border-radius:20px;overflow:hidden;margin-bottom:6px}
.bar-fill{height:100%;border-radius:20px;background:var(--progress-done)}
.avatars{display:flex;gap:4px;margin:10px 0}

/* Tree / master-detail */
.split{display:flex;gap:16px;align-items:flex-start}
.tree-pane{flex:1.1;min-width:0}
.detail-pane{flex:1;min-width:0;background:var(--surface1);border:1px solid var(--border);border-radius:12px;padding:16px}
/* Sidebar team/DM của trang Messages (messages-index.blade.php) — hẹp lại bên cạnh khung chat rộng
   trên desktop; mobile override về full width (xem @media max-width:860px bên dưới), .split lúc đó
   đã xếp chồng dọc nên không cần chừa chỗ cho .chat-pane nằm cạnh nữa. */
.chat-sidebar{max-width:300px}
.tree-row{padding:6px 4px;border-radius:6px;cursor:pointer}
.tree-row.active{background:var(--accent-100)}
.row-main{display:flex;align-items:center;gap:6px}
.twist{width:16px;height:16px;display:flex;align-items:center;justify-content:center;color:var(--textmuted);flex-shrink:0;transition:transform .15s}
.twist.open{transform:rotate(90deg)}
.nblock{font-size:12px;font-weight:500;padding:5px 10px;border-radius:6px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--chip-text-default)}
.mini-bar{width:36px;height:5px;border-radius:20px;background:var(--surface2);overflow:hidden;flex-shrink:0}
.mini-fill{height:100%;border-radius:20px}
.tpct{font-size:11px;color:var(--text2);width:26px;text-align:right;flex-shrink:0}
.children{display:none;padding-left:20px;border-left:1px solid var(--border);margin-left:8px;margin-top:2px}
.field{margin-bottom:12px}
.field label{display:block;font-size:11px;color:var(--text2);margin-bottom:4px}
input[type=text], input[type=email], input[type=password], input[type=date], select, textarea{width:100%;padding:7px 9px;border:1px solid var(--border);border-radius:8px;background:var(--surface2);color:var(--text1);font-size:13px;font-family:inherit}
textarea{min-height:60px;resize:vertical}
/* Mũi tên dropdown cho MỌI <select> (kể cả select native do Filament render) — không có
   background-image nào ở rule chung phía trên nên trước đây select trông y hệt input text,
   người dùng không biết phải bấm để chọn. select[multiple] (Filament luôn render UI JS riêng,
   không phải <select> thật) không bị ảnh hưởng. */
select{appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:32px;background-repeat:no-repeat;background-position:right 10px center;background-size:15px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%235C5A54' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7l5 5 5-5'/%3E%3C/svg%3E")}
[data-theme="dark"] select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%23B8B5AC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7l5 5 5-5'/%3E%3C/svg%3E")}

/* Role permission grid */
.perm-table th, .perm-table td{text-align:center}
.perm-table td:first-child, .perm-table th:first-child{text-align:left}

/* Modal */
.modal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.45);align-items:center;justify-content:center;z-index:50;padding:20px}
.modal-box{background:var(--surface1);border-radius:14px;width:100%;max-width:560px;max-height:88vh;display:flex;flex-direction:column}
.modal-head{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}
.modal-body{padding:18px 20px;overflow-y:auto}
.modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:14px 20px;border-top:1px solid var(--border);flex-shrink:0}
.field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.attach-group{margin-bottom:10px}
.attach-label{font-size:11px;color:var(--textmuted);margin:0 0 6px}
.attach-item{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text2);margin-bottom:6px}

/* Multi-segment phase progress bar (chevron = sequential, rect = free) */
.mpc{display:flex;background:var(--surface2);border-radius:8px;overflow:hidden;border:1px solid var(--border);gap:4px;padding:2px}
.mstep{flex:1;padding:8px 6px;color:var(--chip-text-default);text-align:center;font-weight:600;font-size:10.5px;background:var(--gray-50)}
.mstep .pct{font-size:9px;opacity:.85;margin-top:1px}
.mstep-chev{clip-path:polygon(100% 0,100% 100%,0 100%,0 0);border-radius:4px}
.mstep-chev:has(+ .mstep-chev){clip-path:polygon(calc(100% - 12px) 0,100% 50%,calc(100% - 12px) 100%,0 100%,0 0);padding-right:16px;border-radius:4px 0 0 4px}
.mstep-chev + .mstep-chev{clip-path:polygon(100% 0,100% 100%,0 100%,12px 50%,0 0);padding-left:18px;border-radius:0 4px 4px 0}
.mstep-chev + .mstep-chev:has(+ .mstep-chev){clip-path:polygon(calc(100% - 12px) 0,100% 50%,calc(100% - 12px) 100%,0 100%,12px 50%,0 0);padding-left:18px;padding-right:16px;border-radius:0}
.mstep-chev:first-child{border-radius:6px 0 0 6px}
.mstep-chev:last-child{border-radius:0 6px 6px 0}

/*
    clip-path cắt hình chevron NHƯNG không tự vẽ border theo đường cắt — border CSS bình thường
    chỉ bám theo hộp chữ nhật gốc, nên 2 cạnh xiên tạo mũi tên sẽ bị thiếu viền dù đặt border-width/
    border-color trực tiếp lên .mstep-chev. Khắc phục bằng kỹ thuật "double clip-path": ::before vẽ
    TOÀN BỘ hình chevron bằng màu viền (to đúng bằng box), ::after vẽ lại y hệt hình đó nhưng thu vào
    trong đúng 1px (độ dày viền) bằng màu nền — chừa lại đúng 1 vòng viền đều quanh TOÀN BỘ contour,
    kể cả đỉnh nhọn. Dùng "clip-path: inherit" để lấy đúng polygon máy tính sẵn của .mstep-chev tại
    from vị trí đó (khác nhau theo :first-child/:has(+ .mstep-chev)/... ở trên) — không phải lặp lại
    từng công thức polygon riêng cho 2 lớp. Mặc định 2 biến --mstep-bg/--mstep-border là "transparent"
    (không set gì cả) để không đụng tới nơi nào lỡ dùng .mstep-chev mà chưa truyền 2 biến này.
*/
.mstep-chev{position:relative}
.mstep-chev::before,
.mstep-chev::after{content:"";position:absolute;clip-path:inherit}
.mstep-chev::before{top:0;right:0;bottom:0;left:0;background:var(--mstep-border,transparent);z-index:0}
.mstep-chev::after{top:1px;right:1px;bottom:1px;left:1px;background:var(--mstep-bg,transparent);z-index:1}
.mstep-chev>*{position:relative;z-index:2}

/* Lớp tô % hoàn thành (project-card.blade.php chèn làm con đầu tiên, width=% inline): mép PHẢI của
   chính phần tô cũng vát mũi tên theo dáng chevron thay vì cắt thẳng đứng. Cùng z-index 2 với text
   nhưng đứng TRƯỚC trong cây nên vẽ dưới chữ; đè lên nền ::after (z1). Khai báo sau .mstep-chev>*
   để position:absolute thắng position:relative của rule đó. */
.mstep-chev>.mstep-fill{position:absolute;top:1px;left:1px;bottom:1px;z-index:2;clip-path:polygon(0 0,calc(100% - 10px) 0,100% 50%,calc(100% - 10px) 100%,0 100%)}

.mstep-rect{border-radius:6px;border:1.5px dashed var(--border);background:var(--gray-50);margin-left:10px}
.mstep.done{background:var(--progress-done);color:#fff}
.mstep-rect.done{background:var(--progress-done);border-color:var(--progress-done);border-style:solid;color:#fff}
.mstep.partial{background:linear-gradient(to right,var(--amber-300) var(--p),var(--gray-50) var(--p));color:var(--chip-text-default)}
.mstep-rect.partial{background:linear-gradient(to right,var(--amber-300) var(--p),var(--gray-50) var(--p));border-color:var(--amber-300);border-style:solid;color:var(--chip-text-default)}

/* Message dropdown */
.msg-wrap{position:relative}
.notif-wrap{position:relative}
.msg-dropdown{display:none;position:absolute;top:34px;right:0;width:290px;background:var(--surface1);border:1px solid var(--border);border-radius:10px;z-index:60;overflow:hidden}
.msg-dropdown-head{padding:10px 14px;font-size:13px;font-weight:600;border-bottom:1px solid var(--border)}
.msg-item{display:flex;gap:8px;padding:10px 14px;cursor:pointer;border-bottom:1px solid var(--border)}
.msg-item:last-child{border-bottom:none}
.msg-item:hover{background:var(--surface2)}
.msg-item p{margin:0}
.msg-subject{font-size:12px;color:var(--text2);margin-top:2px !important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.msg-time{font-size:11px;color:var(--textmuted);margin-top:2px !important}
.msg-dropdown-footer{display:block;text-align:center;padding:9px;font-size:12px;color:var(--accent);font-weight:600;border-top:1px solid var(--border)}

/* Role page tabs + custom permission checklist */
.tab-btn{background:none;border:none;padding:9px 14px;font-size:13.5px;font-weight:500;color:var(--text2);border-bottom:2px solid transparent}
.tab-btn.active{color:var(--accent);border-bottom-color:var(--accent)}
.perm-group{margin-bottom:14px}
.perm-group-title{font-size:12px;font-weight:600;color:var(--text2);margin:0 0 6px;text-transform:uppercase;letter-spacing:.03em}
.perm-check{display:flex;align-items:center;gap:8px;font-size:13px;padding:5px 0}
.perm-check input{width:auto}
.perm-tag{font-size:10px;color:var(--textmuted);background:var(--surface2);border:1px solid var(--border);border-radius:20px;padding:1px 7px}

/* Global Quick Search — dùng luôn ô search topbar, kết quả dạng dropdown */
.search-wrap{position:relative}
.search-box{display:flex;align-items:center;gap:8px;background:var(--surface2);border:1px solid var(--border);border-radius:8px;padding:7px 12px;width:260px}
.search-box input{border:none;background:none;outline:none;font-size:13px;color:var(--text1);width:100%;padding:0}
.search-box input::placeholder{color:var(--textmuted)}
.search-box:focus-within{border-color:var(--accent)}
.gsearch-dropdown{display:none;position:absolute;top:calc(100% + 6px);left:0;width:340px;max-height:360px;overflow-y:auto;background:var(--surface1);border:1px solid var(--border);border-radius:10px;z-index:60;padding:6px}
.search-group-label{font-size:11px;font-weight:600;color:var(--textmuted);text-transform:uppercase;letter-spacing:.03em;padding:8px 10px 4px}
.search-result-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:8px}
.search-result-item:hover{background:var(--surface2)}
.search-result-item i{font-size:17px;color:var(--textmuted);flex-shrink:0}
input[type=text]:focus, input[type=email]:focus, input[type=password]:focus, input[type=date]:focus, select:focus, textarea:focus{outline:none;border-color:var(--accent)}

/* Hamburger — chỉ hiện trên mobile (nút thật nằm trong topbar.blade.php, dùng chung .icon-btn) */
.hamburger-btn{display:none}

/* Overlay tối phía sau sidebar khi mở trên mobile — bấm vào để đóng lại (sidebar.blade.php) */
.sidebar-overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:29}

/* Khối ngôn ngữ/darkmode/user cuối sidebar — chỉ dành cho mobile (topbar quá chật),
   desktop ẩn đi vì các mục này đã có sẵn trên topbar */
.sidebar-extras{display:none;margin-top:12px;padding-top:10px;border-top:1px solid var(--border)}
.sidebar-user{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:8px}
.sidebar-user:hover{background:var(--surface2)}

@media (max-width: 860px){
  /* Sidebar vốn đã position:fixed (xem pm-theme-assets.blade.php) — trượt ra ngoài màn hình thay
     vì display:none, để có thể trượt vào lại khi bấm nút hamburger (không có cơ chế mở lại trước đây) */
  .sidebar{transform:translateX(-100%);transition:transform .12s ease-out}
  .sidebar.is-open{transform:translateX(0)}
  .hamburger-btn{display:flex}
  /* Ngôn ngữ/darkmode/user dời từ topbar vào cuối sidebar — tên user dài đẩy vỡ topbar hẹp */
  .topbar .locale-btn,.topbar .theme-btn,.topbar .user-menu{display:none}
  .sidebar-extras{display:block}
  .grid-4{grid-template-columns:repeat(2,1fr)}
  /* align-items:flex-start (dòng 86) dành cho layout row ở desktop (2 pane không kéo cùng chiều cao) —
     ở mobile flex-direction đổi thành column nên align-items giờ điều khiển chiều NGANG, khiến mỗi pane
     co lại vừa đúng nội dung của nó thay vì chiếm full width. Ép stretch để pane full width khi xếp chồng. */
  .split{flex-direction:column;align-items:stretch}
  .field-row{grid-template-columns:1fr}
  /* .chat-sidebar (danh sách team/DM) đang bị max-width:300px (dòng 90, dành cho layout CẠNH NHAU ở
     desktop) — .split đã xếp chồng dọc ở mobile nên bỏ giới hạn này, để full width như .chat-pane
     bên dưới nó thay vì bị bó hẹp giữa màn hình. */
  .chat-sidebar{max-width:none}
  /* Ô chat trang Messages (messages-index.blade.php): .split đổi flex-direction:column ở trên khiến
     .chat-pane mất luôn giới hạn chiều cao vốn có từ layout hàng ngang (align-items:stretch chỉ có
     tác dụng khi 2 pane nằm CẠNH nhau) — không cap thì khung tin nhắn cứ cao dần theo số tin, đẩy cả
     trang cuộn thay vì cuộn NGAY BÊN TRONG khung chat (overflow-y:auto đã có sẵn ở khối tin nhắn con,
     dòng ~101 messages-index.blade.php, chỉ cần .chat-pane có max-height để nó phát huy tác dụng). */
  .chat-pane{max-height:70vh;overflow:hidden}
}

/* Cho phép resize chiều cao ô RichEditor bằng tay (2026-09-04, yêu cầu người dùng: "resize ô nội
   dung công việc" — Field Service Request "Nội dung công việc"/input_specs). Filament RichEditor
   KHÔNG có ->minHeight()/->maxHeight() như 1 số field khác (không có trait HasMinHeight/
   HasMaxHeight), và ->extraInputAttributes() chỉ bám được vào .fi-fo-rich-editor-main (khối bọc
   ngoài gồm cả toolbar), KHÔNG bám riêng được .fi-fo-rich-editor-content (vùng gõ chữ thật) — nên
   không có cách áp CSS chỉ riêng field này qua Form. Áp DÙNG CHUNG cho mọi RichEditor toàn hệ
   thống (an toàn — chỉ thêm khả năng resize, không đổi hành vi khác) thay vì hack ID/selector dễ
   gãy khi Filament đổi cấu trúc DOM nội bộ.
   BUG THẬT (2026-09-04, người dùng báo "không kéo được") — resize:vertical KHÔNG đủ: .fi-fo-rich-
   editor-content vốn có class Tailwind flex-1 (flex-grow:1, flex-basis:0%, xem CSS gốc Filament
   forms/resources/css/components/rich-editor.css) vì nó là flex item trong .fi-fo-rich-editor-main
   (flex flex-col-reverse). flex-grow LUÔN tính lại chiều cao theo layout mỗi lần render, ĐÈ MẤT
   chiều cao người dùng vừa kéo tay ngay lập tức — trình duyệt do đó không hiện/giữ được tay kéo.
   Phải tắt flex-grow (flex:none) để chiều cao hoàn toàn do resize tay quyết định, không bị flex
   tính lại nữa. */
.fi-fo-rich-editor-content{resize:vertical;overflow:auto;flex:none}
