From 97b85a1f65d44efee2aa12030344d3d4198efc16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s=20de=20Jes=C3=BAs=20Cort=C3=A9s=20Castellanos?= Date: Tue, 3 Dec 2024 09:21:35 -0600 Subject: [PATCH] INIT: Commit inicial --- .env.example | 1 + .gitignore | 25 + .vscode/extensions.json | 3 + README.md | 5 + index.html | 14 + package-lock.json | 2835 +++++++++++++++++ package.json | 27 + postcss.config.js | 6 + public/vite.svg | 1 + src/App.vue | 12 + src/assets/vue.svg | 1 + src/components/HelloWorld.vue | 43 + src/components/Holos/ActionSection.vue | 22 + src/components/Holos/AuthenticationCard.vue | 11 + .../Holos/AuthenticationCardLogo.vue | 17 + src/components/Holos/Button/Danger.vue | 18 + src/components/Holos/Button/Icon.vue | 32 + src/components/Holos/Button/Primary.vue | 18 + src/components/Holos/Button/Secondary.vue | 18 + src/components/Holos/Card/Indicator.vue | 34 + src/components/Holos/Card/Simple.vue | 19 + src/components/Holos/Checkbox.vue | 36 + src/components/Holos/ConfirmsPassword.vue | 113 + src/components/Holos/DialogModal.vue | 46 + src/components/Holos/Dropdown.vue | 104 + src/components/Holos/DropdownLink.vue | 39 + src/components/Holos/Form/Elements/Error.vue | 14 + src/components/Holos/Form/Elements/Label.vue | 22 + src/components/Holos/Form/Image.vue | 107 + src/components/Holos/Form/Input.vue | 85 + src/components/Holos/Form/InputWithIcon.vue | 88 + src/components/Holos/Form/Selectable.vue | 89 + src/components/Holos/Form/SingleFile.vue | 103 + src/components/Holos/Form/Switch.vue | 60 + src/components/Holos/Form/Textarea.vue | 78 + .../Holos/Form/Todo/ItemWithForm.vue | 162 + src/components/Holos/FormSection.vue | 38 + src/components/Holos/Inbox.vue | 172 + src/components/Holos/Inbox/Item.vue | 70 + src/components/Holos/Inbox/ItemTitle.vue | 11 + src/components/Holos/Inbox/Menu/Item.vue | 46 + src/components/Holos/Inbox/Menu/Static.vue | 38 + src/components/Holos/InputLabel.vue | 12 + src/components/Holos/Layout/AppLayout.vue | 71 + src/components/Holos/Layout/AuthLayout.vue | 72 + src/components/Holos/Layout/TermsLayout.vue | 72 + src/components/Holos/Logo.vue | 9 + src/components/Holos/Modal.vue | 102 + src/components/Holos/Modal/Destroy.vue | 55 + src/components/Holos/Modal/Edit.vue | 51 + .../Holos/Modal/Elements/Header.vue | 20 + src/components/Holos/Modal/Show.vue | 53 + .../Holos/Modal/Template/Destroy.vue | 46 + src/components/Holos/Notification/Info.vue | 74 + src/components/Holos/PageHeader.vue | 22 + src/components/Holos/Searcher.vue | 60 + src/components/Holos/SectionBorder.vue | 9 + src/components/Holos/SectionTitle.vue | 17 + src/components/Holos/Skeleton/Header.vue | 124 + .../Skeleton/Header/NotificationLink.vue | 67 + .../Holos/Skeleton/Sidebar/Left.vue | 55 + .../Holos/Skeleton/Sidebar/Link.vue | 55 + .../Holos/Skeleton/Sidebar/Notification.vue | 65 + .../Skeleton/Sidebar/Notification/Item.vue | 64 + .../Holos/Skeleton/Sidebar/Right.vue | 36 + .../Holos/Skeleton/Sidebar/Section.vue | 18 + src/components/Holos/Table.vue | 86 + src/components/Holos/TableSimple.vue | 36 + src/components/Shared/GoogleIcon.vue | 34 + src/controllers/DateController.js | 30 + src/controllers/InboxController.js | 102 + src/controllers/ModalController.js | 92 + src/controllers/PrintController.js | 52 + src/controllers/SearcherController.js | 67 + src/css/base.css | 3 + src/lang/en.js | 205 ++ src/lang/es.js | 406 +++ src/lang/i18n.js | 23 + src/layouts/AppLayout.vue | 58 + src/main.js | 42 + src/pages/Admin/Users/Create.vue | 76 + src/pages/Admin/Users/Edit.vue | 52 + src/pages/Admin/Users/Form.vue | 78 + src/pages/Admin/Users/Index.vue | 159 + src/pages/Admin/Users/Modals/Show.vue | 53 + src/pages/Admin/Users/Module.js | 15 + src/pages/Admin/Users/Roles.vue | 61 + src/pages/Admin/Users/Settings.vue | 58 + src/pages/Admin/Users/UpdatePassword.vue | 70 + src/pages/Auth/ConfirmPassword.vue | 53 + src/pages/Auth/ForgotPassword.vue | 53 + src/pages/Auth/Login.vue | 64 + src/pages/Auth/Register.vue | 121 + src/pages/Auth/ResetPassword.vue | 65 + src/pages/Auth/TwoFactorChallenge.vue | 100 + src/pages/Auth/VerifyEmail.vue | 54 + src/pages/Dashboard/Index.vue | 14 + src/pages/Notifications/Index.vue | 99 + src/pages/Notifications/Modals/Show.vue | 53 + src/pages/Notifications/Module.js | 15 + src/pages/Notifications/Partials/ItemRow.vue | 18 + src/pages/Notifications/Partials/Menu.vue | 29 + src/pages/PrivacyPolicy.vue | 14 + src/pages/Profile/Partials/DeleteUserForm.vue | 98 + .../LogoutOtherBrowserSessionsForm.vue | 135 + .../Partials/TwoFactorAuthenticationForm.vue | 244 ++ .../Profile/Partials/UpdatePasswordForm.vue | 89 + .../Partials/UpdateProfileInformationForm.vue | 212 ++ src/pages/Profile/Show.vue | 57 + src/pages/Render.vue | 12 + src/pages/TermsOfService.vue | 14 + src/plugins/Notify.js | 66 + src/plugins/RolePermission.js | 50 + src/plugins/TailwindScreen.js | 104 + src/services/Api.js | 561 ++++ src/stores/DarkMode.js | 47 + src/stores/LeftSidebar.js | 36 + src/stores/NotificationSidebar.js | 33 + src/stores/Notifications.js | 53 + src/stores/Notifier.js | 88 + src/stores/RightSidebar.js | 33 + tailwind.config.js | 13 + vite.config.js | 22 + 123 files changed, 10489 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/vite.svg create mode 100644 src/App.vue create mode 100644 src/assets/vue.svg create mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/Holos/ActionSection.vue create mode 100644 src/components/Holos/AuthenticationCard.vue create mode 100644 src/components/Holos/AuthenticationCardLogo.vue create mode 100644 src/components/Holos/Button/Danger.vue create mode 100644 src/components/Holos/Button/Icon.vue create mode 100644 src/components/Holos/Button/Primary.vue create mode 100644 src/components/Holos/Button/Secondary.vue create mode 100644 src/components/Holos/Card/Indicator.vue create mode 100644 src/components/Holos/Card/Simple.vue create mode 100644 src/components/Holos/Checkbox.vue create mode 100644 src/components/Holos/ConfirmsPassword.vue create mode 100644 src/components/Holos/DialogModal.vue create mode 100644 src/components/Holos/Dropdown.vue create mode 100644 src/components/Holos/DropdownLink.vue create mode 100644 src/components/Holos/Form/Elements/Error.vue create mode 100644 src/components/Holos/Form/Elements/Label.vue create mode 100644 src/components/Holos/Form/Image.vue create mode 100644 src/components/Holos/Form/Input.vue create mode 100644 src/components/Holos/Form/InputWithIcon.vue create mode 100644 src/components/Holos/Form/Selectable.vue create mode 100644 src/components/Holos/Form/SingleFile.vue create mode 100644 src/components/Holos/Form/Switch.vue create mode 100644 src/components/Holos/Form/Textarea.vue create mode 100644 src/components/Holos/Form/Todo/ItemWithForm.vue create mode 100644 src/components/Holos/FormSection.vue create mode 100755 src/components/Holos/Inbox.vue create mode 100755 src/components/Holos/Inbox/Item.vue create mode 100755 src/components/Holos/Inbox/ItemTitle.vue create mode 100755 src/components/Holos/Inbox/Menu/Item.vue create mode 100755 src/components/Holos/Inbox/Menu/Static.vue create mode 100644 src/components/Holos/InputLabel.vue create mode 100644 src/components/Holos/Layout/AppLayout.vue create mode 100644 src/components/Holos/Layout/AuthLayout.vue create mode 100644 src/components/Holos/Layout/TermsLayout.vue create mode 100644 src/components/Holos/Logo.vue create mode 100644 src/components/Holos/Modal.vue create mode 100644 src/components/Holos/Modal/Destroy.vue create mode 100644 src/components/Holos/Modal/Edit.vue create mode 100644 src/components/Holos/Modal/Elements/Header.vue create mode 100644 src/components/Holos/Modal/Show.vue create mode 100644 src/components/Holos/Modal/Template/Destroy.vue create mode 100644 src/components/Holos/Notification/Info.vue create mode 100644 src/components/Holos/PageHeader.vue create mode 100644 src/components/Holos/Searcher.vue create mode 100644 src/components/Holos/SectionBorder.vue create mode 100644 src/components/Holos/SectionTitle.vue create mode 100644 src/components/Holos/Skeleton/Header.vue create mode 100644 src/components/Holos/Skeleton/Header/NotificationLink.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Left.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Link.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Notification.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Notification/Item.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Right.vue create mode 100644 src/components/Holos/Skeleton/Sidebar/Section.vue create mode 100644 src/components/Holos/Table.vue create mode 100644 src/components/Holos/TableSimple.vue create mode 100644 src/components/Shared/GoogleIcon.vue create mode 100644 src/controllers/DateController.js create mode 100644 src/controllers/InboxController.js create mode 100644 src/controllers/ModalController.js create mode 100755 src/controllers/PrintController.js create mode 100644 src/controllers/SearcherController.js create mode 100644 src/css/base.css create mode 100644 src/lang/en.js create mode 100644 src/lang/es.js create mode 100644 src/lang/i18n.js create mode 100644 src/layouts/AppLayout.vue create mode 100644 src/main.js create mode 100644 src/pages/Admin/Users/Create.vue create mode 100644 src/pages/Admin/Users/Edit.vue create mode 100644 src/pages/Admin/Users/Form.vue create mode 100644 src/pages/Admin/Users/Index.vue create mode 100644 src/pages/Admin/Users/Modals/Show.vue create mode 100644 src/pages/Admin/Users/Module.js create mode 100644 src/pages/Admin/Users/Roles.vue create mode 100644 src/pages/Admin/Users/Settings.vue create mode 100644 src/pages/Admin/Users/UpdatePassword.vue create mode 100644 src/pages/Auth/ConfirmPassword.vue create mode 100644 src/pages/Auth/ForgotPassword.vue create mode 100644 src/pages/Auth/Login.vue create mode 100644 src/pages/Auth/Register.vue create mode 100644 src/pages/Auth/ResetPassword.vue create mode 100644 src/pages/Auth/TwoFactorChallenge.vue create mode 100644 src/pages/Auth/VerifyEmail.vue create mode 100644 src/pages/Dashboard/Index.vue create mode 100644 src/pages/Notifications/Index.vue create mode 100644 src/pages/Notifications/Modals/Show.vue create mode 100644 src/pages/Notifications/Module.js create mode 100644 src/pages/Notifications/Partials/ItemRow.vue create mode 100755 src/pages/Notifications/Partials/Menu.vue create mode 100644 src/pages/PrivacyPolicy.vue create mode 100644 src/pages/Profile/Partials/DeleteUserForm.vue create mode 100644 src/pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue create mode 100644 src/pages/Profile/Partials/TwoFactorAuthenticationForm.vue create mode 100644 src/pages/Profile/Partials/UpdatePasswordForm.vue create mode 100644 src/pages/Profile/Partials/UpdateProfileInformationForm.vue create mode 100644 src/pages/Profile/Show.vue create mode 100644 src/pages/Render.vue create mode 100644 src/pages/TermsOfService.vue create mode 100644 src/plugins/Notify.js create mode 100644 src/plugins/RolePermission.js create mode 100644 src/plugins/TailwindScreen.js create mode 100644 src/services/Api.js create mode 100644 src/stores/DarkMode.js create mode 100644 src/stores/LeftSidebar.js create mode 100644 src/stores/NotificationSidebar.js create mode 100644 src/stores/Notifications.js create mode 100644 src/stores/Notifier.js create mode 100644 src/stores/RightSidebar.js create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8d944c6 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +VITE_API_URL=http://backend.holos.test \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..438657a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +.env + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..89b49d7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2835 @@ +{ + "name": "holos.frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "holos.frontend", + "version": "0.0.0", + "dependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "axios": "^1.7.8", + "pinia": "^2.2.8", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.15", + "toastr": "^2.1.4", + "vite": "^6.0.1", + "vue": "^3.5.13", + "vue-i18n": "^10.0.5", + "vue-router": "^4.5.0", + "ziggy-js": "^2.4.1" + }, + "devDependencies": { + "autoprefixer": "^10.4.20" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@intlify/core-base": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.5.tgz", + "integrity": "sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "10.0.5", + "@intlify/shared": "10.0.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.5.tgz", + "integrity": "sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "10.0.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.5.tgz", + "integrity": "sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", + "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", + "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", + "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", + "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", + "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", + "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", + "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", + "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", + "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", + "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", + "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", + "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", + "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", + "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", + "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.66", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz", + "integrity": "sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.8.tgz", + "integrity": "sha512-NRTYy2g+kju5tBRe0oNlriZIbMNvma8ZJrpHsp3qudyiMEA8jMmPPKQ2QMHg0Oc4BkUyQYWagACabrwriCK9HQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.5.11" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", + "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.27.4", + "@rollup/rollup-android-arm64": "4.27.4", + "@rollup/rollup-darwin-arm64": "4.27.4", + "@rollup/rollup-darwin-x64": "4.27.4", + "@rollup/rollup-freebsd-arm64": "4.27.4", + "@rollup/rollup-freebsd-x64": "4.27.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", + "@rollup/rollup-linux-arm-musleabihf": "4.27.4", + "@rollup/rollup-linux-arm64-gnu": "4.27.4", + "@rollup/rollup-linux-arm64-musl": "4.27.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", + "@rollup/rollup-linux-riscv64-gnu": "4.27.4", + "@rollup/rollup-linux-s390x-gnu": "4.27.4", + "@rollup/rollup-linux-x64-gnu": "4.27.4", + "@rollup/rollup-linux-x64-musl": "4.27.4", + "@rollup/rollup-win32-arm64-msvc": "4.27.4", + "@rollup/rollup-win32-ia32-msvc": "4.27.4", + "@rollup/rollup-win32-x64-msvc": "4.27.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz", + "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toastr": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", + "integrity": "sha512-LIy77F5n+sz4tefMmFOntcJ6HL0Fv3k1TDnNmFZ0bU/GcvIIfy6eG2v7zQmMiYgaalAiUv75ttFrPn5s0gyqlA==", + "dependencies": { + "jquery": ">=1.12.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz", + "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.5.tgz", + "integrity": "sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "10.0.5", + "@intlify/shared": "10.0.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", + "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ziggy-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/ziggy-js/-/ziggy-js-2.4.1.tgz", + "integrity": "sha512-okfK8gnCXQFbFecsjJqnD76bOgGSc52L6hw3Ff3opGCYexqfsONRU/tBUvo/7zLb0bCZ82cDcMnRlBx/x80jQQ==", + "license": "MIT", + "dependencies": { + "@types/qs": "^6.9.17", + "qs": "~6.9.7" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7a33050 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "holos.frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "axios": "^1.7.8", + "pinia": "^2.2.8", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.15", + "toastr": "^2.1.4", + "vite": "^6.0.1", + "vue": "^3.5.13", + "vue-i18n": "^10.0.5", + "vue-router": "^4.5.0", + "ziggy-js": "^2.4.1" + }, + "devDependencies": { + "autoprefixer": "^10.4.20" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..9fad556 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..546ebbc --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/Holos/ActionSection.vue b/src/components/Holos/ActionSection.vue new file mode 100644 index 0000000..4e70e6b --- /dev/null +++ b/src/components/Holos/ActionSection.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/Holos/AuthenticationCard.vue b/src/components/Holos/AuthenticationCard.vue new file mode 100644 index 0000000..59f3713 --- /dev/null +++ b/src/components/Holos/AuthenticationCard.vue @@ -0,0 +1,11 @@ + diff --git a/src/components/Holos/AuthenticationCardLogo.vue b/src/components/Holos/AuthenticationCardLogo.vue new file mode 100644 index 0000000..c5027ec --- /dev/null +++ b/src/components/Holos/AuthenticationCardLogo.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/Holos/Button/Danger.vue b/src/components/Holos/Button/Danger.vue new file mode 100644 index 0000000..a10f212 --- /dev/null +++ b/src/components/Holos/Button/Danger.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/Holos/Button/Icon.vue b/src/components/Holos/Button/Icon.vue new file mode 100644 index 0000000..e9a2812 --- /dev/null +++ b/src/components/Holos/Button/Icon.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Button/Primary.vue b/src/components/Holos/Button/Primary.vue new file mode 100644 index 0000000..ffc1fa1 --- /dev/null +++ b/src/components/Holos/Button/Primary.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/Holos/Button/Secondary.vue b/src/components/Holos/Button/Secondary.vue new file mode 100644 index 0000000..a02d599 --- /dev/null +++ b/src/components/Holos/Button/Secondary.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/Holos/Card/Indicator.vue b/src/components/Holos/Card/Indicator.vue new file mode 100644 index 0000000..1b0cddc --- /dev/null +++ b/src/components/Holos/Card/Indicator.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Card/Simple.vue b/src/components/Holos/Card/Simple.vue new file mode 100644 index 0000000..d427ce5 --- /dev/null +++ b/src/components/Holos/Card/Simple.vue @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Checkbox.vue b/src/components/Holos/Checkbox.vue new file mode 100644 index 0000000..0a39e56 --- /dev/null +++ b/src/components/Holos/Checkbox.vue @@ -0,0 +1,36 @@ + + + + diff --git a/src/components/Holos/ConfirmsPassword.vue b/src/components/Holos/ConfirmsPassword.vue new file mode 100644 index 0000000..262851c --- /dev/null +++ b/src/components/Holos/ConfirmsPassword.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/components/Holos/DialogModal.vue b/src/components/Holos/DialogModal.vue new file mode 100644 index 0000000..2569712 --- /dev/null +++ b/src/components/Holos/DialogModal.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/components/Holos/Dropdown.vue b/src/components/Holos/Dropdown.vue new file mode 100644 index 0000000..de72da6 --- /dev/null +++ b/src/components/Holos/Dropdown.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/components/Holos/DropdownLink.vue b/src/components/Holos/DropdownLink.vue new file mode 100644 index 0000000..080619d --- /dev/null +++ b/src/components/Holos/DropdownLink.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/components/Holos/Form/Elements/Error.vue b/src/components/Holos/Form/Elements/Error.vue new file mode 100644 index 0000000..c0944c8 --- /dev/null +++ b/src/components/Holos/Form/Elements/Error.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/Holos/Form/Elements/Label.vue b/src/components/Holos/Form/Elements/Label.vue new file mode 100644 index 0000000..acdc18a --- /dev/null +++ b/src/components/Holos/Form/Elements/Label.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/components/Holos/Form/Image.vue b/src/components/Holos/Form/Image.vue new file mode 100644 index 0000000..4ec4a0e --- /dev/null +++ b/src/components/Holos/Form/Image.vue @@ -0,0 +1,107 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/Input.vue b/src/components/Holos/Form/Input.vue new file mode 100644 index 0000000..d23cfdb --- /dev/null +++ b/src/components/Holos/Form/Input.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/InputWithIcon.vue b/src/components/Holos/Form/InputWithIcon.vue new file mode 100644 index 0000000..93a63ce --- /dev/null +++ b/src/components/Holos/Form/InputWithIcon.vue @@ -0,0 +1,88 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/Selectable.vue b/src/components/Holos/Form/Selectable.vue new file mode 100644 index 0000000..933daa7 --- /dev/null +++ b/src/components/Holos/Form/Selectable.vue @@ -0,0 +1,89 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/SingleFile.vue b/src/components/Holos/Form/SingleFile.vue new file mode 100644 index 0000000..8b6d677 --- /dev/null +++ b/src/components/Holos/Form/SingleFile.vue @@ -0,0 +1,103 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/Switch.vue b/src/components/Holos/Form/Switch.vue new file mode 100644 index 0000000..7873ea5 --- /dev/null +++ b/src/components/Holos/Form/Switch.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/Textarea.vue b/src/components/Holos/Form/Textarea.vue new file mode 100644 index 0000000..180370e --- /dev/null +++ b/src/components/Holos/Form/Textarea.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Form/Todo/ItemWithForm.vue b/src/components/Holos/Form/Todo/ItemWithForm.vue new file mode 100644 index 0000000..2d62aa3 --- /dev/null +++ b/src/components/Holos/Form/Todo/ItemWithForm.vue @@ -0,0 +1,162 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/FormSection.vue b/src/components/Holos/FormSection.vue new file mode 100644 index 0000000..dd22ada --- /dev/null +++ b/src/components/Holos/FormSection.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/Holos/Inbox.vue b/src/components/Holos/Inbox.vue new file mode 100755 index 0000000..bb0d0be --- /dev/null +++ b/src/components/Holos/Inbox.vue @@ -0,0 +1,172 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Inbox/Item.vue b/src/components/Holos/Inbox/Item.vue new file mode 100755 index 0000000..dc10725 --- /dev/null +++ b/src/components/Holos/Inbox/Item.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Inbox/ItemTitle.vue b/src/components/Holos/Inbox/ItemTitle.vue new file mode 100755 index 0000000..6c10ec8 --- /dev/null +++ b/src/components/Holos/Inbox/ItemTitle.vue @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/src/components/Holos/Inbox/Menu/Item.vue b/src/components/Holos/Inbox/Menu/Item.vue new file mode 100755 index 0000000..be9693b --- /dev/null +++ b/src/components/Holos/Inbox/Menu/Item.vue @@ -0,0 +1,46 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Inbox/Menu/Static.vue b/src/components/Holos/Inbox/Menu/Static.vue new file mode 100755 index 0000000..52f3616 --- /dev/null +++ b/src/components/Holos/Inbox/Menu/Static.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/InputLabel.vue b/src/components/Holos/InputLabel.vue new file mode 100644 index 0000000..9967f17 --- /dev/null +++ b/src/components/Holos/InputLabel.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/Holos/Layout/AppLayout.vue b/src/components/Holos/Layout/AppLayout.vue new file mode 100644 index 0000000..f8b6045 --- /dev/null +++ b/src/components/Holos/Layout/AppLayout.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/components/Holos/Layout/AuthLayout.vue b/src/components/Holos/Layout/AuthLayout.vue new file mode 100644 index 0000000..85a9f91 --- /dev/null +++ b/src/components/Holos/Layout/AuthLayout.vue @@ -0,0 +1,72 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Layout/TermsLayout.vue b/src/components/Holos/Layout/TermsLayout.vue new file mode 100644 index 0000000..17f76e2 --- /dev/null +++ b/src/components/Holos/Layout/TermsLayout.vue @@ -0,0 +1,72 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Logo.vue b/src/components/Holos/Logo.vue new file mode 100644 index 0000000..e359448 --- /dev/null +++ b/src/components/Holos/Logo.vue @@ -0,0 +1,9 @@ + + diff --git a/src/components/Holos/Modal.vue b/src/components/Holos/Modal.vue new file mode 100644 index 0000000..73ecb0b --- /dev/null +++ b/src/components/Holos/Modal.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/components/Holos/Modal/Destroy.vue b/src/components/Holos/Modal/Destroy.vue new file mode 100644 index 0000000..d15f262 --- /dev/null +++ b/src/components/Holos/Modal/Destroy.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Modal/Edit.vue b/src/components/Holos/Modal/Edit.vue new file mode 100644 index 0000000..9151141 --- /dev/null +++ b/src/components/Holos/Modal/Edit.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Modal/Elements/Header.vue b/src/components/Holos/Modal/Elements/Header.vue new file mode 100644 index 0000000..61409c4 --- /dev/null +++ b/src/components/Holos/Modal/Elements/Header.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Modal/Show.vue b/src/components/Holos/Modal/Show.vue new file mode 100644 index 0000000..07d9e30 --- /dev/null +++ b/src/components/Holos/Modal/Show.vue @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Modal/Template/Destroy.vue b/src/components/Holos/Modal/Template/Destroy.vue new file mode 100644 index 0000000..04c6013 --- /dev/null +++ b/src/components/Holos/Modal/Template/Destroy.vue @@ -0,0 +1,46 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Notification/Info.vue b/src/components/Holos/Notification/Info.vue new file mode 100644 index 0000000..20c63a7 --- /dev/null +++ b/src/components/Holos/Notification/Info.vue @@ -0,0 +1,74 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/PageHeader.vue b/src/components/Holos/PageHeader.vue new file mode 100644 index 0000000..dacffa9 --- /dev/null +++ b/src/components/Holos/PageHeader.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Searcher.vue b/src/components/Holos/Searcher.vue new file mode 100644 index 0000000..1ff41bf --- /dev/null +++ b/src/components/Holos/Searcher.vue @@ -0,0 +1,60 @@ + + \ No newline at end of file diff --git a/src/components/Holos/SectionBorder.vue b/src/components/Holos/SectionBorder.vue new file mode 100644 index 0000000..baec25d --- /dev/null +++ b/src/components/Holos/SectionBorder.vue @@ -0,0 +1,9 @@ + diff --git a/src/components/Holos/SectionTitle.vue b/src/components/Holos/SectionTitle.vue new file mode 100644 index 0000000..1b0b91e --- /dev/null +++ b/src/components/Holos/SectionTitle.vue @@ -0,0 +1,17 @@ + diff --git a/src/components/Holos/Skeleton/Header.vue b/src/components/Holos/Skeleton/Header.vue new file mode 100644 index 0000000..04a75bd --- /dev/null +++ b/src/components/Holos/Skeleton/Header.vue @@ -0,0 +1,124 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Skeleton/Header/NotificationLink.vue b/src/components/Holos/Skeleton/Header/NotificationLink.vue new file mode 100644 index 0000000..c75a23a --- /dev/null +++ b/src/components/Holos/Skeleton/Header/NotificationLink.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/components/Holos/Skeleton/Sidebar/Left.vue b/src/components/Holos/Skeleton/Sidebar/Left.vue new file mode 100644 index 0000000..45321ac --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Left.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Skeleton/Sidebar/Link.vue b/src/components/Holos/Skeleton/Sidebar/Link.vue new file mode 100644 index 0000000..635d8b1 --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Link.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/Holos/Skeleton/Sidebar/Notification.vue b/src/components/Holos/Skeleton/Sidebar/Notification.vue new file mode 100644 index 0000000..9382012 --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Notification.vue @@ -0,0 +1,65 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Skeleton/Sidebar/Notification/Item.vue b/src/components/Holos/Skeleton/Sidebar/Notification/Item.vue new file mode 100644 index 0000000..60e6549 --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Notification/Item.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/components/Holos/Skeleton/Sidebar/Right.vue b/src/components/Holos/Skeleton/Sidebar/Right.vue new file mode 100644 index 0000000..c2650fb --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Right.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/Skeleton/Sidebar/Section.vue b/src/components/Holos/Skeleton/Sidebar/Section.vue new file mode 100644 index 0000000..01510b2 --- /dev/null +++ b/src/components/Holos/Skeleton/Sidebar/Section.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/Holos/Table.vue b/src/components/Holos/Table.vue new file mode 100644 index 0000000..86a6ff8 --- /dev/null +++ b/src/components/Holos/Table.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/src/components/Holos/TableSimple.vue b/src/components/Holos/TableSimple.vue new file mode 100644 index 0000000..c657cd6 --- /dev/null +++ b/src/components/Holos/TableSimple.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/src/components/Shared/GoogleIcon.vue b/src/components/Shared/GoogleIcon.vue new file mode 100644 index 0000000..97af5a3 --- /dev/null +++ b/src/components/Shared/GoogleIcon.vue @@ -0,0 +1,34 @@ + + + \ No newline at end of file diff --git a/src/controllers/DateController.js b/src/controllers/DateController.js new file mode 100644 index 0000000..c9f6273 --- /dev/null +++ b/src/controllers/DateController.js @@ -0,0 +1,30 @@ +import { DateTime } from "luxon"; + +/* Obtiene la fecha actual en el formato deseado */ +function getDate(value = null) { + const date = (value) + ? DateTime.fromISO(value) + : DateTime.now(); + + return date.toLocaleString(DateTime.DATE_MED); +} + +/* Obtiene la horaa actual en el formato deseado */ +function getTime(value = null) { + const date = (value) + ? DateTime.fromISO(value) + : DateTime.now(); + + return date.toLocaleString(DateTime.TIME_24_SIMPLE); +} + +/** Obtener fecha y hora */ +function getDateTime(value) { + const date = (value) + ? DateTime.fromISO(value) + : DateTime.now(); + + return date.toLocaleString(DateTime.DATETIME_SHORT); +} + +export { getDate, getTime, getDateTime } \ No newline at end of file diff --git a/src/controllers/InboxController.js b/src/controllers/InboxController.js new file mode 100644 index 0000000..3b24549 --- /dev/null +++ b/src/controllers/InboxController.js @@ -0,0 +1,102 @@ +import { ref } from 'vue'; + +/** + * Controlador simple de las bandejas + */ +class InboxController +{ + inboxIdSelected = ref([]); + inboxNumberSelected = ref([]); + selectAll = ref(false); + + constructor() {} + + /** + * Selecciona todas las opciones visibles + */ + onSelectAll = (elements) => { + this.inboxIdSelected.value = []; + this.inboxNumberSelected.value = []; + + this.selectAll.value = !this.selectAll.value; + + if(this.selectAll.value) { + elements.data.forEach(element => { + this.inboxIdSelected.value.push(element.id); + this.inboxNumberSelected.value.push(element.number); + }); + } + } + + /** + * Selecciona solo una opcion + */ + onSelectOne = (invoice) => { + this.inboxIdSelected.value.push(invoice.id); + this.inboxNumberSelected.value.push(invoice.number); + } + + /** + * Permite que siempresea solo una opcion seleccionada + */ + onlyOne = (invoice) => { + this.clear(); + this.onSelectOne(invoice); + } + + /** + * Quita la seleccion + */ + onUnselectOne = (invoice) => { + this.inboxIdSelected.value = this.inboxIdSelected.value.filter(element => { + return element !== invoice.id; + }); + + this.inboxNumberSelected.value = this.inboxNumberSelected.value.filter(element => { + return element !== invoice.number; + }); + } + + /** + * Retorna todos los IDs de los elementos seleccionados + */ + getIdSelections = () => { + return this.inboxIdSelected.value; + } + + /** + * Trata al ID como si fueran muchos + * + * Si no se pasa mimgun ID, se devolveran todos los elementos seleccionados almacenados + */ + getAsMany = (id) => { + return (id) ? [ id ] : this.getIdSelections(); + } + + /** + * Retorna todos los numeros de las facturas/seleccionadas + */ + getNumberSelections = () => { + return this.inboxNumberSelected.value; + } + + /** + * Limpia los valores seleccionados + */ + clear = () => { + this.inboxIdSelected.value = []; + this.inboxNumberSelected.value = []; + this.selectAll.value = false; + } + + /** + * Limpia los valores seleccionados con una notificacion de exito + */ + clearWithSuccess = (message) => { + this.clear(); + + Notify.success(message); + } +} + +export default InboxController; \ No newline at end of file diff --git a/src/controllers/ModalController.js b/src/controllers/ModalController.js new file mode 100644 index 0000000..501c060 --- /dev/null +++ b/src/controllers/ModalController.js @@ -0,0 +1,92 @@ +import { ref } from 'vue'; + +/** + * Controlador simple de las bandejas + */ +class ModalController +{ + // Modals + confirmModal = ref(false); + destroyModal = ref(false); + editModal = ref(false); + noteModal = ref(false); + manyNotesModal = ref(false); + showModal = ref(false); + importModal = ref(false); + + // Models + modelModal = ref({}); + + constructor() {} + + /** + * Controla el cambio entre show y edit + */ + switchShowEditModal = () => { + this.showModal.value = !this.showModal.value + this.editModal.value = !this.editModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchShowModal = (model) => { + this._setModel(model); + this.showModal.value = !this.showModal.value + }; + + /** + * Controla el switch de importar + */ + switchImportModal = () => { + this.importModal.value = !this.importModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchEditModal = (model) => { + this._setModel(model); + this.editModal.value = !this.editModal.value + }; + + /** + * Controla el switch de eliminar + */ + switchDestroyModal = (model) => { + this._setModel(model); + this.destroyModal.value = !this.destroyModal.value + }; + + /** + * Controla el switch de nota + */ + switchNoteModal = () => { + this.noteModal.value = !this.noteModal.value + }; + + /** + * Controla el switch de notas aplicadas a muchos + */ + switchManyNotesModal = () => { + this.manyNotesModal.value = !this.manyNotesModal.value + }; + + /** + * Controla el switch de nota + */ + switchConfirmModal = () => { + this.confirmModal.value = !this.confirmModal.value + }; + + /** + * Guarda el modelo + */ + _setModel = (model) => { + if(model) { + this.modelModal.value = model; + } + } +} + +export default ModalController; \ No newline at end of file diff --git a/src/controllers/PrintController.js b/src/controllers/PrintController.js new file mode 100755 index 0000000..043c1f1 --- /dev/null +++ b/src/controllers/PrintController.js @@ -0,0 +1,52 @@ +import { ref } from 'vue'; +import axios from 'axios'; + +/** + * Controla la generación de impresiones + */ +class PrintController +{ + invoices = ref(false); + + constructor({route, meta, params = {}, name = "Comprobante", type='pdf'}) { + this.route = route; + this.meta = meta; + this.params = params; + this.name = name; + this.type = type; + } + + /** + * Manda la orden de impresión y descarga + */ + + download = (data = {}) => { + Notify.info('Generando archivo, espere ...'); + + axios({ + url: route(this.route, this.params), + method: 'POST', + data: { + meta: this.meta, + data: data + }, + responseType: 'blob' + }).then((response) => { + const href = URL.createObjectURL(response.data); + + const link = document.createElement('a'); + link.href = href; + link.setAttribute('download', `${this.name}.${this.type}`); + document.body.appendChild(link); + link.click(); + + document.body.removeChild(link); + URL.revokeObjectURL(href); + Notify.info('Archivo generado'); + }).catch(err => { + Notify.error('Error al generar'); + }); + } +} + +export default PrintController; \ No newline at end of file diff --git a/src/controllers/SearcherController.js b/src/controllers/SearcherController.js new file mode 100644 index 0000000..91afbf9 --- /dev/null +++ b/src/controllers/SearcherController.js @@ -0,0 +1,67 @@ +import { ref } from 'vue'; +import { router } from '@inertiajs/vue3'; + +/** + * Controlador simple de las bandejas + */ +class SearcherController +{ + query = ref(''); + + constructor(route, params) { + this.route = route; + this.params = params; + } + + /** + * Búsqueda simple + */ + search = (q = '', params) => { + this.query.value = q; + router.get(this._getRoute(), { + q, + ...params + }, {preserveState: true}); + }; + + /** + * Paginación simple + */ + withPagination = (page, params) => { + router.get(this._getRoute(), { + page, + ...params + }, {preserveState: true}); + } + + /** + * Búsqueda con paginación en tablas + */ + searchWithPagination = (page, params) => { + router.get(page, { + q: this.query.value, + ...params + }, {preserveState: true}); + } + + /** + * Búsqueda con páginación en bandejas + */ + searchWithInboxPagination = (page, params) => { + router.get(page, { + q: this.query.value, + ...params + }, {preserveState: true}); + } + + /** + * Obtiene la ruta segun los parametros + */ + _getRoute = () => { + return (this.params) + ? route(this.route, this.params) + : route(this.route); + } +} + +export default SearcherController; \ No newline at end of file diff --git a/src/css/base.css b/src/css/base.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/src/css/base.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/src/lang/en.js b/src/lang/en.js new file mode 100644 index 0000000..e29c383 --- /dev/null +++ b/src/lang/en.js @@ -0,0 +1,205 @@ +export default { + '&':'and', + account: { + delete: { + confirm:'Are you sure you want to delete your account? Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.', + description: 'Permanently delete your account.', + onDelete:'Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.', + title:'Delete Account', + }, + email: { + notifySendVerification:'A new verification link has been sent to your email address.', + sendVerification:'Click here to re-send the verification email', + unverify: 'Your email address is unverified.', + }, + manage:'Manage Account', + password: { + description:'Ensure your account is using a long, random password to stay secure.', + new:'New password', + reset:'Reset password', + secure:'This is a secure area of the application. Please confirm your password before continuing.', + update: 'Update Password', + verify:'For your security, please confirm your password to continue.', + }, + profile: { + description:'Update your account\'s profile information and email address.', + title:'Profile Information', + }, + sessions: { + confirm:'Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.', + description: 'Manage and log out your active sessions on other browsers and devices.', + last:'Last active', + logout:'Log Out Other Browser Sessions', + onLogout:'If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.', + this: 'This device', + title: 'Browser Sessions', + }, + twoFactor: { + codes:{ + regenerate:'Regenerate Recovery Codes', + show:'Show Recovery Codes', + store:'Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.', + }, + description:'Add additional security to your account using two factor authentication.', + isEnable:'You have enabled two factor authentication.', + isNotEnable:{ + title:'You have not enabled two factor authentication.', + description:'When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone\'s Google Authenticator application.', + }, + key:'Setup Key', + login: { + onAuth: 'Please confirm access to your account by entering the authentication code provided by your authenticator application.', + onRecovery: 'Please confirm access to your account by entering one of your emergency recovery codes.', + }, + onFinish:'Finish enabling two factor authentication.', + qr: { + isConfirmed: 'Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application or enter the setup key.', + onConfirmed: 'To finish enabling two factor authentication, scan the following QR code using your phone\'s authenticator application or enter the setup key and provide the generated OTP code.', + }, + recovery: { + code: 'Recovery code', + useAuth: 'Use an authentication code', + useCode: 'Use a recovery code', + }, + title:'Two Factor Authentication', + }, + }, + actions:'Actions', + auth: { + forgotPassword: { + ask: 'Forgot your password?', + description: 'Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.', + sendLink: 'Email Password Reset Link', + title: 'Forgot Password', + }, + login: 'Log In', + logout: 'Log Out', + register: { + already: 'Already registered?', + me: 'Register me', + }, + remember: 'Remember me', + }, + code:'Code', + cancel:'Cancel', + changelogs: { + title:'Changelogs', + description: 'List of changes made to the system.', + }, + close:"Close", + confirm:'Confirm', + copyright:'All rights reserved.', + contact:'Contact', + description:'Description', + date:'Date', + delete: { + confirm:"By pressing DELETE the record will be permanently deleted and cannot be recovered.", + title:'Deleted', + }, + deleted:'Deleted', + details:'Details', + disable:'Disable', + disabled:'Disable', + done:'Done.', + edit:'Edit', + email:'Email', + enable:'Enable', + endDate:'End date', + event:'Event', + help: { + description:'The following is a list of iconography to understand how the system works.', + home: 'Back to home page.', + title:'Help', + }, + history: { + title:'Stock history', + description:'History of actions performed by users in chronological order.', + }, + home:'Home', + hour:'Hour', + icon:'Icon', + maternal:'Mother\'s last name', + name:'Name', + noRecords:'No records', + notifications: { + deleted:'Notification deleted', + description:'User notifications', + notFound:'Notification not found', + title:'Notifications', + }, + password:'Password', + passwordConfirmation:'Confirm Password', + passwordCurrent:'Current Password', + paternal:'Paternal surname', + phone:'Phone Number', + photo: { + new: 'Select A New Photo', + remove:'Remove Photo', + title:'Photo', + }, + profile:'Profile', + readed:'Readed', + register: { + agree:'I agree to the', + privacy:'Privacy Policy', + signUp:'Sign Up', + terms:'Terms of Service', + }, + role:'Role', + roles:{ + create: { + title: 'Create role', + description: 'These roles will be used to give permissions in the system.', + onSuccess: 'Role successfully created', + onError: 'Error when creating the role', + }, + deleted:'Role deleted', + title: 'Roles', + }, + save:'Save', + saved:'Saved!', + search:'Search', + show: { + all:'Show All', + title:'Show', + }, + startDate:'Start date', + status:'Status', + terms: { + agree:'I agree to the', + privacy:'Privacy Policy', + service:'Terms of Service', + }, + unknown:'Unknown', + update:'Update', + updated:'Updated', + updateFail:'Error while updating', + unreaded:'Unreaded', + user:'User', + users:{ + create:{ + title:'Create user', + description:'Allows you to create new users. Don\'t forget to give them roles so that they can access the desired parts of the system.', + onSuccess:'User created', + onError:'An error occurred while creating the user', + }, + deleted:'User deleted', + notFount:'User not found', + password: { + description:'Allows users\' passwords to be updated', + title:'Update password', + }, + roles: { + description:'Updates user roles, allowing or denying access to certain areas.', + error:{ + min:'Select at least one role' + }, + title:'Roles', + }, + select:'Select a user', + settings:'User setting', + system:'System users', + title:'Users', + }, + version:'Version', +} \ No newline at end of file diff --git a/src/lang/es.js b/src/lang/es.js new file mode 100644 index 0000000..6f5608b --- /dev/null +++ b/src/lang/es.js @@ -0,0 +1,406 @@ +export default { + '&':'y', + account: { + delete: { + confirm:'¿Está seguro de que quiere eliminar su cuenta? Una vez eliminada su cuenta, todos sus recursos y datos se borrarán permanentemente. Por favor, introduzca su contraseña para confirmar que desea eliminar permanentemente su cuenta.', + description:'Eliminar permanentemente su cuenta.', + onDelete:'Una vez eliminada su cuenta, todos sus recursos y datos se borrarán permanentemente. Antes de eliminar su cuenta, descargue los datos o la información que desee conservar.', + title:'Eliminar cuenta', + }, + email: { + notifySendVerification:'Se ha enviado un nuevo enlace de verificación a su dirección de correo electrónico.', + sendVerification:'Haga clic aquí para volver a enviar el correo electrónico de verificación.', + unverify: 'Su dirección de correo electrónico no está verificada.', + }, + manage:'Administrar cuenta', + password: { + description:'Asegúrese de que su cuenta utiliza una contraseña larga y aleatoria para estar seguro.', + new:'Nueva contraseña', + reset:'Restaurar contraseña', + secure:'Esta es una zona segura de la aplicación. Confirme su contraseña antes de continuar.', + update: 'Actualizar contraseña', + updated:'Contraseña actualizada', + verify:'Por su seguridad, confirme su contraseña para continuar.', + }, + profile: { + description:'Actualice la información del perfil de su cuenta y su dirección de correo electrónico.', + title:'Información del perfil', + updated:'Perfil actualizado', + }, + sessions: { + confirm:'Por favor, introduzca su contraseña para confirmar que desea salir de sus otras sesiones de navegación en todos sus dispositivos.', + description: 'Gestiona y cierra tus sesiones activas en otros navegadores y dispositivos.', + last:'Último activo', + logout:'Cerrar otras sesiones del navegador', + done:'Sesiones cerradas', + onLogout:'Si es necesario, puede cerrar la sesión de todos sus otros navegadores en todos sus dispositivos. A continuación se enumeran algunas de sus sesiones recientes; sin embargo, esta lista puede no ser exhaustiva. Si crees que tu cuenta ha sido comprometida, también deberías actualizar tu contraseña.', + this: 'Dispositivo actual', + title: 'Sesiones del navegador', + }, + twoFactor: { + codes:{ + regenerate:'Regenerar los códigos de recuperación', + show:'Mostrar códigos de recuperación', + store:'Guarde estos códigos de recuperación en un gestor de contraseñas seguro. Pueden utilizarse para recuperar el acceso a su cuenta si se pierde su dispositivo de autenticación de dos factores.', + }, + description:'Añada seguridad adicional a su cuenta mediante la autenticación de dos factores.', + isEnable:'Ha activado la autenticación de dos factores.', + isNotEnable:{ + title:'No ha activado la autenticación de dos factores.', + description:'Cuando la autenticación de dos factores está activada, se le pedirá un token seguro y aleatorio durante la autenticación. Puedes recuperar este token desde la aplicación Google Authenticator de tu teléfono.', + }, + key:'Llave de configuración', + login: { + onAuth: 'Por favor, confirme el acceso a su cuenta introduciendo el código de autentificación proporcionado por su aplicación de autentificación.', + onRecovery: 'Confirme el acceso a su cuenta introduciendo uno de sus códigos de recuperación de emergencia.', + }, + onFinish:'Termina de habilitar la autenticación de dos factores.', + qr: { + isConfirmed: 'La autenticación de dos factores ya está activada. Escanee el siguiente código QR con la aplicación de autenticación de su teléfono o introduzca la clave de configuración.', + onConfirmed: 'Para terminar de habilitar la autenticación de dos factores, escanea el siguiente código QR utilizando la aplicación de autenticación de tu teléfono o introduce la clave de configuración y proporciona el código OTP generado.', + }, + recovery: { + code: 'Código de recuperación', + useAuth: 'Utilizar un código de autentificación', + useCode: 'Utiliza un código de recuperación', + }, + title:'Autenticación de dos factores', + }, + title: 'Cuenta', + }, + actions:'Acciones', + add: 'Agregar', + admin: { + title: 'Administración', + }, + app: { + theme: { + dark: 'Tema oscuro', + light: 'Tema claro' + } + }, + assistances: { + create: { + title: 'Generar asistencia', + description: 'Genera una instantánea del Head Count actual de los empleados, por planta y por línea de producción.', + }, + title: 'Asistencias', + }, + auth: { + confirmPassword: { + description: 'Esta es una zona segura de la aplicación. Por favor, confirma tu contraseña antes de continuar.', + title: 'Confirmar contraseña', + }, + forgotPassword: { + ask: '¿Olvidaste tu contraseña?', + description: '¿Ha olvidado su contraseña? No hay problema. Sólo tienes que indicarnos tu dirección de correo electrónico y te enviaremos un enlace para restablecer la contraseña que te permitirá elegir una nueva.', + sendLink: 'Enviar enlace de recuperación', + title: 'Contraseña olvidada', + }, + login: 'Iniciar sesión', + logout: 'Cerrar sesión', + register: { + already: '¿Ya estas registrado?', + me: 'Registrarme', + }, + reset: { + success: 'Contraseña actualizada', + title: 'Restaurar contraseña', + }, + remember: 'Recuerdame', + verifyEmail: { + beforeContinue: 'Antes de continuar, ¿podrías verificar tu correo electrónico haciendo clic en el enlace que acabamos de enviar a ti? Si no recibiste el correo electrónico, estaremos encantados de enviarte otro.', + sendLink: 'Enviar correo de verificación', + title: 'Verificación de correo electrónico', + notifySendVerification: 'Se ha enviado un nuevo enlace de verificación a su dirección de correo electrónico.', + }, + }, + code:'Código', + contracted_at: 'Fecha contratación', + cancel:'Cancelar', + changes:'Cambios', + changelogs: { + title:'Historial de cambios', + description: 'Lista de los cambios realizados al sistema.', + }, + clear: 'Limpiar', + close:"Cerrar", + confirm:'Confirmar', + copyright:'Todos los derechos reservados.', + contact:'Contacto', + create: 'Crear', + created: 'Registro creado', + created_at: 'Fecha creación', + crud: { + create: 'Nuevo registro', + edit: 'Editar registro', + destroy: 'Eliminar registro', + show: 'Más detalles', + import: 'Importación' + }, + dashboard: 'Dashboard', + date: 'Fecha', + dates: { + start: 'Fecha Inicial', + end: 'Fecha Final' + }, + days: { + title: 'Día', + monday: 'Lunes', + tuesday: 'Martes', + wednesday: 'Miércoles', + thursday: 'Jueves', + friday: 'Viernes', + saturday: 'Sábado', + sunday: 'Domingo' + }, + delete:{ + confirm: 'Al presionar ELIMINAR el registro se eliminará permanentemente y no podrá recuperarse.', + title: 'Eliminar', + }, + deleted:'Registro eliminado', + description:'Descripción', + details:'Detalles', + disable:'Deshabilitar', + disabled:'Deshabilitado', + done:'Hecho.', + edit:'Editar', + edited:'Registro creado', + email:{ + title:'Correo', + verification:'Verificar correo' + }, + employees: { + create: { + title: 'Crear empleado', + }, + edit: { + title: 'Editar empleado', + }, + title: 'Empleados' + }, + enable:'Habilitar', + enabled:'Habilitado', + endDate:'Fecha Fin', + event:'Evento', + files: { + excel: 'Archivo excel', + select: 'Seleccionar archivo' + }, + help: { + description:'A continuación se lista la iconografía para entender el funcionamiento del sistema.', + home: 'Volver a la pagina de inicio.', + title:'Ayuda', + }, + history: { + title:'Historial de acciones', + description:'Historial de acciones realizadas por los usuarios en orden cronológico.' + }, + home:'Inicio', + hour:'Hora', + icon:'Icono', + import: 'Importar', + items: 'Elementos', + maternal:'Apellido materno', + menu:'Menú', + name:'Nombre', + noRecords:'Sin registros', + notification:'Notificación', + notifications: { + readed:'Marcar como leído', + deleted:'Notificación eliminada', + description:'Notificaciones del usuario', + notFound:'Notificación no encontrada', + title:'Notificaciones', + }, + password:'Contraseña', + passwordConfirmation:'Confirmar contraseña', + passwordCurrent:'Contraseña actual', + passwordReset:'Restaurar contraseña', + paternal:'Apellido paterno', + phone:'Teléfono', + photo: { + new: 'Seleccionar una nueva foto', + remove:'Remover foto', + title:'Foto', + }, + plant: 'Continente', + plants: { + create: { + title: 'Crear continente', + }, + edit: { + title: 'Editar continente', + }, + title: 'Continentes' + }, + 'production-line': 'Línea de producción', + 'production-lines': { + create: { + title: 'Crear línea de producción', + }, + edit: { + title: 'Editar línea de producción', + }, + title: 'Líneas de producción' + }, + profile:'Perfil', + readed:'Leído', + register: { + create: { + onError: 'Error al crear el registro', + onSuccess: 'Registro creado', + }, + edit: { + onError: 'Error al actualizar el registro', + onSuccess: 'Registro actualizado', + }, + agree:'Estoy de acuerdo con los', + privacy:'Política de Privacidad', + signUp:'Registrarme', + terms:'Términos de Servicio', + }, + registers:{ + title:'Registros', + empty:'Sin registros', + }, + remove: 'Remover', + reports: { + description: 'Listado de reportes del sistema.', + plants: { + title: 'Reporte de empleados por continente', + description: 'Este reporte muestra el número de empleados contratados, por continente y línea de producción en función del tiempo.', + }, + productionLines: { + title: 'Reporte de empleados por línea de producción', + description: 'Este reporte muestra el número de empleados contratados, por línea de producción y continente en función del tiempo.', + }, + title: 'Reportes', + }, + return: 'Regresar', + role:'Rol', + roles:{ + create: { + title: 'Crear rol', + description: 'Estos roles serán usados para dar permisos en el sistema.', + onSuccess: 'Rol creado exitosamente', + onError: 'Error al crear el role', + }, + deleted:'Rol eliminado', + edit: { + title: 'Editar rol', + description: 'Actualiza los permisos del rol.', + onSuccess: 'Rol actualizado exitosamente', + onError: 'Error al actualizar el role', + }, + title: 'Roles', + }, + save:'Guardar', + saved:'¡Guardado!', + search:'Buscar', + selected: 'Seleccionado', + select: 'Seleccionar', + setting: 'Configuración', + settings: { + assistances: { + snapshot: { + title: 'Captura instantánea del Head Count', + description: 'Esta captura genera un resumen del número de empleados contratados, por planta y por línea de producción en un momento específico.', + } + }, + title: 'Ajustes', + }, + sex: 'Género', + shift: 'Turno', + shifts: { + create: { + title: 'Crear turno' + }, + edit: { + title: 'Editar turno' + }, + title: 'Turnos' + }, + show: { + all:'Mostrar todo', + title:'Mostrar', + }, + startDate:'Fecha de inicio', + status:'Estado', + system:'Sistema', + target: { + title: 'Meta', + total: 'Meta total' + }, + technology: 'Tecnología', + technologies: { + create: { + title: 'Crear tecnología', + }, + edit: { + title: 'Editar tecnología', + }, + title: 'Tecnologías' + }, + terms: { + agree:'Estoy de acuerdo con los', + privacy:'Política de privacidad', + service:'Términos de servicio', + }, + time: { + start: 'Hora inicial', + end: 'Hora final', + }, + total: 'Total', + unknown:'Desconocido', + update:'Actualizar', + updated:'Actualizado', + updateFail:'Error al actualizar', + unreaded:'No leído', + user:'Usuario', + users:{ + create:{ + title:'Crear usuario', + description:'Permite crear nuevos usuarios. No olvides otorgarle roles para que pueda acceder a las partes del sistema deseados.', + onSuccess:'Usuario creado', + onError:'Ocurrió un error al crear el usuario' + }, + deleted:'Usuario eliminado', + edit: { + title: 'Editar usuario' + }, + update: { + description: 'Actualiza los datos del usuario.', + onError: 'Error al actualizar el usuario', + onSuccess: 'Usuario actualizado', + }, + notFount:'Usuario no encontrado', + password: { + description:'Permite actualizar las contraseñas de los usuarios sobre escribiendola.', + title:'Actualizar contraseña', + }, + roles: { + description:'Actualiza los roles de los usuarios, permitiendo o denegando los accesos a determinadas áreas.', + error:{ + min:'Seleccionar mínimo un role' + }, + title:'Roles de usuario', + }, + menu:'Menú de usuario', + select:'Seleccionar un usuario', + settings:'Ajustes del usuario', + system:'Usuarios del sistema', + title:'Usuarios', + }, + version:'Versión', + workstation: 'Puesto de trabajo', + workstations: { + create: { + title: 'Crear puesto de trabajo', + }, + edit: { + title: 'Editar puesto de trabajo', + }, + title: 'Puestos de trabajos' + }, +} \ No newline at end of file diff --git a/src/lang/i18n.js b/src/lang/i18n.js new file mode 100644 index 0000000..a4f9d07 --- /dev/null +++ b/src/lang/i18n.js @@ -0,0 +1,23 @@ +import { createI18n } from 'vue-i18n'; +import en from './en.js'; +import es from './es.js'; + +/** + * Idioma local + */ +const locale = document.documentElement.lang; + +const messages = { + en, + es +} + +const i18n = createI18n({ + locale, + fallbackLocale: locale, + messages +}); + +const lang = (text) => i18n.global.t(text); + +export {i18n, lang}; \ No newline at end of file diff --git a/src/layouts/AppLayout.vue b/src/layouts/AppLayout.vue new file mode 100644 index 0000000..85ba1f1 --- /dev/null +++ b/src/layouts/AppLayout.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..8700393 --- /dev/null +++ b/src/main.js @@ -0,0 +1,42 @@ +import './css/base.css' + +import axios from 'axios'; +import { createPinia } from 'pinia' +import { createApp } from 'vue' +import { useRoute, ZiggyVue } from 'ziggy-js'; +import { i18n, lang } from '@/lang/i18n.js'; +import Notify from '@Plugins/Notify' +import TailwindScreen from '@Plugins/TailwindScreen' + +import App from './App.vue' + +// Configurar axios +axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; +axios.defaults.baseURL = import.meta.env.VITE_API_URL; + +// Crear instancias globales +window.Lang = lang; +window.Notify = new Notify(); +window.TwScreen = new TailwindScreen(); + +async function boot() { + try { + const { data } = await axios.get('/api/routes'); + + // Iniciar rutas + window.Ziggy = data; + window.route = useRoute(); + } catch (error) { + console.error(error); + alert('Failed to load routes'); + } + + createApp(App) + .use(createPinia()) + .use(i18n) + .use(ZiggyVue) + .mount('#app'); +} + +// Iniciar aplicación +boot(); diff --git a/src/pages/Admin/Users/Create.vue b/src/pages/Admin/Users/Create.vue new file mode 100644 index 0000000..12d03fe --- /dev/null +++ b/src/pages/Admin/Users/Create.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/pages/Admin/Users/Edit.vue b/src/pages/Admin/Users/Edit.vue new file mode 100644 index 0000000..5b4f8b0 --- /dev/null +++ b/src/pages/Admin/Users/Edit.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/pages/Admin/Users/Form.vue b/src/pages/Admin/Users/Form.vue new file mode 100644 index 0000000..26f619e --- /dev/null +++ b/src/pages/Admin/Users/Form.vue @@ -0,0 +1,78 @@ + + + \ No newline at end of file diff --git a/src/pages/Admin/Users/Index.vue b/src/pages/Admin/Users/Index.vue new file mode 100644 index 0000000..c2ad3c8 --- /dev/null +++ b/src/pages/Admin/Users/Index.vue @@ -0,0 +1,159 @@ + + + + \ No newline at end of file diff --git a/src/pages/Admin/Users/Modals/Show.vue b/src/pages/Admin/Users/Modals/Show.vue new file mode 100644 index 0000000..d005273 --- /dev/null +++ b/src/pages/Admin/Users/Modals/Show.vue @@ -0,0 +1,53 @@ + + \ No newline at end of file diff --git a/src/pages/Admin/Users/Module.js b/src/pages/Admin/Users/Module.js new file mode 100644 index 0000000..06118b5 --- /dev/null +++ b/src/pages/Admin/Users/Module.js @@ -0,0 +1,15 @@ +import { lang } from '@/Lang/i18n'; +import { hasPermission } from '@Plugins/RolePermission.js'; + +// Obtener ruta +const goTo = (route) => `admin.users.${route}` +// Obtener traducción del componente +const transl = (str) => lang(`users.${str}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`users.${permission}`) + +export { + can, + goTo, + transl +} \ No newline at end of file diff --git a/src/pages/Admin/Users/Roles.vue b/src/pages/Admin/Users/Roles.vue new file mode 100644 index 0000000..4578457 --- /dev/null +++ b/src/pages/Admin/Users/Roles.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/pages/Admin/Users/Settings.vue b/src/pages/Admin/Users/Settings.vue new file mode 100644 index 0000000..bc6fe04 --- /dev/null +++ b/src/pages/Admin/Users/Settings.vue @@ -0,0 +1,58 @@ + + + + \ No newline at end of file diff --git a/src/pages/Admin/Users/UpdatePassword.vue b/src/pages/Admin/Users/UpdatePassword.vue new file mode 100644 index 0000000..498bf4c --- /dev/null +++ b/src/pages/Admin/Users/UpdatePassword.vue @@ -0,0 +1,70 @@ + + + \ No newline at end of file diff --git a/src/pages/Auth/ConfirmPassword.vue b/src/pages/Auth/ConfirmPassword.vue new file mode 100644 index 0000000..f498197 --- /dev/null +++ b/src/pages/Auth/ConfirmPassword.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/pages/Auth/ForgotPassword.vue b/src/pages/Auth/ForgotPassword.vue new file mode 100644 index 0000000..4bdd800 --- /dev/null +++ b/src/pages/Auth/ForgotPassword.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/pages/Auth/Login.vue b/src/pages/Auth/Login.vue new file mode 100644 index 0000000..2f1f68b --- /dev/null +++ b/src/pages/Auth/Login.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/pages/Auth/Register.vue b/src/pages/Auth/Register.vue new file mode 100644 index 0000000..52ddd90 --- /dev/null +++ b/src/pages/Auth/Register.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/pages/Auth/ResetPassword.vue b/src/pages/Auth/ResetPassword.vue new file mode 100644 index 0000000..ab48be7 --- /dev/null +++ b/src/pages/Auth/ResetPassword.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/pages/Auth/TwoFactorChallenge.vue b/src/pages/Auth/TwoFactorChallenge.vue new file mode 100644 index 0000000..132772d --- /dev/null +++ b/src/pages/Auth/TwoFactorChallenge.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/pages/Auth/VerifyEmail.vue b/src/pages/Auth/VerifyEmail.vue new file mode 100644 index 0000000..e95d5b6 --- /dev/null +++ b/src/pages/Auth/VerifyEmail.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/pages/Dashboard/Index.vue b/src/pages/Dashboard/Index.vue new file mode 100644 index 0000000..118d8d0 --- /dev/null +++ b/src/pages/Dashboard/Index.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/pages/Notifications/Index.vue b/src/pages/Notifications/Index.vue new file mode 100644 index 0000000..f5bec96 --- /dev/null +++ b/src/pages/Notifications/Index.vue @@ -0,0 +1,99 @@ + + + + \ No newline at end of file diff --git a/src/pages/Notifications/Modals/Show.vue b/src/pages/Notifications/Modals/Show.vue new file mode 100644 index 0000000..d005273 --- /dev/null +++ b/src/pages/Notifications/Modals/Show.vue @@ -0,0 +1,53 @@ + + \ No newline at end of file diff --git a/src/pages/Notifications/Module.js b/src/pages/Notifications/Module.js new file mode 100644 index 0000000..220fd4a --- /dev/null +++ b/src/pages/Notifications/Module.js @@ -0,0 +1,15 @@ +import { lang } from '@/Lang/i18n'; +import { hasPermission } from '@Plugins/RolePermission.js'; + +// Obtener ruta +const goTo = (route) => `admin.users.${route}` +// Obtener traducción del componente +const transl = (str) => lang(`notifications.${str}`) +// Determina si un usuario puede hacer algo no en base a los permisos +const can = (permission) => hasPermission(`users.${permission}`) + +export { + can, + goTo, + transl +} \ No newline at end of file diff --git a/src/pages/Notifications/Partials/ItemRow.vue b/src/pages/Notifications/Partials/ItemRow.vue new file mode 100644 index 0000000..8a79ead --- /dev/null +++ b/src/pages/Notifications/Partials/ItemRow.vue @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/src/pages/Notifications/Partials/Menu.vue b/src/pages/Notifications/Partials/Menu.vue new file mode 100755 index 0000000..81ebc90 --- /dev/null +++ b/src/pages/Notifications/Partials/Menu.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/src/pages/PrivacyPolicy.vue b/src/pages/PrivacyPolicy.vue new file mode 100644 index 0000000..dce98ba --- /dev/null +++ b/src/pages/PrivacyPolicy.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/pages/Profile/Partials/DeleteUserForm.vue b/src/pages/Profile/Partials/DeleteUserForm.vue new file mode 100644 index 0000000..4c278a0 --- /dev/null +++ b/src/pages/Profile/Partials/DeleteUserForm.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue b/src/pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue new file mode 100644 index 0000000..4b72f95 --- /dev/null +++ b/src/pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/pages/Profile/Partials/TwoFactorAuthenticationForm.vue b/src/pages/Profile/Partials/TwoFactorAuthenticationForm.vue new file mode 100644 index 0000000..31443b2 --- /dev/null +++ b/src/pages/Profile/Partials/TwoFactorAuthenticationForm.vue @@ -0,0 +1,244 @@ + + + diff --git a/src/pages/Profile/Partials/UpdatePasswordForm.vue b/src/pages/Profile/Partials/UpdatePasswordForm.vue new file mode 100644 index 0000000..3689908 --- /dev/null +++ b/src/pages/Profile/Partials/UpdatePasswordForm.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/pages/Profile/Partials/UpdateProfileInformationForm.vue b/src/pages/Profile/Partials/UpdateProfileInformationForm.vue new file mode 100644 index 0000000..65460ad --- /dev/null +++ b/src/pages/Profile/Partials/UpdateProfileInformationForm.vue @@ -0,0 +1,212 @@ + + + diff --git a/src/pages/Profile/Show.vue b/src/pages/Profile/Show.vue new file mode 100644 index 0000000..e72382b --- /dev/null +++ b/src/pages/Profile/Show.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/pages/Render.vue b/src/pages/Render.vue new file mode 100644 index 0000000..6b3d3f6 --- /dev/null +++ b/src/pages/Render.vue @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/pages/TermsOfService.vue b/src/pages/TermsOfService.vue new file mode 100644 index 0000000..2b7b6c8 --- /dev/null +++ b/src/pages/TermsOfService.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/plugins/Notify.js b/src/plugins/Notify.js new file mode 100644 index 0000000..76a84d6 --- /dev/null +++ b/src/plugins/Notify.js @@ -0,0 +1,66 @@ +import { lang } from '@Lang/i18n'; +import toastr from 'toastr'; + +class Notify { + constructor() {} + + flash({message = 'Successful registration', type = 'success', timeout = 5, title= lang('notification')}) { + + toastr.options = { + "closeButton": true, + "debug": false, + "newestOnTop": false, + "progressBar": true, + "positionClass": "toast-bottom-right", + "preventDuplicates": false, + "onclick": null, + "showDuration": "300", + "hideDuration": "1000", + "timeOut": timeout * 1000, + "extendedTimeOut": "1000", + "showEasing": "swing", + "hideEasing": "linear", + "showMethod": "fadeIn", + "hideMethod": "fadeOut" + } + + toastr[type](message, title); + } + + success(message, title, timeout) { + this.flash({ + message, + title, + timeout + }); + } + + error(message, title, timeout) { + this.flash({ + message, + type:'error', + timeout, + title + }); + } + + info(message, title, timeout) { + this.flash({ + message, + type:'info', + timeout, + title + }); + } + + warning(message, title, timeout) { + this.flash({ + message, + type:'warning', + timeout, + title + }); + } +} + +export default Notify; diff --git a/src/plugins/RolePermission.js b/src/plugins/RolePermission.js new file mode 100644 index 0000000..40c11ef --- /dev/null +++ b/src/plugins/RolePermission.js @@ -0,0 +1,50 @@ +import { ref } from 'vue'; + +const permissionsInit = ref(false) +const allPermissions = ref([]) + +/** + * Permite consultar si un usuario tiene un permiso especifico + */ +const hasPermission = (can) => { + let verifyPermissions = can.split('|'); + + for (let permision in verifyPermissions) { + if(allPermissions.value.length != 0) { + if(allPermissions.value.indexOf(verifyPermissions[permision]) != -1) { + return true; + } + } + } + + return false; +} + +const bootPermissions = () => { + if (!permissionsInit.value) { + axios.get(route('system.permissions')).then((res) => { + loadPermissions(res.data.data.permissions) + + permissionsInit.value = true; + }) + } +} + +const resetPermissions = () => { + allPermissions.value = []; + permissionsInit.value = false; +} + +const loadPermissions = (permissionList = []) => { + if (permissionList.length > 0) { + permissionList.forEach(element => { + allPermissions.value.push(element.name) + }); + } +} + +export { + bootPermissions, + hasPermission, + resetPermissions +}; \ No newline at end of file diff --git a/src/plugins/TailwindScreen.js b/src/plugins/TailwindScreen.js new file mode 100644 index 0000000..b53f189 --- /dev/null +++ b/src/plugins/TailwindScreen.js @@ -0,0 +1,104 @@ +/** + * Calcula u obtiene el tamaño de pantalla del dispositivo actual + */ +class TailwindScreen { + constructor(){} + + isXs = () => (screen.width < 640) ? true : false; + + isSm = () => (screen.width >= 640 && screen.width < 768) ? true : false; + + isMd = () => (screen.width >= 768 && screen.width < 1024) ? true : false; + + isLg = () => (screen.width >= 1024 && screen.width < 1280) ? true : false; + + isXl = () => (screen.width >= 1280 && screen.width < 1536) ? true : false; + + is2Xl = () => (screen.width >= 1536) ? true : false; + + /** + * Obtiene el tamaño de pantalla que usa tailwind + */ + getScreen = () => { + if(this.isXs()) { + return 'xs'; + } + + if(this.isSm()) { + return 'sm'; + } + + if(this.isMd()) { + return 'md'; + } + + if(this.isLg()) { + return 'lg'; + } + + if(this.isXl()) { + return 'xl'; + } + + if(this.is2Xl()) { + return '2xl'; + } + } + + /** + * Pregunta si es un tipo de dispositivo + * + * @param {*} device Tipo de dispositivo + */ + isDevice(device) { + switch (device) { + case 'phone': + if(this.isXs() || this.isSm()) { + return true; + } + break; + case 'tablet': + if(this.isMd()) { + return true; + } + break; + case 'pc': + if(this.isLg() || this.isXl() || this.is2Xl()) { + return true; + } + break; + + default: + break; + } + + return false; + } + + /** + * Obtiene el tipo de dispositivo y la variante + */ + getDevice() { + if(this.isXs() || this.isSm()) { + return 'phone'; + } + + if(this.isMd()) { + return 'tablet'; + } + + if(this.isLg()) { + return 'pc-sm'; + } + + if(this.isXl()) { + return 'pc-md'; + } + + if(this.is2Xl()) { + return 'pc-lg'; + } + } +} + +export default TailwindScreen \ No newline at end of file diff --git a/src/services/Api.js b/src/services/Api.js new file mode 100644 index 0000000..22bdc16 --- /dev/null +++ b/src/services/Api.js @@ -0,0 +1,561 @@ +/** + * Servicio de comunicación API + * + * @author Moisés Cortés C. + * @version 1.0.0 + */ + +import axios from 'axios'; +import { reactive, ref } from 'vue'; +import { lang } from '@Lang/i18n'; + +axios.defaults.withXSRFToken = true; +// axios.defaults.withCredentials = true; + +/** + * Códigos de falla + */ +const failCodes = [ + 400, + 409, +]; + +/** + * Servidor a utilizar + */ +const server = ref(''); +const token = ref(localStorage.token); + +/** + * Define el servidor de la api + */ +const defineApiServer = (x) => { + server.value = x; +} + +/** + * Define el token de la api + */ +const defineApiToken = (x) => { + token.value = x; + localStorage.token = x; +} + +/** + * Ruta base del servidor + */ +const apiBaseUrl = (url) => { + return `${server.value}/${url}` +} + + +/** + * Ruta api del servidor + */ +const apiUrl = (url) => { + return apiBaseUrl(`api/${url}`) +} + + +/** + * Define el token de la api + */ +const resetApiToken = () => { + token.value = undefined; + localStorage.removeItem('token'); +} + +/** + * Determina si el token tiene algo o no + */ +const hasToken = () => { + return token.value !== undefined; +} + +/** + * Fuerza el cierre de la sesión + */ +const logout = () => { + localStorage.removeItem('token'); + token.value = undefined; +} + +/** + * Composición de llaves + * + * Utilizado para transformar llaves en FormData + */ +function composeKey(parent, key) { + return parent ? parent + '[' + key + ']' : key +} + +/** + * Instancia de la API de uso directo + */ +const api = { + errors: {}, + hasErrors: false, + processing: false, + wasSuccessful: false, + async load({ + method, + url, + apiToken = token.value, + options = { + data:{}, + params:{} + } + }) { + this.errors = {}; + this.hasErrors = false; + this.processing = true; + this.wasSuccessful = false; + + try { + if(options.hasOwnProperty('onStart')) { + options.onStart(); + } + + let { data } = await axios({ + method: method, + url, + data: options.data, + params: options.params, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${apiToken}` + } + }); + + if(data.status == 'success') { + this.wasSuccessful = true; + + if(options.hasOwnProperty('onSuccess')) { + options.onSuccess(data.data, data); + } + } else if(data.status == 'fail') { + if(options.hasOwnProperty('onFail')) { + options.onFail(data.data); + } + } + + if(options.hasOwnProperty('onFinish')) { + options.onFinish(data.data); + } + } catch (error) { + console.error(error) + + this.hasErrors = true; + + let { response } = error + + // Código de sesión invalida + if(response.status === 401 && response.data?.message == 'Unauthenticated.') { + Notify.error(lang('session.expired')); + + logout(); + + return + } + + // Fallas + if(failCodes.includes(response.status)) { + options.hasOwnProperty('onFail') + ? options.onFail(response.data.data) + : Notify.warning(response.data.data.message); + + return + } + + if(options.hasOwnProperty('onError')) { + options.onError(response.data); + } + + if(response.data != null) { + this.errors = response.data.errors; + } + } + + this.processing = false; + }, + get(url, options) { + this.load({ + method: 'get', + url: apiUrl(url), + options + }) + }, + post(url, options) { + this.load({ + method: 'post', + url: apiUrl(url), + options + }) + }, + put(url, options) { + this.load({ + method: 'put', + url: apiUrl(url), + options + }) + }, + patch(url, options) { + this.load('patch', { + method: 'patch', + url: apiUrl(url), + options + }) + }, + delete(url, options) { + this.load({ + method: 'delete', + url: apiUrl(url), + options + }) + }, + resource(resources, options) { + this.post('resources/get', { + ...options, + data: resources + }) + console.log(api.resource) + }, + download(url, file, params = {}) { + axios({ + url: url, + params: params, + method: 'GET', + responseType: 'blob', + headers: { + 'Authorization': `Bearer ${token.value}` + } + }).then((res) => { + const href = URL.createObjectURL(res.data); + const link = document.createElement('a'); + + link.href = href; + link.setAttribute('download', file); + document.body.appendChild(link); + link.click(); + + document.body.removeChild(link); + + URL.revokeObjectURL(href); + }); + }, +} + +/** + * Instancia de la API para formularios + */ +const useForm = (form = {}) => { + // Permite agregar datos mediante una transformación + let transform = (data) => data + + // Contador de archivos + let filesCounter = 0 + + // Procesar elementos del formulario + const append = (formData, key, value) => { + if(Array.isArray(value)) { + return Array.from(value.keys()).forEach((index) => append(formData, composeKey(key, index), value[index])); + } else if(value instanceof Date) { + return formData.append(key, value.toISOString()) + } else if(value instanceof File) { + filesCounter++ + return formData.append(key, value, value.name) + } else if (value instanceof Blob) { + return formData.append(key, value) + } else if(typeof value === 'boolean') { + return formData.append(key, value ? '1' : '0') + } else if (typeof value === 'string') { + return formData.append(key, value) + } else if (typeof value === 'number') { + return formData.append(key, `${value}`) + } else if(value === null || value === undefined) { + return formData.append(key, '') + } else if (typeof value === 'object') { + objectToFormData(formData, key, value); + } + } + + // Convertir objeto a elemento de FormData + const objectToFormData = (formData, parentKey = null, value) => { + value = value || {} + for (const key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + append(formData, composeKey(parentKey, key), value[key]) + } + } + + return formData + } + + // Transforma todos los datos + const prepareData = (data) => { + let formData = new FormData(); + + for (let i in data) { + append(formData, i, data[i]); + } + + return formData; + } + + return reactive({ + ...form, + errors: {}, + hasErrors: false, + processing: false, + wasSuccessful: false, + _inputs: Object.keys(form), + data() { + let data = {}; + + for (let i in this) { + if(typeof this[i] !== 'function' && this._inputs.includes(i)){ + data[i] = this[i] + } + } + + return data; + }, + transform(callback) { + transform = callback + + return this + }, + async load({ + method, + url, + apiToken = token.value, + options = { + data:{}, + params:{} + } + }) { + this.errors = {}; + this.hasErrors = false; + this.processing = true; + this.wasSuccessful = false; + + try { + if(options.hasOwnProperty('onStart')) { + options.onStart(options); + } + + let { data } = await axios({ + method: method, + url, + data: prepareData(transform(this.data())), + headers: { + 'Content-Type': (filesCounter > 0) + ? 'multipart/form-data boundary=' + : 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${apiToken}` + } + }); + + if(data.status == 'success') { + this.wasSuccessful = true; + + if(options.hasOwnProperty('onSuccess')) { + options.onSuccess(data?.data); + } + } else if(data.status == 'fail') { + if(options.hasOwnProperty('onFail')) { + options.onFail(data?.data); + } + } + + if(options.hasOwnProperty('onFinish')) { + options.onFinish(data?.data); + } + } catch (error) { + console.error(error); + + this.hasErrors = true; + + let { response } = error + + if(options.hasOwnProperty('onError')) { + options.onError(response); + } + + if(response.data?.errors != null) { + this.errors = response.data.errors; + + for(let e in this.errors) { + Notify.error(this.errors[e]) + } + } + } + + this.processing = false; + }, + fill(model) { + this._inputs.forEach(element => { + if (element == 'is_active') { + this[element] = (model[element] == 1) + } else { + this[element] = model[element] ?? this[element] + } + }); + }, + get(url, options) { + this.load({ + method: 'get', + url: apiUrl(url), + options + }) + }, + post(url, options) { + this.load({ + method: 'post', + url: apiUrl(url), + options + }) + }, + put(url, options) { + this.load({ + method: 'put', + url: apiUrl(url), + options + }) + }, + patch(url, options) { + this.load('patch', { + method: 'patch', + url: apiUrl(url), + options + }) + }, + delete(url, options) { + this.load({ + method: 'delete', + url: apiUrl(url), + options + }) + }, + }) +} + +/** + * Instancia de a API para buscador + */ +const useSearcher = (options = { + url: '', + filters: '' +}) => reactive({ + query: '', + errors: {}, + hasErrors: false, + processing: false, + wasSuccessful: false, + async load({ + url, + apiToken = token.value, + filters = {} + }) { + this.errors = {}; + this.processing = true; + this.hasErrors = false; + this.wasSuccessful = false; + + try { + if(options.hasOwnProperty('onStart')) { + options.onStart(); + } + + let { data } = await axios({ + method: 'get', + url, + params: { + query: this.query, + ...filters + }, + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${apiToken}` + } + }); + + if(data.status == 'success') { + this.wasSuccessful = true; + + if(options.hasOwnProperty('onSuccess')) { + options.onSuccess(data.data); + } + } else if(data.status == 'fail') { + if(options.hasOwnProperty('onFail')) { + options.onFail(data.data); + } + } + + if(options.hasOwnProperty('onFinish')) { + options.onFinish(data.data); + } + } catch (error) { + console.error(error); + + this.hasErrors = true; + + let { response } = error + + // Código de sesión invalida + if(response.status === 401 && response.data.message == 'Unauthenticated.') { + Notify.error(lang('session.expired')); + logout(); + return + } + + if(options.hasOwnProperty('onError')) { + options.onError(response); + } + + if(response.data?.errors != null) { + this.errors = response.data.errors; + for(let e in this.errors) { + Notify.error(this.errors[e]) + } + } + } + + this.processing = false; + }, + pagination(url, filters = {}) { + this.load({ + url, + filters + }) + }, + search(q, filters = {}) { + this.query = q + this.load({ + url: apiUrl(options.url), + filters + }) + }, + refresh(filters = {}) { + this.load({ + url: apiUrl(options.url), + filters + }) + }, +}) + +export { + api, + token, + apiBaseUrl, + apiUrl, + hasToken, + useForm, + useSearcher, + defineApiServer, + defineApiToken, + resetApiToken +} \ No newline at end of file diff --git a/src/stores/DarkMode.js b/src/stores/DarkMode.js new file mode 100644 index 0000000..7efb6fd --- /dev/null +++ b/src/stores/DarkMode.js @@ -0,0 +1,47 @@ +import { defineStore } from 'pinia' + +// Identificador de la página +const page = document.getElementById('main-page'); + +// Almacén del modo oscuro +const useDarkMode = defineStore('dark-mode', { + state: () => ({ + isActive: true + }), + getters: { + getTheme(state) { + return state.isActive + ? 'dark' + : 'light'; + }, + isDark(state) { + return state.isActive === true; + }, + isLight(state) { + return state.isActive === false; + } + }, + actions: { + boot() { + this.apply((localStorage.darkMode == 'true')); + }, + applyDark() { + this.apply(true); + }, + applyLight() { + this.apply(false); + }, + apply(state) { + this.isActive = state; + localStorage.darkMode = state + + if(state) { + page.classList.add('dark'); + } else { + page.classList.remove('dark'); + } + } + }, +}) + +export default useDarkMode \ No newline at end of file diff --git a/src/stores/LeftSidebar.js b/src/stores/LeftSidebar.js new file mode 100644 index 0000000..298b878 --- /dev/null +++ b/src/stores/LeftSidebar.js @@ -0,0 +1,36 @@ +import { defineStore } from 'pinia' + +// Almacenar estado de la barra lateral derecha +const useLeftSidebar = defineStore('left-sidebar', { + state: () => ({ + isActive: true + }), + getters: { + isOpened(state) { + return state.isActive === true; + }, + isClosed(state) { + return state.isActive === false; + } + }, + actions: { + boot() { + this.apply(localStorage.leftSidebar == 'true'); + }, + open() { + this.apply(true); + }, + close() { + this.apply(false); + }, + toggle() { + this.apply(!this.isActive) + }, + apply(state) { + this.isActive = state + localStorage.leftSidebar = state + } + } +}) + +export default useLeftSidebar \ No newline at end of file diff --git a/src/stores/NotificationSidebar.js b/src/stores/NotificationSidebar.js new file mode 100644 index 0000000..d9e0bf4 --- /dev/null +++ b/src/stores/NotificationSidebar.js @@ -0,0 +1,33 @@ +import { defineStore } from 'pinia' + +// Almacenar estado de la barra lateral derecha +const useNotificationSidebar = defineStore('notification-sidebar', { + state: () => ({ + isActive: false + }), + getters: { + isOpened(state) { + return state.isActive === true; + }, + isClosed(state) { + return state.isActive === false; + } + }, + actions: { + open() { + this.apply(true); + }, + close() { + this.apply(false); + }, + toggle() { + this.apply(!this.isActive) + }, + apply(state) { + this.isActive = state + localStorage.rightSidebar = state + } + }, +}) + +export default useNotificationSidebar \ No newline at end of file diff --git a/src/stores/Notifications.js b/src/stores/Notifications.js new file mode 100644 index 0000000..92590e4 --- /dev/null +++ b/src/stores/Notifications.js @@ -0,0 +1,53 @@ +import { defineStore } from 'pinia' +import { v4 as uuidv4 } from 'uuid'; + +// Almacenar estado de las notificaciones +const useNotification = defineStore('notifications', { + state: () => ({ + notifications: [], + }), + getters: { + getNotifications(state) { + return state.notifications + } + }, + actions: { + boot() { + let local = localStorage.getItem('notifications') + + if(local) { + this.notifications = JSON.parse(localStorage.getItem('notifications')) + } + }, + add({ + title = '', + message = '', + type = 'info', + preserve = false + }) { + this.notifications.push({ + uuid: uuidv4(), + title, + message, + type, + preserve + }) + + this.save() + }, + delete(uuid) { + this.notifications = this.notifications.filter(x => { + return x.uuid != uuid + }) + + this.save() + }, + save() { + localStorage.setItem('notifications', JSON.stringify(this.notifications.filter(x => { + return x.preserve == true + } ))) + } + }, +}) + +export default useNotification \ No newline at end of file diff --git a/src/stores/Notifier.js b/src/stores/Notifier.js new file mode 100644 index 0000000..c574d6b --- /dev/null +++ b/src/stores/Notifier.js @@ -0,0 +1,88 @@ +import { defineStore } from 'pinia' +import { usePage } from '@inertiajs/vue3'; +import axios from 'axios'; + +/** Definidores */ +const page = usePage(); + +/** Propiedades */ +const hasNotifications = import.meta.env.VITE_REVERB_ACTIVE === 'true'; + +// Almacenar estado de la barra lateral derecha +const useNotifier = defineStore('notifier', { + state: () => ({ + counter: 0, + notifications: [], + isStarted: false, + user_id: 0, + }), + actions: { + // Iniciar instancia + boot() { + if(!this.isStarted && hasNotifications) { + this.user_id = page.props.auth.user.id; + + this.subscribeGLobalNotifications(); + this.subscribeUserNotifications(); + + this.isStarted = true; + + this.getUpdates(); + } + }, + // Detener instancia + stop() { + if(this.isStarted) { + this.unsubscribeUserNotification(); + this.unsubscribeGlobalNotification(); + + this.started.value = false; + } + }, + // Notificaciones Globales + subscribeGLobalNotifications() { + Echo.private('Global') + .listen('Notification', e => { + Notify[e.type](e.message, e.title, e.timeout) + this.getUpdates() + }); + + }, + unsubscribeGlobalNotifications() { + Echo.leave('Global'); + }, + // Notificaciones del usuario + subscribeUserNotifications() { + Echo.private(`App.Models.User.${this.user_id}`) + .notification(x => { + console.log(x) + Notify[x.typeNotification](x.description, x.title, x.timeout) + this.getUpdates() + }) + }, + unsubscribeUserNotification() { + Echo.leave(`App.Models.User.${this.user_id}`); + }, + readNotification(id) { + axios.post(route('system.notifications.read'), { + id, + }).then(res => { + Notify.success(lang('notifications.readed')) + this.getUpdates(); + }).catch(res => { + Notify.error(lang('error')) + this.getUpdates(); + }) + }, + getUpdates() { + axios.get(route('system.notifications.all-unread')).then(res => { + this.counter = res.data.total; + this.notifications = res.data.notifications; + }).catch(res => { + console.log('error', res) + }) + } + } +}) + +export default useNotifier \ No newline at end of file diff --git a/src/stores/RightSidebar.js b/src/stores/RightSidebar.js new file mode 100644 index 0000000..d205ed4 --- /dev/null +++ b/src/stores/RightSidebar.js @@ -0,0 +1,33 @@ +import { defineStore } from 'pinia' + +// Almacenar estado de la barra lateral derecha +const useRightSidebar = defineStore('right-sidebar', { + state: () => ({ + isActive: false + }), + getters: { + isOpened(state) { + return state.isActive === true; + }, + isClosed(state) { + return state.isActive === false; + } + }, + actions: { + open() { + this.apply(true); + }, + close() { + this.apply(false); + }, + toggle() { + this.apply(!this.isActive) + }, + apply(state) { + this.isActive = state + localStorage.rightSidebar = state + } + }, +}) + +export default useRightSidebar \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..f4a89ab --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,13 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: [ + "./index.html", + "./src/**/*.{vue,js,ts,jsx,tsx}" + ], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..c367cda --- /dev/null +++ b/vite.config.js @@ -0,0 +1,22 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + '@Components': fileURLToPath(new URL('./src/components', import.meta.url)), + '@Holos': fileURLToPath(new URL('./src/components/Holos', import.meta.url)), + '@Layouts': fileURLToPath(new URL('./src/layouts', import.meta.url)), + '@Lang': fileURLToPath(new URL('./src/lang', import.meta.url)), + '@Pages': fileURLToPath(new URL('./src/pages', import.meta.url)), + '@Plugins': fileURLToPath(new URL('./src/plugins', import.meta.url)), + '@Shared': fileURLToPath(new URL('./src/components/Shared', import.meta.url)), + '@Services': fileURLToPath(new URL('./src/services', import.meta.url)), + } + } +})