> ## Documentation Index
> Fetch the complete documentation index at: https://lationscripts.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Interact - Configuration

> Every option in config.lua, with defaults and what they control

All configuration lives in `config.lua` at the root of `lation_interact`. The defaults work well for most servers - change what you want and restart the resource.

<Note>
  `Stages`, `ExpandMode` and `Reveal` are defaults - any individual registration can override them (`stages = { ... }`, `expand = '...'`, `reveal = '...'`).
</Note>

## Version Check

<ParamField path="version" type="boolean" default="true">
  Print a notice in the server console at startup when a newer release is available
</ParamField>

## Stages

Distance thresholds (in meters) for the reveal stages: the point of light (`grain`), the label (`name`), and live options (`reach`).

<Note>
  `reach` also sizes zones bridged from ox\_target / qb-target: their stack goes live within `reach` of the zone's surface (never farther than the registration's own distance). Native zones reach from *inside* their volume - see [Zones](/docs/interact/api/zones#stage-derivation).
</Note>

<ParamField path="grain" type="number" default="8.0">
  Distance at which the grain - the point of light - appears
</ParamField>

<ParamField path="name" type="number" default="4.5">
  Distance at which the label grows out of the grain
</ParamField>

<ParamField path="reach" type="number" default="2.4">
  Distance at which options unfold and input becomes live
</ParamField>

<ParamField path="exitMargin" type="number" default="0.4">
  Back out this far past a threshold before a stage lets go, so standing right on a boundary never flickers
</ParamField>

## ExpandMode

<ParamField path="ExpandMode" type="string" default="smart">
  How the stack opens once you're in reach

  * `'smart'` - single options unfold on their own; multi-option stacks wait for the confirm key
  * `'auto'` - always unfolds on its own
  * `'manual'` - always waits for the confirm key
</ParamField>

## Reveal

What renders before an anchor is focused:

<ParamField path="point" type="string" default="ambient">
  Default for placed points: `'ambient'` shows a grain of light from `Stages.grain` away - someone placed it, and the grain is the invitation
</ParamField>

<ParamField path="entity" type="string" default="focus">
  Default for entity anchors: `'focus'` renders nothing until you look at it, so a street full of cars stays quiet
</ParamField>

<ParamField path="bridged" type="string" default="focus">
  Everything coming through the ox\_target / qb-target compatibility layers: `'focus'` keeps it quiet until looked at, `'ambient'` gives it all grains
</ParamField>

## Keys

<ParamField path="ConfirmKey" type="string" default="E">
  The universal confirm key: activates the highlighted option when the option has no keybind of its own, and opens `'manual'` stacks. Any keyboard key name works - see [Options](/docs/interact/api/options#option-fields)
</ParamField>

<ParamField path="InteractControl" type="number | false" default="19">
  The interact control, held like a classic target's key. `19` is Left Alt (D-pad down on a controller). Holding it keeps the camera yours; with a stack on screen, a **left click** frees the cursor for hover and click and a **right click** hands the camera back. It also reveals [passive](#passive-mode) interactions. Set to `false` to disable
</ParamField>

## Passive Mode

Interactions stay hidden - no grain, no label, no input - until the [interact control](#keys) is held, like a classic target. While it's held everything follows `Reveal` as usual; let go and passive interactions vanish.

<ParamField path="Passive" type="boolean" default="false">
  Passive for the whole server
</ParamField>

<ParamField path="PassiveResources" type="string[]" default="{}">
  Passive for everything these resources register, and nothing else - `{ 'qb-drugs', 'my-events' }`. Works for escrowed scripts, since nothing in them changes: both compatibility layers apply it by the registering resource
</ParamField>

<Info>
  A single registration can opt in or out with `passive = true|false` on any `add*` call - see [Options](/docs/interact/api/options#anchor-fields).
</Info>

## AccentIcons

<ParamField path="AccentIcons" type="boolean" default="false">
  Header icons are light by default. Set `true` to tint them with the theme accent - they follow theme changes live. Individual registrations can always set their own `iconColor`
</ParamField>

## IncludeOwnVehicle

<ParamField path="IncludeOwnVehicle" type="boolean" default="false">
  Show options on the vehicle you're sitting in. Off by default - they would be focusable the whole time you drive. Enable it if a script expects its vehicle options to work from the driver's seat (glovebox-style scripts)
</ParamField>

## VehicleDoors

<ParamField path="VehicleDoors" type="boolean | 'passive'" default="true">
  Built-in vehicle doors: toggle each door, the hood and the trunk from outside the vehicle - one chip per door, on the door itself, hidden while the door is locked, damaged, or you're sitting in a vehicle. Labels live in `locales/*.json` under `vehicle`

  * `true` - shown like everything else
  * `'passive'` - hidden until the [interact control](#keys) is held, whatever the rest of the server does
  * `false` - off, if your scripts bring their own door handling
</ParamField>

## InVehicle

What stays live while the player sits in a vehicle. A registration's own `inVehicle = true|false` overrides either default, and an option flagged `allowInVehicle = true` (honored on bridged ox\_target / qb-target options too) keeps its anchor live.

<ParamField path="entities" type="boolean" default="false">
  Anchors on **other** vehicles, peds, players and objects - off, since none of them can be reached from a seat. The vehicle you're in follows `IncludeOwnVehicle`
</ParamField>

<ParamField path="points" type="boolean" default="true">
  Points and zones - on, since garages, drive-thrus and car washes are used from the driver's seat
</ParamField>

## Suppress

When any of these is true the whole layer sleeps - no grains, no focus, no input - and wakes when the state clears.

<ParamField path="dead" type="boolean" default="true">
  Sleep while the player is dead or in last stand
</ParamField>

<ParamField path="cuffed" type="boolean" default="true">
  Sleep while the player is handcuffed
</ParamField>

<ParamField path="pauseMenu" type="boolean" default="true">
  Sleep while the pause menu is open
</ParamField>

<ParamField path="nuiFocus" type="boolean" default="true">
  Sleep while another resource holds NUI focus (inventory, phone, ...)
</ParamField>

<ParamField path="progress" type="boolean" default="true">
  Sleep while a progress bar runs - ox\_lib's or qb progressbar's, read through their exports with no dependency - so a key tapped on a chip can't re-fire the action it just started
</ParamField>

<Info>
  How dead/cuffed are detected lives in `bridge/client.lua`, where it can be adapted per server. Scripts can also hold the layer down with their own tag: `exports.lation_interact:suppress('mytag')` / `exports.lation_interact:release('mytag')`.
</Info>

## Grain

The grain - the point of light marking ambient anchors. Tinted with the lation\_ui theme accent when one is applied.

<ParamField path="size" type="number" default="0.02">
  Sprite size
</ParamField>

<ParamField path="alpha" type="number" default="180">
  Sprite opacity (0-255)
</ParamField>

<ParamField path="breathe" type="boolean" default="true">
  Give the grain a gentle breathing animation
</ParamField>
