/*
 * Design token CSS custom properties for nexus-modular.
 *
 * SELECTOR BRIDGE NOTE:
 * The Vitessce style guides reference [data-theme="light"] (Vitessce convention).
 * This application uses [data-mantine-color-scheme="light"] (Mantine's attribute,
 * toggled automatically by MantineProvider when the user switches color scheme).
 * They are equivalent for our purposes. Do NOT introduce a data-theme attribute
 * on <html> — that would cause double-toggling with Mantine's own attribute.
 *
 * Dark mode values are the :root defaults (Catppuccin Mocha-derived palette).
 * Light mode values override under [data-mantine-color-scheme="light"].
 */

/* ─── Dark mode defaults ─────────────────────────────────────────────────── */

:root {
  /* Fonts */
  --font-heading: 'Space Grotesk', sans-serif;
  --font-body:    'DM Sans', sans-serif;
  --font-mono:    'JetBrains Mono', monospace;

  /* Backgrounds */
  --color-canvas:   #10131f;
  --color-app:      #1c1f30;
  --color-subtle:   #131623;
  --color-surface:  #2f3346;
  --color-elevated: #42485d;
  --color-overlay:  #545c74;

  /* Text */
  --color-text-primary:   #ccdbf5;
  --color-text-secondary: #b8c6e0;
  --color-text-muted:     #a3b0cb;
  --color-text-faint:     #7a86a1;
  --color-text-ghost:     #67718b;
  --color-text-on-accent: #1c1f30;

  /* Borders */
  --color-border-strong:  #545c74;
  --color-border-default: #42485d;
  --color-border-subtle:  #2f3346;

  /* Accent */
  --color-accent:      #7eadfb;
  --color-accent-hover: #6a9ef0;
  --color-accent-soft: #b3c7ff;

  /* Semantic */
  --color-success: #a6e3a1;
  --color-warning: #f9e2af;
  --color-error:   #f38ba8;
  --color-info:    #89dceb;

  /* Palette (Catppuccin Mocha) */
  --color-ctp-teal:     #94e2d5;
  --color-ctp-peach:    #fab387;
  --color-ctp-sky:      #89dceb;
  --color-ctp-sapphire: #74c7ec;
  --color-ctp-green:    #a6e3a1;
  --color-ctp-yellow:   #f9e2af;
  --color-ctp-red:      #f38ba8;
  --color-ctp-maroon:   #eba0ac;
  --color-ctp-mauve:    #7eadfb;
  --color-ctp-blue:     #87c2fc;
  --color-ctp-lavender: #b3c7ff;
}

/* ─── Motion tokens ─────────────────────────────────────────────────────── */
/*
 * Use these in framer-motion via:
 *   getComputedStyle(document.documentElement).getPropertyValue('--motion-duration-normal')
 * rather than hardcoding 0.15 / 200 in transition objects.
 */

:root {
  --motion-duration-fast:   130ms;
  --motion-duration-normal: 150ms;
  --motion-duration-slow:   200ms;
  --motion-ease-default: ease;
  --motion-ease-out:     ease-out;
}

/* ─── Body + Mantine body token ─────────────────────────────────────────── */
/*
 * body background: tokens.css is a static <link> loaded before emotion injects
 * Mantine's <style> tags, so we must use !important to win on the property.
 *
 * --mantine-color-body: Mantine v7 sets this on :root[data-mantine-color-scheme]
 * (specificity 0,1,1). We match that specificity here and load after mantine.css,
 * so source-order wins — no !important needed, but added for safety.
 * This variable drives Paper, Modal, and other component backgrounds.
 * AppShell navbar/header/main have explicit inline styles in shell.cljs so they
 * are unaffected by this override.
 */
body {
  background-color: var(--color-app) !important;
}

:root[data-mantine-color-scheme="light"] body {
  background-color: var(--color-surface) !important;
}

:root[data-mantine-color-scheme="dark"] {
  --mantine-color-body: var(--color-surface) !important;
  --mantine-color-dimmed: var(--color-text-faint) !important;

  /* Blue-tinted neutrals at matching brightness — mantine ships true neutral
   * grays (R=G=B), which read warm/yellow against our cool palette due to
   * simultaneous contrast. Same hue family as --color-app/--color-surface. */
  --mantine-color-dark-0: #c8cad3;
  --mantine-color-dark-1: #b5b7c2;
  --mantine-color-dark-2: #808396;
  --mantine-color-dark-3: #686b80;
  --mantine-color-dark-4: #3f4254;
  --mantine-color-dark-5: #383b4c;
  --mantine-color-dark-6: #2b2d3c;
  --mantine-color-dark-7: #22232f;
  --mantine-color-dark-8: #1d1e29;
  --mantine-color-dark-9: #13141d;
}

:root[data-mantine-color-scheme="light"] {
  --mantine-color-body: var(--color-surface) !important;
}

/* ─── Mantine Container in AppShell.Main ─────────────────────────────────── */
/*
 * AppShell.Main was switched to `display: flex; flex-direction: column` in the
 * style harmonization commit. Mantine's Container has `margin-inline: auto`,
 * which in a flex parent makes the cross-axis size shrink-to-content rather
 * than stretch — so its `max-width` (e.g. 82.5rem for size="xl") never acts
 * as a hard cap on the *visible* width. Wide intrinsic content (datatables,
 * Edit/Delete button rows, alerts) then pushes the Container past the
 * viewport, producing a horizontal scrollbar on the body.
 *
 * Forcing `width: 100%` makes the flex item stretch, so `max-width` finally
 * clamps. `min-width: 0` lets it shrink below max-width on narrow viewports
 * (otherwise flex items default to `min-width: auto` = content-based).
 *
 * Scoped to AppShell.Main so portaled Containers (modals, popovers) are
 * unaffected. Applies to all sizes — narrower sizes still cap at their
 * own --container-size-* and centre via margin-inline:auto.
 */
.mantine-AppShell-main .mantine-Container-root {
  width: 100%;
  min-width: 0;
}

/* ─── Disabled input state ───────────────────────────────────────────────── */

[data-mantine-color-scheme="dark"] .mantine-Input-input[data-disabled],
[data-mantine-color-scheme="dark"] .mantine-PillsInput-input[data-disabled] {
  background-color: var(--color-subtle) !important;
  color: var(--color-text-faint) !important;
  border-color: var(--color-border-subtle) !important;
  opacity: 1 !important;
  cursor: not-allowed;
}

/* ─── Mantine Checkbox ───────────────────────────────────────────────────── */

.mantine-Checkbox-input {
  border-color: var(--color-border-strong) !important;
  background-color: transparent !important;
}

.mantine-Checkbox-input:checked,
.mantine-Checkbox-input:indeterminate {
  background-color: var(--color-accent) !important;
  border-color: var(--color-accent) !important;
}

/* ─── Mantine Divider ────────────────────────────────────────────────────── */

.mantine-Divider-root {
  border-color: var(--color-border-default) !important;
}

/* ─── mantine-datatable: sort icons, filter, page-size ──────────────────── */

/* Unsorted sort icon - faint, gets brighter on hover */
.mantine-datatable-header-cell-sortable-unsorted-icon {
  color: var(--color-text-faint) !important;
}

[data-mantine-color-scheme="dark"] th:hover .mantine-datatable-header-cell-sortable-unsorted-icon {
  color: var(--color-text-muted) !important;
}

/* Sort/drag hover background */
[data-mantine-color-scheme="dark"] .mantine-datatable-header-cell-sortable:hover:not(:has(button:hover)),
[data-mantine-color-scheme="dark"] .mantine-datatable-header-cell-draggable:hover:not(:has(button:hover)) {
  background: color-mix(in srgb, var(--color-accent) 8%, var(--color-elevated)) !important;
}

/* Filter action icon */
[data-mantine-color-scheme] .mantine-datatable-header-cell-filter-action-icon {
  color: var(--color-text-faint) !important;
  border: none !important;
}

[data-mantine-color-scheme] .mantine-datatable-header-cell-filter-action-icon[data-active] {
  color: var(--color-accent) !important;
}

/* Toggleable (column hide/show) X icon */
[data-mantine-color-scheme] .mantine-datatable-header-cell-toggleable-icon {
  color: var(--color-text-faint) !important;
}

/* Pagination text ("1–20 of 42") */
.mantine-datatable-pagination-text {
  color: var(--color-text-muted) !important;
  font-size: 0.78rem;
}

/* Page-size selector button */
.mantine-datatable-page-size-selector-active {
  background: var(--color-accent) !important;
  color: var(--color-text-on-accent) !important;
}

/* ─── Mantine Switch ─────────────────────────────────────────────────────── */

.mantine-Switch-track {
  background-color: var(--color-surface) !important;
  border-color: var(--color-border-default) !important;
  cursor: pointer;
  transition: background-color 0.13s ease, border-color 0.13s ease, box-shadow 0.13s ease !important;
}

.mantine-Switch-thumb {
  background-color: var(--color-text-faint) !important;
  border-color: var(--color-border-default) !important;
  transition: background-color 0.13s ease, box-shadow 0.13s ease !important;
}

/* Hover — off state */
.mantine-Switch-root:not([data-disabled]):not([data-checked]):hover .mantine-Switch-track {
  background-color: var(--color-elevated) !important;
  border-color: var(--color-border-strong) !important;
}

/* Checked state — with glow */
.mantine-Switch-root[data-checked] .mantine-Switch-track {
  background-color: color-mix(in srgb, var(--color-accent) 15%, var(--color-surface)) !important;
  border-color: var(--color-accent) !important;
  box-shadow: 0 0 8px color-mix(in srgb, var(--color-accent) 30%, transparent) !important;
}

.mantine-Switch-root[data-checked] .mantine-Switch-thumb {
  background-color: var(--color-accent) !important;
  border-color: var(--color-accent) !important;
  box-shadow: 0 0 6px color-mix(in srgb, var(--color-accent) 55%, transparent) !important;
}

/* Hover — checked state — stronger glow */
.mantine-Switch-root[data-checked]:not([data-disabled]):hover .mantine-Switch-track {
  background-color: color-mix(in srgb, var(--color-accent) 22%, var(--color-surface)) !important;
  box-shadow: 0 0 10px color-mix(in srgb, var(--color-accent) 35%, transparent) !important;
}

.mantine-Switch-root[data-checked]:not([data-disabled]):hover .mantine-Switch-thumb {
  box-shadow: 0 0 8px color-mix(in srgb, var(--color-accent) 60%, transparent) !important;
}

/* ─── Nav search input ───────────────────────────────────────────────────── */

/* Targets the unstyled TextInput used for project search in the nav sidebar */
.mantine-TextInput-input[placeholder="Search projects..."]::placeholder {
  color: var(--color-text-ghost);
}

/* ─── Scrollbars ─────────────────────────────────────────────────────────── */

/* WebKit (Chrome, Safari, Edge) */
::-webkit-scrollbar {
  width: 6px;
  height: 6px;
}

::-webkit-scrollbar-track {
  background: transparent;
}

::-webkit-scrollbar-thumb {
  background: var(--color-text-ghost);
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: var(--color-text-faint);
}

/* Firefox */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--color-text-ghost) transparent;
}

/* ─── Light mode overrides ───────────────────────────────────────────────── */

:root[data-mantine-color-scheme="light"] {
  /* Backgrounds */
  --color-canvas:   #f8f9fc;
  --color-app:      #f0f2f7;
  --color-subtle:   #f3f5fa;
  --color-surface:  #ffffff;
  --color-elevated: #e2e6ef;
  --color-overlay:  #d5dae5;

  /* Text — darkened vs dark-mode defaults for WCAG AA on light backgrounds */
  --color-text-primary:   #1e2330;
  --color-text-secondary: #3b4252;
  --color-text-muted:     #4a5568;
  --color-text-faint:     #5c677a;
  --color-text-ghost:     #6b7280;
  --color-text-on-accent: #ffffff;

  /* Override Mantine's dimmed token (gray-6 = #868e96, contrast ~2.8:1) to our faint */
  --mantine-color-dimmed: var(--color-text-faint) !important;

  /* Borders */
  --color-border-strong:  #b8bfcc;
  --color-border-default: #d5dae5;
  --color-border-subtle:  #e2e6ef;

  /* Accent */
  --color-accent:       #4e7fd7;
  --color-accent-hover: #3d6ec4;
  --color-accent-soft:  #2b5aa6;

  /* Semantic */
  --color-success: #40a050;
  --color-warning: #d4990a;
  --color-error:   #d94050;
  --color-info:    #2091b5;

  /* Palette (Catppuccin Latte) */
  --color-ctp-teal:     #179299;
  --color-ctp-peach:    #fe640b;
  --color-ctp-sky:      #04a5e5;
  --color-ctp-sapphire: #209fb5;
  --color-ctp-green:    #40a02b;
  --color-ctp-yellow:   #df8e1d;
  --color-ctp-red:      #d20f39;
  --color-ctp-maroon:   #e64553;
  --color-ctp-mauve:    #8839ef;
  --color-ctp-blue:     #1e66f5;
  --color-ctp-lavender: #7287fd;
}

/* ─── mantine-datatable overrides ────────────────────────────────── */
/*
 * Mantine inlines --mantine-datatable-*-light / -dark on the element, and
 * picks one via [data-mantine-color-scheme=…] .mantine-datatable rules
 * (specificity 0,2,0) that resolve --mantine-datatable-* (the consumed var).
 * The inline source vars are unbeatable without !important, but the resolved
 * vars are CSS-defined — so we just outrank that 0,2,0 by one type selector.
 * Prefixing with `html` gives 0,2,1 and targets the consumed vars directly.
 *
 * Row-scoped vars (row-color, row-background-color) are set by mantine on
 * .mantine-datatable-row itself, so we mirror that selector for those.
 * Everything else propagates from .mantine-datatable via inheritance.
 */

html[data-mantine-color-scheme] .mantine-datatable {
  --mantine-datatable-color:                              var(--color-text-primary);
  --mantine-datatable-background-color:                   var(--color-subtle);
  --mantine-datatable-border-color:                       var(--color-border-default);
  --mantine-datatable-row-border-color:                   var(--color-border-subtle);
  --mantine-datatable-highlight-on-hover-color:           color-mix(in srgb, var(--color-accent) 6%, var(--color-subtle));
  --mantine-datatable-striped-color:                      var(--color-canvas);
  --mantine-datatable-pagination-active-background-color: var(--color-accent);
  --mantine-datatable-pagination-active-text-color:       var(--color-text-on-accent);
}

html[data-mantine-color-scheme] .mantine-datatable-row {
  --mantine-datatable-row-color:            var(--color-text-primary);
  --mantine-datatable-row-background-color: var(--color-subtle);
}

/* Header row — not exposed as a mantine-datatable variable, set directly.
 * Specificity 0,1,4 outranks mantine's 0,1,2 rules on thead/th. */
.mantine-datatable table thead tr th {
  background-color: var(--color-elevated);
  color: var(--color-text-muted);
  border-bottom-color: var(--color-border-default);
}

/* Selected row — specificity 0,2,4 outranks mantine's .mantine-datatable-row[data-selected] td (0,2,2). */
.mantine-datatable table tbody tr[data-selected] td {
  background-color: color-mix(in srgb, var(--color-accent) 14%, transparent);
}

/* Table font size and vertical alignment */
:is([data-mantine-color-scheme="dark"], [data-mantine-color-scheme="light"]) .mantine-datatable,
:is([data-mantine-color-scheme="dark"], [data-mantine-color-scheme="light"]) .mantine-datatable-table td,
:is([data-mantine-color-scheme="dark"], [data-mantine-color-scheme="light"]) .mantine-datatable-table th {
  font-size: var(--mantine-font-size-lg) !important;
}

.mantine-datatable-table td {
  vertical-align: middle !important;
}

/* Empty state (No records) */
.mantine-datatable-empty-state {
  color: var(--color-text-muted) !important;
}

.mantine-datatable-empty-state-icon {
  background: var(--color-elevated) !important;
  border: 1px solid var(--color-border-default);
}

/* ─── mantine-contextmenu overrides ─────────────────────────────── */

.mantine-contextmenu {
  background-color: var(--color-elevated);
  border: 1px solid var(--color-border-default) !important;
  border-radius: var(--mantine-radius-sm);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  font-family: var(--font-body);
  --mantine-contextmenu-item-button-color: var(--color-text-primary);
  --mantine-contextmenu-item-button-hover-bg-color-light: color-mix(in srgb, var(--color-accent) 8%, transparent);
  --mantine-contextmenu-item-button-hover-bg-color-dark:  color-mix(in srgb, var(--color-accent) 8%, transparent);
  --mantine-contextmenu-item-button-pressed-bg-color-light: color-mix(in srgb, var(--color-accent) 15%, transparent);
  --mantine-contextmenu-item-button-pressed-bg-color-dark:  color-mix(in srgb, var(--color-accent) 15%, transparent);
}

[data-mantine-color-scheme="dark"] .mantine-contextmenu {
  border-color: var(--color-border-default) !important;
}

.mantine-contextmenu-divider {
  background: var(--color-border-subtle) !important;
}

/* ─── P7-2 XYFlow (React Flow) overrides ────────────────────────── */

.react-flow {
  --xy-background-color:                      var(--color-canvas);
  --xy-edge-stroke-default:                   var(--color-border-strong);
  --xy-edge-stroke-selected-default:          var(--color-accent);
  --xy-node-background-color-default:         var(--color-surface);
  --xy-node-border-default:                   1px solid var(--color-border-default);
  --xy-node-color-default:                    var(--color-text-primary);
  --xy-node-boxshadow-hover-default:          0 2px 8px rgba(0, 0, 0, 0.3);
  --xy-node-boxshadow-selected-default:       0 0 0 1.5px var(--color-accent);
  --xy-controls-button-background-color-default:       var(--color-elevated);
  --xy-controls-button-background-color-hover-default: var(--color-overlay);
  --xy-controls-button-color-default:         var(--color-text-muted);
  --xy-controls-button-border-color-default:  var(--color-border-default);
  --xy-minimap-background-color-default:      var(--color-app);
  --xy-minimap-node-background-color-default: var(--color-elevated);
  --xy-background-pattern-dots-color-default: var(--color-border-subtle);
  --xy-edge-label-background-color-default:   var(--color-elevated);
  --xy-selection-background-color-default:    color-mix(in srgb, var(--color-accent) 8%, transparent);
  --xy-selection-border-default:              1px dotted var(--color-accent);
}
