/*
 * Admin theme: a design system layered on top of dcat-admin (printnow/laravel-admin).
 * Loaded after dcat's own CSS by App\Admin\Theme::register() (all three panels).
 * Components use only the semantic tokens below; dark mode re-assigns them on body.dark-mode.
 * Reference: docs/DESIGN_SYSTEM.md. Live examples: /design-system (local only).
 *
 * Contents
 *   1. Design tokens (primitives, scales, semantic light / dark)
 *   2. Base, foundations (focus, motion, numbers), dcat utility colors
 *   3. Shell: sidebar, navbar, iframe tab bar, page header
 *   4. Cards and metric cards
 *   5. Grid: toolbar, quick search, filter drawer, table, row actions, empty state, cell content
 *      (inline edit, long text, row selects, thumbnails), totals strip, footer, pagination
 *   6. Buttons, forms (sections, switches, tree fields), detail pages, select2
 *   7. Tree pages, badges / labels / alerts
 *   8. Overlays: dropdowns, tabs, modals, tooltips, popovers, toasts, confirm dialogs, date picker, column picker
 *   9. Dark-mode overrides for dcat's own dark styles
 *  10. Login / register
 */

/* ======================================================================
 * 1. Design tokens
 *
 * Three layers. Components only use the semantic and component layers; the
 * primitive scales exist so the semantic values (and charts, see the
 * Color::extend() call in app/Admin/bootstrap.php) come from one palette.
 * Full reference: docs/DESIGN_SYSTEM.md
 * ====================================================================== */

/* -- 1a. Primitives -- */
:root {
    --t-gray-0: #ffffff;  --t-gray-25: #fcfcfd; --t-gray-50: #f9fafb; --t-gray-75: #f6f7f9;
    --t-gray-100: #f3f4f6; --t-gray-200: #e5e7eb; --t-gray-300: #d1d5db; --t-gray-400: #9ca3af;
    --t-gray-500: #6b7280; --t-gray-600: #4b5563; --t-gray-700: #374151; --t-gray-800: #1f2937;
    --t-gray-900: #111827;

    --t-indigo-50: #eef2ff; --t-indigo-100: #e0e7ff; --t-indigo-200: #c7d2fe; --t-indigo-300: #a5b4fc;
    --t-indigo-400: #818cf8; --t-indigo-500: #6366f1; --t-indigo-600: #4f46e5; --t-indigo-700: #4338ca;
    --t-indigo-800: #3730a3; --t-indigo-900: #312e81;

    --t-green-50: #ecfdf5; --t-green-400: #34d399; --t-green-500: #10b981; --t-green-600: #059669; --t-green-700: #047857;
    --t-red-50: #fef2f2;   --t-red-400: #f87171;   --t-red-500: #ef4444;   --t-red-600: #dc2626;   --t-red-700: #b91c1c;
    --t-amber-50: #fffbeb; --t-amber-400: #fbbf24; --t-amber-500: #f59e0b; --t-amber-600: #d97706; --t-amber-700: #b45309;
    --t-sky-50: #f0f9ff;   --t-sky-400: #38bdf8;   --t-sky-500: #0ea5e9;   --t-sky-600: #0284c7;   --t-sky-700: #0369a1;
    --t-cyan-500: #06b6d4;
}

/* -- 1b. Scale tokens (same in light and dark) -- */
:root {
    --t-font: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
    --t-mono: "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;

    /* type: 11 / 12 / 13 / 14 / 15 / 16 / 18 / 20 / 28 */
    --t-fs-2xs: 11px;
    --t-fs-xs: 12px;   /* captions, badges, table headers */
    --t-fs-sm: 13px;   /* table cells, toolbar controls, menus */
    --t-fs-base: 14px; /* body, inputs, buttons, sidebar */
    --t-fs-md: 15px;   /* card and dialog titles */
    --t-fs-lg: 16px;   /* list titles */
    --t-fs-xl: 18px;   /* brand, big numbers in pickers */
    --t-fs-2xl: 20px;  /* page titles */
    --t-fs-3xl: 28px;  /* metric values, hero copy */
    --t-fw-regular: 400; --t-fw-medium: 500; --t-fw-semibold: 600; --t-fw-bold: 650;
    --t-lh-tight: 1.25; --t-lh: 1.5;
    --t-tracking-tight: -.015em;

    /* space: 4px grid */
    --t-space-1: 4px; --t-space-2: 8px; --t-space-3: 12px; --t-space-4: 16px;
    --t-space-5: 20px; --t-space-6: 24px; --t-space-8: 32px; --t-space-10: 40px; --t-space-14: 56px;

    /* radius */
    --t-radius-xs: 4px;   /* checkboxes, chips, code */
    --t-radius-sm: 8px;   /* controls: buttons, inputs, menu items */
    --t-radius-md: 10px;  /* popovers, brand tile */
    --t-radius: 12px;     /* cards, tables */
    --t-radius-lg: 16px;  /* dialogs, auth card */
    --t-radius-full: 999px;

    /* control heights */
    --t-h-xs: 24px;  /* pills, small toggles */
    --t-h-sm: 28px;  /* icon buttons */
    --t-h-md: 32px;  /* toolbar controls, pagination, dialog buttons */
    --t-h-lg: 36px;  /* form inputs and form buttons */
    --t-h-xl: 42px;  /* auth forms */

    /* tables */
    --t-row-h: 48px; --t-head-h: 40px; --t-cell-px: 12px; --t-edge-px: 16px;

    /* layout */
    --t-sidebar-w: 240px;
    --t-navbar-h: 56px;
    --t-page-py: 24px; --t-page-px: 28px;
    --t-card-px: 20px; --t-card-py: 16px;

    /* motion: state changes (hover, focus) use --t-dur; things that appear use --t-dur-enter with
       --t-ease-out and leave faster with --t-dur-exit. Nothing slides further than 8px. */
    --t-dur: .12s; --t-dur-slow: .2s;
    --t-dur-enter: .16s; --t-dur-exit: .1s;
    --t-ease: cubic-bezier(.2, 0, 0, 1);
    --t-ease-out: cubic-bezier(.16, 1, .3, 1);
    --t-ease-in: cubic-bezier(.4, 0, 1, 1);
}

/* -- 1c. Semantic tokens: light -- */
:root {
    --t-bg: var(--t-gray-75);
    --t-surface: var(--t-gray-0);    /* cards, inputs, menus */
    --t-surface-2: var(--t-gray-50); /* table head, footers, subtle fills */
    --t-surface-3: var(--t-gray-100);/* hover, pressed, chips */
    --t-border: var(--t-gray-200);
    --t-border-strong: var(--t-gray-300);
    --t-text: var(--t-gray-900);
    --t-text-2: var(--t-gray-600);
    --t-text-3: var(--t-gray-500);
    --t-text-4: var(--t-gray-400);

    --t-primary: var(--t-indigo-600);
    --t-primary-hover: var(--t-indigo-700);
    --t-primary-soft: var(--t-indigo-50);
    --t-primary-soft-text: var(--t-indigo-700);
    --t-on-primary: #fff;
    --t-ring: 0 0 0 3px rgba(79, 70, 229, .18);

    --t-success: var(--t-green-600); --t-success-soft: var(--t-green-50);
    --t-danger: var(--t-red-600);    --t-danger-soft: var(--t-red-50);
    --t-warning: var(--t-amber-600); --t-warning-soft: var(--t-amber-50);
    --t-info: var(--t-sky-600);      --t-info-soft: var(--t-sky-50);

    --t-success-solid: var(--t-green-600); --t-danger-solid: var(--t-red-600); --t-warning-solid: var(--t-amber-600);

    --t-overlay: rgba(17, 24, 39, .45);
    --t-shadow-xs: 0 1px 2px rgba(16, 24, 40, .05);
    --t-shadow-sm: 0 1px 2px rgba(16, 24, 40, .05);
    --t-shadow: 0 1px 3px rgba(16, 24, 40, .06), 0 1px 2px rgba(16, 24, 40, .04);
    --t-shadow-lg: 0 12px 32px -8px rgba(16, 24, 40, .18), 0 4px 8px -4px rgba(16, 24, 40, .06);
    --t-highlight: inset 0 1px 0 rgba(255, 255, 255, .12); /* top edge of filled buttons */
    --t-tooltip-bg: var(--t-gray-900); --t-tooltip-text: #fff;
    --t-edge-shadow: rgba(16, 24, 40, .16); /* columns scrolled under the pinned actions column */
}

/* -- 1d. Semantic tokens: dark (dcat toggles body.dark-mode) -- */
body.dark-mode {
    --t-bg: #0b0d12;
    --t-surface: #13161d;
    --t-surface-2: #181c24;
    --t-surface-3: #1e232d;
    --t-border: #262b36;
    --t-border-strong: #343a47;
    --t-text: #e6e8ec;
    --t-text-2: #b4b9c3;
    --t-text-3: #8b919c;
    --t-text-4: #646a75;

    --t-primary: var(--t-indigo-500);
    --t-primary-hover: var(--t-indigo-400);
    --t-primary-soft: rgba(99, 102, 241, .14);
    --t-primary-soft-text: var(--t-indigo-300);
    --t-ring: 0 0 0 3px rgba(99, 102, 241, .30);

    --t-success: var(--t-green-400); --t-success-soft: rgba(52, 211, 153, .12);
    --t-danger: var(--t-red-400);    --t-danger-soft: rgba(248, 113, 113, .12);
    --t-warning: var(--t-amber-400); --t-warning-soft: rgba(251, 191, 36, .12);
    --t-info: var(--t-sky-400);      --t-info-soft: rgba(56, 189, 248, .12);

    --t-success-solid: var(--t-green-600); --t-danger-solid: var(--t-red-500); --t-warning-solid: var(--t-amber-600);

    --t-overlay: rgba(0, 0, 0, .6);
    --t-shadow-xs: 0 1px 2px rgba(0, 0, 0, .3);
    --t-shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);
    --t-shadow: 0 1px 3px rgba(0, 0, 0, .35);
    --t-shadow-lg: 0 16px 40px -8px rgba(0, 0, 0, .6), 0 0 0 1px rgba(255, 255, 255, .04);
    --t-highlight: inset 0 1px 0 rgba(255, 255, 255, .08);
    --t-tooltip-bg: #2b313d; --t-tooltip-text: var(--t-text);
    --t-edge-shadow: rgba(0, 0, 0, .55);
}

/* ---------- Base ---------- */
body.dcat-admin-body,
body.dcat-admin-body .header-navbar,
body.dcat-admin-body .content-header h1,
body.dcat-admin-body h1, body.dcat-admin-body h2, body.dcat-admin-body h3,
body.dcat-admin-body h4, body.dcat-admin-body h5, body.dcat-admin-body h6,
body.dcat-admin-body .btn, body.dcat-admin-body .form-control, body.dcat-admin-body .table {
    font-family: var(--t-font);
}

body.dcat-admin-body {
    background-color: var(--t-bg);
    color: var(--t-text-2);
    font-size: var(--t-fs-base);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

body.dcat-admin-body a { color: var(--t-primary); }
body.dcat-admin-body a:hover { color: var(--t-primary-hover); }
body.dcat-admin-body h1, body.dcat-admin-body h2, body.dcat-admin-body h3,
body.dcat-admin-body h4, body.dcat-admin-body h5, body.dcat-admin-body h6 { color: var(--t-text); }
body.dcat-admin-body .text-muted, body.dcat-admin-body .help-block { color: var(--t-text-3) !important; }
body.dcat-admin-body code { color: var(--t-primary-soft-text); background: var(--t-primary-soft); border-radius: var(--t-radius-xs); padding: .1em .35em; }

body.dcat-admin-body ::selection { background: var(--t-primary-soft); color: var(--t-primary-soft-text); }

body.dcat-admin-body * { scrollbar-width: thin; scrollbar-color: var(--t-border-strong) transparent; }
body.dcat-admin-body ::-webkit-scrollbar { width: 10px; height: 10px; }
body.dcat-admin-body ::-webkit-scrollbar-thumb { background: var(--t-border-strong); border-radius: 10px; border: 3px solid transparent; background-clip: content-box; }
body.dcat-admin-body ::-webkit-scrollbar-track { background: transparent; }

/* ---------- Foundations: focus, motion, numbers ---------- */
/* keyboard focus is always visible; mouse clicks do not leave a ring behind */
body.dcat-admin-body a:focus-visible,
body.dcat-admin-body [role=button]:focus-visible,
body.dcat-admin-body .nav-link:focus-visible,
body.dcat-admin-body .dropdown-item:focus-visible,
body.dcat-admin-body .page-link:focus-visible { outline: 0; box-shadow: var(--t-ring) !important; border-radius: var(--t-radius-sm); }
body.dcat-admin-body .btn:focus:not(:focus-visible) { box-shadow: none !important; }
@media (prefers-reduced-motion: reduce) {
    body.dcat-admin-body *, body.dcat-admin-body *::before, body.dcat-admin-body *::after { transition-duration: 0s !important; animation-duration: 0s !important; }
}
/* numbers line up in columns */
body.dcat-admin-body table td, body.dcat-admin-body .pagination, body.dcat-admin-body .badge, body.dcat-admin-body .label { font-variant-numeric: tabular-nums; }

/* ---------- Motion ----------
 * Overlays (menus, dialogs, toasts) grow out of where they were opened instead of popping in.
 * The keyframes move with the individual `translate` / `scale` properties: Popper positions
 * Bootstrap dropdowns with an inline `transform`, which an animated `transform` would replace. */
@keyframes t-drop-in { from { opacity: 0; translate: 0 -4px; scale: .98; } }
@keyframes t-drop-up { from { opacity: 0; translate: 0 4px; scale: .98; } }
@keyframes t-fade-in { from { opacity: 0; } }
@keyframes t-dialog-in { from { opacity: 0; translate: 0 8px; scale: .97; } }
@keyframes t-dialog-out { to { opacity: 0; scale: .97; } }
@keyframes t-toast-in { from { translate: 24px 0; } }

/* ---------- dcat / Bootstrap utility colors -> tokens ----------
 * dcat ships its own palette in these classes (#586cb1 primary, #21b978 green ...). */
body.dcat-admin-body .text-primary, body.dcat-admin-body a.text-primary { color: var(--t-primary) !important; }
body.dcat-admin-body a.text-primary:hover { color: var(--t-primary-hover) !important; }
body.dcat-admin-body .text-success { color: var(--t-success) !important; }
body.dcat-admin-body .text-danger { color: var(--t-danger) !important; }
body.dcat-admin-body .text-warning { color: var(--t-warning) !important; }
body.dcat-admin-body .text-info { color: var(--t-info) !important; }
body.dcat-admin-body .text-dark, body.dcat-admin-body .text-black { color: var(--t-text) !important; }
body.dcat-admin-body .text-80, body.dcat-admin-body .text-90 { color: var(--t-text-3) !important; }
body.dcat-admin-body .text-70, body.dcat-admin-body .text-60, body.dcat-admin-body .text-50, body.dcat-admin-body .text-gray { color: var(--t-text-4) !important; }
body.dcat-admin-body .bg-white { background-color: var(--t-surface) !important; }
body.dcat-admin-body .bg-light, body.dcat-admin-body .bg-gray-bg { background-color: var(--t-surface-3) !important; }
body.dcat-admin-body .bg-primary:not(.badge):not(.label) { background-color: var(--t-primary) !important; }
body.dcat-admin-body .bg-success:not(.badge):not(.label) { background-color: var(--t-success) !important; }
body.dcat-admin-body .bg-danger:not(.badge):not(.label) { background-color: var(--t-danger) !important; }
body.dcat-admin-body .bg-warning:not(.badge):not(.label) { background-color: var(--t-warning) !important; }
body.dcat-admin-body .bg-info:not(.badge):not(.label) { background-color: var(--t-info) !important; }
body.dcat-admin-body .border, body.dcat-admin-body .border-top, body.dcat-admin-body .border-bottom,
body.dcat-admin-body .border-left, body.dcat-admin-body .border-right { border-color: var(--t-border) !important; }
body.dcat-admin-body hr { border-color: var(--t-border); }
body.dcat-admin-body .progress { height: 6px; background: var(--t-surface-3); border-radius: var(--t-radius-full); box-shadow: none; }
body.dcat-admin-body .progress-bar { background-color: var(--t-primary); border-radius: var(--t-radius-full); }
body.dcat-admin-body .progress-bar.bg-success { background-color: var(--t-success) !important; }
body.dcat-admin-body .progress-bar.bg-danger { background-color: var(--t-danger) !important; }
body.dcat-admin-body .progress-bar.bg-warning { background-color: var(--t-warning) !important; }
/* the rest of dcat's own palette that still showed through */
body.dcat-admin-body .text-primary-darker { color: var(--t-primary-hover) !important; }
body.dcat-admin-body .text-orange { color: var(--t-warning) !important; }
body.dcat-admin-body .bg-orange { background-color: var(--t-warning) !important; }
body.dcat-admin-body .bg-primary-gradient { background-image: linear-gradient(135deg, var(--t-primary), var(--t-indigo-400)) !important; }
body.dcat-admin-body .btn-trans.btn-primary { color: var(--t-primary) !important; }
body.dcat-admin-body .alert-primary { background: var(--t-primary-soft) !important; border-color: color-mix(in srgb, var(--t-primary) 25%, transparent) !important; color: var(--t-primary-soft-text) !important; }
body.dcat-admin-body .grid-column-header a:hover,
body.dcat-admin-body .grid-column-header a.active,
body.dcat-admin-body .grid-selector .select-options a.active { color: var(--t-primary) !important; }
body.dcat-admin-body .slider-panel .slider-toggle { background: var(--t-primary) !important; }

/* page-load bar (NProgress, shown while dcat loads a grid or a page asynchronously) */
body.dcat-admin-body #nprogress .bar { background: var(--t-primary) !important; height: 2px; }
body.dcat-admin-body #nprogress .peg { box-shadow: 0 0 10px var(--t-primary), 0 0 4px var(--t-primary) !important; }
/* the corner spinner repeats what the bar already says */
body.dcat-admin-body #nprogress .spinner { display: none !important; }

/* ---------- Sidebar ---------- */
body.dcat-admin-body .main-menu,
body.dcat-admin-body .main-sidebar,
body.dcat-admin-body .main-sidebar.sidebar-dark-white,
body.dcat-admin-body .main-sidebar[class*=sidebar-light-] {
    background: var(--t-surface) !important;
    box-shadow: none !important;
}
body.dcat-admin-body .main-sidebar { border-right: 1px solid var(--t-border); }

body.dcat-admin-body .main-menu .navbar-header { padding: 0 20px; height: var(--t-navbar-h); display: flex; align-items: center; }
body.dcat-admin-body .main-menu .navbar-header .nav-item { text-align: left; }
/* dcat paints the logo row a different color in dark mode and pushes the menu 14px down */
body.dcat-admin-body .main-menu .navbar-header { background: transparent !important; }
body.dcat-admin-body .main-sidebar .sidebar { margin-top: 0 !important; }
body.dcat-admin-body .main-menu .navbar-header .navbar-brand { margin: 0; display: flex; align-items: center; gap: 10px; }
body.dcat-admin-body .main-menu .navbar-header .logo-lg,
body.dcat-admin-body .main-menu [class*=sidebar-dark-] .navbar-header .logo-lg {
    color: var(--t-text) !important;
    font-size: var(--t-fs-lg);
    font-weight: 650;
    letter-spacing: -.01em;
}
body.dcat-admin-body .main-menu .navbar-header .logo-mini {
    display: inline-flex !important; align-items: center; justify-content: center;
    width: 28px; height: var(--t-h-sm); flex: none;
    border-radius: var(--t-radius-sm);
    background: linear-gradient(135deg, var(--t-primary), var(--t-cyan-500));
    color: var(--t-on-primary) !important;
    font-size: var(--t-fs-md); font-weight: 700; line-height: 1;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .2), 0 2px 6px -1px color-mix(in srgb, var(--t-primary) 45%, transparent);
}
body.dcat-admin-body .main-menu .navbar-header .navbar-brand { padding: 0 !important; }

body.dcat-admin-body .main-sidebar .sidebar { padding: 4px 10px 16px !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar { padding-top: 6px !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-item > .nav-link {
    color: var(--t-text-2) !important;
    font-size: var(--t-fs-base);
    font-weight: 500;
    border-radius: var(--t-radius-sm);
    padding: 7px 10px;
    margin-bottom: 2px;
    display: flex;
    align-items: center;
    gap: 10px;
    background: transparent !important;
    box-shadow: none !important;
    transition: background-color var(--t-dur) var(--t-ease), color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-link > i:first-child,
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-link > .fa:first-child {
    color: var(--t-text-4) !important;
    font-size: var(--t-fs-lg);
    width: 18px;
    text-align: center;
    margin: 0 !important;
}
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-link p { margin: 0; flex: 1; display: flex; align-items: center; justify-content: space-between; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-link p .right { position: static; color: var(--t-text-4); font-size: var(--t-fs-xs); transform: rotate(180deg); transition: transform var(--t-dur-slow) var(--t-ease); }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-item > .nav-link:hover {
    background: var(--t-surface-3) !important;
    color: var(--t-text) !important;
}
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-item > .nav-link:hover > i:first-child { color: var(--t-text-2) !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-item > .nav-link.active {
    background: var(--t-primary-soft) !important;
    color: var(--t-primary-soft-text) !important;
    font-weight: var(--t-fw-semibold);
    position: relative;
}
/* the marker runs along the straight part of the pill's left edge (the link, the list and the sidebar
   all clip their overflow, so it cannot sit outside the pill) */
body.dcat-admin-body .main-sidebar .nav-sidebar > .nav-item > .nav-link.active::before {
    content: ""; position: absolute; left: 0; top: 9px; bottom: 9px; width: 3px;
    border-radius: 0 var(--t-radius-full) var(--t-radius-full) 0; background: var(--t-primary);
    animation: t-fade-in var(--t-dur-slow) var(--t-ease-out);
}
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-item > .nav-link.active > i:first-child { color: var(--t-primary) !important; }
/* an open group is not a selection: only its active child is highlighted */
body.dcat-admin-body .main-sidebar .nav-sidebar .menu-open > .nav-link:not(.active) { color: var(--t-text) !important; font-weight: 600; }
body.dcat-admin-body .main-sidebar .nav-sidebar .menu-open > .nav-link:not(.active) > i:first-child { color: var(--t-text-2) !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar .menu-open > .nav-link p .right { transform: rotate(-90deg); }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview { padding: 0 0 0 20px; margin: 2px 0 6px 19px; border-left: 1px solid var(--t-border); }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview .nav-item { position: relative; }
/* dcat's dark mode indents the active child 15px further */
body.dcat-admin-body.dark-mode [class*=sidebar-dark-] .nav-treeview.nav .nav-item .nav-link.active,
body.dcat-admin-body.dark-mode .main-sidebar .nav-sidebar .nav-treeview .nav-link { padding: 6px 10px !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview .nav-link { font-size: var(--t-fs-sm); font-weight: 400; padding: 6px 10px !important; margin-bottom: 1px; color: var(--t-text-3) !important; gap: 0; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview .nav-link:hover { color: var(--t-text) !important; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview .nav-link.active { color: var(--t-primary-soft-text) !important; font-weight: 500; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-treeview .nav-link > i:first-child { display: none; }
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-header {
    color: var(--t-text-4);
    font-size: var(--t-fs-2xs);
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    padding: 14px 10px 6px;
}

/* dcat's built-in Helpers group (开发工具) hard-codes a Font Awesome icon; draw the feather terminal instead */
body.dcat-admin-body .main-sidebar .nav-sidebar .nav-link > i.fa-keyboard-o::before { font-family: "feather" !important; content: "\e927"; }

/* collapsed (icon-only) sidebar */
body.dcat-admin-body.sidebar-collapse .main-sidebar .nav-sidebar .nav-item > .nav-link { justify-content: center; padding: 9px 0; }
body.dcat-admin-body.sidebar-collapse .main-sidebar .nav-sidebar .nav-treeview { border-left: 0; margin-left: 0; padding-left: 0; }

/* ---------- Top navbar ---------- */
body.dcat-admin-body .header-navbar,
body.dcat-admin-body .header-navbar.navbar-light,
body.dcat-admin-body .header-navbar.navbar-shadow {
    background: color-mix(in srgb, var(--t-surface) 88%, transparent) !important;
    backdrop-filter: saturate(180%) blur(10px);
    -webkit-backdrop-filter: saturate(180%) blur(10px);
    border-bottom: 1px solid var(--t-border);
    box-shadow: none !important;
    min-height: var(--t-navbar-h);
}
body.dcat-admin-body .header-navbar { height: var(--t-navbar-h); }
body.dcat-admin-body .header-navbar .navbar-container { min-height: 0; height: var(--t-navbar-h); display: flex; align-items: center; padding-right: 12px !important; }
body.dcat-admin-body .header-navbar .navbar-collapse { height: var(--t-navbar-h); align-items: center; flex: 1; }
body.dcat-admin-body .header-navbar .navbar-collapse > * { display: flex; align-items: center; }
body.dcat-admin-body .header-navbar .menu-toggle { padding: 0 !important; }
body.dcat-admin-body .header-navbar .avatar img { width: 32px; height: var(--t-h-md); }
body.dcat-admin-body .header-navbar .nav-link,
body.dcat-admin-body .header-navbar .nav-link i { color: var(--t-text-3) !important; }
body.dcat-admin-body .header-navbar .nav-link:hover,
body.dcat-admin-body .header-navbar .nav-link:hover i { color: var(--t-text) !important; }
body.dcat-admin-body .header-navbar .menu-toggle,
body.dcat-admin-body .header-navbar .dark-mode-switcher {
    display: inline-flex; align-items: center; justify-content: center;
    width: 34px; height: 34px; border-radius: var(--t-radius-sm);
}
body.dcat-admin-body .header-navbar .menu-toggle:hover,
body.dcat-admin-body .header-navbar .dark-mode-switcher:hover { background: var(--t-surface-3); }
body.dcat-admin-body .header-navbar .user-nav .user-name { color: var(--t-text) !important; font-weight: 600; }
body.dcat-admin-body .header-navbar .user-nav .user-status { color: var(--t-text-3) !important; font-size: var(--t-fs-xs); }
body.dcat-admin-body .header-navbar .avatar img { border-radius: var(--t-radius-full); box-shadow: 0 0 0 2px var(--t-surface), 0 0 0 3px var(--t-border); }
/* user menu: avatar + name, no "在线" line (it is always online) */
body.dcat-admin-body .header-navbar .dropdown-user-link { display: flex !important; align-items: center; gap: 10px; padding: 4px 6px 4px 10px !important; border-radius: var(--t-radius-full); }
body.dcat-admin-body .header-navbar .dropdown-user-link:hover { background: var(--t-surface-3); }
body.dcat-admin-body .header-navbar .user-nav { flex-direction: column; align-items: flex-end; margin: 0 !important; float: none !important; }
body.dcat-admin-body .header-navbar .user-nav .user-name { margin: 0 !important; font-size: var(--t-fs-sm); max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.dcat-admin-body .header-navbar .user-nav .user-status { display: none !important; }
body.dcat-admin-body .header-navbar .dropdown-user-link img { width: 30px !important; height: 30px !important; border-radius: var(--t-radius-full); object-fit: cover; box-shadow: 0 0 0 1px var(--t-border) !important; }
/* dcat's default avatar is a blue power-button ring; show a neutral one instead */
body.dcat-admin-body img[src$="images/default-avatar.jpg"] { content: url("avatar.svg"); }

/* ---------- iframe tab bar ----------
 * The open-page tabs live inside the navbar row (between the menu toggle and the user menu)
 * instead of a second 40px bar under it.
 */
body.dcat-admin-body .iframe-tab-container {
    top: 0 !important;
    left: 52px !important;
    right: 248px;
    width: auto !important;
    height: var(--t-navbar-h) !important;
    z-index: 998;
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
}
body.dcat-admin-body .iframe-tab-container + .iframe-tab-wrapper { padding-top: var(--t-navbar-h) !important; background: var(--t-bg) !important; }
/* the strip scrolls natively (base.js: wheel, trackpad, the arrow buttons). With more tabs than fit, the
   edges fade (t-scroll-x / t-at-start / t-at-end, the same classes and fades as wide tables) */
body.dcat-admin-body .iframe-tab-container .swiper-container {
    width: auto !important; margin: 0 28px; height: var(--t-navbar-h);
    overflow-x: auto !important; overflow-y: hidden !important;
    scrollbar-width: none; overscroll-behavior-x: contain;
}
body.dcat-admin-body .iframe-tab-container .swiper-container::-webkit-scrollbar { display: none; }
body.dcat-admin-body #iframe-tab-container #iframe-tab { width: max-content !important; min-width: 100%; transform: none !important; margin: 0 !important; padding: 0; align-items: center; height: var(--t-navbar-h); user-select: none; -webkit-user-select: none; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-item { height: var(--t-navbar-h); display: flex; align-items: center; padding-right: 2px; }
/* tabs are quiet pills; the open page is filled */
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link {
    position: relative;
    height: var(--t-h-md); line-height: var(--t-h-md); padding: 0 12px;
    margin: 0 !important;
    display: inline-flex; align-items: center; gap: 6px;
    border: 0 !important;
    border-radius: var(--t-radius-sm) !important;
    color: var(--t-text-3) !important;
    background: transparent !important;
    font-size: var(--t-fs-sm); font-weight: 500;
    white-space: nowrap;
    box-shadow: none !important;
    transition: background-color var(--t-dur) var(--t-ease), color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link p { margin: 0; display: block; max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link i { font-size: var(--t-fs-sm); width: auto; color: var(--t-text-4); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link:hover { color: var(--t-text) !important; background: var(--t-surface-3) !important; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link:hover i { color: var(--t-text-3); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.active { color: var(--t-text) !important; background: var(--t-surface-3) !important; font-weight: 600; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.active i { color: var(--t-primary); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link::before,
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link::after { display: none !important; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-item + .nav-item .nav-link { border-left: 0 !important; }
/* close button: a small x at the end of the pill, in room kept for it (it never covers the name);
   it shows on the open tab and on hover. The pinned first tab has none. */
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link[data-first="0"] { padding-right: 28px; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .iframe-tab-close-btn {
    position: absolute; top: 50% !important; right: 6px !important; z-index: 1; transform: translateY(-50%);
    width: 18px; height: 18px; line-height: 18px; display: flex !important; align-items: center; justify-content: center;
    border-radius: var(--t-radius-xs); background: transparent;
    opacity: 0; transition: opacity var(--t-dur) var(--t-ease), background-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link:hover .iframe-tab-close-btn,
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.active .iframe-tab-close-btn,
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link:focus-visible .iframe-tab-close-btn { opacity: 1; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .iframe-tab-close-btn:hover { background: color-mix(in srgb, var(--t-text) 10%, transparent); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .iframe-tab-close-btn i { color: var(--t-text-4) !important; font-size: 13px !important; line-height: 1; margin: 0; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .iframe-tab-close-btn:hover i { color: var(--t-text) !important; }
/* pinned tabs (right-click → 固定标签) sit right after the home tab. A pin stands where the x would be,
   always visible; clicking it unpins. Feather has no pin, so it is drawn with a mask (Lucide "pin"). */
body.dcat-admin-body #iframe-tab-container #iframe-tab .iframe-tab-pin-btn { display: none; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned .iframe-tab-close-btn { display: none !important; }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned .iframe-tab-pin-btn {
    position: absolute; top: 50%; right: 6px; z-index: 1; transform: translateY(-50%);
    width: 18px; height: 18px; display: flex; align-items: center; justify-content: center;
    border-radius: var(--t-radius-xs); transition: background-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned .iframe-tab-pin-btn::before {
    content: ""; width: 13px; height: 13px; background: var(--t-text-4);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 17v5'/%3E%3Cpath d='M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z'/%3E%3C/svg%3E") center / contain no-repeat;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 17v5'/%3E%3Cpath d='M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z'/%3E%3C/svg%3E") center / contain no-repeat;
    transition: background-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned:hover .iframe-tab-pin-btn::before { background: var(--t-text-3); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned .iframe-tab-pin-btn:hover { background: color-mix(in srgb, var(--t-text) 10%, transparent); }
body.dcat-admin-body #iframe-tab-container #iframe-tab .nav-link.t-pinned .iframe-tab-pin-btn:hover::before { background: var(--t-text); }
/* drag a tab sideways to reorder it (base.js). It lifts and follows the pointer; the tabs it passes
   slide over; on release everything settles into place. The pinned first tab stays first. */
body.dcat-admin-body #iframe-tab > li.t-tab-shift { transition: transform var(--t-dur-slow) var(--t-ease-out); }
body.dcat-admin-body #iframe-tab > li.t-tab-drag { z-index: 3; transition: none; }
body.dcat-admin-body #iframe-tab-container #iframe-tab > li.t-tab-drag .nav-link {
    color: var(--t-text) !important; background: var(--t-surface) !important;
    box-shadow: 0 0 0 1px var(--t-border), 0 4px 12px -2px var(--t-edge-shadow) !important;
}
html.t-tab-dragging, html.t-tab-dragging * { cursor: grabbing !important; }
html.t-tab-dragging iframe { pointer-events: none; }
html.t-tab-dragging body.dcat-admin-body #iframe-tab-container #iframe-tab > li:not(.t-tab-drag) .nav-link:not(.active):hover { color: var(--t-text-3) !important; background: transparent !important; }
body.dcat-admin-body .iframe-tab-container .swiper-button-prev,
body.dcat-admin-body .iframe-tab-container .swiper-button-next {
    width: 24px !important; height: var(--t-h-md) !important;
    margin: 0 !important; top: 12px !important;
    display: flex; align-items: center; justify-content: center;
    background: transparent !important;
    color: var(--t-text-4) !important;
    border: 0 !important;
    border-radius: var(--t-radius-sm);
    box-shadow: none !important;
    font-size: var(--t-fs-xs);
}
body.dcat-admin-body .iframe-tab-container .swiper-button-prev { left: 0 !important; }
body.dcat-admin-body .iframe-tab-container .swiper-button-next { right: 0 !important; }
body.dcat-admin-body .iframe-tab-container .swiper-button-prev::after,
body.dcat-admin-body .iframe-tab-container .swiper-button-next::after { display: none !important; }
/* the scroll arrows only show when there are more tabs than fit */
body.dcat-admin-body .iframe-tab-container .swiper-button-disabled { opacity: 0 !important; pointer-events: none; }
body.dcat-admin-body .iframe-tab-container .swiper-button-prev:not(.swiper-button-disabled):hover,
body.dcat-admin-body .iframe-tab-container .swiper-button-next:not(.swiper-button-disabled):hover { color: var(--t-text) !important; background: var(--t-surface-3) !important; }
/* the user name/status block is hidden below 576px, so the tabs can use that room */
@media (max-width: 575.98px) {
    body.dcat-admin-body .iframe-tab-container { right: 96px; left: 44px !important; }
}
/* a confirm dialog or modal inside the page frame only dims the frame; theme.js marks the shell
   (html.t-frame-dim) so the sidebar and the top bar dim with it. Visual only: clicks still go through. */
html.t-frame-dim body.dcat-admin-body .main-sidebar::after,
html.t-frame-dim body.dcat-admin-body .iframe-tab-container::after {
    content: ""; position: absolute; inset: 0; z-index: 1100; pointer-events: none;
    background: var(--t-overlay); animation: t-fade-in var(--t-dur-slow) var(--t-ease-out);
}
/* the tab strip floats over the top bar, so one overlay stretched from it covers the whole bar
   (an overlay on each would darken the strip twice) */
html.t-frame-dim body.dcat-admin-body .iframe-tab-container::after { left: -52px; right: -248px; }
@media (max-width: 575.98px) {
    html.t-frame-dim body.dcat-admin-body .iframe-tab-container::after { left: -44px; right: -96px; }
}
/* the tab right-click menu reads like the other menus: left-aligned items, a light divider, grows in */
body.dcat-admin-body .mouse-click-menu {
    width: auto !important; min-width: 148px; padding: 4px !important;
    background: var(--t-surface) !important; border: 1px solid var(--t-border) !important; border-radius: var(--t-radius-sm); box-shadow: var(--t-shadow-lg) !important;
    animation: t-drop-in var(--t-dur-enter) var(--t-ease-out); transform-origin: top left;
}
body.dcat-admin-body .mouse-click-menu ul { margin: 0; padding: 0 !important; }
body.dcat-admin-body .mouse-click-menu .menu-item {
    height: auto !important; padding: 6px 10px; line-height: 20px !important;
    text-align: left !important; font-size: var(--t-fs-sm) !important; color: var(--t-text-2) !important;
    border-radius: var(--t-radius-xs); transition: background-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body .mouse-click-menu .menu-item:hover { color: var(--t-text) !important; background: var(--t-surface-3) !important; }
body.dcat-admin-body .mouse-click-menu .li_separate { margin: 4px 0 !important; border-bottom: 1px solid var(--t-border) !important; }

/* ---------- Page header & content ---------- */
body.dcat-admin-body.full-page .wrapper,
body.dcat-admin-body.full-page #pjax-container { padding: var(--t-page-py) var(--t-page-px) var(--t-space-10) !important; }
body.dcat-admin-body.full-page .wrapper:has(.login-main),
body.dcat-admin-body.full-page #pjax-container:has(.login-main) { padding: 0 !important; }
body.dcat-admin-body .content-header { padding: 0 0 var(--t-space-4); }
/* a page that has just loaded in its tab fades in rather than flashing in piece by piece. Opacity only:
   a transform here would turn the page into the frame of every position:fixed panel inside it. */
body.dcat-admin-body.full-page #app { animation: t-fade-in var(--t-dur-slow) var(--t-ease-out); }
body.dcat-admin-body .content-header > section.content-header { padding: 0 !important; margin: 0 !important; display: flex; align-items: baseline; min-height: 28px; }
body.dcat-admin-body .content-header > section.content-header > h1 { margin: 0 !important; float: none !important; }
body.dcat-admin-body .content-header > section.content-header > .clearfix { display: none; }
body.dcat-admin-body .content-header h1 {
    font-size: var(--t-fs-2xl) !important;
    font-weight: 650;
    letter-spacing: -.015em;
    color: var(--t-text) !important;
    margin: 0;
}
body.dcat-admin-body .content-header h1 small { font-size: var(--t-fs-sm) !important; color: var(--t-text-3) !important; font-weight: 400; padding-left: 8px; }
/* favourite star next to a form / detail page title: the same quiet star as on the list title */
body.dcat-admin-body .content-header h1 a:has(> .fav-star) { display: inline-flex; align-items: center; vertical-align: 2px; margin-left: 2px; }
body.dcat-admin-body .content-header h1 .fav-star { font-size: var(--t-fs-base); color: var(--t-text-4) !important; transition: color var(--t-dur) var(--t-ease); }
body.dcat-admin-body .content-header h1 a:hover .fav-star,
body.dcat-admin-body .content-header h1 .fav-star.fa-star { color: var(--t-warning) !important; }
body.dcat-admin-body .breadcrumb { background: transparent; font-size: var(--t-fs-xs); padding: 0; }
body.dcat-admin-body .breadcrumb-item, body.dcat-admin-body .breadcrumb-item a { color: var(--t-text-3) !important; }

/* ---------- Cards & boxes ---------- */
body.dcat-admin-body .card,
body.dcat-admin-body .box,
body.dcat-admin-body.dark-mode .card {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border) !important;
    border-radius: var(--t-radius) !important;
    box-shadow: var(--t-shadow-xs) !important;
}
body.dcat-admin-body .card .card,
body.dcat-admin-body .card .box { box-shadow: none !important; }
/* cards stacked by several $content->body() calls (a detail panel above a table) must not touch;
   rows of dashboard metric cards already keep 20px below themselves */
body.dcat-admin-body section.content > .row:not(:has(.card[id^=metric-card-], .t-metric)) + .row { margin-top: 20px; }
body.dcat-admin-body .card-header,
body.dcat-admin-body .box-header {
    background: transparent !important;
    border-bottom: 1px solid var(--t-border) !important;
    padding: 14px var(--t-card-px) !important;
}
body.dcat-admin-body .card-header .card-title,
body.dcat-admin-body .card-header .card-box-title,
body.dcat-admin-body .box-header .box-title,
body.dcat-admin-body .card-title {
    color: var(--t-text) !important;
    font-size: var(--t-fs-md) !important;
    font-weight: var(--t-fw-semibold);
    letter-spacing: -.005em;
}
body.dcat-admin-body .box-body, body.dcat-admin-body .card-body { color: var(--t-text-2); }
/* header tools (List / Delete / View links on forms and detail pages) are secondary actions */
body.dcat-admin-body .box-header .box-tools .btn,
body.dcat-admin-body .card-header .box-tools .btn,
body.dcat-admin-body .box-header .pull-right .btn,
body.dcat-admin-body .card-header .pull-right .btn {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border-strong) !important;
    color: var(--t-text-2) !important;
}
body.dcat-admin-body .box-header .box-tools .btn:hover,
body.dcat-admin-body .card-header .box-tools .btn:hover,
body.dcat-admin-body .box-header .pull-right .btn:hover,
body.dcat-admin-body .card-header .pull-right .btn:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .box-footer, body.dcat-admin-body .card-footer {
    background: var(--t-surface-2) !important;
    border-top: 1px solid var(--t-border) !important;
    border-radius: 0 0 var(--t-radius) var(--t-radius);
}

/* metric cards (dashboard numbers): app/Admin/Metrics/Home/*, markup from MetricMarkup.php */
body.dcat-admin-body .metric-header .card-title, body.dcat-admin-body .card-header h4 { color: var(--t-text-3) !important; font-size: var(--t-fs-sm) !important; font-weight: 500; }
body.dcat-admin-body .metric-content h2, body.dcat-admin-body .card h2.font-lg-2 { color: var(--t-text) !important; font-weight: 650; letter-spacing: -.02em; }
body.dcat-admin-body .row:has(> [class*=col-] > .card[id^=metric-card-]) > [class*=col-] { display: flex; }
body.dcat-admin-body .card[id^=metric-card-] {
    flex: 1; min-width: 0;
    min-height: 0 !important;
    margin-bottom: 20px;
    padding: var(--t-card-py) var(--t-card-px) 18px;
    display: flex; flex-direction: column;
}
body.dcat-admin-body .card[id^=metric-card-] > .card-header { padding: 0 !important; margin: 0 0 12px; border: 0 !important; background: transparent !important; align-items: center !important; min-height: var(--t-h-xs); }
body.dcat-admin-body .card[id^=metric-card-] > .card-header .card-title { margin: 0 !important; color: var(--t-text-2) !important; font-size: var(--t-fs-sm) !important; font-weight: 600; }
body.dcat-admin-body .card[id^=metric-card-] > .card-header .metric-header:empty { display: none; }
body.dcat-admin-body .card[id^=metric-card-] > .card-header::after { display: none !important; }
body.dcat-admin-body .card[id^=metric-card-] > .card-header > .btn,
body.dcat-admin-body .card[id^=metric-card-] .chart-dropdown > .btn {
    height: var(--t-h-xs); line-height: var(--t-h-xs); padding: 0 10px !important;
    border: 0 !important; border-radius: var(--t-radius-full) !important;
    background: var(--t-surface-3) !important;
    color: var(--t-text-3) !important;
    font-size: var(--t-fs-xs); font-weight: 500;
    box-shadow: none !important;
    display: inline-flex; align-items: center; gap: 4px;
}
body.dcat-admin-body .card[id^=metric-card-] .chart-dropdown > .btn:hover { color: var(--t-text) !important; }
body.dcat-admin-body .card[id^=metric-card-] .chart-dropdown > .btn::after { margin: 0 0 0 2px; border-top-width: 4px; border-left-width: 4px; border-right-width: 4px; vertical-align: middle; }
body.dcat-admin-body .card[id^=metric-card-] > .metric-content { flex: 1; display: flex; flex-direction: column; }
body.dcat-admin-body .t-metric { display: flex; flex-direction: column; flex: 1; }
body.dcat-admin-body .t-metric-value {
    color: var(--t-text);
    font-size: var(--t-fs-3xl); font-weight: 650; line-height: 1.15;
    letter-spacing: -.02em;
    font-variant-numeric: tabular-nums;
}
body.dcat-admin-body .t-metric-unit { margin-left: 6px; color: var(--t-text-3); font-size: var(--t-fs-sm); font-weight: 500; letter-spacing: 0; }
body.dcat-admin-body .t-metric-bar { display: flex; gap: 2px; height: 6px; margin: 14px 0 14px; border-radius: var(--t-radius-full); overflow: hidden; background: var(--t-surface-3); }
body.dcat-admin-body .t-metric-bar > span { min-width: 4px; }
body.dcat-admin-body .t-metric-grid { display: grid; grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr)); gap: 8px 20px; margin: 0; padding: 0; list-style: none; }
body.dcat-admin-body .t-metric-grid li { display: flex; align-items: center; gap: 8px; min-width: 0; font-size: var(--t-fs-sm); color: var(--t-text-2); }
body.dcat-admin-body .t-metric-grid li > i { width: 8px; height: 8px; border-radius: var(--t-radius-full); flex: none; }
body.dcat-admin-body .t-metric-grid li > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.dcat-admin-body .t-metric-grid li > b { color: var(--t-text); font-weight: 600; font-variant-numeric: tabular-nums; }
body.dcat-admin-body .t-metric-grid li.is-zero > b { color: var(--t-text-4); font-weight: 500; }
body.dcat-admin-body .t-metric-figures { margin-top: 14px; }
body.dcat-admin-body .t-metric-caption .feather { font-size: 13px; vertical-align: -1px; }
body.dcat-admin-body .t-metric-caption { margin-top: 6px; color: var(--t-text-3); font-size: var(--t-fs-xs); }
body.dcat-admin-body .t-metric-caption.is-warning { color: var(--t-warning); }
body.dcat-admin-body .t-metric-caption.is-danger { color: var(--t-danger); }
body.dcat-admin-body .t-metric-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: auto; padding-top: 18px; }
body.dcat-admin-body .t-metric-actions .btn { height: var(--t-h-md); display: inline-flex; align-items: center; gap: 6px; padding: 0 14px; box-shadow: none !important; }
/* plain dcat Cards holding a .t-metric (费用中心): same frame as the dashboard cards */
body.dcat-admin-body .row:has(> [class*=col-] > .card .t-metric) > [class*=col-] { display: flex; }
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) { flex: 1; min-width: 0; margin-bottom: 20px; display: flex; flex-direction: column; }
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) > .card-header { padding: 16px 18px 0 !important; border: 0 !important; background: transparent !important; }
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) > .card-header::after { display: none !important; }
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) > .card-header .card-box-title,
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) > .card-header .card-title { margin: 0; color: var(--t-text-2) !important; font-size: var(--t-fs-sm) !important; font-weight: 600; }
body.dcat-admin-body .card:not([id^=metric-card-]):has(> .card-body .t-metric) > .card-body { flex: 1; display: flex; flex-direction: column; padding: 12px 18px 18px !important; }
body.dcat-admin-body .t-metric-foot { margin-top: auto; padding-top: 12px; color: var(--t-text-3); font-size: var(--t-fs-xs); }
/* a card whose body is one table (central dashboard lists): the table runs edge to edge, one line per row */
body.dcat-admin-body .card > .card-body:has(> table.table:only-child) { padding: 0 !important; overflow-x: auto; }
body.dcat-admin-body .card > .card-body > table.table:only-child { margin: 0 !important; }
body.dcat-admin-body .card > .card-body > table.table:only-child th,
body.dcat-admin-body .card > .card-body > table.table:only-child td { white-space: nowrap; }
body.dcat-admin-body .card > .card-body > table.table:only-child th:first-child,
body.dcat-admin-body .card > .card-body > table.table:only-child td:first-child { padding-left: var(--t-card-px) !important; }
body.dcat-admin-body .card > .card-body > table.table:only-child th:last-child,
body.dcat-admin-body .card > .card-body > table.table:only-child td:last-child { padding-right: var(--t-card-px) !important; }
body.dcat-admin-body .card > .card-body > table.table:only-child tbody tr:last-child td { border-bottom: 0 !important; }
/* the grid follows the card's width, not the page's */
body.dcat-admin-body .card[id^=metric-card-] { container-type: inline-size; }
@container (max-width: 360px) {
    .t-metric-grid { --cols: 2 !important; }
}

/* ---------- Grid / data tables ----------
 * A list page is one card: toolbar (title + actions) on top, table, footer with pagination.
 * dcat renders the grid as .dcat-box with floated title/toolbar; this turns it into a card
 * and lays the header out with flexbox. Markup is untouched. */

/* the empty breadcrumb block dcat prints above every page */
body.dcat-admin-body .content-header:not(:has(h1, .breadcrumb, .breadcrumb-item)) { display: none; }

body.dcat-admin-body .dcat-box {
    background: var(--t-surface);
    border: 1px solid var(--t-border);
    border-radius: var(--t-radius);
    box-shadow: var(--t-shadow-xs);
}
body.dcat-admin-body .dcat-box + .dcat-box { margin-top: 16px; }
/* a Tab widget with no tabs (e.g. 广告列表) prints an empty strip with a bottom border */
body.dcat-admin-body .row:has(> [class*=col-] > div > ul.nav-tabs > li.header:only-child) { display: none; }
/* grids nested in cards, tabs and modals are already framed */
body.dcat-admin-body .card .dcat-box,
body.dcat-admin-body .modal .dcat-box,
body.dcat-admin-body .layui-layer .dcat-box,
body.dcat-admin-body .tab-content .tab-content .dcat-box { border: 0; border-radius: 0; box-shadow: none; }

/* toolbar */
body.dcat-admin-body .custom-data-table-header { padding: 0 !important; }
body.dcat-admin-body .custom-data-table-header > .table-responsive { overflow: visible; }
body.dcat-admin-body .custom-data-table-header .table-responsive .top,
body.dcat-admin-body .grid-toolbar {
    display: flex !important;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px 16px;
    justify-content: flex-start;
    padding: 14px 16px !important;
    border-bottom: 1px solid var(--t-border);
}
body.dcat-admin-body .custom-data-table-header .top::before,
body.dcat-admin-body .custom-data-table-header .top::after { display: none; }

body.dcat-admin-body .custom-data-table-header .top > h4 {
    float: none !important;
    margin: 0 auto 0 0 !important;
    display: flex;
    align-items: center;
    gap: 8px;
    min-height: var(--t-h-md);
    font-size: var(--t-fs-lg) !important;
    font-weight: 600;
    letter-spacing: -.01em;
    color: var(--t-text) !important;
    white-space: nowrap;
}
body.dcat-admin-body .custom-data-table-header .top > h4 .fav-star { font-size: var(--t-fs-base); color: var(--t-text-4) !important; transition: color var(--t-dur) var(--t-ease); }
body.dcat-admin-body .custom-data-table-header .top > h4 a:hover .fav-star,
body.dcat-admin-body .custom-data-table-header .top > h4 .fav-star.fa-star { color: var(--t-warning) !important; }
body.dcat-admin-body .custom-data-table-header .top > h4 small { display: inline-flex; }
body.dcat-admin-body .custom-data-table-header .top > h4 small .async-pagination,
body.dcat-admin-body .custom-data-table-header .top > h4 small > span {
    font-size: var(--t-fs-xs);
    font-weight: 500;
    line-height: 20px;
    padding: 0 8px;
    border-radius: var(--t-radius-full);
    background: var(--t-surface-3);
    color: var(--t-text-3) !important;
}
body.dcat-admin-body .custom-data-table-header .top > h4 small b { color: var(--t-text-2); font-weight: 600; }

/* controls get a row of their own under the title: search on the left, actions on the right.
 * A fixed layout reads the same on every list page, however many tools a page adds. */
body.dcat-admin-body .custom-data-table-header .top > .pull-right {
    float: none !important;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: 8px;
}
body.dcat-admin-body .custom-data-table-header .top > .pull-right > * { float: none !important; margin: 0 !important; }
/* items dcat floats right sit at the end of the row */
body.dcat-admin-body .custom-data-table-header .top > .pull-right > .pull-right { order: 10; }
/* 新增 is the one primary action, so it is always the last button: dcat puts export after it, and a
   page's own create button (a custom tool) would otherwise sit before the column picker */
body.dcat-admin-body .custom-data-table-header .top > .pull-right > a.btn-primary[href*="/create"],
body.dcat-admin-body .custom-data-table-header .top > .pull-right > .dialog-create,
body.dcat-admin-body .custom-data-table-header .top > .pull-right > span:has(.grid-create-btn) { order: 20; }
body.dcat-admin-body .custom-data-table-header .top > .pull-right > .quick-search-form { order: -1; margin-right: auto !important; }
body.dcat-admin-body .custom-data-table-header .top:has(> h4) > .pull-right { flex: 1 0 100%; }
/* without a search box the toolbar shares the title row instead of taking a row of its own */
body.dcat-admin-body .custom-data-table-header .top:has(> h4) > .pull-right:not(:has(> .quick-search-form)) { flex: 0 1 auto; margin-left: auto !important; }
/* toolbars without a title (dashboard widgets): one row, dcat's right-floated group on the right */
body.dcat-admin-body .custom-data-table-header .top:not(:has(> h4)) { gap: 8px; justify-content: flex-start; }
body.dcat-admin-body .custom-data-table-header .top:not(:has(> h4)) > * { float: none !important; margin: 0 !important; }
body.dcat-admin-body .custom-data-table-header .top:not(:has(> h4)) > div.pull-right { order: 10; margin-left: auto !important; }
body.dcat-admin-body .custom-data-table-header .top:not(:has(> h4)) > label.pull-right { order: 11; }
body.dcat-admin-body .custom-data-table-header .top:not(:has(> h4)) > span:not(.dropdown) { display: inline-flex; font-size: 0; }
/* the toolbar repeats the per-page picker that the footer already has */
body.dcat-admin-body .dcat-box:has(.box-footer .per-pages-selector) .custom-data-table-header .top label.pull-right:has(stub) { display: none !important; }
/* custom tools are wrapped in a <span> with a trailing &nbsp; */
body.dcat-admin-body .custom-data-table-header .top > .pull-right > span:not(.dropdown) { display: inline-flex; font-size: 0; }

/* every toolbar control is the same height */
body.dcat-admin-body .custom-data-table-header .btn,
body.dcat-admin-body.dark-mode .custom-data-table-header .btn {
    height: var(--t-h-md);
    padding: 0 12px !important;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0 !important;
    font-size: var(--t-fs-sm) !important;
    font-weight: 500;
    line-height: 1;
    white-space: nowrap;
    border-radius: var(--t-radius-sm) !important;
}
body.dcat-admin-body .custom-data-table-header .btn > span.d-sm-inline:empty { display: none !important; }
body.dcat-admin-body .custom-data-table-header .btn i { font-size: var(--t-fs-base); }
body.dcat-admin-body .custom-data-table-header .btn .caret { margin: 0; }
body.dcat-admin-body .custom-data-table-header .btn-group { gap: 0; }
/* split buttons (filter + scope menu) read as one control */
body.dcat-admin-body .custom-data-table-header .btn-group > .btn:has(~ .btn) { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; border-right: 0 !important; }
body.dcat-admin-body .custom-data-table-header .btn-group > .btn + .btn,
body.dcat-admin-body .custom-data-table-header .btn-group > .dropdown-menu + .btn { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; padding: 0 9px !important; }
body.dcat-admin-body .custom-data-table-header .filter-count:not(:empty) {
    min-width: 18px; height: 18px; padding: 0 5px;
    border-radius: var(--t-radius-full);
    background: var(--t-primary); color: var(--t-on-primary);
    font-size: var(--t-fs-2xs); line-height: 18px; text-align: center;
}

/* quick search: an input with a magnifier, no box around it */
body.dcat-admin-body .quick-search-form .table-filter { background: transparent !important; border: 0 !important; padding: 0 !important; margin: 0 !important; }
body.dcat-admin-body .quick-search-form label { width: 240px !important; margin: 0 !important; position: relative; display: block; }
body.dcat-admin-body .quick-search-form .quick-search-input,
body.dcat-admin-body.dark-mode .quick-search-form .quick-search-input {
    height: var(--t-h-md) !important;
    min-height: var(--t-h-md);
    width: 100%;
    padding: 0 10px 0 32px !important;
    font-size: var(--t-fs-sm) !important;
    background-image: none !important;
    box-shadow: none !important;
}
body.dcat-admin-body .quick-search-form .quick-search-input:focus { box-shadow: var(--t-ring) !important; }
body.dcat-admin-body .quick-search-form .quick-search-input::placeholder { font-size: var(--t-fs-sm) !important; color: var(--t-text-4) !important; }
body.dcat-admin-body .grid-quick-search, body.dcat-admin-body .quick-search { border-radius: var(--t-radius-sm); }
body.dcat-admin-body .quick-search .form-control,
body.dcat-admin-body .grid-quick-search .form-control { border-radius: var(--t-radius-sm) !important; height: var(--t-h-md); }

/* dcat's "outline" buttons (refresh, filter, columns, export, per-page...): neutral bordered buttons */
body.dcat-admin-body .btn.btn-outline,
body.dcat-admin-body .custom-data-table-header .btn.btn-outline,
body.dcat-admin-body.dark-mode .custom-data-table-header .btn.btn-outline,
body.dcat-admin-body .custom-data-table-header .btn.btn-white {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border-strong) !important;
    color: var(--t-text-2) !important;
}
body.dcat-admin-body .btn.btn-outline i,
body.dcat-admin-body .custom-data-table-header .btn i { color: var(--t-text-3) !important; }
body.dcat-admin-body .btn.btn-outline:hover,
body.dcat-admin-body .custom-data-table-header .btn.btn-outline:hover,
body.dcat-admin-body .custom-data-table-header .btn.btn-white:hover {
    background: var(--t-surface-3) !important;
    color: var(--t-text) !important;
}
body.dcat-admin-body .custom-data-table-header .btn:hover i { color: var(--t-text-2) !important; }
/* the one primary action in a grid toolbar: Create */
body.dcat-admin-body .btn.btn-primary.btn-outline.dialog-create,
body.dcat-admin-body .grid-create-btn .btn.btn-primary,
body.dcat-admin-body .custom-data-table-header .grid-create-btn .btn {
    background: var(--t-primary) !important;
    border-color: var(--t-primary) !important;
    color: var(--t-on-primary) !important;
}
body.dcat-admin-body .btn.btn-primary.btn-outline.dialog-create i,
body.dcat-admin-body .grid-create-btn .btn i { color: var(--t-on-primary) !important; }
body.dcat-admin-body .btn.btn-primary.btn-outline.dialog-create:hover,
body.dcat-admin-body .grid-create-btn .btn:hover { background: var(--t-primary-hover) !important; border-color: var(--t-primary-hover) !important; }
/* "新增" is the primary action whether it opens a dialog or links to a create page */
body.dcat-admin-body a.btn.btn-primary.btn-outline[href*="/create"] {
    background: var(--t-primary) !important;
    border-color: var(--t-primary) !important;
    color: var(--t-on-primary) !important;
}
body.dcat-admin-body a.btn.btn-primary.btn-outline[href*="/create"] i { color: var(--t-on-primary) !important; }
body.dcat-admin-body a.btn.btn-primary.btn-outline[href*="/create"]:hover { background: var(--t-primary-hover) !important; border-color: var(--t-primary-hover) !important; }

/* batch-action bar that replaces the toolbar when rows are selected */
body.dcat-admin-body .custom-data-table-header .grid-select-all-btn .btn { background: var(--t-primary-soft) !important; border-color: transparent !important; color: var(--t-primary-soft-text) !important; }

/* filter panel */
body.dcat-admin-body .filter-box, body.dcat-admin-body .table-filter {
    background: var(--t-surface-2) !important;
    border-top: 0 !important;
    border-bottom: 1px solid var(--t-border) !important;
}
body.dcat-admin-body .dcat-box > .filter-box { padding: 16px !important; margin: 0 !important; }
/* right-hand filter drawer: one plain panel (dcat nests a shadowed card inside the drawer),
   a title bar that stays put while the fields scroll, labels above the fields */
body.dcat-admin-body .slider-panel { background: var(--t-surface) !important; border: 0 !important; border-left: 1px solid var(--t-border) !important; box-shadow: var(--t-shadow-lg) !important; }
body.dcat-admin-body .slider-panel > .slider-content { padding: 0 !important; margin: 0 !important; top: 0 !important; height: 100% !important; background: var(--t-surface) !important; }
body.dcat-admin-body .right-side-filter-container {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    margin: 0 !important;
    width: 100% !important;
}
body.dcat-admin-body .right-side-filter-container .grid-filter-form > .mb-1 {
    position: sticky; top: 0; z-index: 5;
    height: auto !important;
    margin: 0 0 16px !important;
}
body.dcat-admin-body .right-side-filter-container .header {
    position: static !important;
    width: auto !important;
    margin: 0 !important;
    align-items: center;
    background: var(--t-surface) !important;
    border-bottom: 1px solid var(--t-border);
    padding: 12px 20px !important;
    gap: 8px;
}
body.dcat-admin-body .right-side-filter-container .header::before { content: "筛选"; color: var(--t-text); font-size: var(--t-fs-md); font-weight: 600; }
body.dcat-admin-body .right-side-filter-container .header > div { display: flex; flex-direction: row-reverse; gap: 8px; }
body.dcat-admin-body .right-side-filter-container .header .btn { height: var(--t-h-md); display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; }
body.dcat-admin-body .right-side-filter-container .grid-filter-form { padding-bottom: 24px; }
/* every field sits in its own .filter-input column; some get a narrower col-* width */
body.dcat-admin-body .right-side-filter-container .filter-input { flex: 0 0 100%; max-width: 100%; width: 100%; padding: 0 20px !important; }
body.dcat-admin-body .right-side-filter-container .grid-filter-form .form-group { margin-bottom: 14px; }
body.dcat-admin-body .right-side-filter-container .input-group { flex-wrap: wrap; width: 100%; align-items: center; }
body.dcat-admin-body .right-side-filter-container .input-group > .input-group-prepend { flex: 0 0 100%; margin: 0 0 6px !important; background: transparent !important; border: 0 !important; }
/* on phones dcat makes the drawer 20px wider than the screen and shifts it left */
@media (max-width: 575.98px) {
    body.dcat-admin-body .slider-panel.open { left: auto !important; right: 0 !important; width: 100vw !important; }
    body.dcat-admin-body .slider-panel > .slider-content { width: 100% !important; left: auto !important; right: 0 !important; }
}
body.dcat-admin-body .right-side-filter-container .input-group > .input-group-prepend > .input-group-text {
    min-width: 0; height: auto; padding: 0 !important;
    border: 0 !important; background: transparent !important;
    color: var(--t-text-2) !important;
    font-size: var(--t-fs-xs) !important;
}
body.dcat-admin-body .right-side-filter-container .input-group-text b { font-weight: 500; }
/* min-width 40% pushes a single field onto its own line under the label, while the two halves
   of a range (40% + 24px + 40%) still share one line */
body.dcat-admin-body .right-side-filter-container .input-group > .form-control:not(.select2-hidden-accessible),
body.dcat-admin-body .right-side-filter-container .input-group > .select2-container { flex: 1 1 0% !important; width: auto !important; min-width: 40%; }
body.dcat-admin-body .right-side-filter-container .input-group > .select2-hidden-accessible { flex: none !important; }
body.dcat-admin-body .right-side-filter-container .input-group > .form-control,
body.dcat-admin-body .right-side-filter-container .input-group .select2-selection { border-radius: var(--t-radius-sm) !important; }
body.dcat-admin-body .right-side-filter-container .form-control,
body.dcat-admin-body .right-side-filter-container .select2-selection { min-height: var(--t-h-lg) !important; font-size: var(--t-fs-sm) !important; box-shadow: none !important; }
body.dcat-admin-body .right-side-filter-container .form-control::placeholder { font-size: var(--t-fs-sm) !important; }
/* ranges: "from – to" */
body.dcat-admin-body .right-side-filter-container .input-group > .input-group-addon {
    flex: none; width: 24px; height: var(--t-h-lg); padding: 0; border: 0 !important; background: transparent !important;
    font-size: 0; display: flex; align-items: center; justify-content: center;
}
body.dcat-admin-body .right-side-filter-container .input-group > .input-group-addon::before { content: "–"; color: var(--t-text-4); font-size: var(--t-fs-sm); }
body.dcat-admin-body .right-side-filter-container .select2-selection--multiple .select2-search__field,
body.dcat-admin-body .right-side-filter-container .select2-selection--multiple .select2-search__field::placeholder { font-size: var(--t-fs-sm) !important; }

/* table */
body.dcat-admin-body .dcat-box .table-wrapper { margin: 0 !important; }
/* fixed-column grids: no grey strip above the table */
body.dcat-admin-body .table-wrapper.table-collapse { background: transparent !important; }
body.dcat-admin-body .table-wrapper.table-collapse > .tables-container { margin-top: 0 !important; }
body.dcat-admin-body table.custom-data-table.data-table,
body.dcat-admin-body:not(.dark-mode) .table-collapse .custom-data-table,
body.dcat-admin-body.dark-mode .table-collapse .table.custom-data-table {
    border-collapse: separate !important;
    border-spacing: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    background: transparent !important;
}
body.dcat-admin-body table.custom-data-table.data-table thead th,
body.dcat-admin-body .table thead th {
    background: var(--t-surface-2) !important;
    color: var(--t-text-3) !important;
    font-size: var(--t-fs-xs) !important;
    font-weight: 600 !important;
    text-transform: none;
    letter-spacing: .01em;
    border-top: 0 !important;
    border-bottom: 1px solid var(--t-border) !important;
    height: var(--t-head-h) !important;
    padding: 8px var(--t-cell-px) !important;
    vertical-align: middle !important;
    white-space: nowrap;
}
body.dcat-admin-body table.custom-data-table.data-table thead th a,
body.dcat-admin-body table.custom-data-table.data-table thead th i { color: var(--t-text-4) !important; }
body.dcat-admin-body table.custom-data-table.data-table thead th a:hover i { color: var(--t-text-2) !important; }
body.dcat-admin-body table.custom-data-table.data-table thead th .feather { font-size: var(--t-fs-xs); margin-left: 2px; }
body.dcat-admin-body table.custom-data-table.data-table tbody tr,
body.dcat-admin-body:not(.dark-mode) .table-collapse table.custom-data-table tbody tr,
body.dcat-admin-body.dark-mode table.custom-data-table tbody tr {
    background: var(--t-surface) !important;
    box-shadow: none !important;
    border-radius: 0 !important;
}
body.dcat-admin-body table.custom-data-table.data-table tbody td,
body.dcat-admin-body:not(.dark-mode) .table-collapse .custom-data-table tbody td,
body.dcat-admin-body.dark-mode .table-collapse table.custom-data-table.data-table tbody td,
body.dcat-admin-body .table td {
    border: 0 !important;
    border-bottom: 1px solid var(--t-border) !important;
    border-radius: 0 !important;
    height: var(--t-row-h) !important;
    padding: 8px var(--t-cell-px) !important;
    color: var(--t-text) !important;
    font-size: var(--t-fs-sm);
    vertical-align: middle !important;
}
body.dcat-admin-body table.custom-data-table.data-table tbody tr:last-child td { border-bottom: 0 !important; }
body.dcat-admin-body table.custom-data-table.data-table tbody tr:hover,
body.dcat-admin-body table.custom-data-table.data-table tbody tr:hover td { background: var(--t-surface-2) !important; }
/* dcat fades every row property over .3s, which makes hover lag behind the pointer */
body.dcat-admin-body table.custom-data-table.data-table tbody tr,
body.dcat-admin-body table.custom-data-table.data-table tbody td { transition: background-color var(--t-dur) var(--t-ease) !important; }
/* row actions (app/Admin/Grid/Displayers/RowActions.php): a ⋮ button pinned to the right edge,
   so it stays in reach when a wide table scrolls sideways */
body.dcat-admin-body table.custom-data-table th.grid__actions__,
body.dcat-admin-body table.custom-data-table td.grid__actions__ {
    position: sticky; right: 0; z-index: 2;
    width: 52px; min-width: 52px; padding: 0 12px !important;
    text-align: center;
    background: var(--t-surface);
    box-shadow: inset 1px 0 0 var(--t-border);
}
body.dcat-admin-body table.custom-data-table th.grid__actions__ { background: var(--t-surface-2); }
/* an open row menu stays above the pinned action cells of the rows under it */
body.dcat-admin-body table.custom-data-table tr:has(.dropdown-menu.show) > td.grid__actions__ { z-index: 6; }

/* wide tables: theme.js marks the scroller (.table-responsive) with
     t-scroll-x  the table is wider than the card      t-pinned   it has the pinned actions column
     t-at-start / t-at-end  scrolled all the way left / right       t-fits     it fits: no sideways scroll
   Columns hidden under the pinned column cast a shadow on it; hidden columns on a side without a
   pinned column fade out at that edge. */
body.dcat-admin-body .t-scroll-x.t-pinned:not(.t-at-end) > table.custom-data-table th.grid__actions__,
body.dcat-admin-body .t-scroll-x.t-pinned:not(.t-at-end) > table.custom-data-table td.grid__actions__ { box-shadow: inset 1px 0 0 var(--t-border), -12px 0 12px -12px var(--t-edge-shadow); }
body.dcat-admin-body .t-scroll-x:not(.t-at-start):is(.t-at-end, .t-pinned) { -webkit-mask-image: linear-gradient(to right, transparent, #000 32px); mask-image: linear-gradient(to right, transparent, #000 32px); }
body.dcat-admin-body .t-scroll-x.t-at-start:not(.t-at-end):not(.t-pinned) { -webkit-mask-image: linear-gradient(to left, transparent, #000 32px); mask-image: linear-gradient(to left, transparent, #000 32px); }
body.dcat-admin-body .t-scroll-x:not(.t-at-start):not(.t-at-end):not(.t-pinned) { -webkit-mask-image: linear-gradient(to right, transparent, #000 32px, #000 calc(100% - 32px), transparent); mask-image: linear-gradient(to right, transparent, #000 32px, #000 calc(100% - 32px), transparent); }
/* a table that fits keeps its header row in view on long pages (no sideways scroller to trap it) */
body.dcat-admin-body .table-responsive.t-fits { overflow: visible !important; }
body.dcat-admin-body .t-fits > table.custom-data-table:not(.complex-headers) > thead > tr > th { position: sticky; top: 0; z-index: 3; }
body.dcat-admin-body .t-fits > table.custom-data-table:not(.complex-headers) > thead > tr > th.grid__actions__ { z-index: 4; }
/* status dots: dcat prints a 13px fa-circle glyph with an inline color */
body.dcat-admin-body td i.fa.fa-circle[style*="color"],
body.dcat-admin-body .show-field i.fa.fa-circle[style*="color"] {
    display: inline-block; width: 8px; height: 8px; vertical-align: 1px;
    font-size: 0 !important; border-radius: var(--t-radius-full);
    background: currentColor;
    box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 18%, transparent);
}
body.dcat-admin-body td i.fa.fa-circle[style*="color"]::before,
body.dcat-admin-body .show-field i.fa.fa-circle[style*="color"]::before { content: none; } /* an empty glyph moved the dot's baseline: it hung below the text */
/* dcat prints unknown color names as they are (Facebook::STATUS_COLORS uses '60'): an invalid color, so
   the dot turned black. Treat them as the neutral grey they were meant to be. */
body.dcat-admin-body i.fa.fa-circle:is([style$="color: 40"], [style$="color: 50"], [style$="color: 60"], [style$="color: 70"], [style$="color: 80"], [style$="color: 90"]) { color: var(--t-text-4) !important; }
/* grouped headers (->combine()): dcat draws them as a bordered table; keep only light vertical dividers */
body.dcat-admin-body table.custom-data-table.complex-headers thead th {
    border-top: 0 !important; border-left: 0 !important;
    border-right: 1px solid var(--t-border) !important;
    border-bottom: 1px solid var(--t-border) !important;
}
body.dcat-admin-body table.custom-data-table.complex-headers thead tr:first-child th:last-child,
body.dcat-admin-body table.custom-data-table.complex-headers thead tr + tr th:last-child { border-right: 0 !important; }
body.dcat-admin-body table.custom-data-table.complex-headers thead th[colspan] { color: var(--t-text-2) !important; text-align: left; }
body.dcat-admin-body table.custom-data-table.complex-headers { border: 0 !important; }
/* grids whose rows have no actions at all: drop the empty column */
body.dcat-admin-body table.custom-data-table:not(:has(td.grid__actions__ .grid-dropdown-actions)) .grid__actions__ { display: none !important; }
body.dcat-admin-body table.custom-data-table td.grid__actions__ .grid-dropdown-actions > a {
    display: inline-flex !important; align-items: center; justify-content: center;
    width: 28px; height: var(--t-h-sm); padding: 0 !important;
    border-radius: var(--t-radius-sm);
    color: var(--t-text-4) !important;
    font-size: var(--t-fs-md);
}
body.dcat-admin-body table.custom-data-table tr:hover td.grid__actions__ .grid-dropdown-actions > a { color: var(--t-text-2) !important; }
body.dcat-admin-body table.custom-data-table td.grid__actions__ .grid-dropdown-actions > a:hover,
body.dcat-admin-body table.custom-data-table td.grid__actions__ .grid-dropdown-actions.show > a { background: var(--t-surface-3); color: var(--t-text) !important; }
body.dcat-admin-body table.custom-data-table td.grid__actions__ .dropdown-menu { left: auto !important; right: 0; min-width: 140px; }
/* no room below (theme.js): open upward */
body.dcat-admin-body .grid-dropdown-actions.t-drop-flip > .dropdown-menu { top: auto !important; bottom: 100%; margin: 0 0 2px !important; animation-name: t-drop-up; transform-origin: bottom; }
body.dcat-admin-body table.custom-data-table td.grid__actions__ .dropdown-menu .dropdown-item i { width: 16px; margin-right: 6px; color: var(--t-text-4); }
body.dcat-admin-body table.custom-data-table.data-table tbody tr.selected td,
body.dcat-admin-body table.custom-data-table.data-table tbody tr.selected { background: var(--t-primary-soft) !important; }
body.dcat-admin-body table.custom-data-table.data-table tbody tr.selected td:first-child { box-shadow: inset 3px 0 0 var(--t-primary); }
body.dcat-admin-body table.custom-data-table.data-table thead th:first-child,
body.dcat-admin-body table.custom-data-table.data-table tbody td:first-child { padding-left: var(--t-edge-px) !important; }
body.dcat-admin-body table.custom-data-table.data-table thead th:last-child,
body.dcat-admin-body table.custom-data-table.data-table tbody td:last-child { padding-right: var(--t-edge-px) !important; }
body.dcat-admin-body .table-fixed-left, body.dcat-admin-body .table-fixed-right { background: var(--t-surface); }
body.dcat-admin-body .table-fixed-right { box-shadow: -6px 0 12px -10px rgba(16, 24, 40, .25) !important; }
body.dcat-admin-body .table-fixed-left { box-shadow: 6px 0 12px -10px rgba(16, 24, 40, .25) !important; }

/* empty state: dcat prints one row with "暂无数据" pinned to the left edge of a wide table */
body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan]:has(> div > .help-block) {
    height: auto !important;
    padding: 0 !important;
    border-bottom: 0 !important;
    background: var(--t-surface) !important;
}
body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div:has(> .help-block) {
    position: sticky;
    left: 0;
    width: 100%;
    margin: 0 !important;
    padding: 56px 16px;
    display: flex;
    justify-content: center;
}
body.full-page.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div:has(> .help-block) { width: calc(100vw - 58px); }
body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div > .help-block {
    display: flex !important;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    margin: 0 !important;
    font-size: var(--t-fs-sm);
    color: var(--t-text-3) !important;
}
body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div > .help-block i {
    width: 44px; height: 44px;
    border-radius: var(--t-radius);
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--t-surface-3);
    color: var(--t-text-4);
    font-size: var(--t-fs-2xl);
}

body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div > .help-block i.icon-alert-circle::before { content: "\e87d"; }
body.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div > .help-block { font-weight: var(--t-fw-medium); }

/* cell content: what dcat's column displayers print inside a row */
/* long one-line text (URLs, notes): theme.js wraps it in .t-clip once it is wider than 360px.
   The full text is in the tooltip, and selecting the cell still copies all of it. */
body.dcat-admin-body td .t-clip { display: inline-block; max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
/* inline edit (->editable(), ->textarea() ...): reads as data; the dashed line says it can be edited */
body.dcat-admin-body [data-editinline="popover"],
body.dcat-admin-body.dark-mode [data-editinline="popover"] {
    color: inherit !important;
    border-bottom: 1px dashed var(--t-text-4) !important;
    text-decoration: none !important;
    transition: color var(--t-dur) var(--t-ease), border-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body [data-editinline="popover"]:hover,
body.dcat-admin-body [data-editinline="popover"][aria-describedby] { color: var(--t-primary) !important; border-bottom-color: currentColor !important; }
body.dcat-admin-body [data-editinline="popover"] .icon-edit-2 { color: var(--t-text-4); font-size: var(--t-fs-sm); }
/* "more" toggle of ->limit(): a quiet chevron */
body.dcat-admin-body .limit-more { color: var(--t-text-4) !important; text-decoration: none !important; }
body.dcat-admin-body .limit-more:hover { color: var(--t-primary) !important; }
body.dcat-admin-body .limit-more .fa-angle-double-down::before { font-family: "feather" !important; content: "\e842"; }
body.dcat-admin-body .limit-more .fa-angle-double-up::before { font-family: "feather" !important; content: "\e845"; }
/* status select in a row (->select()): a compact control, centred like the rest of the row */
body.dcat-admin-body td .input-group-sm { flex-wrap: nowrap; min-width: 104px; }
body.dcat-admin-body td .input-group-sm .select2-container--default .select2-selection--single {
    height: var(--t-h-md) !important; min-height: var(--t-h-md) !important; padding: 0 !important;
    font-size: var(--t-fs-sm); box-shadow: none !important;
}
body.dcat-admin-body td .input-group-sm .select2-container--default .select2-selection--single .select2-selection__rendered { line-height: calc(var(--t-h-md) - 2px) !important; padding: 0 28px 0 10px !important; }
body.dcat-admin-body td .input-group-sm .select2-container--default .select2-selection--single .select2-selection__arrow { height: calc(var(--t-h-md) - 2px) !important; top: 0 !important; right: 4px !important; }
/* thumbnails (->image()) and video previews */
body.dcat-admin-body td .img-thumbnail { padding: 2px; background: var(--t-surface); border: 1px solid var(--t-border); border-radius: var(--t-radius-sm); box-shadow: none; }
body.dcat-admin-body td video { display: block; max-width: 160px; max-height: 90px; border-radius: var(--t-radius-sm); background: var(--t-surface-3); }
/* expandable rows (->expand()) */
body.dcat-admin-body .grid-expand > a { display: inline-flex; align-items: center; gap: 4px; color: var(--t-text-2) !important; }
body.dcat-admin-body .grid-expand > a:hover { color: var(--t-primary) !important; }
body.dcat-admin-body .grid-expand > a > i { color: var(--t-text-4); transition: transform var(--t-dur) var(--t-ease); }
body.dcat-admin-body .grid-expand[aria-expanded="true"] > a > i { transform: rotate(90deg); }

/* "nothing yet" line inside a card (central dashboard lists) */
body.dcat-admin-body .t-empty { padding: 28px 0; text-align: center; color: var(--t-text-3); font-size: var(--t-fs-sm); }

/* totals above a grid (App\Admin\Grid\StatStrip, via $grid->header()) */
body.dcat-admin-body .t-stats { display: flex; flex-wrap: wrap; row-gap: 12px; padding: 14px var(--t-edge-px); border-bottom: 1px solid var(--t-border); }
body.dcat-admin-body .card-header:has(> .t-stats) { padding: 0 !important; border-bottom: 0 !important; background: transparent !important; }
body.dcat-admin-body .t-stat { display: flex; flex-direction: column; gap: 2px; padding: 0 24px; border-left: 1px solid var(--t-border); }
body.dcat-admin-body .t-stat:first-child { padding-left: 0; border-left: 0; }
body.dcat-admin-body .t-stat-label { color: var(--t-text-3); font-size: var(--t-fs-xs); line-height: 16px; white-space: nowrap; }
body.dcat-admin-body .t-stat-value { color: var(--t-text); font-size: var(--t-fs-lg); font-weight: var(--t-fw-semibold); line-height: 24px; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* phones: totals in two columns (a wrapped flex row kept each line's dividers and indents) */
@media (max-width: 575.98px) {
    body.dcat-admin-body .t-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 16px; }
    body.dcat-admin-body .t-stat { padding: 0; border-left: 0; }
}

/* review reports (App\Admin\Reports): time presets above the totals, numbers, row labels */
body.dcat-admin-body .card-header:has(> .t-report-bar) { padding: 0 !important; border-bottom: 0 !important; background: transparent !important; }
body.dcat-admin-body .t-report-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; padding: 14px var(--t-edge-px) 0; }
body.dcat-admin-body .t-report-bar:last-child { padding-bottom: 14px; border-bottom: 1px solid var(--t-border); }
body.dcat-admin-body .t-range { display: inline-flex; flex-wrap: wrap; gap: 2px; padding: 2px; border-radius: var(--t-radius-sm); background: var(--t-surface-3); }
body.dcat-admin-body .t-range-btn { display: inline-flex; align-items: center; height: var(--t-h-sm); padding: 0 10px; border-radius: 6px; color: var(--t-text-2); font-size: var(--t-fs-sm); white-space: nowrap; transition: background-color var(--t-dur) var(--t-ease), color var(--t-dur) var(--t-ease); }
body.dcat-admin-body .t-range-btn:hover { color: var(--t-text); text-decoration: none; }
body.dcat-admin-body .t-range-btn:focus-visible { outline: none; box-shadow: var(--t-ring); }
body.dcat-admin-body .t-range-btn.active { background: var(--t-surface); color: var(--t-text); font-weight: var(--t-fw-medium); box-shadow: var(--t-shadow-xs); }
body.dcat-admin-body .t-report-range { color: var(--t-text-3); font-size: var(--t-fs-sm); font-variant-numeric: tabular-nums; }
body.dcat-admin-body .t-report-link { margin-left: auto; font-size: var(--t-fs-sm); white-space: nowrap; }
body.dcat-admin-body .t-report-link .feather { font-size: 13px; vertical-align: -1px; }
/* ad accounts whose hourly data has stopped (App\Admin\Reports\SyncStatus), above the presets */
body.dcat-admin-body .t-sync-notice { display: flex; align-items: center; gap: 8px; margin: 14px var(--t-edge-px) 0; padding: 8px 12px; border-radius: var(--t-radius-sm); background: var(--t-warning-soft); color: var(--t-text); font-size: var(--t-fs-sm); line-height: 20px; }
body.dcat-admin-body .t-sync-notice .feather { flex: none; color: var(--t-warning); font-size: 14px; }
body.dcat-admin-body .t-sync-notice a { margin-left: auto; white-space: nowrap; }
body.dcat-admin-body table th.t-num,
body.dcat-admin-body table td.t-num { text-align: right; }
body.dcat-admin-body table td.t-num { white-space: nowrap; }
body.dcat-admin-body .t-sub { display: block; margin-top: 2px; color: var(--t-text-3); font-size: var(--t-fs-xs); font-weight: var(--t-fw-regular); line-height: 16px; }
body.dcat-admin-body .t-pos { color: var(--t-success) !important; }
body.dcat-admin-body .t-neg { color: var(--t-danger) !important; }
body.dcat-admin-body td .t-pos,
body.dcat-admin-body td .t-neg { font-weight: var(--t-fw-medium); }
body.dcat-admin-body .t-date { font-variant-numeric: tabular-nums; }
body.dcat-admin-body .t-weekday { margin-left: 4px; color: var(--t-text-3); font-size: var(--t-fs-xs); }
body.dcat-admin-body .t-weekday.is-weekend { color: var(--t-primary-soft-text); }
body.dcat-admin-body .t-dim { display: flex; flex-direction: column; min-width: 0; max-width: 300px; line-height: 18px; }
body.dcat-admin-body .t-dim-name { overflow: hidden; color: var(--t-text); text-overflow: ellipsis; white-space: nowrap; }
body.dcat-admin-body .t-dim-meta { color: var(--t-text-3); font-size: var(--t-fs-xs); }
body.dcat-admin-body .t-dim-id { color: var(--t-text-4); font-size: var(--t-fs-xs); }
body.dcat-admin-body a.t-dim-file { flex-direction: row; align-items: center; gap: 10px; color: inherit; text-decoration: none; }
body.dcat-admin-body a.t-dim-file:hover .t-dim-name { color: var(--t-primary); }
body.dcat-admin-body .t-thumb { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; flex: none; overflow: hidden; border: 1px solid var(--t-border); border-radius: var(--t-radius-xs); background: var(--t-surface-3); color: var(--t-text-3); font-size: 14px; }
body.dcat-admin-body .t-thumb > img { width: 100%; height: 100%; object-fit: cover; }
body.dcat-admin-body .t-pair { display: flex; flex-direction: column; gap: 6px; }

/* footer: total on the left, per-page and pagination on the right */
body.dcat-admin-body .dcat-box > .box-footer,
body.dcat-admin-body .dcat-box .async-body > .box-footer {
    display: flex !important;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    padding: 10px 16px !important;
    background: var(--t-surface) !important;
    border-top: 1px solid var(--t-border) !important;
    border-radius: 0 0 var(--t-radius) var(--t-radius);
}
body.dcat-admin-body .dcat-box .box-footer::before,
body.dcat-admin-body .dcat-box .box-footer::after { display: none; }
body.dcat-admin-body .dcat-box .box-footer > span { color: var(--t-text-3) !important; font-size: var(--t-fs-sm); line-height: var(--t-h-md) !important; }
body.dcat-admin-body .dcat-box .box-footer > span b { color: var(--t-text-2); font-weight: 600; }
/* "从 到 ，总共 0 条" when there is nothing to show: the title already says 共 0 条 */
body.dcat-admin-body .dcat-box .box-footer > span:has(> b:first-child:empty) { display: none !important; }
body.dcat-admin-body .dcat-box .box-footer > .pull-right { float: none !important; }
body.dcat-admin-body .dcat-box .box-footer > .per-pages-selector { order: 1; margin: 0 0 0 auto !important; padding: 0 !important; }
body.dcat-admin-body .dcat-box .box-footer > .pagination { order: 2; margin: 0 !important; }
body.dcat-admin-body .dcat-box .box-footer .per-pages-selector .btn {
    height: var(--t-h-md); padding: 0 10px !important;
    display: inline-flex; align-items: center; gap: 6px;
    font-size: var(--t-fs-sm) !important;
}

/* footer / pagination */
body.dcat-admin-body .box-footer, body.dcat-admin-body .grid-footer, body.dcat-admin-body .card-footer { color: var(--t-text-3); }
body.dcat-admin-body .pagination,
body.dcat-admin-body .pagination.shadow-100 { background: transparent !important; box-shadow: none !important; border-radius: 0 !important; gap: 4px; }
body.dcat-admin-body .pagination .page-link {
    border: 1px solid var(--t-border) !important;
    background: var(--t-surface) !important;
    color: var(--t-text-2) !important;
    border-radius: var(--t-radius-sm) !important;
    margin: 0 !important;
    min-width: 32px; height: var(--t-h-md); line-height: 1; padding: 0 8px;
    display: inline-flex !important; align-items: center; justify-content: center;
    font-size: var(--t-fs-sm);
    box-shadow: none !important;
}
body.dcat-admin-body .pagination .page-item:not(.active):not(.disabled) .page-link:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .pagination .page-item.active .page-link {
    background: var(--t-primary) !important;
    border-color: var(--t-primary) !important;
    color: var(--t-on-primary) !important;
    font-weight: 600;
}
body.dcat-admin-body .pagination .page-item.disabled .page-link { color: var(--t-text-4) !important; background: transparent !important; }

@media (max-width: 767px) {
    body.dcat-admin-body .custom-data-table-header .top > h4 { margin-right: 0 !important; }
    body.dcat-admin-body .custom-data-table-header .top > .pull-right { margin-left: 0; justify-content: flex-start; width: 100%; }
    body.dcat-admin-body .quick-search-form { width: 100%; }
    body.dcat-admin-body .quick-search-form label { width: 100% !important; }
    body.full-page.dcat-admin-body table.custom-data-table.data-table tbody > tr:only-child > td[colspan] > div:has(> .help-block) { width: calc(100vw - 26px); }
    body.dcat-admin-body.full-page .wrapper,
    body.dcat-admin-body.full-page #pjax-container { padding: 12px 12px 32px !important; }
    body.dcat-admin-body.full-page .wrapper:has(.login-main),
    body.dcat-admin-body.full-page #pjax-container:has(.login-main) { padding: 0 !important; }
    body.dcat-admin-body .custom-data-table-header .table-responsive .top { padding: 12px !important; }
    body.dcat-admin-body .dcat-box .box-footer { padding: 10px 12px !important; }
}

/* ---------- Buttons ----------
 * Variants: primary (one per view), secondary (btn-white / btn-default / btn-light / outline tools),
 * ghost (btn-link), danger / success / warning (filled), outline-primary.
 * Sizes follow the control heights: toolbars use --t-h-md, forms --t-h-lg. */
body.dcat-admin-body .btn {
    border-radius: var(--t-radius-sm) !important;
    font-weight: var(--t-fw-medium);
    font-size: var(--t-fs-base);
    box-shadow: none !important;
    transition: background-color var(--t-dur) var(--t-ease), border-color var(--t-dur) var(--t-ease), color var(--t-dur) var(--t-ease), box-shadow var(--t-dur) var(--t-ease), filter var(--t-dur) var(--t-ease), translate var(--t-dur) var(--t-ease);
}
body.dcat-admin-body .btn:focus-visible, body.dcat-admin-body .btn.focus { box-shadow: var(--t-ring) !important; }
body.dcat-admin-body .btn:disabled, body.dcat-admin-body .btn.disabled { opacity: .5; cursor: not-allowed; }
body.dcat-admin-body .btn:not(:disabled):not(.disabled):active { filter: brightness(.94); }
/* standalone buttons sink 1px while pressed (not inside input groups or joined button groups, where it would open a seam) */
body.dcat-admin-body .btn:not(:disabled):not(.disabled):active:not(.input-group .btn, .btn-group > .btn:not(:only-child), .dropdown-toggle) { translate: 0 1px; }
body.dcat-admin-body .btn-primary,
body.dcat-admin-body .btn-primary:not(:disabled):not(.disabled):active {
    background-color: var(--t-primary) !important;
    border-color: var(--t-primary) !important;
    color: var(--t-on-primary) !important;
}
body.dcat-admin-body .btn-primary:not(.btn-outline) { box-shadow: var(--t-shadow-xs), var(--t-highlight) !important; }
body.dcat-admin-body .btn-primary:hover { background-color: var(--t-primary-hover) !important; border-color: var(--t-primary-hover) !important; }
body.dcat-admin-body .btn-white,
body.dcat-admin-body .btn-default,
body.dcat-admin-body .btn-light,
body.dcat-admin-body.dark-mode .btn-white {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border-strong) !important;
    color: var(--t-text-2) !important;
    box-shadow: var(--t-shadow-xs) !important;
}
body.dcat-admin-body .btn-white:hover,
body.dcat-admin-body .btn-default:hover,
body.dcat-admin-body .btn-light:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .btn-link { color: var(--t-primary) !important; background: transparent !important; border-color: transparent !important; }
body.dcat-admin-body .btn-link:hover { background: var(--t-primary-soft) !important; text-decoration: none; }
body.dcat-admin-body .btn-outline-primary { color: var(--t-primary) !important; border-color: var(--t-primary) !important; background: transparent !important; }
body.dcat-admin-body .btn-outline-primary:hover { background: var(--t-primary-soft) !important; }
body.dcat-admin-body .btn-danger { background: var(--t-danger-solid) !important; border-color: var(--t-danger-solid) !important; color: var(--t-on-primary) !important; }
body.dcat-admin-body .btn-success { background: var(--t-success-solid) !important; border-color: var(--t-success-solid) !important; color: var(--t-on-primary) !important; }
body.dcat-admin-body .btn-warning { background: var(--t-warning-solid) !important; border-color: var(--t-warning-solid) !important; color: var(--t-on-primary) !important; }
body.dcat-admin-body .btn-danger:hover, body.dcat-admin-body .btn-success:hover, body.dcat-admin-body .btn-warning:hover { filter: brightness(.92); }
body.dcat-admin-body .btn-sm { padding: 4px 10px; font-size: var(--t-fs-xs); }

/* ---------- Forms ---------- */
body.dcat-admin-body .form-control,
body.dcat-admin-body.dark-mode .form-control,
body.dcat-admin-body .select2-container--default .select2-selection--single,
body.dcat-admin-body .select2-container--default .select2-selection--multiple {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border-strong) !important;
    border-radius: var(--t-radius-sm) !important;
    color: var(--t-text) !important;
    font-size: var(--t-fs-base);
    min-height: var(--t-h-lg);
    box-shadow: var(--t-shadow-xs) !important;
    transition: border-color var(--t-dur) var(--t-ease), box-shadow var(--t-dur) var(--t-ease);
}
body.dcat-admin-body .form-control:hover:not(:focus):not(:disabled):not([readonly]),
body.dcat-admin-body .select2-container--default:not(.select2-container--focus):not(.select2-container--open) .select2-selection:hover { border-color: var(--t-text-4) !important; }
body.dcat-admin-body textarea.form-control { min-height: 88px; }
body.dcat-admin-body .form-control::placeholder { color: var(--t-text-4) !important; font-size: 1em; }
/* text starts 12px in, the same as in a select (dcat: inputs 9.8px, selects 12px) */
body.dcat-admin-body .form-control { padding-left: 12px; padding-right: 12px; }
/* the "选择 受众" box of a table picker ($form->selectTable()) is a div, not an input: show its prompt as a placeholder */
body.dcat-admin-body .form-control > .default-text { opacity: 1 !important; color: var(--t-text-4); }
body.dcat-admin-body .form-control:focus,
body.dcat-admin-body .select2-container--focus .select2-selection,
body.dcat-admin-body .select2-container--open .select2-selection {
    border-color: var(--t-primary) !important;
    box-shadow: var(--t-ring) !important;
    outline: 0;
}
body.dcat-admin-body .form-control:disabled,
body.dcat-admin-body .form-control[readonly] { background: var(--t-surface-3) !important; color: var(--t-text-3) !important; }
body.dcat-admin-body .input-group-text,
body.dcat-admin-body .input-group-prepend .input-group-text.bg-white {
    background: var(--t-surface-2) !important;
    border: 1px solid var(--t-border-strong) !important;
    color: var(--t-text-3) !important;
}
body.dcat-admin-body .input-group > .input-group-prepend > .input-group-text { border-radius: var(--t-radius-sm) 0 0 var(--t-radius-sm) !important; border-right: 0 !important; }
body.dcat-admin-body .input-group > .input-group-prepend + .form-control { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; }
body.dcat-admin-body .input-group > .form-control:not(:last-child) { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
body.dcat-admin-body .input-group > .input-group-append > .btn,
body.dcat-admin-body .input-group > .input-group-append > .input-group-text { border-radius: 0 var(--t-radius-sm) var(--t-radius-sm) 0 !important; }
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__rendered { color: var(--t-text) !important; line-height: calc(var(--t-h-lg) - 2px); }
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__arrow { height: calc(var(--t-h-lg) - 2px); }
body.dcat-admin-body .select2-dropdown {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border) !important;
    border-radius: var(--t-radius-sm) !important;
    box-shadow: var(--t-shadow-lg) !important;
}
body.dcat-admin-body .select2-container--default .select2-results__option--highlighted[aria-selected] { background: var(--t-primary-soft) !important; color: var(--t-primary-soft-text) !important; }
body.dcat-admin-body .select2-container--default .select2-selection--multiple .select2-selection__choice {
    background: var(--t-primary-soft) !important; border: 0 !important; color: var(--t-primary-soft-text) !important; border-radius: var(--t-radius-xs) !important;
}
body.dcat-admin-body .control-label, body.dcat-admin-body label { color: var(--t-text-2); font-weight: 500; }
body.dcat-admin-body .form-horizontal .control-label { font-size: var(--t-fs-base); }
/* required fields: a red asterisk, the label itself keeps the normal label color */
body.dcat-admin-body .form-group .asterisk { color: var(--t-text-2) !important; }
body.dcat-admin-body .asterisk::before { color: var(--t-danger) !important; }
body.dcat-admin-body .form-group.has-error .asterisk { color: var(--t-danger) !important; }
body.dcat-admin-body .has-error .form-control { border-color: var(--t-danger) !important; }
body.dcat-admin-body .has-error .help-block, body.dcat-admin-body .with-errors { color: var(--t-danger) !important; }
body.dcat-admin-body .vs-checkbox-con .vs-checkbox { border-radius: var(--t-radius-xs) !important; border-width: 1.5px !important; border-color: var(--t-border-strong) !important; }
body.dcat-admin-body .vs-checkbox-con input:checked ~ .vs-checkbox { border-color: var(--t-primary) !important; }
body.dcat-admin-body .vs-checkbox-con input:checked ~ .vs-checkbox .vs-checkbox--check { background-color: var(--t-primary) !important; }
/* switches (->switch(), $form->switch()): switchery paints its colors inline; restate them from the
   input state so "off" is a grey track instead of a white one that disappears on a white row */
body.dcat-admin-body input:not(:checked) + .switchery { background-color: var(--t-border-strong) !important; border-color: var(--t-border-strong) !important; box-shadow: none !important; }
body.dcat-admin-body input:checked + .switchery { background-color: var(--t-primary) !important; border-color: var(--t-primary) !important; box-shadow: none !important; }
body.dcat-admin-body .switchery > small { background: #fff !important; box-shadow: 0 1px 2px rgba(16, 24, 40, .25) !important; transition: left var(--t-dur-slow) var(--t-ease-out), background-color var(--t-dur) !important; }
body.dcat-admin-body input:disabled + .switchery { opacity: .5; cursor: not-allowed; }
/* in a form row the switch is 22px tall next to a label set for a 36px input: move it down so the two centre on one line */
body.dcat-admin-body .form-group:has(> .control-label) > [class*=col-] > .switchery { margin-top: 7px; }

/* form layout: give the create/edit form a calmer rhythm */
body.dcat-admin-body .form-horizontal .form-group { margin-bottom: var(--t-space-6); }
/* two-column forms ($form->column(6, …)): dcat keeps the label at 2/12 of the half column, about 70px,
   so a label of more than three or four characters ("广告数量上限", "采购渠道", "Cloak 模式") broke onto
   a second line. A quarter of the half column, without the column's left padding, fits six; has-many
   section titles get the same width. Fields inside tabs and when() groups are covered too. Below 768px
   the columns stack, as Bootstrap's col-md-* do. */
@media (min-width: 768px) {
    body.dcat-admin-body .form-horizontal .col-md-6 .form-field > .control-label.col-md-2,
    body.dcat-admin-body .form-horizontal .col-md-6 > .row > .col-md-2:has(> h4) { flex: 0 0 25%; max-width: 25%; }
    body.dcat-admin-body .form-horizontal .col-md-6 .form-field > .control-label.col-md-2 + [class*=col-md-] { flex: 0 0 75%; max-width: 75%; }
    body.dcat-admin-body .form-horizontal .col-md-6 .form-field > .control-label:is(.col-md-2, .col-md-3),
    body.dcat-admin-body .form-horizontal .col-md-6 > .row > .col-md-2:has(> h4) { padding-left: 0; }
    /* a dialog is narrower than the page, so there the label takes 30% (a required label also carries the asterisk) */
    body.dcat-admin-body .layui-layer .form-horizontal .col-md-6 .form-field > .control-label:is(.col-md-2, .col-md-3) { flex: 0 0 30%; max-width: 30%; }
    body.dcat-admin-body .layui-layer .form-horizontal .col-md-6 .form-field > .control-label:is(.col-md-2, .col-md-3) + [class*=col-md-] { flex: 0 0 70%; max-width: 70%; }
}
/* the validator's message slot sits above every field; while it is empty its margin only pushed the
   field 7px below its label */
body.dcat-admin-body .form-field .help-block.with-errors:empty { margin: 0 !important; }
body.dcat-admin-body .form-horizontal .box-footer, body.dcat-admin-body .form-footer { padding: 14px 18px; }
/* form sections ($form->fieldset(), $form->divider('…')): a left-aligned heading followed by a hairline,
   instead of a centred purple link on a line through the form. Fieldsets still fold on click. */
body.dcat-admin-body .form-divider,
body.dcat-admin-body.dark-mode .form-divider {
    display: flex; align-items: center; gap: 12px;
    height: auto !important; margin: 28px 0 16px !important; padding: 0 4px;
    border: 0 !important; text-align: left !important;
}
body.dcat-admin-body .form-divider::after { content: ""; flex: 1; height: 1px; background: var(--t-border); }
body.dcat-admin-body .form-divider > span,
body.dcat-admin-body.dark-mode .form-divider > span { background: transparent !important; padding: 0 !important; font-size: var(--t-fs-md) !important; font-weight: var(--t-fw-semibold); color: var(--t-text); white-space: nowrap; }
body.dcat-admin-body .form-divider a { color: var(--t-text) !important; text-decoration: none !important; }
body.dcat-admin-body .form-divider a:hover { color: var(--t-primary) !important; }
body.dcat-admin-body .form-divider a > i { color: var(--t-text-4); font-size: var(--t-fs-sm); }
body.dcat-admin-body .form-divider a:hover > i { color: inherit; }
body.dcat-admin-body .form-divider a > i.fa-angle-double-up::before { font-family: "feather" !important; content: "\e845"; }
body.dcat-admin-body .form-divider a > i.fa-angle-double-down::before { font-family: "feather" !important; content: "\e842"; }
/* tree fields (权限 / 菜单 in the role and permission forms): a framed panel that scrolls, so a long
   permission list doesn't make the form several screens tall */
body.dcat-admin-body .jstree-wrapper .da-tree {
    max-height: 420px; overflow: auto;
    padding: 6px 8px; border: 1px solid var(--t-border-strong); border-radius: var(--t-radius-sm); background: var(--t-surface);
}
body.dcat-admin-body .jstree-default .jstree-anchor { color: var(--t-text-2); font-size: var(--t-fs-sm); }
body.dcat-admin-body .jstree-default .jstree-hovered { background: var(--t-surface-3) !important; box-shadow: none !important; border-radius: var(--t-radius-xs); }
body.dcat-admin-body .jstree-default .jstree-clicked { background: var(--t-primary-soft) !important; color: var(--t-primary-soft-text) !important; box-shadow: none !important; border-radius: var(--t-radius-xs); }
/* the first heading sits right under the card header */
body.dcat-admin-body .fields-group > div:first-child > .form-divider:first-child,
body.dcat-admin-body .fields-group > .form-divider:first-child { margin-top: 4px !important; }

/* detail (show) pages: label / value rows split by hairlines instead of a stack of input-like boxes */
body.dcat-admin-body .show-field.form-group { margin: 0; padding: 11px 0; border-bottom: 1px solid var(--t-border); align-items: baseline; }
/* no divider under the last field (dcat ends the list with an empty .clearfix, so :last-child misses) */
body.dcat-admin-body .show-field.form-group:not(:has(~ .show-field)) { border-bottom: 0; }
body.dcat-admin-body .show-field > .control-label { padding-top: 0 !important; color: var(--t-text-3); font-size: var(--t-fs-sm); font-weight: 500; }
body.dcat-admin-body .show-field .box-show { border: 0 !important; background: transparent !important; box-shadow: none !important; margin: 0 !important; }
body.dcat-admin-body .show-field .box-show > .box-body { padding: 0 !important; min-height: 0 !important; color: var(--t-text); font-size: var(--t-fs-base); line-height: 1.6; word-break: break-word; }
body.dcat-admin-body .show-field .box-show > .box-body:empty::before,
body.dcat-admin-body .show-field .box-show > .box-body:has(> :only-child:empty:not(i))::before { content: "—"; color: var(--t-text-4); }
body.dcat-admin-body .form-horizontal:has(> .show-field) { padding: 4px 8px; }
/* rows of several fields ($show->row(), e.g. Facebook 账号): in a quarter-width column the label beside
   the value had room for one character per line, so each field stacks its label over its value and the
   rows are split by hairlines */
body.dcat-admin-body .form-horizontal .row:has(> [class*=col-] > .show-field) { margin: 0 !important; padding: 4px 0; border-bottom: 1px solid var(--t-border); }
body.dcat-admin-body .form-horizontal .row:has(> [class*=col-] > .show-field):last-child { border-bottom: 0; }
body.dcat-admin-body .row > [class*=col-] > .show-field.form-group { flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 2px; margin: 0 !important; padding: 10px 0; border-bottom: 0; }
body.dcat-admin-body .row > [class*=col-] > .show-field > .control-label { flex: none; width: auto; max-width: none; padding: 0 !important; text-align: left !important; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: var(--t-fs-xs); }
body.dcat-admin-body .row > [class*=col-] > .show-field > [class*=col-sm-] { flex: none; width: auto; max-width: none; padding: 0; }
/* empty values and JSON values (both printed by resources/views/vendor/admin/show/field.blade.php) */
body.dcat-admin-body .show-field .t-empty-value { color: var(--t-text-4); }
body.dcat-admin-body .show-field pre.t-json {
    margin: 0; padding: 8px 10px; max-height: 240px; overflow: auto;
    background: var(--t-surface-2); border: 1px solid var(--t-border); border-radius: var(--t-radius-sm);
    color: var(--t-text-2); font: var(--t-fs-xs)/1.55 var(--t-mono); white-space: pre-wrap; word-break: break-word;
}
@media (min-width: 1024px) {
    body.dcat-admin-body .form-horizontal:has(> .show-field) { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--t-space-10); padding: 4px 12px; }
    body.dcat-admin-body .form-horizontal:has(> .show-field) > :not(.show-field) { grid-column: 1 / -1; }
    body.dcat-admin-body .form-horizontal > .show-field.form-group { margin: 0 !important; flex-wrap: nowrap; }
    /* two columns: the fields with no field two places after them form the last row */
    body.dcat-admin-body .form-horizontal > .show-field.form-group { border-bottom: 1px solid var(--t-border); }
    body.dcat-admin-body .form-horizontal > .show-field.form-group:not(:has(~ .show-field ~ .show-field)) { border-bottom: 0; }
    body.dcat-admin-body .form-horizontal > .show-field > .control-label { flex: 0 0 120px; max-width: 120px; text-align: left !important; }
    body.dcat-admin-body .form-horizontal > .show-field > .col-sm-8 { flex: 1 1 auto; max-width: none; }
}
/* widget forms (系统设置 etc.) print the footer as a .row, whose negative margins push it past the card */
body.dcat-admin-body .card > form > .box-footer.row,
body.dcat-admin-body .box > form > .box-footer.row { margin-left: 0 !important; margin-right: 0 !important; border-radius: 0 0 var(--t-radius) var(--t-radius); }
/* widget forms (系统设置 etc.): reset and submit sit together on the right, like every other form */
body.dcat-admin-body .box-footer.row.d-flex > .col-md-8 { display: flex; justify-content: flex-end; gap: 8px; }
body.dcat-admin-body .box-footer.row.d-flex > .col-md-8 > .btn { float: none !important; margin: 0 !important; }
/* read-only fields inside forms (display()): the same height and frame as an input, but muted */
body.dcat-admin-body .form-field .box.box-solid.box-default.no-margin {
    border: 1px solid var(--t-border) !important; border-radius: var(--t-radius-sm) !important;
    background: var(--t-surface-2) !important; box-shadow: none !important; margin: 0 !important;
}
body.dcat-admin-body .form-field .box.box-solid.box-default.no-margin > .box-body { padding: 7px 12px !important; min-height: calc(var(--t-h-lg) - 2px); color: var(--t-text-2); font-size: var(--t-fs-base); line-height: 20px; }
/* header buttons on form / detail cards (列表 / 编辑 / 删除) are flat */
body.dcat-admin-body .box-header .btn-group,
body.dcat-admin-body .box-header .btn,
body.dcat-admin-body .card-header .btn-group,
body.dcat-admin-body .box-footer .btn,
body.dcat-admin-body .box-footer .btn-group { box-shadow: none !important; }
body.dcat-admin-body .box-header [data-action=delete]:hover { color: var(--t-danger) !important; border-color: color-mix(in srgb, var(--t-danger) 40%, var(--t-border)) !important; }

/* form footer: dcat floats 提交 right and 重置 left, with the after-save options in between.
   Lay it out as [options ..... 重置 提交] */
body.dcat-admin-body form .box-footer > [class*="col-md-"]:has(.btn.submit) { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
body.dcat-admin-body form .box-footer > [class*="col-md-"]:has(.btn.submit) > * { float: none !important; margin: 0 !important; }
body.dcat-admin-body form .box-footer > [class*="col-md-"]:has(.btn.submit) > .d-md-flex { order: 1; margin-right: auto !important; }
body.dcat-admin-body form .box-footer > [class*="col-md-"]:has(.btn.submit) > .btn-group:has(> [type=reset]) { order: 2; }
body.dcat-admin-body form .box-footer > [class*="col-md-"]:has(.btn.submit) > .btn-group:has(> .submit) { order: 3; }
body.dcat-admin-body form .box-footer .vs-checkbox-con { margin: 0 16px 0 0 !important; }
body.dcat-admin-body form .box-footer .vs-checkbox-con .text-bold { font-weight: var(--t-fw-medium) !important; color: var(--t-text-2) !important; font-size: var(--t-fs-sm); }
body.dcat-admin-body form .box-footer .btn { height: var(--t-h-lg); display: inline-flex; align-items: center; gap: 6px; padding: 0 16px; }

/* text inputs: dcat puts a pencil icon box in front of every one. It carries no meaning, so drop it */
body.dcat-admin-body .input-group > .input-group-prepend:has(> .input-group-text > i.icon-edit-2:only-child) { display: none; }
body.dcat-admin-body .input-group:has(> .input-group-prepend > .input-group-text > i.icon-edit-2:only-child) > .form-control { border-radius: var(--t-radius-sm) !important; }
/* picker buttons next to a field (选择 受众 / 文案 / 素材 ...): secondary, not a second primary action */
body.dcat-admin-body .form-group .input-group .btn-primary {
    background: var(--t-surface) !important; border: 1px solid var(--t-border-strong) !important; color: var(--t-text-2) !important;
    box-shadow: none !important;
}
body.dcat-admin-body .form-group .input-group .btn-primary:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }

/* select2: the same text inset and placeholder color as a text input */
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__rendered { padding-left: 12px !important; }
body.dcat-admin-body .select2-container--default .select2-selection--single { padding-left: 0 !important; } /* dcat adds 5px more: the text sat 18px in, inputs 13px */
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__placeholder { color: var(--t-text-4) !important; }
/* multi-selects (select2 4.1 puts the chips in a <ul> and the search field after it): one flex row,
   centred like a text input, the placeholder 15px from the edge like every other field */
body.dcat-admin-body .select2-container--default .select2-selection--multiple { display: flex !important; flex-wrap: wrap; align-items: center; gap: 4px; padding: 3px 6px !important; }
body.dcat-admin-body .select2-container--default .select2-selection--multiple .select2-selection__rendered { display: contents !important; }
body.dcat-admin-body .select2-container--default .select2-selection--multiple .select2-selection__choice { margin: 0 !important; }
body.dcat-admin-body .select2-container--default .select2-selection--multiple .select2-search--inline { flex: 1 1 60px; min-width: 60px; display: flex; }
body.dcat-admin-body .select2-container--default .select2-selection--multiple .select2-search__field { margin: 0 !important; padding: 0 0 0 6px !important; height: 26px !important; line-height: 26px; font-size: var(--t-fs-base); }
body.dcat-admin-body .select2-container--default .select2-search__field::placeholder { color: var(--t-text-4) !important; font-size: var(--t-fs-base); }
body.dcat-admin-body .select2-dropdown .select2-search__field::placeholder { font-size: var(--t-fs-sm); }
body.dcat-admin-body .right-side-filter-container .select2-selection--single .select2-selection__rendered { line-height: calc(var(--t-h-lg) - 2px) !important; }
/* select2 "clear" ×: a quiet icon, not a bold black glyph */
body.dcat-admin-body .select2-container .select2-selection__clear { color: var(--t-text-4) !important; font-weight: 400 !important; font-size: var(--t-fs-lg); margin-right: 6px; }
body.dcat-admin-body .select2-selection--single:has(.select2-selection__clear) .select2-selection__rendered { padding-right: 46px !important; }
body.dcat-admin-body .select2-selection--single .select2-selection__clear { position: absolute !important; right: 26px; top: 50%; transform: translateY(-50%); margin: 0 !important; line-height: 1; float: none !important; }
body.dcat-admin-body .select2-container .select2-selection__clear:hover { color: var(--t-text) !important; }
/* multi-select "clear all" ×: select2 puts it first, so it sat in front of the chips. Move it to the end of the row */
body.dcat-admin-body .select2-selection--multiple .select2-selection__clear {
    order: 10; position: static !important; float: none !important; align-self: center;
    margin: 0 2px 0 auto !important; padding: 0 4px !important; height: auto !important;
    background: transparent !important; border: 0 !important; line-height: 1 !important;
}
body.dcat-admin-body .select2-selection--multiple:has(> .select2-selection__clear) .select2-search--inline { order: 9; }

/* select caret: a Feather chevron that turns over while the list is open, like every other menu toggle */
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__arrow b { display: none !important; }
body.dcat-admin-body .select2-container--default .select2-selection--single .select2-selection__arrow::after {
    content: ""; position: absolute; top: 50%; left: 50%; width: 16px; height: 16px; margin: -8px 0 0 -8px;
    background: var(--t-text-4);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center / 16px no-repeat;
            mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center / 16px no-repeat;
    transition: rotate var(--t-dur-slow) var(--t-ease-out), background-color var(--t-dur) var(--t-ease);
}
body.dcat-admin-body .select2-container--open .select2-selection--single .select2-selection__arrow::after { rotate: 180deg; background: var(--t-text-2); }
body.dcat-admin-body .select2-container--default:hover .select2-selection--single .select2-selection__arrow::after { background: var(--t-text-3); }
/* the list grows out of the field */
body.dcat-admin-body .select2-container--open .select2-dropdown--below { animation: t-drop-in var(--t-dur-enter) var(--t-ease-out); transform-origin: top; }
body.dcat-admin-body .select2-container--open .select2-dropdown--above { animation: t-drop-up var(--t-dur-enter) var(--t-ease-out); transform-origin: bottom; }
/* search box inside the list: a magnifier and the same focus ring as other fields (dcat: its old blue border) */
body.dcat-admin-body .select2-dropdown .select2-search--dropdown { padding: 6px !important; }
body.dcat-admin-body .select2-dropdown .select2-search--dropdown .select2-search__field {
    height: var(--t-h-md); padding: 0 10px 0 30px !important;
    border: 1px solid var(--t-border-strong) !important; border-radius: var(--t-radius-sm) !important; outline: 0;
    background: var(--t-surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-3.5-3.5'/%3E%3C/svg%3E") 9px center / 14px no-repeat !important;
    color: var(--t-text) !important; font-size: var(--t-fs-sm);
}
body.dcat-admin-body .select2-dropdown .select2-search--dropdown .select2-search__field:focus { border-color: var(--t-primary) !important; box-shadow: var(--t-ring) !important; }
body.dcat-admin-body .select2-container--default .select2-search--inline .select2-search__field:focus { border: 0 !important; outline: 0; }
body.dcat-admin-body .select2-results__option { padding: 7px 10px; font-size: var(--t-fs-sm); border-radius: var(--t-radius-xs); }
body.dcat-admin-body .select2-results > .select2-results__options { padding: 4px; }
/* option groups: the group row itself carries no padding, its heading and nested options do */
body.dcat-admin-body .select2-results__option[role=group], body.dcat-admin-body .select2-results__option--group { padding: 0 !important; }
body.dcat-admin-body .select2-results__group { padding: 8px 10px 4px !important; color: var(--t-text-3); font-size: var(--t-fs-xs); font-weight: var(--t-fw-semibold); }
body.dcat-admin-body .select2-container--default .select2-results__option[aria-selected=true]:not(.select2-results__option--highlighted) { background: transparent !important; color: var(--t-primary) !important; font-weight: var(--t-fw-medium); }

/* number fields ($form->number()): − value + read as one control instead of three boxes */
body.dcat-admin-body .number-group > .input-group { flex-wrap: nowrap; width: auto; display: inline-flex; }
body.dcat-admin-body .number-group .input-group-btn > .btn,
body.dcat-admin-body .form-group .number-group .input-group-btn > .btn.btn-primary {
    width: var(--t-h-lg); height: var(--t-h-lg); padding: 0 !important; margin: 0 !important;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--t-surface-2) !important; border: 1px solid var(--t-border-strong) !important; color: var(--t-text-2) !important;
    font-size: var(--t-fs-lg); line-height: 1; box-shadow: none !important;
}
body.dcat-admin-body .number-group .input-group-btn > .btn:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .number-group .input-group-btn:first-child > .btn { border-radius: var(--t-radius-sm) 0 0 var(--t-radius-sm) !important; border-right: 0 !important; }
body.dcat-admin-body .number-group .input-group-btn:last-child > .btn { border-radius: 0 var(--t-radius-sm) var(--t-radius-sm) 0 !important; border-left: 0 !important; }
body.dcat-admin-body .number-group .input-group > .form-control { width: 96px !important; border-radius: 0 !important; font-variant-numeric: tabular-nums; }

/* table picker button ($form->selectTable()): dcat's arrow-up icon means nothing here; a list does */
body.dcat-admin-body .dialog-table-container .switch-dialog .btn i.icon-arrow-up::before { content: "\e886"; }

/* ---------- Tree pages (菜单 / 权限 / 分类): dcat's nestable list ---------- */
body.dcat-admin-body .card-header:has(.btn[class*=-tree-tools]) { padding: 12px 16px !important; display: flex; align-items: center; }
body.dcat-admin-body .card-header:has(.btn[class*=-tree-tools]) > div:first-child { display: flex; align-items: center; gap: 8px; }
body.dcat-admin-body .card-header .btn-group { margin: 0 !important; }
body.dcat-admin-body .btn[class*=-tree-tools],
body.dcat-admin-body .card-header .btn-outline-primary[data-action=refresh] {
    height: var(--t-h-md); display: inline-flex; align-items: center; gap: 4px; padding: 0 12px !important;
    background: var(--t-surface) !important; border: 1px solid var(--t-border-strong) !important; color: var(--t-text-2) !important; box-shadow: none !important;
}
body.dcat-admin-body .btn[class*=-tree-tools]:hover,
body.dcat-admin-body .card-header .btn-outline-primary[data-action=refresh]:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .btn-group > .btn[class*=-tree-tools]:not(:last-child) { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
body.dcat-admin-body .btn-group > .btn[class*=-tree-tools] + .btn[class*=-tree-tools] { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; margin-left: -1px; }
body.dcat-admin-body .btn[class*=-save] { height: var(--t-h-md); display: inline-flex; align-items: center; gap: 4px; padding: 0 14px !important; box-shadow: none !important; }
/* rows: one flat list with hairlines instead of a stack of bordered boxes */
body.dcat-admin-body .dd { max-width: none; }
body.dcat-admin-body .dd-list .dd-item { margin: 0 !important; }
body.dcat-admin-body .dd-handle {
    height: auto !important; min-height: 44px; margin: 0 !important; padding: 11px 12px !important;
    display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
    border: 0 !important; border-bottom: 1px solid var(--t-border) !important; border-radius: 0 !important;
    background: transparent !important; box-shadow: none !important;
    color: var(--t-text) !important; font-size: var(--t-fs-sm); font-weight: 400;
}
body.dcat-admin-body .dd-handle:hover { background: var(--t-surface-2) !important; }
body.dcat-admin-body .dd-handle > .pull-left { float: none !important; }
body.dcat-admin-body .dd-handle > .pull-right { float: none !important; margin-left: auto; display: inline-flex; gap: 4px; }
body.dcat-admin-body .dd-handle > .pull-right a { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: var(--t-h-sm); border-radius: var(--t-radius-sm); color: var(--t-text-4) !important; }
body.dcat-admin-body .dd-handle > .pull-right a:hover { background: var(--t-surface-3); color: var(--t-text) !important; }
body.dcat-admin-body .dd-handle > .pull-right a[data-action=delete]:hover { color: var(--t-danger) !important; }
body.dcat-admin-body .dd-handle code { background: var(--t-surface-3) !important; color: var(--t-text-2) !important; border-radius: var(--t-radius-xs); padding: 1px 6px; font-size: var(--t-fs-xs); }
body.dcat-admin-body .dd-handle .text-primary { color: var(--t-text-3) !important; }
body.dcat-admin-body .dd-handle code:empty, body.dcat-admin-body .dd-handle a:has(> code:empty) { display: none; }
body.dcat-admin-body .dd-list .dd-list { padding-left: 24px; border-left: 1px solid var(--t-border); margin-left: 18px; }
body.dcat-admin-body .dd-item > button { margin: 12px 0 0 4px !important; color: var(--t-text-4); }
body.dcat-admin-body .dd-placeholder { background: var(--t-primary-soft) !important; border: 1px dashed var(--t-primary) !important; border-radius: var(--t-radius-sm); }
body.dcat-admin-body .dd > .dd-list > .help-block:only-child {
    display: flex !important; flex-direction: column; align-items: center; gap: 10px;
    margin: 0 !important; padding: 48px 16px;
    color: var(--t-text-3) !important; font-size: var(--t-fs-sm); font-weight: var(--t-fw-medium);
}
body.dcat-admin-body .dd > .dd-list > .help-block:only-child i {
    width: 44px; height: 44px; border-radius: var(--t-radius);
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--t-surface-3); color: var(--t-text-4); font-size: var(--t-fs-2xl);
}
body.dcat-admin-body .dd > .dd-list > .help-block:only-child i.icon-alert-circle::before { content: "\e87d"; }
body.dcat-admin-body .dd-dragel > .dd-item > .dd-handle { background: var(--t-surface) !important; box-shadow: var(--t-shadow-lg) !important; border-radius: var(--t-radius-sm) !important; }

/* A password or API key as dots with a copy button (App\Admin\Grid\Secret, ->secret()) */
body.dcat-admin-body .t-secret { white-space: nowrap; color: var(--t-text-3); letter-spacing: .04em; }
body.dcat-admin-body .t-secret-copy { margin-left: 6px; color: var(--t-text-4) !important; letter-spacing: 0; }
body.dcat-admin-body .t-secret-copy:hover, body.dcat-admin-body .t-secret-copy:focus-visible { color: var(--t-primary) !important; }

/* ---------- Badges, labels, alerts ---------- */
body.dcat-admin-body .badge, body.dcat-admin-body .label {
    border-radius: var(--t-radius-xs) !important;
    font-weight: 500 !important;
    font-size: var(--t-fs-xs) !important;
    padding: .25em .65em !important;
    box-shadow: none !important;
}
body.dcat-admin-body .badge-primary, body.dcat-admin-body .label-primary, body.dcat-admin-body .bg-primary.badge, body.dcat-admin-body .label.bg-primary,
/* ->label() with the default (primary) color prints it inline */
body.dcat-admin-body .label[style*="#4f46e5" i], body.dcat-admin-body .badge[style*="#4f46e5" i] { background: var(--t-primary-soft) !important; color: var(--t-primary-soft-text) !important; }
body.dcat-admin-body .badge-success, body.dcat-admin-body .label-success { background: var(--t-success-soft) !important; color: var(--t-success) !important; }
body.dcat-admin-body .badge-danger, body.dcat-admin-body .label-danger { background: var(--t-danger-soft) !important; color: var(--t-danger) !important; }
body.dcat-admin-body .badge-warning, body.dcat-admin-body .label-warning { background: var(--t-warning-soft) !important; color: var(--t-warning) !important; }
body.dcat-admin-body .badge-info, body.dcat-admin-body .label-info { background: var(--t-info-soft) !important; color: var(--t-info) !important; }
/* inline-colored labels (theme.js adds .t-soft and --t-tag): the same hue as a tinted tag */
body.dcat-admin-body .label.t-soft, body.dcat-admin-body .badge.t-soft {
    background: color-mix(in srgb, var(--t-tag) 13%, var(--t-surface)) !important;
    color: color-mix(in srgb, var(--t-tag) 82%, var(--t-text)) !important;
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--t-tag) 18%, transparent) !important;
}
/* light gray tags (->label('default'), 'gray'; theme.js adds .t-neutral): the hue mix above left the text at
   about 2:1 contrast, so neutral states (待处理, 等待, values a map does not know) get readable gray */
body.dcat-admin-body .label.t-soft.t-neutral, body.dcat-admin-body .badge.t-soft.t-neutral {
    background: var(--t-surface-3) !important;
    color: var(--t-text-2) !important;
    box-shadow: inset 0 0 0 1px var(--t-border) !important;
}
/* the eye in front of a password field shows / hides the value (theme.js) */
body.dcat-admin-body .input-group-prepend:has(> .input-group-text > .icon-eye, > .input-group-text > .icon-eye-off) { cursor: pointer; }

body.dcat-admin-body .alert {
    border-radius: var(--t-radius) !important;
    border: 1px solid transparent !important;
    box-shadow: none !important;
    font-size: var(--t-fs-base);
}
body.dcat-admin-body .alert-danger { background: var(--t-danger-soft) !important; border-color: color-mix(in srgb, var(--t-danger) 25%, transparent) !important; color: var(--t-danger) !important; }
body.dcat-admin-body .alert-success { background: var(--t-success-soft) !important; border-color: color-mix(in srgb, var(--t-success) 25%, transparent) !important; color: var(--t-success) !important; }
body.dcat-admin-body .alert-warning { background: var(--t-warning-soft) !important; border-color: color-mix(in srgb, var(--t-warning) 25%, transparent) !important; color: var(--t-warning) !important; }
body.dcat-admin-body .alert-info { background: var(--t-info-soft) !important; border-color: color-mix(in srgb, var(--t-info) 25%, transparent) !important; color: var(--t-info) !important; }
body.dcat-admin-body .alert h4 { color: inherit !important; font-size: var(--t-fs-base); font-weight: 600; margin: 0; }
body.dcat-admin-body .alert h3, body.dcat-admin-body .alert h5 { color: inherit !important; }

/* ---------- Dropdowns, tabs, modals, toasts ---------- */
body.dcat-admin-body .dropdown-menu {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border) !important;
    border-radius: var(--t-radius-sm) !important;
    box-shadow: var(--t-shadow-lg) !important;
    padding: 4px !important;
}
body.dcat-admin-body .dropdown-menu.show { animation: t-drop-in var(--t-dur-enter) var(--t-ease-out); transform-origin: top; }
body.dcat-admin-body .dropup .dropdown-menu.show,
body.dcat-admin-body .dropdown-menu.show[x-placement^="top"] { animation-name: t-drop-up; transform-origin: bottom; }
body.dcat-admin-body .dropdown-menu .dropdown-item,
body.dcat-admin-body .dropdown-menu li > a { color: var(--t-text-2) !important; border-radius: var(--t-radius-xs); padding: 6px 10px; font-size: var(--t-fs-sm); line-height: 20px; }
body.dcat-admin-body .dropdown-menu .dropdown-item:hover,
body.dcat-admin-body .dropdown-menu li > a:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
/* dcat wraps menu entries as li > a, or li > span > a for modal actions: one padded row either way */
body.dcat-admin-body .dropdown-menu li.dropdown-item:has(> a, > span > a) { padding: 0 !important; background: transparent !important; }
body.dcat-admin-body .dropdown-menu li.dropdown-item > span:has(> a) { display: block; }
body.dcat-admin-body .dropdown-menu li.dropdown-item > a,
body.dcat-admin-body .dropdown-menu li.dropdown-item > span > a {
    display: block;
    padding: 6px 10px !important;
    border-radius: var(--t-radius-xs);
    color: var(--t-text-2) !important;
    font-size: var(--t-fs-sm);
    line-height: 20px;
    white-space: nowrap;
    text-decoration: none;
}
body.dcat-admin-body .dropdown-menu li.dropdown-item > a:hover,
body.dcat-admin-body .dropdown-menu li.dropdown-item > span > a:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
/* empty placeholder rows dcat leaves for hidden actions */
body.dcat-admin-body .dropdown-menu li.dropdown-item:has(> span:empty):not(:has(a)) { display: none; }
body.dcat-admin-body .dropdown-menu li.dropdown-item > a:empty:only-child { display: none; }
body.dcat-admin-body .dropdown-divider { border-color: var(--t-border) !important; }

body.dcat-admin-body .nav-tabs { border-bottom: 1px solid var(--t-border) !important; }
body.dcat-admin-body .nav-tabs .nav-link {
    border: 0 !important;
    border-bottom: 2px solid transparent !important;
    color: var(--t-text-3) !important;
    background: transparent !important;
    font-weight: 500;
    padding: 10px 14px;
    margin-bottom: -1px;
}
body.dcat-admin-body .nav-tabs .nav-link:hover { color: var(--t-text) !important; }
body.dcat-admin-body .nav-tabs .nav-link.active { color: var(--t-primary) !important; border-bottom-color: var(--t-primary) !important; }
body.dcat-admin-body .nav-tabs .nav-link { transition: color var(--t-dur) var(--t-ease), border-color var(--t-dur-slow) var(--t-ease) !important; }
body.dcat-admin-body .nav.nav-tabs .nav-item .nav-link.active::after { display: none !important; }
body.dcat-admin-body [class*=nav-theme-] .nav.nav-tabs { background: transparent !important; }
body.dcat-admin-body [class*=nav-theme-] .nav.nav-tabs .nav-item .nav-link.active { background: transparent !important; color: var(--t-primary) !important; }
body.dcat-admin-body .tab-content > .tab-pane.active { animation: t-fade-in var(--t-dur-slow) var(--t-ease-out); }

body.dcat-admin-body .modal-content,
body.dcat-admin-body .layui-layer {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border) !important;
    border-radius: var(--t-radius) !important;
    box-shadow: var(--t-shadow-lg) !important;
    overflow: hidden;
}
body.dcat-admin-body .modal-header, body.dcat-admin-body .layui-layer-title {
    background: var(--t-surface) !important;
    border-bottom: 1px solid var(--t-border) !important;
    color: var(--t-text) !important;
    font-weight: 600 !important;
    font-size: var(--t-fs-md) !important;
}
body.dcat-admin-body .modal-footer, body.dcat-admin-body .layui-layer-btn { border-top: 1px solid var(--t-border) !important; background: var(--t-surface-2) !important; }
/* dialog buttons: secondary on the left, the primary action last; same size as other buttons */
body.dcat-admin-body .layui-layer-btn { display: flex; flex-direction: row-reverse; justify-content: flex-start; gap: 8px; padding: 12px 20px !important; }
body.dcat-admin-body .layui-layer-btn a {
    margin: 0 !important; height: var(--t-h-md) !important; line-height: calc(var(--t-h-md) - 2px) !important; padding: 0 16px !important;
    border-radius: var(--t-radius-sm) !important; box-shadow: none !important;
    font-size: var(--t-fs-sm) !important; font-weight: 500;
    background: var(--t-surface) !important; border: 1px solid var(--t-border-strong) !important; color: var(--t-text) !important;
}
body.dcat-admin-body .layui-layer-btn a:hover { background: var(--t-surface-3) !important; }
body.dcat-admin-body .layui-layer-btn .layui-layer-btn0 { background: var(--t-primary) !important; border-color: var(--t-primary) !important; color: var(--t-on-primary) !important; }
body.dcat-admin-body .layui-layer-btn .layui-layer-btn0:hover { background: var(--t-primary-hover) !important; border-color: var(--t-primary-hover) !important; }
body.dcat-admin-body .modal-backdrop.show, body.dcat-admin-body .layui-layer-shade { background: var(--t-overlay) !important; }
/* bootstrap also halves the backdrop's opacity; the overlay token already carries its own alpha (same as the confirm dialog) */
body.dcat-admin-body .modal-backdrop.show { opacity: 1 !important; }
body.dcat-admin-body .modal.fade .modal-dialog { transform: none; translate: 0 8px; scale: .97; transition: translate var(--t-dur-slow) var(--t-ease-out), scale var(--t-dur-slow) var(--t-ease-out) !important; }
body.dcat-admin-body .modal.show .modal-dialog { translate: none; scale: none; }
/* layer windows (quick edit, dialog forms): a short rise instead of layer's bounce */
body.dcat-admin-body .layui-layer.layer-anim:not(.layui-layer-tips):not(.layui-layer-msg):not(.layui-layer-loading):not(.layer-anim-close) { animation: t-dialog-in var(--t-dur-slow) var(--t-ease-out) both !important; }
body.dcat-admin-body .layui-layer.layer-anim-close { animation: t-dialog-out var(--t-dur-exit) var(--t-ease-in) forwards !important; }
body.dcat-admin-body .layui-layer-tips.layer-anim { animation: t-fade-in var(--t-dur-enter) var(--t-ease-out) both !important; }

/* tooltips (dcat's Tooltip widget and ->help(), both layer.tips): a small dark label with its arrow.
   The dialog rules above would otherwise frame it like a card and clip the arrow. */
body.dcat-admin-body .layui-layer.layui-layer-tips { background: transparent !important; border: 0 !important; border-radius: 0 !important; box-shadow: none !important; overflow: visible !important; }
body.dcat-admin-body .layui-layer-tips .layui-layer-content {
    background: var(--t-tooltip-bg) !important; color: var(--t-tooltip-text) !important;
    padding: 6px 10px !important; border-radius: var(--t-radius-sm) !important;
    font-size: var(--t-fs-xs) !important; line-height: 18px !important; font-weight: var(--t-fw-medium);
    box-shadow: var(--t-shadow-lg) !important;
}
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsG { border-width: 6px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsT,
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsB { border-right-color: var(--t-tooltip-bg) !important; left: 10px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsT { bottom: -6px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsB { top: -6px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsR,
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsL { border-bottom-color: var(--t-tooltip-bg) !important; top: 8px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsR { left: -6px !important; }
body.dcat-admin-body .layui-layer-tips i.layui-layer-TipsL { right: -6px !important; }

/* popovers (inline edit and others): a card, with the arrow in the card's own colors */
body.dcat-admin-body .popover {
    background: var(--t-surface); border: 1px solid var(--t-border); border-radius: var(--t-radius-md);
    box-shadow: var(--t-shadow-lg); font-family: var(--t-font); font-size: var(--t-fs-sm); color: var(--t-text-2);
}
body.dcat-admin-body .popover-header { background: var(--t-surface-2); border-bottom: 1px solid var(--t-border); color: var(--t-text); font-size: var(--t-fs-sm); font-weight: var(--t-fw-semibold); padding: 8px 12px; }
body.dcat-admin-body .popover-body { padding: 12px; color: var(--t-text-2); }
body.dcat-admin-body .bs-popover-top > .arrow::before, body.dcat-admin-body .bs-popover-auto[x-placement^="top"] > .arrow::before { border-top-color: var(--t-border); }
body.dcat-admin-body .bs-popover-top > .arrow::after, body.dcat-admin-body .bs-popover-auto[x-placement^="top"] > .arrow::after { border-top-color: var(--t-surface); }
body.dcat-admin-body .bs-popover-bottom > .arrow::before, body.dcat-admin-body .bs-popover-auto[x-placement^="bottom"] > .arrow::before { border-bottom-color: var(--t-border); }
body.dcat-admin-body .bs-popover-bottom > .arrow::after, body.dcat-admin-body .bs-popover-auto[x-placement^="bottom"] > .arrow::after { border-bottom-color: var(--t-surface); }
body.dcat-admin-body .bs-popover-left > .arrow::before, body.dcat-admin-body .bs-popover-auto[x-placement^="left"] > .arrow::before { border-left-color: var(--t-border); }
body.dcat-admin-body .bs-popover-left > .arrow::after, body.dcat-admin-body .bs-popover-auto[x-placement^="left"] > .arrow::after { border-left-color: var(--t-surface); }
body.dcat-admin-body .bs-popover-right > .arrow::before, body.dcat-admin-body .bs-popover-auto[x-placement^="right"] > .arrow::before { border-right-color: var(--t-border); }
body.dcat-admin-body .bs-popover-right > .arrow::after, body.dcat-admin-body .bs-popover-auto[x-placement^="right"] > .arrow::after { border-right-color: var(--t-surface); }
body.dcat-admin-body .bs-popover-bottom .popover-header::before, body.dcat-admin-body .bs-popover-auto[x-placement^="bottom"] .popover-header::before { border-bottom-color: var(--t-surface-2); }
/* inline-edit popover: the field, then the two actions on the right */
body.dcat-admin-body .ie-content { min-width: 240px; }
/* dcat prints 提交 before 取消 and floated both right, so row-reverse keeps 取消 on the left */
body.dcat-admin-body .ie-content .ie-action { display: flex; flex-direction: row-reverse; justify-content: flex-start; gap: 8px; margin-top: 10px; }
body.dcat-admin-body .ie-content .ie-action button { float: none !important; margin: 0 !important; height: var(--t-h-md); padding: 0 12px; font-size: var(--t-fs-sm); }

/* toasts (toastr): a white card with a small colored icon, instead of a solid red / green block */
body.dcat-admin-body #toast-container > .toast {
    width: 340px; max-width: calc(100vw - 32px);
    padding: 12px 36px 12px 46px !important;
    background: var(--t-surface) !important; background-image: none !important;
    color: var(--t-text) !important;
    border: 1px solid var(--t-border);
    border-radius: var(--t-radius) !important;
    box-shadow: var(--t-shadow-lg) !important;
    opacity: 1; /* not !important: toastr fades toasts in and out through the inline opacity */
    font-size: var(--t-fs-base); line-height: 1.5;
    position: relative;
    animation: t-toast-in var(--t-dur-slow) var(--t-ease-out);
}
body.dcat-admin-body #toast-container > .toast::before {
    content: ""; position: absolute; left: 14px; top: 50%; transform: translateY(-50%);
    width: 20px; height: 20px; border-radius: var(--t-radius-full);
    background: var(--t-info) center / 12px 12px no-repeat;
}
body.dcat-admin-body #toast-container > .toast-success::before { background-color: var(--t-success); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E"); }
body.dcat-admin-body #toast-container > .toast-error::before { background-color: var(--t-danger); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M7 7l10 10M17 7L7 17'/%3E%3C/svg%3E"); }
body.dcat-admin-body #toast-container > .toast-warning::before { background-color: var(--t-warning); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M12 6v8M12 18.5v.5'/%3E%3C/svg%3E"); }
body.dcat-admin-body #toast-container > .toast-info::before { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M12 11v7M12 5.5v.5'/%3E%3C/svg%3E"); }
body.dcat-admin-body #toast-container > .toast .toast-title { font-weight: 600; }
body.dcat-admin-body #toast-container > .toast .toast-close-button { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: var(--t-text-4) !important; text-shadow: none; opacity: 1; font-weight: 400; }
body.dcat-admin-body #toast-container > .toast .toast-progress { background: currentColor; opacity: .12; height: 2px; }
body.dcat-admin-body #toast-container > .toast:hover { box-shadow: var(--t-shadow-lg) !important; }

/* confirm dialogs (sweetalert2): compact card, small tinted icon, cancel left and the action right.
   Delete confirmations get .t-danger from theme.js and a red action button. */
body.dcat-admin-body .swal2-container.swal2-backdrop-show,
body.dcat-admin-body .swal2-container.swal2-shown { background: var(--t-overlay) !important; } /* swal2-shown: the sweetalert2 build dcat ships */
body.dcat-admin-body .swal2-popup.swal2-show { animation: t-dialog-in var(--t-dur-slow) var(--t-ease-out) !important; }
body.dcat-admin-body .swal2-popup.swal2-hide { animation: t-dialog-out var(--t-dur-exit) var(--t-ease-in) forwards !important; }
body.dcat-admin-body .swal2-popup {
    width: 400px !important; max-width: calc(100vw - 32px);
    padding: 24px 24px 20px !important;
    border-radius: var(--t-radius-lg) !important;
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border);
    box-shadow: var(--t-shadow-lg) !important;
    font-family: var(--t-font);
}
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-question,
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-warning,
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-info {
    width: 48px !important; height: var(--t-row-h) !important; margin: 4px auto 14px !important;
    border: 0 !important; border-radius: var(--t-radius-full);
    background: var(--t-primary-soft);
    color: var(--t-primary) !important;
    animation: none !important;
}
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-warning { background: var(--t-warning-soft); color: var(--t-warning) !important; }
body.dcat-admin-body .swal2-popup .swal2-icon::before { font-size: 26px !important; line-height: 48px; height: 48px; font-weight: 600; animation: none !important; }
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-success,
body.dcat-admin-body .swal2-popup .swal2-icon.swal2-error { transform: scale(.6); margin: -8px auto -6px !important; }
body.dcat-admin-body .swal2-popup .swal2-title { margin: 0 0 6px !important; color: var(--t-text) !important; font-size: var(--t-fs-lg) !important; font-weight: 600 !important; }
body.dcat-admin-body .swal2-popup .swal2-content { color: var(--t-text-3) !important; font-size: var(--t-fs-base) !important; }
body.dcat-admin-body .swal2-popup .swal2-actions { flex-direction: row-reverse; gap: 8px; margin: 22px 0 0 !important; width: 100%; }
body.dcat-admin-body .swal2-popup .swal2-actions .btn,
body.dcat-admin-body .swal2-popup .swal2-actions .swal2-styled {
    flex: 1; height: var(--t-h-lg); margin: 0 !important; padding: 0 16px !important;
    border-radius: var(--t-radius-sm) !important; box-shadow: none !important;
    font-size: var(--t-fs-base) !important; font-weight: 500;
}
body.dcat-admin-body .swal2-popup .swal2-actions .swal2-cancel { background: var(--t-surface) !important; border: 1px solid var(--t-border-strong) !important; color: var(--t-text) !important; }
body.dcat-admin-body .swal2-popup .swal2-actions .swal2-cancel:hover { background: var(--t-surface-3) !important; }
body.dcat-admin-body .swal2-popup .swal2-actions .btn:focus { box-shadow: var(--t-ring) !important; }
body.dcat-admin-body .swal2-popup.t-danger .swal2-icon { background: var(--t-danger-soft) !important; color: var(--t-danger) !important; }
body.dcat-admin-body .swal2-popup.t-danger .swal2-icon.swal2-question::before { content: "!"; }
body.dcat-admin-body .swal2-popup.t-danger .swal2-confirm { background: var(--t-danger-solid) !important; border-color: var(--t-danger-solid) !important; color: var(--t-on-primary) !important; }
body.dcat-admin-body .swal2-popup.t-danger .swal2-confirm:hover { filter: brightness(.92); }

/* date / time picker (bootstrap-datetimepicker) */
body.dcat-admin-body .bootstrap-datetimepicker-widget.dropdown-menu { padding: 10px !important; width: 272px !important; border-radius: var(--t-radius) !important; animation: t-drop-in var(--t-dur-enter) var(--t-ease-out); transform-origin: top; }
body.dcat-admin-body .bootstrap-datetimepicker-widget.dropdown-menu.top { animation-name: t-drop-up; transform-origin: bottom; }
body.dcat-admin-body .bootstrap-datetimepicker-widget.dropdown-menu::before,
body.dcat-admin-body .bootstrap-datetimepicker-widget.dropdown-menu::after { display: none !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table { width: 100%; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table th,
body.dcat-admin-body .bootstrap-datetimepicker-widget table td { height: var(--t-h-md) !important; line-height: var(--t-h-md) !important; padding: 0 !important; border: 0 !important; font-size: var(--t-fs-sm); }
body.dcat-admin-body .bootstrap-datetimepicker-widget table thead tr:first-child th { color: var(--t-text); font-weight: 600; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table th.dow { color: var(--t-text-4); font-weight: 500; font-size: var(--t-fs-xs); }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.day,
body.dcat-admin-body .bootstrap-datetimepicker-widget table td span,
body.dcat-admin-body .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { border-radius: var(--t-radius-sm) !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.day { color: var(--t-text-2); }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.day:hover,
body.dcat-admin-body .bootstrap-datetimepicker-widget table td span:hover,
body.dcat-admin-body .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { background: var(--t-surface-3) !important; color: var(--t-text) !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.old,
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.new { color: var(--t-text-4) !important; opacity: .6; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.today { position: relative; color: var(--t-primary) !important; font-weight: 600; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.today::before { border: 0 !important; width: 4px; height: 4px; border-radius: var(--t-radius-full); background: var(--t-primary) !important; bottom: 4px !important; right: 50% !important; transform: translateX(50%); }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.active,
body.dcat-admin-body .bootstrap-datetimepicker-widget table td span.active { background: var(--t-primary) !important; color: var(--t-on-primary) !important; text-shadow: none !important; font-weight: 600; }
body.dcat-admin-body .bootstrap-datetimepicker-widget table td.active.today::before { background: #fff !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget .picker-switch td span,
body.dcat-admin-body .bootstrap-datetimepicker-widget .picker-switch a { color: var(--t-text-3) !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget .timepicker-picker .btn { color: var(--t-text-3) !important; background: transparent !important; box-shadow: none !important; }
body.dcat-admin-body .bootstrap-datetimepicker-widget .timepicker-picker span.timepicker-hour,
body.dcat-admin-body .bootstrap-datetimepicker-widget .timepicker-picker span.timepicker-minute,
body.dcat-admin-body .bootstrap-datetimepicker-widget .timepicker-picker span.timepicker-second { font-size: var(--t-fs-xl); font-weight: 600; color: var(--t-text); font-variant-numeric: tabular-nums; }

/* loading (Dcat.loading() over the page, $(el).loading() over an async grid or card): dots in the brand
   color on a light veil. dcat's veil was a solid white block (black-ish in dark mode, after the overlay
   token) and its dots a pale grey. */
body.dcat-admin-body .layui-layer-shade.dcat-loading { background: color-mix(in srgb, var(--t-surface) 55%, transparent) !important; animation: t-fade-in var(--t-dur-slow) var(--t-ease-out); }
body.dcat-admin-body .dcat-loading.pin[style*="background:#fff"] { background: color-mix(in srgb, var(--t-surface) 70%, transparent) !important; animation: t-fade-in var(--t-dur-slow) var(--t-ease-out); border-radius: inherit; }
body.dcat-admin-body .dcat-loading svg { fill: var(--t-primary); }

/* column picker (表格列 menu): roomy rows with a hover state */
body.dcat-admin-body .column-selector .dropdown-menu { padding: 6px !important; min-width: 180px !important; }
body.dcat-admin-body .column-selector .dropdown-menu > .dropdown-item { padding: 0 !important; background: transparent !important; }
body.dcat-admin-body .column-selector .dropdown-menu .selectors { padding: 0; margin: 0; }
body.dcat-admin-body .column-selector .dropdown-menu .vs-checkbox-con { display: flex; align-items: center; margin: 0 !important; padding: 6px 10px; border-radius: var(--t-radius-sm); cursor: pointer; font-size: var(--t-fs-sm); color: var(--t-text-2); }
body.dcat-admin-body .column-selector .dropdown-menu .vs-checkbox-con:hover { background: var(--t-surface-3); color: var(--t-text); }
body.dcat-admin-body .column-selector .dropdown-menu .dropdown-divider { margin: 4px 0 !important; }

/* ---------- Dark mode: replace dcat's purple-tinted darks ---------- */
body.dcat-admin-body.dark-mode,
body.dcat-admin-body.dark-mode .content-wrapper,
body.dcat-admin-body.dark-mode .app-content { background-color: var(--t-bg) !important; color: var(--t-text-2) !important; }
body.dcat-admin-body.dark-mode .dropdown-menu .form-control,
body.dcat-admin-body.dark-mode .table-filter .form-control { background: var(--t-surface) !important; color: var(--t-text) !important; }
body.dcat-admin-body.dark-mode .table, body.dcat-admin-body.dark-mode .table td, body.dcat-admin-body.dark-mode .table th { border-color: var(--t-border) !important; }
body.dcat-admin-body.dark-mode .table tbody tr,
body.dcat-admin-body.dark-mode .table tbody tr td,
body.dcat-admin-body.dark-mode .table tbody tr th,
body.dcat-admin-body.dark-mode .table.default-table td { background-color: var(--t-surface) !important; color: var(--t-text) !important; }
body.dcat-admin-body.dark-mode .table thead tr th,
body.dcat-admin-body.dark-mode .table.default-table th { background-color: var(--t-surface-2) !important; color: var(--t-text-3) !important; }
body.dcat-admin-body.dark-mode .table tbody tr:hover,
body.dcat-admin-body.dark-mode .table tbody tr:hover td { background-color: var(--t-surface-2) !important; }
body.dcat-admin-body.dark-mode .table tbody tr.selected td { background-color: var(--t-primary-soft) !important; }
body.dcat-admin-body.dark-mode .quick-create td { background-color: var(--t-surface-2) !important; color: var(--t-text-3) !important; }
body.dcat-admin-body.dark-mode .nav-theme-primary .nav.nav-tabs,
body.dcat-admin-body.dark-mode .nav-theme-white .nav.nav-tabs { background-color: var(--t-surface) !important; }
body.dcat-admin-body.dark-mode .text-80, body.dcat-admin-body.dark-mode .text-70 { color: var(--t-text-3) !important; }
/* plain inputs without .form-control (翻译 page etc.) get dcat's purple dark fill */
body.dcat-admin-body.dark-mode textarea:not(.form-control),
body.dcat-admin-body.dark-mode input[type=text]:not(.form-control):not(.select2-search__field) { background-color: var(--t-surface) !important; color: var(--t-text) !important; border-color: var(--t-border) !important; }

/* ---------- Login / register (resources/views/admin/{login,fbbirdlogin,register}.blade.php) ----------
 * Markup is unchanged; this re-lays it out: a form panel plus, where the template has one,
 * a brand panel that keeps the configured background image under a color wash. */
body.dcat-admin-body .login-main {
    min-height: 100vh;
    margin: 0 !important;
    display: flex;
    background: var(--t-bg);
}
body.dcat-admin-body .login-main > .col-lg-3,
body.dcat-admin-body .login-main > .col-12:first-child {
    background: var(--t-surface) !important;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 48px 24px !important;
    position: relative;
}
@media (min-width: 992px) {
    body.dcat-admin-body .login-main > .col-lg-3 {
        flex: 0 0 520px !important;
        max-width: 520px !important;
        border-right: 1px solid var(--t-border);
    }
}
/* single-column variant (fbbirdlogin): a centered card on a soft backdrop */
body.dcat-admin-body .login-main > .col-12:only-child,
body.dcat-admin-body .login-main > .col-12:first-child:not(.col-lg-3) {
    background:
        radial-gradient(1200px 600px at 10% -10%, color-mix(in srgb, var(--t-primary) 14%, transparent), transparent 60%),
        radial-gradient(900px 500px at 110% 110%, color-mix(in srgb, #06b6d4 12%, transparent), transparent 60%),
        var(--t-bg) !important;
}
body.dcat-admin-body .login-main > .col-12:first-child:not(.col-lg-3) .login-page {
    background: var(--t-surface) !important;
    border: 1px solid var(--t-border);
    border-radius: var(--t-radius-lg);
    box-shadow: var(--t-shadow-lg);
    padding: 36px 36px 28px;
}

body.dcat-admin-body .login-main .login-page {
    display: block !important;
    width: 100%;
    max-width: 380px;
    height: auto;
    background: transparent !important;
}
body.dcat-admin-body .login-main .auth-brand {
    width: auto !important;
    margin: 0 0 28px !important;
    font-size: var(--t-fs-xl) !important;
    font-weight: 650;
    letter-spacing: -.01em;
    color: var(--t-text) !important;
    display: flex;
    align-items: center;
    justify-content: flex-start;
    text-align: left !important;
    gap: 10px;
}
body.dcat-admin-body .login-main .auth-brand::before {
    content: "";
    width: 32px; height: var(--t-h-md); flex: none;
    border-radius: var(--t-radius-md);
    background: linear-gradient(135deg, var(--t-primary), #06b6d4);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .25), 0 4px 12px -2px color-mix(in srgb, var(--t-primary) 45%, transparent);
}
body.dcat-admin-body .login-main .login-box { width: auto !important; max-width: 100%; margin: 0 !important; }
body.dcat-admin-body .login-main .login-logo { margin: 0 0 20px !important; text-align: left; }
body.dcat-admin-body .login-main .login-logo h4:empty { display: none; }
body.dcat-admin-body .login-main .login-box-msg {
    color: var(--t-text) !important;
    font-size: var(--t-fs-2xl) !important;
    line-height: 1.35;
    font-weight: 650 !important;
    letter-spacing: -.02em;
    padding: 0 !important;
    margin: 0 !important;
}
body.dcat-admin-body .login-main .card,
body.dcat-admin-body .login-main .login-box .card {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
}
body.dcat-admin-body .login-main .login-card-body { padding: 0 !important; background: transparent !important; }

/* fields: label above, icon inside the input */
body.dcat-admin-body .login-main .form-label-group { margin-bottom: 16px; display: flex; flex-direction: column; }
body.dcat-admin-body .login-main .form-label-group > label {
    position: static !important;
    order: -1;
    opacity: 1 !important;
    transform: none !important;
    padding: 0 !important;
    margin: 0 0 6px !important;
    font-size: var(--t-fs-sm) !important;
    font-weight: 500;
    color: var(--t-text-2) !important;
    pointer-events: none;
}
body.dcat-admin-body .login-main .form-label-group .form-control {
    height: var(--t-h-xl) !important;
    padding: 0 12px 0 38px !important;
    font-size: var(--t-fs-base) !important;
}
body.dcat-admin-body .login-main .form-label-group .form-control::placeholder { color: var(--t-text-4) !important; opacity: 1 !important; }
body.dcat-admin-body .login-main .form-label-group .form-control-position {
    top: 27px !important;
    left: 0 !important;
    width: 38px;
    height: var(--t-h-xl);
    line-height: var(--t-h-xl) !important;
    text-align: center;
    color: var(--t-text-4) !important;
}
body.dcat-admin-body .login-main .form-label-group .form-control:focus ~ .form-control-position { color: var(--t-primary) !important; }
body.dcat-admin-body .login-main .invalid-feedback { display: block; font-size: var(--t-fs-xs); margin-top: 6px; color: var(--t-danger) !important; }
body.dcat-admin-body .login-main .vs-checkbox-con span:last-child { color: var(--t-text-2); font-size: var(--t-fs-sm); }

body.dcat-admin-body .login-main .login-btn,
body.dcat-admin-body .login-main .btn-primary {
    float: none !important;
    width: 100%;
    height: var(--t-h-xl);
    font-size: var(--t-fs-base) !important;
    font-weight: 600 !important;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    box-shadow: 0 1px 2px rgba(16, 24, 40, .1), inset 0 1px 0 rgba(255, 255, 255, .12) !important;
}
body.dcat-admin-body .login-main form > div:not(.form-group):not(.text-center) { display: none; } /* the &nbsp; spacer */
body.dcat-admin-body .login-main form .text-center { margin-top: 20px; font-size: var(--t-fs-sm); color: var(--t-text-3); }
body.dcat-admin-body .login-main form .text-center a { font-weight: 500; }

/* brand panel (login.blade.php / register.blade.php) */
body.dcat-admin-body .login-main .login-page-right {
    flex: 1;
    text-align: left !important;
    padding: 0 !important;
    position: relative;
    overflow: hidden;
    background-size: cover !important;
    background-position: center !important;
    display: flex;
    align-items: flex-end;
}
body.dcat-admin-body .login-main .login-page-right .content-front {
    position: absolute;
    inset: 0;
    height: auto;
    margin: 0;
    background:
        linear-gradient(160deg, color-mix(in srgb, var(--t-primary) 78%, transparent) 0%, rgba(17, 24, 39, .88) 100%) !important;
}
body.dcat-admin-body .login-main .login-page-right .content-front::after {
    content: "";
    position: absolute; inset: 0;
    background-image:
        linear-gradient(rgba(255, 255, 255, .06) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255, 255, 255, .06) 1px, transparent 1px);
    background-size: 48px 48px;
    mask-image: radial-gradient(ellipse at 30% 20%, #000 20%, transparent 75%);
    -webkit-mask-image: radial-gradient(ellipse at 30% 20%, #000 20%, transparent 75%);
}
body.dcat-admin-body .login-main .login-description {
    position: relative;
    bottom: auto; left: auto; right: auto;
    margin: 0 !important;
    width: 100%;
    padding: 56px !important;
    text-align: left !important;
    color: rgba(255, 255, 255, .92);
    font-size: var(--t-fs-3xl);
    font-weight: 650;
    letter-spacing: -.02em;
    line-height: 1.25;
}
body.dcat-admin-body .login-main .login-description p { margin: 0; }
body.dcat-admin-body .login-main .login-description .lead:empty { display: none; }
@media (max-width: 991px) {
    body.dcat-admin-body .login-main { flex-direction: column; }
    body.dcat-admin-body .login-main .login-page-right { display: none; }
    body.dcat-admin-body .login-main > .col-lg-3,
    body.dcat-admin-body .login-main > .col-12:first-child { flex: 1 0 auto; min-height: 100vh; }
}
