From 593e1928b32b71e8671e66d45a677d8fbfc466b4 Mon Sep 17 00:00:00 2001 From: dchar Date: Fri, 25 Jul 2025 21:05:50 +0200 Subject: [PATCH] Initial commit --- .dockerignore | 10 + .gitignore | 32 + .npmrc | 3 + .prettierrc.json | 9 + Dockerfile | 37 + LICENSE.md | 21 + README.md | 256 + SECURITY.md | 36 + eslint.config.mjs | 35 + jsconfig.json | 11 + package.json | 50 + web/client/.gitignore | 28 + web/client/README.md | 58 + web/client/index.html | 16 + web/client/package-lock.json | 2087 ++++ web/client/package.json | 30 + web/client/public/favicon.ico | Bin 0 -> 4286 bytes web/client/shopify.web.toml | 5 + web/client/src/App.vue | 102 + web/client/src/assets/base.css | 351 + .../src/assets/images/home-trophy-vue.png | Bin 0 -> 16126 bytes web/client/src/assets/main.css | 36 + .../src/components/Common/DateRangePicker.vue | 365 + .../src/components/Common/SpinnerWrapper.vue | 24 + .../src/components/Home/WelcomeOnboarding.vue | 155 + .../Navigation/LanguageSwitcher.vue | 67 + .../components/Support/SupportDashboard.vue | 72 + web/client/src/composables/useBreakpoints.js | 63 + web/client/src/i18n.js | 95 + web/client/src/locales/de.json | 120 + web/client/src/locales/en.json | 120 + web/client/src/locales/es.json | 120 + web/client/src/locales/fr.json | 120 + web/client/src/locales/it.json | 120 + web/client/src/main.js | 20 + web/client/src/plugins/appBridge.js | 28 + web/client/src/router/index.js | 46 + .../src/services/useAuthenticatedFetch.js | 61 + web/client/src/stores/billing.js | 23 + web/client/src/stores/shopify.js | 19 + web/client/src/views/ExitIframeView.vue | 23 + web/client/src/views/HomeView.vue | 9 + web/client/src/views/NotFoundView.vue | 10 + web/client/src/views/SupportView.vue | 9 + web/client/vite.config.js | 75 + web/server/package.json | 32 + web/server/shopify.web.toml | 4 + .../data/-- SQLite Create Stats Table.sql | 15 + .../data/-- SQLite Stats One insert.sql | 19 + .../database/data/-- SQLite Stats inserts.sql | 10001 ++++++++++++++++ web/server/src/database/database.js | 22 + web/server/src/index.js | 83 + web/server/src/middlewares/user-middleware.js | 19 + web/server/src/models/postgresql/user.js | 108 + web/server/src/models/postgresql/webhooks.js | 76 + web/server/src/routes/billing.js | 38 + web/server/src/routes/shop.js | 75 + web/server/src/services/shopify/billing.js | 34 + web/server/src/services/shopify/shop.js | 77 + web/server/src/shopify.js | 31 + web/server/src/utils/misc-utils.js | 16 + web/server/src/utils/webhook-utils.js | 80 + web/server/src/webhooks/webhooks.js | 117 + 63 files changed, 15824 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierrc.json create mode 100644 Dockerfile create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 eslint.config.mjs create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 web/client/.gitignore create mode 100644 web/client/README.md create mode 100644 web/client/index.html create mode 100644 web/client/package-lock.json create mode 100644 web/client/package.json create mode 100644 web/client/public/favicon.ico create mode 100644 web/client/shopify.web.toml create mode 100644 web/client/src/App.vue create mode 100644 web/client/src/assets/base.css create mode 100644 web/client/src/assets/images/home-trophy-vue.png create mode 100644 web/client/src/assets/main.css create mode 100644 web/client/src/components/Common/DateRangePicker.vue create mode 100644 web/client/src/components/Common/SpinnerWrapper.vue create mode 100644 web/client/src/components/Home/WelcomeOnboarding.vue create mode 100644 web/client/src/components/Navigation/LanguageSwitcher.vue create mode 100644 web/client/src/components/Support/SupportDashboard.vue create mode 100644 web/client/src/composables/useBreakpoints.js create mode 100644 web/client/src/i18n.js create mode 100644 web/client/src/locales/de.json create mode 100644 web/client/src/locales/en.json create mode 100644 web/client/src/locales/es.json create mode 100644 web/client/src/locales/fr.json create mode 100644 web/client/src/locales/it.json create mode 100644 web/client/src/main.js create mode 100644 web/client/src/plugins/appBridge.js create mode 100644 web/client/src/router/index.js create mode 100644 web/client/src/services/useAuthenticatedFetch.js create mode 100644 web/client/src/stores/billing.js create mode 100644 web/client/src/stores/shopify.js create mode 100644 web/client/src/views/ExitIframeView.vue create mode 100644 web/client/src/views/HomeView.vue create mode 100644 web/client/src/views/NotFoundView.vue create mode 100644 web/client/src/views/SupportView.vue create mode 100644 web/client/vite.config.js create mode 100644 web/server/package.json create mode 100644 web/server/shopify.web.toml create mode 100644 web/server/src/database/data/-- SQLite Create Stats Table.sql create mode 100644 web/server/src/database/data/-- SQLite Stats One insert.sql create mode 100644 web/server/src/database/data/-- SQLite Stats inserts.sql create mode 100644 web/server/src/database/database.js create mode 100644 web/server/src/index.js create mode 100644 web/server/src/middlewares/user-middleware.js create mode 100644 web/server/src/models/postgresql/user.js create mode 100644 web/server/src/models/postgresql/webhooks.js create mode 100644 web/server/src/routes/billing.js create mode 100644 web/server/src/routes/shop.js create mode 100644 web/server/src/services/shopify/billing.js create mode 100644 web/server/src/services/shopify/shop.js create mode 100644 web/server/src/shopify.js create mode 100644 web/server/src/utils/misc-utils.js create mode 100644 web/server/src/utils/webhook-utils.js create mode 100644 web/server/src/webhooks/webhooks.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f891e49 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +web/server/node_modules +web/client/node_modules +web/client/dist + +/node_modules + +.gitignore +README.md + +shopify.app.toml \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7266e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# Environment Configuration +.env +# .env.* + +# Dependency directory +node_modules + +# Test coverage directory +coverage + +# Ignore Apple macOS Desktop Services Store +.DS_Store + +# Logs +logs +*.log + +# ngrok tunnel file +config/tunnel.pid + +# vite build output +dist/ + +# extensions build output +extensions/*/build + +# unwanted folders and files +myslider/ + +# Node library SQLite database +web/server/src/database/database.sqlite +shopify.app.toml diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..cfa0686 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +engine-strict=true +auto-install-peers=true +shamefully-hoist=true diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..257d686 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none", + "plugins": ["@shopify/prettier-plugin-liquid"] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..506eaf4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +FROM node:20-slim + +ARG SHOPIFY_API_KEY +ARG SHOPIFY_API_SECRET +ARG SCOPES +ARG HOST + +Run echo "SHOPIFY_API_KEY=$SHOPIFY_API_KEY" +RUN echo "SHOPIFY_API_SECRET=$SHOPIFY_API_SECRET" +RUN echo "SCOPES=$SCOPES" +RUN echo "HOST=$HOST" + +ENV SHOPIFY_API_KEY=$SHOPIFY_API_KEY +ENV SHOPIFY_API_SECRET=$SHOPIFY_API_SECRET +ENV SCOPES=$SCOPES +ENV HOST=$HOST + +EXPOSE 8081 +WORKDIR /app + +# COPY .env.prod .env +# COPY start.sh ./start.sh +# COPY shopify.app.prod.toml shopify.app.toml + +COPY web/server . +RUN npm install +# RUN npm install @shopify/cli -g + +COPY web/client ./client +WORKDIR /app/client +RUN npm install && npm run build + +WORKDIR /app +# RUN chmod +x start.sh +# CMD ["sh", "./start.sh"] +ENV NODE_ENV=dev +CMD ["npm", "run", "serve"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..59820b0 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Mini-Sylar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..dcda33a --- /dev/null +++ b/README.md @@ -0,0 +1,256 @@ +# Shopify App Template Using Vue v.2 🟢 + +[![MadeWithVueJs.com shield](https://madewithvuejs.com/storage/repo-shields/4969-shield.svg)](https://madewithvuejs.com/p/shopify-vue-app-template/shield-link) + +![Screenshot](https://drive.google.com/uc?id=1VKbiGd09QJ9c_TjpffQ5zasqxVLzqfgc) + +A template for building Shopify apps using Vue.js as the frontend. It is based on the [Shopify App Node](https://github.com/Shopify/shopify-app-template-node) template. + +--- + +## Table of Contents + +1. [Getting Started](#getting-started) +2. [What is Included?](#what-is-included) +3. [Internationalization](#internationalization) +4. [New Features in v.2.0](#new-features-in-v20) +5. [FAQ](#faq) +6. [Screenshots](#screenshots) +7. [App Submission](#app-submission) +8. [License](#license) + +--- + +## Getting Started + +1. Clone this repository or `npx degit Mini-Sylar/shopify-app-vue-template your-app-name` +2. Run `npm install` in the root directory +3. Run `npm run dev:reset` to configure your app (Initial setup only!) +4. Run `npm run dev` to start the app (Subsequent runs) +5. See `package.json` for other scripts + +--- + +## What is Included? + +### Vue Starter 💚 + +- [Vue.js 3.5](https://vuejs.org/) +- [Vue Router 4](https://router.vuejs.org/) for single-page app routing +- [Vue i18n](https://vue-i18n.intlify.dev/) for app localization +- [Pinia](https://pinia.esm.dev/) for state management + +--- + +## Internationalization 🌍 + +### Adding a New Translation + +- Use `Vue i18n` for app localization. To add a new language, create a new JSON file in the [`Locales Folder`](./web/frontend/src/locales/) and add the translations. See [i18n.js](./web/frontend/src/i18n.js) for setup. +- All translation files are lazily loaded, meaning only the translations for the current language are loaded. +- The default language is what Shopify returns via the `locale` query parameter. If not set, it falls back to `en`. +- Vue Router embeds the language in the URL, e.g., `localhost:3000/en` or `localhost:3000/zh/about`. +- The template has been localized. See the [`Locales Folder`](./web/frontend/src/locales/) folder. Translations may not be 100% accurate, so pull requests are welcome. + +--- + +## New Features in v.2.0 + +### Folder Structure + +#### Updated Structure: +``` +root/ +├── client/ # Frontend Vue app, See client README.md +├── server/ # Backend Node.js app +│ ├── database/ # DB configuration (default: SQLite) +│ ├── middleware/ # Middleware for user capture +│ ├── models/ # Models for User and Webhook +│ ├── routes/ # Default product routes +│ ├── services/ # Shopify product creator +│ ├── utils/ # Utilities (locale, webhook processing) +│ ├── webhook/ # Webhook handlers (GDPR compliance included) +│ ├── index.js # Entry point +│ └── shopify.js # Shopify configuration +``` + +- **Prettier** and **ESLint** configurations are now project-wide. +- ESLint updated to use the new flat config. + +--- + +### Shortcut Commands + +| Command | Description | +|-------------------------|-------------------------------------------------------------------------| +| `npm run shopify` | Run Shopify CLI commands | +| `npm run build` | Build the project (frontend and backend) | +| `npm run dev` | Start the development server | +| `npm run dev:reset` | Reset Shopify configuration | +| `npm run dev:webhook` | Trigger a webhook. Use `/api/webhooks` when asked for a domain | +| `npm run info` | Display info about the Shopify app | +| `npm run generate` | Generate a theme extension | +| `npm run deploy` | Deploy the app | +| `npm run show:env` | Show environment variables for production deployment | +| `npm run lint` | Run ESLint on the entire project | +| `npm run lint:server` | Run ESLint on the server only | +| `npm run lint:client` | Run ESLint on the client only | +| `npm run format:server` | Run Prettier formatting on the server | +| `npm run format:client` | Run Prettier formatting on the client | +| `npm run client:install`| Install client dependencies | +| `npm run client:uninstall`| Uninstall client dependencies | +| `npm run server:install`| Install server dependencies | +| `npm run server:uninstall`| Uninstall server dependencies | + +--- + +### Backend Updates + +- **GraphQL:** Removed REST resources in favor of GraphQL, as REST will soon be deprecated. +- **New Models:** + - **User Model:** Created when a user installs the app. + - **Webhook Model:** Tracks fired webhooks to prevent duplication. +- **Webhook Processing:** + - Verification and processing utilities added (new in v.2). +- **Bug Fix:** Fixed an issue with the product creator service. + +--- + +### Frontend Updates + +- Renamed `helpers` folder to `services`. +- Updated `useAuthenticatedFetch`: + - Now accepts custom headers in a config object. + - Includes `enableI18nInHeaders` to pass the user's locale (true by default). + - Locale can be read using the `getLocalePreferencesFromRequest` function in `utils.js` (server). + +--- + +### Deployment Enhancements + +- Updated **Dockerfile** for simpler deployment. + - Tested on Render.com. +- Added example `shopify.app.example.toml` configuration file. + - Allows multiple configurations (e.g., `shopify.app.staging.toml`). + - Production configurations should not be committed to avoid exposing sensitive information. + +--- + +## FAQ + +
+How do I deploy this app? + +#### Using My Own Server (Linux VPS/Render.com/Heroku) +1. Set up your domain, e.g., `https://shopify-vue.minisylar.com`. +2. Run `npm run show:env` to retrieve environment variables: + +``` +SHOPIFY_API_KEY= +SHOPIFY_API_SECRET= +SCOPES="write_products,read_products" +HOST=https://shopify-vue.minisylar.com +``` + +#### Using Dockerfile +- Add the variables in the environment section of your hosting service (e.g., Render). +- Build and deploy the Dockerfile. +- For manual deployment: + +```bash +docker build --build-arg SHOPIFY_API_KEY= --build-arg SHOPIFY_API_SECRET= \ +--build-arg SCOPES= --build-arg HOST= -t : . +``` + +> **Note:** Omit `<` and `>` when providing values. Store secrets securely if using CI/CD pipelines. + +
+ +
+How do I use MySQL or PostgreSQL for production? + +#### MySQL Example +```diff +- import { SQLiteSessionStorage } from "@shopify/shopify-app-session-storage-sqlite"; ++ import { MySQLSessionStorage } from "@shopify/shopify-app-session-storage-mysql"; + +sessionStorage: + process.env.NODE_ENV === "production" + ? MySQLSessionStorage.withCredentials( + process.env.DATABASE_HOST, + process.env.DATABASE_SESSION, + process.env.DATABASE_USER, + process.env.DATABASE_PASSWORD, + { connectionPoolLimit: 100 } + ) + : new SQLiteSessionStorage(DB_PATH), +``` + +#### PostgreSQL Example +```diff ++ import { PostgreSQLSessionStorage } from "@shopify/shopify-app-session-storage-postgresql"; + +sessionStorage: PostgreSQLSessionStorage.withCredentials( + process.env.DATABASE_HOST, + process.env.DATABASE_SESSION, + process.env.DATABASE_USER, + process.env.DATABASE_PASSWORD +); +``` + +
+ +
+How to call external APIs? + +Always call APIs from the server and forward responses to the frontend: + +```javascript +app.get("/api/external-api", async (_req, res) => { + try { + const response = await fetch("https://dummyjson.com/products", { method: "GET" }); + if (response.ok) { + res.status(200).send(await response.json()); + } else { + res.status(500).send({ error: "Failed to fetch data" }); + } + } catch (error) { + res.status(500).send({ error: error.message }); + } +}); +``` + +
+ +
+How to resolve CORS errors? + +- Verify configuration in `shopify..toml`. +- Ensure the dev domain matches the preview URL. +- Run `npm run dev:reset` to reset the config, then `npm run deploy` to push changes. + +
+ +
+How to update my scopes? + +1. Update the `scopes` in your `.toml` file. See [Shopify Access Scopes](https://shopify.dev/docs/api/usage/access-scopes). +2. Run `npm run deploy`. +3. Uninstall and reinstall the app in the Shopify admin dashboard. + +
+ +--- + +## Screenshots + +![Screenshot](https://drive.google.com/uc?id=1p32XhaiVRQ9eSAmNQ1Hk2T-V5hmb9CFa) + +![Screenshot](https://drive.google.com/uc?id=1yCr3lc3yqzgyV3ZiTSJjlIEVPtNY27LX) + +--- + +## App Submission + +Built an app using this template? Submit it here: [App submission form](https://forms.gle/K8VGCqvcvfBRSug58). + diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..e9d3077 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,36 @@ +# Security Policy + +## Supported versions + +### New features + +New features will only be added to the `main` branch and will not be made available in point releases. + +### Bug fixes + +Only the latest release series will receive bug fixes. When enough bugs are fixed and its deemed worthy to release a new gem, this is the branch it happens from. + +### Security issues + +Only the latest release series will receive patches and new versions in case of a security issue. + +### Severe security issues + +For severe security issues we will provide new versions as above, and also the last major release series will receive patches and new versions. The classification of the security issue is judged by the core team. + +### Unsupported Release Series + +When a release series is no longer supported, it's your own responsibility to deal with bugs and security issues. If you are not comfortable maintaining your own versions, you should upgrade to a supported version. + +## Reporting a bug + +Open an issue on the GitHub repository. + +## Disclosure Policy + +We look forward to working with all security researchers and strive to be respectful, always assume the best and treat others as peers. We expect the same in return from all participants. To achieve this, our team strives to: + +- Reply to all reports within one business day and triage within two business days (if applicable) +- Be as transparent as possible, answering all inquires about our report decisions and adding hackers to duplicate HackerOne reports +- Award bounties within a week of resolution (excluding extenuating circumstances) +- Only close reports as N/A when the issue reported is included in Known Issues, Ineligible Vulnerabilities Types or lacks evidence of a vulnerability \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..38fd0ae --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,35 @@ +import js from '@eslint/js' +import pluginVue from 'eslint-plugin-vue' +import globals from 'globals' + +export default [ + { + name: 'app/files-to-lint', + files: ['**/*.{js,mjs,jsx,vue,liquid}'] + }, + + { + name: 'app/files-to-ignore', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'] + }, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.browser, + ...globals.node, + myCustomGlobal: 'readonly' + } + } + // ...other config + }, + + js.configs.recommended, + { + rules: { + 'no-unused-vars': 'warn' + } + }, + ...pluginVue.configs['flat/essential'] +] diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..32120a7 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + }, + "types": [ + "@ownego/polaris-vue/dist/volar.d.ts" + ] + }, + "exclude": ["node_modules", "dist"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..47caac4 --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "skape-payment-rules", + "version": "1.0.0", + "main": "web/server/src/index.js", + "license": "MIT", + "type": "module", + "private": true, + "workspaces": [ + "web/client", + "web/server" + ], + "scripts": { + "shopify": "shopify", + "build": "shopify app build", + "dev": "shopify app dev --tunnel-url=https://payment-rules-dev.skape.store:3010", + "dev:reset": "shopify app dev --reset", + "dev:webhook": "shopify app webhook trigger", + "info": "shopify app info", + "generate": "shopify app generate", + "deploy": "shopify app deploy", + "show:env": "shopify app env show", + "lint": "eslint web/**/src/**/*.{js,vue,ts} --fix --ignore-pattern .gitignore", + "lint:server": "eslint web/server/src/**/*.{js,ts} --fix --ignore-pattern .gitignore", + "lint:client": "eslint web/client/src/**/*.{js,vue,ts} --fix --ignore-pattern .gitignore", + "lint:extensions": "eslint extensions/**/*.{js,ts,liquid} --fix --ignore-pattern .gitignore", + "format:server": "prettier --write web/server/src/", + "format:client": "prettier --write web/client/src/", + "format:extensions": "prettier --write extensions/**/*.{js,ts,liquid}", + "client:install": "npm install --workspace web/client", + "client:uninstall": "npm uninstall --workspace web/client", + "server:install": "npm install --workspace web/server", + "server:uninstall": "npm uninstall --workspace web/server" + }, + "optionalDependencies": { + "@shopify/cli": "^3.58.2" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@shopify/prettier-plugin-liquid": "^1.8.0", + "@vue/eslint-config-prettier": "^10.1.0", + "cli-color": "^2.0.4", + "dotenv": "^16.4.7", + "eslint": "^9.18.0", + "eslint-plugin-vue": "^9.32.0", + "prettier": "^3.5.1" + }, + "dependencies": { + "@shopify/shopify-app-session-storage-postgresql": "^4.0.17" + } +} diff --git a/web/client/.gitignore b/web/client/.gitignore new file mode 100644 index 0000000..38adffa --- /dev/null +++ b/web/client/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/web/client/README.md b/web/client/README.md new file mode 100644 index 0000000..d41b9cb --- /dev/null +++ b/web/client/README.md @@ -0,0 +1,58 @@ +# frontend + +Frontend for shopify-app-vue-template. Dependencies are automatically installed when you run `npm run dev` from the root directory. + +## Installed Dependencies + +- Vue Router +- Pinia +- Vue i18n + +## Project Structure + +``` +├─ client + ├─ .gitignore + ├─ index.html + ├─ package-lock.json + ├─ package.json + ├─ public + │ └─ favicon.ico + ├─ README.md + ├─ shopify.web.toml + ├─ src + │ ├─ App.vue + │ ├─ assets + │ │ ├─ base.css + │ │ ├─ images + │ │ │ └─ home-trophy-vue.png + │ │ └─ main.css + │ ├─ components + │ │ ├─ About + │ │ │ └─ TheAbout.vue + │ │ ├─ Home + │ │ │ └─ TheHome.vue + │ │ └─ NavBar + │ │ ├─ LanguageSwitcher.vue + │ │ └─ WelcomeNavBar.vue + │ ├─ services + │ │ └─ useAuthenticatedFetch.js + │ ├─ i18n.js + │ ├─ locales + │ │ ├─ en.json + │ │ └─ zh.json + │ ├─ main.js + │ ├─ plugins + │ │ └─ appBridge.js + │ ├─ router + │ │ └─ index.js + │ ├─ stores + │ │ └─ products.js + │ └─ views + │ ├─ AboutView.vue + │ ├─ ExitIframeView.vue + │ ├─ HomeView.vue + │ └─ NotFoundView.vue + └─ vite.config.js + +``` diff --git a/web/client/index.html b/web/client/index.html new file mode 100644 index 0000000..7642f7e --- /dev/null +++ b/web/client/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + SKAPE - Shopify App Template + + +
+ + + diff --git a/web/client/package-lock.json b/web/client/package-lock.json new file mode 100644 index 0000000..7b63f44 --- /dev/null +++ b/web/client/package-lock.json @@ -0,0 +1,2087 @@ +{ + "name": "client", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "2.0.0", + "dependencies": { + "@ownego/polaris-vue": "^2.1.20", + "@shopify/app-bridge": "^3.7.10", + "@shopify/app-bridge-types": "^0.0.16", + "apexcharts": "^4.4.0", + "pinia": "^2.3.0", + "recharts": "^2.15.1", + "vue": "^3.5.13", + "vue-i18n": "^11.0.1", + "vue-router": "^4.5.0", + "vue3-apexcharts": "^1.8.0" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.10.5", + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.7" + } + }, + "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/runtime": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz", + "integrity": "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==", + "license": "MIT", + "engines": { + "node": ">=6.9.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.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@intlify/core-base": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.0.1.tgz", + "integrity": "sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "11.0.1", + "@intlify/shared": "11.0.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.0.1.tgz", + "integrity": "sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "11.0.1", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.0.1.tgz", + "integrity": "sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "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/@ownego/polaris-vue": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/@ownego/polaris-vue/-/polaris-vue-2.1.31.tgz", + "integrity": "sha512-qz3/AmCOqPRKDDH4y8D6ngnLZ+fFVsdmIJoOSYzDX7pZeK5GtTRJZCE7YBJjbsvAKsKVQdYJDoAEUalRepcQ9A==", + "license": "MIT", + "dependencies": { + "@shopify/polaris-icons": "9.3.0", + "vite-svg-loader": "^5.1.0" + }, + "peerDependencies": { + "vue": "^3.3" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shopify/app-bridge": { + "version": "3.7.10", + "resolved": "https://registry.npmjs.org/@shopify/app-bridge/-/app-bridge-3.7.10.tgz", + "integrity": "sha512-zy4c05DEOkYXm1yWIe0FrI0lq6hzffIT4JWzb9XKqY5OPRNHRHg+ihDt0ZnR8eMVmYV03yStpGAITIfqOgn4TQ==", + "dependencies": { + "@shopify/app-bridge-core": "1.1.1", + "base64url": "^3.0.1", + "web-vitals": "^3.0.1" + } + }, + "node_modules/@shopify/app-bridge-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@shopify/app-bridge-core/-/app-bridge-core-1.1.1.tgz", + "integrity": "sha512-kEnJUpkC9vDdmGMN3Mezq/FlDBqP+DFg/A1PFzqTW8FILu0wzFmz1aFk4Hxy6Y6ilceMmn8QXsyLA9DfaeH4jQ==" + }, + "node_modules/@shopify/app-bridge-types": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@shopify/app-bridge-types/-/app-bridge-types-0.0.16.tgz", + "integrity": "sha512-UjKot8gOAv0qc9dxaooQv9fl1ob6zlupuOAgexj++H8cYQuAD8I6cbJ/whY4skqRXM/qZn68vuERq3eeDlByJg==", + "license": "ISC" + }, + "node_modules/@shopify/polaris-icons": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shopify/polaris-icons/-/polaris-icons-9.3.0.tgz", + "integrity": "sha512-fnH5Lcd3WFZNjlxGYGNtnjeq3P2xonRV8vChW4PqBfxdKlY/GQ/3/rIuxHzIgmLL0zukeZUaqERUN0lwSU+Xmg==", + "license": "SEE LICENSE IN LICENSE.md", + "engines": { + "node": ">=20.10.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@svgdotjs/svg.draggable.js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz", + "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==", + "license": "MIT", + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@svgdotjs/svg.filter.js": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz", + "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.js": "^3.2.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@svgdotjs/svg.js": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz", + "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Fuzzyma" + } + }, + "node_modules/@svgdotjs/svg.resize.js": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz", + "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.select.js": "^4.0.1" + } + }, + "node_modules/@svgdotjs/svg.select.js": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.3.tgz", + "integrity": "sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==", + "license": "MIT", + "engines": { + "node": ">= 14.18" + }, + "peerDependencies": { + "@svgdotjs/svg.js": "^3.2.4" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" + }, + "node_modules/apexcharts": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", + "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", + "license": "MIT", + "dependencies": { + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" + } + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "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/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "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/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.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/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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/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/pinia": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.0.tgz", + "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "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/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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recharts": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/rollup": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "dev": true, + "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.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT", + "peer": true + }, + "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/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "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/vite-svg-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vite-svg-loader/-/vite-svg-loader-5.1.0.tgz", + "integrity": "sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==", + "license": "MIT", + "dependencies": { + "svgo": "^3.0.2" + }, + "peerDependencies": { + "vue": ">=3.2.13" + } + }, + "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": "11.0.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.0.1.tgz", + "integrity": "sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "11.0.1", + "@intlify/shared": "11.0.1", + "@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/vue3-apexcharts": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.8.0.tgz", + "integrity": "sha512-5tSD4mXTBbIJ9ir+58qHE6oNtIe0RNgqIRYMKpcsIaxkKtwUww4JhvPkpUFlmiW4OJbbdklgjleXq1lfcM4gdA==", + "license": "MIT", + "peerDependencies": { + "apexcharts": ">=4.0.0", + "vue": ">=3.0.0" + } + }, + "node_modules/web-vitals": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.3.2.tgz", + "integrity": "sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q==" + } + } +} diff --git a/web/client/package.json b/web/client/package.json new file mode 100644 index 0000000..d4894c9 --- /dev/null +++ b/web/client/package.json @@ -0,0 +1,30 @@ +{ + "name": "client", + "version": "2.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint src/**/*.{js,vue,ts} --fix --ignore-pattern .gitignore", + "format": "prettier --write src/" + }, + "dependencies": { + "@ownego/polaris-vue": "^2.1.20", + "@shopify/app-bridge": "^3.7.10", + "@shopify/app-bridge-types": "^0.0.16", + "apexcharts": "^4.4.0", + "pinia": "^2.3.0", + "recharts": "^2.15.1", + "vue": "^3.5.13", + "vue-i18n": "^11.0.1", + "vue-router": "^4.5.0", + "vue3-apexcharts": "^1.8.0" + }, + "devDependencies": { + "@rushstack/eslint-patch": "^1.10.5", + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.7" + } +} diff --git a/web/client/public/favicon.ico b/web/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/web/client/shopify.web.toml b/web/client/shopify.web.toml new file mode 100644 index 0000000..b2a219d --- /dev/null +++ b/web/client/shopify.web.toml @@ -0,0 +1,5 @@ +type="frontend" + +[commands] +dev = "npm run format && npm run dev" +build = "npm run build" diff --git a/web/client/src/App.vue b/web/client/src/App.vue new file mode 100644 index 0000000..1e5d752 --- /dev/null +++ b/web/client/src/App.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/web/client/src/assets/base.css b/web/client/src/assets/base.css new file mode 100644 index 0000000..2768db4 --- /dev/null +++ b/web/client/src/assets/base.css @@ -0,0 +1,351 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type='search'] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/web/client/src/assets/images/home-trophy-vue.png b/web/client/src/assets/images/home-trophy-vue.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdc98d88dfbe9227bec2624949f3dcf662a367 GIT binary patch literal 16126 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%0A*cALz*Yat|Ln z8_RppH#F1n zFL;kdRFN$ZIYJ)vJ#XJvRD_hAZ*vtzN+!gs;$vY&8kcow^bb2KFhOXSW=y~(P5y%u z%&e|XQp%ds9_;p^0Z5pJ|H0DO;GDZ*T?o#$?y!{;<*dDBh`Ec}=q>_){2|O!cfUP}~MkbDvTKj}Ps*ecHXPb(u zFm|bT8WN%jgAXa4|8Azue;{_LR&PL50SsgbGT1Xsjr??-chN4H{gr6oE2{CAl5S1P zS0_uEfXPmP0q^~RcnnX&Bp(~96F~n63aQs<6+&BZV*df~brTb2qS~UY%Cgm04o?Xe z8%NKZPn4*WrD_klr#^TP#5t<|K%MQjkM`GS$O4N&L!1-$jMH*za-W7nRDrE;DL#DT z21d%`d!?XN+d=b6Yxq+QRMk{XhOQ4hyo9ql4{Dlw(1PLZbtT4okwXS8gekj~TS>GH zc!|Wx-mP;zboJPrZj{6HHF*jO^YhCV#PUAqHb{#%l>&}Sc?wckIH19wG(n0l*Gul2 z89783s`tbfMau>`M9@dYYkyn9$Y7*Ar;9xVg(syvzt4g{l!>nM-a1W4Su6AQA?6yo zFHsqtE8*qUqr=a2R68_!8~$nM=FunrIZf_J*Ym-=!!Mb_+nl5){UdfY5c=V1$4PEz zu+?C@EdUHV*g?iQ?3ft~g1=AXD!vjvv=K{qQgU%?MI&rX&z zZIn`T!b^XX)@odR(p(mGY8&@8GsF6o5#KhnoYg2RBgZ(v)_^v(Q6vtSPX`ZtBVAYZ zJxmZNpcif0NCY|C32s6BE<<(HS!yFu;qMXe!3cIjm!_;NcjQ$GKBlt2<8>9Z-fp?i z9zETpH)9)#ZEHHR*JeT8{Z>y|soRGa)kkHRhHx%6M=Wg&%9KF|3E-mS2+^fRIOi8QE>~?WBpA9i+~Lt$Y@+PG~I98C<&k5mY>wU z(Z)SzoZ|u#cBtL!znV^TA;y0AEq=;LZ4gTb-ymQEO=4VK-5Q<4E*YER+)IAm9k5eW z7Q0+zJ9H~+v>IvWCieee)U!IS|6I5eq)KCmm~}?j5~Fl;eChg9`jo)K+13cF0hN;R z$w}%IXSkU@%NhZAdx3Pbp~(p6B*x3;_*m9rk#vQ^E;obCd_2GE{wNWAN2Me|3Q2_e zRkVn<<2HxEe4aXX(otrI1A`Z=!u6)Fhr9b-jF~ ztkAktrIXSwj9%j|j1(Q6tTTx*EqGv#xV{k%zQ3Og0Xf}8eg5t_|Me^MX%5{SqI_Ie zNQb;L;}(DnWD4erm0ytKrgu@GCc@k9OPCwLIBMb)Nfvg`O)>1F6dNe+GY3OH6+$huDmnU(sY>#r1}uke!wE!q^8!iocKU(Z~X8$T7(-&+!>e}LnJPyM~k?k5bCd4ZY5mF>*#K>T)RD)C# z#Pg05K7Qn8T(QYP&S@9zO&*L2KQuBL6;{()Soy(&s5;BM;{mRua|=Fx9obj?Wa?)< z9_p8F4ZTXhm`OmMV`pWEeB8Y}$a1VkPeXZTcTQ9eek0SvN8<^}rFl}^aucr7f77lV7vzakx^-e3S}qn=`~TdLT}>YL<8wSMsXdrP8te^}U39R=*Mmz?muqoBigfUus?=rx^6r zI=}GuunLckeND|+&*CBdLPid9TLOgKNlAZE_y(8X<+RLbG77^pl%Jxl1df1=lNsv9 zZ1T2}R!M*{@0W9=p15Ll!LpO|l;tAGE&mPOc|Ot0!rn!U`5`R@#6>D@ADF`v&l+ED z^!9hiib3OmGX^Uf3&YckpT=mp8?WE4#?f`dVnA@)JkF(W2kE-6%G2H8v*n(d(tu%U z;Z^+|z=2)f%*P`smZyblu{ot>PF5lnsHx1sG%ZuwV!Dl@x?I&e{QaD=iMeZ6iD%mB zE9!#%O4WZVo--T=F_kG`0U19z+Ba{zUl?lautoUcAiYhCnfa-kC?f}eSECqn-OjVK zGwv7C??f*Bo#aB{zxf~Mm`Wbv-i8BB_^_5lmCwN4vCV`Iq&S3m7Wy&Rs&H^FQYTl{o=KBi^lx$& zzsukK9mal_uCC_5F-iA8!u;q%{ag11XSfc@E)fg@s30~J;)uY-HcT5Ba5~C@Se>UrqR*@KRv=cehcB8a_);<879ex$rS3AX< zpgSoEen>z0I;S;w#ou*`^Z=3S1w8fOZw6k>x{NvG*Go$WVlZ~i3G~xNdXn1U=B(Om ze`5k8^h*=X6lbXlKH|V$Y_3EJtWuN~g?+DI1Vrj97z?VC8MMORiiZ+eCzfY5V54ir zd}@I3*w{&c&0aETDq-#Yu8UhSByiSHxSpQgq+H9dkx%}3DDhqS{j&LN1?|ebwNULq zrS(-jc-DEK;3+0_1S68M&H%6C;r2_6FYkq>Yya*UY7hxmiN}-AbAelj!rM-pLjpOX zz)H}@Z-c`(Y)MC8%I^;>G?`KMyKeE6D&SgXls~Q^ahL{)5j!*(2hp7n(WkIpmIL&L z^cYL+{fQEv^UB3M&U<%4ziV91z6|F99!cq|NXE9dp3=oKS*{mNJ4d?q^r6P;tmM8` zz4&fO3ii!?LyU3z=c=UwSX{rnQDEFiYSJ5G;6rx8Hc-Uo@fQU3VQ;+Jagf^IS~ zJTWnGbRdNj+A4ARjnHO|!7zZwNlyCmQ+9sP1KHhsDvt}l;V-L zz-@F>HgASSF;o+o!-PgS*dRP5LS=-~DMle03qTUqBC(HU=QA(&D5e11iHNa>rnZ(r zi{d|IduD|jkpk=x+ajEEQVLPJ%FDnw%tZzP%@;e+!u?3#)+*y)Uw192dx~E6qdA@0 z9!)6;2=icE`C`1$ddfaOlOd=DPv%66*avwIAZ9@6FN4AO_R;Zs+NZ(_Y$(}~=+RL4 ziYhaT7%E!7&C-lc;~p%M5MD04^Y*v=CDsG8Mw(BmVO2}z&uFt*=P?DW_tnw9ZfBAb{c)N_g%ZMXQ5iX{;RFJb zg9nLe{1O4IkeIt<1mNbP@WjM~cDd03+=2{6mBeq{6ZL&BaZF)P+B%t0vPtm^tN3yj~g5PDU$8A!+LDyDrjGF?9-=W!bRc6fOip# z4dte2)ix%&0thlyW(X*%fE5fWz@lP#65vKVl<0fCMTNfN9|anX+BXixc?aFtq5QX=m>zWsoFqCs)VytLb!^9n|wr<5bERcT$SZ#QMkv- zS?jGs;2|p2B5Z<&1=0X5A?zD+496u>#lMYB>xXSB|7(A_ui?f?QT4$$0o2QRjT6M*$*ELz1l zQgj$FBZ{o|DGX8u4nI83(YVB8&Ht)XR44=f@Y{k$4qD=;V4M>QcQ`BY4g#`Ou&(Ta zUeOv%ODMp}TljnC^k$UK4lG;qk_3*Mt4faok{To$!<+JC5Exc?Pk!ho(_!dH!121g z+VY8gY|vp#WoooJt-;_yp2WIl8Wo!E&Zr)F%A-h7Nw7A2QDF_Q_@^!}>8l5~aVmb3 z=0nuu_7zGv^A{}M@kYgS6*Hsq#jWV_f4GQXU)fScfmP71>B;fB%5;Qc_M61hk<|H6 z!?Wv4pG{?QB4_38;oc_8%Nc8pwK?p?+t|03>6tZQtuBub7pY2f*LFXR-`PI-T++O} z)zJ_#$g2DW8QjiXBY3lZeR}G+1`faa!3ggOkNm?PWH@YDcImqHnAz={PM;+GQ)i~Y z_VHui4a_-ha<-H<*ON$AnWXuE-otkRFcPd!wZRLk22Y`hJLwvw8$R%# zMVv6MbE?~4JtMYlk+)Zs3z)0bD$Z&yu6%)x&FT_o9N9ULfW=5x$Es?1I4u(#qvJJ( zj^rkX6k;4Ht2Q(XwZ046l-KP$o6Kg{5ExT;?xs<|trla(P=QRkFqn-cF={d!rC`9@ zFJ#`^qN{wz$NK(DCOl9ao^03E)4QkjbyNp7!pS3T7spD-9l?+t*GlpC12te$qa-_2I{fpf*Z2nd*IwCTUft4s1f{1v6sfR*Rb zd;MJJnA2o-_!u8_*nKMSWQ^8WD0!oMPH4lL_p@eW97H`0C;Q;^E;6rtqhEBITl(-T z+!+J2+iC@IR-Re>2)!pWnZF}CF~<{9KvSx0ra zoxTMtM9j&!-=NmZVm6Uct+7Ue*JJmMNy;^h+dpYnn#RT4@~j z1FKXm8lVdlt6xcBtlgBn_#8G_pVxhSuJ6BhBR6Cj- zN%^K>Lnor9vgq>Sy$WD{fwN<)6);PbM@=ECjB*U{wR0aK7=rl4tq?`Gn#yHVTJ^H5 zx*qj>SZFhUNx8E6jozE}@AB0FKOs&twjrGxk^5bz`~>3-6rja#ufBidJA}c&c4-b; zOIM211KU?Hv)J?G-lzP-SfMW)hy`aQwi*4NT_0;Q4#bzfax8=}_R(0tqJljcC8RM) z0-VP6DOc}HhTIe3q3t39V-w0vFM0RmZ3GL`YSFhSC7F9AGJ5yjn+?SPMBy^0x-DA? zdVAf{<{iVN;mUNa8g)7@=rljBjxTTeZ;nxK5( zr0cb~rtS2i&tpk-r6OUAfmQo!0d3*_^%@$(b5mLAJFvxW1BB+rStBhsfzeDc}(--K^HZW%P_aw=rf)Y{{Xo*P4VdurA_I5Hp9%OlQ>n$ z1v14w*F#_fSci40ie^=`CQjqe$w2@Gm5W&(uJO_N8qAX_p@ zMzrfNW`qPDOU*Wcbz5)nkOz;{jj7+l3ybKe7Bs=CTPnIf(1|2FgjecW<)z+@1C>IZ zBx88=bUX2hshl?^ye5nzF7?crEFS}(iH?-?F5FAI8hVNv0nqS3bHtpz$|vJE)X}I@ ze{mEuv|j<#J3XD1jkA(3zGejF_Q=ap!KikF@et;Qja9~q`xX~Fb5TT~^)ed6H)gWp zYv{TJ!)D77MM~Yyxq%Q8Xlb+?9XuF0XV>VG;1@zfXNbwPOWzK>sY3H+Sb55_)8A~e zrVjh`hXc5UM+J2mOXb>1&I)6y-dUxMA^@$I&=?{s{Xdb!nKHeBW zP{x1<`uX9uO}UQWJ?4yWqSW&XNt!8P#Dv*h2pP1>y#1vvaBPCd`$74UzEw+C zMNvkv;L%I#8;3BG@}8S2^cAfUYaJ~gO6z>_GGN|*CeEFFh~~b%p@={yc1X-4 zz9(b0#zK80g`XICmy5y+HBdrI;JIy|ACXGa>M3BS$;AhKv(5YhE0~RLuVj_*@?ur8 zUQI=Y==JR9==i&(U{~9-k{Jf(EQOt+VtZ{uzoEN_=Q)izD~U!-)gr;pz8`46?SfRn zeSK>;RT%4y=7c`*>b>G1t;=vfQS+EyRBBJh<7fGUb0T+s*-c;z($*2b|8&(9;s#TY5Ot_dV8*=KQ^ zjNT&ENbaiWp(ESN>L@s@0xK%Tr!n zzQ$9nN`Dk^nR1I|e+Ki7>F%S{___*N?B({XGKSnFOQgHNo1lp;CT03VAGLTF4+?=u z0NO|p~gT~ z2oyC4b@~H}02K>Je4i0xd40Z0;LzATu81sqO|xP!NFd;ll0Rf z@*gg_dee5rOyT-2j}{Iq9m)hT#+9Z%Qg3=;t}9%&Daj8*5#t{NZ!isV zVu)Ayv5W-skv`z<2VmNm!#u|$%%81M0 zs`CcY=|<}Lf`(|hjPTmKc`BgH$Jr`qlXoiP30h0km3yOo78V_5^2Z&x=Ed^^QDBUb z*fm+an=VoYPH?90r?CPWNy6FMsr%>@_y$k8?^%PjLmjDa36f$zJ#A0*j9(8 z8jQTc)AknSlc#Cmltu0*<_I{bn7}lViUgxUug&NGzOnywk&T}id-MK$84b{^%O#-( zw4X90MXqpAkDUS*; zsS2jHoPI7kvD~2-Dt%F|gRA^(1Z}2%GVe`sF+vW@&}fdBB`d9NEv46nQU!>HU}@P= zdI6*KIqRDe`8pz)d`=w#V&fQwe00Y_2nTZVXXNNx5fTqn)DqlyosNK?Wfjgza9R~g z3L{w@%cjvQ;lJPgDgVCdTpl}gPS1fvsM1i#!Wp`H8V6g$*punF)LpBxE zJ4!|T(EWj=CT;Nw4X)N3PSPEWHI1I)EoguvvU4b<>q^dOh<7udD~oEsy8N5eO*qdf z1y*}(NgE)|XDCZ!u7sZv@c&-rT3=fju3mv&>j$emIi0d~PNxt$Rf+-^JPJCA zL>a6+=zAGF*EPm?^8sgNC?jw2&N<29Z||JPu=Q(xTHllrM{5dGD|%i`^{el>tSjt- z0tQ9FpP!Dqv2q+TAKKwDYVSEbGQEIOsRZx{3C1)rr}~ZmqdT}@j8X^x?W1xwbR#ej$L|lD~f&Z-PAjpUDc9;QiF%? zZTlTvt}UeS4{O*IF4Y;Zlw5!W!2__=U|gvFI%GT_6+l$HGo4>erY$B>?fEpD0UqST zrzfc@p=Gb5P+2Vv2~f16Ohdn`D0)@G!0gSZhtvJT$lO-#i648w9X>)b<9nlPq1V(u YwuAkXJSBDh{6bw@U0 + + + + + + + + + +