├── lb-reactjs ├── ui │ ├── public │ │ ├── .gitkeep │ │ ├── screenshot-dark.png │ │ ├── screenshot-light.png │ │ └── icon.svg │ ├── src │ │ ├── index.css │ │ ├── colors.css │ │ ├── index.jsx │ │ ├── components │ │ │ ├── Frame.jsx │ │ │ └── Frame.css │ │ ├── App.css │ │ └── App.jsx │ ├── .gitignore │ ├── vite.config.js │ ├── package.json │ └── index.html ├── fxmanifest.lua ├── README.md └── client.lua ├── lb-reactts ├── ui │ ├── public │ │ ├── .gitkeep │ │ ├── screenshot-dark.png │ │ ├── screenshot-light.png │ │ └── icon.svg │ ├── src │ │ ├── index.css │ │ ├── colors.css │ │ ├── index.tsx │ │ ├── components │ │ │ ├── Frame.tsx │ │ │ └── Frame.css │ │ ├── App.css │ │ ├── components.d.ts │ │ └── App.tsx │ ├── .gitignore │ ├── vite.config.ts │ ├── package.json │ ├── tsconfig.json │ └── index.html ├── config.lua ├── client │ ├── functions.lua │ └── client.lua ├── fxmanifest.lua └── README.md ├── lb-vuejs ├── ui │ ├── .vscode │ │ └── extensions.json │ ├── public │ │ ├── icon.png │ │ ├── screenshot-dark.png │ │ └── screenshot-light.png │ ├── src │ │ ├── colors.css │ │ ├── index.js │ │ ├── AppProvider.vue │ │ ├── index.css │ │ ├── components │ │ │ └── Frame.vue │ │ └── App.vue │ ├── package.json │ ├── vite.config.js │ ├── .gitignore │ ├── index.html │ └── pnpm-lock.yaml ├── fxmanifest.lua ├── README.md └── client.lua ├── lb-vanillajs ├── ui │ ├── assets │ │ ├── screenshot-dark.png │ │ ├── screenshot-light.png │ │ └── icon.svg │ ├── colors.css │ ├── frame.css │ ├── styles.css │ ├── index.html │ ├── dev.js │ └── script.js ├── fxmanifest.lua ├── README.md └── client.lua ├── .gitignore ├── README.md └── LICENSE /lb-reactjs/ui/public/.gitkeep: -------------------------------------------------------------------------------- 1 | 1 -------------------------------------------------------------------------------- /lb-reactts/ui/public/.gitkeep: -------------------------------------------------------------------------------- 1 | 1 -------------------------------------------------------------------------------- /lb-vuejs/ui/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /lb-vuejs/ui/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-vuejs/ui/public/icon.png -------------------------------------------------------------------------------- /lb-vuejs/ui/public/screenshot-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-vuejs/ui/public/screenshot-dark.png -------------------------------------------------------------------------------- /lb-vuejs/ui/public/screenshot-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-vuejs/ui/public/screenshot-light.png -------------------------------------------------------------------------------- /lb-reactjs/ui/public/screenshot-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-reactjs/ui/public/screenshot-dark.png -------------------------------------------------------------------------------- /lb-reactjs/ui/public/screenshot-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-reactjs/ui/public/screenshot-light.png -------------------------------------------------------------------------------- /lb-reactts/ui/public/screenshot-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-reactts/ui/public/screenshot-dark.png -------------------------------------------------------------------------------- /lb-reactts/ui/public/screenshot-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-reactts/ui/public/screenshot-light.png -------------------------------------------------------------------------------- /lb-reactts/ui/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | 5 | box-sizing: border-box; 6 | visibility: hidden; 7 | } 8 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/assets/screenshot-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-vanillajs/ui/assets/screenshot-dark.png -------------------------------------------------------------------------------- /lb-vanillajs/ui/assets/screenshot-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lbphone/lb-phone-app-template/HEAD/lb-vanillajs/ui/assets/screenshot-light.png -------------------------------------------------------------------------------- /lb-reactjs/ui/src/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | 6 | box-sizing: border-box; 7 | visibility: hidden; /* DO NOT CHANGE, IMPORTANT!*/ 8 | } 9 | -------------------------------------------------------------------------------- /lb-reactts/config.lua: -------------------------------------------------------------------------------- 1 | Config = {} 2 | 3 | Config.Identifier = "react-ts-template" 4 | Config.DefaultApp = true 5 | 6 | Config.Name = "React TS" 7 | Config.Description = "Template app using React and TypeScript." 8 | Config.Developer = "LB Scripts" 9 | -------------------------------------------------------------------------------- /lb-reactts/client/functions.lua: -------------------------------------------------------------------------------- 1 | ---@param action string 2 | ---@param data any 3 | function SendAppMessage(action, data) 4 | exports["lb-phone"]:SendCustomAppMessage(Config.Identifier, { 5 | action = action, 6 | data = data 7 | }) 8 | end 9 | -------------------------------------------------------------------------------- /lb-vanillajs/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version "cerulean" 2 | game "gta5" 3 | 4 | title "LB Phone - App Template" 5 | description "A template for creating apps for the LB Phone." 6 | author "Breze & Loaf" 7 | 8 | client_script "client.lua" 9 | 10 | file "ui/**/*" 11 | 12 | ui_page "ui/index.html" 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /.pnp 3 | .pnp.js 4 | 5 | # testing 6 | /coverage 7 | 8 | # production 9 | dist 10 | 11 | # misc 12 | .DS_Store 13 | .env 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | .pnpm-debug.log 19 | 20 | pnpm-lock.yaml* 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /lb-reactjs/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version "cerulean" 2 | game "gta5" 3 | 4 | title "LB Phone - App Template | React JS" 5 | description "A template for creating apps for the LB Phone." 6 | author "Breze & Loaf" 7 | 8 | client_script "client.lua" 9 | 10 | file "ui/dist/**/*" 11 | 12 | ui_page "ui/dist/index.html" 13 | -- ui_page "http://localhost:3000" 14 | -------------------------------------------------------------------------------- /lb-vuejs/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version "cerulean" 2 | game "gta5" 3 | 4 | title "LB Phone - App Template | Vue.js" 5 | description "A template for creating apps for the LB Phone." 6 | author "Breze & Loaf" 7 | 8 | client_script "client.lua" 9 | 10 | files { 11 | "ui/dist/**/*" 12 | } 13 | 14 | ui_page "ui/dist/index.html" 15 | -- ui_page "http://localhost:3000" -------------------------------------------------------------------------------- /lb-reactts/fxmanifest.lua: -------------------------------------------------------------------------------- 1 | fx_version "cerulean" 2 | game "gta5" 3 | 4 | title "LB Phone - App Template | React TS" 5 | description "A template for creating apps for the LB Phone." 6 | author "Breze & Loaf" 7 | 8 | shared_script "config.lua" 9 | client_script "client/**.lua" 10 | 11 | file "ui/dist/**/*" 12 | 13 | -- ui_page "ui/dist/index.html" 14 | ui_page "http://localhost:3000/" 15 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/colors.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-primary: #f5f5f5; 3 | --background-highlight: rgb(220, 220, 220); 4 | 5 | --text-primary: #000000; 6 | --text-secondary: #8e8e93; 7 | } 8 | 9 | [data-theme='dark'] { 10 | --background-primary: #000000; 11 | --background-highlight: rgb(20, 20, 20); 12 | 13 | --text-primary: #f2f2f7; 14 | --text-secondary: #6f6f6f; 15 | } 16 | -------------------------------------------------------------------------------- /lb-vuejs/ui/src/colors.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-primary: #f5f5f5; 3 | --background-highlight: rgb(220, 220, 220); 4 | 5 | --text-primary: #000000; 6 | --text-secondary: #8e8e93; 7 | } 8 | 9 | [data-theme='dark'] { 10 | --background-primary: #000000; 11 | --background-highlight: rgb(20, 20, 20); 12 | 13 | --text-primary: #f2f2f7; 14 | --text-secondary: #6f6f6f; 15 | } 16 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/colors.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-primary: #f5f5f5; 3 | --background-highlight: rgb(220, 220, 220); 4 | 5 | --text-primary: #000000; 6 | --text-secondary: #8e8e93; 7 | } 8 | 9 | [data-theme='dark'] { 10 | --background-primary: #000000; 11 | --background-highlight: rgb(20, 20, 20); 12 | 13 | --text-primary: #f2f2f7; 14 | --text-secondary: #6f6f6f; 15 | } 16 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/colors.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-primary: #f5f5f5; 3 | --background-highlight: rgb(220, 220, 220); 4 | 5 | --text-primary: #000000; 6 | --text-secondary: #8e8e93; 7 | } 8 | 9 | [data-theme='dark'] { 10 | --background-primary: #000000; 11 | --background-highlight: rgb(20, 20, 20); 12 | 13 | --text-primary: #f2f2f7; 14 | --text-secondary: #6f6f6f; 15 | } 16 | -------------------------------------------------------------------------------- /lb-reactjs/ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | pnpm-lock.yaml 22 | -------------------------------------------------------------------------------- /lb-reactts/ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | pnpm-lock.yaml 22 | -------------------------------------------------------------------------------- /lb-vuejs/ui/src/index.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | import "./colors.css" 5 | import "./index.css" 6 | 7 | const devMode = !window.invokeNative 8 | if (window.name === "" || devMode) { 9 | if (devMode) { 10 | createApp(App).mount('#app') 11 | } else { 12 | window.addEventListener("message", (event) => { 13 | if (event.data === "componentsLoaded") { 14 | createApp(App).mount('#app') 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /lb-vuejs/ui/src/AppProvider.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 27 | -------------------------------------------------------------------------------- /lb-vuejs/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lb-app-template-vuejs", 3 | "version": "1.0.0", 4 | "private": true, 5 | "homepage": "./", 6 | "type": "module", 7 | "dependencies": { 8 | "@testing-library/jest-dom": "^6.4.5", 9 | "@testing-library/user-event": "^14.5.2", 10 | "@testing-library/vue": "^8.1.0", 11 | "@vitejs/plugin-vue": "^5.0.4", 12 | "vite": "^4.5.5", 13 | "vue": "^3.4.27" 14 | }, 15 | "scripts": { 16 | "start": "vite", 17 | "dev": "vite dev", 18 | "build": "vite build", 19 | "serve": "vite preview" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | 5 | import './colors.css' 6 | import './index.css' 7 | 8 | const devMode = !window?.['invokeNative'] 9 | const root = ReactDOM.createRoot(document.getElementById('root')) 10 | 11 | if (window.name === '' || devMode) { 12 | const renderApp = () => { 13 | root.render() 14 | } 15 | 16 | if (devMode) { 17 | renderApp() 18 | } else { 19 | window.addEventListener('message', (event) => { 20 | if (event.data === 'componentsLoaded') renderApp() 21 | }) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lb-vuejs/ui/vite.config.js: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue' 2 | import { defineConfig } from 'vite'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig(( {command} ) => ({ 6 | base: command === 'build' ? '/ui/dist' : undefined, 7 | define: { 8 | global: 'window' 9 | }, 10 | build: { 11 | sourcemap: false 12 | }, 13 | optimizeDeps: { 14 | esbuildOptions: { 15 | mainFields: ['module', 'main'], 16 | resolveExtensions: ['.js', '.jsx'] 17 | } 18 | }, 19 | server: { 20 | port: 3000, 21 | open: true 22 | }, 23 | plugins: [vue()], 24 | })); 25 | -------------------------------------------------------------------------------- /lb-reactjs/ui/vite.config.js: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig(( {command} ) => ({ 6 | base: command === 'build' ? '/ui/dist' : undefined, 7 | define: { 8 | global: 'window' 9 | }, 10 | build: { 11 | sourcemap: false 12 | }, 13 | optimizeDeps: { 14 | esbuildOptions: { 15 | mainFields: ['module', 'main'], 16 | resolveExtensions: ['.js', '.jsx'] 17 | } 18 | }, 19 | server: { 20 | port: 3000, 21 | open: true 22 | }, 23 | plugins: [react()], 24 | })); 25 | -------------------------------------------------------------------------------- /lb-reactts/ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import react from '@vitejs/plugin-react'; 2 | import { defineConfig } from 'vite'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig(( {command} ) => ({ 6 | base: command === 'build' ? '/ui/dist' : undefined, 7 | define: { 8 | global: 'window' 9 | }, 10 | build: { 11 | sourcemap: false 12 | }, 13 | optimizeDeps: { 14 | esbuildOptions: { 15 | mainFields: ['module', 'main'], 16 | resolveExtensions: ['.js', '.jsx'] 17 | } 18 | }, 19 | server: { 20 | port: 3000, 21 | open: true 22 | }, 23 | plugins: [react()], 24 | })); 25 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import ReactDOM from "react-dom/client" 3 | import App from "./App" 4 | 5 | import "./colors.css" 6 | import "./index.css" 7 | 8 | const devMode = !window.invokeNative 9 | const root = ReactDOM.createRoot(document.getElementById("root")) 10 | 11 | if (window.name === "" || devMode) { 12 | const renderApp = () => { 13 | root.render( 14 | 15 | 16 | 17 | ) 18 | } 19 | 20 | if (devMode) { 21 | renderApp() 22 | } else { 23 | window.addEventListener("message", (event) => { 24 | if (event.data === "componentsLoaded") renderApp() 25 | }) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lb-vuejs/ui/.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | /.pnp 4 | .pnp.js 5 | package-lock.json 6 | 7 | # testing 8 | /coverage 9 | 10 | # production 11 | build 12 | dist 13 | 14 | # misc 15 | .DS_Store 16 | .env 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | .pnpm-debug.log 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | defaultdb.lua 28 | fix.sql 29 | 30 | # Logs 31 | logs 32 | *.log 33 | npm-debug.log* 34 | yarn-debug.log* 35 | yarn-error.log* 36 | pnpm-debug.log* 37 | lerna-debug.log* 38 | 39 | *.local 40 | 41 | # Editor directories and files 42 | .vscode/* 43 | !.vscode/extensions.json 44 | .idea 45 | *.suo 46 | *.ntvs* 47 | *.njsproj 48 | *.sln 49 | *.sw? -------------------------------------------------------------------------------- /lb-reactjs/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lb-phone-app-template-react", 3 | "version": "2.0.0", 4 | "private": true, 5 | "homepage": "./", 6 | "type": "module", 7 | "dependencies": { 8 | "@testing-library/jest-dom": "^5.16.5", 9 | "@testing-library/react": "^13.4.0", 10 | "@testing-library/user-event": "^13.5.0", 11 | "@vitejs/plugin-react": "^3.1.0", 12 | "react": "^18.2.0", 13 | "react-dom": "^18.2.0", 14 | "vite": "^4.2.1" 15 | }, 16 | "scripts": { 17 | "start": "vite", 18 | "dev": "vite dev", 19 | "build": "vite build", 20 | "serve": "vite preview" 21 | }, 22 | "eslintConfig": { 23 | "extends": [ 24 | "react-app", 25 | "react-app/jest" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lb-reactjs/README.md: -------------------------------------------------------------------------------- 1 | # LB Phone - React JS Template 2 | 3 | If you don't know how react.js works, you should use the [vanilla js](https://github.com/lbphone/lb-phone-app-template/tree/main/vanilla-js) template instead. 4 | 5 | ## Installing modules 6 | 7 | 1. Install [node.js](https://nodejs.org/en/download) 8 | 2. CD to the `ui` folder and run `npm i`, wait for it to complete. 9 | 10 | ## Developing the app 11 | 12 | 1. Run `npm dev` 13 | 2. Go to `http://localhost:3000` in your browser to see the app in your browser. 14 | 3. Comment out line 25 and uncomment line 24 in client.lua. 15 | 4. Refresh and ensure the resource 16 | 17 | ## Building the app 18 | 19 | 1. Run `npm run build` to build the app. The build will be in the `dist` folder. 20 | 2. Comment out line 24 and uncomment line 25 in client.lua. 21 | 3. Refresh and ensure the resource 22 | -------------------------------------------------------------------------------- /lb-reactts/README.md: -------------------------------------------------------------------------------- 1 | # LB Phone - TypeScript React Template 2 | 3 | If you don't know how react.js works, you should use the [vanilla js](https://github.com/lbphone/lb-phone-app-template/tree/main/vanilla-js) template instead. 4 | 5 | ## Installing modules 6 | 7 | 1. Install [node.js](https://nodejs.org/en/download) 8 | 2. CD to the `ui` folder and run `npm i`, wait for it to complete. 9 | 10 | ## Developing the app 11 | 12 | 1. Run `npm run dev` 13 | 2. Go to `http://localhost:3000` in your browser to see the app in your browser. 14 | 3. Comment out line 25 and uncomment line 24 in client.lua. 15 | 4. Refresh and ensure the resource 16 | 17 | ## Building the app 18 | 19 | 1. Run `npm run build` to build the app. The build will be in the `dist` folder. 20 | 2. Comment out line 24 and uncomment line 25 in client.lua. 21 | 3. Refresh and ensure the resource 22 | -------------------------------------------------------------------------------- /lb-reactts/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lb-phone-app-template-react", 3 | "version": "2.0.0", 4 | "private": true, 5 | "homepage": "./", 6 | "dependencies": { 7 | "@testing-library/jest-dom": "^5.16.5", 8 | "@testing-library/react": "^13.4.0", 9 | "@testing-library/user-event": "^13.5.0", 10 | "@vitejs/plugin-react": "^3.1.0", 11 | "react": "^18.2.0", 12 | "react-dom": "^18.2.0", 13 | "vite": "^4.2.1" 14 | }, 15 | "scripts": { 16 | "start": "vite", 17 | "dev": "vite dev", 18 | "build": "vite build", 19 | "serve": "vite preview" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "devDependencies": { 28 | "@types/react": "^19.0.8" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/components/Frame.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | 3 | import './Frame.css'; 4 | 5 | export default function Frame({ children }) { 6 | const [time, setTime] = useState('00:00'); 7 | 8 | useEffect(() => { 9 | const interval = setInterval(() => { 10 | const date = new Date(); 11 | setTime(`${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`); 12 | }, 1000); 13 | 14 | return () => clearInterval(interval); 15 | }, []); 16 | 17 | return ( 18 |
19 |
20 |
{time}
21 |
22 |
{children}
23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/components/Frame.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode, useEffect, useState } from 'react' 2 | import './Frame.css' 3 | 4 | export default function Frame({ children }: { children: ReactNode }) { 5 | const [time, setTime] = useState('00:00') 6 | 7 | useEffect(() => { 8 | const interval = setInterval(() => { 9 | const date = new Date() 10 | setTime(`${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`) 11 | }, 1000) 12 | 13 | return () => clearInterval(interval) 14 | }, []) 15 | 16 | return ( 17 |
18 |
19 |
{time}
20 |
21 |
{children}
22 |
23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /lb-reactts/ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "paths": { "*": ["./*"] }, 5 | "types": ["vite/client"], 6 | "lib": ["dom", "dom.iterable", "esnext"], 7 | "allowJs": true, 8 | "skipLibCheck": false, 9 | "esModuleInterop": true, 10 | "allowSyntheticDefaultImports": true, 11 | "strict": false, 12 | "forceConsistentCasingInFileNames": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "module": "esnext", 15 | "moduleResolution": "Node", 16 | "resolveJsonModule": true, 17 | "isolatedModules": true, 18 | "jsx": "react-jsx", 19 | "jsxImportSource": "react", 20 | "noEmit": false, 21 | "sourceMap": true, 22 | "outDir": "../build/", 23 | "experimentalDecorators": true 24 | }, 25 | "exclude": ["node_modules"], 26 | "include": ["src"] 27 | } 28 | -------------------------------------------------------------------------------- /lb-vuejs/README.md: -------------------------------------------------------------------------------- 1 | # LB Phone - Vue JS Template 2 | 3 | If you don't know how vue.js works, you should use the [vanilla js](https://github.com/lbphone/lb-phone-app-template/tree/main/vanilla-js) template instead. 4 | 5 | ## Installing modules 6 | 7 | 1. Install [node.js](https://nodejs.org/en/download) 8 | 2. CD to the `ui` folder and run `npm i`, wait for it to complete. 9 | 10 | ## Developing the app 11 | 12 | 1. Run `npm run dev` 13 | 2. Go to `http://localhost:3000` in your browser to see the app in your browser. 14 | 3. Comment out line 15 and uncomment line 16 in fxmanifest.lua 15 | 4. Comment out line 25 and uncomment line 24 in client.lua. 16 | 5. Refresh and ensure the resource 17 | 18 | ## Building the app 19 | 20 | 1. Run `npm run build` to build the app. The build will be in the `dist` folder. 21 | 2. Comment out line 16 and uncomment line 15 in fxmanifest.lua 22 | 3. Comment out line 24 and uncomment line 25 in client.lua. 23 | 4. Refresh and ensure the resource 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LB Phone - App Templates 2 | 3 | This repository contains templates for [LB Phone](https://store.lbscripts.com/) apps, showcasing most functions provided by LB Phone. 4 | 5 | ## Templates 6 | 7 | - [react js](./lb-reactjs) - React app template 8 | - [react typescript](./lb-reactts) - React app template with TypeScript 9 | - [vanilla js](./lb-vanillajs) - Vanilla JavaScript app template 10 | - [vue js](./lb-vuejs) - Vue JS app template (Thanks to @RedrumRP) 11 | 12 | ## Documentation 13 | 14 | Custom apps in LB Phone automatically include access to a few functions and variables. Please note that when you use react, you need to use the `window.` prefix for these functions and variables. 15 | 16 | The variables are: 17 | 18 | - `resourceName` - The name of the custom app resource, use this when fetching data. 19 | - `appName` - The app identifier, useful for notifications. 20 | 21 | For a full list, see [LB Phone documentation](https://docs.lbscripts.com/phone/custom-apps/). 22 | -------------------------------------------------------------------------------- /lb-vuejs/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | LB Phone | App Template - Vuejs 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /lb-reactjs/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | LB Phone | App Template - React 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /lb-reactts/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | LB Phone | App Template - React TS 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /lb-vanillajs/README.md: -------------------------------------------------------------------------------- 1 | # LB Phone - Vanilla JS Template 2 | 3 | You can open the index.html file in your browser while editing the UI. Ensuring the script will add the app to your phone. 4 | 5 | You need to wait for the components to load before you can use them. You can listen for the `componentsLoaded` message to know when the components are ready. 6 | 7 | ```js 8 | window.addEventListener("message", (e) => { 9 | if (e.data !== "componentsLoaded") return 10 | // Here you can access the components 11 | }) 12 | ``` 13 | 14 | ## Developing the app 15 | 16 | We recommend using the [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) extension for VS Code when developing the app. This automatically refreshes the UI; meaning that you won't have to ensure the script/refresh the html file each time you make changes to the UI. 17 | 18 | To use, follow these steps: 19 | 20 | 1. Install the extension 21 | 2. Right click on the ui/index.html file, and click "Open with Live Server" 22 | 3. Uncomment line 21 in client.lua 23 | 4. Comment out line 22 in client.lua 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 LB 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /lb-reactjs/ui/public/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lb-reactts/ui/public/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/assets/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/frame.css: -------------------------------------------------------------------------------- 1 | .phone-frame { 2 | position: absolute; 3 | z-index: 1; 4 | 5 | width: 92%; 6 | height: 98%; 7 | 8 | border-radius: 60px; 9 | background-color: black; 10 | box-shadow: 0 0 0.1em 0.25em #050506, 0 0 0 0.4em hsl(254, 30%, 85%); 11 | 12 | z-index: 2; 13 | } 14 | 15 | .phone-content { 16 | height: 100%; 17 | width: 100%; 18 | 19 | display: flex; 20 | align-items: center; 21 | justify-content: center; 22 | 23 | overflow: hidden; 24 | border-radius: 60px; 25 | } 26 | 27 | .phone-notch { 28 | position: absolute; 29 | top: 0.75rem; 30 | left: 50%; 31 | transform: translateX(-50%); 32 | 33 | height: 2.25rem; 34 | 35 | width: 30%; 36 | background-color: black; 37 | 38 | border-radius: 25px; 39 | cursor: pointer; 40 | } 41 | 42 | .phone-indicator { 43 | position: absolute; 44 | 45 | left: 0; 46 | right: 0; 47 | bottom: 0.5rem; 48 | margin: auto; 49 | 50 | width: 9rem; 51 | height: 0.313rem; 52 | 53 | z-index: 999; 54 | 55 | display: flex; 56 | align-items: center; 57 | justify-content: center; 58 | 59 | border-radius: 0.25rem; 60 | 61 | background: transparent; 62 | backdrop-filter: grayscale(1) invert(1) contrast(100); 63 | 64 | cursor: pointer; 65 | } 66 | 67 | .phone-time { 68 | position: absolute; 69 | top: 0; 70 | width: 100%; 71 | 72 | padding: 1.2rem 3.5rem; 73 | 74 | z-index: 9; 75 | 76 | pointer-events: none; 77 | 78 | font-weight: 500; 79 | font-size: 1rem; 80 | 81 | color: black; 82 | 83 | font-family: 'Poppins', sans-serif; 84 | } 85 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/components/Frame.css: -------------------------------------------------------------------------------- 1 | .phone-frame { 2 | position: absolute; 3 | z-index: 1; 4 | 5 | width: 92%; 6 | height: 98%; 7 | 8 | border-radius: 60px; 9 | background-color: black; 10 | box-shadow: 0 0 0.1em 0.25em #050506, 0 0 0 0.4em hsl(254, 30%, 85%); 11 | 12 | z-index: 2; 13 | } 14 | 15 | .phone-content { 16 | height: 100%; 17 | width: 100%; 18 | 19 | display: flex; 20 | align-items: center; 21 | justify-content: center; 22 | 23 | overflow: hidden; 24 | border-radius: 60px; 25 | } 26 | 27 | .phone-notch { 28 | position: absolute; 29 | top: 0.75rem; 30 | left: 50%; 31 | transform: translateX(-50%); 32 | 33 | height: 2.25rem; 34 | 35 | width: 30%; 36 | background-color: black; 37 | 38 | border-radius: 25px; 39 | cursor: pointer; 40 | } 41 | 42 | .phone-indicator { 43 | position: absolute; 44 | 45 | left: 0; 46 | right: 0; 47 | bottom: 0.5rem; 48 | margin: auto; 49 | 50 | width: 9rem; 51 | height: 0.313rem; 52 | 53 | z-index: 999; 54 | 55 | display: flex; 56 | align-items: center; 57 | justify-content: center; 58 | 59 | border-radius: 0.25rem; 60 | 61 | background: transparent; 62 | backdrop-filter: grayscale(1) invert(1) contrast(100); 63 | 64 | cursor: pointer; 65 | } 66 | 67 | .phone-time { 68 | position: absolute; 69 | top: 0; 70 | width: 100%; 71 | 72 | padding: 1.2rem 3.5rem; 73 | 74 | z-index: 9; 75 | 76 | pointer-events: none; 77 | 78 | font-weight: 500; 79 | font-size: 1rem; 80 | 81 | color: black; 82 | 83 | font-family: 'Poppins', sans-serif; 84 | } 85 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/components/Frame.css: -------------------------------------------------------------------------------- 1 | .phone-frame { 2 | position: absolute; 3 | z-index: 1; 4 | 5 | width: 27.6rem; 6 | height: 59rem; 7 | 8 | /* width: 92%; 9 | height: 98%; */ 10 | 11 | border-radius: 3.75rem; 12 | background-color: black; 13 | box-shadow: 0 0 0.1em 0.25em #050506, 0 0 0 0.4em hsl(254, 30%, 85%); 14 | 15 | z-index: 2; 16 | } 17 | 18 | .phone-content { 19 | height: 100%; 20 | width: 100%; 21 | 22 | display: flex; 23 | align-items: center; 24 | justify-content: center; 25 | 26 | overflow: hidden; 27 | border-radius: 3.75rem; 28 | } 29 | 30 | .phone-notch { 31 | position: absolute; 32 | top: 0.75rem; 33 | left: 50%; 34 | transform: translateX(-50%); 35 | 36 | height: 2.25rem; 37 | 38 | width: 30%; 39 | background-color: black; 40 | 41 | border-radius: 1.6rem; 42 | cursor: pointer; 43 | } 44 | 45 | .phone-indicator { 46 | position: absolute; 47 | 48 | left: 0; 49 | right: 0; 50 | bottom: 0.5rem; 51 | margin: auto; 52 | 53 | width: 9rem; 54 | height: 0.313rem; 55 | 56 | z-index: 999; 57 | 58 | display: flex; 59 | align-items: center; 60 | justify-content: center; 61 | 62 | border-radius: 0.25rem; 63 | 64 | background: transparent; 65 | backdrop-filter: grayscale(1) invert(1) contrast(100); 66 | 67 | cursor: pointer; 68 | } 69 | 70 | .phone-time { 71 | position: absolute; 72 | top: 0; 73 | width: 100%; 74 | 75 | padding: 1.2rem 3.5rem; 76 | 77 | z-index: 9; 78 | 79 | pointer-events: none; 80 | 81 | font-weight: 500; 82 | font-size: 1rem; 83 | 84 | color: black; 85 | 86 | font-family: 'Poppins', sans-serif; 87 | } 88 | -------------------------------------------------------------------------------- /lb-vuejs/ui/src/index.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | .app { 8 | height: 100vh; 9 | width: 100%; 10 | 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | flex-wrap: wrap; 15 | 16 | background-color: #f5f5f5; 17 | 18 | font-family: 'Poppins', sans-serif; 19 | } 20 | 21 | .app-wrapper { 22 | width: 100%; 23 | height: 100%; 24 | 25 | display: flex; 26 | flex-direction: column; 27 | align-items: center; 28 | justify-content: center; 29 | gap: 3rem; 30 | } 31 | 32 | .header, 33 | .button-wrapper { 34 | display: flex; 35 | flex-direction: column; 36 | text-align: center; 37 | gap: 0.2rem; 38 | } 39 | 40 | .button-wrapper { 41 | gap: 1rem; 42 | } 43 | 44 | .title { 45 | font-size: 1.4rem; 46 | font-weight: 700; 47 | 48 | color: var(--text-primary); 49 | } 50 | 51 | .subtitle { 52 | font-size: 1rem; 53 | font-weight: 400; 54 | 55 | color: var(--text-secondary); 56 | } 57 | 58 | button { 59 | width: 14rem; 60 | height: 3.25rem; 61 | 62 | background-color: var(--background-highlight); 63 | color: var(--text-primary); 64 | 65 | border: none; 66 | border-radius: 0.3rem; 67 | 68 | font-size: 0.8rem; 69 | font-weight: 600; 70 | text-transform: uppercase; 71 | 72 | cursor: pointer; 73 | transition: all 0.25s ease-in-out; 74 | 75 | user-select: none; 76 | } 77 | 78 | button:hover { 79 | filter: brightness(0.8); 80 | } 81 | 82 | input { 83 | width: 14rem; 84 | height: 3.25rem; 85 | 86 | background-color: var(--background-highlight); 87 | color: var(--text-primary); 88 | 89 | border: none; 90 | border-radius: 0.3rem; 91 | 92 | padding: 0 1rem; 93 | 94 | font-size: 0.8rem; 95 | font-weight: 600; 96 | 97 | transition: all 0.25s ease-in-out; 98 | 99 | outline: none; 100 | } 101 | 102 | /* Do not edit, this allows you to view changes easily in your browser */ 103 | .dev-wrapper { 104 | position: absolute; 105 | 106 | bottom: 0; 107 | top: 0; 108 | left: 0; 109 | right: 0; 110 | 111 | margin: auto; 112 | 113 | width: 29rem; 114 | height: 58.5rem; 115 | } 116 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/App.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | .app { 8 | height: 100vh; 9 | width: 100%; 10 | 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | flex-wrap: wrap; 15 | 16 | background-color: var(--background-primary); 17 | 18 | font-family: 'Poppins', sans-serif; 19 | } 20 | 21 | .app-wrapper { 22 | width: 100%; 23 | height: 100%; 24 | 25 | display: flex; 26 | flex-direction: column; 27 | align-items: center; 28 | justify-content: center; 29 | gap: 3rem; 30 | } 31 | 32 | .header, 33 | .button-wrapper { 34 | display: flex; 35 | flex-direction: column; 36 | text-align: center; 37 | gap: 0.2rem; 38 | } 39 | 40 | .button-wrapper { 41 | gap: 1rem; 42 | } 43 | 44 | .title { 45 | font-size: 1.4rem; 46 | font-weight: 700; 47 | 48 | color: var(--text-primary); 49 | } 50 | 51 | .subtitle { 52 | font-size: 1rem; 53 | font-weight: 400; 54 | 55 | color: var(--text-secondary); 56 | } 57 | 58 | button { 59 | width: 14rem; 60 | height: 3.25rem; 61 | 62 | background-color: var(--background-highlight); 63 | color: var(--text-primary); 64 | 65 | border: none; 66 | border-radius: 0.3rem; 67 | 68 | font-size: 0.8rem; 69 | font-weight: 600; 70 | text-transform: uppercase; 71 | 72 | cursor: pointer; 73 | transition: all 0.25s ease-in-out; 74 | 75 | user-select: none; 76 | } 77 | 78 | button:hover { 79 | filter: brightness(0.8); 80 | } 81 | 82 | input { 83 | width: 14rem; 84 | height: 3.25rem; 85 | 86 | background-color: var(--background-highlight); 87 | color: var(--text-primary); 88 | 89 | border: none; 90 | border-radius: 0.3rem; 91 | 92 | padding: 0 1rem; 93 | 94 | font-size: 0.8rem; 95 | font-weight: 600; 96 | 97 | transition: all 0.25s ease-in-out; 98 | 99 | outline: none; 100 | } 101 | 102 | /* Do not edit, this allows you to view changes easily in your browser */ 103 | .dev-wrapper { 104 | position: absolute; 105 | 106 | bottom: 0; 107 | top: 0; 108 | left: 0; 109 | right: 0; 110 | 111 | margin: auto; 112 | 113 | width: 29rem; 114 | height: 58.5rem; 115 | } 116 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | body { 8 | visibility: hidden; 9 | } 10 | 11 | .app { 12 | width: 100%; 13 | height: 100%; 14 | 15 | display: flex; 16 | align-items: center; 17 | justify-content: center; 18 | flex-wrap: wrap; 19 | 20 | background-color: var(--background-primary); 21 | 22 | font-family: 'Poppins', sans-serif; 23 | } 24 | 25 | .app-wrapper { 26 | width: 100%; 27 | height: 100%; 28 | 29 | display: flex; 30 | flex-direction: column; 31 | align-items: center; 32 | justify-content: center; 33 | gap: 3rem; 34 | } 35 | 36 | .header, 37 | .button-wrapper { 38 | display: flex; 39 | flex-direction: column; 40 | text-align: center; 41 | gap: 0.2rem; 42 | } 43 | 44 | .button-wrapper { 45 | gap: 1rem; 46 | } 47 | 48 | .title { 49 | font-size: 1.4rem; 50 | font-weight: 700; 51 | 52 | color: var(--text-primary); 53 | } 54 | 55 | .subtitle { 56 | font-size: 1rem; 57 | font-weight: 400; 58 | 59 | color: var(--text-secondary); 60 | } 61 | 62 | button { 63 | width: 14rem; 64 | height: 3.25rem; 65 | 66 | background-color: var(--background-highlight); 67 | color: var(--text-primary); 68 | 69 | border: none; 70 | border-radius: 0.3rem; 71 | 72 | font-size: 0.8rem; 73 | font-weight: 600; 74 | text-transform: uppercase; 75 | 76 | cursor: pointer; 77 | transition: all 0.25s ease-in-out; 78 | 79 | user-select: none; 80 | } 81 | 82 | button:hover { 83 | filter: brightness(0.8); 84 | } 85 | 86 | input { 87 | width: 14rem; 88 | height: 3.25rem; 89 | 90 | background-color: var(--background-highlight); 91 | color: var(--text-primary); 92 | 93 | border: none; 94 | border-radius: 0.3rem; 95 | 96 | padding: 0 1rem; 97 | 98 | font-size: 0.8rem; 99 | font-weight: 600; 100 | 101 | transition: all 0.25s ease-in-out; 102 | 103 | outline: none; 104 | } 105 | 106 | /* Do not edit, this allows you to view changes easily in your browser */ 107 | .dev-wrapper { 108 | display: none; 109 | 110 | position: absolute; 111 | bottom: 0; 112 | top: 0; 113 | left: 0; 114 | right: 0; 115 | 116 | margin: auto; 117 | 118 | width: 29rem; 119 | height: 58.5rem; 120 | } 121 | -------------------------------------------------------------------------------- /lb-reactjs/client.lua: -------------------------------------------------------------------------------- 1 | local identifier = "react-js-template" 2 | 3 | while GetResourceState("lb-phone") ~= "started" do 4 | Wait(500) 5 | end 6 | 7 | local function addApp() 8 | local added, errorMessage = exports["lb-phone"]:AddCustomApp({ 9 | identifier = identifier, -- unique app identifier 10 | 11 | name = "React JS", 12 | description = "Template app using React.", 13 | developer = "LB", 14 | 15 | defaultApp = false, -- set to true, the app will automatically be added to the player's phone 16 | size = 59812, -- the app size in kb 17 | -- price = 0, -- OPTIONAL make players pay with in-game money to download the app 18 | 19 | images = { -- OPTIONAL array of screenshots of the app, used for showcasing the app 20 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-light.png", 21 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-dark.png" 22 | }, 23 | 24 | ui = "http://localhost:3000", 25 | -- ui = GetCurrentResourceName() .. "/ui/dist/index.html", 26 | 27 | icon = "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/icon.svg", 28 | fixBlur = true -- set to true if you use em, rem etc instead of px in your css 29 | }) 30 | 31 | if not added then 32 | print("Could not add app:", errorMessage) 33 | end 34 | end 35 | 36 | addApp() 37 | 38 | AddEventHandler("onResourceStart", function(resource) 39 | if resource == "lb-phone" then 40 | addApp() 41 | end 42 | end) 43 | 44 | local directions = { "N", "NE", "E", "SE", "S", "SW", "W", "NW" } 45 | local oldYaw, oldDirection 46 | 47 | RegisterNUICallback("getDirection", function(data, cb) 48 | cb(oldDirection) 49 | end) 50 | 51 | RegisterNUICallback("drawNotification", function(data, cb) 52 | BeginTextCommandThefeedPost("STRING") 53 | AddTextComponentSubstringPlayerName(data.message) 54 | EndTextCommandThefeedPostTicker(false, false) 55 | 56 | cb("ok") 57 | end) 58 | 59 | while true do 60 | Wait(25) 61 | 62 | local yaw = math.floor(360.0 - ((GetFinalRenderedCamRot(0).z + 360.0) % 360.0) + 0.5) 63 | 64 | if yaw == 360 then 65 | yaw = 0 66 | end 67 | 68 | -- get closest direction 69 | if oldYaw ~= yaw then 70 | oldYaw = yaw 71 | oldDirection = yaw .. "° " .. directions[math.floor((yaw + 22.5) / 45.0) % 8 + 1] 72 | 73 | exports["lb-phone"]:SendCustomAppMessage(identifier, { 74 | type = "updateDirection", 75 | direction = oldDirection 76 | }) 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /lb-vuejs/client.lua: -------------------------------------------------------------------------------- 1 | local identifier = "lb-app-template-vuejs" 2 | 3 | while GetResourceState("lb-phone") ~= "started" do 4 | Wait(500) 5 | end 6 | 7 | local function addApp() 8 | local added, errorMessage = exports["lb-phone"]:AddCustomApp({ 9 | identifier = identifier, -- unique app identifier 10 | 11 | name = "Vue.js", 12 | description = "Template app using Vue.js", 13 | developer = "LB", 14 | 15 | defaultApp = false, -- set to true, the app will automatically be added to the player's phone 16 | size = 59812, -- the app size in kb 17 | -- price = 0, -- OPTIONAL make players pay with in-game money to download the app 18 | 19 | images = { -- OPTIONAL array of screenshots of the app, used for showcasing the app 20 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-light.png", 21 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-dark.png" 22 | }, 23 | 24 | ui = "http://localhost:3000", 25 | -- ui = GetCurrentResourceName() .. "/ui/dist/index.html", 26 | 27 | icon = "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/icon.png", 28 | fixBlur = true -- set to true if you use em, rem etc instead of px in your css 29 | }) 30 | 31 | if not added then 32 | print("Could not add app:", errorMessage) 33 | end 34 | end 35 | 36 | addApp() 37 | 38 | AddEventHandler("onResourceStart", function(resource) 39 | if resource == "lb-phone" then 40 | addApp() 41 | end 42 | end) 43 | 44 | local directions = { "N", "NE", "E", "SE", "S", "SW", "W", "NW" } 45 | local oldYaw, oldDirection 46 | 47 | RegisterNUICallback("getDirection", function(data, cb) 48 | cb(oldDirection) 49 | end) 50 | 51 | RegisterNUICallback("drawNotification", function(data, cb) 52 | BeginTextCommandThefeedPost("STRING") 53 | AddTextComponentSubstringPlayerName(data.message) 54 | EndTextCommandThefeedPostTicker(false, false) 55 | 56 | cb("ok") 57 | end) 58 | 59 | while true do 60 | Wait(25) 61 | 62 | local yaw = math.floor(360.0 - ((GetFinalRenderedCamRot(0).z + 360.0) % 360.0) + 0.5) 63 | 64 | if yaw == 360 then 65 | yaw = 0 66 | end 67 | 68 | -- get closest direction 69 | if oldYaw ~= yaw then 70 | oldYaw = yaw 71 | oldDirection = yaw .. "° " .. directions[math.floor((yaw + 22.5) / 45.0) % 8 + 1] 72 | 73 | exports["lb-phone"]:SendCustomAppMessage(identifier, { 74 | type = "updateDirection", 75 | direction = oldDirection 76 | }) 77 | end 78 | end 79 | -------------------------------------------------------------------------------- /lb-vanillajs/client.lua: -------------------------------------------------------------------------------- 1 | local identifier = "vanilla-js-template" 2 | 3 | while GetResourceState("lb-phone") ~= "started" do 4 | Wait(500) 5 | end 6 | 7 | local function addApp() 8 | local added, errorMessage = exports["lb-phone"]:AddCustomApp({ 9 | identifier = identifier, -- unique app identifier 10 | 11 | name = "Vanilla JS", 12 | description = "Template app using vanilla JS", 13 | developer = "LB", 14 | 15 | defaultApp = false, -- set to true, the app will automatically be added to the player's phone 16 | size = 59812, -- the app size in kb 17 | -- price = 0, -- OPTIONAL make players pay with in-game money to download the app 18 | 19 | images = { -- OPTIONAL array of screenshots of the app, used for showcasing the app 20 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/assets/screenshot-light.png", 21 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/assets/screenshot-dark.png" 22 | }, 23 | 24 | -- ui = "http://localhost:5500/" .. GetCurrentResourceName() .. "/ui/index.html", 25 | ui = GetCurrentResourceName() .. "/ui/index.html", 26 | 27 | icon = "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/assets/icon.svg", 28 | 29 | fixBlur = true -- set to true if you use em, rem etc instead of px in your css 30 | }) 31 | 32 | if not added then 33 | print("Could not add app:", errorMessage) 34 | end 35 | end 36 | 37 | addApp() 38 | 39 | AddEventHandler("onResourceStart", function(resource) 40 | if resource == "lb-phone" then 41 | addApp() 42 | end 43 | end) 44 | 45 | local directions = { "N", "NE", "E", "SE", "S", "SW", "W", "NW" } 46 | local oldYaw, oldDirection 47 | 48 | RegisterNUICallback("getDirection", function(data, cb) 49 | cb(oldDirection) 50 | end) 51 | 52 | RegisterNUICallback("drawNotification", function(data, cb) 53 | BeginTextCommandThefeedPost("STRING") 54 | AddTextComponentSubstringPlayerName(data.message) 55 | EndTextCommandThefeedPostTicker(false, false) 56 | 57 | cb("ok") 58 | end) 59 | 60 | while true do 61 | Wait(25) 62 | 63 | local yaw = math.floor(360.0 - ((GetFinalRenderedCamRot(0).z + 360.0) % 360.0) + 0.5) 64 | 65 | if yaw == 360 then 66 | yaw = 0 67 | end 68 | 69 | -- get closest direction 70 | if oldYaw ~= yaw then 71 | oldYaw = yaw 72 | oldDirection = yaw .. "° " .. directions[math.floor((yaw + 22.5) / 45.0) % 8 + 1] 73 | 74 | exports["lb-phone"]:SendCustomAppMessage(identifier, { 75 | type = "updateDirection", 76 | direction = oldDirection 77 | }) 78 | end 79 | end 80 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Custom App Template 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 |
Custom App Template
20 |
Vanilla JS
21 | N 22 |
23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 |
34 |
35 |
36 | 37 | 38 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/dev.js: -------------------------------------------------------------------------------- 1 | // You can ignore this file. All it does is make the UI work on your browser. 2 | window.addEventListener('load', () => { 3 | const phoneWrapper = document.getElementById('phone-wrapper'); 4 | const app = phoneWrapper.querySelector('.app'); 5 | 6 | if (window.invokeNative) { 7 | phoneWrapper.parentNode.insertBefore(app, phoneWrapper); 8 | phoneWrapper.parentNode.removeChild(phoneWrapper); 9 | return; 10 | } 11 | document.getElementById('phone-wrapper').style.display = 'block'; 12 | document.body.style.visibility = 'visible'; 13 | 14 | // Create the Frame element 15 | const createFrame = (children) => { 16 | const frame = document.createElement('div'); 17 | frame.classList.add('phone-frame'); 18 | 19 | // Create the phone notch (you can style it as needed) 20 | const notch = document.createElement('div'); 21 | notch.classList.add('phone-notch'); 22 | 23 | // Create the phone indicator 24 | const indicator = document.createElement('div'); 25 | indicator.classList.add('phone-indicator'); 26 | 27 | // Create the time 28 | const time = document.createElement('div'); 29 | time.classList.add('phone-time'); 30 | 31 | const date = new Date(); 32 | time.innerText = date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0'); 33 | 34 | setInterval(() => { 35 | const date = new Date(); 36 | time.innerText = date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0'); 37 | }, 1000); 38 | 39 | // Create the phone content container and append children to it 40 | const phoneContent = document.createElement('div'); 41 | phoneContent.classList.add('phone-content'); 42 | phoneContent.appendChild(children); 43 | 44 | // Append the notch and content to the frame 45 | frame.appendChild(notch); 46 | frame.appendChild(phoneContent); 47 | frame.appendChild(indicator); 48 | frame.appendChild(time); 49 | 50 | return frame; 51 | }; 52 | 53 | const devWrapper = document.createElement('div'); 54 | devWrapper.classList.add('dev-wrapper'); 55 | 56 | const frame = createFrame(app); 57 | devWrapper.appendChild(frame); 58 | devWrapper.style.display = 'block'; 59 | 60 | phoneWrapper.parentNode.insertBefore(devWrapper, phoneWrapper); 61 | phoneWrapper.parentNode.removeChild(phoneWrapper); 62 | 63 | const center = () => (document.getElementById('phone-wrapper').style.scale = window.innerWidth / 1920); 64 | center(); 65 | 66 | window.addEventListener('resize', center); 67 | }); 68 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/App.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | .app { 8 | height: 100vh; 9 | width: 100%; 10 | 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | flex-wrap: wrap; 15 | 16 | background-color: var(--background-primary); 17 | 18 | font-family: 'Poppins', sans-serif; 19 | } 20 | 21 | .app-wrapper { 22 | width: 100%; 23 | height: 100%; 24 | 25 | display: flex; 26 | flex-direction: column; 27 | align-items: center; 28 | justify-content: center; 29 | gap: 3rem; 30 | } 31 | 32 | .header, 33 | .button-wrapper { 34 | display: flex; 35 | flex-direction: column; 36 | text-align: center; 37 | gap: 0.2rem; 38 | } 39 | 40 | .button-wrapper { 41 | gap: 1rem; 42 | } 43 | 44 | .title { 45 | font-size: 1.4rem; 46 | font-weight: 700; 47 | 48 | color: var(--text-primary); 49 | } 50 | 51 | .subtitle { 52 | font-size: 1rem; 53 | font-weight: 400; 54 | 55 | color: var(--text-secondary); 56 | } 57 | 58 | button { 59 | width: 14rem; 60 | height: 3.25rem; 61 | 62 | background-color: var(--background-highlight); 63 | color: var(--text-primary); 64 | 65 | border: none; 66 | border-radius: 0.3rem; 67 | 68 | font-size: 0.8rem; 69 | font-weight: 600; 70 | text-transform: uppercase; 71 | 72 | cursor: pointer; 73 | transition: all 0.25s ease-in-out; 74 | 75 | user-select: none; 76 | } 77 | 78 | button:hover { 79 | filter: brightness(0.8); 80 | } 81 | 82 | input { 83 | width: 14rem; 84 | height: 3.25rem; 85 | 86 | background-color: var(--background-highlight); 87 | color: var(--text-primary); 88 | 89 | border: none; 90 | border-radius: 0.3rem; 91 | 92 | padding: 0 1rem; 93 | 94 | font-size: 0.8rem; 95 | font-weight: 600; 96 | 97 | transition: all 0.25s ease-in-out; 98 | 99 | outline: none; 100 | } 101 | 102 | .gamerender-blur { 103 | position: absolute; 104 | top: 0; 105 | left: 0; 106 | 107 | width: 100%; 108 | height: 100%; 109 | background-color: rgba(0, 0, 0, 0.8); 110 | backdrop-filter: blur(0.2rem); 111 | 112 | display: flex; 113 | justify-content: center; 114 | align-items: center; 115 | } 116 | 117 | .gamerender-container { 118 | width: 80%; 119 | overflow: hidden; 120 | border-radius: 1rem; 121 | } 122 | 123 | /* Do not edit, this allows you to view changes easily in your browser */ 124 | .dev-wrapper { 125 | display: flex; 126 | 127 | align-items: center; 128 | justify-content: center; 129 | 130 | width: 100vw; 131 | height: 100vh; 132 | } 133 | -------------------------------------------------------------------------------- /lb-vuejs/ui/src/components/Frame.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | 38 | 121 | -------------------------------------------------------------------------------- /lb-reactts/client/client.lua: -------------------------------------------------------------------------------- 1 | while GetResourceState("lb-phone") ~= "started" do 2 | Wait(500) 3 | end 4 | 5 | Wait(1000) -- wait for the AddCustomApp export to exist 6 | 7 | local url = GetResourceMetadata(GetCurrentResourceName(), "ui_page", 0) 8 | 9 | local function AddApp() 10 | local added, errorMessage = exports["lb-phone"]:AddCustomApp({ 11 | identifier = Config.Identifier, -- unique app identifier 12 | 13 | name = Config.Name, 14 | description = Config.Description, 15 | developer = Config.Developer, 16 | 17 | defaultApp = Config.DefaultApp, -- should the app be installed by default? this also means that you can't uninstall it 18 | size = 59812, -- the app size in kb 19 | -- price = 0, -- OPTIONAL: require players to pay for the app with in-game money to download it 20 | 21 | images = { -- OPTIONAL array of screenshots of the app, used for showcasing the app 22 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-light.png", 23 | "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/screenshot-dark.png" 24 | }, 25 | 26 | ui = url:find("http") and url or GetCurrentResourceName() .. "/" .. url, 27 | icon = url:find("http") and url .. "/public/icon.svg" or "https://cfx-nui-" .. GetCurrentResourceName() .. "/ui/dist/icon.svg", 28 | 29 | fixBlur = true, 30 | 31 | onClose = function() 32 | exports["lb-phone"]:DisableWalkableCam() 33 | end 34 | }) 35 | 36 | if not added then 37 | print("Could not add app:", errorMessage) 38 | end 39 | end 40 | 41 | AddApp() 42 | 43 | AddEventHandler("onResourceStart", function(resource) 44 | if resource == "lb-phone" then 45 | AddApp() 46 | end 47 | end) 48 | 49 | local directions = { "N", "NE", "E", "SE", "S", "SW", "W", "NW" } 50 | local oldYaw, currentDirection 51 | 52 | RegisterNUICallback("getDirection", function(data, cb) 53 | cb(currentDirection) 54 | end) 55 | 56 | RegisterNUICallback("toggleCamera", function(toggle, cb) 57 | if toggle then 58 | exports["lb-phone"]:EnableWalkableCam() 59 | else 60 | exports["lb-phone"]:DisableWalkableCam() 61 | end 62 | 63 | cb("ok") 64 | end) 65 | 66 | RegisterNUICallback("drawNotification", function(data, cb) 67 | BeginTextCommandThefeedPost("STRING") 68 | AddTextComponentSubstringPlayerName(data.message) 69 | EndTextCommandThefeedPostTicker(false, false) 70 | 71 | cb("ok") 72 | end) 73 | 74 | while true do 75 | Wait(25) 76 | 77 | local yaw = math.floor(360.0 - ((GetFinalRenderedCamRot(0).z + 360.0) % 360.0) + 0.5) 78 | 79 | if yaw == 360 then 80 | yaw = 0 81 | end 82 | 83 | if oldYaw ~= yaw then 84 | oldYaw = yaw 85 | currentDirection = yaw .. "° " .. directions[math.floor((yaw + 22.5) / 45.0) % 8 + 1] 86 | 87 | SendAppMessage("updateDirection", currentDirection) 88 | end 89 | end 90 | -------------------------------------------------------------------------------- /lb-vanillajs/ui/script.js: -------------------------------------------------------------------------------- 1 | document.getElementById('context').onclick = () => { 2 | let notificationText = document.getElementById('notificationText').value; 3 | if (notificationText === '') notificationText = 'Notification text'; 4 | 5 | setContextMenu({ 6 | title: 'Context menu', 7 | buttons: [ 8 | { 9 | title: 'Phone Notification', 10 | color: 'blue', 11 | cb: () => { 12 | sendNotification({ title: notificationText }); 13 | } 14 | }, 15 | { 16 | title: 'GTA Notification', 17 | color: 'red', 18 | cb: () => { 19 | fetchNui('drawNotification', { message: notificationText }); 20 | } 21 | } 22 | ] 23 | }); 24 | }; 25 | 26 | document.getElementById('gallery').onclick = () => { 27 | selectGallery({ 28 | includeVideos: true, 29 | includeImages: true, 30 | cb: (data) => { 31 | setPopUp({ 32 | title: 'Selected media', 33 | attachment: data, 34 | buttons: [ 35 | { 36 | title: 'OK' 37 | } 38 | ] 39 | }); 40 | } 41 | }); 42 | }; 43 | 44 | document.getElementById('popup').onclick = () => { 45 | setPopUp({ 46 | title: 'Popup Menu', 47 | description: 'Confirm your choice', 48 | buttons: [ 49 | { 50 | title: 'Cancel', 51 | color: 'red', 52 | cb: () => { 53 | console.log('Cancel'); 54 | } 55 | }, 56 | { 57 | title: 'Confirm', 58 | color: 'blue', 59 | cb: () => { 60 | console.log('Confirm'); 61 | } 62 | } 63 | ] 64 | }); 65 | }; 66 | 67 | document.getElementById('gif').onclick = () => { 68 | selectGIF((gif) => { 69 | setPopUp({ 70 | title: 'Selected GIF', 71 | attachment: { src: gif }, 72 | buttons: [ 73 | { 74 | title: 'OK' 75 | } 76 | ] 77 | }); 78 | }); 79 | }; 80 | 81 | document.getElementById('emoji').onclick = () => { 82 | selectEmoji((emoji) => { 83 | setPopUp({ 84 | title: 'Selected emoji', 85 | description: emoji, 86 | buttons: [ 87 | { 88 | title: 'OK' 89 | } 90 | ] 91 | }); 92 | }); 93 | }; 94 | 95 | document.getElementById('colorpicker').onclick = () => { 96 | colorPicker((color) => { 97 | setPopUp({ 98 | title: 'Selected color', 99 | description: color, 100 | buttons: [ 101 | { 102 | title: 'OK' 103 | } 104 | ] 105 | }); 106 | }); 107 | }; 108 | 109 | document.getElementById('cameracomponent').onclick = () => { 110 | useCamera( 111 | (url) => { 112 | setPopUp({ 113 | title: 'Media taken', 114 | attachment: { src: url }, 115 | buttons: [ 116 | { 117 | title: 'OK' 118 | } 119 | ] 120 | }); 121 | }, 122 | { 123 | default: { 124 | type: 'Photo', // 'Photo' | 'Video' | 'Landscape' 125 | flash: false, 126 | camera: 'rear' // 'rear' | 'front' 127 | }, 128 | permissions: { 129 | toggleFlash: true, 130 | flipCamera: true, 131 | takePhoto: true, 132 | takeVideo: true, 133 | takeLandscapePhoto: true 134 | } 135 | } 136 | ); 137 | }; 138 | 139 | onSettingsChange((settings) => { 140 | let theme = settings.display.theme; 141 | document.getElementsByClassName('app')[0].dataset.theme = theme; 142 | }); 143 | 144 | getSettings().then((settings) => { 145 | let theme = settings.display.theme; 146 | document.getElementsByClassName('app')[0].dataset.theme = theme; 147 | }); 148 | -------------------------------------------------------------------------------- /lb-vuejs/ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 148 | 149 | 170 | 171 | 209 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/components.d.ts: -------------------------------------------------------------------------------- 1 | interface GameRender { 2 | quality: number 3 | xOffset: number 4 | yOffset: number 5 | recorder: MediaRecorder | undefined 6 | recording: boolean 7 | destroyed: boolean 8 | canvas: HTMLCanvasElement | null 9 | gl: WebGLRenderingContext | null 10 | program: WebGLProgram | null 11 | paused: boolean 12 | viewport: { 13 | x: number 14 | y: number 15 | width: number 16 | height: number 17 | } 18 | canvasSize: { 19 | width: number 20 | height: number 21 | } 22 | animationFrame: number | null 23 | mainTexture: WebGLTexture | null 24 | hasPrevFrame: boolean 25 | prevTextures: WebGLTexture[] 26 | prevBuffers: WebGLFramebuffer[] 27 | 28 | pause(): void 29 | resume(): void 30 | resize(width: number, height: number): void 31 | resizeByAspect(ratio: number): void 32 | setQuality(quality: number): void 33 | setXOffset(offset: number): void 34 | setYOffset(offset: number): void 35 | destroy(keepCanvas?: boolean): void 36 | takePhoto(): Promise 37 | startRecording(cb: (blob: Blob) => void): MediaRecorder | undefined 38 | render(): void 39 | } 40 | 41 | type ContactsData = { 42 | number: string 43 | name?: string 44 | firstname?: string 45 | lastname?: string 46 | email?: string 47 | address?: string 48 | favourite?: boolean 49 | blocked?: boolean 50 | avatar?: string 51 | company?: string 52 | from?: string 53 | } 54 | 55 | type PopUp = { 56 | title: string 57 | description?: string 58 | vertical?: boolean 59 | 60 | inputs?: PopUpInput[] 61 | input?: PopUpInput 62 | 63 | contact?: ContactsData 64 | attachment?: { 65 | src: string 66 | } 67 | buttons: { 68 | title: string 69 | cb?: () => void 70 | disabled?: boolean 71 | bold?: boolean 72 | 73 | color?: 'red' | 'blue' 74 | }[] 75 | } 76 | 77 | type PopUpInput = Partial & { 78 | minCharacters?: number 79 | maxCharacters?: number 80 | onChange?: (value: string) => void 81 | } 82 | 83 | type CameraComponentData = { 84 | default?: { 85 | type?: 'Photo' | 'Video' | 'Landscape' 86 | flash?: boolean 87 | camera?: 'rear' | 'front' 88 | } 89 | permissions?: { 90 | toggleFlash?: boolean 91 | flipCamera?: boolean 92 | takePhoto?: boolean 93 | takeVideo?: boolean 94 | takeLandscapePhoto?: boolean 95 | } 96 | saveToGallery?: boolean 97 | } 98 | 99 | type MusicSelectorData = { 100 | onSelect: (data: { id: string; src: string; title: string; artist: string; album: string }) => void 101 | searchQuery?: string 102 | artist?: string 103 | album?: string 104 | } 105 | 106 | type Contextmenu = { 107 | title?: string 108 | buttons: { 109 | title: string 110 | color?: 'red' | 'blue' 111 | disabled?: boolean 112 | cb?: () => void 113 | }[] 114 | } 115 | 116 | type PhotoData = { 117 | id: number 118 | src: string 119 | timestamp?: number 120 | 121 | type?: string 122 | favourite?: boolean 123 | isVideo?: boolean 124 | 125 | size?: number 126 | 127 | duration?: number 128 | } 129 | 130 | type GalleryData = { 131 | includeVideos?: boolean 132 | includeImages?: boolean 133 | allowExternal?: boolean 134 | multiSelect?: boolean 135 | 136 | onCancel?: () => void 137 | onSelect: (data: PhotoData | PhotoData[]) => void 138 | } 139 | 140 | type GifSelectorData = { 141 | onSelect: (gif: string) => void 142 | } 143 | 144 | type SwitchProps = { 145 | disabled?: boolean 146 | theme?: 'light' | 'dark' 147 | checked?: boolean 148 | defaultChecked?: boolean 149 | onChange?: () => void 150 | } 151 | 152 | type FullscreenImagedata = { 153 | display: boolean 154 | image?: string 155 | } 156 | 157 | type ColorPickerData = { 158 | customApp?: boolean 159 | defaultColor?: string 160 | onSelect: (color: string) => void 161 | onClose?: (color: string) => void 162 | } 163 | 164 | type ShareComponentData = { 165 | type: 'image' | 'contact' | 'location' | 'note' | 'voicememo' 166 | data?: { 167 | // image 168 | isVideo?: boolean 169 | src?: string 170 | 171 | // contact 172 | number?: string 173 | firstname?: string 174 | lastname?: string 175 | avatar?: string 176 | email?: string 177 | address?: string 178 | 179 | //location 180 | name?: string 181 | location?: unknown 182 | 183 | //note 184 | title?: string 185 | content?: string 186 | timestamp?: number 187 | 188 | //voicememo 189 | duration?: number 190 | 191 | // timestamp?: number; 192 | // src?: string; 193 | } 194 | } 195 | 196 | type ContactSelectorData = { 197 | onSelect: (contact: ContactsData) => void 198 | filter?: string[] 199 | options?: { 200 | allowPhoneNumber?: boolean 201 | } 202 | } 203 | 204 | type Settings = { 205 | airplaneMode: boolean 206 | streamerMode: boolean 207 | doNotDisturb: boolean 208 | locale: string 209 | 210 | name: string 211 | avatar?: string 212 | address?: string 213 | email?: string 214 | 215 | display: { 216 | brightness: number 217 | size: number 218 | theme: 'dark' | 'light' 219 | automatic: boolean 220 | frameColor?: string 221 | } 222 | security: { 223 | pinCode: boolean 224 | faceId: boolean 225 | } 226 | wallpaper: { 227 | background: string 228 | blur?: boolean 229 | } 230 | time: { 231 | twelveHourClock: boolean 232 | } 233 | sound: { 234 | volume: number 235 | ringtone: string 236 | texttone: string 237 | silent: boolean 238 | } 239 | weather: { 240 | celcius: boolean 241 | } 242 | storage: { 243 | used: number 244 | total: number 245 | } 246 | phone: { 247 | showCallerId: boolean 248 | } 249 | notifications?: { 250 | [key: string]: { 251 | enabled: boolean 252 | sound: boolean 253 | } 254 | } 255 | lockscreen: { 256 | color: string 257 | fontStyle: number 258 | layout: number 259 | } 260 | apps: string[][] 261 | 262 | version?: string 263 | latestVersion?: string 264 | } 265 | 266 | declare global { 267 | var components: { 268 | createGameRender: (canvas: HTMLCanvasElement) => GameRender 269 | uploadMedia: (uploadType: 'Video' | 'Image' | 'Audio', blob: Blob) => Promise 270 | saveToGallery: (url: string, size?: number, type?: 'screenshot' | 'selfie' | 'import', shouldLog?: boolean) => Promise 271 | fetchPhone: (eventName: string, data?: unknown, mockData?: unknown) => Promise 272 | setColorPicker: (data: ColorPickerData) => void 273 | setPopUp: (data: PopUp) => void 274 | setContextMenu: (data: Contextmenu) => void 275 | setMusicSelector: (data: MusicSelectorData) => void 276 | setContactSelector: (data: ContactSelectorData) => void 277 | setEmojiPickerVisible: ( 278 | data?: 279 | | false 280 | | { 281 | onSelect: (emoji?: { activeSkinTone?: string; emoji?: string; names?: string[] }) => void 282 | } 283 | ) => void 284 | setShareComponent: (data: ShareComponentData) => void 285 | setGifPickerVisible: (data: GifSelectorData) => void 286 | setGallery: (data: GalleryData) => void 287 | setFullscreenImage: (data: string) => void 288 | setHomeIndicatorVisible: (visible: boolean) => void 289 | } 290 | var fetchNui: (eventName: string, data?: unknown, mockData?: T) => Promise 291 | var useNuiEvent: (eventName: string, cb: (data: T) => void) => void 292 | var formatPhoneNumber: (number: string) => string 293 | var getSettings: () => Promise 294 | var onSettingsChange: (cb: (settings: Settings) => void) => void 295 | var setApp: (app: string | { name: string; data: any }) => void 296 | var createCall: (options: { number?: string; videoCall?: boolean; company?: string; hideNumber?: boolean }) => void 297 | var sendNotification: (data: { 298 | title: string 299 | content?: string 300 | thumbnail?: string 301 | avatar?: string 302 | showAvatar?: boolean 303 | source?: number 304 | }) => void 305 | var useCamera: (cb: (url: string) => void, options: CameraComponentData) => void 306 | var settings: Settings 307 | var appName: string 308 | var resourceName: string 309 | } 310 | 311 | export {} 312 | -------------------------------------------------------------------------------- /lb-reactjs/ui/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState } from 'react'; 2 | 3 | import Frame from './components/Frame'; 4 | 5 | import './App.css'; 6 | 7 | const devMode = !window.invokeNative; 8 | 9 | const App = () => { 10 | const [theme, setTheme] = useState('light'); 11 | const [direction, setDirection] = useState('N'); 12 | const [notificationText, setNotificationText] = useState('Notification text'); 13 | const appDiv = useRef(null); 14 | 15 | const { setPopUp, setContextMenu, selectGIF, selectGallery, selectEmoji, fetchNui, sendNotification, getSettings, onSettingsChange, colorPicker, useCamera } = window; 16 | 17 | useEffect(() => { 18 | if (devMode) { 19 | document.getElementsByTagName('html')[0].style.visibility = 'visible'; 20 | document.getElementsByTagName('body')[0].style.visibility = 'visible'; 21 | return; 22 | } else { 23 | getSettings().then((settings) => setTheme(settings.display.theme)); 24 | onSettingsChange((settings) => setTheme(settings.display.theme)); 25 | } 26 | 27 | fetchNui('getDirection').then((direction) => setDirection(direction)); 28 | 29 | window.addEventListener('message', (e) => { 30 | if (e.data?.type === 'updateDirection') setDirection(e.data.direction); 31 | }); 32 | }, []); 33 | 34 | useEffect(() => { 35 | if (notificationText === '') setNotificationText('Notification text'); 36 | }, [notificationText]); 37 | 38 | return ( 39 | 40 |
41 |
42 |
43 |
Custom App Template
44 |
React JS
45 | {direction} 46 |
47 |
48 | 75 | 101 | 119 | 141 | 159 | 177 | 211 | setNotificationText(e.target.value)}> 212 |
213 |
214 |
215 |
216 | ); 217 | }; 218 | 219 | const AppProvider = ({ children }) => { 220 | if (devMode) { 221 | return ( 222 |
223 | {children} 224 |
225 | ); 226 | } else return children; 227 | }; 228 | 229 | const fetchData = (action, data) => { 230 | if (!action || !data) return; 231 | 232 | const options = { 233 | method: 'post', 234 | headers: { 235 | 'Content-Type': 'application/json; charset=UTF-8' 236 | }, 237 | body: JSON.stringify(data) 238 | }; 239 | 240 | return new Promise((resolve, reject) => { 241 | fetch(`https://${window.resourceName}/${action}`, options) 242 | .then((response) => response.json()) 243 | .then(resolve) 244 | .catch(reject); 245 | }); 246 | }; 247 | 248 | export default App; 249 | -------------------------------------------------------------------------------- /lb-reactts/ui/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode, useEffect, useRef, useState } from 'react' 2 | import './App.css' 3 | import Frame from './components/Frame' 4 | 5 | const devMode = !window?.['invokeNative'] 6 | 7 | const App = () => { 8 | const [gameRender, setGameRender] = useState(false) 9 | const [notificationText, setNotificationText] = useState('Notification text') 10 | 11 | const appDiv = useRef(null) 12 | 13 | useEffect(() => { 14 | if (devMode) { 15 | document.body.style.visibility = 'visible' 16 | return 17 | } 18 | }, []) 19 | 20 | useEffect(() => { 21 | if (notificationText === '') setNotificationText('Notification text') 22 | }, [notificationText]) 23 | 24 | return ( 25 | 26 |
27 |
28 |
29 |
30 | 56 | 81 | 100 | 124 | 144 | 164 | 197 | 204 | {gameRender && ( 205 | { 207 | setGameRender(false) 208 | 209 | if (url) { 210 | components.setPopUp({ 211 | title: 'Photo taken', 212 | attachment: { src: url }, 213 | buttons: [ 214 | { 215 | title: 'Close', 216 | color: 'red' 217 | }, 218 | { 219 | title: 'Save', 220 | color: 'blue', 221 | cb: async () => { 222 | const url = await components.uploadMedia('Image', blob) 223 | 224 | if (!url) return 225 | 226 | components.saveToGallery(url) 227 | } 228 | } 229 | ] 230 | }) 231 | } 232 | }} 233 | /> 234 | )} 235 | setNotificationText(e.target.value)}> 236 |
237 |
238 |
239 |
240 | ) 241 | } 242 | 243 | const Header = () => { 244 | const [direction, setDirection] = useState('N') 245 | 246 | useEffect(() => { 247 | if (devMode) return 248 | 249 | fetchNui('getDirection').then(setDirection) 250 | useNuiEvent('updateDirection', setDirection) 251 | }, []) 252 | 253 | return ( 254 |
255 |
Custom App Template
256 |
React TS
257 | {direction} 258 |
259 | ) 260 | } 261 | 262 | const GameRender = ({ remove }: { remove: (photo?: string, blob?: Blob) => void }) => { 263 | const aspectRatio = 9 / 18 264 | 265 | const canvasRef = useRef(null) 266 | const gameRenderRef = useRef>(null) 267 | 268 | useEffect(() => { 269 | if (!canvasRef.current) return 270 | 271 | const gameRender = components.createGameRender(canvasRef.current) 272 | 273 | gameRenderRef.current = gameRender 274 | 275 | gameRender.resizeByAspect(aspectRatio) 276 | 277 | fetchNui('toggleCamera', true) 278 | 279 | const checkDestroyedInterval = setInterval(() => { 280 | if (gameRender.destroyed) remove() 281 | }, 1000) 282 | 283 | return () => { 284 | fetchNui('toggleCamera', false) 285 | 286 | if (checkDestroyedInterval) clearInterval(checkDestroyedInterval) 287 | 288 | gameRenderRef.current?.destroy() 289 | } 290 | }, [canvasRef.current]) 291 | 292 | return ( 293 |
{ 296 | remove() 297 | }} 298 | > 299 |
{ 305 | event.stopPropagation() 306 | 307 | const gameRender = gameRenderRef.current 308 | 309 | if (!gameRender || gameRender.destroyed) return 310 | 311 | gameRender.takePhoto().then((blob) => { 312 | const url = URL.createObjectURL(blob) 313 | 314 | remove(url, blob) 315 | }) 316 | }} 317 | > 318 | 325 |
326 |
327 | ) 328 | } 329 | 330 | const AppProvider = ({ children }: { children: ReactNode }) => { 331 | if (devMode) { 332 | const handleResize = () => { 333 | const { innerWidth, innerHeight } = window 334 | 335 | const aspectRatio = innerWidth / innerHeight 336 | const phoneAspectRatio = 27.6 / 59 337 | 338 | if (phoneAspectRatio < aspectRatio) { 339 | document.documentElement.style.fontSize = '1.66vh' 340 | } else { 341 | document.documentElement.style.fontSize = '3.4vw' 342 | } 343 | } 344 | 345 | useEffect(() => { 346 | window.addEventListener('resize', handleResize) 347 | 348 | return () => { 349 | window.removeEventListener('resize', handleResize) 350 | } 351 | }, []) 352 | 353 | handleResize() 354 | 355 | return ( 356 |
357 | {children} 358 |
359 | ) 360 | } else return children 361 | } 362 | 363 | export default App 364 | -------------------------------------------------------------------------------- /lb-vuejs/ui/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@testing-library/jest-dom': 12 | specifier: ^6.4.5 13 | version: 6.6.3 14 | '@testing-library/user-event': 15 | specifier: ^14.5.2 16 | version: 14.5.2(@testing-library/dom@9.3.4) 17 | '@testing-library/vue': 18 | specifier: ^8.1.0 19 | version: 8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13) 20 | '@vitejs/plugin-vue': 21 | specifier: ^5.0.4 22 | version: 5.2.1(vite@4.5.5)(vue@3.5.13) 23 | vite: 24 | specifier: ^4.5.5 25 | version: 4.5.5 26 | vue: 27 | specifier: ^3.4.27 28 | version: 3.5.13 29 | 30 | packages: 31 | 32 | '@adobe/css-tools@4.4.1': 33 | resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} 34 | 35 | '@babel/code-frame@7.26.2': 36 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 37 | engines: {node: '>=6.9.0'} 38 | 39 | '@babel/helper-string-parser@7.25.9': 40 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 41 | engines: {node: '>=6.9.0'} 42 | 43 | '@babel/helper-validator-identifier@7.25.9': 44 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 45 | engines: {node: '>=6.9.0'} 46 | 47 | '@babel/parser@7.26.3': 48 | resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} 49 | engines: {node: '>=6.0.0'} 50 | hasBin: true 51 | 52 | '@babel/runtime@7.26.0': 53 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} 54 | engines: {node: '>=6.9.0'} 55 | 56 | '@babel/types@7.26.3': 57 | resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | '@esbuild/android-arm64@0.18.20': 61 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 62 | engines: {node: '>=12'} 63 | cpu: [arm64] 64 | os: [android] 65 | 66 | '@esbuild/android-arm@0.18.20': 67 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 68 | engines: {node: '>=12'} 69 | cpu: [arm] 70 | os: [android] 71 | 72 | '@esbuild/android-x64@0.18.20': 73 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 74 | engines: {node: '>=12'} 75 | cpu: [x64] 76 | os: [android] 77 | 78 | '@esbuild/darwin-arm64@0.18.20': 79 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 80 | engines: {node: '>=12'} 81 | cpu: [arm64] 82 | os: [darwin] 83 | 84 | '@esbuild/darwin-x64@0.18.20': 85 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 86 | engines: {node: '>=12'} 87 | cpu: [x64] 88 | os: [darwin] 89 | 90 | '@esbuild/freebsd-arm64@0.18.20': 91 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 92 | engines: {node: '>=12'} 93 | cpu: [arm64] 94 | os: [freebsd] 95 | 96 | '@esbuild/freebsd-x64@0.18.20': 97 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 98 | engines: {node: '>=12'} 99 | cpu: [x64] 100 | os: [freebsd] 101 | 102 | '@esbuild/linux-arm64@0.18.20': 103 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 104 | engines: {node: '>=12'} 105 | cpu: [arm64] 106 | os: [linux] 107 | 108 | '@esbuild/linux-arm@0.18.20': 109 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 110 | engines: {node: '>=12'} 111 | cpu: [arm] 112 | os: [linux] 113 | 114 | '@esbuild/linux-ia32@0.18.20': 115 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 116 | engines: {node: '>=12'} 117 | cpu: [ia32] 118 | os: [linux] 119 | 120 | '@esbuild/linux-loong64@0.18.20': 121 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 122 | engines: {node: '>=12'} 123 | cpu: [loong64] 124 | os: [linux] 125 | 126 | '@esbuild/linux-mips64el@0.18.20': 127 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 128 | engines: {node: '>=12'} 129 | cpu: [mips64el] 130 | os: [linux] 131 | 132 | '@esbuild/linux-ppc64@0.18.20': 133 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 134 | engines: {node: '>=12'} 135 | cpu: [ppc64] 136 | os: [linux] 137 | 138 | '@esbuild/linux-riscv64@0.18.20': 139 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 140 | engines: {node: '>=12'} 141 | cpu: [riscv64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-s390x@0.18.20': 145 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 146 | engines: {node: '>=12'} 147 | cpu: [s390x] 148 | os: [linux] 149 | 150 | '@esbuild/linux-x64@0.18.20': 151 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 152 | engines: {node: '>=12'} 153 | cpu: [x64] 154 | os: [linux] 155 | 156 | '@esbuild/netbsd-x64@0.18.20': 157 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 158 | engines: {node: '>=12'} 159 | cpu: [x64] 160 | os: [netbsd] 161 | 162 | '@esbuild/openbsd-x64@0.18.20': 163 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 164 | engines: {node: '>=12'} 165 | cpu: [x64] 166 | os: [openbsd] 167 | 168 | '@esbuild/sunos-x64@0.18.20': 169 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 170 | engines: {node: '>=12'} 171 | cpu: [x64] 172 | os: [sunos] 173 | 174 | '@esbuild/win32-arm64@0.18.20': 175 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 176 | engines: {node: '>=12'} 177 | cpu: [arm64] 178 | os: [win32] 179 | 180 | '@esbuild/win32-ia32@0.18.20': 181 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 182 | engines: {node: '>=12'} 183 | cpu: [ia32] 184 | os: [win32] 185 | 186 | '@esbuild/win32-x64@0.18.20': 187 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 188 | engines: {node: '>=12'} 189 | cpu: [x64] 190 | os: [win32] 191 | 192 | '@isaacs/cliui@8.0.2': 193 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 194 | engines: {node: '>=12'} 195 | 196 | '@jridgewell/sourcemap-codec@1.5.0': 197 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 198 | 199 | '@one-ini/wasm@0.1.1': 200 | resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} 201 | 202 | '@pkgjs/parseargs@0.11.0': 203 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 204 | engines: {node: '>=14'} 205 | 206 | '@testing-library/dom@9.3.4': 207 | resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} 208 | engines: {node: '>=14'} 209 | 210 | '@testing-library/jest-dom@6.6.3': 211 | resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} 212 | engines: {node: '>=14', npm: '>=6', yarn: '>=1'} 213 | 214 | '@testing-library/user-event@14.5.2': 215 | resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} 216 | engines: {node: '>=12', npm: '>=6'} 217 | peerDependencies: 218 | '@testing-library/dom': '>=7.21.4' 219 | 220 | '@testing-library/vue@8.1.0': 221 | resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} 222 | engines: {node: '>=14'} 223 | peerDependencies: 224 | '@vue/compiler-sfc': '>= 3' 225 | vue: '>= 3' 226 | peerDependenciesMeta: 227 | '@vue/compiler-sfc': 228 | optional: true 229 | 230 | '@types/aria-query@5.0.4': 231 | resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} 232 | 233 | '@vitejs/plugin-vue@5.2.1': 234 | resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} 235 | engines: {node: ^18.0.0 || >=20.0.0} 236 | peerDependencies: 237 | vite: ^5.0.0 || ^6.0.0 238 | vue: ^3.2.25 239 | 240 | '@vue/compiler-core@3.5.13': 241 | resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} 242 | 243 | '@vue/compiler-dom@3.5.13': 244 | resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} 245 | 246 | '@vue/compiler-sfc@3.5.13': 247 | resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} 248 | 249 | '@vue/compiler-ssr@3.5.13': 250 | resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} 251 | 252 | '@vue/reactivity@3.5.13': 253 | resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} 254 | 255 | '@vue/runtime-core@3.5.13': 256 | resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} 257 | 258 | '@vue/runtime-dom@3.5.13': 259 | resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} 260 | 261 | '@vue/server-renderer@3.5.13': 262 | resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} 263 | peerDependencies: 264 | vue: 3.5.13 265 | 266 | '@vue/shared@3.5.13': 267 | resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 268 | 269 | '@vue/test-utils@2.4.6': 270 | resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} 271 | 272 | abbrev@2.0.0: 273 | resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} 274 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 275 | 276 | ansi-regex@5.0.1: 277 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 278 | engines: {node: '>=8'} 279 | 280 | ansi-regex@6.1.0: 281 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 282 | engines: {node: '>=12'} 283 | 284 | ansi-styles@4.3.0: 285 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 286 | engines: {node: '>=8'} 287 | 288 | ansi-styles@5.2.0: 289 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 290 | engines: {node: '>=10'} 291 | 292 | ansi-styles@6.2.1: 293 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 294 | engines: {node: '>=12'} 295 | 296 | aria-query@5.1.3: 297 | resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} 298 | 299 | aria-query@5.3.2: 300 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 301 | engines: {node: '>= 0.4'} 302 | 303 | array-buffer-byte-length@1.0.1: 304 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 305 | engines: {node: '>= 0.4'} 306 | 307 | available-typed-arrays@1.0.7: 308 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 309 | engines: {node: '>= 0.4'} 310 | 311 | balanced-match@1.0.2: 312 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 313 | 314 | brace-expansion@2.0.1: 315 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 316 | 317 | call-bind-apply-helpers@1.0.1: 318 | resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} 319 | engines: {node: '>= 0.4'} 320 | 321 | call-bind@1.0.8: 322 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 323 | engines: {node: '>= 0.4'} 324 | 325 | call-bound@1.0.2: 326 | resolution: {integrity: sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==} 327 | engines: {node: '>= 0.4'} 328 | 329 | chalk@3.0.0: 330 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 331 | engines: {node: '>=8'} 332 | 333 | chalk@4.1.2: 334 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 335 | engines: {node: '>=10'} 336 | 337 | color-convert@2.0.1: 338 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 339 | engines: {node: '>=7.0.0'} 340 | 341 | color-name@1.1.4: 342 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 343 | 344 | commander@10.0.1: 345 | resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} 346 | engines: {node: '>=14'} 347 | 348 | config-chain@1.1.13: 349 | resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 350 | 351 | cross-spawn@7.0.6: 352 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 353 | engines: {node: '>= 8'} 354 | 355 | css.escape@1.5.1: 356 | resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} 357 | 358 | csstype@3.1.3: 359 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 360 | 361 | deep-equal@2.2.3: 362 | resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} 363 | engines: {node: '>= 0.4'} 364 | 365 | define-data-property@1.1.4: 366 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 367 | engines: {node: '>= 0.4'} 368 | 369 | define-properties@1.2.1: 370 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 371 | engines: {node: '>= 0.4'} 372 | 373 | dom-accessibility-api@0.5.16: 374 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} 375 | 376 | dom-accessibility-api@0.6.3: 377 | resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} 378 | 379 | dunder-proto@1.0.0: 380 | resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} 381 | engines: {node: '>= 0.4'} 382 | 383 | eastasianwidth@0.2.0: 384 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 385 | 386 | editorconfig@1.0.4: 387 | resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} 388 | engines: {node: '>=14'} 389 | hasBin: true 390 | 391 | emoji-regex@8.0.0: 392 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 393 | 394 | emoji-regex@9.2.2: 395 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 396 | 397 | entities@4.5.0: 398 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 399 | engines: {node: '>=0.12'} 400 | 401 | es-define-property@1.0.1: 402 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 403 | engines: {node: '>= 0.4'} 404 | 405 | es-errors@1.3.0: 406 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 407 | engines: {node: '>= 0.4'} 408 | 409 | es-get-iterator@1.1.3: 410 | resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} 411 | 412 | es-object-atoms@1.0.0: 413 | resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} 414 | engines: {node: '>= 0.4'} 415 | 416 | esbuild@0.18.20: 417 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 418 | engines: {node: '>=12'} 419 | hasBin: true 420 | 421 | estree-walker@2.0.2: 422 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 423 | 424 | for-each@0.3.3: 425 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 426 | 427 | foreground-child@3.3.0: 428 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 429 | engines: {node: '>=14'} 430 | 431 | fsevents@2.3.3: 432 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 433 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 434 | os: [darwin] 435 | 436 | function-bind@1.1.2: 437 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 438 | 439 | functions-have-names@1.2.3: 440 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 441 | 442 | get-intrinsic@1.2.6: 443 | resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} 444 | engines: {node: '>= 0.4'} 445 | 446 | glob@10.4.5: 447 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 448 | hasBin: true 449 | 450 | gopd@1.2.0: 451 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 452 | engines: {node: '>= 0.4'} 453 | 454 | has-bigints@1.0.2: 455 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 456 | 457 | has-flag@4.0.0: 458 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 459 | engines: {node: '>=8'} 460 | 461 | has-property-descriptors@1.0.2: 462 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 463 | 464 | has-symbols@1.1.0: 465 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 466 | engines: {node: '>= 0.4'} 467 | 468 | has-tostringtag@1.0.2: 469 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 470 | engines: {node: '>= 0.4'} 471 | 472 | hasown@2.0.2: 473 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 474 | engines: {node: '>= 0.4'} 475 | 476 | indent-string@4.0.0: 477 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 478 | engines: {node: '>=8'} 479 | 480 | ini@1.3.8: 481 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 482 | 483 | internal-slot@1.1.0: 484 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 485 | engines: {node: '>= 0.4'} 486 | 487 | is-arguments@1.2.0: 488 | resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} 489 | engines: {node: '>= 0.4'} 490 | 491 | is-array-buffer@3.0.4: 492 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 493 | engines: {node: '>= 0.4'} 494 | 495 | is-bigint@1.1.0: 496 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 497 | engines: {node: '>= 0.4'} 498 | 499 | is-boolean-object@1.2.1: 500 | resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} 501 | engines: {node: '>= 0.4'} 502 | 503 | is-callable@1.2.7: 504 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 505 | engines: {node: '>= 0.4'} 506 | 507 | is-date-object@1.1.0: 508 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 509 | engines: {node: '>= 0.4'} 510 | 511 | is-fullwidth-code-point@3.0.0: 512 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 513 | engines: {node: '>=8'} 514 | 515 | is-map@2.0.3: 516 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 517 | engines: {node: '>= 0.4'} 518 | 519 | is-number-object@1.1.0: 520 | resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} 521 | engines: {node: '>= 0.4'} 522 | 523 | is-regex@1.2.1: 524 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 525 | engines: {node: '>= 0.4'} 526 | 527 | is-set@2.0.3: 528 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 529 | engines: {node: '>= 0.4'} 530 | 531 | is-shared-array-buffer@1.0.3: 532 | resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 533 | engines: {node: '>= 0.4'} 534 | 535 | is-string@1.1.0: 536 | resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} 537 | engines: {node: '>= 0.4'} 538 | 539 | is-symbol@1.1.1: 540 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 541 | engines: {node: '>= 0.4'} 542 | 543 | is-weakmap@2.0.2: 544 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 545 | engines: {node: '>= 0.4'} 546 | 547 | is-weakset@2.0.3: 548 | resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} 549 | engines: {node: '>= 0.4'} 550 | 551 | isarray@2.0.5: 552 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 553 | 554 | isexe@2.0.0: 555 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 556 | 557 | jackspeak@3.4.3: 558 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 559 | 560 | js-beautify@1.15.1: 561 | resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} 562 | engines: {node: '>=14'} 563 | hasBin: true 564 | 565 | js-cookie@3.0.5: 566 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 567 | engines: {node: '>=14'} 568 | 569 | js-tokens@4.0.0: 570 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 571 | 572 | lodash@4.17.21: 573 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 574 | 575 | lru-cache@10.4.3: 576 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 577 | 578 | lz-string@1.5.0: 579 | resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} 580 | hasBin: true 581 | 582 | magic-string@0.30.15: 583 | resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} 584 | 585 | math-intrinsics@1.0.0: 586 | resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} 587 | engines: {node: '>= 0.4'} 588 | 589 | min-indent@1.0.1: 590 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 591 | engines: {node: '>=4'} 592 | 593 | minimatch@9.0.1: 594 | resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} 595 | engines: {node: '>=16 || 14 >=14.17'} 596 | 597 | minimatch@9.0.5: 598 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 599 | engines: {node: '>=16 || 14 >=14.17'} 600 | 601 | minipass@7.1.2: 602 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 603 | engines: {node: '>=16 || 14 >=14.17'} 604 | 605 | nanoid@3.3.8: 606 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 607 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 608 | hasBin: true 609 | 610 | nopt@7.2.1: 611 | resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} 612 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 613 | hasBin: true 614 | 615 | object-inspect@1.13.3: 616 | resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} 617 | engines: {node: '>= 0.4'} 618 | 619 | object-is@1.1.6: 620 | resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} 621 | engines: {node: '>= 0.4'} 622 | 623 | object-keys@1.1.1: 624 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 625 | engines: {node: '>= 0.4'} 626 | 627 | object.assign@4.1.5: 628 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 629 | engines: {node: '>= 0.4'} 630 | 631 | package-json-from-dist@1.0.1: 632 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 633 | 634 | path-key@3.1.1: 635 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 636 | engines: {node: '>=8'} 637 | 638 | path-scurry@1.11.1: 639 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 640 | engines: {node: '>=16 || 14 >=14.18'} 641 | 642 | picocolors@1.1.1: 643 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 644 | 645 | possible-typed-array-names@1.0.0: 646 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 647 | engines: {node: '>= 0.4'} 648 | 649 | postcss@8.4.49: 650 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 651 | engines: {node: ^10 || ^12 || >=14} 652 | 653 | pretty-format@27.5.1: 654 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 655 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 656 | 657 | proto-list@1.2.4: 658 | resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 659 | 660 | react-is@17.0.2: 661 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 662 | 663 | redent@3.0.0: 664 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 665 | engines: {node: '>=8'} 666 | 667 | regenerator-runtime@0.14.1: 668 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 669 | 670 | regexp.prototype.flags@1.5.3: 671 | resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} 672 | engines: {node: '>= 0.4'} 673 | 674 | rollup@3.29.5: 675 | resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} 676 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 677 | hasBin: true 678 | 679 | safe-regex-test@1.1.0: 680 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 681 | engines: {node: '>= 0.4'} 682 | 683 | semver@7.6.3: 684 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 685 | engines: {node: '>=10'} 686 | hasBin: true 687 | 688 | set-function-length@1.2.2: 689 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 690 | engines: {node: '>= 0.4'} 691 | 692 | set-function-name@2.0.2: 693 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 694 | engines: {node: '>= 0.4'} 695 | 696 | shebang-command@2.0.0: 697 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 698 | engines: {node: '>=8'} 699 | 700 | shebang-regex@3.0.0: 701 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 702 | engines: {node: '>=8'} 703 | 704 | side-channel-list@1.0.0: 705 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 706 | engines: {node: '>= 0.4'} 707 | 708 | side-channel-map@1.0.1: 709 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 710 | engines: {node: '>= 0.4'} 711 | 712 | side-channel-weakmap@1.0.2: 713 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 714 | engines: {node: '>= 0.4'} 715 | 716 | side-channel@1.1.0: 717 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 718 | engines: {node: '>= 0.4'} 719 | 720 | signal-exit@4.1.0: 721 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 722 | engines: {node: '>=14'} 723 | 724 | source-map-js@1.2.1: 725 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 726 | engines: {node: '>=0.10.0'} 727 | 728 | stop-iteration-iterator@1.1.0: 729 | resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} 730 | engines: {node: '>= 0.4'} 731 | 732 | string-width@4.2.3: 733 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 734 | engines: {node: '>=8'} 735 | 736 | string-width@5.1.2: 737 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 738 | engines: {node: '>=12'} 739 | 740 | strip-ansi@6.0.1: 741 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 742 | engines: {node: '>=8'} 743 | 744 | strip-ansi@7.1.0: 745 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 746 | engines: {node: '>=12'} 747 | 748 | strip-indent@3.0.0: 749 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 750 | engines: {node: '>=8'} 751 | 752 | supports-color@7.2.0: 753 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 754 | engines: {node: '>=8'} 755 | 756 | vite@4.5.5: 757 | resolution: {integrity: sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==} 758 | engines: {node: ^14.18.0 || >=16.0.0} 759 | hasBin: true 760 | peerDependencies: 761 | '@types/node': '>= 14' 762 | less: '*' 763 | lightningcss: ^1.21.0 764 | sass: '*' 765 | stylus: '*' 766 | sugarss: '*' 767 | terser: ^5.4.0 768 | peerDependenciesMeta: 769 | '@types/node': 770 | optional: true 771 | less: 772 | optional: true 773 | lightningcss: 774 | optional: true 775 | sass: 776 | optional: true 777 | stylus: 778 | optional: true 779 | sugarss: 780 | optional: true 781 | terser: 782 | optional: true 783 | 784 | vue-component-type-helpers@2.1.10: 785 | resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} 786 | 787 | vue@3.5.13: 788 | resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} 789 | peerDependencies: 790 | typescript: '*' 791 | peerDependenciesMeta: 792 | typescript: 793 | optional: true 794 | 795 | which-boxed-primitive@1.1.0: 796 | resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} 797 | engines: {node: '>= 0.4'} 798 | 799 | which-collection@1.0.2: 800 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 801 | engines: {node: '>= 0.4'} 802 | 803 | which-typed-array@1.1.16: 804 | resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} 805 | engines: {node: '>= 0.4'} 806 | 807 | which@2.0.2: 808 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 809 | engines: {node: '>= 8'} 810 | hasBin: true 811 | 812 | wrap-ansi@7.0.0: 813 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 814 | engines: {node: '>=10'} 815 | 816 | wrap-ansi@8.1.0: 817 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 818 | engines: {node: '>=12'} 819 | 820 | snapshots: 821 | 822 | '@adobe/css-tools@4.4.1': {} 823 | 824 | '@babel/code-frame@7.26.2': 825 | dependencies: 826 | '@babel/helper-validator-identifier': 7.25.9 827 | js-tokens: 4.0.0 828 | picocolors: 1.1.1 829 | 830 | '@babel/helper-string-parser@7.25.9': {} 831 | 832 | '@babel/helper-validator-identifier@7.25.9': {} 833 | 834 | '@babel/parser@7.26.3': 835 | dependencies: 836 | '@babel/types': 7.26.3 837 | 838 | '@babel/runtime@7.26.0': 839 | dependencies: 840 | regenerator-runtime: 0.14.1 841 | 842 | '@babel/types@7.26.3': 843 | dependencies: 844 | '@babel/helper-string-parser': 7.25.9 845 | '@babel/helper-validator-identifier': 7.25.9 846 | 847 | '@esbuild/android-arm64@0.18.20': 848 | optional: true 849 | 850 | '@esbuild/android-arm@0.18.20': 851 | optional: true 852 | 853 | '@esbuild/android-x64@0.18.20': 854 | optional: true 855 | 856 | '@esbuild/darwin-arm64@0.18.20': 857 | optional: true 858 | 859 | '@esbuild/darwin-x64@0.18.20': 860 | optional: true 861 | 862 | '@esbuild/freebsd-arm64@0.18.20': 863 | optional: true 864 | 865 | '@esbuild/freebsd-x64@0.18.20': 866 | optional: true 867 | 868 | '@esbuild/linux-arm64@0.18.20': 869 | optional: true 870 | 871 | '@esbuild/linux-arm@0.18.20': 872 | optional: true 873 | 874 | '@esbuild/linux-ia32@0.18.20': 875 | optional: true 876 | 877 | '@esbuild/linux-loong64@0.18.20': 878 | optional: true 879 | 880 | '@esbuild/linux-mips64el@0.18.20': 881 | optional: true 882 | 883 | '@esbuild/linux-ppc64@0.18.20': 884 | optional: true 885 | 886 | '@esbuild/linux-riscv64@0.18.20': 887 | optional: true 888 | 889 | '@esbuild/linux-s390x@0.18.20': 890 | optional: true 891 | 892 | '@esbuild/linux-x64@0.18.20': 893 | optional: true 894 | 895 | '@esbuild/netbsd-x64@0.18.20': 896 | optional: true 897 | 898 | '@esbuild/openbsd-x64@0.18.20': 899 | optional: true 900 | 901 | '@esbuild/sunos-x64@0.18.20': 902 | optional: true 903 | 904 | '@esbuild/win32-arm64@0.18.20': 905 | optional: true 906 | 907 | '@esbuild/win32-ia32@0.18.20': 908 | optional: true 909 | 910 | '@esbuild/win32-x64@0.18.20': 911 | optional: true 912 | 913 | '@isaacs/cliui@8.0.2': 914 | dependencies: 915 | string-width: 5.1.2 916 | string-width-cjs: string-width@4.2.3 917 | strip-ansi: 7.1.0 918 | strip-ansi-cjs: strip-ansi@6.0.1 919 | wrap-ansi: 8.1.0 920 | wrap-ansi-cjs: wrap-ansi@7.0.0 921 | 922 | '@jridgewell/sourcemap-codec@1.5.0': {} 923 | 924 | '@one-ini/wasm@0.1.1': {} 925 | 926 | '@pkgjs/parseargs@0.11.0': 927 | optional: true 928 | 929 | '@testing-library/dom@9.3.4': 930 | dependencies: 931 | '@babel/code-frame': 7.26.2 932 | '@babel/runtime': 7.26.0 933 | '@types/aria-query': 5.0.4 934 | aria-query: 5.1.3 935 | chalk: 4.1.2 936 | dom-accessibility-api: 0.5.16 937 | lz-string: 1.5.0 938 | pretty-format: 27.5.1 939 | 940 | '@testing-library/jest-dom@6.6.3': 941 | dependencies: 942 | '@adobe/css-tools': 4.4.1 943 | aria-query: 5.3.2 944 | chalk: 3.0.0 945 | css.escape: 1.5.1 946 | dom-accessibility-api: 0.6.3 947 | lodash: 4.17.21 948 | redent: 3.0.0 949 | 950 | '@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4)': 951 | dependencies: 952 | '@testing-library/dom': 9.3.4 953 | 954 | '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13)': 955 | dependencies: 956 | '@babel/runtime': 7.26.0 957 | '@testing-library/dom': 9.3.4 958 | '@vue/test-utils': 2.4.6 959 | vue: 3.5.13 960 | optionalDependencies: 961 | '@vue/compiler-sfc': 3.5.13 962 | 963 | '@types/aria-query@5.0.4': {} 964 | 965 | '@vitejs/plugin-vue@5.2.1(vite@4.5.5)(vue@3.5.13)': 966 | dependencies: 967 | vite: 4.5.5 968 | vue: 3.5.13 969 | 970 | '@vue/compiler-core@3.5.13': 971 | dependencies: 972 | '@babel/parser': 7.26.3 973 | '@vue/shared': 3.5.13 974 | entities: 4.5.0 975 | estree-walker: 2.0.2 976 | source-map-js: 1.2.1 977 | 978 | '@vue/compiler-dom@3.5.13': 979 | dependencies: 980 | '@vue/compiler-core': 3.5.13 981 | '@vue/shared': 3.5.13 982 | 983 | '@vue/compiler-sfc@3.5.13': 984 | dependencies: 985 | '@babel/parser': 7.26.3 986 | '@vue/compiler-core': 3.5.13 987 | '@vue/compiler-dom': 3.5.13 988 | '@vue/compiler-ssr': 3.5.13 989 | '@vue/shared': 3.5.13 990 | estree-walker: 2.0.2 991 | magic-string: 0.30.15 992 | postcss: 8.4.49 993 | source-map-js: 1.2.1 994 | 995 | '@vue/compiler-ssr@3.5.13': 996 | dependencies: 997 | '@vue/compiler-dom': 3.5.13 998 | '@vue/shared': 3.5.13 999 | 1000 | '@vue/reactivity@3.5.13': 1001 | dependencies: 1002 | '@vue/shared': 3.5.13 1003 | 1004 | '@vue/runtime-core@3.5.13': 1005 | dependencies: 1006 | '@vue/reactivity': 3.5.13 1007 | '@vue/shared': 3.5.13 1008 | 1009 | '@vue/runtime-dom@3.5.13': 1010 | dependencies: 1011 | '@vue/reactivity': 3.5.13 1012 | '@vue/runtime-core': 3.5.13 1013 | '@vue/shared': 3.5.13 1014 | csstype: 3.1.3 1015 | 1016 | '@vue/server-renderer@3.5.13(vue@3.5.13)': 1017 | dependencies: 1018 | '@vue/compiler-ssr': 3.5.13 1019 | '@vue/shared': 3.5.13 1020 | vue: 3.5.13 1021 | 1022 | '@vue/shared@3.5.13': {} 1023 | 1024 | '@vue/test-utils@2.4.6': 1025 | dependencies: 1026 | js-beautify: 1.15.1 1027 | vue-component-type-helpers: 2.1.10 1028 | 1029 | abbrev@2.0.0: {} 1030 | 1031 | ansi-regex@5.0.1: {} 1032 | 1033 | ansi-regex@6.1.0: {} 1034 | 1035 | ansi-styles@4.3.0: 1036 | dependencies: 1037 | color-convert: 2.0.1 1038 | 1039 | ansi-styles@5.2.0: {} 1040 | 1041 | ansi-styles@6.2.1: {} 1042 | 1043 | aria-query@5.1.3: 1044 | dependencies: 1045 | deep-equal: 2.2.3 1046 | 1047 | aria-query@5.3.2: {} 1048 | 1049 | array-buffer-byte-length@1.0.1: 1050 | dependencies: 1051 | call-bind: 1.0.8 1052 | is-array-buffer: 3.0.4 1053 | 1054 | available-typed-arrays@1.0.7: 1055 | dependencies: 1056 | possible-typed-array-names: 1.0.0 1057 | 1058 | balanced-match@1.0.2: {} 1059 | 1060 | brace-expansion@2.0.1: 1061 | dependencies: 1062 | balanced-match: 1.0.2 1063 | 1064 | call-bind-apply-helpers@1.0.1: 1065 | dependencies: 1066 | es-errors: 1.3.0 1067 | function-bind: 1.1.2 1068 | 1069 | call-bind@1.0.8: 1070 | dependencies: 1071 | call-bind-apply-helpers: 1.0.1 1072 | es-define-property: 1.0.1 1073 | get-intrinsic: 1.2.6 1074 | set-function-length: 1.2.2 1075 | 1076 | call-bound@1.0.2: 1077 | dependencies: 1078 | call-bind: 1.0.8 1079 | get-intrinsic: 1.2.6 1080 | 1081 | chalk@3.0.0: 1082 | dependencies: 1083 | ansi-styles: 4.3.0 1084 | supports-color: 7.2.0 1085 | 1086 | chalk@4.1.2: 1087 | dependencies: 1088 | ansi-styles: 4.3.0 1089 | supports-color: 7.2.0 1090 | 1091 | color-convert@2.0.1: 1092 | dependencies: 1093 | color-name: 1.1.4 1094 | 1095 | color-name@1.1.4: {} 1096 | 1097 | commander@10.0.1: {} 1098 | 1099 | config-chain@1.1.13: 1100 | dependencies: 1101 | ini: 1.3.8 1102 | proto-list: 1.2.4 1103 | 1104 | cross-spawn@7.0.6: 1105 | dependencies: 1106 | path-key: 3.1.1 1107 | shebang-command: 2.0.0 1108 | which: 2.0.2 1109 | 1110 | css.escape@1.5.1: {} 1111 | 1112 | csstype@3.1.3: {} 1113 | 1114 | deep-equal@2.2.3: 1115 | dependencies: 1116 | array-buffer-byte-length: 1.0.1 1117 | call-bind: 1.0.8 1118 | es-get-iterator: 1.1.3 1119 | get-intrinsic: 1.2.6 1120 | is-arguments: 1.2.0 1121 | is-array-buffer: 3.0.4 1122 | is-date-object: 1.1.0 1123 | is-regex: 1.2.1 1124 | is-shared-array-buffer: 1.0.3 1125 | isarray: 2.0.5 1126 | object-is: 1.1.6 1127 | object-keys: 1.1.1 1128 | object.assign: 4.1.5 1129 | regexp.prototype.flags: 1.5.3 1130 | side-channel: 1.1.0 1131 | which-boxed-primitive: 1.1.0 1132 | which-collection: 1.0.2 1133 | which-typed-array: 1.1.16 1134 | 1135 | define-data-property@1.1.4: 1136 | dependencies: 1137 | es-define-property: 1.0.1 1138 | es-errors: 1.3.0 1139 | gopd: 1.2.0 1140 | 1141 | define-properties@1.2.1: 1142 | dependencies: 1143 | define-data-property: 1.1.4 1144 | has-property-descriptors: 1.0.2 1145 | object-keys: 1.1.1 1146 | 1147 | dom-accessibility-api@0.5.16: {} 1148 | 1149 | dom-accessibility-api@0.6.3: {} 1150 | 1151 | dunder-proto@1.0.0: 1152 | dependencies: 1153 | call-bind-apply-helpers: 1.0.1 1154 | es-errors: 1.3.0 1155 | gopd: 1.2.0 1156 | 1157 | eastasianwidth@0.2.0: {} 1158 | 1159 | editorconfig@1.0.4: 1160 | dependencies: 1161 | '@one-ini/wasm': 0.1.1 1162 | commander: 10.0.1 1163 | minimatch: 9.0.1 1164 | semver: 7.6.3 1165 | 1166 | emoji-regex@8.0.0: {} 1167 | 1168 | emoji-regex@9.2.2: {} 1169 | 1170 | entities@4.5.0: {} 1171 | 1172 | es-define-property@1.0.1: {} 1173 | 1174 | es-errors@1.3.0: {} 1175 | 1176 | es-get-iterator@1.1.3: 1177 | dependencies: 1178 | call-bind: 1.0.8 1179 | get-intrinsic: 1.2.6 1180 | has-symbols: 1.1.0 1181 | is-arguments: 1.2.0 1182 | is-map: 2.0.3 1183 | is-set: 2.0.3 1184 | is-string: 1.1.0 1185 | isarray: 2.0.5 1186 | stop-iteration-iterator: 1.1.0 1187 | 1188 | es-object-atoms@1.0.0: 1189 | dependencies: 1190 | es-errors: 1.3.0 1191 | 1192 | esbuild@0.18.20: 1193 | optionalDependencies: 1194 | '@esbuild/android-arm': 0.18.20 1195 | '@esbuild/android-arm64': 0.18.20 1196 | '@esbuild/android-x64': 0.18.20 1197 | '@esbuild/darwin-arm64': 0.18.20 1198 | '@esbuild/darwin-x64': 0.18.20 1199 | '@esbuild/freebsd-arm64': 0.18.20 1200 | '@esbuild/freebsd-x64': 0.18.20 1201 | '@esbuild/linux-arm': 0.18.20 1202 | '@esbuild/linux-arm64': 0.18.20 1203 | '@esbuild/linux-ia32': 0.18.20 1204 | '@esbuild/linux-loong64': 0.18.20 1205 | '@esbuild/linux-mips64el': 0.18.20 1206 | '@esbuild/linux-ppc64': 0.18.20 1207 | '@esbuild/linux-riscv64': 0.18.20 1208 | '@esbuild/linux-s390x': 0.18.20 1209 | '@esbuild/linux-x64': 0.18.20 1210 | '@esbuild/netbsd-x64': 0.18.20 1211 | '@esbuild/openbsd-x64': 0.18.20 1212 | '@esbuild/sunos-x64': 0.18.20 1213 | '@esbuild/win32-arm64': 0.18.20 1214 | '@esbuild/win32-ia32': 0.18.20 1215 | '@esbuild/win32-x64': 0.18.20 1216 | 1217 | estree-walker@2.0.2: {} 1218 | 1219 | for-each@0.3.3: 1220 | dependencies: 1221 | is-callable: 1.2.7 1222 | 1223 | foreground-child@3.3.0: 1224 | dependencies: 1225 | cross-spawn: 7.0.6 1226 | signal-exit: 4.1.0 1227 | 1228 | fsevents@2.3.3: 1229 | optional: true 1230 | 1231 | function-bind@1.1.2: {} 1232 | 1233 | functions-have-names@1.2.3: {} 1234 | 1235 | get-intrinsic@1.2.6: 1236 | dependencies: 1237 | call-bind-apply-helpers: 1.0.1 1238 | dunder-proto: 1.0.0 1239 | es-define-property: 1.0.1 1240 | es-errors: 1.3.0 1241 | es-object-atoms: 1.0.0 1242 | function-bind: 1.1.2 1243 | gopd: 1.2.0 1244 | has-symbols: 1.1.0 1245 | hasown: 2.0.2 1246 | math-intrinsics: 1.0.0 1247 | 1248 | glob@10.4.5: 1249 | dependencies: 1250 | foreground-child: 3.3.0 1251 | jackspeak: 3.4.3 1252 | minimatch: 9.0.5 1253 | minipass: 7.1.2 1254 | package-json-from-dist: 1.0.1 1255 | path-scurry: 1.11.1 1256 | 1257 | gopd@1.2.0: {} 1258 | 1259 | has-bigints@1.0.2: {} 1260 | 1261 | has-flag@4.0.0: {} 1262 | 1263 | has-property-descriptors@1.0.2: 1264 | dependencies: 1265 | es-define-property: 1.0.1 1266 | 1267 | has-symbols@1.1.0: {} 1268 | 1269 | has-tostringtag@1.0.2: 1270 | dependencies: 1271 | has-symbols: 1.1.0 1272 | 1273 | hasown@2.0.2: 1274 | dependencies: 1275 | function-bind: 1.1.2 1276 | 1277 | indent-string@4.0.0: {} 1278 | 1279 | ini@1.3.8: {} 1280 | 1281 | internal-slot@1.1.0: 1282 | dependencies: 1283 | es-errors: 1.3.0 1284 | hasown: 2.0.2 1285 | side-channel: 1.1.0 1286 | 1287 | is-arguments@1.2.0: 1288 | dependencies: 1289 | call-bound: 1.0.2 1290 | has-tostringtag: 1.0.2 1291 | 1292 | is-array-buffer@3.0.4: 1293 | dependencies: 1294 | call-bind: 1.0.8 1295 | get-intrinsic: 1.2.6 1296 | 1297 | is-bigint@1.1.0: 1298 | dependencies: 1299 | has-bigints: 1.0.2 1300 | 1301 | is-boolean-object@1.2.1: 1302 | dependencies: 1303 | call-bound: 1.0.2 1304 | has-tostringtag: 1.0.2 1305 | 1306 | is-callable@1.2.7: {} 1307 | 1308 | is-date-object@1.1.0: 1309 | dependencies: 1310 | call-bound: 1.0.2 1311 | has-tostringtag: 1.0.2 1312 | 1313 | is-fullwidth-code-point@3.0.0: {} 1314 | 1315 | is-map@2.0.3: {} 1316 | 1317 | is-number-object@1.1.0: 1318 | dependencies: 1319 | call-bind: 1.0.8 1320 | has-tostringtag: 1.0.2 1321 | 1322 | is-regex@1.2.1: 1323 | dependencies: 1324 | call-bound: 1.0.2 1325 | gopd: 1.2.0 1326 | has-tostringtag: 1.0.2 1327 | hasown: 2.0.2 1328 | 1329 | is-set@2.0.3: {} 1330 | 1331 | is-shared-array-buffer@1.0.3: 1332 | dependencies: 1333 | call-bind: 1.0.8 1334 | 1335 | is-string@1.1.0: 1336 | dependencies: 1337 | call-bind: 1.0.8 1338 | has-tostringtag: 1.0.2 1339 | 1340 | is-symbol@1.1.1: 1341 | dependencies: 1342 | call-bound: 1.0.2 1343 | has-symbols: 1.1.0 1344 | safe-regex-test: 1.1.0 1345 | 1346 | is-weakmap@2.0.2: {} 1347 | 1348 | is-weakset@2.0.3: 1349 | dependencies: 1350 | call-bind: 1.0.8 1351 | get-intrinsic: 1.2.6 1352 | 1353 | isarray@2.0.5: {} 1354 | 1355 | isexe@2.0.0: {} 1356 | 1357 | jackspeak@3.4.3: 1358 | dependencies: 1359 | '@isaacs/cliui': 8.0.2 1360 | optionalDependencies: 1361 | '@pkgjs/parseargs': 0.11.0 1362 | 1363 | js-beautify@1.15.1: 1364 | dependencies: 1365 | config-chain: 1.1.13 1366 | editorconfig: 1.0.4 1367 | glob: 10.4.5 1368 | js-cookie: 3.0.5 1369 | nopt: 7.2.1 1370 | 1371 | js-cookie@3.0.5: {} 1372 | 1373 | js-tokens@4.0.0: {} 1374 | 1375 | lodash@4.17.21: {} 1376 | 1377 | lru-cache@10.4.3: {} 1378 | 1379 | lz-string@1.5.0: {} 1380 | 1381 | magic-string@0.30.15: 1382 | dependencies: 1383 | '@jridgewell/sourcemap-codec': 1.5.0 1384 | 1385 | math-intrinsics@1.0.0: {} 1386 | 1387 | min-indent@1.0.1: {} 1388 | 1389 | minimatch@9.0.1: 1390 | dependencies: 1391 | brace-expansion: 2.0.1 1392 | 1393 | minimatch@9.0.5: 1394 | dependencies: 1395 | brace-expansion: 2.0.1 1396 | 1397 | minipass@7.1.2: {} 1398 | 1399 | nanoid@3.3.8: {} 1400 | 1401 | nopt@7.2.1: 1402 | dependencies: 1403 | abbrev: 2.0.0 1404 | 1405 | object-inspect@1.13.3: {} 1406 | 1407 | object-is@1.1.6: 1408 | dependencies: 1409 | call-bind: 1.0.8 1410 | define-properties: 1.2.1 1411 | 1412 | object-keys@1.1.1: {} 1413 | 1414 | object.assign@4.1.5: 1415 | dependencies: 1416 | call-bind: 1.0.8 1417 | define-properties: 1.2.1 1418 | has-symbols: 1.1.0 1419 | object-keys: 1.1.1 1420 | 1421 | package-json-from-dist@1.0.1: {} 1422 | 1423 | path-key@3.1.1: {} 1424 | 1425 | path-scurry@1.11.1: 1426 | dependencies: 1427 | lru-cache: 10.4.3 1428 | minipass: 7.1.2 1429 | 1430 | picocolors@1.1.1: {} 1431 | 1432 | possible-typed-array-names@1.0.0: {} 1433 | 1434 | postcss@8.4.49: 1435 | dependencies: 1436 | nanoid: 3.3.8 1437 | picocolors: 1.1.1 1438 | source-map-js: 1.2.1 1439 | 1440 | pretty-format@27.5.1: 1441 | dependencies: 1442 | ansi-regex: 5.0.1 1443 | ansi-styles: 5.2.0 1444 | react-is: 17.0.2 1445 | 1446 | proto-list@1.2.4: {} 1447 | 1448 | react-is@17.0.2: {} 1449 | 1450 | redent@3.0.0: 1451 | dependencies: 1452 | indent-string: 4.0.0 1453 | strip-indent: 3.0.0 1454 | 1455 | regenerator-runtime@0.14.1: {} 1456 | 1457 | regexp.prototype.flags@1.5.3: 1458 | dependencies: 1459 | call-bind: 1.0.8 1460 | define-properties: 1.2.1 1461 | es-errors: 1.3.0 1462 | set-function-name: 2.0.2 1463 | 1464 | rollup@3.29.5: 1465 | optionalDependencies: 1466 | fsevents: 2.3.3 1467 | 1468 | safe-regex-test@1.1.0: 1469 | dependencies: 1470 | call-bound: 1.0.2 1471 | es-errors: 1.3.0 1472 | is-regex: 1.2.1 1473 | 1474 | semver@7.6.3: {} 1475 | 1476 | set-function-length@1.2.2: 1477 | dependencies: 1478 | define-data-property: 1.1.4 1479 | es-errors: 1.3.0 1480 | function-bind: 1.1.2 1481 | get-intrinsic: 1.2.6 1482 | gopd: 1.2.0 1483 | has-property-descriptors: 1.0.2 1484 | 1485 | set-function-name@2.0.2: 1486 | dependencies: 1487 | define-data-property: 1.1.4 1488 | es-errors: 1.3.0 1489 | functions-have-names: 1.2.3 1490 | has-property-descriptors: 1.0.2 1491 | 1492 | shebang-command@2.0.0: 1493 | dependencies: 1494 | shebang-regex: 3.0.0 1495 | 1496 | shebang-regex@3.0.0: {} 1497 | 1498 | side-channel-list@1.0.0: 1499 | dependencies: 1500 | es-errors: 1.3.0 1501 | object-inspect: 1.13.3 1502 | 1503 | side-channel-map@1.0.1: 1504 | dependencies: 1505 | call-bound: 1.0.2 1506 | es-errors: 1.3.0 1507 | get-intrinsic: 1.2.6 1508 | object-inspect: 1.13.3 1509 | 1510 | side-channel-weakmap@1.0.2: 1511 | dependencies: 1512 | call-bound: 1.0.2 1513 | es-errors: 1.3.0 1514 | get-intrinsic: 1.2.6 1515 | object-inspect: 1.13.3 1516 | side-channel-map: 1.0.1 1517 | 1518 | side-channel@1.1.0: 1519 | dependencies: 1520 | es-errors: 1.3.0 1521 | object-inspect: 1.13.3 1522 | side-channel-list: 1.0.0 1523 | side-channel-map: 1.0.1 1524 | side-channel-weakmap: 1.0.2 1525 | 1526 | signal-exit@4.1.0: {} 1527 | 1528 | source-map-js@1.2.1: {} 1529 | 1530 | stop-iteration-iterator@1.1.0: 1531 | dependencies: 1532 | es-errors: 1.3.0 1533 | internal-slot: 1.1.0 1534 | 1535 | string-width@4.2.3: 1536 | dependencies: 1537 | emoji-regex: 8.0.0 1538 | is-fullwidth-code-point: 3.0.0 1539 | strip-ansi: 6.0.1 1540 | 1541 | string-width@5.1.2: 1542 | dependencies: 1543 | eastasianwidth: 0.2.0 1544 | emoji-regex: 9.2.2 1545 | strip-ansi: 7.1.0 1546 | 1547 | strip-ansi@6.0.1: 1548 | dependencies: 1549 | ansi-regex: 5.0.1 1550 | 1551 | strip-ansi@7.1.0: 1552 | dependencies: 1553 | ansi-regex: 6.1.0 1554 | 1555 | strip-indent@3.0.0: 1556 | dependencies: 1557 | min-indent: 1.0.1 1558 | 1559 | supports-color@7.2.0: 1560 | dependencies: 1561 | has-flag: 4.0.0 1562 | 1563 | vite@4.5.5: 1564 | dependencies: 1565 | esbuild: 0.18.20 1566 | postcss: 8.4.49 1567 | rollup: 3.29.5 1568 | optionalDependencies: 1569 | fsevents: 2.3.3 1570 | 1571 | vue-component-type-helpers@2.1.10: {} 1572 | 1573 | vue@3.5.13: 1574 | dependencies: 1575 | '@vue/compiler-dom': 3.5.13 1576 | '@vue/compiler-sfc': 3.5.13 1577 | '@vue/runtime-dom': 3.5.13 1578 | '@vue/server-renderer': 3.5.13(vue@3.5.13) 1579 | '@vue/shared': 3.5.13 1580 | 1581 | which-boxed-primitive@1.1.0: 1582 | dependencies: 1583 | is-bigint: 1.1.0 1584 | is-boolean-object: 1.2.1 1585 | is-number-object: 1.1.0 1586 | is-string: 1.1.0 1587 | is-symbol: 1.1.1 1588 | 1589 | which-collection@1.0.2: 1590 | dependencies: 1591 | is-map: 2.0.3 1592 | is-set: 2.0.3 1593 | is-weakmap: 2.0.2 1594 | is-weakset: 2.0.3 1595 | 1596 | which-typed-array@1.1.16: 1597 | dependencies: 1598 | available-typed-arrays: 1.0.7 1599 | call-bind: 1.0.8 1600 | for-each: 0.3.3 1601 | gopd: 1.2.0 1602 | has-tostringtag: 1.0.2 1603 | 1604 | which@2.0.2: 1605 | dependencies: 1606 | isexe: 2.0.0 1607 | 1608 | wrap-ansi@7.0.0: 1609 | dependencies: 1610 | ansi-styles: 4.3.0 1611 | string-width: 4.2.3 1612 | strip-ansi: 6.0.1 1613 | 1614 | wrap-ansi@8.1.0: 1615 | dependencies: 1616 | ansi-styles: 6.2.1 1617 | string-width: 5.1.2 1618 | strip-ansi: 7.1.0 1619 | --------------------------------------------------------------------------------