diff --git a/.env b/.env
index 2accbba8184..7bdf3125a43 100644
--- a/.env
+++ b/.env
@@ -1 +1,4 @@
-ESLINT_NO_DEV_ERRORS=true
+VITE_SUPABASE_URL=https://lvarnwvfwquizwqetwsk.supabase.co
+VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imx2YXJud3Zmd3F1aXp3cWV0d3NrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzE0MTc1NDgsImV4cCI6MjA4Njk5MzU0OH0.M4ecQlrk_MJdJFAJRGLDQ3YR7fZBrLbHeWNCdZ0-y68
+VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51T2TKDRNV9PCAZulVS4WddK0fFJnUV3V8RXAdWWeMbokPJk5EAUHIXc801KkxXQNBCJg7543fjiVtxVJMpebhuo500x0q99xA2
+VITE_NOVAPOSHTA_API_KEY=6eb24dda6440fa02a9a5f575aa71be2815017ed7
\ No newline at end of file
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 7d5b7a94f4d..00000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/build
-/node_modules
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index b51149cf57d..00000000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,108 +0,0 @@
-module.exports = {
- env: {
- browser: true,
- es2024: true,
- },
- extends: [
- 'plugin:react/recommended',
- "plugin:react-hooks/recommended",
- 'airbnb-typescript',
- 'plugin:@typescript-eslint/eslint-recommended',
- 'plugin:@typescript-eslint/recommended',
- 'plugin:prettier/recommended',
- 'plugin:cypress/recommended',
- ],
- overrides: [
- {
- 'files': ['**/*.spec.jsx'],
- 'rules': {
- 'react/jsx-filename-extension': ['off'],
- }
- }
- ],
- parser: '@typescript-eslint/parser',
- parserOptions: {
- ecmaFeatures: {
- jsx: true,
- },
- ecmaVersion: 12,
- project: './tsconfig.json',
- sourceType: 'module',
- },
- plugins: [
- 'jsx-a11y',
- 'import',
- 'react-hooks',
- '@typescript-eslint',
- 'prettier'
- ],
- rules: {
- // JS
- 'semi': 'off',
- '@typescript-eslint/semi': ['error', 'always'],
- 'prefer-const': 2,
- curly: [2, 'all'],
- 'max-len': ['error', {
- ignoreTemplateLiterals: true,
- ignoreComments: true,
- }],
- 'no-redeclare': [2, { builtinGlobals: true }],
- 'no-console': 2,
- 'operator-linebreak': 0,
- 'brace-style': [2, '1tbs'],
- 'arrow-body-style': 0,
- 'arrow-parens': 0,
- 'no-param-reassign': [2, { props: true }],
- 'padding-line-between-statements': [
- 2,
- { blankLine: 'always', prev: '*', next: 'return' },
- { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
- { blankLine: 'any', prev: ['const', 'let', 'var'], next: ['const', 'let', 'var'] },
- { blankLine: 'always', prev: 'directive', next: '*' },
- { blankLine: 'always', prev: 'block-like', next: '*' },
- ],
- 'implicit-arrow-linebreak:': 0,
-
- // React
- 'react/prop-types': 0,
- 'react/require-default-props': 0,
- 'import/prefer-default-export': 0,
- 'standard/no-callback-literal': 0,
- 'react/jsx-filename-extension': [1, { extensions: ['.tsx'] }],
- 'react/destructuring-assignment': 0,
- 'react/jsx-props-no-spreading': 0,
- 'react/state-in-constructor': [2, 'never'],
- 'react-hooks/rules-of-hooks': 2,
- 'jsx-a11y/label-has-associated-control': ["error", {
- assert: "either",
- }],
- 'jsx-a11y/label-has-for': [2, {
- components: ['Label'],
- required: {
- some: ['id', 'nesting'],
- },
- allowChildren: true,
- }],
- 'react/jsx-uses-react': 'off',
- 'react/react-in-jsx-scope': 'off',
-
- // Typescript
- '@typescript-eslint/explicit-function-return-type': 'off',
- '@typescript-eslint/explicit-module-boundary-types': 'off',
- '@typescript-eslint/no-unused-vars': ['error'],
- '@typescript-eslint/indent': ['error', 2],
- '@typescript-eslint/ban-types': ['error', {
- extendDefaults: true,
- types: {
- '{}': false,
- },
- },
- ],
- },
- ignorePatterns: ['dist', '.eslintrc.cjs', 'vite.config.ts', 'src/vite-env.d.ts', 'cypress'],
- settings: {
- react: {
- version: 'detect',
- },
- },
-};
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 00000000000..43739399374
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,36 @@
+name: Deploy to GitHub Pages
+
+permissions:
+ contents: write
+ pages: write
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Build the app
+ run: npm run build
+
+ - name: Deploy to GitHub Pages
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: gh-pages
+ folder: dist
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 6cfdef607bd..c8a75e3b2fc 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -2,22 +2,24 @@ name: Lint
on:
pull_request:
- branches: [ master ]
+ types: [opened, synchronize, reopened]
jobs:
- run_linter:
-
+ fix-style:
+ name: Run fix-style on PR
runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [20.x]
-
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
with:
- node-version: ${{ matrix.node-version }}
- - run: npm install
- - run: npm run lint
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Run fix-style
+ run: npm run fix-style
diff --git a/.gitignore b/.gitignore
index 885c5fa6a45..0ded9ab5bb6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,25 @@
-.idea
-.vscode
-build
-dist
-node_modules
-.DS_Store
-
+# Logs
+logs
+*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
-raw_reports
-reports
-cypress/screenshots
-cypress/videos
+node_modules
+
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+dist/
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000000..2312dc587f6
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1 @@
+npx lint-staged
diff --git a/.prettierrc b/.prettierrc
index 49b905d6905..14068e80a7f 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,11 +1,14 @@
{
- "arrowParens": "avoid",
+ "experimentalTernaries": true,
"singleQuote": true,
- "tabWidth": 2,
- "trailingComma": "all",
+ "quoteProps": "consistent",
+ "singleAttributePerLine": true,
+ "arrowParens": "always",
+ "bracketSameLine": false,
+ "bracketSpacing": true,
"jsxSingleQuote": false,
"printWidth": 80,
"semi": true,
- "bracketSpacing": true,
- "bracketSameLine": false
+ "tabWidth": 2,
+ "trailingComma": "all"
}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000000..74baffcc474
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["denoland.vscode-deno"]
+}
diff --git a/README.md b/README.md
index 3e1213ef5f7..ea106fd9d73 100644
--- a/README.md
+++ b/README.md
@@ -1,143 +1,349 @@
-# React Product Catalog
-
-Implement the catalog with a shopping cart and favorites page according to one of the next designs:
-
-- [Original](https://www.figma.com/file/T5ttF21UnT6RRmCQQaZc6L/Phone-catalog-(V2)-Original)
-- [Original Dark](https://www.figma.com/file/BUusqCIMAWALqfBahnyIiH/Phone-catalog-(V2)-Original-Dark)
-- [Rounded Blue](https://www.figma.com/file/FRxncC4lfyhs6og1L6FGEU/Phone-catalog-(V2)-Rounded-Style-2?node-id=0%3A1)
-- [Rounded Purple](https://www.figma.com/file/xMK2Dy0mfBbJJSNctmOuLW/Phone-catalog-(V2)-Rounded-Style-1?node-id=0%3A1)
-- [Rounded Orange](https://www.figma.com/file/7JTa0q8n3dTSAyMNaA0u8o/Phone-catalog-(V2)-Rounded-Style-3?node-id=0%3A1)
-
-You may also implement color theme switching!
-
-## If you work in a team
-
-Follow the [Work in a team guideline](https://github.com/mate-academy/react_task-guideline/blob/master/team-flow.md#how-to-work-in-a-team)
-
-## Project Setup from scratch
-
-Follow the [Instruction](https://github.com/mate-academy/react_phone-catalog/blob/master/setup.md) to setup your project, add Eslint, Prettier, Husky and enable auto deploy.
-
-## Data
-
-Use the data from `/public/api` and images from `/public/img` folders. You can reorganize them the way you like.
-
-## App
-
-1. Put components into the `src/components` folder.
- - Each component should be a folder with `index.ts`, `ComponentName.tsx`, `ComponentName.module.scss` files.
- - Use CSS modules.
- - Keep `.module.scss` files together with their components.
-2. Advanced project structure:
- - `src/modules` folder. Inside per page modules `HomePage`, `CartPage`, etc., and `shared` folder with shared content between modules.
- - Inside each module its own `components` folder with the structure described above. And optionally other files/folders: `hooks`, `constants`, and so on.
-3. Add the sticky header with a logo, navigation, favorites, and cart.
-4. The footer with the link to the GitHub repo and `Back to top` button.
- - The content should be limited to the same width as the page content;
- - `Back to top` button should scroll to the top smoothly;
-5. Add `NotFoundPage` containing text `Page not found` for all the unknown URLs.
-6. All changes the hover effects should be smooth.
-7. Scale all image links by 10% on hover.
-8. Implement all form elements and icons according to the UI Kit.
-
-## Home page
-
-Implement Home page at available at `/`.
-
-1. `
Product Catalog ` should be visually hidden.
-2. `PicturesSlider`:
- - Find your own images to personalize the App;
- - Change pictures automatically every 5 seconds;
- - The next buttons should show the first image after the last one;
- - Dashes at the bottom should allow choosing an exact picture.
-3. `ProductsSlider` for the `Hot prices` block:
- - The products with a discount starting from the biggest absolute value;
- - `<` and `>` buttons should scroll products.
-4. `Shop by category` block with links to `/phones`, `/tablets`, and `/accessories`.
-5. Add Brand new block using ProductsSlider with products that are the newest according to the year field.
-
-## Product pages
-
-There should be 3 separate pages `/phones`, `/tablets`, and `/accessories`.
-
-1. Each page loads the data of the required `type`.
-2. Add an `h1` with `Phones/Tablets/Accessories page` (choose required).
-3. Add `ProductsList` component showing all the `products`.
-4. Implement a `Loader` to show it while waiting for the data from the server.
-5. In case of a loading error show the something went wrong message with a reload button.
-6. If there are no products available show the `There are no phones/tablets/accessories yet` message (choose required).
-7. Add a `` with the `Newest`, `Alphabetically`, and `Cheapest` options to sort products by `age`, `title`, or `price` (after discount).
- - Save the sort value in the URL `?sort=age` and apply it after the page reload.
-8. Add `Pagination` buttons and `Items on page` select element with `4`, `8`, `16`, and `all` options.
- - It should limit the products you show to the user;
- - Save pagination params in the URL `?page=2&perPage=8` (`page=1` and `perPage=all` are the default values and should not be added to the URL;
- - Hide pagination elements if they do not make sense;
- - You can use the logic explained in [the React Pagination task](https://github.com/mate-academy/react_pagination#react-pagination).
-
-## Product details page
-
-Create `ProductDetailsPage` available at `/product/:productId`.
-
-1. `ProductCard` image and title should be links to the product details page.
-2. Use `Loader` when fetching the product details.
-3. Show the details on the page:
- - Display the available colors from colorsAvailable and the capacities from capacityAvailable as radio inputs, allowing the selection of one value from the offered options;
- - `About` section should contain a subheader with description;
- - Choose `Tech specs` you want to show.
-4. Add the ability to choose a picture.
-5. Implement `You may also like` block with products chosen randomly:
- - Create `getSuggestedProducts` method fetching the suggested products.
-6. Add `Back` button working the same way as a Browser `Back` button.
-7. Add `Breadcrumbs` at the top with:
- - A Home page link;
- - A category page link (`Phones`, `Tablets`, `Accessories`);
- - The name of the product (just a text).
-8. Show `Product was not found` if there is no product with a given id on the server.
-
-## Shopping Cart page
-
-Create a Cart page with a list of `CartItem`s at `/cart`.
-Each item should have an `id`, `quantity`, and a `product`.
-Use React Context or Redux to store Items.
-
-1. `Add to cart` button in the `ProductCard` should add a product to the `Cart`.
-2. If the product is already in the `Cart` the button should say `Added to cart` and do nothing.
-3. Add the ability to remove items from the `Cart` with an `x` button next to a `CartItem`.
-4. Add a message `Your cart is empty` when there are no products in the `Cart`.
-5. Add the ability to change the item quantity in the `Cart` with `-` and `+` buttons (it should be > 0).
-6. Total amount and quantity should be calculated automatically.
-7. Show the quantity at the `Cart` icon in the header.
-8. Save the `Cart` to `localStorage` on each change and read it on page load.
-9. `Checkout` button should show a modal dialog with the text `Checkout is not implemented yet. Do you want to clear the Cart?`:
- - Clear the Cart if the user confirms the order;
- - Keep the Cart items and close the confirmation on cancel;
- - Use the `confirm` function if you don't have a better solution.
-
-## Favorites page
-
-Create `Favorites` page with a `ProductsList` showing favorite products at `/favorites`.
-
-1. Add/remove a product to favorites by pressing a heart button in the `ProductCard` element.
-2. The heart should be highlighted if the product is already added to the favorites.
-3. Use React Context or Redux to store the favorites.
-4. Show the number of favorites at the `Favorites` icon in the header.
-5. Save favorites to `localStorage` on each change and load them on page load.
-
-## Other tasks
-
-1. Add `NotFoundPage` containing text `Page not found` for all the other URLs with the link to `HomePage`.
-2. Implement the `Product was not found` state for the `ProductDetailsPage`.
-
-## (*) Advanced tasks
-
-- Implement color theme switching!
-- Use [skeletons](https://freefrontend.com/css-skeleton-loadings/) to make loading more natural.
-- Add the ability to change page language.
-
-### Search
-
-Show `input:search` in the header when a page contains a `ProductList` to search in.
-
-1. Save the `Search` value in the URL as a `?query=value` to apply on page load.
-2. Show `There are no phones/tablets/accessories/products matching the query` instead of `ProductList` when needed.
-3. Add `debounce` to the search field.
+
+
+# 📱 Phone Catalog Frontend
+
+### A modern online electronics store with an intuitive interface
+
+[](https://team-project-phone-catalog.github.io)
+[](https://reactjs.org/)
+[](https://www.typescriptlang.org/)
+[](https://vitejs.dev/)
+[](LICENSE)
+
+[🚀 Live Demo](https://team-project-phone-catalog.github.io) • [📖 Documentation](#-project-structure) • [🤝 Contribute](#-contributing)
+
+
+
+
+
+---
+
+## 📋 About The Project
+
+**Phone Catalog** is a **full-featured web application** for browsing and purchasing electronics. Built with **modern technologies**, it delivers exceptional performance and an outstanding user experience across all devices.
+
+> 💡 **Educational project** by a development team showcasing web development best practices
+
+---
+
+## ✨ Key Features
+
+
+
+
+
+### 🛍️ For Shoppers
+
+- 📱 **Extensive catalog** of products
+- 🔍 **Smart search** with instant results
+- 🛒 **Shopping cart** with real-time updates
+- ❤️ **Favorites** to save products
+- 📊 **Sorting** by various parameters
+- 🎯 **Filtering** by categories
+
+
+
+
+### 💻 Technical Advantages
+
+- ⚡ **Fast** thanks to Vite
+- 📱 **Responsive design** for all devices
+- 🎨 **Modern UI/UX** with smooth animations
+- ♿ **Accessibility** compliant
+- 🔒 **TypeScript** for code reliability
+- 🚀 **Auto-deploy** via GitHub Actions
+
+
+
+
+
+---
+
+## 🛠️ Technology Stack
+
+### Frontend Technologies
+
+| Technology | Version | Purpose |
+| ---------------- | ------- | ----------- |
+| **React** | `18.3` | UI library |
+| **TypeScript** | `5.6` | Type safety |
+| **Vite** | `6.0` | Build tool |
+| **React Router** | `v7` | Routing |
+| **SCSS** | Latest | Styling |
+
+### Development Tools
+
+```bash
+├── ESLint # Code linting
+├── Prettier # Code formatting
+├── Husky # Git hooks
+├── lint-staged # Pre-commit checks
+└── GitHub Actions # CI/CD pipeline
+```
+
+---
+
+## 🚀 Quick Start
+
+### Prerequisites
+
+> ⚠️ **Required:** Node.js v16.0 or higher
+
+### Installation
+
+**1️⃣ Clone the repository**
+
+```bash
+git clone https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io.git
+cd team-project-phone-catalog.github.io
+```
+
+**2️⃣ Install dependencies**
+
+```bash
+npm install
+```
+
+**3️⃣ Start the project**
+
+```bash
+npm run dev
+```
+
+**4️⃣ Open your browser**
+
+```
+http://localhost:5173
+```
+
+### 📝 Available Commands
+
+| Command | Description |
+| ----------------- | ----------------------------------- |
+| `npm run dev` | 🔥 Start dev server with hot reload |
+| `npm run build` | 📦 Build production bundle |
+| `npm run preview` | 👀 Preview production build |
+| `npm run lint` | 🔍 Check code with ESLint |
+| `npm run format` | ✨ Format code with Prettier |
+
+---
+
+## 📦 Project Structure
+
+```
+team-project-phone-catalog.github.io/
+│
+├── 📂 .github/
+│ └── workflows/ # ⚙️ GitHub Actions CI/CD
+│
+├── 📂 public/ # 🌍 Static files
+│ ├── api/ # 📊 JSON data
+│ │ ├── phones.json
+│ │ ├── tablets.json
+│ │ └── accessories.json
+│ └── img/ # 🖼️ Product images
+│ ├── phones/
+│ ├── tablets/
+│ └── accessories/
+│
+├── 📂 src/
+│ ├── 📂 components/ # ⚛️ React components
+│ │ ├── Header/ # 🎯 Site header
+│ │ ├── Footer/ # 📄 Footer
+│ │ ├── Cart/ # 🛒 Shopping cart
+│ │ ├── Catalog/ # 📚 Product catalog
+│ │ ├── ProductCard/ # 🎴 Product card
+│ │ └── ui/ # 🎨 UI components
+│ │
+│ ├── 📂 pages/ # 📄 Pages
+│ │ ├── HomePage.tsx
+│ │ ├── PhonesPage.tsx
+│ │ ├── TabletsPage.tsx
+│ │ ├── AccessoriesPage.tsx
+│ │ ├── ProductDetailsPage.tsx
+│ │ ├── CartPage.tsx
+│ │ ├── FavouritesPage.tsx
+│ │ └── NotFoundPage.tsx
+│ │
+│ ├── 📂 hooks/ # 🎣 Custom hooks
+│ ├── 📂 context/ # 🔄 Context providers
+│ ├── 📂 api/ # 🌐 API services
+│ ├── 📂 types/ # 📝 TypeScript types
+│ ├── 📂 utils/ # 🛠️ Utilities
+│ ├── 📂 constants/ # 📌 Constants
+│ ├── 📂 styles/ # 💅 Global styles
+│ │
+│ ├── App.tsx # 🏠 Main component
+│ ├── main.tsx # 🚪 Entry point
+│ └── index.css
+│
+├── 📄 package.json
+├── 📄 tsconfig.json
+├── 📄 vite.config.ts
+├── 📄 eslint.config.js
+└── 📄 README.md
+```
+
+---
+
+## 🎯 Features In Detail
+
+### 🛍️ Product Catalog
+
+
+
+
+
+**Product Categories:**
+
+- 📱 Phones
+- 📲 Tablets
+- 🎧 Accessories
+
+
+
+
+**Capabilities:**
+
+- 🔍 Search by name/brand
+- 🎚️ Filter by specifications
+- 📊 Sort (price, popularity, newest)
+
+
+
+
+
+### 🛒 Shopping Experience
+
+```typescript
+// Core cart functionality
+✅ Add products with quantity selection
+✅ Remove products
+✅ Real-time quantity updates
+✅ State persistence (localStorage)
+✅ Total price calculation
+✅ Checkout process
+```
+
+### 🎨 User Interface
+
+> **Modern design** focused on simplicity and usability
+
+- ✨ Smooth animations and transitions
+- 🎭 Loading states
+- ⚠️ Error handling
+- ♿ Accessibility (WCAG 2.1)
+- 📱 Mobile-first approach
+
+---
+
+## 🚀 Deployment
+
+### Automated CI/CD Pipeline
+
+```mermaid
+graph LR
+ A[Push to main] --> B[GitHub Actions]
+ B --> C[Build & Test]
+ C --> D[Deploy to GitHub Pages]
+ D --> E[Live Site ✅]
+```
+
+| Deploy Type | Source | URL |
+| -------------- | ------------- | ------------------------------------------------------------------------------------ |
+| **Production** | `main` branch | [team-project-phone-catalog.github.io](https://team-project-phone-catalog.github.io) |
+| **Preview** | Pull Requests | Automatic preview URLs |
+
+**⏱️ Build time:** ~1-2 minutes
+**🔄 Updates:** Automatic on push
+
+---
+
+## 📊 Project Statistics
+
+
+
+### Code Composition
+
+
+
+
+
+
+
+
+---
+
+## 🤝 Contributing
+
+We welcome your contributions! 🎉
+
+### How to contribute:
+
+1. **🍴 Fork** the project
+2. **🌿 Create** a branch (`git checkout -b feature/AmazingFeature`)
+3. **💾 Commit** your changes (`git commit -m 'Add some AmazingFeature'`)
+4. **📤 Push** to the branch (`git push origin feature/AmazingFeature`)
+5. **🎁 Open** a Pull Request
+
+### Contribution Guidelines:
+
+- ✅ Follow code style (ESLint + Prettier)
+- ✅ Write clear commit messages
+- ✅ Add comments to complex code
+- ✅ Test changes before PR
+
+---
+
+## 👥 Team
+
+
+
+### Developed by **Team-Project-Phone-catalog**
+
+👨💻 **3 contributors** worked on this project
+
+[View all contributors →](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/graphs/contributors)
+
+
+
+---
+
+## 🔗 Useful Links
+
+| Resource | Link |
+| ------------------ | ------------------------------------------------------------------------------------------------------- |
+| 🌐 **Live Demo** | [team-project-phone-catalog.github.io](https://team-project-phone-catalog.github.io) |
+| 💻 **GitHub Repo** | [Repository](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io) |
+| 📚 **Tech Stack** | [TECH_STACK.md](./TECH_STACK.md) |
+| ✅ **Task List** | [TASK_CHECKLIST.md](./TASK_CHECKLIST.md) |
+| 🐛 **Issues** | [Report Bug](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/issues) |
+
+---
+
+## 📄 License
+
+This project was created for **educational purposes**.
+
+---
+
+## 📞 Contact
+
+Have questions or suggestions? We're always happy to hear from you! 💬
+
+- 🐛 [Report a bug](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/issues/new)
+- 💡 [Request a feature](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/issues/new)
+- 📧 [Create an Issue](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/issues)
+
+---
+
+
+
+### ⭐ Don't forget to star the project if you like it!
+
+**Made with ❤️ by Team-Project-Phone-catalog**
+
+[](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io)
+[](https://github.com/Team-Project-Phone-catalog/team-project-phone-catalog.github.io/fork)
+
+
diff --git a/TASK_CHECKLIST.md b/TASK_CHECKLIST.md
new file mode 100644
index 00000000000..f4631868851
--- /dev/null
+++ b/TASK_CHECKLIST.md
@@ -0,0 +1,267 @@
+# Чекліст роботи над завданням
+
+Використовуйте цей чекліст для кожної задачі, щоб нічого не забути! ✅
+
+---
+
+## ☑️ Перед початком роботи
+
+### 1. Декомпозуйте завдання
+
+- [ ] Завдання не надто велике?
+- [ ] Чи можна розбити його на менші підзадачі?
+- [ ] Обговорили з командою, якщо потрібно?
+
+💡 **Чому важливо:** Маленькі задачі легше розробляти, тестувати та ревʼювити.
+
+---
+
+### 2. Оцініть час на розробку
+
+- [ ] Скільки часу потрібно на завдання? (приблизно)
+- [ ] Чи блокує це завдання роботу інших teammates?
+- [ ] Якщо так - повідомив команду про дедлайн?
+
+⚠️ **Важливо:** Якщо розумієте, що не встигаєте - попередьте команду заздалегідь!
+
+---
+
+## 🚀 Початок роботи
+
+### 3. Оновіть локальну копію `main`
+
+```bash
+# Переключись на main
+git checkout main
+
+# Отримай останні зміни
+git pull origin main
+```
+
+- [ ] Виконано `git pull origin main`
+- [ ] Немає помилок при pull
+
+---
+
+### 4. Створіть нову гілку
+
+```bash
+# Створи гілку за правилами naming
+git checkout -b DEV-XXXX_short-description
+```
+
+- [ ] Назва гілки відповідає формату: `DEV-XXXX_description`
+- [ ] Гілка створена від актуального `main`
+
+---
+
+## 💻 Під час розробки
+
+### 5. Працюйте та комітьте часто
+
+```bash
+# Зроби зміни...
+
+git add .
+git commit -m "feat(DEV-XXXX): add feature description"
+
+# Продовжуй працювати...
+
+git add .
+git commit -m "style(DEV-XXXX): update styles"
+```
+
+- [ ] Коміти роблю **часто** (не чекаю до кінця дня!)
+- [ ] Кожен коміт має **правильний формат**: `type(DEV-XXXX): description`
+- [ ] Коміти описують **конкретні зміни**, не загальні фрази
+
+💡 **Переваги частих комітів:**
+
+- Легше знайти, коли з'явилась бага
+- Можна відкотити невеликий шматок коду
+- Команда бачить твій прогрес
+
+---
+
+## 🔄 Перед створенням PR
+
+### 6. Стягніть останні зміни з `main` у вашу гілку
+
+```bash
+# Переключись на main
+git checkout main
+
+# Отримай останні зміни
+git pull origin main
+
+# Повернись на свою гілку
+git checkout DEV-XXXX_your-feature
+
+# Злий зміни з main
+git merge main
+```
+
+- [ ] Отримав останні зміни з `main`
+- [ ] Злив зміни у свою гілку
+- [ ] Вирішив конфлікти (якщо були)
+- [ ] Код працює після вирішення конфліктів
+- [ ] Запустив `npm run dev` - все працює
+- [ ] Запустив `npm run fix-style` - немає помилок
+
+### Якщо виник конфлікт:
+
+**Не панікуй!** 🙂
+
+1. Відкрий файли з конфліктами
+2. Знайди маркери: `<<<<<<<`, `=======`, `>>>>>>>`
+3. Вибери правильний код (або об'єднай обидва варіанти)
+4. Видали маркери конфліктів
+5. Якщо не впевнений - **запитай тім ліда!**
+6. Тестуй код після вирішення конфлікту
+
+```bash
+# Після вирішення конфліктів
+git add .
+git commit -m "fix(DEV-XXXX): resolve merge conflicts"
+```
+
+---
+
+### 7. Запуште гілку
+
+```bash
+git push origin DEV-XXXX_your-feature
+```
+
+- [ ] Гілка успішно запушена на GitHub
+- [ ] Немає помилок при push
+
+---
+
+## 📝 Створення Pull Request
+
+### 8. Створіть PR на GitHub
+
+1. Відкрий GitHub → репозиторій
+2. Вкладка **"Pull requests"** → **"New pull request"**
+3. Вибери:
+ - **base:** `main`
+ - **compare:** `DEV-XXXX_your-feature`
+
+**Назва PR:** `feat(DEV-XXXX): короткий опис`
+
+**Опис PR (template):**
+
+```markdown
+## Що зроблено? ✅
+
+- Додано компонент ProductCard
+- Створено стилі для карточки
+- Додано responsive для mobile
+
+## Чи є залежності від інших PR? 🔗
+
+- Немає / Так, PR #123
+
+## На що звернути увагу при review? 👀
+
+- Перевірити responsive на мобільних
+- Перевірити accessibility
+
+## Скріншоти 📸
+
+(додай скріншоти якщо є візуальні зміни)
+```
+
+- [ ] PR створено з правильною назвою
+- [ ] Додано детальний опис
+- [ ] Додано reviewer (teammate)
+- [ ] Додано label (якщо є: feature, bugfix, etc.)
+
+---
+
+## 👥 Code Review
+
+### 9. Очікуйте на код-ревʼю
+
+- [ ] Повідомив reviewer що PR готовий
+- [ ] Відповідаю на коментарі швидко
+- [ ] Вношу правки за фідбеком
+
+**Поки чекаєш review - можеш взятися за нове завдання!** 🚀
+
+### Якщо отримали коментарі:
+
+```bash
+# Внеси правки в той же гілці
+git add .
+git commit -m "fix(DEV-XXXX): address review comments"
+git push origin DEV-XXXX_your-feature
+
+# PR автоматично оновиться!
+```
+
+- [ ] Виправив всі коментарі від reviewer
+- [ ] Відповів на всі питання
+- [ ] Запушив зміни
+
+---
+
+## ✅ Після Approve
+
+### 10. Merge та cleanup
+
+- [ ] Отримано approve від teammate
+- [ ] Всі GitHub Actions пройшли успішно (зелені галочки)
+- [ ] Зроблено merge в `main`
+
+### Після merge:
+
+```bash
+# Переключись на main
+git checkout main
+
+# Отримай свіжі зміни (тепер там твій код!)
+git pull origin main
+
+# Видали локальну гілку
+git branch -d DEV-XXXX_your-feature
+
+# Видали remote гілку (або на GitHub після merge)
+git push origin --delete DEV-XXXX_your-feature
+```
+
+- [ ] Перейшов на `main` та зробив `pull`
+- [ ] Видалив локальну гілку
+- [ ] Видалив remote гілку
+- [ ] Перевірив що деплой пройшов успішно (вкладка Actions)
+
+---
+
+## 🎉 Готово!
+
+Твій код тепер частина проєкту! Можеш братися за наступну задачу! 💪
+
+---
+
+## 📋 Quick Checklist (короткий варіант для швидкої перевірки)
+
+```
+☐ Декомпозував завдання
+☐ Оцінив час
+☐ git pull origin main
+☐ Створив гілку: DEV-XXXX_description
+☐ Часто комітив з правильним форматом
+☐ Перед PR: злив main в свою гілку
+☐ Вирішив конфлікти
+☐ npm run fix-style - без помилок
+☐ git push origin DEV-XXXX_description
+☐ Створив PR з описом
+☐ Додав reviewer
+☐ Отримав approve
+☐ Merge в main
+☐ Видалив гілку
+☐ Взяв нове завдання 🚀
+```
+
+---
diff --git a/TECH_STACK.md b/TECH_STACK.md
new file mode 100644
index 00000000000..7277b3a0264
--- /dev/null
+++ b/TECH_STACK.md
@@ -0,0 +1,24 @@
+# Tech Stack
+
+## Core
+
+- React 19
+- TypeScript
+- Vite
+
+## UI Libraries
+
+- Radix UI - для складних UI компонентів
+- Swiper - для product sliders
+- Sonner - для notifications
+
+## Why?
+
+- Accessibility out of the box
+- Less bugs
+- Faster development
+- Focus on business logic, not reinventing the wheel
+
+```
+
+```
diff --git a/Vector (Stroke).svg b/Vector (Stroke).svg
new file mode 100644
index 00000000000..4ecd8405960
--- /dev/null
+++ b/Vector (Stroke).svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/changes.txt b/changes.txt
new file mode 100644
index 00000000000..21b41162ca8
--- /dev/null
+++ b/changes.txt
@@ -0,0 +1,2326 @@
+diff --git a/src/api/products.ts b/src/api/products.ts
+index f622b4f..ed65a1a 100644
+--- a/src/api/products.ts
++++ b/src/api/products.ts
+@@ -28,7 +28,7 @@ export const getProductDetails = async (
+ category: string,
+ itemId: string,
+ ): Promise => {
+- const response = await fetch(`/api/${category}.json`); // ← весь масив
++ const response = await fetch(`/api/${category}.json`);
+
+ if (!response.ok) {
+ throw new Error(`Category not found: ${category}`);
+@@ -36,7 +36,7 @@ export const getProductDetails = async (
+
+ const products: ProductDetails[] = await response.json();
+
+- const found = products.find((p) => p.id === itemId); // ← шукаємо по id
++ const found = products.find((p) => p.id === itemId);
+
+ if (!found) {
+ throw new Error(`Product not found: ${itemId}`);
+diff --git a/src/components/Footer/Footer.module.scss b/src/components/Footer/Footer.module.scss
+index 14d7d24..d2dad47 100644
+--- a/src/components/Footer/Footer.module.scss
++++ b/src/components/Footer/Footer.module.scss
+@@ -1,19 +1,10 @@
+-@use '../../styles/utils' as *;
++@use '../../styles/variables' as *;
+ @import '../../styles/utils';
+
+ .footer {
+- border-top: 1px solid #3b3e4a;
+- background: #0f1121;
++ border-top: 1px solid $color-border;
++ background: $bg-main;
+ padding: 32px 16px;
+- margin-top: 56px;
+-
+- @include on-tablet {
+- margin-top: 64px;
+- }
+-
+- @include on-desktop {
+- margin-top: 80px;
+- }
+ }
+
+ .container {
+@@ -23,7 +14,9 @@
+ }
+
+ .logo {
++ display: flex;
+ height: 32px;
++ align-self: flex-start;
+ }
+
+ .nav {
+@@ -37,13 +30,13 @@
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+
+- color: #89939a;
++ color: $color-light-1;
+ text-decoration: none;
+
+- transition: color 0.3s ease;
++ transition: color $transition-default;
+
+ &:hover {
+- color: #ffffff;
++ color: $color-text-primary;
+ }
+ }
+ }
+@@ -55,7 +48,7 @@
+
+ span {
+ font-size: 12px;
+- color: #89939a;
++ color: $color-text-secondary;
+ }
+ }
+
+@@ -63,21 +56,19 @@
+ width: 32px;
+ height: 32px;
+
+- background: #323542;
++ background: $bg-card;
+ border: none;
+
+- color: #ffffff;
++ color: $color-text-primary;
+ cursor: pointer;
+
+- transition: background 0.3s ease;
++ transition: background $transition-default;
+
+ &:hover {
+- background: #4219d0;
++ background: $color-accent;
+ }
+ }
+
+-/* TABLETЖ */
+-
+ @include on-tablet() {
+ .container {
+ flex-direction: row;
+@@ -91,16 +82,14 @@
+ }
+ }
+
+-/* DESKTOP */
+-
+-@include on-desktop {
++@include on-desktop() {
+ .footer {
+- padding: 32px 152px;
++ padding-block: 32px;
++ padding-inline: clamp(32px, calc(32px + (100vw - 1200px) * 0.5), 152px);
+ }
+
+ .container {
+ max-width: 1200px;
+- position: relative;
+ margin: 0 auto;
+ }
+
+@@ -108,9 +97,3 @@
+ gap: 64px;
+ }
+ }
+-
+-.logoLink {
+- position: relative;
+- z-index: 5;
+- cursor: pointer;
+-}
+diff --git a/src/components/ProductSkelet/ProductSkelet.scss b/src/components/ProductSkelet/ProductSkelet.scss
+index b440ad7..0ceb7c6 100644
+--- a/src/components/ProductSkelet/ProductSkelet.scss
++++ b/src/components/ProductSkelet/ProductSkelet.scss
+@@ -1,25 +1,21 @@
++@use '../../styles/variables' as *;
+ @use '../../styles/utils' as *;
+
+ .skeleton {
+- // Базовий колір для "заглушок" у вашій темній темі
+- background: #252837;
++ background: $bg-card;
+ position: relative;
+ overflow: hidden;
+ border-radius: 4px;
+
+- // Ефект переливання
+ &::after {
+ content: '';
+ position: absolute;
+- top: 0;
+- right: 0;
+- bottom: 0;
+- left: 0;
++ inset: 0;
+ transform: translateX(-100%);
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0) 0,
+- rgba(255, 255, 255, 0.05) 50%,
++ rgba($color-light-1, 0.05) 50%,
+ rgba(255, 255, 255, 0) 100%
+ );
+ animation: shimmer 1.5s infinite;
+@@ -33,18 +29,18 @@
+ }
+
+ .card-skeleton {
+- // Копіюємо розміри вашої оригінальної картки
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 440px;
+ padding: 32px;
+- background-color: #161827; // ваш колір фону
++ background-color: $bg-surface;
+
+ @include on-tablet {
+ height: 506px;
+ }
++
+ @include on-desktop {
+ height: 506px;
+ }
+@@ -53,6 +49,7 @@
+ @extend .skeleton;
+ height: 130px;
+ margin-bottom: 8px;
++
+ @include on-tablet {
+ height: 196px;
+ }
+@@ -86,7 +83,7 @@
+ }
+
+ &__actions {
+- margin-top: auto; // притискаємо до низу
++ margin-top: auto;
+ display: flex;
+ gap: 8px;
+ height: 40px;
+diff --git a/src/components/ui/CartProduct/CartProduct.module.scss b/src/components/ui/CartProduct/CartProduct.module.scss
+index 9b9138f..abfaea5 100644
+--- a/src/components/ui/CartProduct/CartProduct.module.scss
++++ b/src/components/ui/CartProduct/CartProduct.module.scss
+@@ -29,7 +29,7 @@
+ font-size: 20px;
+ cursor: pointer;
+
+- @include on-tablet() {
++ @include on-tablet {
+ left: 24px;
+ top: 50%;
+ }
+@@ -43,7 +43,7 @@
+ height: 66px;
+ align-self: center;
+
+- @include on-tablet() {
++ @include on-tablet {
+ margin-left: 24px;
+ }
+ }
+@@ -59,7 +59,7 @@
+ grid-row: 1;
+ align-self: center;
+
+- @include on-tablet() {
++ @include on-tablet {
+ flex: 1;
+ }
+ }
+@@ -80,7 +80,7 @@
+ gap: 12px;
+ margin-left: 16px;
+
+- @include on-tablet() {
++ @include on-tablet {
+ margin-left: 0;
+ gap: 24px;
+ }
+@@ -91,7 +91,7 @@
+ align-items: center;
+ gap: 12px;
+
+- @include on-tablet() {
++ @include on-tablet {
+ gap: 16px;
+ }
+ }
+@@ -130,7 +130,7 @@
+ right: 16px;
+ bottom: 16px;
+
+- @include on-tablet() {
++ @include on-tablet {
+ position: static;
+ }
+ }
+diff --git a/src/components/ui/ColorMap/colorLink.scss b/src/components/ui/ColorMap/colorLink.scss
+index a610eac..fd0c84e 100644
+--- a/src/components/ui/ColorMap/colorLink.scss
++++ b/src/components/ui/ColorMap/colorLink.scss
+@@ -1,7 +1,8 @@
+-@import '../../../styles/variables.scss';
++@use '@styles/variables' as *;
+ .color-link {
+ --size: 32px;
++
+ display: flex;
+ width: var(--size);
+ height: var(--size);
+@@ -16,16 +17,18 @@
+ &:not(&--active):hover {
+ transform: scale(1.05);
+ border-color: $color-icons;
+- box-shadow: 0px 0px 10px 2px $color-elements;
++ box-shadow: 0 0 10px 2px rgba($color-elements, 0.6);
+ }
+
+ &--active {
+- border-color: #f1f2f9;
++ border-color: $color-light-1;
+ pointer-events: none;
++ box-shadow: 0 0 0 2px rgba($color-light-1, 0.2);
+ }
+
+ &__circle {
+ --this-size: calc(var(--size) * 0.75);
++
+ position: absolute;
+ width: var(--this-size);
+ height: var(--this-size);
+diff --git a/src/components/ui/Header/BurgerMenu/BurgerMenu.module.scss b/src/components/ui/Header/BurgerMenu/BurgerMenu.module.scss
+index 87b5fc5..5aca37a 100644
+--- a/src/components/ui/Header/BurgerMenu/BurgerMenu.module.scss
++++ b/src/components/ui/Header/BurgerMenu/BurgerMenu.module.scss
+@@ -1,22 +1,18 @@
++@use '../../../../styles/variables' as *;
+ @import '../../../../styles/utils';
+
+-$color-bg: #0f1121;
+-$color-border: #323542;
+-$color-white: #f1f2f9;
+-$color-gray: #75767f;
+-
+ .menu {
+ position: fixed;
+ top: 48px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+- background-color: $color-bg;
++ background-color: $bg-main;
+ z-index: 50;
+ display: flex;
+ flex-direction: column;
+
+- transition: transform 0.3s ease-in-out;
++ transition: transform $transition-default;
+ transform: translateX(-100%);
+
+ &--open {
+@@ -47,27 +43,27 @@ $color-gray: #75767f;
+ align-items: center;
+ gap: 4px;
+
+- color: $color-gray;
++ color: $color-secondary;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+- transition: color 0.3s ease;
++ transition: color $transition-default;
+
+ &:hover {
+- color: $color-white;
++ color: $color-light-1;
+ }
+
+ &--active {
+- color: $color-white;
++ color: $color-light-1;
+
+ &::after {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 2px;
+- background-color: $color-white;
++ background-color: $color-light-1;
+ }
+ }
+ }
+@@ -88,8 +84,8 @@ $color-gray: #75767f;
+ border-right: 1px solid $color-border;
+ position: relative;
+ transition:
+- background-color 0.2s ease,
+- opacity 0.2s ease;
++ background-color $transition-default,
++ opacity $transition-default;
+
+ opacity: 0.5;
+
+@@ -98,7 +94,7 @@ $color-gray: #75767f;
+ }
+
+ &:hover {
+- background-color: rgba($color-white, 0.05);
++ background-color: rgba($color-light-1, 0.05);
+ opacity: 1;
+ }
+
+@@ -117,7 +113,7 @@ $color-gray: #75767f;
+ left: 0;
+ right: 0;
+ height: 4px;
+- background-color: $color-white;
++ background-color: $color-light-1;
+ }
+ }
+ }
+diff --git a/src/components/ui/Header/Header.module.scss b/src/components/ui/Header/Header.module.scss
+index f3e8c7e..0c27937 100644
+--- a/src/components/ui/Header/Header.module.scss
++++ b/src/components/ui/Header/Header.module.scss
+@@ -1,13 +1,9 @@
++@use '@styles/variables' as *; @import '../../../styles/utils';
+
+-$color-bg: #0f1121;
+-$color-border: #323542;
+-$color-white: #f1f2f9;
+-$color-gray: #75767f;
+-
+ .header {
+ height: 48px;
+- background-color: $color-bg;
++ background-color: $bg-main;
+ border-bottom: 1px solid $color-border;
+ display: flex;
+ align-items: center;
+@@ -15,7 +11,7 @@ $color-gray: #75767f;
+ top: 0;
+ z-index: 1000;
+
+- @include on-desktop {
++ @include on-desktop() {
+ height: 64px;
+ }
+
+@@ -36,9 +32,9 @@ $color-gray: #75767f;
+ &__logo {
+ display: flex;
+ align-items: center;
+- padding-left: 16px;
++ padding: 0 16px;
+ text-decoration: none;
+- transition: opacity 0.2s ease;
++ transition: opacity $transition-default;
+
+ &:hover {
+ opacity: 0.8;
+@@ -50,7 +46,7 @@ $color-gray: #75767f;
+ display: block;
+ object-fit: contain;
+
+- @include on-desktop {
++ @include on-desktop() {
+ width: 80px;
+ height: 28px;
+ }
+@@ -60,20 +56,21 @@ $color-gray: #75767f;
+ &__nav {
+ display: none;
+
+- @include on-tablet {
++ @include on-tablet() {
+ display: flex;
+ height: 100%;
+ margin-left: 32px;
+ }
+
+- @include on-desktop {
++ @include on-desktop() {
+ margin-left: 48px;
+ }
+ }
+
+ &__icons {
+ display: none;
+- @include on-tablet {
++
++ @include on-tablet() {
+ display: flex;
+ }
+ }
+@@ -89,12 +86,12 @@ $color-gray: #75767f;
+ cursor: pointer;
+ padding: 0;
+
+- @include on-tablet {
++ @include on-tablet() {
+ display: none;
+ }
+
+ &:hover {
+- background-color: rgba($color-white, 0.05);
++ background-color: rgba($color-light-1, 0.05);
+ }
+ }
+ }
+@@ -106,11 +103,11 @@ $color-gray: #75767f;
+ padding: 0;
+ height: 100%;
+
+- @include on-tablet {
++ @include on-tablet() {
+ gap: 32px;
+ }
+
+- @include on-desktop {
++ @include on-desktop() {
+ gap: 64px;
+ }
+
+@@ -123,20 +120,21 @@ $color-gray: #75767f;
+ display: flex;
+ align-items: center;
+ height: 100%;
+- color: $color-gray;
++ color: $color-secondary;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: 800;
+ text-transform: uppercase;
+- transition: color 0.3s ease;
++ transition: color $transition-default;
+ position: relative;
+
+ &:hover {
+- color: $color-white;
++ color: $color-light-1;
+ }
+
+ &--active {
+- color: $color-white;
++ color: $color-light-1;
++
+ &::after {
+ content: '';
+ position: absolute;
+@@ -144,7 +142,7 @@ $color-gray: #75767f;
+ left: 0;
+ right: 0;
+ height: 2px;
+- background-color: $color-white;
++ background-color: $color-light-1;
+ }
+ }
+ }
+@@ -158,19 +156,19 @@ $color-gray: #75767f;
+ height: 100%;
+ border-left: 1px solid $color-border;
+ text-decoration: none;
+- transition: background-color 0.2s ease;
++ transition: background-color $transition-default;
+ position: relative;
+
+- @include on-desktop {
++ @include on-desktop() {
+ width: 64px;
+ }
+
+ &:hover {
+- background-color: rgba($color-white, 0.05);
++ background-color: rgba($color-light-1, 0.05);
+ }
+
+ &--active {
+- background-color: rgba($color-white, 0.1);
++ background-color: rgba($color-light-1, 0.1);
+
+ &::after {
+ content: '';
+@@ -179,7 +177,7 @@ $color-gray: #75767f;
+ left: 0;
+ right: 0;
+ height: 2px;
+- background-color: $color-white;
++ background-color: $color-light-1;
+ }
+ }
+
+@@ -201,11 +199,11 @@ $color-gray: #75767f;
+ display: block;
+ width: 100%;
+ height: 2px;
+- background-color: $color-white;
++ background-color: $color-light-1;
+ border-radius: 2px;
+ transition:
+- transform 0.3s ease,
+- opacity 0.2s ease;
++ transform $transition-default,
++ opacity $transition-default;
+ transform-origin: center;
+ }
+
+diff --git a/src/components/ui/Loader/Loader.module.scss b/src/components/ui/Loader/Loader.module.scss
+index 83462e3..c744478 100644
+--- a/src/components/ui/Loader/Loader.module.scss
++++ b/src/components/ui/Loader/Loader.module.scss
+@@ -25,7 +25,7 @@
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+- border: 5px solid $color-white;
++ border: 5px solid $color-text-primary;
+ animation: prixClipFix 2s linear infinite;
+ }
+
+diff --git a/src/components/ui/Loader/Loader.tsx b/src/components/ui/Loader/Loader.tsx
+index 39045b1..0a1a65b 100644
+--- a/src/components/ui/Loader/Loader.tsx
++++ b/src/components/ui/Loader/Loader.tsx
+@@ -1,3 +1,5 @@
+ import styles from './Loader.module.scss';
+
+-export const Loader = () => ;
++export const Loader = () => {
++ return ;
++};
+diff --git a/src/components/ui/Loader/index.ts b/src/components/ui/Loader/index.ts
+index e69de29..d5ce981 100644
+--- a/src/components/ui/Loader/index.ts
++++ b/src/components/ui/Loader/index.ts
+@@ -0,0 +1 @@
++export * from './Loader';
+diff --git a/src/components/ui/NoResults/NoResults.module.scss b/src/components/ui/NoResults/NoResults.module.scss
+index fac29b6..af17c70 100644
+--- a/src/components/ui/NoResults/NoResults.module.scss
++++ b/src/components/ui/NoResults/NoResults.module.scss
+@@ -1,3 +1,5 @@
++@use '@styles/variables' as *;+
+ .wrapper {
+ grid-column: 1 / -1;
+ display: flex;
+@@ -18,11 +20,11 @@
+ .title {
+ font-size: 24px;
+ font-weight: 600;
+- color: #75767f;
++ color: $color-secondary;
+ margin-bottom: 8px;
+ }
+
+ .message {
+ font-size: 16px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ }
+diff --git a/src/components/ui/Product/ProductDetail/ProductDetail.scss b/src/components/ui/Product/ProductDetail/ProductDetail.scss
+index 60ed8d9..a568894 100644
+--- a/src/components/ui/Product/ProductDetail/ProductDetail.scss
++++ b/src/components/ui/Product/ProductDetail/ProductDetail.scss
+@@ -1,21 +1,22 @@
++@use '../../../../styles/variables' as *;
++
+ .ProductFeatures {
++ margin-top: 32px;
+ }
+
+ .ProductDetail {
+ &__about {
+ &-title {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-size: 20px;
+ font-weight: 700;
+- margin: 0;
+- padding: 0;
+
+ &::after {
+ content: '';
+ display: block;
+ height: 1px;
+ width: 100%;
+- background-color: #3b3e4a;
++ background-color: $color-border;
+ margin-top: 16px;
+ }
+ }
+@@ -24,7 +25,7 @@
+ margin-top: 32px;
+
+ &-title {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 100%;
+@@ -33,7 +34,7 @@
+ }
+
+ &-second {
+- color: #89939a;
++ color: $color-text-secondary;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 21px;
+diff --git a/src/components/ui/Product/ProductGallery/ProductGallery.scss b/src/components/ui/Product/ProductGallery/ProductGallery.scss
+index 07a455c..7b6f4b4 100644
+--- a/src/components/ui/Product/ProductGallery/ProductGallery.scss
++++ b/src/components/ui/Product/ProductGallery/ProductGallery.scss
+@@ -1,73 +1,35 @@
+-@import '../../../../styles/utils';
+-@import '../../../../styles/variables';
++@use '../../../../styles/variables' as *;
+
+ .gallery {
+- display: flex;
+- flex-direction: column;
+- gap: 16px;
+ margin-top: 32px;
+-
+- @include on-tablet {
+- display: grid;
+- grid-template-columns: 80px 1fr;
+- grid-column: 1 / 8;
+- gap: 16px;
+- align-items: center;
+- }
++ text-align: center;
+
+ &__main {
+- display: flex;
+- justify-content: center;
+- align-items: center;
+- order: 1;
+-
+- @include on-tablet {
+- order: 2;
+- }
++ overflow: hidden;
+
+ img {
+- width: 288px;
+- height: 288px;
++ width: 274px;
++ height: 274px;
+ object-fit: contain;
+- transition: transition;
+-
+- @include on-desktop {
+- width: 264px;
+- height: 264px;
+- }
++ transition: $transition-default;
+ }
+ }
+
+ &__thumbs {
++ padding-top: 16px;
+ display: flex;
+- flex-direction: row;
+- justify-content: center;
++ justify-content: left;
+ gap: 8px;
+- order: 2;
+-
+- @include on-tablet {
+- flex-direction: column;
+- justify-content: center;
+- height: 100%;
+- order: 1;
+- }
+ }
+ }
+
+ .thumb {
+- width: 50px;
+- height: 50px;
+- padding: 4px;
++ width: 80px;
++ height: 80px;
++ padding: 8px;
+ cursor: pointer;
+- border: 1px solid #3b3e4a;
+- background-color: transparent;
+- transition: transition;
+-
+- @include on-tablet {
+- width: 80px;
+- height: 80px;
+- padding: 8px;
+- }
++ transition: $transition-default;
++ border: 1px solid $color-border;
+
+ img {
+ width: 100%;
+@@ -76,15 +38,10 @@
+ }
+
+ &:hover {
+- border-color: #89939a;
+- transform: scale(1.02);
++ transform: scale(1.05);
+ }
+
+ &.active {
+- border: 1px solid #f0f0f0;
+- border-width: 1px;
+- @include on-tablet {
+- border-width: 2px;
+- }
++ border: 2px solid $color-text-primary;
+ }
+ }
+diff --git a/src/components/ui/Product/ProductOptions/ProductOptions.scss b/src/components/ui/Product/ProductOptions/ProductOptions.scss
+index c6efe42..74cbc67 100644
+--- a/src/components/ui/Product/ProductOptions/ProductOptions.scss
++++ b/src/components/ui/Product/ProductOptions/ProductOptions.scss
+@@ -1,60 +1,59 @@
+-@import '../../../../styles/utils';
+-@import '../../../../styles/variables';
++@use '../../../../styles/variables' as *;
+
+ .product-options {
+- display: block;
+-
+- @include on-tablet {
+- grid-column: 8 / 13;
+- grid-row: 1;
+- margin-top: 0;
+- }
+-
+ &__title {
+- margin-top: 0;
++ margin-top: 40px;
+ font-size: 12px;
+ font-weight: 700;
+- color: #75767f;
+-
+- @include on-tablet {
+- margin-top: 40px;
+- }
++ color: $color-secondary;
+
+ &--capacity {
+ font-size: 12px;
+ font-weight: 700;
+- color: #75767f;
++ color: $color-secondary;
+ margin-top: 24px;
+ }
+ }
+
+ &__colors {
++ display: flex;
++ gap: 10px;
+ margin-top: 10px;
+- border-bottom: 1px solid #3b3e4a;
++ border-bottom: 1px solid $color-border;
+ padding-bottom: 24px;
+ }
+
+- &__list {
++ &__color-item {
+ display: flex;
+- flex-wrap: wrap;
+- gap: 12px;
+- list-style: none;
+- padding: 0;
+- margin: 0;
++ text-decoration: none;
+ }
+
+- &__item {
++ &__color {
++ width: 30px;
++ height: 30px;
++ border-radius: 50%;
++ border: 1px solid $color-border;
++ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
++ transition: transform $transition-default;
++
++ &:hover {
++ transform: scale(1.05);
++ }
++ }
++
++ &__color-item--active &__color {
++ outline: 2px solid $color-text-primary;
++ outline-offset: 2px;
+ }
+
+ &__ram {
+ display: flex;
+- flex-wrap: wrap;
+- gap: 8px;
++ gap: 10px;
+ margin-top: 10px;
+- border-bottom: 1px solid #3b3e4a;
++ border-bottom: 1px solid $color-border;
+ padding-bottom: 24px;
+ }
+
+@@ -62,34 +61,25 @@
+ display: flex;
+ align-items: center;
+ justify-content: center;
+- height: 40px;
+- min-width: 75px;
+- padding: 0 20px;
+- color: #f1f2f9;
++ padding: 8px 24px;
++ text-decoration: none;
++ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
++ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
++ border: 1px solid $color-icons;
+ background-color: transparent;
+ cursor: pointer;
+-
+- border: 1px solid #4a4d58;
+- border-radius: 8px;
+- transition: all 0.2s ease-in-out;
++ transition: all $transition-default;
+
+ &:hover {
+- border-color: #f1f2f9;
++ border-color: $color-secondary;
+ }
+
+ &--active {
+- background-color: #f1f2f9;
+- color: #0f1121;
+- cursor: default;
+-
+- border: 2px solid #0f1121;
+- box-shadow: 0 0 0 2px #f1f2f9;
+-
+- &:hover {
+- border-color: #0f1121;
+- }
++ background-color: $color-light-1;
++ color: $bg-main;
++ border-color: $color-light-1;
+ }
+ }
+ }
+diff --git a/src/components/ui/Product/ProductPurchase/ProductPurchase.scss b/src/components/ui/Product/ProductPurchase/ProductPurchase.scss
+index e2a6b30..edfe11a 100644
+--- a/src/components/ui/Product/ProductPurchase/ProductPurchase.scss
++++ b/src/components/ui/Product/ProductPurchase/ProductPurchase.scss
+@@ -1,3 +1,5 @@
++@use '../../../../styles/variables' as *;
++
+ .purchase {
+ &-price {
+ display: flex;
+@@ -10,7 +12,7 @@
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 41px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ }
+
+ &__full {
+@@ -18,7 +20,7 @@
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 100%;
+- color: #75767f;
++ color: $color-secondary;
+ text-decoration: line-through;
+ }
+ }
+diff --git a/src/components/ui/Product/TechSpecs/TechSpecs.scss b/src/components/ui/Product/TechSpecs/TechSpecs.scss
+index 4ca61a9..a3b9706 100644
+--- a/src/components/ui/Product/TechSpecs/TechSpecs.scss
++++ b/src/components/ui/Product/TechSpecs/TechSpecs.scss
+@@ -1,20 +1,22 @@
++@use '../../../../styles/variables' as *;
++
+ .TechSpecs {
++ margin-top: 56px;
++
+ &__title {
+ font-size: 20px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-weight: 700;
+ line-height: 100%;
+ letter-spacing: 0%;
+- margin-top: 10px;
+
+ &::after {
+ content: '';
+ display: block;
+ height: 1px;
+ width: 100%;
+- background-color: #3b3e4a;
++ background-color: $color-border;
+ margin-top: 16px;
+- margin-bottom: 30px;
+ }
+ }
+
+@@ -22,6 +24,7 @@
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
++ margin-top: 30px;
+ margin-bottom: 8px;
+ font-weight: 600;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+@@ -30,12 +33,12 @@
+ }
+
+ &__value {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-weight: 600;
+ letter-spacing: 0%;
+ }
+
+ &__name {
+- color: #75767f;
++ color: $color-secondary;
+ }
+ }
+diff --git a/src/components/ui/ProductActions/ProductActions.scss b/src/components/ui/ProductActions/ProductActions.scss
+index 139b7bb..9e7d609 100644
+--- a/src/components/ui/ProductActions/ProductActions.scss
++++ b/src/components/ui/ProductActions/ProductActions.scss
+@@ -1,3 +1,5 @@
++@use '@styles/variables' as *;+
+ .product-actions {
+ display: flex;
+ justify-content: space-between;
+@@ -14,8 +16,8 @@
+ font-size: 14px;
+ line-height: 21px;
+ letter-spacing: 0;
+- color: #f1f2f9;
+- background-color: #905bff;
++ color: $color-light-1;
++ background-color: $color-accent;
+ text-decoration: none;
+ text-align: center;
+ cursor: pointer;
+@@ -26,7 +28,7 @@
+ box-sizing: border-box;
+ width: 40px;
+ height: 40px;
+- background-color: #323542;
++ background-color: $bg-card;
+ background-image: url(../../../assets/icons/heart-dark.svg);
+ background-repeat: no-repeat;
+ background-position: center;
+@@ -34,13 +36,14 @@
+ border: none;
+
+ &:focus {
+- outline: 2px solid #905bff;
++ outline: 2px solid $color-accent;
+ outline-offset: 2px;
+ }
+
+ &:focus:not(:focus-visible) {
+ outline: none;
+ }
++
+ &--active {
+ background-image: url(../../../assets/icons/heart-red.svg);
+ }
+diff --git a/src/components/ui/ProductFeatures/ProductFeatures.scss b/src/components/ui/ProductFeatures/ProductFeatures.scss
+index ac81895..9f54ba3 100644
+--- a/src/components/ui/ProductFeatures/ProductFeatures.scss
++++ b/src/components/ui/ProductFeatures/ProductFeatures.scss
+@@ -1,3 +1,5 @@
++@use '@styles/variables' as *;+
+ .product-features {
+ display: flex;
+ flex-direction: column;
+@@ -7,7 +9,7 @@
+ content: '';
+ height: 1px;
+ width: 100%;
+- background-color: #3b3e4a;
++ background-color: $color-border;
+ margin-bottom: 10px;
+ }
+
+@@ -28,11 +30,11 @@
+ }
+
+ &__value {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-weight: 400;
+ }
+
+ &__name {
+- color: #75767f;
++ color: $color-secondary;
+ }
+ }
+diff --git a/src/components/ui/ProductPrice/ProductPrice.scss b/src/components/ui/ProductPrice/ProductPrice.scss
+index f722fe3..a2d6aad 100644
+--- a/src/components/ui/ProductPrice/ProductPrice.scss
++++ b/src/components/ui/ProductPrice/ProductPrice.scss
+@@ -1,3 +1,5 @@
++@use '@styles/variables' as *;+
+ .product-price {
+ display: flex;
+ align-items: center;
+@@ -11,7 +13,7 @@
+ font-weight: 700;
+ font-size: 22px;
+ line-height: 140%;
+- color: #f1f2f9;
++ color: $color-light-1;
+ }
+
+ &__full {
+@@ -19,7 +21,7 @@
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 28px;
+- color: #75767f;
++ color: $color-secondary;
+ text-decoration: line-through;
+ }
+ }
+diff --git a/src/components/ui/RelatedProducts/RelatedProducts.scss b/src/components/ui/RelatedProducts/RelatedProducts.scss
+index fd17098..60e965a 100644
+--- a/src/components/ui/RelatedProducts/RelatedProducts.scss
++++ b/src/components/ui/RelatedProducts/RelatedProducts.scss
+@@ -1,3 +1,5 @@
++@use '@styles/variables' as *;+
+ // Міксини
+ @mixin on-tablet {
+ @media (min-width: 640px) {
+@@ -11,12 +13,6 @@
+ }
+ }
+
+-// Кольори
+-$color-white: #ffffff;
+-$color-elements: #323542;
+-$color-gray: #75767f;
+-$color-secondary: #89939a;
+-
+ .AlsoLike {
+ margin-top: 56px;
+
+@@ -43,7 +39,7 @@ $color-secondary: #89939a;
+ font-size: 22px;
+ font-weight: 800;
+ letter-spacing: -0.02em;
+- color: $color-white;
++ color: $color-light-1;
+ margin: 0;
+
+ @include on-tablet {
+@@ -64,20 +60,20 @@ $color-secondary: #89939a;
+ &__arrow-btn {
+ width: 32px;
+ height: 32px;
+- border: 1px solid $color-elements;
++ border: 1px solid $color-border;
+ border-radius: 4px;
+ background: transparent;
+- color: $color-white;
++ color: $color-light-1;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+- transition: all 0.2s;
++ transition: all $transition-default;
+ font-size: 18px;
+ padding: 0;
+
+ &:hover:not(:disabled) {
+- border-color: $color-white;
++ border-color: $color-light-1;
+ }
+
+ &:disabled {
+diff --git a/src/pages/AccessoriesPage/AccessoriesPage.module.scss b/src/pages/AccessoriesPage/AccessoriesPage.module.scss
+index 37c42dc..7262c71 100644
+--- a/src/pages/AccessoriesPage/AccessoriesPage.module.scss
++++ b/src/pages/AccessoriesPage/AccessoriesPage.module.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @use '../../styles/utils' as *;
+
+ .loader-wrapper {
+@@ -27,16 +28,12 @@
+ @include on-desktop {
+ padding: 0 32px;
+ }
+-
+- @include on-desktop {
+- padding: 0 32px;
+- }
+ }
+
+ .title {
+ margin-top: 24px;
+ margin-bottom: 8px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-family: Mont;
+ font-weight: 800;
+ font-size: 32px;
+@@ -47,7 +44,7 @@
+ .modelsCount {
+ margin-bottom: 24px;
+ font-size: 14px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ &__controls {
+@@ -76,7 +73,7 @@
+
+ .label {
+ font-size: 12px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ .select {
+@@ -84,9 +81,9 @@
+ height: 40px;
+ padding: 0 12px;
+
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
++ background: $bg-card;
++ border: 1px solid $color-border;
++ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+@@ -111,9 +108,9 @@
+ height: 40px;
+ padding: 0 12px;
+
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
++ background: $bg-card;
++ border: 1px solid $color-border;
++ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+@@ -140,6 +137,8 @@
+ grid-template-columns: repeat(2, 1fr);
+ }
+
++
++
+ @include on-desktop {
+ grid-template-columns: repeat(4, 1fr);
+ }
+diff --git a/src/pages/AccessoriesPage/AccessoriesPage.tsx b/src/pages/AccessoriesPage/AccessoriesPage.tsx
+index 07d96a4..576cbe6 100644
+--- a/src/pages/AccessoriesPage/AccessoriesPage.tsx
++++ b/src/pages/AccessoriesPage/AccessoriesPage.tsx
+@@ -18,50 +18,66 @@ export const AccessoriesPage = () => {
+ const [searchQuery, setSearchQuery] = useState('');
+ const [debouncedQuery, setDebouncedQuery] = useState('');
+
++ // Load data
+ useEffect(() => {
+ const loadAccessories = async () => {
+ setIsLoading(true);
++
+ try {
+ const data = await getAccessories();
++
+ setAccessories(
+- data.map((acc) => ({ ...acc, category: 'accessories' })),
++ data.map((acc) => ({
++ ...acc,
++ category: 'accessories',
++ })),
+ );
+ } finally {
+ setTimeout(() => setIsLoading(false), 600);
+ }
+ };
++
+ loadAccessories();
+ }, []);
+
++ // Debounce search
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedQuery(searchQuery);
+ }, 300);
++
+ return () => clearTimeout(handler);
+ }, [searchQuery]);
+
++ // Loading animation when clearing search
+ useEffect(() => {
+ if (searchQuery.length === 0 && debouncedQuery.length > 0) {
+ setIsLoading(true);
++
+ const timer = setTimeout(() => {
+ setIsLoading(false);
+ }, 500);
++
+ return () => clearTimeout(timer);
+ }
+- }, [searchQuery]);
++ }, [searchQuery, debouncedQuery]);
+
+ const filteredAccessories = useMemo(() => {
+ const query = debouncedQuery.toLowerCase().trim();
++
+ return accessories.filter((acc) => acc.name.toLowerCase().includes(query));
+ }, [accessories, debouncedQuery]);
+
+ const sortedAccessories = useMemo(() => {
+ const toSort = [...filteredAccessories];
++
+ switch (sortBy) {
+ case 'alphabetically':
+ return toSort.sort((a, b) => a.name.localeCompare(b.name));
++
+ case 'bestPrice':
+ return sortByBestPrice(toSort);
++
+ case 'newest':
+ default:
+ return sortByNewest(toSort);
+diff --git a/src/pages/CartPage/CartPage.module.scss b/src/pages/CartPage/CartPage.module.scss
+index 5145606..3d28b56 100644
+--- a/src/pages/CartPage/CartPage.module.scss
++++ b/src/pages/CartPage/CartPage.module.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @import '../../styles/utils';
+
+ * {
+@@ -25,7 +26,7 @@
+ }
+
+ .title {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+diff --git a/src/pages/FavoritesPage/FavoritesPage.scss b/src/pages/FavoritesPage/FavoritesPage.scss
+index 7f1dece..e613c2b 100644
+--- a/src/pages/FavoritesPage/FavoritesPage.scss
++++ b/src/pages/FavoritesPage/FavoritesPage.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @import '../../styles/utils.scss';
+
+ .favorites-page {
+@@ -19,7 +20,7 @@
+ &__history {
+ margin-bottom: 24px;
+ margin-top: 24px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ &__text {
+@@ -31,7 +32,7 @@
+ display: block;
+ margin-top: 24px;
+ margin-bottom: 8px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-family: Mont;
+ font-style: bold;
+ font-weight: 800;
+@@ -44,7 +45,7 @@
+ display: block;
+ margin-bottom: 24px;
+ font-size: 14px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ &__all-favorites {
+diff --git a/src/pages/HomePage/HomePage.module.scss b/src/pages/HomePage/HomePage.module.scss
+index 76f03a4..540f1dc 100644
+--- a/src/pages/HomePage/HomePage.module.scss
++++ b/src/pages/HomePage/HomePage.module.scss
+@@ -1,3 +1,6 @@
++@use '../../styles/variables' as *;
++
++// Міксини
+ @mixin on-tablet {
+ @media (min-width: 640px) {
+ @content;
+@@ -10,19 +13,6 @@
+ }
+ }
+
+-$color-white: #ffffff;
+-$color-black: #0f1111;
+-$color-surface: #161827;
+-$color-surface-light: #1f2130;
+-$color-elements: #3b3e4a;
+-$color-icons: #4a4d58;
+-$color-gray: #75767f;
+-$color-secondary: #89939a;
+-$color-primary: #4219d0;
+-$color-accent: #905cff;
+-$color-green: #27ae60;
+-$color-red: #eb5757;
+-
+ .loader-wrapper {
+ display: flex;
+ justify-content: center;
+@@ -32,7 +22,7 @@ $color-red: #eb5757;
+ }
+
+ .home {
+- color: $color-white;
++ color: $color-text-primary;
+ min-height: 100vh;
+ padding-bottom: 60px;
+
+@@ -82,42 +72,102 @@ $color-red: #eb5757;
+ font-size: 48px;
+ }
+ }
+-}
+
+-.section {
+- margin-top: 56px;
++ &__arrow {
++ display: none;
+
+- @include on-tablet {
+- margin-top: 64px;
++ @include on-desktop {
++ display: flex;
++ position: absolute;
++ top: 50%;
++ transform: translateY(-50%);
++ width: 32px;
++ height: 100%;
++ background: transparent;
++ border: none;
++ color: $color-text-primary;
++ cursor: pointer;
++ z-index: 2;
++ align-items: center;
++ justify-content: center;
++ transition: opacity $transition-default;
++ font-size: 32px;
++
++ &:hover {
++ opacity: 0.7;
++ }
++ }
++
++ &--left {
++ @include on-desktop {
++ left: -48px;
++ }
++ }
++
++ &--right {
++ @include on-desktop {
++ right: -48px;
++ }
++ }
+ }
+
+- @include on-desktop {
+- margin-top: 80px;
++ &__subtitle {
++ font-size: 32px;
++ font-weight: 800;
++ line-height: 1.2;
++ color: $color-accent;
++ margin: 0;
++ }
++
++ &__product-tagline {
++ font-size: 14px;
++ color: $color-text-secondary;
++ font-weight: 600;
++ }
++
++ &__dots {
++ display: flex;
++ justify-content: center;
++ gap: 14px;
++ margin-top: 16px;
+ }
+
++ &__dot {
++ width: 14px;
++ height: 4px;
++ background: $color-border;
++ border-radius: 2px;
++ border: none;
++ cursor: pointer;
++ transition: all $transition-default;
++ padding: 0;
++
++ &--active {
++ background: $color-text-primary;
++ width: 32px;
++ }
++
++ &:hover:not(&--active) {
++ background: $color-secondary;
++ }
++ }
++}
++
++// Section
++.section {
++ margin-top: 56px;
++
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+-
+- @include on-tablet {
+- margin-bottom: 32px;
+- }
+ }
+
+ &__title {
+ font-size: 22px;
+ font-weight: 800;
+ letter-spacing: -0.02em;
+-
+- @include on-tablet {
+- font-size: 28px;
+- }
+-
+- @include on-desktop {
+- font-size: 32px;
+- }
+ }
+
+ &__arrows {
+@@ -129,38 +179,36 @@ $color-red: #eb5757;
+ .arrow-btn {
+ width: 32px;
+ height: 32px;
+- border: 1px solid $color-elements;
++ border: 1px solid $color-border;
++ border-radius: 4px;
+ background: transparent;
+- color: $color-icons;
++ color: $color-text-primary;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+- transition: all 0.3s;
+- font-size: 16px;
++ transition: all $transition-default;
++ font-size: 24px;
+ padding: 0;
+- font-weight: 600;
+
+ &:hover:not(:disabled) {
+- border-color: $color-icons;
+- background: $color-elements;
+- color: $color-white;
++ border-color: $color-text-primary;
+ }
+
+ &:disabled {
+- border-color: $color-surface;
+- background: transparent;
+- color: $color-surface;
++ opacity: 0.3;
+ cursor: not-allowed;
+ }
+ }
+
++// Products Slider
+ .products-slider {
+ overflow-x: auto;
+ overflow-y: hidden;
+ margin: 0 -16px;
+ padding: 0 16px 4px;
+ scroll-behavior: smooth;
++ scrollbar-width: none;
+
+ @include on-tablet {
+ margin: 0 -24px;
+@@ -176,8 +224,6 @@ $color-red: #eb5757;
+ height: 0;
+ }
+
+- scrollbar-width: none;
+-
+ &__track {
+ display: flex;
+ gap: 16px;
+@@ -196,6 +242,7 @@ $color-red: #eb5757;
+ }
+ }
+
++// Categories
+ .categories {
+ display: flex;
+ flex-direction: column;
+@@ -216,8 +263,7 @@ $color-red: #eb5757;
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+- transition: transform 0.2s ease;
+-
++ transition: transform $transition-default;
+ text-decoration: none;
+ color: inherit;
+
+@@ -233,7 +279,7 @@ $color-red: #eb5757;
+ border-radius: 8px;
+ overflow: hidden;
+ margin-bottom: 24px;
+- background: $color-surface;
++ background: $bg-card;
+
+ @include on-tablet {
+ height: 280px;
+@@ -244,31 +290,15 @@ $color-red: #eb5757;
+ }
+ }
+
+- &__image {
++ &__image,
++ &__image-tablets,
++ &__image-access {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+- transition: transform 0.3s ease;
+- background-color: #6d6474;
++ transition: transform $transition-default;
++ background-color: $bg-card;
+ object-position: left center;
+-
+- &-tablets {
+- width: 100%;
+- height: 100%;
+- object-fit: cover;
+- transition: transform 0.3s ease;
+- background-color: #8d8d92;
+- object-position: left center;
+- }
+-
+- &-access {
+- width: 100%;
+- height: 100%;
+- object-fit: cover;
+- transition: transform 0.3s ease;
+- background-color: #973d5f;
+- object-position: left center;
+- }
+ }
+
+ &__info {
+@@ -293,7 +323,7 @@ $color-red: #eb5757;
+
+ &__count {
+ font-size: 14px;
+- color: $color-secondary;
++ color: $color-text-secondary;
+ font-weight: 600;
+ }
+-}
++}
+\ No newline at end of file
+diff --git a/src/pages/NotFoundPage/NotFoundPage.scss b/src/pages/NotFoundPage/NotFoundPage.scss
+index 5d5cffc..e519423 100644
+--- a/src/pages/NotFoundPage/NotFoundPage.scss
++++ b/src/pages/NotFoundPage/NotFoundPage.scss
+@@ -1,10 +1,11 @@
++@use '../../styles/variables' as *;
+ @import '../../styles/utils';
+
+ .title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+- color: #f1f2f9;
++ color: $color-light-1;
+ margin-top: 60px;
+ font-size: 36px;
+
+@@ -17,7 +18,7 @@
+ display: flex;
+ align-items: center;
+ justify-content: center;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-size: 24px;
+ }
+ }
+diff --git a/src/pages/PhonesPage/PhonesPage.module.scss b/src/pages/PhonesPage/PhonesPage.module.scss
+index f3f24f8..1b0fd20 100644
+--- a/src/pages/PhonesPage/PhonesPage.module.scss
++++ b/src/pages/PhonesPage/PhonesPage.module.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @use '../../styles/utils' as *;
+
+ .loader-wrapper {
+@@ -27,16 +28,12 @@
+ @include on-desktop {
+ padding: 0 32px;
+ }
+-
+- @include on-desktop {
+- padding: 0 32px;
+- }
+ }
+
+ .title {
+ margin-top: 24px;
+ margin-bottom: 8px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-family: Mont;
+ font-weight: 800;
+ font-size: 32px;
+@@ -47,7 +44,7 @@
+ .modelsCount {
+ margin-bottom: 24px;
+ font-size: 14px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ &__controls {
+@@ -76,7 +73,7 @@
+
+ .label {
+ font-size: 12px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ .select {
+@@ -84,9 +81,9 @@
+ height: 40px;
+ padding: 0 12px;
+
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
++ background: $bg-card;
++ border: 1px solid $color-border;
++ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+@@ -110,9 +107,9 @@
+ height: 40px;
+ padding: 0 12px;
+
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
++ background: $bg-card;
++ border: 1px solid $color-border;
++ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+diff --git a/src/pages/PhonesPage/PhonesPage.tsx b/src/pages/PhonesPage/PhonesPage.tsx
+index af27005..0ce11d5 100644
+--- a/src/pages/PhonesPage/PhonesPage.tsx
++++ b/src/pages/PhonesPage/PhonesPage.tsx
+@@ -40,16 +40,21 @@ export const PhonesPage = () => {
+ }, [searchQuery]);
+
+ useEffect(() => {
+- if (searchQuery.length === 0 && debouncedQuery.length > 0) {
+- setIsLoading(true);
+-
+- const timer = setTimeout(() => {
+- setIsLoading(false);
+- }, 500);
++ const shouldShowLoading =
++ searchQuery.length === 0 && debouncedQuery.length > 0;
+
+- return () => clearTimeout(timer);
++ if (!shouldShowLoading) {
++ return;
+ }
+- }, [searchQuery]);
++
++ setIsLoading(true);
++
++ const timer = setTimeout(() => {
++ setIsLoading(false);
++ }, 500);
++
++ return () => clearTimeout(timer);
++ }, [searchQuery, debouncedQuery]);
+
+ const filteredPhones = useMemo(() => {
+ const query = debouncedQuery.toLowerCase().trim();
+diff --git a/src/pages/ProductCard/ProductCard.scss b/src/pages/ProductCard/ProductCard.scss
+index d67ae5e..c4b53c6 100644
+--- a/src/pages/ProductCard/ProductCard.scss
++++ b/src/pages/ProductCard/ProductCard.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @use '../../styles/utils' as *;
+
+ body {
+@@ -12,7 +13,7 @@ body {
+ min-width: 0;
+ height: 440px;
+ padding: 32px;
+- background-color: #161827;
++ background-color: $bg-surface;
+
+ @include on-tablet {
+ height: 506px;
+@@ -31,6 +32,7 @@ body {
+ @include on-tablet {
+ height: 196px;
+ }
++
+ @include on-desktop {
+ width: 208px;
+ }
+@@ -58,6 +60,6 @@ body {
+ font-size: 14px;
+ line-height: 21px;
+ text-align: left;
+- color: #f1f2f9;
++ color: $color-light-1;
+ }
+ }
+<<<<<<< Updated upstream
+diff --git a/src/pages/ProductCard/ProductPage.tsx b/src/pages/ProductCard/ProductPage.tsx
+index 85045b9..cbbd72e 100644
+--- a/src/pages/ProductCard/ProductPage.tsx
++++ b/src/pages/ProductCard/ProductPage.tsx
+=======
+diff --git a/src/pages/ProductCard/ProductCard.tsx b/src/pages/ProductCard/ProductCard.tsx
+index 85045b9..cbbd72e 100644
+--- a/src/pages/ProductCard/ProductCard.tsx
++++ b/src/pages/ProductCard/ProductCard.tsx
+>>>>>>> Stashed changes
+@@ -116,6 +116,7 @@ export const ProductCard: React.FC = ({ product, onFavoriteChange }) => {
+ toggleFavorite();
+ }}
+ isFavorite={isFavorite}
++ // @ts-ignore
+ isInCart={isInCart(product.id)}
+ />
+
+diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.scss b/src/pages/ProductDetailsPage/ProductDetailsPage.scss
+index bb93fe3..4141b68 100644
+--- a/src/pages/ProductDetailsPage/ProductDetailsPage.scss
++++ b/src/pages/ProductDetailsPage/ProductDetailsPage.scss
+@@ -1,3 +1,4 @@
++@use '../../styles/variables' as *;
+ @import '../../styles/utils';
+
+ .loader-wrapper {
+@@ -8,65 +9,6 @@
+ width: 100%;
+ }
+
+-.product-not-found {
+- display: flex;
+- flex-direction: column;
+- min-height: 60vh;
+-
+- &__content {
+- flex: 1;
+- display: flex;
+- flex-direction: column;
+- align-items: center;
+- justify-content: center;
+- text-align: center;
+- padding: 40px 20px;
+- }
+-
+- &__title {
+- font-size: 32px;
+- font-weight: 700;
+- color: #313237;
+- margin-bottom: 16px;
+- }
+-
+- &__text {
+- font-size: 16px;
+- color: #89939a;
+- max-width: 400px;
+- margin-bottom: 32px;
+- line-height: 1.5;
+- }
+-
+- &__button {
+- padding: 12px 32px;
+- background-color: #313237;
+- color: #ffffff;
+- border: none;
+- border-radius: 4px;
+- font-weight: 600;
+- cursor: pointer;
+- transition:
+- background-color 0.3s ease,
+- transform 0.2s ease;
+-
+- &:hover {
+- background-color: #4a4b51;
+- transform: translateY(-2px);
+- }
+-
+- &:active {
+- transform: translateY(0);
+- }
+- }
+-}
+-
+-@media (max-width: 640px) {
+- .product-not-found__title {
+- font-size: 24px;
+- }
+-}
+-
+ .product-details-page {
+ width: 100%;
+ min-height: 100vh;
+@@ -90,7 +32,7 @@
+ }
+
+ .product-title {
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-weight: 800;
+ font-size: 24px;
+ line-height: 32px;
+diff --git a/src/pages/TabletsPage/TabletsPage.module.scss b/src/pages/TabletsPage/TabletsPage.module.scss
+index 0058144..ff431db 100644
+--- a/src/pages/TabletsPage/TabletsPage.module.scss
++++ b/src/pages/TabletsPage/TabletsPage.module.scss
+@@ -1,42 +1,13 @@
+ @use '../../styles/utils' as *;
+-
+-.loader-wrapper {
+- display: flex;
+- justify-content: center;
+- align-items: center;
+- height: 100vh;
+- width: 100%;
+-}
++@use '../../styles/variables' as *;
+
+ .tablets-page {
+- &__container {
+- box-sizing: border-box;
+- margin: 0 auto;
+- max-width: 1280px;
+- padding: 0 16px;
+-
+- @include on-tablet {
+- padding: 0 24px;
+-
+- .search {
+- min-width: 420px;
+- margin-left: auto;
+- }
+- }
+-
+- @include on-desktop {
+- padding: 0 32px;
+- }
+-
+- @include on-desktop {
+- padding: 0 32px;
+- }
+- }
++ padding: 0 16px;
+
+ .title {
+ margin-top: 24px;
+ margin-bottom: 8px;
+- color: #f1f2f9;
++ color: $color-light-1;
+ font-family: Mont;
+ font-weight: 800;
+ font-size: 32px;
+@@ -44,28 +15,18 @@
+ letter-spacing: -0.01em;
+ }
+
+- .modelsCount {
+- margin-bottom: 24px;
+- font-size: 14px;
+- color: #75767f;
+- }
+-
+ &__controls {
+ margin-bottom: 24px;
+ }
+
+ .controls {
+ display: flex;
+- justify-content: space-between;
++ flex-direction: column;
+ gap: 16px;
+- align-items: flex-end;
+- flex-wrap: wrap;
+- }
+
+- .controlsLeft {
+- display: flex;
+- gap: 16px;
+- flex-shrink: 0;
++ @include on-tablet {
++ flex-direction: row;
++ }
+ }
+
+ .control {
+@@ -76,7 +37,7 @@
+
+ .label {
+ font-size: 12px;
+- color: #75767f;
++ color: $color-secondary;
+ }
+
+ .select {
+@@ -84,52 +45,17 @@
+ height: 40px;
+ padding: 0 12px;
+
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
+-
+- font-family: Mont;
+- font-size: 14px;
+- appearance: none;
+- background-image: url('/img/icons/arrow-down.svg');
+- background-repeat: no-repeat;
+- background-position: right 12px center;
+- }
+-
+- .search {
+- display: flex;
+- flex-direction: column;
+- gap: 4px;
+- width: 290px;
+- order: 2;
+- }
+-
+- .searchInput {
+- width: 100%;
+- height: 40px;
+- padding: 0 12px;
+- box-sizing: border-box; // ← додати
+-
+- background: #323542;
+- border: 1px solid #3b3e4a;
+- color: #f1f2f9;
++ background: $bg-card;
++ border: 1px solid $color-border;
++ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+ }
+
+ &__list {
+- padding-bottom: 56px;
+-
+- @include on-tablet {
+- padding-bottom: 64px;
+- }
+-
+- @include on-desktop {
+- padding-bottom: 80px;
+- }
+-
+ display: grid;
++ gap: 16px;
+ row-gap: 40px;
+ column-gap: 16px;
+
+@@ -139,12 +65,17 @@
+ grid-template-columns: repeat(2, 1fr);
+ }
+
++
++
+ @include on-desktop {
+ grid-template-columns: repeat(4, 1fr);
+ }
+-
+- & > * {
+- min-width: 0;
+- }
+ }
+ }
++
++.loaderWrapper {
++ display: flex;
++ justify-content: center;
++ align-items: center;
++ height: 60vh;
++}
+diff --git a/src/pages/TabletsPage/TabletsPage.tsx b/src/pages/TabletsPage/TabletsPage.tsx
+index 9354773..886d3d4 100644
+--- a/src/pages/TabletsPage/TabletsPage.tsx
++++ b/src/pages/TabletsPage/TabletsPage.tsx
+@@ -1,152 +1,71 @@
+-import { useEffect, useMemo, useState } from 'react';
++import { useEffect, useState } from 'react';
+ import { getTablets } from '../../api/products';
+ import { Product } from '../../types/Product';
+ import { ProductCard } from '../ProductCard/ProductCard';
+-import { sortByNewest, sortByBestPrice } from '../../utils/productFilters';
+-import { SortType } from '../../types/SortType';
++import { Loader } from '../../components/ui/Loader/Loader';
+ import s from './TabletsPage.module.scss';
+-import { Breadcrumbs } from '../../components/ui/Breadcrumbs/Breadcrumbs.tsx';
+-import { ProductSkeleton } from '../../components/ProductSkelet/ProductSkelet.tsx';
+-import { NoResults } from '../../components/ui/NoResults/NoResults.tsx';
+
+ export const TabletsPage = () => {
+ const [tablets, setTablets] = useState([]);
+- const [sortBy, setSortBy] = useState('newest');
+- const [itemsOnPage, setItemsOnPage] = useState(16);
+ const [isLoading, setIsLoading] = useState(true);
+
+- const [searchQuery, setSearchQuery] = useState('');
+- const [debouncedQuery, setDebouncedQuery] = useState('');
+-
+ useEffect(() => {
+ const loadTablets = async () => {
+- setIsLoading(true);
+ try {
+ const data = await getTablets();
+- setTablets(data.map((tablet) => ({ ...tablet, category: 'tablets' })));
++ setTablets(data);
+ } finally {
+- setTimeout(() => setIsLoading(false), 600);
++ setIsLoading(false);
+ }
+ };
++
+ loadTablets();
+ }, []);
+
+- useEffect(() => {
+- const handler = setTimeout(() => {
+- setDebouncedQuery(searchQuery);
+- }, 300);
+-
+- return () => clearTimeout(handler);
+- }, [searchQuery]);
+-
+- useEffect(() => {
+- if (searchQuery.length === 0 && debouncedQuery.length > 0) {
+- setIsLoading(true);
+-
+- const timer = setTimeout(() => {
+- setIsLoading(false);
+- }, 500);
+-
+- return () => clearTimeout(timer);
+- }
+- }, [searchQuery]);
+-
+- const filteredTablets = useMemo(() => {
+- const query = debouncedQuery.toLowerCase().trim();
+- return tablets.filter((tablet) =>
+- tablet.name.toLowerCase().includes(query),
++ if (isLoading) {
++ return (
++
++
++
+ );
+- }, [tablets, debouncedQuery]);
+-
+- const sortedTablets = useMemo(() => {
+- const toSort = [...filteredTablets];
+- switch (sortBy) {
+- case 'alphabetically':
+- return toSort.sort((a, b) => a.name.localeCompare(b.name));
+- case 'bestPrice':
+- return sortByBestPrice(toSort);
+- case 'newest':
+- default:
+- return sortByNewest(toSort);
+- }
+- }, [filteredTablets, sortBy]);
+-
+- const visibleTablets = useMemo(() => {
+- return sortedTablets.slice(0, itemsOnPage);
+- }, [sortedTablets, itemsOnPage]);
++ }
+
+ return (
+
+-
+-
+-
Tablets
+-
+- {!isLoading && (
+-
{filteredTablets.length} models
+- )}
+-
+-
+-
+-
+-
+- Sort by
+- setSortBy(e.target.value as SortType)}
+- >
+- Newest
+- Alphabetically
+- Best price
+-
+-
+-
+-
+- Items on page
+- setItemsOnPage(+e.target.value)}
+- >
+- 16
+- 32
+- 64
+-
+-
+-
+-
+-
+-
+- Looking for something?
+-
+- setSearchQuery(e.target.value)}
+- />
+-
++
Tablets
++
++
++
++
++ Sort by
++
++ Newest
++ Alphabetically
++ Cheapest
++
+
+-
+
+-
+- {isLoading ?
+- Array.from({ length: 8 }).map((_, i) => )
+- : visibleTablets.length > 0 ?
+- visibleTablets.map((tablet) => (
+-
+- ))
+- : }
+-
+-
++
++ Items on page
++
++ 16
++ 32
++ 64
++
++
++
++
++
++
++ {tablets.map((tablet) => (
++
++ ))}
++
++
++
+
+ );
+ };
+diff --git a/src/styles/variables.scss b/src/styles/variables.scss
+index d0234e1..52aa8a6 100644
+--- a/src/styles/variables.scss
++++ b/src/styles/variables.scss
+@@ -13,7 +13,7 @@ $color-light-2: #e8e9ee;
+
+ /* ACCENTS */
+
+-$color-accent: #4219d0;
++$color-accent: #905bff;
+ $color-green: #27ae60;
+ $color-red: #eb5757;
+
diff --git a/cypress.config.ts b/cypress.config.ts
index 6aa317d0101..a7383650cde 100644
--- a/cypress.config.ts
+++ b/cypress.config.ts
@@ -1,14 +1,16 @@
-const { defineConfig } = require('cypress');
+import { defineConfig } from 'cypress';
-module.exports = defineConfig({
+export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3000',
specPattern: 'cypress/integration/**/*.spec.{js,ts,jsx,tsx}',
},
+
video: true,
viewportHeight: 1920,
viewportWidth: 1080,
screenshotOnRunFailure: true,
+
reporter: 'mochawesome',
reporterOptions: {
reportDir: 'raw_reports',
@@ -16,6 +18,7 @@ module.exports = defineConfig({
html: false,
json: true,
},
+
component: {
specPattern: 'src/**/*.spec.{js,ts,jsx,tsx}',
devServer: {
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
index 5aa4aef9d32..ddb5dc56639 100644
--- a/cypress/support/commands.ts
+++ b/cypress/support/commands.ts
@@ -40,10 +40,10 @@ export {};
declare global {
namespace Cypress {
- interface Chainable
{
- getByDataCy(selector: string): Chainable>;
- byDataCy(name: string): Chainable>;
- }
+ interface Chainable {
+ getByDataCy(selector: string): Chainable>;
+ byDataCy(name: string): Chainable>;
+ }
}
}
diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json
index 0211a30742d..85a584453bd 100644
--- a/cypress/tsconfig.json
+++ b/cypress/tsconfig.json
@@ -1,6 +1,7 @@
{
- "extends": "@mate-academy/students-ts-config",
+ "extends": "../tsconfig.json",
"compilerOptions": {
- "sourceMap": false
- }
+ "types": ["cypress", "node"]
+ },
+ "include": ["**/*.ts"]
}
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 00000000000..8d2ad3cb1d3
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,54 @@
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
+import prettier from 'eslint-config-prettier';
+import react from 'eslint-plugin-react';
+
+export default tseslint.config(
+ {
+ ignores: [
+ 'dist',
+ 'node_modules',
+ 'coverage',
+ 'cypress/videos',
+ 'cypress/screenshots',
+ ],
+ },
+
+ {
+ extends: [
+ js.configs.recommended,
+ ...tseslint.configs.recommended,
+ prettier,
+ ],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ settings: {
+ react: { version: 'detect' },
+ },
+ plugins: {
+ react,
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ ...react.configs.recommended.rules,
+ 'react/react-in-jsx-scope': 'off',
+ 'react/prop-types': 'off',
+ 'react-refresh/only-export-components': 'off',
+ },
+ },
+
+ {
+ files: ['cypress/**/*.ts'],
+ rules: {
+ '@typescript-eslint/no-namespace': 'off',
+ },
+ },
+);
diff --git a/index.html b/index.html
index 095fb3a4537..79a273b13d4 100644
--- a/index.html
+++ b/index.html
@@ -2,11 +2,21 @@
-
- Vite + React + TS
+
+
+ Voltrix
-
+
diff --git a/package-lock.json b/package-lock.json
index 836b9e63b46..9f33cb6391b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,106 +1,98 @@
{
- "name": "react_phone-catalog",
- "version": "0.1.0",
+ "name": "phone-catalog-frontend",
+ "version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "react_phone-catalog",
- "version": "0.1.0",
- "hasInstallScript": true,
- "license": "GPL-3.0",
- "dependencies": {
- "@fortawesome/fontawesome-free": "^6.5.2",
- "bulma": "^1.0.1",
+ "name": "phone-catalog-frontend",
+ "version": "0.0.0",
+ "dependencies": {
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@stripe/react-stripe-js": "^5.6.0",
+ "@stripe/stripe-js": "^8.8.0",
+ "@supabase/supabase-js": "^2.97.0",
"classnames": "^2.5.1",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "react-router-dom": "^6.25.1",
- "react-transition-group": "^4.4.5"
+ "framer-motion": "^12.34.1",
+ "fuse.js": "^7.1.0",
+ "i18next": "^25.8.13",
+ "i18next-browser-languagedetector": "^8.2.1",
+ "lucide-react": "^0.575.0",
+ "motion": "^12.34.1",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-i18next": "^16.5.4",
+ "react-icons": "^5.5.0",
+ "react-router-dom": "^7.13.0",
+ "sonner": "^2.0.7",
+ "swiper": "^12.1.1"
},
"devDependencies": {
- "@cypress/react18": "^2.0.1",
- "@mate-academy/scripts": "^1.8.5",
- "@mate-academy/students-ts-config": "*",
- "@mate-academy/stylelint-config": "*",
- "@types/node": "^20.14.10",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
- "@types/react-transition-group": "^4.4.10",
- "@typescript-eslint/parser": "^7.16.0",
- "@vitejs/plugin-react": "^4.3.1",
- "cypress": "^13.13.0",
- "eslint": "^8.57.0",
- "eslint-config-airbnb-typescript": "^18.0.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-cypress": "^3.3.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsx-a11y": "^6.9.0",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-react": "^7.34.4",
- "eslint-plugin-react-hooks": "^4.6.2",
- "gh-pages": "^6.1.1",
- "mochawesome": "^7.1.3",
- "mochawesome-merge": "^4.3.0",
- "mochawesome-report-generator": "^6.2.0",
- "prettier": "^3.3.2",
- "sass": "^1.77.8",
- "stylelint": "^16.7.0",
- "typescript": "^5.2.2",
- "vite": "^5.3.1"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
+ "@eslint/js": "^9.39.3",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "cypress": "^15.11.0",
+ "eslint": "^9.39.3",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.26",
+ "gh-pages": "^6.3.0",
+ "globals": "^16.5.0",
+ "husky": "^9.1.7",
+ "prettier": "^3.8.1",
+ "sass-embedded": "^1.97.3",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.56.1",
+ "vite": "^7.3.1"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
- "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.24.7",
- "picocolors": "^1.0.0"
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
- "version": "7.24.9",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz",
- "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.24.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz",
- "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.24.9",
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-module-transforms": "^7.24.9",
- "@babel/helpers": "^7.24.8",
- "@babel/parser": "^7.24.8",
- "@babel/template": "^7.24.7",
- "@babel/traverse": "^7.24.8",
- "@babel/types": "^7.24.9",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -115,39 +107,33 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
- "version": "7.24.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.9.tgz",
- "integrity": "sha512-G8v3jRg+z8IwY1jHFxvCNhOPYPterE4XljNgdGTYfSTtzzwjIswIzIaSPSLs3R7yFuqnqNeay5rjICfqVr+/6A==",
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.24.9",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz",
- "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.24.8",
- "@babel/helper-validator-option": "^7.24.8",
- "browserslist": "^4.23.1",
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
@@ -155,76 +141,40 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
- "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
- "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
- "dev": true,
- "dependencies": {
- "@babel/template": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
- "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
"dev": true,
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
- "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.24.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz",
- "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.24.7",
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-simple-access": "^7.24.7",
- "@babel/helper-split-export-declaration": "^7.24.7",
- "@babel/helper-validator-identifier": "^7.24.7"
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -234,99 +184,68 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
- "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
- "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
- "dev": true,
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
- "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
"dev": true,
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
- "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
- "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
- "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz",
- "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.24.7",
- "@babel/types": "^7.24.8"
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
- "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.24.7",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "@babel/types": "^7.29.0"
},
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz",
- "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==",
- "dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -335,12 +254,13 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz",
- "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -350,12 +270,13 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz",
- "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==",
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -365,184 +286,75 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz",
- "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
+ "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
- "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/parser": "^7.24.7",
- "@babel/types": "^7.24.7"
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz",
- "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.24.8",
- "@babel/helper-environment-visitor": "^7.24.7",
- "@babel/helper-function-name": "^7.24.7",
- "@babel/helper-hoist-variables": "^7.24.7",
- "@babel/helper-split-export-declaration": "^7.24.7",
- "@babel/parser": "^7.24.8",
- "@babel/types": "^7.24.8",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
- "version": "7.24.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz",
- "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@csstools/css-parser-algorithms": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
- "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-tokenizer": "^2.4.1"
- }
- },
- "node_modules/@csstools/css-tokenizer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
- "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- }
- },
- "node_modules/@csstools/media-query-list-parser": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
- "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^2.7.1",
- "@csstools/css-tokenizer": "^2.4.1"
- }
- },
- "node_modules/@csstools/selector-specificity": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
- "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.0.13"
- }
- },
- "node_modules/@cypress/react18": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/react18/-/react18-2.0.1.tgz",
- "integrity": "sha512-T/bhFEvVDIu0lDOKXbEQqVEmmANKWc/pyFDyDoJw3OndRYv9QVEJSsE/VNXIaOQLDjWvQkKBOwd0lLe1hWF/Zg==",
+ "node_modules/@bufbuild/protobuf": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.11.0.tgz",
+ "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==",
"dev": true,
- "peerDependencies": {
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "cypress": "*",
- "react": "^18",
- "react-dom": "^18"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
+ "license": "(Apache-2.0 AND BSD-3-Clause)"
},
"node_modules/@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz",
+ "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -550,16 +362,16 @@
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
+ "form-data": "~4.0.4",
+ "http-signature": "~1.4.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"performance-now": "^2.1.0",
- "qs": "6.10.4",
+ "qs": "~6.14.1",
"safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
+ "tough-cookie": "^5.0.0",
"tunnel-agent": "^0.6.0",
"uuid": "^8.3.2"
},
@@ -572,6 +384,7 @@
"resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
"integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^3.1.0",
"lodash.once": "^4.1.1"
@@ -582,537 +395,670 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
- "node_modules/@dual-bundle/import-meta-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
- "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
- "dev": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
+ "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
+ "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
+ "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
+ "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
- "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
+ "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
+ "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
+ "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
+ "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
+ "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
+ "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
+ "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
"cpu": [
"loong64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
+ "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
"cpu": [
"mips64el"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
+ "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
+ "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
"cpu": [
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
+ "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
"cpu": [
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
+ "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
+ "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
+ "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
+ "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
+ "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
+ "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
+ "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
+ "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.3.0"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/@eslint-community/regexpp": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
- "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "type-fest": "^0.20.2"
+ "@types/json-schema": "^7.0.15"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz",
+ "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.3",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@eslint/eslintrc/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/js": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
- "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "version": "9.39.3",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz",
+ "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
- "node_modules/@fortawesome/fontawesome-free": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.2.tgz",
- "integrity": "sha512-hRILoInAx8GNT5IMkrtIt9blOdrqHOnPBH+k70aWUAqPZPgopb9G5EQJFpaBx/S8zp2fC+mPW349Bziuk1o28Q==",
- "hasInstallScript": true,
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
- "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
- "deprecated": "Use @eslint/config-array instead",
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.2",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
},
"engines": {
- "node": ">=10.10.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz",
+ "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==",
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@floating-ui/utils": "^0.2.10"
}
},
- "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz",
+ "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.4",
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz",
+ "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": "*"
+ "node": ">=18.18.0"
}
},
"node_modules/@humanwhocodes/module-importer": {
@@ -1120,6 +1066,7 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=12.22"
},
@@ -1128,25 +1075,40 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
- "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
- "deprecated": "Use @eslint/object-schema instead",
- "dev": true
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
@@ -1154,4661 +1116,3350 @@
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
- "dev": true
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@mate-academy/scripts": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-1.8.5.tgz",
- "integrity": "sha512-mHRY2FkuoYCf5U0ahIukkaRo5LSZsxrTSgMJheFoyf3VXsTvfM9OfWcZIDIDB521kdPrScHHnRp+JRNjCfUO5A==",
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@octokit/rest": "^17.11.2",
- "@types/get-port": "^4.2.0",
- "commander": "^5.1.0",
- "cross-env": "^7.0.3",
- "dotenv": "^8.6.0",
- "fs-extra": "^9.1.0",
- "get-port": "^5.1.1",
- "open": "^7.4.2",
- "sinon": "^9.2.4",
- "tree-kill": "^1.2.2"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
- "bin": {
- "mate-scripts": "bin/mateScripts.js"
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@mate-academy/students-ts-config": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@mate-academy/students-ts-config/-/students-ts-config-0.0.4.tgz",
- "integrity": "sha512-DQE6NsG1DGfNe1VuCuJlfnh3f6Ey4p1P/4yaUYar8Zej+jVLaO3GddS0Sjrk90EB6G2/fhI41tKdFBPzdyYwIQ==",
- "dev": true
- },
- "node_modules/@mate-academy/stylelint-config": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@mate-academy/stylelint-config/-/stylelint-config-0.0.12.tgz",
- "integrity": "sha512-KVf6pK0SwFP4zYfNkj68+LuHRPzx/F5GNeCaPQQauDm3X08Crj/X15fu/l9XvUD2ttEAi8dcASSABuGx54rPVA==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
- "dependencies": {
- "stylelint-config-standard-scss": "^11.1.0",
- "stylelint-scss": "^5.3.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
- "peer": true
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
},
- "node_modules/@mate-academy/stylelint-config/node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
+ "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
"dev": true,
- "peer": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.3"
},
"engines": {
- "node": ">=14"
+ "node": ">= 10.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/d-fischer"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
},
- "peerDependencies": {
- "typescript": ">=4.9.5"
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.6",
+ "@parcel/watcher-darwin-arm64": "2.5.6",
+ "@parcel/watcher-darwin-x64": "2.5.6",
+ "@parcel/watcher-freebsd-x64": "2.5.6",
+ "@parcel/watcher-linux-arm-glibc": "2.5.6",
+ "@parcel/watcher-linux-arm-musl": "2.5.6",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.6",
+ "@parcel/watcher-linux-arm64-musl": "2.5.6",
+ "@parcel/watcher-linux-x64-glibc": "2.5.6",
+ "@parcel/watcher-linux-x64-musl": "2.5.6",
+ "@parcel/watcher-win32-arm64": "2.5.6",
+ "@parcel/watcher-win32-ia32": "2.5.6",
+ "@parcel/watcher-win32-x64": "2.5.6"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz",
+ "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/decamelize": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
- "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz",
+ "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">= 10.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/file-entry-cache": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
- "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz",
+ "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "peer": true,
- "dependencies": {
- "flat-cache": "^3.2.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=12.0.0"
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/known-css-properties": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
- "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
- "dev": true
- },
- "node_modules/@mate-academy/stylelint-config/node_modules/meow": {
- "version": "10.1.5",
- "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
- "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz",
+ "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "peer": true,
- "dependencies": {
- "@types/minimist": "^1.2.2",
- "camelcase-keys": "^7.0.0",
- "decamelize": "^5.0.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.2",
- "read-pkg-up": "^8.0.0",
- "redent": "^4.0.0",
- "trim-newlines": "^4.0.2",
- "type-fest": "^1.2.2",
- "yargs-parser": "^20.2.9"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">= 10.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/postcss-safe-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
- "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz",
+ "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12.0"
+ "node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.3.3"
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz",
+ "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint": {
- "version": "15.11.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
- "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@csstools/css-parser-algorithms": "^2.3.1",
- "@csstools/css-tokenizer": "^2.2.0",
- "@csstools/media-query-list-parser": "^2.1.4",
- "@csstools/selector-specificity": "^3.0.0",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^8.2.0",
- "css-functions-list": "^3.2.1",
- "css-tree": "^2.3.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.1",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^7.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.2.4",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.29.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^10.1.5",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.28",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^6.0.0",
- "postcss-selector-parser": "^6.0.13",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "style-search": "^0.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.1",
- "write-file-atomic": "^5.0.1"
- },
- "bin": {
- "stylelint": "bin/stylelint.mjs"
- },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz",
+ "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": "^14.13.1 || >=16.0.0"
+ "node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/stylelint"
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint-config-recommended": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz",
- "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==",
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz",
+ "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": "^14.13.1 || >=16.0.0"
+ "node": ">= 10.0.0"
},
- "peerDependencies": {
- "stylelint": "^15.10.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint-config-recommended-scss": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-13.1.0.tgz",
- "integrity": "sha512-8L5nDfd+YH6AOoBGKmhH8pLWF1dpfY816JtGMePcBqqSsLU+Ysawx44fQSlMOJ2xTfI9yTGpup5JU77c17w1Ww==",
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz",
+ "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "postcss-scss": "^4.0.9",
- "stylelint-config-recommended": "^13.0.0",
- "stylelint-scss": "^5.3.0"
- },
- "peerDependencies": {
- "postcss": "^8.3.3",
- "stylelint": "^15.10.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
},
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint-config-standard": {
- "version": "34.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz",
- "integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==",
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz",
+ "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "stylelint-config-recommended": "^13.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": "^14.13.1 || >=16.0.0"
+ "node": ">= 10.0.0"
},
- "peerDependencies": {
- "stylelint": "^15.10.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint-config-standard-scss": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-11.1.0.tgz",
- "integrity": "sha512-5gnBgeNTgRVdchMwiFQPuBOtj9QefYtfXiddrOMJA2pI22zxt6ddI2s+e5Oh7/6QYl7QLJujGnaUR5YyGq72ow==",
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz",
+ "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "stylelint-config-recommended-scss": "^13.1.0",
- "stylelint-config-standard": "^34.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.3.3",
- "stylelint": "^15.10.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
},
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/stylelint-scss": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz",
- "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==",
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz",
+ "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "known-css-properties": "^0.29.0",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-selector-parser": "^6.0.13",
- "postcss-value-parser": "^4.2.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
},
- "peerDependencies": {
- "stylelint": "^14.5.1 || ^15.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@mate-academy/stylelint-config/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz",
+ "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">= 10.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/@parcel/watcher/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">= 8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
+ "license": "MIT"
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+ "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@radix-ui/react-primitive": "2.1.3"
},
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@octokit/auth-token": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz",
- "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/core": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz",
- "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==",
- "dev": true,
- "peer": true,
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+ "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+ "license": "MIT",
"dependencies": {
- "@octokit/auth-token": "^5.0.0",
- "@octokit/graphql": "^8.0.0",
- "@octokit/request": "^9.0.0",
- "@octokit/request-error": "^6.0.1",
- "@octokit/types": "^13.0.0",
- "before-after-hook": "^3.0.2",
- "universal-user-agent": "^7.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3"
},
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/endpoint": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz",
- "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/types": "^13.0.0",
- "universal-user-agent": "^7.0.2"
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+ "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
- "engines": {
- "node": ">= 18"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/graphql": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz",
- "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@octokit/request": "^9.0.0",
- "@octokit/types": "^13.0.0",
- "universal-user-agent": "^7.0.0"
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+ "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
- "engines": {
- "node": ">= 18"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/openapi-types": {
- "version": "22.2.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz",
- "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==",
- "dev": true,
- "peer": true
- },
- "node_modules/@octokit/plugin-paginate-rest": {
- "version": "2.21.3",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
- "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
- "dev": true,
- "dependencies": {
- "@octokit/types": "^6.40.0"
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
- "@octokit/core": ">=2"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
- "version": "12.11.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
- "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==",
- "dev": true
- },
- "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
- "dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+ "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/plugin-request-log": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
- "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
- "dev": true,
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-escape-keydown": "1.1.1"
+ },
"peerDependencies": {
- "@octokit/core": ">=3"
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/plugin-rest-endpoint-methods": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz",
- "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==",
- "dev": true,
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
+ "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^4.1.6",
- "deprecation": "^2.3.1"
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-menu": "2.1.16",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz",
- "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==",
- "dev": true,
- "dependencies": {
- "@types/node": ">= 8"
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/request": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz",
- "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==",
- "dev": true,
- "peer": true,
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+ "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+ "license": "MIT",
"dependencies": {
- "@octokit/endpoint": "^10.0.0",
- "@octokit/request-error": "^6.0.1",
- "@octokit/types": "^13.1.0",
- "universal-user-agent": "^7.0.2"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1"
},
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/request-error": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz",
- "integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==",
- "dev": true,
- "peer": true,
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+ "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^13.0.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest": {
- "version": "17.11.2",
- "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz",
- "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==",
- "dev": true,
- "dependencies": {
- "@octokit/core": "^2.4.3",
- "@octokit/plugin-paginate-rest": "^2.2.0",
- "@octokit/plugin-request-log": "^1.0.0",
- "@octokit/plugin-rest-endpoint-methods": "3.17.0"
+ "node_modules/@radix-ui/react-menu": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
+ "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
+ "@radix-ui/react-focus-scope": "1.1.7",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-popper": "1.2.8",
+ "@radix-ui/react-portal": "1.1.9",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-slot": "1.2.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "aria-hidden": "^1.2.4",
+ "react-remove-scroll": "^2.6.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
- "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
- "dev": true,
- "dependencies": {
- "@octokit/types": "^6.0.3"
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-layout-effect": "1.1.1",
+ "@radix-ui/react-use-rect": "1.1.1",
+ "@radix-ui/react-use-size": "1.1.1",
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/auth-token/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+ "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+ "license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/core": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz",
- "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==",
- "dev": true,
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
+ "license": "MIT",
"dependencies": {
- "@octokit/auth-token": "^2.4.0",
- "@octokit/graphql": "^4.3.1",
- "@octokit/request": "^5.4.0",
- "@octokit/types": "^5.0.0",
- "before-after-hook": "^2.1.0",
- "universal-user-agent": "^5.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
- "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
- "dev": true,
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+ "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^6.0.3",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
+ "@radix-ui/react-slot": "1.2.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
- "dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collection": "1.1.7",
+ "@radix-ui/react-compose-refs": "1.1.2",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-use-callback-ref": "1.1.1",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/universal-user-agent": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
- "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
- "dev": true
- },
- "node_modules/@octokit/rest/node_modules/@octokit/graphql": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
- "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
- "dev": true,
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+ "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+ "license": "MIT",
"dependencies": {
- "@octokit/request": "^5.6.0",
- "@octokit/types": "^6.0.3",
- "universal-user-agent": "^6.0.0"
+ "@radix-ui/react-compose-refs": "1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
- "dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-context": "1.1.2",
+ "@radix-ui/react-direction": "1.1.1",
+ "@radix-ui/react-id": "1.1.1",
+ "@radix-ui/react-presence": "1.1.5",
+ "@radix-ui/react-primitive": "2.1.3",
+ "@radix-ui/react-roving-focus": "1.1.11",
+ "@radix-ui/react-use-controllable-state": "1.2.2"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/graphql/node_modules/universal-user-agent": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
- "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
- "dev": true
- },
- "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
- "version": "12.11.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
- "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==",
- "dev": true
- },
- "node_modules/@octokit/rest/node_modules/@octokit/request": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
- "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
- "dev": true,
- "dependencies": {
- "@octokit/endpoint": "^6.0.1",
- "@octokit/request-error": "^2.1.0",
- "@octokit/types": "^6.16.1",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+ "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
- "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
- "dev": true,
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+ "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^6.0.3",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
+ "@radix-ui/react-use-effect-event": "0.0.2",
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
+ "node_modules/@radix-ui/react-use-effect-event": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+ "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+ "license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@octokit/types": {
- "version": "6.41.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
- "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
- "dev": true,
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+ "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+ "license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^12.11.0"
+ "@radix-ui/react-use-callback-ref": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/universal-user-agent": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
- "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==",
- "dev": true
- },
- "node_modules/@octokit/rest/node_modules/@octokit/types": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz",
- "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==",
- "dev": true,
- "dependencies": {
- "@types/node": ">= 8"
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+ "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/rest/node_modules/before-after-hook": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
- "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
- "dev": true
- },
- "node_modules/@octokit/rest/node_modules/universal-user-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz",
- "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==",
- "dev": true,
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+ "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+ "license": "MIT",
"dependencies": {
- "os-name": "^3.1.0"
+ "@radix-ui/rect": "1.1.1"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@octokit/types": {
- "version": "13.5.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz",
- "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==",
- "dev": true,
- "peer": true,
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+ "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+ "license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^22.2.0"
- }
- },
- "node_modules/@pkgr/core": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ "@radix-ui/react-use-layout-effect": "1.1.1"
},
- "funding": {
- "url": "https://opencollective.com/unts"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@remix-run/router": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz",
- "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==",
- "engines": {
- "node": ">=14.0.0"
- }
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+ "license": "MIT"
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz",
+ "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
- "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
+ "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
- "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
+ "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
- "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
+ "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
- "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
+ "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
+ "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
+ "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
- "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
+ "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
- "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
+ "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
- "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
+ "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
- "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
+ "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
+ "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
+ "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
- "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
+ "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
+ "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
- "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
+ "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
+ "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
"cpu": [
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
- "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
+ "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
"cpu": [
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
- "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
- "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
+ "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
]
},
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
+ "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
+ "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
- "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
+ "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
- "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
+ "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
- "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
]
},
- "node_modules/@sinonjs/commons": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
- "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
- "dev": true,
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/fake-timers": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
- "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
- "dev": true,
- "dependencies": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "node_modules/@sinonjs/samsam": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz",
- "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==",
- "dev": true,
- "dependencies": {
- "@sinonjs/commons": "^1.6.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
- }
- },
- "node_modules/@sinonjs/text-encoding": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
- "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
- "dev": true
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
- "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/@types/get-port": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-4.2.0.tgz",
- "integrity": "sha512-Iv2FAb5RnIk/eFO2CTu8k+0VMmIR15pKbcqRWi+s3ydW+aKXlN2yemP92SrO++ERyJx+p6Ie1ggbLBMbU1SjiQ==",
- "deprecated": "This is a stub types definition. get-port provides its own type definitions, so you do not need this installed.",
- "dev": true,
- "dependencies": {
- "get-port": "*"
- }
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true
- },
- "node_modules/@types/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/node": {
- "version": "20.14.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
- "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
- "dev": true,
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.12",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
- "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
- "dev": true
- },
- "node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
- "dev": true,
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.3.0",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
- "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-transition-group": {
- "version": "4.4.10",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
- "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "node_modules/@types/sizzle": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
- "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
- "dev": true
- },
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz",
- "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/type-utils": "7.16.0",
- "@typescript-eslint/utils": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz",
- "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/typescript-estree": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz",
- "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz",
- "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "7.16.0",
- "@typescript-eslint/utils": "7.16.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz",
- "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz",
- "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/visitor-keys": "7.16.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz",
- "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.16.0",
- "@typescript-eslint/types": "7.16.0",
- "@typescript-eslint/typescript-estree": "7.16.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz",
- "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "7.16.0",
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
- "dev": true
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz",
- "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.24.5",
- "@babel/plugin-transform-react-jsx-self": "^7.24.5",
- "@babel/plugin-transform-react-jsx-source": "^7.24.1",
- "@types/babel__core": "^7.20.5",
- "react-refresh": "^0.14.2"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^4.2.0 || ^5.0.0"
- }
- },
- "node_modules/acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/aria-query": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
- "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
- "dev": true,
- "dependencies": {
- "deep-equal": "^2.0.5"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
- "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
- "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
- "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.toreversed": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
- "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
- "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-shim-unscopables": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/ast-types-flow": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
- "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
- "dev": true
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
- "dev": true
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "dev": true,
- "dependencies": {
- "possible-typed-array-names": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz",
- "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==",
- "dev": true
- },
- "node_modules/axe-core": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz",
- "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/axobject-query": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
- "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
- "dev": true,
- "dependencies": {
- "deep-equal": "^2.0.5"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/before-after-hook": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
- "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
- "dev": true,
- "peer": true
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true,
- "peer": true
- },
- "node_modules/browserslist": {
- "version": "4.23.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz",
- "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001640",
- "electron-to-chromium": "^1.4.820",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.1.0"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/bulma": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.1.tgz",
- "integrity": "sha512-+xv/BIAEQakHkR0QVz+s+RjNqfC53Mx9ZYexyaFNFo9wx5i76HXArNdwW7bccyJxa5mgV/T5DcVGqsAB19nBJQ=="
- },
- "node_modules/cachedir": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
- "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "dev": true,
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/camelcase-keys": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
- "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "camelcase": "^6.3.0",
- "map-obj": "^4.1.0",
- "quick-lru": "^5.1.1",
- "type-fest": "^1.2.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/camelcase-keys/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001642",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz",
- "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "dependencies": {
- "restore-cursor": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-table3": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
- "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "dev": true
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/confusing-browser-globals": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
- "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
- "dev": true
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true
- },
- "node_modules/cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
- "dev": true,
- "dependencies": {
- "env-paths": "^2.2.1",
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "bin": {
- "cross-env": "src/bin/cross-env.js",
- "cross-env-shell": "src/bin/cross-env-shell.js"
- },
- "engines": {
- "node": ">=10.14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-functions-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
- "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
- "dev": true,
- "engines": {
- "node": ">=12 || >=16"
- }
- },
- "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==",
- "dev": true,
- "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/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
- },
- "node_modules/cypress": {
- "version": "13.13.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz",
- "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@cypress/request": "^3.0.0",
- "@cypress/xvfb": "^1.2.4",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.7.1",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.1",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.3",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "cypress": "bin/cypress"
- },
- "engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
- }
- },
- "node_modules/cypress/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/cypress/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/cypress/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/cypress/node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/cypress/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cypress/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "dev": true
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/dateformat": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
- "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dayjs": {
- "version": "1.11.11",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz",
- "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==",
- "dev": true
- },
- "node_modules/debug": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decamelize-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
- "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decamelize-keys/node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/decamelize-keys/node_modules/map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/deep-equal": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
- "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.5",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.2",
- "is-arguments": "^1.1.1",
- "is-array-buffer": "^3.0.2",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "isarray": "^2.0.5",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "dev": true,
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/deprecation": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
- "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
- "dev": true
- },
- "node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "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==",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/dotenv": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
- "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.827",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz",
- "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==",
- "dev": true
- },
- "node_modules/email-addresses": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
- "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
+ "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "once": "^1.4.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/enquirer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
- "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
- "dev": true,
+ "node_modules/@stripe/react-stripe-js": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-5.6.0.tgz",
+ "integrity": "sha512-tucu/vTGc+5NXbo2pUiaVjA4ENdRBET8qGS00BM4BAU8J4Pi3eY6BHollsP2+VSuzzlvXwMg0it3ZLhbCj2fPg==",
+ "license": "MIT",
"dependencies": {
- "ansi-colors": "^4.1.1",
- "strip-ansi": "^6.0.1"
+ "prop-types": "^15.7.2"
},
- "engines": {
- "node": ">=8.6"
+ "peerDependencies": {
+ "@stripe/stripe-js": ">=8.0.0 <9.0.0",
+ "react": ">=16.8.0 <20.0.0",
+ "react-dom": ">=16.8.0 <20.0.0"
}
},
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
+ "node_modules/@stripe/stripe-js": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-8.8.0.tgz",
+ "integrity": "sha512-NNYuyW8qmLjyHnpyFgs/23wUrjB8k0xN9YIZFOMLewCa/pIkIji9e9aY/EgdNryEDDRptc6TcPIHRvG1R0ClFw==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=12.16"
}
},
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
+ "node_modules/@supabase/auth-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.97.0.tgz",
+ "integrity": "sha512-2Og/1lqp+AIavr8qS2X04aSl8RBY06y4LrtIAGxat06XoXYiDxKNQMQzWDAKm1EyZFZVRNH48DO5YvIZ7la5fQ==",
+ "license": "MIT",
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
- "dev": true,
+ "node_modules/@supabase/functions-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.97.0.tgz",
+ "integrity": "sha512-fSaA0ZeBUS9hMgpGZt5shIZvfs3Mvx2ZdajQT4kv/whubqDBAp3GU5W8iIXy21MRvKmO2NpAj8/Q6y+ZkZyF/w==",
+ "license": "MIT",
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "tslib": "2.8.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=20.0.0"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dev": true,
+ "node_modules/@supabase/postgrest-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.97.0.tgz",
+ "integrity": "sha512-g4Ps0eaxZZurvfv/KGoo2XPZNpyNtjth9aW8eho9LZWM0bUuBtxPZw3ZQ6ERSpEGogshR+XNgwlSPIwcuHCNww==",
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4"
+ "tslib": "2.8.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=20.0.0"
}
},
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
+ "node_modules/@supabase/realtime-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.97.0.tgz",
+ "integrity": "sha512-37Jw0NLaFP0CZd7qCan97D1zWutPrTSpgWxAw6Yok59JZoxp4IIKMrPeftJ3LZHmf+ILQOPy3i0pRDHM9FY36Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/phoenix": "^1.6.6",
+ "@types/ws": "^8.18.1",
+ "tslib": "2.8.1",
+ "ws": "^8.18.2"
+ },
"engines": {
- "node": ">= 0.4"
+ "node": ">=20.0.0"
}
},
- "node_modules/es-get-iterator": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
- "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
- "dev": true,
+ "node_modules/@supabase/storage-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.97.0.tgz",
+ "integrity": "sha512-9f6NniSBfuMxOWKwEFb+RjJzkfMdJUwv9oHuFJKfe/5VJR8cd90qw68m6Hn0ImGtwG37TUO+QHtoOechxRJ1Yg==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "is-arguments": "^1.1.1",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.7",
- "isarray": "^2.0.5",
- "stop-iteration-iterator": "^1.0.0"
+ "iceberg-js": "^0.8.1",
+ "tslib": "2.8.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/es-iterator-helpers": {
- "version": "1.0.19",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
- "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
- "dev": true,
+ "node_modules/@supabase/supabase-js": {
+ "version": "2.97.0",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.97.0.tgz",
+ "integrity": "sha512-kTD91rZNO4LvRUHv4x3/4hNmsEd2ofkYhuba2VMUPRVef1RCmnHtm7rIws38Fg0yQnOSZOplQzafn0GSiy6GVg==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.3",
- "es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.1.2"
+ "@supabase/auth-js": "2.97.0",
+ "@supabase/functions-js": "2.97.0",
+ "@supabase/postgrest-js": "2.97.0",
+ "@supabase/realtime-js": "2.97.0",
+ "@supabase/storage-js": "2.97.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=20.0.0"
}
},
- "node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@babel/types": "^7.28.2"
}
},
- "node_modules/esbuild": {
- "version": "0.21.5",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
- "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.21.5",
- "@esbuild/android-arm": "0.21.5",
- "@esbuild/android-arm64": "0.21.5",
- "@esbuild/android-x64": "0.21.5",
- "@esbuild/darwin-arm64": "0.21.5",
- "@esbuild/darwin-x64": "0.21.5",
- "@esbuild/freebsd-arm64": "0.21.5",
- "@esbuild/freebsd-x64": "0.21.5",
- "@esbuild/linux-arm": "0.21.5",
- "@esbuild/linux-arm64": "0.21.5",
- "@esbuild/linux-ia32": "0.21.5",
- "@esbuild/linux-loong64": "0.21.5",
- "@esbuild/linux-mips64el": "0.21.5",
- "@esbuild/linux-ppc64": "0.21.5",
- "@esbuild/linux-riscv64": "0.21.5",
- "@esbuild/linux-s390x": "0.21.5",
- "@esbuild/linux-x64": "0.21.5",
- "@esbuild/netbsd-x64": "0.21.5",
- "@esbuild/openbsd-x64": "0.21.5",
- "@esbuild/sunos-x64": "0.21.5",
- "@esbuild/win32-arm64": "0.21.5",
- "@esbuild/win32-ia32": "0.21.5",
- "@esbuild/win32-x64": "0.21.5"
- }
+ "license": "MIT"
},
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz",
+ "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
}
},
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
+ "node_modules/@types/phoenix": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz",
+ "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==",
+ "license": "MIT"
},
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
"dev": true,
- "engines": {
- "node": ">=0.8.0"
+ "license": "MIT"
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz",
+ "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/tmp": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz",
+ "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
}
},
- "node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz",
+ "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.56.1",
+ "@typescript-eslint/type-utils": "8.56.1",
+ "@typescript-eslint/utils": "8.56.1",
+ "@typescript-eslint/visitor-keys": "8.56.1",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
+ "ts-api-utils": "^2.4.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.56.1",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
}
},
- "node_modules/eslint-config-airbnb-base": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
- "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz",
+ "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "confusing-browser-globals": "^1.0.10",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.5",
- "semver": "^6.3.0"
+ "@typescript-eslint/scope-manager": "8.56.1",
+ "@typescript-eslint/types": "8.56.1",
+ "@typescript-eslint/typescript-estree": "8.56.1",
+ "@typescript-eslint/visitor-keys": "8.56.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^7.32.0 || ^8.2.0",
- "eslint-plugin-import": "^2.25.2"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/eslint-config-airbnb-base/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz",
+ "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.56.1",
+ "@typescript-eslint/types": "^8.56.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/eslint-config-airbnb-typescript": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz",
- "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz",
+ "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "eslint-config-airbnb-base": "^15.0.0"
+ "@typescript-eslint/types": "8.56.1",
+ "@typescript-eslint/visitor-keys": "8.56.1"
},
- "peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^7.0.0",
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/eslint-config-prettier": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
- "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
+ "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
"dev": true,
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": ">=7.0.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz",
+ "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
+ "@typescript-eslint/types": "8.56.1",
+ "@typescript-eslint/typescript-estree": "8.56.1",
+ "@typescript-eslint/utils": "8.56.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
+ "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==",
"dev": true,
- "dependencies": {
- "ms": "^2.1.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/eslint-module-utils": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
- "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz",
+ "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^3.2.7"
+ "@typescript-eslint/project-service": "8.56.1",
+ "@typescript-eslint/tsconfig-utils": "8.56.1",
+ "@typescript-eslint/types": "8.56.1",
+ "@typescript-eslint/visitor-keys": "8.56.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
"dev": true,
- "dependencies": {
- "ms": "^2.1.1"
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/eslint-plugin-cypress": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-3.3.0.tgz",
- "integrity": "sha512-HPHMPzYBIshzJM8wqgKSKHG2p/8R0Gbg4Pb3tcdC9WrmkuqxiKxSKbjunUrajhV5l7gCIFrh1P7C7GuBqH6YuQ==",
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "globals": "^13.20.0"
+ "balanced-match": "^4.0.2"
},
- "peerDependencies": {
- "eslint": ">=7"
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/eslint-plugin-cypress/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "type-fest": "^0.20.2"
+ "brace-expansion": "^5.0.2"
},
"engines": {
- "node": ">=8"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/eslint-plugin-cypress/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-import": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
- "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz",
+ "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlastindex": "^1.2.3",
- "array.prototype.flat": "^1.3.2",
- "array.prototype.flatmap": "^1.3.2",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.8.0",
- "hasown": "^2.0.0",
- "is-core-module": "^2.13.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.7",
- "object.groupby": "^1.0.1",
- "object.values": "^1.1.7",
- "semver": "^6.3.1",
- "tsconfig-paths": "^3.15.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.56.1",
+ "@typescript-eslint/types": "8.56.1",
+ "@typescript-eslint/typescript-estree": "8.56.1"
},
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz",
+ "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@typescript-eslint/types": "8.56.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "dependencies": {
- "ms": "^2.1.1"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz",
+ "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "esutils": "^2.0.2"
+ "@babel/core": "^7.29.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-rc.3",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.18.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
},
"engines": {
- "node": "*"
+ "node": ">=0.4.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz",
- "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==",
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "aria-query": "~5.1.3",
- "array-includes": "^3.1.8",
- "array.prototype.flatmap": "^1.3.2",
- "ast-types-flow": "^0.0.8",
- "axe-core": "^4.9.1",
- "axobject-query": "~3.1.1",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "es-iterator-helpers": "^1.0.19",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^3.3.5",
- "language-tags": "^1.0.9",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.8",
- "safe-regex-test": "^1.0.3",
- "string.prototype.includes": "^2.0.0"
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
},
"engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ "node": ">=8"
}
},
- "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=6"
}
},
- "node_modules/eslint-plugin-prettier": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
- "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "prettier-linter-helpers": "^1.0.0",
- "synckit": "^0.8.6"
+ "type-fest": "^0.21.3"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
+ "node": ">=8"
},
"funding": {
- "url": "https://opencollective.com/eslint-plugin-prettier"
- },
- "peerDependencies": {
- "@types/eslint": ">=8.0.0",
- "eslint": ">=8.0.0",
- "eslint-config-prettier": "*",
- "prettier": ">=3.0.0"
- },
- "peerDependenciesMeta": {
- "@types/eslint": {
- "optional": true
- },
- "eslint-config-prettier": {
- "optional": true
- }
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-react": {
- "version": "7.34.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.4.tgz",
- "integrity": "sha512-Np+jo9bUwJNxCsT12pXtrGhJgT3T44T1sHhn1Ssr42XFn8TES0267wPGo5nNrMHi8qkyimDAX2BUmkf9pSaVzA==",
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"dev": true,
- "dependencies": {
- "array-includes": "^3.1.8",
- "array.prototype.findlast": "^1.2.5",
- "array.prototype.flatmap": "^1.3.2",
- "array.prototype.toreversed": "^1.1.2",
- "array.prototype.tosorted": "^1.1.4",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.19",
- "estraverse": "^5.3.0",
- "hasown": "^2.0.2",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.8",
- "object.fromentries": "^2.0.8",
- "object.values": "^1.2.0",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.5",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.11",
- "string.prototype.repeat": "^1.0.0"
- },
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=4"
+ "node": ">=10"
},
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
- "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ "node": ">=8"
}
},
- "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
+ "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
+ "license": "MIT",
"dependencies": {
- "esutils": "^2.0.2"
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
}
},
- "node_modules/eslint-plugin-react/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "node_modules/array-includes": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
},
- "bin": {
- "resolve": "bin/resolve"
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
+ "safer-buffer": "~2.1.0"
}
},
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.8"
}
},
- "node_modules/eslint/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
+ "license": "MIT",
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT"
},
- "node_modules/eslint/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">= 0.4"
}
},
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT"
},
- "node_modules/eslint/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 4.0.0"
}
},
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
+ "possible-typed-array-names": "^1.0.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
"dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=0.10"
+ "node": "*"
}
},
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
"dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
+ "license": "MIT"
},
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
"dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
"engines": {
- "node": ">=4.0"
+ "node": ">=6.0.0"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
}
},
- "node_modules/eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
+ "node_modules/blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true,
+ "license": "Apache-2.0"
},
- "node_modules/execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "pify": "^2.2.0"
+ "fill-range": "^7.1.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
},
"bin": {
- "extract-zip": "cli.js"
+ "browserslist": "cli.js"
},
"engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
- "engines": [
- "node >=0.6.0"
- ]
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
},
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
},
- "node_modules/fast-diff": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
- "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
- "dev": true
+ "node_modules/cachedir": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
+ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 0.4"
}
},
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fast-uri": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
- "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
- "dev": true
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
"engines": {
- "node": ">= 4.9.1"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001774",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz",
+ "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==",
"dev": true,
- "dependencies": {
- "pend": "~1.2.0"
- }
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
},
- "node_modules/figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
"dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "escape-string-regexp": "^1.0.5"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "flat-cache": "^3.0.4"
+ "readdirp": "^4.0.1"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/filename-reserved-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/filenamify": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
- "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
- "dependencies": {
- "filename-reserved-regex": "^2.0.0",
- "strip-outer": "^1.0.1",
- "trim-repeated": "^1.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=6"
}
},
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "restore-cursor": "^3.1.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "node_modules/cli-table3": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
+ "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
+ "string-width": "^4.2.0"
},
"engines": {
- "node": ">=8"
+ "node": "10.* || >= 12.*"
},
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ "optionalDependencies": {
+ "colors": "1.4.0"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "peer": true,
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
+ "color-name": "~1.1.4"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=7.0.0"
}
},
- "node_modules/flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
- "dev": true
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
+ "license": "MIT"
},
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "node_modules/colorjs.io": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz",
+ "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==",
"dev": true,
- "engines": {
- "node": "*"
- }
+ "license": "MIT"
},
- "node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">= 0.12"
+ "node": ">=0.1.90"
}
},
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "delayed-stream": "~1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8"
}
},
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
"dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/fsu": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz",
- "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==",
- "dev": true
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=18"
}
},
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4.0.0"
}
},
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT"
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
+ "license": "MIT"
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
+ "license": "MIT"
},
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "dev": true,
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/get-port": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
- "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT"
},
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "pump": "^3.0.0"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 8"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/cypress": {
+ "version": "15.11.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.11.0.tgz",
+ "integrity": "sha512-NXDE6/fqZuzh1Zr53nyhCCa4lcANNTYWQNP9fJO+tzD3qVTDaTUni5xXMuigYjMujQ7CRiT9RkJJONmPQSsDFw==",
"dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
+ "@cypress/request": "^3.0.10",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "@types/tmp": "^0.2.3",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.7.1",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "ci-info": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "0.6.1",
+ "commander": "^6.2.1",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.4",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "hasha": "5.2.2",
+ "is-installed-globally": "~0.4.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.23",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.8",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "supports-color": "^8.1.1",
+ "systeminformation": "^5.31.1",
+ "tmp": "~0.2.4",
+ "tree-kill": "1.2.2",
+ "tslib": "1.14.1",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
},
- "engines": {
- "node": ">= 0.4"
+ "bin": {
+ "cypress": "bin/cypress"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": "^20.1.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "node_modules/cypress/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true,
- "dependencies": {
- "async": "^3.2.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "node_modules/cypress/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/gh-pages": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.1.1.tgz",
- "integrity": "sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==",
+ "node_modules/cypress/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "async": "^3.2.4",
- "commander": "^11.0.0",
- "email-addresses": "^5.0.0",
- "filenamify": "^4.3.0",
- "find-cache-dir": "^3.3.1",
- "fs-extra": "^11.1.1",
- "globby": "^6.1.0"
- },
- "bin": {
- "gh-pages": "bin/gh-pages.js",
- "gh-pages-clean": "bin/gh-pages-clean.js"
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/gh-pages/node_modules/array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "node_modules/cypress/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-uniq": "^1.0.1"
+ "assert-plus": "^1.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.10"
}
},
- "node_modules/gh-pages/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/gh-pages/node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
- "dev": true,
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
"engines": {
- "node": ">=16"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gh-pages/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
},
"engines": {
- "node": ">=14.14"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
}
},
- "node_modules/gh-pages/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gh-pages/node_modules/globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "node_modules/dayjs": {
+ "version": "1.11.19",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz",
+ "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/gh-pages/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": "*"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
},
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10.13.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/glob/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
- "peer": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
+ "license": "Apache-2.0",
+ "optional": true,
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/global-dirs": {
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/dir-glob": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ini": "2.0.0"
+ "path-type": "^4.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "global-prefix": "^3.0.0"
+ "esutils": "^2.0.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=0.10.0"
}
},
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
},
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
}
},
- "node_modules/global-prefix/node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "node_modules/global-prefix/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
}
},
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.302",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
+ "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"dev": true,
- "engines": {
- "node": ">=4"
- }
+ "license": "ISC"
},
- "node_modules/globalthis": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "node_modules/email-addresses": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
+ "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-properties": "^1.2.1",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "once": "^1.4.0"
}
},
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8.6"
}
},
- "node_modules/globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
- "dev": true
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "node_modules/es-abstract": {
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.3"
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
}
},
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz",
+ "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.1",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.1.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.3.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.5",
+ "safe-array-concat": "^1.1.3"
+ },
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "es-define-property": "^1.0.0"
+ "es-errors": "^1.3.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -5817,429 +4468,601 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/esbuild": {
+ "version": "0.27.3",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
+ "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
"dev": true,
- "dependencies": {
- "function-bind": "^1.1.2"
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.3",
+ "@esbuild/android-arm": "0.27.3",
+ "@esbuild/android-arm64": "0.27.3",
+ "@esbuild/android-x64": "0.27.3",
+ "@esbuild/darwin-arm64": "0.27.3",
+ "@esbuild/darwin-x64": "0.27.3",
+ "@esbuild/freebsd-arm64": "0.27.3",
+ "@esbuild/freebsd-x64": "0.27.3",
+ "@esbuild/linux-arm": "0.27.3",
+ "@esbuild/linux-arm64": "0.27.3",
+ "@esbuild/linux-ia32": "0.27.3",
+ "@esbuild/linux-loong64": "0.27.3",
+ "@esbuild/linux-mips64el": "0.27.3",
+ "@esbuild/linux-ppc64": "0.27.3",
+ "@esbuild/linux-riscv64": "0.27.3",
+ "@esbuild/linux-s390x": "0.27.3",
+ "@esbuild/linux-x64": "0.27.3",
+ "@esbuild/netbsd-arm64": "0.27.3",
+ "@esbuild/netbsd-x64": "0.27.3",
+ "@esbuild/openbsd-arm64": "0.27.3",
+ "@esbuild/openbsd-x64": "0.27.3",
+ "@esbuild/openharmony-arm64": "0.27.3",
+ "@esbuild/sunos-x64": "0.27.3",
+ "@esbuild/win32-arm64": "0.27.3",
+ "@esbuild/win32-ia32": "0.27.3",
+ "@esbuild/win32-x64": "0.27.3"
}
},
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
- "peer": true,
- "bin": {
- "he": "bin/he"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "MIT",
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/hosted-git-info/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
+ "node_modules/eslint": {
+ "version": "9.39.3",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz",
+ "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.3",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
- "node_modules/hosted-git-info/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- },
- "node_modules/html-tags": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
- "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "node_modules/eslint-config-prettier": {
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
- "engines": {
- "node": ">=8"
+ "license": "MIT",
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
}
},
- "node_modules/http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
},
"engines": {
- "node": ">=0.10"
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
"engines": {
- "node": ">=8.12.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
},
- "node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
"engines": {
- "node": ">= 4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/immutable": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
- "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
- "dev": true
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
},
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": ">=6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
- "peer": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=0.10"
}
},
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
"engines": {
- "node": ">=0.8.19"
+ "node": ">=4.0"
}
},
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=8"
+ "node": ">=4.0"
}
},
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "node_modules/eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "node_modules/executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
+ "pify": "^2.2.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=4"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 10.17.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
}
},
- "node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8.6.0"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 6"
}
},
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "reusify": "^1.0.4"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
+ "pend": "~1.2.0"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "escape-string-regexp": "^1.0.5"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=0.8.0"
}
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ci-info": "^3.2.0"
+ "flat-cache": "^4.0.0"
},
- "bin": {
- "is-ci": "bin.js"
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/is-core-module": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz",
- "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==",
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
"dev": true,
- "dependencies": {
- "hasown": "^2.0.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4"
}
},
- "node_modules/is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-typed-array": "^1.1.13"
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "to-regex-range": "^5.0.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
- "bin": {
- "is-docker": "cli.js"
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
},
"engines": {
"node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=16"
}
},
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
+ "license": "ISC"
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -6248,74 +5071,113 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-extglob": "^2.1.1"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 6"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
+ "node_modules/framer-motion": {
+ "version": "12.34.3",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.34.3.tgz",
+ "integrity": "sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==",
+ "license": "MIT",
"dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
+ "motion-dom": "^12.34.3",
+ "motion-utils": "^12.29.2",
+ "tslib": "^2.4.0"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/is-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
- "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "node_modules/fs-extra": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
- "engines": {
- "node": ">= 0.4"
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=14.14"
}
},
- "node_modules/is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "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": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
- "engines": {
- "node": ">=0.12.0"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -6324,42 +5186,62 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fuse.js": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
+ "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
- "node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -6368,38 +5250,38 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-set": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
- "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
- "dev": true,
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
"engines": {
"node": ">=8"
},
@@ -6407,13 +5289,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -6422,47 +5307,61 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/gh-pages": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.3.0.tgz",
+ "integrity": "sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "async": "^3.2.4",
+ "commander": "^13.0.0",
+ "email-addresses": "^5.0.0",
+ "filenamify": "^4.3.0",
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^11.1.1",
+ "globby": "^11.1.0"
},
- "engines": {
- "node": ">= 0.4"
+ "bin": {
+ "gh-pages": "bin/gh-pages.js",
+ "gh-pages-clean": "bin/gh-pages-clean.js"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=10.13.0"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "2.0.0"
+ },
"engines": {
"node": ">=10"
},
@@ -6470,810 +5369,813 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-weakmap": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
- "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
- "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4"
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
},
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
"dev": true,
- "dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/js-tokens": {
+ "node_modules/has-flag": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "argparse": "^2.0.1"
+ "es-define-property": "^1.0.0"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
"dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "has-symbols": "^1.0.3"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "node_modules/hasha": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
+ "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
"dev": true,
- "engines": [
- "node >=0.6.0"
- ],
+ "license": "MIT",
"dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
+ "is-stream": "^2.0.0",
+ "type-fest": "^0.8.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.4"
}
},
- "node_modules/just-extend": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
- "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
- "dev": true
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "json-buffer": "3.0.1"
+ "hermes-estree": "0.25.1"
}
},
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
+ "dependencies": {
+ "void-elements": "3.1.0"
}
},
- "node_modules/known-css-properties": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
- "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
- "dev": true
- },
- "node_modules/language-subtag-registry": {
- "version": "0.3.23",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
- "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
- "dev": true
- },
- "node_modules/language-tags": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
- "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "node_modules/http-signature": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "language-subtag-registry": "^0.3.20"
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.18.0"
},
"engines": {
"node": ">=0.10"
}
},
- "node_modules/lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "> 0.8"
+ "node": ">=8.12.0"
}
},
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "node_modules/husky": {
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
+ "license": "MIT",
+ "bin": {
+ "husky": "bin.js"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
+ "node_modules/i18next": {
+ "version": "25.8.13",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.13.tgz",
+ "integrity": "sha512-E0vzjBY1yM+nsFrtgkjLhST2NBkirkvOVoQa0MSldhsuZ3jUge7ZNpuwG0Cfc74zwo5ZwRzg3uOgT+McBn32iA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
+ "@babel/runtime": "^7.28.4"
},
"peerDependencies": {
- "enquirer": ">= 2.3.0 < 3"
+ "typescript": "^5"
},
"peerDependenciesMeta": {
- "enquirer": {
+ "typescript": {
"optional": true
}
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
+ "node_modules/i18next-browser-languagedetector": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz",
+ "integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==",
+ "license": "MIT",
"dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "@babel/runtime": "^7.23.2"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "node_modules/lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
- "dev": true
- },
- "node_modules/lodash.isempty": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
- "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==",
- "dev": true
- },
- "node_modules/lodash.isfunction": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
- "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
- "dev": true
- },
- "node_modules/lodash.isobject": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
- "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==",
- "dev": true
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "dev": true
+ "node_modules/iceberg-js": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz",
+ "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
},
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
},
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
- "dev": true
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
},
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true
+ "node_modules/immutable": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz",
+ "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "ISC",
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/log-symbols/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/log-symbols/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/log-symbols/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
+ "has-bigints": "^1.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-update/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-update/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-update/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/log-update/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
+ "hasown": "^2.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/log-update/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
},
- "bin": {
- "loose-envify": "cli.js"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/macos-release": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz",
- "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==",
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
"engines": {
- "node": ">=6"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "semver": "^6.0.0"
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
- "dev": true
- },
- "node_modules/meow": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
- "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 8"
+ "node": ">=0.12.0"
}
},
- "node_modules/micromatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
- "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">=8.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=8"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "call-bound": "^1.0.3"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/minimist-options/node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz",
- "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==",
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "ansi-colors": "^4.1.3",
- "browser-stdout": "^1.3.1",
- "chokidar": "^3.5.3",
- "debug": "^4.3.5",
- "diff": "^5.2.0",
- "escape-string-regexp": "^4.0.0",
- "find-up": "^5.0.0",
- "glob": "^8.1.0",
- "he": "^1.2.0",
- "js-yaml": "^4.1.0",
- "log-symbols": "^4.1.0",
- "minimatch": "^5.1.6",
- "ms": "^2.1.3",
- "serialize-javascript": "^6.0.2",
- "strip-json-comments": "^3.1.1",
- "supports-color": "^8.1.1",
- "workerpool": "^6.5.1",
- "yargs": "^16.2.0",
- "yargs-parser": "^20.2.9",
- "yargs-unparser": "^2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
+ "which-typed-array": "^1.1.16"
},
"engines": {
- "node": ">= 14.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -7281,562 +6183,577 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mocha/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "call-bound": "^1.0.3"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "peer": true
- },
- "node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mochawesome": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-7.1.3.tgz",
- "integrity": "sha512-Vkb3jR5GZ1cXohMQQ73H3cZz7RoxGjjUo0G5hu0jLaW+0FdUxUwg3Cj29bqQdh0rFcnyV06pWmqmi5eBPnEuNQ==",
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
- "dependencies": {
- "chalk": "^4.1.2",
- "diff": "^5.0.0",
- "json-stringify-safe": "^5.0.1",
- "lodash.isempty": "^4.4.0",
- "lodash.isfunction": "^3.0.9",
- "lodash.isobject": "^3.0.2",
- "lodash.isstring": "^4.0.1",
- "mochawesome-report-generator": "^6.2.0",
- "strip-ansi": "^6.0.1",
- "uuid": "^8.3.2"
- },
- "peerDependencies": {
- "mocha": ">=7"
- }
+ "license": "ISC"
},
- "node_modules/mochawesome-merge": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.3.0.tgz",
- "integrity": "sha512-1roR6g+VUlfdaRmL8dCiVpKiaUhbPVm1ZQYUM6zHX46mWk+tpsKVZR6ba98k2zc8nlPvYd71yn5gyH970pKBSw==",
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fs-extra": "^7.0.1",
- "glob": "^7.1.6",
- "yargs": "^15.3.1"
- },
- "bin": {
- "mochawesome-merge": "bin/mochawesome-merge.js"
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/mochawesome-merge/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "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/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
+ "argparse": "^2.0.1"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/mochawesome-merge/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
"engines": {
"node": ">=6"
}
},
- "node_modules/mochawesome-merge/node_modules/cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC"
},
- "node_modules/mochawesome-merge/node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6"
}
},
- "node_modules/mochawesome-merge/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">=8"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/mochawesome-merge/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "node_modules/jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
"dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
}
},
- "node_modules/mochawesome-merge/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
},
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=4.0"
}
},
- "node_modules/mochawesome-merge/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
}
},
- "node_modules/mochawesome-merge/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-locate": "^4.1.0"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.8.0"
}
},
- "node_modules/mochawesome-merge/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
},
"engines": {
- "node": "*"
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
}
},
- "node_modules/mochawesome-merge/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-try": "^2.0.0"
+ "p-locate": "^5.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mochawesome-merge/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
"dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/mochawesome-merge/node_modules/y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
+ "license": "MIT"
},
- "node_modules/mochawesome-merge/node_modules/yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mochawesome-merge/node_modules/yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/mochawesome-report-generator": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-6.2.0.tgz",
- "integrity": "sha512-Ghw8JhQFizF0Vjbtp9B0i//+BOkV5OWcQCPpbO0NGOoxV33o+gKDYU0Pr2pGxkIHnqZ+g5mYiXF7GMNgAcDpSg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.2",
- "dateformat": "^4.5.1",
- "escape-html": "^1.0.3",
- "fs-extra": "^10.0.0",
- "fsu": "^1.1.1",
- "lodash.isfunction": "^3.0.9",
- "opener": "^1.5.2",
- "prop-types": "^15.7.2",
- "tcomb": "^3.2.17",
- "tcomb-validation": "^3.3.0",
- "validator": "^13.6.0",
- "yargs": "^17.2.1"
+ "node": ">=10"
},
- "bin": {
- "marge": "bin/cli.js"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mochawesome-report-generator/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
- "node_modules/mochawesome-report-generator/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=8"
}
},
- "node_modules/mochawesome-report-generator/node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
+ "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": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "js-tokens": "^3.0.0 || ^4.0.0"
},
- "engines": {
- "node": ">=12"
+ "bin": {
+ "loose-envify": "cli.js"
}
},
- "node_modules/mochawesome-report-generator/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
+ "yallist": "^3.0.2"
}
},
- "node_modules/mochawesome-report-generator/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "node_modules/lucide-react": {
+ "version": "0.575.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.575.0.tgz",
+ "integrity": "sha512-VuXgKZrk0uiDlWjGGXmKV6MSk9Yy4l10qgVvzGn2AWBx1Ylt0iBexKOAoA6I7JO3m+M9oeovJd3yYENfkUbOeg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
},
- "node_modules/mochawesome-report-generator/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "semver": "^6.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mochawesome-report-generator/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
- "node_modules/mochawesome-report-generator/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
- "node_modules/mochawesome-report-generator/node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=8.6"
}
},
- "node_modules/mochawesome-report-generator/node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">= 0.6"
}
},
- "node_modules/mochawesome/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 0.6"
}
},
- "node_modules/mochawesome/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=6"
}
},
- "node_modules/mochawesome/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/minimatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz",
+ "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "color-name": "~1.1.4"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=7.0.0"
+ "node": "*"
}
},
- "node_modules/mochawesome/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/mochawesome/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "engines": {
- "node": ">=8"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mochawesome/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
+ "node_modules/motion": {
+ "version": "12.34.3",
+ "resolved": "https://registry.npmjs.org/motion/-/motion-12.34.3.tgz",
+ "integrity": "sha512-xZIkBGO7v/Uvm+EyaqYd+9IpXu0sZqLywVlGdCFrrMiaO9JI4Kx51mO9KlHSWwll+gZUVY5OJsWgYI5FywJ/tw==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "framer-motion": "^12.34.3",
+ "tslib": "^2.4.0"
},
- "engines": {
- "node": ">=8"
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.34.3",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.34.3.tgz",
+ "integrity": "sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.29.2"
}
},
+ "node_modules/motion-utils": {
+ "version": "12.29.2",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
+ "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
+ "license": "MIT"
+ },
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
"funding": [
{
@@ -7844,6 +6761,7 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -7855,83 +6773,49 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/nise": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz",
- "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==",
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
"dev": true,
- "dependencies": {
- "@sinonjs/commons": "^1.7.0",
- "@sinonjs/fake-timers": "^6.0.0",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "path-to-regexp": "^1.7.0"
- }
+ "license": "MIT",
+ "optional": true
},
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "node_modules/node-exports-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz",
+ "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "whatwg-url": "^5.0.0"
+ "array.prototype.flatmap": "^1.3.3",
+ "es-errors": "^1.3.0",
+ "object.entries": "^1.1.9",
+ "semver": "^6.3.1"
},
"engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true
- },
- "node_modules/normalize-package-data": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
- "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "hosted-git-info": "^4.0.1",
- "is-core-module": "^2.5.0",
- "semver": "^7.3.4",
- "validate-npm-package-license": "^3.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
},
@@ -7943,31 +6827,17 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
- "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-is": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
- "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1"
- },
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -7980,19 +6850,23 @@
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
},
"engines": {
@@ -8003,14 +6877,16 @@
}
},
"node_modules/object.entries": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
- "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
+ "es-object-atoms": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
@@ -8021,6 +6897,7 @@
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
"integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1",
@@ -8034,27 +6911,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.groupby": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
- "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/object.values": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
- "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
@@ -8070,6 +6935,7 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"wrappy": "1"
}
@@ -8079,6 +6945,7 @@
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
},
@@ -8089,36 +6956,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/open": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
- "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0",
- "is-wsl": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/opener": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
- "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
- "dev": true,
- "bin": {
- "opener": "bin/opener-bin.js"
- }
- },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -8131,32 +6974,29 @@
"node": ">= 0.8.0"
}
},
- "node_modules/os-name": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz",
- "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==",
- "dev": true,
- "dependencies": {
- "macos-release": "^2.2.0",
- "windows-release": "^3.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/ospath": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
"integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/p-limit": {
@@ -8164,6 +7004,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -8179,6 +7020,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -8194,6 +7036,7 @@
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"aggregate-error": "^3.0.0"
},
@@ -8209,6 +7052,7 @@
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -8218,6 +7062,7 @@
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
@@ -8225,47 +7070,22 @@
"node": ">=6"
}
},
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -8274,28 +7094,15 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
"dev": true,
- "dependencies": {
- "isarray": "0.0.1"
- }
- },
- "node_modules/path-to-regexp/node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
+ "license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -8304,58 +7111,42 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
- "dev": true
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true,
- "dependencies": {
- "pinkie": "^2.0.0"
- },
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -8365,6 +7156,7 @@
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"find-up": "^4.0.0"
},
@@ -8377,6 +7169,7 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -8390,6 +7183,7 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -8402,6 +7196,7 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
@@ -8417,6 +7212,7 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -8425,18 +7221,19 @@
}
},
"node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/postcss": {
- "version": "8.4.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
- "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dev": true,
"funding": [
{
@@ -8452,112 +7249,32 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.1",
- "source-map-js": "^1.2.0"
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
- "dev": true
- },
- "node_modules/postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
- "dev": true
- },
- "node_modules/postcss-safe-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
- "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-scss": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
- "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss-scss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.29"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
- "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
+ "license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -8568,23 +7285,12 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "dependencies": {
- "fast-diff": "^1.1.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/pretty-bytes": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
"integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
},
@@ -8597,6 +7303,7 @@
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6.0"
}
@@ -8605,6 +7312,7 @@
"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",
@@ -8615,19 +7323,15 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
"integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
- "dev": true
- },
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
@@ -8638,17 +7342,19 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -8657,12 +7363,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true
- },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -8681,231 +7381,219 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
},
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true,
- "peer": true,
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "peer": true,
+ "node_modules/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "^5.1.0"
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.4"
}
},
- "node_modules/react": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
- "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "node_modules/react-i18next": {
+ "version": "16.5.4",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.4.tgz",
+ "integrity": "sha512-6yj+dcfMncEC21QPhOTsW8mOSO+pzFmT6uvU7XXdvM/Cp38zJkmTeMeKmTrmCMD5ToT79FmiE/mRWiYWcJYW4g==",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "@babel/runtime": "^7.28.4",
+ "html-parse-stringify": "^3.0.1",
+ "use-sync-external-store": "^1.6.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "peerDependencies": {
+ "i18next": ">= 25.6.2",
+ "react": ">= 16.8.0",
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/react-dom": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
- "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.2"
- },
+ "node_modules/react-icons": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz",
+ "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==",
+ "license": "MIT",
"peerDependencies": {
- "react": "^18.3.1"
+ "react": "*"
}
},
"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=="
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
},
"node_modules/react-refresh": {
- "version": "0.14.2",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
- "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/react-router": {
- "version": "6.25.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz",
- "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==",
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
"dependencies": {
- "@remix-run/router": "1.18.0"
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=10"
},
"peerDependencies": {
- "react": ">=16.8"
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/react-router-dom": {
- "version": "6.25.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz",
- "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==",
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
"dependencies": {
- "@remix-run/router": "1.18.0",
- "react-router": "6.25.1"
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=10"
},
"peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
- }
- },
- "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==",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
},
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/read-pkg": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
- "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
- "dev": true,
- "peer": true,
+ "node_modules/react-router": {
+ "version": "7.13.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz",
+ "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==",
+ "license": "MIT",
"dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^3.0.2",
- "parse-json": "^5.2.0",
- "type-fest": "^1.0.1"
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
- "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "find-up": "^5.0.0",
- "read-pkg": "^6.0.0",
- "type-fest": "^1.0.1"
+ "node": ">=20.0.0"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
}
},
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
+ "node_modules/react-router-dom": {
+ "version": "7.13.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.1.tgz",
+ "integrity": "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.13.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "peer": true,
"engines": {
- "node": ">=10"
+ "node": ">=20.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
"dependencies": {
- "picomatch": "^2.2.1"
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/redent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
- "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "indent-string": "^5.0.0",
- "strip-indent": "^4.0.0"
+ "node": ">=10"
},
- "engines": {
- "node": ">=12"
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/redent/node_modules/indent-string": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
- "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=12"
+ "node": ">= 14.18.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/reflect.getprototypeof": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
- "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.1",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -8914,21 +7602,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
"node_modules/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -8942,53 +7628,31 @@
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
"integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"throttleit": "^1.0.0"
}
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true
- },
"node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "version": "2.0.0-next.6",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz",
+ "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.13.0",
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "node-exports-info": "^1.6.0",
+ "object-keys": "^1.1.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -8998,6 +7662,7 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -9007,6 +7672,7 @@
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"onetime": "^5.1.0",
"signal-exit": "^3.0.2"
@@ -9016,10 +7682,11 @@
}
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
+ "license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -9028,75 +7695,18 @@
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
- "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
- "dev": true
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/rollup": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
- "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
+ "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/estree": "1.0.5"
+ "@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -9106,22 +7716,31 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.18.1",
- "@rollup/rollup-android-arm64": "4.18.1",
- "@rollup/rollup-darwin-arm64": "4.18.1",
- "@rollup/rollup-darwin-x64": "4.18.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
- "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
- "@rollup/rollup-linux-arm64-gnu": "4.18.1",
- "@rollup/rollup-linux-arm64-musl": "4.18.1",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
- "@rollup/rollup-linux-s390x-gnu": "4.18.1",
- "@rollup/rollup-linux-x64-gnu": "4.18.1",
- "@rollup/rollup-linux-x64-musl": "4.18.1",
- "@rollup/rollup-win32-arm64-msvc": "4.18.1",
- "@rollup/rollup-win32-ia32-msvc": "4.18.1",
- "@rollup/rollup-win32-x64-msvc": "4.18.1",
+ "@rollup/rollup-android-arm-eabi": "4.59.0",
+ "@rollup/rollup-android-arm64": "4.59.0",
+ "@rollup/rollup-darwin-arm64": "4.59.0",
+ "@rollup/rollup-darwin-x64": "4.59.0",
+ "@rollup/rollup-freebsd-arm64": "4.59.0",
+ "@rollup/rollup-freebsd-x64": "4.59.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.59.0",
+ "@rollup/rollup-linux-arm64-musl": "4.59.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.59.0",
+ "@rollup/rollup-linux-loong64-musl": "4.59.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.59.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.59.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-musl": "4.59.0",
+ "@rollup/rollup-openbsd-x64": "4.59.0",
+ "@rollup/rollup-openharmony-arm64": "4.59.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.59.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.59.0",
+ "@rollup/rollup-win32-x64-gnu": "4.59.0",
+ "@rollup/rollup-win32-x64-msvc": "4.59.0",
"fsevents": "~2.3.2"
}
},
@@ -9144,28 +7763,32 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
"isarray": "^2.0.5"
},
"engines": {
@@ -9193,17 +7816,36 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
+ "is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -9216,16 +7858,19 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/sass": {
- "version": "1.77.8",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz",
- "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz",
+ "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
@@ -9233,49 +7878,403 @@
},
"engines": {
"node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
}
},
- "node_modules/scheduler": {
- "version": "0.23.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
- "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "node_modules/sass-embedded": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.97.3.tgz",
+ "integrity": "sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bufbuild/protobuf": "^2.5.0",
+ "colorjs.io": "^0.5.0",
+ "immutable": "^5.0.2",
+ "rxjs": "^7.4.0",
+ "supports-color": "^8.1.1",
+ "sync-child-process": "^1.0.2",
+ "varint": "^6.0.0"
+ },
+ "bin": {
+ "sass": "dist/bin/sass.js"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "optionalDependencies": {
+ "sass-embedded-all-unknown": "1.97.3",
+ "sass-embedded-android-arm": "1.97.3",
+ "sass-embedded-android-arm64": "1.97.3",
+ "sass-embedded-android-riscv64": "1.97.3",
+ "sass-embedded-android-x64": "1.97.3",
+ "sass-embedded-darwin-arm64": "1.97.3",
+ "sass-embedded-darwin-x64": "1.97.3",
+ "sass-embedded-linux-arm": "1.97.3",
+ "sass-embedded-linux-arm64": "1.97.3",
+ "sass-embedded-linux-musl-arm": "1.97.3",
+ "sass-embedded-linux-musl-arm64": "1.97.3",
+ "sass-embedded-linux-musl-riscv64": "1.97.3",
+ "sass-embedded-linux-musl-x64": "1.97.3",
+ "sass-embedded-linux-riscv64": "1.97.3",
+ "sass-embedded-linux-x64": "1.97.3",
+ "sass-embedded-unknown-all": "1.97.3",
+ "sass-embedded-win32-arm64": "1.97.3",
+ "sass-embedded-win32-x64": "1.97.3"
+ }
+ },
+ "node_modules/sass-embedded-all-unknown": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.97.3.tgz",
+ "integrity": "sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==",
+ "cpu": [
+ "!arm",
+ "!arm64",
+ "!riscv64",
+ "!x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "sass": "1.97.3"
+ }
+ },
+ "node_modules/sass-embedded-android-arm": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.97.3.tgz",
+ "integrity": "sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-arm64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.97.3.tgz",
+ "integrity": "sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-riscv64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.97.3.tgz",
+ "integrity": "sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-android-x64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.97.3.tgz",
+ "integrity": "sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-arm64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.97.3.tgz",
+ "integrity": "sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-darwin-x64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.97.3.tgz",
+ "integrity": "sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.97.3.tgz",
+ "integrity": "sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-arm64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.97.3.tgz",
+ "integrity": "sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.97.3.tgz",
+ "integrity": "sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-arm64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.97.3.tgz",
+ "integrity": "sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-riscv64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.97.3.tgz",
+ "integrity": "sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-musl-x64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.97.3.tgz",
+ "integrity": "sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-riscv64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.97.3.tgz",
+ "integrity": "sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-linux-x64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.97.3.tgz",
+ "integrity": "sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-unknown-all": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.97.3.tgz",
+ "integrity": "sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "!android",
+ "!darwin",
+ "!linux",
+ "!win32"
+ ],
+ "dependencies": {
+ "sass": "1.97.3"
+ }
+ },
+ "node_modules/sass-embedded-win32-arm64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.97.3.tgz",
+ "integrity": "sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded-win32-x64": {
+ "version": "1.97.3",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.97.3.tgz",
+ "integrity": "sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/sass-embedded/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
"node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "randombytes": "^2.1.0"
}
},
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
},
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -9293,6 +8292,7 @@
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -9303,11 +8303,27 @@
"node": ">= 0.4"
}
},
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -9320,20 +8336,23 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9342,66 +8361,75 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/sinon": {
- "version": "9.2.4",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz",
- "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==",
- "deprecated": "16.1.1",
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^1.8.1",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/samsam": "^5.3.1",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
- }
- },
- "node_modules/sinon/node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
"engines": {
- "node": ">=0.3.1"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/sinon/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/sinon/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -9411,6 +8439,7 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
"integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
@@ -9420,89 +8449,32 @@
"node": ">=8"
}
},
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
+ "node_modules/sonner": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz",
+ "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
}
},
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
"node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "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==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
- "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true,
- "peer": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.18",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
- "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
- "dev": true,
- "peer": true
- },
"node_modules/sshpk": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
"integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
@@ -9524,12 +8496,14 @@
}
},
"node_modules/stop-iteration-iterator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
- "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "internal-slot": "^1.0.4"
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -9540,6 +8514,7 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -9549,40 +8524,26 @@
"node": ">=8"
}
},
- "node_modules/string-width/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/string.prototype.includes": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz",
- "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- }
- },
"node_modules/string.prototype.matchall": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
- "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.23.6",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.7",
- "regexp.prototype.flags": "^1.5.2",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
"set-function-name": "^2.0.2",
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -9596,21 +8557,26 @@
"resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
"integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.5"
}
},
"node_modules/string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -9620,26 +8586,14 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
- "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
@@ -9650,261 +8604,89 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
- "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "min-indent": "^1.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/strip-outer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
- "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
- "dev": true,
- "peer": true
- },
- "node_modules/stylelint": {
- "version": "16.7.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.7.0.tgz",
- "integrity": "sha512-Q1ATiXlz+wYr37a7TGsfvqYn2nSR3T/isw3IWlZQzFzCNoACHuGBb6xBplZXz56/uDRJHIygxjh7jbV/8isewA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/stylelint"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/stylelint"
- }
- ],
- "dependencies": {
- "@csstools/css-parser-algorithms": "^2.7.1",
- "@csstools/css-tokenizer": "^2.4.1",
- "@csstools/media-query-list-parser": "^2.1.13",
- "@csstools/selector-specificity": "^3.1.1",
- "@dual-bundle/import-meta-resolve": "^4.1.0",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.2",
- "css-tree": "^2.3.1",
- "debug": "^4.3.5",
- "fast-glob": "^3.3.2",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^9.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.3.1",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.34.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^13.2.0",
- "micromatch": "^4.0.7",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.1",
- "postcss": "^8.4.39",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.1.0",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.2",
- "write-file-atomic": "^5.0.1"
- },
- "bin": {
- "stylelint": "bin/stylelint.mjs"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/stylelint/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/stylelint/node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "node_modules/stylelint/node_modules/file-entry-cache": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
- "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flat-cache": "^5.0.0"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/stylelint/node_modules/flat-cache": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
- "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flatted": "^3.3.1",
- "keyv": "^4.5.4"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": ">=18"
+ "node": ">=8"
}
},
- "node_modules/stylelint/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/stylelint/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/supports-hyperlinks": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
- "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
+ "node_modules/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
+ "escape-string-regexp": "^1.0.2"
},
"engines": {
- "node": ">=14.18"
+ "node": ">=0.10.0"
}
},
- "node_modules/supports-hyperlinks/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/strip-outer/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=0.8.0"
}
},
- "node_modules/supports-hyperlinks/node_modules/supports-color": {
+ "node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -9917,6 +8699,7 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -9924,175 +8707,176 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
- "dev": true
+ "node_modules/swiper": {
+ "version": "12.1.2",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-12.1.2.tgz",
+ "integrity": "sha512-4gILrI3vXZqoZh71I1PALqukCFgk+gpOwe1tOvz5uE9kHtl2gTDzmYflYCwWvR4LOvCrJi6UEEU+gnuW5BtkgQ==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.7.0"
+ }
},
- "node_modules/synckit": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
- "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
+ "node_modules/sync-child-process": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz",
+ "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@pkgr/core": "^0.1.0",
- "tslib": "^2.6.2"
+ "sync-message-port": "^1.0.0"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts"
+ "node": ">=16.0.0"
}
},
- "node_modules/table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "node_modules/sync-message-port": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.2.0.tgz",
+ "integrity": "sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==",
"dev": true,
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=16.0.0"
}
},
- "node_modules/table/node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "node_modules/systeminformation": {
+ "version": "5.31.1",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.1.tgz",
+ "integrity": "sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==",
"dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
+ "license": "MIT",
+ "os": [
+ "darwin",
+ "linux",
+ "win32",
+ "freebsd",
+ "openbsd",
+ "netbsd",
+ "sunos",
+ "android"
+ ],
+ "bin": {
+ "systeminformation": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=8.0.0"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "type": "Buy me a coffee",
+ "url": "https://www.buymeacoffee.com/systeminfo"
}
},
- "node_modules/table/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/throttleit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
+ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/table/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=7.0.0"
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
}
},
- "node_modules/table/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/table/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/table/node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/tcomb": {
- "version": "3.2.29",
- "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz",
- "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==",
- "dev": true
- },
- "node_modules/tcomb-validation": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz",
- "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==",
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "tcomb": "^3.0.0"
+ "tldts-core": "^6.1.86"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
}
},
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "node_modules/throttleit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
- "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
+ "license": "MIT"
},
"node_modules/tmp": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
- "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14.14"
}
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -10101,62 +8885,34 @@
}
},
"node_modules/tough-cookie": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
- "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
+ "tldts": "^6.1.32"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/tough-cookie/node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
+ "node": ">=16"
}
},
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true
- },
"node_modules/tree-kill": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true,
+ "license": "MIT",
"bin": {
"tree-kill": "cli.js"
}
},
- "node_modules/trim-newlines": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
- "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
"integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"escape-string-regexp": "^1.0.2"
},
@@ -10164,53 +8920,41 @@
"node": ">=0.10.0"
}
},
- "node_modules/ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "node_modules/trim-repeated/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
- }
- },
- "node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
- "dev": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
+ "node": ">=0.8.0"
}
},
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "node_modules/ts-api-utils": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
+ "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
"dev": true,
- "dependencies": {
- "minimist": "^1.2.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
},
- "bin": {
- "json5": "lib/cli.js"
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
"node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
},
@@ -10222,13 +8966,15 @@
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
+ "dev": true,
+ "license": "Unlicense"
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -10236,52 +8982,43 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
"node_modules/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -10291,17 +9028,19 @@
}
},
"node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
},
"engines": {
"node": ">= 0.4"
@@ -10311,17 +9050,18 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
"node": ">= 0.4"
@@ -10331,10 +9071,11 @@
}
},
"node_modules/typescript": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
- "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
- "dev": true,
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -10343,39 +9084,61 @@
"node": ">=14.17"
}
},
+ "node_modules/typescript-eslint": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz",
+ "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.56.1",
+ "@typescript-eslint/parser": "8.56.1",
+ "@typescript-eslint/typescript-estree": "8.56.1",
+ "@typescript-eslint/utils": "8.56.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
"node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
- "dev": true
- },
- "node_modules/universal-user-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
- "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
- "dev": true,
- "peer": true
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
@@ -10385,14 +9148,15 @@
"resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
"integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
- "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
"funding": [
{
@@ -10408,9 +9172,10 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "escalade": "^3.1.2",
- "picocolors": "^1.0.1"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -10424,54 +9189,79 @@
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dev": true,
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
"dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true,
+ "license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/validator": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
- "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
+ "node_modules/varint": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz",
+ "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==",
"dev": true,
- "engines": {
- "node": ">= 0.10"
- }
+ "license": "MIT"
},
"node_modules/verror": {
"version": "1.10.0",
@@ -10481,6 +9271,7 @@
"engines": [
"node >=0.6.0"
],
+ "license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
@@ -10488,20 +9279,24 @@
}
},
"node_modules/vite": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
- "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
+ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "esbuild": "^0.21.3",
- "postcss": "^8.4.39",
- "rollup": "^4.13.0"
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^18.0.0 || >=20.0.0"
+ "node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -10510,18 +9305,25 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
"lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
+ "jiti": {
+ "optional": true
+ },
"less": {
"optional": true
},
@@ -10531,6 +9333,9 @@
"sass": {
"optional": true
},
+ "sass-embedded": {
+ "optional": true
+ },
"stylus": {
"optional": true
},
@@ -10539,23 +9344,53 @@
},
"terser": {
"optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
}
}
},
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true
+ "node_modules/vite/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
},
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/which": {
@@ -10563,6 +9398,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -10574,39 +9410,45 @@
}
},
"node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
"is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
"is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
+ "is-regex": "^1.2.1",
"is-weakref": "^1.0.2",
"isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -10620,6 +9462,7 @@
"resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
"integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-map": "^2.0.3",
"is-set": "^2.0.3",
@@ -10633,22 +9476,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/which-module": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "dev": true
- },
"node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
},
"engines": {
@@ -10658,160 +9498,22 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/windows-release": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz",
- "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==",
- "dev": true,
- "dependencies": {
- "execa": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/windows-release/node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
- }
- },
- "node_modules/windows-release/node_modules/execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/windows-release/node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/windows-release/node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/windows-release/node_modules/npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
- "dev": true,
- "dependencies": {
- "path-key": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/windows-release/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/windows-release/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/windows-release/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/windows-release/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/windows-release/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/workerpool": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
- "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
- "dev": true,
- "peer": true
- },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -10824,135 +9526,47 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
"dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
+ "license": "ISC"
},
- "node_modules/write-file-atomic/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
+ "node_modules/ws": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "license": "MIT",
"engines": {
- "node": ">=14"
+ "node": ">=10.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
- "peer": true,
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
+ "license": "ISC"
},
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
@@ -10963,12 +9577,36 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index ae251685c8b..91157f964f7 100644
--- a/package.json
+++ b/package.json
@@ -1,83 +1,69 @@
{
- "name": "react_phone-catalog",
- "homepage": "react_phone-catalog",
- "version": "0.1.0",
- "keywords": [],
- "author": "Mate Academy",
- "license": "GPL-3.0",
+ "name": "phone-catalog-frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "format": "prettier . --ignore-path .gitignore --write",
+ "lint": "eslint . --fix",
+ "fix-style": "npm run format && npm run lint",
+ "preview": "vite preview",
+ "prepare": "husky",
+ "predeploy": "npm run build",
+ "deploy": "gh-pages -d dist",
+ "test": "echo \"No tests yet\""
+ },
"dependencies": {
- "@fortawesome/fontawesome-free": "^6.5.2",
- "bulma": "^1.0.1",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-tabs": "^1.1.13",
+ "@stripe/react-stripe-js": "^5.6.0",
+ "@stripe/stripe-js": "^8.8.0",
+ "@supabase/supabase-js": "^2.97.0",
"classnames": "^2.5.1",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "react-router-dom": "^6.25.1",
- "react-transition-group": "^4.4.5"
+ "framer-motion": "^12.34.1",
+ "fuse.js": "^7.1.0",
+ "i18next": "^25.8.13",
+ "i18next-browser-languagedetector": "^8.2.1",
+ "lucide-react": "^0.575.0",
+ "motion": "^12.34.1",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-i18next": "^16.5.4",
+ "react-icons": "^5.5.0",
+ "react-router-dom": "^7.13.0",
+ "sonner": "^2.0.7",
+ "swiper": "^12.1.1"
},
"devDependencies": {
- "@cypress/react18": "^2.0.1",
- "@mate-academy/scripts": "^1.8.5",
- "@mate-academy/students-ts-config": "*",
- "@mate-academy/stylelint-config": "*",
- "@types/node": "^20.14.10",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
- "@types/react-transition-group": "^4.4.10",
- "@typescript-eslint/parser": "^7.16.0",
- "@vitejs/plugin-react": "^4.3.1",
- "cypress": "^13.13.0",
- "eslint": "^8.57.0",
- "eslint-config-airbnb-typescript": "^18.0.0",
- "eslint-config-prettier": "^9.1.0",
- "eslint-plugin-cypress": "^3.3.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsx-a11y": "^6.9.0",
- "eslint-plugin-prettier": "^5.1.3",
- "eslint-plugin-react": "^7.34.4",
- "eslint-plugin-react-hooks": "^4.6.2",
- "gh-pages": "^6.1.1",
- "mochawesome": "^7.1.3",
- "mochawesome-merge": "^4.3.0",
- "mochawesome-report-generator": "^6.2.0",
- "prettier": "^3.3.2",
- "sass": "^1.77.8",
- "stylelint": "^16.7.0",
- "typescript": "^5.2.2",
- "vite": "^5.3.1"
+ "@eslint/js": "^9.39.3",
+ "@types/node": "^24.10.1",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "cypress": "^15.11.0",
+ "eslint": "^9.39.3",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.26",
+ "gh-pages": "^6.3.0",
+ "globals": "^16.5.0",
+ "husky": "^9.1.7",
+ "prettier": "^3.8.1",
+ "sass-embedded": "^1.97.3",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.56.1",
+ "vite": "^7.3.1"
},
- "scripts": {
- "start": "mate-scripts start -l",
- "build": "mate-scripts build",
- "test": "mate-scripts test -l",
- "style-format": "npx stylelint 'src/**/*.scss' --fix --allow-empty-input",
- "lint-js": "mate-scripts lint -j",
- "lint-css": "mate-scripts lint -s",
- "format": "prettier --write './src/**/*.{ts,tsx}'",
- "lint": "npm run style-format && npm run format && npm run lint-js && npm run lint-css",
- "update": "mate-scripts update",
- "postinstall": "npm run update && cypress verify",
- "predeploy": "npm run build",
- "deploy": "mate-scripts deploy"
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
+ "lint-staged": {
+ "*.{js,ts,tsx}": [
+ "eslint --fix"
],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
+ "*.{css,scss,json,md}": [
+ "prettier --write"
]
- },
- "mateAcademy": {
- "_comment": "Replace 'reactTypescript' with 'react' if you want use React without Typescript",
- "projectType": "reactTypescript",
- "nodejsMajorVersion": "20",
- "tests": {
- "_comment": "Add `cypressComponents: true` to enable component tests",
- "cypress": true
- }
}
}
diff --git a/public/favicon.png b/public/favicon.png
new file mode 100644
index 00000000000..b340d9da8fc
Binary files /dev/null and b/public/favicon.png differ
diff --git a/public/img/banners/banner-desktop-1.png b/public/img/banners/banner-desktop-1.png
new file mode 100644
index 00000000000..a7f0a7235fc
Binary files /dev/null and b/public/img/banners/banner-desktop-1.png differ
diff --git a/public/img/banners/banner-desktop-2.png b/public/img/banners/banner-desktop-2.png
new file mode 100644
index 00000000000..40e2e27b6b2
Binary files /dev/null and b/public/img/banners/banner-desktop-2.png differ
diff --git a/public/img/banners/banner-desktop-3.png b/public/img/banners/banner-desktop-3.png
new file mode 100644
index 00000000000..b019b723877
Binary files /dev/null and b/public/img/banners/banner-desktop-3.png differ
diff --git a/public/img/banners/banner-desktop-4.png b/public/img/banners/banner-desktop-4.png
new file mode 100644
index 00000000000..566955b42aa
Binary files /dev/null and b/public/img/banners/banner-desktop-4.png differ
diff --git a/public/img/banners/banner-phone-1.png b/public/img/banners/banner-phone-1.png
new file mode 100644
index 00000000000..f656bff0eb3
Binary files /dev/null and b/public/img/banners/banner-phone-1.png differ
diff --git a/public/img/banners/banner-phone-2.png b/public/img/banners/banner-phone-2.png
new file mode 100644
index 00000000000..99f6af7666b
Binary files /dev/null and b/public/img/banners/banner-phone-2.png differ
diff --git a/public/img/banners/banner-phone-3.png b/public/img/banners/banner-phone-3.png
new file mode 100644
index 00000000000..fab830e9eb4
Binary files /dev/null and b/public/img/banners/banner-phone-3.png differ
diff --git a/public/img/banners/banner-phone-4.png b/public/img/banners/banner-phone-4.png
new file mode 100644
index 00000000000..8c5d6baf7cc
Binary files /dev/null and b/public/img/banners/banner-phone-4.png differ
diff --git a/public/img/categories/category-accessories.png b/public/img/categories/category-accessories.png
new file mode 100644
index 00000000000..00419054e71
Binary files /dev/null and b/public/img/categories/category-accessories.png differ
diff --git a/public/img/categories/category-phones.png b/public/img/categories/category-phones.png
new file mode 100644
index 00000000000..0f64df9fbff
Binary files /dev/null and b/public/img/categories/category-phones.png differ
diff --git a/public/img/categories/category-tablets.png b/public/img/categories/category-tablets.png
new file mode 100644
index 00000000000..1eb3b7f529b
Binary files /dev/null and b/public/img/categories/category-tablets.png differ
diff --git a/public/img/profile/Hanna.jpg b/public/img/profile/Hanna.jpg
new file mode 100644
index 00000000000..883d3921030
Binary files /dev/null and b/public/img/profile/Hanna.jpg differ
diff --git a/public/img/profile/Maksym.jpg b/public/img/profile/Maksym.jpg
new file mode 100644
index 00000000000..d7bcd9cf85b
Binary files /dev/null and b/public/img/profile/Maksym.jpg differ
diff --git a/public/img/profile/Tetiana.jpg b/public/img/profile/Tetiana.jpg
new file mode 100644
index 00000000000..d58ecfadb22
Binary files /dev/null and b/public/img/profile/Tetiana.jpg differ
diff --git a/src/App.css b/src/App.css
new file mode 100644
index 00000000000..6577c716be2
--- /dev/null
+++ b/src/App.css
@@ -0,0 +1,23 @@
+html,
+body {
+ width: 100%;
+ min-height: 100vh;
+ margin: 0;
+ padding: 0;
+ scrollbar-gutter: stable;
+}
+
+#root {
+ width: 100%;
+ min-height: 100vh;
+}
+
+.App {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+}
+
+.container {
+ flex: 1;
+}
diff --git a/src/App.tsx b/src/App.tsx
index 372e4b42066..de89974d02c 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,7 +1,151 @@
-import './App.scss';
+import './App.css';
+import { Route, Routes, Navigate } from 'react-router-dom';
-export const App = () => (
-
-
Product Catalog
-
-);
+import { loadStripe } from '@stripe/stripe-js';
+import { Elements } from '@stripe/react-stripe-js';
+
+import { Header } from './components/layout/Header/Header.tsx';
+import { Footer } from './components/layout/Footer';
+import { PhonesPage } from './pages/PhonesPage/PhonesPage.tsx';
+import { AccessoriesPage } from './pages/AccessoriesPage/AccessoriesPage.tsx';
+import { CartPage } from './pages/CartPage/CartPage.tsx';
+import { NotFoundPage } from './pages/NotFoundPage/NotFoundPage.tsx';
+import { TabletsPage } from './pages/TabletsPage/TabletsPage.tsx';
+import { HomePage } from './pages/HomePage/HomePage.tsx';
+import { FavoritesPage } from './pages/FavoritesPage/FavoritesPage.tsx';
+import { ProductDetailsPage } from './pages/ProductDetailsPage/ProductDetailsPage.tsx';
+import { ScrollToTop } from './components/common/ScrollToTop/ScrollToTop.tsx';
+import { Toaster } from 'sonner';
+
+import { ProfilePage } from './pages/ProfilePage/ProfilePage';
+import { HelpWidget } from './components/common/HelpWidget/HelpWidget.tsx';
+import { ProfileOrderPage } from './pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.tsx';
+import { AdminPage } from './pages/ProfilePage/AdminPage/AdminPage.tsx';
+import { SupportChat } from './pages/ProfilePage/SupportChat/SupportChat.tsx';
+import { WalletPage } from './pages/ProfilePage/WalletPage/WalletPage.tsx';
+import { RightsPage } from './pages/RightsPage/RightsPage.tsx';
+import { ContactsPage } from './pages/ContactsPage/ContactsPage.tsx';
+
+const stripePromise = loadStripe(import.meta.env.VITE_STRIPE_PUBLISHABLE_KEY, {
+ locale: 'en',
+});
+
+export const App = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+ }
+ />
+ }
+ />
+
+ }
+ />
+ }
+ />
+
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+ }
+ />
+
+ }
+ />
+
+ }
+ />
+ }
+ />
+
+ }
+ />
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/api/products.ts b/src/api/products.ts
new file mode 100644
index 00000000000..cd2f60a7f1c
--- /dev/null
+++ b/src/api/products.ts
@@ -0,0 +1,36 @@
+import { Product, ProductDetails } from '../types/Product';
+
+const BASE_URL = 'https://phone-catalog-backend-k2qc.onrender.com';
+
+export const getProducts = async (): Promise => {
+ const response = await fetch(`${BASE_URL}/api/products`);
+ return response.json();
+};
+
+export const getPhones = async (): Promise => {
+ const products = await getProducts();
+ return products.filter((product) => product.category === 'phones');
+};
+
+export const getTablets = async (): Promise => {
+ const products = await getProducts();
+ return products.filter((product) => product.category === 'tablets');
+};
+
+export const getAccessories = async (): Promise => {
+ const products = await getProducts();
+ return products.filter((product) => product.category === 'accessories');
+};
+
+export const getProductDetails = async (
+ _category: string,
+ itemId: string,
+): Promise => {
+ const response = await fetch(`${BASE_URL}/api/products/${itemId}`);
+
+ if (!response.ok) {
+ throw new Error(`Product not found: ${itemId}`);
+ }
+
+ return response.json();
+};
diff --git a/src/api/services.ts b/src/api/services.ts
new file mode 100644
index 00000000000..0cfbb5d3dc4
--- /dev/null
+++ b/src/api/services.ts
@@ -0,0 +1,16 @@
+import { getAccessories, getPhones, getTablets } from './products';
+import { Product } from '../types/Product';
+
+export const getAllProducts = async (): Promise => {
+ try {
+ const [phones, tablets, accessories] = await Promise.all([
+ getPhones(),
+ getTablets(),
+ getAccessories(),
+ ]);
+ return [...phones, ...tablets, ...accessories];
+ } catch (error) {
+ console.error('Помилка завантаження:', error);
+ return [];
+ }
+};
diff --git a/src/assets/cart-zero.png b/src/assets/cart-zero.png
new file mode 100644
index 00000000000..a490b5db6d3
Binary files /dev/null and b/src/assets/cart-zero.png differ
diff --git a/src/assets/icons/Button-Top.svg b/src/assets/icons/Button-Top.svg
new file mode 100644
index 00000000000..e3065497458
--- /dev/null
+++ b/src/assets/icons/Button-Top.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/Vector-black.svg b/src/assets/icons/Vector-black.svg
new file mode 100644
index 00000000000..47093ba3a87
--- /dev/null
+++ b/src/assets/icons/Vector-black.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/Vector-white.svg b/src/assets/icons/Vector-white.svg
new file mode 100644
index 00000000000..4ecd8405960
--- /dev/null
+++ b/src/assets/icons/Vector-white.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/arrow-down.svg b/src/assets/icons/arrow-down.svg
new file mode 100644
index 00000000000..8a5922f8294
--- /dev/null
+++ b/src/assets/icons/arrow-down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/arrow-right.svg b/src/assets/icons/arrow-right.svg
new file mode 100644
index 00000000000..c9f0bc2bbcd
--- /dev/null
+++ b/src/assets/icons/arrow-right.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/cart.svg b/src/assets/icons/cart.svg
new file mode 100644
index 00000000000..89e8e9c984f
--- /dev/null
+++ b/src/assets/icons/cart.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/assets/icons/close.svg b/src/assets/icons/close.svg
new file mode 100644
index 00000000000..d85268b6d71
--- /dev/null
+++ b/src/assets/icons/close.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/closeCart-dark.svg b/src/assets/icons/closeCart-dark.svg
new file mode 100644
index 00000000000..aec415e35ad
--- /dev/null
+++ b/src/assets/icons/closeCart-dark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/heart-red.svg b/src/assets/icons/heart-red.svg
new file mode 100644
index 00000000000..0a33fa8d98e
--- /dev/null
+++ b/src/assets/icons/heart-red.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/heart.svg b/src/assets/icons/heart.svg
new file mode 100644
index 00000000000..5f6b994ddfe
--- /dev/null
+++ b/src/assets/icons/heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/assets/icons/home.svg b/src/assets/icons/home.svg
new file mode 100644
index 00000000000..e16ca7d7943
--- /dev/null
+++ b/src/assets/icons/home.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/assets/icons/logo-dark.png b/src/assets/icons/logo-dark.png
new file mode 100644
index 00000000000..474c4318c90
Binary files /dev/null and b/src/assets/icons/logo-dark.png differ
diff --git a/src/assets/icons/logo-light.png b/src/assets/icons/logo-light.png
new file mode 100644
index 00000000000..474c4318c90
Binary files /dev/null and b/src/assets/icons/logo-light.png differ
diff --git a/src/assets/icons/minus.svg b/src/assets/icons/minus.svg
new file mode 100644
index 00000000000..c15d85187b6
--- /dev/null
+++ b/src/assets/icons/minus.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/moon.svg b/src/assets/icons/moon.svg
new file mode 100644
index 00000000000..aaeadff730f
--- /dev/null
+++ b/src/assets/icons/moon.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg
new file mode 100644
index 00000000000..87fad6fbe08
--- /dev/null
+++ b/src/assets/icons/plus.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg
new file mode 100644
index 00000000000..57d926e7000
--- /dev/null
+++ b/src/assets/icons/search.svg
@@ -0,0 +1,21 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/sun.svg b/src/assets/icons/sun.svg
new file mode 100644
index 00000000000..f95347f6c12
--- /dev/null
+++ b/src/assets/icons/sun.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/user.svg b/src/assets/icons/user.svg
new file mode 100644
index 00000000000..e3adcc19307
--- /dev/null
+++ b/src/assets/icons/user.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/assets/logo-light.png b/src/assets/logo-light.png
new file mode 100644
index 00000000000..e05244e3334
Binary files /dev/null and b/src/assets/logo-light.png differ
diff --git a/src/assets/react.svg b/src/assets/react.svg
new file mode 100644
index 00000000000..6c87de9bb33
--- /dev/null
+++ b/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/components/cart/CartItem/CartItem.module.scss b/src/components/cart/CartItem/CartItem.module.scss
new file mode 100644
index 00000000000..ce2e7bf9f73
--- /dev/null
+++ b/src/components/cart/CartItem/CartItem.module.scss
@@ -0,0 +1,68 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+.block {
+ border: 1px solid $color-border;
+ padding: 24px;
+ width: 100%;
+ background-color: $bg-main;
+ border-radius: 8px; // ← аккуратное скругление всего блока
+
+ .price {
+ color: $color-light-1;
+ font-size: 32px;
+ font-weight: 800;
+ font-family: Mont;
+ display: flex;
+ justify-content: center;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ }
+
+ .info {
+ color: $color-secondary;
+ font-size: 14px;
+ text-align: center;
+ line-height: 21px;
+ margin-top: 8px;
+ }
+
+ .button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ margin-top: 24px;
+ padding-top: 24px;
+ border-top: 1px solid $color-border;
+ }
+
+ .buttonCheck {
+ color: $color-light-1;
+ background-color: $color-accent;
+ border: none;
+ line-height: 21px;
+ padding: 10px 24px;
+ font-size: 14px;
+ cursor: pointer;
+ width: 100%;
+ letter-spacing: 0;
+ transition:
+ background-color $transition-default,
+ transform 0.15s ease;
+
+ border-radius: 8px; // ← скругление кнопки
+
+ &:hover {
+ background-color: $color-accent-hover;
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+
+ &:disabled {
+ background-color: $color-icons;
+ cursor: not-allowed;
+ }
+ }
+}
diff --git a/src/components/cart/CartItem/CartItem.tsx b/src/components/cart/CartItem/CartItem.tsx
new file mode 100644
index 00000000000..fd03190c1d6
--- /dev/null
+++ b/src/components/cart/CartItem/CartItem.tsx
@@ -0,0 +1,36 @@
+import s from './CartItem.module.scss';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { formatPrice } from '@/utils/formatPrice';
+
+interface Props {
+ totalPrice: number;
+ totalItems: number;
+ onCheckout: () => void;
+}
+
+export const CartItem: React.FC = ({
+ totalPrice,
+ totalItems,
+ onCheckout,
+}) => {
+ const { t, i18n } = useTranslation();
+
+ return (
+
+
{formatPrice(totalPrice, i18n.language)}
+
+
{t('cart.total_items', { count: totalItems })}
+
+
+
+ {t('cart.checkout')}
+
+
+
+ );
+};
diff --git a/src/components/cart/CartProduct/CartProduct.module.scss b/src/components/cart/CartProduct/CartProduct.module.scss
new file mode 100644
index 00000000000..d0d142c1694
--- /dev/null
+++ b/src/components/cart/CartProduct/CartProduct.module.scss
@@ -0,0 +1,168 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.item {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ grid-template-rows: auto auto;
+ gap: 16px;
+ padding: 16px;
+ background-color: $bg-surface;
+ position: relative;
+
+ border-radius: 12px;
+
+ @include on-tablet {
+ display: flex;
+ align-items: center;
+ padding: 24px;
+ gap: 24px;
+ }
+}
+
+.remove {
+ position: absolute;
+ left: 10px;
+ top: 35%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ color: $color-secondary;
+ font-size: 16px;
+ cursor: pointer;
+
+ border-radius: 8px;
+
+ @include on-tablet {
+ left: 15px;
+ top: 50%;
+ }
+}
+
+.imageWrapper {
+ grid-column: 1;
+ grid-row: 1;
+ margin-left: 32px;
+ width: 66px;
+ height: 66px;
+ align-self: center;
+
+ @include on-tablet {
+ margin-left: 40px;
+ }
+}
+
+.image {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+}
+
+.details {
+ grid-column: 2 / 4;
+ grid-row: 1;
+ align-self: center;
+
+ @include on-tablet {
+ flex: 1;
+ }
+}
+
+.name {
+ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 21px;
+ font-family: Mont;
+}
+
+.controls {
+ grid-column: 1 / 3;
+ grid-row: 2;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-left: 16px;
+
+ @include on-tablet {
+ margin-left: 0;
+ gap: 24px;
+ }
+}
+
+.quantity {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ @include on-tablet {
+ gap: 16px;
+ }
+}
+
+.btnPlus {
+ width: 32px;
+ height: 32px;
+ background-color: $bg-card;
+ border: 1px solid $color-border;
+ color: $color-light-1;
+ font-size: 16px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0;
+ border-radius: 8px;
+
+ img,
+ svg {
+ filter: $icon-filter;
+ }
+
+ &:hover {
+ background-color: $btn-secondary-hover;
+ }
+}
+
+.btnMinus {
+ width: 32px;
+ height: 32px;
+ background-color: transparent;
+ border: 1px solid $color-border;
+ color: $color-icons;
+ font-size: 16px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0;
+ border-radius: 8px;
+
+ img,
+ svg {
+ filter: $icon-filter;
+ }
+
+ &:hover {
+ background-color: $btn-secondary-hover;
+ }
+}
+
+.count {
+ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
+}
+
+.price {
+ color: $color-light-1;
+ font-size: 22px;
+ font-weight: 800;
+ position: absolute;
+ right: 16px;
+ bottom: 16px;
+
+ @include on-tablet {
+ position: static;
+ }
+}
diff --git a/src/components/cart/CartProduct/CartProduct.tsx b/src/components/cart/CartProduct/CartProduct.tsx
new file mode 100644
index 00000000000..9043716a40e
--- /dev/null
+++ b/src/components/cart/CartProduct/CartProduct.tsx
@@ -0,0 +1,113 @@
+import { Link } from 'react-router-dom';
+import { CartItem } from '@/types/Cart';
+import { ProductDetails } from '@/types/Product';
+import s from './CartProduct.module.scss';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { formatPrice } from '@/utils/formatPrice';
+
+import closeIcon from '@/assets/icons/closeCart-dark.svg';
+import minusIcon from '@/assets/icons/minus.svg';
+import plusIcon from '@/assets/icons/plus.svg';
+
+interface Props {
+ product: CartItem | ProductDetails;
+ onRemove: () => void;
+ onIncrease: () => void;
+ onDecrease: () => void;
+}
+
+export const CartProduct: React.FC = ({
+ product,
+ onRemove,
+ onIncrease,
+ onDecrease,
+}) => {
+ const { i18n } = useTranslation();
+
+ const imagePath = 'images' in product ? product.images[0] : product.image;
+ const imageUrl = `/${imagePath}`;
+
+ const currentPrice =
+ product.priceDiscount ?? ('price' in product ? product.price : 0);
+
+ const fullPrice =
+ product.priceRegular ?? ('fullPrice' in product ? product.fullPrice : 0);
+
+ const productId = 'itemId' in product ? product.itemId : product.id;
+ const idString = String(productId).toLowerCase();
+
+ let category = 'phones';
+ if (idString.includes('ipad')) {
+ category = 'tablets';
+ } else if (idString.includes('watch')) {
+ category = 'accessories';
+ } else if ('category' in product && product.category) {
+ category = product.category as string;
+ }
+
+ const linkTo = `/${category}/${productId}`;
+ const quantity = 'quantity' in product ? product.quantity : 1;
+ const priceToDisplay = (currentPrice || fullPrice) * quantity;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
{product.name}
+
+
+
+
+
+
+
+
{quantity}
+
+
+
+
+
+
{formatPrice(priceToDisplay, i18n.language)}
+
+
+ );
+};
diff --git a/src/components/common/AuthModal/AuthCallbackPage.tsx b/src/components/common/AuthModal/AuthCallbackPage.tsx
new file mode 100644
index 00000000000..60ec4ce4195
--- /dev/null
+++ b/src/components/common/AuthModal/AuthCallbackPage.tsx
@@ -0,0 +1,35 @@
+import { useEffect } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { supabase } from '@utils/supabaseClient';
+import { Loader } from '@components/ui/Loader/Loader';
+
+export const AuthCallbackPage = () => {
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ const handleCallback = async () => {
+ try {
+ await supabase.auth.getSession();
+ navigate('/profile');
+ } catch (error) {
+ console.error('Error during auth callback:', error);
+ navigate('/');
+ }
+ };
+
+ handleCallback();
+ }, [navigate]);
+
+ return (
+
+
+
+ );
+};
diff --git a/src/components/common/AuthModal/AuthModal.module.scss b/src/components/common/AuthModal/AuthModal.module.scss
new file mode 100644
index 00000000000..e01636c6f7f
--- /dev/null
+++ b/src/components/common/AuthModal/AuthModal.module.scss
@@ -0,0 +1,210 @@
+@use '@/styles/utils' as *;
+@use '@/styles/variables' as *;
+
+.overlay {
+ position: fixed;
+ inset: 0;
+
+ background: rgba(10, 12, 20, 0.75);
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 1000;
+ padding: 16px;
+}
+
+.modal {
+ position: relative;
+ padding: 40px;
+ border-radius: 20px;
+
+ background: $bg-surface;
+ backdrop-filter: blur(20px) saturate(140%);
+ -webkit-backdrop-filter: blur(20px) saturate(140%);
+
+ border: 1px solid $color-elements;
+
+ box-shadow:
+ 0 20px 50px rgba(0, 0, 0, 0.4),
+ 0 0 40px rgba(144, 92, 255, 0.15);
+
+ @include on-desktop {
+ width: 420px;
+ }
+}
+
+.closeBtn {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ width: 34px;
+ height: 34px;
+ border-radius: 10px;
+
+ background: $bg-card;
+ border: 1px solid $color-elements;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ color: $color-white;
+ font-size: 16px;
+ cursor: pointer;
+ transition: 0.2s ease;
+
+ &:hover {
+ background: $btn-secondary-hover;
+ border-color: $color-accent;
+ }
+}
+
+.title {
+ text-align: center;
+ margin-bottom: 24px;
+ font-size: 24px;
+ color: $color-white;
+}
+
+.googleBtn {
+ width: 100%;
+ padding: 12px;
+ margin-bottom: 20px;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+
+ cursor: pointer;
+ border: 1px solid $color-light-1;
+ border-radius: 8px;
+
+ background-color: #fff;
+ font-weight: 600;
+ transition: background-color 0.2s;
+
+ &:hover {
+ background-color: #f4f6f8;
+ }
+
+ img {
+ width: 20px;
+ }
+}
+
+.divider {
+ text-align: center;
+ margin: 16px 0;
+ color: $color-white;
+ font-size: 14px;
+ position: relative;
+
+ &::before,
+ &::after {
+ content: '';
+ position: absolute;
+ top: 50%;
+ width: 30%;
+ height: 1px;
+ background-color: $color-light-1;
+ }
+
+ &::before {
+ left: 0;
+ }
+
+ &::after {
+ right: 0;
+ }
+}
+
+.form {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.input {
+ width: 100%;
+ height: 56px;
+ padding: 0 16px;
+
+ border-radius: 16px;
+ background: $bg-card;
+ border: 1px solid $color-elements;
+
+ color: $color-white;
+ font-size: 16px;
+
+ outline: none;
+ transition: all 0.2s ease;
+}
+
+.input::placeholder {
+ color: $color-secondary;
+}
+
+.input:focus {
+ border-color: $color-accent;
+ box-shadow: 0 0 0 3px rgba(144, 92, 255, 0.25);
+}
+
+.submitBtn {
+ padding: 12px;
+ background-color: $btn-primary-bg;
+ color: #fff;
+ border: none;
+ border-radius: 8px;
+ cursor: pointer;
+
+ font-weight: 700;
+ font-size: 16px;
+ transition: background-color 0.2s;
+
+ &:hover:not(:disabled) {
+ background-color: $btn-primary-hover;
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+}
+
+.toggleWrapper {
+ text-align: center;
+ margin-top: 24px;
+ color: $color-white;
+}
+
+.toggleBtn {
+ background: none;
+ border: none;
+ color: $btn-primary-bg;
+ cursor: pointer;
+ font-weight: 700;
+ margin-left: 8px;
+ text-decoration: underline;
+
+ &:hover {
+ color: $btn-primary-hover;
+ }
+}
+
+.message {
+ margin-top: 20px;
+ text-align: center;
+ font-weight: 600;
+
+ &--success {
+ color: #27ae60;
+ }
+
+ &--error {
+ color: #eb5757;
+ }
+}
diff --git a/src/components/common/AuthModal/AuthModal.tsx b/src/components/common/AuthModal/AuthModal.tsx
new file mode 100644
index 00000000000..6af03aa30ba
--- /dev/null
+++ b/src/components/common/AuthModal/AuthModal.tsx
@@ -0,0 +1,175 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { supabase } from '@utils/supabaseClient';
+import styles from './AuthModal.module.scss';
+interface AuthModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export const AuthModal: React.FC = ({ isOpen, onClose }) => {
+ const { t } = useTranslation();
+ const [isRegistering, setIsRegistering] = useState(false);
+ const [email, setEmail] = useState('');
+ const [password, setPassword] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [message, setMessage] = useState('');
+
+ if (!isOpen) return null;
+
+ const handleGoogleLogin = async () => {
+ const { error } = await supabase.auth.signInWithOAuth({
+ provider: 'google',
+ options: {
+ redirectTo: window.location.origin,
+ },
+ });
+
+ if (error) {
+ setMessage(`Google error: ${error.message}`);
+ }
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ const cleanEmail = email.trim();
+
+ if (!cleanEmail || !password) {
+ setMessage(t('auth.fill_fields'));
+ return;
+ }
+
+ setLoading(true);
+ setMessage('');
+
+ const { error } =
+ isRegistering ?
+ await supabase.auth.signUp({ email: cleanEmail, password })
+ : await supabase.auth.signInWithPassword({
+ email: cleanEmail,
+ password,
+ });
+
+ if (error) {
+ setMessage(`${t('auth.error')}: ${error.message}`);
+ } else {
+ if (isRegistering) {
+ const { error: signInError } = await supabase.auth.signInWithPassword({
+ email: cleanEmail,
+ password,
+ });
+ if (signInError) {
+ setMessage(`Registered, but login failed: ${signInError.message}`);
+ setLoading(false);
+ return;
+ }
+ }
+
+ setMessage(
+ isRegistering ? t('auth.reg_success') : t('auth.login_success'),
+ );
+
+ setTimeout(() => {
+ onClose();
+ window.location.reload();
+ }, 1500);
+ }
+
+ setLoading(false);
+ };
+
+ return (
+
+
+
+ ✕
+
+
+
+ {isRegistering ? t('auth.create_account') : t('auth.sign_in_title')}
+
+
+
+
+ {t('auth.continue_google')}
+
+
+
{t('auth.or_email')}
+
+
+
+
+ {isRegistering ? t('auth.already_have_acc') : t('auth.no_acc_yet')}
+
+ {
+ setIsRegistering(!isRegistering);
+ setMessage('');
+ }}
+ >
+ {isRegistering ? t('auth.sign_in') : t('auth.sign_up')}
+
+
+
+ {message && (
+
+ {message}
+
+ )}
+
+
+ );
+};
diff --git a/src/components/common/AuthModal/index.ts b/src/components/common/AuthModal/index.ts
new file mode 100644
index 00000000000..c9c1c41cf21
--- /dev/null
+++ b/src/components/common/AuthModal/index.ts
@@ -0,0 +1 @@
+export { AuthModal } from './AuthModal';
diff --git a/src/components/common/CheckoutModal/CheckoutModal.module.scss b/src/components/common/CheckoutModal/CheckoutModal.module.scss
new file mode 100644
index 00000000000..87d347a82a9
--- /dev/null
+++ b/src/components/common/CheckoutModal/CheckoutModal.module.scss
@@ -0,0 +1,360 @@
+@use '@/styles/variables' as *;
+
+.overlay {
+ position: fixed;
+ inset: 0;
+ background: rgba(10, 12, 20, 0.75);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 1000;
+ padding: 24px;
+ overflow: hidden;
+}
+
+:global(body.checkoutModalOpen) {
+ overflow: hidden;
+}
+
+.modal {
+ position: relative;
+ width: 1000px;
+ max-width: 95vw;
+ max-height: 90vh;
+ overflow-x: hidden;
+ overflow-y: auto;
+ scrollbar-width: none;
+ padding: 48px;
+ border-radius: 28px;
+ background: rgba(255, 255, 255, 0.07);
+ backdrop-filter: blur(40px) saturate(160%);
+ -webkit-backdrop-filter: blur(40px) saturate(160%);
+ border: 1px solid rgba(255, 255, 255, 0.25);
+ box-shadow:
+ 0 30px 80px rgba(0, 0, 0, 0.55),
+ 0 0 120px rgba(144, 92, 255, 0.35),
+ inset 0 1px 0 rgba(255, 255, 255, 0.4);
+ color: #fff;
+}
+
+.modal::-webkit-scrollbar {
+ width: 0;
+ height: 0;
+}
+
+.modal::before {
+ content: '';
+ position: absolute;
+ inset: -2px;
+ border-radius: 26px;
+ pointer-events: none;
+ background: linear-gradient(
+ 135deg,
+ rgba(144, 92, 255, 0.4),
+ transparent 50%,
+ rgba(144, 92, 255, 0.4)
+ );
+ filter: blur(25px);
+ opacity: 0.35;
+}
+
+.title {
+ font-size: 42px;
+ margin-bottom: 32px;
+}
+
+.content {
+ display: grid;
+ grid-template-columns: 1fr 320px;
+ gap: 40px;
+
+ @media (max-width: 980px) {
+ grid-template-columns: 1fr;
+ }
+}
+
+.formSection {
+ display: flex;
+ flex-direction: column;
+ gap: 36px;
+}
+
+.input {
+ width: 100%;
+ height: 56px;
+ border-radius: 16px;
+ padding: 0 16px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ color: #fff;
+ transition: 0.2s ease;
+}
+
+.input::placeholder {
+ color: rgba(255, 255, 255, 0.55);
+}
+
+.input:focus {
+ outline: none;
+ border-color: #905cff;
+ box-shadow: 0 0 0 3px rgba(144, 92, 255, 0.25);
+}
+
+.stepContent {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ margin-top: 12px;
+}
+
+.formSection h2 {
+ margin-bottom: 20px;
+}
+
+.cardFields {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ margin-top: 8px;
+}
+
+.cardRow {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24px;
+
+ @media (max-width: 600px) {
+ grid-template-columns: 1fr;
+ }
+}
+
+.primaryBtn,
+.secondaryBtn {
+ width: 100%;
+ height: 56px;
+ border-radius: 18px;
+ font-weight: 600;
+ font-size: 16px;
+ border: none;
+ cursor: pointer;
+ transition: 0.2s ease;
+}
+
+.primaryBtn {
+ background: linear-gradient(135deg, #905cff, #6e4df5);
+ color: #fff;
+ box-shadow: 0 8px 24px rgba(144, 92, 255, 0.35);
+ margin-top: 20px;
+}
+
+.primaryBtn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.secondaryBtn {
+ background: $color-white;
+ color: #905cff;
+ margin-top: 16px;
+}
+
+.secondaryBtn:hover {
+ background: #f3f3f3;
+}
+
+.summary {
+ background: rgba(255, 255, 255, 0.08);
+ border-radius: 20px;
+ padding: 28px;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+
+ @media (max-width: 980px) {
+ order: -1;
+ }
+}
+
+.summary h3 {
+ margin-top: 16px;
+ font-size: 28px;
+}
+
+.success {
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ align-items: center;
+}
+
+.successIcon {
+ width: 64px;
+ height: 64px;
+ border-radius: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(144, 92, 255, 0.2);
+ border: 1px solid rgba(144, 92, 255, 0.4);
+ font-size: 30px;
+ font-weight: bold;
+}
+
+.closeBtn {
+ position: absolute;
+ top: 20px;
+ right: 24px;
+ width: 36px;
+ height: 36px;
+ border-radius: 12px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-size: 16px;
+ cursor: pointer;
+ transition: 0.2s ease;
+}
+
+.closeBtn:hover {
+ background: rgba(144, 92, 255, 0.25);
+ border-color: #905cff;
+}
+
+.dropdown {
+ position: relative;
+ width: 100%;
+}
+
+.dropdown__button {
+ width: 100%;
+ height: 56px;
+ padding: 0 16px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 16px;
+ color: #fff;
+ cursor: pointer;
+ transition: 0.2s ease;
+}
+
+.dropdown__button:hover {
+ border-color: #905cff;
+}
+
+.dropdown__button:focus {
+ outline: none;
+ border-color: #905cff;
+ box-shadow: 0 0 0 3px rgba(144, 92, 255, 0.25);
+}
+
+.dropdown__list {
+ position: absolute;
+ top: calc(100% + 8px);
+ left: 0;
+ width: 100%;
+ border-radius: 16px;
+ overflow: hidden;
+ z-index: 1001;
+ background: rgba(30, 30, 40, 0.95);
+ backdrop-filter: blur(30px);
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ box-shadow:
+ 0 12px 40px rgba(0, 0, 0, 0.5),
+ 0 0 60px rgba(144, 92, 255, 0.2);
+ animation: dropdownFade 0.15s ease;
+}
+
+.dropdown__item {
+ padding: 16px;
+ cursor: pointer;
+ transition: 0.2s ease;
+}
+
+.dropdown__item:hover {
+ background: rgba(144, 92, 255, 0.15);
+}
+
+.loadingHint,
+.emptyHint {
+ margin-top: 8px;
+ padding: 12px 14px;
+ border-radius: 12px;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+}
+
+.arrow {
+ width: 16px;
+ height: 16px;
+ background: url("data:image/svg+xml;utf8, ")
+ no-repeat center;
+ transition: transform 0.2s ease;
+}
+
+.arrowOpen {
+ transform: rotate(180deg);
+}
+
+@keyframes dropdownFade {
+ from {
+ opacity: 0;
+ transform: translateY(-6px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@media (max-width: 720px) {
+ .modal {
+ padding: 28px;
+ border-radius: 22px;
+ }
+
+ .title {
+ font-size: 30px;
+ }
+
+ .primaryBtn,
+ .secondaryBtn {
+ height: 52px;
+ }
+}
+
+@media (max-width: 480px) {
+ .modal {
+ padding: 22px;
+ }
+
+ .title {
+ font-size: 26px;
+ }
+
+ .overlay {
+ padding: 12px;
+ }
+}
+
+.dropdown__arrow {
+ width: 18px;
+ height: 18px;
+ margin-left: 12px;
+ background: url("data:image/svg+xml;utf8, ")
+ no-repeat center;
+ background-size: contain;
+ transition: transform 0.2s ease;
+ opacity: 0.7;
+}
+
+.dropdown__arrowOpen {
+ transform: rotate(180deg);
+ opacity: 1;
+}
diff --git a/src/components/common/CheckoutModal/CheckoutModal.tsx b/src/components/common/CheckoutModal/CheckoutModal.tsx
new file mode 100644
index 00000000000..e3ac85a08fb
--- /dev/null
+++ b/src/components/common/CheckoutModal/CheckoutModal.tsx
@@ -0,0 +1,362 @@
+import React, { useEffect, useCallback } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { useStripe, useElements } from '@stripe/react-stripe-js';
+import { useTranslation } from 'react-i18next';
+
+import arrowDownIcon from '@/assets/icons/arrow-down.svg';
+
+import { useAppContext } from '@/hooks/useAppContext';
+import { notify } from '@/utils/notifications';
+
+import styles from './CheckoutModal.module.scss';
+import type {
+ CheckoutCartItem,
+ CheckoutModalProps,
+} from './CheckoutModal.types';
+import { StepDetails } from './components/StepDetails';
+import { StepDelivery } from './components/StepDelivery';
+import { StepPayment } from './components/StepPayment';
+import { SuccessScreen } from './components/SuccessScreen';
+import { OrderSummary } from './components/OrderSummary';
+import { openPayPalDemo } from './utils/openPayPalDemo';
+import {
+ getStep2ValidationError,
+ validateStep1,
+ validateStep2,
+ validateStep3,
+} from './utils/checkoutValidation';
+import { useCheckoutState } from './hooks/useCheckoutState';
+import { useCheckoutDelivery } from './hooks/useCheckoutDelivery';
+import {
+ confirmCardPayment,
+ createOrderInDatabase,
+ createPaymentIntent,
+} from './services/checkoutService';
+
+export const CheckoutModal: React.FC = ({
+ isOpen,
+ onClose,
+}) => {
+ const { t } = useTranslation();
+ const navigate = useNavigate();
+ const stripe = useStripe();
+ const elements = useElements();
+ const { cartItems, totalPrice, totalItems, clearCart } = useAppContext();
+
+ const {
+ step,
+ setStep,
+ paymentOpen,
+ setPaymentOpen,
+ fullName,
+ setFullName,
+ phone,
+ setPhone,
+ paymentMethod,
+ setPaymentMethod,
+ loading,
+ setLoading,
+ successOrderId,
+ setSuccessOrderId,
+ paypalConfirmed,
+ setPaypalConfirmed,
+ resetCheckoutState,
+ } = useCheckoutState();
+
+ const {
+ deliveryOpen,
+ setDeliveryOpen,
+ deliveryMethod,
+ address,
+ setAddress,
+ cityQuery,
+ setCitiesOpen,
+ filteredCities,
+ selectedCity,
+ loadingCities,
+ warehouses,
+ warehousesOpen,
+ setWarehousesOpen,
+ selectedWarehouse,
+ setSelectedWarehouse,
+ loadingWarehouses,
+ normalizeWarehouseText,
+ handleSelectHomeDelivery,
+ handleSelectNovaPoshtaDelivery,
+ handleCityQueryChange,
+ handleSelectCity,
+ citiesOpen,
+ } = useCheckoutDelivery({ isOpen });
+
+ const isStep1Valid = validateStep1({ fullName, phone });
+ const isStep2Valid = validateStep2({
+ deliveryMethod,
+ address,
+ hasSelectedCity: selectedCity !== null,
+ hasSelectedWarehouse: selectedWarehouse !== null,
+ });
+ const isStep3Valid = validateStep3(paymentMethod);
+
+ const handleCreateOrder = useCallback(async () => {
+ if (cartItems.length === 0) {
+ notify.error(t('checkout.error_empty'));
+ return;
+ }
+
+ if (!isStep1Valid) {
+ notify.error(t('checkout.error_details'));
+ setStep(1);
+ return;
+ }
+
+ if (!isStep2Valid) {
+ notify.error(t(getStep2ValidationError(deliveryMethod)));
+ setStep(2);
+ return;
+ }
+
+ if (!isStep3Valid) {
+ notify.error(t('checkout.error_payment'));
+ setStep(3);
+ return;
+ }
+
+ setLoading(true);
+
+ try {
+ if (paymentMethod === 'cod' || paymentMethod === 'paypal') {
+ await createOrderInDatabase({
+ cartItems: cartItems as CheckoutCartItem[],
+ totalPrice,
+ fullName,
+ phone,
+ deliveryMethod,
+ address,
+ selectedCity,
+ selectedWarehouse,
+ paymentMethod,
+ clearCart,
+ setSuccessOrderId,
+ });
+ return;
+ }
+
+ const clientSecret = await createPaymentIntent(totalPrice);
+ if (!clientSecret) return;
+
+ const isPaid = await confirmCardPayment({
+ stripe,
+ elements,
+ clientSecret,
+ });
+
+ if (isPaid) {
+ await createOrderInDatabase({
+ cartItems: cartItems as CheckoutCartItem[],
+ totalPrice,
+ fullName,
+ phone,
+ deliveryMethod,
+ address,
+ selectedCity,
+ selectedWarehouse,
+ paymentMethod,
+ clearCart,
+ setSuccessOrderId,
+ });
+ notify.success(t('checkout.success_notify'));
+ }
+ } catch (error) {
+ console.error('Checkout error:', error);
+ notify.error(t('checkout.error_general'));
+ } finally {
+ setLoading(false);
+ }
+ }, [
+ cartItems,
+ t,
+ isStep1Valid,
+ isStep2Valid,
+ isStep3Valid,
+ paymentMethod,
+ totalPrice,
+ fullName,
+ phone,
+ deliveryMethod,
+ address,
+ selectedCity,
+ selectedWarehouse,
+ clearCart,
+ setSuccessOrderId,
+ setLoading,
+ setStep,
+ stripe,
+ elements,
+ ]);
+
+ useEffect(() => {
+ if (!isOpen) return;
+ resetCheckoutState();
+ }, [isOpen, resetCheckoutState]);
+
+ useEffect(() => {
+ if (!successOrderId) return;
+ const timer = window.setTimeout(() => {
+ onClose();
+ navigate('/profile/orders');
+ }, 1600);
+ return () => window.clearTimeout(timer);
+ }, [successOrderId, navigate, onClose]);
+
+ useEffect(() => {
+ const handleMessage = (event: MessageEvent) => {
+ if (event.data.type === 'paypal_confirmed') {
+ setPaypalConfirmed(true);
+ }
+ };
+ window.addEventListener('message', handleMessage);
+ return () => window.removeEventListener('message', handleMessage);
+ }, [setPaypalConfirmed]);
+
+ useEffect(() => {
+ if (paypalConfirmed) {
+ setPaypalConfirmed(false);
+ handleCreateOrder();
+ }
+ }, [paypalConfirmed, handleCreateOrder, setPaypalConfirmed]);
+
+ if (!isOpen) return null;
+
+ const handleSubmitStep3 = () => {
+ if (paymentMethod === 'paypal') {
+ openPayPalDemo({ totalPrice });
+ return;
+ }
+ handleCreateOrder();
+ };
+
+ return (
+
+
+
+ ✕
+
+
{t('checkout.title')}
+
+ {successOrderId ?
+
{
+ onClose();
+ navigate('/profile/orders');
+ }}
+ onClose={onClose}
+ />
+ :
+
+
+
+
{t('checkout.details')}
+
+ {step === 1 && (
+
setStep(2)}
+ />
+ )}
+
+
+
+
+
{t('checkout.delivery')}
+
+ {step === 2 && (
+
setDeliveryOpen((prev) => !prev)}
+ onSelectHome={handleSelectHomeDelivery}
+ onSelectNovaPoshta={handleSelectNovaPoshtaDelivery}
+ onAddressChange={setAddress}
+ onCityFocus={() => setCitiesOpen(true)}
+ onCityBlur={() =>
+ window.setTimeout(() => setCitiesOpen(false), 120)
+ }
+ onCityQueryChange={handleCityQueryChange}
+ onSelectCity={handleSelectCity}
+ onToggleWarehouses={() =>
+ setWarehousesOpen((prev) => !prev)
+ }
+ onSelectWarehouse={(w) => {
+ setSelectedWarehouse(w);
+ setWarehousesOpen(false);
+ }}
+ onContinue={() => setStep(3)}
+ onBack={() => setStep(1)}
+ normalizeWarehouseText={normalizeWarehouseText}
+ />
+ )}
+
+
+
+
+
{t('checkout.payment')}
+
+ {step === 3 && (
+
setPaymentOpen((prev) => !prev)}
+ onSelectPaymentMethod={(m) => {
+ setPaymentMethod(m);
+ setPaymentOpen(false);
+ }}
+ onSubmit={handleSubmitStep3}
+ onBack={() => setStep(2)}
+ />
+ )}
+
+
+
+
+ }
+
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/CheckoutModal.types.ts b/src/components/common/CheckoutModal/CheckoutModal.types.ts
new file mode 100644
index 00000000000..faee5cb6fb6
--- /dev/null
+++ b/src/components/common/CheckoutModal/CheckoutModal.types.ts
@@ -0,0 +1,88 @@
+import type { City, Warehouse } from '@/utils/novaPostaClient';
+
+export interface CheckoutModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export type Step = 1 | 2 | 3;
+export type DeliveryMethod = 'home' | 'novapost';
+export type PaymentMethod = 'card' | 'paypal' | 'cod';
+
+export interface CheckoutCartItem {
+ itemUniqueId: string;
+ id: string;
+ name: string;
+ price: number;
+ priceDiscount?: number;
+ image?: string | null;
+ quantity: number;
+}
+
+export interface StepDetailsProps {
+ styles: Record;
+ fullName: string;
+ phone: string;
+ isStep1Valid: boolean;
+ onFullNameChange: (value: string) => void;
+ onPhoneChange: (value: string) => void;
+ onContinue: () => void;
+}
+
+export interface StepDeliveryProps {
+ styles: Record;
+ arrowDownIcon: string;
+ deliveryOpen: boolean;
+ deliveryMethod: DeliveryMethod;
+ address: string;
+ cityQuery: string;
+ loadingCities: boolean;
+ citiesOpen: boolean;
+ filteredCities: City[];
+ selectedCity: City | null;
+ loadingWarehouses: boolean;
+ warehousesOpen: boolean;
+ warehouses: Warehouse[];
+ selectedWarehouse: Warehouse | null;
+ isStep2Valid: boolean;
+ onToggleDelivery: () => void;
+ onSelectHome: () => void;
+ onSelectNovaPoshta: () => void;
+ onAddressChange: (value: string) => void;
+ onCityFocus: () => void;
+ onCityBlur: () => void;
+ onCityQueryChange: (value: string) => void;
+ onSelectCity: (city: City) => void;
+ onToggleWarehouses: () => void;
+ onSelectWarehouse: (warehouse: Warehouse) => void;
+ onContinue: () => void;
+ onBack: () => void;
+ normalizeWarehouseText: (text: string) => string;
+}
+
+export interface StepPaymentProps {
+ styles: Record;
+ arrowDownIcon: string;
+ paymentOpen: boolean;
+ paymentMethod: PaymentMethod;
+ loading: boolean;
+ isStep3Valid: boolean;
+ onTogglePayment: () => void;
+ onSelectPaymentMethod: (method: PaymentMethod) => void;
+ onSubmit: () => void;
+ onBack: () => void;
+}
+
+export interface SuccessScreenProps {
+ styles: Record;
+ successOrderId: string | null;
+ onViewOrders: () => void;
+ onClose: () => void;
+}
+
+export interface OrderSummaryProps {
+ styles: Record;
+ cartItems: CheckoutCartItem[];
+ totalItems: number;
+ totalPrice: number;
+}
diff --git a/src/components/common/CheckoutModal/components/OrderSummary.tsx b/src/components/common/CheckoutModal/components/OrderSummary.tsx
new file mode 100644
index 00000000000..a4e05e6ff41
--- /dev/null
+++ b/src/components/common/CheckoutModal/components/OrderSummary.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { formatPrice } from '@/utils/formatPrice';
+import type { OrderSummaryProps } from '../CheckoutModal.types';
+
+export const OrderSummary: React.FC = ({
+ styles,
+ cartItems,
+ totalItems,
+ totalPrice,
+}) => {
+ const { t, i18n } = useTranslation();
+ const currentLang = i18n.language;
+
+ return (
+
+
{t('checkout.summary')}
+
+ {cartItems.map((item) => (
+
+
+
{item.name}
+
+ {item.quantity} ×{' '}
+ {formatPrice(item.priceDiscount ?? item.price, currentLang)}
+
+
+
+ ))}
+
+
+
{t('cart.total_items', { count: totalItems })}
+
{formatPrice(totalPrice, currentLang)}
+
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/components/StepDelivery.tsx b/src/components/common/CheckoutModal/components/StepDelivery.tsx
new file mode 100644
index 00000000000..563cc4f8663
--- /dev/null
+++ b/src/components/common/CheckoutModal/components/StepDelivery.tsx
@@ -0,0 +1,179 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import type { StepDeliveryProps } from '../CheckoutModal.types';
+
+export const StepDelivery: React.FC = ({
+ styles,
+ arrowDownIcon,
+ deliveryOpen,
+ deliveryMethod,
+ address,
+ cityQuery,
+ loadingCities,
+ citiesOpen,
+ filteredCities,
+ selectedCity,
+ loadingWarehouses,
+ warehousesOpen,
+ warehouses,
+ selectedWarehouse,
+ isStep2Valid,
+ onToggleDelivery,
+ onSelectHome,
+ onSelectNovaPoshta,
+ onAddressChange,
+ onCityFocus,
+ onCityBlur,
+ onCityQueryChange,
+ onSelectCity,
+ onToggleWarehouses,
+ onSelectWarehouse,
+ onContinue,
+ onBack,
+ normalizeWarehouseText,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {deliveryMethod === 'home' ?
+ t('checkout.home_address')
+ : 'Nova Poshta'}
+
+
+
+
+
+ {deliveryOpen && (
+
+
+ {t('checkout.home_address')}
+
+
+ Nova Poshta
+
+
+ )}
+
+
+ {deliveryMethod === 'home' && (
+
+ onAddressChange(e.target.value.replace(/\s{2,}/g, ' ').slice(0, 40))
+ }
+ />
+ )}
+
+ {deliveryMethod === 'novapost' && (
+ <>
+
+
onCityQueryChange(e.target.value)}
+ />
+ {loadingCities && (
+
{t('auth.loading')}
+ )}
+ {!loadingCities && citiesOpen && filteredCities.length > 0 && (
+
+ {filteredCities.map((city) => (
+
onSelectCity(city)}
+ >
+ {city.Description}
+
+ ))}
+
+ )}
+
+
+ {selectedCity && (
+
+
+ {loadingWarehouses ?
+ t('auth.loading')
+ : selectedWarehouse ?
+ `№${selectedWarehouse.Number} — ${normalizeWarehouseText(selectedWarehouse.Description)}`
+ : t('checkout.pickup_placeholder')}
+ {!loadingWarehouses && (
+
+
+
+ )}
+
+ {warehousesOpen && warehouses.length > 0 && (
+
+ {warehouses.map((w) => (
+
onSelectWarehouse(w)}
+ >
+ {normalizeWarehouseText(w.Description)}
+
+ ))}
+
+ )}
+
+ )}
+ >
+ )}
+
+
+ {t('checkout.continue')}
+
+
+ {t('checkout.back')}
+
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/components/StepDetails.tsx b/src/components/common/CheckoutModal/components/StepDetails.tsx
new file mode 100644
index 00000000000..866c64e1af4
--- /dev/null
+++ b/src/components/common/CheckoutModal/components/StepDetails.tsx
@@ -0,0 +1,64 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import type { StepDetailsProps } from '../CheckoutModal.types';
+
+const PHONE_PREFIX = '+380';
+
+export const StepDetails: React.FC = ({
+ styles,
+ fullName,
+ phone,
+ isStep1Valid,
+ onFullNameChange,
+ onPhoneChange,
+ onContinue,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+ {
+ const cleaned = e.target.value
+ .replace(/[^a-zA-Z\u00C0-\u024F\u0400-\u04FF' -]/g, '')
+ .replace(/\s{2,}/g, ' ')
+ .slice(0, 30);
+ onFullNameChange(cleaned);
+ }}
+ />
+
+ {
+ if (!phone) onPhoneChange(PHONE_PREFIX);
+ }}
+ onChange={(e) => {
+ let value = e.target.value;
+ if (!value.startsWith(PHONE_PREFIX)) value = PHONE_PREFIX;
+ const suffix = value
+ .slice(PHONE_PREFIX.length)
+ .replace(/\D/g, '')
+ .slice(0, 9);
+ onPhoneChange(PHONE_PREFIX + suffix);
+ }}
+ />
+
+
+ {t('checkout.continue')}
+
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/components/StepPayment.tsx b/src/components/common/CheckoutModal/components/StepPayment.tsx
new file mode 100644
index 00000000000..666725d5814
--- /dev/null
+++ b/src/components/common/CheckoutModal/components/StepPayment.tsx
@@ -0,0 +1,96 @@
+import React from 'react';
+import { CardElement } from '@stripe/react-stripe-js';
+import { useTranslation } from 'react-i18next';
+import type { StepPaymentProps } from '../CheckoutModal.types';
+
+export const StepPayment: React.FC = ({
+ styles,
+ arrowDownIcon,
+ paymentOpen,
+ paymentMethod,
+ loading,
+ isStep3Valid,
+ onTogglePayment,
+ onSelectPaymentMethod,
+ onSubmit,
+ onBack,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {paymentMethod === 'card' ?
+ t('checkout.card')
+ : paymentMethod === 'paypal' ?
+ 'PayPal'
+ : t('checkout.cod')}
+
+
+
+
+
+ {paymentOpen && (
+
+
onSelectPaymentMethod('card')}
+ >
+ {t('checkout.card')}
+
+
onSelectPaymentMethod('paypal')}
+ >
+ PayPal
+
+
onSelectPaymentMethod('cod')}
+ >
+ {t('checkout.cod')}
+
+
+ )}
+
+
+ {paymentMethod === 'card' && (
+
+
+
+ )}
+
+
+ {loading ?
+ t('checkout.processing')
+ : paymentMethod === 'card' ?
+ t('checkout.pay_order')
+ : t('checkout.place_order')}
+
+
+ {t('checkout.back')}
+
+
{t('checkout.terms')}
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/components/SuccessScreen.tsx b/src/components/common/CheckoutModal/components/SuccessScreen.tsx
new file mode 100644
index 00000000000..fc960d727a1
--- /dev/null
+++ b/src/components/common/CheckoutModal/components/SuccessScreen.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import type { SuccessScreenProps } from '../CheckoutModal.types';
+
+export const SuccessScreen: React.FC = ({
+ styles,
+ successOrderId,
+ onViewOrders,
+ onClose,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+
✓
+
{t('checkout.success_title')}
+
+ {t('checkout.success_text')}
+ {successOrderId ? ` (#${successOrderId})` : ''}.
+
+ {t('checkout.redirecting')}
+
+
+
+ {t('checkout.view_orders')}
+
+
+ {t('checkout.close')}
+
+
+
+ );
+};
diff --git a/src/components/common/CheckoutModal/hooks/useCheckoutDelivery.ts b/src/components/common/CheckoutModal/hooks/useCheckoutDelivery.ts
new file mode 100644
index 00000000000..f0fd6e7e285
--- /dev/null
+++ b/src/components/common/CheckoutModal/hooks/useCheckoutDelivery.ts
@@ -0,0 +1,161 @@
+import { useEffect, useState } from 'react';
+
+import { notify } from '@/utils/notifications';
+import {
+ getCities,
+ getWarehouses,
+ type City,
+ type Warehouse,
+} from '@/utils/novaPostaClient';
+
+import type { DeliveryMethod } from '../CheckoutModal.types';
+
+interface UseCheckoutDeliveryParams {
+ isOpen: boolean;
+}
+
+export function useCheckoutDelivery({ isOpen }: UseCheckoutDeliveryParams) {
+ const [deliveryOpen, setDeliveryOpen] = useState(false);
+ const [deliveryMethod, setDeliveryMethod] =
+ useState('novapost');
+ const [address, setAddress] = useState('');
+ const [cities, setCities] = useState([]);
+ const [selectedCity, setSelectedCity] = useState(null);
+ const [cityQuery, setCityQuery] = useState('');
+ const [citiesOpen, setCitiesOpen] = useState(false);
+ const [warehouses, setWarehouses] = useState([]);
+ const [selectedWarehouse, setSelectedWarehouse] = useState(
+ null,
+ );
+ const [warehousesOpen, setWarehousesOpen] = useState(false);
+ const [loadingCities, setLoadingCities] = useState(false);
+ const [loadingWarehouses, setLoadingWarehouses] = useState(false);
+
+ useEffect(() => {
+ if (!isOpen) return;
+
+ setDeliveryMethod('novapost');
+ setAddress('');
+ setCityQuery('');
+ setSelectedCity(null);
+ setSelectedWarehouse(null);
+ setDeliveryOpen(false);
+ setCitiesOpen(false);
+ setWarehousesOpen(false);
+ }, [isOpen]);
+
+ useEffect(() => {
+ const loadCities = async () => {
+ setLoadingCities(true);
+ try {
+ const citiesData = await getCities();
+ setCities(citiesData);
+ if (citiesData.length === 0) {
+ console.warn('No cities loaded from Nova Poshta');
+ }
+ } catch (error) {
+ console.error('Failed to load cities:', error);
+ notify.error('Failed to load cities from Nova Poshta');
+ } finally {
+ setLoadingCities(false);
+ }
+ };
+
+ if (isOpen && deliveryMethod === 'novapost') {
+ loadCities();
+ }
+ }, [isOpen, deliveryMethod]);
+
+ useEffect(() => {
+ const loadWarehouses = async () => {
+ if (!selectedCity) {
+ setWarehouses([]);
+ setSelectedWarehouse(null);
+ return;
+ }
+
+ setLoadingWarehouses(true);
+ try {
+ const warehousesData = await getWarehouses({
+ cityRef: selectedCity.Ref,
+ });
+ setWarehouses(warehousesData);
+ setSelectedWarehouse(null);
+ } catch (error) {
+ console.error('Failed to load warehouses:', error);
+ notify.error('Failed to load warehouses');
+ } finally {
+ setLoadingWarehouses(false);
+ }
+ };
+
+ loadWarehouses();
+ }, [selectedCity]);
+
+ const filteredCities = (
+ cityQuery.trim() ?
+ cities.filter((city) =>
+ city.Description.toLowerCase().includes(cityQuery.toLowerCase().trim()),
+ )
+ : cities).slice(0, 20);
+
+ const normalizeWarehouseText = (text: string) =>
+ text.replace(/Пункт приймання[-–]видачі/gi, 'Пункт видачі');
+
+ const handleSelectHomeDelivery = () => {
+ setDeliveryMethod('home');
+ setDeliveryOpen(false);
+ setSelectedCity(null);
+ setSelectedWarehouse(null);
+ setCitiesOpen(false);
+ setWarehousesOpen(false);
+ };
+
+ const handleSelectNovaPoshtaDelivery = () => {
+ setDeliveryMethod('novapost');
+ setDeliveryOpen(false);
+ setAddress('');
+ setCitiesOpen(false);
+ setWarehousesOpen(false);
+ };
+
+ const handleCityQueryChange = (value: string) => {
+ setCityQuery(value);
+ setSelectedCity(null);
+ setSelectedWarehouse(null);
+ setCitiesOpen(true);
+ };
+
+ const handleSelectCity = (city: City) => {
+ setSelectedCity(city);
+ setCityQuery(city.Description);
+ setCitiesOpen(false);
+ };
+
+ return {
+ deliveryOpen,
+ setDeliveryOpen,
+ deliveryMethod,
+ setDeliveryMethod,
+ address,
+ setAddress,
+ cityQuery,
+ setCityQuery,
+ citiesOpen,
+ setCitiesOpen,
+ filteredCities,
+ selectedCity,
+ loadingCities,
+ warehouses,
+ warehousesOpen,
+ setWarehousesOpen,
+ selectedWarehouse,
+ setSelectedWarehouse,
+ loadingWarehouses,
+ normalizeWarehouseText,
+ handleSelectHomeDelivery,
+ handleSelectNovaPoshtaDelivery,
+ handleCityQueryChange,
+ handleSelectCity,
+ };
+}
diff --git a/src/components/common/CheckoutModal/hooks/useCheckoutState.ts b/src/components/common/CheckoutModal/hooks/useCheckoutState.ts
new file mode 100644
index 00000000000..75d339d9091
--- /dev/null
+++ b/src/components/common/CheckoutModal/hooks/useCheckoutState.ts
@@ -0,0 +1,47 @@
+import { useCallback, useState } from 'react';
+
+import type { PaymentMethod, Step } from '../CheckoutModal.types';
+
+const PHONE_PREFIX = '+380';
+
+export function useCheckoutState() {
+ const [step, setStep] = useState(1);
+ const [paymentOpen, setPaymentOpen] = useState(false);
+ const [fullName, setFullName] = useState('');
+ const [phone, setPhone] = useState(PHONE_PREFIX);
+ const [paymentMethod, setPaymentMethod] = useState('card');
+ const [loading, setLoading] = useState(false);
+ const [successOrderId, setSuccessOrderId] = useState(null);
+ const [paypalConfirmed, setPaypalConfirmed] = useState(false);
+
+ const resetCheckoutState = useCallback(() => {
+ setStep(1);
+ setFullName('');
+ setPhone('');
+ setPaymentMethod('card');
+ setLoading(false);
+ setSuccessOrderId(null);
+ setPaypalConfirmed(false);
+ setPaymentOpen(false);
+ }, []);
+
+ return {
+ step,
+ setStep,
+ paymentOpen,
+ setPaymentOpen,
+ fullName,
+ setFullName,
+ phone,
+ setPhone,
+ paymentMethod,
+ setPaymentMethod,
+ loading,
+ setLoading,
+ successOrderId,
+ setSuccessOrderId,
+ paypalConfirmed,
+ setPaypalConfirmed,
+ resetCheckoutState,
+ };
+}
diff --git a/src/components/common/CheckoutModal/index.ts b/src/components/common/CheckoutModal/index.ts
new file mode 100644
index 00000000000..2c1ee359450
--- /dev/null
+++ b/src/components/common/CheckoutModal/index.ts
@@ -0,0 +1 @@
+export { CheckoutModal } from './CheckoutModal';
diff --git a/src/components/common/CheckoutModal/services/checkoutService.ts b/src/components/common/CheckoutModal/services/checkoutService.ts
new file mode 100644
index 00000000000..a998b6bfd0d
--- /dev/null
+++ b/src/components/common/CheckoutModal/services/checkoutService.ts
@@ -0,0 +1,174 @@
+import type { Stripe, StripeElements } from '@stripe/stripe-js';
+import { CardElement } from '@stripe/react-stripe-js';
+
+import { supabase } from '@/utils/supabaseClient';
+import { notify } from '@/utils/notifications';
+import type { City, Warehouse } from '@/utils/novaPostaClient';
+
+import type {
+ CheckoutCartItem,
+ DeliveryMethod,
+ PaymentMethod,
+} from '../CheckoutModal.types';
+
+interface CreateOrderInDatabaseParams {
+ cartItems: CheckoutCartItem[];
+ totalPrice: number;
+ fullName: string;
+ phone: string;
+ deliveryMethod: DeliveryMethod;
+ address: string;
+ selectedCity: City | null;
+ selectedWarehouse: Warehouse | null;
+ paymentMethod: PaymentMethod;
+ clearCart: () => void;
+ setSuccessOrderId: (orderId: string) => void;
+}
+
+interface ConfirmCardPaymentParams {
+ stripe: Stripe | null;
+ elements: StripeElements | null;
+ clientSecret: string;
+}
+
+export async function createOrderInDatabase({
+ cartItems,
+ totalPrice,
+ fullName,
+ phone,
+ deliveryMethod,
+ address,
+ selectedCity,
+ selectedWarehouse,
+ paymentMethod,
+ clearCart,
+ setSuccessOrderId,
+}: CreateOrderInDatabaseParams) {
+ try {
+ const { data: userData, error: userError } = await supabase.auth.getUser();
+
+ if (userError || !userData.user) {
+ notify.error('You must be logged in to place an order.');
+ return;
+ }
+
+ const userId = userData.user.id;
+
+ const orderPayload = {
+ user_id: userId,
+ status: 'processing',
+ total: totalPrice,
+ date: new Date(),
+ full_name: fullName.trim(),
+ phone: phone.trim(),
+ delivery_method: deliveryMethod,
+ address:
+ deliveryMethod === 'home' ? address.trim()
+ : deliveryMethod === 'novapost' && selectedWarehouse ?
+ `${selectedCity?.Description} - ${selectedWarehouse.Description}`
+ : null,
+ payment_method: paymentMethod,
+ };
+
+ const { data: order, error: orderError } = await supabase
+ .from('orders')
+ .insert([orderPayload])
+ .select()
+ .single();
+
+ if (orderError) {
+ notify.error(orderError.message);
+ return;
+ }
+
+ const itemsPayload = cartItems.map((item) => ({
+ order_id: order.id,
+ product_id: Number(item.id),
+ name: item.name,
+ price: item.priceDiscount ?? item.price,
+ image: item.image ?? null,
+ quantity: item.quantity,
+ }));
+
+ const { error: itemsError } = await supabase
+ .from('order_items')
+ .insert(itemsPayload);
+
+ if (itemsError) {
+ notify.error(itemsError.message);
+ return;
+ }
+
+ clearCart();
+ setSuccessOrderId(String(order.id));
+
+ notify.success(
+ 'Order placed successfully',
+ 'Redirecting you to your orders...',
+ );
+ } catch {
+ notify.error('Something went wrong. Please try again.');
+ }
+}
+
+export async function createPaymentIntent(totalPrice: number) {
+ const {
+ data: { session },
+ } = await supabase.auth.getSession();
+
+ if (!session) {
+ notify.error('You must be logged in to make a payment.');
+ return null;
+ }
+
+ const { data, error } = await supabase.functions.invoke(
+ 'create-payment-intent',
+ {
+ body: { amount: totalPrice },
+ headers: {
+ Authorization: `Bearer ${session.access_token}`,
+ apikey: import.meta.env.VITE_SUPABASE_ANON_KEY,
+ },
+ },
+ );
+
+ if (error) {
+ console.error('create-payment-intent error:', error);
+ notify.error(error.message || 'Failed to create payment intent');
+ return null;
+ }
+
+ if (data && typeof data === 'object' && 'clientSecret' in data) {
+ return data.clientSecret as string;
+ }
+
+ notify.error('Invalid payment response');
+ return null;
+}
+
+export async function confirmCardPayment({
+ stripe,
+ elements,
+ clientSecret,
+}: ConfirmCardPaymentParams) {
+ if (!stripe || !elements) {
+ notify.error('Stripe is not loaded');
+ return false;
+ }
+
+ const { error, paymentIntent } = await stripe.confirmCardPayment(
+ clientSecret,
+ {
+ payment_method: {
+ card: elements.getElement(CardElement)!,
+ },
+ },
+ );
+
+ if (error) {
+ notify.error(error.message || 'Payment failed');
+ return false;
+ }
+
+ return paymentIntent?.status === 'succeeded';
+}
diff --git a/src/components/common/CheckoutModal/utils/checkoutValidation.ts b/src/components/common/CheckoutModal/utils/checkoutValidation.ts
new file mode 100644
index 00000000000..125983ccc70
--- /dev/null
+++ b/src/components/common/CheckoutModal/utils/checkoutValidation.ts
@@ -0,0 +1,47 @@
+import type { DeliveryMethod, PaymentMethod } from '../CheckoutModal.types';
+
+interface Step1ValidationParams {
+ fullName: string;
+ phone: string;
+}
+
+export function validateStep1({
+ fullName,
+ phone,
+}: Step1ValidationParams): boolean {
+ return fullName.trim().length >= 2 && phone.trim().length >= 6;
+}
+
+interface Step2ValidationParams {
+ deliveryMethod: DeliveryMethod;
+ address: string;
+ hasSelectedCity: boolean;
+ hasSelectedWarehouse: boolean;
+}
+
+export function validateStep2({
+ deliveryMethod,
+ address,
+ hasSelectedCity,
+ hasSelectedWarehouse,
+}: Step2ValidationParams): boolean {
+ if (deliveryMethod === 'home') {
+ return address.trim().length >= 6;
+ }
+
+ if (deliveryMethod === 'novapost') {
+ return hasSelectedCity && hasSelectedWarehouse;
+ }
+
+ return false;
+}
+
+export function validateStep3(paymentMethod: PaymentMethod): boolean {
+ return Boolean(paymentMethod);
+}
+
+export function getStep2ValidationError(
+ deliveryMethod: DeliveryMethod,
+): string {
+ return deliveryMethod === 'home' ? 'Please enter your delivery address.' : '';
+}
diff --git a/src/components/common/CheckoutModal/utils/openPayPalDemo.ts b/src/components/common/CheckoutModal/utils/openPayPalDemo.ts
new file mode 100644
index 00000000000..29f0c603cab
--- /dev/null
+++ b/src/components/common/CheckoutModal/utils/openPayPalDemo.ts
@@ -0,0 +1,56 @@
+interface OpenPayPalDemoParams {
+ totalPrice: number;
+}
+
+export function openPayPalDemo({ totalPrice }: OpenPayPalDemoParams) {
+ const newWindow = window.open(
+ 'about:blank',
+ 'paypal_demo',
+ 'width=500,height=600',
+ );
+
+ if (!newWindow) {
+ return;
+ }
+
+ newWindow.document.write(`
+
+
+
+ PayPal - Confirm Payment
+
+
+
+
+
PayPal
+
Confirm your payment
+
$${totalPrice}
+
This is a demo payment confirmation
+
Confirm Payment
+
Cancel
+
+
+
+
+ `);
+}
diff --git a/src/components/common/HelpWidget/HelpWidget.module.scss b/src/components/common/HelpWidget/HelpWidget.module.scss
new file mode 100644
index 00000000000..87594277813
--- /dev/null
+++ b/src/components/common/HelpWidget/HelpWidget.module.scss
@@ -0,0 +1,239 @@
+@use '@/styles/variables.scss' as *;
+
+.bubble {
+ position: fixed;
+ bottom: 24px;
+ right: 24px;
+ z-index: 9999;
+
+ width: 60px;
+ height: 60px;
+ border-radius: 50%;
+
+ border: 3px solid $color-light-widget;
+ background: $bg-card-1;
+ color: $color-light-widget;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ cursor: pointer;
+ transition:
+ transform 0.2s ease,
+ box-shadow 0.2s ease;
+
+ svg {
+ stroke: currentColor;
+ }
+
+ &:hover {
+ transform: translateY(-4px);
+ box-shadow: 0 12px 25px rgba(0, 0, 0, 0.25);
+ }
+}
+
+.badge {
+ position: absolute;
+ top: 6px;
+ right: 6px;
+
+ background: $color-light-bt;
+ color: $color-surface-2;
+
+ font-size: 12px;
+ padding: 2px 6px;
+ border-radius: 12px;
+ font-weight: 600;
+}
+
+.chat {
+ position: fixed;
+ bottom: 100px;
+ right: 24px;
+
+ width: 360px;
+ height: 480px;
+
+ z-index: 9999;
+
+ background: $bg-surface;
+ border: 1px solid $color-elements;
+ border-radius: 16px;
+
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+
+ box-shadow:
+ 0 20px 40px rgba(0, 0, 0, 0.25),
+ 0 4px 12px rgba(0, 0, 0, 0.08);
+
+ animation: fadeIn 0.2s ease;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: scale(0.97);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+.header {
+ padding: 16px;
+ background: $bg-card;
+ color: $color-light-1;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ font-weight: 600;
+ border-bottom: 1px solid $color-elements;
+}
+
+.close {
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ color: $color-light-1;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ svg {
+ stroke: currentColor;
+ }
+}
+
+.body {
+ flex: 1;
+ padding: 16px;
+ overflow-y: auto;
+
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.message {
+ max-width: 75%;
+ padding: 10px 14px;
+ border-radius: 14px;
+
+ font-size: 14px;
+ line-height: 1.4;
+
+ animation: messageFade 0.25s ease;
+}
+
+@keyframes messageFade {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.user {
+ align-self: flex-end;
+ background: $color-accent;
+ color: $btn-primary-text;
+}
+
+.bot {
+ align-self: flex-start;
+ background: $bg-card;
+ color: $color-light-1;
+ border: 1px solid $color-elements;
+}
+
+.typing {
+ display: flex;
+ gap: 4px;
+
+ span {
+ width: 6px;
+ height: 6px;
+ background: $color-light-1;
+ border-radius: 50%;
+ animation: blink 1.4s infinite both;
+ }
+
+ span:nth-child(2) {
+ animation-delay: 0.2s;
+ }
+ span:nth-child(3) {
+ animation-delay: 0.4s;
+ }
+}
+
+@keyframes blink {
+ 0% {
+ opacity: 0.2;
+ }
+ 20% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.2;
+ }
+}
+
+.footer {
+ display: flex;
+ padding: 12px;
+ gap: 8px;
+
+ border-top: 1px solid $color-elements;
+ background: $bg-card;
+}
+
+.footer input {
+ flex: 1;
+
+ border-radius: 20px;
+ border: 1px solid $color-elements;
+
+ background: $bg-surface;
+ color: $color-light-1;
+
+ padding: 8px 12px;
+ outline: none;
+
+ transition: border 0.2s;
+
+ &:focus {
+ border-color: $color-accent;
+ }
+}
+
+.footer input::placeholder {
+ color: $color-secondary;
+}
+
+.footer button {
+ border-radius: 50%;
+ border: none;
+
+ width: 36px;
+ height: 36px;
+
+ background: $color-accent;
+ color: $btn-primary-text;
+
+ cursor: pointer;
+ transition: background 0.2s;
+
+ &:hover {
+ background: $color-accent-hover;
+ }
+}
diff --git a/src/components/common/HelpWidget/HelpWidget.tsx b/src/components/common/HelpWidget/HelpWidget.tsx
new file mode 100644
index 00000000000..7e0484b7b79
--- /dev/null
+++ b/src/components/common/HelpWidget/HelpWidget.tsx
@@ -0,0 +1,207 @@
+import { useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import s from './HelpWidget.module.scss';
+
+type Message = {
+ id: number;
+ text: string;
+ sender: 'user' | 'bot';
+};
+
+export const HelpWidget = () => {
+ const { t } = useTranslation();
+ const [isOpen, setIsOpen] = useState(false);
+ const [messages, setMessages] = useState([]);
+ const [input, setInput] = useState('');
+ const [unreadCount, setUnreadCount] = useState(0);
+ const [isTyping, setIsTyping] = useState(false);
+
+ const chatRef = useRef(null);
+ const bubbleRef = useRef(null);
+ const messagesEndRef = useRef(null);
+
+ useEffect(() => {
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+ }, [messages, isTyping]);
+
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (
+ chatRef.current &&
+ !chatRef.current.contains(event.target as Node) &&
+ bubbleRef.current &&
+ !bubbleRef.current.contains(event.target as Node)
+ ) {
+ setIsOpen(false);
+ }
+ };
+
+ if (isOpen) {
+ document.addEventListener('mousedown', handleClickOutside);
+ }
+
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, [isOpen]);
+
+ const addWelcomeMessage = () => {
+ setMessages((prev) => {
+ if (prev.length > 0) return prev;
+
+ return [
+ {
+ id: Date.now(),
+ text: t('help_widget.welcome'),
+ sender: 'bot',
+ },
+ ];
+ });
+ };
+
+ const getBotReply = () => {
+ const replies = t('help_widget.bot_replies', {
+ returnObjects: true,
+ }) as string[];
+ return replies[Math.floor(Math.random() * replies.length)];
+ };
+
+ const sendMessage = () => {
+ if (!input.trim()) return;
+
+ const userMessage: Message = {
+ id: Date.now(),
+ text: input,
+ sender: 'user',
+ };
+
+ setMessages((prev) => [...prev, userMessage]);
+ setInput('');
+ setIsTyping(true);
+
+ setTimeout(() => {
+ setIsTyping(false);
+
+ const botReply: Message = {
+ id: Date.now(),
+ text: getBotReply(),
+ sender: 'bot',
+ };
+
+ setMessages((prev) => [...prev, botReply]);
+ setUnreadCount((prev) => (isOpen ? prev : prev + 1));
+ }, 1200);
+ };
+
+ const handleToggle = () => {
+ setIsOpen((prev) => {
+ const next = !prev;
+
+ if (next) {
+ setUnreadCount(0);
+ addWelcomeMessage();
+ }
+
+ return next;
+ });
+ };
+
+ return (
+ <>
+
+
+
+
+
+ {unreadCount > 0 && {unreadCount} }
+
+
+ {isOpen && (
+
+
+ {t('help_widget.title')}
+
+ setIsOpen(false)}
+ >
+
+
+
+
+
+
+
+
+ {messages.map((msg) => (
+
+ {msg.text}
+
+ ))}
+
+ {isTyping && (
+
+
+
+
+
+
+
+ )}
+
+
+
+
+
+ setInput(e.target.value)}
+ placeholder={t('help_widget.placeholder')}
+ onKeyDown={(e) => e.key === 'Enter' && sendMessage()}
+ />
+ ➤
+
+
+ )}
+ >
+ );
+};
diff --git a/src/components/common/ScrollToTop/ScrollToTop.tsx b/src/components/common/ScrollToTop/ScrollToTop.tsx
new file mode 100644
index 00000000000..b22ee7bb22a
--- /dev/null
+++ b/src/components/common/ScrollToTop/ScrollToTop.tsx
@@ -0,0 +1,16 @@
+import { useLayoutEffect } from 'react';
+import { useLocation } from 'react-router-dom';
+
+if ('scrollRestoration' in window.history) {
+ window.history.scrollRestoration = 'manual';
+}
+
+export const ScrollToTop = () => {
+ const { pathname } = useLocation();
+
+ useLayoutEffect(() => {
+ window.scrollTo(0, 0);
+ }, [pathname]);
+
+ return null;
+};
diff --git a/src/components/layout/Footer/Footer.module.scss b/src/components/layout/Footer/Footer.module.scss
new file mode 100644
index 00000000000..bb10c3ec1cf
--- /dev/null
+++ b/src/components/layout/Footer/Footer.module.scss
@@ -0,0 +1,127 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.footer {
+ border-top: 1px solid $color-elements;
+ background: $color-black;
+ padding: 32px 16px;
+ margin-top: 56px;
+
+ @include on-tablet {
+ margin-top: 64px;
+ }
+
+ @include on-desktop {
+ margin-top: 80px;
+ padding: 32px 152px;
+ }
+}
+
+.container {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+
+ @include on-tablet {
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ @include on-desktop {
+ max-width: 1200px;
+ position: relative;
+ margin: 0 auto;
+ }
+}
+
+.logo {
+ width: 140px;
+ height: 140px;
+ object-fit: contain;
+
+ @include on-desktop() {
+ width: 200px;
+ height: 40px;
+ }
+}
+
+.logoLink {
+ position: relative;
+ z-index: 5;
+ cursor: pointer;
+}
+
+.nav {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+
+ @include on-tablet {
+ flex-direction: row;
+ gap: 48px;
+ }
+
+ @include on-desktop {
+ gap: 64px;
+ }
+
+ a {
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+ color: $color-secondary-1;
+ text-decoration: none;
+ transition: color 0.3s ease;
+
+ &:hover {
+ color: $color-white;
+ }
+ }
+}
+
+.back {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+
+ span {
+ font-size: 12px;
+ color: $color-secondary-1;
+ }
+}
+
+.scrollTop {
+ width: 32px;
+ height: 32px;
+ background: $color-surface-3;
+ border: 1px solid $color-elements;
+ border-radius: 8px;
+ color: $color-white;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition:
+ background 0.3s ease,
+ transform 0.2s ease;
+
+ img {
+ width: 10px;
+ height: 10px;
+ object-fit: contain;
+ }
+
+ &:hover {
+ background: $color-accent;
+ }
+
+ &:active {
+ transform: scale(0.96);
+ }
+}
+
+.logo {
+ display: block;
+}
diff --git a/src/components/layout/Footer/Footer.tsx b/src/components/layout/Footer/Footer.tsx
new file mode 100644
index 00000000000..d5d79d04da7
--- /dev/null
+++ b/src/components/layout/Footer/Footer.tsx
@@ -0,0 +1,76 @@
+import { Link } from 'react-router-dom';
+import { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './Footer.module.scss';
+import buttonTopIcon from '@/assets/icons/Button-Top.svg';
+import logoDark from '@/assets/icons/logo-dark.png';
+import logoLight from '@/assets/icons/logo-light.png';
+
+export const Footer = () => {
+ const { t } = useTranslation();
+
+ const handleScrollTop = () => {
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ };
+
+ const [theme, setTheme] = useState(
+ document.documentElement.getAttribute('data-theme'),
+ );
+
+ useEffect(() => {
+ const observer = new MutationObserver(() => {
+ setTheme(document.documentElement.getAttribute('data-theme'));
+ });
+
+ observer.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ['data-theme'],
+ });
+
+ return () => observer.disconnect();
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+ {t('footer.github')}
+
+
+ {t('footer.contacts')}
+ {t('footer.rights')}
+
+
+
+
{t('footer.back_to_top')}
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/layout/Footer/index.ts b/src/components/layout/Footer/index.ts
new file mode 100644
index 00000000000..65e2506faf5
--- /dev/null
+++ b/src/components/layout/Footer/index.ts
@@ -0,0 +1 @@
+export { Footer } from './Footer';
diff --git a/src/components/layout/Header/BurgerMenu/BurgerMenu.module.scss b/src/components/layout/Header/BurgerMenu/BurgerMenu.module.scss
new file mode 100644
index 00000000000..70bd2a73871
--- /dev/null
+++ b/src/components/layout/Header/BurgerMenu/BurgerMenu.module.scss
@@ -0,0 +1,190 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.menu {
+ position: fixed;
+ top: 48px;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: $color-black;
+ z-index: 50;
+ display: flex;
+ flex-direction: column;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior: contain;
+ transition: transform 0.3s ease-in-out;
+ transform: translateX(-100%);
+
+ &__divider {
+ width: 40px;
+ height: 1px;
+ background-color: $color-border;
+ list-style: none;
+ }
+
+ &--open {
+ transform: translateX(0);
+ }
+
+ &__nav {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ padding-top: 24px;
+ align-items: flex-start;
+ }
+
+ &__list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+ align-items: center;
+ }
+
+ &__link {
+ display: inline-flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ color: $color-secondary;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: 800;
+ text-transform: uppercase;
+ letter-spacing: 0.04em;
+ transition: color 0.3s ease;
+
+ &:hover {
+ color: $color-light-1;
+ }
+
+ &--active {
+ color: $color-light-1;
+
+ &::after {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 2px;
+ background-color: $color-light-1;
+ }
+ }
+ }
+
+ &__lang {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 16px;
+ padding: 24px 0;
+ border-top: 1px solid $color-surface-2;
+ }
+
+ &__footer {
+ display: flex;
+ height: 64px;
+ border-top: 1px solid $color-surface-2;
+ margin-top: auto;
+ }
+}
+
+.lang_btn {
+ background: none;
+ border: none;
+ color: $color-secondary;
+ font-size: 14px;
+ font-weight: 700;
+ cursor: pointer;
+ transition: color 0.2s;
+
+ &--active {
+ color: $color-light-1;
+ text-decoration: underline;
+ text-underline-offset: 4px;
+ }
+}
+
+.lang_divider {
+ color: $color-surface-2;
+ font-size: 14px;
+}
+
+.footer_btn {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-right: 1px solid $color-surface-2;
+ position: relative;
+ transition: background-color 0.2s ease;
+ opacity: 1;
+
+ &:last-child {
+ border-right: none;
+ }
+
+ &:hover {
+ background-color: rgba($color-light-1, 0.05);
+ }
+
+ &--active {
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ background-color: $color-light-1;
+ }
+ }
+}
+
+.icon_container {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 14px;
+ height: 14px;
+
+ img {
+ width: 16px;
+ height: 16px;
+ display: block;
+ filter: $icon-filter;
+ transition: filter 0.2s ease;
+ }
+}
+
+.badge {
+ position: absolute;
+ top: -7px;
+ right: -7px;
+ width: 14px;
+ height: 14px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: $color-red;
+ color: $color-light-1;
+ border: 1px solid $color-surface-2;
+ border-radius: 50%;
+ padding: 0;
+ box-sizing: border-box;
+ font-size: 6px;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+:global(body):has(.is-menu-open) {
+ overflow: hidden;
+}
diff --git a/src/components/layout/Header/BurgerMenu/BurgerMenu.tsx b/src/components/layout/Header/BurgerMenu/BurgerMenu.tsx
new file mode 100644
index 00000000000..bd92f31c053
--- /dev/null
+++ b/src/components/layout/Header/BurgerMenu/BurgerMenu.tsx
@@ -0,0 +1,175 @@
+import React from 'react';
+import { NavLink } from 'react-router-dom';
+import { User } from '@supabase/supabase-js';
+import { useTranslation } from 'react-i18next';
+import styles from './BurgerMenu.module.scss';
+import heartIcon from '@assets/icons/heart.svg';
+import cartIcon from '@assets/icons/cart.svg';
+
+interface Props {
+ isOpen: boolean;
+ onClose: () => void;
+ favoritesCount: number;
+ cartCount: number;
+ user: User | null;
+ isAdmin: boolean;
+}
+
+export const BurgerMenu: React.FC = ({
+ isOpen,
+ onClose,
+ favoritesCount,
+ cartCount,
+ user,
+ isAdmin,
+}) => {
+ const { t, i18n } = useTranslation();
+
+ const changeLanguage = (lng: string) => {
+ i18n.changeLanguage(lng);
+ };
+
+ const navLinks = [
+ { id: 1, name: t('nav.home'), path: '/' },
+ { id: 2, name: t('nav.phones'), path: '/phones' },
+ { id: 3, name: t('nav.tablets'), path: '/tablets' },
+ { id: 4, name: t('nav.accessories'), path: '/accessories' },
+ ];
+
+ const authNavLinks = [
+ { id: 5, name: t('nav.orders'), path: 'profile/orders' },
+ { id: 6, name: t('nav.chat'), path: 'profile/chat' },
+ { id: 7, name: t('nav.favorites'), path: 'profile/favorites' },
+ ];
+
+ return (
+
+
+
+ {navLinks.map((link) => (
+
+
+ isActive ?
+ `${styles.menu__link} ${styles['menu__link--active']}`
+ : styles.menu__link
+ }
+ onClick={onClose}
+ >
+ {link.name}
+
+
+ ))}
+
+ {user && (
+ <>
+
+ {authNavLinks.map((link) => (
+
+
+ isActive ?
+ `${styles.menu__link} ${styles['menu__link--active']}`
+ : styles.menu__link
+ }
+ onClick={onClose}
+ >
+ {link.name}
+
+
+ ))}
+
+ {isAdmin && (
+
+
+ isActive ?
+ `${styles.menu__link} ${styles['menu__link--active']}`
+ : styles.menu__link
+ }
+ onClick={onClose}
+ >
+ {t('nav.admin')}
+
+
+ )}
+ >
+ )}
+
+
+
+
+ changeLanguage('en')}
+ >
+ EN
+
+ |
+ changeLanguage('ua')}
+ >
+ UA
+
+
+
+
+
+ isActive ?
+ `${styles.footer_btn} ${styles['footer_btn--active']}`
+ : styles.footer_btn
+ }
+ onClick={onClose}
+ >
+
+
+ {favoritesCount > 0 && (
+
+ {favoritesCount > 99 ? '99+' : favoritesCount}
+
+ )}
+
+
+
+
+ isActive ?
+ `${styles.footer_btn} ${styles['footer_btn--active']}`
+ : styles.footer_btn
+ }
+ onClick={onClose}
+ >
+
+
+ {cartCount > 0 && (
+
+ {cartCount > 99 ? '99+' : cartCount}
+
+ )}
+
+
+
+
+ );
+};
diff --git a/src/components/layout/Header/CounterIcon/CounterIcon.module.scss b/src/components/layout/Header/CounterIcon/CounterIcon.module.scss
new file mode 100644
index 00000000000..ebc03faf52b
--- /dev/null
+++ b/src/components/layout/Header/CounterIcon/CounterIcon.module.scss
@@ -0,0 +1,42 @@
+@use '@styles/variables' as *;
+
+.wrapper {
+ position: relative;
+ display: flex;
+ line-height: 0;
+}
+
+.icon {
+ width: 16px;
+ height: 16px;
+ display: block;
+}
+
+.badge {
+ position: absolute;
+ top: -7px;
+ right: -7px;
+
+ width: 16px;
+ height: 16px;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ background-color: $color-red;
+ color: $color-light-bt;
+ border: 1px solid $color-black;
+ border-radius: 50%;
+
+ padding: 0;
+ box-sizing: border-box;
+
+ font-size: 8px;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+
+ overflow: hidden;
+ white-space: nowrap;
+}
diff --git a/src/components/layout/Header/CounterIcon/CounterIcon.tsx b/src/components/layout/Header/CounterIcon/CounterIcon.tsx
new file mode 100644
index 00000000000..538cec539ae
--- /dev/null
+++ b/src/components/layout/Header/CounterIcon/CounterIcon.tsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import { motion, AnimatePresence } from 'framer-motion';
+import styles from './CounterIcon.module.scss';
+
+interface Props {
+ icon: string;
+ count: number;
+ alt: string;
+}
+
+export const CounterIcon: React.FC = ({ icon, count, alt }) => {
+ return (
+
+
+
+
+ {count > 0 && (
+
+ {count > 99 ? '99+' : count}
+
+ )}
+
+
+ );
+};
diff --git a/src/components/layout/Header/Header.module.scss b/src/components/layout/Header/Header.module.scss
new file mode 100644
index 00000000000..c37406dee0b
--- /dev/null
+++ b/src/components/layout/Header/Header.module.scss
@@ -0,0 +1,238 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.header {
+ height: 48px;
+ background-color: $bg-main;
+ border-bottom: 1px solid $color-border;
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
+ display: flex;
+ align-items: center;
+ position: sticky;
+ top: 0;
+ z-index: 1000;
+
+ @include on-desktop() {
+ height: 64px;
+ }
+
+ &__theme {
+ display: flex;
+ align-items: center;
+ padding: 0 12px;
+ border-left: 1px solid $color-border;
+ }
+
+ &__container {
+ display: flex;
+ justify-content: space-between;
+ align-items: stretch;
+ width: 100%;
+ height: 100%;
+ }
+
+ &__left,
+ &__right {
+ display: flex;
+ align-items: stretch;
+ }
+
+ &__logo {
+ display: flex;
+ align-items: center;
+ padding: 0 16px;
+ text-decoration: none;
+
+ img {
+ width: 140px;
+ height: 30px;
+ object-fit: contain;
+
+ @include on-desktop() {
+ width: 100px;
+ height: 40px;
+ }
+ }
+ }
+
+ &__nav {
+ display: none;
+ @include on-tablet() {
+ display: flex;
+ height: 100%;
+ margin-left: 32px;
+ }
+ }
+
+ &__icons {
+ display: flex;
+ align-items: stretch;
+ }
+
+ &__burger {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 48px;
+ background: transparent;
+ border: none;
+ border-left: 1px solid $color-border;
+ cursor: pointer;
+
+ @include on-tablet() {
+ display: none;
+ }
+ }
+}
+
+.lang_switcher {
+ display: none;
+ align-items: center;
+ gap: 4px;
+ margin-right: 16px;
+
+ @include on-tablet() {
+ display: flex;
+ }
+}
+
+.lang_btn {
+ background: none;
+ border: none;
+ color: $color-secondary;
+ font-size: 12px;
+ font-weight: 800;
+ cursor: pointer;
+ padding: 4px;
+ transition: color 0.2s;
+
+ &:hover {
+ color: $color-light-1;
+ }
+
+ &--active {
+ color: $color-light-1;
+ text-decoration: underline;
+ text-underline-offset: 4px;
+ }
+}
+
+.lang_divider {
+ color: $color-border;
+ font-size: 12px;
+ user-select: none;
+}
+
+.nav_list {
+ display: flex;
+ list-style: none;
+ padding: 0;
+ height: 100%;
+ @include on-tablet() {
+ gap: 32px;
+ }
+ @include on-desktop() {
+ gap: 64px;
+ }
+
+ &__link {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ color: $color-secondary;
+ text-decoration: none;
+ font-size: 12px;
+ font-weight: 800;
+ text-transform: uppercase;
+ position: relative;
+
+ &--active {
+ color: $color-light-1;
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background-color: $color-light-1;
+ }
+ }
+ }
+}
+
+.icon_btn {
+ display: none;
+ justify-content: center;
+ align-items: center;
+ width: 48px;
+ height: 100%;
+ border-left: 1px solid $color-border;
+ text-decoration: none;
+ position: relative;
+
+ @include on-tablet() {
+ display: flex;
+ }
+
+ @include on-desktop() {
+ width: 64px;
+ }
+
+ &--user {
+ display: flex;
+ }
+
+ &:last-child {
+ border-right: 1px solid $color-border;
+ }
+
+ &--active {
+ background-color: rgba($color-light-1, 0.1);
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 2px;
+ background-color: $color-light-1;
+ }
+ }
+
+ img {
+ width: 16px;
+ height: 16px;
+ object-fit: contain;
+ transition: filter 0.2s ease;
+ filter: $icon-filter;
+ }
+}
+
+.burger_icon {
+ width: 16px;
+ height: 9px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+
+ span {
+ display: block;
+ width: 100%;
+ height: 2px;
+ background-color: $color-light-1;
+ transition: transform 0.3s;
+ }
+
+ &--active {
+ span:nth-child(1) {
+ transform: translateY(3.5px) rotate(45deg);
+ }
+ span:nth-child(2) {
+ opacity: 0;
+ }
+ span:nth-child(3) {
+ transform: translateY(-3.5px) rotate(-45deg);
+ }
+ }
+}
diff --git a/src/components/layout/Header/Header.tsx b/src/components/layout/Header/Header.tsx
new file mode 100644
index 00000000000..45bc2aa9655
--- /dev/null
+++ b/src/components/layout/Header/Header.tsx
@@ -0,0 +1,227 @@
+import { useEffect, useState } from 'react';
+import { Link, NavLink } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { BurgerMenu } from './BurgerMenu/BurgerMenu';
+import { CounterIcon } from './CounterIcon/CounterIcon';
+import styles from './Header.module.scss';
+
+import heartIcon from '@assets/icons/heart.svg';
+import cartIcon from '@assets/icons/cart.svg';
+import userIcon from '@assets/icons/user.svg';
+import logoDark from '@assets/icons/logo-dark.png';
+import logoLight from '@assets/icons/logo-light.png';
+import { useAppContext } from '@hooks/useAppContext';
+import { Search } from './Search/Search';
+import { AuthModal } from '@components/common/AuthModal';
+import { supabase } from '@utils/supabaseClient';
+import { User } from '@supabase/supabase-js';
+import { ThemeSwitcher } from './ThemeSwitcher/ThemeSwitcher';
+
+export const Header = () => {
+ const { t, i18n } = useTranslation();
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
+ const [isAuthModalOpen, setIsAuthModalOpen] = useState(false);
+ const [user, setUser] = useState(null);
+ const [isAdmin, setIsAdmin] = useState(false);
+
+ const { totalItems, favoritesCount } = useAppContext();
+
+ const navLinks = [
+ { id: 1, name: t('nav.home'), path: '/' },
+ { id: 2, name: t('nav.phones'), path: '/phones' },
+ { id: 3, name: t('nav.tablets'), path: '/tablets' },
+ { id: 4, name: t('nav.accessories'), path: '/accessories' },
+ ];
+
+ const toggleMenu = () => setIsMenuOpen((prev) => !prev);
+ const closeMenu = () => setIsMenuOpen(false);
+
+ const changeLanguage = (lng: string) => {
+ i18n.changeLanguage(lng);
+ };
+
+ const fetchAdmin = async (userId: string) => {
+ const { data } = await supabase
+ .from('profiles')
+ .select('is_admin')
+ .eq('id', userId)
+ .single();
+ setIsAdmin(data?.is_admin ?? false);
+ };
+
+ useEffect(() => {
+ supabase.auth.getSession().then(({ data: { session } }) => {
+ setUser(session?.user ?? null);
+ if (session?.user) fetchAdmin(session.user.id);
+ });
+
+ const {
+ data: { subscription },
+ } = supabase.auth.onAuthStateChange((_event, session) => {
+ setUser(session?.user ?? null);
+ if (session?.user) {
+ fetchAdmin(session.user.id);
+ } else {
+ setIsAdmin(false);
+ }
+ });
+
+ return () => subscription.unsubscribe();
+ }, []);
+
+ const [theme, setTheme] = useState(localStorage.getItem('theme') || 'dark');
+
+ useEffect(() => {
+ document.documentElement.setAttribute('data-theme', theme);
+ localStorage.setItem('theme', theme);
+ }, [theme]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ {navLinks.map((link) => (
+
+
+ isActive ?
+ `${styles.nav_list__link} ${styles['nav_list__link--active']}`
+ : styles.nav_list__link
+ }
+ >
+ {link.name}
+
+
+ ))}
+
+
+
+
+
+
+ changeLanguage('en')}
+ >
+ EN
+
+ |
+ changeLanguage('ua')}
+ >
+ UA
+
+
+
+
+
+
+
+
+ isActive ?
+ `${styles.icon_btn} ${styles['icon_btn--user']} ${styles['icon_btn--active']}`
+ : `${styles.icon_btn} ${styles['icon_btn--user']}`
+ }
+ onClick={(e) => {
+ if (!user) {
+ e.preventDefault();
+ setIsAuthModalOpen(true);
+ }
+ closeMenu();
+ }}
+ >
+
+
+
+
+ isActive ?
+ `${styles.icon_btn} ${styles['icon_btn--active']}`
+ : styles.icon_btn
+ }
+ onClick={closeMenu}
+ >
+
+
+
+
+ isActive ?
+ `${styles.icon_btn} ${styles['icon_btn--active']}`
+ : styles.icon_btn
+ }
+ onClick={closeMenu}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setIsAuthModalOpen(false)}
+ />
+
+
+
+ >
+ );
+};
diff --git a/src/components/layout/Header/Search/Search.module.scss b/src/components/layout/Header/Search/Search.module.scss
new file mode 100644
index 00000000000..40c6f9a1c41
--- /dev/null
+++ b/src/components/layout/Header/Search/Search.module.scss
@@ -0,0 +1,219 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.search {
+ position: relative;
+ display: flex;
+ align-items: center;
+ margin: 0 12px;
+ flex-shrink: 1;
+
+ @include on-desktop() {
+ width: 300px;
+ }
+
+ &__field {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 0 14px;
+ height: 32px;
+ width: 100%;
+ background-color: $color-surface-1;
+ border: 1px solid $color-border;
+ border-radius: 8px;
+ transition: all $transition-default;
+
+ &:focus-within {
+ border-color: $color-light-1;
+ }
+
+ @include on-desktop() {
+ height: 40px;
+ }
+ }
+
+ &__input {
+ flex: 1;
+ background: transparent;
+ border: none;
+ outline: none;
+ color: $color-light-1;
+ width: 100%;
+ font-size: 16px;
+
+ &::placeholder {
+ color: $color-secondary;
+ }
+
+ @include on-desktop() {
+ font-size: 14px;
+ }
+ }
+
+ &__button {
+ background: transparent;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ width: 24px;
+ height: 24px;
+ position: relative;
+ }
+
+ &__icon {
+ width: 16px;
+ height: 16px;
+ position: absolute;
+ filter: $icon-filter;
+ transition: filter 0.2s ease;
+ }
+
+ &__dropdown {
+ position: fixed;
+ top: 64px;
+ left: 16px;
+ right: 16px;
+ width: auto;
+ background-color: $color-drobdown;
+ border: 1px solid $color-elements;
+ border-radius: 8px;
+
+ max-height: 240px;
+ overflow-y: auto;
+ z-index: 1100;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.9);
+ padding: 8px;
+
+ @include on-tablet() {
+ position: absolute;
+ top: calc(100% + 8px);
+ left: auto;
+ right: 0;
+ width: 50vw;
+ min-width: 300px;
+ max-height: 400px;
+ }
+
+ @include on-desktop() {
+ position: absolute;
+ top: calc(100% + 8px);
+ left: 0;
+ right: 0;
+ width: 100%;
+ max-height: 400px;
+ display: block;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: $color-white;
+ border: 2px solid $color-surface-1;
+ border-radius: 10px;
+ }
+ }
+
+ &__empty {
+ padding: 24px;
+ text-align: center;
+ color: $search-empty;
+ font-size: 14px;
+ }
+
+ &__list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ }
+
+ &__item {
+ position: relative;
+ border-radius: 6px;
+ transition: all 0.2s ease;
+
+ &--selected {
+ background-color: $search-item-hover;
+
+ &::after {
+ opacity: 0;
+ }
+ }
+
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: -1px;
+ left: 12px;
+ right: 12px;
+ height: 1px;
+ background-color: $search-divider;
+ }
+
+ &:last-child::after {
+ display: none;
+ }
+ }
+
+ &__link {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 8px 12px;
+ text-decoration: none;
+ }
+
+ &__img_wrapper {
+ width: 32px;
+ height: 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ }
+
+ &__item_img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ mix-blend-mode: $search-img-blend;
+ filter: $search-img-filter;
+ }
+
+ &__item_info {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ min-width: 0;
+ }
+
+ &__item_name {
+ color: $color-light-1;
+ font-size: 13px;
+ font-weight: 500;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ &__item_category {
+ font-size: 10px;
+ color: rgba(255, 255, 255, 0.4);
+ text-transform: uppercase;
+ margin-top: 2px;
+ }
+
+ &__item_price {
+ font-size: 13px;
+ font-weight: 600;
+ color: $color-white;
+ margin-left: 8px;
+ }
+}
diff --git a/src/components/layout/Header/Search/Search.tsx b/src/components/layout/Header/Search/Search.tsx
new file mode 100644
index 00000000000..5d04dd1a049
--- /dev/null
+++ b/src/components/layout/Header/Search/Search.tsx
@@ -0,0 +1,264 @@
+import { useEffect, useState, useMemo, useRef } from 'react';
+import { useNavigate, Link } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { motion, AnimatePresence } from 'framer-motion';
+import Fuse from 'fuse.js';
+import { getProducts } from '@api/products';
+import { Product } from '@/types/Product';
+import styles from './Search.module.scss';
+import searchIcon from '@assets/icons/search.svg';
+import closeIcon from '@assets/icons/close.svg';
+
+export const Search = () => {
+ const { t } = useTranslation();
+ const [query, setQuery] = useState('');
+ const [debouncedQuery, setDebouncedQuery] = useState('');
+ const [products, setProducts] = useState([]);
+ const [selectedIndex, setSelectedIndex] = useState(-1);
+ const [isMobile, setIsMobile] = useState(false);
+
+ const searchRef = useRef(null);
+ const inputRef = useRef(null);
+ const listRef = useRef(null);
+ const navigate = useNavigate();
+
+ const [hotkeyText] = useState(() => {
+ if (typeof window !== 'undefined') {
+ const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
+ return isMac ? 'Opt + S' : 'Alt + S';
+ }
+ return 'Alt + S';
+ });
+
+ useEffect(() => {
+ const handleResize = () => {
+ setIsMobile(window.innerWidth <= 768);
+ };
+
+ handleResize();
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ useEffect(() => {
+ const loadAllProducts = async () => {
+ try {
+ const data = await getProducts();
+ setProducts(data);
+ } catch (error) {
+ console.error('Error loading products:', error);
+ }
+ };
+ loadAllProducts();
+ }, []);
+
+ useEffect(() => {
+ const handler = setTimeout(() => setDebouncedQuery(query), 300);
+ return () => {
+ clearTimeout(handler);
+ setSelectedIndex(-1);
+ };
+ }, [query]);
+
+ useEffect(() => {
+ if (selectedIndex >= 0 && listRef.current) {
+ const selectedElement = listRef.current.children[
+ selectedIndex
+ ] as HTMLElement;
+ selectedElement?.scrollIntoView({
+ block: 'nearest',
+ behavior: 'smooth',
+ });
+ }
+ }, [selectedIndex]);
+
+ const filteredItems = useMemo(() => {
+ const normalizedQuery = debouncedQuery.toLowerCase().trim();
+ if (!normalizedQuery) return [];
+
+ const fuse = new Fuse(products, {
+ keys: ['name'],
+ threshold: 0.4,
+ distance: 100,
+ ignoreLocation: true,
+ useExtendedSearch: true,
+ });
+
+ const searchTerms = {
+ $or: [
+ { name: normalizedQuery },
+ {
+ $and: normalizedQuery
+ .split(/\s+/)
+ .filter((term) => term.length > 1)
+ .map((term) => ({ name: `'${term}` })),
+ },
+ ],
+ };
+
+ return fuse
+ .search(searchTerms)
+ .map((r) => r.item)
+ .slice(0, 15);
+ }, [debouncedQuery, products]);
+
+ const handleClear = () => {
+ setQuery('');
+ setDebouncedQuery('');
+ inputRef.current?.focus();
+ };
+
+ const handleFieldClick = () => {
+ inputRef.current?.focus();
+ };
+
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (isMobile) return;
+
+ if (e.altKey && e.code === 'KeyS') {
+ e.preventDefault();
+ inputRef.current?.focus();
+ return;
+ }
+
+ if (e.key === 'Escape') {
+ if (query.length > 0) {
+ handleClear();
+ setSelectedIndex(-1);
+ } else {
+ inputRef.current?.blur();
+ }
+ return;
+ }
+
+ if (!query || filteredItems.length === 0) return;
+
+ if (e.key === 'ArrowDown') {
+ e.preventDefault();
+ setSelectedIndex((prev) =>
+ prev < filteredItems.length - 1 ? prev + 1 : prev,
+ );
+ } else if (e.key === 'ArrowUp') {
+ e.preventDefault();
+ setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));
+ } else if (e.key === 'Enter' && selectedIndex >= 0) {
+ const item = filteredItems[selectedIndex];
+ navigate(`/${item.category || 'phones'}/${item.itemId || item.id}`);
+ setQuery('');
+ setDebouncedQuery('');
+ inputRef.current?.blur();
+ }
+ };
+
+ document.addEventListener('keydown', handleKeyDown);
+ return () => document.removeEventListener('keydown', handleKeyDown);
+ }, [query, filteredItems, selectedIndex, navigate, isMobile]);
+
+ const placeholderText =
+ isMobile ?
+ t('search.placeholder')
+ : t('search.placeholder_hotkey', { hotkey: hotkeyText });
+
+ return (
+
+
+
setQuery(e.target.value)}
+ />
+
{
+ e.stopPropagation();
+ handleClear();
+ }}
+ type="button"
+ aria-label={t('search.clear')}
+ >
+
+
+
+
+
+
+
+ {query && (
+
+ {filteredItems.length > 0 ?
+
+ {filteredItems.map((item, index) => (
+ setSelectedIndex(index)}
+ >
+ {
+ setQuery('');
+ setDebouncedQuery('');
+ }}
+ >
+
+
+
+
+
{item.name}
+
+ {item.category}
+
+
+
+ ${item.price}
+
+
+
+ ))}
+
+ :
+ {t('search.no_results', { query })}
+
+ }
+
+ )}
+
+
+ );
+};
diff --git a/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.module.scss b/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.module.scss
new file mode 100644
index 00000000000..fee16bc91e8
--- /dev/null
+++ b/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.module.scss
@@ -0,0 +1,64 @@
+@use '../../../../styles/variables' as *;
+
+.switch {
+ position: relative;
+ width: 46px;
+ height: 18px;
+ border-radius: 20px;
+ border: none;
+
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ padding: 0 6px;
+ cursor: pointer;
+
+ transition: background 0.3s ease;
+}
+
+.light {
+ background: #d6d6d6;
+}
+
+.dark {
+ background: #2b2d3a;
+}
+
+.icon {
+ font-size: 8px;
+ line-height: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+ pointer-events: none;
+}
+
+.icon img {
+ width: 12px;
+ height: 12px;
+ filter: $icon-filter;
+}
+
+.thumb {
+ position: absolute;
+ left: 1px;
+
+ width: 17px;
+ height: 17px;
+ border-radius: 50%;
+
+ transition: transform 0.3s ease;
+ z-index: 1;
+}
+
+.left {
+ transform: translateX(3px);
+ background: #ffd54f;
+}
+
+.right {
+ transform: translateX(25px);
+ background: #7b7b7b;
+}
diff --git a/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.tsx b/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.tsx
new file mode 100644
index 00000000000..c1dfde57f4a
--- /dev/null
+++ b/src/components/layout/Header/ThemeSwitcher/ThemeSwitcher.tsx
@@ -0,0 +1,40 @@
+import styles from './ThemeSwitcher.module.scss';
+import sunIcon from '../../../../assets/icons/sun.svg';
+import moonIcon from '../../../../assets/icons/moon.svg';
+
+type Props = {
+ theme: string;
+ setTheme: (theme: string) => void;
+};
+
+export const ThemeSwitcher = ({ theme, setTheme }: Props) => {
+ const isLight = theme === 'light';
+
+ const toggleTheme = () => {
+ setTheme(isLight ? 'dark' : 'light');
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/layout/SideBar/SideBar.module.scss b/src/components/layout/SideBar/SideBar.module.scss
new file mode 100644
index 00000000000..ff8db69a716
--- /dev/null
+++ b/src/components/layout/SideBar/SideBar.module.scss
@@ -0,0 +1,91 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.sidebar {
+ display: none;
+
+ @media (min-width: 640px) {
+ display: flex;
+ flex-direction: column;
+ width: 280px;
+ min-width: 280px;
+ padding-top: 40px;
+ }
+
+ .profileSection {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding-bottom: 20px;
+ margin-bottom: 8px;
+ border-bottom: 1px solid #313237;
+
+ .avatarPlaceholder {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $color-accent;
+ font-weight: 700;
+ }
+
+ .name {
+ font-size: 14px;
+ font-weight: 600;
+ color: $color-accent;
+ margin: 0;
+ }
+
+ .email {
+ font-size: 12px;
+ color: $color-secondary;
+ margin: 0;
+ }
+ }
+
+ .nav {
+ display: flex;
+ flex-direction: column;
+
+ .navItem {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px 0;
+ text-decoration: none;
+ color: $color-light-1;
+ font-size: 14px;
+ transition: color 0.2s;
+
+ &:hover {
+ color: $color-accent-hover;
+ }
+
+ &.active {
+ color: $color-accent;
+ font-weight: 700;
+ }
+
+ .badge {
+ background: $color-accent;
+ color: $color-white;
+ padding: 2px 8px;
+ border-radius: 12px;
+ font-size: 11px;
+ font-weight: 800;
+ }
+
+ .count {
+ color: $color-secondary;
+ }
+ }
+
+ .divider {
+ height: 1px;
+ background: #313237;
+ margin: 8px 0;
+ }
+ }
+}
diff --git a/src/components/layout/SideBar/SideBar.tsx b/src/components/layout/SideBar/SideBar.tsx
new file mode 100644
index 00000000000..9e3c4f09b17
--- /dev/null
+++ b/src/components/layout/SideBar/SideBar.tsx
@@ -0,0 +1,100 @@
+import React from 'react';
+import { Link, useLocation } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import styles from './Sidebar.module.scss';
+import { supabase } from '@utils/supabaseClient';
+import { useAppContext } from '@hooks/useAppContext';
+
+export const Sidebar = () => {
+ const { t } = useTranslation();
+ const location = useLocation();
+ const [userName, setUserName] = React.useState('');
+ const [userEmail, setUserEmail] = React.useState('');
+ const [isAdmin, setIsAdmin] = React.useState(false);
+
+ // Отримуємо значення напряму з контексту, а не викликаємо як функцію
+ const { favoritesCount } = useAppContext();
+
+ React.useEffect(() => {
+ const fetchUser = async () => {
+ const {
+ data: { user },
+ } = await supabase.auth.getUser();
+
+ if (!user) return;
+
+ setUserName(user.user_metadata?.full_name || '');
+ setUserEmail(user.email || '');
+
+ const { data: profile } = await supabase
+ .from('profiles')
+ .select('is_admin')
+ .eq('id', user.id)
+ .single();
+
+ setIsAdmin(profile?.is_admin ?? false);
+ };
+
+ fetchUser();
+ }, []);
+
+ const isActive = (path: string) => location.pathname === path;
+
+ return (
+
+ );
+};
diff --git a/src/components/layout/SideBar/index.ts b/src/components/layout/SideBar/index.ts
new file mode 100644
index 00000000000..16bb4a4a5dd
--- /dev/null
+++ b/src/components/layout/SideBar/index.ts
@@ -0,0 +1 @@
+export { Sidebar } from './SideBar';
diff --git a/src/components/product/ColorMap/ColorLink.tsx b/src/components/product/ColorMap/ColorLink.tsx
new file mode 100644
index 00000000000..2d67b0fe5f9
--- /dev/null
+++ b/src/components/product/ColorMap/ColorLink.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import './colorLink.scss';
+import classNames from 'classnames';
+
+interface Props {
+ color: string;
+ to: string;
+ selected?: boolean;
+ onClick?: () => void;
+}
+
+export const ColorLink: React.FC = (props) => {
+ const { color, to: link, selected = false } = props;
+
+ return (
+
+
+
+ );
+};
diff --git a/src/components/product/ColorMap/colorLink.scss b/src/components/product/ColorMap/colorLink.scss
new file mode 100644
index 00000000000..1db0eb6bf1f
--- /dev/null
+++ b/src/components/product/ColorMap/colorLink.scss
@@ -0,0 +1,95 @@
+@use '@styles/variables' as *;
+
+.color-link {
+ --size: 32px;
+
+ display: flex;
+ width: var(--size);
+ height: var(--size);
+ border-radius: 50%;
+ border: 1px solid $color-elements;
+ position: relative;
+ transition:
+ transform 0.3s,
+ border-color 0.3s,
+ box-shadow 0.3s;
+
+ &:not(&--active):hover {
+ transform: scale(1.05);
+ border-color: $color-icons;
+ box-shadow: 0 0 10px 2px rgba($color-elements, 0.6);
+ }
+
+ &--active {
+ border-color: $color-light-1;
+ pointer-events: none;
+ box-shadow: 0 0 0 2px rgba($color-light-1, 0.2);
+ }
+
+ &__circle {
+ --this-size: calc(var(--size) * 0.75);
+
+ position: absolute;
+ width: var(--this-size);
+ height: var(--this-size);
+ border-radius: 50%;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+
+ &.color-link--green {
+ background-color: #5f7170;
+ }
+ &.color-link--black {
+ background-color: #1b1b1d;
+ }
+ &.color-link--purple {
+ background-color: #e5ddea;
+ }
+ &.color-link--red {
+ background-color: #b00d23;
+ }
+ &.color-link--white {
+ background-color: #f0f0f0;
+ }
+ &.color-link--yellow {
+ background-color: #fcdbc1;
+ }
+ &.color-link--gold {
+ background-color: #d4c9b1;
+ }
+ &.color-link--midnightgreen {
+ background-color: #4e5850;
+ }
+ &.color-link--silver {
+ background-color: #e2e4e1;
+ }
+ &.color-link--spacegray {
+ background-color: #707070;
+ }
+ &.color-link--rosegold {
+ background-color: #b76e79;
+ }
+ &.color-link--coral {
+ background-color: #e4664f;
+ }
+ &.color-link--spaceblack {
+ background-color: #201d24;
+ }
+ &.color-link--midnight {
+ background-color: #171e27;
+ }
+ &.color-link--pink {
+ background-color: #fae0d8;
+ }
+ &.color-link--blue {
+ background-color: #215e7c;
+ }
+ &.color-link--sierrablue {
+ background-color: #9bb5ce;
+ }
+ &.color-link--graphite {
+ background-color: #4c4c4c;
+ }
+ }
+}
diff --git a/src/components/product/ProductActions/ProductActions.scss b/src/components/product/ProductActions/ProductActions.scss
new file mode 100644
index 00000000000..f060265bce9
--- /dev/null
+++ b/src/components/product/ProductActions/ProductActions.scss
@@ -0,0 +1,92 @@
+@use '@styles/variables' as *;
+
+.product-actions {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+
+ &__add-to-cart {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex-grow: 1;
+
+ width: 175px;
+ height: 40px;
+
+ border: none;
+ border-radius: 8px;
+
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 14px;
+ line-height: 21px;
+
+ color: $btn-primary-text;
+ background-color: $color-accent;
+
+ text-decoration: none;
+ text-align: center;
+ cursor: pointer;
+
+ transition: background-color $transition-default;
+
+ &:hover:not(:disabled):not(.in-cart) {
+ background-color: $btn-primary-hover;
+ }
+
+ &:disabled,
+ &.in-cart {
+ background-color: $color-surface-2;
+ cursor: default;
+ }
+ }
+
+ &__favorites {
+ position: relative;
+ box-sizing: border-box;
+
+ width: 40px;
+ height: 40px;
+
+ border: none;
+ border-radius: 8px;
+ border: 1px solid $favorites-border;
+ background-color: $bg-card;
+ cursor: pointer;
+
+ &::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+
+ background-image: url(../../../assets/icons/heart.svg);
+ background-repeat: no-repeat;
+ background-position: center;
+
+ filter: $icon-filter;
+ }
+
+ &:hover {
+ background-color: $btn-secondary-hover;
+ }
+
+ &:focus {
+ outline: 2px solid $color-accent;
+ outline-offset: 2px;
+ }
+
+ &:focus:not(:focus-visible) {
+ outline: none;
+ }
+
+ &--active {
+ background-color: $color-surface-1;
+ border: 1px solid $color-elements;
+
+ &::before {
+ background-image: url(../../../assets/icons/heart-red.svg);
+ filter: none;
+ }
+ }
+ }
+}
diff --git a/src/components/product/ProductActions/ProductActions.tsx b/src/components/product/ProductActions/ProductActions.tsx
new file mode 100644
index 00000000000..da7441eae92
--- /dev/null
+++ b/src/components/product/ProductActions/ProductActions.tsx
@@ -0,0 +1,48 @@
+import './ProductActions.scss';
+import * as React from 'react';
+import { useTranslation } from 'react-i18next';
+
+interface Props {
+ handleToggleCart: (e: React.MouseEvent) => void;
+ onToggleFavorite: (e: React.MouseEvent) => void;
+ isFavorite?: boolean;
+ isInCart?: boolean;
+}
+
+export const ProductActions: React.FC = ({
+ handleToggleCart,
+ onToggleFavorite,
+ isFavorite,
+ isInCart,
+}) => {
+ const { t } = useTranslation();
+
+ const handleToggleFavorite = (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ onToggleFavorite(e);
+ };
+
+ return (
+
+
+ {isInCart ? t('product.added') : t('product.add_to_cart')}
+
+
+
+
+ );
+};
diff --git a/src/components/product/ProductActions/index.ts b/src/components/product/ProductActions/index.ts
new file mode 100644
index 00000000000..812ea48911f
--- /dev/null
+++ b/src/components/product/ProductActions/index.ts
@@ -0,0 +1 @@
+export { ProductActions } from './ProductActions';
diff --git a/src/components/product/ProductCard/ProductCard.scss b/src/components/product/ProductCard/ProductCard.scss
new file mode 100644
index 00000000000..f8de763b4c3
--- /dev/null
+++ b/src/components/product/ProductCard/ProductCard.scss
@@ -0,0 +1,68 @@
+@use '@/styles/variables' as *;
+@use '@/styles/utils' as *;
+
+body {
+ font-family: Mont;
+}
+
+.card {
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ min-width: 0;
+ height: 440px;
+ padding: 32px;
+ background-color: $color-surface-1;
+ border: 1px solid $color-border-1;
+
+ border-radius: 20px;
+ overflow: hidden;
+
+ @include on-tablet {
+ height: 506px;
+ }
+
+ @include on-desktop {
+ height: 506px;
+ }
+
+ &__img-container {
+ display: flex;
+ justify-content: center;
+ height: 130px;
+ margin-bottom: 8px;
+
+ @include on-tablet {
+ height: 196px;
+ }
+ @include on-desktop {
+ width: 208px;
+ }
+ }
+
+ &__image {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ object-position: center;
+ }
+
+ &__title-wrapper {
+ display: flex;
+ align-items: flex-end;
+ min-height: 42px;
+ margin-top: 24px;
+ }
+
+ &__title {
+ display: block;
+ margin: 0;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 21px;
+ text-align: left;
+ color: $color-light-1;
+ }
+}
diff --git a/src/components/product/ProductCard/ProductCard.tsx b/src/components/product/ProductCard/ProductCard.tsx
new file mode 100644
index 00000000000..32cca188922
--- /dev/null
+++ b/src/components/product/ProductCard/ProductCard.tsx
@@ -0,0 +1,89 @@
+import './ProductCard.scss';
+import { ProductPrice } from '../ProductPrice/ProductPrice';
+import { ProductFeatures } from '../ProductFeatures/ProductFeatures';
+import { ProductActions } from '../ProductActions/ProductActions';
+import { Product, ProductDetails } from '@/types/Product';
+import React from 'react';
+import { useAppContext } from '@hooks/useAppContext';
+import { Link } from 'react-router-dom';
+import { motion } from 'motion/react';
+interface Props {
+ product?: Product | ProductDetails;
+}
+
+export const ProductCard: React.FC = ({ product }) => {
+ const { toggleCart, isInCart, toggleFavorite, isFavorite } = useAppContext();
+
+ if (!product) return null;
+
+ const productId = 'itemId' in product ? product.itemId : product.id;
+ const stringId = String(productId);
+
+ const currentPrice =
+ product.priceDiscount ?? ('price' in product ? product.price : 0);
+ const fullPrice =
+ product.priceRegular ?? ('fullPrice' in product ? product.fullPrice : 0);
+
+ const imagePath =
+ 'images' in product ?
+ Array.isArray(product.images) ?
+ product.images[0]
+ : product.images
+ : 'image' in product ? product.image
+ : '';
+ const imageUrl = imagePath ? `/${imagePath}` : '';
+
+ const idString = stringId.toLowerCase();
+ let category = 'phones';
+ if (idString.includes('ipad')) category = 'tablets';
+ else if (idString.includes('watch')) category = 'accessories';
+ else if ('category' in product && product.category)
+ category = product.category;
+
+ return (
+
+
+
+
+ {imageUrl && (
+
+ )}
+
+
+
{product.name}
+
+
+
+
+
{
+ e.preventDefault();
+ e.stopPropagation();
+ toggleCart(product as Product);
+ }}
+ onToggleFavorite={() => {
+ toggleFavorite(product as Product);
+ }}
+ isFavorite={isFavorite(stringId)}
+ isInCart={isInCart(product as Product)}
+ />
+
+
+ );
+};
diff --git a/src/components/product/ProductCard/index.tsx b/src/components/product/ProductCard/index.tsx
new file mode 100644
index 00000000000..c4f2778191c
--- /dev/null
+++ b/src/components/product/ProductCard/index.tsx
@@ -0,0 +1 @@
+export { ProductCard } from './ProductCard';
diff --git a/src/components/product/ProductDetail/ProductDetail.scss b/src/components/product/ProductDetail/ProductDetail.scss
new file mode 100644
index 00000000000..c30d4cf7779
--- /dev/null
+++ b/src/components/product/ProductDetail/ProductDetail.scss
@@ -0,0 +1,42 @@
+@use '@/styles/variables' as *;
+
+.ProductDetail {
+ &__about {
+ &-title {
+ color: $color-light-1;
+ font-size: 20px;
+ font-weight: 700;
+ margin: 0;
+ padding: 0;
+
+ &::after {
+ content: '';
+ display: block;
+ height: 1px;
+ width: 100%;
+ background-color: $color-elements;
+ margin-top: 16px;
+ }
+ }
+
+ &-main {
+ margin-top: 32px;
+
+ &-title {
+ color: $color-light-1;
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 100%;
+ letter-spacing: 0;
+ margin-bottom: 16px;
+ }
+
+ &-second {
+ color: $color-secondary-1;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 21px;
+ }
+ }
+ }
+}
diff --git a/src/components/product/ProductDetail/ProductDetail.tsx b/src/components/product/ProductDetail/ProductDetail.tsx
new file mode 100644
index 00000000000..6aefe3e4752
--- /dev/null
+++ b/src/components/product/ProductDetail/ProductDetail.tsx
@@ -0,0 +1,44 @@
+import './ProductDetail.scss';
+import { DescriptionSection } from '@/types/Product';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+
+type Props = {
+ description: DescriptionSection[];
+};
+
+export const ProductDetail: React.FC = ({ description }) => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {t('product_details.about')}
+
+
+
+ {description.map((section, index) => (
+
+
+ {section.title}
+
+
+ {section.text.map((paragraph, i) => (
+
+ {paragraph}
+
+ ))}
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/components/product/ProductDetail/index.tsx b/src/components/product/ProductDetail/index.tsx
new file mode 100644
index 00000000000..e35b2e3db3d
--- /dev/null
+++ b/src/components/product/ProductDetail/index.tsx
@@ -0,0 +1 @@
+export { ProductDetail } from './ProductDetail';
diff --git a/src/components/product/ProductFeatures/ProductFeatures.scss b/src/components/product/ProductFeatures/ProductFeatures.scss
new file mode 100644
index 00000000000..924ff3d483f
--- /dev/null
+++ b/src/components/product/ProductFeatures/ProductFeatures.scss
@@ -0,0 +1,40 @@
+@use '@styles/variables' as *;
+
+.product-features {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 8px;
+
+ &::before {
+ content: '';
+ height: 1px;
+ width: 100%;
+ background-color: $color-border;
+ margin-bottom: 10px;
+ }
+
+ &--no-line::before {
+ display: none;
+ }
+
+ &__item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin: 0;
+ margin-bottom: 8px;
+ font-weight: 600;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 12px;
+ line-height: 15px;
+ }
+
+ &__value {
+ color: $color-light-1;
+ font-weight: 400;
+ }
+
+ &__name {
+ color: $color-secondary;
+ }
+}
diff --git a/src/components/product/ProductFeatures/ProductFeatures.tsx b/src/components/product/ProductFeatures/ProductFeatures.tsx
new file mode 100644
index 00000000000..26a5d90fe46
--- /dev/null
+++ b/src/components/product/ProductFeatures/ProductFeatures.tsx
@@ -0,0 +1,54 @@
+import './ProductFeatures.scss';
+import * as React from 'react';
+import { useTranslation } from 'react-i18next';
+
+interface Props {
+ screen: string;
+ capacity: string;
+ ram: string;
+ resolution?: string;
+ showTopLine?: boolean;
+}
+
+const firstTwoWords = (str: string) => str.split(' ').slice(0, 2).join(' ');
+
+export const ProductFeatures: React.FC = ({
+ screen,
+ capacity,
+ ram,
+ resolution,
+ showTopLine = true,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+
+ {t('product.screen')}
+ {firstTwoWords(screen)}
+
+ {resolution && (
+
+
+ {t('product.resolution', 'Resolution')}
+
+
+ {firstTwoWords(resolution)}
+
+
+ )}
+
+ {t('product.capacity')}
+
+ {firstTwoWords(capacity)}
+
+
+
+ {t('product.ram')}
+ {firstTwoWords(ram)}
+
+
+ );
+};
diff --git a/src/components/product/ProductFeatures/index.ts b/src/components/product/ProductFeatures/index.ts
new file mode 100644
index 00000000000..31329bef1b8
--- /dev/null
+++ b/src/components/product/ProductFeatures/index.ts
@@ -0,0 +1 @@
+export { ProductFeatures } from './ProductFeatures';
diff --git a/src/components/product/ProductGallery/ProductGallery.scss b/src/components/product/ProductGallery/ProductGallery.scss
new file mode 100644
index 00000000000..52f7c28d62d
--- /dev/null
+++ b/src/components/product/ProductGallery/ProductGallery.scss
@@ -0,0 +1,120 @@
+@use '@/styles/utils' as *;
+@use '@/styles/variables' as *;
+
+.gallery {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ margin-top: 32px;
+
+ @include on-tablet {
+ display: grid;
+ grid-template-columns: 80px 1fr;
+ grid-column: 1 / 8;
+ gap: 16px;
+ align-items: center;
+ }
+
+ &__main {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ order: 1;
+ overflow: hidden;
+
+ @include on-tablet {
+ order: 2;
+ }
+ }
+
+ &__thumbs {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ gap: 8px;
+ order: 2;
+
+ @include on-tablet {
+ flex-direction: column;
+ justify-content: center;
+ height: 100%;
+ order: 1;
+ }
+ }
+}
+
+.gallery__image {
+ width: 288px;
+ height: 288px;
+ object-fit: contain;
+
+ @include on-desktop {
+ width: 264px;
+ height: 264px;
+ }
+
+ &--idle {
+ transform: translateX(0);
+ opacity: 1;
+ transition: none;
+ }
+
+ &--exit {
+ transform: translateX(-60px);
+ opacity: 0;
+ transition:
+ transform 250ms cubic-bezier(0.4, 0, 0.2, 1),
+ opacity 250ms ease;
+ }
+
+ &--enter {
+ animation: slideInFromRight 300ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
+ }
+}
+
+@keyframes slideInFromRight {
+ from {
+ transform: translateX(60px);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+.thumb {
+ width: 50px;
+ height: 50px;
+ padding: 4px;
+ cursor: pointer;
+ border: 1px solid $color-elements;
+ background-color: transparent;
+ transition: transition;
+
+ @include on-tablet {
+ width: 80px;
+ height: 80px;
+ padding: 8px;
+ }
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ }
+
+ &:hover {
+ border-color: $color-secondary-1;
+ transform: scale(1.02);
+ }
+
+ &.active {
+ border: 1px solid #f0f0f0;
+ border-width: 1px;
+
+ @include on-tablet {
+ border-width: 2px;
+ }
+ }
+}
diff --git a/src/components/product/ProductGallery/ProductGallery.tsx b/src/components/product/ProductGallery/ProductGallery.tsx
new file mode 100644
index 00000000000..5d0f73c4fe6
--- /dev/null
+++ b/src/components/product/ProductGallery/ProductGallery.tsx
@@ -0,0 +1,71 @@
+import React, { useState, useRef } from 'react';
+import './ProductGallery.scss';
+
+type Props = {
+ images: string[];
+ name: string;
+};
+
+type AnimationState = 'idle' | 'exit' | 'enter';
+
+export const ProductGallery: React.FC = ({ images, name }) => {
+ const [activeImage, setActiveImage] = useState(images[0]);
+ const [nextImage, setNextImage] = useState(null);
+ const [animState, setAnimState] = useState('idle');
+ const [prevImages, setPrevImages] = useState(images);
+
+ const animRef = useRef | null>(null);
+
+ if (images !== prevImages) {
+ setPrevImages(images);
+ setActiveImage(images[0]);
+ setNextImage(null);
+ setAnimState('idle');
+ }
+
+ const handleThumbClick = (img: string) => {
+ if (img === activeImage || animState !== 'idle') return;
+
+ if (animRef.current) clearTimeout(animRef.current);
+
+ setNextImage(img);
+ setAnimState('exit');
+
+ animRef.current = setTimeout(() => {
+ setActiveImage(img);
+ setAnimState('enter');
+
+ animRef.current = setTimeout(() => {
+ setNextImage(null);
+ setAnimState('idle');
+ }, 300);
+ }, 250);
+ };
+
+ return (
+
+
+ {images.map((img, index) => (
+
handleThumbClick(img)}
+ >
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/product/ProductOptions/ProductOptions.scss b/src/components/product/ProductOptions/ProductOptions.scss
new file mode 100644
index 00000000000..d6c0f913aff
--- /dev/null
+++ b/src/components/product/ProductOptions/ProductOptions.scss
@@ -0,0 +1,95 @@
+@use '@/styles/utils' as *;
+@use '@/styles/variables' as *;
+
+.product-options {
+ display: block;
+
+ @include on-tablet {
+ grid-column: 8 / 13;
+ grid-row: 1;
+ margin-top: 0;
+ }
+
+ &__title {
+ margin-top: 0;
+ font-size: 12px;
+ font-weight: 700;
+ color: $color-secondary;
+
+ @include on-tablet {
+ margin-top: 40px;
+ }
+
+ &--capacity {
+ font-size: 12px;
+ font-weight: 700;
+ color: $color-secondary;
+ margin-top: 24px;
+ }
+ }
+
+ &__colors {
+ margin-top: 10px;
+ border-bottom: 1px solid $color-elements;
+ padding-bottom: 24px;
+ }
+
+ &__list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ }
+
+ &__item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ &__ram {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-top: 10px;
+ border-bottom: 1px solid $color-elements;
+ padding-bottom: 24px;
+ }
+
+ &__ram-item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 40px;
+ min-width: 75px;
+ padding: 0 20px;
+ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
+ background-color: transparent;
+ cursor: pointer;
+
+ border: 1px solid $color-icons;
+ border-radius: 8px;
+ transition: all 0.2s ease-in-out;
+
+ &:hover {
+ border-color: $color-light-1;
+ }
+
+ &--active {
+ background-color: $color-light-1;
+ color: $color-black;
+ cursor: default;
+
+ border: 2px solid $color-black;
+ box-shadow: 0 0 0 2px $color-light-1;
+
+ &:hover {
+ border-color: $color-black;
+ }
+ }
+ }
+}
diff --git a/src/components/product/ProductOptions/ProductOptions.tsx b/src/components/product/ProductOptions/ProductOptions.tsx
new file mode 100644
index 00000000000..be9bd501e4a
--- /dev/null
+++ b/src/components/product/ProductOptions/ProductOptions.tsx
@@ -0,0 +1,97 @@
+import React from 'react';
+import { useParams, useSearchParams } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { ColorLink } from '../ColorMap/ColorLink.tsx';
+import './ProductOptions.scss';
+
+type Props = {
+ itemId: string;
+ namespaceId: string;
+ colorsAvailable: string[];
+ currentColor: string;
+ capacityAvailable: string[];
+ currentCapacity: string;
+ onCapacityChange: (newItemId: string) => void;
+ onColorChange?: (color: string) => void;
+ onCapacitySelect?: (capacity: string) => void;
+};
+
+export const ProductOptions: React.FC = ({
+ namespaceId,
+ colorsAvailable,
+ currentColor,
+ capacityAvailable,
+ currentCapacity,
+ onCapacityChange,
+ onColorChange,
+ onCapacitySelect,
+}) => {
+ const { t } = useTranslation();
+ const { category } = useParams<{ category: string }>();
+ const [searchParams] = useSearchParams();
+
+ const buildItemId = (capacity: string, color: string) => {
+ const formattedCapacity = capacity.toLowerCase().replace(/\s+/g, '-');
+ const formattedColor = color.toLowerCase().replace(/\s+/g, '-');
+ return `${namespaceId}-${formattedCapacity}-${formattedColor}`;
+ };
+
+ return (
+
+
+ {t('product_details.colors', 'Available colors')}
+
+
+
+
+ {colorsAvailable.map((clr) => {
+ const newItemId = buildItemId(currentCapacity, clr);
+ const normalizedColor = clr.toLowerCase().replace(/\s+/g, '');
+
+ const newParams = new URLSearchParams(searchParams);
+ newParams.set('capacity', currentCapacity);
+ newParams.set('color', clr);
+
+ const targetLocation = `/${category}/${newItemId}?${newParams.toString()}`;
+
+ return (
+
+ onColorChange?.(clr)}
+ />
+
+ );
+ })}
+
+
+
+
+ {t('product_details.select_capacity', 'Select capacity')}
+
+
+
+ {capacityAvailable.map((cap) => (
+ {
+ onCapacitySelect?.(cap);
+ onCapacityChange(buildItemId(cap, currentColor));
+ }}
+ >
+ {cap}
+
+ ))}
+
+
+ );
+};
diff --git a/src/components/product/ProductPage/ProductPage.scss b/src/components/product/ProductPage/ProductPage.scss
new file mode 100644
index 00000000000..e03300a9b67
--- /dev/null
+++ b/src/components/product/ProductPage/ProductPage.scss
@@ -0,0 +1,68 @@
+@use '@/styles/variables' as *;
+@use '@/styles/utils' as *;
+
+.product-card {
+ border-radius: 20px;
+ overflow: hidden;
+ @include page-grid;
+ row-gap: 32px;
+
+ &__title {
+ grid-column: 1 / -1;
+ font-size: 32px;
+ font-weight: 800;
+ color: $color-light-1;
+ margin: 32px 0 16px;
+ }
+
+ &__sidebar {
+ grid-column: 1 / -1;
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+
+ @include on-tablet {
+ grid-column: 8 / 13;
+ }
+
+ @include on-desktop {
+ grid-column: 14 / 25;
+ }
+ }
+
+ &__gallery {
+ grid-column: 1 / -1;
+
+ @include on-tablet {
+ grid-column: 1 / 8;
+ }
+
+ @include on-desktop {
+ grid-column: 1 / 13;
+ }
+ }
+
+ &__description {
+ grid-column: 1 / -1;
+
+ @include on-desktop {
+ grid-column: 1 / 13;
+ }
+ }
+
+ &__tech-specs {
+ grid-column: 1 / -1;
+
+ @include on-desktop {
+ grid-column: 14 / 25;
+ }
+ }
+
+ &__related {
+ grid-column: 1 / -1;
+ }
+
+ &__reviews {
+ grid-column: 1 / -1;
+ }
+}
diff --git a/src/components/product/ProductPage/ProductPage.tsx b/src/components/product/ProductPage/ProductPage.tsx
new file mode 100644
index 00000000000..056cefef05e
--- /dev/null
+++ b/src/components/product/ProductPage/ProductPage.tsx
@@ -0,0 +1,120 @@
+import React, { useRef, useEffect } from 'react';
+import { useLocation } from 'react-router-dom';
+
+import './ProductPage.scss';
+
+import { ProductGallery } from '@components/product/ProductGallery/ProductGallery';
+import { ProductOptions } from '@components/product/ProductOptions/ProductOptions';
+import { ProductPurchase } from '@components/product/ProductPurchase/ProductPurchase';
+import { ProductDetail } from '@components/product/ProductDetail';
+import { TechSpecs } from '@components/product/TechSpecs/TechSpecs';
+import { RelatedProducts } from '@components/product/RelatedProducts/RelatedProducts';
+import { ProductFeatures } from '@components/product/ProductFeatures';
+import { ReviewsPage } from '@components/product/Reviews/ReviewsPage';
+
+import { ScrollToTop } from '@components/common/ScrollToTop/ScrollToTop';
+
+import { ProductDetails } from '@/types/Product';
+
+type Props = {
+ product: ProductDetails;
+ onCapacityChange: (newItemId: string) => void;
+ onColorChange?: (color: string) => void;
+ onCapacitySelect?: (capacity: string) => void;
+ showReviews: boolean;
+ onCloseReviews: () => void;
+};
+
+export const ProductPage: React.FC = ({
+ product,
+ onCapacityChange,
+ showReviews,
+ onCloseReviews,
+}) => {
+ const location = useLocation();
+ const categoryFromUrl = location.pathname.split('/')[1];
+ const reviewsRef = useRef(null);
+
+ useEffect(() => {
+ if (showReviews && reviewsRef.current) {
+ reviewsRef.current.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start',
+ });
+ }
+ }, [showReviews]);
+
+ return (
+
+
+
+
+
+
+
+
+
+ {showReviews && (
+
+
+
+ )}
+
+
+
+
+
+ );
+};
diff --git a/src/components/product/ProductPage/index.ts b/src/components/product/ProductPage/index.ts
new file mode 100644
index 00000000000..93f6975c68d
--- /dev/null
+++ b/src/components/product/ProductPage/index.ts
@@ -0,0 +1 @@
+export { ProductPage } from './ProductPage';
diff --git a/src/components/product/ProductPrice/ProductPrice.scss b/src/components/product/ProductPrice/ProductPrice.scss
new file mode 100644
index 00000000000..6cecd78389a
--- /dev/null
+++ b/src/components/product/ProductPrice/ProductPrice.scss
@@ -0,0 +1,27 @@
+@use '@styles/variables' as *;
+
+.product-price {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin: 0;
+ margin-top: 8px;
+ margin-bottom: 8px;
+
+ &__current {
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-weight: 700;
+ font-size: 22px;
+ line-height: 140%;
+ color: $color-light-1;
+ }
+
+ &__full {
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 28px;
+ color: $color-secondary;
+ text-decoration: line-through;
+ }
+}
diff --git a/src/components/product/ProductPrice/ProductPrice.tsx b/src/components/product/ProductPrice/ProductPrice.tsx
new file mode 100644
index 00000000000..a34ed083db9
--- /dev/null
+++ b/src/components/product/ProductPrice/ProductPrice.tsx
@@ -0,0 +1,28 @@
+import './ProductPrice.scss';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { formatPrice } from '@/utils/formatPrice';
+
+interface Props {
+ currentPrice: number;
+ fullPrice: number;
+}
+
+export const ProductPrice: React.FC = ({ currentPrice, fullPrice }) => {
+ const { i18n } = useTranslation();
+ const hasDiscount = currentPrice < fullPrice;
+
+ return (
+
+
+ {formatPrice(currentPrice, i18n.language)}
+
+
+ {hasDiscount && (
+
+ {formatPrice(fullPrice, i18n.language)}
+
+ )}
+
+ );
+};
diff --git a/src/components/product/ProductPurchase/ProductPurchase.scss b/src/components/product/ProductPurchase/ProductPurchase.scss
new file mode 100644
index 00000000000..6128259228b
--- /dev/null
+++ b/src/components/product/ProductPurchase/ProductPurchase.scss
@@ -0,0 +1,31 @@
+@use '@/styles/variables' as *;
+
+.purchase {
+ &-price {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-top: 32px;
+
+ &__current {
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 41px;
+ color: $color-light-1;
+ }
+
+ &__full {
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 100%;
+ color: $color-secondary;
+ text-decoration: line-through;
+ }
+ }
+
+ &__buttons {
+ margin-top: 16px;
+ }
+}
diff --git a/src/components/product/ProductPurchase/ProductPurchase.tsx b/src/components/product/ProductPurchase/ProductPurchase.tsx
new file mode 100644
index 00000000000..63404cf4609
--- /dev/null
+++ b/src/components/product/ProductPurchase/ProductPurchase.tsx
@@ -0,0 +1,44 @@
+import './ProductPurchase.scss';
+import { ProductActions } from '../ProductActions';
+import { ProductPrice } from '../ProductPrice/ProductPrice';
+import React from 'react';
+import { ProductDetails } from '@/types/Product';
+import { useAppContext } from '@hooks/useAppContext';
+
+type Props = {
+ product: ProductDetails;
+ priceRegular: number;
+ priceDiscount: number;
+};
+
+export const ProductPurchase: React.FC = ({
+ product,
+ priceRegular,
+ priceDiscount,
+}) => {
+ const { toggleCart, isInCart, toggleFavorite, isFavorite } = useAppContext();
+
+ const stringId = String(product.id);
+ const inCart = isInCart(product);
+ const favorite = isFavorite(stringId);
+
+ return (
+
+
+
+
+
toggleCart(product)}
+ onToggleFavorite={() => toggleFavorite(product)}
+ isInCart={inCart}
+ isFavorite={favorite}
+ />
+
+
+ );
+};
diff --git a/src/components/product/ProductSkelet/ProductSkelet.scss b/src/components/product/ProductSkelet/ProductSkelet.scss
new file mode 100644
index 00000000000..aecdc71f72b
--- /dev/null
+++ b/src/components/product/ProductSkelet/ProductSkelet.scss
@@ -0,0 +1,107 @@
+@use '@/styles/utils' as *;
+@use '@/styles/variables' as v;
+
+.skeleton {
+ // Базовий колір для "заглушок" у вашій темній темі
+ background: color-surface-2;
+ position: relative;
+ overflow: hidden;
+ border-radius: 4px;
+
+ // Ефект переливання
+ &::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ transform: translateX(-100%);
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0) 0,
+ rgba(255, 255, 255, 0.05) 50%,
+ rgba(255, 255, 255, 0) 100%
+ );
+ animation: shimmer 1.5s infinite;
+ }
+}
+
+@keyframes shimmer {
+ 100% {
+ transform: translateX(100%);
+ }
+}
+
+.card-skeleton {
+ // Копіюємо розміри вашої оригінальної картки
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 440px;
+ padding: 32px;
+ background-color: color-surface-1; // ваш колір фону
+
+ @include on-tablet {
+ height: 506px;
+ }
+ @include on-desktop {
+ height: 506px;
+ }
+
+ &__img {
+ @extend .skeleton;
+ height: 130px;
+ margin-bottom: 8px;
+ @include on-tablet {
+ height: 196px;
+ }
+ }
+
+ &__title {
+ @extend .skeleton;
+ height: 21px;
+ width: 90%;
+ margin-top: 24px;
+ }
+
+ &__price {
+ @extend .skeleton;
+ height: 31px;
+ width: 60%;
+ margin-top: 8px;
+ }
+
+ &__features {
+ margin-top: 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ &-line {
+ @extend .skeleton;
+ height: 12px;
+ width: 100%;
+ }
+ }
+
+ &__actions {
+ margin-top: auto; // притискаємо до низу
+ display: flex;
+ gap: 8px;
+ height: 40px;
+
+ &-btn {
+ @extend .skeleton;
+ flex: 1;
+ height: 100%;
+ }
+
+ &-fav {
+ @extend .skeleton;
+ width: 40px;
+ height: 40px;
+ }
+ }
+}
diff --git a/src/components/product/ProductSkelet/ProductSkelet.tsx b/src/components/product/ProductSkelet/ProductSkelet.tsx
new file mode 100644
index 00000000000..4aa13d17b12
--- /dev/null
+++ b/src/components/product/ProductSkelet/ProductSkelet.tsx
@@ -0,0 +1,22 @@
+import './ProductSkelet.scss';
+
+export const ProductSkeleton = () => {
+ return (
+
+ );
+};
diff --git a/src/components/product/RelatedProducts/RelatedProducts.scss b/src/components/product/RelatedProducts/RelatedProducts.scss
new file mode 100644
index 00000000000..8e96a83d9d8
--- /dev/null
+++ b/src/components/product/RelatedProducts/RelatedProducts.scss
@@ -0,0 +1,156 @@
+@use '@styles/variables' as *;
+
+@mixin on-tablet {
+ @media (min-width: 640px) {
+ @content;
+ }
+}
+
+@mixin on-desktop {
+ @media (min-width: 1200px) {
+ @content;
+ }
+}
+
+.AlsoLike {
+ margin-top: 56px;
+
+ @include on-tablet {
+ margin-top: 64px;
+ }
+
+ @include on-desktop {
+ margin-top: 80px;
+ }
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+
+ @include on-tablet {
+ margin-bottom: 32px;
+ }
+ }
+
+ &__title {
+ font-size: 22px;
+ font-weight: 800;
+ letter-spacing: -0.02em;
+ color: $color-white;
+ margin: 0;
+
+ @include on-tablet {
+ font-size: 28px;
+ }
+
+ @include on-desktop {
+ font-size: 32px;
+ }
+ }
+
+ &__arrows {
+ display: flex;
+ gap: 16px;
+ flex-shrink: 0;
+ }
+
+ &__arrow-btn {
+ width: 32px;
+ height: 32px;
+ border: 1px solid $color-surface-2;
+ border-radius: 8px;
+ background-color: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s ease;
+ padding: 0;
+
+ &::after {
+ content: '';
+ display: block;
+ width: 5.33px;
+ height: 9.33px;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ background-color: $color-icons;
+ mask-image: url('/src/assets/icons/vector-white.svg');
+ mask-repeat: no-repeat;
+ mask-position: center;
+ mask-size: contain;
+ -webkit-mask-image: url('/src/assets/icons/vector-white.svg');
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ -webkit-mask-size: contain;
+ }
+
+ &--left::after {
+ transform: rotate(180deg);
+ }
+
+ &:hover:not(:disabled) {
+ background-color: $color-surface-2;
+ border-color: $color-icons;
+
+ &::after {
+ background-color: $color-white;
+ }
+ }
+
+ &:disabled {
+ cursor: not-allowed;
+ border-color: $color-surface-2;
+ opacity: 0.5;
+
+ &::after {
+ background-color: $color-icons;
+ }
+ }
+ }
+
+ &__slider {
+ overflow-x: auto;
+ overflow-y: hidden;
+ margin: 0 -16px;
+ padding: 0 16px 4px;
+ scroll-behavior: smooth;
+ margin-bottom: 56px;
+
+ @include on-tablet {
+ margin: 0 -24px;
+ padding: 0 24px 4px;
+ }
+
+ @include on-desktop {
+ margin: 0 -32px;
+ padding: 0 32px 4px;
+ }
+
+ &::-webkit-scrollbar {
+ height: 0;
+ }
+
+ scrollbar-width: none;
+ }
+
+ &__track {
+ display: flex;
+ gap: 16px;
+
+ & > * {
+ flex: 0 0 212px;
+
+ @include on-tablet {
+ flex: 0 0 237px;
+ }
+
+ @include on-desktop {
+ flex: 0 0 272px;
+ }
+ }
+ }
+}
diff --git a/src/components/product/RelatedProducts/RelatedProducts.tsx b/src/components/product/RelatedProducts/RelatedProducts.tsx
new file mode 100644
index 00000000000..10ed025d38f
--- /dev/null
+++ b/src/components/product/RelatedProducts/RelatedProducts.tsx
@@ -0,0 +1,127 @@
+import React, { useEffect, useMemo, useState, useRef } from 'react';
+import { useTranslation } from 'react-i18next';
+import { getProducts } from '@api/products';
+import { Product } from '@/types/Product';
+import { sortByBestPrice } from '@utils/productFilters';
+import './RelatedProducts.scss';
+import { ProductCard } from '../ProductCard';
+
+interface Props {
+ category: string | undefined;
+ currentProductId: string | undefined;
+}
+
+export const RelatedProducts: React.FC = ({
+ category,
+ currentProductId,
+}) => {
+ const { t } = useTranslation();
+ const [products, setProducts] = useState([]);
+ const [isLoading, setIsLoading] = useState(false);
+
+ const sliderRef = useRef(null);
+ const [canScrollLeft, setCanScrollLeft] = useState(false);
+ const [canScrollRight, setCanScrollRight] = useState(true);
+
+ useEffect(() => {
+ if (!category) return;
+
+ const loadProducts = async () => {
+ setIsLoading(true);
+
+ try {
+ const allProducts = await getProducts();
+
+ const categoryProducts = allProducts.filter(
+ (p) =>
+ p.category &&
+ p.category.toLowerCase().includes(category.toLowerCase()),
+ );
+
+ setProducts(categoryProducts);
+ } catch (err) {
+ console.error(err);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ loadProducts();
+ }, [category]);
+
+ const recommendedProducts = useMemo(() => {
+ if (!products.length) return [];
+
+ const filtered = products.filter((p) => {
+ const pId = String(p.itemId || p.id);
+ const currentId = String(currentProductId);
+ return pId !== currentId;
+ });
+
+ return sortByBestPrice(filtered).slice(0, 12);
+ }, [products, currentProductId]);
+
+ const checkScrollPosition = () => {
+ if (!sliderRef.current) return;
+
+ const { scrollLeft, scrollWidth, clientWidth } = sliderRef.current;
+
+ setCanScrollLeft(scrollLeft > 0);
+ setCanScrollRight(Math.ceil(scrollLeft + clientWidth) < scrollWidth);
+ };
+
+ useEffect(() => {
+ checkScrollPosition();
+ }, [recommendedProducts]);
+
+ const scroll = (direction: 'left' | 'right') => {
+ if (!sliderRef.current) return;
+
+ sliderRef.current.scrollBy({
+ left: direction === 'left' ? -288 : 288,
+ behavior: 'smooth',
+ });
+ };
+
+ if (isLoading) return null;
+ if (!recommendedProducts.length) return null;
+
+ return (
+
+
+
{t('product_details.recommend')}
+
+
+ scroll('left')}
+ disabled={!canScrollLeft}
+ aria-label="Previous"
+ />
+
+ scroll('right')}
+ disabled={!canScrollRight}
+ aria-label="Next"
+ />
+
+
+
+
+
+ {recommendedProducts.map((product) => (
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/components/product/Reviews/Avatar/Avatar.scss b/src/components/product/Reviews/Avatar/Avatar.scss
new file mode 100644
index 00000000000..acd52196625
--- /dev/null
+++ b/src/components/product/Reviews/Avatar/Avatar.scss
@@ -0,0 +1,15 @@
+@use '@styles/variables' as *;
+
+.avatar {
+ width: 38px;
+ height: 38px;
+ border-radius: 50%;
+ background: $color-accent;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 13px;
+ font-weight: 700;
+ color: $color-white;
+ flex-shrink: 0;
+}
diff --git a/src/components/product/Reviews/Avatar/Avatar.tsx b/src/components/product/Reviews/Avatar/Avatar.tsx
new file mode 100644
index 00000000000..e80692afe8e
--- /dev/null
+++ b/src/components/product/Reviews/Avatar/Avatar.tsx
@@ -0,0 +1,11 @@
+import './Avatar.scss';
+
+export const Avatar = ({ name }: { name: string }) => {
+ const initials = name
+ .split(' ')
+ .map((w) => w[0])
+ .join('')
+ .slice(0, 2)
+ .toUpperCase();
+ return {initials}
;
+};
diff --git a/src/components/product/Reviews/BarRow/BarRow.scss b/src/components/product/Reviews/BarRow/BarRow.scss
new file mode 100644
index 00000000000..1631d35bc88
--- /dev/null
+++ b/src/components/product/Reviews/BarRow/BarRow.scss
@@ -0,0 +1,41 @@
+@use '@styles/variables' as *;
+
+.bar-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 3px 0;
+ cursor: default;
+
+ &__label {
+ font-size: 13px;
+ color: $color-accent;
+ min-width: 38px;
+ white-space: nowrap;
+ transition: color 0.2s ease;
+ text-decoration: none;
+ }
+
+ &__track {
+ flex: 1;
+ height: 16px;
+ background: $color-elements;
+ border-radius: 4px;
+ overflow: hidden;
+ }
+
+ &__fill {
+ height: 100%;
+ background: $color-accent-hover;
+ width: 0;
+ transition: width 0.7s cubic-bezier(0.4, 0, 0.2, 1);
+ border-radius: 4px;
+ }
+
+ &__pct {
+ font-size: 13px;
+ color: $color-secondary;
+ min-width: 28px;
+ text-align: right;
+ }
+}
diff --git a/src/components/product/Reviews/BarRow/BarRow.tsx b/src/components/product/Reviews/BarRow/BarRow.tsx
new file mode 100644
index 00000000000..cf9c24ddefc
--- /dev/null
+++ b/src/components/product/Reviews/BarRow/BarRow.tsx
@@ -0,0 +1,24 @@
+import './BarRow.scss';
+
+type Props = {
+ label: string;
+ pct: number;
+ animate: boolean;
+};
+
+export const BarRow = ({ label, pct, animate }: Props) => {
+ return (
+
+
{label}
+
+
+
+
{pct}%
+
+ );
+};
diff --git a/src/components/product/Reviews/DropDown/DropDown.scss b/src/components/product/Reviews/DropDown/DropDown.scss
new file mode 100644
index 00000000000..724c74e2db7
--- /dev/null
+++ b/src/components/product/Reviews/DropDown/DropDown.scss
@@ -0,0 +1,76 @@
+@use '@styles/variables' as *;
+
+.dropdown {
+ position: absolute;
+ top: calc(100% + 10px);
+ left: 0;
+ background: $color-surface-1;
+ border: 1px solid $color-elements;
+ border-radius: 8px;
+ padding: 16px 16px 12px;
+ width: 280px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+ z-index: 100;
+ opacity: 0;
+ pointer-events: none;
+ transform: translateY(-6px);
+ transition:
+ opacity 0.22s ease,
+ transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
+
+ @media (max-width: 360px) {
+ width: calc(100vw - 32px);
+ }
+
+ &--open {
+ opacity: 1;
+ pointer-events: all;
+ transform: translateY(0);
+ }
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+ }
+
+ &__title {
+ font-size: 13px;
+ font-weight: 700;
+ color: $color-white;
+ margin: 0;
+ }
+
+ &__close {
+ background: none;
+ border: none;
+ cursor: pointer;
+ font-size: 20px;
+ color: $color-secondary;
+ line-height: 1;
+ padding: 0 0 0 8px;
+ transition: color $transition-default;
+ &:hover {
+ color: $color-white;
+ }
+ }
+
+ &__divider {
+ height: 1px;
+ background: $color-elements;
+ margin: 10px 0 8px;
+ }
+
+ &__link {
+ display: block;
+ font-size: 13px;
+ color: $color-accent;
+ text-decoration: none;
+ transition: color $transition-default;
+ &:hover {
+ color: $color-accent-hover;
+ text-decoration: underline;
+ }
+ }
+}
diff --git a/src/components/product/Reviews/DropDown/DropDown.tsx b/src/components/product/Reviews/DropDown/DropDown.tsx
new file mode 100644
index 00000000000..c72b3911ef3
--- /dev/null
+++ b/src/components/product/Reviews/DropDown/DropDown.tsx
@@ -0,0 +1,58 @@
+import { useTranslation } from 'react-i18next';
+import { BarRow } from '@components/product/Reviews/BarRow/BarRow';
+import './DropDown.scss';
+
+interface Rating {
+ label: string;
+ pct: number;
+}
+
+export const DropDown = ({
+ ratings,
+ open,
+ onSeeAll,
+ onClose,
+}: {
+ ratings: Rating[];
+ open: boolean;
+ onSeeAll: () => void;
+ onClose: () => void;
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+ );
+};
diff --git a/src/components/product/Reviews/RatingsWidget.scss b/src/components/product/Reviews/RatingsWidget.scss
new file mode 100644
index 00000000000..1f67b27d172
--- /dev/null
+++ b/src/components/product/Reviews/RatingsWidget.scss
@@ -0,0 +1,166 @@
+@use '@styles/variables' as *;
+* {
+ box-sizing: border-box;
+}
+
+.ratings-widget {
+ font-family: 'Mont', sans-serif;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ position: relative;
+
+ &__score {
+ font-family: 'Mont', sans-serif;
+ font-size: 18px;
+ font-weight: 600;
+ color: $color-white;
+ line-height: 1;
+ }
+
+ &__trigger {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 0;
+ line-height: 1;
+ }
+
+ &__chevron {
+ color: $color-secondary;
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ &--open {
+ transform: rotate(180deg);
+ }
+ }
+
+ &__count {
+ font-size: 13px;
+ font-weight: 600;
+ color: $color-white;
+ }
+}
+
+// ─── Summary Panel ───────────────────────────────────────
+.summary-panel {
+ width: 100%;
+ max-width: 280px;
+ flex-shrink: 0;
+
+ @media (max-width: 600px) {
+ max-width: 100%;
+ }
+
+ &__score-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 4px;
+ flex-wrap: wrap;
+ }
+
+ &__score-text {
+ font-size: 18px;
+ font-weight: 700;
+ color: $color-white;
+ }
+ &__count {
+ font-size: 13px;
+ color: $color-secondary;
+ margin-bottom: 14px;
+ }
+
+ &__bar-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 6px;
+ }
+
+ &__bar-label {
+ font-size: 13px;
+ color: $color-accent;
+ min-width: 38px;
+ white-space: nowrap;
+ transition: color $transition-default;
+ }
+ &__bar-track {
+ flex: 1;
+ height: 16px;
+ background: $color-elements;
+ border-radius: 4px;
+ overflow: hidden;
+ }
+ &__bar-fill {
+ height: 100%;
+ background: $color-accent;
+ border-radius: 4px;
+ }
+ &__bar-pct {
+ font-size: 13px;
+ color: $color-secondary;
+ min-width: 28px;
+ text-align: right;
+ }
+
+ &__write-section {
+ border-top: 1px solid $color-elements;
+ margin-top: 20px;
+ padding-top: 20px;
+ }
+
+ &__write-title {
+ font-size: 15px;
+ font-weight: 700;
+ color: $color-white;
+ margin-bottom: 6px;
+ }
+ &__write-sub {
+ font-size: 13px;
+ color: $color-secondary;
+ margin-bottom: 12px;
+ }
+
+ &__write-btn {
+ width: 100%;
+ padding: 10px 0;
+ font-size: 13px;
+ border: 1px solid $color-elements;
+ border-radius: 8px;
+ background: $color-surface-2;
+ cursor: pointer;
+ color: $color-white;
+ transition: background $transition-default;
+ &:hover {
+ background: $color-icons;
+ }
+ }
+}
+
+// ─── Star Picker ─────────────────────────────────────────
+.star-picker {
+ display: flex;
+ gap: 4px;
+
+ &__star {
+ font-size: 36px;
+ cursor: pointer;
+ color: $color-elements;
+ background: none;
+ border: none;
+ padding: 2px;
+ line-height: 1;
+ transition: color 0.15s;
+ -webkit-tap-highlight-color: transparent;
+
+ @media (max-width: 360px) {
+ font-size: 28px;
+ }
+ &--active {
+ color: $color-accent;
+ }
+ }
+}
diff --git a/src/components/product/Reviews/RatingsWidget.tsx b/src/components/product/Reviews/RatingsWidget.tsx
new file mode 100644
index 00000000000..f21d7f905f6
--- /dev/null
+++ b/src/components/product/Reviews/RatingsWidget.tsx
@@ -0,0 +1,69 @@
+import { useState, useEffect, useRef } from 'react';
+import './RatingsWidget.scss';
+import { Stars } from './Stars/Stars';
+import { DropDown } from './DropDown/DropDown';
+import { useReviews } from '@hooks/useReviews';
+
+export const RatingsWidget = ({
+ productId,
+ onSeeAll,
+}: {
+ productId: string;
+ onSeeAll: () => void;
+}) => {
+ const [open, setOpen] = useState(false);
+ const wrapRef = useRef(null);
+ const { avgScore, ratings, reviews } = useReviews(productId);
+
+ useEffect(() => {
+ function handleClick(e: MouseEvent) {
+ if (wrapRef.current && !wrapRef.current.contains(e.target as Node))
+ setOpen(false);
+ }
+ document.addEventListener('mousedown', handleClick);
+ return () => document.removeEventListener('mousedown', handleClick);
+ }, []);
+
+ return (
+
+
{avgScore}
+
setOpen((v) => !v)}
+ aria-expanded={open}
+ style={{ verticalAlign: 'middle' }}
+ >
+
+
+
+
+
+
{reviews.length}
+
{
+ setOpen(false);
+ onSeeAll();
+ }}
+ onClose={() => setOpen(false)}
+ />
+
+ );
+};
diff --git a/src/components/product/Reviews/ReviewCard/ReviewCard.scss b/src/components/product/Reviews/ReviewCard/ReviewCard.scss
new file mode 100644
index 00000000000..d3d06d28af5
--- /dev/null
+++ b/src/components/product/Reviews/ReviewCard/ReviewCard.scss
@@ -0,0 +1,50 @@
+@use '@styles/variables' as *;
+
+.review-card {
+ border-bottom: 1px solid $color-elements;
+ padding-bottom: 20px;
+ margin-bottom: 20px;
+
+ &__author {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+ }
+ &__name {
+ font-size: 14px;
+ font-weight: 700;
+ color: $color-white;
+ }
+ &__title-row {
+ display: flex;
+ align-items: flex-start;
+ gap: 8px;
+ margin-bottom: 4px;
+ flex-wrap: wrap;
+ }
+ &__title {
+ font-size: 14px;
+ font-weight: 700;
+ color: $color-white;
+ }
+ &__date {
+ font-size: 12px;
+ color: $color-secondary;
+ margin-bottom: 3px;
+ }
+ &__meta {
+ font-size: 12px;
+ color: $color-secondary;
+ margin-bottom: 10px;
+ }
+ &__verified {
+ color: $color-green;
+ }
+ &__body {
+ font-size: 14px;
+ color: $color-light-2;
+ line-height: 1.65;
+ word-break: break-word;
+ }
+}
diff --git a/src/components/product/Reviews/ReviewCard/ReviewCard.tsx b/src/components/product/Reviews/ReviewCard/ReviewCard.tsx
new file mode 100644
index 00000000000..cb26ff52367
--- /dev/null
+++ b/src/components/product/Reviews/ReviewCard/ReviewCard.tsx
@@ -0,0 +1,29 @@
+import { Avatar } from '@components/product/Reviews/Avatar/Avatar';
+import { Stars } from '../Stars/Stars';
+import './ReviewCard.scss';
+
+interface Review {
+ id: number;
+ name: string;
+ score: number;
+ title: string;
+ date: string;
+ body: string;
+}
+
+export const ReviewCard = ({ review }: { review: Review }) => {
+ return (
+
+
+
+
+ {review.title}
+
+
{review.date}
+
{review.body}
+
+ );
+};
diff --git a/src/components/product/Reviews/ReviewsPage/ReviewsPage.scss b/src/components/product/Reviews/ReviewsPage/ReviewsPage.scss
new file mode 100644
index 00000000000..3a33a552406
--- /dev/null
+++ b/src/components/product/Reviews/ReviewsPage/ReviewsPage.scss
@@ -0,0 +1,56 @@
+@use '@styles/variables' as *;
+
+.reviews-page {
+ font-family: 'Mond', Arial, sans-serif;
+ background: $color-black;
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+ gap: 8px;
+ border-bottom: 1px solid $color-elements;
+ padding-bottom: 16px;
+ }
+
+ &__title {
+ font-size: 20px;
+ font-weight: 700;
+ color: $color-white;
+ @media (max-width: 480px) {
+ font-size: 17px;
+ }
+ }
+
+ &__back {
+ font-size: 12px;
+ font-weight: 700;
+ color: $color-light-1;
+ background: none;
+ border: none;
+ cursor: pointer;
+ text-decoration: none;
+ white-space: nowrap;
+ padding: 0;
+ transition: color $transition-default;
+ &:hover {
+ color: $color-accent;
+ text-decoration: none;
+ }
+ }
+
+ &__body {
+ display: flex;
+ gap: 32px;
+ align-items: flex-start;
+ flex-wrap: wrap;
+ }
+}
+
+.reviews-list {
+ flex: 1;
+ min-width: 0;
+ width: 100%;
+}
diff --git a/src/components/product/Reviews/ReviewsPage/ReviewsPage.tsx b/src/components/product/Reviews/ReviewsPage/ReviewsPage.tsx
new file mode 100644
index 00000000000..cbf6a42ca7e
--- /dev/null
+++ b/src/components/product/Reviews/ReviewsPage/ReviewsPage.tsx
@@ -0,0 +1,92 @@
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { WriteReview } from '../WriteReview/WriteReview';
+import { ReviewCard } from '../ReviewCard/ReviewCard';
+import { Stars } from '../Stars/Stars';
+import './ReviewsPage.scss';
+import { useReviews } from '@hooks/useReviews';
+
+export const ReviewsPage = ({
+ onBack,
+ productId,
+}: {
+ onBack: () => void;
+ productId: string;
+}) => {
+ const { t } = useTranslation();
+ const { reviews, loading, addReview, avgScore, ratings } =
+ useReviews(productId);
+ const [showWriteReview, setShowWriteReview] = useState(false);
+
+ if (showWriteReview) {
+ return (
+ setShowWriteReview(false)}
+ onSubmit={addReview}
+ />
+ );
+ }
+
+ return (
+
+
+
{t('reviews.title')}
+
+ {'<'} {t('reviews.back')}
+
+
+
+
+
+
+
+ {avgScore} {t('reviews.out_of')}
+
+
+
+ {reviews.length} {t('reviews.global_ratings')}
+
+ {ratings.map((r) => (
+
+
{r.label}
+
+
{r.pct}%
+
+ ))}
+
+
+ {t('reviews.write_title')}
+
+
{t('reviews.write_sub')}
+
setShowWriteReview(true)}
+ >
+ {t('reviews.write_btn')}
+
+
+
+
+ {loading &&
{t('auth.loading')}
}
+ {reviews.slice(0, 5).map((r) => (
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/components/product/Reviews/ReviewsPage/index.ts b/src/components/product/Reviews/ReviewsPage/index.ts
new file mode 100644
index 00000000000..3a4087bef74
--- /dev/null
+++ b/src/components/product/Reviews/ReviewsPage/index.ts
@@ -0,0 +1 @@
+export { ReviewsPage } from './ReviewsPage';
diff --git a/src/components/product/Reviews/Stars/Stars.scss b/src/components/product/Reviews/Stars/Stars.scss
new file mode 100644
index 00000000000..8d047794cc9
--- /dev/null
+++ b/src/components/product/Reviews/Stars/Stars.scss
@@ -0,0 +1,41 @@
+@use '@styles/variables' as *;
+
+.stars {
+ display: flex;
+ gap: 4px;
+ font-size: 24px;
+}
+
+.stars__item {
+ display: inline-block;
+ background: linear-gradient(
+ 90deg,
+ $color-accent var(--fill-percent, 0%),
+ $color-light-1 var(--fill-percent, 0%)
+ );
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.stars {
+ display: flex;
+ gap: 4px;
+ font-size: 24px;
+}
+
+.stars__item {
+ display: inline-block;
+ background: linear-gradient(
+ 90deg,
+ $color-accent var(--fill-percent, 0%),
+ $color-light-1 var(--fill-percent, 0%)
+ );
+
+ /* Для Safari / Chrome / Edge на MacBook */
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+
+ /* Стандарт для Firefox */
+ background-clip: text;
+ color: transparent;
+}
diff --git a/src/components/product/Reviews/Stars/Stars.tsx b/src/components/product/Reviews/Stars/Stars.tsx
new file mode 100644
index 00000000000..200f95bdc2f
--- /dev/null
+++ b/src/components/product/Reviews/Stars/Stars.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import './Stars.scss';
+
+interface StarsProps {
+ score: number;
+}
+
+export const Stars = ({ score }: StarsProps) => {
+ const totalStars = 5;
+
+ return (
+
+ {[...Array(totalStars)].map((_, i) => {
+ const fillPercent = Math.min(1, Math.max(0, score - i)) * 100;
+ return (
+
+ ★
+
+ );
+ })}
+
+ );
+};
diff --git a/src/components/product/Reviews/WriteReview/WriteReview.scss b/src/components/product/Reviews/WriteReview/WriteReview.scss
new file mode 100644
index 00000000000..2e33ec1a555
--- /dev/null
+++ b/src/components/product/Reviews/WriteReview/WriteReview.scss
@@ -0,0 +1,213 @@
+@use '@styles/variables' as *;
+
+.write-review {
+ font-family: 'Mont', Arial, sans-serif;
+ background: $color-black;
+ min-height: 100vh;
+ padding: 16px;
+
+ &__inner {
+ max-width: 680px;
+ margin: 0 auto;
+ }
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+ border-bottom: 1px solid $color-elements;
+ padding-bottom: 14px;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ &__title {
+ font-size: 20px;
+ font-weight: 700;
+ color: $color-white;
+ @media (max-width: 480px) {
+ font-size: 17px;
+ }
+ }
+
+ &__back {
+ font-size: 12px;
+ font-weight: 700;
+ color: $color-light-1;
+ background: none;
+ border: none;
+ cursor: pointer;
+ padding: 0;
+ transition: color $transition-default;
+ &:hover {
+ color: $color-accent;
+ text-decoration: none;
+ }
+ }
+
+ &__product {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 24px;
+ padding: 12px;
+ background: $color-surface-1;
+ border: 1px solid $color-elements;
+ border-radius: 8px;
+ flex-wrap: wrap;
+ }
+
+ &__product-img {
+ width: 56px;
+ height: 56px;
+ border-radius: 8px;
+ background: linear-gradient(135deg, $color-accent, #6c63ff);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26px;
+ flex-shrink: 0;
+ }
+
+ &__product-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: $color-white;
+ }
+ &__product-sub {
+ font-size: 12px;
+ color: $color-secondary;
+ margin-top: 2px;
+ }
+ &__section {
+ margin-bottom: 24px;
+ }
+ &__section-hover {
+ font-size: 13px;
+ color: $color-accent-hover;
+ margin-top: 6px;
+ }
+ &__section-title {
+ font-size: 15px;
+ font-weight: 700;
+ color: $color-white;
+ margin-bottom: 10px;
+ }
+
+ &__input {
+ width: 100%;
+ padding: 10px 12px;
+ font-size: 15px;
+ background: $color-surface-2;
+ border: 1px solid $color-elements;
+ border-radius: 6px;
+ outline: none;
+ box-sizing: border-box;
+ color: $color-white;
+ -webkit-appearance: none;
+ transition:
+ border-color $transition-default,
+ box-shadow $transition-default;
+ &::placeholder {
+ color: $color-secondary;
+ }
+ &:focus {
+ border-color: $color-accent;
+ box-shadow: 0 0 0 3px rgba(144, 91, 255, 0.25);
+ }
+ }
+
+ &__textarea {
+ width: 100%;
+ padding: 10px 12px;
+ font-size: 15px;
+ background: $color-surface-2;
+ border: 1px solid $color-elements;
+ border-radius: 6px;
+ outline: none;
+ box-sizing: border-box;
+ resize: vertical;
+ min-height: 120px;
+ font-family: 'Mont', Arial, sans-serif;
+ color: $color-white;
+ -webkit-appearance: none;
+ transition:
+ border-color $transition-default,
+ box-shadow $transition-default;
+ &::placeholder {
+ color: $color-secondary;
+ }
+ &:focus {
+ border-color: $color-accent;
+ box-shadow: 0 0 0 3px rgba(144, 91, 255, 0.25);
+ }
+ }
+
+ &__hint {
+ font-size: 12px;
+ color: $color-secondary;
+ margin-top: 5px;
+ }
+ &__actions {
+ display: flex;
+ gap: 12px;
+ margin-top: 28px;
+ flex-wrap: wrap;
+ }
+
+ &__submit {
+ padding: 11px 28px;
+ font-size: 14px;
+ font-weight: 600;
+ background: $color-accent;
+ border: none;
+ border-radius: 6px;
+ cursor: pointer;
+ color: $color-white;
+ -webkit-appearance: none;
+ transition: background $transition-default;
+ &:disabled {
+ opacity: 0.4;
+ cursor: not-allowed;
+ }
+ &:not(:disabled):hover {
+ background: $color-accent-hover;
+ }
+ }
+
+ &__cancel {
+ padding: 11px 28px;
+ font-size: 14px;
+ background: $color-surface-2;
+ border: 1px solid $color-elements;
+ border-radius: 6px;
+ cursor: pointer;
+ color: $color-white;
+ -webkit-appearance: none;
+ transition: background $transition-default;
+ &:hover {
+ background: $color-icons;
+ }
+ }
+
+ &__success {
+ text-align: center;
+ padding: 48px 16px;
+ }
+ &__success-icon {
+ font-size: 52px;
+ margin-bottom: 16px;
+ }
+ &__success-title {
+ font-size: 20px;
+ font-weight: 700;
+ color: $color-white;
+ margin-bottom: 8px;
+ }
+ &__success-sub {
+ font-size: 14px;
+ color: $color-secondary;
+ margin-bottom: 24px;
+ }
+}
diff --git a/src/components/product/Reviews/WriteReview/WriteReview.tsx b/src/components/product/Reviews/WriteReview/WriteReview.tsx
new file mode 100644
index 00000000000..f3d1da7c8e7
--- /dev/null
+++ b/src/components/product/Reviews/WriteReview/WriteReview.tsx
@@ -0,0 +1,176 @@
+import { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import './WriteReview.scss';
+
+interface Props {
+ onBack: () => void;
+ onSubmit: (data: {
+ name: string;
+ score: number;
+ title: string;
+ body: string;
+ }) => Promise;
+}
+
+export const WriteReview = ({ onBack, onSubmit }: Props) => {
+ const { t } = useTranslation();
+
+ const [starScore, setStarScore] = useState(0);
+ const [hoverScore, setHoverScore] = useState(0);
+ const [name, setName] = useState('');
+ const [title, setTitle] = useState('');
+ const [body, setBody] = useState('');
+ const [submitted, setSubmitted] = useState(false);
+ const [loading, setLoading] = useState(false);
+
+ const starLabels = (t('write_review.star_labels', {
+ returnObjects: true,
+ }) as string[]) || [
+ '',
+ 'I hate it',
+ "I don't like it",
+ "It's OK",
+ 'I like it',
+ 'I love it',
+ ];
+
+ const canSubmit =
+ starScore > 0 &&
+ name.trim().length > 0 &&
+ title.trim().length > 0 &&
+ body.length >= 20;
+
+ async function handleSubmit() {
+ if (!canSubmit) return;
+ setLoading(true);
+ const ok = await onSubmit({ name, score: starScore, title, body });
+ setLoading(false);
+ if (ok) setSubmitted(true);
+ }
+
+ if (submitted) {
+ return (
+
+
+
+
✅
+
+ {t('write_review.success_title')}
+
+
+ {t('write_review.success_sub')}
+
+
+ {'<'} {t('write_review.back_to')}
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
{t('write_review.title')}
+
+ {'<'} {t('write_review.back')}
+
+
+
+
+
+ {t('write_review.name_label', 'Your name')}
+
+
setName(e.target.value)}
+ maxLength={50}
+ />
+
+
+
+
+ {t('write_review.overall_rating', 'Overall rating')}
+
+
+ {[1, 2, 3, 4, 5].map((n) => (
+ = n ? ' star-picker__star--active' : ''}`}
+ onMouseEnter={() => setHoverScore(n)}
+ onMouseLeave={() => setHoverScore(0)}
+ onClick={() => setStarScore(n)}
+ >
+ ★
+
+ ))}
+
+ {(hoverScore || starScore) > 0 && (
+
+ {starLabels[hoverScore || starScore]}
+
+ )}
+
+
+
+
+ {t('write_review.headline')}
+
+
setTitle(e.target.value)}
+ maxLength={150}
+ />
+
+
+
+
+ {t('write_review.written')}
+
+
+
+
+
+ {loading ?
+ t('write_review.submitting', 'Submitting...')
+ : t('write_review.submit', 'Submit')}
+
+
+ {t('write_review.cancel')}
+
+
+
+
+ );
+};
diff --git a/src/components/product/TechSpecs/TechSpecs.scss b/src/components/product/TechSpecs/TechSpecs.scss
new file mode 100644
index 00000000000..3d80d690132
--- /dev/null
+++ b/src/components/product/TechSpecs/TechSpecs.scss
@@ -0,0 +1,43 @@
+@use '@/styles/variables' as *;
+
+.TechSpecs {
+ &__title {
+ font-size: 20px;
+ color: $color-light-1;
+ font-weight: 700;
+ line-height: 100%;
+ letter-spacing: 0%;
+ margin-top: 10px;
+
+ &::after {
+ content: '';
+ display: block;
+ height: 1px;
+ width: 100%;
+ background-color: $color-elements;
+ margin-top: 16px;
+ margin-bottom: 30px;
+ }
+ }
+
+ &__item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 8px;
+ font-weight: 600;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 12px;
+ line-height: 15px;
+ }
+
+ &__value {
+ color: $color-light-1;
+ font-weight: 600;
+ letter-spacing: 0%;
+ }
+
+ &__name {
+ color: $color-secondary;
+ }
+}
diff --git a/src/components/product/TechSpecs/TechSpecs.tsx b/src/components/product/TechSpecs/TechSpecs.tsx
new file mode 100644
index 00000000000..569cd935fff
--- /dev/null
+++ b/src/components/product/TechSpecs/TechSpecs.tsx
@@ -0,0 +1,57 @@
+import './TechSpecs.scss';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+
+type Props = {
+ screen: string;
+ resolution: string;
+ processor: string;
+ ram: string;
+ capacity?: string;
+ camera?: string;
+ zoom?: string;
+ cell?: string[];
+};
+
+export const TechSpecs: React.FC = ({
+ screen,
+ resolution,
+ processor,
+ ram,
+ capacity,
+ camera,
+ zoom,
+ cell,
+}) => {
+ const { t } = useTranslation();
+
+ const specs = [
+ { label: t('product.screen'), value: screen },
+ { label: t('product.resolution'), value: resolution },
+ { label: t('product_details.processor'), value: processor },
+ { label: t('product.ram'), value: ram },
+ { label: t('product.capacity'), value: capacity },
+ { label: t('product_details.camera'), value: camera },
+ { label: t('product_details.zoom'), value: zoom },
+ { label: t('product_details.cell'), value: cell?.join(', ') },
+ ];
+
+ return (
+
+
{t('product_details.tech_specs')}
+
+ {specs.map(
+ (spec) =>
+ spec.value && (
+
+ {spec.label}
+ {spec.value}
+
+ ),
+ )}
+
+ );
+};
diff --git a/src/components/ui/Banner/Banner.scss b/src/components/ui/Banner/Banner.scss
new file mode 100644
index 00000000000..cf44004d2db
--- /dev/null
+++ b/src/components/ui/Banner/Banner.scss
@@ -0,0 +1,134 @@
+@use '@styles/variables' as *;
+
+.banner {
+ display: grid;
+ grid-template-columns: 32px 1fr 32px;
+ grid-template-rows: auto auto;
+ grid-template-areas:
+ 'prev slider next'
+ '. dots . ';
+ column-gap: 16px;
+ align-items: stretch;
+ width: 100%;
+ margin: 0;
+
+ @media (max-width: 639px) {
+ grid-template-columns: 1fr;
+ grid-template-areas:
+ 'slider'
+ 'dots';
+ margin: 0;
+ }
+
+ &__arrow {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: transparent;
+ border: 1px solid $color-surface-2;
+ cursor: pointer;
+ padding: 0;
+ width: 32px;
+ transition: all 0.2s;
+ border-radius: 8px;
+
+ &::before {
+ content: '';
+ display: block;
+ width: 6px;
+ height: 10px;
+ background-color: $color-icons;
+ mask-image: url('/src/assets/icons/vector-black.svg');
+ mask-repeat: no-repeat;
+ mask-position: center;
+ mask-size: contain;
+ transition: background-color 0.2s;
+ }
+
+ &:hover {
+ background-color: $color-surface;
+
+ &::before {
+ background-color: $color-white;
+ }
+ }
+
+ &--prev {
+ grid-area: prev;
+
+ &::before {
+ transform: rotate(180deg);
+ }
+
+ @media (max-width: 639px) {
+ display: none;
+ }
+ }
+
+ &--next {
+ grid-area: next;
+
+ @media (max-width: 639px) {
+ display: none;
+ }
+ }
+ }
+
+ &__slider {
+ grid-area: slider;
+ overflow: hidden;
+ width: 100%;
+
+ .swiper {
+ width: 100%;
+ height: 100%;
+ }
+ }
+
+ &__image {
+ width: 100%;
+ display: block;
+ object-fit: cover;
+ height: 400px;
+
+ @media (min-width: 640px) and (max-width: 1199px) {
+ height: 340px;
+ }
+
+ @media (max-width: 639px) {
+ height: auto;
+ aspect-ratio: 1 / 1;
+ max-width: 100%;
+ }
+ }
+
+ &__pagination {
+ grid-area: dots;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 8px;
+ padding-top: 18px;
+
+ .swiper-pagination-bullet {
+ width: 14px !important;
+ height: 4px !important;
+ border-radius: 2px !important;
+ background: $color-surface-2 !important;
+ opacity: 1 !important;
+ transition: all 0.3s !important;
+ cursor: pointer;
+ margin: 0 !important;
+ }
+
+ .swiper-pagination-bullet-active {
+ background: $color-white !important;
+ width: 32px !important;
+ }
+ }
+}
+
+.swiper-button-prev,
+.swiper-button-next {
+ display: none !important;
+}
diff --git a/src/components/ui/Banner/Banner.tsx b/src/components/ui/Banner/Banner.tsx
new file mode 100644
index 00000000000..aabfddfdbd6
--- /dev/null
+++ b/src/components/ui/Banner/Banner.tsx
@@ -0,0 +1,98 @@
+import { Swiper, SwiperSlide } from 'swiper/react';
+import { Autoplay, Pagination, Navigation } from 'swiper/modules';
+
+import 'swiper/css';
+import 'swiper/css/pagination';
+import 'swiper/css/navigation';
+import './Banner.scss';
+
+export const Banner = () => {
+ return (
+
+ );
+};
diff --git a/src/components/ui/Breadcrumbs/Breadcrumbs.module.scss b/src/components/ui/Breadcrumbs/Breadcrumbs.module.scss
new file mode 100644
index 00000000000..886679e4c18
--- /dev/null
+++ b/src/components/ui/Breadcrumbs/Breadcrumbs.module.scss
@@ -0,0 +1,48 @@
+@use '@styles/variables' as *;
+
+.breadcrumbs {
+ display: flex;
+ margin-top: 24px;
+ align-items: center;
+ gap: 8px;
+
+ &__home {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ img {
+ width: 16px;
+ height: 16px;
+ object-fit: contain;
+ transition: filter 0.2s ease;
+ filter: $icon-filter;
+ }
+ }
+
+ &__separator {
+ color: $color-secondary;
+ font-size: 12px;
+ }
+
+ &__link {
+ color: $color-secondary;
+ text-decoration: none;
+ font-style: normal;
+ font-weight: 600;
+ font-size: 12px;
+ line-height: 15px;
+
+ &:hover {
+ color: $color-secondary;
+ }
+ }
+
+ &__current {
+ color: $color-secondary;
+ font-style: normal;
+ font-weight: 600;
+ font-size: 12px;
+ line-height: 15px;
+ }
+}
diff --git a/src/components/ui/Breadcrumbs/Breadcrumbs.tsx b/src/components/ui/Breadcrumbs/Breadcrumbs.tsx
new file mode 100644
index 00000000000..2219af08450
--- /dev/null
+++ b/src/components/ui/Breadcrumbs/Breadcrumbs.tsx
@@ -0,0 +1,76 @@
+import { Link, useLocation, useParams } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import s from './Breadcrumbs.module.scss';
+import homeDarkIcon from '@/assets/icons/home.svg';
+
+export const Breadcrumbs = () => {
+ const { t } = useTranslation();
+ const location = useLocation();
+ const { productId } = useParams<{ productId: string }>();
+
+ const pathParts = location.pathname.split('/').filter(Boolean);
+
+ if (pathParts.length === 0) return null;
+
+ const categoryName = pathParts[0];
+
+ const getTranslationKey = (category: string) => {
+ if (category === 'phones') return 'nav.phones';
+ if (category === 'tablets') return 'nav.tablets';
+ if (category === 'accessories') return 'nav.accessories';
+ if (category === 'favourites') return 'nav.favourites';
+
+ if (category === 'profile') return 'profile.title';
+ if (category === 'cart') return 'cart.title';
+ if (category === 'checkout') return 'checkout.title';
+ if (category === 'orders') return 'orders.title';
+ if (category === 'admin') return 'admin.title';
+
+ return category;
+ };
+
+ const formatProductName = (id: string) => {
+ return id
+ .split('-')
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
+ .join(' ');
+ };
+
+ return (
+
+
+
+
+
+ >
+
+ {productId ?
+
+ {t(getTranslationKey(categoryName))}
+
+ :
+ {t(getTranslationKey(categoryName))}
+
+ }
+
+ {productId && (
+ <>
+ >
+
+ {formatProductName(productId)}
+
+ >
+ )}
+
+ );
+};
diff --git a/src/components/ui/Buttons/Back/BackButton.scss b/src/components/ui/Buttons/Back/BackButton.scss
new file mode 100644
index 00000000000..c32c3454216
--- /dev/null
+++ b/src/components/ui/Buttons/Back/BackButton.scss
@@ -0,0 +1,70 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.buttonBack {
+ margin-top: 24px;
+ text-decoration: none;
+ font-weight: 700;
+ letter-spacing: 0%;
+ line-height: 100%;
+ font-size: 12px;
+
+ @include on-tablet() {
+ margin-top: 40px;
+ }
+
+ &Link {
+ text-decoration: none;
+ color: $color-light-1;
+ font-size: 12px;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ transition: color $transition-default;
+
+ &:hover {
+ color: $color-accent;
+ }
+
+ &::before {
+ content: '<';
+ font-size: 12px;
+ font-weight: 600;
+ }
+ }
+}
+
+.buttonBack {
+ margin-top: 24px;
+
+ @include on-tablet() {
+ margin-top: 40px;
+ }
+
+ &Link {
+ background: none;
+ border: none;
+ padding: 0;
+ cursor: pointer;
+ text-decoration: none;
+ color: $color-light-1;
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0%;
+ line-height: 100%;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ transition: color $transition-default;
+
+ &:hover {
+ color: $color-accent;
+ }
+
+ &::before {
+ content: '<';
+ font-size: 12px;
+ font-weight: 600;
+ }
+ }
+}
diff --git a/src/components/ui/Buttons/Back/BackButton.tsx b/src/components/ui/Buttons/Back/BackButton.tsx
new file mode 100644
index 00000000000..503f77f545c
--- /dev/null
+++ b/src/components/ui/Buttons/Back/BackButton.tsx
@@ -0,0 +1,19 @@
+import { useNavigate } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import './BackButton.scss';
+
+export const BackButton = () => {
+ const { t } = useTranslation();
+ const navigate = useNavigate();
+
+ return (
+
+ navigate(-1)}
+ >
+ {t('product_details.back')}
+
+
+ );
+};
diff --git a/src/components/ui/Dropdown/Dropdown.module.scss b/src/components/ui/Dropdown/Dropdown.module.scss
new file mode 100644
index 00000000000..a8d070e6887
--- /dev/null
+++ b/src/components/ui/Dropdown/Dropdown.module.scss
@@ -0,0 +1,60 @@
+@use '@styles/variables' as *;
+
+.dropdown {
+ position: relative;
+ width: 162px;
+}
+
+.dropdown__button {
+ width: 100%;
+ height: 40px;
+ padding: 0 12px;
+
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ background: $bg-card;
+ border: 1px solid $color-border;
+ border-radius: 8px;
+
+ color: $color-text-primary;
+ cursor: pointer;
+}
+
+.dropdown__list {
+ position: absolute;
+ top: calc(100% + 6px);
+ left: 0;
+ width: 100%;
+
+ background: $bg-surface;
+ border: 1px solid $color-border;
+ border-radius: 8px;
+
+ overflow: hidden;
+ z-index: 1;
+}
+
+.dropdown__item {
+ padding: 10px 12px;
+ cursor: pointer;
+ transition: background $transition-default;
+
+ &:hover {
+ background: $bg-card-1;
+ }
+}
+
+.active {
+ background: $bg-card-1;
+}
+
+.arrow {
+ font-size: 10px;
+ transition: transform $transition-default;
+}
+
+.arrowOpen {
+ transform: rotate(180deg);
+}
diff --git a/src/components/ui/Dropdown/Dropdown.tsx b/src/components/ui/Dropdown/Dropdown.tsx
new file mode 100644
index 00000000000..e418f12445e
--- /dev/null
+++ b/src/components/ui/Dropdown/Dropdown.tsx
@@ -0,0 +1,83 @@
+import React, { useState, useRef, useEffect } from 'react';
+import classNames from 'classnames';
+import s from './Dropdown.module.scss';
+import arrowDownIcon from '@/assets/icons/arrow-down.svg';
+
+type Option = {
+ label: string;
+ value: string;
+};
+
+type Props = {
+ options: Option[];
+ value: string;
+ onChange: (value: string) => void;
+};
+
+export const Dropdown: React.FC = ({ options, value, onChange }) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const dropdownRef = useRef(null);
+
+ const selected = options.find((opt) => opt.value === value);
+
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (
+ dropdownRef.current &&
+ !dropdownRef.current.contains(event.target as Node)
+ ) {
+ setIsOpen(false);
+ }
+ };
+
+ document.addEventListener('mousedown', handleClickOutside);
+
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, []);
+
+ return (
+
+
setIsOpen((prev) => !prev)}
+ >
+ {selected?.label}
+
+
+
+
+
+ {isOpen && (
+
+ {options.map((option) => (
+ {
+ onChange(option.value);
+ setIsOpen(false);
+ }}
+ >
+ {option.label}
+
+ ))}
+
+ )}
+
+ );
+};
diff --git a/src/components/ui/Loader/Loader.module.scss b/src/components/ui/Loader/Loader.module.scss
new file mode 100644
index 00000000000..11e3caeba29
--- /dev/null
+++ b/src/components/ui/Loader/Loader.module.scss
@@ -0,0 +1,65 @@
+@use '@styles/variables' as *;
+
+.loader {
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ position: relative;
+ animation: rotate 1s linear infinite;
+
+ @media (min-width: 640px) {
+ width: 72px;
+ height: 72px;
+ }
+
+ @media (min-width: 1024px) {
+ width: 96px;
+ height: 96px;
+ }
+}
+
+.loader::before,
+.loader::after {
+ content: '';
+ box-sizing: border-box;
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+ border: 5px solid $color-text-primary;
+ animation: prixClipFix 2s linear infinite;
+}
+
+.loader::after {
+ border-color: $color-accent;
+ animation:
+ prixClipFix 2s linear infinite,
+ rotate 0.5s linear infinite reverse;
+ inset: 6px;
+}
+
+@keyframes rotate {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes prixClipFix {
+ 0% {
+ clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0);
+ }
+ 25% {
+ clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0);
+ }
+ 50% {
+ clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%);
+ }
+ 75% {
+ clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%);
+ }
+ 100% {
+ clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0);
+ }
+}
diff --git a/src/components/ui/Loader/Loader.tsx b/src/components/ui/Loader/Loader.tsx
new file mode 100644
index 00000000000..39045b1dbcd
--- /dev/null
+++ b/src/components/ui/Loader/Loader.tsx
@@ -0,0 +1,3 @@
+import styles from './Loader.module.scss';
+
+export const Loader = () => ;
diff --git a/src/components/ui/Loader/index.ts b/src/components/ui/Loader/index.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/components/ui/NoResults/NoResults.tsx b/src/components/ui/NoResults/NoResults.tsx
new file mode 100644
index 00000000000..bea2ffed773
--- /dev/null
+++ b/src/components/ui/NoResults/NoResults.tsx
@@ -0,0 +1,32 @@
+import { useTranslation } from 'react-i18next';
+import styles from './NoResults.module.scss';
+import searchX from './image/search-x.svg';
+
+interface Props {
+ category?: string;
+}
+
+export const NoResults = ({ category = 'products' }: Props) => {
+ const { t } = useTranslation();
+
+ const getCategoryKey = (cat: string) => {
+ if (cat === 'phones') return t('nav.phones').toLowerCase();
+ if (cat === 'tablets') return t('nav.tablets').toLowerCase();
+ if (cat === 'accessories') return t('nav.accessories').toLowerCase();
+ return t('catalog.products');
+ };
+
+ return (
+
+
+
+ {t('catalog.no_found', { category: getCategoryKey(category) })}
+
+
{t('catalog.no_results_message')}
+
+ );
+};
diff --git a/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.module.scss b/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.module.scss
new file mode 100644
index 00000000000..9c4370a588e
--- /dev/null
+++ b/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.module.scss
@@ -0,0 +1,27 @@
+@use '@styles/variables' as *;
+
+.emptyOrders {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+ padding: 80px 24px;
+ text-align: center;
+
+ &__icon {
+ font-size: 56px;
+ opacity: 0.35;
+ }
+
+ &__text {
+ color: $color-light-1;
+ font-size: 18px;
+ font-weight: 700;
+ }
+
+ &__sub {
+ color: #75778b;
+ font-size: 14px;
+ }
+}
diff --git a/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.tsx b/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.tsx
new file mode 100644
index 00000000000..fc5d20ac060
--- /dev/null
+++ b/src/components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './EmptyOrders.module.scss';
+
+export const EmptyOrders: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
📦
+
{t('orders.empty_title')}
+
{t('orders.empty_sub')}
+
+ );
+};
diff --git a/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.module.scss b/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.module.scss
new file mode 100644
index 00000000000..2741f8f08a8
--- /dev/null
+++ b/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.module.scss
@@ -0,0 +1,126 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.orderCard {
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ overflow: hidden;
+ transition: border-color 0.2s ease;
+
+ &:hover {
+ border-color: #5c5f7a;
+ }
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-bottom: 1px solid #3b3e56;
+ }
+
+ &__meta {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ }
+
+ &__id {
+ color: $color-light-1;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &__date {
+ color: #75778b;
+ font-size: 12px;
+ }
+
+ &__status {
+ font-size: 12px;
+ font-weight: 700;
+ padding: 4px 12px;
+ border-radius: 20px;
+
+ &--delivered {
+ background: rgba(52, 199, 89, 0.12);
+ color: #34c759;
+ }
+
+ &--processing {
+ background: rgba(255, 159, 10, 0.12);
+ color: #ff9f0a;
+ }
+
+ &--cancelled {
+ background: rgba(255, 69, 58, 0.12);
+ color: #ff453a;
+ }
+ }
+
+ &__items {
+ display: flex;
+ flex-direction: column;
+ padding: 8px 0;
+ }
+
+ &__footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-top: 1px solid #3b3e56;
+ }
+
+ &__totalLabel {
+ color: #75778b;
+ font-size: 14px;
+ }
+
+ &__total {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 20px;
+ }
+}
+
+.orderItem {
+ display: grid;
+ grid-template-columns: 56px 1fr auto auto;
+ align-items: center;
+ gap: 16px;
+ padding: 12px 20px;
+
+ & + & {
+ border-top: 1px solid #23253a;
+ }
+
+ &__image {
+ width: 56px;
+ height: 56px;
+ object-fit: contain;
+ border-radius: 8px;
+ background: #1e2035;
+ }
+
+ &__name {
+ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 1.4;
+ }
+
+ &__qty {
+ color: #75778b;
+ font-size: 13px;
+ white-space: nowrap;
+ }
+
+ &__price {
+ color: $color-light-1;
+ font-weight: 700;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+}
diff --git a/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.tsx b/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.tsx
new file mode 100644
index 00000000000..86e4c1bd8aa
--- /dev/null
+++ b/src/components/ui/Profile/CartHistory/OrderCard/OrderCard.tsx
@@ -0,0 +1,64 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './OrderCard.module.scss';
+import { Order } from '@/types/CartOrder';
+
+export const OrderCard: React.FC<{ order: Order }> = ({ order }) => {
+ const { t } = useTranslation();
+
+ const getStatusLabel = (status: Order['status']) => {
+ switch (status) {
+ case 'delivered':
+ return t('orders.status_delivered');
+ case 'processing':
+ return t('orders.status_processing');
+ case 'cancelled':
+ return t('orders.status_cancelled');
+ default:
+ return status;
+ }
+ };
+
+ return (
+
+
+
+ {order.id}
+ {order.date}
+
+
+ {getStatusLabel(order.status)}
+
+
+
+
+ {order.items.map((item) => (
+
+
+
{item.name}
+
× {item.quantity}
+
${item.price}
+
+ ))}
+
+
+
+
+ {t('orders.total')}
+
+
+ ${order.total.toFixed(2)}
+
+
+
+ );
+};
diff --git a/src/constants/config.ts b/src/constants/config.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/constants/routes.ts b/src/constants/routes.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/context/AppContext.tsx b/src/context/AppContext.tsx
new file mode 100644
index 00000000000..82d60353e31
--- /dev/null
+++ b/src/context/AppContext.tsx
@@ -0,0 +1,22 @@
+import { createContext } from 'react';
+import { BaseProduct } from '@/types/Product';
+import { CartItem } from '@/types/Cart';
+
+export interface AppContextValue {
+ cartItems: CartItem[];
+ addToCart: (product: BaseProduct) => void;
+ removeFromCart: (productId: string) => void;
+ toggleCart: (product: BaseProduct) => void;
+ updateQuantity: (productId: string, quantity: number) => void;
+ clearCart: () => void;
+ totalPrice: number;
+ totalItems: number;
+ isInCart: (product: BaseProduct) => boolean;
+
+ favorites: string[];
+ toggleFavorite: (product: BaseProduct) => void;
+ isFavorite: (productId: string) => boolean;
+ favoritesCount: number;
+}
+
+export const AppContext = createContext(undefined);
diff --git a/src/context/AppProvider.tsx b/src/context/AppProvider.tsx
new file mode 100644
index 00000000000..2c077ba3e08
--- /dev/null
+++ b/src/context/AppProvider.tsx
@@ -0,0 +1,205 @@
+import React, {
+ useState,
+ ReactNode,
+ useEffect,
+ useMemo,
+ useCallback,
+} from 'react';
+import { BaseProduct } from '@/types/Product';
+import { CartItem } from '@/types/Cart';
+import { AppContext } from './AppContext';
+import { notify } from '@utils/notifications';
+
+interface AppProviderProps {
+ children: ReactNode;
+}
+
+export const AppProvider: React.FC = ({ children }) => {
+ const [cartItems, setCartItems] = useState(() => {
+ if (typeof window === 'undefined') return [];
+ try {
+ const savedCart = localStorage.getItem('cart');
+ return savedCart ? JSON.parse(savedCart) : [];
+ } catch {
+ return [];
+ }
+ });
+
+ const [favorites, setFavorites] = useState(() => {
+ if (typeof window === 'undefined') return [];
+ try {
+ const saved = localStorage.getItem('favorites');
+ return saved ? JSON.parse(saved) : [];
+ } catch {
+ return [];
+ }
+ });
+
+ useEffect(() => {
+ localStorage.setItem('cart', JSON.stringify(cartItems));
+ }, [cartItems]);
+
+ useEffect(() => {
+ localStorage.setItem('favorites', JSON.stringify(favorites));
+ }, [favorites]);
+
+ const getItemUniqueId = useCallback(
+ (product: BaseProduct) =>
+ String('itemId' in product ? product.itemId : product.id),
+ [],
+ );
+
+ const addToCart = useCallback(
+ (product: BaseProduct) => {
+ const normalizedProduct = {
+ ...product,
+ priceDiscount: product.priceDiscount ?? product.price ?? 0,
+ priceRegular: product.priceRegular ?? product.fullPrice ?? 0,
+ };
+
+ const itemUniqueId = getItemUniqueId(normalizedProduct);
+
+ setCartItems((prev) => {
+ const existing = prev.find(
+ (item) => item.itemUniqueId === itemUniqueId,
+ );
+
+ if (existing) {
+ return prev.map((item) =>
+ item.itemUniqueId === itemUniqueId ?
+ { ...item, quantity: item.quantity + 1 }
+ : item,
+ );
+ }
+
+ return [...prev, { ...normalizedProduct, quantity: 1, itemUniqueId }];
+ });
+ },
+ [getItemUniqueId],
+ );
+
+ const removeFromCart = useCallback((itemUniqueId: string) => {
+ setCartItems((prev) => {
+ const item = prev.find((i) => i.itemUniqueId === itemUniqueId);
+ if (item) notify.removedFromCart(item.name);
+ return prev.filter((i) => i.itemUniqueId !== itemUniqueId);
+ });
+ }, []);
+
+ const updateQuantity = useCallback(
+ (itemUniqueId: string, quantity: number) => {
+ if (quantity <= 0) {
+ removeFromCart(itemUniqueId);
+ return;
+ }
+
+ setCartItems((prev) =>
+ prev.map((item) =>
+ item.itemUniqueId === itemUniqueId ? { ...item, quantity } : item,
+ ),
+ );
+ },
+ [removeFromCart],
+ );
+
+ const clearCart = useCallback(() => {
+ setCartItems([]);
+ }, []);
+
+ const isInCart = useCallback(
+ (product: BaseProduct) => {
+ const id = getItemUniqueId(product);
+ return cartItems.some((item) => item.itemUniqueId === id);
+ },
+ [cartItems, getItemUniqueId],
+ );
+
+ const toggleCart = useCallback(
+ (product: BaseProduct) => {
+ const id = getItemUniqueId(product);
+ if (cartItems.some((item) => item.itemUniqueId === id)) {
+ removeFromCart(id);
+ } else {
+ addToCart(product);
+ notify.addedToCart(product.name);
+ }
+ },
+ [cartItems, getItemUniqueId, addToCart, removeFromCart],
+ );
+
+ const toggleFavorite = useCallback(
+ (product: BaseProduct) => {
+ const id = getItemUniqueId(product);
+
+ setFavorites((prev) => {
+ const exists = prev.includes(id);
+
+ if (exists) {
+ notify.removedFromFavorites(product.name);
+ return prev.filter((fav) => fav !== id);
+ }
+
+ notify.addedToFavorites(product.name);
+ return [...prev, id];
+ });
+ },
+ [getItemUniqueId],
+ );
+
+ const isFavorite = useCallback(
+ (productId: string) => favorites.includes(String(productId)),
+ [favorites],
+ );
+
+ const totalPrice = useMemo(
+ () =>
+ cartItems.reduce(
+ (total, item) =>
+ total + (item.priceDiscount ?? item.price) * item.quantity,
+ 0,
+ ),
+ [cartItems],
+ );
+
+ const totalItems = useMemo(
+ () => cartItems.reduce((total, item) => total + item.quantity, 0),
+ [cartItems],
+ );
+
+ const favoritesCount = useMemo(() => favorites.length, [favorites]);
+
+ const value = useMemo(
+ () => ({
+ cartItems,
+ addToCart,
+ removeFromCart,
+ toggleCart,
+ updateQuantity,
+ clearCart,
+ totalPrice,
+ totalItems,
+ isInCart,
+ favorites,
+ toggleFavorite,
+ isFavorite,
+ favoritesCount,
+ }),
+ [
+ cartItems,
+ favorites,
+ totalPrice,
+ totalItems,
+ favoritesCount,
+ addToCart,
+ removeFromCart,
+ toggleCart,
+ updateQuantity,
+ clearCart,
+ isInCart,
+ toggleFavorite,
+ isFavorite,
+ ],
+ );
+
+ return {children} ;
+};
diff --git a/src/context/index.ts b/src/context/index.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/hooks/useAppContext.ts b/src/hooks/useAppContext.ts
new file mode 100644
index 00000000000..f2a71544764
--- /dev/null
+++ b/src/hooks/useAppContext.ts
@@ -0,0 +1,12 @@
+import { useContext } from 'react';
+import { AppContext } from '@context/AppContext';
+
+export const useAppContext = () => {
+ const context = useContext(AppContext);
+
+ if (!context) {
+ throw new Error('useAppContext must be used within AppProvider');
+ }
+
+ return context;
+};
diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/hooks/usePagination.ts b/src/hooks/usePagination.ts
new file mode 100644
index 00000000000..fcea9cfba52
--- /dev/null
+++ b/src/hooks/usePagination.ts
@@ -0,0 +1,36 @@
+import { useMemo } from 'react';
+
+export const usePagination = (
+ currentPage: number,
+ totalPages: number,
+ siblingCount = 1,
+) => {
+ return useMemo<(number | string)[]>(() => {
+ const pages: (number | string)[] = [];
+
+ const left = Math.max(currentPage - siblingCount, 1);
+ const right = Math.min(currentPage + siblingCount, totalPages);
+
+ pages.push(1);
+
+ if (left > 2) {
+ pages.push('...');
+ }
+
+ for (let i = left; i <= right; i++) {
+ if (i !== 1 && i !== totalPages) {
+ pages.push(i);
+ }
+ }
+
+ if (right < totalPages - 1) {
+ pages.push('...');
+ }
+
+ if (totalPages > 1) {
+ pages.push(totalPages);
+ }
+
+ return pages;
+ }, [currentPage, totalPages, siblingCount]);
+};
diff --git a/src/hooks/usePaginationWithParams.ts b/src/hooks/usePaginationWithParams.ts
new file mode 100644
index 00000000000..54ef7f5bf38
--- /dev/null
+++ b/src/hooks/usePaginationWithParams.ts
@@ -0,0 +1,62 @@
+import { useEffect } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+
+export type SortType = 'newest' | 'oldest' | 'priceLow' | 'priceHigh';
+
+interface Props {
+ basePath: string;
+ defaultItems?: number;
+ defaultSort?: SortType;
+}
+
+export const usePaginationWithParams = ({
+ basePath,
+ defaultItems = 12,
+ defaultSort = 'newest',
+}: Props) => {
+ const navigate = useNavigate();
+ const { items, sort, page } = useParams();
+
+ const itemsOnPage = items ? Number(items) : defaultItems;
+ const sortBy = (sort as SortType) || defaultSort;
+ const currentPage = page ? Number(page) : 1;
+
+ useEffect(() => {
+ const hasAllParams = items && sort && page;
+
+ if (!hasAllParams) {
+ navigate(`${basePath}/${defaultItems}/${defaultSort}/1`, {
+ replace: true,
+ });
+ }
+}, [
+ basePath,
+ defaultItems,
+ defaultSort,
+ items,
+ navigate,
+ page,
+ sort,
+]);
+
+ const changeSort = (value: SortType) => {
+ navigate(`${basePath}/${itemsOnPage}/${value}/1`);
+ };
+
+ const changeItems = (value: number) => {
+ navigate(`${basePath}/${value}/${sortBy}/1`);
+ };
+
+ const changePage = (value: number) => {
+ navigate(`${basePath}/${itemsOnPage}/${sortBy}/${value}`);
+ };
+
+ return {
+ sortBy,
+ itemsOnPage,
+ currentPage,
+ changeSort,
+ changeItems,
+ changePage,
+ };
+};
diff --git a/src/hooks/useRealTime.tsx b/src/hooks/useRealTime.tsx
new file mode 100644
index 00000000000..f33a5a63dd9
--- /dev/null
+++ b/src/hooks/useRealTime.tsx
@@ -0,0 +1,43 @@
+import { useEffect, useRef } from 'react';
+import { supabase } from '@utils/supabaseClient';
+
+export const useSupportRealtime = (
+ selectedUserId: string,
+ onNewMessage: (msg: {
+ role: string;
+ text: string;
+ created_at: string;
+ }) => void,
+) => {
+ const callbackRef = useRef(onNewMessage);
+
+ useEffect(() => {
+ callbackRef.current = onNewMessage;
+ }, [onNewMessage]);
+
+ useEffect(() => {
+ if (!selectedUserId) return;
+
+ const channel = supabase
+ .channel(`support-chat-${selectedUserId}`)
+ .on(
+ 'postgres_changes',
+ {
+ event: 'INSERT',
+ schema: 'public',
+ table: 'support_messages',
+ filter: `user_id=eq.${selectedUserId}`,
+ },
+ (payload) => {
+ callbackRef.current(
+ payload.new as { role: string; text: string; created_at: string },
+ );
+ },
+ )
+ .subscribe();
+
+ return () => {
+ supabase.removeChannel(channel);
+ };
+ }, [selectedUserId]);
+};
diff --git a/src/hooks/useReviews.ts b/src/hooks/useReviews.ts
new file mode 100644
index 00000000000..059a309e0f1
--- /dev/null
+++ b/src/hooks/useReviews.ts
@@ -0,0 +1,90 @@
+import { useEffect, useState } from 'react';
+import { supabase } from '@utils/supabaseClient';
+
+export interface Review {
+ id: number;
+ name: string;
+ score: number;
+ title: string;
+ date: string;
+ body: string;
+}
+
+export function useReviews(productId: string) {
+ const [reviews, setReviews] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [refreshToken, setRefreshToken] = useState(0);
+
+ useEffect(() => {
+ let active = true;
+
+ supabase
+ .from('reviews')
+ .select('*')
+ .eq('product_id', productId)
+ .order('created_at', { ascending: false })
+ .then(({ data }) => {
+ if (!active) return;
+ if (data) {
+ setReviews(
+ data.map((rev) => ({
+ id: rev.id,
+ name: rev.name,
+ score: rev.score,
+ title: rev.title,
+ date: `Reviewed on ${new Date(rev.created_at).toLocaleDateString(
+ 'en-GB',
+ {
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric',
+ },
+ )}`,
+ body: rev.body,
+ })),
+ );
+ }
+ setLoading(false);
+ });
+
+ return () => {
+ active = false;
+ };
+ }, [productId, refreshToken]);
+
+ async function addReview(payload: {
+ name: string;
+ score: number;
+ title: string;
+ body: string;
+ }) {
+ const { error } = await supabase.from('reviews').insert([
+ {
+ ...payload,
+ product_id: productId,
+ },
+ ]);
+ if (!error) setRefreshToken((prev) => prev + 1);
+ return !error;
+ }
+
+ const avgScore =
+ reviews.length ?
+ Math.round(
+ (reviews.reduce((s, r) => s + r.score, 0) / reviews.length) * 10,
+ ) / 10
+ : 0;
+
+ const ratings = [5, 4, 3, 2, 1].map((star) => ({
+ label: `${star} star`,
+ pct:
+ reviews.length ?
+ Math.round(
+ (reviews.filter((r) => r.score === star).length / reviews.length) *
+ 100,
+ )
+ : 0,
+ }));
+
+ return { reviews, loading, addReview, avgScore, ratings };
+}
diff --git a/src/index.scss b/src/index.scss
new file mode 100644
index 00000000000..b733a3c67b0
--- /dev/null
+++ b/src/index.scss
@@ -0,0 +1,117 @@
+@use 'styles/variables' as *;
+@use 'styles/utils.scss' as *;
+
+@font-face {
+ font-family: 'Mont';
+ src: url('/fonts/Mont-SemiBold.otf');
+}
+
+@font-face {
+ font-family: 'Mont';
+ src: url('/fonts/Mont-SemiBold.otf');
+ font-weight: 600;
+}
+
+@font-face {
+ font-family: 'Mont';
+ src: url('/fonts/Mont-SemiBold.otf');
+ font-weight: 500;
+}
+
+html {
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 14px;
+ line-height: 21px;
+ scroll-behavior: smooth;
+ font-weight: 400;
+ overflow-y: scroll;
+}
+
+body {
+ margin: 0;
+ background-color: $bg-main;
+ color: $color-text-primary;
+}
+
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+ul,
+p {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+h1 {
+ font-weight: 800;
+ font-size: 48px;
+ line-height: 56px;
+ letter-spacing: -0.01em;
+}
+
+h2 {
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+}
+
+h3 {
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 31px;
+}
+
+h4 {
+ font-weight: 500;
+ font-size: 20px;
+ line-height: 26px;
+}
+
+a {
+ text-decoration: none;
+}
+
+hr {
+ border: none;
+ margin: 0;
+}
+
+.text-s-12 {
+ font-size: 12px;
+ line-height: 15px;
+ font-weight: 400;
+}
+
+.text-m-22 {
+ font-size: 22px;
+ line-height: 31px;
+}
+
+.text-l-32 {
+ font-size: 32px;
+ line-height: 40px;
+}
+
+.reveal {
+ opacity: 0;
+ transform: translateY(30px);
+ transition:
+ opacity 0.8s cubic-bezier(0.2, 0, 0.2, 1),
+ transform 0.8s cubic-bezier(0.2, 0, 0.2, 1);
+ will-change: transform, opacity;
+}
+
+.reveal.revealed {
+ opacity: 1;
+ transform: translateY(0);
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 00000000000..0b18a7708c7
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,14 @@
+import { createRoot } from 'react-dom/client';
+import { HashRouter } from 'react-router-dom';
+import './index.scss';
+import './utils/i18n';
+import { App } from './App.tsx';
+import { AppProvider } from './context/AppProvider.tsx';
+
+createRoot(document.getElementById('root')!).render(
+
+
+
+
+ ,
+);
diff --git a/src/pages/AccessoriesPage/AccessoriesPage.module.scss b/src/pages/AccessoriesPage/AccessoriesPage.module.scss
new file mode 100644
index 00000000000..e8d39d0915a
--- /dev/null
+++ b/src/pages/AccessoriesPage/AccessoriesPage.module.scss
@@ -0,0 +1,145 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+
+.accessories-page {
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ .title {
+ margin: 24px 0 8px;
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ }
+
+ .modelsCount {
+ margin-bottom: 24px;
+ font-size: 14px;
+ color: $color-secondary;
+ }
+
+ &__controls {
+ margin-bottom: 24px;
+ }
+
+ .controls {
+ display: flex;
+ align-items: flex-end;
+ gap: 16px;
+ }
+
+ .control {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .label {
+ font-size: 12px;
+ color: $color-secondary;
+ }
+
+ &__list {
+ padding-bottom: 56px;
+
+ display: grid;
+ gap: 40px 16px;
+ grid-template-columns: 1fr;
+
+ @include on-tablet {
+ padding-bottom: 64px;
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (min-width: 768px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ @include on-desktop {
+ grid-template-columns: repeat(4, 1fr);
+ padding-bottom: 80px;
+ }
+
+ & > * {
+ min-width: 0;
+ }
+ }
+
+ &__pagination {
+ padding-bottom: 40px;
+ }
+
+ .pagination {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .pageButton {
+ width: 32px;
+ height: 32px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ border-radius: 50%;
+ border: 1px solid $color-border;
+ background: $bg-surface;
+ color: $color-light-1;
+
+ cursor: pointer;
+
+ transition:
+ border-color $transition-default,
+ background-color $transition-default,
+ transform 0.15s ease;
+
+ &:hover:not(:disabled) {
+ border-color: $color-white;
+ }
+
+ &:active:not(:disabled) {
+ transform: scale(0.95);
+ }
+
+ &:disabled {
+ opacity: 0.4;
+ cursor: default;
+ }
+ }
+
+ .arrow {
+ margin: 0 8px;
+ background-color: $bg-card;
+ }
+
+ .arrow img {
+ width: 16px;
+ height: 16px;
+ }
+
+ .arrowLeft img {
+ transform: rotate(180deg);
+ }
+
+ .active {
+ background: $color-accent;
+ border-color: $color-accent;
+ }
+}
diff --git a/src/pages/AccessoriesPage/AccessoriesPage.tsx b/src/pages/AccessoriesPage/AccessoriesPage.tsx
new file mode 100644
index 00000000000..f2ea896b534
--- /dev/null
+++ b/src/pages/AccessoriesPage/AccessoriesPage.tsx
@@ -0,0 +1,181 @@
+import { useEffect, useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { getAccessories } from '@api/products';
+import { Product } from '@/types/Product';
+import { ProductCard } from '@components/product/ProductCard/ProductCard';
+import { sortProducts } from '@utils/productFilters';
+import { SortType } from '@/types/SortType';
+import s from './AccessoriesPage.module.scss';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { ProductSkeleton } from '@components/product/ProductSkelet/ProductSkelet';
+import { Dropdown } from '@components/ui/Dropdown/Dropdown';
+import { usePaginationWithParams } from '@hooks/usePaginationWithParams';
+import arrowIcon from '@assets/icons/arrow-right.svg';
+
+export const AccessoriesPage = () => {
+ const { t } = useTranslation();
+ const [accessories, setAccessories] = useState([]);
+
+ const {
+ sortBy,
+ itemsOnPage,
+ currentPage,
+ changeSort,
+ changeItems,
+ changePage,
+ } = usePaginationWithParams({
+ basePath: '/accessories',
+ });
+
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ const loadAccessories = async () => {
+ setIsLoading(true);
+ try {
+ const data = await getAccessories();
+ setAccessories(
+ data.map((acc) => ({
+ ...acc,
+ category: 'accessories',
+ })),
+ );
+ } catch (error) {
+ console.error('Failed to fetch accessories:', error);
+ } finally {
+ setTimeout(() => setIsLoading(false), 600);
+ }
+ };
+
+ loadAccessories();
+ }, []);
+
+ useEffect(() => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth',
+ });
+ }, [currentPage]);
+
+ const sortedAccessories = useMemo(() => {
+ return sortProducts(accessories, sortBy);
+ }, [accessories, sortBy]);
+
+ const totalPages = Math.ceil(sortedAccessories.length / itemsOnPage);
+
+ const visibleAccessories = useMemo(() => {
+ const start = (currentPage - 1) * itemsOnPage;
+ const end = start + itemsOnPage;
+
+ return sortedAccessories.slice(start, end);
+ }, [sortedAccessories, itemsOnPage, currentPage]);
+
+ const sortOptions = [
+ { label: t('catalog.price_low'), value: 'priceLow' },
+ { label: t('catalog.price_high'), value: 'priceHigh' },
+ { label: t('catalog.age'), value: 'newest' },
+ { label: t('catalog.oldest'), value: 'oldest' },
+ ];
+
+ const itemsOptions = [
+ { label: '12', value: '12' },
+ { label: '24', value: '24' },
+ { label: '36', value: '36' },
+ { label: '48', value: '48' },
+ ];
+
+ return (
+
+
+
+
+
{t('nav.accessories')}
+
+ {!isLoading && (
+
+ {t('categories.models_count', { count: accessories.length })}
+
+ )}
+
+
+
+
+ {t('catalog.sort_by')}
+ {
+ changeSort(value as SortType);
+ }}
+ />
+
+
+
+ {t('catalog.items_on_page')}
+ changeItems(+value)}
+ />
+
+
+
+
+
+ {isLoading ?
+ Array.from({ length: 8 }).map((_, index) => (
+
+ ))
+ : visibleAccessories.map((accessory) => (
+
+ ))
+ }
+
+
+ {totalPages > 1 && (
+
+
+
changePage(currentPage - 1)}
+ className={`${s.pageButton} ${s.arrow} ${s.arrowLeft}`}
+ >
+
+
+
+ {[...Array(totalPages)].map((_, index) => {
+ const page = index + 1;
+ return (
+
changePage(page)}
+ className={`${s.pageButton} ${currentPage === page ? s.active : ''}`}
+ >
+ {page}
+
+ );
+ })}
+
+
changePage(currentPage + 1)}
+ className={`${s.pageButton} ${s.arrow}`}
+ >
+
+
+
+
+ )}
+
+
+ );
+};
diff --git a/src/pages/CartPage/CartPage.module.scss b/src/pages/CartPage/CartPage.module.scss
new file mode 100644
index 00000000000..02a7776efca
--- /dev/null
+++ b/src/pages/CartPage/CartPage.module.scss
@@ -0,0 +1,132 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ font-family: Mont;
+}
+
+.cart {
+ box-sizing: border-box;
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 16px 56px;
+
+ @include on-tablet {
+ padding: 0 24px 64px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px 80px;
+ }
+
+ .emptyCart {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 16px;
+ margin: 0 auto;
+ flex-grow: 1;
+ }
+ .imgWrapper {
+ width: 320px;
+ height: 280px;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ img {
+ object-fit: cover;
+ transform: translate(0, 10%);
+ }
+ }
+
+ .addToCart {
+ display: flex;
+ border-radius: 8px;
+ justify-content: center;
+ align-items: center;
+ flex-grow: 1;
+ width: 175px;
+ height: 40px;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 14px;
+ line-height: 21px;
+ letter-spacing: 0;
+ color: $color-light-1;
+ background-color: $color-accent;
+ text-decoration: none;
+ text-align: center;
+ cursor: pointer;
+ border: none;
+ }
+
+ .title {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ margin-top: 24px;
+ margin-bottom: 32px;
+ letter-spacing: -0.01em;
+
+ h1 {
+ font-size: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ }
+ }
+
+ .cartContent {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+
+ @include on-desktop {
+ @include page-grid;
+ align-items: start;
+ }
+
+ .products {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+
+ @include on-desktop {
+ grid-column: 1 / 17;
+ }
+
+ button[class*='remove'],
+ .remove,
+ .remove-btn {
+ width: 32px;
+ height: 32px;
+ border-radius: 8px;
+ transition: all 0.2s ease;
+ }
+
+ button[class*='minus'],
+ button[class*='plus'],
+ .quantity-btn,
+ .minus,
+ .plus {
+ width: 32px;
+ height: 32px;
+ border-radius: 8px;
+ transition: all 0.2s ease;
+ }
+ }
+
+ .summary {
+ @include on-desktop {
+ grid-column: 17 / 25;
+ position: sticky;
+ top: 24px;
+ }
+ }
+ }
+}
diff --git a/src/pages/CartPage/CartPage.tsx b/src/pages/CartPage/CartPage.tsx
new file mode 100644
index 00000000000..e5ebc98b218
--- /dev/null
+++ b/src/pages/CartPage/CartPage.tsx
@@ -0,0 +1,84 @@
+import { useState } from 'react';
+import { Link } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+
+import s from './CartPage.module.scss';
+import { CartItem } from '@components/cart/CartItem/CartItem';
+import { CartProduct } from '@components/cart/CartProduct/CartProduct';
+import { BackButton } from '@components/ui/Buttons/Back/BackButton';
+import { useAppContext } from '@hooks/useAppContext';
+import { CheckoutModal } from '@components/common/CheckoutModal';
+import cartZeroImg from '@assets/cart-zero.png';
+
+export const CartPage = () => {
+ const { t } = useTranslation();
+ const { cartItems, removeFromCart, updateQuantity, totalPrice, totalItems } =
+ useAppContext();
+
+ const [isCheckoutOpen, setIsCheckoutOpen] = useState(false);
+
+ const handleCheckout = () => {
+ setIsCheckoutOpen(true);
+ };
+
+ return (
+
+
+
+
+
{t('cart.title')}
+
+
+ {cartItems.length === 0 ?
+
+
+
+
+
+
{t('cart.empty')}
+
+
+ {t('cart.shop_now', 'Shop now')}
+
+
+ :
+
+ {cartItems.map((item) => (
+ removeFromCart(item.itemUniqueId)}
+ onIncrease={() =>
+ updateQuantity(item.itemUniqueId, item.quantity + 1)
+ }
+ onDecrease={() =>
+ updateQuantity(item.itemUniqueId, item.quantity - 1)
+ }
+ />
+ ))}
+
+
+
+
+
+
+ }
+
+
setIsCheckoutOpen(false)}
+ />
+
+ );
+};
diff --git a/src/pages/ContactsPage/ContactsPage.tsx b/src/pages/ContactsPage/ContactsPage.tsx
new file mode 100644
index 00000000000..b4d9d8ad6b2
--- /dev/null
+++ b/src/pages/ContactsPage/ContactsPage.tsx
@@ -0,0 +1,198 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './contacts.module.scss';
+import { BackButton } from '@components/ui/Buttons/Back/BackButton';
+
+type TeamMember = {
+ name: string;
+ role: string;
+ photo: string;
+ email: string;
+ linkedin: string;
+ github: string;
+};
+
+const teamMembers: TeamMember[] = [
+ {
+ name: 'Maksym Pukas',
+ role: 'Team Lead · Full-Stack Developer',
+ photo: '/img/profile/Maksym.jpg',
+ email: 'maksym.pukas.fs@gmail.com',
+ linkedin: 'https://www.linkedin.com/in/maksym-pukas-74a3383ab/',
+ github: 'https://github.com/MaksOther',
+ },
+ {
+ name: 'Ruslan Zavadskyi',
+ role: 'Product Manager · Full-Stack Developer',
+ photo:
+ 'https://media.mate.academy/fit-in/128x128/users/172623/avatars/current-1748715857382.jpg',
+ email: 'ruslan.zavadskyi.dev@gmail.com',
+ linkedin: 'https://www.linkedin.com/in/ruslan-zavadskyi-ba9309220/',
+ github: 'https://github.com/Etwaiz',
+ },
+ {
+ name: 'Tetiana Sobolieva',
+ role: 'Full-Stack Developer',
+ photo:
+ 'https://media.licdn.com/dms/image/v2/D4E03AQF_fuZentFH3g/profile-displayphoto-scale_200_200/B4EZxb310eJoAY-/0/1771067891449?e=1773273600&v=beta&t=dKXA42PFUC64pK1oz65JUQmdyUXI4OjnRCIQA4IGLYc',
+ email: 'tetaina.sobolieva.s@gmail.com',
+ linkedin: 'https://www.linkedin.com/in/fd-tetiana-sobolieva/',
+ github: 'https://github.com/TetianaSobolieva',
+ },
+ {
+ name: 'Hanna Torianyk',
+ role: 'Frontend Developer',
+ photo: '/img/profile/Hanna.jpg',
+ email: 'torianykhanna@gmail.com',
+ linkedin: 'https://www.linkedin.com/in/hanna-torianyk/',
+ github: 'https://github.com/torianykhanna',
+ },
+ {
+ name: 'Anastasiia Levochkina',
+ role: 'Full-Stack Developer',
+ photo:
+ 'https://media.licdn.com/dms/image/v2/D4E03AQGsvYquiMNgWA/profile-displayphoto-scale_200_200/B4EZxZsWDoJMAY-/0/1771031325551?e=1773273600&v=beta&t=PISBZhaw9f6GCse1YPtgPQPIU57snZG7_vyY5KrExJc',
+ email: 'nastya.mixaylova98@gmail.com',
+ linkedin:
+ 'https://www.linkedin.com/in/anastasiia-levochkina-79a8263b0?utm_source=share&utm_campaign=share_via&utm_content=profile&utm_medium=ios_app',
+ github: 'https://github.com/anastasiia-levochkina',
+ },
+ {
+ name: 'Mark Chepizhnyi',
+ role: 'Full-Stack Developer',
+ photo: 'https://avatars.githubusercontent.com/u/62542962?v=4',
+ email: 'markchep0411@gmail.com',
+ linkedin: 'https://www.linkedin.com/in/markchepizhnyi/',
+ github: 'https://github.com/mark-chep',
+ },
+];
+
+const MailIcon = () => (
+
+
+
+
+);
+
+const LinkedinIcon = () => (
+
+
+
+
+
+
+
+);
+
+const GitHubIcon = () => (
+
+
+
+);
+
+export const ContactsPage: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+ {t('footer.contacts')}
+
+ {t('help_widget.bot_replies.0')}
+
+
+ {teamMembers.map(({ name, role, photo, email, linkedin, github }) => (
+
+
+
+
+
{name}
+ {role}
+
+
+
+
+ ))}
+
+
+ );
+};
diff --git a/src/pages/ContactsPage/contacts.module.scss b/src/pages/ContactsPage/contacts.module.scss
new file mode 100644
index 00000000000..aa7e418a58c
--- /dev/null
+++ b/src/pages/ContactsPage/contacts.module.scss
@@ -0,0 +1,124 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+
+.contacts {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+ padding-top: 24px;
+ padding-bottom: 56px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ padding-top: 24px;
+ padding-bottom: 64px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ padding-top: 24px;
+ padding-bottom: 80px;
+ }
+
+ h1 {
+ font-size: 32px;
+ line-height: 1.2;
+ font-weight: 800;
+ text-align: center;
+ margin-bottom: 32px;
+ color: $color-light-1;
+ letter-spacing: -0.01em;
+ }
+}
+
+.subtitle {
+ font-size: 16px;
+ line-height: 24px;
+ color: $color-secondary;
+ text-align: center;
+ margin-bottom: 48px;
+}
+
+.team {
+ display: grid;
+ gap: 16px;
+ grid-template-columns: 1fr;
+
+ @media (min-width: 640px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @include on-desktop {
+ grid-template-columns: repeat(3, 1fr);
+ }
+}
+
+.card {
+ border: 1px solid $color-elements;
+ border-radius: 12px;
+ padding: 24px;
+ text-align: center;
+ transition: $transition-default;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+ background: $bg-surface;
+
+ &:hover {
+ border-color: $color-accent;
+ transform: translateY(-4px);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
+ }
+}
+
+.photo {
+ width: 100px;
+ height: 100px;
+ object-fit: cover;
+ border-radius: 50%;
+ border: 2px solid $color-elements;
+}
+
+.info {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+
+ h3 {
+ font-size: 18px;
+ line-height: 24px;
+ font-weight: 600;
+ color: $color-light-1;
+ }
+}
+
+.role {
+ font-size: 13px;
+ line-height: 1.4;
+ color: $color-accent;
+ font-weight: 500;
+}
+
+.links {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ width: 100%;
+}
+
+.link {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ color: $color-secondary;
+ font-size: 14px;
+ transition: $transition-default;
+ word-break: break-all;
+
+ &:hover {
+ color: $color-light-1;
+ }
+}
diff --git a/src/pages/FavoritesPage/FavoritesPage.scss b/src/pages/FavoritesPage/FavoritesPage.scss
new file mode 100644
index 00000000000..bcffac09b99
--- /dev/null
+++ b/src/pages/FavoritesPage/FavoritesPage.scss
@@ -0,0 +1,109 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+
+.favorites-page {
+ &__loader-wrapper {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: calc(100vh - 64px);
+ }
+
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ &__text {
+ display: block;
+ text-align: left;
+ }
+
+ &__heart {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 8px;
+ }
+
+ &__title {
+ display: block;
+ margin-top: 24px;
+ margin-bottom: 8px;
+ color: $color-light-1;
+ font-family: Mont, sans-serif;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ }
+
+ &__items-number {
+ display: block;
+ margin-bottom: 24px;
+ font-size: 14px;
+ color: $color-secondary;
+ }
+
+ &__empty {
+ text-align: center;
+ margin-top: 60px;
+ }
+
+ &__all-favorites {
+ padding-bottom: 56px;
+ display: grid;
+ row-gap: 40px;
+ column-gap: 16px;
+ grid-template-columns: 1fr;
+
+ @include on-tablet {
+ padding-bottom: 64px;
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (min-width: 768px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ @include on-desktop {
+ padding-bottom: 80px;
+ grid-template-columns: repeat(4, 1fr);
+ }
+
+ & > * {
+ min-width: 0;
+ }
+ }
+
+ &__addToCart {
+ display: flex;
+ border-radius: 8px;
+ justify-content: center;
+ align-items: center;
+ flex-grow: 1;
+ width: 175px;
+ height: 40px;
+ font-family: 'Mont', 'Helvetica Neue', Arial, sans-serif;
+ font-size: 14px;
+ line-height: 21px;
+ letter-spacing: 0;
+ color: $color-light-1;
+ background-color: $color-accent;
+ text-decoration: none;
+ text-align: center;
+ cursor: pointer;
+ border: none;
+ margin: 0 auto;
+ }
+}
diff --git a/src/pages/FavoritesPage/FavoritesPage.tsx b/src/pages/FavoritesPage/FavoritesPage.tsx
new file mode 100644
index 00000000000..9ca137ed7ff
--- /dev/null
+++ b/src/pages/FavoritesPage/FavoritesPage.tsx
@@ -0,0 +1,96 @@
+import React, { useEffect, useState, useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Link } from 'react-router-dom';
+import { ProductCard } from '@components/product/ProductCard';
+import { Product } from '@/types/Product';
+import { getAccessories, getPhones, getTablets } from '@api/products';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { useAppContext } from '@hooks/useAppContext';
+import { Loader } from '@components/ui/Loader/Loader';
+import Heart from './Heart';
+
+import './FavoritesPage.scss';
+
+export const FavoritesPage: React.FC = () => {
+ const { t } = useTranslation();
+ const { favorites } = useAppContext();
+ const [allProducts, setAllProducts] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ const loadProducts = async () => {
+ setIsLoading(true);
+ try {
+ const [phones, tablets, accessories] = await Promise.all([
+ getPhones(),
+ getTablets(),
+ getAccessories(),
+ ]);
+ setAllProducts([...phones, ...tablets, ...accessories]);
+ } catch (error) {
+ console.error('Failed to load products:', error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ loadProducts();
+ }, []);
+
+ const favoriteProducts = useMemo(() => {
+ return allProducts.filter((product) =>
+ favorites.includes(String(product.itemId)),
+ );
+ }, [allProducts, favorites]);
+
+ if (isLoading) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
{t('favorites')}
+
+ {t('cart.total_items', { count: favoriteProducts.length })}
+
+
+
+ {favoriteProducts.length > 0 ?
+
+ {favoriteProducts.map((product) => (
+
+ ))}
+
+ :
+
+
+
+
+ {t('page_favorites.empty_title')}
+
+
+ {t('page_favorites.empty_text')}
+
+
+ {t('cart.shop_now')}
+
+
+ }
+
+
+ );
+};
diff --git a/src/pages/FavoritesPage/Heart.scss b/src/pages/FavoritesPage/Heart.scss
new file mode 100644
index 00000000000..5d883fcaeaa
--- /dev/null
+++ b/src/pages/FavoritesPage/Heart.scss
@@ -0,0 +1,36 @@
+@use '@styles/variables' as *;
+
+.heart-container {
+ position: relative;
+ width: 144px;
+ height: 144px;
+}
+
+.heart-container svg {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.heart-base {
+ color: $color-light-1;
+}
+
+.heart-animated {
+ color: $color-red;
+
+ stroke-dasharray: 500;
+ stroke-dashoffset: 500;
+
+ animation: draw-infinite 30s linear forwards;
+}
+
+@keyframes draw-infinite {
+ 0% {
+ stroke-dashoffset: 500;
+ }
+ 100% {
+ stroke-dashoffset: 0;
+ }
+}
diff --git a/src/pages/FavoritesPage/Heart.tsx b/src/pages/FavoritesPage/Heart.tsx
new file mode 100644
index 00000000000..688fab64775
--- /dev/null
+++ b/src/pages/FavoritesPage/Heart.tsx
@@ -0,0 +1,20 @@
+import { Heart } from 'lucide-react';
+import './Heart.scss';
+
+export default function AnimatedHeart() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/pages/FavoritesPage/index.tsx b/src/pages/FavoritesPage/index.tsx
new file mode 100644
index 00000000000..b3a884b1889
--- /dev/null
+++ b/src/pages/FavoritesPage/index.tsx
@@ -0,0 +1 @@
+export * from './FavoritesPage';
diff --git a/src/pages/HomePage/HomePage.module.scss b/src/pages/HomePage/HomePage.module.scss
new file mode 100644
index 00000000000..cbce1209048
--- /dev/null
+++ b/src/pages/HomePage/HomePage.module.scss
@@ -0,0 +1,295 @@
+@use '@styles/variables' as *;
+@use '@styles/utils' as *;
+
+.loader-wrapper {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100vh;
+ width: 100%;
+}
+
+.home {
+ color: $color-white;
+ min-height: 100vh;
+ padding-bottom: 60px;
+
+ @include on-tablet {
+ padding-bottom: 80px;
+ }
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding-inline: 0;
+
+ @include on-tablet {
+ padding-inline: 24px;
+ }
+
+ @include on-desktop {
+ padding-inline: 32px;
+ }
+}
+
+.hero {
+ padding: 24px 0 0;
+
+ @include on-tablet {
+ padding: 32px 0 0;
+ }
+
+ @include on-desktop {
+ padding: 40px 0 0;
+ }
+
+ &__title {
+ font-size: 32px;
+ font-weight: 800;
+ line-height: 1.2;
+ margin-bottom: 24px;
+ letter-spacing: -0.02em;
+ padding-inline: 16px;
+
+ @include on-tablet {
+ padding-inline: 0;
+ font-size: 40px;
+ margin-bottom: 32px;
+ }
+
+ @include on-desktop {
+ font-size: 48px;
+ }
+ }
+}
+
+.section {
+ margin-top: 80px;
+ padding-inline: 16px;
+
+ @include on-tablet {
+ padding-inline: 0;
+ }
+
+ &__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 24px;
+ }
+
+ &__title {
+ font-size: 22px;
+ font-weight: 800;
+ letter-spacing: -0.02em;
+
+ @include on-tablet {
+ font-size: 28px;
+ }
+
+ @include on-desktop {
+ font-size: 32px;
+ }
+ }
+
+ &__header &__title {
+ margin-bottom: 0;
+ }
+
+ & > &__title {
+ margin-bottom: 24px;
+ }
+
+ &__arrows {
+ display: flex;
+ gap: 16px;
+ }
+}
+
+.arrow-btn {
+ width: 32px;
+ height: 32px;
+ border: 1px solid $color-surface-2;
+ background-color: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s ease;
+ padding: 0;
+
+ &::after {
+ content: '';
+ display: block;
+ width: 6px;
+ height: 10px;
+ background-image: url('/src/assets/icons/vector-black.svg');
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ }
+
+ &--prev::after {
+ transform: rotate(180deg);
+ }
+
+ border-radius: 8px;
+
+ &:hover:not(:disabled) {
+ background-color: $btn-secondary-hover;
+ border-color: $color-icons;
+
+ &::after {
+ background-image: url('/src/assets/icons/vector-white.svg');
+ }
+ }
+
+ &:disabled {
+ cursor: not-allowed;
+ border-color: $color-surface-2;
+ opacity: 0.5;
+
+ &::after {
+ background-image: url('/src/assets/icons/vector-black.svg');
+ }
+ }
+}
+
+.products-slider {
+ overflow-x: auto;
+ overflow-y: hidden;
+ margin: 0 -16px;
+ padding: 0 16px 4px;
+ scroll-behavior: smooth;
+ scrollbar-width: none;
+
+ @include on-tablet {
+ margin: 0;
+ padding: 0 0 4px;
+ }
+
+ &::-webkit-scrollbar {
+ height: 0;
+ }
+
+ &__track {
+ display: flex;
+ gap: 16px;
+
+ & > * {
+ flex: 0 0 212px;
+
+ @include on-tablet {
+ flex: 0 0 237px;
+ }
+
+ @include on-desktop {
+ flex: 0 0 272px;
+ }
+ }
+ }
+}
+
+.categories {
+ display: flex;
+ flex-direction: column;
+ gap: 32px;
+
+ @include on-tablet {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 16px;
+ }
+}
+
+.category-card {
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ text-decoration: none;
+ color: inherit;
+
+ &__image-wrapper {
+ width: 100%;
+ height: 320px;
+ border-radius: 8px;
+ overflow: hidden;
+ margin-bottom: 24px;
+ background: $color-surface-1;
+
+ @include on-tablet {
+ height: 280px;
+ }
+
+ @include on-desktop {
+ height: 320px;
+ }
+ }
+
+ &__image,
+ &__image-tablets,
+ &__image-access {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ object-position: left center;
+ }
+
+ &__image {
+ background-color: #6d6474;
+ }
+
+ &__image-tablets {
+ background-color: #8d8d92;
+ }
+
+ &__image-access {
+ background-color: #973d5f;
+ }
+
+ &__info {
+ display: flex;
+ flex-direction: column;
+ }
+
+ &__title {
+ font-size: 20px;
+ font-weight: 800;
+ margin-bottom: 4px;
+ letter-spacing: -0.01em;
+
+ @include on-tablet {
+ font-size: 18px;
+ }
+
+ @include on-desktop {
+ font-size: 20px;
+ }
+ }
+
+ &__count {
+ font-size: 14px;
+ color: $color-secondary-1;
+ font-weight: 600;
+ }
+
+ &:hover {
+ .category-card__image,
+ .category-card__image-tablets,
+ .category-card__image-access {
+ transform: scale(1.05);
+ }
+ }
+}
+
+[data-theme='light'] {
+ .arrow-btn:hover:not(:disabled) {
+ background-color: transparent;
+ border-color: $color-surface-2;
+
+ &::after {
+ background-image: url('/src/assets/icons/vector-black.svg');
+ }
+ }
+}
diff --git a/src/pages/HomePage/HomePage.tsx b/src/pages/HomePage/HomePage.tsx
new file mode 100644
index 00000000000..3826e615f2e
--- /dev/null
+++ b/src/pages/HomePage/HomePage.tsx
@@ -0,0 +1,88 @@
+import React, { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './HomePage.module.scss';
+import { Banner } from '@components/ui/Banner/Banner';
+import { ProductsSlider } from './components/ProductsSlider';
+import { CategorySection } from './components/CategorySection';
+import { Loader } from '@components/ui/Loader/Loader';
+import {
+ getAccessories,
+ getPhones,
+ getProducts,
+ getTablets,
+} from '@api/products';
+import { Product } from '@/types/Product';
+import { sortByBestPrice, sortByNewest } from '@utils/productFilters';
+import { RevealWrapper } from '@utils/RevealWrapper.tsx';
+
+export const HomePage: React.FC = () => {
+ const { t } = useTranslation();
+ const [phones, setPhones] = useState([]);
+ const [tablets, setTablets] = useState([]);
+ const [accessories, setAccessories] = useState([]);
+ const [products, setProducts] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ Promise.all([getPhones(), getTablets(), getAccessories(), getProducts()])
+ .then(([phonesData, tabletsData, accessoriesData, productsData]) => {
+ setPhones(phonesData);
+ setTablets(tabletsData);
+ setAccessories(accessoriesData);
+ setProducts(productsData);
+ })
+ .finally(() => setIsLoading(false));
+ }, []);
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ const newestProducts = sortByNewest(products).slice(0, 12);
+ const hotPriceProducts = sortByBestPrice([
+ ...phones,
+ ...tablets,
+ ...accessories,
+ ]).slice(0, 12);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/pages/HomePage/components/CategorySection.tsx b/src/pages/HomePage/components/CategorySection.tsx
new file mode 100644
index 00000000000..48a4ff83016
--- /dev/null
+++ b/src/pages/HomePage/components/CategorySection.tsx
@@ -0,0 +1,88 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import styles from '../HomePage.module.scss';
+
+interface Props {
+ phonesCount: number;
+ tabletsCount: number;
+ accessoriesCount: number;
+}
+
+export const CategorySection: React.FC = ({
+ phonesCount,
+ tabletsCount,
+ accessoriesCount,
+}) => {
+ const { t } = useTranslation();
+
+ return (
+
+ {t('home.shop_category')}
+
+
+
+
+
+
+
+ {t('categories.phones')}
+
+
+ {t('categories.models_count', { count: phonesCount })}
+
+
+
+
+
+
+
+
+
+
+ {t('categories.tablets')}
+
+
+ {t('categories.models_count', { count: tabletsCount })}
+
+
+
+
+
+
+
+
+
+
+ {t('categories.accessories')}
+
+
+ {t('categories.models_count', { count: accessoriesCount })}
+
+
+
+
+
+ );
+};
diff --git a/src/pages/HomePage/components/ProductsSlider.tsx b/src/pages/HomePage/components/ProductsSlider.tsx
new file mode 100644
index 00000000000..647d6e1907f
--- /dev/null
+++ b/src/pages/HomePage/components/ProductsSlider.tsx
@@ -0,0 +1,132 @@
+import React, { useEffect, useRef, useState } from 'react';
+import { Product } from '@/types/Product';
+import { ProductCard } from '@components/product/ProductCard';
+import styles from '../HomePage.module.scss';
+
+interface Props {
+ title: string;
+ products: Product[];
+}
+
+export const ProductsSlider: React.FC = ({ title, products }) => {
+ const [scrollState, setScrollState] = useState({
+ isAtStart: true,
+ isAtEnd: false,
+ });
+ const [isMoved, setIsMoved] = useState(false);
+ const sliderRef = useRef(null);
+ const isDragging = useRef(false);
+ const startX = useRef(0);
+ const scrollLeftStart = useRef(0);
+
+ const updateScrollState = () => {
+ if (sliderRef.current) {
+ const { scrollLeft, scrollWidth, clientWidth } = sliderRef.current;
+ setScrollState({
+ isAtStart: scrollLeft <= 0,
+ isAtEnd: scrollLeft + clientWidth >= scrollWidth - 1,
+ });
+ }
+ };
+
+ const scroll = (direction: 'left' | 'right') => {
+ if (sliderRef.current) {
+ const card = sliderRef.current.querySelector('article');
+ const step = (card?.offsetWidth || 272) + 16;
+
+ sliderRef.current.scrollBy({
+ left: direction === 'left' ? -step : step,
+ behavior: 'smooth',
+ });
+ }
+ };
+
+ const handleMouseDown = (e: React.MouseEvent) => {
+ if (!sliderRef.current) return;
+ isDragging.current = true;
+ setIsMoved(false);
+ startX.current = e.pageX - sliderRef.current.offsetLeft;
+ scrollLeftStart.current = sliderRef.current.scrollLeft;
+ sliderRef.current.style.cursor = 'grabbing';
+ sliderRef.current.style.scrollBehavior = 'auto';
+ };
+
+ const handleMouseMove = (e: React.MouseEvent) => {
+ if (!isDragging.current || !sliderRef.current) return;
+ const x = e.pageX - sliderRef.current.offsetLeft;
+ const distance = x - startX.current;
+
+ if (Math.abs(distance) > 5) {
+ setIsMoved(true);
+ }
+ sliderRef.current.scrollLeft = scrollLeftStart.current - distance;
+ };
+
+ const handleMouseUpOrLeave = () => {
+ isDragging.current = false;
+ if (sliderRef.current) {
+ sliderRef.current.style.cursor = 'pointer';
+ sliderRef.current.style.scrollBehavior = 'smooth';
+ }
+ };
+
+ const handleChildClick = (e: React.MouseEvent) => {
+ if (isMoved) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ };
+
+ useEffect(() => {
+ const slider = sliderRef.current;
+ if (slider) {
+ slider.addEventListener('scroll', updateScrollState);
+ updateScrollState();
+ return () => slider.removeEventListener('scroll', updateScrollState);
+ }
+ }, [products]);
+
+ return (
+
+
+
{title}
+
+ scroll('left')}
+ disabled={scrollState.isAtStart}
+ />
+ scroll('right')}
+ disabled={scrollState.isAtEnd}
+ />
+
+
+
+
+
+ {products.map((product) => (
+
e.preventDefault()}
+ >
+
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/pages/NotFoundPage/NotFoundPage.scss b/src/pages/NotFoundPage/NotFoundPage.scss
new file mode 100644
index 00000000000..e3decd07559
--- /dev/null
+++ b/src/pages/NotFoundPage/NotFoundPage.scss
@@ -0,0 +1,24 @@
+@use '@styles/utils' as *;
+@use '@styles/variables.scss' as *;
+
+.title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $color-light-1;
+ margin-top: 60px;
+ font-size: 36px;
+
+ @include on-tablet {
+ font-size: 54px;
+ margin-top: 120px;
+ }
+
+ &__message {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: $color-light-1;
+ font-size: 24px;
+ }
+}
diff --git a/src/pages/NotFoundPage/NotFoundPage.tsx b/src/pages/NotFoundPage/NotFoundPage.tsx
new file mode 100644
index 00000000000..e102b9f5b74
--- /dev/null
+++ b/src/pages/NotFoundPage/NotFoundPage.tsx
@@ -0,0 +1,13 @@
+import { useTranslation } from 'react-i18next';
+import './NotFoundPage.scss';
+
+export const NotFoundPage = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
{t('not_found_page.title')}
+ {t('not_found_page.message')}
+
+ );
+};
diff --git a/src/pages/PhonesPage/PhonesPage.module.scss b/src/pages/PhonesPage/PhonesPage.module.scss
new file mode 100644
index 00000000000..7661e2a8cd0
--- /dev/null
+++ b/src/pages/PhonesPage/PhonesPage.module.scss
@@ -0,0 +1,149 @@
+@use '@styles/utils' as *;
+@use '@styles/variables.scss' as *;
+
+.phones-page {
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ .title {
+ margin: 24px 0 8px;
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ }
+
+ .modelsCount {
+ margin-bottom: 24px;
+ font-size: 14px;
+ color: $color-secondary;
+ }
+
+ &__controls {
+ margin-bottom: 24px;
+ }
+
+ .controls {
+ display: flex;
+ align-items: flex-end;
+ gap: 16px;
+ }
+
+ .control {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .label {
+ font-size: 12px;
+ color: $color-secondary;
+ }
+
+ &__list {
+ padding-bottom: 56px;
+
+ display: grid;
+ gap: 40px 16px;
+ grid-template-columns: 1fr;
+
+ @media (min-width: 640px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (min-width: 768px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ @include on-tablet {
+ padding-bottom: 64px;
+ }
+
+ @include on-desktop {
+ grid-template-columns: repeat(4, 1fr);
+ padding-bottom: 80px;
+ }
+
+ & > * {
+ min-width: 0;
+ }
+ }
+
+ &__pagination {
+ padding-bottom: 40px;
+ }
+
+ .pagination {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .pageButton {
+ width: 32px;
+ height: 32px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ border-radius: 50%;
+ border: 1px solid $color-border;
+ background: $bg-surface;
+ color: $color-light-1;
+
+ cursor: pointer;
+
+ transition:
+ border-color $transition-default,
+ background-color $transition-default,
+ transform 0.15s ease;
+
+ &:hover:not(:disabled) {
+ border-color: $color-white;
+ }
+
+ &:active:not(:disabled) {
+ transform: scale(0.95);
+ }
+
+ &:disabled {
+ opacity: 0.4;
+ cursor: default;
+ }
+ }
+
+ .arrow {
+ margin: 0 8px;
+ }
+
+ .arrow img {
+ width: 16px;
+ height: 16px;
+ filter: $icon-filter;
+ transition: filter $transition-default;
+ }
+
+ .arrowLeft img {
+ transform: rotate(180deg);
+ }
+
+ .active {
+ background: $color-accent;
+ border-color: $color-accent;
+ }
+}
diff --git a/src/pages/PhonesPage/PhonesPage.tsx b/src/pages/PhonesPage/PhonesPage.tsx
new file mode 100644
index 00000000000..56467aa96db
--- /dev/null
+++ b/src/pages/PhonesPage/PhonesPage.tsx
@@ -0,0 +1,186 @@
+import { useEffect, useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { getPhones } from '@api/products';
+import { Product } from '@/types/Product';
+import { ProductCard } from '@components/product/ProductCard/ProductCard';
+import { sortProducts } from '@utils/productFilters';
+import { SortType } from '@/types/SortType';
+import s from './PhonesPage.module.scss';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { ProductSkeleton } from '@components/product/ProductSkelet/ProductSkelet';
+import { Dropdown } from '@components/ui/Dropdown/Dropdown';
+import { usePagination } from '@hooks/usePagination';
+import { usePaginationWithParams } from '@hooks/usePaginationWithParams';
+import arrowRight from '@assets/icons/arrow-right.svg';
+
+export const PhonesPage = () => {
+ const { t } = useTranslation();
+ const [phones, setPhones] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+
+ const {
+ sortBy,
+ itemsOnPage,
+ currentPage,
+ changeSort,
+ changeItems,
+ changePage,
+ } = usePaginationWithParams({
+ basePath: '/phones',
+ });
+
+ useEffect(() => {
+ const loadPhones = async () => {
+ setIsLoading(true);
+ try {
+ const data = await getPhones();
+ setPhones(data.map((phone) => ({ ...phone, category: 'phones' })));
+ } catch (error) {
+ console.error('Failed to fetch phones:', error);
+ } finally {
+ setTimeout(() => setIsLoading(false), 600);
+ }
+ };
+
+ loadPhones();
+ }, []);
+
+ useEffect(() => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth',
+ });
+ }, [currentPage]);
+
+ const sortedPhones = useMemo(() => {
+ return sortProducts(phones, sortBy);
+ }, [phones, sortBy]);
+
+ const totalPages = Math.ceil(sortedPhones.length / itemsOnPage);
+
+ const paginationPages = usePagination(currentPage, totalPages);
+
+ const visiblePhones = useMemo(() => {
+ const start = (currentPage - 1) * itemsOnPage;
+ const end = start + itemsOnPage;
+
+ return sortedPhones.slice(start, end);
+ }, [sortedPhones, itemsOnPage, currentPage]);
+
+ const sortOptions = [
+ { label: t('catalog.price_low'), value: 'priceLow' },
+ { label: t('catalog.price_high'), value: 'priceHigh' },
+ { label: t('catalog.age'), value: 'newest' },
+ { label: t('catalog.oldest'), value: 'oldest' },
+ ];
+
+ const itemsOptions = [
+ { label: '12', value: '12' },
+ { label: '24', value: '24' },
+ { label: '36', value: '36' },
+ { label: '48', value: '48' },
+ ];
+
+ return (
+
+
+
+
+
{t('categories.phones', 'Mobile phones')}
+
+ {!isLoading && (
+
+ {t('categories.models_count', { count: phones.length })}
+
+ )}
+
+
+
+
+ {t('catalog.sort_by')}
+ changeSort(value as SortType)}
+ />
+
+
+
+ {t('catalog.items_on_page')}
+ changeItems(+value)}
+ />
+
+
+
+
+
+ {isLoading ?
+ Array.from({ length: 8 }).map((_, i) => )
+ : visiblePhones.map((phone) => (
+
+ ))
+ }
+
+
+ {totalPages > 1 && (
+
+
+
changePage(currentPage - 1)}
+ className={`${s.pageButton} ${s.arrow} ${s.arrowLeft}`}
+ >
+
+
+
+ {paginationPages.map((page: number | string, index: number) => {
+ if (page === '...') {
+ return (
+
+ ...
+
+ );
+ }
+
+ return (
+
changePage(page as number)}
+ className={`${s.pageButton} ${
+ currentPage === page ? s.active : ''
+ }`}
+ >
+ {page}
+
+ );
+ })}
+
+
changePage(currentPage + 1)}
+ className={`${s.pageButton} ${s.arrow}`}
+ >
+
+
+
+
+ )}
+
+
+ );
+};
diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.scss b/src/pages/ProductDetailsPage/ProductDetailsPage.scss
new file mode 100644
index 00000000000..45bc14aeda4
--- /dev/null
+++ b/src/pages/ProductDetailsPage/ProductDetailsPage.scss
@@ -0,0 +1,130 @@
+@use '@styles/utils' as *;
+@use '@styles/variables.scss' as *;
+
+.loader-wrapper {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100vh;
+ width: 100%;
+}
+
+.product-not-found {
+ display: flex;
+ flex-direction: column;
+ min-height: 60vh;
+
+ &__content {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: 40px 20px;
+ }
+
+ &__title {
+ font-size: 32px;
+ font-weight: 700;
+ color: #313237;
+ margin-bottom: 16px;
+ }
+
+ &__text {
+ font-size: 16px;
+ color: $color-secondary-1;
+ max-width: 400px;
+ margin-bottom: 32px;
+ line-height: 1.5;
+ }
+
+ &__button {
+ padding: 12px 32px;
+ background-color: #313237;
+ color: $color-white;
+ border: none;
+ border-radius: 4px;
+ font-weight: 600;
+ cursor: pointer;
+ transition:
+ background-color 0.3s ease,
+ transform 0.2s ease;
+
+ &:hover {
+ background-color: #4a4b51;
+ transform: translateY(-2px);
+ }
+
+ &:active {
+ transform: translateY(0);
+ }
+ }
+}
+
+@media (max-width: 640px) {
+ .product-not-found__title {
+ font-size: 24px;
+ }
+}
+
+.product-details-page {
+ width: 100%;
+ min-height: 100vh;
+ padding-inline: 16px;
+ margin: 0;
+
+ @include on-tablet {
+ padding-inline: 24px;
+ }
+
+ @include on-desktop {
+ padding-inline: clamp(32px, calc(32px + (100vw - 1200px) * 0.5), 152px);
+ margin: 0 auto;
+ }
+
+ .product-header {
+ margin-top: 24px;
+
+ @include on-tablet {
+ margin-top: 16px;
+ }
+
+ .product-title {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 24px;
+ line-height: 32px;
+ letter-spacing: -0.01em;
+
+ @include on-tablet {
+ font-size: 40px;
+ line-height: 48px;
+ }
+ }
+ }
+
+ .product-content {
+ margin-top: 32px;
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ @include on-desktop {
+ @include page-grid;
+ align-items: start;
+ }
+
+ .product-main {
+ @include on-desktop {
+ grid-column: 1 / 17;
+ }
+ }
+
+ .product-side {
+ @include on-desktop {
+ grid-column: 17 / 25;
+ }
+ }
+ }
+}
diff --git a/src/pages/ProductDetailsPage/ProductDetailsPage.tsx b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx
new file mode 100644
index 00000000000..15280764f54
--- /dev/null
+++ b/src/pages/ProductDetailsPage/ProductDetailsPage.tsx
@@ -0,0 +1,178 @@
+import './ProductDetailsPage.scss';
+import { useParams, useNavigate, useLocation } from 'react-router-dom';
+import { useEffect, useRef, useState, useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import { ProductPage } from '@components/product/ProductPage/ProductPage';
+import { BackButton } from '@components/ui/Buttons/Back/BackButton';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { Loader } from '@components/ui/Loader/Loader';
+import { RatingsWidget } from '@components/product/Reviews/RatingsWidget';
+
+import { ProductDetails } from '@/types/Product';
+import { getProductDetails } from '@api/products';
+
+export const ProductDetailsPage = () => {
+ const { t } = useTranslation();
+ const { category, productId } = useParams<{
+ category: string;
+ productId: string;
+ }>();
+
+ const navigate = useNavigate();
+ const location = useLocation();
+
+ const [product, setProduct] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(false);
+
+ const [showReviews, setShowReviews] = useState(false);
+ const [scrollBeforeReviews, setScrollBeforeReviews] = useState(
+ null,
+ );
+ const headerRef = useRef(null);
+
+ const currentColorRef = useRef(null);
+
+ const fetchProductData = useCallback(
+ (idToFetch: string, isBackgroundUpdate = false) => {
+ if (!category) return;
+ if (!isBackgroundUpdate) setLoading(true);
+ setError(false);
+
+ getProductDetails(category, idToFetch)
+ .then((data) => {
+ setProduct(data);
+ })
+ .catch(() => {
+ setError(true);
+ })
+ .finally(() => {
+ setLoading(false);
+ });
+ },
+ [category],
+ );
+
+ useEffect(() => {
+ if (product) {
+ currentColorRef.current = product.color
+ .toLowerCase()
+ .replace(/\s+/g, '-');
+ }
+ }, [product]);
+
+ useEffect(() => {
+ if (!productId) return;
+
+ let isBackgroundUpdate = false;
+
+ if (
+ currentColorRef.current &&
+ productId.includes(currentColorRef.current)
+ ) {
+ isBackgroundUpdate = true;
+ }
+
+ const timeoutId = setTimeout(() => {
+ fetchProductData(productId, isBackgroundUpdate);
+ }, 0);
+
+ return () => clearTimeout(timeoutId);
+ }, [productId, fetchProductData]);
+
+ const handleCapacityUpdate = (newItemId: string) => {
+ if (!category) return;
+ const newParams = new URLSearchParams(location.search);
+ const capacityMatch = newItemId.match(/-(\d+(?:gb|tb))(?:-|$)/i);
+ if (capacityMatch) {
+ newParams.set('capacity', capacityMatch[1].toUpperCase());
+ }
+
+ navigate(
+ {
+ pathname: `/${category}/${newItemId}`,
+ search: newParams.toString(),
+ },
+ { replace: true },
+ );
+ };
+
+ const handleCloseReviews = () => {
+ setShowReviews(false);
+ if (scrollBeforeReviews !== null) {
+ const headerOffset = 80;
+ setTimeout(() => {
+ window.scrollTo({
+ top: scrollBeforeReviews - headerOffset,
+ behavior: 'smooth',
+ });
+ }, 0);
+ }
+ };
+
+ if (loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (error || !product) {
+ return (
+
+
+
+
+
+ {t(
+ 'product_details.not_found_title',
+ 'Unfortunately, the product is unknown.',
+ )}
+
+
+ {t(
+ 'product_details.not_found_text',
+ "We couldn't find the product you're looking for.",
+ )}
+
+
navigate(-1)}
+ >
+ {t('product_details.back')}
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
{product.name}
+ {
+ setScrollBeforeReviews(window.scrollY);
+ setShowReviews(true);
+ }}
+ />
+
+
+
+ );
+};
diff --git a/src/pages/ProfilePage/AdminPage/AdminPage.module.scss b/src/pages/ProfilePage/AdminPage/AdminPage.module.scss
new file mode 100644
index 00000000000..dad7c4f4b1f
--- /dev/null
+++ b/src/pages/ProfilePage/AdminPage/AdminPage.module.scss
@@ -0,0 +1,342 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+
+.profilePage {
+ min-height: 100vh;
+ background: $color-black;
+
+ &__container {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 16px 56px;
+
+ @include on-tablet {
+ padding: 0 24px 64px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px 80px;
+ }
+ }
+
+ &__layout {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ @include on-tablet {
+ flex-direction: row;
+ align-items: flex-start;
+ gap: 32px;
+ }
+ }
+
+ &__content {
+ flex: 1;
+ min-width: 0;
+ }
+
+ &__title {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ margin-top: 24px;
+ margin-bottom: 32px;
+ }
+}
+
+.statCard {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ padding: 20px 24px;
+ margin-bottom: 24px;
+
+ &__label {
+ color: #75778b;
+ font-size: 14px;
+ }
+
+ &__value {
+ color: $color-light-1;
+ font-size: 28px;
+ font-weight: 800;
+ letter-spacing: -0.01em;
+ }
+}
+
+.tableWrap {
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ overflow: hidden;
+ overflow-x: auto;
+}
+
+.table {
+ width: 100%;
+ border-collapse: collapse;
+
+ &__th {
+ padding: 12px 20px;
+ text-align: left;
+ font-size: 12px;
+ color: #75778b;
+ font-weight: 600;
+ border-bottom: 1px solid #3b3e56;
+ white-space: nowrap;
+ }
+
+ &__row {
+ transition: background 0.15s ease;
+
+ &:hover {
+ background: #1a1c30;
+ }
+
+ & + & td {
+ border-top: 1px solid #23253a;
+ }
+ }
+
+ &__td {
+ padding: 14px 20px;
+ font-size: 14px;
+ color: #c0c2d8;
+ white-space: nowrap;
+
+ &_id {
+ font-family: monospace;
+ font-size: 13px;
+ color: #75778b;
+ }
+ }
+}
+
+.badge {
+ display: inline-block;
+ padding: 3px 12px;
+ border-radius: 20px;
+ font-size: 12px;
+ font-weight: 700;
+
+ &_admin {
+ background: rgba(91, 110, 245, 0.15);
+ color: #7c8bff;
+ }
+
+ &_user {
+ background: rgba(117, 119, 139, 0.12);
+ color: #75778b;
+ }
+}
+
+.badge_delivered {
+ background: rgba(52, 199, 89, 0.12);
+ color: #34c759;
+}
+
+.badge_processing {
+ background: rgba(255, 159, 10, 0.12);
+ color: #ff9f0a;
+}
+
+.badge_cancelled {
+ background: rgba(255, 69, 58, 0.12);
+ color: #ff453a;
+}
+
+.actions {
+ display: flex;
+ gap: 8px;
+
+ &__btn {
+ background: rgba(117, 119, 139, 0.12);
+ color: #c0c2d8;
+ border: 1px solid #3b3e56;
+ border-radius: 6px;
+ padding: 4px 10px;
+ font-size: 12px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.2s;
+ white-space: nowrap;
+
+ &:hover:not(:disabled) {
+ background: rgba(117, 119, 139, 0.25);
+ color: $color-light-1;
+ }
+
+ &:disabled {
+ opacity: 0.3;
+ cursor: not-allowed;
+ }
+
+ &_danger {
+ background: rgba(255, 69, 58, 0.08);
+ color: #ff453a;
+ border-color: rgba(255, 69, 58, 0.2);
+
+ &:hover:not(:disabled) {
+ background: rgba(255, 69, 58, 0.2);
+ }
+ }
+ }
+}
+
+.supportBlock {
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ padding: 24px;
+ margin-top: 32px;
+
+ &__title {
+ color: $color-light-1;
+ font-size: 18px;
+ font-weight: 700;
+ margin-bottom: 20px;
+ }
+
+ &__field {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ margin-bottom: 16px;
+ }
+
+ &__label {
+ color: #75778b;
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ }
+
+ &__select {
+ background: $color-black;
+ border: 1px solid #3b3e56;
+ border-radius: 10px;
+ color: #c0c2d8;
+ font-size: 14px;
+ padding: 10px 14px;
+ outline: none;
+ cursor: pointer;
+ transition: border-color 0.2s;
+ appearance: none;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2375778b' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: right 14px center;
+ padding-right: 36px;
+
+ &:focus {
+ border-color: #5b6ef5;
+ }
+
+ option {
+ background: $color-surface-1;
+ color: #c0c2d8;
+ }
+ }
+
+ &__textarea {
+ background: $color-black;
+ border: 1px solid #3b3e56;
+ border-radius: 10px;
+ color: #c0c2d8;
+ font-size: 14px;
+ padding: 12px 14px;
+ outline: none;
+ resize: vertical;
+ font-family: inherit;
+ line-height: 1.6;
+ transition: border-color 0.2s;
+
+ &::placeholder {
+ color: #3b3e56;
+ }
+
+ &:focus {
+ border-color: #5b6ef5;
+ }
+ }
+
+ &__footer {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 8px;
+ }
+
+ &__submit {
+ background: rgba(91, 110, 245, 0.15);
+ color: #7c8bff;
+ border: 1px solid rgba(91, 110, 245, 0.35);
+ border-radius: 8px;
+ padding: 8px 22px;
+ font-size: 14px;
+ font-weight: 700;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: rgba(91, 110, 245, 0.3);
+ color: $color-light-1;
+ }
+ }
+}
+
+.conversation {
+ background: $color-black;
+ border: 1px solid #3b3e56;
+ border-radius: 10px;
+ padding: 12px;
+ max-height: 300px;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ margin-bottom: 16px;
+
+ &__msg {
+ padding: 10px 14px;
+ border-radius: 8px;
+ max-width: 80%;
+
+ &_user {
+ background: rgba(117, 119, 139, 0.12);
+ align-self: flex-start;
+ }
+
+ &_admin {
+ background: rgba(91, 110, 245, 0.12);
+ align-self: flex-end;
+ }
+ }
+
+ &__role {
+ font-size: 11px;
+ font-weight: 700;
+ color: #75778b;
+ display: block;
+ margin-bottom: 4px;
+ }
+
+ &__text {
+ font-size: 14px;
+ color: #c0c2d8;
+ margin: 0;
+ }
+
+ &__time {
+ font-size: 11px;
+ color: #3b3e56;
+ display: block;
+ margin-top: 4px;
+ text-align: right;
+ }
+}
diff --git a/src/pages/ProfilePage/AdminPage/AdminPage.tsx b/src/pages/ProfilePage/AdminPage/AdminPage.tsx
new file mode 100644
index 00000000000..c8c6aecdd0e
--- /dev/null
+++ b/src/pages/ProfilePage/AdminPage/AdminPage.tsx
@@ -0,0 +1,386 @@
+import React, { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './AdminPage.module.scss';
+import { Sidebar } from '@components/layout/SideBar';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { supabase } from '@utils/supabaseClient';
+import { useSupportRealtime } from '@hooks/useRealTime';
+
+interface AdminUser {
+ id: string;
+ email: string;
+ created_at: string;
+ is_admin: boolean;
+}
+
+interface AdminOrder {
+ id: string;
+ user_id: string;
+ status: string;
+ total: number;
+ date: string;
+}
+
+export const AdminPage: React.FC = () => {
+ const { t } = useTranslation();
+ const [users, setUsers] = useState([]);
+ const [orders, setOrders] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [currentUserId, setCurrentUserId] = useState('');
+
+ const [selectedUserId, setSelectedUserId] = useState('');
+ const [messageText, setMessageText] = useState('');
+ const [sending, setSending] = useState(false);
+ const [supportUsers, setSupportUsers] = useState([]);
+ const [conversation, setConversation] = useState<
+ { role: string; text: string; created_at: string }[]
+ >([]);
+
+ useEffect(() => {
+ const fetchData = async () => {
+ const {
+ data: { user },
+ } = await supabase.auth.getUser();
+ if (user) setCurrentUserId(user.id);
+
+ const [
+ { data: profilesData, error: profilesError },
+ { data: ordersData, error: ordersError },
+ { data: supportUserData, error: supportUserError },
+ ] = await Promise.all([
+ supabase.from('profiles').select('id, is_admin, email, created_at'),
+ supabase
+ .from('orders')
+ .select('id, user_id, status, total, date')
+ .order('date', { ascending: false }),
+ supabase.from('support_messages').select('user_id').eq('role', 'user'),
+ ]);
+
+ if (profilesError) {
+ setError(profilesError.message);
+ } else {
+ setUsers(
+ profilesData.map((p) => ({
+ id: p.id,
+ is_admin: p.is_admin,
+ email: p.email || '—',
+ created_at: new Date(p.created_at).toLocaleDateString('en-GB', {
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric',
+ }),
+ })),
+ );
+ }
+
+ if (!ordersError && ordersData) {
+ setOrders(
+ ordersData.map((o) => ({
+ ...o,
+ date: new Date(o.date).toLocaleDateString('en-GB', {
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric',
+ }),
+ })),
+ );
+ }
+
+ if (!supportUserError && supportUserData && profilesData) {
+ const activeIds = new Set(supportUserData.map((m) => m.user_id));
+ setSupportUsers(
+ profilesData
+ .filter((p) => activeIds.has(p.id))
+ .map((p) => ({
+ id: p.id,
+ is_admin: p.is_admin,
+ email: p.email || '—',
+ created_at: new Date(p.created_at).toLocaleDateString('en-GB', {
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric',
+ }),
+ })),
+ );
+ }
+ setLoading(false);
+ };
+ fetchData();
+ }, []);
+
+ useSupportRealtime(selectedUserId, (msg) => {
+ setConversation((prev) => [...prev, msg]);
+ });
+
+ const toggleAdmin = async (userId: string, current: boolean) => {
+ const { error } = await supabase
+ .from('profiles')
+ .update({ is_admin: !current })
+ .eq('id', userId);
+ if (!error) {
+ setUsers((prev) =>
+ prev.map((u) => (u.id === userId ? { ...u, is_admin: !current } : u)),
+ );
+ }
+ };
+
+ const fetchConversation = async (userId: string) => {
+ const { data } = await supabase
+ .from('support_messages')
+ .select('role, text, created_at')
+ .eq('user_id', userId)
+ .order('created_at', { ascending: true });
+ if (data) setConversation(data);
+ };
+
+ const deleteUser = async (userId: string) => {
+ if (!confirm(t('admin.confirm_delete'))) return;
+ const { error } = await supabase.from('profiles').delete().eq('id', userId);
+ if (!error) {
+ setUsers((prev) => prev.filter((u) => u.id !== userId));
+ }
+ };
+
+ const sendSupportMessage = async () => {
+ if (!selectedUserId || !messageText.trim()) return;
+ setSending(true);
+ const { error } = await supabase.from('support_messages').insert({
+ user_id: selectedUserId,
+ role: 'admin',
+ text: messageText.trim(),
+ });
+ if (!error) setMessageText('');
+ setSending(false);
+ };
+
+ if (loading) return {t('auth.loading')}
;
+ if (error) return {error}
;
+
+ return (
+
+
+
+
+
+
+ {t('admin.title')}
+
+
+ {t('admin.total_users')}
+
+ {users.length}
+
+
+
+
+
+ {t('admin.table_id')}
+
+ {t('admin.table_email')}
+
+
+ {t('admin.table_registered')}
+
+
+ {t('admin.table_role')}
+
+
+ {t('admin.table_actions')}
+
+
+
+
+ {users.map((user) => (
+
+
+ {user.id.slice(0, 8)}...
+
+ {user.email}
+ {user.created_at}
+
+
+ {user.is_admin ? 'Admin' : 'User'}
+
+
+
+
+ toggleAdmin(user.id, user.is_admin)}
+ disabled={user.id === currentUserId}
+ >
+ {user.is_admin ?
+ t('admin.btn_remove_admin')
+ : t('admin.btn_make_admin')}
+
+ deleteUser(user.id)}
+ disabled={user.id === currentUserId}
+ >
+ {t('admin.btn_delete')}
+
+
+
+
+ ))}
+
+
+
+
+
+ {t('admin.total_orders')}
+
+ {orders.length}
+
+
+
+
+
+
+ {t('checkout.summary')} ID
+
+ {t('admin.table_id')}
+
+ {t('admin.table_status')}
+
+
+ {t('admin.table_total')}
+
+
+ {t('admin.table_date')}
+
+
+
+
+ {orders.map((order) => (
+
+
+ {order.id.slice(0, 8)}...
+
+
+ {order.user_id.slice(0, 8)}...
+
+
+
+ {t(`orders.status_${order.status}`)}
+
+
+
+ ${order.total.toFixed(2)}
+
+ {order.date}
+
+ ))}
+
+
+
+
+
+ {t('admin.support_messages')}
+
+
+ {supportUsers.length}
+
+
+
+
+ {t('admin.reply_title')}
+
+
+
+ {t('admin.reply_to')}
+
+ {
+ setSelectedUserId(e.target.value);
+ fetchConversation(e.target.value);
+ }}
+ >
+ {t('admin.select_user')}
+ {supportUsers.map((user) => (
+
+ {user.email}
+
+ ))}
+
+
+ {conversation.length > 0 && (
+
+ {conversation.map((msg, i) => (
+
+
+ {msg.role === 'admin' ?
+ t('admin.you')
+ : t('admin.user')}
+
+
{msg.text}
+
+ {new Date(msg.created_at).toLocaleTimeString('en-GB', {
+ hour: '2-digit',
+ minute: '2-digit',
+ })}
+
+
+ ))}
+
+ )}
+
+
+ {t('admin.table_actions')}
+
+
+
+
+ {t('admin.send')}
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.module.scss b/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.module.scss
new file mode 100644
index 00000000000..bba9fe9e707
--- /dev/null
+++ b/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.module.scss
@@ -0,0 +1,213 @@
+@use '@styles/utils' as *;
+@use '@styles/variables' as *;
+.loaderWrapper {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 60vh;
+}
+
+.profilePage {
+ min-height: 100vh;
+ background: $color-black;
+
+ &__container {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 16px 56px;
+
+ @include on-tablet {
+ padding: 0 24px 64px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px 80px;
+ }
+ }
+
+ &__layout {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ @include on-tablet {
+ flex-direction: row;
+ align-items: flex-start;
+ gap: 32px;
+ }
+ }
+
+ &__content {
+ flex: 1;
+ min-width: 0;
+ }
+
+ &__title {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ margin-top: 24px;
+ margin-bottom: 32px;
+ }
+}
+
+// ── order list ────────────────────────────────────────────────────────────
+.orderList {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+// ── order card ────────────────────────────────────────────────────────────
+.orderCard {
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ overflow: hidden;
+ transition: border-color 0.2s ease;
+
+ &:hover {
+ border-color: #5c5f7a;
+ }
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-bottom: 1px solid #3b3e56;
+ }
+
+ &__meta {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ }
+
+ &__id {
+ color: $color-light-1;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ &__date {
+ color: #75778b;
+ font-size: 12px;
+ }
+
+ &__status {
+ font-size: 12px;
+ font-weight: 700;
+ padding: 4px 12px;
+ border-radius: 20px;
+
+ &--delivered {
+ background: rgba(52, 199, 89, 0.12);
+ color: #34c759;
+ }
+
+ &--processing {
+ background: rgba(255, 159, 10, 0.12);
+ color: #ff9f0a;
+ }
+
+ &--cancelled {
+ background: rgba(255, 69, 58, 0.12);
+ color: #ff453a;
+ }
+ }
+
+ &__items {
+ display: flex;
+ flex-direction: column;
+ padding: 8px 0;
+ }
+
+ &__footer {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-top: 1px solid #3b3e56;
+ }
+
+ &__totalLabel {
+ color: #75778b;
+ font-size: 14px;
+ }
+
+ &__total {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 20px;
+ }
+}
+
+// ── order item row ────────────────────────────────────────────────────────
+.orderItem {
+ display: grid;
+ grid-template-columns: 56px 1fr auto auto;
+ align-items: center;
+ gap: 16px;
+ padding: 12px 20px;
+
+ & + & {
+ border-top: 1px solid #23253a;
+ }
+
+ &__image {
+ width: 56px;
+ height: 56px;
+ object-fit: contain;
+ border-radius: 8px;
+ background: #1e2035;
+ }
+
+ &__name {
+ color: $color-light-1;
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 1.4;
+ }
+
+ &__qty {
+ color: #75778b;
+ font-size: 13px;
+ white-space: nowrap;
+ }
+
+ &__price {
+ color: $color-light-1;
+ font-weight: 700;
+ font-size: 14px;
+ white-space: nowrap;
+ }
+}
+
+.emptyOrders {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+ padding: 80px 24px;
+ text-align: center;
+
+ &__icon {
+ font-size: 56px;
+ opacity: 0.35;
+ }
+
+ &__text {
+ color: $color-light-1;
+ font-size: 18px;
+ font-weight: 700;
+ }
+
+ &__sub {
+ color: #75778b;
+ font-size: 14px;
+ }
+}
diff --git a/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.tsx b/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.tsx
new file mode 100644
index 00000000000..bdbaa6d4607
--- /dev/null
+++ b/src/pages/ProfilePage/ProfileOrderPage/ProfileOrderPage.tsx
@@ -0,0 +1,116 @@
+import React, { useEffect, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './ProfileOrderPage.module.scss';
+import { Sidebar } from '@components/layout/SideBar';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { Order, ProductFromDB } from '@/types/CartOrder';
+import { supabase } from '@utils/supabaseClient';
+import { Loader } from '@components/ui/Loader/Loader';
+import { EmptyOrders } from '@components/ui/Profile/CartHistory/EmptyOrders/EmptyOrders';
+import { OrderCard } from '@components/ui/Profile/CartHistory/OrderCard/OrderCard';
+
+export const ProfileOrderPage: React.FC = () => {
+ const { t, i18n } = useTranslation();
+ const [orders, setOrders] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchOrders = async () => {
+ const {
+ data: { user },
+ } = await supabase.auth.getUser();
+
+ if (!user) {
+ setError(t('checkout.error_login'));
+ setLoading(false);
+ return;
+ }
+
+ const { data, error } = await supabase
+ .from('orders')
+ .select(
+ `
+ id,
+ date,
+ status,
+ total,
+ order_items (
+ id,
+ name,
+ price,
+ quantity,
+ product_id,
+ products (
+ image
+ )
+ )
+ `,
+ )
+ .eq('user_id', user.id)
+ .order('date', { ascending: false });
+
+ if (error) {
+ setError(error.message);
+ } else {
+ const format: Order[] = data.map((order) => ({
+ id: order.id,
+ date: new Date(order.date).toLocaleDateString(i18n.language, {
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric',
+ }),
+ status: order.status,
+ total: order.total,
+ items: order.order_items.map((item) => ({
+ id: item.id,
+ name: item.name,
+ price: item.price,
+ quantity: item.quantity ?? 1,
+ image:
+ (item.products as unknown as ProductFromDB | null)?.image || '',
+ })),
+ }));
+
+ setOrders(format);
+ }
+
+ setLoading(false);
+ };
+
+ fetchOrders();
+ }, [t, i18n.language]);
+
+ return (
+
+
+
+
+
+
+
+ {t('orders.title')}
+
+ {loading ?
+
+
+
+ : error ?
+ {error}
+ : orders.length === 0 ?
+
+ :
+ {orders.map((order) => (
+
+ ))}
+
+ }
+
+
+
+
+ );
+};
diff --git a/src/pages/ProfilePage/ProfilePage.module.scss b/src/pages/ProfilePage/ProfilePage.module.scss
new file mode 100644
index 00000000000..dac1709a75b
--- /dev/null
+++ b/src/pages/ProfilePage/ProfilePage.module.scss
@@ -0,0 +1,107 @@
+@use '@styles/utils.scss' as *;
+@use '@styles/variables.scss' as *;
+
+.profilePage {
+ min-height: 100vh;
+ color: $color-light-1;
+
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ &__layout {
+ display: block;
+
+ @media (min-width: 640px) {
+ display: flex;
+ gap: 60px;
+ }
+ }
+
+ &__content {
+ flex: 1;
+ padding-bottom: 60px;
+ }
+
+ &__title {
+ margin: 24px 0;
+ font-family: Mont, sans-serif;
+ font-weight: 800;
+ font-size: 32px;
+ }
+}
+
+.userInfo {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 24px;
+
+ @media (min-width: 640px) {
+ flex-direction: row;
+ align-items: flex-start;
+ }
+
+ &__photo {
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ object-fit: cover;
+ background-color: #313237;
+ }
+
+ &__details {
+ display: flex;
+ flex-direction: column;
+ text-align: center;
+
+ @media (min-width: 640px) {
+ text-align: left;
+ }
+ }
+
+ &__label {
+ font-weight: 700;
+ font-size: 16px;
+ margin: 0 0 4px 0;
+ }
+
+ &__value {
+ font-size: 14px;
+ color: $color-secondary;
+ margin-bottom: 16px;
+ }
+}
+
+.logoutButton {
+ margin-top: 16px;
+ padding: 12px 32px;
+ background-color: #e74c3c;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: 0.3s;
+
+ &:hover {
+ background-color: #c0392b;
+ }
+}
+
+.loading {
+ display: flex;
+ justify-content: center;
+ padding-top: 100px;
+}
diff --git a/src/pages/ProfilePage/ProfilePage.tsx b/src/pages/ProfilePage/ProfilePage.tsx
new file mode 100644
index 00000000000..73c4a27b41f
--- /dev/null
+++ b/src/pages/ProfilePage/ProfilePage.tsx
@@ -0,0 +1,122 @@
+import { useEffect, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import { supabase } from '@utils/supabaseClient';
+import { User } from '@supabase/supabase-js';
+import styles from './ProfilePage.module.scss';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { Loader } from '@components/ui/Loader/Loader';
+import { Sidebar } from '@components/layout/SideBar';
+
+export const ProfilePage = () => {
+ const { t, i18n } = useTranslation();
+ const [user, setUser] = useState(null);
+ const [phone, setPhone] = useState(null);
+ const navigate = useNavigate();
+
+ const fetchPhone = async (userId: string) => {
+ const { data, error } = await supabase
+ .from('orders')
+ .select('phone')
+ .eq('user_id', userId)
+ .not('phone', 'is', null)
+ .limit(1)
+ .maybeSingle();
+ if (!error && data?.phone) setPhone(data.phone);
+ };
+
+ useEffect(() => {
+ const getUser = async () => {
+ const {
+ data: { session },
+ } = await supabase.auth.getSession();
+ if (session?.user) {
+ setUser(session.user);
+ fetchPhone(session.user.id);
+ } else {
+ navigate('/');
+ }
+ };
+ getUser();
+ }, [navigate]);
+
+ const handleLogout = async () => {
+ await supabase.auth.signOut();
+ navigate('/');
+ };
+
+ const formatDate = (dateString: string) => {
+ return new Date(dateString).toLocaleDateString(
+ i18n.language === 'ua' ? 'uk-UA' : 'en-GB',
+ {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ },
+ );
+ };
+
+ return (
+
+
+
+
+
+
+ {t('profile.title')}
+ {user ?
+
+
+
+
+
+ {t('profile.name')}:
+
+
+ {user.user_metadata.full_name || '-'}
+
+
+ {t('profile.email')}:
+
+
{user.email}
+ {phone && (
+ <>
+
+ {t('profile.phone')}:
+
+
{phone}
+ >
+ )}
+
+ {t('profile.created')}:
+
+
+ {formatDate(user.created_at)}
+
+
+ {t('profile.logout')}
+
+
+
+
+ :
+
+
+ }
+
+
+
+
+ );
+};
diff --git a/src/pages/ProfilePage/SupportChat/SupportChat.module.scss b/src/pages/ProfilePage/SupportChat/SupportChat.module.scss
new file mode 100644
index 00000000000..24527661ff3
--- /dev/null
+++ b/src/pages/ProfilePage/SupportChat/SupportChat.module.scss
@@ -0,0 +1,166 @@
+@use '@styles/utils.scss' as *;
+@use '@styles/variables' as *;
+.profilePage {
+ min-height: 100vh;
+ background: $color-black;
+
+ &__container {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 0 16px 56px;
+
+ @include on-tablet {
+ padding: 0 24px 64px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px 80px;
+ }
+ }
+
+ &__layout {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+
+ @include on-tablet {
+ flex-direction: row;
+ align-items: flex-start;
+ gap: 32px;
+ }
+ }
+
+ &__content {
+ flex: 1;
+ min-width: 0;
+ }
+
+ &__title {
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ margin-top: 24px;
+ margin-bottom: 32px;
+ }
+}
+
+.chat {
+ display: flex;
+ flex-direction: column;
+ height: 70vh;
+ background: $color-surface-1;
+ border: 1px solid #3b3e56;
+ border-radius: 16px;
+ overflow: hidden;
+}
+
+.messages {
+ flex: 1;
+ overflow-y: auto;
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ &::-webkit-scrollbar {
+ width: 4px;
+ }
+ &::-webkit-scrollbar-thumb {
+ background: #3b3e56;
+ border-radius: 4px;
+ }
+}
+
+.empty {
+ margin: auto;
+ color: #4a4d63;
+ font-size: 14px;
+}
+
+.bubble {
+ max-width: 70%;
+ padding: 10px 14px;
+ border-radius: 16px;
+ font-size: 14px;
+ line-height: 1.5;
+ word-break: break-word;
+
+ &--user {
+ align-self: flex-end;
+ background: #2e3150;
+ color: $color-light-1;
+ border-bottom-right-radius: 4px;
+ }
+
+ &--admin {
+ align-self: flex-start;
+ background: #1e2035;
+ color: #d4d5e4;
+ border: 1px solid #3b3e56;
+ border-bottom-left-radius: 4px;
+ }
+}
+
+.time {
+ font-size: 11px;
+ color: #4a4d63;
+
+ &--user {
+ align-self: flex-end;
+ }
+ &--admin {
+ align-self: flex-start;
+ }
+}
+
+.inputArea {
+ display: flex;
+ gap: 10px;
+ padding: 14px 20px;
+ border-top: 1px solid #3b3e56;
+ flex-shrink: 0;
+}
+
+.textarea {
+ flex: 1;
+ background: #1e2035;
+ border: 1px solid #3b3e56;
+ border-radius: 12px;
+ color: $color-light-1;
+ font-size: 14px;
+ padding: 10px 14px;
+ resize: none;
+ height: 42px;
+ outline: none;
+ font-family: inherit;
+
+ &::placeholder {
+ color: #4a4d63;
+ }
+ &:focus {
+ border-color: #5c5f7a;
+ }
+}
+
+.sendBtn {
+ width: 42px;
+ height: 42px;
+ border-radius: 12px;
+ border: none;
+ background: #5c5f7a;
+ color: $color-light-1;
+ font-size: 18px;
+ cursor: pointer;
+ flex-shrink: 0;
+ transition: background 0.2s;
+
+ &:hover:not(:disabled) {
+ background: #75778b;
+ }
+ &:disabled {
+ opacity: 0.35;
+ cursor: not-allowed;
+ }
+}
diff --git a/src/pages/ProfilePage/SupportChat/SupportChat.tsx b/src/pages/ProfilePage/SupportChat/SupportChat.tsx
new file mode 100644
index 00000000000..fab806ddf39
--- /dev/null
+++ b/src/pages/ProfilePage/SupportChat/SupportChat.tsx
@@ -0,0 +1,125 @@
+import React, { useEffect, useRef, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import styles from './SupportChat.module.scss';
+import { Sidebar } from '@components/layout/SideBar';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { supabase } from '@utils/supabaseClient';
+import { useSupportRealtime } from '@hooks/useRealTime';
+
+interface Message {
+ id: string;
+ role: 'user' | 'admin';
+ text: string;
+ created_at: string;
+}
+
+export const SupportChat: React.FC = () => {
+ const { t } = useTranslation();
+ const [messages, setMessages] = useState([]);
+ const [text, setText] = useState('');
+ const [userId, setUserId] = useState(null);
+ const bottomRef = useRef(null);
+
+ useEffect(() => {
+ supabase.auth.getUser().then(({ data: { user } }) => {
+ if (!user) return;
+ setUserId(user.id);
+ supabase
+ .from('support_messages')
+ .select('*')
+ .eq('user_id', user.id)
+ .order('created_at')
+ .then(({ data }) => data && setMessages(data));
+ });
+ }, []);
+
+ useSupportRealtime(userId ?? '', (msg) => {
+ setMessages((prev) => [...prev, msg as Message]);
+ });
+
+ const handleSend = async () => {
+ const trimmed = text.trim();
+ if (!trimmed || !userId) return;
+
+ setText('');
+ const isFirstMessage = messages.length === 0;
+
+ await supabase
+ .from('support_messages')
+ .insert({ user_id: userId, role: 'user', text: trimmed });
+
+ if (isFirstMessage) {
+ await supabase.from('support_messages').insert({
+ user_id: userId,
+ role: 'admin',
+ text: t('help_widget.bot_replies.0'),
+ });
+ }
+ };
+
+ useEffect(() => {
+ bottomRef.current?.scrollIntoView({ behavior: 'smooth' });
+ }, [messages]);
+
+ return (
+
+
+
+
+
+
+
+ {t('profile_sidebar.chat')}
+
+
+
+ {messages.length === 0 && (
+
{t('help_widget.welcome')}
+ )}
+ {messages.map((msg) => (
+
+
+ {msg.text}
+
+
+ {new Date(msg.created_at).toLocaleTimeString([], {
+ hour: '2-digit',
+ minute: '2-digit',
+ })}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/pages/ProfilePage/WalletPage/WalletPage.module.scss b/src/pages/ProfilePage/WalletPage/WalletPage.module.scss
new file mode 100644
index 00000000000..6acdd3185b0
--- /dev/null
+++ b/src/pages/ProfilePage/WalletPage/WalletPage.module.scss
@@ -0,0 +1,48 @@
+@use '@styles/utils.scss' as *;
+
+.walletPage {
+ min-height: 100vh;
+ color: #f1f2f9;
+
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ &__layout {
+ display: block;
+
+ @media (min-width: 640px) {
+ display: flex;
+ gap: 60px;
+ }
+ }
+
+ &__sidebar {
+ flex-shrink: 0;
+ width: 280px;
+ }
+
+ &__content {
+ flex: 1;
+ min-width: 0;
+ padding-bottom: 60px;
+ }
+
+ &__title {
+ margin: 24px 0;
+ font-family: Mont, sans-serif;
+ font-weight: 800;
+ font-size: 32px;
+ }
+}
diff --git a/src/pages/ProfilePage/WalletPage/WalletPage.tsx b/src/pages/ProfilePage/WalletPage/WalletPage.tsx
new file mode 100644
index 00000000000..60a270fdb8c
--- /dev/null
+++ b/src/pages/ProfilePage/WalletPage/WalletPage.tsx
@@ -0,0 +1,26 @@
+import { Sidebar } from '@components/layout/SideBar';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { useTranslation } from 'react-i18next';
+import styles from './WalletPage.module.scss';
+
+export const WalletPage = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
+
+
+
+ {t('nav.wallet')}
+ {t('nav.wallet').toLowerCase()}
+
+
+
+
+ );
+};
diff --git a/src/pages/RightsPage/RightsPage.module.scss b/src/pages/RightsPage/RightsPage.module.scss
new file mode 100644
index 00000000000..f13af9aa2b5
--- /dev/null
+++ b/src/pages/RightsPage/RightsPage.module.scss
@@ -0,0 +1,114 @@
+@use '@styles/utils' as *;
+@use '@styles/variables.scss' as *;
+
+.rights-page {
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ &__title {
+ margin: 48px 0 40px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid $color-border;
+
+ color: $color-light-1;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+
+ @include on-tablet {
+ margin-top: 64px;
+ }
+
+ @include on-desktop {
+ margin-top: 80px;
+ font-size: 40px;
+ line-height: 48px;
+ }
+ }
+
+ &__section {
+ margin-bottom: 48px;
+ }
+
+ &__section-title {
+ margin-bottom: 16px;
+ color: $color-light-1;
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 30px;
+ letter-spacing: -0.01em;
+ }
+
+ &__paragraph {
+ margin-bottom: 16px;
+ color: $color-secondary;
+ font-size: 14px;
+ line-height: 1.75;
+
+ &--bold {
+ font-weight: 500;
+ color: $color-light-1;
+ }
+ }
+
+ &__list {
+ list-style: disc;
+ padding-left: 24px;
+
+ li {
+ margin-bottom: 8px;
+ color: $color-secondary;
+ font-size: 14px;
+ line-height: 1.75;
+ }
+ }
+
+ &__link {
+ font-weight: 700;
+ color: inherit;
+ text-decoration: underline;
+ text-decoration-color: $color-accent;
+ text-underline-offset: 4px;
+ transition: color $transition-default;
+
+ &:hover {
+ color: $color-accent;
+ }
+ }
+
+ &__footer {
+ margin-bottom: 56px;
+ padding: 24px;
+ background-color: $bg-surface;
+ border-radius: 8px;
+ border-left: 4px solid $color-accent;
+
+ @include on-tablet {
+ margin-bottom: 64px;
+ }
+
+ @include on-desktop {
+ margin-bottom: 80px;
+ }
+ }
+
+ &__footer-text {
+ margin: 0;
+ font-size: 12px;
+ font-style: italic;
+ color: $color-secondary;
+ }
+}
diff --git a/src/pages/RightsPage/RightsPage.tsx b/src/pages/RightsPage/RightsPage.tsx
new file mode 100644
index 00000000000..619d2b04902
--- /dev/null
+++ b/src/pages/RightsPage/RightsPage.tsx
@@ -0,0 +1,95 @@
+import { Link } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import styles from './RightsPage.module.scss';
+
+export const RightsPage = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+ {t('rights_page.title')}
+
+
+
+
+ {t('rights_page.section1_title')}
+
+
+ {t('rights_page.section1_text')}{' '}
+
+ Tech Store
+
+ {t('rights_page.section1_subtext')}
+
+
+
+
+
+ {t('rights_page.section2_title')}
+
+
+ {t('rights_page.section2_text')}
+
+
+ {t('rights_page.section2_list.0')}
+
+
+ Tech Store
+ {' '}
+ {t('rights_page.section2_list.1')}
+
+ {t('rights_page.section2_list.2')}
+
+
+
+
+
+ {t('rights_page.section3_title')}
+
+
+ {t('rights_page.section3_text1')}{' '}
+
+ Tech Store
+ {' '}
+ {t('rights_page.section3_text2')}
+
+
+
+
+
+ {t('rights_page.section4_title')}
+
+
+ {t('rights_page.section4_text1')}{' '}
+
+ Tech Store
+ {' '}
+ {t('rights_page.section4_text2')}
+
+
+
+
+
+ {t('rights_page.updated')}
+
+
+
+
+ );
+};
diff --git a/src/pages/TabletsPage/TabletsPage.module.scss b/src/pages/TabletsPage/TabletsPage.module.scss
new file mode 100644
index 00000000000..88c1afe1c30
--- /dev/null
+++ b/src/pages/TabletsPage/TabletsPage.module.scss
@@ -0,0 +1,173 @@
+@use '@styles/utils' as *;
+@use '@styles/variables.scss' as *;
+
+.tablets-page {
+ &__container {
+ box-sizing: border-box;
+ margin: 0 auto;
+ max-width: 1280px;
+ padding: 0 16px;
+
+ @include on-tablet {
+ padding: 0 24px;
+ }
+
+ @include on-desktop {
+ padding: 0 32px;
+ }
+ }
+
+ .title {
+ margin-top: 24px;
+ margin-bottom: 8px;
+ color: $color-light-1;
+ font-family: Mont;
+ font-weight: 800;
+ font-size: 32px;
+ line-height: 41px;
+ letter-spacing: -0.01em;
+ }
+
+ .modelsCount {
+ margin-bottom: 24px;
+ font-size: 14px;
+ color: $color-secondary;
+ }
+
+ &__controls {
+ margin-bottom: 24px;
+ }
+
+ .controls {
+ display: flex;
+ gap: 16px;
+ align-items: flex-end;
+ }
+
+ .control {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ }
+
+ .label {
+ font-size: 12px;
+ color: $color-secondary;
+ }
+
+ .select {
+ width: 136px;
+ border-radius: 8px;
+ height: 40px;
+ padding: 0 12px;
+
+ background: $color-surface-2;
+ border: 1px solid $color-elements;
+ color: $color-light-1;
+
+ font-family: Mont;
+ font-size: 14px;
+ appearance: none;
+ background-image: url('@/assets/icons/arrow-down.svg');
+ background-repeat: no-repeat;
+ background-position: right 12px center;
+ }
+
+ &__list {
+ padding-bottom: 56px;
+
+ @include on-tablet {
+ padding-bottom: 64px;
+ }
+
+ @include on-desktop {
+ padding-bottom: 80px;
+ }
+
+ display: grid;
+ column-gap: 16px;
+ row-gap: 40px;
+
+ grid-template-columns: 1fr;
+
+ @media (min-width: 640px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (min-width: 768px) {
+ grid-template-columns: repeat(3, 1fr);
+ }
+
+ @include on-desktop {
+ grid-template-columns: repeat(4, 1fr);
+ }
+
+ & > * {
+ min-width: 0;
+ }
+ }
+
+ &__pagination {
+ padding-bottom: 40px;
+ }
+
+ .pagination {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 6px;
+ }
+
+ .pageButton {
+ width: 32px;
+ height: 32px;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ border-radius: 50%;
+ border: 1px solid $color-elements;
+ background: $color-surface-1;
+ color: $color-light-1;
+
+ cursor: pointer;
+
+ transition:
+ border-color 0.2s ease,
+ background-color 0.2s ease,
+ transform 0.15s ease;
+
+ &:hover:not(:disabled) {
+ border-color: $color-white;
+ }
+
+ &:active:not(:disabled) {
+ transform: scale(0.95);
+ }
+
+ &:disabled {
+ opacity: 0.4;
+ cursor: default;
+ }
+ }
+
+ .arrow {
+ margin: 0 8px;
+ background-color: $color-surface-2;
+ }
+
+ .arrow img {
+ width: 16px;
+ height: 16px;
+ }
+
+ .arrowLeft img {
+ transform: rotate(180deg);
+ }
+
+ .active {
+ background: #905bff;
+ border-color: #905bff;
+ }
+}
diff --git a/src/pages/TabletsPage/TabletsPage.tsx b/src/pages/TabletsPage/TabletsPage.tsx
new file mode 100644
index 00000000000..15604864479
--- /dev/null
+++ b/src/pages/TabletsPage/TabletsPage.tsx
@@ -0,0 +1,175 @@
+import { useEffect, useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { getTablets } from '@api/products';
+import { Product } from '@/types/Product';
+import { ProductCard } from '@components/product/ProductCard/ProductCard';
+import { SortType } from '@/types/SortType';
+import s from './TabletsPage.module.scss';
+import { Breadcrumbs } from '@components/ui/Breadcrumbs/Breadcrumbs';
+import { ProductSkeleton } from '@components/product/ProductSkelet/ProductSkelet';
+import { Dropdown } from '@components/ui/Dropdown/Dropdown';
+import { sortProducts } from '@utils/productFilters';
+import { usePaginationWithParams } from '@hooks/usePaginationWithParams';
+import arrowIcon from '@assets/icons/arrow-right.svg';
+
+export const TabletsPage = () => {
+ const { t } = useTranslation();
+ const [tablets, setTablets] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+ const {
+ sortBy,
+ itemsOnPage,
+ currentPage,
+ changeSort,
+ changeItems,
+ changePage,
+ } = usePaginationWithParams({
+ basePath: '/tablets',
+ });
+
+ useEffect(() => {
+ const loadTablets = async () => {
+ setIsLoading(true);
+ try {
+ const data = await getTablets();
+ setTablets(
+ data.map((tablet) => ({
+ ...tablet,
+ category: 'tablets',
+ })),
+ );
+ } catch (error) {
+ console.error('Failed to fetch tablets:', error);
+ } finally {
+ setTimeout(() => setIsLoading(false), 600);
+ }
+ };
+
+ loadTablets();
+ }, []);
+
+ useEffect(() => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth',
+ });
+ }, [currentPage]);
+
+ const sortedTablets = useMemo(() => {
+ return sortProducts(tablets, sortBy);
+ }, [tablets, sortBy]);
+
+ const totalPages = Math.ceil(sortedTablets.length / itemsOnPage);
+
+ const visibleTablets = useMemo(() => {
+ const start = (currentPage - 1) * itemsOnPage;
+ const end = start + itemsOnPage;
+
+ return sortedTablets.slice(start, end);
+ }, [sortedTablets, itemsOnPage, currentPage]);
+
+ const sortOptions = [
+ { label: t('catalog.price_low'), value: 'priceLow' },
+ { label: t('catalog.price_high'), value: 'priceHigh' },
+ { label: t('catalog.age'), value: 'newest' },
+ { label: t('catalog.oldest'), value: 'oldest' },
+ ];
+
+ const itemsOptions = [
+ { label: '12', value: '12' },
+ { label: '24', value: '24' },
+ { label: '36', value: '36' },
+ { label: '48', value: '48' },
+ ];
+
+ return (
+
+
+
+
+
{t('nav.tablets')}
+
+ {!isLoading && (
+
+ {t('categories.models_count', { count: tablets.length })}
+
+ )}
+
+
+
+
+ {t('catalog.sort_by')}
+ changeSort(value as SortType)}
+ />
+
+
+
+ {t('catalog.items_on_page')}
+ changeItems(+value)}
+ />
+
+
+
+
+
+ {isLoading ?
+ Array.from({ length: 8 }).map((_, i) => )
+ : visibleTablets.map((tablet) => (
+
+ ))
+ }
+
+
+ {totalPages > 1 && (
+
+
+
changePage(currentPage - 1)}
+ className={`${s.pageButton} ${s.arrow} ${s.arrowLeft}`}
+ >
+
+
+
+ {[...Array(totalPages)].map((_, index) => {
+ const page = index + 1;
+ return (
+
changePage(page)}
+ className={`${s.pageButton} ${currentPage === page ? s.active : ''}`}
+ >
+ {page}
+
+ );
+ })}
+
+
changePage(currentPage + 1)}
+ className={`${s.pageButton} ${s.arrow}`}
+ >
+
+
+
+
+ )}
+
+
+ );
+};
diff --git a/src/styles/global.scss b/src/styles/global.scss
new file mode 100644
index 00000000000..e131ecac9b3
--- /dev/null
+++ b/src/styles/global.scss
@@ -0,0 +1,33 @@
+.my-custom-toast {
+ border-radius: 8px !important;
+ font-family: inherit !important;
+
+ padding: 10px 14px !important;
+ font-size: 14px !important;
+ width: calc(100vw - 32px) !important;
+ margin: 0 16px 16px !important;
+
+ @include on-tablet {
+ padding: 8px 12px !important;
+ font-size: 14px !important;
+ width: fit-content !important;
+ min-width: 250px !important;
+ max-width: 350px !important;
+ margin: 0 !important;
+ }
+
+ @include on-desktop {
+ padding: 10px 16px !important;
+ min-width: 300px !important;
+ }
+}
+
+.my-custom-toast [data-title] {
+ font-weight: 600 !important;
+ margin-bottom: 2px !important;
+}
+
+.my-custom-toast [data-description] {
+ font-size: 13px !important;
+ opacity: 0.8;
+}
diff --git a/src/styles/utils.scss b/src/styles/utils.scss
new file mode 100644
index 00000000000..dbf6850c3d9
--- /dev/null
+++ b/src/styles/utils.scss
@@ -0,0 +1,28 @@
+@mixin on-tablet() {
+ @media (min-width: 640px) {
+ @content;
+ }
+}
+
+@mixin on-desktop() {
+ @media (min-width: 1200px) {
+ @content;
+ }
+}
+
+@mixin page-grid {
+ --columns: 4;
+
+ display: grid;
+ column-gap: 16px;
+ grid-template-columns: repeat(var(--columns), minmax(0, 1fr));
+ justify-content: center;
+
+ @include on-tablet {
+ --columns: 12;
+ }
+
+ @include on-desktop {
+ --columns: 24;
+ }
+}
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
new file mode 100644
index 00000000000..f227a21e809
--- /dev/null
+++ b/src/styles/variables.scss
@@ -0,0 +1,167 @@
+:root {
+ --color-black: #0f1121;
+ --color-surface: #323542;
+ --color-surface-1: #161827;
+ --color-surface-2: #323542;
+ --color-surface-3: #323542;
+ --color-elements: #3b3e4a;
+ --color-elements-1: #3b3e4a;
+ --color-icons: #4a4d58;
+ --color-secondary: #75767f;
+ --color-drobdown: #161932;
+
+ --color-white: #ffffff;
+ --color-light-1: #f1f2f9;
+ --color-light-widget: #f1f2f9;
+ --color-light-bt: #f1f2f9;
+ --color-light-2: #e8e9ee;
+
+ --color-accent: #905bff;
+ --color-accent-hover: #a378ff;
+ --color-green: #27ae60;
+ --color-red: #eb5757;
+
+ --text-primary: var(--color-white);
+ --text-secondary: var(--color-secondary);
+
+ --border-color: var(--color-elements);
+ --color-border-1: #3b3e4a;
+ --bg-surface-1: #161827;
+ --bg-card-1: #323542;
+
+ --bg-main: var(--color-black);
+ --bg-surface: var(--color-surface-1);
+ --bg-card: var(--color-surface-2);
+
+ --btn-primary-bg: var(--color-accent);
+ --btn-primary-hover: var(--color-accent-hover);
+ --btn-primary-text: var(--color-white);
+
+ --btn-secondary-bg: var(--color-surface-2);
+ --btn-secondary-hover: var(--color-icons);
+ --btn-secondary-text: var(--color-white);
+
+ --btn-default-bg: var(--color-elements);
+ --btn-default-hover: var(--color-icons);
+ --btn-default-selected: var(--color-surface-1);
+ --btn-default-disabled: var(--color-secondary);
+ --btn-favorite: var(--color-red);
+ --btn-success: var(--color-green);
+ --btn-light-bg: var(--color-light-1);
+ --search-item-hover: rgba(255, 255, 255, 0.12);
+ --search-divider: rgba(59, 62, 74, 0.5);
+ --search-empty: rgba(255, 255, 255, 0.5);
+ --search-img-blend: screen;
+ --search-img-filter: brightness(1.1) contrast(1.1);
+ --icon-filter: brightness(0) invert(1);
+ --color-modal: #905cff40;
+ --bg-modal: #ffffff14;
+ --bg-modal-input: #ffffff2e;
+}
+
+[data-theme='light'] {
+ --color-black: #fafbfc;
+ --color-surface: #e8e9ee;
+ --color-surface-1: #fafbfc;
+ --color-surface-2: #75767f;
+ --color-surface-3: #b4bdc3;
+ --color-elements: #75767f;
+ --color-elements-1: #89939a;
+ --color-secondary: #75767f;
+ --color-secondary-1: #89939a;
+ --color-border-1: #16192b;
+ --color-border-fav: #26293e;
+ --color-drobdown: #fafbfc;
+
+ --color-white: #0f1121;
+ --color-light-1: #0f1121;
+ --color-light-widget: #75767f;
+ --color-light-bt: #ffffff;
+ --bg-surface-1: #fafbfc;
+ --bg-card-1: #c8d0d6;
+
+ --text-primary: #0f1121;
+ --text-secondary: #75767f;
+ --border-color: #75767f;
+ --bg-main: #ffffff;
+ --bg-surface: #f1f2f9;
+ --bg-card: #f1f2f9;
+
+ --btn-secondary-bg: #f1f2f9;
+ --btn-secondary-hover: #e8e9ee;
+ --btn-primary-text: #ffffff;
+ --btn-default-bg: #ffffff;
+ --btn-default-hover: #f1f2f9;
+ --btn-default-selected: #e8e9ee;
+ --btn-default-disabled: #b4bdc3;
+ --search-item-hover: rgba(15, 17, 33, 0.06);
+ --search-divider: rgba(117, 118, 127, 0.25);
+ --search-empty: rgba(15, 17, 33, 0.45);
+ --search-img-blend: normal;
+ --search-img-filter: none;
+ --icon-filter: brightness(0);
+ --color-modal: #b4bdc3;
+ --bg-modal: #01211a;
+ --bg-modal-input: #01211a;
+}
+
+$color-black: var(--color-black);
+$color-surface: var(--color-surface);
+$color-surface-1: var(--color-surface-1);
+$color-surface-2: var(--color-surface-2);
+$color-surface-3: var(--color-surface-3);
+$color-elements: var(--color-elements);
+$color-icons: var(--color-icons);
+$color-secondary: var(--color-secondary);
+$color-secondary-1: var(--color-secondary-1);
+$color-drobdown: var(--color-drobdown);
+$color-white: var(--color-white);
+$color-light-1: var(--color-light-1);
+$color-light-bt: var(--color-light-bt);
+$color-light-2: var(--color-light-2);
+$color-light-widget: var(--color-light-widget);
+$color-accent-hover: var(--color-accent-hover);
+
+$color-accent: var(--color-accent);
+$color-green: var(--color-green);
+$color-red: var(--color-red);
+
+$color-text-primary: var(--text-primary);
+$color-text-secondary: var(--text-secondary);
+
+$color-border: var(--border-color);
+$color-border-1: var(--color-border-1);
+$favorites-border: var(--color-border-fav);
+
+$bg-main: var(--bg-main);
+$bg-surface: var(--bg-surface);
+$bg-surface-1: var(--bg-surface-1);
+$bg-card: var(--bg-card);
+$bg-card-1: var(--bg-card-1);
+$transition-default: 0.3s ease;
+
+$btn-primary-bg: var(--btn-primary-bg);
+$btn-primary-hover: var(--btn-primary-hover);
+$btn-primary-text: var(--btn-primary-text);
+
+$btn-secondary-bg: var(--btn-secondary-bg);
+$btn-secondary-hover: var(--btn-secondary-hover);
+$btn-secondary-text: var(--btn-secondary-text);
+
+$btn-default-bg: var(--btn-default-bg);
+$btn-default-hover: var(--btn-default-hover);
+$btn-default-selected: var(--btn-default-selected);
+$btn-default-disabled: var(--btn-default-disabled);
+
+$btn-favorite: var(--btn-favorite);
+$btn-success: var(--btn-success);
+$search-item-hover: var(--search-item-hover);
+$search-divider: var(--search-divider);
+$search-empty: var(--search-empty);
+$search-img-blend: var(--search-img-blend);
+$search-img-filter: var(--search-img-filter);
+$btn-light-bg: var(--btn-light-bg);
+$icon-filter: var(--icon-filter);
+$color-modal: var(--color-modal);
+$bg-modal: var(--bg-modal);
+$bg-modal-input: var(--bg-modal-input);
diff --git a/src/types/Cart.ts b/src/types/Cart.ts
new file mode 100644
index 00000000000..b215b53d5ec
--- /dev/null
+++ b/src/types/Cart.ts
@@ -0,0 +1,10 @@
+import { BaseProduct } from './Product';
+
+export interface CartItem extends BaseProduct {
+ quantity: number;
+ itemUniqueId: string;
+}
+
+export interface CartState {
+ items: CartItem[];
+}
diff --git a/src/types/CartOrder.ts b/src/types/CartOrder.ts
new file mode 100644
index 00000000000..74706c12e86
--- /dev/null
+++ b/src/types/CartOrder.ts
@@ -0,0 +1,19 @@
+export interface OrderItem {
+ id: number;
+ name: string;
+ price: number;
+ image: string;
+ quantity: number;
+}
+
+export interface Order {
+ id: string;
+ date: string;
+ status: 'delivered' | 'processing' | 'cancelled';
+ items: OrderItem[];
+ total: number;
+}
+
+export interface ProductFromDB {
+ image: string;
+}
diff --git a/src/types/Product.ts b/src/types/Product.ts
new file mode 100644
index 00000000000..b86e6811591
--- /dev/null
+++ b/src/types/Product.ts
@@ -0,0 +1,42 @@
+export interface DescriptionSection {
+ title: string;
+ text: string[];
+}
+
+export interface BaseProduct {
+ id: number | string;
+ category: string;
+ name: string;
+ priceRegular: number;
+ priceDiscount: number;
+ screen: string;
+ capacity: string;
+ color: string;
+ ram: string;
+ image: string;
+ price?: number;
+ fullPrice?: number;
+}
+
+export interface Product extends BaseProduct {
+ id: number;
+ itemId: string;
+ year: number;
+ image: string;
+ fullPrice?: number;
+ price?: number;
+}
+
+export interface ProductDetails extends BaseProduct {
+ id: string;
+ namespaceId: string;
+ capacityAvailable: string[];
+ colorsAvailable: string[];
+ images: string[];
+ description: DescriptionSection[];
+ resolution: string;
+ processor: string;
+ cell: string[];
+ camera?: string;
+ zoom?: string;
+}
diff --git a/src/types/SortType.ts b/src/types/SortType.ts
new file mode 100644
index 00000000000..a224de63cc6
--- /dev/null
+++ b/src/types/SortType.ts
@@ -0,0 +1 @@
+export type SortType = 'priceLow' | 'priceHigh' | 'newest' | 'oldest';
diff --git a/src/types/swiper.d.ts b/src/types/swiper.d.ts
new file mode 100644
index 00000000000..12858b5d841
--- /dev/null
+++ b/src/types/swiper.d.ts
@@ -0,0 +1,3 @@
+declare module 'swiper/css';
+declare module 'swiper/css/pagination';
+declare module 'swiper/css/navigation';
diff --git a/src/utils/RevealWrapper.tsx b/src/utils/RevealWrapper.tsx
new file mode 100644
index 00000000000..64239df3dc8
--- /dev/null
+++ b/src/utils/RevealWrapper.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { useScrollReveal } from '@utils/useScrollReveal.ts';
+
+type Props = {
+ children: React.ReactNode;
+ threshold?: number;
+};
+
+export const RevealWrapper: React.FC = ({ children, threshold }) => {
+ const ref = useScrollReveal(threshold);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/utils/formatPrice.ts b/src/utils/formatPrice.ts
new file mode 100644
index 00000000000..160dcb42c81
--- /dev/null
+++ b/src/utils/formatPrice.ts
@@ -0,0 +1,11 @@
+export const formatPrice = (amount: number, language: string) => {
+ const isUA = language === 'ua' || language === 'uk';
+ const currency = isUA ? 'UAH' : 'USD';
+ const rate = isUA ? 43 : 1;
+
+ return new Intl.NumberFormat(isUA ? 'uk-UA' : 'en-US', {
+ style: 'currency',
+ currency: currency,
+ maximumFractionDigits: 0,
+ }).format(amount * rate);
+};
diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts
new file mode 100644
index 00000000000..a10f29e5aca
--- /dev/null
+++ b/src/utils/i18n.ts
@@ -0,0 +1,32 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+
+import enTranslation from './locales/en.json';
+import uaTranslation from './locales/ua.json';
+
+i18n
+ .use(LanguageDetector)
+ .use(initReactI18next)
+ .init({
+ debug: false,
+ fallbackLng: 'en',
+ supportedLngs: ['en', 'ua'],
+ interpolation: {
+ escapeValue: false,
+ },
+ resources: {
+ en: {
+ translation: enTranslation,
+ },
+ ua: {
+ translation: uaTranslation,
+ },
+ },
+ detection: {
+ order: ['localStorage', 'navigator'],
+ caches: ['localStorage'],
+ },
+ });
+
+export default i18n;
diff --git a/src/utils/locales/en.json b/src/utils/locales/en.json
new file mode 100644
index 00000000000..3c95ae7f95b
--- /dev/null
+++ b/src/utils/locales/en.json
@@ -0,0 +1,276 @@
+{
+ "nav": {
+ "home": "Home",
+ "phones": "Phones",
+ "tablets": "Tablets",
+ "accessories": "Accessories",
+ "favorites": "Favorites",
+ "orders": "Orders",
+ "chat": "Chat",
+ "wallet": "Wallet",
+ "admin": "Admin",
+ "wishlist": "Favorites",
+ "FAVORITES": "Favorites",
+ "WISHLIST": "Favorites"
+ },
+ "home": {
+ "title": "Welcome to Voltrix store!",
+ "new_models": "Brand new models",
+ "shop_category": "Shop by category",
+ "hot_prices": "Hot prices"
+ },
+ "categories": {
+ "phones": "Mobile phones",
+ "tablets": "Tablets",
+ "accessories": "Accessories",
+ "models_count_one": "{{count}} model",
+ "models_count_other": "{{count}} models"
+ },
+ "product": {
+ "screen": "Screen",
+ "capacity": "Capacity",
+ "ram": "RAM",
+ "resolution": "Resolution",
+ "add_to_cart": "Add to cart",
+ "added": "Added"
+ },
+ "cart": {
+ "title": "Cart",
+ "checkout": "Checkout",
+ "total": "Total",
+ "shop_now": "Shop now",
+ "empty": "Your cart is empty",
+ "total_items_one": "{{count}} item",
+ "total_items_other": "{{count}} items"
+ },
+ "product_details": {
+ "about": "About",
+ "tech_specs": "Tech specs",
+ "processor": "Processor",
+ "camera": "Camera",
+ "zoom": "Zoom",
+ "cell": "Cell",
+ "back": "Back",
+ "recommend": "You may also like",
+ "not_found_title": "Unfortunately, the product is unknown.",
+ "not_found_text": "We couldn't find the product you're looking for.",
+ "colors": "Available colors",
+ "select_capacity": "Select capacity",
+ "reviews_title": "% of reviews by stars",
+ "see_all_reviews": "See all customer reviews"
+ },
+ "catalog": {
+ "sort_by": "Sort by",
+ "items_on_page": "Items on page",
+ "price_low": "Price low",
+ "price_high": "Price high",
+ "age": "Newest",
+ "oldest": "Oldest",
+ "products": "products",
+ "no_found": "No {{category}} found",
+ "no_results_message": "We couldn't find any results matching your search query."
+ },
+ "notifications": {
+ "added_to_cart": "Added to cart",
+ "added_to_cart_desc": "{{name}} has been added.",
+ "already_in_cart": "Already in cart",
+ "already_in_cart_desc": "{{name}} is already waiting for you.",
+ "removed_from_cart": "Removed from cart",
+ "removed_from_cart_desc": "{{name}} has been removed.",
+ "added_to_fav": "Added to favorites",
+ "added_to_fav_desc": "{{name}} added to your wishlist.",
+ "removed_from_fav": "Removed from favorites",
+ "removed_from_fav_desc": "{{name}} removed from your wishlist.",
+ "error": "Error",
+ "something_wrong": "Something went wrong."
+ },
+ "favorites": "Favorites",
+ "page_favorites": {
+ "empty_title": "Your favorites list is empty",
+ "empty_text": "Add some products to see them here!"
+ },
+ "auth": {
+ "create_account": "Create an account",
+ "sign_in_title": "Sign in to your account",
+ "continue_google": "Continue with Google",
+ "or_email": "or use email",
+ "email": "Email",
+ "password": "Password",
+ "sign_up": "Sign up",
+ "sign_in": "Sign in",
+ "loading": "Loading...",
+ "already_have_acc": "Already have an account?",
+ "no_acc_yet": "Don't have an account yet?",
+ "fill_fields": "Please fill in all fields!",
+ "reg_success": "Registration successful!",
+ "login_success": "Login successful! 🎉",
+ "error": "Error"
+ },
+ "checkout": {
+ "title": "Checkout",
+ "success_title": "Payment successful",
+ "success_text": "Your order has been created",
+ "redirecting": "Redirecting you to your orders...",
+ "view_orders": "View orders",
+ "close": "Close",
+ "details": "Your details",
+ "delivery": "Delivery",
+ "payment": "Payment",
+ "full_name": "Full name *",
+ "phone": "Phone number *",
+ "continue": "Continue",
+ "back": "Back",
+ "home_address": "Home address",
+ "pickup_point": "Pick-up point",
+ "address_placeholder": "Delivery address *",
+ "pickup_placeholder": "Pick-up point / locker / store *",
+ "card": "Credit / Debit Card",
+ "paypal": "PayPal (demo)",
+ "cod": "Cash on delivery",
+ "card_number": "Card number",
+ "expiry": "MM/YY",
+ "cvc": "CVC",
+ "processing": "Processing...",
+ "pay_order": "Pay & place order",
+ "place_order": "Place order",
+ "terms": "By confirming the order, you agree to the Terms and Conditions.",
+ "summary": "Order summary",
+ "error_empty": "Your cart is empty.",
+ "error_details": "Please fill in your name and phone.",
+ "error_address": "Please enter your delivery address.",
+ "error_pickup": "Please enter a pick-up point.",
+ "error_payment": "Please check your payment details.",
+ "error_login": "You must be logged in to place an order.",
+ "error_general": "Something went wrong. Please try again.",
+ "success_notify": "Order placed successfully"
+ },
+ "footer": {
+ "github": "GITHUB",
+ "contacts": "CONTACTS",
+ "rights": "RIGHTS",
+ "back_to_top": "Back to top"
+ },
+ "help_widget": {
+ "title": "Support",
+ "placeholder": "Enter your message...",
+ "welcome": "Hello! How can I help you today?",
+ "bot_replies": [
+ "Thank you for your message. Our team will assist you shortly.",
+ "Could you please provide more details?",
+ "We are checking this for you."
+ ]
+ },
+ "profile_sidebar": {
+ "guest": "Guest",
+ "account": "My Account",
+ "admin": "Admin Panel",
+ "orders": "Orders",
+ "chat": "Support Chat",
+ "wishlist": "Wish lists",
+ "wallet": "Wallet"
+ },
+ "search": {
+ "placeholder": "Search...",
+ "placeholder_hotkey": "Search ({{hotkey}})",
+ "no_results": "No results found for \"{{query}}\"",
+ "clear": "Clear search"
+ },
+ "orders": {
+ "title": "My Orders",
+ "empty_title": "No orders yet",
+ "empty_sub": "Your purchase history will appear here",
+ "total": "Order total",
+ "status_delivered": "Delivered",
+ "status_processing": "Processing",
+ "status_cancelled": "Cancelled"
+ },
+ "reviews": {
+ "title": "Customer reviews",
+ "back": "Back",
+ "out_of": "out of 5",
+ "global_ratings": "global ratings",
+ "write_title": "Review this product",
+ "write_sub": "Share your thoughts with other customers",
+ "write_btn": "Write a customer review"
+ },
+ "write_review": {
+ "title": "Create Review",
+ "back": "Back",
+ "overall": "Overall rating",
+ "headline": "Add a headline",
+ "headline_placeholder": "What's most important to know?",
+ "written": "Add a written review",
+ "written_placeholder": "What did you like or dislike? What did you use this product for?",
+ "hint": "Minimum 20 characters",
+ "submit": "Submit",
+ "cancel": "Cancel",
+ "success_title": "Thank you for your review!",
+ "success_sub": "Your review has been submitted and will appear shortly after moderation.",
+ "back_to": "Back to reviews",
+ "star_labels": [
+ "",
+ "I hate it",
+ "I don't like it",
+ "It's OK",
+ "I like it",
+ "I love it"
+ ]
+ },
+ "profile": {
+ "title": "Profile",
+ "name": "Name",
+ "email": "Email",
+ "phone": "Phone",
+ "created": "Created",
+ "logout": "Log out"
+ },
+ "admin": {
+ "title": "Admin Panel",
+ "total_users": "Total Users",
+ "total_orders": "Total Orders",
+ "support_messages": "Support Messages",
+ "table_id": "ID",
+ "table_email": "Email",
+ "table_registered": "Registered",
+ "table_role": "Role",
+ "table_actions": "Actions",
+ "table_status": "Status",
+ "table_total": "Total",
+ "table_date": "Date",
+ "btn_make_admin": "Make Admin",
+ "btn_remove_admin": "Remove Admin",
+ "btn_delete": "Delete",
+ "reply_title": "Send Support Message",
+ "reply_to": "Reply to user",
+ "select_user": "— Select user —",
+ "placeholder": "Type your support message here...",
+ "send": "Send Message",
+ "confirm_delete": "Are you sure you want to delete this user?",
+ "you": "You",
+ "user": "User"
+ },
+ "not_found_page": {
+ "title": "Error 404",
+ "message": "Page not found"
+ },
+ "rights_page": {
+ "title": "Rights & Intellectual Property",
+ "section1_title": "1. General Provisions",
+ "section1_text": "All rights to this website and its content are owned by",
+ "section1_subtext": ". This platform is designed for technology enthusiasts and consumers, and the use of any of its elements is governed by applicable copyright laws.",
+ "section2_title": "2. Use of Product Images and Descriptions",
+ "section2_text": "Product images, brand names, specifications, and manufacturer descriptions presented in our catalog are the property of their respective copyright holders.",
+ "section2_list": [
+ "We use these materials solely for the purpose of product identification and informational purposes.",
+ "does not claim authorship of images or descriptions provided by manufacturers or official partners.",
+ "If you are a brand or copyright holder and wish to modify or remove information about your product, please contact our support team."
+ ],
+ "section3_title": "3. User-Generated Content",
+ "section3_text1": "By leaving reviews or ratings on the site, you grant",
+ "section3_text2": "the right to publish and distribute them within our platform. However, the authorship of the review remains with you.",
+ "section4_title": "4. Prohibition of Copying",
+ "section4_text1": "Any automated data collection (scraping) or full copying of our store's database, pricing, or product catalog without the explicit consent of",
+ "section4_text2": "is strictly prohibited and subject to legal action.",
+ "updated": "Last updated: February 22, 2026. We reserve the right to modify these terms without prior notice."
+ }
+}
diff --git a/src/utils/locales/ua.json b/src/utils/locales/ua.json
new file mode 100644
index 00000000000..939ee65c6ea
--- /dev/null
+++ b/src/utils/locales/ua.json
@@ -0,0 +1,280 @@
+{
+ "nav": {
+ "home": "Головна",
+ "phones": "Телефони",
+ "tablets": "Планшети",
+ "accessories": "Аксесуари",
+ "favorites": "Обране",
+ "orders": "Замовлення",
+ "chat": "Чат",
+ "wallet": "Гаманець",
+ "admin": "Адмін",
+ "wishlist": "Обране",
+ "FAVORITES": "Обране",
+ "WISHLIST": "Обране"
+ },
+ "home": {
+ "title": "Ласкаво просимо до Voltrix!",
+ "new_models": "Нові моделі",
+ "shop_category": "Оберіть категорію",
+ "hot_prices": "Гарячі ціни"
+ },
+ "categories": {
+ "phones": "Мобільні телефони",
+ "tablets": "Планшети",
+ "accessories": "Аксесуари",
+ "models_count_one": "{{count}} модель",
+ "models_count_few": "{{count}} моделі",
+ "models_count_many": "{{count}} моделей",
+ "models_count_other": "{{count}} моделей"
+ },
+ "product": {
+ "screen": "Екран",
+ "capacity": "Ємність",
+ "ram": "Пам’ять",
+ "resolution": "Роздільна здатність",
+ "add_to_cart": "Додати в кошик",
+ "added": "Додано"
+ },
+ "cart": {
+ "title": "Кошик",
+ "checkout": "Оформити замовлення",
+ "total": "Разом",
+ "shop_now": "Придбати зараз",
+ "empty": "Ваш кошик порожній",
+ "total_items_one": "{{count}} товар",
+ "total_items_few": "{{count}} товари",
+ "total_items_many": "{{count}} товарів",
+ "total_items_other": "{{count}} товарів"
+ },
+ "product_details": {
+ "about": "Про пристрій",
+ "tech_specs": "Технічні характеристики",
+ "processor": "Процесор",
+ "camera": "Камера",
+ "zoom": "Зум",
+ "cell": "Зв’язок",
+ "back": "Назад",
+ "recommend": "Вам також може сподобатися",
+ "not_found_title": "На жаль, товар невідомий.",
+ "not_found_text": "Ми не змогли знайти товар, який ви шукаєте.",
+ "colors": "Доступні кольори",
+ "select_capacity": "Оберіть ємність",
+ "reviews_title": "% відгуків за зірками",
+ "see_all_reviews": "Переглянути всі відгуки покупців"
+ },
+ "catalog": {
+ "sort_by": "Сортувати за",
+ "items_on_page": "Товарів на сторінці",
+ "price_low": "Від дешевих",
+ "price_high": "Від дорогих",
+ "age": "Новинки",
+ "oldest": "Старі моделі",
+ "products": "товарів",
+ "no_found": "{{category}} не знайдено",
+ "no_results_message": "Ми не змогли знайти жодного результату за вашим запитом."
+ },
+ "notifications": {
+ "added_to_cart": "Додано в кошик",
+ "added_to_cart_desc": "{{name}} додано до вашого кошика.",
+ "already_in_cart": "Вже в кошику",
+ "already_in_cart_desc": "{{name}} вже чекає на вас у кошику.",
+ "removed_from_cart": "Видалено з кошика",
+ "removed_from_cart_desc": "{{name}} було видалено.",
+ "added_to_fav": "Додано в обране",
+ "added_to_fav_desc": "{{name}} додано до списку бажань.",
+ "removed_from_fav": "Видалено з обраного",
+ "removed_from_fav_desc": "{{name}} видалено зі списку бажань.",
+ "error": "Помилка",
+ "something_wrong": "Щось пішло не так."
+ },
+ "favorites": "Обране",
+ "page_favorites": {
+ "empty_title": "Ваш список обраного порожній",
+ "empty_text": "Додайте товари, щоб побачити їх тут!"
+ },
+ "auth": {
+ "create_account": "Створити акаунт",
+ "sign_in_title": "Увійти в акаунт",
+ "continue_google": "Продовжити з Google",
+ "or_email": "або через email",
+ "email": "Електронна пошта",
+ "password": "Пароль",
+ "sign_up": "Зареєструватися",
+ "sign_in": "Увійти",
+ "loading": "Завантаження...",
+ "already_have_acc": "Вже маєте акаунт?",
+ "no_acc_yet": "Ще немає акаунта?",
+ "fill_fields": "Будь ласка, заповніть усі поля!",
+ "reg_success": "Реєстрація успішна!",
+ "login_success": "Вхід успішний! 🎉",
+ "error": "Помилка"
+ },
+ "checkout": {
+ "title": "Оформлення замовлення",
+ "success_title": "Оплата успішна",
+ "success_text": "Ваше замовлення було створено",
+ "redirecting": "Перенаправляємо вас до замовлень...",
+ "view_orders": "Мої замовлення",
+ "close": "Закрити",
+ "details": "Ваші дані",
+ "delivery": "Доставка",
+ "payment": "Оплата",
+ "full_name": "Повне ім’я *",
+ "phone": "Номер телефону *",
+ "continue": "Продовжити",
+ "back": "Назад",
+ "home_address": "Домашня адреса",
+ "pickup_point": "Пункт видачі",
+ "address_placeholder": "Адреса доставки *",
+ "pickup_placeholder": "Пункт видачі / поштомат / магазин *",
+ "card": "Кредитна / Дебетова картка",
+ "paypal": "PayPal (демо)",
+ "cod": "Оплата при отриманні",
+ "card_number": "Номер картки",
+ "expiry": "ММ/РР",
+ "cvc": "CVC",
+ "processing": "Обробка...",
+ "pay_order": "Оплатити та замовити",
+ "place_order": "Оформити замовлення",
+ "terms": "Підтверджуючи замовлення, ви погоджуєтесь з Умовами та положеннями.",
+ "summary": "Підсумок замовлення",
+ "error_empty": "Ваш кошик порожній.",
+ "error_details": "Будь ласка, введіть ім’я та телефон.",
+ "error_address": "Будь ласка, введіть адресу доставки.",
+ "error_pickup": "Будь ласка, введіть пункт видачі.",
+ "error_payment": "Будь ласка, перевірте дані оплати.",
+ "error_login": "Ви повинні увійти в акаунт, щоб зробити замовлення.",
+ "error_general": "Щось пішло не так. Будь ласка, спробуйте ще раз.",
+ "success_notify": "Замовлення успішно оформлено"
+ },
+ "footer": {
+ "github": "GITHUB",
+ "contacts": "КОНТАКТИ",
+ "rights": "ПРАВА",
+ "back_to_top": "Вгору"
+ },
+ "help_widget": {
+ "title": "Підтримка",
+ "placeholder": "Введіть повідомлення...",
+ "welcome": "Вітаємо! Чим ми можемо вам допомогти?",
+ "bot_replies": [
+ "Дякуємо за ваше повідомлення. Наша команда скоро вам допоможе.",
+ "Чи не могли б ви надати більше деталей?",
+ "Ми вже перевіряємо це для вас."
+ ]
+ },
+ "profile_sidebar": {
+ "guest": "Гість",
+ "account": "Мій акаунт",
+ "admin": "Адмін-панель",
+ "orders": "Замовлення",
+ "chat": "Чат підтримки",
+ "wishlist": "Список бажань",
+ "wallet": "Гаманець"
+ },
+ "search": {
+ "placeholder": "Пошук...",
+ "placeholder_hotkey": "Пошук ({{hotkey}})",
+ "no_results": "Нічого не знайдено за запитом \"{{query}}\"",
+ "clear": "Очистити пошук"
+ },
+ "orders": {
+ "title": "Мої замовлення",
+ "empty_title": "Замовлень ще немає",
+ "empty_sub": "Тут з’явиться історія ваших покупок",
+ "total": "Сума замовлення",
+ "status_delivered": "Доставлено",
+ "status_processing": "Обробляється",
+ "status_cancelled": "Скасовано"
+ },
+ "reviews": {
+ "title": "Відгуки покупців",
+ "back": "Назад",
+ "out_of": "з 5",
+ "global_ratings": "оцінок у світі",
+ "write_title": "Напишіть відгук про товар",
+ "write_sub": "Поділіться своїми думками з іншими покупцями",
+ "write_btn": "Написати відгук"
+ },
+ "write_review": {
+ "title": "Написати відгук",
+ "back": "Назад",
+ "overall": "Загальна оцінка",
+ "headline": "Додайте заголовок",
+ "headline_placeholder": "Що найважливіше знати?",
+ "written": "Ваш відгук",
+ "written_placeholder": "Що вам сподобалося чи не сподобалося? Для чого ви використовували цей продукт?",
+ "hint": "Мінімум 20 символів",
+ "submit": "Надіслати",
+ "cancel": "Скасувати",
+ "success_title": "Дякуємо за ваш відгук!",
+ "success_sub": "Ваш відгук надіслано і він з’явиться незабаром після модерації.",
+ "back_to": "Назад до відгуків",
+ "star_labels": [
+ "",
+ "Жахливо",
+ "Не сподобалося",
+ "Нормально",
+ "Сподобалося",
+ "Дуже подобається"
+ ]
+ },
+ "profile": {
+ "title": "Профіль",
+ "name": "Ім'я",
+ "email": "Email",
+ "phone": "Телефон",
+ "created": "Створено",
+ "logout": "Вийти"
+ },
+ "admin": {
+ "title": "Адмін-панель",
+ "total_users": "Всього користувачів",
+ "total_orders": "Всього замовлень",
+ "support_messages": "Повідомлення підтримки",
+ "table_id": "ID",
+ "table_email": "Email",
+ "table_registered": "Реєстрація",
+ "table_role": "Role",
+ "table_actions": "Дії",
+ "table_status": "Статус",
+ "table_total": "Сума",
+ "table_date": "Дата",
+ "btn_make_admin": "Зробити адміном",
+ "btn_remove_admin": "Зняти права",
+ "btn_delete": "Видалити",
+ "reply_title": "Відповісти в чат",
+ "reply_to": "Відповідь користувачу",
+ "select_user": "— Оберіть користувача —",
+ "placeholder": "Введіть текст повідомлення...",
+ "send": "Надіслати",
+ "confirm_delete": "Ви впевнені, що хочете видалити цього користувача?",
+ "you": "Ви",
+ "user": "Клієнт"
+ },
+ "not_found_page": {
+ "title": "Помилка 404",
+ "message": "Сторінка не знайдена"
+ },
+ "rights_page": {
+ "title": "Права та інтелектуальна власність",
+ "section1_title": "1. Загальні положення",
+ "section1_text": "Усі права на цей веб-сайт та його вміст належать",
+ "section1_subtext": ". Ця платформа розроблена для ентузіастів технологій та споживачів, а використання будь-яких її елементів регулюється чинним законодавством про авторське право.",
+ "section2_title": "2. Використання зображень та описів товарів",
+ "section2_text": "Зображення товарів, торгові марки, специфікації та описи виробників, представлені в нашому каталозі, є власністю їхніх відповідних правовласників.",
+ "section2_list": [
+ "Ми використовуємо ці матеріали виключно з метою ідентифікації товару та в інформаційних цілях.",
+ "не претендує на авторство зображень або описів, наданих виробниками або офіційними партнерами.",
+ "Якщо ви є брендом або правовласником і бажаєте змінити або видалити інформацію про свій продукт, будь ласка, зверніться до нашої служби підтримки."
+ ],
+ "section3_title": "3. Контент, створений користувачами",
+ "section3_text1": "Залишаючи відгуки або оцінки на сайті, ви надаєте",
+ "section3_text2": "право публікувати та поширювати їх у межах нашої платформи. Однак авторство відгуку залишається за вами.",
+ "section4_title": "4. Заборона копіювання",
+ "section4_text1": "Будь-який автоматизований збір даних (скрапінг) або повне копіювання бази даних нашого магазину, цін або каталогу товарів без явної згоди",
+ "section4_text2": "суворо заборонено і тягне за собою юридичну відповідальність.",
+ "updated": "Останнє оновлення: 22 лютого 2026 р. Ми залишаємо за собою право змінювати ці умови без попереднього повідомлення."
+ }
+}
diff --git a/src/utils/notifications.ts b/src/utils/notifications.ts
new file mode 100644
index 00000000000..a266857af74
--- /dev/null
+++ b/src/utils/notifications.ts
@@ -0,0 +1,45 @@
+import { toast } from 'sonner';
+import i18n from './i18n';
+
+export const notify = {
+ addedToCart: (productName: string) =>
+ toast.success(i18n.t('notifications.added_to_cart'), {
+ description: i18n.t('notifications.added_to_cart_desc', {
+ name: productName,
+ }),
+ }),
+
+ alreadyInCart: (productName: string) =>
+ toast.info(i18n.t('notifications.already_in_cart'), {
+ description: i18n.t('notifications.already_in_cart_desc', {
+ name: productName,
+ }),
+ }),
+
+ removedFromCart: (productName: string) =>
+ toast.info(i18n.t('notifications.removed_from_cart'), {
+ description: i18n.t('notifications.removed_from_cart_desc', {
+ name: productName,
+ }),
+ }),
+
+ addedToFavorites: (productName: string) =>
+ toast.success(i18n.t('notifications.added_to_fav'), {
+ description: i18n.t('notifications.added_to_fav_desc', {
+ name: productName,
+ }),
+ }),
+
+ removedFromFavorites: (productName: string) =>
+ toast.info(i18n.t('notifications.removed_from_fav'), {
+ description: i18n.t('notifications.removed_from_fav_desc', {
+ name: productName,
+ }),
+ }),
+
+ error: (message: string = i18n.t('notifications.something_wrong')) =>
+ toast.error(i18n.t('notifications.error'), { description: message }),
+
+ success: (message: string, description?: string) =>
+ toast.success(message, { description }),
+};
diff --git a/src/utils/novaPoshta.ts b/src/utils/novaPoshta.ts
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/utils/novaPostaClient.ts b/src/utils/novaPostaClient.ts
new file mode 100644
index 00000000000..1c222acc001
--- /dev/null
+++ b/src/utils/novaPostaClient.ts
@@ -0,0 +1,144 @@
+import { supabase } from './supabaseClient';
+
+export interface City {
+ Ref: string;
+ Description: string;
+}
+
+export interface Warehouse {
+ Ref: string;
+ Description: string;
+ Number: string;
+ Phone?: string;
+}
+
+interface NovaPostaResponse {
+ success: boolean;
+ data: T[];
+ errors?: string[];
+ warningsCodes?: string[];
+}
+
+// ======================
+// 🔥 Виклик Edge Function
+// ======================
+
+async function callNovaPostaAPI(
+ method: string,
+ properties: Record,
+): Promise> {
+ const { data, error } = await supabase.functions.invoke(
+ 'get-nova-poshta-data',
+ {
+ body: { method, properties },
+ },
+ );
+
+ if (error) {
+ console.error('Edge Function error:', error);
+ throw error;
+ }
+
+ if (!data) {
+ throw new Error('Empty response from Edge Function');
+ }
+
+ return data as NovaPostaResponse;
+}
+
+// ======================
+// 📍 Отримати міста
+// ======================
+
+export async function getCities(): Promise {
+ try {
+ const response = await callNovaPostaAPI('getCities', {});
+
+ console.log('NOVA RESPONSE:', response); // 👈 ДОДАЙ ЦЕ
+
+ if (!response.success) {
+ console.error(response.errors);
+ return [];
+ }
+
+ return response.data ?? [];
+ } catch (error) {
+ console.error('getCities error:', error);
+ return [];
+ }
+}
+
+// ======================
+// 📦 Отримати відділення
+// ======================
+
+interface GetWarehouses {
+ cityRef: string;
+ language?: 'UA' | 'RU';
+ pageSize?: string;
+ page?: string;
+}
+
+export async function getWarehouses(
+ params: GetWarehouses,
+): Promise {
+ try {
+ const response = await callNovaPostaAPI('getWarehouses', {
+ CityRef: params.cityRef,
+ Language: params.language ?? 'UA',
+ Page: params.page ?? '1',
+ Limit: params.pageSize ?? '100',
+ });
+
+ if (!response.success) {
+ console.error(response.errors);
+ return [];
+ }
+
+ return response.data ?? [];
+ } catch (error) {
+ console.error('getWarehouses error:', error);
+ return [];
+ }
+}
+
+// ======================
+// 💰 Вартість доставки
+// ======================
+
+interface GetDeliveryPrice {
+ citySenderRef: string;
+ cityRecipientRef: string;
+ serviceType?: string;
+}
+
+export async function getDeliveryPrice(params: GetDeliveryPrice): Promise<{
+ Cost: string;
+ EstimatedDeliveryDate: string;
+}> {
+ try {
+ const response = await callNovaPostaAPI<{
+ Cost: string;
+ EstimatedDeliveryDate: string;
+ }>('getDocumentPrice', {
+ CitySender: params.citySenderRef,
+ CityRecipient: params.cityRecipientRef,
+ Weight: '0.5',
+ ServiceType: params.serviceType ?? 'WarehouseWarehouse',
+ CargoType: 'Cargo',
+ Cost: '500',
+ });
+
+ if (!response.success) {
+ console.error(response.errors);
+ return { Cost: '0', EstimatedDeliveryDate: '—' };
+ }
+
+ const result = response.data?.[0];
+
+ return result ?? { Cost: '0', EstimatedDeliveryDate: '—' };
+ } catch (error) {
+ console.error('getDeliveryPrice error:', error);
+ return { Cost: '0', EstimatedDeliveryDate: '—' };
+ }
+}
diff --git a/src/utils/productFilters.ts b/src/utils/productFilters.ts
new file mode 100644
index 00000000000..827c321489a
--- /dev/null
+++ b/src/utils/productFilters.ts
@@ -0,0 +1,28 @@
+import { Product } from '@/types/Product';
+import { SortType } from '@/types/SortType';
+
+export const sortProducts = (products: Product[], sortBy: SortType) => {
+ const sorted = [...products];
+
+ switch (sortBy) {
+ case 'priceLow':
+ return sorted.sort((a, b) => (a.price ?? 0) - (b.price ?? 0));
+ case 'priceHigh':
+ return sorted.sort((a, b) => (b.price ?? 0) - (a.price ?? 0));
+ case 'oldest':
+ return sorted.sort((a, b) => (a.year ?? 0) - (b.year ?? 0));
+ case 'newest':
+ default:
+ return sortByNewest(sorted);
+ }
+};
+
+export const sortByNewest = (products: Product[]) =>
+ [...products].sort((a, b) => (b.year ?? 0) - (a.year ?? 0));
+
+export const sortByBestPrice = (products: Product[]) =>
+ [...products].sort((a, b) => {
+ const discountA = (a.fullPrice ?? a.price ?? 0) - (a.price ?? 0);
+ const discountB = (b.fullPrice ?? b.price ?? 0) - (b.price ?? 0);
+ return discountB - discountA;
+ });
diff --git a/src/utils/supabaseClient.ts b/src/utils/supabaseClient.ts
new file mode 100644
index 00000000000..f18322f0c59
--- /dev/null
+++ b/src/utils/supabaseClient.ts
@@ -0,0 +1,10 @@
+import { createClient } from '@supabase/supabase-js';
+
+const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
+const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
+
+if (!supabaseUrl || !supabaseAnonKey) {
+ throw new Error('Не знайдено ключі Supabase в .env файлі!');
+}
+
+export const supabase = createClient(supabaseUrl, supabaseAnonKey);
diff --git a/src/utils/useScrollReveal.ts b/src/utils/useScrollReveal.ts
new file mode 100644
index 00000000000..253183b2dde
--- /dev/null
+++ b/src/utils/useScrollReveal.ts
@@ -0,0 +1,31 @@
+import { useEffect, useRef } from 'react';
+
+export const useScrollReveal = (threshold = 0.1) => {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ const el = ref.current;
+ if (!el) return;
+
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (entry.isIntersecting) {
+ el.classList.add('revealed');
+ observer.unobserve(el);
+ }
+ },
+ { threshold },
+ );
+
+ const timeout = setTimeout(() => {
+ observer.observe(el);
+ }, 50);
+
+ return () => {
+ clearTimeout(timeout);
+ observer.disconnect();
+ };
+ }, [threshold]);
+
+ return ref;
+};
diff --git a/supabase/.temp/cli-latest b/supabase/.temp/cli-latest
new file mode 100644
index 00000000000..1dd61787090
--- /dev/null
+++ b/supabase/.temp/cli-latest
@@ -0,0 +1 @@
+v2.75.0
\ No newline at end of file
diff --git a/supabase/.temp/gotrue-version b/supabase/.temp/gotrue-version
new file mode 100644
index 00000000000..ae0dd63a883
--- /dev/null
+++ b/supabase/.temp/gotrue-version
@@ -0,0 +1 @@
+v2.187.0
\ No newline at end of file
diff --git a/supabase/.temp/pooler-url b/supabase/.temp/pooler-url
new file mode 100644
index 00000000000..e2486259cca
--- /dev/null
+++ b/supabase/.temp/pooler-url
@@ -0,0 +1 @@
+postgresql://postgres.lvarnwvfwquizwqetwsk@aws-1-eu-west-1.pooler.supabase.com:5432/postgres
\ No newline at end of file
diff --git a/supabase/.temp/postgres-version b/supabase/.temp/postgres-version
new file mode 100644
index 00000000000..3dc41f465bc
--- /dev/null
+++ b/supabase/.temp/postgres-version
@@ -0,0 +1 @@
+17.6.1.063
\ No newline at end of file
diff --git a/supabase/.temp/project-ref b/supabase/.temp/project-ref
new file mode 100644
index 00000000000..032dcc66169
--- /dev/null
+++ b/supabase/.temp/project-ref
@@ -0,0 +1 @@
+lvarnwvfwquizwqetwsk
\ No newline at end of file
diff --git a/supabase/.temp/rest-version b/supabase/.temp/rest-version
new file mode 100644
index 00000000000..352043678b2
--- /dev/null
+++ b/supabase/.temp/rest-version
@@ -0,0 +1 @@
+v14.1
\ No newline at end of file
diff --git a/supabase/.temp/storage-migration b/supabase/.temp/storage-migration
new file mode 100644
index 00000000000..b781586e800
--- /dev/null
+++ b/supabase/.temp/storage-migration
@@ -0,0 +1 @@
+fix-optimized-search-function
\ No newline at end of file
diff --git a/supabase/.temp/storage-version b/supabase/.temp/storage-version
new file mode 100644
index 00000000000..f663f9d2610
--- /dev/null
+++ b/supabase/.temp/storage-version
@@ -0,0 +1 @@
+v1.37.7
\ No newline at end of file
diff --git a/supabase/config.toml b/supabase/config.toml
new file mode 100644
index 00000000000..97eb08df762
--- /dev/null
+++ b/supabase/config.toml
@@ -0,0 +1,11 @@
+
+[functions.create-payment-intent]
+enabled = true
+verify_jwt = true
+import_map = "./functions/create-payment-intent/deno.json"
+# Uncomment to specify a custom file path to the entrypoint.
+# Supported file extensions are: .ts, .js, .mjs, .jsx, .tsx
+entrypoint = "./functions/create-payment-intent/index.ts"
+# Specifies static files to be bundled with the function. Supports glob patterns.
+# For example, if you want to serve static HTML pages in your function:
+# static_files = [ "./functions/create-payment-intent/*.html" ]
diff --git a/supabase/functions/create-payment-intent/.npmrc b/supabase/functions/create-payment-intent/.npmrc
new file mode 100644
index 00000000000..48c63886380
--- /dev/null
+++ b/supabase/functions/create-payment-intent/.npmrc
@@ -0,0 +1,3 @@
+# Configuration for private npm package dependencies
+# For more information on using private registries with Edge Functions, see:
+# https://supabase.com/docs/guides/functions/import-maps#importing-from-private-registries
diff --git a/supabase/functions/create-payment-intent/config.toml b/supabase/functions/create-payment-intent/config.toml
new file mode 100644
index 00000000000..4d867863b17
--- /dev/null
+++ b/supabase/functions/create-payment-intent/config.toml
@@ -0,0 +1 @@
+verify_jwt = false
diff --git a/supabase/functions/create-payment-intent/deno.json b/supabase/functions/create-payment-intent/deno.json
new file mode 100644
index 00000000000..af1c74d7c65
--- /dev/null
+++ b/supabase/functions/create-payment-intent/deno.json
@@ -0,0 +1,6 @@
+{
+ "verify_jwt": false,
+ "imports": {
+ "@supabase/functions-js": "jsr:@supabase/functions-js@^2"
+ }
+}
diff --git a/supabase/functions/create-payment-intent/index.d.ts b/supabase/functions/create-payment-intent/index.d.ts
new file mode 100644
index 00000000000..cb0ff5c3b54
--- /dev/null
+++ b/supabase/functions/create-payment-intent/index.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/supabase/functions/create-payment-intent/index.js b/supabase/functions/create-payment-intent/index.js
new file mode 100644
index 00000000000..79825d3ec7d
--- /dev/null
+++ b/supabase/functions/create-payment-intent/index.js
@@ -0,0 +1,76 @@
+const corsHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
+};
+Deno.serve(async (req) => {
+ if (req.method === 'OPTIONS') {
+ return new Response('ok', { headers: corsHeaders });
+ }
+ const authHeader = req.headers.get('Authorization');
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ return new Response(JSON.stringify({ error: 'Unauthorized' }), {
+ status: 401,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+ const token = authHeader.replace('Bearer ', '');
+ const supabaseUrl = Deno.env.get('SUPABASE_URL');
+ const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY');
+ const userRes = await fetch(`${supabaseUrl}/auth/v1/user`, {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ apikey: supabaseKey,
+ },
+ });
+ if (!userRes.ok) {
+ return new Response(JSON.stringify({ error: 'Unauthorized' }), {
+ status: 401,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+ try {
+ const stripeSecretKey = Deno.env.get('STRIPE_SECRET_KEY');
+ if (!stripeSecretKey) {
+ throw new Error('STRIPE_SECRET_KEY is not set');
+ }
+ const { amount } = (await req.json());
+ if (!amount || amount <= 0) {
+ return new Response(JSON.stringify({ error: 'Invalid amount' }), {
+ status: 400,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+ const stripeAmount = Math.round(amount * 100);
+ const stripeResponse = await fetch('https://api.stripe.com/v1/payment_intents', {
+ method: 'POST',
+ headers: {
+ 'Authorization': `Bearer ${stripeSecretKey}`,
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ body: new URLSearchParams({
+ 'amount': stripeAmount.toString(),
+ 'currency': 'usd',
+ 'automatic_payment_methods[enabled]': 'true',
+ }).toString(),
+ });
+ const stripeData = (await stripeResponse.json());
+ if (!stripeResponse.ok) {
+ return new Response(JSON.stringify({ error: stripeData.error?.message || 'Stripe error' }), {
+ status: stripeResponse.status,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+ return new Response(JSON.stringify({ clientSecret: stripeData.client_secret }), {
+ status: 200,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+ catch (error) {
+ const message = error instanceof Error ? error.message : 'Unknown error';
+ return new Response(JSON.stringify({ error: message }), {
+ status: 500,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+});
+export {};
diff --git a/supabase/functions/create-payment-intent/index.ts b/supabase/functions/create-payment-intent/index.ts
new file mode 100644
index 00000000000..dd4a20f176f
--- /dev/null
+++ b/supabase/functions/create-payment-intent/index.ts
@@ -0,0 +1,103 @@
+export {};
+
+const corsHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers':
+ 'authorization, x-client-info, apikey, content-type',
+};
+
+Deno.serve(async (req) => {
+ if (req.method === 'OPTIONS') {
+ return new Response('ok', { headers: corsHeaders });
+ }
+
+ const authHeader = req.headers.get('Authorization');
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
+ return new Response(JSON.stringify({ error: 'Unauthorized' }), {
+ status: 401,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+
+ const token = authHeader.replace('Bearer ', '');
+ const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
+ const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
+
+ const userRes = await fetch(`${supabaseUrl}/auth/v1/user`, {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ apikey: supabaseKey,
+ },
+ });
+
+ if (!userRes.ok) {
+ return new Response(JSON.stringify({ error: 'Unauthorized' }), {
+ status: 401,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+
+ try {
+ const stripeSecretKey = Deno.env.get('STRIPE_SECRET_KEY');
+
+ if (!stripeSecretKey) {
+ throw new Error('STRIPE_SECRET_KEY is not set');
+ }
+
+ const { amount } = (await req.json()) as { amount?: number };
+
+ if (!amount || amount <= 0) {
+ return new Response(JSON.stringify({ error: 'Invalid amount' }), {
+ status: 400,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+
+ const stripeAmount = Math.round(amount * 100);
+
+ const stripeResponse = await fetch(
+ 'https://api.stripe.com/v1/payment_intents',
+ {
+ method: 'POST',
+ headers: {
+ 'Authorization': `Bearer ${stripeSecretKey}`,
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ body: new URLSearchParams({
+ 'amount': stripeAmount.toString(),
+ 'currency': 'usd',
+ 'automatic_payment_methods[enabled]': 'true',
+ }).toString(),
+ },
+ );
+
+ const stripeData = (await stripeResponse.json()) as {
+ client_secret?: string;
+ error?: { message?: string };
+ };
+
+ if (!stripeResponse.ok) {
+ return new Response(
+ JSON.stringify({ error: stripeData.error?.message || 'Stripe error' }),
+ {
+ status: stripeResponse.status,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ },
+ );
+ }
+
+ return new Response(
+ JSON.stringify({ clientSecret: stripeData.client_secret }),
+ {
+ status: 200,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ },
+ );
+ } catch (error) {
+ const message = error instanceof Error ? error.message : 'Unknown error';
+ return new Response(JSON.stringify({ error: message }), {
+ status: 500,
+ headers: { ...corsHeaders, 'Content-Type': 'application/json' },
+ });
+ }
+});
diff --git a/supabase/functions/deno.d.ts b/supabase/functions/deno.d.ts
new file mode 100644
index 00000000000..b83e2d43512
--- /dev/null
+++ b/supabase/functions/deno.d.ts
@@ -0,0 +1,9 @@
+// Deno type definitions for Edge Functions
+declare const Deno: {
+ serve(handler: (req: Request) => Response | Promise): void;
+ env: {
+ get(key: string): string | undefined;
+ };
+};
+
+declare const btoa: (str: string) => string;
diff --git a/supabase/functions/deno.json b/supabase/functions/deno.json
new file mode 100644
index 00000000000..cea10f647a5
--- /dev/null
+++ b/supabase/functions/deno.json
@@ -0,0 +1,8 @@
+{
+ "imports": {
+ "@supabase/functions-js/": "https://esm.sh/@supabase/functions-js@2.4.1/"
+ },
+ "tasks": {
+ "start": "deno run -A --watch supabase/functions/create-payment-intent/index.ts"
+ }
+}
diff --git a/supabase/functions/get-nova-poshta-data/index.d.ts b/supabase/functions/get-nova-poshta-data/index.d.ts
new file mode 100644
index 00000000000..cb0ff5c3b54
--- /dev/null
+++ b/supabase/functions/get-nova-poshta-data/index.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/supabase/functions/get-nova-poshta-data/index.js b/supabase/functions/get-nova-poshta-data/index.js
new file mode 100644
index 00000000000..0342c6fede3
--- /dev/null
+++ b/supabase/functions/get-nova-poshta-data/index.js
@@ -0,0 +1,82 @@
+const corsHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
+};
+const NOVAPOSHTA_API_URL = 'https://api.novaposhta.ua/v2.0/json/';
+Deno.serve(async (req) => {
+ if (req.method === 'OPTIONS') {
+ return new Response('ok', { headers: corsHeaders });
+ }
+ try {
+ if (req.method !== 'POST') {
+ return new Response(JSON.stringify({ error: 'Method not allowed' }), {
+ status: 405,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+ const apiKey = Deno.env.get('NOVAPOSHTA_API_KEY');
+ if (!apiKey) {
+ throw new Error('NOVAPOSHTA_API_KEY is not set');
+ }
+ const { method, properties } = (await req.json());
+ if (!method) {
+ return new Response(JSON.stringify({ error: 'Method is required' }), {
+ status: 400,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+ // 🔥 ВАЖЛИВО: правильна модель для кожного методу
+ const modelMap = {
+ getCities: 'Address',
+ getWarehouses: 'Address',
+ getDocumentPrice: 'InternetDocument',
+ };
+ const modelName = modelMap[method];
+ if (!modelName) {
+ return new Response(JSON.stringify({ error: 'Unknown method' }), {
+ status: 400,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+ const response = await fetch(NOVAPOSHTA_API_URL, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ apiKey,
+ modelName,
+ calledMethod: method,
+ methodProperties: properties || {},
+ }),
+ });
+ const data = await response.json();
+ return new Response(JSON.stringify(data), {
+ status: 200,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+ catch (error) {
+ const message = error instanceof Error ? error.message : 'Unknown error';
+ return new Response(JSON.stringify({ error: message }), {
+ status: 500,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+});
+export {};
diff --git a/supabase/functions/get-nova-poshta-data/index.ts b/supabase/functions/get-nova-poshta-data/index.ts
new file mode 100644
index 00000000000..240e3ca5fc8
--- /dev/null
+++ b/supabase/functions/get-nova-poshta-data/index.ts
@@ -0,0 +1,100 @@
+export {};
+
+const corsHeaders = {
+ 'Access-Control-Allow-Origin': '*',
+ 'Access-Control-Allow-Headers':
+ 'authorization, x-client-info, apikey, content-type',
+};
+
+const NOVAPOSHTA_API_URL = 'https://api.novaposhta.ua/v2.0/json/';
+
+Deno.serve(async (req) => {
+ if (req.method === 'OPTIONS') {
+ return new Response('ok', { headers: corsHeaders });
+ }
+
+ try {
+ if (req.method !== 'POST') {
+ return new Response(JSON.stringify({ error: 'Method not allowed' }), {
+ status: 405,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+
+ const apiKey = Deno.env.get('NOVAPOSHTA_API_KEY');
+
+ if (!apiKey) {
+ throw new Error('NOVAPOSHTA_API_KEY is not set');
+ }
+
+ const { method, properties } = (await req.json()) as {
+ method?: string;
+ properties?: Record;
+ };
+
+ if (!method) {
+ return new Response(JSON.stringify({ error: 'Method is required' }), {
+ status: 400,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+
+ // 🔥 ВАЖЛИВО: правильна модель для кожного методу
+ const modelMap: Record = {
+ getCities: 'Address',
+ getWarehouses: 'Address',
+ getDocumentPrice: 'InternetDocument',
+ };
+
+ const modelName = modelMap[method];
+
+ if (!modelName) {
+ return new Response(JSON.stringify({ error: 'Unknown method' }), {
+ status: 400,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+
+ const response = await fetch(NOVAPOSHTA_API_URL, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ apiKey,
+ modelName,
+ calledMethod: method,
+ methodProperties: properties || {},
+ }),
+ });
+
+ const data = await response.json();
+
+ return new Response(JSON.stringify(data), {
+ status: 200,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ } catch (error) {
+ const message = error instanceof Error ? error.message : 'Unknown error';
+
+ return new Response(JSON.stringify({ error: message }), {
+ status: 500,
+ headers: {
+ ...corsHeaders,
+ 'Content-Type': 'application/json',
+ },
+ });
+ }
+});
diff --git a/supabase/functions/tsconfig.json b/supabase/functions/tsconfig.json
new file mode 100644
index 00000000000..20c681296cf
--- /dev/null
+++ b/supabase/functions/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "lib": ["ES2020"],
+ "module": "ES2020",
+ "moduleResolution": "node",
+ "declaration": true,
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true
+ },
+ "include": ["**/*.ts"]
+}
diff --git a/supabase/functions/tsconfig.tsbuildinfo b/supabase/functions/tsconfig.tsbuildinfo
new file mode 100644
index 00000000000..d2fc17f7614
--- /dev/null
+++ b/supabase/functions/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"root":["./deno.d.ts","./create-payment-intent/index.ts","./get-nova-poshta-data/index.ts"],"version":"5.9.3"}
\ No newline at end of file
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 00000000000..81125e23dba
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,43 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": false,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["src/*"],
+ "@api/*": ["src/api/*"],
+ "@assets/*": ["src/assets/*"],
+ "@components/*": ["src/components/*"],
+ "@constants/*": ["src/constants/*"],
+ "@context/*": ["src/context/*"],
+ "@hooks/*": ["src/hooks/*"],
+ "@pages/*": ["src/pages/*"],
+ "@styles/*": ["src/styles/*"],
+ "@types/*": ["src/types/*"],
+ "@utils/*": ["src/utils/*"]
+ },
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/tsconfig.json b/tsconfig.json
index cfb168bb26c..a06c96452eb 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,10 +1,9 @@
{
- "extends": "@mate-academy/students-ts-config",
- "include": [
- "src"
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" },
+ { "path": "./supabase/functions/tsconfig.json" }
],
- "compilerOptions": {
- "sourceMap": false,
- "types": ["node", "cypress"]
- }
+ "exclude": ["node_modules", "dist", "supabase"]
}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 00000000000..8a67f62f4ce
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2023",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
index 5a33944a9b4..0008fd89b2f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,7 +1,25 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+import path from 'path';
-// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
-})
+ base: '/react_phone-catalog/',
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ '@api': path.resolve(__dirname, './src/api'),
+ '@assets': path.resolve(__dirname, './src/assets'),
+ '@components': path.resolve(__dirname, './src/components'),
+ '@constants': path.resolve(__dirname, './src/constants'),
+ '@context': path.resolve(__dirname, './src/context'),
+ '@hooks': path.resolve(__dirname, './src/hooks'),
+ '@pages': path.resolve(__dirname, './src/pages'),
+ '@styles': path.resolve(__dirname, './src/styles'),
+ '@types': path.resolve(__dirname, './src/types'),
+ '@utils': path.resolve(__dirname, './src/utils'),
+ },
+ },
+
+ server: { host: true },
+});