> For the complete documentation index, see [llms.txt](https://swampys.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://swampys.gitbook.io/docs/resources/sinterface/exports.md).

# Exports

Native sInterface exports — complete options, then examples. Hover an option name for a usage snippet.

Call sInterface from any client script with `exports.sInterface`. Existing ESX / ox\_lib / QBCore scripts do not need this page — use [Bridge](/docs/resources/sinterface/bridge.md) instead.

{% hint style="info" %}
All exports below are **client-side**. Hover an **option name** in the tables to see how to use it.
{% endhint %}

{% tabs %}
{% tab title="Notify" %}

#### Exports

| Export                         | Returns                  | Description                                                        |
| ------------------------------ | ------------------------ | ------------------------------------------------------------------ |
| `notify(data)`                 | `id` (number) or `false` | Show a notification. Same `id` / `group` updates the existing one. |
| `updateNotify(id, data)`       | `id` or `false`          | Patch an existing notification (merged with last payload).         |
| `setNotifyProgress(id, value)` | `boolean`                | Set manual progress `0–1`.                                         |
| `removeNotify(id)`             | —                        | Remove one notification.                                           |
| `clearNotify()`                | —                        | Remove all.                                                        |
| `hasNotifyFocus()`             | `boolean`                | Tab focus mode is active.                                          |
| `hasNotifyActions()`           | `boolean`                | At least one clickable / sticky notif is on screen.                |
| `setNotifyFocus(state)`        | —                        | Force focus mode on/off.                                           |

Event: `sInterface:notifyAction` `(actionId, id)` — also `data.onAction` / `data.actionEvent`.

#### Options — `notify(data)`

| Option                       | Type                     | Default         | Description                                                                                                                      |
| ---------------------------- | ------------------------ | --------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| description[^1] **required** | string                   | —               | Body. Aliases: `message`.                                                                                                        |
| type[^2]                     | string                   | `'info'`        | `info` \| `success` \| `warning` \| `error`                                                                                      |
| layout[^3]                   | string                   | config          | `simple` \| `icon` \| `banner` \| `image` \| `advanced` \| `entreprise`. Aliases: `style`, `variant`. Image/banner need `image`. |
| title[^4]                    | string                   | —               | Title.                                                                                                                           |
| subtitle[^5]                 | string                   | —               | Subtitle (advanced layouts).                                                                                                     |
| badge[^6]                    | string                   | —               | Small badge (e.g. `10-90`).                                                                                                      |
| image[^7]                    | string                   | —               | Image URL / nui path. Alias: `icon` (string).                                                                                    |
| duration[^8]                 | number                   | config (`4000`) | ms. Clamped `1000–15000` (actions `12000–30000`, timed progress up to `120000`). `<= 0` → sticky.                                |
| position[^9]                 | string                   | config          | `top-right` \| `top-left` \| `bottom-right` \| `bottom-left`                                                                     |
| priority[^10]                | string / number          | `'normal'`      | `low` \| `normal` \| `high` (or `urgent`). Number: `<=0` low, `>=2` high.                                                        |
| persistent[^11]              | boolean                  | `false`         | Sticky (hold to dismiss). Alias: `sticky`.                                                                                       |
| group[^12]                   | string / `false`         | auto            | Same group updates the existing notif. `false` disables auto-group.                                                              |
| id[^13]                      | number                   | auto            | Reuse this id to update. Aliases: `update`, `updateId`.                                                                          |
| count[^14]                   | number                   | `1`             | Stack count.                                                                                                                     |
| actions[^15]                 | table                    | —               | Max **3** buttons. Enables Tab focus.                                                                                            |
| onAction[^16]                | function                 | —               | `function(actionId, id)`                                                                                                         |
| actionEvent[^17]             | string                   | —               | Extra client event name.                                                                                                         |
| progress[^18]                | boolean / number / table | —               | See progress options.                                                                                                            |

**actions\[]**

| Option                  | Type   | Description                                                          |
| ----------------------- | ------ | -------------------------------------------------------------------- |
| id[^19] **required**    | string | Aliases: `key`, `action`.                                            |
| label[^20] **required** | string | Aliases: `text`, `name`.                                             |
| style[^21]              | string | `primary` \| `secondary` \| `danger` \| `success`. Alias: `variant`. |

**progress**

| Form                          | Meaning                                                       |
| ----------------------------- | ------------------------------------------------------------- |
| true[^22] or number[^23]      | Timed bar (ms = number, or `duration`).                       |
| duration[^24] / showTime[^25] | Timed table. `showTime` default `true`.                       |
| value[^26]                    | Manual `0–1`. Forces sticky. Update with `setNotifyProgress`. |

#### Example

```lua
local id = exports.sInterface:notify({
    type = 'warning',
    layout = 'advanced',
    title = 'Dispatch',
    subtitle = 'Fleeca robbery',
    badge = '10-90',
    description = 'Robbery in progress — take the call?',
    duration = 12000,
    position = 'top-right',
    priority = 'high',
    actions = {
        { id = 'accept', label = 'Accept', style = 'success' },
        { id = 'gps', label = 'GPS', style = 'primary' },
        { id = 'refuse', label = 'Refuse', style = 'danger' }
    },
    onAction = function(actionId, id)
        print(actionId, id)
    end
})
```

```lua
local id = exports.sInterface:notify({
    type = 'info',
    description = 'Uploading evidence…',
    persistent = true,
    progress = { value = 0.0 }
})
exports.sInterface:setNotifyProgress(id, 0.5)
```

{% endtab %}

{% tab title="TextUI" %}

#### Exports

| Export                       | Returns       | Description                                               |
| ---------------------------- | ------------- | --------------------------------------------------------- |
| `showTextUI(data)`           | —             | Show a prompt. String is accepted (`showTextUI('Open')`). |
| `updateTextUI(data)`         | `boolean`     | Patch the current prompt (string or table).               |
| `hideTextUI()`               | `boolean`     | Hide.                                                     |
| `isTextUIOpen()`             | `boolean`     |                                                           |
| `holdTextUI(data?)`          | `boolean`     | Wait until the key is held.                               |
| `pressTextUI(data?)`         | `boolean`     | Wait until the key is pressed.                            |
| `setTextUIHold(value)`       | —             | Hold fill `0–1`.                                          |
| `setTextUIProgress(value)`   | —             | Bar `0–1`. Alias on data: `bar`.                          |
| `addTextUIZone(data)`        | `id` or `nil` | World zone (needs `coords`).                              |
| `removeTextUIZone(id)`       | `boolean`     |                                                           |
| `clearTextUIZones()`         | —             |                                                           |
| `clearTextUIQueue()`         | —             |                                                           |
| `getTextUIQueueSize()`       | number        |                                                           |
| `showTextUI3D(data)`         | `id` or `nil` | World / entity prompt.                                    |
| `showTextUI3DAtPlayer(data)` | `id`          | Follows the local ped.                                    |
| `updateTextUI3D(id, data)`   | `boolean`     |                                                           |
| `hideTextUI3D(id?)`          | —             | Omit `id` to hide all.                                    |
| `isTextUI3DActive()`         | `boolean`     |                                                           |

#### Options — `showTextUI(data)`

| Option                   | Type      | Default     | Description                                                        |
| ------------------------ | --------- | ----------- | ------------------------------------------------------------------ |
| text[^27] **required**\* | string    | —           | Label. Aliases: `description`, `message`. \*or `items[]`.          |
| subtitle[^28]            | string    | —           | Aliases: `subtext`, `hint`.                                        |
| key[^29]                 | string    | —           | Single key label (`E`).                                            |
| keys[^30]                | string\[] | —           | Several keys.                                                      |
| combo[^31]               | boolean   | `false`     | Show keys as a combo.                                              |
| position[^32]            | string    | config      | `bottom-center` \| `top-center` \| `left-center` \| `right-center` |
| style[^33]               | string    | `'default'` | `default` \| `compact` \| `ghost`                                  |
| layout[^34]              | string    | `'column'`  | `column` \| `row` (`inline`).                                      |
| icon[^35]                | string    | —           |                                                                    |
| color[^36]               | string    | —           | Preset or hex/rgba. Alias: `colour`.                               |
| locked[^37]              | boolean   | `false`     | Alias: `disabled`.                                                 |
| hold[^38]                | boolean   | `false`     | Hold prompt. Also if `holdDuration` / `holdControl` is set.        |
| holdValue[^39]           | number    | `0`         | Fill `0–1`.                                                        |
| progress[^40]            | number    | —           | Bar `0–1`. Alias: `bar`.                                           |
| progressColor[^41]       | string    | —           |                                                                    |
| offset[^42]              | `{x,y}`   | —           | Screen offset `-50…50`. Or `offsetX` / `offsetY`.                  |
| priority[^43]            | number    | `0`         | Queue priority if another prompt is open.                          |
| items[^44]               | table     | —           | Multi-line. Aliases: `lines`, `rows`.                              |
| force[^45]               | boolean   | —           | Used by the bridge (replace current).                              |

**Zone — `addTextUIZone`** — same as above, plus:

| Option                   | Type            | Default | Description                           |
| ------------------------ | --------------- | ------- | ------------------------------------- |
| coords[^46] **required** | vector3 / table | —       | Aliases: `pos`, `xyz`.                |
| distance[^47]            | number          | `2.0`   | `0.5–50`. Aliases: `radius`, `range`. |

**3D — `showTextUI3D`** — same visual options, plus:

| Option        | Type    | Default      | Description                           |
| ------------- | ------- | ------------ | ------------------------------------- |
| coords[^48]   | vector3 | —            | World position.                       |
| entity[^49]   | number  | —            | Attach to entity.                     |
| atPlayer[^50] | boolean | auto         | Local ped. Aliases: `player`, `self`. |
| follow[^51]   | boolean | `false`      | Follow every frame. Alias: `attach`.  |
| offset[^52]   | vector3 | `{0,0,0.35}` | World offset.                         |
| distance[^53] | number  | `8.0`        | Draw distance `1–50`.                 |
| id[^54]       | any     | auto         | Reuse / update.                       |

#### Example

```lua
exports.sInterface:showTextUI({
    text = 'Open stash',
    subtitle = 'Personal storage',
    key = 'E',
    position = 'bottom-center',
    style = 'default'
})

local held = exports.sInterface:holdTextUI()
exports.sInterface:hideTextUI()
```

```lua
local zone = exports.sInterface:addTextUIZone({
    coords = vec3(25.7, -1347.3, 29.5),
    distance = 2.0,
    text = 'Shop',
    key = 'E'
})
```

{% endtab %}

{% tab title="Progress" %}

#### Exports

| Export                | Returns   | Description                                                                                     |
| --------------------- | --------- | ----------------------------------------------------------------------------------------------- |
| `progress(data)`      | `boolean` | Blocking. `true` if finished, `false` if cancelled / busy. `mode = 'manual'` → `startProgress`. |
| `startProgress(data)` | `boolean` | Manual, non-blocking.                                                                           |
| `setProgress(value)`  | —         | Manual fill `0–1`.                                                                              |
| `finishProgress()`    | —         | Complete a manual progress.                                                                     |
| `cancelProgress()`    | —         |                                                                                                 |
| `isProgressActive()`  | `boolean` |                                                                                                 |

#### Options — `progress(data)`

| Option                  | Type            | Default         | Description                                                                                        |
| ----------------------- | --------------- | --------------- | -------------------------------------------------------------------------------------------------- |
| label[^55] **required** | string          | —               | Aliases: `text`, `title`, `message`.                                                               |
| description[^56]        | string          | —               | Alias: `subtitle`.                                                                                 |
| duration[^57]           | number          | config (`5000`) | ms, clamped `500–60000`.                                                                           |
| style[^58]              | string          | `'bar'`         | `bar` \| `circle` (`circular`, `ring`). Alias: `type`.                                             |
| metric[^59]             | string          | `'percent'`     | `percent` \| `time`. Aliases: `display`, `showPercent`.                                            |
| canCancel[^60]          | boolean         | config          | Default key `X`.                                                                                   |
| cancelKey[^61]          | string          | `'X'`           |                                                                                                    |
| color[^62]              | string          | —               | Alias: `colour`.                                                                                   |
| mode[^63]               | string          | —               | `'manual'` → non-blocking.                                                                         |
| steps[^64]              | table           | —               | Sequential labels. String or `{ label, duration }`.                                                |
| disable[^65]            | boolean / table | config          | `true` = move + combat + car. Or `{ move, combat, car, mouse, freeze }`. Alias: `disableControls`. |
| anim[^66]               | table           | —               | See anim. Alias: `animation`.                                                                      |
| prop[^67]               | string / table  | —               | Attached prop.                                                                                     |

**anim**

| Option         | Type    | Description                                |
| -------------- | ------- | ------------------------------------------ |
| scenario[^68]  | string  | Scenario (skips dict/clip).                |
| playEnter[^69] | boolean | Scenario enter anim (default `true`).      |
| dict[^70]      | string  | Anim dict. Alias: `animDict`.              |
| clip[^71]      | string  | Anim name. Aliases: `anim`, `name`, `lib`. |
| flag[^72]      | number  | Default `49`.                              |
| blendIn[^73]   | number  | Default `3.0`.                             |
| blendOut[^74]  | number  | Default `1.0`.                             |

**prop** — string model, or `{ model, bone, pos, rot }` (`coords`/`offset`, `rotation`). Default bone `28422`.

#### Example

```lua
local ok = exports.sInterface:progress({
    label = 'Repairing engine…',
    description = 'Keep still',
    duration = 5000,
    canCancel = true,
    style = 'bar',
    metric = 'percent',
    disable = { move = true, combat = true, car = true },
    anim = { dict = 'mini@repair', clip = 'fixing_a_ped' },
    prop = { model = 'prop_tool_wrench', bone = 28422 }
})
```

```lua
exports.sInterface:startProgress({ label = 'Uploading…' })
exports.sInterface:setProgress(0.5)
exports.sInterface:finishProgress()
```

{% endtab %}

{% tab title="Alert / Input" %}

#### Alert exports

| Export          | Returns                   | Description                                                                                         |
| --------------- | ------------------------- | --------------------------------------------------------------------------------------------------- |
| `alert(data)`   | `true` / `false` / string | Confirm → `true` (or input value). Cancel → `false`. Extra button → `extra.result`. Queued if busy. |
| `closeAlert()`  | `boolean`                 | Cancel current.                                                                                     |
| `isAlertOpen()` | `boolean`                 |                                                                                                     |

#### Options — `alert(data)`

| Option                        | Type            | Default  | Description                                                                                          |
| ----------------------------- | --------------- | -------- | ---------------------------------------------------------------------------------------------------- |
| description[^75] **required** | string          | —        | Aliases: `message`, `text`.                                                                          |
| title[^76]                    | string          | —        |                                                                                                      |
| type[^77]                     | string          | `'info'` | `info` \| `success` \| `warning` \| `error`                                                          |
| confirmLabel[^78]             | string          | config   |                                                                                                      |
| cancelLabel[^79]              | string          | config   |                                                                                                      |
| showCancel[^80]               | boolean         | `true`   |                                                                                                      |
| confirmColor[^81]             | string          | config   | Preset or hex.                                                                                       |
| cancelColor[^82]              | string          | config   |                                                                                                      |
| image[^83]                    | string          | —        | Alias: `icon` (string). `icon = false` hides it.                                                     |
| showIcon[^84]                 | boolean         | `true`   |                                                                                                      |
| timeout[^85]                  | number          | —        | Auto-close ms `1000–60000`. Alias: `duration`.                                                       |
| timeoutResult[^86]            | boolean         | `false`  | Timeout = confirm. Or `timeoutAction = 'confirm'`.                                                   |
| dismissable[^87]              | boolean         | `true`   | Alias: `canDismiss`.                                                                                 |
| confirmDelay[^88]             | number          | —        | Seconds (`1–60`) or ms (`>=250`). Alias: `delay`.                                                    |
| requireScroll[^89]            | boolean         | `false`  | Alias: `scrollToConfirm`.                                                                            |
| extra[^90]                    | table           | —        | Third button `{ label, color, result }`. Or `extraLabel` / `extraColor` / `extraResult`.             |
| input[^91]                    | boolean / table | —        | Inline field. `true` = text. `{ type, label, placeholder, default, maxLength, min, max, required }`. |
| checkbox[^92]                 | boolean / table | —        | `{ label, required }`. `true` = default label. Alias: `requireCheckbox`.                             |

#### Input exports

| Export          | Returns        | Description                                                          |
| --------------- | -------------- | -------------------------------------------------------------------- |
| `input(data)`   | table or `nil` | Map `name → value` (and numeric indexes). `nil` if cancelled / busy. |
| `closeInput()`  | `boolean`      |                                                                      |
| `isInputOpen()` | `boolean`      |                                                                      |

#### Options — `input(data)`

| Option                     | Type    | Default  | Description                                                   |
| -------------------------- | ------- | -------- | ------------------------------------------------------------- |
| fields[^93] **required**\* | table   | —        | List of fields. Alias: `rows`. \*or a single field on `data`. |
| title[^94]                 | string  | —        |                                                               |
| showHeader[^95]            | boolean | `false`  |                                                               |
| description[^96]           | string  | —        | Alias: `message`.                                             |
| variant[^97]               | string  | `'info'` | `info` \| `success` \| `warning` \| `error`. Alias: `status`. |
| confirmLabel[^98]          | string  | config   |                                                               |
| cancelLabel[^99]           | string  | config   |                                                               |
| showCancel[^80]            | boolean | `true`   |                                                               |
| showConfirm[^100]          | boolean | `true`   |                                                               |
| confirmColor[^81]          | string  | config   |                                                               |
| cancelColor[^82]           | string  | config   |                                                               |
| extra[^101]                | table   | —        | Third button (same as alert).                                 |

**Field types:** `text`, `number`, `password`, `textarea`, `select`, `multiselect`, `tags`, `checkbox`, `otp`, `slider` (`range`), `color`, `date`, `time`, `datetime`, `upload` (`image`), `code` (`raw`), `info` (read-only code).

**fields\[]**

| Option               | Type    | Description                                                    |
| -------------------- | ------- | -------------------------------------------------------------- |
| type[^102]           | string  | See list above. Default `text`.                                |
| name[^103]           | string  | Key in the result table.                                       |
| label[^104]          | string  |                                                                |
| description[^105]    | string  |                                                                |
| placeholder[^106]    | string  |                                                                |
| default[^107]        | any     | Alias: `value`.                                                |
| required[^108]       | boolean | Default `true` except checkbox / read-only.                    |
| disabled[^109]       | boolean |                                                                |
| readOnly[^110]       | boolean | Alias: `readonly`.                                             |
| maxLength[^111]      | number  | OTP length `3–8` (default 6).                                  |
| minLength[^112]      | number  |                                                                |
| min[^113]            | number  | Number / slider.                                               |
| max[^114]            | number  |                                                                |
| step[^115]           | number  |                                                                |
| rows[^116]           | number  | Textarea / code `1–16`.                                        |
| singleLine[^117]     | boolean | Alias: `inline`.                                               |
| options[^118]        | table   | Select / tags. `{ value, label }` or strings. Alias: `values`. |
| pattern[^119]        | string  | Regex.                                                         |
| patternMessage[^120] | string  | Regex error text.                                              |
| counter[^121]        | boolean | Character counter.                                             |
| masked[^122]         | boolean | OTP.                                                           |
| maxSize[^123]        | number  | Upload KB `32–2048` (default 512).                             |
| accept[^124]         | string  | Upload mime / extension.                                       |

#### Example

```lua
local ok = exports.sInterface:alert({
    type = 'warning',
    title = 'Confiscate weapon',
    description = 'Remove this weapon from the player?',
    showCancel = true,
    confirmLabel = 'Confirm',
    cancelLabel = 'Cancel',
    confirmColor = 'green',
    cancelColor = 'red',
    confirmDelay = 2,
    checkbox = { label = 'I understand', required = true }
})
```

```lua
local result = exports.sInterface:input({
    title = 'Invoice',
    showHeader = true,
    fields = {
        { type = 'number', name = 'amount', label = 'Amount', min = 1, required = true },
        { type = 'select', name = 'reason', label = 'Reason', options = { 'Fine', 'Tax', 'Other' } },
        { type = 'textarea', name = 'note', label = 'Note', required = false, rows = 3 }
    }
})
```

{% endtab %}

{% tab title="SkillCheck" %}

#### Exports

| Export                    | Returns   | Description                     |
| ------------------------- | --------- | ------------------------------- |
| `skillCheck(data, keys?)` | `boolean` | `true` if every stage succeeds. |
| `cancelSkillCheck()`      | `boolean` |                                 |
| `isSkillCheckOpen()`      | `boolean` |                                 |

#### Options

Call styles: `skillCheck('medium')` · `skillCheck({ 'easy', 'hard' }, { 'E', 'E' })` · table form below.

| Option           | Type                    | Default    | Description                                                                                                                                                   |
| ---------------- | ----------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| difficulty[^125] | string / number / table | `'medium'` | `'easy'` \| `'medium'` \| `'hard'`, area size number, list of stages, or `{ difficulty, areaSize, speed, key }`. Aliases: `difficulties`, `stages`, `checks`. |
| keys[^126]       | string\[]               | `'E'`      | One key per stage (loops). Alias: `inputs`.                                                                                                                   |
| key[^29]         | string                  | `'E'`      | Single key.                                                                                                                                                   |
| style[^127]      | string                  | `'circle'` | `circle` \| `bar` (`line`). Alias: `type`.                                                                                                                    |
| color[^62]       | string                  | —          | Alias: `colour`.                                                                                                                                              |

**Presets:** easy `areaSize 50 / speed 1.0` · medium `36 / 1.35` · hard `22 / 1.75`. Custom `areaSize` `12–120` (bar remapped to `8–55%`), `speed` `0.35–3.0`.

#### Example

```lua
local ok = exports.sInterface:skillCheck({
    style = 'circle',
    difficulty = {
        'easy',
        { difficulty = 'hard', key = 'E', speed = 1.9 }
    },
    keys = { 'E', 'E' },
    color = '#90caf9'
})
```

{% endtab %}

{% tab title="Menu" %}

#### Exports

| Export             | Returns               | Description                                                                                                                                                                               |
| ------------------ | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `menu(data)`       | value / table / `nil` | Blocking. `nil` if cancelled. Checkbox → `{ value, checked }`. Slider/stepper → `{ value, progress }`. Colors → `{ value, colorIndex, color }`. List → `{ value, listIndex, listValue }`. |
| `closeMenu()`      | `boolean`             |                                                                                                                                                                                           |
| `updateMenu(data)` | `boolean`             | Patch options by `value` (no full rebuild).                                                                                                                                               |
| `isMenuOpen()`     | `boolean`             |                                                                                                                                                                                           |

#### Options — `menu(data)`

| Option                     | Type    | Default       | Description                               |
| -------------------------- | ------- | ------------- | ----------------------------------------- |
| options[^128] **required** | table   | —             | Also the table itself if you pass a list. |
| title[^129]                | string  | —             | Alias: `header`.                          |
| subtitle[^130]             | string  | —             | Alias: `description`.                     |
| banner[^131]               | string  | —             | Alias: `image`.                           |
| position[^132]             | string  | `'top-right'` | `top-right` \| `top-left`                 |
| canClose[^133]             | boolean | config        | Aliases: `dismissable`, `closeable`.      |
| search[^134]               | boolean | `false`       | Alias: `searchable`.                      |
| searchPlaceholder[^135]    | string  | —             |                                           |
| defaultIndex[^136]         | number  | —             | 1-based. Aliases: `selected`, `start`.    |
| currency[^137]             | table   | config        | \`{ symbol, position = 'prefix'           |

**Option types:** `button` (default), `checkbox` (`check`, `toggle`), `slider` (`range`, `progress`), `stepper` (`number`, `count`), `colors` (`palette`), `list` (`select`, `scroll`, `cycle`), `submenu`, `separator` (`header`, `divider`).

**options\[]**

| Option               | Type            | Description                                                                                                                                     |
| -------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| label[^138]          | string          | Aliases: `title`, `text`, `name`.                                                                                                               |
| value[^139]          | any             | Alias: `id`.                                                                                                                                    |
| type[^140]           | string          | See types above.                                                                                                                                |
| description[^141]    | string          | Alias: `desc`.                                                                                                                                  |
| icon[^142]           | string          |                                                                                                                                                 |
| color[^143]          | string          |                                                                                                                                                 |
| disabled[^109]       | boolean         | Alias: `enabled = false`.                                                                                                                       |
| disabledReason[^144] | string          | Alias: `reason`.                                                                                                                                |
| close[^145]          | boolean         | Close on select. Aliases: `closeOnSelect`, `closeOnEnter`.                                                                                      |
| badge[^146]          | string / table  | `{ label, color, expiresAt, countdown }`. Alias: `tag`.                                                                                         |
| price[^147]          | number / string | Alias: `cost`.                                                                                                                                  |
| swatch[^148]         | string          | Color chip.                                                                                                                                     |
| keywords[^149]       | string          | Search extras. Alias: `search`.                                                                                                                 |
| favorite[^150]       | boolean         |                                                                                                                                                 |
| requires[^151]       | table           | `{ label, met, icon }[]`. Unmet → auto-disable. Alias: `requirements`.                                                                          |
| checked[^152]        | boolean         | Checkbox.                                                                                                                                       |
| min[^153]            | number          | Slider / stepper.                                                                                                                               |
| max[^114]            | number          |                                                                                                                                                 |
| step[^154]           | number          |                                                                                                                                                 |
| progress[^155]       | number          |                                                                                                                                                 |
| colors[^156]         | table           | Palette. `{ color, value, label }` or hex strings.                                                                                              |
| colorIndex[^157]     | number          | Selected color.                                                                                                                                 |
| colorColumns[^158]   | number          | `4–12`.                                                                                                                                         |
| list[^159]           | table           | List values. Aliases: `values`, `choices`, `items`.                                                                                             |
| listIndex[^160]      | number          |                                                                                                                                                 |
| menu[^161]           | table           | Nested `{ title, options }`. Alias: `submenu`.                                                                                                  |
| tooltip[^162]        | table           | `{ title, subtitle, description, banner, image, mugshot, specs }`. Aliases: `info`, `preview`.                                                  |
| preview3d[^163]      | table           | `{ type, model, scale, heading, pitch, roll, rotatable, screen, depth, offset, dict, clip }`. Types: `weapon` \| `ped` \| `vehicle` \| `model`. |
| confirm[^164]        | boolean / table | Alert before resolve. `{ title, description, confirmLabel, cancelLabel, type, confirmColor, cancelColor }`.                                     |

#### Example

```lua
local result = exports.sInterface:menu({
    title = 'Shop',
    subtitle = 'General store',
    position = 'top-right',
    search = true,
    options = {
        { label = 'Bandage', value = 'bandage', price = 50, icon = 'bandage' },
        {
            label = 'Amount',
            type = 'stepper',
            id = 'qty',
            min = 1, max = 10, step = 1, default = 1
        },
        { type = 'separator', label = 'Weapons' },
        {
            label = 'Pistol',
            value = 'pistol',
            preview3d = { type = 'weapon', model = `WEAPON_PISTOL` },
            confirm = { title = 'Buy', description = 'Pay $500?' }
        }
    }
})
```

{% endtab %}

{% tab title="Radial" %}

#### Exports

| Export                                        | Returns       | Description                                     |
| --------------------------------------------- | ------------- | ----------------------------------------------- |
| `radial(data)` / `openRadial(data)`           | value / `nil` | Blocking open.                                  |
| `registerRadial(data)`                        | —             | Persistent items (F1 by default).               |
| `addRadialItem(item)`                         | —             | Add to the registered menu.                     |
| `removeRadialItem(id)`                        | —             |                                                 |
| `clearRadial()`                               | —             |                                                 |
| `openRegisteredRadial(extra?)`                | `boolean`     | Open the F1 menu.                               |
| `closeRadial()`                               | —             |                                                 |
| `updateRadial(data)`                          | —             | Patch the open radial.                          |
| `isRadialOpen()`                              | `boolean`     |                                                 |
| `setRadialDisabled(id, state)`                | —             |                                                 |
| `setRadialChecked(id, state)`                 | —             | Toggle items.                                   |
| `setRadialContextProvider(fn)`                | —             | `function() return { job, grade, cash, items }` |
| `setRadialTheme(theme)`                       | —             | `{ accent, ring, center }`                      |
| `getRadialHistory()` / `clearRadialHistory()` | —             |                                                 |
| `flushRadialQueue()`                          | —             |                                                 |

Events: `sInterface:radialSelect` `(value, payload)` · `sInterface:radialClose` · `sInterface:radialHover` · `sInterface:radialMacro`.

#### Options — `radial(data)`

| Option                   | Type    | Default               | Description                                                                                        |
| ------------------------ | ------- | --------------------- | -------------------------------------------------------------------------------------------------- |
| items[^165] **required** | table   | —                     | Alias: `options`. Max 12 (config `MaxItems`, cap 16).                                              |
| favorites[^166]          | table   | items with `favorite` | Inner ring. Max 4.                                                                                 |
| centerLabel[^167]        | string  | config                | Aliases: `title`, `center.label`.                                                                  |
| center[^168]             | table   | —                     | `{ label, icon, preview }`.                                                                        |
| icon[^169]               | string  | —                     | Center icon.                                                                                       |
| centerPreview[^170]      | string  | —                     |                                                                                                    |
| canClose[^133]           | boolean | `true`                |                                                                                                    |
| closeOnSelect[^171]      | boolean | `true`                |                                                                                                    |
| selectMode[^172]         | string  | `'click'`             | `click` \| `release`                                                                               |
| scale[^173]              | number  | `1.0`                 | `0.7–1.4`                                                                                          |
| startAngle[^174]         | number  | `0`                   |                                                                                                    |
| showBreadcrumb[^175]     | boolean | `true`                |                                                                                                    |
| compact[^176]            | boolean | `false`               | Icons only.                                                                                        |
| dualRing[^177]           | boolean | `true`                | Favorites on the inner ring.                                                                       |
| history[^178]            | boolean | config                | Last action in the center.                                                                         |
| theme[^179]              | table   | config                | `{ accent, ring, center }`. Accent presets: `blue`, `green`, `red`, `orange`, `yellow`, `neutral`. |

**items\[]**

| Option                   | Type    | Description                                                                                                         |
| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------- |
| id[^180]                 | string  | Alias: `value`.                                                                                                     |
| label[^181] **required** | string  | Aliases: `text`, `name`.                                                                                            |
| type[^182]               | string  | `action` \| `toggle` \| `macro` \| `history` \| `submenu`.                                                          |
| icon[^183]               | string  | Alias: `image`.                                                                                                     |
| description[^184]        | string  |                                                                                                                     |
| preview[^185]            | string  |                                                                                                                     |
| color[^143]              | string  | Aliases: `colour`, `accent`.                                                                                        |
| badge[^186]              | string  | Alias: `count`.                                                                                                     |
| quantity[^187]           | number  | Shown as `xN`.                                                                                                      |
| shortcut[^188]           | string  | Alias: `key`.                                                                                                       |
| keepOpen[^189]           | boolean |                                                                                                                     |
| disabled[^109]           | boolean | Also `hidden` / `locked`.                                                                                           |
| lockReason[^190]         | string  |                                                                                                                     |
| checked[^152]            | boolean | Toggle.                                                                                                             |
| favorite[^150]           | boolean |                                                                                                                     |
| price[^191]              | number  | Uses `require.cash` if set.                                                                                         |
| cooldown[^192]           | number  | ms.                                                                                                                 |
| macro[^193]              | table   | Sequence of child actions.                                                                                          |
| items[^194]              | table   | Submenu. Or `menu = { label, items }`.                                                                              |
| context[^195]            | table   | Show only if player context matches (`inVehicle`, `onFoot`, `dead`, `swimming`, `armed`, `driver`, `passenger`, …). |
| proximity[^196]          | table   | \`{ type = 'vehicle'                                                                                                |
| require[^197]            | table   | `{ job, grade, cash, item, quantity }`.                                                                             |

#### Example

```lua
exports.sInterface:addRadialItem({
    id = 'vehicle',
    label = 'Vehicle',
    icon = 'car',
    context = { inVehicle = true },
    items = {
        { id = 'engine', label = 'Engine', icon = 'power', keepOpen = true, type = 'toggle', checked = true },
        { id = 'doors', label = 'Doors', icon = 'door-open' }
    }
})

AddEventHandler('sInterface:radialSelect', function(value)
    print('radial', value)
end)
```

{% endtab %}

{% tab title="Context" %}

#### Exports

| Export                                                        | Returns       | Description                            |
| ------------------------------------------------------------- | ------------- | -------------------------------------- |
| `context(data)`                                               | value / `nil` | Blocking.                              |
| `showContext(data)`                                           | `boolean`     | Open without waiting.                  |
| `closeContext()`                                              | —             |                                        |
| `isContextOpen()`                                             | `boolean`     |                                        |
| `startContextTarget(options?)`                                | `boolean`     | Start targeting (hold Alt by default). |
| `stopContextTarget()`                                         | —             |                                        |
| `isContextTargetActive()`                                     | `boolean`     |                                        |
| `addContextTarget(data)`                                      | id            | Generic target.                        |
| `addVehicle` / `addPlayer` / `addPed` / `addSelf`             | id            |                                        |
| `addModel(models, opts)`                                      | id            |                                        |
| `addCoord(coords, opts)` / `addBox(data)` / `addSphere(data)` | id            |                                        |
| `removeContextTarget(id)` / `removeTarget(id)`                | —             |                                        |
| `clearContextTargets()` / `clearTargets()`                    | —             |                                        |

Events: `sInterface:contextSelect` `(value)` · `sInterface:contextClose`.

#### Options — `showContext` / `context`

| Option                   | Type    | Default | Description                        |
| ------------------------ | ------- | ------- | ---------------------------------- |
| items[^198] **required** | table   | —       | Alias: `options`.                  |
| title[^199]              | string  | —       |                                    |
| canClose[^133]           | boolean | config  |                                    |
| x[^200]                  | number  | cursor  | Screen `0–1`.                      |
| y[^201]                  | number  | cursor  | Screen `0–1`.                      |
| search[^134]             | boolean | auto    | On if items ≥ `SearchMinItems`.    |
| searchPlaceholder[^202]  | string  | config  |                                    |
| multi[^203]              | boolean | `false` | Multi-select.                      |
| multiConfirmLabel[^204]  | string  | config  |                                    |
| multiCancelLabel[^205]   | string  | config  |                                    |
| entityLabel[^206]        | string  | —       | Header when opened from a target.  |
| entityType[^207]         | string  | —       |                                    |
| currency[^137]           | table   | config  | `{ symbol, position, separator }`. |

**Item types:** `action` (default), `toggle`, `submenu` (`items`), `header`, `separator`.

**items\[]**

| Option               | Type            | Description                 |
| -------------------- | --------------- | --------------------------- |
| id[^208]             | string          | Default value for actions.  |
| label[^209]          | string          | Aliases: `title`, `text`.   |
| type[^182]           | string          | See types.                  |
| value[^210]          | any             |                             |
| icon[^211]           | string          |                             |
| tooltip[^212]        | string          |                             |
| description[^213]    | string          | Added to search `keywords`. |
| keywords[^214]       | string          |                             |
| disabled[^109]       | boolean         |                             |
| disabledReason[^215] | string          |                             |
| keepOpen[^189]       | boolean         |                             |
| color[^216]          | string          |                             |
| badge[^217]          | any             |                             |
| shortcut[^188]       | string          |                             |
| checked[^152]        | boolean         | Toggle.                     |
| price[^218]          | number / string |                             |
| cooldown[^219]       | number          | ms.                         |
| progress[^220]       | number          | `0–1` (or `0–100`).         |
| selected[^221]       | boolean         |                             |
| items[^222]          | table           | Submenu.                    |

**Target options** (`addVehicle`, `addModel`, …)

| Option                   | Type                 | Description                                      |
| ------------------------ | -------------------- | ------------------------------------------------ |
| items[^223] **required** | table                | Same item shape. Alias: `options`.               |
| id[^224]                 | string               | Alias: `name`.                                   |
| title[^225]              | string               |                                                  |
| distance[^226]           | number               |                                                  |
| canInteract[^227]        | function             | `function(entity, distance, coords) return bool` |
| outline[^228]            | boolean              | Vehicle / model / object glow.                   |
| coords[^229]             | vector3              | Coord / box / sphere.                            |
| size[^230]               | vector3              | Box. Alias: `dimensions`.                        |
| rotation[^231]           | number               | Box heading.                                     |
| radius[^232]             | number               | Coord / sphere (default `1.5`).                  |
| models[^233]             | string / hash / list | `addModel`.                                      |

#### Example

```lua
exports.sInterface:showContext({
    title = 'Actions',
    canClose = true,
    items = {
        { type = 'header', label = 'Player' },
        { id = 'search', label = 'Search', icon = 'magnifying-glass' },
        { id = 'cuff', label = 'Cuff', icon = 'handcuffs', keepOpen = false }
    }
})

AddEventHandler('sInterface:contextSelect', function(value)
    print('context', value)
end)
```

```lua
exports.sInterface:addVehicle({
    title = 'Vehicle',
    distance = 2.5,
    outline = true,
    items = {
        { id = 'trunk', label = 'Trunk', icon = 'box' },
        { id = 'repair', label = 'Repair', icon = 'wrench' }
    }
})
```

{% endtab %}

{% tab title="Studio" %}

#### Exports

| Export           | Returns   | Description                    |
| ---------------- | --------- | ------------------------------ |
| `openStudio()`   | —         | Open the in-game theme editor. |
| `closeStudio()`  | —         |                                |
| `isStudioOpen()` | `boolean` |                                |

No payload. Command: `/sistudio`.

| Config                         | Description                                                     |
| ------------------------------ | --------------------------------------------------------------- |
| Enabled[^234]                  | Master switch.                                                  |
| Command[^235]                  | Default `sistudio`.                                             |
| RequireAce[^236]               | If `true`, needs ACE `Config.Studio.Ace` (`sInterface.studio`). |
| AllowPlayerCustomization[^237] | Players can override `PlayerEditable` keys.                     |
| PlayerEditable[^238]           | Paths like `colors.accent`, `modules.notify.position`.          |

Theme is stored in `data/theme.json` on the server.

#### Example

```lua
exports.sInterface:openStudio()
```

{% endtab %}
{% endtabs %}

[^1]: `description = 'You received 1x bandage'`

[^2]: `type = 'success'`

[^3]: `layout = 'advanced'`

[^4]: `title = 'Inventory'`

[^5]: `subtitle = 'Fleeca robbery'`

[^6]: `badge = '10-90'`

[^7]: `image = 'https://example.com/banner.png'`

[^8]: `duration = 4000`

[^9]: `position = 'top-right'`

[^10]: `priority = 'high'`

[^11]: `persistent = true`

[^12]: `group = 'dispatch'`

[^13]: `id = existingId`

[^14]: `count = 3`

[^15]: `actions = { { id = 'accept', label = 'Accept', style = 'success' } }`

[^16]: `onAction = function(actionId, id) print(actionId) end`

[^17]: `actionEvent = 'myresource:notifyAction'`

[^18]: `progress = { value = 0.4 }`

[^19]: `id = 'accept'`

[^20]: `label = 'Accept'`

[^21]: `style = 'success'`

[^22]: `progress = true`

[^23]: `progress = 8000`

[^24]: `progress = { duration = 8000, showTime = true }`

[^25]: `showTime = false`

[^26]: `progress = { value = 0.5 }`

[^27]: `text = 'Open stash'`

[^28]: `subtitle = 'Personal storage'`

[^29]: `key = 'E'`

[^30]: `keys = { 'E', 'G' }`

[^31]: `combo = true`

[^32]: `position = 'bottom-center'`

[^33]: `style = 'compact'`

[^34]: `layout = 'row'`

[^35]: `icon = 'box'`

[^36]: `color = 'success'`

[^37]: `locked = true`

[^38]: `hold = true`

[^39]: `holdValue = 0.4`

[^40]: `progress = 0.6`

[^41]: `progressColor = '#90caf9'`

[^42]: `offset = { x = 0, y = -10 }`

[^43]: `priority = 2`

[^44]: `items = { { text = 'Open', key = 'E' }, { text = 'Lock', key = 'G' } }`

[^45]: `force = true`

[^46]: `coords = vec3(25.7, -1347.3, 29.5)`

[^47]: `distance = 2.0`

[^48]: `coords = GetEntityCoords(entity)`

[^49]: `entity = ped`

[^50]: `atPlayer = true`

[^51]: `follow = true`

[^52]: `offset = vec3(0.0, 0.0, 1.0)`

[^53]: `distance = 8.0`

[^54]: `id = 'vendor'`

[^55]: `label = 'Repairing engine…'`

[^56]: `description = 'Keep still'`

[^57]: `duration = 5000`

[^58]: `style = 'circle'`

[^59]: `metric = 'time'`

[^60]: `canCancel = true`

[^61]: `cancelKey = 'X'`

[^62]: `color = '#90caf9'`

[^63]: `mode = 'manual'`

[^64]: `steps = { 'Cut', 'Weld', { label = 'Paint', duration = 2000 } }`

[^65]: `disable = { move = true, combat = true, car = true }`

[^66]: `anim = { dict = 'mini@repair', clip = 'fixing_a_ped' }`

[^67]: `prop = { model = 'prop_tool_wrench', bone = 28422 }`

[^68]: `anim = { scenario = 'WORLD_HUMAN_WELDING' }`

[^69]: `playEnter = false`

[^70]: `dict = 'mini@repair'`

[^71]: `clip = 'fixing_a_ped'`

[^72]: `flag = 49`

[^73]: `blendIn = 3.0`

[^74]: `blendOut = 1.0`

[^75]: `description = 'Remove this weapon from the player?'`

[^76]: `title = 'Confiscate weapon'`

[^77]: `type = 'warning'`

[^78]: `confirmLabel = 'Confirm'`

[^79]: `cancelLabel = 'Cancel'`

[^80]: `showCancel = true`

[^81]: `confirmColor = 'green'`

[^82]: `cancelColor = 'red'`

[^83]: `image = 'nui://myres/html/icon.png'`

[^84]: `showIcon = false`

[^85]: `timeout = 8000`

[^86]: `timeoutResult = true`

[^87]: `dismissable = false`

[^88]: `confirmDelay = 2`

[^89]: `requireScroll = true`

[^90]: `extra = { label = 'Details', color = 'blue', result = 'details' }`

[^91]: `input = { type = 'text', label = 'Reason', required = true }`

[^92]: `checkbox = { label = 'I understand', required = true }`

[^93]: `fields = { { type = 'number', name = 'amount', label = 'Amount' } }`

[^94]: `title = 'Invoice'`

[^95]: `showHeader = true`

[^96]: `description = 'Fill the form'`

[^97]: `variant = 'warning'`

[^98]: `confirmLabel = 'Validate'`

[^99]: `cancelLabel = 'Back'`

[^100]: `showConfirm = true`

[^101]: `extra = { label = 'Preview', result = 'preview' }`

[^102]: `type = 'select'`

[^103]: `name = 'amount'`

[^104]: `label = 'Amount'`

[^105]: `description = 'Min 1'`

[^106]: `placeholder = '100'`

[^107]: `default = 50`

[^108]: `required = true`

[^109]: `disabled = true`

[^110]: `readOnly = true`

[^111]: `maxLength = 32`

[^112]: `minLength = 3`

[^113]: `min = 1`

[^114]: `max = 100`

[^115]: `step = 5`

[^116]: `rows = 4`

[^117]: `singleLine = true`

[^118]: `options = { { value = 'fine', label = 'Fine' }, 'Tax' }`

[^119]: `pattern = '^[0-9]+$'`

[^120]: `patternMessage = 'Digits only'`

[^121]: `counter = true`

[^122]: `masked = true`

[^123]: `maxSize = 512`

[^124]: `accept = 'image/*'`

[^125]: `difficulty = { 'easy', 'medium', 'hard' }`

[^126]: `keys = { 'E', 'E', 'E' }`

[^127]: `style = 'bar'`

[^128]: `options = { { label = 'Bandage', value = 'bandage', price = 50 } }`

[^129]: `title = 'Shop'`

[^130]: `subtitle = 'General store'`

[^131]: `banner = 'https://example.com/shop.png'`

[^132]: `position = 'top-left'`

[^133]: `canClose = true`

[^134]: `search = true`

[^135]: `searchPlaceholder = 'Search items…'`

[^136]: `defaultIndex = 1`

[^137]: `currency = { symbol = '$', position = 'prefix' }`

[^138]: `label = 'Bandage'`

[^139]: `value = 'bandage'`

[^140]: `type = 'stepper'`

[^141]: `description = 'Heals 25 HP'`

[^142]: `icon = 'bandage'`

[^143]: `color = 'green'`

[^144]: `disabledReason = 'Not enough cash'`

[^145]: `close = false`

[^146]: `badge = { label = 'NEW', color = 'green' }`

[^147]: `price = 50`

[^148]: `swatch = '#ff0000'`

[^149]: `keywords = 'med heal'`

[^150]: `favorite = true`

[^151]: `requires = { { label = 'Level 5', met = true }, { label = '$50', met = false } }`

[^152]: `checked = true`

[^153]: `min = 0`

[^154]: `step = 1`

[^155]: `progress = 40`

[^156]: `colors = { '#ff0000', { color = '#00ff00', label = 'Green' } }`

[^157]: `colorIndex = 1`

[^158]: `colorColumns = 8`

[^159]: `list = { 'Red', 'Green', 'Blue' }`

[^160]: `listIndex = 2`

[^161]: `menu = { title = 'Weapons', options = { { label = 'Pistol', value = 'pistol' } } }`

[^162]: `tooltip = { title = 'Pistol', description = '9mm', specs = { { label = 'Damage', value = 40 } } }`

[^163]: `preview3d = { type = 'weapon', model = 'WEAPON_PISTOL' }`

[^164]: `confirm = { title = 'Buy', description = 'Pay $500?' }`

[^165]: `items = { { id = 'engine', label = 'Engine', icon = 'power' } }`

[^166]: `favorites = { { id = 'phone', label = 'Phone', icon = 'phone' } }`

[^167]: `centerLabel = 'Actions'`

[^168]: `center = { label = 'Menu', icon = 'bars' }`

[^169]: `icon = 'bars'`

[^170]: `centerPreview = 'nui://myres/preview.png'`

[^171]: `closeOnSelect = true`

[^172]: `selectMode = 'release'`

[^173]: `scale = 1.1`

[^174]: `startAngle = 0.0`

[^175]: `showBreadcrumb = true`

[^176]: `compact = true`

[^177]: `dualRing = true`

[^178]: `history = true`

[^179]: `theme = { accent = 'blue' }`

[^180]: `id = 'engine'`

[^181]: `label = 'Engine'`

[^182]: `type = 'toggle'`

[^183]: `icon = 'power'`

[^184]: `description = 'Toggle engine'`

[^185]: `preview = 'nui://myres/engine.png'`

[^186]: `badge = '2'`

[^187]: `quantity = 3`

[^188]: `shortcut = 'G'`

[^189]: `keepOpen = true`

[^190]: `lockReason = 'Need a lockpick'`

[^191]: `price = 150`

[^192]: `cooldown = 2000`

[^193]: `macro = { 'engine', 'doors' }`

[^194]: `items = { { id = 'hood', label = 'Hood' } }`

[^195]: `context = { inVehicle = true }`

[^196]: `proximity = { type = 'vehicle', distance = 3.0 }`

[^197]: `require = { job = 'police', grade = 2 }`

[^198]: `items = { { id = 'search', label = 'Search', icon = 'magnifying-glass' } }`

[^199]: `title = 'Actions'`

[^200]: `x = 0.5`

[^201]: `y = 0.4`

[^202]: `searchPlaceholder = 'Search…'`

[^203]: `multi = true`

[^204]: `multiConfirmLabel = 'Validate'`

[^205]: `multiCancelLabel = 'Cancel'`

[^206]: `entityLabel = 'Adder'`

[^207]: `entityType = 'vehicle'`

[^208]: `id = 'search'`

[^209]: `label = 'Search'`

[^210]: `value = 'search'`

[^211]: `icon = 'magnifying-glass'`

[^212]: `tooltip = 'Frisk the player'`

[^213]: `description = 'Frisk'`

[^214]: `keywords = 'frisk inspect'`

[^215]: `disabledReason = 'Too far'`

[^216]: `color = 'red'`

[^217]: `badge = 'NEW'`

[^218]: `price = 250`

[^219]: `cooldown = 1500`

[^220]: `progress = 0.35`

[^221]: `selected = true`

[^222]: `items = { { id = 'idcard', label = 'ID card' } }`

[^223]: `items = { { id = 'trunk', label = 'Trunk' } }`

[^224]: `id = 'veh_main'`

[^225]: `title = 'Vehicle'`

[^226]: `distance = 2.5`

[^227]: `canInteract = function(entity, dist) return dist < 2.0 end`

[^228]: `outline = true`

[^229]: `coords = vec3(100.0, -200.0, 30.0)`

[^230]: `size = vec3(1.5, 1.5, 2.0)`

[^231]: `rotation = 90.0`

[^232]: `radius = 1.5`

[^233]: `models = { 'adder', 'zentorno' }`

[^234]: `Config.Studio.Enabled = true`

[^235]: `Config.Studio.Command = 'sistudio'`

[^236]: `Config.Studio.RequireAce = true`

[^237]: `Config.Studio.AllowPlayerCustomization = true`

[^238]: `Config.Studio.PlayerEditable = { 'colors.accent' }`
