├── .gitignore ├── README.md ├── composer.json ├── config └── permission_ui.php ├── lang ├── en │ └── permissions.php └── pt-BR │ └── permissions.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── postcss.config.js ├── public └── build │ ├── assets │ └── app.8012c57d.css │ └── manifest.json ├── resources ├── css │ └── app.css └── views │ ├── layout.blade.php │ ├── permissions │ ├── create.blade.php │ ├── edit.blade.php │ └── index.blade.php │ ├── roles │ ├── create.blade.php │ ├── edit.blade.php │ └── index.blade.php │ └── users │ ├── edit.blade.php │ └── index.blade.php ├── routes └── web.php ├── src ├── Controllers │ ├── Controller.php │ ├── PermissionController.php │ ├── RoleController.php │ └── UserController.php ├── Facades │ └── PermissionsUI.php └── PermissionsUIServiceProvider.php ├── tailwind.config.js ├── tests ├── Models │ └── User.php ├── PermissionsTest.php └── TestCase.php └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | composer.lock 2 | vendor/ 3 | node_modules/ 4 | tests/temp 5 | .idea 6 | .vscode 7 | .phpunit.result.cache 8 | .php-cs-fixer.cache 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Laravel Permission UI 2 | 3 | __Status update: package idea abandoned.__ 4 | 5 | __Unfortunately, it's not possible/easy to build this package as flexible as I was expecting, with different layouts for Tailwind/Bootstrap/whatever and auto-implementing all Spatie package features for all possible cases. So I decided not to pursue this idea further and focus on other projects.__ 6 | 7 | - - - - - 8 | 9 | This package will create a simple Dashboard for managing roles/permissions based on the [spatie/laravel-permission](https://github.com/spatie/laravel-permission) package. 10 | 11 | **Notice**: this is a very early version of the package, may be buggy. Please report issues. 12 | 13 | - - - - - 14 | 15 | ## Installation 16 | 17 | First, before installing this package, you need to have the `spatie/laravel-permission` installed and configured. 18 | 19 | ```sh 20 | composer require laraveldaily/laravel-permission-ui 21 | ``` 22 | 23 | Go to `yourdomain.com/permissions` and you should see a simple dashboard with three menu items on top: to manage roles, permissions and assign them to users. 24 | 25 | ![Spatie Permission UI](https://laraveldaily.com/uploads/2022/10/laravel-permission-ui.png) 26 | 27 | That dashboard is by default protected by the `auth` middleware, but you can configure it, by publishing the config: 28 | 29 | ```sh 30 | php artisan vendor:publish --provider="LaravelDaily\PermissionsUI\PermissionsUIServiceProvider" --tag="config" 31 | ``` 32 | 33 | And then edit the values in `config/permission_ui.php`: 34 | 35 | ```php 36 | return [ 37 | 'middleware' => ['web', 'auth'], 38 | 'url_prefix' => 'permissions', 39 | 'route_name_prefix' => 'permission_ui.', 40 | ]; 41 | ``` 42 | 43 | The visual design is based on simple Tailwind classes. 44 | At the moment, no visual customization options are available, but we may add them in the future, based on your ideas and feedback. 45 | 46 | --- 47 | 48 | ## Publishing translations 49 | 50 | If you wish to translate the package, you may publish the language files using: 51 | 52 | ```sh 53 | php artisan vendor:publish --provider="LaravelDaily\PermissionsUI\PermissionsUIServiceProvider" --tag="lang" 54 | ``` 55 | 56 | - - - - - 57 | 58 | ## Testing 59 | 60 | To run the package's unit tests, run the following command: 61 | 62 | ```sh 63 | vendor/bin/phpunit 64 | ``` 65 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laraveldaily/laravel-permission-ui", 3 | "description": "A Laravel package for adding UI for spatie/Laravel-permission package.", 4 | "type": "library", 5 | "homepage": "https://github.com/LaravelDaily/laravel-permission-ui", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Povilas Korop", 10 | "email": "povilas@laraveldaily.com" 11 | } 12 | ], 13 | "require": { 14 | "php": "^8.0", 15 | "spatie/laravel-permission": "^5.5" 16 | }, 17 | "require-dev": { 18 | "orchestra/testbench": "^7.0", 19 | "phpunit/phpunit": "^9.0" 20 | }, 21 | "autoload": { 22 | "psr-4": { 23 | "LaravelDaily\\PermissionsUI\\": "src/" 24 | } 25 | }, 26 | "autoload-dev": { 27 | "psr-4": { 28 | "LaravelDaily\\PermissionsUI\\Tests\\": "tests/" 29 | } 30 | }, 31 | "extra": { 32 | "laravel": { 33 | "providers": [ 34 | "LaravelDaily\\PermissionsUI\\PermissionsUIServiceProvider" 35 | ] 36 | } 37 | }, 38 | "scripts": { 39 | "test": "vendor/bin/phpunit" 40 | }, 41 | "minimum-stability": "dev", 42 | "prefer-stable": true, 43 | "version": "0.1.4" 44 | } 45 | -------------------------------------------------------------------------------- /config/permission_ui.php: -------------------------------------------------------------------------------- 1 | ['web', 'auth'], 5 | 'url_prefix' => 'permissions', 6 | 'route_name_prefix' => 'permission_ui.', 7 | ]; 8 | -------------------------------------------------------------------------------- /lang/en/permissions.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'create' => 'Create', 6 | 'edit' => 'Edit', 7 | 'delete' => 'Delete', 8 | 'save' => 'Save', 9 | 'no_records' => 'No records.', 10 | 'confirm_action' => 'Are you sure?', 11 | ], 12 | 13 | 'permissions' => [ 14 | 'title' => 'Permissions', 15 | 'fields' => [ 16 | 'id' => 'ID', 17 | 'name' => 'Name', 18 | 'created_at' => 'Created at', 19 | 'updated_at' => 'Updated at', 20 | ] 21 | ], 22 | 23 | 'roles' => [ 24 | 'title' => 'Roles', 25 | 'fields' => [ 26 | 'id' => 'ID', 27 | 'name' => 'Name', 28 | 'permissions' => 'Permissions', 29 | 'created_at' => 'Created at', 30 | 'updated_at' => 'Updated at', 31 | ] 32 | ], 33 | 34 | 'users' => [ 35 | 'title' => 'Users', 36 | 'fields' => [ 37 | 'id' => 'ID', 38 | 'name' => 'Name', 39 | 'email' => 'Email', 40 | 'roles' => 'Roles', 41 | 'created_at' => 'Created at', 42 | 'updated_at' => 'Updated at', 43 | ] 44 | ], 45 | ]; 46 | -------------------------------------------------------------------------------- /lang/pt-BR/permissions.php: -------------------------------------------------------------------------------- 1 | [ 5 | 'create' => 'Criar', 6 | 'edit' => 'Editar', 7 | 'delete' => 'Excluir', 8 | 'save' => 'Salvar', 9 | 'no_records' => 'Nenhum registro encontrado.', 10 | 'confirm_action' => 'Tem certeza?', 11 | ], 12 | 13 | 'permissions' => [ 14 | 'title' => 'Permissões', 15 | 'fields' => [ 16 | 'id' => 'ID', 17 | 'name' => 'Nome', 18 | 'created_at' => 'Criado em', 19 | 'updated_at' => 'Atualizado em', 20 | ] 21 | ], 22 | 23 | 'roles' => [ 24 | 'title' => 'Funções', 25 | 'fields' => [ 26 | 'id' => 'ID', 27 | 'name' => 'Nome', 28 | 'permissions' => 'Permissões', 29 | 'created_at' => 'Criado em', 30 | 'updated_at' => 'Atualizado em', 31 | ] 32 | ], 33 | 34 | 'users' => [ 35 | 'title' => 'Usuários', 36 | 'fields' => [ 37 | 'id' => 'ID', 38 | 'name' => 'Nome', 39 | 'email' => 'E-mail', 40 | 'roles' => 'Funções', 41 | 'created_at' => 'Criado em', 42 | 'updated_at' => 'Atualizado em', 43 | ] 44 | ], 45 | ]; 46 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "permissions-ui", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "autoprefixer": "^10.4.12", 9 | "laravel-vite-plugin": "^0.6.1", 10 | "postcss": "^8.4.17", 11 | "tailwindcss": "^3.1.8", 12 | "vite": "^3.1.7" 13 | } 14 | }, 15 | "node_modules/@esbuild/android-arm": { 16 | "version": "0.15.10", 17 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 18 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 19 | "cpu": [ 20 | "arm" 21 | ], 22 | "dev": true, 23 | "optional": true, 24 | "os": [ 25 | "android" 26 | ], 27 | "engines": { 28 | "node": ">=12" 29 | } 30 | }, 31 | "node_modules/@esbuild/linux-loong64": { 32 | "version": "0.15.10", 33 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 34 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 35 | "cpu": [ 36 | "loong64" 37 | ], 38 | "dev": true, 39 | "optional": true, 40 | "os": [ 41 | "linux" 42 | ], 43 | "engines": { 44 | "node": ">=12" 45 | } 46 | }, 47 | "node_modules/@nodelib/fs.scandir": { 48 | "version": "2.1.5", 49 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 50 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 51 | "dev": true, 52 | "dependencies": { 53 | "@nodelib/fs.stat": "2.0.5", 54 | "run-parallel": "^1.1.9" 55 | }, 56 | "engines": { 57 | "node": ">= 8" 58 | } 59 | }, 60 | "node_modules/@nodelib/fs.stat": { 61 | "version": "2.0.5", 62 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 63 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 64 | "dev": true, 65 | "engines": { 66 | "node": ">= 8" 67 | } 68 | }, 69 | "node_modules/@nodelib/fs.walk": { 70 | "version": "1.2.8", 71 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 72 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 73 | "dev": true, 74 | "dependencies": { 75 | "@nodelib/fs.scandir": "2.1.5", 76 | "fastq": "^1.6.0" 77 | }, 78 | "engines": { 79 | "node": ">= 8" 80 | } 81 | }, 82 | "node_modules/acorn": { 83 | "version": "7.4.1", 84 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 85 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 86 | "dev": true, 87 | "bin": { 88 | "acorn": "bin/acorn" 89 | }, 90 | "engines": { 91 | "node": ">=0.4.0" 92 | } 93 | }, 94 | "node_modules/acorn-node": { 95 | "version": "1.8.2", 96 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 97 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 98 | "dev": true, 99 | "dependencies": { 100 | "acorn": "^7.0.0", 101 | "acorn-walk": "^7.0.0", 102 | "xtend": "^4.0.2" 103 | } 104 | }, 105 | "node_modules/acorn-walk": { 106 | "version": "7.2.0", 107 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 108 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 109 | "dev": true, 110 | "engines": { 111 | "node": ">=0.4.0" 112 | } 113 | }, 114 | "node_modules/anymatch": { 115 | "version": "3.1.2", 116 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 117 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 118 | "dev": true, 119 | "dependencies": { 120 | "normalize-path": "^3.0.0", 121 | "picomatch": "^2.0.4" 122 | }, 123 | "engines": { 124 | "node": ">= 8" 125 | } 126 | }, 127 | "node_modules/arg": { 128 | "version": "5.0.2", 129 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 130 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 131 | "dev": true 132 | }, 133 | "node_modules/autoprefixer": { 134 | "version": "10.4.12", 135 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", 136 | "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", 137 | "dev": true, 138 | "funding": [ 139 | { 140 | "type": "opencollective", 141 | "url": "https://opencollective.com/postcss/" 142 | }, 143 | { 144 | "type": "tidelift", 145 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 146 | } 147 | ], 148 | "dependencies": { 149 | "browserslist": "^4.21.4", 150 | "caniuse-lite": "^1.0.30001407", 151 | "fraction.js": "^4.2.0", 152 | "normalize-range": "^0.1.2", 153 | "picocolors": "^1.0.0", 154 | "postcss-value-parser": "^4.2.0" 155 | }, 156 | "bin": { 157 | "autoprefixer": "bin/autoprefixer" 158 | }, 159 | "engines": { 160 | "node": "^10 || ^12 || >=14" 161 | }, 162 | "peerDependencies": { 163 | "postcss": "^8.1.0" 164 | } 165 | }, 166 | "node_modules/binary-extensions": { 167 | "version": "2.2.0", 168 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 169 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 170 | "dev": true, 171 | "engines": { 172 | "node": ">=8" 173 | } 174 | }, 175 | "node_modules/braces": { 176 | "version": "3.0.2", 177 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 178 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 179 | "dev": true, 180 | "dependencies": { 181 | "fill-range": "^7.0.1" 182 | }, 183 | "engines": { 184 | "node": ">=8" 185 | } 186 | }, 187 | "node_modules/browserslist": { 188 | "version": "4.21.4", 189 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 190 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 191 | "dev": true, 192 | "funding": [ 193 | { 194 | "type": "opencollective", 195 | "url": "https://opencollective.com/browserslist" 196 | }, 197 | { 198 | "type": "tidelift", 199 | "url": "https://tidelift.com/funding/github/npm/browserslist" 200 | } 201 | ], 202 | "dependencies": { 203 | "caniuse-lite": "^1.0.30001400", 204 | "electron-to-chromium": "^1.4.251", 205 | "node-releases": "^2.0.6", 206 | "update-browserslist-db": "^1.0.9" 207 | }, 208 | "bin": { 209 | "browserslist": "cli.js" 210 | }, 211 | "engines": { 212 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 213 | } 214 | }, 215 | "node_modules/camelcase-css": { 216 | "version": "2.0.1", 217 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 218 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 219 | "dev": true, 220 | "engines": { 221 | "node": ">= 6" 222 | } 223 | }, 224 | "node_modules/caniuse-lite": { 225 | "version": "1.0.30001418", 226 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", 227 | "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", 228 | "dev": true, 229 | "funding": [ 230 | { 231 | "type": "opencollective", 232 | "url": "https://opencollective.com/browserslist" 233 | }, 234 | { 235 | "type": "tidelift", 236 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 237 | } 238 | ] 239 | }, 240 | "node_modules/chokidar": { 241 | "version": "3.5.3", 242 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 243 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 244 | "dev": true, 245 | "funding": [ 246 | { 247 | "type": "individual", 248 | "url": "https://paulmillr.com/funding/" 249 | } 250 | ], 251 | "dependencies": { 252 | "anymatch": "~3.1.2", 253 | "braces": "~3.0.2", 254 | "glob-parent": "~5.1.2", 255 | "is-binary-path": "~2.1.0", 256 | "is-glob": "~4.0.1", 257 | "normalize-path": "~3.0.0", 258 | "readdirp": "~3.6.0" 259 | }, 260 | "engines": { 261 | "node": ">= 8.10.0" 262 | }, 263 | "optionalDependencies": { 264 | "fsevents": "~2.3.2" 265 | } 266 | }, 267 | "node_modules/chokidar/node_modules/glob-parent": { 268 | "version": "5.1.2", 269 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 270 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 271 | "dev": true, 272 | "dependencies": { 273 | "is-glob": "^4.0.1" 274 | }, 275 | "engines": { 276 | "node": ">= 6" 277 | } 278 | }, 279 | "node_modules/color-name": { 280 | "version": "1.1.4", 281 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 282 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 283 | "dev": true 284 | }, 285 | "node_modules/cssesc": { 286 | "version": "3.0.0", 287 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 288 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 289 | "dev": true, 290 | "bin": { 291 | "cssesc": "bin/cssesc" 292 | }, 293 | "engines": { 294 | "node": ">=4" 295 | } 296 | }, 297 | "node_modules/defined": { 298 | "version": "1.0.0", 299 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 300 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 301 | "dev": true 302 | }, 303 | "node_modules/detective": { 304 | "version": "5.2.1", 305 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 306 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 307 | "dev": true, 308 | "dependencies": { 309 | "acorn-node": "^1.8.2", 310 | "defined": "^1.0.0", 311 | "minimist": "^1.2.6" 312 | }, 313 | "bin": { 314 | "detective": "bin/detective.js" 315 | }, 316 | "engines": { 317 | "node": ">=0.8.0" 318 | } 319 | }, 320 | "node_modules/didyoumean": { 321 | "version": "1.2.2", 322 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 323 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 324 | "dev": true 325 | }, 326 | "node_modules/dlv": { 327 | "version": "1.1.3", 328 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 329 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 330 | "dev": true 331 | }, 332 | "node_modules/electron-to-chromium": { 333 | "version": "1.4.279", 334 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.279.tgz", 335 | "integrity": "sha512-xs7vEuSZ84+JsHSTFqqG0TE3i8EAivHomRQZhhcRvsmnjsh5C2KdhwNKf4ZRYtzq75wojpFyqb62m32Oam57wA==", 336 | "dev": true 337 | }, 338 | "node_modules/esbuild": { 339 | "version": "0.15.10", 340 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 341 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 342 | "dev": true, 343 | "hasInstallScript": true, 344 | "bin": { 345 | "esbuild": "bin/esbuild" 346 | }, 347 | "engines": { 348 | "node": ">=12" 349 | }, 350 | "optionalDependencies": { 351 | "@esbuild/android-arm": "0.15.10", 352 | "@esbuild/linux-loong64": "0.15.10", 353 | "esbuild-android-64": "0.15.10", 354 | "esbuild-android-arm64": "0.15.10", 355 | "esbuild-darwin-64": "0.15.10", 356 | "esbuild-darwin-arm64": "0.15.10", 357 | "esbuild-freebsd-64": "0.15.10", 358 | "esbuild-freebsd-arm64": "0.15.10", 359 | "esbuild-linux-32": "0.15.10", 360 | "esbuild-linux-64": "0.15.10", 361 | "esbuild-linux-arm": "0.15.10", 362 | "esbuild-linux-arm64": "0.15.10", 363 | "esbuild-linux-mips64le": "0.15.10", 364 | "esbuild-linux-ppc64le": "0.15.10", 365 | "esbuild-linux-riscv64": "0.15.10", 366 | "esbuild-linux-s390x": "0.15.10", 367 | "esbuild-netbsd-64": "0.15.10", 368 | "esbuild-openbsd-64": "0.15.10", 369 | "esbuild-sunos-64": "0.15.10", 370 | "esbuild-windows-32": "0.15.10", 371 | "esbuild-windows-64": "0.15.10", 372 | "esbuild-windows-arm64": "0.15.10" 373 | } 374 | }, 375 | "node_modules/esbuild-android-64": { 376 | "version": "0.15.10", 377 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 378 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 379 | "cpu": [ 380 | "x64" 381 | ], 382 | "dev": true, 383 | "optional": true, 384 | "os": [ 385 | "android" 386 | ], 387 | "engines": { 388 | "node": ">=12" 389 | } 390 | }, 391 | "node_modules/esbuild-android-arm64": { 392 | "version": "0.15.10", 393 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 394 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 395 | "cpu": [ 396 | "arm64" 397 | ], 398 | "dev": true, 399 | "optional": true, 400 | "os": [ 401 | "android" 402 | ], 403 | "engines": { 404 | "node": ">=12" 405 | } 406 | }, 407 | "node_modules/esbuild-darwin-64": { 408 | "version": "0.15.10", 409 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 410 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 411 | "cpu": [ 412 | "x64" 413 | ], 414 | "dev": true, 415 | "optional": true, 416 | "os": [ 417 | "darwin" 418 | ], 419 | "engines": { 420 | "node": ">=12" 421 | } 422 | }, 423 | "node_modules/esbuild-darwin-arm64": { 424 | "version": "0.15.10", 425 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 426 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 427 | "cpu": [ 428 | "arm64" 429 | ], 430 | "dev": true, 431 | "optional": true, 432 | "os": [ 433 | "darwin" 434 | ], 435 | "engines": { 436 | "node": ">=12" 437 | } 438 | }, 439 | "node_modules/esbuild-freebsd-64": { 440 | "version": "0.15.10", 441 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 442 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 443 | "cpu": [ 444 | "x64" 445 | ], 446 | "dev": true, 447 | "optional": true, 448 | "os": [ 449 | "freebsd" 450 | ], 451 | "engines": { 452 | "node": ">=12" 453 | } 454 | }, 455 | "node_modules/esbuild-freebsd-arm64": { 456 | "version": "0.15.10", 457 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 458 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 459 | "cpu": [ 460 | "arm64" 461 | ], 462 | "dev": true, 463 | "optional": true, 464 | "os": [ 465 | "freebsd" 466 | ], 467 | "engines": { 468 | "node": ">=12" 469 | } 470 | }, 471 | "node_modules/esbuild-linux-32": { 472 | "version": "0.15.10", 473 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 474 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 475 | "cpu": [ 476 | "ia32" 477 | ], 478 | "dev": true, 479 | "optional": true, 480 | "os": [ 481 | "linux" 482 | ], 483 | "engines": { 484 | "node": ">=12" 485 | } 486 | }, 487 | "node_modules/esbuild-linux-64": { 488 | "version": "0.15.10", 489 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 490 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 491 | "cpu": [ 492 | "x64" 493 | ], 494 | "dev": true, 495 | "optional": true, 496 | "os": [ 497 | "linux" 498 | ], 499 | "engines": { 500 | "node": ">=12" 501 | } 502 | }, 503 | "node_modules/esbuild-linux-arm": { 504 | "version": "0.15.10", 505 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 506 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 507 | "cpu": [ 508 | "arm" 509 | ], 510 | "dev": true, 511 | "optional": true, 512 | "os": [ 513 | "linux" 514 | ], 515 | "engines": { 516 | "node": ">=12" 517 | } 518 | }, 519 | "node_modules/esbuild-linux-arm64": { 520 | "version": "0.15.10", 521 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 522 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 523 | "cpu": [ 524 | "arm64" 525 | ], 526 | "dev": true, 527 | "optional": true, 528 | "os": [ 529 | "linux" 530 | ], 531 | "engines": { 532 | "node": ">=12" 533 | } 534 | }, 535 | "node_modules/esbuild-linux-mips64le": { 536 | "version": "0.15.10", 537 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 538 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 539 | "cpu": [ 540 | "mips64el" 541 | ], 542 | "dev": true, 543 | "optional": true, 544 | "os": [ 545 | "linux" 546 | ], 547 | "engines": { 548 | "node": ">=12" 549 | } 550 | }, 551 | "node_modules/esbuild-linux-ppc64le": { 552 | "version": "0.15.10", 553 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 554 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 555 | "cpu": [ 556 | "ppc64" 557 | ], 558 | "dev": true, 559 | "optional": true, 560 | "os": [ 561 | "linux" 562 | ], 563 | "engines": { 564 | "node": ">=12" 565 | } 566 | }, 567 | "node_modules/esbuild-linux-riscv64": { 568 | "version": "0.15.10", 569 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 570 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 571 | "cpu": [ 572 | "riscv64" 573 | ], 574 | "dev": true, 575 | "optional": true, 576 | "os": [ 577 | "linux" 578 | ], 579 | "engines": { 580 | "node": ">=12" 581 | } 582 | }, 583 | "node_modules/esbuild-linux-s390x": { 584 | "version": "0.15.10", 585 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 586 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 587 | "cpu": [ 588 | "s390x" 589 | ], 590 | "dev": true, 591 | "optional": true, 592 | "os": [ 593 | "linux" 594 | ], 595 | "engines": { 596 | "node": ">=12" 597 | } 598 | }, 599 | "node_modules/esbuild-netbsd-64": { 600 | "version": "0.15.10", 601 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 602 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 603 | "cpu": [ 604 | "x64" 605 | ], 606 | "dev": true, 607 | "optional": true, 608 | "os": [ 609 | "netbsd" 610 | ], 611 | "engines": { 612 | "node": ">=12" 613 | } 614 | }, 615 | "node_modules/esbuild-openbsd-64": { 616 | "version": "0.15.10", 617 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 618 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 619 | "cpu": [ 620 | "x64" 621 | ], 622 | "dev": true, 623 | "optional": true, 624 | "os": [ 625 | "openbsd" 626 | ], 627 | "engines": { 628 | "node": ">=12" 629 | } 630 | }, 631 | "node_modules/esbuild-sunos-64": { 632 | "version": "0.15.10", 633 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 634 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 635 | "cpu": [ 636 | "x64" 637 | ], 638 | "dev": true, 639 | "optional": true, 640 | "os": [ 641 | "sunos" 642 | ], 643 | "engines": { 644 | "node": ">=12" 645 | } 646 | }, 647 | "node_modules/esbuild-windows-32": { 648 | "version": "0.15.10", 649 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 650 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 651 | "cpu": [ 652 | "ia32" 653 | ], 654 | "dev": true, 655 | "optional": true, 656 | "os": [ 657 | "win32" 658 | ], 659 | "engines": { 660 | "node": ">=12" 661 | } 662 | }, 663 | "node_modules/esbuild-windows-64": { 664 | "version": "0.15.10", 665 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 666 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 667 | "cpu": [ 668 | "x64" 669 | ], 670 | "dev": true, 671 | "optional": true, 672 | "os": [ 673 | "win32" 674 | ], 675 | "engines": { 676 | "node": ">=12" 677 | } 678 | }, 679 | "node_modules/esbuild-windows-arm64": { 680 | "version": "0.15.10", 681 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 682 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 683 | "cpu": [ 684 | "arm64" 685 | ], 686 | "dev": true, 687 | "optional": true, 688 | "os": [ 689 | "win32" 690 | ], 691 | "engines": { 692 | "node": ">=12" 693 | } 694 | }, 695 | "node_modules/escalade": { 696 | "version": "3.1.1", 697 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 698 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 699 | "dev": true, 700 | "engines": { 701 | "node": ">=6" 702 | } 703 | }, 704 | "node_modules/fast-glob": { 705 | "version": "3.2.12", 706 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 707 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 708 | "dev": true, 709 | "dependencies": { 710 | "@nodelib/fs.stat": "^2.0.2", 711 | "@nodelib/fs.walk": "^1.2.3", 712 | "glob-parent": "^5.1.2", 713 | "merge2": "^1.3.0", 714 | "micromatch": "^4.0.4" 715 | }, 716 | "engines": { 717 | "node": ">=8.6.0" 718 | } 719 | }, 720 | "node_modules/fast-glob/node_modules/glob-parent": { 721 | "version": "5.1.2", 722 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 723 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 724 | "dev": true, 725 | "dependencies": { 726 | "is-glob": "^4.0.1" 727 | }, 728 | "engines": { 729 | "node": ">= 6" 730 | } 731 | }, 732 | "node_modules/fastq": { 733 | "version": "1.13.0", 734 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 735 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 736 | "dev": true, 737 | "dependencies": { 738 | "reusify": "^1.0.4" 739 | } 740 | }, 741 | "node_modules/fill-range": { 742 | "version": "7.0.1", 743 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 744 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 745 | "dev": true, 746 | "dependencies": { 747 | "to-regex-range": "^5.0.1" 748 | }, 749 | "engines": { 750 | "node": ">=8" 751 | } 752 | }, 753 | "node_modules/fraction.js": { 754 | "version": "4.2.0", 755 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 756 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 757 | "dev": true, 758 | "engines": { 759 | "node": "*" 760 | }, 761 | "funding": { 762 | "type": "patreon", 763 | "url": "https://www.patreon.com/infusion" 764 | } 765 | }, 766 | "node_modules/fsevents": { 767 | "version": "2.3.2", 768 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 769 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 770 | "dev": true, 771 | "hasInstallScript": true, 772 | "optional": true, 773 | "os": [ 774 | "darwin" 775 | ], 776 | "engines": { 777 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 778 | } 779 | }, 780 | "node_modules/function-bind": { 781 | "version": "1.1.1", 782 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 783 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 784 | "dev": true 785 | }, 786 | "node_modules/glob-parent": { 787 | "version": "6.0.2", 788 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 789 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 790 | "dev": true, 791 | "dependencies": { 792 | "is-glob": "^4.0.3" 793 | }, 794 | "engines": { 795 | "node": ">=10.13.0" 796 | } 797 | }, 798 | "node_modules/has": { 799 | "version": "1.0.3", 800 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 801 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 802 | "dev": true, 803 | "dependencies": { 804 | "function-bind": "^1.1.1" 805 | }, 806 | "engines": { 807 | "node": ">= 0.4.0" 808 | } 809 | }, 810 | "node_modules/is-binary-path": { 811 | "version": "2.1.0", 812 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 813 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 814 | "dev": true, 815 | "dependencies": { 816 | "binary-extensions": "^2.0.0" 817 | }, 818 | "engines": { 819 | "node": ">=8" 820 | } 821 | }, 822 | "node_modules/is-core-module": { 823 | "version": "2.10.0", 824 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 825 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 826 | "dev": true, 827 | "dependencies": { 828 | "has": "^1.0.3" 829 | }, 830 | "funding": { 831 | "url": "https://github.com/sponsors/ljharb" 832 | } 833 | }, 834 | "node_modules/is-extglob": { 835 | "version": "2.1.1", 836 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 837 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 838 | "dev": true, 839 | "engines": { 840 | "node": ">=0.10.0" 841 | } 842 | }, 843 | "node_modules/is-glob": { 844 | "version": "4.0.3", 845 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 846 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 847 | "dev": true, 848 | "dependencies": { 849 | "is-extglob": "^2.1.1" 850 | }, 851 | "engines": { 852 | "node": ">=0.10.0" 853 | } 854 | }, 855 | "node_modules/is-number": { 856 | "version": "7.0.0", 857 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 858 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 859 | "dev": true, 860 | "engines": { 861 | "node": ">=0.12.0" 862 | } 863 | }, 864 | "node_modules/laravel-vite-plugin": { 865 | "version": "0.6.1", 866 | "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.6.1.tgz", 867 | "integrity": "sha512-L8zt+bttm6+C0mo3an5J8wRW03SsjbTEouGb3bH2jj/XclFVAX/xEUkG9efhdRHjbEH5RY6cmdJ7bmf7zqjwIQ==", 868 | "dev": true, 869 | "dependencies": { 870 | "vite-plugin-full-reload": "^1.0.1" 871 | }, 872 | "engines": { 873 | "node": ">=14" 874 | }, 875 | "peerDependencies": { 876 | "vite": "^3.0.0" 877 | } 878 | }, 879 | "node_modules/lilconfig": { 880 | "version": "2.0.6", 881 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 882 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 883 | "dev": true, 884 | "engines": { 885 | "node": ">=10" 886 | } 887 | }, 888 | "node_modules/merge2": { 889 | "version": "1.4.1", 890 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 891 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 892 | "dev": true, 893 | "engines": { 894 | "node": ">= 8" 895 | } 896 | }, 897 | "node_modules/micromatch": { 898 | "version": "4.0.5", 899 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 900 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 901 | "dev": true, 902 | "dependencies": { 903 | "braces": "^3.0.2", 904 | "picomatch": "^2.3.1" 905 | }, 906 | "engines": { 907 | "node": ">=8.6" 908 | } 909 | }, 910 | "node_modules/minimist": { 911 | "version": "1.2.7", 912 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 913 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 914 | "dev": true, 915 | "funding": { 916 | "url": "https://github.com/sponsors/ljharb" 917 | } 918 | }, 919 | "node_modules/nanoid": { 920 | "version": "3.3.4", 921 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 922 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 923 | "dev": true, 924 | "bin": { 925 | "nanoid": "bin/nanoid.cjs" 926 | }, 927 | "engines": { 928 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 929 | } 930 | }, 931 | "node_modules/node-releases": { 932 | "version": "2.0.6", 933 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 934 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 935 | "dev": true 936 | }, 937 | "node_modules/normalize-path": { 938 | "version": "3.0.0", 939 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 940 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 941 | "dev": true, 942 | "engines": { 943 | "node": ">=0.10.0" 944 | } 945 | }, 946 | "node_modules/normalize-range": { 947 | "version": "0.1.2", 948 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 949 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 950 | "dev": true, 951 | "engines": { 952 | "node": ">=0.10.0" 953 | } 954 | }, 955 | "node_modules/object-hash": { 956 | "version": "3.0.0", 957 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 958 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 959 | "dev": true, 960 | "engines": { 961 | "node": ">= 6" 962 | } 963 | }, 964 | "node_modules/path-parse": { 965 | "version": "1.0.7", 966 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 967 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 968 | "dev": true 969 | }, 970 | "node_modules/picocolors": { 971 | "version": "1.0.0", 972 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 973 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 974 | "dev": true 975 | }, 976 | "node_modules/picomatch": { 977 | "version": "2.3.1", 978 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 979 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 980 | "dev": true, 981 | "engines": { 982 | "node": ">=8.6" 983 | }, 984 | "funding": { 985 | "url": "https://github.com/sponsors/jonschlinkert" 986 | } 987 | }, 988 | "node_modules/pify": { 989 | "version": "2.3.0", 990 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 991 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 992 | "dev": true, 993 | "engines": { 994 | "node": ">=0.10.0" 995 | } 996 | }, 997 | "node_modules/postcss": { 998 | "version": "8.4.17", 999 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", 1000 | "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", 1001 | "dev": true, 1002 | "funding": [ 1003 | { 1004 | "type": "opencollective", 1005 | "url": "https://opencollective.com/postcss/" 1006 | }, 1007 | { 1008 | "type": "tidelift", 1009 | "url": "https://tidelift.com/funding/github/npm/postcss" 1010 | } 1011 | ], 1012 | "dependencies": { 1013 | "nanoid": "^3.3.4", 1014 | "picocolors": "^1.0.0", 1015 | "source-map-js": "^1.0.2" 1016 | }, 1017 | "engines": { 1018 | "node": "^10 || ^12 || >=14" 1019 | } 1020 | }, 1021 | "node_modules/postcss-import": { 1022 | "version": "14.1.0", 1023 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 1024 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "postcss-value-parser": "^4.0.0", 1028 | "read-cache": "^1.0.0", 1029 | "resolve": "^1.1.7" 1030 | }, 1031 | "engines": { 1032 | "node": ">=10.0.0" 1033 | }, 1034 | "peerDependencies": { 1035 | "postcss": "^8.0.0" 1036 | } 1037 | }, 1038 | "node_modules/postcss-js": { 1039 | "version": "4.0.0", 1040 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 1041 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "camelcase-css": "^2.0.1" 1045 | }, 1046 | "engines": { 1047 | "node": "^12 || ^14 || >= 16" 1048 | }, 1049 | "funding": { 1050 | "type": "opencollective", 1051 | "url": "https://opencollective.com/postcss/" 1052 | }, 1053 | "peerDependencies": { 1054 | "postcss": "^8.3.3" 1055 | } 1056 | }, 1057 | "node_modules/postcss-load-config": { 1058 | "version": "3.1.4", 1059 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 1060 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 1061 | "dev": true, 1062 | "dependencies": { 1063 | "lilconfig": "^2.0.5", 1064 | "yaml": "^1.10.2" 1065 | }, 1066 | "engines": { 1067 | "node": ">= 10" 1068 | }, 1069 | "funding": { 1070 | "type": "opencollective", 1071 | "url": "https://opencollective.com/postcss/" 1072 | }, 1073 | "peerDependencies": { 1074 | "postcss": ">=8.0.9", 1075 | "ts-node": ">=9.0.0" 1076 | }, 1077 | "peerDependenciesMeta": { 1078 | "postcss": { 1079 | "optional": true 1080 | }, 1081 | "ts-node": { 1082 | "optional": true 1083 | } 1084 | } 1085 | }, 1086 | "node_modules/postcss-nested": { 1087 | "version": "5.0.6", 1088 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 1089 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "postcss-selector-parser": "^6.0.6" 1093 | }, 1094 | "engines": { 1095 | "node": ">=12.0" 1096 | }, 1097 | "funding": { 1098 | "type": "opencollective", 1099 | "url": "https://opencollective.com/postcss/" 1100 | }, 1101 | "peerDependencies": { 1102 | "postcss": "^8.2.14" 1103 | } 1104 | }, 1105 | "node_modules/postcss-selector-parser": { 1106 | "version": "6.0.10", 1107 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 1108 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "cssesc": "^3.0.0", 1112 | "util-deprecate": "^1.0.2" 1113 | }, 1114 | "engines": { 1115 | "node": ">=4" 1116 | } 1117 | }, 1118 | "node_modules/postcss-value-parser": { 1119 | "version": "4.2.0", 1120 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1121 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1122 | "dev": true 1123 | }, 1124 | "node_modules/queue-microtask": { 1125 | "version": "1.2.3", 1126 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1127 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1128 | "dev": true, 1129 | "funding": [ 1130 | { 1131 | "type": "github", 1132 | "url": "https://github.com/sponsors/feross" 1133 | }, 1134 | { 1135 | "type": "patreon", 1136 | "url": "https://www.patreon.com/feross" 1137 | }, 1138 | { 1139 | "type": "consulting", 1140 | "url": "https://feross.org/support" 1141 | } 1142 | ] 1143 | }, 1144 | "node_modules/quick-lru": { 1145 | "version": "5.1.1", 1146 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1147 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1148 | "dev": true, 1149 | "engines": { 1150 | "node": ">=10" 1151 | }, 1152 | "funding": { 1153 | "url": "https://github.com/sponsors/sindresorhus" 1154 | } 1155 | }, 1156 | "node_modules/read-cache": { 1157 | "version": "1.0.0", 1158 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1159 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1160 | "dev": true, 1161 | "dependencies": { 1162 | "pify": "^2.3.0" 1163 | } 1164 | }, 1165 | "node_modules/readdirp": { 1166 | "version": "3.6.0", 1167 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1168 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1169 | "dev": true, 1170 | "dependencies": { 1171 | "picomatch": "^2.2.1" 1172 | }, 1173 | "engines": { 1174 | "node": ">=8.10.0" 1175 | } 1176 | }, 1177 | "node_modules/resolve": { 1178 | "version": "1.22.1", 1179 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1180 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1181 | "dev": true, 1182 | "dependencies": { 1183 | "is-core-module": "^2.9.0", 1184 | "path-parse": "^1.0.7", 1185 | "supports-preserve-symlinks-flag": "^1.0.0" 1186 | }, 1187 | "bin": { 1188 | "resolve": "bin/resolve" 1189 | }, 1190 | "funding": { 1191 | "url": "https://github.com/sponsors/ljharb" 1192 | } 1193 | }, 1194 | "node_modules/reusify": { 1195 | "version": "1.0.4", 1196 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1197 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1198 | "dev": true, 1199 | "engines": { 1200 | "iojs": ">=1.0.0", 1201 | "node": ">=0.10.0" 1202 | } 1203 | }, 1204 | "node_modules/rollup": { 1205 | "version": "2.78.1", 1206 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 1207 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 1208 | "dev": true, 1209 | "bin": { 1210 | "rollup": "dist/bin/rollup" 1211 | }, 1212 | "engines": { 1213 | "node": ">=10.0.0" 1214 | }, 1215 | "optionalDependencies": { 1216 | "fsevents": "~2.3.2" 1217 | } 1218 | }, 1219 | "node_modules/run-parallel": { 1220 | "version": "1.2.0", 1221 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1222 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1223 | "dev": true, 1224 | "funding": [ 1225 | { 1226 | "type": "github", 1227 | "url": "https://github.com/sponsors/feross" 1228 | }, 1229 | { 1230 | "type": "patreon", 1231 | "url": "https://www.patreon.com/feross" 1232 | }, 1233 | { 1234 | "type": "consulting", 1235 | "url": "https://feross.org/support" 1236 | } 1237 | ], 1238 | "dependencies": { 1239 | "queue-microtask": "^1.2.2" 1240 | } 1241 | }, 1242 | "node_modules/source-map-js": { 1243 | "version": "1.0.2", 1244 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1245 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1246 | "dev": true, 1247 | "engines": { 1248 | "node": ">=0.10.0" 1249 | } 1250 | }, 1251 | "node_modules/supports-preserve-symlinks-flag": { 1252 | "version": "1.0.0", 1253 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1254 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1255 | "dev": true, 1256 | "engines": { 1257 | "node": ">= 0.4" 1258 | }, 1259 | "funding": { 1260 | "url": "https://github.com/sponsors/ljharb" 1261 | } 1262 | }, 1263 | "node_modules/tailwindcss": { 1264 | "version": "3.1.8", 1265 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", 1266 | "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "arg": "^5.0.2", 1270 | "chokidar": "^3.5.3", 1271 | "color-name": "^1.1.4", 1272 | "detective": "^5.2.1", 1273 | "didyoumean": "^1.2.2", 1274 | "dlv": "^1.1.3", 1275 | "fast-glob": "^3.2.11", 1276 | "glob-parent": "^6.0.2", 1277 | "is-glob": "^4.0.3", 1278 | "lilconfig": "^2.0.6", 1279 | "normalize-path": "^3.0.0", 1280 | "object-hash": "^3.0.0", 1281 | "picocolors": "^1.0.0", 1282 | "postcss": "^8.4.14", 1283 | "postcss-import": "^14.1.0", 1284 | "postcss-js": "^4.0.0", 1285 | "postcss-load-config": "^3.1.4", 1286 | "postcss-nested": "5.0.6", 1287 | "postcss-selector-parser": "^6.0.10", 1288 | "postcss-value-parser": "^4.2.0", 1289 | "quick-lru": "^5.1.1", 1290 | "resolve": "^1.22.1" 1291 | }, 1292 | "bin": { 1293 | "tailwind": "lib/cli.js", 1294 | "tailwindcss": "lib/cli.js" 1295 | }, 1296 | "engines": { 1297 | "node": ">=12.13.0" 1298 | }, 1299 | "peerDependencies": { 1300 | "postcss": "^8.0.9" 1301 | } 1302 | }, 1303 | "node_modules/to-regex-range": { 1304 | "version": "5.0.1", 1305 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1306 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1307 | "dev": true, 1308 | "dependencies": { 1309 | "is-number": "^7.0.0" 1310 | }, 1311 | "engines": { 1312 | "node": ">=8.0" 1313 | } 1314 | }, 1315 | "node_modules/update-browserslist-db": { 1316 | "version": "1.0.10", 1317 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 1318 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 1319 | "dev": true, 1320 | "funding": [ 1321 | { 1322 | "type": "opencollective", 1323 | "url": "https://opencollective.com/browserslist" 1324 | }, 1325 | { 1326 | "type": "tidelift", 1327 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1328 | } 1329 | ], 1330 | "dependencies": { 1331 | "escalade": "^3.1.1", 1332 | "picocolors": "^1.0.0" 1333 | }, 1334 | "bin": { 1335 | "browserslist-lint": "cli.js" 1336 | }, 1337 | "peerDependencies": { 1338 | "browserslist": ">= 4.21.0" 1339 | } 1340 | }, 1341 | "node_modules/util-deprecate": { 1342 | "version": "1.0.2", 1343 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1344 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1345 | "dev": true 1346 | }, 1347 | "node_modules/vite": { 1348 | "version": "3.1.7", 1349 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", 1350 | "integrity": "sha512-5vCAmU4S8lyVdFCInu9M54f/g8qbOMakVw5xJ4pjoaDy5wgy9sLLZkGdSLN52dlsBqh0tBqxjaqqa8LgPqwRAA==", 1351 | "dev": true, 1352 | "dependencies": { 1353 | "esbuild": "^0.15.9", 1354 | "postcss": "^8.4.16", 1355 | "resolve": "^1.22.1", 1356 | "rollup": "~2.78.0" 1357 | }, 1358 | "bin": { 1359 | "vite": "bin/vite.js" 1360 | }, 1361 | "engines": { 1362 | "node": "^14.18.0 || >=16.0.0" 1363 | }, 1364 | "optionalDependencies": { 1365 | "fsevents": "~2.3.2" 1366 | }, 1367 | "peerDependencies": { 1368 | "less": "*", 1369 | "sass": "*", 1370 | "stylus": "*", 1371 | "terser": "^5.4.0" 1372 | }, 1373 | "peerDependenciesMeta": { 1374 | "less": { 1375 | "optional": true 1376 | }, 1377 | "sass": { 1378 | "optional": true 1379 | }, 1380 | "stylus": { 1381 | "optional": true 1382 | }, 1383 | "terser": { 1384 | "optional": true 1385 | } 1386 | } 1387 | }, 1388 | "node_modules/vite-plugin-full-reload": { 1389 | "version": "1.0.4", 1390 | "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.4.tgz", 1391 | "integrity": "sha512-9WejQII6zJ++m/YE173Zvl2jq4cqa404KNrVT+JDzDnqaGRq5UvOvA48fnsSWPIMXFV7S0dq5+sZqcSB+tKBgA==", 1392 | "dev": true, 1393 | "dependencies": { 1394 | "picocolors": "^1.0.0", 1395 | "picomatch": "^2.3.1" 1396 | }, 1397 | "peerDependencies": { 1398 | "vite": "^2 || ^3" 1399 | } 1400 | }, 1401 | "node_modules/xtend": { 1402 | "version": "4.0.2", 1403 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1404 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1405 | "dev": true, 1406 | "engines": { 1407 | "node": ">=0.4" 1408 | } 1409 | }, 1410 | "node_modules/yaml": { 1411 | "version": "1.10.2", 1412 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 1413 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 1414 | "dev": true, 1415 | "engines": { 1416 | "node": ">= 6" 1417 | } 1418 | } 1419 | }, 1420 | "dependencies": { 1421 | "@esbuild/android-arm": { 1422 | "version": "0.15.10", 1423 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 1424 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 1425 | "dev": true, 1426 | "optional": true 1427 | }, 1428 | "@esbuild/linux-loong64": { 1429 | "version": "0.15.10", 1430 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 1431 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 1432 | "dev": true, 1433 | "optional": true 1434 | }, 1435 | "@nodelib/fs.scandir": { 1436 | "version": "2.1.5", 1437 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1438 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1439 | "dev": true, 1440 | "requires": { 1441 | "@nodelib/fs.stat": "2.0.5", 1442 | "run-parallel": "^1.1.9" 1443 | } 1444 | }, 1445 | "@nodelib/fs.stat": { 1446 | "version": "2.0.5", 1447 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1448 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1449 | "dev": true 1450 | }, 1451 | "@nodelib/fs.walk": { 1452 | "version": "1.2.8", 1453 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1454 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1455 | "dev": true, 1456 | "requires": { 1457 | "@nodelib/fs.scandir": "2.1.5", 1458 | "fastq": "^1.6.0" 1459 | } 1460 | }, 1461 | "acorn": { 1462 | "version": "7.4.1", 1463 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1464 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1465 | "dev": true 1466 | }, 1467 | "acorn-node": { 1468 | "version": "1.8.2", 1469 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 1470 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 1471 | "dev": true, 1472 | "requires": { 1473 | "acorn": "^7.0.0", 1474 | "acorn-walk": "^7.0.0", 1475 | "xtend": "^4.0.2" 1476 | } 1477 | }, 1478 | "acorn-walk": { 1479 | "version": "7.2.0", 1480 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1481 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 1482 | "dev": true 1483 | }, 1484 | "anymatch": { 1485 | "version": "3.1.2", 1486 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1487 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1488 | "dev": true, 1489 | "requires": { 1490 | "normalize-path": "^3.0.0", 1491 | "picomatch": "^2.0.4" 1492 | } 1493 | }, 1494 | "arg": { 1495 | "version": "5.0.2", 1496 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1497 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1498 | "dev": true 1499 | }, 1500 | "autoprefixer": { 1501 | "version": "10.4.12", 1502 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", 1503 | "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", 1504 | "dev": true, 1505 | "requires": { 1506 | "browserslist": "^4.21.4", 1507 | "caniuse-lite": "^1.0.30001407", 1508 | "fraction.js": "^4.2.0", 1509 | "normalize-range": "^0.1.2", 1510 | "picocolors": "^1.0.0", 1511 | "postcss-value-parser": "^4.2.0" 1512 | } 1513 | }, 1514 | "binary-extensions": { 1515 | "version": "2.2.0", 1516 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1517 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1518 | "dev": true 1519 | }, 1520 | "braces": { 1521 | "version": "3.0.2", 1522 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1523 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1524 | "dev": true, 1525 | "requires": { 1526 | "fill-range": "^7.0.1" 1527 | } 1528 | }, 1529 | "browserslist": { 1530 | "version": "4.21.4", 1531 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 1532 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 1533 | "dev": true, 1534 | "requires": { 1535 | "caniuse-lite": "^1.0.30001400", 1536 | "electron-to-chromium": "^1.4.251", 1537 | "node-releases": "^2.0.6", 1538 | "update-browserslist-db": "^1.0.9" 1539 | } 1540 | }, 1541 | "camelcase-css": { 1542 | "version": "2.0.1", 1543 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1544 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1545 | "dev": true 1546 | }, 1547 | "caniuse-lite": { 1548 | "version": "1.0.30001418", 1549 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", 1550 | "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", 1551 | "dev": true 1552 | }, 1553 | "chokidar": { 1554 | "version": "3.5.3", 1555 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1556 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1557 | "dev": true, 1558 | "requires": { 1559 | "anymatch": "~3.1.2", 1560 | "braces": "~3.0.2", 1561 | "fsevents": "~2.3.2", 1562 | "glob-parent": "~5.1.2", 1563 | "is-binary-path": "~2.1.0", 1564 | "is-glob": "~4.0.1", 1565 | "normalize-path": "~3.0.0", 1566 | "readdirp": "~3.6.0" 1567 | }, 1568 | "dependencies": { 1569 | "glob-parent": { 1570 | "version": "5.1.2", 1571 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1572 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1573 | "dev": true, 1574 | "requires": { 1575 | "is-glob": "^4.0.1" 1576 | } 1577 | } 1578 | } 1579 | }, 1580 | "color-name": { 1581 | "version": "1.1.4", 1582 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1583 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1584 | "dev": true 1585 | }, 1586 | "cssesc": { 1587 | "version": "3.0.0", 1588 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1589 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1590 | "dev": true 1591 | }, 1592 | "defined": { 1593 | "version": "1.0.0", 1594 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 1595 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 1596 | "dev": true 1597 | }, 1598 | "detective": { 1599 | "version": "5.2.1", 1600 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 1601 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 1602 | "dev": true, 1603 | "requires": { 1604 | "acorn-node": "^1.8.2", 1605 | "defined": "^1.0.0", 1606 | "minimist": "^1.2.6" 1607 | } 1608 | }, 1609 | "didyoumean": { 1610 | "version": "1.2.2", 1611 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1612 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1613 | "dev": true 1614 | }, 1615 | "dlv": { 1616 | "version": "1.1.3", 1617 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1618 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1619 | "dev": true 1620 | }, 1621 | "electron-to-chromium": { 1622 | "version": "1.4.279", 1623 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.279.tgz", 1624 | "integrity": "sha512-xs7vEuSZ84+JsHSTFqqG0TE3i8EAivHomRQZhhcRvsmnjsh5C2KdhwNKf4ZRYtzq75wojpFyqb62m32Oam57wA==", 1625 | "dev": true 1626 | }, 1627 | "esbuild": { 1628 | "version": "0.15.10", 1629 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 1630 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 1631 | "dev": true, 1632 | "requires": { 1633 | "@esbuild/android-arm": "0.15.10", 1634 | "@esbuild/linux-loong64": "0.15.10", 1635 | "esbuild-android-64": "0.15.10", 1636 | "esbuild-android-arm64": "0.15.10", 1637 | "esbuild-darwin-64": "0.15.10", 1638 | "esbuild-darwin-arm64": "0.15.10", 1639 | "esbuild-freebsd-64": "0.15.10", 1640 | "esbuild-freebsd-arm64": "0.15.10", 1641 | "esbuild-linux-32": "0.15.10", 1642 | "esbuild-linux-64": "0.15.10", 1643 | "esbuild-linux-arm": "0.15.10", 1644 | "esbuild-linux-arm64": "0.15.10", 1645 | "esbuild-linux-mips64le": "0.15.10", 1646 | "esbuild-linux-ppc64le": "0.15.10", 1647 | "esbuild-linux-riscv64": "0.15.10", 1648 | "esbuild-linux-s390x": "0.15.10", 1649 | "esbuild-netbsd-64": "0.15.10", 1650 | "esbuild-openbsd-64": "0.15.10", 1651 | "esbuild-sunos-64": "0.15.10", 1652 | "esbuild-windows-32": "0.15.10", 1653 | "esbuild-windows-64": "0.15.10", 1654 | "esbuild-windows-arm64": "0.15.10" 1655 | } 1656 | }, 1657 | "esbuild-android-64": { 1658 | "version": "0.15.10", 1659 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 1660 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 1661 | "dev": true, 1662 | "optional": true 1663 | }, 1664 | "esbuild-android-arm64": { 1665 | "version": "0.15.10", 1666 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 1667 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 1668 | "dev": true, 1669 | "optional": true 1670 | }, 1671 | "esbuild-darwin-64": { 1672 | "version": "0.15.10", 1673 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 1674 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 1675 | "dev": true, 1676 | "optional": true 1677 | }, 1678 | "esbuild-darwin-arm64": { 1679 | "version": "0.15.10", 1680 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 1681 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 1682 | "dev": true, 1683 | "optional": true 1684 | }, 1685 | "esbuild-freebsd-64": { 1686 | "version": "0.15.10", 1687 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 1688 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 1689 | "dev": true, 1690 | "optional": true 1691 | }, 1692 | "esbuild-freebsd-arm64": { 1693 | "version": "0.15.10", 1694 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 1695 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 1696 | "dev": true, 1697 | "optional": true 1698 | }, 1699 | "esbuild-linux-32": { 1700 | "version": "0.15.10", 1701 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 1702 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 1703 | "dev": true, 1704 | "optional": true 1705 | }, 1706 | "esbuild-linux-64": { 1707 | "version": "0.15.10", 1708 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 1709 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 1710 | "dev": true, 1711 | "optional": true 1712 | }, 1713 | "esbuild-linux-arm": { 1714 | "version": "0.15.10", 1715 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 1716 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 1717 | "dev": true, 1718 | "optional": true 1719 | }, 1720 | "esbuild-linux-arm64": { 1721 | "version": "0.15.10", 1722 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 1723 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 1724 | "dev": true, 1725 | "optional": true 1726 | }, 1727 | "esbuild-linux-mips64le": { 1728 | "version": "0.15.10", 1729 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 1730 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 1731 | "dev": true, 1732 | "optional": true 1733 | }, 1734 | "esbuild-linux-ppc64le": { 1735 | "version": "0.15.10", 1736 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 1737 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 1738 | "dev": true, 1739 | "optional": true 1740 | }, 1741 | "esbuild-linux-riscv64": { 1742 | "version": "0.15.10", 1743 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 1744 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 1745 | "dev": true, 1746 | "optional": true 1747 | }, 1748 | "esbuild-linux-s390x": { 1749 | "version": "0.15.10", 1750 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 1751 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 1752 | "dev": true, 1753 | "optional": true 1754 | }, 1755 | "esbuild-netbsd-64": { 1756 | "version": "0.15.10", 1757 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 1758 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 1759 | "dev": true, 1760 | "optional": true 1761 | }, 1762 | "esbuild-openbsd-64": { 1763 | "version": "0.15.10", 1764 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 1765 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 1766 | "dev": true, 1767 | "optional": true 1768 | }, 1769 | "esbuild-sunos-64": { 1770 | "version": "0.15.10", 1771 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 1772 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 1773 | "dev": true, 1774 | "optional": true 1775 | }, 1776 | "esbuild-windows-32": { 1777 | "version": "0.15.10", 1778 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 1779 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 1780 | "dev": true, 1781 | "optional": true 1782 | }, 1783 | "esbuild-windows-64": { 1784 | "version": "0.15.10", 1785 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 1786 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 1787 | "dev": true, 1788 | "optional": true 1789 | }, 1790 | "esbuild-windows-arm64": { 1791 | "version": "0.15.10", 1792 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 1793 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 1794 | "dev": true, 1795 | "optional": true 1796 | }, 1797 | "escalade": { 1798 | "version": "3.1.1", 1799 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1800 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1801 | "dev": true 1802 | }, 1803 | "fast-glob": { 1804 | "version": "3.2.12", 1805 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1806 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1807 | "dev": true, 1808 | "requires": { 1809 | "@nodelib/fs.stat": "^2.0.2", 1810 | "@nodelib/fs.walk": "^1.2.3", 1811 | "glob-parent": "^5.1.2", 1812 | "merge2": "^1.3.0", 1813 | "micromatch": "^4.0.4" 1814 | }, 1815 | "dependencies": { 1816 | "glob-parent": { 1817 | "version": "5.1.2", 1818 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1819 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1820 | "dev": true, 1821 | "requires": { 1822 | "is-glob": "^4.0.1" 1823 | } 1824 | } 1825 | } 1826 | }, 1827 | "fastq": { 1828 | "version": "1.13.0", 1829 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1830 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1831 | "dev": true, 1832 | "requires": { 1833 | "reusify": "^1.0.4" 1834 | } 1835 | }, 1836 | "fill-range": { 1837 | "version": "7.0.1", 1838 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1839 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1840 | "dev": true, 1841 | "requires": { 1842 | "to-regex-range": "^5.0.1" 1843 | } 1844 | }, 1845 | "fraction.js": { 1846 | "version": "4.2.0", 1847 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1848 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1849 | "dev": true 1850 | }, 1851 | "fsevents": { 1852 | "version": "2.3.2", 1853 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1854 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1855 | "dev": true, 1856 | "optional": true 1857 | }, 1858 | "function-bind": { 1859 | "version": "1.1.1", 1860 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1861 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1862 | "dev": true 1863 | }, 1864 | "glob-parent": { 1865 | "version": "6.0.2", 1866 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1867 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1868 | "dev": true, 1869 | "requires": { 1870 | "is-glob": "^4.0.3" 1871 | } 1872 | }, 1873 | "has": { 1874 | "version": "1.0.3", 1875 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1876 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1877 | "dev": true, 1878 | "requires": { 1879 | "function-bind": "^1.1.1" 1880 | } 1881 | }, 1882 | "is-binary-path": { 1883 | "version": "2.1.0", 1884 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1885 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1886 | "dev": true, 1887 | "requires": { 1888 | "binary-extensions": "^2.0.0" 1889 | } 1890 | }, 1891 | "is-core-module": { 1892 | "version": "2.10.0", 1893 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 1894 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 1895 | "dev": true, 1896 | "requires": { 1897 | "has": "^1.0.3" 1898 | } 1899 | }, 1900 | "is-extglob": { 1901 | "version": "2.1.1", 1902 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1903 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1904 | "dev": true 1905 | }, 1906 | "is-glob": { 1907 | "version": "4.0.3", 1908 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1909 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1910 | "dev": true, 1911 | "requires": { 1912 | "is-extglob": "^2.1.1" 1913 | } 1914 | }, 1915 | "is-number": { 1916 | "version": "7.0.0", 1917 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1918 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1919 | "dev": true 1920 | }, 1921 | "laravel-vite-plugin": { 1922 | "version": "0.6.1", 1923 | "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.6.1.tgz", 1924 | "integrity": "sha512-L8zt+bttm6+C0mo3an5J8wRW03SsjbTEouGb3bH2jj/XclFVAX/xEUkG9efhdRHjbEH5RY6cmdJ7bmf7zqjwIQ==", 1925 | "dev": true, 1926 | "requires": { 1927 | "vite-plugin-full-reload": "^1.0.1" 1928 | } 1929 | }, 1930 | "lilconfig": { 1931 | "version": "2.0.6", 1932 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 1933 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 1934 | "dev": true 1935 | }, 1936 | "merge2": { 1937 | "version": "1.4.1", 1938 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1939 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1940 | "dev": true 1941 | }, 1942 | "micromatch": { 1943 | "version": "4.0.5", 1944 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1945 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1946 | "dev": true, 1947 | "requires": { 1948 | "braces": "^3.0.2", 1949 | "picomatch": "^2.3.1" 1950 | } 1951 | }, 1952 | "minimist": { 1953 | "version": "1.2.7", 1954 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", 1955 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", 1956 | "dev": true 1957 | }, 1958 | "nanoid": { 1959 | "version": "3.3.4", 1960 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1961 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1962 | "dev": true 1963 | }, 1964 | "node-releases": { 1965 | "version": "2.0.6", 1966 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 1967 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 1968 | "dev": true 1969 | }, 1970 | "normalize-path": { 1971 | "version": "3.0.0", 1972 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1973 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1974 | "dev": true 1975 | }, 1976 | "normalize-range": { 1977 | "version": "0.1.2", 1978 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1979 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1980 | "dev": true 1981 | }, 1982 | "object-hash": { 1983 | "version": "3.0.0", 1984 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1985 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1986 | "dev": true 1987 | }, 1988 | "path-parse": { 1989 | "version": "1.0.7", 1990 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1991 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1992 | "dev": true 1993 | }, 1994 | "picocolors": { 1995 | "version": "1.0.0", 1996 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1997 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1998 | "dev": true 1999 | }, 2000 | "picomatch": { 2001 | "version": "2.3.1", 2002 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2003 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2004 | "dev": true 2005 | }, 2006 | "pify": { 2007 | "version": "2.3.0", 2008 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2009 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2010 | "dev": true 2011 | }, 2012 | "postcss": { 2013 | "version": "8.4.17", 2014 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", 2015 | "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", 2016 | "dev": true, 2017 | "requires": { 2018 | "nanoid": "^3.3.4", 2019 | "picocolors": "^1.0.0", 2020 | "source-map-js": "^1.0.2" 2021 | } 2022 | }, 2023 | "postcss-import": { 2024 | "version": "14.1.0", 2025 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 2026 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 2027 | "dev": true, 2028 | "requires": { 2029 | "postcss-value-parser": "^4.0.0", 2030 | "read-cache": "^1.0.0", 2031 | "resolve": "^1.1.7" 2032 | } 2033 | }, 2034 | "postcss-js": { 2035 | "version": "4.0.0", 2036 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 2037 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 2038 | "dev": true, 2039 | "requires": { 2040 | "camelcase-css": "^2.0.1" 2041 | } 2042 | }, 2043 | "postcss-load-config": { 2044 | "version": "3.1.4", 2045 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 2046 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 2047 | "dev": true, 2048 | "requires": { 2049 | "lilconfig": "^2.0.5", 2050 | "yaml": "^1.10.2" 2051 | } 2052 | }, 2053 | "postcss-nested": { 2054 | "version": "5.0.6", 2055 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 2056 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 2057 | "dev": true, 2058 | "requires": { 2059 | "postcss-selector-parser": "^6.0.6" 2060 | } 2061 | }, 2062 | "postcss-selector-parser": { 2063 | "version": "6.0.10", 2064 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 2065 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 2066 | "dev": true, 2067 | "requires": { 2068 | "cssesc": "^3.0.0", 2069 | "util-deprecate": "^1.0.2" 2070 | } 2071 | }, 2072 | "postcss-value-parser": { 2073 | "version": "4.2.0", 2074 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2075 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2076 | "dev": true 2077 | }, 2078 | "queue-microtask": { 2079 | "version": "1.2.3", 2080 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2081 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2082 | "dev": true 2083 | }, 2084 | "quick-lru": { 2085 | "version": "5.1.1", 2086 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 2087 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 2088 | "dev": true 2089 | }, 2090 | "read-cache": { 2091 | "version": "1.0.0", 2092 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2093 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2094 | "dev": true, 2095 | "requires": { 2096 | "pify": "^2.3.0" 2097 | } 2098 | }, 2099 | "readdirp": { 2100 | "version": "3.6.0", 2101 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2102 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2103 | "dev": true, 2104 | "requires": { 2105 | "picomatch": "^2.2.1" 2106 | } 2107 | }, 2108 | "resolve": { 2109 | "version": "1.22.1", 2110 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 2111 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 2112 | "dev": true, 2113 | "requires": { 2114 | "is-core-module": "^2.9.0", 2115 | "path-parse": "^1.0.7", 2116 | "supports-preserve-symlinks-flag": "^1.0.0" 2117 | } 2118 | }, 2119 | "reusify": { 2120 | "version": "1.0.4", 2121 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2122 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2123 | "dev": true 2124 | }, 2125 | "rollup": { 2126 | "version": "2.78.1", 2127 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 2128 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 2129 | "dev": true, 2130 | "requires": { 2131 | "fsevents": "~2.3.2" 2132 | } 2133 | }, 2134 | "run-parallel": { 2135 | "version": "1.2.0", 2136 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2137 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2138 | "dev": true, 2139 | "requires": { 2140 | "queue-microtask": "^1.2.2" 2141 | } 2142 | }, 2143 | "source-map-js": { 2144 | "version": "1.0.2", 2145 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2146 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2147 | "dev": true 2148 | }, 2149 | "supports-preserve-symlinks-flag": { 2150 | "version": "1.0.0", 2151 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2152 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2153 | "dev": true 2154 | }, 2155 | "tailwindcss": { 2156 | "version": "3.1.8", 2157 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", 2158 | "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", 2159 | "dev": true, 2160 | "requires": { 2161 | "arg": "^5.0.2", 2162 | "chokidar": "^3.5.3", 2163 | "color-name": "^1.1.4", 2164 | "detective": "^5.2.1", 2165 | "didyoumean": "^1.2.2", 2166 | "dlv": "^1.1.3", 2167 | "fast-glob": "^3.2.11", 2168 | "glob-parent": "^6.0.2", 2169 | "is-glob": "^4.0.3", 2170 | "lilconfig": "^2.0.6", 2171 | "normalize-path": "^3.0.0", 2172 | "object-hash": "^3.0.0", 2173 | "picocolors": "^1.0.0", 2174 | "postcss": "^8.4.14", 2175 | "postcss-import": "^14.1.0", 2176 | "postcss-js": "^4.0.0", 2177 | "postcss-load-config": "^3.1.4", 2178 | "postcss-nested": "5.0.6", 2179 | "postcss-selector-parser": "^6.0.10", 2180 | "postcss-value-parser": "^4.2.0", 2181 | "quick-lru": "^5.1.1", 2182 | "resolve": "^1.22.1" 2183 | } 2184 | }, 2185 | "to-regex-range": { 2186 | "version": "5.0.1", 2187 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2188 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2189 | "dev": true, 2190 | "requires": { 2191 | "is-number": "^7.0.0" 2192 | } 2193 | }, 2194 | "update-browserslist-db": { 2195 | "version": "1.0.10", 2196 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", 2197 | "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", 2198 | "dev": true, 2199 | "requires": { 2200 | "escalade": "^3.1.1", 2201 | "picocolors": "^1.0.0" 2202 | } 2203 | }, 2204 | "util-deprecate": { 2205 | "version": "1.0.2", 2206 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2207 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2208 | "dev": true 2209 | }, 2210 | "vite": { 2211 | "version": "3.1.7", 2212 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.7.tgz", 2213 | "integrity": "sha512-5vCAmU4S8lyVdFCInu9M54f/g8qbOMakVw5xJ4pjoaDy5wgy9sLLZkGdSLN52dlsBqh0tBqxjaqqa8LgPqwRAA==", 2214 | "dev": true, 2215 | "requires": { 2216 | "esbuild": "^0.15.9", 2217 | "fsevents": "~2.3.2", 2218 | "postcss": "^8.4.16", 2219 | "resolve": "^1.22.1", 2220 | "rollup": "~2.78.0" 2221 | } 2222 | }, 2223 | "vite-plugin-full-reload": { 2224 | "version": "1.0.4", 2225 | "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.4.tgz", 2226 | "integrity": "sha512-9WejQII6zJ++m/YE173Zvl2jq4cqa404KNrVT+JDzDnqaGRq5UvOvA48fnsSWPIMXFV7S0dq5+sZqcSB+tKBgA==", 2227 | "dev": true, 2228 | "requires": { 2229 | "picocolors": "^1.0.0", 2230 | "picomatch": "^2.3.1" 2231 | } 2232 | }, 2233 | "xtend": { 2234 | "version": "4.0.2", 2235 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2236 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2237 | "dev": true 2238 | }, 2239 | "yaml": { 2240 | "version": "1.10.2", 2241 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2242 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2243 | "dev": true 2244 | } 2245 | } 2246 | } 2247 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "vite", 5 | "build": "vite build" 6 | }, 7 | "devDependencies": { 8 | "laravel-vite-plugin": "^0.6.1", 9 | "postcss": "^8.4.17", 10 | "tailwindcss": "^3.1.8", 11 | "autoprefixer": "^10.4.12", 12 | "vite": "^3.1.7" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | src/ 6 | 7 | 8 | 9 | 10 | tests 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /public/build/assets/app.8012c57d.css: -------------------------------------------------------------------------------- 1 | *,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.relative{position:relative}.z-0{z-index:0}.mx-auto{margin-left:auto;margin-right:auto}.ml-3{margin-left:.75rem}.-ml-px{margin-left:-1px}.mb-4{margin-bottom:1rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.h-5{height:1.25rem}.h-full{height:100%}.w-5{width:1.25rem}.w-full{width:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.table-auto{table-layout:auto}.cursor-default{cursor:default}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-items-center{justify-items:center}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(2px * var(--tw-divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--tw-divide-x-reverse)))}.overflow-x-auto{overflow-x:auto}.whitespace-nowrap{white-space:nowrap}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.border-transparent{border-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-gray-500\/5{background-color:#6b72800d}.bg-blue-300{--tw-bg-opacity: 1;background-color:rgb(147 197 253 / var(--tw-bg-opacity))}.p-5{padding:1.25rem}.p-4{padding:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-left{text-align:left}.text-sm{font-size:.875rem;line-height:1.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.leading-5{line-height:1.25rem}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity))}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-gray-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity))}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.focus\:z-10:focus{z-index:10}.focus\:border-blue-300:focus{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.active\:bg-gray-100:active{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.active\:text-gray-700:active{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.active\:text-gray-500:active{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}@media (min-width: 640px){.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:flex-1{flex:1 1 0%}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}} 2 | -------------------------------------------------------------------------------- /public/build/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "resources/css/app.css": { 3 | "file": "assets/app.8012c57d.css", 4 | "src": "resources/css/app.css", 5 | "isEntry": true 6 | } 7 | } -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /resources/views/layout.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Permissions - {{ config('app.name', 'Laravel') }} 9 | 10 | @vite('resources/css/app.css', 'vendor/permission_ui/build') 11 | 12 | 13 |
14 |
15 | {{ __('PermissionsUI::permissions.users.title') }} 16 | {{ __('PermissionsUI::permissions.roles.title') }} 17 | {{ __('PermissionsUI::permissions.permissions.title') }} 18 |
19 | 20 |
21 | @yield('content') 22 |
23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /resources/views/permissions/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | @csrf 6 | 7 |
8 | 9 | 10 | @error('name') 11 | {{ $message }} 12 | @enderror 13 |
14 | 15 | @if($roles->count()) 16 |
17 | 18 |
19 | @foreach($roles as $id => $name) 20 |
21 | 22 | 23 |
24 | @endforeach 25 |
26 | @error('roles') 27 | {{ $message }} 28 | @enderror 29 |
30 | @endif 31 | 32 | 35 |
36 | @endsection 37 | -------------------------------------------------------------------------------- /resources/views/permissions/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | @csrf 6 | 7 |
8 | 9 | 10 | @error('name') 11 | {{ $message }} 12 | @enderror 13 |
14 | 15 | @if($roles->count()) 16 |
17 | 18 |
19 | @foreach($roles as $id => $name) 20 |
21 | roles->contains($id))> 22 | 23 |
24 | @endforeach 25 |
26 | @error('roles') 27 | {{ $message }} 28 | @enderror 29 |
30 | @endif 31 | 32 | 35 |
36 | @endsection 37 | -------------------------------------------------------------------------------- /resources/views/permissions/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | {{ __('PermissionsUI::permissions.global.create') }} 6 |
7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | @forelse($permissions as $permission) 21 | 22 | 23 | 24 | 25 | 38 | 39 | @empty 40 | 41 | 42 | 43 | @endforelse 44 | 45 |
{{ __('PermissionsUI::permissions.permissions.fields.id') }}{{ __('PermissionsUI::permissions.permissions.fields.name') }}{{ __('PermissionsUI::permissions.permissions.fields.created_at') }}
{{ $permission->id }}{{ $permission->name }}{{ $permission->created_at }} 26 | 27 | {{ __('PermissionsUI::permissions.global.edit') }} 28 | 29 | 30 |
31 | @csrf 32 | @method('DELETE') 33 | 36 |
37 |
{{ __('PermissionsUI::permissions.global.no_records') }}
46 |
47 | @endsection 48 | -------------------------------------------------------------------------------- /resources/views/roles/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | @csrf 6 | 7 |
8 | 9 | 10 | @error('name') 11 | {{ $message }} 12 | @enderror 13 |
14 | 15 | @if($permissions->count()) 16 |
17 | 18 |
19 | @foreach($permissions as $id => $name) 20 |
21 | 22 | 23 |
24 | @endforeach 25 |
26 | @error('permissions') 27 | {{ $message }} 28 | @enderror 29 |
30 | @endif 31 | 32 | 35 |
36 | @endsection 37 | -------------------------------------------------------------------------------- /resources/views/roles/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | @csrf 6 | @method('PATCH') 7 | 8 |
9 | 10 | 11 | @error('name') 12 | {{ $message }} 13 | @enderror 14 |
15 | 16 | @if($permissions->count()) 17 |
18 | 19 |
20 | @foreach($permissions as $id => $name) 21 |
22 | permissions->contains($id))> 23 | 24 |
25 | @endforeach 26 |
27 | @error('permissions') 28 | {{ $message }} 29 | @enderror 30 |
31 | @endif 32 | 33 | 36 |
37 | @endsection 38 | -------------------------------------------------------------------------------- /resources/views/roles/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | {{ __('PermissionsUI::permissions.global.create') }} 6 |
7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | @forelse($roles as $role) 22 | 23 | 24 | 25 | 30 | 31 | 44 | 45 | @empty 46 | 47 | 48 | 49 | @endforelse 50 | 51 |
{{ __('PermissionsUI::permissions.roles.fields.id') }}{{ __('PermissionsUI::permissions.roles.fields.name') }}{{ __('PermissionsUI::permissions.roles.fields.permissions') }}{{ __('PermissionsUI::permissions.roles.fields.created_at') }}
{{ $role->id }}{{ $role->name }} 26 | @foreach($role->permissions as $permission) 27 | {{ $permission->name }} 28 | @endforeach 29 | {{ $role->created_at }} 32 | 33 | {{ __('PermissionsUI::permissions.global.edit') }} 34 | 35 | 36 |
37 | @csrf 38 | @method('DELETE') 39 | 42 |
43 |
{{ __('PermissionsUI::permissions.global.no_records') }}
52 |
53 | @endsection 54 | -------------------------------------------------------------------------------- /resources/views/users/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | @csrf 6 | @method('PATCH') 7 | 8 |
{{ __('PermissionsUI::permissions.users.fields.name') }}: {{ $user->name }}
9 | 10 | @if($roles->count()) 11 |
12 | 13 |
14 | @foreach($roles as $id => $name) 15 |
16 | roles->contains($id))> 17 | 18 |
19 | @endforeach 20 |
21 | @error('permissions') 22 | {{ $message }} 23 | @enderror 24 |
25 | @endif 26 | 27 | 30 |
31 | @endsection 32 | -------------------------------------------------------------------------------- /resources/views/users/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('PermissionsUI::layout') 2 | 3 | @section('content') 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | @forelse($users as $user) 19 | 20 | 21 | 22 | 23 | 28 | 29 | 34 | 35 | @empty 36 | 37 | 38 | 39 | @endforelse 40 | 41 |
{{ __('PermissionsUI::permissions.users.fields.id') }}{{ __('PermissionsUI::permissions.users.fields.name') }}{{ __('PermissionsUI::permissions.users.fields.email') }}{{ __('PermissionsUI::permissions.users.fields.roles') }}{{ __('PermissionsUI::permissions.users.fields.created_at') }}
{{ $user->id }}{{ $user->name }}{{ $user->email }} 24 | @foreach($user->roles as $role) 25 | {{ $role->name }} 26 | @endforeach 27 | {{ $user->created_at }} 30 | 31 | {{ __('PermissionsUI::permissions.global.edit') }} 32 | 33 |
{{ __('PermissionsUI::permissions.global.no_records') }}
42 | 43 | @if($users->links()) 44 |
45 | {{ $users->links() }} 46 |
47 | @endif 48 |
49 | @endsection 50 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | config('permission_ui.middleware'), 12 | 'prefix' => config('permission_ui.url_prefix'), 13 | 'as' => config('permission_ui.route_name_prefix')], 14 | function () { 15 | Route::resource('roles', RoleController::class)->except('show'); 16 | Route::resource('permissions', PermissionController::class)->except('show'); 17 | Route::resource('users', UserController::class)->only('index', 'edit', 'update'); 18 | }); 19 | -------------------------------------------------------------------------------- /src/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | validate([ 30 | 'name' => ['required', 'string'], 31 | 'roles' => ['array'], 32 | ]); 33 | 34 | $permission = Permission::create($data); 35 | 36 | $permission->syncRoles($request->input('roles')); 37 | 38 | return redirect()->route(config('permission_ui.route_name_prefix') . 'permissions.index'); 39 | } 40 | 41 | public function edit(Permission $permission): View 42 | { 43 | $roles = Role::pluck('name', 'id'); 44 | 45 | return view('PermissionsUI::permissions.edit', compact('permission', 'roles')); 46 | } 47 | 48 | public function update(Request $request, Permission $permission): RedirectResponse 49 | { 50 | $data = $request->validate([ 51 | 'name' => ['required', 'string'], 52 | 'roles' => ['array'], 53 | ]); 54 | 55 | $permission->update($data); 56 | 57 | $permission->syncRoles($request->input('roles')); 58 | 59 | return redirect()->route(config('permission_ui.route_name_prefix') . 'permissions.index'); 60 | } 61 | 62 | public function destroy(Permission $permission): RedirectResponse 63 | { 64 | $permission->delete(); 65 | 66 | return redirect()->route(config('permission_ui.route_name_prefix') . 'permissions.index'); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Controllers/RoleController.php: -------------------------------------------------------------------------------- 1 | get(); 16 | 17 | return view('PermissionsUI::roles.index', compact('roles')); 18 | } 19 | 20 | public function create(): View 21 | { 22 | $permissions = Permission::pluck('name', 'id'); 23 | 24 | return view('PermissionsUI::roles.create', compact('permissions')); 25 | } 26 | 27 | public function store(Request $request): RedirectResponse 28 | { 29 | $request->validate([ 30 | 'name' => ['required', 'string'], 31 | 'permissions' => ['array'], 32 | ]); 33 | 34 | $role = Role::create(['name' => $request->input('name')]); 35 | 36 | $role->givePermissionTo($request->input('permissions')); 37 | 38 | return redirect()->route(config('permission_ui.route_name_prefix') . 'roles.index'); 39 | } 40 | 41 | public function edit(Role $role): View 42 | { 43 | $permissions = Permission::pluck('name', 'id'); 44 | 45 | return view('PermissionsUI::roles.edit', compact('role', 'permissions')); 46 | } 47 | 48 | public function update(Request $request, Role $role): RedirectResponse 49 | { 50 | $request->validate([ 51 | 'name' => ['required', 'string'], 52 | 'permissions' => ['array'], 53 | ]); 54 | 55 | $role->update(['name' => $request->input('name')]); 56 | 57 | $role->syncPermissions($request->input('permissions')); 58 | 59 | return redirect()->route(config('permission_ui.route_name_prefix') . 'roles.index'); 60 | } 61 | 62 | public function destroy(Role $role): RedirectResponse 63 | { 64 | $role->delete(); 65 | 66 | return redirect()->route(config('permission_ui.route_name_prefix') . 'roles.index'); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Controllers/UserController.php: -------------------------------------------------------------------------------- 1 | paginate(); 16 | 17 | return view('PermissionsUI::users.index', compact('users')); 18 | } 19 | 20 | public function edit(User $user): View 21 | { 22 | $roles = Role::pluck('name', 'id'); 23 | 24 | return view('PermissionsUI::users.edit', compact('user', 'roles')); 25 | } 26 | 27 | public function update(Request $request, User $user): RedirectResponse 28 | { 29 | $request->validate([ 30 | 'roles' => ['required', 'array'], 31 | ]); 32 | 33 | $user->syncRoles($request->input('roles')); 34 | 35 | return redirect()->route(config('permission_ui.route_name_prefix') . 'users.index'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Facades/PermissionsUI.php: -------------------------------------------------------------------------------- 1 | mergeConfigFrom(__DIR__ . '/../config/permission_ui.php', 'permission_ui'); 12 | } 13 | 14 | public function boot() 15 | { 16 | // registering routes 17 | $this->loadRoutesFrom(__DIR__ . '/../routes/web.php'); 18 | 19 | // registering views 20 | $this->loadViewsFrom(__DIR__ . '/../resources/views', 'PermissionsUI'); 21 | 22 | // registering lang 23 | $this->loadTranslationsFrom(__DIR__.'/../lang', 'PermissionsUI'); 24 | 25 | // publish lang 26 | $this->publishes([ 27 | __DIR__.'/../lang' => $this->app->langPath('vendor/permission_ui'), 28 | ], 'lang'); 29 | 30 | // publish config 31 | $this->publishes([ 32 | __DIR__ . '/../config/permission_ui.php' => config_path('permission_ui.php'), 33 | ], 'config'); 34 | 35 | // publish assets 36 | $this->publishes([ 37 | __DIR__ . '/../public' => public_path('vendor/permission_ui'), 38 | ], ['permission_ui-assets', 'laravel-assets']); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', 5 | './resources/**/*.blade.php', 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } -------------------------------------------------------------------------------- /tests/Models/User.php: -------------------------------------------------------------------------------- 1 | actingAs(User::factory()->create())->get(config('permission_ui.url_prefix')); 15 | 16 | $response->assertRedirect(route(config('permission_ui.route_name_prefix') . 'users.index')); 17 | } 18 | 19 | public function testPermissionCanBeAttachedToRole() 20 | { 21 | $permission = Permission::create(['name' => 'permission']); 22 | 23 | $response = $this->actingAs(User::factory()->create())->post(route(config('permission_ui.route_name_prefix') . 'roles.store'), [ 24 | 'name' => 'role', 25 | 'permissions' => [$permission->id], 26 | ]); 27 | 28 | $response->assertRedirect(route(config('permission_ui.route_name_prefix') . 'roles.index')); 29 | 30 | $this->assertTrue(Role::first()->hasPermissionTo($permission)); 31 | } 32 | 33 | public function testPermissionsShowsOnCreateAndEditRolePages() 34 | { 35 | $user = User::factory()->create(); 36 | 37 | Permission::create(['name' => 'create user']); 38 | 39 | $response = $this->actingAs($user)->get(route(config('permission_ui.route_name_prefix') . 'roles.create')); 40 | 41 | $response->assertOk() 42 | ->assertViewHas('permissions', function (Collection $permissions) { 43 | foreach ($permissions as $permission) { 44 | return $permission === 'create user'; 45 | } 46 | }); 47 | 48 | $role = Role::create(['name' => 'admin']); 49 | 50 | $response = $this->actingAs($user)->get(route(config('permission_ui.route_name_prefix') . 'roles.edit', $role)); 51 | 52 | $response->assertOk() 53 | ->assertViewHas('permissions', function (Collection $permissions) { 54 | foreach ($permissions as $permission) { 55 | return $permission === 'create user'; 56 | } 57 | }); 58 | } 59 | 60 | public function testWhenCreatingPermissionItCanBeAssignedToRole() 61 | { 62 | $role = Role::create(['name' => 'admin']); 63 | 64 | $response = $this->actingAs(User::factory()->create())->post(route(config('permission_ui.route_name_prefix') . 'permissions.store'), [ 65 | 'name' => 'create user', 66 | 'roles' => [$role->id], 67 | ]); 68 | 69 | $response->assertRedirect(route(config('permission_ui.route_name_prefix') . 'permissions.index')); 70 | 71 | $this->assertTrue(Permission::first()->hasRole($role)); 72 | } 73 | 74 | public function testWhenEditingPermissionItCanBeAssignedToRole() 75 | { 76 | $role = Role::create(['name' => 'admin']); 77 | $permission = Permission::create(['name' => 'create user']); 78 | 79 | $response = $this->actingAs(User::factory()->create())->patch(route(config('permission_ui.route_name_prefix') . 'permissions.update', $permission), [ 80 | 'name' => 'create_user', 81 | 'roles' => [$role->id], 82 | ]); 83 | 84 | $response->assertRedirect(route(config('permission_ui.route_name_prefix') . 'permissions.index')); 85 | 86 | $this->assertTrue(Permission::first()->hasRole($role)); 87 | 88 | $this->assertDatabaseHas('permissions', [ 89 | 'name' => 'create_user', 90 | ]); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | withoutVite(); 19 | } 20 | 21 | protected function defineEnvironment($app) 22 | { 23 | // Setup default database to use sqlite :memory: 24 | $app['config']->set('database.default', 'testbench'); 25 | $app['config']->set('database.connections.testbench', [ 26 | 'driver' => 'sqlite', 27 | 'database' => ':memory:', 28 | 'prefix' => '', 29 | ]); 30 | } 31 | 32 | protected function getPackageProviders($app): array 33 | { 34 | return [ 35 | PermissionServiceProvider::class, 36 | PermissionsUIServiceProvider::class, 37 | ]; 38 | } 39 | 40 | protected function defineDatabaseMigrations(): void 41 | { 42 | $this->loadLaravelMigrations(); 43 | 44 | include_once __DIR__.'/../vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub'; 45 | (new \CreatePermissionTables)->up(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | 4 | export default defineConfig({ 5 | plugins: [ 6 | laravel({ 7 | input: ['resources/css/app.css'] 8 | }), 9 | ], 10 | }); --------------------------------------------------------------------------------