# Pause Menu — documentation

> A full replacement for the ESC menu that players can arrange and theme themselves.

- URL: https://xexstudio.com/docs/pause-menu
- Version: 2.1.2
- Product page: https://xexstudio.com/scripts/pause-menu
## Overview

XeX Pause Menu replaces the native ESC menu with a configurable dashboard for ESX, QBCore and Qbox. Server owners choose the defaults; every player can rearrange the cards and pick a theme that is saved to their profile.

### Supported Frameworks

| Framework | Version | Status |
|-----------|---------|--------|
| ESX Legacy | 1.6.0+ | ✅ Full Support |
| QBCore | Latest | ✅ Full Support |
| QBox | Latest | ✅ Full Support |

---

## Features Summary

### Core Features

| Category | Feature | Description |
|----------|---------|-------------|
| **UI** | Adjustable transparency | Players choose card and background opacity |
| **UI** | 10 base themes + 12 color presets | Themes: Dark, Light, Glass, Midnight, Emerald, Sunset, Rose, Ocean, Gold, Neon |
| **UI** | Responsive | Supports 1080p to 4K resolutions |
| **Customizer** | Drag & Drop | Reposition cards freely |
| **Customizer** | Color Pickers | Full color customization |
| **Customizer** | UI Scale | 70% - 130% scaling |
| **Customizer** | Presets | Save/Load/Export/Import custom presets |
| **Customizer** | Per-Player | Settings saved per player |
| **Info** | Player Stats | HP, Armor, Hunger, Thirst, Stress |
| **Info** | Vehicle Info | Model, Plate, Fuel, Speed, Engine |
| **Info** | Location | Street, Zone, Heading, Coords (admin) |
| **Info** | Weather | Weather icon and name (in DateTime card) |
| **Info** | Time | Real time + In-game time |
| **Info** | Server | Online players, Job counts |
| **Info** | Money | Cash, Bank, Crypto, Dirty Money |
| **Social** | Custom Links | Website, Discord, Rules, Guides |
| **Social** | Social Media | Twitter, Instagram, YouTube, TikTok, Twitch |
| **Reports** | Categories | Bug, Player, Support, Suggestion |
| **Reports** | Discord Webhook | Automatic Discord integration |
| **Reports** | Admin Notifications | In-game alerts to admins |
| **Framework** | Multi-Framework | ESX, QBCore, QBox with auto-detection |
| **I18n** | 12 Languages | EN, ES, PT, FR, DE, IT, PL, NL, TR, ZH, RU, AR |
| **Performance** | Optimized | 0.00ms when closed |
| **Updater** | Auto-Update Check | Notifies of new versions |

---

## Installation

### Requirements

- FiveM Server Build 5181+
- OneSync Enabled
- Framework: ESX Legacy, QBCore, or QBox
- Optional: ox_lib (for enhanced notifications)

### Quick Start

```bash
1. Extract to your resources folder
2. Rename folder to 'xex_pausemenu' if needed
3. Add to server.cfg:
   ensure xex_pausemenu
4. Configure config.lua
5. Configure svconfig.lua (webhooks, tracked jobs)
6. Restart server
```

### Recommended Resource Order

```cfg
# server.cfg
ensure oxmysql
ensure ox_lib          # Optional but recommended
ensure es_extended     # or qb-core / qbox
ensure xex_pausemenu
```

---

## Configuration

### Framework Settings

```lua
-- config.lua
Config.Framework = 'auto' -- 'auto' | 'esx' | 'qb' | 'qbox'
Config.AutoDetectOrder = {'qbox', 'qb', 'esx'}
```

| Value | Behavior |
|-------|----------|
| `'auto'` | Detects framework automatically (recommended) |
| `'esx'` | Force ESX Legacy |
| `'qb'` | Force QBCore |
| `'qbox'` | Force QBox |

### Keybind Settings

```lua
Config.Keybind = 'ESC'         -- 'ESC' | 'F1'-'F10' | 'NONE'
Config.OpenCommand = 'pausemenu' -- Command to open (nil to disable)
```

| Keybind | Behavior |
|---------|----------|
| `'ESC'` | Replaces native pause menu completely |
| `'F1'`-`'F3'`, `'F5'`-`'F10'` | Opens with F-key, ESC still opens native |
| `'NONE'` | Only command works |

### Server Information

```lua
Config.ServerName = 'Your Server Name'
Config.ServerLogo = 'img/logo.svg' -- Path relative to web/ folder, or nil
Config.ServerSlogan = 'The best roleplay experience'
```

### Display Options

#### Player Information
```lua
Config.ShowPlayerInfo = {
    name = true,         -- Character name
    id = true,           -- Server ID
    job = true,          -- Current job + grade
    gang = true,         -- Gang (QB/QBox only)
    phoneNumber = true,  -- Phone number (auto-detected)
    money = true,        -- Cash, Bank, Crypto, Dirty Money
    playTime = true,     -- Session time
}
```

**Phone Number Auto-Detection:**
- qs-smartphone
- lb-phone
- npwd
- gcphone
- gksphone
- roadphone
- high-phone
- yflip-phone
- d-phone
- renewed-phone
- QB/QBox charinfo.phone (fallback)

> **Note:** `high-phone`, `yflip-phone`, and `d-phone` are detected as running phone resources but their phone number retrieval exports are not yet implemented — the phone number may show as unavailable for these resources.

#### Server Information
```lua
Config.ShowServerInfo = {
    onlinePlayers = true,  -- Current/Max players
    maxPlayers = true,
    policeCount = true,    -- Jobs are configured in svconfig.lua
    emsCount = true,
    mechanicCount = true,
}
```

#### Player Stats
```lua
Config.ShowPlayerStats = {
    enabled = true,
    health = true,
    armor = true,
    hunger = true,    -- Requires esx_status (ESX) or built-in (QB)
    thirst = true,
    stress = true,    -- QB/QBox only
}
```

#### Vehicle Information
```lua
Config.ShowVehicleInfo = {
    enabled = true,
    model = true,
    plate = true,
    fuel = true,      -- Auto-detects fuel resource
    speed = true,
    engine = true,
}
```

**Fuel Resource Auto-Detection:**
- ox_fuel
- LegacyFuel
- ps-fuel
- cdn-fuel
- okokGasStation
- lj-fuel
- Native fallback

#### Location
```lua
Config.ShowLocation = {
    enabled = true,
    streetName = true,
    zoneName = true,
    heading = true,        -- N, NE, E, SE, S, SW, W, NW
    coords = false,        -- X, Y, Z (always visible for admins)
}
```

#### Date/Time
```lua
Config.ShowDateTime = {
    enabled = true,
    realTime = true,
    inGameTime = true,
    weather = true,
}
```

### Menu Buttons

```lua
Config.Buttons = {
    map = true,       -- Opens GTA map
    settings = true,  -- Opens customizer
    report = true,    -- Opens report modal
}
```

### Social Links

```lua
Config.SocialLinks = {
    enabled = true,
    
    -- Main action buttons
    mainLinks = {
        {
            id = 'website',
            label = 'WEBSITE',
            icon = 'globe',       -- FontAwesome icon name
            url = 'https://your-server.com',
            enabled = true,
            color = '#3B82F6'
        },
        {
            id = 'discord',
            label = 'DISCORD',
            icon = 'discord',
            url = 'https://discord.gg/your-server',
            enabled = true,
            color = '#5865F2'
        },
        {
            id = 'rules',
            label = 'RULES',
            icon = 'scroll',
            url = 'https://your-server.com/rules',
            enabled = true,
            color = '#EF4444'
        },
        {
            id = 'guides',
            label = 'GUIDES',
            icon = 'book-open',
            url = 'https://your-server.com/guides',
            enabled = true,
            color = '#10B981'
        },
    },
    
    -- Social media icons (bottom row)
    socialMedia = {
        {id = 'twitter', icon = 'twitter', url = 'https://twitter.com/...', enabled = true, color = '#FFFFFF'},
        {id = 'instagram', icon = 'instagram', url = 'https://instagram.com/...', enabled = true, color = '#E4405F'},
        {id = 'youtube', icon = 'youtube', url = 'https://youtube.com/...', enabled = true, color = '#FF0000'},
        {id = 'tiktok', icon = 'tiktok', url = 'https://tiktok.com/...', enabled = false, color = '#FFFFFF'},
        {id = 'twitch', icon = 'twitch', url = 'https://twitch.tv/...', enabled = false, color = '#9146FF'},
    }
}
```

**Available Icons:**
- Main: `globe`, `discord`, `scroll`, `book-open`, `link`, `gamepad`, `headset`, `store`
- Social: `twitter`, `instagram`, `youtube`, `tiktok`, `twitch`, `facebook`

### Report System

```lua
Config.ReportSystem = {
    enabled = true,
    categories = {
        {id = 'bug', label = '🐛 Bug Report', color = '#F59E0B'},
        {id = 'player', label = '👤 Player Report', color = '#EF4444'},
        {id = 'support', label = '❓ Support Request', color = '#3B82F6'},
        {id = 'suggestion', label = '💡 Suggestion', color = '#10B981'},
    },
    minMessageLength = 20,    -- Minimum characters
    maxSubjectLength = 100,   -- Maximum subject length (checked on the server)
    maxMessageLength = 1000,  -- Maximum message length (checked on the server)
    cooldown = 60,            -- Seconds between reports
    notifyAdmins = true,      -- In-game notification to admins
    sendToDiscord = true,     -- Send to webhook
}
```

### Disconnect Options

```lua
Config.Disconnect = {
    showConfirmation = true,
    leaveMessage = 'Thanks for playing! See you soon! 👋',
    options = {
        disconnect = true,      -- Disconnect from server
        quitGame = true,        -- Close FiveM
        characterSelect = true, -- Return to character selection
    }
}
```

### UI Customization

```lua
Config.UI = {
    accentColor = '#C5F24A',  -- Brand color: accent of the Default preset
    buttonImages = {          -- Faint background of these buttons: path relative to web/, URL, or false
        map = 'img/buttons/map.webp',
        settings = false,
        report = false,
    },
    sounds = {
        enabled = true,
        open = true,
        close = true,
        hover = true,
        click = true,
    },
    hideRadar = true,         -- Hide minimap when open
    showOverlay = true,       -- Dark overlay behind menu
    overlayOpacity = 0.7,     -- 0.0 - 1.0
    enableCustomizer = true,  -- Allow player customization
}
```

### Customizer Options

Control what players can customize:

```lua
Config.CustomizerOptions = {
    -- Enable/disable entire tabs
    tabs = {
        theme = true,    -- Theme, background, animations
        colors = true,   -- Color customization
        layout = true,   -- Drag & drop, visibility
        cards = true,    -- Card styles
        presets = true,  -- Save/load presets
    },
    
    -- Theme tab
    theme = {
        baseTheme = true,         -- Theme selection
        backgroundOpacity = true, -- Overlay opacity
        backgroundImage = true,   -- Custom background
        cardOpacity = true,       -- Card transparency
        animations = true,        -- Enable/disable
        displayMode = true,       -- Fullscreen/Boxed
        uiScale = true,           -- Scale slider
    },
    
    -- Colors tab
    colors = {
        mainColors = true,        -- Primary, Secondary, Accent
        backgroundColors = true,  -- Background colors
        textColors = true,        -- Text colors
        statusBarColors = true,   -- HP, Armor, etc.
        jobColors = true,         -- Police, EMS, Mechanic
    },
    
    -- Layout tab
    layout = {
        editMode = true,          -- Drag & drop
        cardVisibility = true,    -- Show/hide cards
        columnLayout = true,      -- Column count
        resetPositions = true,    -- Reset button
    },
    
    -- Cards tab
    cards = {
        cardStyle = true,         -- Glass, Solid, Minimal, Neon
        borderRadius = true,      -- Corner rounding
        cardSpacing = true,       -- Gap between cards
    },
    
    -- Presets tab
    presets = {
        themePresets = true,      -- Built-in presets
        savePreset = true,        -- Save custom
        importExport = true,      -- Import/Export JSON
    },
}
```

### Admin Features

```lua
Config.Admin = {
    showAdminBadge = true,       -- Badge next to admin names
    showCoordsForAdmins = true,  -- Coordinates visible
}
```

Who counts as admin is configured in `svconfig.lua` (see Admin Detection).

### Performance Options

```lua
Config.Performance = {
    updateInterval = 1000,         -- Update frequency (ms)
    cachePlayerData = true,        -- Enable caching
    cacheDuration = 5000,          -- Cache duration (ms)
}
```

---

## Server Configuration

### svconfig.lua

Notifications use ox_lib automatically when it is running, otherwise the framework's own notifications.

#### Discord Webhooks

```lua
ConfigSv.ReportWebhook = 'https://discord.com/api/webhooks/...'

ConfigSv.WebhookColors = {
    bug = 16753920,        -- Orange
    player = 15548997,     -- Red
    support = 3447003,     -- Blue
    suggestion = 5763719,  -- Green
}

ConfigSv.WebhookName = 'XeX Reports'
ConfigSv.WebhookAvatar = nil -- URL to avatar
```

#### Admin Detection

```lua
-- ESX groups
ConfigSv.ESXAdminGroups = {'admin', 'superadmin', 'mod', 'owner', 'god'}

-- QB/QBox permissions
ConfigSv.QBPermissions = {'admin', 'god', 'mod'}

-- Custom check (optional)
ConfigSv.CustomAdminCheck = function(source)
    return IsPlayerAceAllowed(source, 'command.admin')
end
```

#### Job Tracking

```lua
ConfigSv.TrackedJobs = {
    {
        id = 'police',
        label = 'Police',
        icon = 'fas fa-shield',
        color = '#3B82F6',
        jobs = {'police', 'sheriff', 'fbi', 'lspd', 'bcso'}
    },
    {
        id = 'ems',
        label = 'EMS',
        icon = 'fas fa-truck-medical',
        color = '#EF4444',
        jobs = {'ambulance', 'ems', 'doctor', 'hospital'}
    },
    {
        id = 'mechanic',
        label = 'Mechanics',
        icon = 'fas fa-wrench',
        color = '#F59E0B',
        jobs = {'mechanic', 'bennys', 'lscustoms'}
    },
    -- Add unlimited jobs!
}

ConfigSv.OnlyCountOnDuty = true -- QB/QBox, and ESX Legacy 1.10+ (job.onDuty)
```

#### Phone Number

Detected automatically for lb-phone, npwd, qs-smartphone, gksphone, roadphone, renewed-phone and gcphone, with `charinfo.phone` as fallback on QB/QBox. For any other phone:

```lua
ConfigSv.GetPhoneNumber = function(source)
    return exports['my-phone']:GetNumber(source)
end
```

#### Limits

```lua
ConfigSv.MaxRequestsPerMinute = 30 -- Menu data requests per player (0 = no limit)
ConfigSv.MaxLayoutSize = 32768     -- Max bytes of a saved player layout
```

The report cooldown is `Config.ReportSystem.cooldown` in `config.lua`.

#### Logging

```lua
ConfigSv.LogToConsole = false -- Set to true for debugging
```

#### Updates

```lua
ConfigSv.CheckForUpdates = true -- Checks xexstudio.com on start
```

---

## Localization

### Supported Languages

| Code | Language | Code | Language |
|------|----------|------|----------|
| `en` | English | `it` | Italiano |
| `es` | Español | `pl` | Polski |
| `pt` | Português | `nl` | Nederlands |
| `fr` | Français | `tr` | Türkçe |
| `de` | Deutsch | `zh` | 中文 |
| `ru` | Русский | `ar` | العربية |

### Setting Language

```lua
Config.Locale = 'en' -- Change to your language code
```

### Adding Custom Languages

```lua
Config.Locales['custom'] = {
    pause_menu = 'CUSTOM MENU',
    close = 'Close',
    back = 'Back',
    -- ... all keys (see existing locales for reference)
}
```

---

## Visual Customizer

### Theme Presets

| Theme | Style |
|-------|-------|
| Dark | Dark backgrounds, subtle accents |
| Light | Light backgrounds, dark text |
| Glass | Maximum transparency |
| Midnight | Deep blue tones |
| Emerald | Green nature vibes |
| Sunset | Warm orange/red tones |
| Rose | Pink romantic style |
| Ocean | Blue aquatic feel |
| Gold | Luxury golden tones |
| Neon | Vibrant cyberpunk |

### Color Presets

One click applies a full palette (accent, backgrounds, text, status bars and job colors):

| Preset | Accent |
|--------|--------|
| Default | Your `Config.UI.accentColor` (lime by default) on graphite |
| Midnight | Soft blue on navy |
| Forest | Green on deep green |
| Ember | Orange on warm brown |
| Amethyst | Violet on deep purple |
| Sunset | Coral and pink on plum |
| Arctic | Ice blue on dark teal |
| Rosé | Pink on dark berry |
| Mono | White on black, no color accent |
| Synthwave | Magenta and cyan on purple |
| Cyberpunk | Yellow and cyan, neon cards |
| Light | Indigo on white |

### Card Styles

| Style | Description |
|-------|-------------|
| Glass | Card background with a thin border (default) |
| Solid | Opaque background |
| Minimal | Subtle, flat design |
| Neon | Glowing borders |

### Layout Options

| Layout | Description |
|--------|-------------|
| 3-Column | Default, cards in 3 columns |
| 2-Column | Cards in 2 wider columns |
| Centered | Single column, centered |

### Display Modes

| Mode | Description |
|------|-------------|
| Fullscreen | Menu covers entire screen |
| Boxed | Menu in center with custom background |

---

## Notification System

### Priority Order

1. **ox_lib** - If installed and started
2. **Framework** - ESX/QB/QBox native
3. **Native** - GTA V notifications

To use another notification resource, edit `Bridge.Notify` in `bridge/client.lua`.

---

## Integrations (open files)

Everything that talks to your framework or to other resources is in two files that are not encrypted:

| File | Function | What it does |
|---|---|---|
| `bridge/client.lua` | `Bridge.GetFuel(vehicle)` | Fuel level (ox_fuel, LegacyFuel, ps-fuel, cdn-fuel, okokGasStation, lj-fuel, native) |
| | `Bridge.GetNeeds()` | Hunger, thirst and stress (esx_status, QB/QBox metadata) |
| | `Bridge.IsDead()` | Death check; death events fire the local event `xex_pausemenu:deathChanged` |
| | `Bridge.OpenCharacterSelect()` | "Change character" button (esx_multicharacter, qb-multicharacter) |
| | `Bridge.Notify(title, message, type)` | Notifications |
| `bridge/server.lua` | `Bridge.GetOnlineJobs()` | Jobs and duty of online players (tracked jobs counter) |
| | `Bridge.IsAdmin(source)` | Admin check (also `ConfigSv.CustomAdminCheck`) |
| | `Bridge.GetPhoneNumber(source)` | Phone number (also `ConfigSv.GetPhoneNumber`) |
| | `Bridge.GetCharacter(source, data)` | Name, job, grade, gang and accounts |

---

## Exports & Events

### Client Exports

```lua
-- Check if menu is open
local isOpen = exports['xex_pausemenu']:IsMenuOpen()

-- Open menu programmatically
exports['xex_pausemenu']:OpenPauseMenu()

-- Close menu
exports['xex_pausemenu']:ClosePauseMenu()
```

### Shared Exports

```lua
-- Get the framework bridge object (useful for integrations)
local bridge = exports['xex_pausemenu']:GetBridge()
```

### Server Callbacks

| Callback | Returns | Description |
|----------|---------|-------------|
| `xex_pausemenu:getData` | `table` | Main data fetch — returns player info, server stats, admin status, tracked jobs |

### Server Events

| Event | Parameters | Description |
|-------|------------|-------------|
| `xex_pausemenu:submitReport` | `reportData` | Receives report submission, sends to Discord webhook and notifies admins |
| `xex_pausemenu:disconnect` | — | Drops the player with configured leave message |
| `xex_pausemenu:checkAdmin` | — | Checks player admin status and sends result to client |
| `xex_pausemenu:saveLayout` | `layoutData` | Saves player's customizer layout to KVP storage |
| `xex_pausemenu:requestLayout` | — | Loads and sends saved layout to the requesting client |

### Client Events

| Event | Parameters | Description |
|-------|------------|-------------|
| `xex_pausemenu:reportNotification` | `reportData` | Notifies online admins of a new report |
| `xex_pausemenu:setAdmin` | `isAdmin` | Sets the admin flag on the client |
| `xex_pausemenu:loadLayout` | `layoutData` | Receives and applies saved layout from server |
| `xex_pausemenu:resetLayout` | — | Resets player layout to defaults |
| `xex_pausemenu:notify` | `message, type` | Server feedback (e.g. report rejected) |

### Local Client Events (for other resources)

Use them to hide your own HUD while the menu is open:

```lua
AddEventHandler('xex_pausemenu:opened', function() --[[ hide HUD ]] end)
AddEventHandler('xex_pausemenu:closed', function() --[[ show HUD ]] end)
```

### NUI Callbacks

| Callback | Data | Description |
|----------|------|-------------|
| `close` | — | Closes the menu and releases NUI focus |
| `modalOpened` | `type` | Tracks when report/quit modal is opened |
| `modalClosed` | — | Tracks when modal is closed |
| `playSound` | `sound` | Plays GTA frontend sounds (CONTINUE, BACK, SELECT, NAV_UP_DOWN) |
| `openMap` | — | Opens the native GTA map |
| `openSettings` | — | Opens the native GTA settings menu |
| `openLink` | `url` | Opens a URL in the player's browser |
| `submitReport` | `reportData` | Submits a report to the server |
| `disconnect` | — | Disconnects the player from the server |
| `quitGame` | — | Forces FiveM to close via `ForceSocialClubUpdate()` |
| `characterSelect` | — | Returns to character selection screen |
| `saveLayout` | `layoutData` | Saves player's customizer layout to server |

### Commands

| Command | Context | Description |
|---------|---------|-------------|
| `/{OpenCommand}` | Client | Opens the pause menu (default: `/pausemenu`) |
| `resetlayout` | Admin / Console | `/resetlayout <player_id>` — Resets a player's saved layout to defaults |

---

## File Structure

```
xex_pausemenu/
├── bridge/
│   ├── client.lua         # Fuel, needs, death, character select, notifications (open)
│   └── server.lua         # Jobs, admin, phone, character data (open)
├── client/
│   └── main.lua           # Client-side logic
├── server/
│   └── main.lua           # Server-side logic and version check
├── shared/
│   ├── bridge.lua         # Framework abstraction
│   └── lib_loader.lua     # ox_lib loader
├── web/
│   ├── index.html         # UI structure
│   ├── style.css          # Styles
│   ├── app.js             # Main app logic
│   ├── customizer.js      # Customizer panel
│   ├── customizer.css     # Customizer styles
│   └── img/               # Images folder
│       └── logo.svg       # Server logo (placeholder, replace it)
├── config.lua             # Client configuration
├── svconfig.lua           # Server configuration
├── fxmanifest.lua         # Resource manifest
├── LICENSE                # Commercial license
└── DOCS.md                # This documentation
```

---

## Troubleshooting

### Menu Not Opening

1. Verify resource is started: `ensure xex_pausemenu`
2. Check console for errors
3. Verify framework is detected
4. Check keybind conflicts

### Framework Not Detected

```lua
-- Force framework
Config.Framework = 'esx' -- instead of 'auto'
```

### Stats Not Showing

- **ESX**: Requires `esx_status` for hunger/thirst
- **QB/QBox**: Uses built-in metadata

### Fuel Not Showing

- Ensure fuel resource is started before xex_pausemenu
- Check if fuel resource exports are available

### Customizer Not Saving

- Check server console for save/load errors
- Verify player has valid identifier
- Layout data is stored server-side using KVP (`SetResourceKvp`/`GetResourceKvpString`)
- Use `/resetlayout <player_id>` to reset a player's layout if corrupted

### Character Select

- **ESX:** Requires `esx_multicharacter` to be running. If not found, the player will be disconnected instead.
- **QB/QBox:** Triggers `qb-multicharacter:client:chooseChar`.

### Menu Behavior

- The menu automatically closes when the player dies and cannot be reopened until respawn.
- Backspace (control 177) can also be used to close the menu as an alternative to ESC/close button.
- Sound effects use the `HUD_FRONTEND_DEFAULT_SOUNDSET` with sounds: CONTINUE (open), BACK (close), SELECT (click), NAV_UP_DOWN (hover).

---

## Changelog

### v2.1.2
- Calmer home: the Quit button is now a neutral row like the link buttons, red only on its icon and on hover
- Map, Settings and Report buttons use the same neutral surface and opacity as the cards; their color is on the icon and on hover, and follows the active preset (the Report icon no longer takes the accent color)
- The Map button has a faint city map in the background. `Config.UI.buttonImages` sets the background of the Map, Settings and Report buttons (a path or URL, such as a screenshot of your server, or `false`)
- Fixed: button tints did not show in game, because FiveM's browser does not support `color-mix()`
- `showOverlay` and `overlayOpacity` now set the default background darkness for players who have not changed it in the customizer
- Removed config options that had no effect: `Config.Buttons.inventory` and `phone`; `Config.UI.theme`, `blurIntensity`, `glassmorphism`, `animationSpeed` and `layout`; customizer options `autoTheme`, `animationSpeed` and `cardShadow`

### v2.1.1
- Lighter while the menu is open (0.01 ms in resmon): hunger, thirst and stress are read from the framework's own update event instead of copying all player data every second, street and zone are only looked up after the player moves, and only changed data is sent to the menu
- The vehicle card hides when the player gets out with the menu open
- The static config is sent when the menu page loads, not on the first open

### v2.1.0
- All framework and third-party integrations (fuel, needs, death, character select, notifications, admin check, phones, job counts, character data) moved to the open files `bridge/client.lua` and `bridge/server.lua`, so they can be adapted without touching encrypted code

### v2.0.2
- Update check prints the same one-line message as the other XeX scripts and stays silent if xexstudio.com cannot be reached
- Removed the `CheckForUpdates` export and the `pausemenu_update` console command

### v2.0.1
- Fix: the menu could be opened while dead (death handlers were never registered)
- Fix: website/Discord/social buttons now open the link in the browser
- Fix: ESX/QBCore menu data could fail to load when ox_lib was started without its `lib` global
- Security: reports are validated on the server (category, lengths, cooldown) and players are told when one is rejected
- Security: saved layouts are size-limited on the server
- `/resetlayout` also clears the layout stored in the player's NUI
- `cachePlayerData`, `cacheDuration` and `MaxRequestsPerMinute` now work; removed options that did nothing
- Update check now uses xexstudio.com
- Minimap stays hidden while the menu is open even if a HUD keeps re-enabling it
- New local events `xex_pausemenu:opened` / `xex_pausemenu:closed` for HUD integrations
- Crypto account only shown when it has a balance (QB/QBox)
- New placeholder logo (SVG)
- Job shows its grade (e.g. `LSPD · Officer`)
- Phone number and session playtime rows in the player card (they were in the config but never displayed); lb-phone and npwd exports fixed, `ConfigSv.GetPhoneNumber` hook
- Weather shows its name instead of an invented temperature
- ESX: `OnlyCountOnDuty` respected on ESX Legacy 1.10+
- Font Awesome and Inter bundled in `web/vendor/` (no CDN needed)
- New default palette (graphite and lime) and 12 redesigned presets: Default, Midnight, Forest, Ember, Amethyst, Sunset, Arctic, Rosé, Mono, Synthwave, Cyberpunk and Light
- Preset cards show a live miniature in the preset's own colors
- `Config.UI.accentColor` now sets the accent of the Default preset
- Text on accent-colored badges and buttons switches between dark and white for contrast
- The menu slides left while the customizer is open, so the panel no longer covers the right column
- Spacing between customizer sections

### v2.0.0
- Complete rewrite with modern architecture
- Multi-framework support (ESX, QBCore, QBox)
- Advanced visual customizer
- 10 theme presets
- Weather display (icon + temperature)
- 12 language support
- ox_lib integration
- Enhanced report system
- Performance optimizations

---


## License

This is commercial software. See [LICENSE](LICENSE) for terms.

**Restrictions:**
- Single server use only
- No redistribution
- No resale
- No source sharing

© 2024-2026 XeX Development. All rights reserved.
