oxios 1.7.1

Oxios Agent OS — Agent Operating System powered by oxi-sdk
@import 'tailwindcss';
@import 'tw-animate-css';
@import 'highlight.js/styles/github-dark.css';
@plugin '@tailwindcss/typography';

@custom-variant dark (&:is(.dark *));

@theme inline {
  --color-background: var(--background);
  --color-foreground: var(--foreground);
  --color-card: var(--card);
  --color-card-foreground: var(--card-foreground);
  --color-popover: var(--popover);
  --color-popover-foreground: var(--popover-foreground);
  --color-primary: var(--primary);
  --color-primary-foreground: var(--primary-foreground);
  --color-secondary: var(--secondary);
  --color-secondary-foreground: var(--secondary-foreground);
  --color-muted: var(--muted);
  --color-muted-foreground: var(--muted-foreground);
  --color-accent: var(--accent);
  --color-accent-foreground: var(--accent-foreground);
  --color-destructive: var(--destructive);
  --color-destructive-foreground: var(--destructive-foreground);
  --color-border: var(--border);
  --color-input: var(--input);
  --color-ring: var(--ring);
  --color-chart-1: var(--chart-1);
  --color-chart-2: var(--chart-2);
  --color-chart-3: var(--chart-3);
  --color-chart-4: var(--chart-4);
  --color-chart-5: var(--chart-5);
  --color-message-task: var(--message-task);
  --color-message-status: var(--message-status);
  --color-message-result: var(--message-result);
  --color-message-query: var(--message-query);
  --color-message-handshake: var(--message-handshake);
  --color-message-default: var(--message-default);
  --color-sidebar: var(--sidebar);
  --color-sidebar-foreground: var(--sidebar-foreground);
  --color-sidebar-primary: var(--sidebar-primary);
  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
  --color-sidebar-accent: var(--sidebar-accent);
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
  --color-sidebar-border: var(--sidebar-border);
  --color-sidebar-ring: var(--sidebar-ring);
  /* Settings panel surface + modified-state accents */
  --color-surface-section: var(--surface-section);
  --color-modified-accent: var(--modified-accent);
  --color-modified-row-bg: var(--modified-row-bg);
  /* Semantic status colors — text, backgrounds, borders */
  --color-success: var(--success);
  --color-success-subtle: var(--success-subtle);
  --color-success-muted: var(--success-muted);
  --color-success-subtle-border: var(--success-subtle-border);
  --color-warning: var(--warning);
  --color-warning-subtle: var(--warning-subtle);
  --color-warning-muted: var(--warning-muted);
  --color-warning-subtle-border: var(--warning-subtle-border);
  --color-error: var(--error);
  --color-error-subtle: var(--error-subtle);
  --color-error-muted: var(--error-muted);
  --color-error-subtle-border: var(--error-subtle-border);
  --color-info: var(--info);
  --color-info-subtle: var(--info-subtle);
  --color-info-muted: var(--info-muted);
  --color-info-subtle-border: var(--info-subtle-border);
  /* Micro label text size — badges, metadata only. Prefer text-xs for readable text. */
  --text-2xs: 10px;
  --radius-sm: calc(var(--radius) * 0.6);
  --radius-md: calc(var(--radius) * 0.8);
  --radius-lg: var(--radius);
  --radius-xl: calc(var(--radius) * 1.4);
  --radius-2xl: calc(var(--radius) * 1.8);
  --radius-3xl: calc(var(--radius) * 2.2);
  --radius-4xl: calc(var(--radius) * 2.6);
  /* Animation tokens */
  --animate-in-duration: 200ms;
  --animate-in-duration-slow: 350ms;
  --animate-in-easing: cubic-bezier(0.16, 1, 0.3, 1);
}

/* ============================================================================
   Oxios Design System — Geist base, OKLCH color space
   ============================================================================ */
:root {
  --radius: 0.625rem;
  --background: oklch(0.985 0 0);
  --foreground: oklch(0.141 0.005 285.823);
  --card: oklch(1 0 0);
  --card-foreground: oklch(0.141 0.005 285.823);
  --popover: oklch(1 0 0);
  --popover-foreground: oklch(0.141 0.005 285.823);
  /* Primary with subtle blue chroma — technical authority */
  --primary: oklch(0.23 0.025 265);
  --primary-foreground: oklch(0.985 0 0);
  --secondary: oklch(0.967 0.001 286.375);
  --secondary-foreground: oklch(0.23 0.025 265);
  --muted: oklch(0.967 0.001 286.375);
  --muted-foreground: oklch(0.552 0.016 285.938);
  --accent: oklch(0.967 0.003 265);
  --accent-foreground: oklch(0.23 0.025 265);
  --destructive: oklch(0.577 0.245 27.325);
  --destructive-foreground: oklch(0.985 0 0);
  --border: oklch(0.92 0.004 286.32);
  --input: oklch(0.92 0.004 286.32);
  --ring: oklch(0.45 0.04 265);
  --chart-1: oklch(0.646 0.222 41.116);
  --chart-2: oklch(0.6 0.118 184.704);
  --chart-3: oklch(0.398 0.07 227.392);
  --chart-4: oklch(0.828 0.189 84.429);
  --chart-5: oklch(0.769 0.188 70.08);
  --message-task: oklch(0.623 0.214 259.815);
  --message-status: oklch(0.707 0.022 261.325);
  --message-result: oklch(0.723 0.219 149.579);
  --message-query: oklch(0.627 0.265 303.9);
  --message-handshake: oklch(0.769 0.188 70.08);
  --message-default: oklch(0.704 0.04 256.788);
  --sidebar: oklch(0.978 0.002 265);
  --sidebar-foreground: oklch(0.141 0.005 285.823);
  --sidebar-primary: oklch(0.23 0.025 265);
  --sidebar-primary-foreground: oklch(0.985 0 0);
  --sidebar-accent: oklch(0.967 0.003 265);
  --sidebar-accent-foreground: oklch(0.23 0.025 265);
  --sidebar-border: oklch(0.92 0.004 286.32);
  --sidebar-ring: oklch(0.45 0.04 265);
  /* ── Semantic status tokens ─────────────────────────────── */
  --success: oklch(0.596 0.145 163);
  --warning: oklch(0.669 0.162 70);
  --error: oklch(0.577 0.245 27.325);
  --info: oklch(0.623 0.214 259.815);
  --success-subtle: oklch(0.97 0.014 163);
  --warning-subtle: oklch(0.97 0.014 70);
  --error-subtle: oklch(0.97 0.014 27);
  --info-subtle: oklch(0.97 0.014 259);
  --success-muted: oklch(0.696 0.17 162.48 / 0.15);
  --warning-muted: oklch(0.769 0.188 70.08 / 0.15);
  --error-muted: oklch(0.577 0.245 27.325 / 0.15);
  --info-muted: oklch(0.623 0.214 259.815 / 0.15);
  --success-subtle-border: oklch(0.91 0.05 163);
  --warning-subtle-border: oklch(0.91 0.05 70);
  --error-subtle-border: oklch(0.91 0.05 27);
  --info-subtle-border: oklch(0.91 0.05 259);
  /* ── Settings panel surface + modified-state accents ─────────────────
     Composed via color-mix over the theme's semantic vars so they
     re-resolve correctly in both light and dark without duplication. */
  --surface-section: color-mix(in oklch, var(--muted) 30%, var(--background));
  --modified-accent: var(--primary);
  --modified-row-bg: color-mix(in oklch, var(--primary) 3%, transparent);
}

.dark {
  --background: oklch(0.13 0.005 285.823);
  --foreground: oklch(0.985 0 0);
  --card: oklch(0.19 0.008 265);
  --card-foreground: oklch(0.985 0 0);
  --popover: oklch(0.19 0.008 265);
  --popover-foreground: oklch(0.985 0 0);
  --primary: oklch(0.91 0.03 265);
  --primary-foreground: oklch(0.15 0.02 265);
  --secondary: oklch(0.274 0.006 286.033);
  --secondary-foreground: oklch(0.985 0 0);
  --muted: oklch(0.274 0.006 286.033);
  --muted-foreground: oklch(0.705 0.015 286.067);
  --accent: oklch(0.274 0.01 265);
  --accent-foreground: oklch(0.985 0 0);
  --destructive: oklch(0.704 0.191 22.216);
  --destructive-foreground: oklch(0.985 0 0);
  --border: oklch(1 0 0 / 10%);
  --input: oklch(1 0 0 / 15%);
  --ring: oklch(0.6 0.05 265);
  --chart-1: oklch(0.488 0.243 264.376);
  --chart-2: oklch(0.696 0.17 162.48);
  --chart-3: oklch(0.769 0.188 70.08);
  --chart-4: oklch(0.627 0.265 303.9);
  --chart-5: oklch(0.645 0.246 16.439);
  --sidebar: oklch(0.16 0.008 265);
  --sidebar-foreground: oklch(0.985 0 0);
  --sidebar-primary: oklch(0.91 0.03 265);
  --sidebar-primary-foreground: oklch(0.15 0.02 265);
  --sidebar-accent: oklch(0.274 0.01 265);
  --sidebar-accent-foreground: oklch(0.985 0 0);
  --sidebar-border: oklch(1 0 0 / 10%);
  --sidebar-ring: oklch(0.6 0.05 265);
  /* ── Semantic status tokens (dark) ─────────────────────── */
  --success: oklch(0.723 0.219 149.579);
  --warning: oklch(0.769 0.188 70.08);
  --error: oklch(0.704 0.191 22.216);
  --info: oklch(0.685 0.196 259);
  --success-subtle: oklch(0.18 0.03 163);
  --warning-subtle: oklch(0.18 0.03 70);
  --error-subtle: oklch(0.18 0.03 27);
  --info-subtle: oklch(0.18 0.03 259);
  --success-muted: oklch(0.723 0.219 149.579 / 0.15);
  --warning-muted: oklch(0.769 0.188 70.08 / 0.15);
  --error-muted: oklch(0.704 0.191 22.216 / 0.15);
  --info-muted: oklch(0.685 0.196 259 / 0.15);
  --success-subtle-border: oklch(0.28 0.04 163);
  --warning-subtle-border: oklch(0.28 0.04 70);
  --error-subtle-border: oklch(0.28 0.04 27);
  --info-subtle-border: oklch(0.28 0.04 259);
  /* ── Settings panel surface + modified-state accents (dark) ────────
     Same color-mix expressions as :root — they re-resolve against the
     dark overrides of --muted / --primary / --background above. */
  --surface-section: color-mix(in oklch, var(--muted) 30%, var(--background));
  --modified-accent: var(--primary);
  --modified-row-bg: color-mix(in oklch, var(--primary) 3%, transparent);
}

@layer base {
  * {
    @apply border-border outline-ring/50;
  }
  body {
    @apply bg-background text-foreground;
    font-family:
      'Geist',
      system-ui,
      -apple-system,
      sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }

  /*
   * Disable text selection on interactive UI chrome.
   *
   * Controls (buttons, nav, tabs, menu items, switches, etc.) are never
   * meant to be text-selected — selecting a label while clicking it is
   * never the user's intent and only produces accidental highlight.
   * Real copyable content (prose, code, messages, table data) lives in
   * plain elements and inherits normal selection.
   *
   * For clickable div/li/card rows the global rule does not apply, so add
   * the Tailwind `select-none` utility directly on the element. Opt back
   * in with `select-text` where a control genuinely needs selectable text.
   */
  button,
  [role='button'],
  [role='tab'],
  [role='menuitem'],
  [role='menuitemcheckbox'],
  [role='menuitemradio'],
  [role='option'],
  [role='switch'],
  [role='checkbox'],
  [role='radio'],
  [role='treeitem'],
  summary {
    -webkit-user-select: none;
    user-select: none;
  }
  
  button, [role='button'], a {
    -webkit-tap-highlight-color: transparent;
  }
}

/* ============================================================================
   Animations — entrance, stagger, count-up
   ============================================================================ */

@layer utilities {
  /* Fade + slide up for cards, panels, list items */
  @keyframes fade-in-up {
    from {
      opacity: 0;
      transform: translateY(8px);
    }
    to {
      opacity: 1;
      transform: translateY(0);
    }
  }

  /* Subtle scale-in for badges, indicators */
  @keyframes scale-in {
    from {
      opacity: 0;
      transform: scale(0.95);
    }
    to {
      opacity: 1;
      transform: scale(1);
    }
  }

  /* Typing indicator bounce */
  @keyframes typing-bounce {
    0%,
    60%,
    100% {
      transform: translateY(0);
      opacity: 0.4;
    }
    30% {
      transform: translateY(-4px);
      opacity: 1;
    }
  }

  /* Stagger utility — apply to parent container */
  .animate-stagger > * {
    animation: fade-in-up var(--animate-in-duration) var(--animate-in-easing) both;
  }
  .animate-stagger > *:nth-child(1) { animation-delay: 0ms; }
  .animate-stagger > *:nth-child(2) { animation-delay: 40ms; }
  .animate-stagger > *:nth-child(3) { animation-delay: 80ms; }
  .animate-stagger > *:nth-child(4) { animation-delay: 120ms; }
  .animate-stagger > *:nth-child(5) { animation-delay: 160ms; }
  .animate-stagger > *:nth-child(6) { animation-delay: 200ms; }
  .animate-stagger > *:nth-child(7) { animation-delay: 240ms; }
  .animate-stagger > *:nth-child(8) { animation-delay: 280ms; }
  .animate-stagger > *:nth-child(9) { animation-delay: 320ms; }
  .animate-stagger > *:nth-child(10) { animation-delay: 360ms; }
  .animate-stagger > *:nth-child(11) { animation-delay: 400ms; }
  .animate-stagger > *:nth-child(12) { animation-delay: 440ms; }
  .animate-stagger > *:nth-child(n+13) { animation-delay: 480ms; }

  /* Single element entrance */
  .animate-fade-in-up {
    animation: fade-in-up var(--animate-in-duration) var(--animate-in-easing) both;
  }

  .animate-scale-in {
    animation: scale-in var(--animate-in-duration) var(--animate-in-easing) both;
  }
}

/* ============================================================================
   Scrollbar styling
   ============================================================================ */
@layer base {
  /* Firefox — standard scrollbar properties */
  * {
    scrollbar-width: thin;
    scrollbar-color: oklch(0.7 0 0 / 0.25) transparent;
  }
  .dark * {
    scrollbar-color: oklch(0.4 0 0 / 0.4) transparent;
  }

  /* WebKit / Blink — pseudo-element scrollbar */
  ::-webkit-scrollbar {
    width: 6px;
    height: 6px;
  }
  ::-webkit-scrollbar-track {
    background: transparent;
  }
  ::-webkit-scrollbar-thumb {
    background: oklch(0.7 0 0 / 0.25);
    border-radius: 3px;
  }
  ::-webkit-scrollbar-thumb:hover {
    background: oklch(0.5 0 0 / 0.4);
  }
  .dark ::-webkit-scrollbar-thumb {
    background: oklch(0.4 0 0 / 0.4);
  }
  .dark ::-webkit-scrollbar-thumb:hover {
    background: oklch(0.5 0 0 / 0.5);
  }
}

@layer utilities {
  .pt-safe { padding-top: env(safe-area-inset-top); }
  .pb-safe { padding-bottom: env(safe-area-inset-bottom); }
  .pl-safe { padding-left: env(safe-area-inset-left); }
  .pr-safe { padding-right: env(safe-area-inset-right); }
  .p-safe { padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); }
  .tap-feedback { transition: transform 100ms ease; }
  .tap-feedback:active { transform: scale(0.97); }
}

/* ReactFlow Controls touch target */
.react-flow__controls-button { height: 36px; width: 36px; }
@media (pointer: coarse) { .react-flow__controls-button { height: 44px; width: 44px; } }