oxios 1.10.1

Oxios Agent OS — Agent Operating System powered by oxi-sdk
import type { Meta, StoryObj } from '@storybook/tanstack-react'
import { type RailGroup, SettingsRail } from '@/components/settings/settings-rail'
import { i18nDecorator } from '../../../.storybook/i18n-mock'

/** Realistic rail layout: 3 groups spanning System / Security / Memory. */
const groups: RailGroup[] = [
  {
    id: 'system',
    labelKey: 'settings.groupSystem',
    items: [
      { id: 'kernel', labelKey: 'settings.sectionKernel', badge: 2, status: 'modified' },
      { id: 'exec', labelKey: 'settings.sectionExec', badge: 5, status: 'modified' },
      { id: 'scheduler', labelKey: 'settings.sectionScheduler' },
      { id: 'orchestrator', labelKey: 'settings.sectionOrchestrator' },
      { id: 'gateway', labelKey: 'settings.sectionGateway' },
    ],
  },
  {
    id: 'security',
    labelKey: 'settings.groupSecurity',
    items: [
      { id: 'security', labelKey: 'settings.sectionSecurity', badge: 1, status: 'modified' },
      { id: 'audit', labelKey: 'settings.sectionAudit' },
    ],
  },
  {
    id: 'memory',
    labelKey: 'settings.groupMemory',
    items: [{ id: 'memory', labelKey: 'settings.sectionMemory' }],
  },
]

const meta: Meta<typeof SettingsRail> = {
  title: 'Settings/SettingsRail',
  component: SettingsRail,
  decorators: [i18nDecorator],
  parameters: {
    layout: 'padded',
    docs: {
      description: {
        component:
          'Left rail navigation: a search box on top followed by grouped items. ' +
          'Items can carry an unsaved-changes badge and a "modified" status dot.',
      },
    },
  },
  args: {
    groups,
    activeId: 'exec',
    onNavigate: () => {},
    searchQuery: '',
    onSearchChange: () => {},
  },
  render: (args) => (
    // The rail is full-height; constrain it so the canvas stays tidy.
    <div className="mx-auto h-[520px] w-full max-w-[280px] rounded-lg border bg-background p-2">
      <SettingsRail {...args} />
    </div>
  ),
}

export default meta
type Story = StoryObj<typeof SettingsRail>

// ── Default: middle item active, a few modified ────────────

export const Default: Story = {}

// ── First item active ──────────────────────────────────────

export const FirstActive: Story = {
  args: { activeId: 'kernel' },
}

// ── Active item is inside the Memory group ─────────────────

export const MemoryActive: Story = {
  args: { activeId: 'memory' },
}

// ── Filtered by search query ───────────────────────────────

export const SearchFiltered: Story = {
  args: { searchQuery: 'sec' },
}

// ── No matches → empty state ───────────────────────────────

export const NoMatches: Story = {
  args: { searchQuery: 'zzz' },
}