# Data Model: Frontend State & Components

## 1. i18n State (Client-Side)

The application state for internationalization is transient (in-memory) but initialized from and persisted to `localStorage`.

### Entities

#### `Locale`
- **Type**: String Enum
- **Values**: `"ru"`, `"en"`
- **Default**: `"ru"`
- **Persistence**: `localStorage.getItem("locale")`

#### `TranslationDictionary`
- **Type**: JSON Object
- **Structure**: Nested key-value pairs where values are strings.
- **Example**:
  ```json
  {
    "common": {
      "save": "Сохранить",
      "cancel": "Отмена"
    },
    "dashboard": {
      "title": "Панель управления"
    }
  }
  ```

## 2. Component Props (Contracts)

These define the "API" for the standardized UI components.

### `Button`
- **variant**: `"primary" | "secondary" | "danger" | "ghost"` (default: "primary")
- **size**: `"sm" | "md" | "lg"` (default: "md")
- **isLoading**: `boolean` (default: false)
- **disabled**: `boolean` (default: false)
- **type**: `"button" | "submit" | "reset"` (default: "button")
- **onClick**: `() => void` (optional)

### `Input`
- **label**: `string` (optional)
- **value**: `string` (two-way binding)
- **placeholder**: `string` (optional)
- **error**: `string` (optional)
- **disabled**: `boolean` (default: false)
- **type**: `"text" | "password" | "email" | "number"` (default: "text")

### `Card`
- **title**: `string` (optional)
- **padding**: `"none" | "sm" | "md" | "lg"` (default: "md")

### `Select`
- **options**: `Array<{ value: string | number, label: string }>`
- **value**: `string | number` (two-way binding)
- **label**: `string` (optional)
- **disabled**: `boolean` (default: false)