# 24/7 operator chair

Intensive-use control-room chair: five-star polished aluminium base (about 700 mm) with twin-wheel castors, gas lift with shroud, synchro mechanism, upholstered seat with waterfall edge, tall back with lumbar shaping, headrest and height-adjustable arms. `swivel` turns the upper part on the gas lift; `seatHeight` follows the gas-lift range.

**Standards:** EN 1335, BS 5459-2 (24-hour use)

## Installation

```bash
npx -y https://decktwin.com/cli/deck-twin-0.2.2.tgz add operator-chair
```

Copies `interiors/operator-chair.tsx`, any helper files it imports and the shared `lib/` into `src/components/deck-twin/`. Needs `three`, `@react-three/fiber` and `@react-three/drei`.

## Usage

```tsx
import { Canvas } from '@react-three/fiber'
import { OrbitControls } from '@react-three/drei'
import { Stage } from './components/deck-twin/lib/stage'
import { OperatorChair } from './components/deck-twin/interiors/operator-chair'

export default function Scene() {
  return (
    <Canvas shadows camera={{ position: [8, 5, 9], fov: 35 }}>
      <Stage>
        <OperatorChair />
      </Stage>
      <OrbitControls makeDefault />
    </Canvas>
  )
}
```

## Props

| Prop | Type | Default | Range |
| --- | --- | --- | --- |
| `seatHeight` | `number (m)` | `0.5` | 0.43 – 0.64 |
| `headrest` | `boolean` | `true` |  |
| `arms` | `boolean` | `true` |  |
| `color` | `string` | `"#2b2f35"` |  |
| `swivel` | `number (°)` | `0` | -180 – 180 |
| `...group` | position, rotation, scale… |  |  |

## P&ID

Plan view: a rounded seat square with a curved backrest and armrests, placed at a console or desk; often just a circle.

Layout plan convention (architectural / control room layout, ISO 11064) (furniture)

Furniture appears only on control room and office layouts.

Furniture schedule (EN 1335, BS 5459-2 24-hour use) fields and the props they set:

| Field | Prop |
| --- | --- |
| Seat height | `seatHeight` |
| Headrest | `headrest` |
| Armrests | `arms` |

## Typical suppliers

Neutral Posture. The geometry is generic and sized from public standards. It is not vendor CAD.

## Source

`interiors/operator-chair.tsx`. This is the component file only: it imports shared code, so install it with the command above rather than pasting it alone. https://decktwin.com/r/operator-chair.json has every file.

```tsx
// 24/7 control-room operator chair: five-star aluminium base with twin-wheel castors, gas lift, synchro mechanism, lumbar back, headrest, adjustable arms. EN 1335, BS 5459-2.
import { useEffect, useMemo } from 'react'
import * as THREE from 'three'
import { Kit } from '../lib/kit'
import { paint } from '../lib/materials'
import { KitMesh, type GroupProps } from '../lib/mesh'
import { chair } from './_furniture'

export interface OperatorChairProps {
  /** seat top above the floor, m (gas-lift range about 0.45–0.62) */
  seatHeight?: number
  headrest?: boolean
  arms?: boolean
  /** upholstery colour */
  color?: string
  /** swivel about the gas lift, degrees */
  swivel?: number
  tag?: string
}

export const defaults = { seatHeight: 0.5, headrest: true, arms: true, color: '#2b2f35', swivel: 0, tag: '' }

export function OperatorChair(props: OperatorChairProps & GroupProps) {
  const { seatHeight, headrest, arms, color, swivel, tag, ...group } = { ...defaults, ...props }
  const sh = Math.min(0.64, Math.max(0.43, seatHeight))
  const b = useMemo(() => {
    const base = new Kit()
    const top = new Kit()
    const up = paint(color, { metalness: 0, roughness: 0.95, clearcoat: 0, weather: 0 })
    // build whole chair once, then split: base (static) and the swivelling upper part
    chair(base, new THREE.Matrix4(), { seat: sh, headrest, arms, upholstery: up, part: 'base' })
    chair(top, new THREE.Matrix4(), { seat: sh, headrest, arms, upholstery: up, part: 'top' })
    return { base: base.build(), top: top.build() }
  }, [sh, headrest, arms, color])
  useEffect(() => () => [b.base, b.top].forEach((x) => x.geometry.dispose()), [b])
  void tag
  return (
    <group {...group}>
      <KitMesh data={b.base} />
      <group rotation={[0, (swivel * Math.PI) / 180, 0]}>
        <KitMesh data={b.top} />
      </group>
    </group>
  )
}

export default OperatorChair
```
