diff --git a/[esx_addons]/esx_accessories/client/main.lua b/[esx_addons]/esx_accessories/client/main.lua index 8d7a5d32..d2ed1156 100644 --- a/[esx_addons]/esx_accessories/client/main.lua +++ b/[esx_addons]/esx_accessories/client/main.lua @@ -1,6 +1,4 @@ -local HasAlreadyEnteredMarker = false -local LastZone, CurrentAction, CurrentActionMsg -local CurrentActionData = {} +local show_text = false function OpenAccessoryMenu() local elements = { @@ -104,33 +102,13 @@ function OpenShopMenu(accessory) ESX.CloseContext() end - CurrentAction = 'shop_menu' - CurrentActionMsg = TranslateCap('press_access') - CurrentActionData = {} end, function(menu) - CurrentAction = 'shop_menu' - CurrentActionMsg = TranslateCap('press_access') - CurrentActionData = {} end) end, function(data, menu) menu.close() - CurrentAction = 'shop_menu' - CurrentActionMsg = TranslateCap('press_access') - CurrentActionData = {} end, restrict) end -AddEventHandler('esx_accessories:hasEnteredMarker', function(zone) - CurrentAction = 'shop_menu' - CurrentActionMsg = TranslateCap('press_access') - CurrentActionData = { accessory = zone } -end) - -AddEventHandler('esx_accessories:hasExitedMarker', function(zone) - ESX.CloseContext() - CurrentAction = nil -end) - -- Create Blips -- CreateThread(function() for k,v in pairs(Config.ShopsBlips) do @@ -152,74 +130,44 @@ CreateThread(function() end end) -local nearMarker = false --- Display markers CreateThread(function() while true do - local sleep = 1500 - local coords = GetEntityCoords(PlayerPedId()) + local interval = true + local playerCoords = GetEntityCoords(PlayerPedId()) + local isInMarker = false + for k,v in pairs(Config.Zones) do for i = 1, #v.Pos, 1 do - if(Config.Type ~= -1 and #(coords - v.Pos[i]) < Config.DrawDistance) then + local distance = #(playerCoords - v.Pos[i]) + + if Config.Type ~= -1 and distance < Config.DrawDistance then DrawMarker(Config.Type, v.Pos[i], 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.Size.x, Config.Size.y, Config.Size.z, Config.Color.r, Config.Color.g, Config.Color.b, 255, true, false, 2, true, false, false, false) - sleep = 0 - break + interval = false end - end - end - if sleep == 0 then nearMarker = true else nearMarker = false end - Wait(sleep) - end -end) - -CreateThread(function() - while true do - local sleep = 1500 - if nearMarker then - sleep = 0 - local coords = GetEntityCoords(PlayerPedId()) - local isInMarker = false - local currentZone = nil - for k,v in pairs(Config.Zones) do - for i = 1, #v.Pos, 1 do - if #(coords - v.Pos[i]) < Config.Size.x then - isInMarker = true - currentZone = k - break + + if distance < Config.Size.x then + isInMarker = true + interval = false + if IsControlJustReleased(0, 38) then + OpenShopMenu(k) end end end - - if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then - HasAlreadyEnteredMarker = true - LastZone = currentZone - TriggerEvent('esx_accessories:hasEnteredMarker', currentZone) - end - - if not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_accessories:hasExitedMarker', LastZone) - end end - Wait(sleep) - end -end) - --- Key controls -CreateThread(function() - while true do - local Sleep = 1500 - if CurrentAction then - Sleep = 0 - ESX.ShowHelpNotification(CurrentActionMsg) - - if IsControlJustReleased(0, 38) and CurrentActionData.accessory then - OpenShopMenu(CurrentActionData.accessory) - CurrentAction = nil - end + if isInMarker and not show_text then + ESX.TextUI(TranslateCap('press_access')) + show_text = true + elseif not isInMarker and show_text then + ESX.HideUI() + show_text = false + end + + if interval then + Wait(500) + else + Wait(0) end - Wait(Sleep) end end) @@ -229,4 +177,4 @@ if Config.EnableControls then OpenAccessoryMenu() end end) -end +end \ No newline at end of file diff --git a/[esx_addons]/esx_accessories/locales/cs.lua b/[esx_addons]/esx_accessories/locales/cs.lua index 7145d462..552ef4ca 100644 --- a/[esx_addons]/esx_accessories/locales/cs.lua +++ b/[esx_addons]/esx_accessories/locales/cs.lua @@ -16,5 +16,5 @@ Locales ['cs'] = { ['no_helmet'] = 'nemáte helmu', ['no_mask'] = 'nemáte masku', ['you_paid'] = 'zaplatili jste $%s', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Otevřít nabídku doplňků', } diff --git a/[esx_addons]/esx_accessories/locales/es.lua b/[esx_addons]/esx_accessories/locales/es.lua index d7e1a9f8..2455bbd7 100644 --- a/[esx_addons]/esx_accessories/locales/es.lua +++ b/[esx_addons]/esx_accessories/locales/es.lua @@ -16,5 +16,5 @@ Locales ['es'] = { ['no_helmet'] = 'No tienes ningún casco', ['no_mask'] = 'No tienes ninguna máscara', ['you_paid'] = 'Pagaste %s$', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Abrir menú de accesorios', } diff --git a/[esx_addons]/esx_accessories/locales/fi.lua b/[esx_addons]/esx_accessories/locales/fi.lua index dd47eb1e..d1143eff 100644 --- a/[esx_addons]/esx_accessories/locales/fi.lua +++ b/[esx_addons]/esx_accessories/locales/fi.lua @@ -16,5 +16,5 @@ Locales ['fi'] = { ['no_helmet'] = 'sinulla ei ole kypäriä', ['no_mask'] = 'sinulla ei ole maskeja', ['you_paid'] = 'sinä maksoit $%s', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Avaa asustevalikko', } diff --git a/[esx_addons]/esx_accessories/locales/hu.lua b/[esx_addons]/esx_accessories/locales/hu.lua index 051324e9..4cd9dfae 100644 --- a/[esx_addons]/esx_accessories/locales/hu.lua +++ b/[esx_addons]/esx_accessories/locales/hu.lua @@ -16,5 +16,5 @@ Locales ['hu'] = { ['no_helmet'] = 'Nincsen sapkád', ['no_mask'] = 'Nincsen maszkod', ['you_paid'] = 'Fizettél $%s', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Kiegészítő menü megnyitása', } diff --git a/[esx_addons]/esx_accessories/locales/nl.lua b/[esx_addons]/esx_accessories/locales/nl.lua index 16d0a640..ec23f927 100644 --- a/[esx_addons]/esx_accessories/locales/nl.lua +++ b/[esx_addons]/esx_accessories/locales/nl.lua @@ -16,5 +16,5 @@ Locales ['nl'] = { ['no_helmet'] = 'je hebt geen helm', ['no_mask'] = 'je hebt geen masker', ['you_paid'] = 'je betaalde €%s', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Accessoiremenu openen', } diff --git a/[esx_addons]/esx_accessories/locales/pl.lua b/[esx_addons]/esx_accessories/locales/pl.lua index 38a910c4..ebd1fa0d 100644 --- a/[esx_addons]/esx_accessories/locales/pl.lua +++ b/[esx_addons]/esx_accessories/locales/pl.lua @@ -16,5 +16,5 @@ Locales ['pl'] = { ['no_helmet'] = 'nie posiadasz nakrycia głowy', ['no_mask'] = 'nie posiadasz maski', ['you_paid'] = 'płacisz %s $', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Otwórz menu akcesoriów', } diff --git a/[esx_addons]/esx_accessories/locales/sl.lua b/[esx_addons]/esx_accessories/locales/sl.lua index a21ae745..67684534 100644 --- a/[esx_addons]/esx_accessories/locales/sl.lua +++ b/[esx_addons]/esx_accessories/locales/sl.lua @@ -16,5 +16,5 @@ Locales ['sl'] = { ['no_helmet'] = 'Vi nimate kape/klobuka', ['no_mask'] = 'Vi nimate maske!', ['you_paid'] = 'Vi ste plačali $%s', - ['keymap'] = 'Open Accessory Menu', --not translated + ['keymap'] = 'Odpri meni dodatkov' } diff --git a/[esx_addons]/esx_addonaccount/fxmanifest.lua b/[esx_addons]/esx_addonaccount/fxmanifest.lua index dbf78a30..af2ca5e2 100644 --- a/[esx_addons]/esx_addonaccount/fxmanifest.lua +++ b/[esx_addons]/esx_addonaccount/fxmanifest.lua @@ -1,23 +1,17 @@ -fx_version 'adamant' +fx_version 'cerulean' game 'gta5' +lua54 'yes' +use_fxv2_oal 'yes' author 'ESX-Framework' -description 'Allows resources to store account data, such as society funds' -lua54 'yes' -version '1.1' +description 'Allows resources to store account data, such as society funds.' +version '1.2' legacyversion '1.13.4' server_scripts { '@es_extended/imports.lua', '@oxmysql/lib/MySQL.lua', 'server/classes/addonaccount.lua', + 'server/database.lua', 'server/main.lua' } - -server_exports { - 'GetSharedAccount', - 'AddSharedAccount', - 'GetAccount' -} - -dependency 'es_extended' diff --git a/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua b/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua index f5fb4a62..0920f8ac 100644 --- a/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua +++ b/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua @@ -1,36 +1,64 @@ +---@class AddonAccount +---@field name string +---@field owner? string +---@field money number +---@field addMoney fun(amount: number): boolean +---@field removeMoney fun(amount: number): boolean +---@field setMoney fun(amount: number): boolean +---@field transferMoney fun(target: TransactionAccount, amount: number): boolean +---@field save function + +---@param name string +---@param owner? string +---@param money number +---@return AddonAccount function CreateAddonAccount(name, owner, money) - local self = {} + ---@diagnostic disable-next-line: missing-fields + local self = {} --[[@type AddonAccount]] - self.name = name + self.name = name self.owner = owner self.money = money function self.addMoney(amount) - self.money = self.money + amount - self.save() + self.money += amount + TriggerEvent('esx_addonaccount:addMoney', self.name, amount) + TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money) + return true end function self.removeMoney(amount) - self.money = self.money - amount - self.save() + if amount > self.money then return false end + + self.money -= amount + TriggerEvent('esx_addonaccount:removeMoney', self.name, amount) + TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money) + return true end function self.setMoney(amount) self.money = amount - self.save() + TriggerEvent('esx_addonaccount:setMoney', self.name, amount) + TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money) + return true end - function self.save() - if self.owner == nil then - MySQL.update('UPDATE addon_account_data SET money = ? WHERE account_name = ?', { self.money, self.name }) - else - MySQL.update('UPDATE addon_account_data SET money = ? WHERE account_name = ? AND owner = ?', - { self.money, self.name, self.owner }) + function self.transferMoney(target, amount) + local targetAccount = GetTransactionAccount(target) + if not targetAccount then return false end + + if not self.removeMoney(amount) then + return false end - TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money) + + targetAccount.addMoney(amount) + return true + end + + function self.save() end return self diff --git a/[esx_addons]/esx_addonaccount/server/database.lua b/[esx_addons]/esx_addonaccount/server/database.lua new file mode 100644 index 00000000..08e6126e --- /dev/null +++ b/[esx_addons]/esx_addonaccount/server/database.lua @@ -0,0 +1,63 @@ +Database = {} + +---@class DatabaseAccountRow +---@field name string +---@field label string +---@field shared number +---@field id number +---@field account_name? string +---@field money number +---@field owner? string + +---@param name string +---@param owner string +---@return DatabaseAccountRow? +function Database.fetchAccount(name, owner) + local accountData = MySQL.single.await([[ + SELECT * FROM addon_account aa + LEFT JOIN addon_account_data aad ON aa.name = aad.account_name + WHERE aa.shared = 0 AND aa.name = ? AND aad.owner = ? + ]], { name, owner }) + + return accountData +end + +---@param name string +---@return DatabaseAccountRow? +function Database.fetchSharedAccount(name) + local accountData = MySQL.single.await([[ + SELECT * FROM addon_account aa + LEFT JOIN addon_account_data aad ON aa.name = aad.account_name + WHERE aa.shared = 1 AND aa.name = ? + ]], { name }) + + return accountData +end + +function Database.saveAccounts() + -- Save accounts that are not shared + local params, n = {}, 0 + for _, accountData in pairs(Accounts) do + for owner, account in pairs(accountData) do + n += 1 + params[n] = { account.money, account.name, owner } + end + end + + if n > 0 then + MySQL.prepare.await([[ + UPDATE addon_account_data SET money = ? WHERE account_name = ? AND owner = ?; + ]], params) + end + + -- Save shared accounts + params, n = {}, 0 + for _, account in pairs(SharedAccounts) do + n += 1 + params[n] = { account.money, account.name, nil } + end + + MySQL.prepare.await([[ + UPDATE addon_account_data SET money = ? WHERE account_name = ?; + ]], params) +end diff --git a/[esx_addons]/esx_addonaccount/server/main.lua b/[esx_addons]/esx_addonaccount/server/main.lua index d4ef91d8..978fa660 100644 --- a/[esx_addons]/esx_addonaccount/server/main.lua +++ b/[esx_addons]/esx_addonaccount/server/main.lua @@ -1,140 +1,228 @@ -local AccountsIndex, Accounts, SharedAccounts = {}, {}, {} - -AddEventHandler('onResourceStart', function(resourceName) - if resourceName == GetCurrentResourceName() then - local accounts = MySQL.query.await( - 'SELECT * FROM addon_account LEFT JOIN addon_account_data ON addon_account.name = addon_account_data.account_name UNION SELECT * FROM addon_account RIGHT JOIN addon_account_data ON addon_account.name = addon_account_data.account_name') - - local newAccounts = {} - for i = 1, #accounts do - local account = accounts[i] - if account.shared == 0 then - if not Accounts[account.name] then - AccountsIndex[#AccountsIndex + 1] = account.name - Accounts[account.name] = {} - end - Accounts[account.name][#Accounts[account.name] + 1] = CreateAddonAccount(account.name, account.owner, - account.money) - else - if account.money then - SharedAccounts[account.name] = CreateAddonAccount(account.name, nil, account.money) - else - newAccounts[#newAccounts + 1] = { account.name, 0 } - end - end - end - GlobalState.SharedAccounts = SharedAccounts - - if next(newAccounts) then - MySQL.prepare('INSERT INTO addon_account_data (account_name, money) VALUES (?, ?)', newAccounts) - for i = 1, #newAccounts do - local newAccount = newAccounts[i] - SharedAccounts[newAccount[1]] = CreateAddonAccount(newAccount[1], nil, 0) - end - GlobalState.SharedAccounts = SharedAccounts - end - end -end) +Accounts, SharedAccounts = {}, {} + +---@param name string +---@param owner string +---@return AddonAccount? +local function getAccount(name, owner) + local existingAccount = Accounts[name]?[owner] + if existingAccount then + return existingAccount + end + + local dbAccount = Database.fetchAccount(name, owner) + if not dbAccount then return end + + if not Accounts[name] then + Accounts[name] = {} + end + + Accounts[name][owner] = CreateAddonAccount(name, owner, dbAccount.money) + + return Accounts[name][owner] +end + +---@param name string +---@return AddonAccount? +local function getSharedAccount(name) + local existingAccount = SharedAccounts[name] + if existingAccount then + return existingAccount + end + + local dbAccount = Database.fetchSharedAccount(name) + if not dbAccount then return end + + local money = dbAccount.money + SharedAccounts[name] = CreateAddonAccount(name, nil, money or 0) + + if not money then + MySQL.prepare.await('INSERT INTO addon_account_data (account_name, money) VALUES (?, ?)', { name, 0 }) + end + + GlobalState.SharedAccounts = SharedAccounts + + return SharedAccounts[name] +end + +---@param society { name: string, label: string } +---@param amount? number +---@return AddonAccount? +local function addSharedAccount(society, amount) + local societyName, societyLabel = society?.name, society?.label + if not societyName or not societyLabel then return end + + local existingSharedAccount = getSharedAccount(societyName) + if existingSharedAccount then return existingSharedAccount end + + local account = MySQL.insert.await('INSERT INTO `addon_account` (name, label, shared) VALUES (?, ?, ?)', { societyName, societyLabel, 1 }) + if not account then return end + + amount = amount or 0 + local accountData = MySQL.insert.await('INSERT INTO `addon_account_data` (account_name, money) VALUES (?, ?)', { + societyName, amount + }) + if not accountData then return end + + SharedAccounts[societyName] = CreateAddonAccount(societyName, nil, amount) + + GlobalState.SharedAccounts = SharedAccounts -function GetAccount(name, owner) - for i = 1, #Accounts[name], 1 do - if Accounts[name][i].owner == owner then - return Accounts[name][i] - end - end + return SharedAccounts[societyName] end -function GetSharedAccount(name) - return SharedAccounts[name] +---@param name string +---@param owner string +---@param amount number +local function addAccountMoney(name, owner, amount) + local account = getAccount(name, owner) + if not account then return end + + account.addMoney(amount) +end + +---@param name string +---@param owner string +---@param amount number +local function removeAccountMoney(name, owner, amount) + local account = getAccount(name, owner) + if not account then return end + + account.removeMoney(amount) end -function AddSharedAccount(society, amount) - -- society.name = job_name/society_name - -- society.label = label for the job/account - -- amount = if the shared account should start with x amount - if type(society) ~= 'table' or not society?.name or not society?.label then return end +---@param name string +---@param owner string +---@param amount number +local function setAccountMoney(name, owner, amount) + local account = getAccount(name, owner) + if not account then return end - -- check if account already exist? - if SharedAccounts[society.name] ~= nil then return SharedAccounts[society.name] end + account.setMoney(amount) +end - -- addon account: - local account = MySQL.insert.await('INSERT INTO `addon_account` (name, label, shared) VALUES (?, ?, ?)', { - society.name, society.label, 1 - }) - if not account then return end +---@param name string +---@param amount number +local function addSharedAccountMoney(name, amount) + local account = getSharedAccount(name) + if not account then return end - -- if addon account inserted, insert addon account data: - local account_data = MySQL.insert.await('INSERT INTO `addon_account_data` (account_name, money) VALUES (?, ?)', { - society.name, (amount or 0) - }) - if not account_data then return end + account.addMoney(amount) +end - -- if all data inserted successfully to sql: - SharedAccounts[society.name] = CreateAddonAccount(society.name, nil, (amount or 0)) +---@param name string +---@param amount number +local function removeSharedAccountMoney(name, amount) + local account = getSharedAccount(name) + if not account then return end - return SharedAccounts[society.name] + account.removeMoney(amount) end +---@param name string +---@param amount number +local function setSharedAccountMoney(name, amount) + local account = getSharedAccount(name) + if not account then return end + + account.setMoney(amount) +end + +---@alias TransactionAccount { name: string, owner?: string }|string + +---@param accountData TransactionAccount +---@return AddonAccount? +function GetTransactionAccount(accountData) + if type(accountData) == "string" then + return getSharedAccount(accountData) + end + + if accountData.owner then + return getAccount(accountData.name, accountData.owner) + else + return getSharedAccount(accountData.name) + end +end + +---@param sender TransactionAccount +---@param receiver TransactionAccount +---@param amount number +---@return boolean, string +local function transferMoney(sender, receiver, amount) + local senderAccount, receiverAccount = GetTransactionAccount(sender), GetTransactionAccount(receiver) + if not senderAccount or not receiverAccount then return false, 'invalid_account' end + + if not senderAccount.removeMoney(amount) then + return false, 'insufficient_funds' + end + + receiverAccount.addMoney(amount) + + return true, 'success' +end + +AddEventHandler('esx:playerLoaded', function(_, xPlayer) + local addonAccounts = {} + + local identifier = xPlayer.getIdentifier() + for _, accountName in pairs(Accounts) do + local account = getAccount(accountName, identifier) + + if not account then + MySQL.insert.await('INSERT INTO addon_account_data (account_name, money, owner) VALUES (?, ?, ?)', + { accountName, 0, identifier }) + + account = CreateAddonAccount(accountName, identifier, 0) + + Accounts[accountName][identifier] = account + end + + addonAccounts[#addonAccounts + 1] = account + end + + xPlayer.set('addonAccounts', addonAccounts) +end) + +---@param name string +---@param owner string +---@param cb function AddEventHandler('esx_addonaccount:getAccount', function(name, owner, cb) - cb(GetAccount(name, owner)) + cb(getAccount(name, owner)) end) +---@param name string +---@param cb function AddEventHandler('esx_addonaccount:getSharedAccount', function(name, cb) - cb(GetSharedAccount(name)) + cb(getSharedAccount(name)) +end) + +AddEventHandler('txAdmin:events:scheduledRestart', function(eventData) + if eventData.secondsRemaining == 60 then + CreateThread(function() + Wait(50000) + Database.saveAccounts() + end) + end end) -AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) - local addonAccounts = {} +AddEventHandler('onResourceStop', function(resource) + if resource == GetCurrentResourceName() then + Database.saveAccounts() + end +end) - for i = 1, #AccountsIndex, 1 do - local name = AccountsIndex[i] - local account = GetAccount(name, xPlayer.identifier) +AddEventHandler('txAdmin:events:serverShuttingDown', Database.saveAccounts) - if account == nil then - MySQL.insert('INSERT INTO addon_account_data (account_name, money, owner) VALUES (?, ?, ?)', - { name, 0, xPlayer.identifier }) +exports('GetSharedAccount', getSharedAccount) +exports('GetAccount', getAccount) - account = CreateAddonAccount(name, xPlayer.identifier, 0) - Accounts[name][#Accounts[name] + 1] = account - end +exports('AddSharedAccount', addSharedAccount) - addonAccounts[#addonAccounts + 1] = account - end +exports('AddAccountMoney', addAccountMoney) +exports('RemoveAccountMoney', removeAccountMoney) +exports('SetAccountMoney', setAccountMoney) - xPlayer.set('addonAccounts', addonAccounts) -end) +exports('AddSharedAccountMoney', addSharedAccountMoney) +exports('RemoveSharedAccountMoney', removeSharedAccountMoney) +exports('SetSharedAccountMoney', setSharedAccountMoney) -RegisterNetEvent('esx_addonaccount:refreshAccounts') -AddEventHandler('esx_addonaccount:refreshAccounts', function() - local addonAccounts = MySQL.query.await('SELECT * FROM addon_account') - - for i = 1, #addonAccounts, 1 do - local name = addonAccounts[i].name - local shared = addonAccounts[i].shared - - local addonAccountData = MySQL.query.await('SELECT * FROM addon_account_data WHERE account_name = ?', { name }) - - if shared == 0 then - table.insert(AccountsIndex, name) - Accounts[name] = {} - - for j = 1, #addonAccountData, 1 do - local addonAccount = CreateAddonAccount(name, addonAccountData[j].owner, addonAccountData[j].money) - table.insert(Accounts[name], addonAccount) - end - else - local money = nil - - if #addonAccountData == 0 then - MySQL.insert('INSERT INTO addon_account_data (account_name, money, owner) VALUES (?, ?, ?)', - { name, 0, nil }) - money = 0 - else - money = addonAccountData[1].money - end - - local addonAccount = CreateAddonAccount(name, nil, money) - SharedAccounts[name] = addonAccount - end - end -end) +exports('TransferMoney', transferMoney) diff --git a/[esx_addons]/esx_dmvschool/client/main.lua b/[esx_addons]/esx_dmvschool/client/main.lua index 719cce1c..e0225ee9 100644 --- a/[esx_addons]/esx_dmvschool/client/main.lua +++ b/[esx_addons]/esx_dmvschool/client/main.lua @@ -186,11 +186,13 @@ AddEventHandler('esx_dmvschool:hasEnteredMarker', function(zone) CurrentActionMsg = TranslateCap('press_open_menu') CurrentActionData = {} end + ESX.TextUI(CurrentActionMsg) end) AddEventHandler('esx_dmvschool:hasExitedMarker', function(zone) CurrentAction = nil ESX.CloseContext() + ESX.HideUI() end) RegisterNetEvent('esx_dmvschool:loadLicenses') @@ -277,7 +279,6 @@ CreateThread(function() if CurrentAction then sleep = 0 - ESX.ShowHelpNotification(CurrentActionMsg) if (IsControlJustReleased(0, 38)) and (CurrentAction == 'dmvschool_menu') then OpenDMVSchoolMenu() diff --git a/[esx_addons]/esx_garage/client/main.lua b/[esx_addons]/esx_garage/client/main.lua index bdc4d1ec..e5655132 100644 --- a/[esx_addons]/esx_garage/client/main.lua +++ b/[esx_addons]/esx_garage/client/main.lua @@ -242,8 +242,8 @@ CreateThread(function() SendNUIMessage({ showMenu = true, type = 'garage', - vehiclesList = {json.encode(vehiclesList)}, - vehiclesImpoundedList = {json.encode(vehiclesImpoundedList)}, + vehiclesList = json.encode(vehiclesList), + vehiclesImpoundedList = json.encode(vehiclesImpoundedList), poundName = v.ImpoundedName, poundSpawnPoint = poundSpawnPoint, spawnPoint = spawnPoint, @@ -260,7 +260,7 @@ CreateThread(function() SendNUIMessage({ showMenu = true, type = 'garage', - vehiclesList = {json.encode(vehiclesList)}, + vehiclesList = json.encode(vehiclesList), spawnPoint = spawnPoint, locales = { action = TranslateCap('veh_exit'), @@ -301,7 +301,7 @@ CreateThread(function() SendNUIMessage({ showMenu = true, type = 'garage', - vehiclesImpoundedList = {json.encode(vehiclesImpoundedList)}, + vehiclesImpoundedList = json.encode(vehiclesImpoundedList), poundName = v.ImpoundedName, poundSpawnPoint = poundSpawnPoint, locales = { @@ -390,7 +390,7 @@ CreateThread(function() SendNUIMessage({ showMenu = true, type = 'impound', - vehiclesList = {json.encode(vehiclesList)}, + vehiclesList = json.encode(vehiclesList), spawnPoint = spawnPoint, poundCost = v.Cost, locales = { diff --git a/[esx_addons]/esx_garage/fxmanifest.lua b/[esx_addons]/esx_garage/fxmanifest.lua index f9896fbf..82fe687e 100644 --- a/[esx_addons]/esx_garage/fxmanifest.lua +++ b/[esx_addons]/esx_garage/fxmanifest.lua @@ -8,13 +8,11 @@ version '1.0' legacyversion '1.13.4' lua54 'yes' +ui_page 'nui/index.html' +files { 'nui/index.html', 'nui/**/*' } shared_script '@es_extended/imports.lua' server_scripts { '@es_extended/locale.lua', 'locales/*.lua', '@oxmysql/lib/MySQL.lua', 'config.lua', 'server/main.lua' } client_scripts { '@es_extended/locale.lua', 'locales/*.lua', 'config.lua', 'client/main.lua' } - -ui_page 'nui/ui.html' - -files { 'nui/ui.html', 'nui/js/*.js', 'nui/css/*.css', 'nui/roboto.ttf' } diff --git a/[esx_addons]/esx_garage/nui/css/app.css b/[esx_addons]/esx_garage/nui/css/app.css deleted file mode 100644 index 7fa3eca6..00000000 --- a/[esx_addons]/esx_garage/nui/css/app.css +++ /dev/null @@ -1,279 +0,0 @@ -@font-face { - font-family: roboto; - src: url("../roboto.ttf"); -} - -body { - width: 100%; - height: 100%; - overflow: hidden; - font-family: roboto; -} - -#cursor { - position: absolute; - z-index: 999999; - display: none; -} - -#container { - position: absolute; - background: #232934; - border-radius: 10px; - border-top: 20px solid #353e4f; - height: 700px; - width: 1000px; - top: 40%; - left: 40%; - margin: -250px 0 0 -300px; - cursor: default; - display: flex; - flex-direction: unset; -} - -#header { - color: white; - font-size: 44px; - border-radius: 0px 0px 0px 10px; - background: #353e4f; - display: flex; - justify-content: space-between; - flex-direction: column; - align-items: baseline; -} - -#header .title { - padding: 50px; -} - -#header ul { - font-size: 15px; - margin-top: -150px; - padding: 0px; - list-style-type: none; -} - -#header li { - cursor: pointer; - padding: 15px; - width: 296px; -} - -#header li:hover { - font-weight: bold; - background-color: rgba(0, 0, 0, 0.356); - border-right: 3px solid #7186ad; -} -#header li.selected { - font-weight: bold; - background-color: rgba(0, 0, 0, 0.356); - border-right: 3px solid #7186ad; -} - -#header .close { - float: right; - text-align: center; - color: #b90000; - font-size: 20px; - font-weight: bold; - padding: 5px 5px; - background: #00000026; - border: 1px solid #00000026; - border-radius: 3px; - cursor: pointer; - border-radius: 50%; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - height: 25px; - width: 25px; - margin: 30px 144px; -} - -#header .close:hover { - color: #df3d3d; - background: #00000041; -} - -.clear-both { - clear: both; -} - -#menu { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.right-side { - width: 50%; -} - -.content { - width: 100%; - margin: 20px; - color: white; - height: 655px; - overflow-y: auto; - -ms-overflow-style: none; /* IE and Edge */ - scrollbar-width: none; /* Firefox */ -} - -.content h2 { - width: 290px; - height: 290px; - position: absolute; - top: 50%; - left: 55%; - margin: -25px 0 0 -25px; - text-align: center; -} - -.content::-webkit-scrollbar { - display: none; -} - -.impounded_content { - display: none; - width: 100%; - margin: 20px; - color: white; - height: 655px; - overflow-y: auto; - -ms-overflow-style: none; /* IE and Edge */ - scrollbar-width: none; /* Firefox */ -} - -.impounded_content h2 { - width: 290px; - height: 290px; - position: absolute; - top: 50%; - left: 55%; - margin: -25px 0 0 -25px; - text-align: center; -} - -.impounded_content::-webkit-scrollbar { - display: none; -} - -.webgl { - position: fixed; - left: 0; - top: 0; - outline: none; -} - -.content .vehicle-header { - display: flex; - justify-content: space-between; - padding: 5px 20px; -} - -.group { - margin: 20px; - color: white; - display: flex; - flex-direction: column; - margin-bottom: 20px; - padding: 10px; - border: solid #353e4f 2px; - border-radius: 10px; -} - -.group > button { - color: white; - width: 50%; - padding: 12px 20px; - margin: 8px 0; - border: 1px solid #353e4f; - border-radius: 4px; - background-color: #353e4f; -} - -.group > input { - color: white; - width: 100%; - padding: 12px 20px; - margin: 8px 0; - background-color: #353e4f; - border: none; - border-radius: 4px; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; -} - -.group > input::-webkit-outer-spin-button, -input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} - -.vehicle-listing { - display: inline-block; - flex-direction: row; - border: 1px solid #353e4f; - border-left: 5px solid #353e4f; - border-radius: 3px; - margin: 5px; - padding: 20px 35px; - font-size: 18px; - text-align: center; - width: 229px; -} - -.vehicle-listing div { - display: flow-root; - justify-content: space-between; - align-content: space-between; -} - -.vehicle-listing strong { - display: inline-block; -} - -.vehicle-listing:hover { - background: #353e4f; - border: 1px solid #353e4f; - border-left: 5px solid #353e4f; -} - -.unstyled-button { - padding: 0; - border: none; - background: none; - outline: none; -} - -.vehicle-action { - background: linear-gradient(to bottom, #77b55a 5%, #72b352 100%); - background-color: #77b55a; - border-radius: 3px; - border: 1px solid #4b8f29; - display: inline-block; - cursor: pointer; - color: #ffffff; - font-size: 17px; - font-weight: bold; - padding: 20px 30px; - margin: 15px; - text-shadow: -1px 1px 2px #00000026; -} - -.vehicle-action:hover { - background: linear-gradient(to bottom, #72b352 5%, #77b55a 100%); - background-color: #72b352; -} - -.vehicle-action.red { - border: 1px solid #8f2929; - background: linear-gradient(to bottom, #b55a5a 5%, #b35252 100%); - background-color: #b55a5a; -} - -.vehicle-action.red:hover { - border: 1px solid #8f2c29; - background: linear-gradient(to bottom, #b55a5a 5%, #b35852 100%); - background-color: #b55a5a; -} diff --git a/[esx_addons]/esx_garage/nui/css/index.css b/[esx_addons]/esx_garage/nui/css/index.css new file mode 100644 index 00000000..2ceee44a --- /dev/null +++ b/[esx_addons]/esx_garage/nui/css/index.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}}@font-face{font-family:Roboto;src:url(../fonts/roboto.ttf)format("truetype");font-display:swap}:root{--brand:#fb9b04;--darkest:#161616;--dark:#252525;--mid:#383838;--light:#969696;--lightest:#f2f2f2;--toolbar-h:50px;--radius-lg:16px;--radius-md:12px;--radius-sm:8px;--shadow-1:0 10px 30px #00000059;--shadow-2:0 6px 18px #00000040;--transition-fast:.16s cubic-bezier(.2,.7,.2,1);--transition-med:.26s cubic-bezier(.2,.7,.2,1)}html,body{background:0 0;width:100%;height:100%}body{color:var(--lightest);background:0 0;margin:0;font:500 14px/1.45 Roboto,system-ui,-apple-system,Segoe UI,Arial,sans-serif;overflow:hidden}#container{background:linear-gradient(180deg,var(--dark),var(--darkest));border-radius:var(--radius-lg);width:min(1000px,100vw - 64px);height:min(700px,100vh - 64px);box-shadow:var(--shadow-1);border:1px solid #ffffff0f;grid-template-rows:1fr;grid-template-columns:280px 1fr;display:none;position:absolute;top:50%;left:50%;overflow:hidden;transform:translate(-50%,-50%)}#container[style*="display:grid"]{display:grid!important}#container:before{content:"";z-index:0;background:linear-gradient(90deg,#fb9b043d,#0000 40%),linear-gradient(#ffffff0f,#0000);border-bottom:1px solid #ffffff0f;height:56px;position:absolute;top:0;left:0;right:0}#header{grid-column:1/2;padding-top:56px;position:relative}#header .title{letter-spacing:.2px;color:var(--lightest);z-index:1;padding:18px 20px 10px;font-size:20px;font-weight:700}#header .close{width:36px;height:36px;color:var(--lightest);cursor:pointer;transition:transform var(--transition-fast),background var(--transition-fast),border-color var(--transition-fast);background:#ffffff0f;border:1px solid #ffffff14;border-radius:50%;place-items:center;font-size:18px;display:grid;position:absolute;top:28px;right:14px;transform:translateY(-50%)}#header .close:hover{background:#fb9b0426;border-color:#fb9b0459}#header ul{z-index:1;flex-direction:column;gap:6px;margin:8px 0 0;padding:10px 8px 8px 12px;list-style:none;display:flex}#header li{cursor:pointer;box-sizing:border-box;width:100%;color:var(--lightest);border-radius:var(--radius-md);transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast);border:1px solid #0000;align-items:center;gap:10px;padding:12px 0 12px 22px;display:flex;position:relative}#header li:before{content:"";background:0 0;border-radius:4px;width:4px;height:60%;position:absolute;top:50%;left:6px;transform:translateY(-50%)}#header li:hover{background:#38383873;border-color:#ffffff14}#header li.selected{color:var(--lightest);background:#38383899;border-color:#fb9b0473}#header li.selected:before{background:var(--brand)}#menu{box-sizing:border-box;flex-direction:column;grid-column:2/-1;height:100%;min-height:0;padding-top:56px;padding-left:8px;display:flex;overflow:hidden}.content,.impounded_content{width:100%;min-height:0;color:var(--lightest);flex-direction:column;flex:auto;display:flex;overflow:hidden}.content .empty,.impounded_content .empty{opacity:.7;text-align:center;margin-top:18vh;font-weight:500}.content .vehicle-list,.impounded_content .vehicle-list{-ms-overflow-style:none;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;min-height:0;height:calc(100% - var(--toolbar-h));box-sizing:border-box;flex:1;grid-template-columns:repeat(2,1fr);grid-auto-rows:auto;align-content:start;place-items:start stretch;gap:36px 12px;width:96%;max-width:96%;margin:0 auto;padding:10px 0 0;display:grid;overflow:hidden scroll}.content .vehicle-list:after,.impounded_content .vehicle-list:after{content:"";display:block}@media (max-width:820px){.content .vehicle-list,.impounded_content .vehicle-list{grid-template-columns:1fr}}.toolbar{box-sizing:border-box;width:96%;height:var(--toolbar-h);flex:none;align-items:center;margin:0 auto;padding:10px 0 0;display:flex;overflow:hidden}.toolbar input[type=search]{border-radius:var(--radius-sm);width:100%;height:100%;color:var(--lightest);background:#3838388c;border:1px solid #ffffff14;outline:none;flex:auto;padding:10px 12px;display:block}.toolbar input[type=search]::placeholder{color:#f2f2f28c}.toolbar input[type=search]:focus{border-color:#fb9b048c;box-shadow:0 0 0 3px #fb9b041f}.vehicle-listing{border-radius:var(--radius-md);box-sizing:border-box;z-index:0;width:100%;min-height:148px;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);background:linear-gradient(#38383873,#252525d9);border:1px solid #ffffff0f;flex-direction:column;gap:10px;padding:16px;display:flex;position:relative}.vehicle-listing:hover{box-shadow:var(--shadow-2);z-index:1;border-color:#fb9b0473}.vehicle-listing div{color:var(--lightest);justify-content:space-between;align-items:center;display:flex}.vehicle-listing strong{color:var(--lightest)}.condition{align-items:center;gap:8px;display:flex}.condition .bar{background:#ffffff14;border-radius:999px;flex:1;height:8px;overflow:hidden}.condition .fill{background:linear-gradient(90deg,#ffad2e,var(--brand));width:0%;height:100%;transition:width var(--transition-med);border-radius:999px}.condition .percent{display:inline-block}.unstyled-button{font:inherit;color:inherit;background:0 0;border:none;padding:0}.vehicle-action{border-radius:var(--radius-sm);color:var(--darkest);background:linear-gradient(180deg,#ffad2e,var(--brand));letter-spacing:.2px;cursor:pointer;transition:transform var(--transition-fast),box-shadow var(--transition-fast),background var(--transition-fast),border-color var(--transition-fast);border:1px solid #ffffff14;justify-content:center;align-self:stretch;align-items:center;gap:8px;padding:12px 14px;font-weight:700;display:inline-flex}.vehicle-action:hover{border-color:#fb9b048c;transform:translateY(-1px);box-shadow:0 6px 18px #fb9b0440}.vehicle-action.red{color:var(--lightest);background:linear-gradient(#d87070,#b35252);border-color:#ffffff14}.vehicle-action.red:hover{border-color:#b352528c;box-shadow:0 6px 18px #b3525240}.logo-left{filter:drop-shadow(0 4px 14px #00000059);-webkit-user-select:none;user-select:none;pointer-events:none;width:auto;height:32px;position:absolute;top:28px;left:16px;transform:translateY(-50%)}.content .vehicle-list,.impounded_content .vehicle-list{scrollbar-width:none}.content .vehicle-list::-webkit-scrollbar{width:0!important;height:0!important}.impounded_content .vehicle-list::-webkit-scrollbar{width:0!important;height:0!important}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}#header{position:static}#header .close{z-index:10;position:absolute;top:28px;right:14px}::selection{color:inherit;background:0 0}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}.logo[data-v-9a622185]{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo[data-v-9a622185]:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.vue[data-v-9a622185]:hover{filter:drop-shadow(0 0 2em #42b883aa)} diff --git a/[esx_addons]/esx_garage/nui/roboto.ttf b/[esx_addons]/esx_garage/nui/fonts/roboto.ttf similarity index 100% rename from [esx_addons]/esx_garage/nui/roboto.ttf rename to [esx_addons]/esx_garage/nui/fonts/roboto.ttf diff --git a/[esx_addons]/esx_garage/nui/img/logo.png b/[esx_addons]/esx_garage/nui/img/logo.png new file mode 100644 index 00000000..e08a82bf Binary files /dev/null and b/[esx_addons]/esx_garage/nui/img/logo.png differ diff --git a/[esx_addons]/esx_garage/nui/index.html b/[esx_addons]/esx_garage/nui/index.html new file mode 100644 index 00000000..f5230dce --- /dev/null +++ b/[esx_addons]/esx_garage/nui/index.html @@ -0,0 +1,13 @@ + + + + + + ESX + + + + +
+ + diff --git a/[esx_addons]/esx_garage/nui/js/app.js b/[esx_addons]/esx_garage/nui/js/app.js deleted file mode 100644 index 104a5cbe..00000000 --- a/[esx_addons]/esx_garage/nui/js/app.js +++ /dev/null @@ -1,230 +0,0 @@ -$(window).ready(function () { - window.addEventListener("message", function (event) { - let data = event.data; - - if (data.showMenu) { - $("#container").fadeIn(); - $("#menu").fadeIn(); - - if (data.type === "impound") { - $("#header ul").hide(); - } else { - $("#header ul").show(); - } - - if (data.vehiclesList != undefined) { - $("#container").data("spawnpoint", data.spawnPoint); - if (data.poundCost) $("#container").data("poundcost", data.poundCost); - - if (data.poundCost != undefined) { - $(".content .vehicle-list").html( - getVehicles(data.locales, data.vehiclesList, data.poundCost) - ); - } else { - $(".content .vehicle-list").html( - getVehicles(data.locales, data.vehiclesList) - ); - } - - $(".content h2").hide(); - } else { - $(".content h2").show(); - $(".content .vehicle-list").empty(); - } - - if (data.vehiclesImpoundedList != undefined) { - $(".impounded_content").data("poundName", data.poundName); - $(".impounded_content").data("poundSpawnPoint", data.poundSpawnPoint); - - if (data.poundCost) $("#container").data("poundcost", data.poundCost); - - $(".impounded_content .vehicle-list").html( - getImpoundedVehicles(data.locales, data.vehiclesImpoundedList) - ); - $(".impounded_content h2").hide(); - } else { - $(".impounded_content h2").show(); - $(".impounded_content .vehicle-list").empty(); - } - - // Locales - - // needs a rework - // $(".content h2").html(function (i, text) { - // return text.replace("No vehicle in this garage.", data.locales.no_veh_parking); - // }); - - // $(".impounded_content h2").html(function (i, text) { - // return text.replace("No vehicle impounded.", data.locales.no_veh_impounded); - // }); - - $(".vehicle-listing").html(function (i, text) { - return text.replace("Model", data.locales.veh_model); - }); - $(".vehicle-listing").html(function (i, text) { - return text.replace("Plate", data.locales.veh_plate); - }); - $(".vehicle-listing").html(function (i, text) { - return text.replace("Condition", data.locales.veh_condition); - }); - } else if (data.hideAll) { - $("#container").fadeOut(); - } - }); - - $("#container").hide(); - - $(".close").click(function (event) { - $("#container").hide(); - $.post("https://esx_garage/escape", "{}"); - - $(".impounded_content").hide(); - $(".content").show(); - $('li[data-page="garage"]').addClass("selected"); - $('li[data-page="impounded"]').removeClass("selected"); - }); - - document.onkeyup = function (data) { - if (data.which == 27) { - $.post("https://esx_garage/escape", "{}"); - - $(".impounded_content").hide(); - $(".content").show(); - $('li[data-page="garage"]').addClass("selected"); - $('li[data-page="impounded"]').removeClass("selected"); - } - }; - - function getVehicles(locale, vehicle, amount = null) { - let html = ""; - let vehicleData = JSON.parse(vehicle); - let bodyHealth = 1000; - let engineHealth = 1000; - let tankHealth = 1000; - let vehicleDamagePercent = ""; - - for (let i = 0; i < vehicleData.length; i++) { - bodyHealth = (vehicleData[i].props.bodyHealth / 1000) * 100; - engineHealth = (vehicleData[i].props.engineHealth / 1000) * 100; - tankHealth = (vehicleData[i].props.tankHealth / 1000) * 100; - - vehicleDamagePercent = - Math.round(((bodyHealth + engineHealth + tankHealth) / 300) * 100) + - "%"; - - html += "
"; - html += "
Model: " + vehicleData[i].model + "
"; - html += "
Plate: " + vehicleData[i].plate + "
"; - html += - "
Condition: " + vehicleDamagePercent + "
"; - html += - ""; - html += "
"; - } - - return html; - } - - function getImpoundedVehicles(locale, vehicle) { - let html = ""; - let vehicleData = JSON.parse(vehicle); - let bodyHealth = 1000; - let engineHealth = 1000; - let tankHealth = 1000; - let vehicleDamagePercent = ""; - - for (let i = 0; i < vehicleData.length; i++) { - bodyHealth = (vehicleData[i].props.bodyHealth / 1000) * 100; - engineHealth = (vehicleData[i].props.engineHealth / 1000) * 100; - tankHealth = (vehicleData[i].props.tankHealth / 1000) * 100; - - vehicleDamagePercent = - Math.round(((bodyHealth + engineHealth + tankHealth) / 300) * 100) + - "%"; - - html += "
"; - html += "
Model: " + vehicleData[i].model + "
"; - html += "
Plate: " + vehicleData[i].plate + "
"; - html += - "
Condition: " + vehicleDamagePercent + "
"; - html += - ""; - html += "
"; - } - - return html; - } - - $('li[data-page="garage"]').click(function (event) { - $(".impounded_content").hide(); - $(".content").show(); - $('li[data-page="garage"]').addClass("selected"); - $('li[data-page="impounded"]').removeClass("selected"); - }); - - $('li[data-page="impounded"]').click(function (event) { - $(".content").hide(); - $(".impounded_content").show(); - $('li[data-page="impounded"]').addClass("selected"); - $('li[data-page="garage"]').removeClass("selected"); - }); - - $(document).on( - "click", - "button[data-button='spawn'].vehicle-action", - function (event) { - let spawnPoint = $("#container").data("spawnpoint"); - let poundCost = $("#container").data("poundcost"); - let vehicleProps = $(this).data("vehprops"); - - // prevent empty cost - if (poundCost === undefined) poundCost = 0; - - $.post( - "https://esx_garage/spawnVehicle", - JSON.stringify({ - vehicleProps: vehicleProps, - spawnPoint: spawnPoint, - exitVehicleCost: poundCost, - }) - ); - - $(".impounded_content").hide(); - $(".content").show(); - $('li[data-page="garage"]').addClass("selected"); - $('li[data-page="impounded"]').removeClass("selected"); - } - ); - - $(document).on( - "click", - "button[data-button='impounded'].vehicle-action", - function (event) { - let vehicleProps = $(this).data("vehprops"); - let poundName = $(".impounded_content").data("poundName"); - let poundSpawnPoint = $(".impounded_content").data("poundSpawnPoint"); - $.post( - "https://esx_garage/impound", - JSON.stringify({ - vehicleProps: vehicleProps, - poundName: poundName, - poundSpawnPoint: poundSpawnPoint, - }) - ); - - $(".impounded_content").hide(); - $(".content").show(); - $('li[data-page="garage"]').addClass("selected"); - $('li[data-page="impounded"]').removeClass("selected"); - } - ); -}); diff --git a/[esx_addons]/esx_garage/nui/js/index.js b/[esx_addons]/esx_garage/nui/js/index.js new file mode 100644 index 00000000..2e11639d --- /dev/null +++ b/[esx_addons]/esx_garage/nui/js/index.js @@ -0,0 +1,17 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const r of i)if(r.type==="childList")for(const o of r.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const r={};return i.integrity&&(r.integrity=i.integrity),i.referrerPolicy&&(r.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?r.credentials="include":i.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(i){if(i.ep)return;i.ep=!0;const r=n(i);fetch(i.href,r)}})();/** +* @vue/shared v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Kn(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const K={},rt=[],Te=()=>{},Us=()=>!1,rn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Bn=e=>e.startsWith("onUpdate:"),re=Object.assign,Wn=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ki=Object.prototype.hasOwnProperty,j=(e,t)=>ki.call(e,t),M=Array.isArray,ot=e=>on(e)==="[object Map]",Ks=e=>on(e)==="[object Set]",R=e=>typeof e=="function",Y=e=>typeof e=="string",Ke=e=>typeof e=="symbol",q=e=>e!==null&&typeof e=="object",Bs=e=>(q(e)||R(e))&&R(e.then)&&R(e.catch),Ws=Object.prototype.toString,on=e=>Ws.call(e),Xi=e=>on(e).slice(8,-1),Gs=e=>on(e)==="[object Object]",Gn=e=>Y(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,xt=Kn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ln=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Zi=/-\w/g,Ve=ln(e=>e.replace(Zi,t=>t.slice(1).toUpperCase())),Qi=/\B([A-Z])/g,et=ln(e=>e.replace(Qi,"-$1").toLowerCase()),qs=ln(e=>e.charAt(0).toUpperCase()+e.slice(1)),yn=ln(e=>e?`on${qs(e)}`:""),ke=(e,t)=>!Object.is(e,t),Wt=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},In=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let fs;const cn=()=>fs||(fs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function fn(e){if(M(e)){const t={};for(let n=0;n{if(n){const s=n.split(tr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ut(e){let t="";if(Y(e))t=e;else if(M(e))for(let n=0;n!!(e&&e.__v_isRef===!0),te=e=>Y(e)?e:e==null?"":M(e)||q(e)&&(e.toString===Ws||!R(e.toString))?zs(e)?te(e.value):JSON.stringify(e,ks,2):String(e),ks=(e,t)=>zs(t)?ks(e,t.value):ot(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,i],r)=>(n[vn(s,r)+" =>"]=i,n),{})}:Ks(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>vn(n))}:Ke(t)?vn(t):q(t)&&!M(t)&&!Gs(t)?String(t):t,vn=(e,t="")=>{var n;return Ke(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ce;class or{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ce,!t&&ce&&(this.index=(ce.scopes||(ce.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ce=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(wt){let t=wt;for(wt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;St;){let t=St;for(St=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function ei(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function ti(e){let t,n=e.depsTail,s=n;for(;s;){const i=s.prevDep;s.version===-1?(s===n&&(n=i),Yn(s),cr(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=i}e.deps=t,e.depsTail=n}function Rn(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(ni(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function ni(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===At)||(e.globalVersion=At,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Rn(e))))return;e.flags|=2;const t=e.dep,n=G,s=ge;G=e,ge=!0;try{ei(e);const i=e.fn(e._value);(t.version===0||ke(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{G=n,ge=s,ti(e),e.flags&=-3}}function Yn(e,t=!1){const{dep:n,prevSub:s,nextSub:i}=e;if(s&&(s.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let r=n.computed.deps;r;r=r.nextDep)Yn(r,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function cr(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let ge=!0;const si=[];function Re(){si.push(ge),ge=!1}function Fe(){const e=si.pop();ge=e===void 0?!0:e}function us(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=G;G=void 0;try{t()}finally{G=n}}}let At=0;class fr{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class ii{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!G||!ge||G===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==G)n=this.activeLink=new fr(G,this),G.deps?(n.prevDep=G.depsTail,G.depsTail.nextDep=n,G.depsTail=n):G.deps=G.depsTail=n,ri(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=G.depsTail,n.nextDep=void 0,G.depsTail.nextDep=n,G.depsTail=n,G.deps===n&&(G.deps=s)}return n}trigger(t){this.version++,At++,this.notify(t)}notify(t){qn();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Jn()}}}function ri(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)ri(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Yt=new WeakMap,Xe=Symbol(""),Fn=Symbol(""),Pt=Symbol("");function Z(e,t,n){if(ge&&G){let s=Yt.get(e);s||Yt.set(e,s=new Map);let i=s.get(n);i||(s.set(n,i=new ii),i.map=s,i.key=n),i.track()}}function Pe(e,t,n,s,i,r){const o=Yt.get(e);if(!o){At++;return}const l=f=>{f&&f.trigger()};if(qn(),t==="clear")o.forEach(l);else{const f=M(e),h=f&&Gn(n);if(f&&n==="length"){const a=Number(s);o.forEach((p,m)=>{(m==="length"||m===Pt||!Ke(m)&&m>=a)&&l(p)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),h&&l(o.get(Pt)),t){case"add":f?h&&l(o.get("length")):(l(o.get(Xe)),ot(e)&&l(o.get(Fn)));break;case"delete":f||(l(o.get(Xe)),ot(e)&&l(o.get(Fn)));break;case"set":ot(e)&&l(o.get(Xe));break}}Jn()}function ur(e,t){const n=Yt.get(e);return n&&n.get(t)}function tt(e){const t=U(e);return t===e?t:(Z(t,"iterate",Pt),me(e)?t:t.map(ne))}function un(e){return Z(e=U(e),"iterate",Pt),e}const ar={__proto__:null,[Symbol.iterator](){return Sn(this,Symbol.iterator,ne)},concat(...e){return tt(this).concat(...e.map(t=>M(t)?tt(t):t))},entries(){return Sn(this,"entries",e=>(e[1]=ne(e[1]),e))},every(e,t){return Oe(this,"every",e,t,void 0,arguments)},filter(e,t){return Oe(this,"filter",e,t,n=>n.map(ne),arguments)},find(e,t){return Oe(this,"find",e,t,ne,arguments)},findIndex(e,t){return Oe(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Oe(this,"findLast",e,t,ne,arguments)},findLastIndex(e,t){return Oe(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Oe(this,"forEach",e,t,void 0,arguments)},includes(...e){return wn(this,"includes",e)},indexOf(...e){return wn(this,"indexOf",e)},join(e){return tt(this).join(e)},lastIndexOf(...e){return wn(this,"lastIndexOf",e)},map(e,t){return Oe(this,"map",e,t,void 0,arguments)},pop(){return mt(this,"pop")},push(...e){return mt(this,"push",e)},reduce(e,...t){return as(this,"reduce",e,t)},reduceRight(e,...t){return as(this,"reduceRight",e,t)},shift(){return mt(this,"shift")},some(e,t){return Oe(this,"some",e,t,void 0,arguments)},splice(...e){return mt(this,"splice",e)},toReversed(){return tt(this).toReversed()},toSorted(e){return tt(this).toSorted(e)},toSpliced(...e){return tt(this).toSpliced(...e)},unshift(...e){return mt(this,"unshift",e)},values(){return Sn(this,"values",ne)}};function Sn(e,t,n){const s=un(e),i=s[t]();return s!==e&&!me(e)&&(i._next=i.next,i.next=()=>{const r=i._next();return r.done||(r.value=n(r.value)),r}),i}const dr=Array.prototype;function Oe(e,t,n,s,i,r){const o=un(e),l=o!==e&&!me(e),f=o[t];if(f!==dr[t]){const p=f.apply(e,r);return l?ne(p):p}let h=n;o!==e&&(l?h=function(p,m){return n.call(this,ne(p),m,e)}:n.length>2&&(h=function(p,m){return n.call(this,p,m,e)}));const a=f.call(o,h,s);return l&&i?i(a):a}function as(e,t,n,s){const i=un(e);let r=n;return i!==e&&(me(e)?n.length>3&&(r=function(o,l,f){return n.call(this,o,l,f,e)}):r=function(o,l,f){return n.call(this,o,ne(l),f,e)}),i[t](r,...s)}function wn(e,t,n){const s=U(e);Z(s,"iterate",Pt);const i=s[t](...n);return(i===-1||i===!1)&&Xn(n[0])?(n[0]=U(n[0]),s[t](...n)):i}function mt(e,t,n=[]){Re(),qn();const s=U(e)[t].apply(e,n);return Jn(),Fe(),s}const hr=Kn("__proto__,__v_isRef,__isVue"),oi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ke));function pr(e){Ke(e)||(e=String(e));const t=U(this);return Z(t,"has",e),t.hasOwnProperty(e)}class li{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,r=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return r;if(n==="__v_raw")return s===(i?r?Cr:ai:r?ui:fi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=M(t);if(!i){let f;if(o&&(f=ar[n]))return f;if(n==="hasOwnProperty")return pr}const l=Reflect.get(t,n,X(t)?t:s);if((Ke(n)?oi.has(n):hr(n))||(i||Z(t,"get",n),r))return l;if(X(l)){const f=o&&Gn(n)?l:l.value;return i&&q(f)?Nn(f):f}return q(l)?i?Nn(l):an(l):l}}class ci extends li{constructor(t=!1){super(!1,t)}set(t,n,s,i){let r=t[n];if(!this._isShallow){const f=Ze(r);if(!me(s)&&!Ze(s)&&(r=U(r),s=U(s)),!M(t)&&X(r)&&!X(s))return f||(r.value=s),!0}const o=M(t)&&Gn(n)?Number(n)e,Vt=e=>Reflect.getPrototypeOf(e);function yr(e,t,n){return function(...s){const i=this.__v_raw,r=U(i),o=ot(r),l=e==="entries"||e===Symbol.iterator&&o,f=e==="keys"&&o,h=i[e](...s),a=n?Ln:t?zt:ne;return!t&&Z(r,"iterate",f?Fn:Xe),{next(){const{value:p,done:m}=h.next();return m?{value:p,done:m}:{value:l?[a(p[0]),a(p[1])]:a(p),done:m}},[Symbol.iterator](){return this}}}}function Ut(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vr(e,t){const n={get(i){const r=this.__v_raw,o=U(r),l=U(i);e||(ke(i,l)&&Z(o,"get",i),Z(o,"get",l));const{has:f}=Vt(o),h=t?Ln:e?zt:ne;if(f.call(o,i))return h(r.get(i));if(f.call(o,l))return h(r.get(l));r!==o&&r.get(i)},get size(){const i=this.__v_raw;return!e&&Z(U(i),"iterate",Xe),i.size},has(i){const r=this.__v_raw,o=U(r),l=U(i);return e||(ke(i,l)&&Z(o,"has",i),Z(o,"has",l)),i===l?r.has(i):r.has(i)||r.has(l)},forEach(i,r){const o=this,l=o.__v_raw,f=U(l),h=t?Ln:e?zt:ne;return!e&&Z(f,"iterate",Xe),l.forEach((a,p)=>i.call(r,h(a),h(p),o))}};return re(n,e?{add:Ut("add"),set:Ut("set"),delete:Ut("delete"),clear:Ut("clear")}:{add(i){!t&&!me(i)&&!Ze(i)&&(i=U(i));const r=U(this);return Vt(r).has.call(r,i)||(r.add(i),Pe(r,"add",i,i)),this},set(i,r){!t&&!me(r)&&!Ze(r)&&(r=U(r));const o=U(this),{has:l,get:f}=Vt(o);let h=l.call(o,i);h||(i=U(i),h=l.call(o,i));const a=f.call(o,i);return o.set(i,r),h?ke(r,a)&&Pe(o,"set",i,r):Pe(o,"add",i,r),this},delete(i){const r=U(this),{has:o,get:l}=Vt(r);let f=o.call(r,i);f||(i=U(i),f=o.call(r,i)),l&&l.call(r,i);const h=r.delete(i);return f&&Pe(r,"delete",i,void 0),h},clear(){const i=U(this),r=i.size!==0,o=i.clear();return r&&Pe(i,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=yr(i,e,t)}),n}function zn(e,t){const n=vr(e,t);return(s,i,r)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(j(n,i)&&i in s?n:s,i,r)}const xr={get:zn(!1,!1)},Sr={get:zn(!1,!0)},wr={get:zn(!0,!1)};const fi=new WeakMap,ui=new WeakMap,ai=new WeakMap,Cr=new WeakMap;function Tr(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Er(e){return e.__v_skip||!Object.isExtensible(e)?0:Tr(Xi(e))}function an(e){return Ze(e)?e:kn(e,!1,mr,xr,fi)}function Or(e){return kn(e,!1,br,Sr,ui)}function Nn(e){return kn(e,!0,_r,wr,ai)}function kn(e,t,n,s,i){if(!q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const r=Er(e);if(r===0)return e;const o=i.get(e);if(o)return o;const l=new Proxy(e,r===2?s:n);return i.set(e,l),l}function lt(e){return Ze(e)?lt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ze(e){return!!(e&&e.__v_isReadonly)}function me(e){return!!(e&&e.__v_isShallow)}function Xn(e){return e?!!e.__v_raw:!1}function U(e){const t=e&&e.__v_raw;return t?U(t):e}function Ar(e){return!j(e,"__v_skip")&&Object.isExtensible(e)&&Js(e,"__v_skip",!0),e}const ne=e=>q(e)?an(e):e,zt=e=>q(e)?Nn(e):e;function X(e){return e?e.__v_isRef===!0:!1}function H(e){return X(e)?e.value:e}const Pr={get:(e,t,n)=>t==="__v_raw"?e:H(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const i=e[t];return X(i)&&!X(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function di(e){return lt(e)?e:new Proxy(e,Pr)}function Mr(e){const t=M(e)?new Array(e.length):{};for(const n in e)t[n]=Rr(e,n);return t}class Ir{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return ur(U(this._object),this._key)}}function Rr(e,t,n){const s=e[t];return X(s)?s:new Ir(e,t,n)}class Fr{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new ii(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=At-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&G!==this)return Qs(this,!0),!0}get value(){const t=this.dep.track();return ni(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Lr(e,t,n=!1){let s,i;return R(e)?s=e:(s=e.get,i=e.set),new Fr(s,i,n)}const Kt={},kt=new WeakMap;let Ye;function Nr(e,t=!1,n=Ye){if(n){let s=kt.get(n);s||kt.set(n,s=[]),s.push(e)}}function Dr(e,t,n=K){const{immediate:s,deep:i,once:r,scheduler:o,augmentJob:l,call:f}=n,h=A=>i?A:me(A)||i===!1||i===0?Me(A,1):Me(A);let a,p,m,v,I=!1,O=!1;if(X(e)?(p=()=>e.value,I=me(e)):lt(e)?(p=()=>h(e),I=!0):M(e)?(O=!0,I=e.some(A=>lt(A)||me(A)),p=()=>e.map(A=>{if(X(A))return A.value;if(lt(A))return h(A);if(R(A))return f?f(A,2):A()})):R(e)?t?p=f?()=>f(e,2):e:p=()=>{if(m){Re();try{m()}finally{Fe()}}const A=Ye;Ye=a;try{return f?f(e,3,[v]):e(v)}finally{Ye=A}}:p=Te,t&&i){const A=p,k=i===!0?1/0:i;p=()=>Me(A(),k)}const z=lr(),N=()=>{a.stop(),z&&z.active&&Wn(z.effects,a)};if(r&&t){const A=t;t=(...k)=>{A(...k),N()}}let F=O?new Array(e.length).fill(Kt):Kt;const L=A=>{if(!(!(a.flags&1)||!a.dirty&&!A))if(t){const k=a.run();if(i||I||(O?k.some((Ne,_e)=>ke(Ne,F[_e])):ke(k,F))){m&&m();const Ne=Ye;Ye=a;try{const _e=[k,F===Kt?void 0:O&&F[0]===Kt?[]:F,v];F=k,f?f(t,3,_e):t(..._e)}finally{Ye=Ne}}}else a.run()};return l&&l(L),a=new Xs(p),a.scheduler=o?()=>o(L,!1):L,v=A=>Nr(A,!1,a),m=a.onStop=()=>{const A=kt.get(a);if(A){if(f)f(A,4);else for(const k of A)k();kt.delete(a)}},t?s?L(!0):F=a.run():o?o(L.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function Me(e,t=1/0,n){if(t<=0||!q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,X(e))Me(e.value,t,n);else if(M(e))for(let s=0;s{Me(s,t,n)});else if(Gs(e)){for(const s in e)Me(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Me(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Ft(e,t,n,s){try{return s?e(...s):e()}catch(i){dn(i,t,n)}}function Ee(e,t,n,s){if(R(e)){const i=Ft(e,t,n,s);return i&&Bs(i)&&i.catch(r=>{dn(r,t,n)}),i}if(M(e)){const i=[];for(let r=0;r>>1,i=se[s],r=Mt(i);r=Mt(n)?se.push(e):se.splice(jr(t),0,e),e.flags|=1,pi()}}function pi(){Xt||(Xt=hi.then(mi))}function Vr(e){M(e)?ct.push(...e):$e&&e.id===-1?$e.splice(st+1,0,e):e.flags&1||(ct.push(e),e.flags|=1),pi()}function ds(e,t,n=we+1){for(;nMt(n)-Mt(s));if(ct.length=0,$e){$e.push(...t);return}for($e=t,st=0;st<$e.length;st++){const n=$e[st];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}$e=null,st=0}}const Mt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function mi(e){try{for(we=0;we{s._d&&ws(-1);const r=Zt(t);let o;try{o=e(...i)}finally{Zt(r),s._d&&ws(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function He(e,t){if(he===null)return e;const n=mn(he),s=e.dirs||(e.dirs=[]);for(let i=0;ie.__isTeleport,Wr=Symbol("_leaveCb");function Qn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Qn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function bi(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}const Qt=new WeakMap;function Ct(e,t,n,s,i=!1){if(M(e)){e.forEach((I,O)=>Ct(I,t&&(M(t)?t[O]:t),n,s,i));return}if(Tt(s)&&!i){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Ct(e,t,n,s.component.subTree);return}const r=s.shapeFlag&4?mn(s.component):s.el,o=i?null:r,{i:l,r:f}=e,h=t&&t.r,a=l.refs===K?l.refs={}:l.refs,p=l.setupState,m=U(p),v=p===K?Us:I=>j(m,I);if(h!=null&&h!==f){if(hs(t),Y(h))a[h]=null,v(h)&&(p[h]=null);else if(X(h)){h.value=null;const I=t;I.k&&(a[I.k]=null)}}if(R(f))Ft(f,l,12,[o,a]);else{const I=Y(f),O=X(f);if(I||O){const z=()=>{if(e.f){const N=I?v(f)?p[f]:a[f]:f.value;if(i)M(N)&&Wn(N,r);else if(M(N))N.includes(r)||N.push(r);else if(I)a[f]=[r],v(f)&&(p[f]=a[f]);else{const F=[r];f.value=F,e.k&&(a[e.k]=F)}}else I?(a[f]=o,v(f)&&(p[f]=o)):O&&(f.value=o,e.k&&(a[e.k]=o))};if(o){const N=()=>{z(),Qt.delete(e)};N.id=-1,Qt.set(e,N),ue(N,n)}else hs(e),z()}}}function hs(e){const t=Qt.get(e);t&&(t.flags|=8,Qt.delete(e))}cn().requestIdleCallback;cn().cancelIdleCallback;const Tt=e=>!!e.type.__asyncLoader,yi=e=>e.type.__isKeepAlive;function Gr(e,t){vi(e,"a",t)}function qr(e,t){vi(e,"da",t)}function vi(e,t,n=ie){const s=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(hn(t,s,n),n){let i=n.parent;for(;i&&i.parent;)yi(i.parent.vnode)&&Jr(s,t,n,i),i=i.parent}}function Jr(e,t,n,s){const i=hn(t,e,s,!0);wi(()=>{Wn(s[t],i)},n)}function hn(e,t,n=ie,s=!1){if(n){const i=n[e]||(n[e]=[]),r=t.__weh||(t.__weh=(...o)=>{Re();const l=Lt(n),f=Ee(t,n,e,o);return l(),Fe(),f});return s?i.unshift(r):i.push(r),r}}const Le=e=>(t,n=ie)=>{(!Rt||e==="sp")&&hn(e,(...s)=>t(...s),n)},Yr=Le("bm"),xi=Le("m"),zr=Le("bu"),kr=Le("u"),Si=Le("bum"),wi=Le("um"),Xr=Le("sp"),Zr=Le("rtg"),Qr=Le("rtc");function eo(e,t=ie){hn("ec",e,t)}const to=Symbol.for("v-ndc");function ps(e,t,n,s){let i;const r=n,o=M(e);if(o||Y(e)){const l=o&<(e);let f=!1,h=!1;l&&(f=!me(e),h=Ze(e),e=un(e)),i=new Array(e.length);for(let a=0,p=e.length;at(l,f,void 0,r));else{const l=Object.keys(e);i=new Array(l.length);for(let f=0,h=l.length;fe?Wi(e)?mn(e):Dn(e.parent):null,Et=re(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Dn(e.parent),$root:e=>Dn(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Ti(e),$forceUpdate:e=>e.f||(e.f=()=>{Zn(e.update)}),$nextTick:e=>e.n||(e.n=$r.bind(e.proxy)),$watch:e=>Co.bind(e)}),Cn=(e,t)=>e!==K&&!e.__isScriptSetup&&j(e,t),no={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:i,props:r,accessCache:o,type:l,appContext:f}=e;let h;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return r[t]}else{if(Cn(s,t))return o[t]=1,s[t];if(i!==K&&j(i,t))return o[t]=2,i[t];if((h=e.propsOptions[0])&&j(h,t))return o[t]=3,r[t];if(n!==K&&j(n,t))return o[t]=4,n[t];Hn&&(o[t]=0)}}const a=Et[t];let p,m;if(a)return t==="$attrs"&&Z(e.attrs,"get",""),a(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==K&&j(n,t))return o[t]=4,n[t];if(m=f.config.globalProperties,j(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:i,ctx:r}=e;return Cn(i,t)?(i[t]=n,!0):s!==K&&j(s,t)?(s[t]=n,!0):j(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(r[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,propsOptions:r,type:o}},l){let f,h;return!!(n[l]||e!==K&&l[0]!=="$"&&j(e,l)||Cn(t,l)||(f=r[0])&&j(f,l)||j(s,l)||j(Et,l)||j(i.config.globalProperties,l)||(h=o.__cssModules)&&h[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:j(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function gs(e){return M(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Hn=!0;function so(e){const t=Ti(e),n=e.proxy,s=e.ctx;Hn=!1,t.beforeCreate&&ms(t.beforeCreate,e,"bc");const{data:i,computed:r,methods:o,watch:l,provide:f,inject:h,created:a,beforeMount:p,mounted:m,beforeUpdate:v,updated:I,activated:O,deactivated:z,beforeDestroy:N,beforeUnmount:F,destroyed:L,unmounted:A,render:k,renderTracked:Ne,renderTriggered:_e,errorCaptured:De,serverPrefetch:Nt,expose:Be,inheritAttrs:dt,components:Dt,directives:Ht,filters:_n}=t;if(h&&io(h,s,null),o)for(const J in o){const B=o[J];R(B)&&(s[J]=B.bind(n))}if(i){const J=i.call(n,n);q(J)&&(e.data=an(J))}if(Hn=!0,r)for(const J in r){const B=r[J],We=R(B)?B.bind(n,n):R(B.get)?B.get.bind(n,n):Te,$t=!R(B)&&R(B.set)?B.set.bind(n):Te,Ge=Qe({get:We,set:$t});Object.defineProperty(s,J,{enumerable:!0,configurable:!0,get:()=>Ge.value,set:be=>Ge.value=be})}if(l)for(const J in l)Ci(l[J],s,n,J);if(f){const J=R(f)?f.call(n):f;Reflect.ownKeys(J).forEach(B=>{uo(B,J[B])})}a&&ms(a,e,"c");function Q(J,B){M(B)?B.forEach(We=>J(We.bind(n))):B&&J(B.bind(n))}if(Q(Yr,p),Q(xi,m),Q(zr,v),Q(kr,I),Q(Gr,O),Q(qr,z),Q(eo,De),Q(Qr,Ne),Q(Zr,_e),Q(Si,F),Q(wi,A),Q(Xr,Nt),M(Be))if(Be.length){const J=e.exposed||(e.exposed={});Be.forEach(B=>{Object.defineProperty(J,B,{get:()=>n[B],set:We=>n[B]=We,enumerable:!0})})}else e.exposed||(e.exposed={});k&&e.render===Te&&(e.render=k),dt!=null&&(e.inheritAttrs=dt),Dt&&(e.components=Dt),Ht&&(e.directives=Ht),Nt&&bi(e)}function io(e,t,n=Te){M(e)&&(e=$n(e));for(const s in e){const i=e[s];let r;q(i)?"default"in i?r=Gt(i.from||s,i.default,!0):r=Gt(i.from||s):r=Gt(i),X(r)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>r.value,set:o=>r.value=o}):t[s]=r}}function ms(e,t,n){Ee(M(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ci(e,t,n,s){let i=s.includes(".")?$i(n,s):()=>n[s];if(Y(e)){const r=t[e];R(r)&&En(i,r)}else if(R(e))En(i,e.bind(n));else if(q(e))if(M(e))e.forEach(r=>Ci(r,t,n,s));else{const r=R(e.handler)?e.handler.bind(n):t[e.handler];R(r)&&En(i,r,e)}}function Ti(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:r,config:{optionMergeStrategies:o}}=e.appContext,l=r.get(t);let f;return l?f=l:!i.length&&!n&&!s?f=t:(f={},i.length&&i.forEach(h=>en(f,h,o,!0)),en(f,t,o)),q(t)&&r.set(t,f),f}function en(e,t,n,s=!1){const{mixins:i,extends:r}=t;r&&en(e,r,n,!0),i&&i.forEach(o=>en(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=ro[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const ro={data:_s,props:bs,emits:bs,methods:yt,computed:yt,beforeCreate:ee,created:ee,beforeMount:ee,mounted:ee,beforeUpdate:ee,updated:ee,beforeDestroy:ee,beforeUnmount:ee,destroyed:ee,unmounted:ee,activated:ee,deactivated:ee,errorCaptured:ee,serverPrefetch:ee,components:yt,directives:yt,watch:lo,provide:_s,inject:oo};function _s(e,t){return t?e?function(){return re(R(e)?e.call(this,this):e,R(t)?t.call(this,this):t)}:t:e}function oo(e,t){return yt($n(e),$n(t))}function $n(e){if(M(e)){const t={};for(let n=0;n1)return n&&R(t)?t.call(s&&s.proxy):t}}const Oi={},Ai=()=>Object.create(Oi),Pi=e=>Object.getPrototypeOf(e)===Oi;function ao(e,t,n,s=!1){const i={},r=Ai();e.propsDefaults=Object.create(null),Mi(e,t,i,r);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=s?i:Or(i):e.type.props?e.props=i:e.props=r,e.attrs=r}function ho(e,t,n,s){const{props:i,attrs:r,vnode:{patchFlag:o}}=e,l=U(i),[f]=e.propsOptions;let h=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let p=0;p{f=!0;const[m,v]=Ii(p,t,!0);re(o,m),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!r&&!f)return q(e)&&s.set(e,rt),rt;if(M(r))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",ts=e=>M(e)?e.map(Ce):[Ce(e)],go=(e,t,n)=>{if(t._n)return t;const s=Ur((...i)=>ts(t(...i)),n);return s._c=!1,s},Ri=(e,t,n)=>{const s=e._ctx;for(const i in e){if(es(i))continue;const r=e[i];if(R(r))t[i]=go(i,r,s);else if(r!=null){const o=ts(r);t[i]=()=>o}}},Fi=(e,t)=>{const n=ts(t);e.slots.default=()=>n},Li=(e,t,n)=>{for(const s in t)(n||!es(s))&&(e[s]=t[s])},mo=(e,t,n)=>{const s=e.slots=Ai();if(e.vnode.shapeFlag&32){const i=t._;i?(Li(s,t,n),n&&Js(s,"_",i,!0)):Ri(t,s)}else t&&Fi(e,t)},_o=(e,t,n)=>{const{vnode:s,slots:i}=e;let r=!0,o=K;if(s.shapeFlag&32){const l=t._;l?n&&l===1?r=!1:Li(i,t,n):(r=!t.$stable,Ri(t,i)),o=t}else t&&(Fi(e,t),o={default:1});if(r)for(const l in i)!es(l)&&o[l]==null&&delete i[l]},ue=Ro;function bo(e){return yo(e)}function yo(e,t){const n=cn();n.__VUE__=!0;const{insert:s,remove:i,patchProp:r,createElement:o,createText:l,createComment:f,setText:h,setElementText:a,parentNode:p,nextSibling:m,setScopeId:v=Te,insertStaticContent:I}=e,O=(c,u,d,b=null,g=null,_=null,w=void 0,S=null,x=!!u.dynamicChildren)=>{if(c===u)return;c&&!_t(c,u)&&(b=jt(c),be(c,g,_,!0),c=null),u.patchFlag===-2&&(x=!1,u.dynamicChildren=null);const{type:y,ref:E,shapeFlag:C}=u;switch(y){case gn:z(c,u,d,b);break;case Ue:N(c,u,d,b);break;case On:c==null&&F(u,d,b,w);break;case ae:Dt(c,u,d,b,g,_,w,S,x);break;default:C&1?k(c,u,d,b,g,_,w,S,x):C&6?Ht(c,u,d,b,g,_,w,S,x):(C&64||C&128)&&y.process(c,u,d,b,g,_,w,S,x,pt)}E!=null&&g?Ct(E,c&&c.ref,_,u||c,!u):E==null&&c&&c.ref!=null&&Ct(c.ref,null,_,c,!0)},z=(c,u,d,b)=>{if(c==null)s(u.el=l(u.children),d,b);else{const g=u.el=c.el;u.children!==c.children&&h(g,u.children)}},N=(c,u,d,b)=>{c==null?s(u.el=f(u.children||""),d,b):u.el=c.el},F=(c,u,d,b)=>{[c.el,c.anchor]=I(c.children,u,d,b,c.el,c.anchor)},L=({el:c,anchor:u},d,b)=>{let g;for(;c&&c!==u;)g=m(c),s(c,d,b),c=g;s(u,d,b)},A=({el:c,anchor:u})=>{let d;for(;c&&c!==u;)d=m(c),i(c),c=d;i(u)},k=(c,u,d,b,g,_,w,S,x)=>{u.type==="svg"?w="svg":u.type==="math"&&(w="mathml"),c==null?Ne(u,d,b,g,_,w,S,x):Nt(c,u,g,_,w,S,x)},Ne=(c,u,d,b,g,_,w,S)=>{let x,y;const{props:E,shapeFlag:C,transition:T,dirs:P}=c;if(x=c.el=o(c.type,_,E&&E.is,E),C&8?a(x,c.children):C&16&&De(c.children,x,null,b,g,Tn(c,_),w,S),P&&qe(c,null,b,"created"),_e(x,c,c.scopeId,w,b),E){for(const W in E)W!=="value"&&!xt(W)&&r(x,W,null,E[W],_,b);"value"in E&&r(x,"value",null,E.value,_),(y=E.onVnodeBeforeMount)&&Se(y,b,c)}P&&qe(c,null,b,"beforeMount");const D=vo(g,T);D&&T.beforeEnter(x),s(x,u,d),((y=E&&E.onVnodeMounted)||D||P)&&ue(()=>{y&&Se(y,b,c),D&&T.enter(x),P&&qe(c,null,b,"mounted")},g)},_e=(c,u,d,b,g)=>{if(d&&v(c,d),b)for(let _=0;_{for(let y=x;y{const S=u.el=c.el;let{patchFlag:x,dynamicChildren:y,dirs:E}=u;x|=c.patchFlag&16;const C=c.props||K,T=u.props||K;let P;if(d&&Je(d,!1),(P=T.onVnodeBeforeUpdate)&&Se(P,d,u,c),E&&qe(u,c,d,"beforeUpdate"),d&&Je(d,!0),(C.innerHTML&&T.innerHTML==null||C.textContent&&T.textContent==null)&&a(S,""),y?Be(c.dynamicChildren,y,S,d,b,Tn(u,g),_):w||B(c,u,S,null,d,b,Tn(u,g),_,!1),x>0){if(x&16)dt(S,C,T,d,g);else if(x&2&&C.class!==T.class&&r(S,"class",null,T.class,g),x&4&&r(S,"style",C.style,T.style,g),x&8){const D=u.dynamicProps;for(let W=0;W{P&&Se(P,d,u,c),E&&qe(u,c,d,"updated")},b)},Be=(c,u,d,b,g,_,w)=>{for(let S=0;S{if(u!==d){if(u!==K)for(const _ in u)!xt(_)&&!(_ in d)&&r(c,_,u[_],null,g,b);for(const _ in d){if(xt(_))continue;const w=d[_],S=u[_];w!==S&&_!=="value"&&r(c,_,S,w,g,b)}"value"in d&&r(c,"value",u.value,d.value,g)}},Dt=(c,u,d,b,g,_,w,S,x)=>{const y=u.el=c?c.el:l(""),E=u.anchor=c?c.anchor:l("");let{patchFlag:C,dynamicChildren:T,slotScopeIds:P}=u;P&&(S=S?S.concat(P):P),c==null?(s(y,d,b),s(E,d,b),De(u.children||[],d,E,g,_,w,S,x)):C>0&&C&64&&T&&c.dynamicChildren?(Be(c.dynamicChildren,T,d,g,_,w,S),(u.key!=null||g&&u===g.subTree)&&Ni(c,u,!0)):B(c,u,d,E,g,_,w,S,x)},Ht=(c,u,d,b,g,_,w,S,x)=>{u.slotScopeIds=S,c==null?u.shapeFlag&512?g.ctx.activate(u,d,b,w,x):_n(u,d,b,g,_,w,x):ss(c,u,x)},_n=(c,u,d,b,g,_,w)=>{const S=c.component=Vo(c,b,g);if(yi(c)&&(S.ctx.renderer=pt),Ko(S,!1,w),S.asyncDep){if(g&&g.registerDep(S,Q,w),!c.el){const x=S.subTree=Ie(Ue);N(null,x,u,d),c.placeholder=x.el}}else Q(S,c,u,d,g,_,w)},ss=(c,u,d)=>{const b=u.component=c.component;if(Mo(c,u,d))if(b.asyncDep&&!b.asyncResolved){J(b,u,d);return}else b.next=u,b.update();else u.el=c.el,b.vnode=u},Q=(c,u,d,b,g,_,w)=>{const S=()=>{if(c.isMounted){let{next:C,bu:T,u:P,parent:D,vnode:W}=c;{const ve=Di(c);if(ve){C&&(C.el=W.el,J(c,C,w)),ve.asyncDep.then(()=>{c.isUnmounted||S()});return}}let V=C,oe;Je(c,!1),C?(C.el=W.el,J(c,C,w)):C=W,T&&Wt(T),(oe=C.props&&C.props.onVnodeBeforeUpdate)&&Se(oe,D,C,W),Je(c,!0);const le=xs(c),ye=c.subTree;c.subTree=le,O(ye,le,p(ye.el),jt(ye),c,g,_),C.el=le.el,V===null&&Io(c,le.el),P&&ue(P,g),(oe=C.props&&C.props.onVnodeUpdated)&&ue(()=>Se(oe,D,C,W),g)}else{let C;const{el:T,props:P}=u,{bm:D,m:W,parent:V,root:oe,type:le}=c,ye=Tt(u);Je(c,!1),D&&Wt(D),!ye&&(C=P&&P.onVnodeBeforeMount)&&Se(C,V,u),Je(c,!0);{oe.ce&&oe.ce._def.shadowRoot!==!1&&oe.ce._injectChildStyle(le);const ve=c.subTree=xs(c);O(null,ve,d,b,c,g,_),u.el=ve.el}if(W&&ue(W,g),!ye&&(C=P&&P.onVnodeMounted)){const ve=u;ue(()=>Se(C,V,ve),g)}(u.shapeFlag&256||V&&Tt(V.vnode)&&V.vnode.shapeFlag&256)&&c.a&&ue(c.a,g),c.isMounted=!0,u=d=b=null}};c.scope.on();const x=c.effect=new Xs(S);c.scope.off();const y=c.update=x.run.bind(x),E=c.job=x.runIfDirty.bind(x);E.i=c,E.id=c.uid,x.scheduler=()=>Zn(E),Je(c,!0),y()},J=(c,u,d)=>{u.component=c;const b=c.vnode.props;c.vnode=u,c.next=null,ho(c,u.props,b,d),_o(c,u.children,d),Re(),ds(c),Fe()},B=(c,u,d,b,g,_,w,S,x=!1)=>{const y=c&&c.children,E=c?c.shapeFlag:0,C=u.children,{patchFlag:T,shapeFlag:P}=u;if(T>0){if(T&128){$t(y,C,d,b,g,_,w,S,x);return}else if(T&256){We(y,C,d,b,g,_,w,S,x);return}}P&8?(E&16&&ht(y,g,_),C!==y&&a(d,C)):E&16?P&16?$t(y,C,d,b,g,_,w,S,x):ht(y,g,_,!0):(E&8&&a(d,""),P&16&&De(C,d,b,g,_,w,S,x))},We=(c,u,d,b,g,_,w,S,x)=>{c=c||rt,u=u||rt;const y=c.length,E=u.length,C=Math.min(y,E);let T;for(T=0;TE?ht(c,g,_,!0,!1,C):De(u,d,b,g,_,w,S,x,C)},$t=(c,u,d,b,g,_,w,S,x)=>{let y=0;const E=u.length;let C=c.length-1,T=E-1;for(;y<=C&&y<=T;){const P=c[y],D=u[y]=x?je(u[y]):Ce(u[y]);if(_t(P,D))O(P,D,d,null,g,_,w,S,x);else break;y++}for(;y<=C&&y<=T;){const P=c[C],D=u[T]=x?je(u[T]):Ce(u[T]);if(_t(P,D))O(P,D,d,null,g,_,w,S,x);else break;C--,T--}if(y>C){if(y<=T){const P=T+1,D=PT)for(;y<=C;)be(c[y],g,_,!0),y++;else{const P=y,D=y,W=new Map;for(y=D;y<=T;y++){const fe=u[y]=x?je(u[y]):Ce(u[y]);fe.key!=null&&W.set(fe.key,y)}let V,oe=0;const le=T-D+1;let ye=!1,ve=0;const gt=new Array(le);for(y=0;y=le){be(fe,g,_,!0);continue}let xe;if(fe.key!=null)xe=W.get(fe.key);else for(V=D;V<=T;V++)if(gt[V-D]===0&&_t(fe,u[V])){xe=V;break}xe===void 0?be(fe,g,_,!0):(gt[xe-D]=y+1,xe>=ve?ve=xe:ye=!0,O(fe,u[xe],d,null,g,_,w,S,x),oe++)}const os=ye?xo(gt):rt;for(V=os.length-1,y=le-1;y>=0;y--){const fe=D+y,xe=u[fe],ls=u[fe+1],cs=fe+1{const{el:_,type:w,transition:S,children:x,shapeFlag:y}=c;if(y&6){Ge(c.component.subTree,u,d,b);return}if(y&128){c.suspense.move(u,d,b);return}if(y&64){w.move(c,u,d,pt);return}if(w===ae){s(_,u,d);for(let C=0;CS.enter(_),g);else{const{leave:C,delayLeave:T,afterLeave:P}=S,D=()=>{c.ctx.isUnmounted?i(_):s(_,u,d)},W=()=>{_._isLeaving&&_[Wr](!0),C(_,()=>{D(),P&&P()})};T?T(_,D,W):W()}else s(_,u,d)},be=(c,u,d,b=!1,g=!1)=>{const{type:_,props:w,ref:S,children:x,dynamicChildren:y,shapeFlag:E,patchFlag:C,dirs:T,cacheIndex:P}=c;if(C===-2&&(g=!1),S!=null&&(Re(),Ct(S,null,d,c,!0),Fe()),P!=null&&(u.renderCache[P]=void 0),E&256){u.ctx.deactivate(c);return}const D=E&1&&T,W=!Tt(c);let V;if(W&&(V=w&&w.onVnodeBeforeUnmount)&&Se(V,u,c),E&6)zi(c.component,d,b);else{if(E&128){c.suspense.unmount(d,b);return}D&&qe(c,null,u,"beforeUnmount"),E&64?c.type.remove(c,u,d,pt,b):y&&!y.hasOnce&&(_!==ae||C>0&&C&64)?ht(y,u,d,!1,!0):(_===ae&&C&384||!g&&E&16)&&ht(x,u,d),b&&is(c)}(W&&(V=w&&w.onVnodeUnmounted)||D)&&ue(()=>{V&&Se(V,u,c),D&&qe(c,null,u,"unmounted")},d)},is=c=>{const{type:u,el:d,anchor:b,transition:g}=c;if(u===ae){Yi(d,b);return}if(u===On){A(c);return}const _=()=>{i(d),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(c.shapeFlag&1&&g&&!g.persisted){const{leave:w,delayLeave:S}=g,x=()=>w(d,_);S?S(c.el,_,x):x()}else _()},Yi=(c,u)=>{let d;for(;c!==u;)d=m(c),i(c),c=d;i(u)},zi=(c,u,d)=>{const{bum:b,scope:g,job:_,subTree:w,um:S,m:x,a:y}=c;vs(x),vs(y),b&&Wt(b),g.stop(),_&&(_.flags|=8,be(w,c,u,d)),S&&ue(S,u),ue(()=>{c.isUnmounted=!0},u)},ht=(c,u,d,b=!1,g=!1,_=0)=>{for(let w=_;w{if(c.shapeFlag&6)return jt(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const u=m(c.anchor||c.el),d=u&&u[Kr];return d?m(d):u};let bn=!1;const rs=(c,u,d)=>{c==null?u._vnode&&be(u._vnode,null,null,!0):O(u._vnode||null,c,u,null,null,null,d),u._vnode=c,bn||(bn=!0,ds(),gi(),bn=!1)},pt={p:O,um:be,m:Ge,r:is,mt:_n,mc:De,pc:B,pbc:Be,n:jt,o:e};return{render:rs,hydrate:void 0,createApp:fo(rs)}}function Tn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Je({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function vo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ni(e,t,n=!1){const s=e.children,i=t.children;if(M(s)&&M(i))for(let r=0;r>1,e[n[l]]0&&(t[s]=n[r-1]),n[r]=s)}}for(r=n.length,o=n[r-1];r-- >0;)n[r]=o,o=t[o];return n}function Di(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Di(t)}function vs(e){if(e)for(let t=0;tGt(So);function En(e,t,n){return Hi(e,t,n)}function Hi(e,t,n=K){const{immediate:s,deep:i,flush:r,once:o}=n,l=re({},n),f=t&&s||!t&&r!=="post";let h;if(Rt){if(r==="sync"){const v=wo();h=v.__watcherHandles||(v.__watcherHandles=[])}else if(!f){const v=()=>{};return v.stop=Te,v.resume=Te,v.pause=Te,v}}const a=ie;l.call=(v,I,O)=>Ee(v,a,I,O);let p=!1;r==="post"?l.scheduler=v=>{ue(v,a&&a.suspense)}:r!=="sync"&&(p=!0,l.scheduler=(v,I)=>{I?v():Zn(v)}),l.augmentJob=v=>{t&&(v.flags|=4),p&&(v.flags|=2,a&&(v.id=a.uid,v.i=a))};const m=Dr(e,t,l);return Rt&&(h?h.push(m):f&&m()),m}function Co(e,t,n){const s=this.proxy,i=Y(e)?e.includes(".")?$i(s,e):()=>s[e]:e.bind(s,s);let r;R(t)?r=t:(r=t.handler,n=t);const o=Lt(this),l=Hi(i,r.bind(s),n);return o(),l}function $i(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;it==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ve(t)}Modifiers`]||e[`${et(t)}Modifiers`];function Eo(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||K;let i=n;const r=t.startsWith("update:"),o=r&&To(s,t.slice(7));o&&(o.trim&&(i=n.map(a=>Y(a)?a.trim():a)),o.number&&(i=n.map(In)));let l,f=s[l=yn(t)]||s[l=yn(Ve(t))];!f&&r&&(f=s[l=yn(et(t))]),f&&Ee(f,e,6,i);const h=s[l+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ee(h,e,6,i)}}const Oo=new WeakMap;function ji(e,t,n=!1){const s=n?Oo:t.emitsCache,i=s.get(e);if(i!==void 0)return i;const r=e.emits;let o={},l=!1;if(!R(e)){const f=h=>{const a=ji(h,t,!0);a&&(l=!0,re(o,a))};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!r&&!l?(q(e)&&s.set(e,null),null):(M(r)?r.forEach(f=>o[f]=null):re(o,r),q(e)&&s.set(e,o),o)}function pn(e,t){return!e||!rn(t)?!1:(t=t.slice(2).replace(/Once$/,""),j(e,t[0].toLowerCase()+t.slice(1))||j(e,et(t))||j(e,t))}function xs(e){const{type:t,vnode:n,proxy:s,withProxy:i,propsOptions:[r],slots:o,attrs:l,emit:f,render:h,renderCache:a,props:p,data:m,setupState:v,ctx:I,inheritAttrs:O}=e,z=Zt(e);let N,F;try{if(n.shapeFlag&4){const A=i||s,k=A;N=Ce(h.call(k,A,a,p,v,m,I)),F=l}else{const A=t;N=Ce(A.length>1?A(p,{attrs:l,slots:o,emit:f}):A(p,null)),F=t.props?l:Ao(l)}}catch(A){Ot.length=0,dn(A,e,1),N=Ie(Ue)}let L=N;if(F&&O!==!1){const A=Object.keys(F),{shapeFlag:k}=L;A.length&&k&7&&(r&&A.some(Bn)&&(F=Po(F,r)),L=at(L,F,!1,!0))}return n.dirs&&(L=at(L,null,!1,!0),L.dirs=L.dirs?L.dirs.concat(n.dirs):n.dirs),n.transition&&Qn(L,n.transition),N=L,Zt(z),N}const Ao=e=>{let t;for(const n in e)(n==="class"||n==="style"||rn(n))&&((t||(t={}))[n]=e[n]);return t},Po=(e,t)=>{const n={};for(const s in e)(!Bn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Mo(e,t,n){const{props:s,children:i,component:r}=e,{props:o,children:l,patchFlag:f}=t,h=r.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&f>=0){if(f&1024)return!0;if(f&16)return s?Ss(s,o,h):!!o;if(f&8){const a=t.dynamicProps;for(let p=0;pe.__isSuspense;function Ro(e,t){t&&t.pendingBranch?M(e)?t.effects.push(...e):t.effects.push(e):Vr(e)}const ae=Symbol.for("v-fgt"),gn=Symbol.for("v-txt"),Ue=Symbol.for("v-cmt"),On=Symbol.for("v-stc"),Ot=[];let de=null;function pe(e=!1){Ot.push(de=e?null:[])}function Fo(){Ot.pop(),de=Ot[Ot.length-1]||null}let It=1;function ws(e,t=!1){It+=e,e<0&&de&&t&&(de.hasOnce=!0)}function Ui(e){return e.dynamicChildren=It>0?de||rt:null,Fo(),It>0&&de&&de.push(e),e}function ze(e,t,n,s,i,r){return Ui($(e,t,n,s,i,r,!0))}function tn(e,t,n,s,i){return Ui(Ie(e,t,n,s,i,!0))}function Ki(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const Bi=({key:e})=>e??null,qt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Y(e)||X(e)||R(e)?{i:he,r:e,k:t,f:!!n}:e:null);function $(e,t=null,n=null,s=0,i=null,r=e===ae?0:1,o=!1,l=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Bi(t),ref:t&&qt(t),scopeId:_i,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:r,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:he};return l?(ns(f,n),r&128&&e.normalize(f)):n&&(f.shapeFlag|=Y(n)?8:16),It>0&&!o&&de&&(f.patchFlag>0||r&6)&&f.patchFlag!==32&&de.push(f),f}const Ie=Lo;function Lo(e,t=null,n=null,s=0,i=null,r=!1){if((!e||e===to)&&(e=Ue),Ki(e)){const l=at(e,t,!0);return n&&ns(l,n),It>0&&!r&&de&&(l.shapeFlag&6?de[de.indexOf(e)]=l:de.push(l)),l.patchFlag=-2,l}if(qo(e)&&(e=e.__vccOpts),t){t=No(t);let{class:l,style:f}=t;l&&!Y(l)&&(t.class=ut(l)),q(f)&&(Xn(f)&&!M(f)&&(f=re({},f)),t.style=fn(f))}const o=Y(e)?1:Vi(e)?128:Br(e)?64:q(e)?4:R(e)?2:0;return $(e,t,n,s,i,o,r,!0)}function No(e){return e?Xn(e)||Pi(e)?re({},e):e:null}function at(e,t,n=!1,s=!1){const{props:i,ref:r,patchFlag:o,children:l,transition:f}=e,h=t?Ho(i||{},t):i,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&Bi(h),ref:t&&t.ref?n&&r?M(r)?r.concat(qt(t)):[r,qt(t)]:qt(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ae?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&at(e.ssContent),ssFallback:e.ssFallback&&at(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return f&&s&&Qn(a,f.clone(a)),a}function vt(e=" ",t=0){return Ie(gn,null,e,t)}function Do(e="",t=!1){return t?(pe(),tn(Ue,null,e)):Ie(Ue,null,e)}function Ce(e){return e==null||typeof e=="boolean"?Ie(Ue):M(e)?Ie(ae,null,e.slice()):Ki(e)?je(e):Ie(gn,null,String(e))}function je(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:at(e)}function ns(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(M(t))n=16;else if(typeof t=="object")if(s&65){const i=t.default;i&&(i._c&&(i._d=!1),ns(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!Pi(t)?t._ctx=he:i===3&&he&&(he.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else R(t)?(t={default:t,_ctx:he},n=32):(t=String(t),s&64?(n=16,t=[vt(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ho(...e){const t={};for(let n=0;nie||he;let nn,Vn;{const e=cn(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),r=>{i.length>1?i.forEach(o=>o(r)):i[0](r)}};nn=t("__VUE_INSTANCE_SETTERS__",n=>ie=n),Vn=t("__VUE_SSR_SETTERS__",n=>Rt=n)}const Lt=e=>{const t=ie;return nn(e),e.scope.on(),()=>{e.scope.off(),nn(t)}},Cs=()=>{ie&&ie.scope.off(),nn(null)};function Wi(e){return e.vnode.shapeFlag&4}let Rt=!1;function Ko(e,t=!1,n=!1){t&&Vn(t);const{props:s,children:i}=e.vnode,r=Wi(e);ao(e,s,r,t),mo(e,i,n||t);const o=r?Bo(e,t):void 0;return t&&Vn(!1),o}function Bo(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,no);const{setup:s}=n;if(s){Re();const i=e.setupContext=s.length>1?Go(e):null,r=Lt(e),o=Ft(s,e,0,[e.props,i]),l=Bs(o);if(Fe(),r(),(l||e.sp)&&!Tt(e)&&bi(e),l){if(o.then(Cs,Cs),t)return o.then(f=>{Ts(e,f)}).catch(f=>{dn(f,e,0)});e.asyncDep=o}else Ts(e,o)}else Gi(e)}function Ts(e,t,n){R(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:q(t)&&(e.setupState=di(t)),Gi(e)}function Gi(e,t,n){const s=e.type;e.render||(e.render=s.render||Te);{const i=Lt(e);Re();try{so(e)}finally{Fe(),i()}}}const Wo={get(e,t){return Z(e,"get",""),e[t]}};function Go(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Wo),slots:e.slots,emit:e.emit,expose:t}}function mn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(di(Ar(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Et)return Et[n](e)},has(t,n){return n in t||n in Et}})):e.proxy}function qo(e){return R(e)&&"__vccOpts"in e}const Qe=(e,t)=>Lr(e,t,Rt),Jo="3.5.22";/** +* @vue/runtime-dom v3.5.22 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Un;const Es=typeof window<"u"&&window.trustedTypes;if(Es)try{Un=Es.createPolicy("vue",{createHTML:e=>e})}catch{}const qi=Un?e=>Un.createHTML(e):e=>e,Yo="http://www.w3.org/2000/svg",zo="http://www.w3.org/1998/Math/MathML",Ae=typeof document<"u"?document:null,Os=Ae&&Ae.createElement("template"),ko={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const i=t==="svg"?Ae.createElementNS(Yo,e):t==="mathml"?Ae.createElementNS(zo,e):n?Ae.createElement(e,{is:n}):Ae.createElement(e);return e==="select"&&s&&s.multiple!=null&&i.setAttribute("multiple",s.multiple),i},createText:e=>Ae.createTextNode(e),createComment:e=>Ae.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ae.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,i,r){const o=n?n.previousSibling:t.lastChild;if(i&&(i===r||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===r||!(i=i.nextSibling)););else{Os.innerHTML=qi(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Os.content;if(s==="svg"||s==="mathml"){const f=l.firstChild;for(;f.firstChild;)l.appendChild(f.firstChild);l.removeChild(f)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Xo=Symbol("_vtc");function Zo(e,t,n){const s=e[Xo];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const sn=Symbol("_vod"),Ji=Symbol("_vsh"),nt={name:"show",beforeMount(e,{value:t},{transition:n}){e[sn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):bt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),bt(e,!0),s.enter(e)):s.leave(e,()=>{bt(e,!1)}):bt(e,t))},beforeUnmount(e,{value:t}){bt(e,t)}};function bt(e,t){e.style.display=t?e[sn]:"none",e[Ji]=!t}const Qo=Symbol(""),el=/(?:^|;)\s*display\s*:/;function tl(e,t,n){const s=e.style,i=Y(n);let r=!1;if(n&&!i){if(t)if(Y(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Jt(s,l,"")}else for(const o in t)n[o]==null&&Jt(s,o,"");for(const o in n)o==="display"&&(r=!0),Jt(s,o,n[o])}else if(i){if(t!==n){const o=s[Qo];o&&(n+=";"+o),s.cssText=n,r=el.test(n)}}else t&&e.removeAttribute("style");sn in e&&(e[sn]=r?s.display:"",e[Ji]&&(s.display="none"))}const As=/\s*!important$/;function Jt(e,t,n){if(M(n))n.forEach(s=>Jt(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=nl(e,t);As.test(n)?e.setProperty(et(s),n.replace(As,""),"important"):e[s]=n}}const Ps=["Webkit","Moz","ms"],An={};function nl(e,t){const n=An[t];if(n)return n;let s=Ve(t);if(s!=="filter"&&s in e)return An[t]=s;s=qs(s);for(let i=0;iPn||(ol.then(()=>Pn=0),Pn=Date.now());function cl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ee(fl(s,n.value),t,5,[s])};return n.value=e,n.attached=ll(),n}function fl(e,t){if(M(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>i=>!i._stopped&&s&&s(i))}else return t}const Ns=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ul=(e,t,n,s,i,r)=>{const o=i==="svg";t==="class"?Zo(e,s,o):t==="style"?tl(e,n,s):rn(t)?Bn(t)||il(e,t,n,s,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):al(e,t,s,o))?(Rs(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Is(e,t,s,o,r,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Y(s))?Rs(e,Ve(t),s,r,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Is(e,t,s,o))};function al(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ns(t)&&R(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return Ns(t)&&Y(n)?!1:t in e}const Ds=e=>{const t=e.props["onUpdate:modelValue"]||!1;return M(t)?n=>Wt(t,n):t};function dl(e){e.target.composing=!0}function Hs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Mn=Symbol("_assign"),$s={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e[Mn]=Ds(i);const r=s||i.props&&i.props.type==="number";it(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),r&&(l=In(l)),e[Mn](l)}),n&&it(e,"change",()=>{e.value=e.value.trim()}),t||(it(e,"compositionstart",dl),it(e,"compositionend",Hs),it(e,"change",Hs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:i,number:r}},o){if(e[Mn]=Ds(o),e.composing)return;const l=(r||e.type==="number")&&!/^0\d/.test(e.value)?In(e.value):e.value,f=t??"";l!==f&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||i&&e.value.trim()===f)||(e.value=f))}},hl=re({patchProp:ul},ko);let js;function pl(){return js||(js=bo(hl))}const gl=((...e)=>{const t=pl().createApp(...e),{mount:n}=t;return t.mount=s=>{const i=_l(s);if(!i)return;const r=t._component;!R(r)&&!r.render&&!r.template&&(r.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const o=n(i,!1,ml(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t});function ml(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function _l(e){return Y(e)?document.querySelector(e):e}function Bt(e,t,n){return Math.max(t,Math.min(n,e))}function bl(){const e=an({visible:!1,tab:"garage",vehicles:[],impoundedVehicles:[],searchGarage:"",searchImpounded:"",spawnPoint:null,poundCost:0,poundName:"",poundSpawnPoint:null,impoundOnly:!1,locales:{garage_title:"Garage",garage_tab:"Garage",impounded_tab:"Impounded",veh_model:"Model",veh_plate:"Plate",veh_condition:"Condition",action:"Retrieve",impound_action:"Release",no_veh_parking:"No Vehicles Stored Here.",no_veh_impounded:"No Impounded Vehicles.",search_placeholder:"Search by model or plate…"}}),t=Qe(()=>{const m=e.searchGarage.trim().toLowerCase();return m?e.vehicles.filter(v=>String(v.model||"").toLowerCase().includes(m)||String(v.plate||"").toLowerCase().includes(m)):e.vehicles}),n=Qe(()=>{const m=e.searchImpounded.trim().toLowerCase();return m?e.impoundedVehicles.filter(v=>String(v.model||"").toLowerCase().includes(m)||String(v.plate||"").toLowerCase().includes(m)):e.impoundedVehicles});function s(m){const v=m.props||{},I=Bt((typeof v.bodyHealth=="number"?v.bodyHealth:1e3)/1e3*100,0,100),O=Bt((typeof v.engineHealth=="number"?v.engineHealth:1e3)/1e3*100,0,100),z=Bt((typeof v.tankHealth=="number"?v.tankHealth:1e3)/1e3*100,0,100);return Bt(Math.round((I+O+z)/300*100),0,100)}function i(m,v){fetch(`https://esx_garage/${m}`,{method:"POST",headers:{"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(v||{})})}function r(m){e.visible=!0,e.impoundOnly=m.type==="impound",e.tab=e.impoundOnly?"impounded":"garage",m.locales&&Object.assign(e.locales,m.locales),e.spawnPoint=m.spawnPoint||null,typeof m.poundCost=="number"&&(e.poundCost=m.poundCost);const v=(I,O)=>O?typeof O=="object"?Array.isArray(O)?O.slice():O:(Array.isArray(O)&&(O=O[0]),typeof O!="string"?[]:JSON.parse(O)):[];e.vehicles=v("vehiclesList",m.vehiclesList),e.impoundedVehicles=v("vehiclesImpoundedList",m.vehiclesImpoundedList),e.poundName=m.poundName||"",e.poundSpawnPoint=m.poundSpawnPoint||null}function o(){e.visible=!1,e.searchGarage="",e.searchImpounded=""}function l(m){i("spawnVehicle",{vehicleProps:m.props,spawnPoint:e.spawnPoint,exitVehicleCost:e.poundCost||0}),o()}function f(m){i("impound",{vehicleProps:m.props,poundName:e.poundName,poundSpawnPoint:e.poundSpawnPoint}),o()}function h(){i("escape",{}),o()}function a(m){const v=m.data||{};!v.showMenu&&!v.hideAll||(v.showMenu?r(v):v.hideAll&&o())}function p(m){m.key==="Escape"&&e.visible&&h()}return xi(()=>{window.addEventListener("message",a),window.addEventListener("keyup",p)}),Si(()=>{window.removeEventListener("message",a),window.removeEventListener("keyup",p)}),{...Mr(e),filteredGarage:t,filteredImpounded:n,damagePercent:s,spawnVehicle:l,impoundVehicle:f,closeUI:h}}const yl=""+new URL("../img/logo.png",import.meta.url).href,vl=["data-model","data-plate"],xl={class:"condition"},Sl={class:"bar"},wl={class:"percent"},Cl={key:0},Vs={__name:"VehicleCard",props:{veh:{type:Object,required:!0},locales:{type:Object,required:!0},damagePercent:{type:Function,required:!0},action:{type:Function,required:!0},actionType:{type:String,default:"spawn"},poundCost:{type:Number,default:0}},emits:["action"],setup(e,{emit:t}){const n=e,s=t;function i(){s("action",n.veh)}const r=Qe(()=>n.actionType==="impound"),o=Qe(()=>n.damagePercent(n.veh));return(l,f)=>(pe(),ze("div",{class:"vehicle-listing","data-model":(e.veh.model||"").toLowerCase(),"data-plate":(e.veh.plate||"").toLowerCase()},[$("div",null,[vt(te(e.locales.veh_model)+": ",1),$("strong",null,te(e.veh.model),1)]),$("div",null,[vt(te(e.locales.veh_plate)+": ",1),$("strong",null,te(e.veh.plate),1)]),$("div",xl,[$("span",null,te(e.locales.veh_condition),1),$("div",Sl,[$("div",{class:"fill",style:fn({width:o.value+"%"})},null,4)]),$("strong",wl,te(o.value)+"%",1)]),$("button",{class:ut(["vehicle-action unstyled-button",{red:r.value}]),onClick:i},[r.value?(pe(),ze(ae,{key:1},[vt(te(e.locales.impound_action),1)],64)):(pe(),ze(ae,{key:0},[vt(te(e.locales.action),1),e.poundCost&&e.poundCost>0?(pe(),ze("span",Cl," ($"+te(e.poundCost)+")",1)):Do("",!0)],64))],2)],8,vl))}},Tl={id:"container",role:"dialog",style:{display:"grid"}},El={id:"header"},Ol={class:"title",id:"garage-title"},Al={role:"tablist"},Pl=["src"],Ml={id:"menu"},Il={class:"content",role:"tabpanel"},Rl={class:"toolbar"},Fl=["placeholder"],Ll=["aria-label"],Nl={class:"impounded_content",role:"tabpanel"},Dl={class:"toolbar"},Hl=["placeholder"],$l=["aria-label"],jl={__name:"Main",setup(e){const{visible:t,tab:n,searchGarage:s,searchImpounded:i,poundCost:r,locales:o,impoundOnly:l,filteredGarage:f,filteredImpounded:h,damagePercent:a,spawnVehicle:p,impoundVehicle:m,closeUI:v}=bl();function I(N){l.value||(n.value=N)}const O=Qe(()=>o.garage_tab+" vehicles list"),z=Qe(()=>o.impounded_tab+" vehicles list");return(N,F)=>He((pe(),ze("div",Tl,[$("div",El,[$("div",Ol,te(H(o).garage_title),1),He($("ul",Al,[$("li",{class:ut({selected:H(n)==="garage"}),role:"tab",onClick:F[0]||(F[0]=L=>I("garage"))},te(H(o).garage_tab),3),$("li",{class:ut({selected:H(n)==="impounded"}),role:"tab",onClick:F[1]||(F[1]=L=>I("impounded"))},te(H(o).impounded_tab),3)],512),[[nt,!H(l)]]),$("img",{class:"logo-left",src:H(yl),alt:"ESX logo"},null,8,Pl),$("button",{class:"close",title:"Close",onClick:F[2]||(F[2]=(...L)=>H(v)&&H(v)(...L))},"×")]),$("div",Ml,[He($("div",Il,[$("div",Rl,[He($("input",{id:"search-garage",type:"search",placeholder:H(o).search_placeholder,"onUpdate:modelValue":F[3]||(F[3]=L=>X(s)?s.value=L:null)},null,8,Fl),[[$s,H(s)]])]),He($("h2",{class:"empty"},te(H(o).no_veh_parking),513),[[nt,!H(f).length]]),$("div",{class:"vehicle-list","aria-label":O.value},[(pe(!0),ze(ae,null,ps(H(f),L=>(pe(),tn(Vs,{key:L.plate,veh:L,locales:H(o),damagePercent:H(a),action:H(p),"action-type":"spawn",poundCost:H(r),onAction:H(p)},null,8,["veh","locales","damagePercent","action","poundCost","onAction"]))),128))],8,Ll)],512),[[nt,H(n)==="garage"]]),He($("div",Nl,[$("div",Dl,[He($("input",{id:"search-impounded",type:"search",placeholder:H(o).search_placeholder,"onUpdate:modelValue":F[4]||(F[4]=L=>X(i)?i.value=L:null)},null,8,Hl),[[$s,H(i)]])]),He($("h2",{class:"empty"},te(H(o).no_veh_impounded),513),[[nt,!H(h).length]]),$("div",{class:"vehicle-list","aria-label":z.value},[(pe(!0),ze(ae,null,ps(H(h),L=>(pe(),tn(Vs,{key:L.plate,veh:L,locales:H(o),damagePercent:H(a),action:H(m),"action-type":"impound",onAction:H(m)},null,8,["veh","locales","damagePercent","action","onAction"]))),128))],8,$l)],512),[[nt,H(n)==="impounded"]])])],512)),[[nt,H(t)]])}},Vl=(e,t)=>{const n=e.__vccOpts||e;for(const[s,i]of t)n[s]=i;return n},Ul={__name:"App",setup(e){return(t,n)=>(pe(),tn(jl))}},Kl=Vl(Ul,[["__scopeId","data-v-9a622185"]]);gl(Kl).mount("#app"); diff --git a/[esx_addons]/esx_garage/nui/ui.html b/[esx_addons]/esx_garage/nui/ui.html deleted file mode 100644 index 3509705b..00000000 --- a/[esx_addons]/esx_garage/nui/ui.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -
- - - -
- - - - - diff --git a/[esx_addons]/esx_garage/web/.gitignore b/[esx_addons]/esx_garage/web/.gitignore new file mode 100644 index 00000000..ab267f80 --- /dev/null +++ b/[esx_addons]/esx_garage/web/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/ +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +node_modules/ diff --git a/[esx_addons]/esx_garage/web/index.html b/[esx_addons]/esx_garage/web/index.html new file mode 100644 index 00000000..fcbd67f1 --- /dev/null +++ b/[esx_addons]/esx_garage/web/index.html @@ -0,0 +1,13 @@ + + + + + + + ESX + + +
+ + + diff --git a/[esx_addons]/esx_garage/web/package-lock.json b/[esx_addons]/esx_garage/web/package-lock.json new file mode 100644 index 00000000..45198bbe --- /dev/null +++ b/[esx_addons]/esx_garage/web/package-lock.json @@ -0,0 +1,1887 @@ +{ + "name": "web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "1.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.14", + "tailwindcss": "^4.1.14", + "vue": "^3.5.22" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "vite": "^7.1.7" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", + "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz", + "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.0", + "lightningcss": "1.30.1", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz", + "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.5.1" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-arm64": "4.1.14", + "@tailwindcss/oxide-darwin-x64": "4.1.14", + "@tailwindcss/oxide-freebsd-x64": "4.1.14", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", + "@tailwindcss/oxide-linux-x64-musl": "4.1.14", + "@tailwindcss/oxide-wasm32-wasi": "4.1.14", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz", + "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz", + "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz", + "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz", + "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz", + "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz", + "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz", + "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz", + "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz", + "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz", + "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.5", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz", + "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz", + "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.14.tgz", + "integrity": "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.14", + "@tailwindcss/oxide": "4.1.14", + "tailwindcss": "4.1.14" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "vue": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "license": "MIT" + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz", + "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + } + } +} diff --git a/[esx_addons]/esx_garage/web/package.json b/[esx_addons]/esx_garage/web/package.json new file mode 100644 index 00000000..4f24410e --- /dev/null +++ b/[esx_addons]/esx_garage/web/package.json @@ -0,0 +1,19 @@ +{ + "name": "web", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.14", + "tailwindcss": "^4.1.14", + "vue": "^3.5.22" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "vite": "^7.1.7" + } +} diff --git a/[esx_addons]/esx_garage/web/public/fonts/roboto.ttf b/[esx_addons]/esx_garage/web/public/fonts/roboto.ttf new file mode 100644 index 00000000..7d9a6c4c Binary files /dev/null and b/[esx_addons]/esx_garage/web/public/fonts/roboto.ttf differ diff --git a/[esx_addons]/esx_garage/web/src/App.vue b/[esx_addons]/esx_garage/web/src/App.vue new file mode 100644 index 00000000..b0942897 --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/App.vue @@ -0,0 +1,10 @@ + + + + + diff --git a/[esx_addons]/esx_garage/web/src/assets/logo.png b/[esx_addons]/esx_garage/web/src/assets/logo.png new file mode 100644 index 00000000..e08a82bf Binary files /dev/null and b/[esx_addons]/esx_garage/web/src/assets/logo.png differ diff --git a/[esx_addons]/esx_garage/web/src/components/Main.vue b/[esx_addons]/esx_garage/web/src/components/Main.vue new file mode 100644 index 00000000..39b10542 --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/components/Main.vue @@ -0,0 +1,83 @@ + + + diff --git a/[esx_addons]/esx_garage/web/src/components/VehicleCard.vue b/[esx_addons]/esx_garage/web/src/components/VehicleCard.vue new file mode 100644 index 00000000..4257195a --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/components/VehicleCard.vue @@ -0,0 +1,45 @@ + + + diff --git a/[esx_addons]/esx_garage/web/src/composables/useGarage.js b/[esx_addons]/esx_garage/web/src/composables/useGarage.js new file mode 100644 index 00000000..08ca67c8 --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/composables/useGarage.js @@ -0,0 +1,147 @@ +import { reactive, computed, onMounted, onBeforeUnmount, toRefs } from 'vue'; + +function clamp(n, min, max) { return Math.max(min, Math.min(max, n)); } + +export function useGarage() { + const state = reactive({ + visible: false, + tab: 'garage', + vehicles: [], + impoundedVehicles: [], + searchGarage: '', + searchImpounded: '', + spawnPoint: null, + poundCost: 0, + poundName: '', + poundSpawnPoint: null, + impoundOnly: false, + locales: { + garage_title: 'Garage', + garage_tab: 'Garage', + impounded_tab: 'Impounded', + veh_model: 'Model', + veh_plate: 'Plate', + veh_condition: 'Condition', + action: 'Retrieve', + impound_action: 'Release', + no_veh_parking: 'No Vehicles Stored Here.', + no_veh_impounded: 'No Impounded Vehicles.', + search_placeholder: 'Search by model or plate…' + } + }); + + const filteredGarage = computed(() => { + const q = state.searchGarage.trim().toLowerCase(); + if (!q) return state.vehicles; + return state.vehicles.filter(v => (String(v.model||'').toLowerCase().includes(q) || String(v.plate||'').toLowerCase().includes(q))); + }); + + const filteredImpounded = computed(() => { + const q = state.searchImpounded.trim().toLowerCase(); + if (!q) return state.impoundedVehicles; + return state.impoundedVehicles.filter(v => (String(v.model||'').toLowerCase().includes(q) || String(v.plate||'').toLowerCase().includes(q))); + }); + + function damagePercent(veh) { + const p = veh.props || {}; + const b = clamp(((typeof p.bodyHealth === 'number' ? p.bodyHealth : 1000) / 1000) * 100, 0, 100); + const e = clamp(((typeof p.engineHealth === 'number' ? p.engineHealth : 1000) / 1000) * 100, 0, 100); + const t = clamp(((typeof p.tankHealth === 'number' ? p.tankHealth : 1000) / 1000) * 100, 0, 100); + return clamp(Math.round(((b + e + t) / 300) * 100), 0, 100); + } + + function post(endpoint, payload) { + fetch(`https://esx_garage/${endpoint}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json; charset=utf-8' }, + body: JSON.stringify(payload || {}) + }); + } + + function openMenu(data) { + state.visible = true; + state.impoundOnly = data.type === 'impound'; + state.tab = state.impoundOnly ? 'impounded' : 'garage'; + if (data.locales) Object.assign(state.locales, data.locales); + state.spawnPoint = data.spawnPoint || null; + if (typeof data.poundCost === 'number') state.poundCost = data.poundCost; + const safeParse = (label, raw) => { + if (!raw) return []; + if (typeof raw === 'object') return Array.isArray(raw) ? raw.slice() : raw; + if (Array.isArray(raw)) { + raw = raw[0]; + } + if (typeof raw !== 'string') return []; + return JSON.parse(raw); + }; + + state.vehicles = safeParse('vehiclesList', data.vehiclesList); + state.impoundedVehicles = safeParse('vehiclesImpoundedList', data.vehiclesImpoundedList); + state.poundName = data.poundName || ''; + state.poundSpawnPoint = data.poundSpawnPoint || null; + } + + function hideAll() { + state.visible = false; + state.searchGarage = ''; + state.searchImpounded = ''; + } + + function spawnVehicle(veh) { + post('spawnVehicle', { + vehicleProps: veh.props, + spawnPoint: state.spawnPoint, + exitVehicleCost: state.poundCost || 0 + }); + hideAll(); + } + + function impoundVehicle(veh) { + post('impound', { + vehicleProps: veh.props, + poundName: state.poundName, + poundSpawnPoint: state.poundSpawnPoint + }); + hideAll(); + } + + function closeUI() { + post('escape', {}); + hideAll(); + } + + function onMessage(e) { + const data = e.data || {}; + if (!data.showMenu && !data.hideAll) return; + if (data.showMenu) openMenu(data); + else if (data.hideAll) hideAll(); + } + + function onKey(e) { + if (e.key === 'Escape' && state.visible) { + closeUI(); + } + } + + onMounted(() => { + window.addEventListener('message', onMessage); + window.addEventListener('keyup', onKey); + }); + + onBeforeUnmount(() => { + window.removeEventListener('message', onMessage); + window.removeEventListener('keyup', onKey); + }); + + return { + ...toRefs(state), + filteredGarage, + filteredImpounded, + damagePercent, + spawnVehicle, + impoundVehicle, + closeUI + }; +} + +export default useGarage; diff --git a/[esx_addons]/esx_garage/web/src/main.js b/[esx_addons]/esx_garage/web/src/main.js new file mode 100644 index 00000000..2425c0f7 --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/main.js @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/[esx_addons]/esx_garage/web/src/style.css b/[esx_addons]/esx_garage/web/src/style.css new file mode 100644 index 00000000..65f7abe1 --- /dev/null +++ b/[esx_addons]/esx_garage/web/src/style.css @@ -0,0 +1,82 @@ +@import "tailwindcss"; +@font-face { font-family: 'Roboto'; src: url('/fonts/roboto.ttf') format('truetype'); font-display: swap; } + +:root { + --brand: #FB9B04; + --darkest: #161616; + --dark: #252525; + --mid: #383838; + --light: #969696; + --lightest: #F2F2F2; + --toolbar-h: 50px; + --radius-lg: 16px; + --radius-md: 12px; + --radius-sm: 8px; + --shadow-1: 0 10px 30px rgba(0,0,0,.35); + --shadow-2: 0 6px 18px rgba(0,0,0,.25); + --transition-fast: 160ms cubic-bezier(.2,.7,.2,1); + --transition-med: 260ms cubic-bezier(.2,.7,.2,1); +} + +html, body { width:100%; height:100%; background:transparent; } +body { margin:0; background:transparent; color:var(--lightest); font:500 14px/1.45 'Roboto', system-ui,-apple-system,Segoe UI,Arial,sans-serif; overflow:hidden; } + +#container { position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); width:min(1000px, calc(100vw - 64px)); height:min(700px, calc(100vh - 64px)); display:none; background:linear-gradient(180deg,var(--dark),var(--darkest)); border:1px solid rgba(255,255,255,.06); border-radius:var(--radius-lg); box-shadow:var(--shadow-1); grid-template-columns:280px 1fr; grid-template-rows:1fr; overflow:hidden; } +#container[style*='display:grid'] { display:grid !important; } + +#container::before { content:''; height:56px; background:linear-gradient(90deg, rgba(251,155,4,.24) 0%, transparent 40%), linear-gradient(180deg, rgba(255,255,255,.06), transparent); border-bottom:1px solid rgba(255,255,255,.06); position:absolute; top:0; left:0; right:0; z-index:0; } + +/* Header / Sidebar */ +#header { grid-column:1 / 2; padding-top:56px; position:relative; } +#header .title { padding:18px 20px 10px 20px; font-size:20px; font-weight:700; letter-spacing:.2px; color:var(--lightest); z-index:1; } +#header .close { position:absolute; top:28px; right:14px; transform:translateY(-50%); width:36px; height:36px; display:grid; place-items:center; color:var(--lightest); background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.08); border-radius:50%; cursor:pointer; font-size:18px; transition:transform var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast); } +#header .close:hover { background:rgba(251,155,4,.15); border-color:rgba(251,155,4,.35); } +#header ul { list-style:none; margin:8px 0 0 0; padding:10px 8px 8px 12px; display:flex; flex-direction:column; gap:6px; z-index:1; } +#header li { cursor:pointer; display:flex; align-items:center; gap:10px; padding:12px 0 12px 22px; width:100%; box-sizing:border-box; color:var(--lightest); border-radius:var(--radius-md); border:1px solid transparent; position:relative; transition:background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast); } +#header li::before { content:''; position:absolute; left:6px; top:50%; transform:translateY(-50%); width:4px; height:60%; border-radius:4px; background:transparent; } +#header li:hover { background:rgba(56,56,56,.45); border-color:rgba(255,255,255,.08); } +#header li.selected { background:rgba(56,56,56,.6); border-color:rgba(251,155,4,.45); color:var(--lightest); } +#header li.selected::before { background:var(--brand); } + +/* Main area */ +#menu { grid-column:2 / -1; padding-top:56px; padding-left:8px; height:100%; box-sizing:border-box; min-height:0; display:flex; flex-direction:column; overflow:hidden; } +.content, .impounded_content { width:100%; flex:1 1 auto; min-height:0; color:var(--lightest); overflow:hidden; display:flex; flex-direction:column; } +.content .empty, .impounded_content .empty { opacity:.7; font-weight:500; text-align:center; margin-top:18vh; } + +/* Vehicle lists */ +.content .vehicle-list, .impounded_content .vehicle-list { flex:1 1 0%; min-height:0; overflow-y:scroll; -ms-overflow-style:none; -webkit-overflow-scrolling:touch; overscroll-behavior:contain; overflow-x:hidden; height:calc(100% - var(--toolbar-h)); width:96%; max-width:96%; margin:0 auto; box-sizing:border-box; display:grid; grid-template-columns:repeat(2,1fr); column-gap:12px; padding:10px 0 0 0; row-gap:36px; align-content:start; align-items:start; justify-items:stretch; grid-auto-rows:auto; } +.content .vehicle-list::after, .impounded_content .vehicle-list::after { content:''; display:block; } +@media (max-width: 820px) { .content .vehicle-list, .impounded_content .vehicle-list { grid-template-columns:1fr; } } + +/* Toolbar */ +.toolbar { display:flex; align-items:center; width:96%; padding:10px 0 0 0; margin:0 auto; box-sizing:border-box; overflow:hidden; flex:0 0 auto; height:var(--toolbar-h); } +.toolbar input[type="search"] { flex:1 1 auto; width:100%; height:100%; display:block; padding:10px 12px; border-radius:var(--radius-sm); border:1px solid rgba(255,255,255,.08); background:rgba(56,56,56,.55); color:var(--lightest); outline:none; } +.toolbar input[type="search"]::placeholder { color:rgba(242,242,242,.55); } +.toolbar input[type="search"]:focus { border-color:rgba(251,155,4,.55); box-shadow:0 0 0 3px rgba(251,155,4,.12); } + +/* Cards */ +.vehicle-listing { display:flex; flex-direction:column; gap:10px; background:linear-gradient(180deg, rgba(56,56,56,.45), rgba(37,37,37,.85)); border:1px solid rgba(255,255,255,.06); border-radius:var(--radius-md); padding:16px; min-height:148px; width:100%; box-sizing:border-box; position:relative; z-index:0; transition:border-color var(--transition-fast), box-shadow var(--transition-fast); } +.vehicle-listing:hover { border-color:rgba(251,155,4,.45); box-shadow:var(--shadow-2); z-index:1; } +.vehicle-listing div { display:flex; align-items:center; justify-content:space-between; color:var(--lightest); } +.vehicle-listing strong { color:var(--lightest); } + +/* Condition bar */ +.condition { display:flex; align-items:center; gap:8px; } +.condition .bar { flex:1; height:8px; background:rgba(255,255,255,.08); border-radius:999px; overflow:hidden; } +.condition .fill { height:100%; width:0%; background:linear-gradient(90deg, #ffad2e, var(--brand)); border-radius:999px; transition:width var(--transition-med); } +.condition .percent { display:inline-block; } + +/* Buttons */ +.unstyled-button { background:none; border:none; padding:0; font:inherit; color:inherit; } +.vehicle-action { align-self:stretch; display:inline-flex; justify-content:center; align-items:center; gap:8px; padding:12px 14px; border-radius:var(--radius-sm); border:1px solid rgba(255,255,255,.08); color:var(--darkest); background:linear-gradient(180deg, #ffad2e, var(--brand)); font-weight:700; letter-spacing:.2px; cursor:pointer; transition:transform var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast); } +.vehicle-action:hover { transform:translateY(-1px); box-shadow:0 6px 18px rgba(251,155,4,.25); border-color:rgba(251,155,4,.55); } +.vehicle-action.red { color:var(--lightest); background:linear-gradient(180deg, #d87070, #b35252); border-color:rgba(255,255,255,.08); } +.vehicle-action.red:hover { box-shadow:0 6px 18px rgba(179,82,82,.25); border-color:rgba(179,82,82,.55); } +.logo-left { position:absolute; left:16px; top:28px; transform:translateY(-50%); height:32px; width:auto; filter:drop-shadow(0 4px 14px rgba(0,0,0,.35)); user-select:none; pointer-events:none; } +.content .vehicle-list, .impounded_content .vehicle-list { scrollbar-width:none; } +.content .vehicle-list::-webkit-scrollbar, .impounded_content .vehicle-list::-webkit-scrollbar { width:0 !important; height:0 !important; } +@media (prefers-reduced-motion: reduce) { * { transition:none !important; animation:none !important; } } +#header { position:static; } +#header .close { position:absolute; top:28px; right:14px; z-index:10; } +::selection { background:transparent; color:inherit; } +::-moz-selection { background:transparent; color:inherit; } diff --git a/[esx_addons]/esx_garage/web/vite.config.js b/[esx_addons]/esx_garage/web/vite.config.js new file mode 100644 index 00000000..e33525d4 --- /dev/null +++ b/[esx_addons]/esx_garage/web/vite.config.js @@ -0,0 +1,32 @@ +import { defineConfig } from 'vite' +import tailwindcss from '@tailwindcss/vite' +import vue from '@vitejs/plugin-vue' +import { resolve } from 'path' + +export default defineConfig({ + plugins: [vue(), tailwindcss()], + base: './', + build: { + outDir: '../nui', + emptyOutDir: true, + assetsDir: 'assets', + rollupOptions: { + output: { + entryFileNames: 'js/[name].js', + chunkFileNames: 'js/[name].js', + assetFileNames: (assetInfo) => { + const ext = assetInfo.name ? assetInfo.name.split('.').pop() : '' + if (/ttf|otf|woff2?|eot/i.test(ext)) return 'fonts/[name][extname]' + if (/png|jpe?g|gif|svg|webp|ico/i.test(ext)) return 'img/[name][extname]' + if (/css/i.test(ext)) return 'css/[name][extname]' + return 'assets/[name][extname]' + } + } + } + }, + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + } +}) diff --git a/[esx_addons]/esx_policejob/server/main.lua b/[esx_addons]/esx_policejob/server/main.lua index d1fa3df8..68f435fa 100644 --- a/[esx_addons]/esx_policejob/server/main.lua +++ b/[esx_addons]/esx_policejob/server/main.lua @@ -253,12 +253,15 @@ ESX.RegisterServerCallback('esx_policejob:getArmoryWeapons', function(source, cb end) ESX.RegisterServerCallback('esx_policejob:addArmoryWeapon', function(source, cb, weaponName, removeWeapon) - local xPlayer = ESX.Player(source) - - if removeWeapon then - xPlayer.removeWeapon(weaponName) - end - + local xPlayer = ESX.Player(source) + + if removeWeapon then + if not xPlayer.hasWeapon(weaponName) then + return cb() + end + xPlayer.removeWeapon(weaponName) + end + TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store) local weapons = store.get('weapons') or {} local foundWeapon = false diff --git a/[esx_addons]/esx_taxijob/client/main.lua b/[esx_addons]/esx_taxijob/client/main.lua index a558e524..23a0ccb4 100644 --- a/[esx_addons]/esx_taxijob/client/main.lua +++ b/[esx_addons]/esx_taxijob/client/main.lua @@ -1,6 +1,6 @@ -local HasAlreadyEnteredMarker, OnJob, IsNearCustomer, CustomerIsEnteringVehicle, CustomerEnteredVehicle, +local show_text, OnJob, IsNearCustomer, CustomerIsEnteringVehicle, CustomerEnteredVehicle, CurrentActionData = false, false, false, false, false, {} -local CurrentCustomer, CurrentCustomerBlip, DestinationBlip, targetCoords, LastZone, CurrentAction, CurrentActionMsg, lastSelectedNPC +local CurrentCustomer, CurrentCustomerBlip, DestinationBlip, targetCoords, CurrentAction, CurrentActionMsg, lastSelectedNPC RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) @@ -414,49 +414,7 @@ function OpenPutStocksMenu() end) end -AddEventHandler('esx_taxijob:hasEnteredMarker', function(zone) - if zone == 'VehicleSpawner' then - CurrentAction = 'vehicle_spawner' - CurrentActionMsg = TranslateCap('spawner_prompt') - CurrentActionData = {} - elseif zone == 'VehicleDeleter' then - local playerPed = PlayerPedId() - local vehicle = GetVehiclePedIsIn(playerPed, false) - - if IsPedInAnyVehicle(playerPed, false) and GetPedInVehicleSeat(vehicle, -1) == playerPed then - CurrentAction = 'delete_vehicle' - CurrentActionMsg = TranslateCap('store_veh') - CurrentActionData = { - vehicle = vehicle - } - end - elseif zone == 'TaxiActions' then - CurrentAction = 'taxi_actions_menu' - CurrentActionMsg = TranslateCap('press_to_open') - CurrentActionData = {} - elseif zone == 'Cloakroom' then - CurrentAction = 'cloakroom' - CurrentActionMsg = TranslateCap('cloakroom_prompt') - CurrentActionData = {} - end -end) - -AddEventHandler('esx_taxijob:hasExitedMarker', function(zone) - ESX.CloseContext() - CurrentAction = nil -end) - -RegisterNetEvent('esx_phone:loaded') -AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts) - local specialContact = { - name = TranslateCap('phone_taxi'), - number = 'taxi', - base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGGElEQVR4XsWWW2gd1xWGv7Vn5pyRj47ut8iOYlmyWxw1KSZN4riOW6eFuCYldaBtIL1Ag4NNmt5ICORCaNKXlF6oCy0hpSoJKW4bp7Sk6YNb01RuLq4d0pQ0kWQrshVJ1uX46HJ0zpy5rCKfQYgjCUs4kA+GtTd786+ftW8jqsqHibB6TLZn2zeq09ZTWAIWCxACoTI1E+6v+eSpXwHRqkVZPcmqlBzCApLQ8dk3IWVKMQlYcHG81OODNmD6D7d9VQrTSbwsH73lFKePtvOxXSfn48U+Xpb58fl5gPmgl6DiR19PZN4+G7iODY4liIAACqiCHyp+AFvb7ML3uot1QP5yDUim292RtIqfU6Lr8wFVDVV8AsPKRDAxzYkKm2kj5sSFuUT3+v2FXkDXakD6f+7c1NGS7Ml0Pkah6jq8mhvwUy7Cyijg5Aoks6/hTp+k7vRjDJ73dmw8WHxlJRM2y5Nsb3GPDuzsZURbGMsUmRkoUPByCMrKCG7SobJiO01X7OKq6utoe3XX34BaoLDaCljj3faTcu3j3z3T+iADwzNYEmKIWcGAIAtqqkKAxZa2Sja/tY+59/7y48aveQ8A4Woq4Fa3bj7Q1/EgwWRAZ52NMTYCWAZEwIhBUEQgUiVQ8IpKvqj4kVJCyGRCRrb+hvap+gPAo0DuUhWQfx2q29u+t/vPmarbCLwII7qQTEQRLbUtBJ2PAkZARBADqkLBV/I+BGrhpoSN577FWz3P3XbTvRMvAlpuwC4crv5jwtK9RAFSu46+G8cRwESxQ+K2gESAgCiIASHuA8YCBdSUohdCKGCF0H6iGc3MgrEphvKi+6Wp24HABioSjuxFARGobyJ5OMXEiGHW6iLR0EmifhPJDddj3CoqtuwEZSkCc73/RAvTeEOvU5w8gz/Zj2TfoLFFibZvQrI5EOFiPqgAZmzApTINKKgPiW20ffkXtPXfA9Ysmf5/kHn/T0z8e5rpCS5JVQNUN1ayfn2a+qvT2JWboOOXMPg0ms6C2IAAWTc2ACPeupdbm5yb8XNQczOM90DOB0uoa01Ttz5FZ6IL3Ctg9DUIg7Lto2DZ0HIDFEbAz4AaiBRyxZJe9U7kQg84KYbH/JeJESANXPXwXdWffvzu1p+x5VE4/ST4EyAOoEAI6WsAhdx/AYulhJDqAgRm/hPPEVAfnAboeAB6v88jTw/f98SzU8eAwbgC5IGRg3vsW3E7YewYzJwF4wAhikJURGqvBO8ouAFIxBI0gqgPEp9B86+ASSAIEEHhbEnX7eTgnrFbn3iW5+K82EAA+M2V+d2EeRj9K/izIBYgJZGwCO4Gzm/uRQOwDEsI41PSfPZ+xJsBKwFo6dOwpJvezMU84Md5sSmRCM51uacGbUKvHWEjAKIelXaGJqePyopjzFTdx6Ef/gDbjo3FKEoQKN+8/yEqRt8jf67IaNDBnF9FZFwERRGspMM20+XC64nym9AMhSE1G7fjbb0bCQsISi6vFCdPMPzuUwR9AcmOKQ7cew+WZcq3IGEYMZeb4p13sjjmU4TX7Cfdtp0oDAFBbZfk/37N0MALAKbcAKaY4yPeuwy3t2J8MAKDIxDVd1Lz8Ts599vb8Wameen532GspRWIQmXPHV8k0BquvPP3TOSgsRmiCFRAHWh9420Gi7nl34JaBen7O7UWRMD740AQ7yEf8nW78TIeN+7+PCIsOYaqMJHxqKtpJ++D+DA5ARsawEmASqzv1Cz7FjRpbt951tUAOcAHdNEUC7C5NAJo7Dws03CAFMxlkdSRZmCMxaq8ejKuVwSqIJfzA61LmyIgBoxZfgmYmQazKLGumHitRso0ZVkD0aE/FI7UrYv2WUYXjo0ihNhEatA1GBEUIxEWAcKCHhHCVMG8AETlda0ENn3hrm+/6Zh47RBCtXn+mZ/sAXzWjnPHV77zkiXBgl6gFkee+em1wBlgdnEF8sCF5moLI7KwlSIMwABwgbVT21htMNjleheAfPkShEBh/PzQccexdxBT9IPjQAYYZ+3o2OjQ8cQiPb+kVwBCliENXA3sAm6Zj3E/zaq4fD07HmwEmuKYXsUFcDl6Hz7/B1RGfEbPim/bAAAAAElFTkSuQmCC' - } - - TriggerEvent('esx_phone:addSpecialContact', specialContact.name, specialContact.number, specialContact.base64Icon) -end) -- Create Blips CreateThread(function() @@ -474,18 +432,16 @@ CreateThread(function() EndTextCommandSetBlipName(blip) end) --- Enter / Exit marker events, and draw markers CreateThread(function() while true do local sleep = 1500 + local playerCoords = GetEntityCoords(PlayerPedId()) + local isInMarker = false + if ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then - - local coords = GetEntityCoords(PlayerPedId()) - local isInMarker, currentZone = false - for k, v in pairs(Config.Zones) do local zonePos = vector3(v.Pos.x, v.Pos.y, v.Pos.z) - local distance = #(coords - zonePos) + local distance = #(playerCoords - zonePos) if v.Type ~= -1 and distance < Config.DrawDistance then sleep = 0 @@ -493,21 +449,54 @@ CreateThread(function() v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, false, 2, v.Rotate, nil, nil, false) end - if distance < v.Size.x then - isInMarker, currentZone = true, k + if distance < v.Size.x and v.Type ~= -1 then + if k == 'VehicleDeleter' then + local playerPed = PlayerPedId() + local vehicle = GetVehiclePedIsIn(playerPed, false) + + if IsPedInAnyVehicle(playerPed, false) and GetPedInVehicleSeat(vehicle, -1) == playerPed then + isInMarker = true + CurrentAction = 'delete_vehicle' + CurrentActionMsg = TranslateCap('store_veh') + CurrentActionData = { + vehicle = vehicle + } + end + else + isInMarker = true + CurrentAction = k:lower() + CurrentActionMsg = TranslateCap(k:lower() .. '_prompt') + CurrentActionData = {} + end end end + end + + if isInMarker and not show_text then + show_text = true + ESX.TextUI(CurrentActionMsg) + elseif not isInMarker and show_text then + show_text = false + ESX.HideUI() + CurrentAction = nil + end + + if CurrentAction and not ESX.PlayerData.dead then + if IsControlJustReleased(0, 38) and ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then + if CurrentAction == 'taxiactions' then + OpenTaxiActionsMenu() + elseif CurrentAction == 'cloakroom' then + OpenCloakroom() + elseif CurrentAction == 'vehiclespawner' then + OpenVehicleSpawnerMenu() + elseif CurrentAction == 'delete_vehicle' then + DeleteJobVehicle() + end - if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then - HasAlreadyEnteredMarker, LastZone = true, currentZone - TriggerEvent('esx_taxijob:hasEnteredMarker', currentZone) - end - - if not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_taxijob:hasExitedMarker', LastZone) + CurrentAction = nil end end + Wait(sleep) end end) @@ -691,31 +680,7 @@ CreateThread(function() end end) --- Key Controls -CreateThread(function() - while true do - local sleep = 1500 - if CurrentAction and not ESX.PlayerData.dead then - sleep = 0 - ESX.ShowHelpNotification(CurrentActionMsg) - - if IsControlJustReleased(0, 38) and ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then - if CurrentAction == 'taxi_actions_menu' then - OpenTaxiActionsMenu() - elseif CurrentAction == 'cloakroom' then - OpenCloakroom() - elseif CurrentAction == 'vehicle_spawner' then - OpenVehicleSpawnerMenu() - elseif CurrentAction == 'delete_vehicle' then - DeleteJobVehicle() - end - CurrentAction = nil - end - end - Wait(sleep) - end -end) RegisterCommand('taximenu', function() if not ESX.PlayerData.dead and Config.EnablePlayerManagement and ESX.PlayerData.job and ESX.PlayerData.job.name == diff --git a/[esx_addons]/esx_taxijob/locales/de.lua b/[esx_addons]/esx_taxijob/locales/de.lua index b258f55e..675a232b 100644 --- a/[esx_addons]/esx_taxijob/locales/de.lua +++ b/[esx_addons]/esx_taxijob/locales/de.lua @@ -7,6 +7,7 @@ Locales['de'] = { -- garage ['spawner_prompt'] = 'Drücke ~INPUT_CONTEXT~ um die ~y~garage~s~ zu öffnen!.', + ['vehiclespawner_prompt'] = 'Drücke ~INPUT_CONTEXT~ um die ~y~garage~s~ zu öffnen!.', ["vehicle_spawned"] = "%s erfolgreich geparkt !", ['store_veh'] = 'Drücke ~INPUT_CONTEXT~ um das Fahrzeug zu parken', ['spawn_veh'] = 'Fahrzeug ausparken', @@ -19,6 +20,7 @@ Locales['de'] = { ['full_service'] = 'Voller Service: ', ['amount_invalid'] = 'Betrag ungültig', ['press_to_open'] = 'Drücke ~INPUT_CONTEXT~ um das Menü zu öffnen', + ['taxiactions_prompt'] = 'Drücke ~INPUT_CONTEXT~ um das Menü zu öffnen', ['billing'] = 'Rechnung', ['billing_sent'] = 'Die rechnung wurde registriert!!', ['invoice_amount'] = 'Rechnugsbetrag', @@ -44,17 +46,15 @@ Locales['de'] = { ['quantity'] = 'Anzahl', ['quantity_invalid'] = 'Ungültige Anzahl!!', ['inventory'] = 'Inventar', - ['taxi_client'] = 'Taxi Client', ['have_withdrawn'] = 'Du zahlst aus ~y~x%s~s~ ~b~%s~s~€', ['have_deposited'] = 'Du zahlst ein ~y~x%s~s~ ~b~%s~s~€', ['player_cannot_hold'] = 'Du hast ~r~nicht~s~ genügend ~y~freien platz~s~ in deinem Inventar!', ['blip_taxi'] = 'Taxi', - ['phone_taxi'] = 'Taxi', ['taxi'] = 'Taxi', ['taxi_stock'] = 'Lager', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "Betrag", + ['bill_amount'] = "Zu berechnender Betrag..", + ['deposit_amount'] = "Einzuzahlender Betrag..", + ['withdraw_amount'] = "Abzuhebender Betrag..", + ['confirm'] = "Bestätigen", } diff --git a/[esx_addons]/esx_taxijob/locales/en.lua b/[esx_addons]/esx_taxijob/locales/en.lua index bad2fa1d..d63259c8 100644 --- a/[esx_addons]/esx_taxijob/locales/en.lua +++ b/[esx_addons]/esx_taxijob/locales/en.lua @@ -7,6 +7,7 @@ Locales['en'] = { -- garage ['spawner_prompt'] = 'press [E] to access the Garage.', + ['vehiclespawner_prompt'] = 'press [E] to access the Garage.', ["vehicle_spawned"] = "Successfully Spawned A ~b~%s!", ['store_veh'] = 'press [E] to store the vehicle', ['spawn_veh'] = 'spawn vehicle', @@ -19,6 +20,7 @@ Locales['en'] = { ['full_service'] = 'full service: ', ['amount_invalid'] = 'amount invalid', ['press_to_open'] = 'press [E] to access the menu', + ['taxiactions_prompt'] = 'press [E] to access the menu', ['billing'] = 'billing', ['billing_sent'] = 'the bill has been registered!', ['invoice_amount'] = 'invoice amount', @@ -44,12 +46,10 @@ Locales['en'] = { ['quantity'] = 'quantity', ['quantity_invalid'] = 'that is an invalid quantity!', ['inventory'] = 'inventory', - ['taxi_client'] = 'taxi Client', ['have_withdrawn'] = 'you have withdrawn x%s %s', ['have_deposited'] = 'you have deposited x%s %s', ['player_cannot_hold'] = 'you do ~r~not have enough free space in your inventory!', ['blip_taxi'] = 'downtown Cab Co.', - ['phone_taxi'] = 'downtown Cab Co.', ['taxi'] = 'taxi', ['taxi_stock'] = 'taxi Stock', ['amount'] = "Amount", diff --git a/[esx_addons]/esx_taxijob/locales/es.lua b/[esx_addons]/esx_taxijob/locales/es.lua index 41886e5d..a1a62ede 100644 --- a/[esx_addons]/esx_taxijob/locales/es.lua +++ b/[esx_addons]/esx_taxijob/locales/es.lua @@ -7,6 +7,7 @@ Locales['es'] = { -- Garaje ['spawner_prompt'] = 'Presiona [E] para acceder al Garaje.', + ['vehiclespawner_prompt'] = 'Presiona [E] para acceder al Garaje.', ['store_veh'] = 'Presiona [E] para almacenar el vehículo', ['spawn_veh'] = 'Vehículo de generación', ['spawnpoint_blocked'] = '¡Hay un vehículo bloqueando el punto de generación!', @@ -20,6 +21,7 @@ Locales['es'] = { ['full_service'] = 'Servicio completo: ', ['amount_invalid'] = 'Cantidad inválida', ['press_to_open'] = 'Presiona [E] para acceder al menú', + ['taxiactions_prompt'] = 'Presiona [E] para acceder al menú', ['billing'] = 'Facturación', ['billing_sent'] = 'La factura ha sido registrada', ['invoice_amount'] = 'Factura inválida', @@ -45,15 +47,14 @@ Locales['es'] = { ['quantity'] = 'Cantidad', ['quantity_invalid'] = 'Cantidad inválida', ['inventory'] = 'Inventario', - ['taxi_client'] = 'Cliente', ['have_withdrawn'] = 'Has retirado x%s %s', ['have_deposited'] = 'Has depositado x%s %s', ['player_cannot_hold'] = '~r~No tienes suficiente espacio libre en tu inventario', ['blip_taxi'] = 'Downtown Cab Co.', - ['phone_taxi'] = 'Downtown Cab Co.', ['taxi'] = 'Taxi', ['taxi_stock'] = 'Inventario de Taxistas', ['amount'] = "Cantidad", + ['bill_amount'] = "Cantidad a facturar...", ['deposit_amount'] = "Cantidad a depositar...", ['withdraw_amount'] = "Cantidad a retirar...", ['confirm'] = "Confirmar", diff --git a/[esx_addons]/esx_taxijob/locales/fi.lua b/[esx_addons]/esx_taxijob/locales/fi.lua index 22f722ba..6fdbee67 100644 --- a/[esx_addons]/esx_taxijob/locales/fi.lua +++ b/[esx_addons]/esx_taxijob/locales/fi.lua @@ -7,6 +7,7 @@ Locales['fi'] = { -- garage ['spawner_prompt'] = 'Paina [E] avataksesi talli.', + ['vehiclespawner_prompt'] = 'Paina [E] avataksesi talli.', ['store_veh'] = 'Paina [E] laittaaksesi ajoneuvo talliin', ['spawn_veh'] = 'Luo ajoneuvo', ['spawnpoint_blocked'] = 'Jokin ajoneuvo estää ajoneuvon luomisen!', @@ -19,6 +20,7 @@ Locales['fi'] = { ['full_service'] = 'Täysi palvelu: ', ['amount_invalid'] = 'Virheellinen summa', ['press_to_open'] = 'Paina [E] avataksesi valikko', + ['taxiactions_prompt'] = 'Paina [E] avataksesi valikko', ['billing'] = 'Laskutus', ['billing_sent'] = 'Lasku on rekisteröity!', ['invoice_amount'] = 'Laskun määrä', @@ -44,17 +46,15 @@ Locales['fi'] = { ['quantity'] = 'Määrä', ['quantity_invalid'] = 'Virheellinen määrä', ['inventory'] = 'Reppu', - ['taxi_client'] = 'Taksi asiakas', ['have_withdrawn'] = 'Sinä nostit x%s %s', ['have_deposited'] = 'Sinä talletit x%s %s', ['player_cannot_hold'] = 'Sinulla ~r~ei ole enempää vapaata tilaa repussasi!', ['blip_taxi'] = 'Taksi', - ['phone_taxi'] = 'Taksi', ['taxi'] = 'Taksi', ['taxi_stock'] = 'Taksi varasto', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "Summa", + ['bill_amount'] = "Laskutettava summa..", + ['deposit_amount'] = "Talletettava summa..", + ['withdraw_amount'] = "Nostettava summa..", + ['confirm'] = "Vahvista", } diff --git a/[esx_addons]/esx_taxijob/locales/fr.lua b/[esx_addons]/esx_taxijob/locales/fr.lua index 5f4602ac..9fad8d9d 100644 --- a/[esx_addons]/esx_taxijob/locales/fr.lua +++ b/[esx_addons]/esx_taxijob/locales/fr.lua @@ -7,6 +7,7 @@ Locales['fr'] = { -- garage ['spawner_prompt'] = 'appuyez sur [E] pour ouvrir le garage.', + ['vehiclespawner_prompt'] = 'appuyez sur [E] pour ouvrir le garage.', ['store_veh'] = 'appuyez sur [E] pour ranger le véhicule', ['spawn_veh'] = 'sortir véhicule', ['spawnpoint_blocked'] = 'un véhicule bloque la sortie!!', @@ -19,6 +20,7 @@ Locales['fr'] = { ['full_service'] = 'service complet : ', ['amount_invalid'] = 'montant invalide', ['press_to_open'] = 'appuyez sur [E] pour accéder au menu', + ['taxiactions_prompt'] = 'appuyez sur [E] pour accéder au menu', ['billing'] = 'facuration', ['billing_sent'] = 'la facture a bien été enregistrée!', ['invoice_amount'] = 'montant de la facture', @@ -44,12 +46,10 @@ Locales['fr'] = { ['quantity'] = 'Quantité', ['quantity_invalid'] = 'Quantité invalide', ['inventory'] = 'Inventaire', - ['taxi_client'] = 'client Taxi', ['have_withdrawn'] = 'vous avez pris x%s %s', ['have_deposited'] = 'vous avez déposé x%s %s', ['player_cannot_hold'] = 'vous n\'avez pas assez de place dans votre inventaire!', ['blip_taxi'] = 'taxi', - ['phone_taxi'] = 'taxi', ['taxi'] = 'taxi', ['taxi_stock'] = 'taxi Stock', ['amount'] = "Montant", diff --git a/[esx_addons]/esx_taxijob/locales/hu.lua b/[esx_addons]/esx_taxijob/locales/hu.lua index 247683f9..d87232d9 100644 --- a/[esx_addons]/esx_taxijob/locales/hu.lua +++ b/[esx_addons]/esx_taxijob/locales/hu.lua @@ -7,6 +7,7 @@ Locales['hu'] = { -- garage ['spawner_prompt'] = 'nyomd meg a [E] gombot a garázshoz.', + ['vehiclespawner_prompt'] = 'nyomd meg a [E] gombot a garázshoz.', ['store_veh'] = 'nyomd meg a [E] gombot az autó tárolásához', ['spawn_veh'] = 'autó lehívás', ['spawnpoint_blocked'] = 'egy autó blokkolja a lehívási helyet!', @@ -18,6 +19,7 @@ Locales['hu'] = { ['full_service'] = 'teljes szolgálat: ', ['amount_invalid'] = 'érvénytelen összeg', ['press_to_open'] = 'nyomj [E] gombot a menühöz', + ['taxiactions_prompt'] = 'nyomj [E] gombot a menühöz', ['billing'] = 'számlázás', ['billing_sent'] = 'a számlát regisztrálták!', ['invoice_amount'] = 'számla összeg', @@ -33,6 +35,7 @@ Locales['hu'] = { ['return_to_veh'] = 'ülj vissza a kocsiba hogy folytatni tudd a munkát', ['must_in_taxi'] = 'a munka indításához egy taxit kell hogy vezess', ['must_in_vehicle'] = 'a munka indításához egy járművet kell hogy vezess', + ['not_in_taxi'] = 'Elhagytad a taxit küldetés közben!', ['have_earned'] = 'kerestél: $%s', ['comp_earned'] = 'a vállalkozásod keresett: $%s - te kerestél: $%s', ['deposit_stock'] = 'készlet betétele', @@ -42,12 +45,10 @@ Locales['hu'] = { ['quantity'] = 'Mennyiség', ['quantity_invalid'] = 'érvénytelen összeg!', ['inventory'] = 'leltár', - ['taxi_client'] = 'taxi ügyfél', ['have_withdrawn'] = 'kivettél x%s %s', ['have_deposited'] = 'betettél x%s %s', ['player_cannot_hold'] = '~r~nincs elég üres helyed az inventoryban!', ['blip_taxi'] = 'Taxitársaság', - ['phone_taxi'] = 'Taxi Hívás', ['taxi'] = 'taxi', ['taxi_stock'] = 'taxi tároló', ['vehicle_spawned'] = 'Sikeresen lehívtad: ~b~%s!', diff --git a/[esx_addons]/esx_taxijob/locales/it.lua b/[esx_addons]/esx_taxijob/locales/it.lua index 72107e18..ac3c06c8 100644 --- a/[esx_addons]/esx_taxijob/locales/it.lua +++ b/[esx_addons]/esx_taxijob/locales/it.lua @@ -7,6 +7,7 @@ Locales['it'] = { -- garage ['spawner_prompt'] = 'premi [E] per accedere al garage.', + ['vehiclespawner_prompt'] = 'premi [E] per accedere al garage.', ["vehicle_spawned"] = "generato con successo un ~b~%s!", ['store_veh'] = 'premi [E] per depositare il veicolo', ['spawn_veh'] = 'genera veicolo', @@ -20,6 +21,7 @@ Locales['it'] = { ['full_service'] = 'servizio completo: ', ['amount_invalid'] = 'importo non valido', ['press_to_open'] = 'premi [E] per accedere al menu', + ['taxiactions_prompt'] = 'premi [E] per accedere al menu', ['billing'] = 'fattura', ['billing_sent'] = 'la fattura è stata registrata!', ['invoice_amount'] = 'importo fattura', @@ -47,12 +49,10 @@ Locales['it'] = { ['quantity' ] = 'quantità', ['quantity_invalid'] = 'questa quantità non è valida!', ['inventory'] = 'inventario', - ['taxi_client'] = 'cliente taxi', ['have_withdrawn'] = 'hai prelevato x%s %s', ['have_deposited'] = 'hai depositato x%s %s', ['player_cannot_hold'] = '~r~non hai abbastanza spazio libero nel tuo inventario!', ['blip_taxi'] = 'Downtown Cab Co.', - ['phone_taxi' ] = ' downtown Cab Co.', ['taxi' ] = 'taxi', ['taxi_stock'] = 'deposito dei taxi', ['menu_return'] = 'Indietro', diff --git a/[esx_addons]/esx_taxijob/locales/nl.lua b/[esx_addons]/esx_taxijob/locales/nl.lua index 0504b761..37de87dc 100644 --- a/[esx_addons]/esx_taxijob/locales/nl.lua +++ b/[esx_addons]/esx_taxijob/locales/nl.lua @@ -7,6 +7,7 @@ Locales['nl'] = { -- garage ['spawner_prompt'] = 'Druk op [E] om de Garage te gebruiken.', + ['vehiclespawner_prompt'] = 'Druk op [E] om de Garage te gebruiken.', ["vehicle_spawned"] = "Successfully Spawned A ~b~%s!", ['store_veh'] = 'Druk op [E] om het voertuig weg te zetten.', ['spawn_veh'] = 'pak voertuig', @@ -19,6 +20,7 @@ Locales['nl'] = { ['full_service'] = 'volledige dienst: ', ['amount_invalid'] = 'ongeldig bedrag', ['press_to_open'] = 'Druk op [E] om het menu te gebruiken.', + ['taxiactions_prompt'] = 'Druk op [E] om het menu te gebruiken.', ['billing'] = 'facturering', ['billing_sent'] = 'de factuur is geregistreerd!', ['invoice_amount'] = 'factuurbedrag', @@ -44,17 +46,15 @@ Locales['nl'] = { ['quantity'] = 'hoeveelheid', ['quantity_invalid'] = 'dat is een ongeldige hoeveelheid !', ['inventory'] = 'inventory', - ['taxi_client'] = 'taxi klant', ['have_withdrawn'] = 'je hebt x%s %s gepakt', ['have_deposited'] = 'je hebt x%s %s weggelegd', ['player_cannot_hold'] = 'Je hebt ~r~niet genoeg vrije ruimte in je inventory!', ['blip_taxi'] = 'downtown Cab Co.', - ['phone_taxi'] = 'downtown Cab Co.', ['taxi'] = 'taxi', ['taxi_stock'] = 'taxi voorraad', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "Bedrag", + ['bill_amount'] = "Te factureren bedrag..", + ['deposit_amount'] = "Te storten bedrag..", + ['withdraw_amount'] = "Op te nemen bedrag..", + ['confirm'] = "Bevestigen", } diff --git a/[esx_addons]/esx_taxijob/locales/pl.lua b/[esx_addons]/esx_taxijob/locales/pl.lua index 35fb474d..d1d8a541 100644 --- a/[esx_addons]/esx_taxijob/locales/pl.lua +++ b/[esx_addons]/esx_taxijob/locales/pl.lua @@ -7,6 +7,7 @@ Locales['pl'] = { -- garage ['spawner_prompt'] = 'naciśnij [E] aby otworzyć garaż.', + ['vehiclespawner_prompt'] = 'naciśnij [E] aby otworzyć garaż.', ['store_veh'] = 'naciśnij [E] aby zdać pojazd', ['spawn_veh'] = 'sprowadź pojazd', ['spawnpoint_blocked'] = 'jakiś pojazd blokuje wyjazd z garażu!', @@ -19,6 +20,7 @@ Locales['pl'] = { ['full_service'] = 'pełny serwis: ', ['amount_invalid'] = 'wartość nieprawidłowa', ['press_to_open'] = 'naciśnij [E] aby wejść do menu', + ['taxiactions_prompt'] = 'naciśnij [E] aby wejść do menu', ['billing'] = 'rachunek', ['billing_sent'] = 'rachunek został wystawiony!', ['invoice_amount'] = 'wartość należności', @@ -44,17 +46,15 @@ Locales['pl'] = { ['quantity'] = 'ilość', ['quantity_invalid'] = 'nieprawidłowa ilość', ['inventory'] = 'ekwipunek', - ['taxi_client'] = 'klient taksówki', ['have_withdrawn'] = 'wyciągasz x%s %s', ['have_deposited'] = 'deponujesz x%s %s', ['player_cannot_hold'] = '~r~Nie masz wystarczająco wolnego miejsca w swoim ekwipunku!', ['blip_taxi'] = 'taxi', - ['phone_taxi'] = 'taxi', ['taxi'] = 'taxi', ['taxi_stock'] = 'taxi Stock', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "Kwota", + ['bill_amount'] = "Kwota do zapłaty..", + ['deposit_amount'] = "Kwota do wpłaty..", + ['withdraw_amount'] = "Kwota do wypłaty..", + ['confirm'] = "Potwierdź", } diff --git a/[esx_addons]/esx_taxijob/locales/sr.lua b/[esx_addons]/esx_taxijob/locales/sr.lua index 0c8b3881..6c2b0d58 100644 --- a/[esx_addons]/esx_taxijob/locales/sr.lua +++ b/[esx_addons]/esx_taxijob/locales/sr.lua @@ -7,6 +7,7 @@ Locales['sr'] = { -- garage ['spawner_prompt'] = 'Pritisni [E] da pristupiš garaži.', + ['vehiclespawner_prompt'] = 'Pritisni [E] da pristupiš garaži.', ["vehicle_spawned"] = "Uspešno uzeto ~b~%s vozilo!", ['store_veh'] = 'Pritisni [E] da parkiraš vozilo', ['spawn_veh'] = 'Uzmi Vozilo', @@ -19,6 +20,7 @@ Locales['sr'] = { ['full_service'] = 'Posao: ', ['amount_invalid'] = 'Nevažeći Iznos', ['press_to_open'] = 'Pritisni [E] da pristupiš meniju', + ['taxiactions_prompt'] = 'Pritisni [E] da pristupiš meniju', ['billing'] = 'Računi', ['billing_sent'] = 'Račun je registrovan!', ['invoice_amount'] = 'Iznos računa', @@ -44,17 +46,15 @@ Locales['sr'] = { ['quantity'] = 'Količina', ['quantity_invalid'] = 'Ta količina je nevažeća!', ['inventory'] = 'Inventar', - ['taxi_client'] = 'Taxi Klijent', ['have_withdrawn'] = 'Podigli ste x%s %s', ['have_deposited'] = 'Ostavili ste x%s %s', ['player_cannot_hold'] = 'Nemate prostora u inventaru!', ['blip_taxi'] = 'downtown Cab Co.', - ['phone_taxi'] = 'downtown Cab Co.', ['taxi'] = 'Taxi', ['taxi_stock'] = 'Taxi Ostava', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "Iznos", + ['bill_amount'] = "Iznos za naplatu..", + ['deposit_amount'] = "Iznos za uplatu..", + ['withdraw_amount'] = "Iznos za isplatu..", + ['confirm'] = "Potvrdi", } diff --git a/[esx_addons]/esx_taxijob/locales/zh-cn.lua b/[esx_addons]/esx_taxijob/locales/zh-cn.lua index 77ece2f4..523818aa 100644 --- a/[esx_addons]/esx_taxijob/locales/zh-cn.lua +++ b/[esx_addons]/esx_taxijob/locales/zh-cn.lua @@ -7,6 +7,7 @@ Locales['zh-cn'] = { -- garage ['spawner_prompt'] = '键下 [E] 访问车库', + ['vehiclespawner_prompt'] = '键下 [E] 访问车库', ["vehicle_spawned"] = "%s 车辆已放行!", ['store_veh'] = '键下 [E] 储存车辆', ['spawn_veh'] = '生成载具', @@ -19,6 +20,7 @@ Locales['zh-cn'] = { ['full_service'] = '公共服务:', ['amount_invalid'] = '无效的金额输入!请重新检查', ['press_to_open'] = '键下 [E] 打开菜单', + ['taxiactions_prompt'] = '键下 [E] 打开菜单', ['billing'] = '开具帐单', ['billing_sent'] = '当前帐单已成功发送至目标市民!', ['invoice_amount'] = '帐单金额', @@ -44,17 +46,15 @@ Locales['zh-cn'] = { ['quantity'] = '数量', ['quantity_invalid'] = '数量无效', ['inventory'] = '存储柜', - ['taxi_client'] = '计程车客户', ['have_withdrawn'] = '你取出了 x%s %s ', ['have_deposited'] = '你存入了 x%s %s ', ['player_cannot_hold'] = '你的物品库没有足够的空间!', ['blip_taxi'] = '滴滴司机', - ['phone_taxi'] = '滴滴司机', ['taxi'] = '滴滴', ['taxi_stock'] = '滴滴物品', - ['amount'] = "Amount", --not translated - ['bill_amount'] = "Amount to bill..", --not translated - ['deposit_amount'] = "Amount to deposit..", --not translated - ['withdraw_amount'] = "Amount to withdraw..", --not translated - ['confirm'] = "Confirm", --not translated + ['amount'] = "金额", + ['bill_amount'] = "账单金额..", + ['deposit_amount'] = "存入金额..", + ['withdraw_amount'] = "取款金额..", + ['confirm'] = "确认", } diff --git a/[esx_addons]/esx_taxijob/server/main.lua b/[esx_addons]/esx_taxijob/server/main.lua index ad6b1774..951f57aa 100644 --- a/[esx_addons]/esx_taxijob/server/main.lua +++ b/[esx_addons]/esx_taxijob/server/main.lua @@ -4,7 +4,6 @@ if Config.MaxInService ~= -1 then TriggerEvent('esx_service:activateService', 'taxi', Config.MaxInService) end -TriggerEvent('esx_phone:registerNumber', 'taxi', TranslateCap('taxi_client'), true, true) TriggerEvent('esx_society:registerSociety', 'taxi', 'Taxi', 'society_taxi', 'society_taxi', 'society_taxi', { type = 'public' })