├── .gitignore
├── README.md
├── includes
└── admin
│ ├── assets
│ └── js
│ │ ├── index.html
│ │ └── index.js
│ ├── backend
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── index.html
│ ├── package.json
│ ├── pnpm-lock.yaml
│ ├── postcss.config.js
│ ├── src
│ │ ├── App.tsx
│ │ ├── assets
│ │ │ └── css
│ │ │ │ └── index.css
│ │ ├── components
│ │ │ ├── Alert
│ │ │ │ └── Alert.tsx
│ │ │ ├── Button
│ │ │ │ └── Button.tsx
│ │ │ ├── Form
│ │ │ │ ├── ColorPicker
│ │ │ │ │ └── ColorPicker.tsx
│ │ │ │ ├── InputText
│ │ │ │ │ └── InputText.tsx
│ │ │ │ ├── ReactSelectField
│ │ │ │ │ └── ReactSelectField.tsx
│ │ │ │ ├── SelectField
│ │ │ │ │ └── SelectField.tsx
│ │ │ │ ├── TextArea
│ │ │ │ │ └── TextArea.tsx
│ │ │ │ └── ToggleField
│ │ │ │ │ └── ToggleField.tsx
│ │ │ ├── Header
│ │ │ │ └── Header.tsx
│ │ │ ├── Icons
│ │ │ │ ├── AnalyticsSVG.tsx
│ │ │ │ ├── CheckMark.tsx
│ │ │ │ ├── CrossMark.tsx
│ │ │ │ ├── DashboardSVG.tsx
│ │ │ │ ├── InvoiceSVG.tsx
│ │ │ │ ├── LinkSVG.tsx
│ │ │ │ ├── SettingsSVG.tsx
│ │ │ │ └── UserSVG.tsx
│ │ │ ├── InlineError
│ │ │ │ └── InlineError.tsx
│ │ │ ├── Loader
│ │ │ │ └── Loader.tsx
│ │ │ ├── MainLayout
│ │ │ │ └── MainLayout.tsx
│ │ │ └── Sidebar
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ └── components
│ │ │ │ ├── Footer.tsx
│ │ │ │ ├── Logo.tsx
│ │ │ │ ├── MenuItem.tsx
│ │ │ │ └── SubMenuItem.tsx
│ │ ├── hooks
│ │ │ └── useClickOutside.ts
│ │ ├── main.tsx
│ │ ├── services
│ │ │ ├── licence.service.ts
│ │ │ ├── orders.service.ts
│ │ │ ├── posts.service.ts
│ │ │ ├── settings.service.ts
│ │ │ └── users.service.ts
│ │ ├── utils
│ │ │ └── helpers.ts
│ │ ├── views
│ │ │ ├── Licence
│ │ │ │ └── Licence.tsx
│ │ │ ├── Posts
│ │ │ │ └── Posts.tsx
│ │ │ ├── Settings
│ │ │ │ └── GeneralSettings.tsx
│ │ │ └── Users
│ │ │ │ └── Users.tsx
│ │ └── vite-env.d.ts
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.ts
│ ├── class-wp-react-admin-panel-api.php
│ ├── class-wp-react-admin-panel-assets.php
│ └── class-wp-react-admin-panel-menu.php
└── wp-react-admin-panel.php
/.gitignore:
--------------------------------------------------------------------------------
1 | /vendor/
2 | .DS_Store
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WPGens WordPress React Admin Panel
2 |
3 | :star: Star us on GitHub — it motivates us a lot!
4 |
5 | WPGens WordPress React Admin Panel is a professional looking WordPress administration panel for plugins written in TypeScript with [WP REST API](https://v2.wp-api.org/) and [React](https://reactjs.org/). Its simple to extend and use for your own WordPress plugins. Check out the demo [here.](https://wpgensdemo.com/wp-admin/admin.php?page=gens-raf)
6 |
7 | 
8 |
9 | ## Table Of Content
10 |
11 | - [About Project](#about-project)
12 | - [Project Stack](#project-stack)
13 | - [Technology Overview](#technology-overview)
14 | - [Project Structure](#project-structure)
15 | - [Installation](#installation)
16 | - [How to run the demo](#how-to-run)
17 | - [How to use in your projects](#how-to-use)
18 | - [Improvements](#improvements)
19 | - [License](#license)
20 | - [Links](#links)
21 |
22 | ## About Project
23 |
24 | WPGens WordPress React Admin Panel was built to modernize the building and the look of WordPress plugins administration panel. Instead of using Settings API, we are communicating with the backend through REST API, allowing the use of modern technologies. @wordpress/api-fetch also simplified the flow.
25 |
26 | ### Project Stack
27 |
28 | WPGens WordPress React Admin Panel is written in **TypeScript**. **React hook form** is used for the settings panel forms and **@wordpress/api-fetch** to securely communicate with WordPress backend. **TailWind CSS** for styling (easy to start with, just set up your IDE), **React Query** optimizes data management by efficiently handling fetched data, reducing the need for extensive manual state management, and **yup** is used for form validation to ensure data integrity before submission. We are also using **vite** instead of webpack to build the app and serve the HMR. The only UI libraries are **React Select** and **React Color**. We can add more libraries but the goal is to keep it light and simple.
29 |
30 | ### Technology Overview:
31 |
32 | Written in Typescript with following libraries:
33 |
34 | - **TypeScript**: The entire WPGens WordPress React Admin Panel is written in TypeScript, offering type safety and improved development workflows.
35 |
36 | - **React**: You know what this is.
37 |
38 | - **WordPress API Fetch (@wordpress/api-fetch)**: This package provides functions to interact with the WordPress REST API securely. It allows fetching data from the WordPress backend, enabling seamless integration with WordPress functionalities.
39 |
40 | - **React Hook Form (@react-hook-form)**: A library for managing form state and validation in React using hooks. It simplifies the process of building complex forms by providing an intuitive API.
41 |
42 | - **Tailwind CSS**: A utility-first CSS framework that provides a set of pre-built CSS classes to rapidly build custom designs without leaving your HTML.
43 |
44 | - **React Query (@react-query)**: A library for managing and caching asynchronous data in React applications. It optimizes network requests, caching, and state management, enhancing the performance of data-fetching operations.
45 |
46 | - **Yup**: is a schema validation library used to define and validate data before sending it to backend.
47 |
48 | - **Vite**: A build tool that offers fast and optimized development and production builds for web applications. It provides a modern development environment with features like hot module replacement (HMR) and lightning-fast build times.
49 |
50 | - **React Select (@react-select)**: An elegant and efficient dropdown select component for React. It provides a highly customizable and feature-rich interface for selecting options.
51 |
52 | - **React Color (@react-color)**: A library that offers a collection of color pickers and tools for integrating color selection and manipulation into your React applications.
53 |
54 | ### Supported fields
55 |
56 | - Input Field
57 | - Select Field
58 | - React Select (multiselect)
59 | - Toggle Field
60 | - TextArea
61 | - Color Picker
62 |
63 | Open for PR's for more fields like Date picker. But not for big libraries.
64 |
65 | ### Project Structure
66 |
67 | The project is located under the /backend folder. You probably won't be using PHP files from this repo. They are used to define the menu item, enqueue scripts, and define API routes that you will create inside your plugin. So, /backend folder structure is as follows:
68 |
69 | ```bash
70 | ├── src
71 | │ ├── assets
72 | │ │ ├── css
73 | │ │ │ ├── index.css
74 | │ │ │ └── ...
75 | │ │ ├── img
76 | │ │ │ ├── bg.jpeg
77 | │ │ │ └── ...
78 | │ ├── components
79 | │ │ ├── Button
80 | │ │ │ ├── Button.tsx
81 | │ │ ├── Header
82 | │ │ │ ├── Header.tsx
83 | │ │ └── ...
84 | │ ├── hooks
85 | │ │ ├── useClickOutside.ts
86 | │ │ └── ...
87 | │ ├── services
88 | │ │ ├── settings.service.ts
89 | │ │ ├── licence.service.ts
90 | │ │ └── ...
91 | │ ├── utils
92 | │ │ ├── helpers.ts
93 | │ │ └── ...
94 | │ ├── views
95 | │ │ ├── Settings
96 | │ │ │ ├── GeneralSettings.tsx
97 | │ │ │ ├── AdvanceSettings.tsx
98 | │ │ │ └── ...
99 | │ │ ├── Posts
100 | │ │ │ ├── Posts.tsx
101 | │ │ └── ...
102 | ├── .eslintrc.cjs
103 | └── .gitignore
104 | ├── .prettierrc
105 | ├── package.json
106 | ├── pnpm-lock.yaml
107 | └── postcss.config.js
108 | └── README.md
109 | └── tailwind.config.js
110 | └── tsconfig.json
111 | └── tsconfig.node.json
112 | └── vite.config.js
113 | ```
114 |
115 | ## Installation
116 |
117 | Minimum requirement is PHP 7.3+
118 |
119 | ### How to run the demo
120 |
121 | To run the demo in your WordPress installation, you just need to:
122 |
123 | ```bash
124 | Download the repository.
125 | Copy it to the WordPress plugins folder
126 | Activate the plugin
127 | ```
128 |
129 | ### How to use in your projects
130 |
131 | ```bash
132 | 1. Download the repository.
133 | Copy to the WordPress plugins folder
134 | 2. Open the project.
135 | Under the wp-react-admin-panel.php, set `PLUGIN_NAME_DEV` constant to `true`. This will load dev server instead of the JS build.
136 | 3. Navigate to the includes/admin/backend and run `pnpm i` (I prefer pnpm, you can use npm).
137 | 4. Once dependencies are installed, run `pnpm run dev`. (npm run dev).
138 | 5. Log in to your WordPress and navigate to the WP Admin Panel. This should now load a dev build. Try changing the text to see if changes are showing instantly. HMR should work.
139 |
140 | Once you are done, run the pnpm run build that will create a single JS file that you need to enqueue in your projects.
141 | ```
142 |
143 | Thats it.
144 |
145 | _Note:_ When ziping plugin files, you do not need a backend folder, just index.js file that was built inside the assets/js folder.
146 |
147 | ## Improvements
148 |
149 | When you have multiple settings for a WordPress plugin, it's generally better to store them as a single array within a single option value rather than creating individual options for each setting. Currently this plugin is creating single option for each value, which was fine for my small plugin, but for bigger plugins you do not want to do that. I will add this change in the next update, it should be pretty straightforward thing to do.
150 |
151 | ## License
152 |
153 | The WPGens WordPress React Admin Panel is licensed under the terms of the GPL Open Source license and is available for free.
154 |
155 | ## Links
156 |
157 | - [Demo](https://wpgensdemo.com)
158 | - [WP Rest API](https://v2.wp-api.org)
159 | - [React](https://reactjs.org)
160 | - [Vite](https://vitejs.dev)
161 | - [React Query](https://tanstack.com/query/v3/)
162 | - [React Hook Form](https://react-hook-form.com/)
163 | - [Tailwind](https://tailwindcss.com)
164 |
--------------------------------------------------------------------------------
/includes/admin/assets/js/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Vite + React + TS
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/includes/admin/backend/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'],
5 | ignorePatterns: ['dist', '.eslintrc.cjs'],
6 | parser: '@typescript-eslint/parser',
7 | plugins: ['react-refresh'],
8 | rules: {
9 | 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
10 | 'no-unused-vars': 'off',
11 | '@typescript-eslint/no-unused-vars': 'warn',
12 | '@typescript-eslint/no-explicit-any': 'warn',
13 | },
14 | };
15 |
--------------------------------------------------------------------------------
/includes/admin/backend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/includes/admin/backend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 4,
3 | "singleQuote": true,
4 | "useTabs": true,
5 | "jsxSingleQuote": true,
6 | "printWidth": 160
7 | }
8 |
--------------------------------------------------------------------------------
/includes/admin/backend/README.md:
--------------------------------------------------------------------------------
1 | # React + TypeScript + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
10 | ## Expanding the ESLint configuration
11 |
12 | If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
13 |
14 | - Configure the top-level `parserOptions` property like this:
15 |
16 | ```js
17 | parserOptions: {
18 | ecmaVersion: 'latest',
19 | sourceType: 'module',
20 | project: ['./tsconfig.json', './tsconfig.node.json'],
21 | tsconfigRootDir: __dirname,
22 | },
23 | ```
24 |
25 | - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`
26 | - Optionally add `plugin:@typescript-eslint/stylistic-type-checked`
27 | - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list
28 |
--------------------------------------------------------------------------------
/includes/admin/backend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Vite + React + TS
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/includes/admin/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
10 | "watch": "tsc && vite build --emptyOutDir --watch"
11 | },
12 | "dependencies": {
13 | "@hookform/resolvers": "^3.3.2",
14 | "@wordpress/api-fetch": "^6.41.0",
15 | "react": "^18.2.0",
16 | "react-color": "^2.19.3",
17 | "react-dom": "^18.2.0",
18 | "react-hook-form": "^7.47.0",
19 | "react-query": "^3.39.3",
20 | "react-select": "^5.7.7",
21 | "yup": "^1.3.2"
22 | },
23 | "devDependencies": {
24 | "@types/react": "^18.2.15",
25 | "@types/react-color": "^3.0.9",
26 | "@types/react-dom": "^18.2.7",
27 | "@typescript-eslint/eslint-plugin": "^6.0.0",
28 | "@typescript-eslint/parser": "^6.0.0",
29 | "@vitejs/plugin-react": "^4.0.3",
30 | "autoprefixer": "^10.4.16",
31 | "eslint": "^8.45.0",
32 | "eslint-plugin-react-hooks": "^4.6.0",
33 | "eslint-plugin-react-refresh": "^0.4.3",
34 | "postcss": "^8.4.31",
35 | "tailwindcss": "^3.3.3",
36 | "typescript": "^5.0.2",
37 | "vite": "^4.4.5",
38 | "vite-tsconfig-paths": "^4.2.1"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/includes/admin/backend/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | dependencies:
4 | '@hookform/resolvers':
5 | specifier: ^3.3.2
6 | version: 3.3.2(react-hook-form@7.47.0)
7 | '@wordpress/api-fetch':
8 | specifier: ^6.41.0
9 | version: 6.41.0
10 | react:
11 | specifier: ^18.2.0
12 | version: 18.2.0
13 | react-color:
14 | specifier: ^2.19.3
15 | version: 2.19.3(react@18.2.0)
16 | react-dom:
17 | specifier: ^18.2.0
18 | version: 18.2.0(react@18.2.0)
19 | react-hook-form:
20 | specifier: ^7.47.0
21 | version: 7.47.0(react@18.2.0)
22 | react-query:
23 | specifier: ^3.39.3
24 | version: 3.39.3(react-dom@18.2.0)(react@18.2.0)
25 | react-select:
26 | specifier: ^5.7.7
27 | version: 5.7.7(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0)
28 | yup:
29 | specifier: ^1.3.2
30 | version: 1.3.2
31 |
32 | devDependencies:
33 | '@types/react':
34 | specifier: ^18.2.15
35 | version: 18.2.15
36 | '@types/react-color':
37 | specifier: ^3.0.9
38 | version: 3.0.9
39 | '@types/react-dom':
40 | specifier: ^18.2.7
41 | version: 18.2.7
42 | '@typescript-eslint/eslint-plugin':
43 | specifier: ^6.0.0
44 | version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.0.2)
45 | '@typescript-eslint/parser':
46 | specifier: ^6.0.0
47 | version: 6.0.0(eslint@8.45.0)(typescript@5.0.2)
48 | '@vitejs/plugin-react':
49 | specifier: ^4.0.3
50 | version: 4.0.3(vite@4.4.5)
51 | autoprefixer:
52 | specifier: ^10.4.16
53 | version: 10.4.16(postcss@8.4.31)
54 | eslint:
55 | specifier: ^8.45.0
56 | version: 8.45.0
57 | eslint-plugin-react-hooks:
58 | specifier: ^4.6.0
59 | version: 4.6.0(eslint@8.45.0)
60 | eslint-plugin-react-refresh:
61 | specifier: ^0.4.3
62 | version: 0.4.3(eslint@8.45.0)
63 | postcss:
64 | specifier: ^8.4.31
65 | version: 8.4.31
66 | tailwindcss:
67 | specifier: ^3.3.3
68 | version: 3.3.3
69 | typescript:
70 | specifier: ^5.0.2
71 | version: 5.0.2
72 | vite:
73 | specifier: ^4.4.5
74 | version: 4.4.5
75 | vite-tsconfig-paths:
76 | specifier: ^4.2.1
77 | version: 4.2.1(typescript@5.0.2)(vite@4.4.5)
78 |
79 | packages:
80 |
81 | /@aashutoshrathi/word-wrap@1.2.6:
82 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
83 | engines: {node: '>=0.10.0'}
84 | dev: true
85 |
86 | /@alloc/quick-lru@5.2.0:
87 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
88 | engines: {node: '>=10'}
89 | dev: true
90 |
91 | /@ampproject/remapping@2.2.1:
92 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
93 | engines: {node: '>=6.0.0'}
94 | dependencies:
95 | '@jridgewell/gen-mapping': 0.3.3
96 | '@jridgewell/trace-mapping': 0.3.20
97 | dev: true
98 |
99 | /@babel/code-frame@7.22.13:
100 | resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==}
101 | engines: {node: '>=6.9.0'}
102 | dependencies:
103 | '@babel/highlight': 7.22.20
104 | chalk: 2.4.2
105 |
106 | /@babel/compat-data@7.23.2:
107 | resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==}
108 | engines: {node: '>=6.9.0'}
109 | dev: true
110 |
111 | /@babel/core@7.23.2:
112 | resolution: {integrity: sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==}
113 | engines: {node: '>=6.9.0'}
114 | dependencies:
115 | '@ampproject/remapping': 2.2.1
116 | '@babel/code-frame': 7.22.13
117 | '@babel/generator': 7.23.0
118 | '@babel/helper-compilation-targets': 7.22.15
119 | '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2)
120 | '@babel/helpers': 7.23.2
121 | '@babel/parser': 7.23.0
122 | '@babel/template': 7.22.15
123 | '@babel/traverse': 7.23.2
124 | '@babel/types': 7.23.0
125 | convert-source-map: 2.0.0
126 | debug: 4.3.4
127 | gensync: 1.0.0-beta.2
128 | json5: 2.2.3
129 | semver: 6.3.1
130 | transitivePeerDependencies:
131 | - supports-color
132 | dev: true
133 |
134 | /@babel/generator@7.23.0:
135 | resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==}
136 | engines: {node: '>=6.9.0'}
137 | dependencies:
138 | '@babel/types': 7.23.0
139 | '@jridgewell/gen-mapping': 0.3.3
140 | '@jridgewell/trace-mapping': 0.3.20
141 | jsesc: 2.5.2
142 | dev: true
143 |
144 | /@babel/helper-compilation-targets@7.22.15:
145 | resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==}
146 | engines: {node: '>=6.9.0'}
147 | dependencies:
148 | '@babel/compat-data': 7.23.2
149 | '@babel/helper-validator-option': 7.22.15
150 | browserslist: 4.22.1
151 | lru-cache: 5.1.1
152 | semver: 6.3.1
153 | dev: true
154 |
155 | /@babel/helper-environment-visitor@7.22.20:
156 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
157 | engines: {node: '>=6.9.0'}
158 | dev: true
159 |
160 | /@babel/helper-function-name@7.23.0:
161 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
162 | engines: {node: '>=6.9.0'}
163 | dependencies:
164 | '@babel/template': 7.22.15
165 | '@babel/types': 7.23.0
166 | dev: true
167 |
168 | /@babel/helper-hoist-variables@7.22.5:
169 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
170 | engines: {node: '>=6.9.0'}
171 | dependencies:
172 | '@babel/types': 7.23.0
173 | dev: true
174 |
175 | /@babel/helper-module-imports@7.22.15:
176 | resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
177 | engines: {node: '>=6.9.0'}
178 | dependencies:
179 | '@babel/types': 7.23.0
180 |
181 | /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2):
182 | resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==}
183 | engines: {node: '>=6.9.0'}
184 | peerDependencies:
185 | '@babel/core': ^7.0.0
186 | dependencies:
187 | '@babel/core': 7.23.2
188 | '@babel/helper-environment-visitor': 7.22.20
189 | '@babel/helper-module-imports': 7.22.15
190 | '@babel/helper-simple-access': 7.22.5
191 | '@babel/helper-split-export-declaration': 7.22.6
192 | '@babel/helper-validator-identifier': 7.22.20
193 | dev: true
194 |
195 | /@babel/helper-plugin-utils@7.22.5:
196 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
197 | engines: {node: '>=6.9.0'}
198 | dev: true
199 |
200 | /@babel/helper-simple-access@7.22.5:
201 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
202 | engines: {node: '>=6.9.0'}
203 | dependencies:
204 | '@babel/types': 7.23.0
205 | dev: true
206 |
207 | /@babel/helper-split-export-declaration@7.22.6:
208 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
209 | engines: {node: '>=6.9.0'}
210 | dependencies:
211 | '@babel/types': 7.23.0
212 | dev: true
213 |
214 | /@babel/helper-string-parser@7.22.5:
215 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
216 | engines: {node: '>=6.9.0'}
217 |
218 | /@babel/helper-validator-identifier@7.22.20:
219 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
220 | engines: {node: '>=6.9.0'}
221 |
222 | /@babel/helper-validator-option@7.22.15:
223 | resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==}
224 | engines: {node: '>=6.9.0'}
225 | dev: true
226 |
227 | /@babel/helpers@7.23.2:
228 | resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==}
229 | engines: {node: '>=6.9.0'}
230 | dependencies:
231 | '@babel/template': 7.22.15
232 | '@babel/traverse': 7.23.2
233 | '@babel/types': 7.23.0
234 | transitivePeerDependencies:
235 | - supports-color
236 | dev: true
237 |
238 | /@babel/highlight@7.22.20:
239 | resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
240 | engines: {node: '>=6.9.0'}
241 | dependencies:
242 | '@babel/helper-validator-identifier': 7.22.20
243 | chalk: 2.4.2
244 | js-tokens: 4.0.0
245 |
246 | /@babel/parser@7.23.0:
247 | resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==}
248 | engines: {node: '>=6.0.0'}
249 | hasBin: true
250 | dependencies:
251 | '@babel/types': 7.23.0
252 | dev: true
253 |
254 | /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2):
255 | resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==}
256 | engines: {node: '>=6.9.0'}
257 | peerDependencies:
258 | '@babel/core': ^7.0.0-0
259 | dependencies:
260 | '@babel/core': 7.23.2
261 | '@babel/helper-plugin-utils': 7.22.5
262 | dev: true
263 |
264 | /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2):
265 | resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==}
266 | engines: {node: '>=6.9.0'}
267 | peerDependencies:
268 | '@babel/core': ^7.0.0-0
269 | dependencies:
270 | '@babel/core': 7.23.2
271 | '@babel/helper-plugin-utils': 7.22.5
272 | dev: true
273 |
274 | /@babel/runtime@7.23.2:
275 | resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
276 | engines: {node: '>=6.9.0'}
277 | dependencies:
278 | regenerator-runtime: 0.14.0
279 | dev: false
280 |
281 | /@babel/template@7.22.15:
282 | resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
283 | engines: {node: '>=6.9.0'}
284 | dependencies:
285 | '@babel/code-frame': 7.22.13
286 | '@babel/parser': 7.23.0
287 | '@babel/types': 7.23.0
288 | dev: true
289 |
290 | /@babel/traverse@7.23.2:
291 | resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
292 | engines: {node: '>=6.9.0'}
293 | dependencies:
294 | '@babel/code-frame': 7.22.13
295 | '@babel/generator': 7.23.0
296 | '@babel/helper-environment-visitor': 7.22.20
297 | '@babel/helper-function-name': 7.23.0
298 | '@babel/helper-hoist-variables': 7.22.5
299 | '@babel/helper-split-export-declaration': 7.22.6
300 | '@babel/parser': 7.23.0
301 | '@babel/types': 7.23.0
302 | debug: 4.3.4
303 | globals: 11.12.0
304 | transitivePeerDependencies:
305 | - supports-color
306 | dev: true
307 |
308 | /@babel/types@7.23.0:
309 | resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==}
310 | engines: {node: '>=6.9.0'}
311 | dependencies:
312 | '@babel/helper-string-parser': 7.22.5
313 | '@babel/helper-validator-identifier': 7.22.20
314 | to-fast-properties: 2.0.0
315 |
316 | /@emotion/babel-plugin@11.11.0:
317 | resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
318 | dependencies:
319 | '@babel/helper-module-imports': 7.22.15
320 | '@babel/runtime': 7.23.2
321 | '@emotion/hash': 0.9.1
322 | '@emotion/memoize': 0.8.1
323 | '@emotion/serialize': 1.1.2
324 | babel-plugin-macros: 3.1.0
325 | convert-source-map: 1.9.0
326 | escape-string-regexp: 4.0.0
327 | find-root: 1.1.0
328 | source-map: 0.5.7
329 | stylis: 4.2.0
330 | dev: false
331 |
332 | /@emotion/cache@11.11.0:
333 | resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
334 | dependencies:
335 | '@emotion/memoize': 0.8.1
336 | '@emotion/sheet': 1.2.2
337 | '@emotion/utils': 1.2.1
338 | '@emotion/weak-memoize': 0.3.1
339 | stylis: 4.2.0
340 | dev: false
341 |
342 | /@emotion/hash@0.9.1:
343 | resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
344 | dev: false
345 |
346 | /@emotion/memoize@0.8.1:
347 | resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
348 | dev: false
349 |
350 | /@emotion/react@11.11.1(@types/react@18.2.15)(react@18.2.0):
351 | resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==}
352 | peerDependencies:
353 | '@types/react': '*'
354 | react: '>=16.8.0'
355 | peerDependenciesMeta:
356 | '@types/react':
357 | optional: true
358 | dependencies:
359 | '@babel/runtime': 7.23.2
360 | '@emotion/babel-plugin': 11.11.0
361 | '@emotion/cache': 11.11.0
362 | '@emotion/serialize': 1.1.2
363 | '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0)
364 | '@emotion/utils': 1.2.1
365 | '@emotion/weak-memoize': 0.3.1
366 | '@types/react': 18.2.15
367 | hoist-non-react-statics: 3.3.2
368 | react: 18.2.0
369 | dev: false
370 |
371 | /@emotion/serialize@1.1.2:
372 | resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==}
373 | dependencies:
374 | '@emotion/hash': 0.9.1
375 | '@emotion/memoize': 0.8.1
376 | '@emotion/unitless': 0.8.1
377 | '@emotion/utils': 1.2.1
378 | csstype: 3.1.2
379 | dev: false
380 |
381 | /@emotion/sheet@1.2.2:
382 | resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
383 | dev: false
384 |
385 | /@emotion/unitless@0.8.1:
386 | resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
387 | dev: false
388 |
389 | /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0):
390 | resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==}
391 | peerDependencies:
392 | react: '>=16.8.0'
393 | dependencies:
394 | react: 18.2.0
395 | dev: false
396 |
397 | /@emotion/utils@1.2.1:
398 | resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
399 | dev: false
400 |
401 | /@emotion/weak-memoize@0.3.1:
402 | resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
403 | dev: false
404 |
405 | /@esbuild/android-arm64@0.18.20:
406 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
407 | engines: {node: '>=12'}
408 | cpu: [arm64]
409 | os: [android]
410 | requiresBuild: true
411 | dev: true
412 | optional: true
413 |
414 | /@esbuild/android-arm@0.18.20:
415 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
416 | engines: {node: '>=12'}
417 | cpu: [arm]
418 | os: [android]
419 | requiresBuild: true
420 | dev: true
421 | optional: true
422 |
423 | /@esbuild/android-x64@0.18.20:
424 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
425 | engines: {node: '>=12'}
426 | cpu: [x64]
427 | os: [android]
428 | requiresBuild: true
429 | dev: true
430 | optional: true
431 |
432 | /@esbuild/darwin-arm64@0.18.20:
433 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
434 | engines: {node: '>=12'}
435 | cpu: [arm64]
436 | os: [darwin]
437 | requiresBuild: true
438 | dev: true
439 | optional: true
440 |
441 | /@esbuild/darwin-x64@0.18.20:
442 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
443 | engines: {node: '>=12'}
444 | cpu: [x64]
445 | os: [darwin]
446 | requiresBuild: true
447 | dev: true
448 | optional: true
449 |
450 | /@esbuild/freebsd-arm64@0.18.20:
451 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
452 | engines: {node: '>=12'}
453 | cpu: [arm64]
454 | os: [freebsd]
455 | requiresBuild: true
456 | dev: true
457 | optional: true
458 |
459 | /@esbuild/freebsd-x64@0.18.20:
460 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
461 | engines: {node: '>=12'}
462 | cpu: [x64]
463 | os: [freebsd]
464 | requiresBuild: true
465 | dev: true
466 | optional: true
467 |
468 | /@esbuild/linux-arm64@0.18.20:
469 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
470 | engines: {node: '>=12'}
471 | cpu: [arm64]
472 | os: [linux]
473 | requiresBuild: true
474 | dev: true
475 | optional: true
476 |
477 | /@esbuild/linux-arm@0.18.20:
478 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
479 | engines: {node: '>=12'}
480 | cpu: [arm]
481 | os: [linux]
482 | requiresBuild: true
483 | dev: true
484 | optional: true
485 |
486 | /@esbuild/linux-ia32@0.18.20:
487 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
488 | engines: {node: '>=12'}
489 | cpu: [ia32]
490 | os: [linux]
491 | requiresBuild: true
492 | dev: true
493 | optional: true
494 |
495 | /@esbuild/linux-loong64@0.18.20:
496 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
497 | engines: {node: '>=12'}
498 | cpu: [loong64]
499 | os: [linux]
500 | requiresBuild: true
501 | dev: true
502 | optional: true
503 |
504 | /@esbuild/linux-mips64el@0.18.20:
505 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
506 | engines: {node: '>=12'}
507 | cpu: [mips64el]
508 | os: [linux]
509 | requiresBuild: true
510 | dev: true
511 | optional: true
512 |
513 | /@esbuild/linux-ppc64@0.18.20:
514 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
515 | engines: {node: '>=12'}
516 | cpu: [ppc64]
517 | os: [linux]
518 | requiresBuild: true
519 | dev: true
520 | optional: true
521 |
522 | /@esbuild/linux-riscv64@0.18.20:
523 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
524 | engines: {node: '>=12'}
525 | cpu: [riscv64]
526 | os: [linux]
527 | requiresBuild: true
528 | dev: true
529 | optional: true
530 |
531 | /@esbuild/linux-s390x@0.18.20:
532 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
533 | engines: {node: '>=12'}
534 | cpu: [s390x]
535 | os: [linux]
536 | requiresBuild: true
537 | dev: true
538 | optional: true
539 |
540 | /@esbuild/linux-x64@0.18.20:
541 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
542 | engines: {node: '>=12'}
543 | cpu: [x64]
544 | os: [linux]
545 | requiresBuild: true
546 | dev: true
547 | optional: true
548 |
549 | /@esbuild/netbsd-x64@0.18.20:
550 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
551 | engines: {node: '>=12'}
552 | cpu: [x64]
553 | os: [netbsd]
554 | requiresBuild: true
555 | dev: true
556 | optional: true
557 |
558 | /@esbuild/openbsd-x64@0.18.20:
559 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
560 | engines: {node: '>=12'}
561 | cpu: [x64]
562 | os: [openbsd]
563 | requiresBuild: true
564 | dev: true
565 | optional: true
566 |
567 | /@esbuild/sunos-x64@0.18.20:
568 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
569 | engines: {node: '>=12'}
570 | cpu: [x64]
571 | os: [sunos]
572 | requiresBuild: true
573 | dev: true
574 | optional: true
575 |
576 | /@esbuild/win32-arm64@0.18.20:
577 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
578 | engines: {node: '>=12'}
579 | cpu: [arm64]
580 | os: [win32]
581 | requiresBuild: true
582 | dev: true
583 | optional: true
584 |
585 | /@esbuild/win32-ia32@0.18.20:
586 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
587 | engines: {node: '>=12'}
588 | cpu: [ia32]
589 | os: [win32]
590 | requiresBuild: true
591 | dev: true
592 | optional: true
593 |
594 | /@esbuild/win32-x64@0.18.20:
595 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
596 | engines: {node: '>=12'}
597 | cpu: [x64]
598 | os: [win32]
599 | requiresBuild: true
600 | dev: true
601 | optional: true
602 |
603 | /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0):
604 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
605 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
606 | peerDependencies:
607 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
608 | dependencies:
609 | eslint: 8.45.0
610 | eslint-visitor-keys: 3.4.3
611 | dev: true
612 |
613 | /@eslint-community/regexpp@4.9.1:
614 | resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
615 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
616 | dev: true
617 |
618 | /@eslint/eslintrc@2.1.2:
619 | resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==}
620 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
621 | dependencies:
622 | ajv: 6.12.6
623 | debug: 4.3.4
624 | espree: 9.6.1
625 | globals: 13.23.0
626 | ignore: 5.2.4
627 | import-fresh: 3.3.0
628 | js-yaml: 4.1.0
629 | minimatch: 3.1.2
630 | strip-json-comments: 3.1.1
631 | transitivePeerDependencies:
632 | - supports-color
633 | dev: true
634 |
635 | /@eslint/js@8.44.0:
636 | resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==}
637 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
638 | dev: true
639 |
640 | /@floating-ui/core@1.5.0:
641 | resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
642 | dependencies:
643 | '@floating-ui/utils': 0.1.6
644 | dev: false
645 |
646 | /@floating-ui/dom@1.5.3:
647 | resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==}
648 | dependencies:
649 | '@floating-ui/core': 1.5.0
650 | '@floating-ui/utils': 0.1.6
651 | dev: false
652 |
653 | /@floating-ui/utils@0.1.6:
654 | resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
655 | dev: false
656 |
657 | /@hookform/resolvers@3.3.2(react-hook-form@7.47.0):
658 | resolution: {integrity: sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==}
659 | peerDependencies:
660 | react-hook-form: ^7.0.0
661 | dependencies:
662 | react-hook-form: 7.47.0(react@18.2.0)
663 | dev: false
664 |
665 | /@humanwhocodes/config-array@0.11.12:
666 | resolution: {integrity: sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA==}
667 | engines: {node: '>=10.10.0'}
668 | dependencies:
669 | '@humanwhocodes/object-schema': 2.0.0
670 | debug: 4.3.4
671 | minimatch: 3.1.2
672 | transitivePeerDependencies:
673 | - supports-color
674 | dev: true
675 |
676 | /@humanwhocodes/module-importer@1.0.1:
677 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
678 | engines: {node: '>=12.22'}
679 | dev: true
680 |
681 | /@humanwhocodes/object-schema@2.0.0:
682 | resolution: {integrity: sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw==}
683 | dev: true
684 |
685 | /@icons/material@0.2.4(react@18.2.0):
686 | resolution: {integrity: sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==}
687 | peerDependencies:
688 | react: '*'
689 | dependencies:
690 | react: 18.2.0
691 | dev: false
692 |
693 | /@jridgewell/gen-mapping@0.3.3:
694 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
695 | engines: {node: '>=6.0.0'}
696 | dependencies:
697 | '@jridgewell/set-array': 1.1.2
698 | '@jridgewell/sourcemap-codec': 1.4.15
699 | '@jridgewell/trace-mapping': 0.3.20
700 | dev: true
701 |
702 | /@jridgewell/resolve-uri@3.1.1:
703 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
704 | engines: {node: '>=6.0.0'}
705 | dev: true
706 |
707 | /@jridgewell/set-array@1.1.2:
708 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
709 | engines: {node: '>=6.0.0'}
710 | dev: true
711 |
712 | /@jridgewell/sourcemap-codec@1.4.15:
713 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
714 | dev: true
715 |
716 | /@jridgewell/trace-mapping@0.3.20:
717 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==}
718 | dependencies:
719 | '@jridgewell/resolve-uri': 3.1.1
720 | '@jridgewell/sourcemap-codec': 1.4.15
721 | dev: true
722 |
723 | /@nodelib/fs.scandir@2.1.5:
724 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
725 | engines: {node: '>= 8'}
726 | dependencies:
727 | '@nodelib/fs.stat': 2.0.5
728 | run-parallel: 1.2.0
729 | dev: true
730 |
731 | /@nodelib/fs.stat@2.0.5:
732 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
733 | engines: {node: '>= 8'}
734 | dev: true
735 |
736 | /@nodelib/fs.walk@1.2.8:
737 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
738 | engines: {node: '>= 8'}
739 | dependencies:
740 | '@nodelib/fs.scandir': 2.1.5
741 | fastq: 1.15.0
742 | dev: true
743 |
744 | /@tannin/compile@1.1.0:
745 | resolution: {integrity: sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==}
746 | dependencies:
747 | '@tannin/evaluate': 1.2.0
748 | '@tannin/postfix': 1.1.0
749 | dev: false
750 |
751 | /@tannin/evaluate@1.2.0:
752 | resolution: {integrity: sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==}
753 | dev: false
754 |
755 | /@tannin/plural-forms@1.1.0:
756 | resolution: {integrity: sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==}
757 | dependencies:
758 | '@tannin/compile': 1.1.0
759 | dev: false
760 |
761 | /@tannin/postfix@1.1.0:
762 | resolution: {integrity: sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==}
763 | dev: false
764 |
765 | /@types/json-schema@7.0.14:
766 | resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==}
767 | dev: true
768 |
769 | /@types/parse-json@4.0.1:
770 | resolution: {integrity: sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==}
771 | dev: false
772 |
773 | /@types/prop-types@15.7.9:
774 | resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==}
775 |
776 | /@types/react-color@3.0.9:
777 | resolution: {integrity: sha512-Ojyc6jySSKvM6UYQrZxaYe0JZXtgHHXwR2q9H4MhcNCswFdeZH1owYZCvPtdHtMOfh7t8h1fY0Gd0nvU1JGDkQ==}
778 | dependencies:
779 | '@types/react': 18.2.15
780 | '@types/reactcss': 1.2.8
781 | dev: true
782 |
783 | /@types/react-dom@18.2.7:
784 | resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==}
785 | dependencies:
786 | '@types/react': 18.2.15
787 | dev: true
788 |
789 | /@types/react-transition-group@4.4.8:
790 | resolution: {integrity: sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==}
791 | dependencies:
792 | '@types/react': 18.2.15
793 | dev: false
794 |
795 | /@types/react@18.2.15:
796 | resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==}
797 | dependencies:
798 | '@types/prop-types': 15.7.9
799 | '@types/scheduler': 0.16.5
800 | csstype: 3.1.2
801 |
802 | /@types/reactcss@1.2.8:
803 | resolution: {integrity: sha512-IzxChTOxOFWZb1RhXoNZ7oEi3BtUdLQIFheoOurvu6iu0X9kwhoFe73DW9EVFxVFTKnd8bb8b1dKtO0tokM3eA==}
804 | dependencies:
805 | '@types/react': 18.2.15
806 | dev: true
807 |
808 | /@types/scheduler@0.16.5:
809 | resolution: {integrity: sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==}
810 |
811 | /@types/semver@7.5.4:
812 | resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==}
813 | dev: true
814 |
815 | /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.0.2):
816 | resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==}
817 | engines: {node: ^16.0.0 || >=18.0.0}
818 | peerDependencies:
819 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
820 | eslint: ^7.0.0 || ^8.0.0
821 | typescript: '*'
822 | peerDependenciesMeta:
823 | typescript:
824 | optional: true
825 | dependencies:
826 | '@eslint-community/regexpp': 4.9.1
827 | '@typescript-eslint/parser': 6.0.0(eslint@8.45.0)(typescript@5.0.2)
828 | '@typescript-eslint/scope-manager': 6.0.0
829 | '@typescript-eslint/type-utils': 6.0.0(eslint@8.45.0)(typescript@5.0.2)
830 | '@typescript-eslint/utils': 6.0.0(eslint@8.45.0)(typescript@5.0.2)
831 | '@typescript-eslint/visitor-keys': 6.0.0
832 | debug: 4.3.4
833 | eslint: 8.45.0
834 | grapheme-splitter: 1.0.4
835 | graphemer: 1.4.0
836 | ignore: 5.2.4
837 | natural-compare: 1.4.0
838 | natural-compare-lite: 1.4.0
839 | semver: 7.5.4
840 | ts-api-utils: 1.0.3(typescript@5.0.2)
841 | typescript: 5.0.2
842 | transitivePeerDependencies:
843 | - supports-color
844 | dev: true
845 |
846 | /@typescript-eslint/parser@6.0.0(eslint@8.45.0)(typescript@5.0.2):
847 | resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==}
848 | engines: {node: ^16.0.0 || >=18.0.0}
849 | peerDependencies:
850 | eslint: ^7.0.0 || ^8.0.0
851 | typescript: '*'
852 | peerDependenciesMeta:
853 | typescript:
854 | optional: true
855 | dependencies:
856 | '@typescript-eslint/scope-manager': 6.0.0
857 | '@typescript-eslint/types': 6.0.0
858 | '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.0.2)
859 | '@typescript-eslint/visitor-keys': 6.0.0
860 | debug: 4.3.4
861 | eslint: 8.45.0
862 | typescript: 5.0.2
863 | transitivePeerDependencies:
864 | - supports-color
865 | dev: true
866 |
867 | /@typescript-eslint/scope-manager@6.0.0:
868 | resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==}
869 | engines: {node: ^16.0.0 || >=18.0.0}
870 | dependencies:
871 | '@typescript-eslint/types': 6.0.0
872 | '@typescript-eslint/visitor-keys': 6.0.0
873 | dev: true
874 |
875 | /@typescript-eslint/type-utils@6.0.0(eslint@8.45.0)(typescript@5.0.2):
876 | resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==}
877 | engines: {node: ^16.0.0 || >=18.0.0}
878 | peerDependencies:
879 | eslint: ^7.0.0 || ^8.0.0
880 | typescript: '*'
881 | peerDependenciesMeta:
882 | typescript:
883 | optional: true
884 | dependencies:
885 | '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.0.2)
886 | '@typescript-eslint/utils': 6.0.0(eslint@8.45.0)(typescript@5.0.2)
887 | debug: 4.3.4
888 | eslint: 8.45.0
889 | ts-api-utils: 1.0.3(typescript@5.0.2)
890 | typescript: 5.0.2
891 | transitivePeerDependencies:
892 | - supports-color
893 | dev: true
894 |
895 | /@typescript-eslint/types@6.0.0:
896 | resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==}
897 | engines: {node: ^16.0.0 || >=18.0.0}
898 | dev: true
899 |
900 | /@typescript-eslint/typescript-estree@6.0.0(typescript@5.0.2):
901 | resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==}
902 | engines: {node: ^16.0.0 || >=18.0.0}
903 | peerDependencies:
904 | typescript: '*'
905 | peerDependenciesMeta:
906 | typescript:
907 | optional: true
908 | dependencies:
909 | '@typescript-eslint/types': 6.0.0
910 | '@typescript-eslint/visitor-keys': 6.0.0
911 | debug: 4.3.4
912 | globby: 11.1.0
913 | is-glob: 4.0.3
914 | semver: 7.5.4
915 | ts-api-utils: 1.0.3(typescript@5.0.2)
916 | typescript: 5.0.2
917 | transitivePeerDependencies:
918 | - supports-color
919 | dev: true
920 |
921 | /@typescript-eslint/utils@6.0.0(eslint@8.45.0)(typescript@5.0.2):
922 | resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==}
923 | engines: {node: ^16.0.0 || >=18.0.0}
924 | peerDependencies:
925 | eslint: ^7.0.0 || ^8.0.0
926 | dependencies:
927 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0)
928 | '@types/json-schema': 7.0.14
929 | '@types/semver': 7.5.4
930 | '@typescript-eslint/scope-manager': 6.0.0
931 | '@typescript-eslint/types': 6.0.0
932 | '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.0.2)
933 | eslint: 8.45.0
934 | eslint-scope: 5.1.1
935 | semver: 7.5.4
936 | transitivePeerDependencies:
937 | - supports-color
938 | - typescript
939 | dev: true
940 |
941 | /@typescript-eslint/visitor-keys@6.0.0:
942 | resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==}
943 | engines: {node: ^16.0.0 || >=18.0.0}
944 | dependencies:
945 | '@typescript-eslint/types': 6.0.0
946 | eslint-visitor-keys: 3.4.3
947 | dev: true
948 |
949 | /@vitejs/plugin-react@4.0.3(vite@4.4.5):
950 | resolution: {integrity: sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==}
951 | engines: {node: ^14.18.0 || >=16.0.0}
952 | peerDependencies:
953 | vite: ^4.2.0
954 | dependencies:
955 | '@babel/core': 7.23.2
956 | '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.23.2)
957 | '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.2)
958 | react-refresh: 0.14.0
959 | vite: 4.4.5
960 | transitivePeerDependencies:
961 | - supports-color
962 | dev: true
963 |
964 | /@wordpress/api-fetch@6.41.0:
965 | resolution: {integrity: sha512-IrwfTrdKFz+fwPbhd5RedaR3aGNVJIshWhKkL2Six8Mcc+h257RFIzESghywyk5YJ8HDIKElTO05Vge+rBPK3Q==}
966 | engines: {node: '>=12'}
967 | dependencies:
968 | '@babel/runtime': 7.23.2
969 | '@wordpress/i18n': 4.44.0
970 | '@wordpress/url': 3.45.0
971 | dev: false
972 |
973 | /@wordpress/hooks@3.44.0:
974 | resolution: {integrity: sha512-rWYI98Nu2S8D0bfHeoc8Lj43vZr59lFn3tGuDMnr0dZ1vDZXOiNSIPMn7qncmCuErFxWBbyXkax6mnam7Ds6jw==}
975 | engines: {node: '>=12'}
976 | dependencies:
977 | '@babel/runtime': 7.23.2
978 | dev: false
979 |
980 | /@wordpress/i18n@4.44.0:
981 | resolution: {integrity: sha512-90SY4//QgqoKLf3HK0vNk+D/PGwK+0KOMuIwnkwKDKBw+Vr/Vusg6qiEngVc/BETfuG9ssDtAiNEBSMm8+YGYA==}
982 | engines: {node: '>=12'}
983 | hasBin: true
984 | dependencies:
985 | '@babel/runtime': 7.23.2
986 | '@wordpress/hooks': 3.44.0
987 | gettext-parser: 1.4.0
988 | memize: 2.1.0
989 | sprintf-js: 1.1.3
990 | tannin: 1.2.0
991 | dev: false
992 |
993 | /@wordpress/url@3.45.0:
994 | resolution: {integrity: sha512-SYVFNuhotfxpDloGXcut4XvXYHtqhTDJT7UZ/LvXBwVFFxtXyey+Ej8h7FuDqnakbkWauUp0cmD0iDHMhtb9sw==}
995 | engines: {node: '>=12'}
996 | dependencies:
997 | '@babel/runtime': 7.23.2
998 | remove-accents: 0.5.0
999 | dev: false
1000 |
1001 | /acorn-jsx@5.3.2(acorn@8.10.0):
1002 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
1003 | peerDependencies:
1004 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
1005 | dependencies:
1006 | acorn: 8.10.0
1007 | dev: true
1008 |
1009 | /acorn@8.10.0:
1010 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==}
1011 | engines: {node: '>=0.4.0'}
1012 | hasBin: true
1013 | dev: true
1014 |
1015 | /ajv@6.12.6:
1016 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
1017 | dependencies:
1018 | fast-deep-equal: 3.1.3
1019 | fast-json-stable-stringify: 2.1.0
1020 | json-schema-traverse: 0.4.1
1021 | uri-js: 4.4.1
1022 | dev: true
1023 |
1024 | /ansi-regex@5.0.1:
1025 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
1026 | engines: {node: '>=8'}
1027 | dev: true
1028 |
1029 | /ansi-styles@3.2.1:
1030 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
1031 | engines: {node: '>=4'}
1032 | dependencies:
1033 | color-convert: 1.9.3
1034 |
1035 | /ansi-styles@4.3.0:
1036 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
1037 | engines: {node: '>=8'}
1038 | dependencies:
1039 | color-convert: 2.0.1
1040 | dev: true
1041 |
1042 | /any-promise@1.3.0:
1043 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
1044 | dev: true
1045 |
1046 | /anymatch@3.1.3:
1047 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
1048 | engines: {node: '>= 8'}
1049 | dependencies:
1050 | normalize-path: 3.0.0
1051 | picomatch: 2.3.1
1052 | dev: true
1053 |
1054 | /arg@5.0.2:
1055 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
1056 | dev: true
1057 |
1058 | /argparse@2.0.1:
1059 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1060 | dev: true
1061 |
1062 | /array-union@2.1.0:
1063 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
1064 | engines: {node: '>=8'}
1065 | dev: true
1066 |
1067 | /autoprefixer@10.4.16(postcss@8.4.31):
1068 | resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
1069 | engines: {node: ^10 || ^12 || >=14}
1070 | hasBin: true
1071 | peerDependencies:
1072 | postcss: ^8.1.0
1073 | dependencies:
1074 | browserslist: 4.22.1
1075 | caniuse-lite: 1.0.30001551
1076 | fraction.js: 4.3.7
1077 | normalize-range: 0.1.2
1078 | picocolors: 1.0.0
1079 | postcss: 8.4.31
1080 | postcss-value-parser: 4.2.0
1081 | dev: true
1082 |
1083 | /babel-plugin-macros@3.1.0:
1084 | resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
1085 | engines: {node: '>=10', npm: '>=6'}
1086 | dependencies:
1087 | '@babel/runtime': 7.23.2
1088 | cosmiconfig: 7.1.0
1089 | resolve: 1.22.8
1090 | dev: false
1091 |
1092 | /balanced-match@1.0.2:
1093 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
1094 |
1095 | /big-integer@1.6.51:
1096 | resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
1097 | engines: {node: '>=0.6'}
1098 | dev: false
1099 |
1100 | /binary-extensions@2.2.0:
1101 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
1102 | engines: {node: '>=8'}
1103 | dev: true
1104 |
1105 | /brace-expansion@1.1.11:
1106 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
1107 | dependencies:
1108 | balanced-match: 1.0.2
1109 | concat-map: 0.0.1
1110 |
1111 | /braces@3.0.2:
1112 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
1113 | engines: {node: '>=8'}
1114 | dependencies:
1115 | fill-range: 7.0.1
1116 | dev: true
1117 |
1118 | /broadcast-channel@3.7.0:
1119 | resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==}
1120 | dependencies:
1121 | '@babel/runtime': 7.23.2
1122 | detect-node: 2.1.0
1123 | js-sha3: 0.8.0
1124 | microseconds: 0.2.0
1125 | nano-time: 1.0.0
1126 | oblivious-set: 1.0.0
1127 | rimraf: 3.0.2
1128 | unload: 2.2.0
1129 | dev: false
1130 |
1131 | /browserslist@4.22.1:
1132 | resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
1133 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
1134 | hasBin: true
1135 | dependencies:
1136 | caniuse-lite: 1.0.30001551
1137 | electron-to-chromium: 1.4.561
1138 | node-releases: 2.0.13
1139 | update-browserslist-db: 1.0.13(browserslist@4.22.1)
1140 | dev: true
1141 |
1142 | /callsites@3.1.0:
1143 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
1144 | engines: {node: '>=6'}
1145 |
1146 | /camelcase-css@2.0.1:
1147 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
1148 | engines: {node: '>= 6'}
1149 | dev: true
1150 |
1151 | /caniuse-lite@1.0.30001551:
1152 | resolution: {integrity: sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==}
1153 | dev: true
1154 |
1155 | /chalk@2.4.2:
1156 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
1157 | engines: {node: '>=4'}
1158 | dependencies:
1159 | ansi-styles: 3.2.1
1160 | escape-string-regexp: 1.0.5
1161 | supports-color: 5.5.0
1162 |
1163 | /chalk@4.1.2:
1164 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1165 | engines: {node: '>=10'}
1166 | dependencies:
1167 | ansi-styles: 4.3.0
1168 | supports-color: 7.2.0
1169 | dev: true
1170 |
1171 | /chokidar@3.5.3:
1172 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
1173 | engines: {node: '>= 8.10.0'}
1174 | dependencies:
1175 | anymatch: 3.1.3
1176 | braces: 3.0.2
1177 | glob-parent: 5.1.2
1178 | is-binary-path: 2.1.0
1179 | is-glob: 4.0.3
1180 | normalize-path: 3.0.0
1181 | readdirp: 3.6.0
1182 | optionalDependencies:
1183 | fsevents: 2.3.3
1184 | dev: true
1185 |
1186 | /color-convert@1.9.3:
1187 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
1188 | dependencies:
1189 | color-name: 1.1.3
1190 |
1191 | /color-convert@2.0.1:
1192 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1193 | engines: {node: '>=7.0.0'}
1194 | dependencies:
1195 | color-name: 1.1.4
1196 | dev: true
1197 |
1198 | /color-name@1.1.3:
1199 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
1200 |
1201 | /color-name@1.1.4:
1202 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
1203 | dev: true
1204 |
1205 | /commander@4.1.1:
1206 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
1207 | engines: {node: '>= 6'}
1208 | dev: true
1209 |
1210 | /concat-map@0.0.1:
1211 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1212 |
1213 | /convert-source-map@1.9.0:
1214 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
1215 | dev: false
1216 |
1217 | /convert-source-map@2.0.0:
1218 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
1219 | dev: true
1220 |
1221 | /cosmiconfig@7.1.0:
1222 | resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
1223 | engines: {node: '>=10'}
1224 | dependencies:
1225 | '@types/parse-json': 4.0.1
1226 | import-fresh: 3.3.0
1227 | parse-json: 5.2.0
1228 | path-type: 4.0.0
1229 | yaml: 1.10.2
1230 | dev: false
1231 |
1232 | /cross-spawn@7.0.3:
1233 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
1234 | engines: {node: '>= 8'}
1235 | dependencies:
1236 | path-key: 3.1.1
1237 | shebang-command: 2.0.0
1238 | which: 2.0.2
1239 | dev: true
1240 |
1241 | /cssesc@3.0.0:
1242 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1243 | engines: {node: '>=4'}
1244 | hasBin: true
1245 | dev: true
1246 |
1247 | /csstype@3.1.2:
1248 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
1249 |
1250 | /debug@4.3.4:
1251 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
1252 | engines: {node: '>=6.0'}
1253 | peerDependencies:
1254 | supports-color: '*'
1255 | peerDependenciesMeta:
1256 | supports-color:
1257 | optional: true
1258 | dependencies:
1259 | ms: 2.1.2
1260 | dev: true
1261 |
1262 | /deep-is@0.1.4:
1263 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1264 | dev: true
1265 |
1266 | /detect-node@2.1.0:
1267 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
1268 | dev: false
1269 |
1270 | /didyoumean@1.2.2:
1271 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
1272 | dev: true
1273 |
1274 | /dir-glob@3.0.1:
1275 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
1276 | engines: {node: '>=8'}
1277 | dependencies:
1278 | path-type: 4.0.0
1279 | dev: true
1280 |
1281 | /dlv@1.1.3:
1282 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
1283 | dev: true
1284 |
1285 | /doctrine@3.0.0:
1286 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
1287 | engines: {node: '>=6.0.0'}
1288 | dependencies:
1289 | esutils: 2.0.3
1290 | dev: true
1291 |
1292 | /dom-helpers@5.2.1:
1293 | resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
1294 | dependencies:
1295 | '@babel/runtime': 7.23.2
1296 | csstype: 3.1.2
1297 | dev: false
1298 |
1299 | /electron-to-chromium@1.4.561:
1300 | resolution: {integrity: sha512-eS5t4ulWOBfVHdq9SW2dxEaFarj1lPjvJ8PaYMOjY0DecBaj/t4ARziL2IPpDr4atyWwjLFGQ2vo/VCgQFezVQ==}
1301 | dev: true
1302 |
1303 | /encoding@0.1.13:
1304 | resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
1305 | dependencies:
1306 | iconv-lite: 0.6.3
1307 | dev: false
1308 |
1309 | /error-ex@1.3.2:
1310 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
1311 | dependencies:
1312 | is-arrayish: 0.2.1
1313 | dev: false
1314 |
1315 | /esbuild@0.18.20:
1316 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
1317 | engines: {node: '>=12'}
1318 | hasBin: true
1319 | requiresBuild: true
1320 | optionalDependencies:
1321 | '@esbuild/android-arm': 0.18.20
1322 | '@esbuild/android-arm64': 0.18.20
1323 | '@esbuild/android-x64': 0.18.20
1324 | '@esbuild/darwin-arm64': 0.18.20
1325 | '@esbuild/darwin-x64': 0.18.20
1326 | '@esbuild/freebsd-arm64': 0.18.20
1327 | '@esbuild/freebsd-x64': 0.18.20
1328 | '@esbuild/linux-arm': 0.18.20
1329 | '@esbuild/linux-arm64': 0.18.20
1330 | '@esbuild/linux-ia32': 0.18.20
1331 | '@esbuild/linux-loong64': 0.18.20
1332 | '@esbuild/linux-mips64el': 0.18.20
1333 | '@esbuild/linux-ppc64': 0.18.20
1334 | '@esbuild/linux-riscv64': 0.18.20
1335 | '@esbuild/linux-s390x': 0.18.20
1336 | '@esbuild/linux-x64': 0.18.20
1337 | '@esbuild/netbsd-x64': 0.18.20
1338 | '@esbuild/openbsd-x64': 0.18.20
1339 | '@esbuild/sunos-x64': 0.18.20
1340 | '@esbuild/win32-arm64': 0.18.20
1341 | '@esbuild/win32-ia32': 0.18.20
1342 | '@esbuild/win32-x64': 0.18.20
1343 | dev: true
1344 |
1345 | /escalade@3.1.1:
1346 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
1347 | engines: {node: '>=6'}
1348 | dev: true
1349 |
1350 | /escape-string-regexp@1.0.5:
1351 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
1352 | engines: {node: '>=0.8.0'}
1353 |
1354 | /escape-string-regexp@4.0.0:
1355 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1356 | engines: {node: '>=10'}
1357 |
1358 | /eslint-plugin-react-hooks@4.6.0(eslint@8.45.0):
1359 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
1360 | engines: {node: '>=10'}
1361 | peerDependencies:
1362 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
1363 | dependencies:
1364 | eslint: 8.45.0
1365 | dev: true
1366 |
1367 | /eslint-plugin-react-refresh@0.4.3(eslint@8.45.0):
1368 | resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==}
1369 | peerDependencies:
1370 | eslint: '>=7'
1371 | dependencies:
1372 | eslint: 8.45.0
1373 | dev: true
1374 |
1375 | /eslint-scope@5.1.1:
1376 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
1377 | engines: {node: '>=8.0.0'}
1378 | dependencies:
1379 | esrecurse: 4.3.0
1380 | estraverse: 4.3.0
1381 | dev: true
1382 |
1383 | /eslint-scope@7.2.2:
1384 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
1385 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1386 | dependencies:
1387 | esrecurse: 4.3.0
1388 | estraverse: 5.3.0
1389 | dev: true
1390 |
1391 | /eslint-visitor-keys@3.4.3:
1392 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1393 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1394 | dev: true
1395 |
1396 | /eslint@8.45.0:
1397 | resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==}
1398 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1399 | hasBin: true
1400 | dependencies:
1401 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0)
1402 | '@eslint-community/regexpp': 4.9.1
1403 | '@eslint/eslintrc': 2.1.2
1404 | '@eslint/js': 8.44.0
1405 | '@humanwhocodes/config-array': 0.11.12
1406 | '@humanwhocodes/module-importer': 1.0.1
1407 | '@nodelib/fs.walk': 1.2.8
1408 | ajv: 6.12.6
1409 | chalk: 4.1.2
1410 | cross-spawn: 7.0.3
1411 | debug: 4.3.4
1412 | doctrine: 3.0.0
1413 | escape-string-regexp: 4.0.0
1414 | eslint-scope: 7.2.2
1415 | eslint-visitor-keys: 3.4.3
1416 | espree: 9.6.1
1417 | esquery: 1.5.0
1418 | esutils: 2.0.3
1419 | fast-deep-equal: 3.1.3
1420 | file-entry-cache: 6.0.1
1421 | find-up: 5.0.0
1422 | glob-parent: 6.0.2
1423 | globals: 13.23.0
1424 | graphemer: 1.4.0
1425 | ignore: 5.2.4
1426 | imurmurhash: 0.1.4
1427 | is-glob: 4.0.3
1428 | is-path-inside: 3.0.3
1429 | js-yaml: 4.1.0
1430 | json-stable-stringify-without-jsonify: 1.0.1
1431 | levn: 0.4.1
1432 | lodash.merge: 4.6.2
1433 | minimatch: 3.1.2
1434 | natural-compare: 1.4.0
1435 | optionator: 0.9.3
1436 | strip-ansi: 6.0.1
1437 | text-table: 0.2.0
1438 | transitivePeerDependencies:
1439 | - supports-color
1440 | dev: true
1441 |
1442 | /espree@9.6.1:
1443 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
1444 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1445 | dependencies:
1446 | acorn: 8.10.0
1447 | acorn-jsx: 5.3.2(acorn@8.10.0)
1448 | eslint-visitor-keys: 3.4.3
1449 | dev: true
1450 |
1451 | /esquery@1.5.0:
1452 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
1453 | engines: {node: '>=0.10'}
1454 | dependencies:
1455 | estraverse: 5.3.0
1456 | dev: true
1457 |
1458 | /esrecurse@4.3.0:
1459 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1460 | engines: {node: '>=4.0'}
1461 | dependencies:
1462 | estraverse: 5.3.0
1463 | dev: true
1464 |
1465 | /estraverse@4.3.0:
1466 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
1467 | engines: {node: '>=4.0'}
1468 | dev: true
1469 |
1470 | /estraverse@5.3.0:
1471 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1472 | engines: {node: '>=4.0'}
1473 | dev: true
1474 |
1475 | /esutils@2.0.3:
1476 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1477 | engines: {node: '>=0.10.0'}
1478 | dev: true
1479 |
1480 | /fast-deep-equal@3.1.3:
1481 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1482 | dev: true
1483 |
1484 | /fast-glob@3.3.1:
1485 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
1486 | engines: {node: '>=8.6.0'}
1487 | dependencies:
1488 | '@nodelib/fs.stat': 2.0.5
1489 | '@nodelib/fs.walk': 1.2.8
1490 | glob-parent: 5.1.2
1491 | merge2: 1.4.1
1492 | micromatch: 4.0.5
1493 | dev: true
1494 |
1495 | /fast-json-stable-stringify@2.1.0:
1496 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1497 | dev: true
1498 |
1499 | /fast-levenshtein@2.0.6:
1500 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1501 | dev: true
1502 |
1503 | /fastq@1.15.0:
1504 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
1505 | dependencies:
1506 | reusify: 1.0.4
1507 | dev: true
1508 |
1509 | /file-entry-cache@6.0.1:
1510 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1511 | engines: {node: ^10.12.0 || >=12.0.0}
1512 | dependencies:
1513 | flat-cache: 3.1.1
1514 | dev: true
1515 |
1516 | /fill-range@7.0.1:
1517 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1518 | engines: {node: '>=8'}
1519 | dependencies:
1520 | to-regex-range: 5.0.1
1521 | dev: true
1522 |
1523 | /find-root@1.1.0:
1524 | resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
1525 | dev: false
1526 |
1527 | /find-up@5.0.0:
1528 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1529 | engines: {node: '>=10'}
1530 | dependencies:
1531 | locate-path: 6.0.0
1532 | path-exists: 4.0.0
1533 | dev: true
1534 |
1535 | /flat-cache@3.1.1:
1536 | resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==}
1537 | engines: {node: '>=12.0.0'}
1538 | dependencies:
1539 | flatted: 3.2.9
1540 | keyv: 4.5.4
1541 | rimraf: 3.0.2
1542 | dev: true
1543 |
1544 | /flatted@3.2.9:
1545 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
1546 | dev: true
1547 |
1548 | /fraction.js@4.3.7:
1549 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
1550 | dev: true
1551 |
1552 | /fs.realpath@1.0.0:
1553 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1554 |
1555 | /fsevents@2.3.3:
1556 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1557 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1558 | os: [darwin]
1559 | requiresBuild: true
1560 | dev: true
1561 | optional: true
1562 |
1563 | /gensync@1.0.0-beta.2:
1564 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
1565 | engines: {node: '>=6.9.0'}
1566 | dev: true
1567 |
1568 | /gettext-parser@1.4.0:
1569 | resolution: {integrity: sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==}
1570 | dependencies:
1571 | encoding: 0.1.13
1572 | safe-buffer: 5.2.1
1573 | dev: false
1574 |
1575 | /glob-parent@5.1.2:
1576 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1577 | engines: {node: '>= 6'}
1578 | dependencies:
1579 | is-glob: 4.0.3
1580 | dev: true
1581 |
1582 | /glob-parent@6.0.2:
1583 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1584 | engines: {node: '>=10.13.0'}
1585 | dependencies:
1586 | is-glob: 4.0.3
1587 | dev: true
1588 |
1589 | /glob@7.1.6:
1590 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
1591 | dependencies:
1592 | fs.realpath: 1.0.0
1593 | inflight: 1.0.6
1594 | inherits: 2.0.4
1595 | minimatch: 3.1.2
1596 | once: 1.4.0
1597 | path-is-absolute: 1.0.1
1598 | dev: true
1599 |
1600 | /glob@7.2.3:
1601 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1602 | dependencies:
1603 | fs.realpath: 1.0.0
1604 | inflight: 1.0.6
1605 | inherits: 2.0.4
1606 | minimatch: 3.1.2
1607 | once: 1.4.0
1608 | path-is-absolute: 1.0.1
1609 |
1610 | /globals@11.12.0:
1611 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
1612 | engines: {node: '>=4'}
1613 | dev: true
1614 |
1615 | /globals@13.23.0:
1616 | resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==}
1617 | engines: {node: '>=8'}
1618 | dependencies:
1619 | type-fest: 0.20.2
1620 | dev: true
1621 |
1622 | /globby@11.1.0:
1623 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
1624 | engines: {node: '>=10'}
1625 | dependencies:
1626 | array-union: 2.1.0
1627 | dir-glob: 3.0.1
1628 | fast-glob: 3.3.1
1629 | ignore: 5.2.4
1630 | merge2: 1.4.1
1631 | slash: 3.0.0
1632 | dev: true
1633 |
1634 | /globrex@0.1.2:
1635 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
1636 | dev: true
1637 |
1638 | /grapheme-splitter@1.0.4:
1639 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
1640 | dev: true
1641 |
1642 | /graphemer@1.4.0:
1643 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1644 | dev: true
1645 |
1646 | /has-flag@3.0.0:
1647 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
1648 | engines: {node: '>=4'}
1649 |
1650 | /has-flag@4.0.0:
1651 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1652 | engines: {node: '>=8'}
1653 | dev: true
1654 |
1655 | /has@1.0.4:
1656 | resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
1657 | engines: {node: '>= 0.4.0'}
1658 |
1659 | /hoist-non-react-statics@3.3.2:
1660 | resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
1661 | dependencies:
1662 | react-is: 16.13.1
1663 | dev: false
1664 |
1665 | /iconv-lite@0.6.3:
1666 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
1667 | engines: {node: '>=0.10.0'}
1668 | dependencies:
1669 | safer-buffer: 2.1.2
1670 | dev: false
1671 |
1672 | /ignore@5.2.4:
1673 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
1674 | engines: {node: '>= 4'}
1675 | dev: true
1676 |
1677 | /import-fresh@3.3.0:
1678 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1679 | engines: {node: '>=6'}
1680 | dependencies:
1681 | parent-module: 1.0.1
1682 | resolve-from: 4.0.0
1683 |
1684 | /imurmurhash@0.1.4:
1685 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1686 | engines: {node: '>=0.8.19'}
1687 | dev: true
1688 |
1689 | /inflight@1.0.6:
1690 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1691 | dependencies:
1692 | once: 1.4.0
1693 | wrappy: 1.0.2
1694 |
1695 | /inherits@2.0.4:
1696 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1697 |
1698 | /is-arrayish@0.2.1:
1699 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
1700 | dev: false
1701 |
1702 | /is-binary-path@2.1.0:
1703 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1704 | engines: {node: '>=8'}
1705 | dependencies:
1706 | binary-extensions: 2.2.0
1707 | dev: true
1708 |
1709 | /is-core-module@2.13.0:
1710 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
1711 | dependencies:
1712 | has: 1.0.4
1713 |
1714 | /is-extglob@2.1.1:
1715 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1716 | engines: {node: '>=0.10.0'}
1717 | dev: true
1718 |
1719 | /is-glob@4.0.3:
1720 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1721 | engines: {node: '>=0.10.0'}
1722 | dependencies:
1723 | is-extglob: 2.1.1
1724 | dev: true
1725 |
1726 | /is-number@7.0.0:
1727 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1728 | engines: {node: '>=0.12.0'}
1729 | dev: true
1730 |
1731 | /is-path-inside@3.0.3:
1732 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1733 | engines: {node: '>=8'}
1734 | dev: true
1735 |
1736 | /isexe@2.0.0:
1737 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1738 | dev: true
1739 |
1740 | /jiti@1.20.0:
1741 | resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==}
1742 | hasBin: true
1743 | dev: true
1744 |
1745 | /js-sha3@0.8.0:
1746 | resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
1747 | dev: false
1748 |
1749 | /js-tokens@4.0.0:
1750 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1751 |
1752 | /js-yaml@4.1.0:
1753 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1754 | hasBin: true
1755 | dependencies:
1756 | argparse: 2.0.1
1757 | dev: true
1758 |
1759 | /jsesc@2.5.2:
1760 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
1761 | engines: {node: '>=4'}
1762 | hasBin: true
1763 | dev: true
1764 |
1765 | /json-buffer@3.0.1:
1766 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1767 | dev: true
1768 |
1769 | /json-parse-even-better-errors@2.3.1:
1770 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
1771 | dev: false
1772 |
1773 | /json-schema-traverse@0.4.1:
1774 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1775 | dev: true
1776 |
1777 | /json-stable-stringify-without-jsonify@1.0.1:
1778 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1779 | dev: true
1780 |
1781 | /json5@2.2.3:
1782 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1783 | engines: {node: '>=6'}
1784 | hasBin: true
1785 | dev: true
1786 |
1787 | /keyv@4.5.4:
1788 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1789 | dependencies:
1790 | json-buffer: 3.0.1
1791 | dev: true
1792 |
1793 | /levn@0.4.1:
1794 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1795 | engines: {node: '>= 0.8.0'}
1796 | dependencies:
1797 | prelude-ls: 1.2.1
1798 | type-check: 0.4.0
1799 | dev: true
1800 |
1801 | /lilconfig@2.1.0:
1802 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1803 | engines: {node: '>=10'}
1804 | dev: true
1805 |
1806 | /lines-and-columns@1.2.4:
1807 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1808 |
1809 | /locate-path@6.0.0:
1810 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1811 | engines: {node: '>=10'}
1812 | dependencies:
1813 | p-locate: 5.0.0
1814 | dev: true
1815 |
1816 | /lodash-es@4.17.21:
1817 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
1818 | dev: false
1819 |
1820 | /lodash.merge@4.6.2:
1821 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1822 | dev: true
1823 |
1824 | /lodash@4.17.21:
1825 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
1826 | dev: false
1827 |
1828 | /loose-envify@1.4.0:
1829 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1830 | hasBin: true
1831 | dependencies:
1832 | js-tokens: 4.0.0
1833 | dev: false
1834 |
1835 | /lru-cache@5.1.1:
1836 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1837 | dependencies:
1838 | yallist: 3.1.1
1839 | dev: true
1840 |
1841 | /lru-cache@6.0.0:
1842 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
1843 | engines: {node: '>=10'}
1844 | dependencies:
1845 | yallist: 4.0.0
1846 | dev: true
1847 |
1848 | /match-sorter@6.3.1:
1849 | resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==}
1850 | dependencies:
1851 | '@babel/runtime': 7.23.2
1852 | remove-accents: 0.4.2
1853 | dev: false
1854 |
1855 | /material-colors@1.2.6:
1856 | resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==}
1857 | dev: false
1858 |
1859 | /memize@2.1.0:
1860 | resolution: {integrity: sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==}
1861 | dev: false
1862 |
1863 | /memoize-one@6.0.0:
1864 | resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
1865 | dev: false
1866 |
1867 | /merge2@1.4.1:
1868 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1869 | engines: {node: '>= 8'}
1870 | dev: true
1871 |
1872 | /micromatch@4.0.5:
1873 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1874 | engines: {node: '>=8.6'}
1875 | dependencies:
1876 | braces: 3.0.2
1877 | picomatch: 2.3.1
1878 | dev: true
1879 |
1880 | /microseconds@0.2.0:
1881 | resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==}
1882 | dev: false
1883 |
1884 | /minimatch@3.1.2:
1885 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1886 | dependencies:
1887 | brace-expansion: 1.1.11
1888 |
1889 | /ms@2.1.2:
1890 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1891 | dev: true
1892 |
1893 | /mz@2.7.0:
1894 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1895 | dependencies:
1896 | any-promise: 1.3.0
1897 | object-assign: 4.1.1
1898 | thenify-all: 1.6.0
1899 | dev: true
1900 |
1901 | /nano-time@1.0.0:
1902 | resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==}
1903 | dependencies:
1904 | big-integer: 1.6.51
1905 | dev: false
1906 |
1907 | /nanoid@3.3.6:
1908 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
1909 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1910 | hasBin: true
1911 | dev: true
1912 |
1913 | /natural-compare-lite@1.4.0:
1914 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
1915 | dev: true
1916 |
1917 | /natural-compare@1.4.0:
1918 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1919 | dev: true
1920 |
1921 | /node-releases@2.0.13:
1922 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
1923 | dev: true
1924 |
1925 | /normalize-path@3.0.0:
1926 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1927 | engines: {node: '>=0.10.0'}
1928 | dev: true
1929 |
1930 | /normalize-range@0.1.2:
1931 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1932 | engines: {node: '>=0.10.0'}
1933 | dev: true
1934 |
1935 | /object-assign@4.1.1:
1936 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1937 | engines: {node: '>=0.10.0'}
1938 |
1939 | /object-hash@3.0.0:
1940 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1941 | engines: {node: '>= 6'}
1942 | dev: true
1943 |
1944 | /oblivious-set@1.0.0:
1945 | resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==}
1946 | dev: false
1947 |
1948 | /once@1.4.0:
1949 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1950 | dependencies:
1951 | wrappy: 1.0.2
1952 |
1953 | /optionator@0.9.3:
1954 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
1955 | engines: {node: '>= 0.8.0'}
1956 | dependencies:
1957 | '@aashutoshrathi/word-wrap': 1.2.6
1958 | deep-is: 0.1.4
1959 | fast-levenshtein: 2.0.6
1960 | levn: 0.4.1
1961 | prelude-ls: 1.2.1
1962 | type-check: 0.4.0
1963 | dev: true
1964 |
1965 | /p-limit@3.1.0:
1966 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1967 | engines: {node: '>=10'}
1968 | dependencies:
1969 | yocto-queue: 0.1.0
1970 | dev: true
1971 |
1972 | /p-locate@5.0.0:
1973 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1974 | engines: {node: '>=10'}
1975 | dependencies:
1976 | p-limit: 3.1.0
1977 | dev: true
1978 |
1979 | /parent-module@1.0.1:
1980 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1981 | engines: {node: '>=6'}
1982 | dependencies:
1983 | callsites: 3.1.0
1984 |
1985 | /parse-json@5.2.0:
1986 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
1987 | engines: {node: '>=8'}
1988 | dependencies:
1989 | '@babel/code-frame': 7.22.13
1990 | error-ex: 1.3.2
1991 | json-parse-even-better-errors: 2.3.1
1992 | lines-and-columns: 1.2.4
1993 | dev: false
1994 |
1995 | /path-exists@4.0.0:
1996 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1997 | engines: {node: '>=8'}
1998 | dev: true
1999 |
2000 | /path-is-absolute@1.0.1:
2001 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
2002 | engines: {node: '>=0.10.0'}
2003 |
2004 | /path-key@3.1.1:
2005 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
2006 | engines: {node: '>=8'}
2007 | dev: true
2008 |
2009 | /path-parse@1.0.7:
2010 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
2011 |
2012 | /path-type@4.0.0:
2013 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
2014 | engines: {node: '>=8'}
2015 |
2016 | /picocolors@1.0.0:
2017 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
2018 | dev: true
2019 |
2020 | /picomatch@2.3.1:
2021 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
2022 | engines: {node: '>=8.6'}
2023 | dev: true
2024 |
2025 | /pify@2.3.0:
2026 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
2027 | engines: {node: '>=0.10.0'}
2028 | dev: true
2029 |
2030 | /pirates@4.0.6:
2031 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
2032 | engines: {node: '>= 6'}
2033 | dev: true
2034 |
2035 | /postcss-import@15.1.0(postcss@8.4.31):
2036 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
2037 | engines: {node: '>=14.0.0'}
2038 | peerDependencies:
2039 | postcss: ^8.0.0
2040 | dependencies:
2041 | postcss: 8.4.31
2042 | postcss-value-parser: 4.2.0
2043 | read-cache: 1.0.0
2044 | resolve: 1.22.8
2045 | dev: true
2046 |
2047 | /postcss-js@4.0.1(postcss@8.4.31):
2048 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
2049 | engines: {node: ^12 || ^14 || >= 16}
2050 | peerDependencies:
2051 | postcss: ^8.4.21
2052 | dependencies:
2053 | camelcase-css: 2.0.1
2054 | postcss: 8.4.31
2055 | dev: true
2056 |
2057 | /postcss-load-config@4.0.1(postcss@8.4.31):
2058 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
2059 | engines: {node: '>= 14'}
2060 | peerDependencies:
2061 | postcss: '>=8.0.9'
2062 | ts-node: '>=9.0.0'
2063 | peerDependenciesMeta:
2064 | postcss:
2065 | optional: true
2066 | ts-node:
2067 | optional: true
2068 | dependencies:
2069 | lilconfig: 2.1.0
2070 | postcss: 8.4.31
2071 | yaml: 2.3.3
2072 | dev: true
2073 |
2074 | /postcss-nested@6.0.1(postcss@8.4.31):
2075 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
2076 | engines: {node: '>=12.0'}
2077 | peerDependencies:
2078 | postcss: ^8.2.14
2079 | dependencies:
2080 | postcss: 8.4.31
2081 | postcss-selector-parser: 6.0.13
2082 | dev: true
2083 |
2084 | /postcss-selector-parser@6.0.13:
2085 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
2086 | engines: {node: '>=4'}
2087 | dependencies:
2088 | cssesc: 3.0.0
2089 | util-deprecate: 1.0.2
2090 | dev: true
2091 |
2092 | /postcss-value-parser@4.2.0:
2093 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
2094 | dev: true
2095 |
2096 | /postcss@8.4.31:
2097 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
2098 | engines: {node: ^10 || ^12 || >=14}
2099 | dependencies:
2100 | nanoid: 3.3.6
2101 | picocolors: 1.0.0
2102 | source-map-js: 1.0.2
2103 | dev: true
2104 |
2105 | /prelude-ls@1.2.1:
2106 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
2107 | engines: {node: '>= 0.8.0'}
2108 | dev: true
2109 |
2110 | /prop-types@15.8.1:
2111 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
2112 | dependencies:
2113 | loose-envify: 1.4.0
2114 | object-assign: 4.1.1
2115 | react-is: 16.13.1
2116 | dev: false
2117 |
2118 | /property-expr@2.0.6:
2119 | resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==}
2120 | dev: false
2121 |
2122 | /punycode@2.3.0:
2123 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
2124 | engines: {node: '>=6'}
2125 | dev: true
2126 |
2127 | /queue-microtask@1.2.3:
2128 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
2129 | dev: true
2130 |
2131 | /react-color@2.19.3(react@18.2.0):
2132 | resolution: {integrity: sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==}
2133 | peerDependencies:
2134 | react: '*'
2135 | dependencies:
2136 | '@icons/material': 0.2.4(react@18.2.0)
2137 | lodash: 4.17.21
2138 | lodash-es: 4.17.21
2139 | material-colors: 1.2.6
2140 | prop-types: 15.8.1
2141 | react: 18.2.0
2142 | reactcss: 1.2.3(react@18.2.0)
2143 | tinycolor2: 1.6.0
2144 | dev: false
2145 |
2146 | /react-dom@18.2.0(react@18.2.0):
2147 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
2148 | peerDependencies:
2149 | react: ^18.2.0
2150 | dependencies:
2151 | loose-envify: 1.4.0
2152 | react: 18.2.0
2153 | scheduler: 0.23.0
2154 | dev: false
2155 |
2156 | /react-hook-form@7.47.0(react@18.2.0):
2157 | resolution: {integrity: sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg==}
2158 | engines: {node: '>=12.22.0'}
2159 | peerDependencies:
2160 | react: ^16.8.0 || ^17 || ^18
2161 | dependencies:
2162 | react: 18.2.0
2163 | dev: false
2164 |
2165 | /react-is@16.13.1:
2166 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
2167 | dev: false
2168 |
2169 | /react-query@3.39.3(react-dom@18.2.0)(react@18.2.0):
2170 | resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==}
2171 | peerDependencies:
2172 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
2173 | react-dom: '*'
2174 | react-native: '*'
2175 | peerDependenciesMeta:
2176 | react-dom:
2177 | optional: true
2178 | react-native:
2179 | optional: true
2180 | dependencies:
2181 | '@babel/runtime': 7.23.2
2182 | broadcast-channel: 3.7.0
2183 | match-sorter: 6.3.1
2184 | react: 18.2.0
2185 | react-dom: 18.2.0(react@18.2.0)
2186 | dev: false
2187 |
2188 | /react-refresh@0.14.0:
2189 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
2190 | engines: {node: '>=0.10.0'}
2191 | dev: true
2192 |
2193 | /react-select@5.7.7(@types/react@18.2.15)(react-dom@18.2.0)(react@18.2.0):
2194 | resolution: {integrity: sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==}
2195 | peerDependencies:
2196 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
2197 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
2198 | dependencies:
2199 | '@babel/runtime': 7.23.2
2200 | '@emotion/cache': 11.11.0
2201 | '@emotion/react': 11.11.1(@types/react@18.2.15)(react@18.2.0)
2202 | '@floating-ui/dom': 1.5.3
2203 | '@types/react-transition-group': 4.4.8
2204 | memoize-one: 6.0.0
2205 | prop-types: 15.8.1
2206 | react: 18.2.0
2207 | react-dom: 18.2.0(react@18.2.0)
2208 | react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0)
2209 | use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.15)(react@18.2.0)
2210 | transitivePeerDependencies:
2211 | - '@types/react'
2212 | dev: false
2213 |
2214 | /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0):
2215 | resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
2216 | peerDependencies:
2217 | react: '>=16.6.0'
2218 | react-dom: '>=16.6.0'
2219 | dependencies:
2220 | '@babel/runtime': 7.23.2
2221 | dom-helpers: 5.2.1
2222 | loose-envify: 1.4.0
2223 | prop-types: 15.8.1
2224 | react: 18.2.0
2225 | react-dom: 18.2.0(react@18.2.0)
2226 | dev: false
2227 |
2228 | /react@18.2.0:
2229 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
2230 | engines: {node: '>=0.10.0'}
2231 | dependencies:
2232 | loose-envify: 1.4.0
2233 | dev: false
2234 |
2235 | /reactcss@1.2.3(react@18.2.0):
2236 | resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==}
2237 | peerDependencies:
2238 | react: '*'
2239 | dependencies:
2240 | lodash: 4.17.21
2241 | react: 18.2.0
2242 | dev: false
2243 |
2244 | /read-cache@1.0.0:
2245 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
2246 | dependencies:
2247 | pify: 2.3.0
2248 | dev: true
2249 |
2250 | /readdirp@3.6.0:
2251 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
2252 | engines: {node: '>=8.10.0'}
2253 | dependencies:
2254 | picomatch: 2.3.1
2255 | dev: true
2256 |
2257 | /regenerator-runtime@0.14.0:
2258 | resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
2259 | dev: false
2260 |
2261 | /remove-accents@0.4.2:
2262 | resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
2263 | dev: false
2264 |
2265 | /remove-accents@0.5.0:
2266 | resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
2267 | dev: false
2268 |
2269 | /resolve-from@4.0.0:
2270 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
2271 | engines: {node: '>=4'}
2272 |
2273 | /resolve@1.22.8:
2274 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
2275 | hasBin: true
2276 | dependencies:
2277 | is-core-module: 2.13.0
2278 | path-parse: 1.0.7
2279 | supports-preserve-symlinks-flag: 1.0.0
2280 |
2281 | /reusify@1.0.4:
2282 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
2283 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2284 | dev: true
2285 |
2286 | /rimraf@3.0.2:
2287 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
2288 | hasBin: true
2289 | dependencies:
2290 | glob: 7.2.3
2291 |
2292 | /rollup@3.29.4:
2293 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
2294 | engines: {node: '>=14.18.0', npm: '>=8.0.0'}
2295 | hasBin: true
2296 | optionalDependencies:
2297 | fsevents: 2.3.3
2298 | dev: true
2299 |
2300 | /run-parallel@1.2.0:
2301 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
2302 | dependencies:
2303 | queue-microtask: 1.2.3
2304 | dev: true
2305 |
2306 | /safe-buffer@5.2.1:
2307 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
2308 | dev: false
2309 |
2310 | /safer-buffer@2.1.2:
2311 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
2312 | dev: false
2313 |
2314 | /scheduler@0.23.0:
2315 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
2316 | dependencies:
2317 | loose-envify: 1.4.0
2318 | dev: false
2319 |
2320 | /semver@6.3.1:
2321 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
2322 | hasBin: true
2323 | dev: true
2324 |
2325 | /semver@7.5.4:
2326 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
2327 | engines: {node: '>=10'}
2328 | hasBin: true
2329 | dependencies:
2330 | lru-cache: 6.0.0
2331 | dev: true
2332 |
2333 | /shebang-command@2.0.0:
2334 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
2335 | engines: {node: '>=8'}
2336 | dependencies:
2337 | shebang-regex: 3.0.0
2338 | dev: true
2339 |
2340 | /shebang-regex@3.0.0:
2341 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
2342 | engines: {node: '>=8'}
2343 | dev: true
2344 |
2345 | /slash@3.0.0:
2346 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
2347 | engines: {node: '>=8'}
2348 | dev: true
2349 |
2350 | /source-map-js@1.0.2:
2351 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
2352 | engines: {node: '>=0.10.0'}
2353 | dev: true
2354 |
2355 | /source-map@0.5.7:
2356 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
2357 | engines: {node: '>=0.10.0'}
2358 | dev: false
2359 |
2360 | /sprintf-js@1.1.3:
2361 | resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
2362 | dev: false
2363 |
2364 | /strip-ansi@6.0.1:
2365 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2366 | engines: {node: '>=8'}
2367 | dependencies:
2368 | ansi-regex: 5.0.1
2369 | dev: true
2370 |
2371 | /strip-json-comments@3.1.1:
2372 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2373 | engines: {node: '>=8'}
2374 | dev: true
2375 |
2376 | /stylis@4.2.0:
2377 | resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
2378 | dev: false
2379 |
2380 | /sucrase@3.34.0:
2381 | resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==}
2382 | engines: {node: '>=8'}
2383 | hasBin: true
2384 | dependencies:
2385 | '@jridgewell/gen-mapping': 0.3.3
2386 | commander: 4.1.1
2387 | glob: 7.1.6
2388 | lines-and-columns: 1.2.4
2389 | mz: 2.7.0
2390 | pirates: 4.0.6
2391 | ts-interface-checker: 0.1.13
2392 | dev: true
2393 |
2394 | /supports-color@5.5.0:
2395 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
2396 | engines: {node: '>=4'}
2397 | dependencies:
2398 | has-flag: 3.0.0
2399 |
2400 | /supports-color@7.2.0:
2401 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2402 | engines: {node: '>=8'}
2403 | dependencies:
2404 | has-flag: 4.0.0
2405 | dev: true
2406 |
2407 | /supports-preserve-symlinks-flag@1.0.0:
2408 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
2409 | engines: {node: '>= 0.4'}
2410 |
2411 | /tailwindcss@3.3.3:
2412 | resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==}
2413 | engines: {node: '>=14.0.0'}
2414 | hasBin: true
2415 | dependencies:
2416 | '@alloc/quick-lru': 5.2.0
2417 | arg: 5.0.2
2418 | chokidar: 3.5.3
2419 | didyoumean: 1.2.2
2420 | dlv: 1.1.3
2421 | fast-glob: 3.3.1
2422 | glob-parent: 6.0.2
2423 | is-glob: 4.0.3
2424 | jiti: 1.20.0
2425 | lilconfig: 2.1.0
2426 | micromatch: 4.0.5
2427 | normalize-path: 3.0.0
2428 | object-hash: 3.0.0
2429 | picocolors: 1.0.0
2430 | postcss: 8.4.31
2431 | postcss-import: 15.1.0(postcss@8.4.31)
2432 | postcss-js: 4.0.1(postcss@8.4.31)
2433 | postcss-load-config: 4.0.1(postcss@8.4.31)
2434 | postcss-nested: 6.0.1(postcss@8.4.31)
2435 | postcss-selector-parser: 6.0.13
2436 | resolve: 1.22.8
2437 | sucrase: 3.34.0
2438 | transitivePeerDependencies:
2439 | - ts-node
2440 | dev: true
2441 |
2442 | /tannin@1.2.0:
2443 | resolution: {integrity: sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==}
2444 | dependencies:
2445 | '@tannin/plural-forms': 1.1.0
2446 | dev: false
2447 |
2448 | /text-table@0.2.0:
2449 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
2450 | dev: true
2451 |
2452 | /thenify-all@1.6.0:
2453 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
2454 | engines: {node: '>=0.8'}
2455 | dependencies:
2456 | thenify: 3.3.1
2457 | dev: true
2458 |
2459 | /thenify@3.3.1:
2460 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
2461 | dependencies:
2462 | any-promise: 1.3.0
2463 | dev: true
2464 |
2465 | /tiny-case@1.0.3:
2466 | resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
2467 | dev: false
2468 |
2469 | /tinycolor2@1.6.0:
2470 | resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
2471 | dev: false
2472 |
2473 | /to-fast-properties@2.0.0:
2474 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
2475 | engines: {node: '>=4'}
2476 |
2477 | /to-regex-range@5.0.1:
2478 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2479 | engines: {node: '>=8.0'}
2480 | dependencies:
2481 | is-number: 7.0.0
2482 | dev: true
2483 |
2484 | /toposort@2.0.2:
2485 | resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
2486 | dev: false
2487 |
2488 | /ts-api-utils@1.0.3(typescript@5.0.2):
2489 | resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
2490 | engines: {node: '>=16.13.0'}
2491 | peerDependencies:
2492 | typescript: '>=4.2.0'
2493 | dependencies:
2494 | typescript: 5.0.2
2495 | dev: true
2496 |
2497 | /ts-interface-checker@0.1.13:
2498 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
2499 | dev: true
2500 |
2501 | /tsconfck@2.1.2(typescript@5.0.2):
2502 | resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==}
2503 | engines: {node: ^14.13.1 || ^16 || >=18}
2504 | hasBin: true
2505 | peerDependencies:
2506 | typescript: ^4.3.5 || ^5.0.0
2507 | peerDependenciesMeta:
2508 | typescript:
2509 | optional: true
2510 | dependencies:
2511 | typescript: 5.0.2
2512 | dev: true
2513 |
2514 | /type-check@0.4.0:
2515 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2516 | engines: {node: '>= 0.8.0'}
2517 | dependencies:
2518 | prelude-ls: 1.2.1
2519 | dev: true
2520 |
2521 | /type-fest@0.20.2:
2522 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
2523 | engines: {node: '>=10'}
2524 | dev: true
2525 |
2526 | /type-fest@2.19.0:
2527 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
2528 | engines: {node: '>=12.20'}
2529 | dev: false
2530 |
2531 | /typescript@5.0.2:
2532 | resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==}
2533 | engines: {node: '>=12.20'}
2534 | hasBin: true
2535 | dev: true
2536 |
2537 | /unload@2.2.0:
2538 | resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
2539 | dependencies:
2540 | '@babel/runtime': 7.23.2
2541 | detect-node: 2.1.0
2542 | dev: false
2543 |
2544 | /update-browserslist-db@1.0.13(browserslist@4.22.1):
2545 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
2546 | hasBin: true
2547 | peerDependencies:
2548 | browserslist: '>= 4.21.0'
2549 | dependencies:
2550 | browserslist: 4.22.1
2551 | escalade: 3.1.1
2552 | picocolors: 1.0.0
2553 | dev: true
2554 |
2555 | /uri-js@4.4.1:
2556 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2557 | dependencies:
2558 | punycode: 2.3.0
2559 | dev: true
2560 |
2561 | /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.15)(react@18.2.0):
2562 | resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
2563 | peerDependencies:
2564 | '@types/react': '*'
2565 | react: ^16.8.0 || ^17.0.0 || ^18.0.0
2566 | peerDependenciesMeta:
2567 | '@types/react':
2568 | optional: true
2569 | dependencies:
2570 | '@types/react': 18.2.15
2571 | react: 18.2.0
2572 | dev: false
2573 |
2574 | /util-deprecate@1.0.2:
2575 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
2576 | dev: true
2577 |
2578 | /vite-tsconfig-paths@4.2.1(typescript@5.0.2)(vite@4.4.5):
2579 | resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==}
2580 | peerDependencies:
2581 | vite: '*'
2582 | peerDependenciesMeta:
2583 | vite:
2584 | optional: true
2585 | dependencies:
2586 | debug: 4.3.4
2587 | globrex: 0.1.2
2588 | tsconfck: 2.1.2(typescript@5.0.2)
2589 | vite: 4.4.5
2590 | transitivePeerDependencies:
2591 | - supports-color
2592 | - typescript
2593 | dev: true
2594 |
2595 | /vite@4.4.5:
2596 | resolution: {integrity: sha512-4m5kEtAWHYr0O1Fu7rZp64CfO1PsRGZlD3TAB32UmQlpd7qg15VF7ROqGN5CyqN7HFuwr7ICNM2+fDWRqFEKaA==}
2597 | engines: {node: ^14.18.0 || >=16.0.0}
2598 | hasBin: true
2599 | peerDependencies:
2600 | '@types/node': '>= 14'
2601 | less: '*'
2602 | lightningcss: ^1.21.0
2603 | sass: '*'
2604 | stylus: '*'
2605 | sugarss: '*'
2606 | terser: ^5.4.0
2607 | peerDependenciesMeta:
2608 | '@types/node':
2609 | optional: true
2610 | less:
2611 | optional: true
2612 | lightningcss:
2613 | optional: true
2614 | sass:
2615 | optional: true
2616 | stylus:
2617 | optional: true
2618 | sugarss:
2619 | optional: true
2620 | terser:
2621 | optional: true
2622 | dependencies:
2623 | esbuild: 0.18.20
2624 | postcss: 8.4.31
2625 | rollup: 3.29.4
2626 | optionalDependencies:
2627 | fsevents: 2.3.3
2628 | dev: true
2629 |
2630 | /which@2.0.2:
2631 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2632 | engines: {node: '>= 8'}
2633 | hasBin: true
2634 | dependencies:
2635 | isexe: 2.0.0
2636 | dev: true
2637 |
2638 | /wrappy@1.0.2:
2639 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2640 |
2641 | /yallist@3.1.1:
2642 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
2643 | dev: true
2644 |
2645 | /yallist@4.0.0:
2646 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
2647 | dev: true
2648 |
2649 | /yaml@1.10.2:
2650 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
2651 | engines: {node: '>= 6'}
2652 | dev: false
2653 |
2654 | /yaml@2.3.3:
2655 | resolution: {integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==}
2656 | engines: {node: '>= 14'}
2657 | dev: true
2658 |
2659 | /yocto-queue@0.1.0:
2660 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2661 | engines: {node: '>=10'}
2662 | dev: true
2663 |
2664 | /yup@1.3.2:
2665 | resolution: {integrity: sha512-6KCM971iQtJ+/KUaHdrhVr2LDkfhBtFPRnsG1P8F4q3uUVQ2RfEM9xekpha9aA4GXWJevjM10eDcPQ1FfWlmaQ==}
2666 | dependencies:
2667 | property-expr: 2.0.6
2668 | tiny-case: 1.0.3
2669 | toposort: 2.0.2
2670 | type-fest: 2.19.0
2671 | dev: false
2672 |
--------------------------------------------------------------------------------
/includes/admin/backend/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/App.tsx:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 | import { useState } from 'react';
3 | import './assets/css/index.css';
4 | import MainLayout from './components/MainLayout/MainLayout';
5 | import GeneralSettings from './views/Settings/GeneralSettings';
6 | import Licence from './views/Licence/Licence';
7 | import Posts from './views/Posts/Posts';
8 | import Users from './views/Users/Users';
9 |
10 | export enum Pages {
11 | Posts = 'Posts',
12 | Users = 'Users',
13 | Settings = 'Settings',
14 | SettingsGeneral = 'SettingsGeneral',
15 | SettingsDisplay = 'SettingsDisplay',
16 | Licence = 'Automatic Updates',
17 | WPGensPlugins = 'WPGens Plugins',
18 | }
19 |
20 | apiFetch.use(apiFetch.createRootURLMiddleware(window.pluginName?.root));
21 | apiFetch.use(apiFetch.createNonceMiddleware(window.pluginName?.apiNonce));
22 |
23 | function App() {
24 | const [page, setPage] = useState(Pages.Posts);
25 |
26 | return (
27 |
28 | {page === Pages.Posts && }
29 | {page === Pages.Users && }
30 | {page === Pages.SettingsGeneral && }
31 | {page === Pages.Licence && }
32 |
33 | );
34 | }
35 |
36 | export default App;
37 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/assets/css/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | .btn-primary {
6 | @apply disabled:bg-gray-200 inline-block px-8 py-2 bg-blue-600 hover:bg-blue-500 active:bg-blue-700 text-white rounded-md font-medium transition-colors duration-300 h-11 min-w-[144px];
7 | }
8 | .table-info a {
9 | @apply text-orange-400 underline;
10 | }
11 | .tag-alt {
12 | @apply bg-blue-500 ring-blue-500 inline-flex h-[6px] w-[6px] ring-opacity-25 rounded-full ring-4 mx-3 capitalize;
13 | }
14 | .email_share,
15 | .user_referred {
16 | @apply bg-purple-500 ring-purple-500 ring-opacity-25;
17 | }
18 | .coupon_applied {
19 | @apply bg-yellow-400 ring-yellow-500 ring-opacity-25;
20 | }
21 | .new_order,
22 | .Completed {
23 | @apply bg-green-500 ring-green-500 ring-opacity-25;
24 | }
25 |
26 | .new_coupon {
27 | @apply bg-blue-500 ring-blue-500 ring-opacity-25;
28 | }
29 | .email_sent,
30 | .hold {
31 | @apply bg-red-500 ring-red-500 ring-opacity-25;
32 | }
33 | .tag-canceled {
34 | @apply bg-gray-500 ring-gray-500 ring-opacity-25;
35 | }
36 |
37 | /* Loader */
38 | .wpgens-loading-indicator {
39 | color: #00112c;
40 | font-family: fakt,-apple-system,blinkmacsystemfont,"Segoe UI",roboto,oxygen,ubuntu,cantarell,"Open Sans","Helvetica Neue",sans-serif;
41 | font-size: 15px;
42 | -webkit-font-smoothing: antialiased;
43 | -moz-osx-font-smoothing: grayscale;
44 | font-weight: 100;
45 | line-height: 1.4;
46 | display: inline-block;
47 | min-height: 24px;
48 | min-width: 24px;
49 | position: relative
50 | }
51 |
52 | .wpgens-loading-indicator::after {
53 | animation: adl-progress-circular-rotate 1s cubic-bezier(0.785, 0.135, 0.15, 0.86) infinite;
54 | border: 3px solid #dce0e5;
55 | border-radius: 50%;
56 | border-top-color: #06f;
57 | content: "";
58 | display: block;
59 | height: min-content;
60 | left: 0;
61 | min-height: 24px;
62 | min-width: 24px;
63 | position: absolute;
64 | top: 0;
65 | width: min-content
66 | }
67 |
68 | .wpgens-loading-indicator--large {
69 | min-height: 48px;
70 | min-width: 48px
71 | }
72 |
73 | .wpgens-loading-indicator--large::after {
74 | min-height: 48px;
75 | min-width: 48px
76 | }
77 |
78 | .wpgens-loading-indicator--small {
79 | min-height: 16px;
80 | min-width: 16px
81 | }
82 |
83 | .wpgens-loading-indicator--small::after {
84 | min-height: 16px;
85 | min-width: 16px
86 | }
87 | .wpgens-loading-indicator,.wpgens-loading-indicator::before,.wpgens-loading-indicator::after {
88 | box-sizing: border-box
89 | }
90 |
91 | @keyframes adl-progress-circular-rotate {
92 | 100% {
93 | transform: rotate(360deg)
94 | }
95 | }
96 |
97 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Alert/Alert.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef, useState } from 'react';
2 |
3 | export enum alertMsgType {
4 | success = 'success',
5 | error = 'error',
6 | }
7 |
8 | type AlertType = {
9 | message: string;
10 | type: alertMsgType;
11 | action?: () => void;
12 | permament?: boolean;
13 | };
14 |
15 | export default function Alert({ message, type, action, permament = false }: AlertType) {
16 | const [visible, setVisible] = useState(true);
17 | const timeout = useRef>();
18 |
19 | useEffect(() => {
20 | if (permament) {
21 | return;
22 | }
23 |
24 | timeout.current = setTimeout(() => {
25 | if (action) {
26 | action();
27 | }
28 | setVisible(false);
29 | }, 4000);
30 |
31 | return () => {
32 | clearTimeout(timeout.current);
33 | };
34 | }, [action, permament]);
35 |
36 | const runAction = () => {
37 | setVisible(false);
38 | if (action) {
39 | action();
40 | }
41 | };
42 |
43 | if (!visible) {
44 | return null;
45 | }
46 |
47 | return (
48 |
53 |
{message}
54 | {permament && (
55 |
56 |
64 |
65 |
66 |
67 | )}
68 |
69 | );
70 | }
71 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Button/Button.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, SetStateAction } from 'react';
2 |
3 | type ButtonProps = {
4 | disabled?: boolean;
5 | type: 'submit' | 'button';
6 | onClick?: Dispatch> | undefined;
7 | className?: string;
8 | label: string;
9 | };
10 |
11 | type ButtonAdditionalProps = {
12 | onClick?: Dispatch>;
13 | };
14 |
15 | export default function Button({ disabled, className, label, type, onClick }: ButtonProps) {
16 | const props: ButtonAdditionalProps = {};
17 |
18 | if (onClick) {
19 | props.onClick = onClick;
20 | }
21 |
22 | return (
23 |
24 | {disabled && (
25 |
32 |
36 |
40 |
41 | )}
42 | {!disabled && label}
43 |
44 | );
45 | }
46 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/ColorPicker/ColorPicker.tsx:
--------------------------------------------------------------------------------
1 | import { ChromePicker } from 'react-color';
2 | import { useRef, useState } from 'react';
3 | import useClickOutside from '@/hooks/useClickOutside';
4 | import { ColorResult } from 'react-color';
5 |
6 | interface ColorPickerProps {
7 | title: string;
8 | color: string;
9 | setColor: (c: ColorResult) => void;
10 | }
11 | export default function ColorPicker({ color, setColor, title }: ColorPickerProps) {
12 | const containerRef = useRef(null);
13 | const [colorPicker, setColorPicker] = useState(false);
14 | useClickOutside(containerRef, () => {
15 | setColorPicker(false);
16 | });
17 |
18 | return (
19 |
20 |
21 |
{title}
22 |
23 |
30 |
31 |
setColorPicker(!colorPicker)}
40 | />
41 | {colorPicker && setColor(c)} />}
42 |
43 |
44 |
45 |
46 | );
47 | }
48 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/InputText/InputText.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 | import { UseFormRegister } from 'react-hook-form';
3 |
4 | interface InputTextProps {
5 | label: string;
6 | name: string;
7 | placeholder?: string;
8 | description?: string;
9 | disabled?: boolean;
10 | register?: UseFormRegister;
11 | error?: string | null;
12 | value?: string;
13 | className?: string;
14 | type?: 'text' | 'email' | 'password' | 'number';
15 | }
16 |
17 | export default function InputText({ label, register, name, description, disabled, error, type, placeholder, value, className }: InputTextProps) {
18 | /* When register is not passed, its just dummy input field, we use it for disabled inputs that cant be changed */
19 | return (
20 |
21 |
22 |
23 | {label}
24 | {description && {description} }
25 |
26 | {register ? (
27 |
41 | ) : (
42 |
56 | )}
57 | {error &&
{error} }
58 |
59 |
60 | );
61 | }
62 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/ReactSelectField/ReactSelectField.tsx:
--------------------------------------------------------------------------------
1 | import { Control, Controller, UseFormRegister } from 'react-hook-form';
2 | import ReactSelect from 'react-select';
3 |
4 | export type ReactSelectType = {
5 | readonly value: string;
6 | readonly label: string;
7 | readonly isFixed?: boolean;
8 | readonly isDisabled?: boolean;
9 | };
10 |
11 | interface ReactSelectFieldProps {
12 | label: string;
13 | name: string;
14 | description?: string;
15 | disabled?: boolean;
16 | control: Control;
17 | register: UseFormRegister;
18 | error?: string;
19 | options: ReactSelectType[] | undefined;
20 | }
21 |
22 | export default function ReactSelectField({ label, control, name, description, error, options }: ReactSelectFieldProps) {
23 | return (
24 |
25 |
26 |
{label}
27 |
28 |
(
32 | onChange(val?.value)}
35 | defaultValue={value}
36 | className={`capitalize ${error ? 'border-red-500' : 'border-gray-200'}`}
37 | options={options}
38 | />
39 | )}
40 | rules={{ required: true }}
41 | />
42 | {error && {error} }
43 | {description && {description}
}
44 |
45 |
46 |
47 | );
48 | }
49 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/SelectField/SelectField.tsx:
--------------------------------------------------------------------------------
1 | import { UseFormRegister } from 'react-hook-form';
2 |
3 | interface SelectFieldProps {
4 | label: string;
5 | name: string;
6 | description?: string;
7 | disabled?: boolean;
8 | register?: UseFormRegister;
9 | error?: string;
10 | options: { id: number; name: string }[] | { id: string; name: string }[] | undefined;
11 | }
12 |
13 | export default function SelectField({ label, register, name, description, disabled, error, options }: SelectFieldProps) {
14 | return (
15 |
16 |
17 |
18 | {label}
19 | {description && {description} }
20 |
21 |
22 | {options && options?.length > 0 ? (
23 |
31 | {options.map((o) => (
32 |
33 | {o.name}
34 |
35 | ))}
36 |
37 | ) : (
38 | 'Loading...'
39 | )}
40 |
41 | {error &&
{error} }
42 |
43 |
44 | );
45 | }
46 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/TextArea/TextArea.tsx:
--------------------------------------------------------------------------------
1 | import { UseFormRegister } from 'react-hook-form';
2 |
3 | interface TextAreaProps {
4 | label: string;
5 | name: string;
6 | description?: string;
7 | placeholder?: string;
8 | disabled?: boolean;
9 | register: UseFormRegister;
10 | error?: string;
11 | }
12 |
13 | export default function TextArea({ label, register, name, description, placeholder, disabled, error }: TextAreaProps) {
14 | return (
15 |
16 |
17 |
18 | {label}
19 | {description && {description} }
20 |
21 |
30 | {error &&
{error} }
31 |
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Form/ToggleField/ToggleField.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 | import { UseFormRegister } from 'react-hook-form';
3 |
4 | interface InputTextProps {
5 | label: string;
6 | name: string;
7 | description?: string;
8 | disabled?: boolean;
9 | register?: UseFormRegister;
10 | error?: string;
11 | }
12 |
13 | export default function ToggleField({ label, register, name, description, disabled, error }: InputTextProps) {
14 | return (
15 |
16 |
17 | {label}
18 | {description && {description} }
19 |
20 |
21 |
22 |
23 |
24 |
25 | {error &&
{error} }
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Header/Header.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, SetStateAction } from 'react';
2 |
3 | type HeaderProps = {
4 | setSidebarVisible: Dispatch>;
5 | };
6 |
7 | export function Header({ setSidebarVisible }: HeaderProps) {
8 | return (
9 |
10 |
11 |
12 |
13 |
setSidebarVisible((prev) => !prev)}>
14 |
20 | Mobile menu
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/AnalyticsSVG.tsx:
--------------------------------------------------------------------------------
1 | const AnalyticsSVG = () => {
2 | return (
3 |
4 |
8 |
9 |
13 |
17 |
21 |
22 |
23 | );
24 | };
25 |
26 | export default AnalyticsSVG;
27 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/CheckMark.tsx:
--------------------------------------------------------------------------------
1 | export default function CheckMark() {
2 | return (
3 |
4 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/CrossMark.tsx:
--------------------------------------------------------------------------------
1 | export default function CrossMark() {
2 | return (
3 |
4 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/DashboardSVG.tsx:
--------------------------------------------------------------------------------
1 | const DashboardSVG = () => {
2 | return (
3 |
4 |
9 |
13 |
14 | );
15 | };
16 |
17 | export default DashboardSVG;
18 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/InvoiceSVG.tsx:
--------------------------------------------------------------------------------
1 | const InvoiceSVG = () => {
2 | return (
3 |
4 |
11 |
15 |
19 |
20 | );
21 | };
22 |
23 | export default InvoiceSVG;
24 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/LinkSVG.tsx:
--------------------------------------------------------------------------------
1 | export default function Eye() {
2 | return (
3 |
4 |
8 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/SettingsSVG.tsx:
--------------------------------------------------------------------------------
1 | export default function EyeSlash() {
2 | return (
3 |
14 |
18 |
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Icons/UserSVG.tsx:
--------------------------------------------------------------------------------
1 | const UserSVG = () => {
2 | return (
3 |
14 |
15 |
16 |
17 |
18 | );
19 | };
20 |
21 | export default UserSVG;
22 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/InlineError/InlineError.tsx:
--------------------------------------------------------------------------------
1 | type InlineErrorProps = {
2 | error: string | null;
3 | };
4 | export default function InlineError({ error }: InlineErrorProps) {
5 | return error ? {error}
: null;
6 | }
7 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Loader/Loader.tsx:
--------------------------------------------------------------------------------
1 | export default function Loader() {
2 | return (
3 |
7 | );
8 | }
9 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/MainLayout/MainLayout.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, ReactNode, SetStateAction, useState } from 'react';
2 | import Sidebar from '@/components/Sidebar/Sidebar';
3 | import { Header } from '../Header/Header';
4 | import { Pages } from '@/App';
5 |
6 | type MainLayoutProps = {
7 | children: ReactNode;
8 | page: Pages;
9 | setPage: Dispatch>;
10 | };
11 |
12 | export default function MainLayout({ children, setPage, page }: MainLayoutProps) {
13 | const [sidebarVisible, setSidebarVisible] = useState(false);
14 |
15 | const showLicenceNotification = false; // In case you want to give a missing licence key warning.
16 |
17 | return (
18 |
19 |
20 |
21 |
22 |
23 |
{children}
24 |
25 | {showLicenceNotification && (
26 |
36 | )}
37 |
38 |
39 | );
40 | }
41 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Sidebar/Sidebar.tsx:
--------------------------------------------------------------------------------
1 | import { Dispatch, SetStateAction } from 'react';
2 | import Footer from './components/Footer';
3 | import Logo from './components/Logo';
4 | import MenuItem from './components/MenuItem';
5 |
6 | import DashboardSVG from '@/components/Icons/DashboardSVG';
7 | import InvoiceSVG from '@/components/Icons/InvoiceSVG';
8 | import SettingsSVG from '@/components/Icons/SettingsSVG';
9 | import LinkSVG from '@/components/Icons/LinkSVG';
10 | import UserSVG from '@/components/Icons/UserSVG';
11 |
12 | import { Pages } from '@/App';
13 |
14 | type SidebarProps = {
15 | sidebarVisible: boolean;
16 | page: Pages;
17 | setPage: Dispatch>;
18 | };
19 |
20 | export default function Sidebar({ sidebarVisible, setPage, page }: SidebarProps) {
21 | const settingsSubmenu = [
22 | { title: 'General Settings', slug: Pages.SettingsGeneral },
23 | // { title: 'Display Settings', slug: Pages.SettingsDisplay },
24 | ];
25 |
26 | return (
27 |
28 |
29 |
30 |
31 |
32 |
33 |
41 |
42 |
50 |
51 |
52 |
53 |
54 | );
55 | }
56 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Sidebar/components/Footer.tsx:
--------------------------------------------------------------------------------
1 | export default function Footer() {
2 | return (
3 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Sidebar/components/Logo.tsx:
--------------------------------------------------------------------------------
1 | // import logo from '@/assets/img/logo-gens-black.png';
2 |
3 | export default function Logo() {
4 | const logo =
5 | 'data:image/png;base64,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';
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Sidebar/components/MenuItem.tsx:
--------------------------------------------------------------------------------
1 | import { ComponentType, Dispatch, SetStateAction, useState } from 'react';
2 | import SubMenuItem from './SubMenuItem';
3 | import { Pages } from '@/App';
4 |
5 | type MenuItemProps = {
6 | title: Pages;
7 | isActive: boolean;
8 | Image: ComponentType;
9 | page: Pages;
10 | setPage: Dispatch>;
11 | link?: string;
12 | submenu?: { title: string; slug: Pages }[];
13 | };
14 |
15 | export default function MenuItem({ title, Image, link, submenu, isActive, setPage, page }: MenuItemProps) {
16 | const [isExpanded, setIsExpanded] = useState(false);
17 |
18 | const expandMenu = () => {
19 | if (link) {
20 | return window.open(link);
21 | }
22 | if (!submenu) {
23 | setPage(title);
24 | return;
25 | } else {
26 | setPage(submenu[0].slug);
27 | }
28 | setIsExpanded(!isExpanded);
29 | };
30 |
31 | return (
32 |
33 |
39 |
40 |
41 |
42 | {title}
43 | {submenu && (
44 |
54 |
55 |
56 |
61 |
62 |
63 |
64 | )}
65 |
66 | {submenu && isExpanded && (
67 |
68 | {submenu.map((item) => (
69 |
70 | ))}
71 |
72 | )}
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/components/Sidebar/components/SubMenuItem.tsx:
--------------------------------------------------------------------------------
1 | import { Pages } from '@/App';
2 | import { Dispatch, SetStateAction } from 'react';
3 |
4 | type SubMenuItemProps = {
5 | title: string;
6 | isActive: boolean;
7 | slug: Pages;
8 | page: Pages;
9 | setPage: Dispatch>;
10 | };
11 |
12 | export default function SubMenuItem({ title, slug, setPage, isActive }: SubMenuItemProps) {
13 | function handleClick() {
14 | setPage(slug);
15 | }
16 |
17 | return (
18 |
23 |
24 |
25 |
26 | {title}
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/hooks/useClickOutside.ts:
--------------------------------------------------------------------------------
1 | import { MutableRefObject, useEffect } from 'react';
2 |
3 | const useClickOutside = (ref: MutableRefObject, handler: Function) => {
4 | useEffect(() => {
5 | const trigger = (e: any) => {
6 | if (!ref?.current?.contains(e.target)) handler();
7 | };
8 |
9 | document.addEventListener('click', trigger);
10 | return () => document.removeEventListener('click', trigger);
11 | }, [handler, ref]);
12 | };
13 |
14 | export default useClickOutside;
15 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/main.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-var */
2 | import React from 'react';
3 | import ReactDOM from 'react-dom/client';
4 | import { QueryClient, QueryClientProvider } from 'react-query';
5 | import App from './App.tsx';
6 |
7 | const queryClient = new QueryClient({
8 | defaultOptions: {
9 | queries: {
10 | staleTime: 5000,
11 | refetchOnWindowFocus: false,
12 | retry: 2,
13 | },
14 | },
15 | });
16 |
17 | interface AdminPanelGLobals {
18 | root: string;
19 | apiNonce: string;
20 | }
21 |
22 | declare global {
23 | var pluginName: AdminPanelGLobals;
24 | }
25 |
26 | ReactDOM.createRoot(document.getElementById('root')!).render(
27 |
28 |
29 |
30 |
31 |
32 | );
33 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/services/licence.service.ts:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 | import { LicenceRequest } from '../views/Licence/Licence';
3 |
4 | type GetLicenseResponse = {
5 | license_key: string;
6 | message: string;
7 | };
8 |
9 | export type SetLicenseResponse = {
10 | status: string;
11 | message: string;
12 | };
13 |
14 | export type DeactivateLicenseResponse = {
15 | message: string;
16 | };
17 |
18 | export const setLicence = (data: LicenceRequest) => apiFetch({ path: '/license', method: 'POST', data }).then((response) => response);
19 |
20 | export const getLicence = () => apiFetch({ path: `/license` }).then((response) => response);
21 |
22 | export const deactivateLicence = () => apiFetch({ path: '/license/deactivate', method: 'POST' }).then((response) => response);
23 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/services/orders.service.ts:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 |
3 | export type OrdersResponse = {
4 | num_of_pages: number;
5 | data: {
6 | order_date: string;
7 | order_info: string;
8 | order_referrer: string;
9 | order_status: string;
10 | order_total: string;
11 | }[];
12 | };
13 |
14 | export const getOrdersService = (page: number) => apiFetch({ path: `/orders/${page}` }).then((response) => response);
15 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/services/posts.service.ts:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 |
3 | export type PostsResponse = {
4 | numOfPages: number;
5 | data: {
6 | postID: string;
7 | postName: string;
8 | postDate: string;
9 | postAuthor: string;
10 | postStatus: string;
11 | }[];
12 | };
13 |
14 | export const getPostsService = (page: number) => apiFetch({ path: `/posts/${page}` }).then((response) => response);
15 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/services/settings.service.ts:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 | import { GeneralSettingsRequest } from '@/views/Settings/GeneralSettings';
3 |
4 | export const setGeneralSettings = (data: GeneralSettingsRequest) =>
5 | apiFetch({ path: '/settings', method: 'POST', data }).then((posts) => {
6 | console.log(posts);
7 | });
8 |
9 | export const getGeneralSettings = () => apiFetch({ path: `/settings/` }).then((response) => response);
10 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/services/users.service.ts:
--------------------------------------------------------------------------------
1 | import apiFetch from '@wordpress/api-fetch';
2 |
3 | export type CustomersResponse = {
4 | total: {
5 | amount: number;
6 | advocates: number;
7 | orders: number;
8 | };
9 | data: {
10 | raf_code: string;
11 | num_of_orders: string;
12 | total_amount: string;
13 | user_id: string;
14 | user_email: string;
15 | user_name: string;
16 | user_link: string | '';
17 | }[];
18 | };
19 |
20 | export type CustomerRequest = {
21 | days: string;
22 | };
23 |
24 | export const getCustomersService = ({ days }: CustomerRequest) => apiFetch({ path: `/customers/${days}` }).then((response) => response);
25 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/utils/helpers.ts:
--------------------------------------------------------------------------------
1 | export function emptyStringToNull(value, originalValue) {
2 | if (typeof originalValue === 'string' && originalValue === '') {
3 | return null;
4 | }
5 | return value;
6 | }
7 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/views/Licence/Licence.tsx:
--------------------------------------------------------------------------------
1 | import * as yup from 'yup';
2 | import { yupResolver } from '@hookform/resolvers/yup';
3 | import { useForm } from 'react-hook-form';
4 | import { useMutation, useQuery, useQueryClient } from 'react-query';
5 | import { useEffect, useState } from 'react';
6 | import InlineError from '@/components/InlineError/InlineError';
7 | import InputText from '@/components/Form/InputText/InputText';
8 | import { SetLicenseResponse, deactivateLicence, getLicence, setLicence } from '@/services/licence.service';
9 | import Loader from '@/components/Loader/Loader';
10 |
11 | export type LicenceRequest = {
12 | license_key: string;
13 | };
14 |
15 | const schema = yup
16 | .object()
17 | .shape({
18 | license_key: yup.string().required(),
19 | })
20 | .required();
21 |
22 | export default function Licence() {
23 | const [status, setStatus] = useState('');
24 | const [error, setError] = useState('');
25 |
26 | const {
27 | register,
28 | handleSubmit,
29 | reset,
30 | formState: { errors },
31 | } = useForm({
32 | resolver: yupResolver(schema),
33 | });
34 |
35 | const queryClient = useQueryClient();
36 | const { data: license, isLoading } = useQuery('wpgens-license', getLicence);
37 |
38 | useEffect(() => {
39 | if (license) {
40 | reset(license);
41 | setStatus(license?.message);
42 | }
43 | }, [license]);
44 |
45 | const { mutate, isLoading: licenceLoading } = useMutation void>(setLicence, {
46 | onSuccess: (response: SetLicenseResponse) => {
47 | setStatus(response.message);
48 | },
49 | onError: (err: unknown) => {
50 | console.log('ee', err);
51 | if (err instanceof Error) {
52 | setError(err?.message);
53 | } else {
54 | setError('Something went wrong. Please try again or contact support.');
55 | }
56 | },
57 | });
58 |
59 | async function deactivateLicense() {
60 | const response = await deactivateLicence();
61 | if (response.message === 'deactivated') {
62 | setStatus('Your license is not active for this URL.');
63 | queryClient.invalidateQueries({ queryKey: ['wpgens-license'] });
64 | }
65 | }
66 |
67 | const isValidLicense = status === 'License key is valid.';
68 |
69 | return (
70 |
118 | );
119 | }
120 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/views/Posts/Posts.tsx:
--------------------------------------------------------------------------------
1 | import { useMutation } from 'react-query';
2 | import { useEffect, useState } from 'react';
3 | import Loader from '@/components/Loader/Loader';
4 | import { getPostsService, PostsResponse } from '@/services/posts.service';
5 |
6 | export default function Posts() {
7 | const [posts, setPosts] = useState(null);
8 | const [page, setPage] = useState(1);
9 |
10 | const { isLoading, mutate } = useMutation void>(getPostsService, {
11 | onSuccess: (response: PostsResponse) => {
12 | setPosts(response);
13 | },
14 | onError: (err: unknown) => {
15 | console.log('error', err);
16 | },
17 | });
18 |
19 | useEffect(() => {
20 | if (page) {
21 | mutate(page);
22 | }
23 | }, [page]);
24 |
25 | return (
26 |
27 |
28 | Posts
29 | Example list of some data.
30 |
31 |
32 | {isLoading ? (
33 |
34 | ) : (
35 |
36 |
37 |
38 |
39 |
40 | #ID
41 |
42 |
43 | Date
44 |
45 |
46 | Title
47 |
48 |
49 | Written By
50 |
51 |
52 | Status
53 |
54 |
55 |
56 |
57 |
58 | {posts?.data?.map((post, k) => (
59 |
60 | {post.postID}
61 |
65 |
69 |
70 | {post.postAuthor}
71 |
72 |
73 |
74 | {post.postStatus}
75 |
76 |
77 | ))}
78 |
79 |
80 |
81 |
82 | {page > 1 && (
83 | setPage((p) => p - 1)}
86 | >
87 | «
88 | Previous
89 |
90 | )}
91 | {[...Array(posts?.numOfPages).keys()]
92 | .filter((k) => k < page + 3 && k > page - 3)
93 | .map((k) => (
94 | setPage(k + 1)}
97 | className={`cursor-pointer w-8 h-8 ${
98 | k + 1 === page ? 'bg-[#344054] text-white' : 'text-gray-400'
99 | } inline-flex justify-center items-center text-sm font-medium rounded-full hover:bg-gray-800 hover:text-white`}
100 | aria-current='page'
101 | >
102 | {k + 1}
103 |
104 | ))}
105 | {posts?.numOfPages && page < posts?.numOfPages && (
106 | setPage((p) => p + 1)}
109 | >
110 | Next
111 | »
112 |
113 | )}
114 |
115 |
116 |
117 | )}
118 |
119 |
120 | );
121 | }
122 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/views/Settings/GeneralSettings.tsx:
--------------------------------------------------------------------------------
1 | import * as yup from 'yup';
2 | import { yupResolver } from '@hookform/resolvers/yup';
3 | import { useForm } from 'react-hook-form';
4 | import { useMutation, useQuery } from 'react-query';
5 | import { useEffect, useState } from 'react';
6 | import InlineError from '@/components/InlineError/InlineError';
7 | import Alert, { alertMsgType } from '@/components/Alert/Alert';
8 | import InputText from '@/components/Form/InputText/InputText';
9 | import { setGeneralSettings, getGeneralSettings } from '@/services/settings.service';
10 | import ToggleField from '@/components/Form/ToggleField/ToggleField';
11 | import { emptyStringToNull } from '@/utils/helpers';
12 | import Loader from '@/components/Loader/Loader';
13 |
14 | export type GeneralSettingsRequest = {
15 | my_plugin_disable?: boolean;
16 | my_plugin_hide_no_orders_text?: string;
17 | my_plugin_cookie_time?: number | null;
18 | my_plugin_min_ref_order?: number | null;
19 | my_plugin_cookie_remove?: boolean;
20 | my_plugin_allow_guests?: boolean;
21 | my_plugin_hide_no_orders?: boolean;
22 | my_plugin_referral_codes?: boolean;
23 | my_plugin_subscription?: boolean;
24 | my_plugin_subscription_all_coupons?: boolean;
25 | my_plugin_subscription_exclude_shipping?: boolean;
26 | };
27 |
28 | const schema = yup
29 | .object()
30 | .shape({
31 | my_plugin_disable: yup.boolean().optional(),
32 | my_plugin_hide_no_orders_text: yup.string(),
33 | my_plugin_cookie_time: yup.number().transform(emptyStringToNull).nullable(),
34 | my_plugin_min_ref_order: yup.number().transform(emptyStringToNull).nullable(),
35 | my_plugin_cookie_remove: yup.boolean().optional(),
36 | my_plugin_allow_guests: yup.boolean().optional(),
37 | my_plugin_hide_no_orders: yup.boolean().optional(),
38 | my_plugin_referral_codes: yup.boolean().optional(),
39 | my_plugin_subscription: yup.boolean().optional(),
40 | my_plugin_subscription_all_coupons: yup.boolean().optional(),
41 | my_plugin_subscription_exclude_shipping: yup.boolean().optional(),
42 | })
43 | .required();
44 |
45 | export default function GeneralSettings() {
46 | const [expand, setExpand] = useState(false);
47 | const [error, setError] = useState('');
48 |
49 | const {
50 | register,
51 | handleSubmit,
52 | reset,
53 | formState: { errors },
54 | } = useForm({
55 | resolver: yupResolver(schema),
56 | });
57 |
58 | const { data: generalSettings, isLoading } = useQuery('wpgens-general-settings', getGeneralSettings);
59 |
60 | const {
61 | isSuccess,
62 | isLoading: submitLoading,
63 | mutate,
64 | } = useMutation void>(setGeneralSettings, {
65 | onSuccess: () => {},
66 | onError: (err: unknown) => {
67 | if (err instanceof Error) {
68 | setError(err?.message);
69 | } else {
70 | setError('Something went wrong. Please try again or contact support.');
71 | }
72 | },
73 | });
74 |
75 | useEffect(() => {
76 | if (generalSettings && !Array.isArray(generalSettings)) {
77 | reset(generalSettings);
78 | }
79 | }, [generalSettings]);
80 |
81 | if (isLoading) {
82 | return (
83 |
84 |
85 |
Loading Screen...
86 |
87 | );
88 | }
89 |
90 | return (
91 |
232 | );
233 | }
234 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/views/Users/Users.tsx:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-unused-vars */
2 | /* eslint-disable @typescript-eslint/no-explicit-any */
3 | import { useMutation } from 'react-query';
4 | import { useEffect, useState } from 'react';
5 | import Loader from '@/components/Loader/Loader';
6 | import { CustomerRequest, CustomersResponse, getCustomersService } from '@/services/users.service';
7 |
8 | const options = [
9 | {
10 | id: '30',
11 | name: '30 Days',
12 | },
13 | {
14 | id: '90',
15 | name: '90 Days',
16 | },
17 | {
18 | id: '180',
19 | name: '6 Months',
20 | },
21 | {
22 | id: '365',
23 | name: '12 Months',
24 | },
25 | {
26 | id: '1825',
27 | name: '5 Years (slow query)',
28 | },
29 | ];
30 |
31 | export default function Users() {
32 | const [customers, setCustomers] = useState();
33 | const [days, setDays] = useState('90');
34 |
35 | // Had to go with client side navigation.
36 | const [page, setPage] = useState(1);
37 | const totalPages = Math.ceil((customers?.data.length || 0) / 10);
38 |
39 | const { isLoading, mutate } = useMutation void>({
40 | mutationFn: getCustomersService,
41 | mutationKey: 'customers',
42 | onSuccess: (response: CustomersResponse) => {
43 | setCustomers(response);
44 | },
45 | onError: (err: unknown) => {
46 | console.log('ee', err);
47 | },
48 | });
49 |
50 | useEffect(() => {
51 | if (page) {
52 | mutate({ days });
53 | }
54 | }, [days]);
55 |
56 | return (
57 |
58 |
80 |
81 | {isLoading ? (
82 |
83 | ) : (
84 |
85 |
86 |
87 |
88 |
89 | Name
90 |
91 |
92 | Email
93 |
94 |
95 | Registration Date
96 |
97 |
98 | Role
99 |
100 |
101 |
102 |
103 |
104 | {customers?.data.slice(page * 10 - 10, page * 10).map((customer, k) => (
105 |
106 |
107 | {customer.user_name ? customer.user_name : '-'}
108 |
109 |
110 |
115 | {customer.user_email}
116 |
117 |
118 |
119 | {customer.raf_code}
120 |
121 |
122 | {customer.num_of_orders}
123 |
124 |
125 | ))}
126 |
127 |
128 |
129 |
130 | {page > 1 && (
131 | setPage((p) => p - 1)}
134 | >
135 | «
136 | Previous
137 |
138 | )}
139 | {[...Array(totalPages).keys()]
140 | .filter((k) => k < page + 3 && k > page - 3)
141 | .map((k) => (
142 | setPage(k + 1)}
145 | className={`cursor-pointer w-8 h-8 ${
146 | k + 1 === page ? 'bg-[#344054] text-white' : 'text-gray-400'
147 | } inline-flex justify-center items-center text-sm font-medium rounded-full hover:bg-gray-800 hover:text-white`}
148 | aria-current='page'
149 | >
150 | {k + 1}
151 |
152 | ))}
153 | {totalPages > 0 && page < totalPages && (
154 | setPage((p) => p + 1)}
157 | >
158 | Next
159 | »
160 |
161 | )}
162 |
163 |
164 |
165 | )}
166 |
167 |
168 | );
169 | }
170 |
--------------------------------------------------------------------------------
/includes/admin/backend/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/includes/admin/backend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ['./src/**/*.{js,ts,jsx,tsx}'],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/includes/admin/backend/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true,
22 | "noImplicitAny": false,
23 |
24 | "paths": {
25 | "@/*": ["./src/*"]
26 | }
27 | },
28 | "include": ["src"],
29 | "references": [{ "path": "./tsconfig.node.json" }]
30 | }
31 |
--------------------------------------------------------------------------------
/includes/admin/backend/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true
8 | },
9 | "include": ["vite.config.ts"]
10 | }
11 |
--------------------------------------------------------------------------------
/includes/admin/backend/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import react from '@vitejs/plugin-react';
3 | import tsconfigPaths from 'vite-tsconfig-paths';
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig({
7 | plugins: [react(), tsconfigPaths()],
8 | build: {
9 | rollupOptions: {
10 | output: {
11 | entryFileNames: `[name].js`, // No need for hash, you have plugin version to deal with caching.
12 | chunkFileNames: `[name].js`, // No need for hash, you have plugin version to deal with caching.
13 | assetFileNames: `[name].[ext]`, // No need for hash, you have plugin version to deal with caching.
14 | dir: `../assets/js`, // This is assets folder one directory below backend folder.
15 | manualChunks: undefined, // We want single JS file. By default its split into index and vendor.
16 | format: 'iife', // We need iife or else globals will clash with WordPress global variables!
17 | },
18 | },
19 | },
20 | server: {
21 | port: 5178, // Port running our app, its hardcoded under the class-wp-react-admin-panel-assets.php
22 | },
23 | });
24 |
--------------------------------------------------------------------------------
/includes/admin/class-wp-react-admin-panel-api.php:
--------------------------------------------------------------------------------
1 | 'GET',
28 | 'callback' => array($this, 'get_settings'),
29 | 'permission_callback' => array($this, 'get_permission')
30 | ));
31 | register_rest_route(PLUGIN_NAME_REST_API_ROUTE, '/settings/', array(
32 | 'methods' => 'POST',
33 | 'callback' => array($this, 'set_settings'),
34 | 'permission_callback' => array($this, 'get_permission')
35 | ));
36 |
37 | // Posts Example
38 | register_rest_route(PLUGIN_NAME_REST_API_ROUTE, '/posts/(?P\d+)', array(
39 | 'methods' => 'GET',
40 | 'callback' => array($this, 'get_posts'),
41 | 'args' => array(
42 | 'page' => array(
43 | 'validate_callback' => function ($param, $request, $key) {
44 | return is_numeric($param);
45 | }
46 | ),
47 | ),
48 | 'permission_callback' => array($this, 'get_permission')
49 | ));
50 |
51 | // Licence example
52 | register_rest_route(PLUGIN_NAME_REST_API_ROUTE, '/license/', array(
53 | 'methods' => 'GET',
54 | 'callback' => array($this, 'get_license'),
55 | 'permission_callback' => array($this, 'get_permission')
56 | ));
57 | });
58 | }
59 |
60 | /**
61 | *
62 | * Ensures only one instance is loaded or can be loaded.
63 | *
64 | * @since 1.0.0
65 | */
66 | public static function instance()
67 | {
68 | if (is_null(self::$_instance)) {
69 | self::$_instance = new self();
70 | }
71 | return self::$_instance;
72 | }
73 |
74 | private function allowed_html_settings()
75 | {
76 | return array();
77 | }
78 |
79 | private function registered_settings()
80 | {
81 |
82 | $prefix = 'my_plugin_';
83 | $options = array(
84 | $prefix . 'disable',
85 | $prefix . 'cookie_time',
86 | $prefix . 'min_ref_order',
87 | $prefix . 'cookie_remove',
88 | $prefix . 'allow_guests',
89 | $prefix . 'hide_no_orders',
90 | $prefix . 'hide_no_orders_text',
91 | $prefix . 'referral_codes',
92 | $prefix . 'subscription',
93 | $prefix . 'subscription_all_coupons',
94 | $prefix . 'subscription_exclude_shipping',
95 | );
96 | return $options;
97 | }
98 |
99 | public function get_settings()
100 | {
101 | $result = [];
102 | foreach ($this->registered_settings() as $key) {
103 | if ($value = get_option($key)) {
104 | $result[$key] = $value;
105 | }
106 | }
107 |
108 | return new WP_REST_Response($result, 200);
109 | }
110 |
111 | public function set_settings($data)
112 | {
113 | $fields = $this->registered_settings();
114 | $allowed_html = $this->allowed_html_settings();
115 |
116 | $data = $data->get_params();
117 |
118 | foreach ($data as $key => $value) {
119 | if (in_array($key, $fields)) {
120 | $sanitized_data = in_array($key, $allowed_html) ? wp_kses_post($value) : sanitize_text_field($value);
121 | if (false === get_option($key)) {
122 | add_option($key, $sanitized_data);
123 | } else {
124 | update_option($key, $sanitized_data);
125 | }
126 | }
127 | }
128 |
129 | return new WP_REST_Response($data, 200);
130 | }
131 |
132 | /*
133 | Fetching posts example. You would have this in separate class most probably.
134 | */
135 | public function get_posts($request)
136 | {
137 | $params = $request->get_params();
138 | if (isset($params['page']) && is_numeric($params['page'])) {
139 | $page = intval($params['page']);
140 | $args = array(
141 | 'post_type' => 'post',
142 | 'posts_per_page' => 10,
143 | 'post_status' => 'publish',
144 | 'paged' => $page
145 | );
146 | $posts = [];
147 | $query = new WP_Query($args);
148 | $total_pages = $query->max_num_pages;
149 | foreach ($query->posts as $post) {
150 | $formatted_date = date('M d, Y', strtotime($post->post_date));
151 | $author_info = get_userdata($post->post_author);
152 |
153 | $posts[] = array(
154 | 'postID' => $post->ID,
155 | 'postName' => $post->post_title,
156 | 'postDate' => $formatted_date,
157 | 'postAuthor' => $author_info ? $author_info->display_name : 'Unknown Author',
158 | 'postStatus' => $post->post_status,
159 | );
160 | }
161 | $response = array('numOfPages' => $total_pages, 'data' => $posts);
162 | return new WP_REST_Response($response, 200);
163 | }
164 | return new WP_REST_Response(array('message' => 'Something went wrong!'), 403);
165 | }
166 |
167 | /*
168 | License example. You would have this in separate class most probably.
169 | */
170 | function get_license()
171 | {
172 | // You would fetch licence key here.
173 | $response = array("license_key" => "xxxxxx");
174 | return new WP_REST_Response($response, 200);
175 | }
176 |
177 | /**
178 | * Permission Callback
179 | **/
180 | public function get_permission()
181 | {
182 | if (current_user_can('administrator') || current_user_can('manage_woocommerce')) {
183 | return true;
184 | } else {
185 | return false;
186 | }
187 | }
188 |
189 | /**
190 | * Cloning is forbidden.
191 | *
192 | * @since 1.0.0
193 | */
194 | public function __clone()
195 | {
196 | _doing_it_wrong(__FUNCTION__, __('Cheatin’ huh?'), PLUGIN_NAME_VERSION);
197 | }
198 | }
199 |
200 | WP_React_Admin_Panel_API::instance();
201 |
--------------------------------------------------------------------------------
/includes/admin/class-wp-react-admin-panel-assets.php:
--------------------------------------------------------------------------------
1 | id;
27 |
28 | if ($screenID === "toplevel_page_plugin-name") {
29 | $apiNonce = wp_create_nonce('wp_rest');
30 | $root = rest_url(PLUGIN_NAME_REST_API_ROUTE . '/');
31 | $baseUrl = PLUGIN_NAME_URL; // can be used for assets
32 |
33 | if (defined('PLUGIN_NAME_DEV') && PLUGIN_NAME_DEV) {
34 | ?>
35 |
42 |
49 |
50 |
51 | $apiNonce,
59 | 'root' => $root,
60 | 'baseUrl' => $baseUrl,
61 | )
62 | );
63 | }
64 | }
65 | }
66 | }
67 |
68 | new WP_React_Admin_Panel_Assets();
69 |
--------------------------------------------------------------------------------
/includes/admin/class-wp-react-admin-panel-menu.php:
--------------------------------------------------------------------------------
1 | ";
42 | }
43 |
44 | /**
45 | * Plugin Settings Link on plugin page
46 | *
47 | * @since 1.0.0
48 | */
49 | function add_settings_link($links)
50 | {
51 | $settings = array(
52 | 'Settings ',
53 | );
54 | return array_merge($links, $settings);
55 | }
56 |
57 |
58 | /**
59 | * Plugin Documentation Link on plugin page
60 | *
61 | * @since 1.0.0
62 | */
63 | function docs_link($links)
64 | {
65 | $docs = array(
66 | 'Documentation ',
67 | );
68 | return array_merge($links, $docs);
69 | }
70 | }
71 |
72 | new WP_React_Admin_Panel_Menu();
73 |
--------------------------------------------------------------------------------
/wp-react-admin-panel.php:
--------------------------------------------------------------------------------
1 | define_constants();
28 | $this->includes();
29 | }
30 |
31 | private function includes()
32 | {
33 | if (is_admin()) {
34 | require_once(PLUGIN_NAME_ABSPATH . 'includes/admin/class-wp-react-admin-panel-menu.php');
35 | require_once(PLUGIN_NAME_ABSPATH . 'includes/admin/class-wp-react-admin-panel-assets.php');
36 | }
37 | require_once(PLUGIN_NAME_ABSPATH . 'includes/admin/class-wp-react-admin-panel-api.php');
38 | }
39 | /**
40 | * Define Plugin Constants.
41 | * @since 1.0
42 | */
43 | private function define_constants()
44 | {
45 | $this->define('PLUGIN_NAME_DEV', false);
46 | $this->define('PLUGIN_NAME_REST_API_ROUTE', 'plugin-name/v1');
47 | $this->define('PLUGIN_NAME_URL', plugin_dir_url(__FILE__));
48 | $this->define('PLUGIN_NAME_ABSPATH', dirname(__FILE__) . '/');
49 | $this->define('PLUGIN_NAME_VERSION', $this->get_version());
50 | }
51 |
52 | /**
53 | * Returns Plugin version for global
54 | * @since 1.0
55 | */
56 | private function get_version()
57 | {
58 | return $this->version;
59 | }
60 |
61 | /**
62 | * Define constant if not already set.
63 | *
64 | * @since 1.0
65 | * @param string $name
66 | * @param string|bool $value
67 | */
68 | private function define($name, $value)
69 | {
70 | if (!defined($name)) {
71 | define($name, $value);
72 | }
73 | }
74 |
75 | public static function get_instance()
76 | {
77 | if (null === self::$instance) {
78 | self::$instance = new self();
79 | }
80 | return self::$instance;
81 | }
82 | }
83 |
84 | WP_React_Admin_Panel::get_instance();
85 |
--------------------------------------------------------------------------------