├── 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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
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 |
17 |
--------------------------------------------------------------------------------
/lb-reactts/ui/public/icon.svg:
--------------------------------------------------------------------------------
1 |
17 |
--------------------------------------------------------------------------------
/lb-vanillajs/ui/assets/icon.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
2 |
3 |
{{ time }}
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
150 |
151 |
152 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
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 |
--------------------------------------------------------------------------------